#ifndef _SYS_PROTOSW_H_
#define _SYS_PROTOSW_H_
#if defined(_KERNEL) || defined(_WANT_PROTOSW)
struct socket;
struct sockopt;
struct thread;
struct sockaddr;
struct ifnet;
struct mbuf;
struct stat;
struct ucred;
struct uio;
struct kaiocb;
struct knote;
enum shutdown_how;
typedef int pr_ctloutput_t(struct socket *, struct sockopt *);
typedef int pr_setsbopt_t(struct socket *, struct sockopt *);
typedef void pr_abort_t(struct socket *);
typedef int pr_accept_t(struct socket *, struct sockaddr *);
typedef int pr_attach_t(struct socket *, int, struct thread *);
typedef int pr_bind_t(struct socket *, struct sockaddr *, struct thread *);
typedef int pr_connect_t(struct socket *, struct sockaddr *,
struct thread *);
typedef int pr_connect2_t(struct socket *, struct socket *);
typedef int pr_control_t(struct socket *, unsigned long, void *,
struct ifnet *, struct thread *);
typedef void pr_detach_t(struct socket *);
typedef int pr_disconnect_t(struct socket *);
typedef int pr_listen_t(struct socket *, int, struct thread *);
typedef int pr_peeraddr_t(struct socket *, struct sockaddr *);
typedef int pr_rcvd_t(struct socket *, int);
typedef int pr_rcvoob_t(struct socket *, struct mbuf *, int);
typedef enum {
PRUS_OOB = 0x1,
PRUS_EOF = 0x2,
PRUS_MORETOCOME = 0x4,
PRUS_NOTREADY = 0x8,
PRUS_IPV6 = 0x10,
} pr_send_flags_t;
typedef int pr_send_t(struct socket *, int, struct mbuf *,
struct sockaddr *, struct mbuf *, struct thread *);
typedef int pr_sendfile_wait_t(struct socket *, off_t, int *);
typedef int pr_ready_t(struct socket *, struct mbuf *, int);
typedef int pr_sense_t(struct socket *, struct stat *);
typedef int pr_shutdown_t(struct socket *, enum shutdown_how);
typedef int pr_sockaddr_t(struct socket *, struct sockaddr *);
typedef int pr_sosend_t(struct socket *, struct sockaddr *, struct uio *,
struct mbuf *, struct mbuf *, int, struct thread *);
typedef int pr_soreceive_t(struct socket *, struct sockaddr **,
struct uio *, struct mbuf **, struct mbuf **, int *);
typedef int pr_sopoll_t(struct socket *, int, struct thread *);
typedef int pr_kqfilter_t(struct socket *, struct knote *);
typedef void pr_sosetlabel_t(struct socket *);
typedef void pr_close_t(struct socket *);
typedef void pr_fdclose_t(struct socket *);
typedef int pr_bindat_t(int, struct socket *, struct sockaddr *,
struct thread *);
typedef int pr_connectat_t(int, struct socket *, struct sockaddr *,
struct thread *);
typedef int pr_aio_queue_t(struct socket *, struct kaiocb *);
typedef int pr_chmod_t(struct socket *, __mode_t, struct ucred *,
struct thread *);
struct protosw {
short pr_type;
short pr_protocol;
short pr_flags;
short pr_unused;
struct domain *pr_domain;
pr_soreceive_t *pr_soreceive;
pr_sosend_t *pr_sosend;
pr_send_t *pr_send;
pr_sendfile_wait_t *pr_sendfile_wait;
pr_ready_t *pr_ready;
pr_sopoll_t *pr_sopoll;
pr_attach_t *pr_attach;
pr_detach_t *pr_detach;
pr_connect_t *pr_connect;
pr_disconnect_t *pr_disconnect;
pr_close_t *pr_close;
pr_fdclose_t *pr_fdclose;
pr_rcvd_t *pr_rcvd;
pr_aio_queue_t *pr_aio_queue;
pr_bind_t *pr_bind;
pr_bindat_t *pr_bindat;
pr_listen_t *pr_listen;
pr_accept_t *pr_accept;
pr_connectat_t *pr_connectat;
pr_connect2_t *pr_connect2;
pr_control_t *pr_control;
pr_rcvoob_t *pr_rcvoob;
pr_abort_t *pr_abort;
pr_ctloutput_t *pr_ctloutput;
pr_peeraddr_t *pr_peeraddr;
pr_sockaddr_t *pr_sockaddr;
pr_sense_t *pr_sense;
pr_sosetlabel_t *pr_sosetlabel;
pr_setsbopt_t *pr_setsbopt;
pr_chmod_t *pr_chmod;
pr_kqfilter_t *pr_kqfilter;
pr_shutdown_t *pr_shutdown;
};
#endif
#ifdef _KERNEL
#define PR_ATOMIC 0x01
#define PR_ADDR 0x02
#define PR_CONNREQUIRED 0x04
#define PR_WANTRCVD 0x08
#define PR_IMPLOPCL 0x20
#define PR_CAPATTACH 0x80
#define PR_SOCKBUF 0x100
struct domain *pffinddomain(int family);
struct protosw *pffindproto(int family, int type, int proto);
int protosw_register(struct domain *, struct protosw *);
int protosw_unregister(struct protosw *);
extern struct domain inetdomain;
extern struct domain inet6domain;
#endif
#endif