#ifndef _SYS_PROTOSW_H_
#define _SYS_PROTOSW_H_
struct mbuf;
struct sockaddr;
struct socket;
struct domain;
struct proc;
struct stat;
struct ifnet;
struct netstack;
struct pr_usrreqs {
int (*pru_attach)(struct socket *, int, int);
int (*pru_detach)(struct socket *);
int (*pru_bind)(struct socket *, struct mbuf *, struct proc *);
int (*pru_listen)(struct socket *);
int (*pru_connect)(struct socket *, struct mbuf *);
int (*pru_accept)(struct socket *, struct mbuf *);
int (*pru_disconnect)(struct socket *);
int (*pru_shutdown)(struct socket *);
void (*pru_rcvd)(struct socket *);
int (*pru_send)(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
void (*pru_abort)(struct socket *);
int (*pru_control)(struct socket *, u_long, caddr_t,
struct ifnet *);
int (*pru_sense)(struct socket *, struct stat *);
int (*pru_rcvoob)(struct socket *, struct mbuf *, int);
int (*pru_sendoob)(struct socket *, struct mbuf *, struct mbuf *,
struct mbuf *);
int (*pru_sockaddr)(struct socket *, struct mbuf *);
int (*pru_peeraddr)(struct socket *, struct mbuf *);
int (*pru_flowid)(struct socket *);
int (*pru_connect2)(struct socket *, struct socket *);
};
struct protosw {
short pr_type;
const struct domain *pr_domain;
short pr_protocol;
short pr_flags;
int (*pr_input)(struct mbuf **, int *, int, int, struct netstack *);
void (*pr_ctlinput)(int, struct sockaddr *, u_int, void *);
int (*pr_ctloutput)(int, struct socket *, int, int, struct mbuf *);
const struct pr_usrreqs *pr_usrreqs;
void (*pr_init)(void);
void (*pr_fasttimo)(void);
void (*pr_slowtimo)(void);
int (*pr_sysctl)(int *, u_int, void *, size_t *, void *, size_t);
};
#define PR_SLOWHZ 2
#define PR_FASTHZ 5
#define PR_ATOMIC 0x0001
#define PR_ADDR 0x0002
#define PR_CONNREQUIRED 0x0004
#define PR_WANTRCVD 0x0008
#define PR_RIGHTS 0x0010
#define PR_ABRTACPTDIS 0x0020
#define PR_SPLICE 0x0040
#define PR_MPINPUT 0x0080
#define PR_MPSYSCTL 0x0200
#define PRU_ATTACH 0
#define PRU_DETACH 1
#define PRU_BIND 2
#define PRU_LISTEN 3
#define PRU_CONNECT 4
#define PRU_ACCEPT 5
#define PRU_DISCONNECT 6
#define PRU_SHUTDOWN 7
#define PRU_RCVD 8
#define PRU_SEND 9
#define PRU_ABORT 10
#define PRU_CONTROL 11
#define PRU_SENSE 12
#define PRU_RCVOOB 13
#define PRU_SENDOOB 14
#define PRU_SOCKADDR 15
#define PRU_PEERADDR 16
#define PRU_CONNECT2 17
#define PRU_FASTTIMO 18
#define PRU_SLOWTIMO 19
#define PRU_PROTORCV 20
#define PRU_PROTOSEND 21
#define PRU_NREQ 22
#ifdef PRUREQUESTS
const char *prurequests[] = {
"ATTACH", "DETACH", "BIND", "LISTEN",
"CONNECT", "ACCEPT", "DISCONNECT", "SHUTDOWN",
"RCVD", "SEND", "ABORT", "CONTROL",
"SENSE", "RCVOOB", "SENDOOB", "SOCKADDR",
"PEERADDR", "CONNECT2", "FASTTIMO", "SLOWTIMO",
"PROTORCV", "PROTOSEND",
};
#endif
#define PRC_IFDOWN 0
#define PRC_ROUTEDEAD 1
#define PRC_MTUINC 2
#define PRC_QUENCH2 3
#define PRC_QUENCH 4
#define PRC_MSGSIZE 5
#define PRC_HOSTDEAD 6
#define PRC_HOSTUNREACH 7
#define PRC_UNREACH_NET 8
#define PRC_UNREACH_HOST 9
#define PRC_UNREACH_PROTOCOL 10
#define PRC_UNREACH_PORT 11
#define PRC_UNREACH_SRCFAIL 13
#define PRC_REDIRECT_NET 14
#define PRC_REDIRECT_HOST 15
#define PRC_REDIRECT_TOSNET 16
#define PRC_REDIRECT_TOSHOST 17
#define PRC_TIMXCEED_INTRANS 18
#define PRC_TIMXCEED_REASS 19
#define PRC_PARAMPROB 20
#define PRC_NCMDS 21
#define PRC_IS_REDIRECT(cmd) \
((cmd) >= PRC_REDIRECT_NET && (cmd) <= PRC_REDIRECT_TOSHOST)
#ifdef PRCREQUESTS
char *prcrequests[] = {
"IFDOWN", "ROUTEDEAD", "MTUINC", "DEC-BIT-QUENCH2",
"QUENCH", "MSGSIZE", "HOSTDEAD", "#7",
"NET-UNREACH", "HOST-UNREACH", "PROTO-UNREACH", "PORT-UNREACH",
"#12", "SRCFAIL-UNREACH", "NET-REDIRECT", "HOST-REDIRECT",
"TOSNET-REDIRECT", "TOSHOST-REDIRECT", "TX-INTRANS", "TX-REASS",
"PARAMPROB"
};
#endif
#define PRCO_GETOPT 0
#define PRCO_SETOPT 1
#define PRCO_NCMDS 2
#ifdef PRCOREQUESTS
char *prcorequests[] = {
"GETOPT", "SETOPT",
};
#endif
#ifdef _KERNEL
#include <sys/mbuf.h>
#include <sys/socketvar.h>
const struct protosw *pffindproto(int, int, int);
const struct protosw *pffindtype(int, int);
const struct domain *pffinddomain(int);
void pfctlinput(int, struct sockaddr *);
extern u_char ip_protox[];
extern const struct protosw inetsw[];
#ifdef INET6
extern u_char ip6_protox[];
extern const struct protosw inet6sw[];
#endif
static inline int
pru_attach(struct socket *so, int proto, int wait)
{
return (*so->so_proto->pr_usrreqs->pru_attach)(so, proto, wait);
}
static inline int
pru_detach(struct socket *so)
{
return (*so->so_proto->pr_usrreqs->pru_detach)(so);
}
static inline int
pru_bind(struct socket *so, struct mbuf *nam, struct proc *p)
{
if (so->so_proto->pr_usrreqs->pru_bind)
return (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, p);
return (EOPNOTSUPP);
}
static inline int
pru_listen(struct socket *so)
{
if (so->so_proto->pr_usrreqs->pru_listen)
return (*so->so_proto->pr_usrreqs->pru_listen)(so);
return (EOPNOTSUPP);
}
static inline int
pru_connect(struct socket *so, struct mbuf *nam)
{
if (so->so_proto->pr_usrreqs->pru_connect)
return (*so->so_proto->pr_usrreqs->pru_connect)(so, nam);
return (EOPNOTSUPP);
}
static inline int
pru_accept(struct socket *so, struct mbuf *nam)
{
if (so->so_proto->pr_usrreqs->pru_accept)
return (*so->so_proto->pr_usrreqs->pru_accept)(so, nam);
return (EOPNOTSUPP);
}
static inline int
pru_disconnect(struct socket *so)
{
if (so->so_proto->pr_usrreqs->pru_disconnect)
return (*so->so_proto->pr_usrreqs->pru_disconnect)(so);
return (EOPNOTSUPP);
}
static inline int
pru_shutdown(struct socket *so)
{
return (*so->so_proto->pr_usrreqs->pru_shutdown)(so);
}
static inline void
pru_rcvd(struct socket *so)
{
(*so->so_proto->pr_usrreqs->pru_rcvd)(so);
}
static inline int
pru_send(struct socket *so, struct mbuf *top, struct mbuf *addr,
struct mbuf *control)
{
return (*so->so_proto->pr_usrreqs->pru_send)(so, top, addr, control);
}
static inline void
pru_abort(struct socket *so)
{
(*so->so_proto->pr_usrreqs->pru_abort)(so);
}
static inline int
pru_control(struct socket *so, u_long cmd, caddr_t data, struct ifnet *ifp)
{
if (so->so_proto->pr_usrreqs->pru_control)
return (*so->so_proto->pr_usrreqs->pru_control)(so,
cmd, data, ifp);
return (EOPNOTSUPP);
}
static inline int
pru_sense(struct socket *so, struct stat *ub)
{
if (so->so_proto->pr_usrreqs->pru_sense)
return (*so->so_proto->pr_usrreqs->pru_sense)(so, ub);
return (0);
}
static inline int
pru_rcvoob(struct socket *so, struct mbuf *m, int flags)
{
if (so->so_proto->pr_usrreqs->pru_rcvoob)
return (*so->so_proto->pr_usrreqs->pru_rcvoob)(so, m, flags);
return (EOPNOTSUPP);
}
static inline int
pru_sendoob(struct socket *so, struct mbuf *top, struct mbuf *addr,
struct mbuf *control)
{
if (so->so_proto->pr_usrreqs->pru_sendoob)
return (*so->so_proto->pr_usrreqs->pru_sendoob)(so,
top, addr, control);
m_freem(top);
m_freem(control);
return (EOPNOTSUPP);
}
static inline int
pru_sockaddr(struct socket *so, struct mbuf *addr)
{
return (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, addr);
}
static inline int
pru_peeraddr(struct socket *so, struct mbuf *addr)
{
return (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, addr);
}
static inline int
pru_flowid(struct socket *so)
{
return (*so->so_proto->pr_usrreqs->pru_flowid)(so);
}
static inline int
pru_connect2(struct socket *so1, struct socket *so2)
{
if (so1->so_proto->pr_usrreqs->pru_connect2)
return (*so1->so_proto->pr_usrreqs->pru_connect2)(so1, so2);
return (EOPNOTSUPP);
}
#endif
#endif