From 117bcae7c4d73c098e95fe2a1c1cbe986baa7920 Mon Sep 17 00:00:00 2001 From: Garrett Wollman Date: Tue, 18 Feb 1997 20:46:36 +0000 Subject: [PATCH] Convert raw IP from mondo-switch-statement-from-Hell to pr_usrreqs. Collapse duplicates with udp_usrreq.c and tcp_usrreq.c (calling the generic routines in uipc_socket2.c and in_pcb.c). Calling sockaddr()_ or peeraddr() on a detached socket now traps, rather than harmlessly returning an error; this should never happen. Allow the raw IP buffer sizes to be controlled via sysctl. --- sys/netinet/in.c | 2 +- sys/netinet/in_pcb.c | 25 +++- sys/netinet/in_pcb.h | 4 +- sys/netinet/in_proto.c | 30 ++-- sys/netinet/in_var.h | 2 +- sys/netinet/ip_var.h | 3 +- sys/netinet/raw_ip.c | 298 ++++++++++++++++++--------------------- sys/netinet/tcp_usrreq.c | 61 +------- sys/netinet/udp_usrreq.c | 101 +------------ 9 files changed, 191 insertions(+), 335 deletions(-) diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 60bf97a609d1..be398a42f2aa 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -142,7 +142,7 @@ static int in_interfaces; /* number of external internet interfaces */ int in_control(so, cmd, data, ifp) struct socket *so; - u_long cmd; + int cmd; caddr_t data; register struct ifnet *ifp; { diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c index 9d4d566ba6d9..94b6547f25d7 100644 --- a/sys/netinet/in_pcb.c +++ b/sys/netinet/in_pcb.c @@ -454,11 +454,21 @@ in_pcbdetach(inp) FREE(inp, M_PCB); } -void -in_setsockaddr(inp, nam) - register struct inpcb *inp; +/* + * The calling convention of in_setsockaddr() and in_setpeeraddr() was + * modified to match the pru_sockaddr() and pru_peeraddr() entry points + * in struct pr_usrreqs, so that protocols can just reference then directly + * without the need for a wrapper function. The socket must have a valid + * (i.e., non-nil) PCB, but it should be impossible to get an invalid one + * except through a kernel programming error, so it is acceptable to panic + * (or in this case trap) if the PCB is invalid. + */ +int +in_setsockaddr(so, nam) + struct socket *so; struct mbuf *nam; { + register struct inpcb *inp = sotoinpcb(so); register struct sockaddr_in *sin; nam->m_len = sizeof (*sin); @@ -468,13 +478,15 @@ in_setsockaddr(inp, nam) sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_lport; sin->sin_addr = inp->inp_laddr; + return 0; } -void -in_setpeeraddr(inp, nam) - struct inpcb *inp; +int +in_setpeeraddr(so, nam) + struct socket *so; struct mbuf *nam; { + struct inpcb *inp = sotoinpcb(so); register struct sockaddr_in *sin; nam->m_len = sizeof (*sin); @@ -484,6 +496,7 @@ in_setpeeraddr(inp, nam) sin->sin_len = sizeof(*sin); sin->sin_port = inp->inp_fport; sin->sin_addr = inp->inp_faddr; + return 0; } /* diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h index 0aca6ff3f5b2..7575a6445c7f 100644 --- a/sys/netinet/in_pcb.h +++ b/sys/netinet/in_pcb.h @@ -108,8 +108,8 @@ struct inpcb * void in_pcbnotify __P((struct inpcbhead *, struct sockaddr *, u_int, struct in_addr, u_int, int, void (*)(struct inpcb *, int))); void in_pcbrehash __P((struct inpcb *)); -void in_setpeeraddr __P((struct inpcb *, struct mbuf *)); -void in_setsockaddr __P((struct inpcb *, struct mbuf *)); +int in_setpeeraddr __P((struct socket *so, struct mbuf *nam)); +int in_setsockaddr __P((struct socket *so, struct mbuf *nam)); #endif #endif diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c index 93d97848de82..b07d8a5da3dc 100644 --- a/sys/netinet/in_proto.c +++ b/sys/netinet/in_proto.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)in_proto.c 8.2 (Berkeley) 2/9/95 - * $FreeBSD$ + * $Id$ */ #include @@ -118,27 +118,33 @@ struct protosw inetsw[] = { }, { SOCK_RAW, &inetdomain, IPPROTO_RAW, PR_ATOMIC|PR_ADDR, rip_input, 0, rip_ctlinput, rip_ctloutput, - rip_usrreq, + 0, 0, 0, 0, 0, + &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_ICMP, PR_ATOMIC|PR_ADDR, icmp_input, 0, 0, rip_ctloutput, - rip_usrreq + 0, + 0, 0, 0, 0, + &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_IGMP, PR_ATOMIC|PR_ADDR, igmp_input, 0, 0, rip_ctloutput, - rip_usrreq, - igmp_init, igmp_fasttimo, igmp_slowtimo + 0, + igmp_init, igmp_fasttimo, igmp_slowtimo, 0, + &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_RSVP, PR_ATOMIC|PR_ADDR, rsvp_input, 0, 0, rip_ctloutput, - rip_usrreq, + 0, 0, 0, 0, 0, + &rip_usrreqs }, { SOCK_RAW, &inetdomain, IPPROTO_IPIP, PR_ATOMIC|PR_ADDR, ipip_input, 0, 0, rip_ctloutput, - rip_usrreq, + 0, 0, 0, 0, 0, + &rip_usrreqs }, #ifdef IPDIVERT { SOCK_RAW, &inetdomain, IPPROTO_DIVERT, PR_ATOMIC|PR_ADDR, @@ -165,22 +171,25 @@ struct protosw inetsw[] = { #ifdef IPXIP { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR, ipxip_input, 0, ipxip_ctlinput, 0, - rip_usrreq, + 0, 0, 0, 0, 0, + &rip_usrreqs }, #endif #ifdef NSIP { SOCK_RAW, &inetdomain, IPPROTO_IDP, PR_ATOMIC|PR_ADDR, idpip_input, 0, nsip_ctlinput, 0, - rip_usrreq, + 0, 0, 0, 0, 0, + &rip_usrreqs }, #endif /* raw wildcard */ { SOCK_RAW, &inetdomain, 0, PR_ATOMIC|PR_ADDR, rip_input, 0, 0, rip_ctloutput, - rip_usrreq, + 0, rip_init, 0, 0, 0, + &rip_usrreqs }, }; @@ -202,6 +211,7 @@ SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP"); SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP"); SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP"); SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP"); +SYSCTL_NODE(_net_inet, IPPROTO_RAW, raw, CTLFLAG_RW, 0, "RAW"); #ifdef IPDIVERT SYSCTL_NODE(_net_inet, IPPROTO_DIVERT, div, CTLFLAG_RW, 0, "DIVERT"); #endif diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h index dfc08ca2c688..6a06668b42f5 100644 --- a/sys/netinet/in_var.h +++ b/sys/netinet/in_var.h @@ -216,7 +216,7 @@ do { \ struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *)); void in_delmulti __P((struct in_multi *)); -int in_control __P((struct socket *, u_long, caddr_t, struct ifnet *)); +int in_control __P((struct socket *, int, caddr_t, struct ifnet *)); void in_rtqdrain __P((void)); void ip_input __P((struct mbuf *)); int in_ifadown __P((struct ifaddr *ifa)); diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h index 75a60fc7201f..e10124df69ed 100644 --- a/sys/netinet/ip_var.h +++ b/sys/netinet/ip_var.h @@ -170,6 +170,7 @@ extern struct socket *ip_mrouter; /* multicast routing daemon */ extern int (*legal_vif_num) __P((int)); extern u_long (*ip_mcast_src) __P((int)); extern int rsvp_on; +extern struct pr_usrreqs rip_usrreqs; int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); void ip_drain __P((void)); @@ -190,8 +191,6 @@ void rip_ctlinput __P((int, struct sockaddr *, void *)); void rip_init __P((void)); void rip_input __P((struct mbuf *, int)); int rip_output __P((struct mbuf *, struct socket *, u_long)); -int rip_usrreq __P((struct socket *, - int, struct mbuf *, struct mbuf *, struct mbuf *)); void ipip_input __P((struct mbuf *, int)); void rsvp_input __P((struct mbuf *, int)); int ip_rsvp_init __P((struct socket *)); diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index 0011ab24f9b9..e290c5e8235b 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -31,18 +31,20 @@ * SUCH DAMAGE. * * @(#)raw_ip.c 8.7 (Berkeley) 5/15/95 - * $Id$ + * $Id: raw_ip.c,v 1.41 1997/02/13 19:46:45 wollman Exp $ */ #include -#include +#include +#include +#include #include #include -#include #include +#include +#include #include -#include -#include +#include #include #include @@ -376,166 +378,136 @@ rip_ctlinput(cmd, sa, vip) } } -static u_long rip_sendspace = RIPSNDQ; /* XXX sysctl ? */ -static u_long rip_recvspace = RIPRCVQ; /* XXX sysctl ? */ +static u_long rip_sendspace = RIPSNDQ; +static u_long rip_recvspace = RIPRCVQ; -/*ARGSUSED*/ -int -rip_usrreq(so, req, m, nam, control) - register struct socket *so; - int req; - struct mbuf *m, *nam, *control; +SYSCTL_INT(_net_inet_raw, OID_AUTO, maxdgram, CTLFLAG_RW, &rip_sendspace, + 0, ""); +SYSCTL_INT(_net_inet_raw, OID_AUTO, recvspace, CTLFLAG_RW, &rip_recvspace, + 0, ""); + +static int +rip_attach(struct socket *so, int proto) { - register int error = 0; - register struct inpcb *inp = sotoinpcb(so); + struct inpcb *inp; + int error; - if (req == PRU_CONTROL) - return (in_control(so, (u_long)m, (caddr_t)nam, - (struct ifnet *)control)); + inp = sotoinpcb(so); + if (inp) + panic("rip_attach"); + if ((so->so_state & SS_PRIV) == 0) + return EACCES; - switch (req) { - - case PRU_ATTACH: - if (inp) - panic("rip_attach"); - if ((so->so_state & SS_PRIV) == 0) { - error = EACCES; - break; - } - if ((error = soreserve(so, rip_sendspace, rip_recvspace)) || - (error = in_pcballoc(so, &ripcbinfo))) - break; - inp = (struct inpcb *)so->so_pcb; - inp->inp_ip.ip_p = (int)nam; - break; - - case PRU_DISCONNECT: - if ((so->so_state & SS_ISCONNECTED) == 0) { - error = ENOTCONN; - break; - } - /* FALLTHROUGH */ - case PRU_ABORT: - soisdisconnected(so); - /* FALLTHROUGH */ - case PRU_DETACH: - if (inp == 0) - panic("rip_detach"); - if (so == ip_mrouter) - ip_mrouter_done(); - ip_rsvp_force_done(so); - if (so == ip_rsvpd) - ip_rsvp_done(); - in_pcbdetach(inp); - break; - - case PRU_BIND: - { - struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); - - if (nam->m_len != sizeof(*addr)) { - error = EINVAL; - break; - } - if (TAILQ_EMPTY(&ifnet) || - ((addr->sin_family != AF_INET) && - (addr->sin_family != AF_IMPLINK)) || - (addr->sin_addr.s_addr && - ifa_ifwithaddr((struct sockaddr *)addr) == 0)) { - error = EADDRNOTAVAIL; - break; - } - inp->inp_laddr = addr->sin_addr; - break; - } - case PRU_CONNECT: - { - struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); - - if (nam->m_len != sizeof(*addr)) { - error = EINVAL; - break; - } - if (TAILQ_EMPTY(&ifnet)) { - error = EADDRNOTAVAIL; - break; - } - if ((addr->sin_family != AF_INET) && - (addr->sin_family != AF_IMPLINK)) { - error = EAFNOSUPPORT; - break; - } - inp->inp_faddr = addr->sin_addr; - soisconnected(so); - break; - } - - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; - - /* - * Mark the connection as being incapable of further input. - */ - case PRU_SHUTDOWN: - socantsendmore(so); - break; - - /* - * Ship a packet out. The appropriate raw output - * routine handles any massaging necessary. - */ - case PRU_SEND: - { - register u_long dst; - - if (so->so_state & SS_ISCONNECTED) { - if (nam) { - error = EISCONN; - break; - } - dst = inp->inp_faddr.s_addr; - } else { - if (nam == NULL) { - error = ENOTCONN; - break; - } - dst = mtod(nam, struct sockaddr_in *)->sin_addr.s_addr; - } - error = rip_output(m, so, dst); - m = NULL; - break; - } - - case PRU_SENSE: - /* - * stat: don't bother with a blocksize. - */ - return (0); - - /* - * Not supported. - */ - case PRU_RCVOOB: - case PRU_RCVD: - case PRU_LISTEN: - case PRU_ACCEPT: - case PRU_SENDOOB: - error = EOPNOTSUPP; - break; - - case PRU_SOCKADDR: - in_setsockaddr(inp, nam); - break; - - case PRU_PEERADDR: - in_setpeeraddr(inp, nam); - break; - - default: - panic("rip_usrreq"); - } - if (m != NULL) - m_freem(m); - return (error); + if ((error = soreserve(so, rip_sendspace, rip_recvspace)) || + (error = in_pcballoc(so, &ripcbinfo))) + return error; + inp = (struct inpcb *)so->so_pcb; + inp->inp_ip.ip_p = proto; + return 0; } + +static int +rip_detach(struct socket *so) +{ + struct inpcb *inp; + + inp = sotoinpcb(so); + if (inp == 0) + panic("rip_detach"); + if (so == ip_mrouter) + ip_mrouter_done(); + ip_rsvp_force_done(so); + if (so == ip_rsvpd) + ip_rsvp_done(); + in_pcbdetach(inp); + return 0; +} + +static int +rip_abort(struct socket *so) +{ + soisdisconnected(so); + return rip_detach(so); +} + +static int +rip_disconnect(struct socket *so) +{ + if ((so->so_state & SS_ISCONNECTED) == 0) + return ENOTCONN; + return rip_abort(so); +} + +static int +rip_bind(struct socket *so, struct mbuf *nam) +{ + struct inpcb *inp = sotoinpcb(so); + struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); + + if (nam->m_len != sizeof(*addr)) + return EINVAL; + + if (TAILQ_EMPTY(&ifnet) || ((addr->sin_family != AF_INET) && + (addr->sin_family != AF_IMPLINK)) || + (addr->sin_addr.s_addr && + ifa_ifwithaddr((struct sockaddr *)addr) == 0)) + return EADDRNOTAVAIL; + inp->inp_laddr = addr->sin_addr; + return 0; +} + +static int +rip_connect(struct socket *so, struct mbuf *nam) +{ + struct inpcb *inp = sotoinpcb(so); + struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *); + + if (nam->m_len != sizeof(*addr)) + return EINVAL; + if (TAILQ_EMPTY(&ifnet)) + return EADDRNOTAVAIL; + if ((addr->sin_family != AF_INET) && + (addr->sin_family != AF_IMPLINK)) + return EAFNOSUPPORT; + inp->inp_faddr = addr->sin_addr; + soisconnected(so); + return 0; +} + +static int +rip_shutdown(struct socket *so) +{ + socantsendmore(so); + return 0; +} + +static int +rip_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam, + struct mbuf *control) +{ + struct inpcb *inp = sotoinpcb(so); + register u_long dst; + + if (so->so_state & SS_ISCONNECTED) { + if (nam) { + m_freem(m); + return EISCONN; + } + dst = inp->inp_faddr.s_addr; + } else { + if (nam == NULL) { + m_freem(m); + return ENOTCONN; + } + dst = mtod(nam, struct sockaddr_in *)->sin_addr.s_addr; + } + return rip_output(m, so, dst); +} + +struct pr_usrreqs rip_usrreqs = { + rip_abort, pru_accept_notsupp, rip_attach, rip_bind, rip_connect, + pru_connect2_notsupp, in_control, rip_detach, rip_disconnect, + pru_listen_notsupp, in_setpeeraddr, pru_rcvd_notsupp, + pru_rcvoob_notsupp, rip_send, pru_sense_null, rip_shutdown, + in_setsockaddr +}; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 6f0242274665..5207da9f6016 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -69,7 +69,7 @@ /* * TCP protocol interface to socket abstraction. */ -extern char *tcpstates[]; +extern char *tcpstates[]; /* XXX ??? */ static int tcp_attach __P((struct socket *)); static int tcp_connect __P((struct tcpcb *, struct mbuf *)); @@ -288,7 +288,7 @@ tcp_usr_accept(struct socket *so, struct mbuf *nam) struct tcpcb *tp; COMMON_START(); - in_setpeeraddr(inp, nam); + in_setpeeraddr(so, nam); COMMON_END(PRU_ACCEPT); } @@ -414,19 +414,6 @@ tcp_usr_abort(struct socket *so) COMMON_END(PRU_ABORT); } -/* - * Fill in st_bklsize for fstat() operations on a socket. - */ -static int -tcp_usr_sense(struct socket *so, struct stat *sb) -{ - int s = splnet(); - - sb->st_blksize = so->so_snd.sb_hiwat; - splx(s); - return 0; -} - /* * Receive out-of-band data. */ @@ -457,49 +444,13 @@ tcp_usr_rcvoob(struct socket *so, struct mbuf *m, int flags) COMMON_END(PRU_RCVOOB); } -static int -tcp_usr_sockaddr(struct socket *so, struct mbuf *nam) -{ - int s = splnet(); - int error = 0; - struct inpcb *inp = sotoinpcb(so); - struct tcpcb *tp; - - COMMON_START(); - in_setsockaddr(inp, nam); - COMMON_END(PRU_SOCKADDR); -} - -static int -tcp_usr_peeraddr(struct socket *so, struct mbuf *nam) -{ - int s = splnet(); - int error = 0; - struct inpcb *inp = sotoinpcb(so); - struct tcpcb *tp; - - COMMON_START(); - in_setpeeraddr(inp, nam); - COMMON_END(PRU_PEERADDR); -} - -/* - * XXX - this should just be a call to in_control, but we need to get - * the types worked out. - */ -static int -tcp_usr_control(struct socket *so, int cmd, caddr_t arg, struct ifnet *ifp) -{ - return in_control(so, cmd, arg, ifp); -} - /* xxx - should be const */ struct pr_usrreqs tcp_usrreqs = { tcp_usr_abort, tcp_usr_accept, tcp_usr_attach, tcp_usr_bind, - tcp_usr_connect, pru_connect2_notsupp, tcp_usr_control, tcp_usr_detach, - tcp_usr_disconnect, tcp_usr_listen, tcp_usr_peeraddr, tcp_usr_rcvd, - tcp_usr_rcvoob, tcp_usr_send, tcp_usr_sense, tcp_usr_shutdown, - tcp_usr_sockaddr + tcp_usr_connect, pru_connect2_notsupp, in_control, tcp_usr_detach, + tcp_usr_disconnect, tcp_usr_listen, in_setpeeraddr, tcp_usr_rcvd, + tcp_usr_rcvoob, tcp_usr_send, pru_sense_null, tcp_usr_shutdown, + in_setsockaddr }; /* diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 498f51d2f4e0..ca71d558b858 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -31,7 +31,7 @@ * SUCH DAMAGE. * * @(#)udp_usrreq.c 8.6 (Berkeley) 5/23/95 - * $Id$ + * $Id: udp_usrreq.c,v 1.33 1997/02/14 18:15:52 wollman Exp $ */ #include @@ -479,18 +479,6 @@ udp_abort(struct socket *so) return 0; } -/* XXX should be pru_accept_notsupp */ -static int -udp_accept(struct socket *so, struct mbuf *nam) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - return EOPNOTSUPP; -} - static int udp_attach(struct socket *so, int proto) { @@ -582,54 +570,6 @@ udp_disconnect(struct socket *so) return 0; } -/* should be pru_listen_notsupp */ -static int -udp_listen(struct socket *so) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - return EOPNOTSUPP; -} - -static int -udp_peeraddr(struct socket *so, struct mbuf *nam) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - in_setpeeraddr(inp, nam); - return 0; -} - -/* XXX should be pru_rcvd_notsupp */ -static int -udp_rcvd(struct socket *so, int flags) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - return EOPNOTSUPP; -} - -/* XXX should be pru_rcvoob_notsupp */ -static int -udp_rcvoob(struct socket *so, struct mbuf *m, int flags) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - return EOPNOTSUPP; -} - static int udp_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *addr, struct mbuf *control) @@ -644,17 +584,6 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *addr, return udp_output(inp, m, addr, control); } -static int -udp_sense(struct socket *so, struct stat *sb) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - return 0; /* xxx do something useful */ -} - static int udp_shutdown(struct socket *so) { @@ -667,28 +596,10 @@ udp_shutdown(struct socket *so) return 0; } -static int -udp_sockaddr(struct socket *so, struct mbuf *nam) -{ - struct inpcb *inp; - - inp = sotoinpcb(so); - if (inp == 0) - return EINVAL; - in_setsockaddr(inp, nam); - return 0; -} - -/* XXX - should fix parameter types of in_control or of pru_control... */ -static int -udp_control(struct socket *so, int cmd, caddr_t data, struct ifnet *ifp) -{ - return in_control(so, cmd, data, ifp); -} - struct pr_usrreqs udp_usrreqs = { - udp_abort, udp_accept, udp_attach, udp_bind, udp_connect, - pru_connect2_notsupp, udp_control, udp_detach, udp_disconnect, - udp_listen, udp_peeraddr, udp_rcvd, udp_rcvoob, udp_send, - udp_sense, udp_shutdown, udp_sockaddr + udp_abort, pru_accept_notsupp, udp_attach, udp_bind, udp_connect, + pru_connect2_notsupp, in_control, udp_detach, udp_disconnect, + pru_listen_notsupp, in_setpeeraddr, pru_rcvd_notsupp, + pru_rcvoob_notsupp, udp_send, pru_sense_null, udp_shutdown, + in_setsockaddr };