diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 3946c1408f2a..f7c811a33804 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.234 2014/08/09 05:33:00 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.234 2014/08/09 05:33:00 rtr Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -836,8 +836,7 @@ soconnect2(struct socket *so1, struct socket *so2) { KASSERT(solocked2(so1, so2)); - return (*so1->so_proto->pr_usrreqs->pr_generic)(so1, - PRU_CONNECT2, NULL, (struct mbuf *)so2, NULL, NULL); + return (*so1->so_proto->pr_usrreqs->pr_connect2)(so1, so2); } int diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c index d968414d49c4..95526fc055fd 100644 --- a/sys/kern/uipc_syscalls.c +++ b/sys/kern/uipc_syscalls.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.172 2014/08/09 05:33:00 rtr Exp $ */ /*- * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.171 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.172 2014/08/09 05:33:00 rtr Exp $"); #include "opt_pipe.h" @@ -1276,7 +1276,7 @@ pipe1(struct lwp *l, register_t *retval, int flags) wf->f_data = wso; retval[1] = fd; solock(wso); - error = unp_connect2(wso, rso, PRU_CONNECT2); + error = unp_connect2(wso, rso); sounlock(wso); if (error != 0) goto free4; diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c index 086cd8769b15..ba12b7ea77ed 100644 --- a/sys/kern/uipc_usrreq.c +++ b/sys/kern/uipc_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.169 2014/08/09 05:33:00 rtr Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.169 2014/08/09 05:33:00 rtr Exp $"); #include #include @@ -565,8 +565,6 @@ static int unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - struct unpcb *unp; - int error = 0; KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); @@ -574,6 +572,7 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -585,27 +584,16 @@ unp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); KASSERT(solocked(so)); - unp = sotounpcb(so); - KASSERT(!control); - if (unp == NULL) { - error = EINVAL; - goto release; - } + if (sotounpcb(so) == NULL) + return EINVAL; - switch (req) { - case PRU_CONNECT2: - error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2); - break; + panic("piusrreq"); - default: - panic("piusrreq"); - } - -release: - return (error); + return 0; } /* @@ -1088,6 +1076,56 @@ unp_abort(struct socket *so) return 0; } +static int +unp_connect1(struct socket *so, struct socket *so2) +{ + struct unpcb *unp = sotounpcb(so); + struct unpcb *unp2; + + if (so2->so_type != so->so_type) + return EPROTOTYPE; + + /* + * All three sockets involved must be locked by same lock: + * + * local endpoint (so) + * remote endpoint (so2) + * queue head (so2->so_head, only if PR_CONNREQUIRED) + */ + KASSERT(solocked2(so, so2)); + KASSERT(so->so_head == NULL); + if (so2->so_head != NULL) { + KASSERT(so2->so_lock == uipc_lock); + KASSERT(solocked2(so2, so2->so_head)); + } + + unp2 = sotounpcb(so2); + unp->unp_conn = unp2; + switch (so->so_type) { + + case SOCK_DGRAM: + unp->unp_nextref = unp2->unp_refs; + unp2->unp_refs = unp; + soisconnected(so); + break; + + case SOCK_SEQPACKET: /* FALLTHROUGH */ + case SOCK_STREAM: + + /* + * SOCK_SEQPACKET and SOCK_STREAM cases are handled by callers + * which are unp_connect() or unp_connect2(). + */ + + break; + + default: + panic("unp_connect1"); + } + + return 0; +} + int unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) { @@ -1182,7 +1220,38 @@ unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) } so2 = so3; } - error = unp_connect2(so, so2, PRU_CONNECT); + error = unp_connect1(so, so2); + if (error) { + sounlock(so); + goto bad; + } + unp2 = sotounpcb(so2); + switch (so->so_type) { + + /* + * SOCK_DGRAM and default cases are handled in prior call to + * unp_connect1(), do not add a default case without fixing + * unp_connect1(). + */ + + case SOCK_SEQPACKET: /* FALLTHROUGH */ + case SOCK_STREAM: + unp2->unp_conn = unp; + if ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT) + soisconnecting(so); + else + soisconnected(so); + soisconnected(so2); + /* + * If the connection is fully established, break the + * association with uipc_lock and give the connected + * pair a seperate lock to share. + */ + KASSERT(so2->so_head != NULL); + unp_setpeerlocks(so, so2); + break; + + } sounlock(so); bad: vput(vp); @@ -1194,64 +1263,36 @@ unp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) } int -unp_connect2(struct socket *so, struct socket *so2, int req) +unp_connect2(struct socket *so, struct socket *so2) { struct unpcb *unp = sotounpcb(so); struct unpcb *unp2; + int error = 0; - if (so2->so_type != so->so_type) - return (EPROTOTYPE); - - /* - * All three sockets involved must be locked by same lock: - * - * local endpoint (so) - * remote endpoint (so2) - * queue head (so2->so_head, only if PR_CONNREQUIRED) - */ KASSERT(solocked2(so, so2)); - KASSERT(so->so_head == NULL); - if (so2->so_head != NULL) { - KASSERT(so2->so_lock == uipc_lock); - KASSERT(solocked2(so2, so2->so_head)); - } + + error = unp_connect1(so, so2); + if (error) + return error; unp2 = sotounpcb(so2); - unp->unp_conn = unp2; switch (so->so_type) { - case SOCK_DGRAM: - unp->unp_nextref = unp2->unp_refs; - unp2->unp_refs = unp; - soisconnected(so); - break; + /* + * SOCK_DGRAM and default cases are handled in prior call to + * unp_connect1(), do not add a default case without fixing + * unp_connect1(). + */ case SOCK_SEQPACKET: /* FALLTHROUGH */ case SOCK_STREAM: unp2->unp_conn = unp; - if (req == PRU_CONNECT && - ((unp->unp_flags | unp2->unp_flags) & UNP_CONNWAIT)) - soisconnecting(so); - else - soisconnected(so); + soisconnected(so); soisconnected(so2); - /* - * If the connection is fully established, break the - * association with uipc_lock and give the connected - * pair a seperate lock to share. For CONNECT2, we - * require that the locks already match (the sockets - * are created that way). - */ - if (req == PRU_CONNECT) { - KASSERT(so2->so_head != NULL); - unp_setpeerlocks(so, so2); - } break; - default: - panic("unp_connect2"); } - return (0); + return error; } static void @@ -1928,6 +1969,7 @@ const struct pr_usrreqs unp_usrreqs = { .pr_bind = unp_bind, .pr_listen = unp_listen, .pr_connect = unp_connect, + .pr_connect2 = unp_connect2, .pr_disconnect = unp_disconnect, .pr_shutdown = unp_shutdown, .pr_abort = unp_abort, diff --git a/sys/miscfs/fifofs/fifo_vnops.c b/sys/miscfs/fifofs/fifo_vnops.c index 2e24c1df5724..1053cd6b6b13 100644 --- a/sys/miscfs/fifofs/fifo_vnops.c +++ b/sys/miscfs/fifofs/fifo_vnops.c @@ -1,4 +1,4 @@ -/* $NetBSD: fifo_vnops.c,v 1.76 2014/07/25 08:20:52 dholland Exp $ */ +/* $NetBSD: fifo_vnops.c,v 1.77 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 2008 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.76 2014/07/25 08:20:52 dholland Exp $"); +__KERNEL_RCSID(0, "$NetBSD: fifo_vnops.c,v 1.77 2014/08/09 05:33:01 rtr Exp $"); #include #include @@ -149,7 +149,7 @@ fifo_open(void *v) } fip->fi_writesock = wso; solock(wso); - if ((error = unp_connect2(wso, rso, PRU_CONNECT2)) != 0) { + if ((error = unp_connect2(wso, rso)) != 0) { sounlock(wso); (void)soclose(wso); (void)soclose(rso); diff --git a/sys/net/if.c b/sys/net/if.c index a35accb2ac91..ccd91e1f153e 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $ */ +/* $NetBSD: if.c,v 1.290 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.289 2014/07/31 06:35:47 ozaki-r Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.290 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" @@ -800,9 +800,7 @@ if_detach(struct ifnet *ifp) pr < dp->dom_protoswNPROTOSW; pr++) { so.so_proto = pr; if (pr->pr_usrreqs) { - (void) (*pr->pr_usrreqs->pr_generic)(&so, - PRU_PURGEIF, NULL, NULL, - (struct mbuf *) ifp, curlwp); + (void) (*pr->pr_usrreqs->pr_purgeif)(&so, ifp); purged = 1; } } @@ -852,9 +850,7 @@ if_detach(struct ifnet *ifp) for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW; pr++) { so.so_proto = pr; if (pr->pr_usrreqs && pr->pr_flags & PR_PURGEIF) - (void)(*pr->pr_usrreqs->pr_generic)(&so, - PRU_PURGEIF, NULL, NULL, - (struct mbuf *)ifp, curlwp); + (void)(*pr->pr_usrreqs->pr_purgeif)(&so, ifp); } } diff --git a/sys/net/link_proto.c b/sys/net/link_proto.c index 3833254f373d..b3054e66583a 100644 --- a/sys/net/link_proto.c +++ b/sys/net/link_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: link_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $"); #include #include @@ -54,6 +54,7 @@ static int link_accept(struct socket *, struct mbuf *); static int link_bind(struct socket *, struct mbuf *, struct lwp *); static int link_listen(struct socket *, struct lwp *); static int link_connect(struct socket *, struct mbuf *, struct lwp *); +static int link_connect2(struct socket *, struct socket *); static int link_disconnect(struct socket *); static int link_shutdown(struct socket *); static int link_abort(struct socket *); @@ -66,6 +67,7 @@ static int link_recvoob(struct socket *, struct mbuf *, int); static int link_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static int link_sendoob(struct socket *, struct mbuf *, struct mbuf *); +static int link_purgeif(struct socket *, struct ifnet *); static int link_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static void link_init(void); @@ -83,6 +85,7 @@ static const struct pr_usrreqs link_usrreqs = { .pr_bind = link_bind, .pr_listen = link_listen, .pr_connect = link_connect, + .pr_connect2 = link_connect2, .pr_disconnect = link_disconnect, .pr_shutdown = link_shutdown, .pr_abort = link_abort, @@ -94,6 +97,7 @@ static const struct pr_usrreqs link_usrreqs = { .pr_recvoob = link_recvoob, .pr_send = link_send, .pr_sendoob = link_sendoob, + .pr_purgeif = link_purgeif, .pr_generic = link_usrreq, }; @@ -293,6 +297,14 @@ link_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return EOPNOTSUPP; } +static int +link_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int link_disconnect(struct socket *so) { @@ -380,6 +392,13 @@ link_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +link_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + static int link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) @@ -390,6 +409,7 @@ link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -401,6 +421,7 @@ link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); return EOPNOTSUPP; } diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c index 9554fa73ba85..a6513e51b8f2 100644 --- a/sys/net/raw_usrreq.c +++ b/sys/net/raw_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: raw_usrreq.c,v 1.52 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -36,7 +36,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.52 2014/08/09 05:33:01 rtr Exp $"); #include #include @@ -199,8 +199,6 @@ int raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - struct rawcb *rp = sotorawcb(so); - int s, error = 0; KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); @@ -208,6 +206,7 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -219,33 +218,12 @@ raw_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - s = splsoftnet(); - KERNEL_LOCK(1, NULL); - - KASSERT(!control); - if (rp == NULL) { - error = EINVAL; - goto release; - } - - switch (req) { - /* - * If a socket isn't bound to a single address, - * the raw input routine will hand it anything - * within that protocol family (assuming there's - * nothing else around it should go to). - */ - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; + if (sotorawcb(so) == NULL) + return EINVAL; - default: - panic("raw_usrreq"); - } + panic("raw_usrreq"); -release: - KERNEL_UNLOCK_ONE(NULL); - splx(s); - return (error); + return 0; } diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index e9c2fcd7219c..7f500e1b073f 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: rtsock.c,v 1.163 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.163 2014/08/09 05:33:01 rtr Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -257,6 +257,14 @@ COMPATNAME(route_connect)(struct socket *so, struct mbuf *nam, struct lwp *l) return EOPNOTSUPP; } +static int +COMPATNAME(route_connect2)(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int COMPATNAME(route_disconnect)(struct socket *so) { @@ -390,6 +398,14 @@ COMPATNAME(route_sendoob)(struct socket *so, struct mbuf *m, return EOPNOTSUPP; } +static int +COMPATNAME(route_purgeif)(struct socket *so, struct ifnet *ifp) +{ + + panic("route_purgeif"); + + return EOPNOTSUPP; +} static int COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, @@ -403,6 +419,7 @@ COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -414,6 +431,7 @@ COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); s = splsoftnet(); error = raw_usrreq(so, req, m, nam, control, l); @@ -1514,6 +1532,7 @@ static const struct pr_usrreqs route_usrreqs = { .pr_bind = COMPATNAME(route_bind_wrapper), .pr_listen = COMPATNAME(route_listen_wrapper), .pr_connect = COMPATNAME(route_connect_wrapper), + .pr_connect2 = COMPATNAME(route_connect2_wrapper), .pr_disconnect = COMPATNAME(route_disconnect_wrapper), .pr_shutdown = COMPATNAME(route_shutdown_wrapper), .pr_abort = COMPATNAME(route_abort_wrapper), @@ -1525,6 +1544,7 @@ static const struct pr_usrreqs route_usrreqs = { .pr_recvoob = COMPATNAME(route_recvoob_wrapper), .pr_send = COMPATNAME(route_send_wrapper), .pr_sendoob = COMPATNAME(route_sendoob_wrapper), + .pr_purgeif = COMPATNAME(route_purgeif_wrapper), .pr_generic = COMPATNAME(route_usrreq_wrapper), }; diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index 869f04a49c73..810e68f7a454 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.63 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.63 2014/08/09 05:33:01 rtr Exp $"); #include "opt_mbuftrace.h" @@ -88,6 +88,7 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -99,15 +100,10 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); ddp = sotoddpcb(so); - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - at_purgeif((struct ifnet *) rights); - mutex_exit(softnet_lock); - return (0); - } if (rights && rights->m_len) { error = EINVAL; goto release; @@ -117,7 +113,6 @@ ddp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr, goto release; } switch (req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -453,6 +448,14 @@ ddp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +ddp_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int ddp_disconnect(struct socket *so) { @@ -584,6 +587,17 @@ ddp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +ddp_purgeif(struct socket *so, struct ifnet *ifp) +{ + + mutex_enter(softnet_lock); + at_purgeif(ifp); + mutex_exit(softnet_lock); + + return 0; +} + /* * For the moment, this just find the pcb with the correct local address. * In the future, this will actually do some real searching, so we can use @@ -661,6 +675,7 @@ PR_WRAP_USRREQS(ddp) #define ddp_bind ddp_bind_wrapper #define ddp_listen ddp_listen_wrapper #define ddp_connect ddp_connect_wrapper +#define ddp_connect2 ddp_connect2_wrapper #define ddp_disconnect ddp_disconnect_wrapper #define ddp_shutdown ddp_shutdown_wrapper #define ddp_abort ddp_abort_wrapper @@ -672,6 +687,7 @@ PR_WRAP_USRREQS(ddp) #define ddp_recvoob ddp_recvoob_wrapper #define ddp_send ddp_send_wrapper #define ddp_sendoob ddp_sendoob_wrapper +#define ddp_purgeif ddp_purgeif_wrapper #define ddp_usrreq ddp_usrreq_wrapper const struct pr_usrreqs ddp_usrreqs = { @@ -681,6 +697,7 @@ const struct pr_usrreqs ddp_usrreqs = { .pr_bind = ddp_bind, .pr_listen = ddp_listen, .pr_connect = ddp_connect, + .pr_connect2 = ddp_connect2, .pr_disconnect = ddp_disconnect, .pr_shutdown = ddp_shutdown, .pr_abort = ddp_abort, @@ -692,6 +709,7 @@ const struct pr_usrreqs ddp_usrreqs = { .pr_recvoob = ddp_recvoob, .pr_send = ddp_send, .pr_sendoob = ddp_sendoob, + .pr_purgeif = ddp_purgeif, .pr_generic = ddp_usrreq, }; diff --git a/sys/netbt/hci_socket.c b/sys/netbt/hci_socket.c index 3c9a36015b1d..36185167dbc1 100644 --- a/sys/netbt/hci_socket.c +++ b/sys/netbt/hci_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: hci_socket.c,v 1.40 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.40 2014/08/09 05:33:01 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -551,6 +551,14 @@ hci_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return 0; } +static int +hci_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int hci_disconnect(struct socket *so) { @@ -712,6 +720,13 @@ hci_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +hci_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + /* * User Request. * up is socket @@ -726,7 +741,7 @@ static int hci_usrreq(struct socket *up, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *ctl, struct lwp *l) { - struct hci_pcb *pcb = (struct hci_pcb *)up->so_pcb; + struct hci_pcb *pcb = up->so_pcb; int err = 0; DPRINTFN(2, "%s\n", prurequests[req]); @@ -736,6 +751,7 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -747,11 +763,7 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); - - switch(req) { - case PRU_PURGEIF: - return EOPNOTSUPP; - } + KASSERT(req != PRU_PURGEIF); /* anything after here *requires* a pcb */ if (pcb == NULL) { @@ -760,7 +772,6 @@ hci_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -994,6 +1005,7 @@ PR_WRAP_USRREQS(hci) #define hci_bind hci_bind_wrapper #define hci_listen hci_listen_wrapper #define hci_connect hci_connect_wrapper +#define hci_connect2 hci_connect2_wrapper #define hci_disconnect hci_disconnect_wrapper #define hci_shutdown hci_shutdown_wrapper #define hci_abort hci_abort_wrapper @@ -1005,6 +1017,7 @@ PR_WRAP_USRREQS(hci) #define hci_recvoob hci_recvoob_wrapper #define hci_send hci_send_wrapper #define hci_sendoob hci_sendoob_wrapper +#define hci_purgeif hci_purgeif_wrapper #define hci_usrreq hci_usrreq_wrapper const struct pr_usrreqs hci_usrreqs = { @@ -1014,6 +1027,7 @@ const struct pr_usrreqs hci_usrreqs = { .pr_bind = hci_bind, .pr_listen = hci_listen, .pr_connect = hci_connect, + .pr_connect2 = hci_connect2, .pr_disconnect = hci_disconnect, .pr_shutdown = hci_shutdown, .pr_abort = hci_abort, @@ -1025,5 +1039,6 @@ const struct pr_usrreqs hci_usrreqs = { .pr_recvoob = hci_recvoob, .pr_send = hci_send, .pr_sendoob = hci_sendoob, + .pr_purgeif = hci_purgeif, .pr_generic = hci_usrreq, }; diff --git a/sys/netbt/l2cap_socket.c b/sys/netbt/l2cap_socket.c index bf247a3f9394..6f03db081679 100644 --- a/sys/netbt/l2cap_socket.c +++ b/sys/netbt/l2cap_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: l2cap_socket.c,v 1.31 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.31 2014/08/09 05:33:01 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -191,6 +191,17 @@ l2cap_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return l2cap_connect_pcb(pcb, sa); } +static int +l2cap_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + if (so->so_pcb == NULL) + return EINVAL; + + return EOPNOTSUPP; +} + static int l2cap_disconnect(struct socket *so) { @@ -346,13 +357,19 @@ l2cap_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +l2cap_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + /* * User Request. * up is socket * m is optional mbuf chain containing message * ctl is either * optional mbuf chain containing socket options - * optional interface pointer PRU_PURGEIF * l is pointer to process requesting action (if any) * * we are responsible for disposing of m and ctl if @@ -372,6 +389,7 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -383,11 +401,7 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); - - switch (req) { - case PRU_PURGEIF: - return EOPNOTSUPP; - } + KASSERT(req != PRU_PURGEIF); if (pcb == NULL) { err = EINVAL; @@ -395,7 +409,6 @@ l2cap_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -563,6 +576,7 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_bind l2cap_bind_wrapper #define l2cap_listen l2cap_listen_wrapper #define l2cap_connect l2cap_connect_wrapper +#define l2cap_connect2 l2cap_connect2_wrapper #define l2cap_disconnect l2cap_disconnect_wrapper #define l2cap_shutdown l2cap_shutdown_wrapper #define l2cap_abort l2cap_abort_wrapper @@ -574,6 +588,7 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_recvoob l2cap_recvoob_wrapper #define l2cap_send l2cap_send_wrapper #define l2cap_sendoob l2cap_sendoob_wrapper +#define l2cap_purgeif l2cap_purgeif_wrapper #define l2cap_usrreq l2cap_usrreq_wrapper const struct pr_usrreqs l2cap_usrreqs = { @@ -583,6 +598,7 @@ const struct pr_usrreqs l2cap_usrreqs = { .pr_bind = l2cap_bind, .pr_listen = l2cap_listen, .pr_connect = l2cap_connect, + .pr_connect2 = l2cap_connect2, .pr_disconnect = l2cap_disconnect, .pr_shutdown = l2cap_shutdown, .pr_abort = l2cap_abort, @@ -594,5 +610,6 @@ const struct pr_usrreqs l2cap_usrreqs = { .pr_recvoob = l2cap_recvoob, .pr_send = l2cap_send, .pr_sendoob = l2cap_sendoob, + .pr_purgeif = l2cap_purgeif, .pr_generic = l2cap_usrreq, }; diff --git a/sys/netbt/rfcomm_socket.c b/sys/netbt/rfcomm_socket.c index 122d5a385d4b..435a0b69833e 100644 --- a/sys/netbt/rfcomm_socket.c +++ b/sys/netbt/rfcomm_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: rfcomm_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -199,6 +199,19 @@ rfcomm_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return rfcomm_connect_pcb(pcb, sa); } +static int +rfcomm_connect2(struct socket *so, struct socket *so2) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + return EOPNOTSUPP; +} + static int rfcomm_disconnect(struct socket *so) { @@ -349,13 +362,19 @@ rfcomm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +rfcomm_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + /* * User Request. * up is socket * m is optional mbuf chain containing message * ctl is either * optional mbuf chain containing socket options - * optional interface pointer PRU_PURGEIF * l is pointer to process requesting action (if any) * * we are responsible for disposing of m and ctl if @@ -375,6 +394,7 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -386,18 +406,14 @@ rfcomm_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - switch (req) { - case PRU_PURGEIF: - return EOPNOTSUPP; - } if (pcb == NULL) { err = EINVAL; goto release; } switch(req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -577,6 +593,7 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_bind rfcomm_bind_wrapper #define rfcomm_listen rfcomm_listen_wrapper #define rfcomm_connect rfcomm_connect_wrapper +#define rfcomm_connect2 rfcomm_connect2_wrapper #define rfcomm_disconnect rfcomm_disconnect_wrapper #define rfcomm_shutdown rfcomm_shutdown_wrapper #define rfcomm_abort rfcomm_abort_wrapper @@ -588,6 +605,7 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_recvoob rfcomm_recvoob_wrapper #define rfcomm_send rfcomm_send_wrapper #define rfcomm_sendoob rfcomm_sendoob_wrapper +#define rfcomm_purgeif rfcomm_purgeif_wrapper #define rfcomm_usrreq rfcomm_usrreq_wrapper const struct pr_usrreqs rfcomm_usrreqs = { @@ -597,6 +615,7 @@ const struct pr_usrreqs rfcomm_usrreqs = { .pr_bind = rfcomm_bind, .pr_listen = rfcomm_listen, .pr_connect = rfcomm_connect, + .pr_connect2 = rfcomm_connect2, .pr_disconnect = rfcomm_disconnect, .pr_shutdown = rfcomm_shutdown, .pr_abort = rfcomm_abort, @@ -608,5 +627,6 @@ const struct pr_usrreqs rfcomm_usrreqs = { .pr_recvoob = rfcomm_recvoob, .pr_send = rfcomm_send, .pr_sendoob = rfcomm_sendoob, + .pr_purgeif = rfcomm_purgeif, .pr_generic = rfcomm_usrreq, }; diff --git a/sys/netbt/sco_socket.c b/sys/netbt/sco_socket.c index 52de1b80ccb2..f2a9d8285464 100644 --- a/sys/netbt/sco_socket.c +++ b/sys/netbt/sco_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: sco_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.33 2014/08/09 05:33:01 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -182,6 +182,19 @@ sco_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return sco_connect_pcb(pcb, sa); } +static int +sco_connect2(struct socket *so, struct socket *so2) +{ + struct sco_pcb *pcb = so->so_pcb; + + KASSERT(solocked(so)); + + if (pcb == NULL) + return EINVAL; + + return EOPNOTSUPP; +} + static int sco_disconnect(struct socket *so) { @@ -335,6 +348,13 @@ sco_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +sco_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + /* * User Request. * up is socket @@ -350,7 +370,7 @@ static int sco_usrreq(struct socket *up, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *ctl, struct lwp *l) { - struct sco_pcb *pcb = (struct sco_pcb *)up->so_pcb; + struct sco_pcb *pcb = up->so_pcb; int err = 0; DPRINTFN(2, "%s\n", prurequests[req]); @@ -360,6 +380,7 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -371,11 +392,7 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); - - switch(req) { - case PRU_PURGEIF: - return EOPNOTSUPP; - } + KASSERT(req != PRU_PURGEIF); /* anything after here *requires* a pcb */ if (pcb == NULL) { @@ -384,7 +401,6 @@ sco_usrreq(struct socket *up, int req, struct mbuf *m, } switch(req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -531,6 +547,7 @@ PR_WRAP_USRREQS(sco) #define sco_bind sco_bind_wrapper #define sco_listen sco_listen_wrapper #define sco_connect sco_connect_wrapper +#define sco_connect2 sco_connect2_wrapper #define sco_disconnect sco_disconnect_wrapper #define sco_shutdown sco_shutdown_wrapper #define sco_abort sco_abort_wrapper @@ -542,6 +559,7 @@ PR_WRAP_USRREQS(sco) #define sco_recvoob sco_recvoob_wrapper #define sco_send sco_send_wrapper #define sco_sendoob sco_sendoob_wrapper +#define sco_purgeif sco_purgeif_wrapper #define sco_usrreq sco_usrreq_wrapper const struct pr_usrreqs sco_usrreqs = { @@ -551,6 +569,7 @@ const struct pr_usrreqs sco_usrreqs = { .pr_bind = sco_bind, .pr_listen = sco_listen, .pr_connect = sco_connect, + .pr_connect2 = sco_connect2, .pr_disconnect = sco_disconnect, .pr_shutdown = sco_shutdown, .pr_abort = sco_abort, @@ -562,5 +581,6 @@ const struct pr_usrreqs sco_usrreqs = { .pr_recvoob = sco_recvoob, .pr_send = sco_send, .pr_sendoob = sco_sendoob, + .pr_purgeif = sco_purgeif, .pr_generic = sco_usrreq, }; diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c index 2f420a2eb12c..616a55d4347f 100644 --- a/sys/netinet/raw_ip.c +++ b/sys/netinet/raw_ip.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: raw_ip.c,v 1.145 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.145 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -623,6 +623,14 @@ rip_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +rip_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int rip_disconnect(struct socket *so) { @@ -790,19 +798,33 @@ rip_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +rip_purgeif(struct socket *so, struct ifnet *ifp) +{ + int s; + + s = splsoftnet(); + mutex_enter(softnet_lock); + in_pcbpurgeif0(&rawcbtable, ifp); + in_purgeif(ifp); + in_pcbpurgeif(&rawcbtable, ifp); + mutex_exit(softnet_lock); + splx(s); + + return 0; +} + int rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - struct inpcb *inp; - int s, error = 0; - KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -814,39 +836,16 @@ rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); - - s = splsoftnet(); - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - in_pcbpurgeif0(&rawcbtable, (struct ifnet *)control); - in_purgeif((struct ifnet *)control); - in_pcbpurgeif(&rawcbtable, (struct ifnet *)control); - mutex_exit(softnet_lock); - splx(s); - return 0; - } + KASSERT(req != PRU_PURGEIF); KASSERT(solocked(so)); - inp = sotoinpcb(so); - KASSERT(!control); - if (inp == NULL) { - splx(s); + if (sotoinpcb(so) == NULL) return EINVAL; - } - switch (req) { + panic("rip_usrreq"); - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; - - default: - panic("rip_usrreq"); - } - splx(s); - - return error; + return 0; } PR_WRAP_USRREQS(rip) @@ -856,6 +855,7 @@ PR_WRAP_USRREQS(rip) #define rip_bind rip_bind_wrapper #define rip_listen rip_listen_wrapper #define rip_connect rip_connect_wrapper +#define rip_connect2 rip_connect2_wrapper #define rip_disconnect rip_disconnect_wrapper #define rip_shutdown rip_shutdown_wrapper #define rip_abort rip_abort_wrapper @@ -867,6 +867,7 @@ PR_WRAP_USRREQS(rip) #define rip_recvoob rip_recvoob_wrapper #define rip_send rip_send_wrapper #define rip_sendoob rip_sendoob_wrapper +#define rip_purgeif rip_purgeif_wrapper #define rip_usrreq rip_usrreq_wrapper const struct pr_usrreqs rip_usrreqs = { @@ -876,6 +877,7 @@ const struct pr_usrreqs rip_usrreqs = { .pr_bind = rip_bind, .pr_listen = rip_listen, .pr_connect = rip_connect, + .pr_connect2 = rip_connect2, .pr_disconnect = rip_disconnect, .pr_shutdown = rip_shutdown, .pr_abort = rip_abort, @@ -887,6 +889,7 @@ const struct pr_usrreqs rip_usrreqs = { .pr_recvoob = rip_recvoob, .pr_send = rip_send, .pr_sendoob = rip_sendoob, + .pr_purgeif = rip_purgeif, .pr_generic = rip_usrreq, }; diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c index 7af7c8123d6f..3cafb43b0d20 100644 --- a/sys/netinet/tcp_usrreq.c +++ b/sys/netinet/tcp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.200 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.200 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -224,19 +224,13 @@ static int tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - struct inpcb *inp = NULL; - struct in6pcb *in6p = NULL; - struct tcpcb *tp = NULL; - int s; - int error = 0; - int ostate = 0; - KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -248,65 +242,13 @@ tcp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - s = splsoftnet(); - - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - switch (so->so_proto->pr_domain->dom_family) { -#ifdef INET - case PF_INET: - in_pcbpurgeif0(&tcbtable, (struct ifnet *)control); - in_purgeif((struct ifnet *)control); - in_pcbpurgeif(&tcbtable, (struct ifnet *)control); - break; -#endif -#ifdef INET6 - case PF_INET6: - in6_pcbpurgeif0(&tcbtable, (struct ifnet *)control); - in6_purgeif((struct ifnet *)control); - in6_pcbpurgeif(&tcbtable, (struct ifnet *)control); - break; -#endif - default: - mutex_exit(softnet_lock); - splx(s); - return (EAFNOSUPPORT); - } - mutex_exit(softnet_lock); - splx(s); - return (0); - } - - if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) { - splx(s); - return error; - } - - ostate = tcp_debug_capture(tp, req); - - KASSERT(!control); -#ifdef INET6 - /* XXX: KASSERT((inp != NULL) ^ (in6p != NULL)); */ -#endif - - switch (req) { - - /* - * Create a TCP connection between two sockets. - */ - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; - - default: - panic("tcp_usrreq"); - } + KASSERT(solocked(so)); - tcp_debug_trace(so, tp, ostate, req); - splx(s); + panic("tcp_usrreq"); - return error; + return 0; } static void @@ -878,6 +820,27 @@ tcp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +tcp_connect2(struct socket *so, struct socket *so2) +{ + struct inpcb *inp = NULL; + struct in6pcb *in6p = NULL; + struct tcpcb *tp = NULL; + int error = 0; + int ostate = 0; + + KASSERT(solocked(so)); + + if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0) + return error; + + ostate = tcp_debug_capture(tp, PRU_CONNECT2); + + tcp_debug_trace(so, tp, ostate, PRU_CONNECT2); + + return EOPNOTSUPP; +} + static int tcp_disconnect(struct socket *so) { @@ -1203,6 +1166,39 @@ tcp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return error; } +static int +tcp_purgeif(struct socket *so, struct ifnet *ifp) +{ + int s; + + s = splsoftnet(); + mutex_enter(softnet_lock); + switch (so->so_proto->pr_domain->dom_family) { +#ifdef INET + case PF_INET: + in_pcbpurgeif0(&tcbtable, ifp); + in_purgeif(ifp); + in_pcbpurgeif(&tcbtable, ifp); + break; +#endif +#ifdef INET6 + case PF_INET6: + in6_pcbpurgeif0(&tcbtable, ifp); + in6_purgeif(ifp); + in6_pcbpurgeif(&tcbtable, ifp); + break; +#endif + default: + mutex_exit(softnet_lock); + splx(s); + return EAFNOSUPPORT; + } + mutex_exit(softnet_lock); + splx(s); + + return 0; +} + /* * Initiate (or continue) disconnect. * If embryonic state, just send reset (once). @@ -2443,6 +2439,7 @@ PR_WRAP_USRREQS(tcp) #define tcp_bind tcp_bind_wrapper #define tcp_listen tcp_listen_wrapper #define tcp_connect tcp_connect_wrapper +#define tcp_connect2 tcp_connect2_wrapper #define tcp_disconnect tcp_disconnect_wrapper #define tcp_shutdown tcp_shutdown_wrapper #define tcp_abort tcp_abort_wrapper @@ -2454,6 +2451,7 @@ PR_WRAP_USRREQS(tcp) #define tcp_recvoob tcp_recvoob_wrapper #define tcp_send tcp_send_wrapper #define tcp_sendoob tcp_sendoob_wrapper +#define tcp_purgeif tcp_purgeif_wrapper #define tcp_usrreq tcp_usrreq_wrapper const struct pr_usrreqs tcp_usrreqs = { @@ -2463,6 +2461,7 @@ const struct pr_usrreqs tcp_usrreqs = { .pr_bind = tcp_bind, .pr_listen = tcp_listen, .pr_connect = tcp_connect, + .pr_connect2 = tcp_connect2, .pr_disconnect = tcp_disconnect, .pr_shutdown = tcp_shutdown, .pr_abort = tcp_abort, @@ -2474,5 +2473,6 @@ const struct pr_usrreqs tcp_usrreqs = { .pr_recvoob = tcp_recvoob, .pr_send = tcp_send, .pr_sendoob = tcp_sendoob, + .pr_purgeif = tcp_purgeif, .pr_generic = tcp_usrreq, }; diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index 30ab50dbbe2e..4c184ba18434 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.217 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -949,6 +949,14 @@ udp_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +udp_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int udp_disconnect(struct socket *so) { @@ -1119,19 +1127,33 @@ udp_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +udp_purgeif(struct socket *so, struct ifnet *ifp) +{ + int s; + + s = splsoftnet(); + mutex_enter(softnet_lock); + in_pcbpurgeif0(&udbtable, ifp); + in_purgeif(ifp); + in_pcbpurgeif(&udbtable, ifp); + mutex_exit(softnet_lock); + splx(s); + + return 0; +} + static int udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - struct inpcb *inp; - int s, error = 0; - KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -1143,42 +1165,16 @@ udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); - - s = splsoftnet(); - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - in_pcbpurgeif0(&udbtable, (struct ifnet *)control); - in_purgeif((struct ifnet *)control); - in_pcbpurgeif(&udbtable, (struct ifnet *)control); - mutex_exit(softnet_lock); - splx(s); - return 0; - } + KASSERT(req != PRU_PURGEIF); KASSERT(solocked(so)); - inp = sotoinpcb(so); - KASSERT(!control); - if (inp == NULL) { - splx(s); + if (sotoinpcb(so) == NULL) return EINVAL; - } - /* - * Note: need to block udp_input while changing - * the udp pcb queue and/or pcb addresses. - */ - switch (req) { - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; - - default: - panic("udp_usrreq"); - } - splx(s); + panic("udp_usrreq"); - return error; + return 0; } static int @@ -1405,6 +1401,7 @@ PR_WRAP_USRREQS(udp) #define udp_bind udp_bind_wrapper #define udp_listen udp_listen_wrapper #define udp_connect udp_connect_wrapper +#define udp_connect2 udp_connect2_wrapper #define udp_disconnect udp_disconnect_wrapper #define udp_shutdown udp_shutdown_wrapper #define udp_abort udp_abort_wrapper @@ -1416,6 +1413,7 @@ PR_WRAP_USRREQS(udp) #define udp_recvoob udp_recvoob_wrapper #define udp_send udp_send_wrapper #define udp_sendoob udp_sendoob_wrapper +#define udp_purgeif udp_purgeif_wrapper #define udp_usrreq udp_usrreq_wrapper const struct pr_usrreqs udp_usrreqs = { @@ -1425,6 +1423,7 @@ const struct pr_usrreqs udp_usrreqs = { .pr_bind = udp_bind, .pr_listen = udp_listen, .pr_connect = udp_connect, + .pr_connect2 = udp_connect2, .pr_disconnect = udp_disconnect, .pr_shutdown = udp_shutdown, .pr_abort = udp_abort, @@ -1436,5 +1435,6 @@ const struct pr_usrreqs udp_usrreqs = { .pr_recvoob = udp_recvoob, .pr_send = udp_send, .pr_sendoob = udp_sendoob, + .pr_purgeif = udp_purgeif, .pr_generic = udp_usrreq, }; diff --git a/sys/netinet6/raw_ip6.c b/sys/netinet6/raw_ip6.c index 51f8572fc45a..cd4da4c65c2e 100644 --- a/sys/netinet6/raw_ip6.c +++ b/sys/netinet6/raw_ip6.c @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.136 2014/08/09 05:33:01 rtr Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.136 2014/08/09 05:33:01 rtr Exp $"); #include "opt_ipsec.h" @@ -754,6 +754,14 @@ rip6_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +rip6_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int rip6_disconnect(struct socket *so) { @@ -911,16 +919,29 @@ rip6_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +rip6_purgeif(struct socket *so, struct ifnet *ifp) +{ + + mutex_enter(softnet_lock); + in6_pcbpurgeif0(&raw6cbtable, ifp); + in6_purgeif(ifp); + in6_pcbpurgeif(&raw6cbtable, ifp); + mutex_exit(softnet_lock); + + return 0; +} + int rip6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - int error = 0; KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -931,28 +952,12 @@ rip6_usrreq(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_RCVD); KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); + KASSERT(req != PRU_PURGEIF); KASSERT(req != PRU_SENDOOB); - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - in6_pcbpurgeif0(&raw6cbtable, (struct ifnet *)control); - in6_purgeif((struct ifnet *)control); - in6_pcbpurgeif(&raw6cbtable, (struct ifnet *)control); - mutex_exit(softnet_lock); - return 0; - } - - switch (req) { - case PRU_CONNECT2: - error = EOPNOTSUPP; - break; + panic("rip6_usrreq"); - default: - panic("rip6_usrreq"); - } - if (m != NULL) - m_freem(m); - return error; + return 0; } static int @@ -1001,6 +1006,7 @@ PR_WRAP_USRREQS(rip6) #define rip6_bind rip6_bind_wrapper #define rip6_listen rip6_listen_wrapper #define rip6_connect rip6_connect_wrapper +#define rip6_connect2 rip6_connect2_wrapper #define rip6_disconnect rip6_disconnect_wrapper #define rip6_shutdown rip6_shutdown_wrapper #define rip6_abort rip6_abort_wrapper @@ -1012,6 +1018,7 @@ PR_WRAP_USRREQS(rip6) #define rip6_recvoob rip6_recvoob_wrapper #define rip6_send rip6_send_wrapper #define rip6_sendoob rip6_sendoob_wrapper +#define rip6_purgeif rip6_purgeif_wrapper #define rip6_usrreq rip6_usrreq_wrapper const struct pr_usrreqs rip6_usrreqs = { @@ -1021,6 +1028,7 @@ const struct pr_usrreqs rip6_usrreqs = { .pr_bind = rip6_bind, .pr_listen = rip6_listen, .pr_connect = rip6_connect, + .pr_connect2 = rip6_connect2, .pr_disconnect = rip6_disconnect, .pr_shutdown = rip6_shutdown, .pr_abort = rip6_abort, @@ -1032,5 +1040,6 @@ const struct pr_usrreqs rip6_usrreqs = { .pr_recvoob = rip6_recvoob, .pr_send = rip6_send, .pr_sendoob = rip6_sendoob, + .pr_purgeif = rip6_purgeif, .pr_generic = rip6_usrreq, }; diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 536c77cf5a20..d468d0c79c8d 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.115 2014/08/09 05:33:01 rtr Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.115 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" #include "opt_inet_csum.h" @@ -730,6 +730,14 @@ udp6_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +udp6_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int udp6_disconnect(struct socket *so) { @@ -875,11 +883,23 @@ udp6_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +udp6_purgeif(struct socket *so, struct ifnet *ifp) +{ + + mutex_enter(softnet_lock); + in6_pcbpurgeif0(&udbtable, ifp); + in6_purgeif(ifp); + in6_pcbpurgeif(&udbtable, ifp); + mutex_exit(softnet_lock); + + return 0; +} + int udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, struct mbuf *control, struct lwp *l) { - struct in6pcb *in6p = sotoin6pcb(so); int error = 0; KASSERT(req != PRU_ATTACH); @@ -888,6 +908,7 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -899,22 +920,14 @@ udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - if (req == PRU_PURGEIF) { - mutex_enter(softnet_lock); - in6_pcbpurgeif0(&udbtable, (struct ifnet *)control); - in6_purgeif((struct ifnet *)control); - in6_pcbpurgeif(&udbtable, (struct ifnet *)control); - mutex_exit(softnet_lock); - return 0; - } - if (in6p == NULL) { + if (sotoin6pcb(so) == NULL) { error = EINVAL; goto release; } switch (req) { - case PRU_CONNECT2: case PRU_FASTTIMO: case PRU_SLOWTIMO: case PRU_PROTORCV: @@ -1009,6 +1022,7 @@ PR_WRAP_USRREQS(udp6) #define udp6_bind udp6_bind_wrapper #define udp6_listen udp6_listen_wrapper #define udp6_connect udp6_connect_wrapper +#define udp6_connect2 udp6_connect2_wrapper #define udp6_disconnect udp6_disconnect_wrapper #define udp6_shutdown udp6_shutdown_wrapper #define udp6_abort udp6_abort_wrapper @@ -1020,6 +1034,7 @@ PR_WRAP_USRREQS(udp6) #define udp6_recvoob udp6_recvoob_wrapper #define udp6_send udp6_send_wrapper #define udp6_sendoob udp6_sendoob_wrapper +#define udp6_purgeif udp6_purgeif_wrapper #define udp6_usrreq udp6_usrreq_wrapper const struct pr_usrreqs udp6_usrreqs = { @@ -1029,6 +1044,7 @@ const struct pr_usrreqs udp6_usrreqs = { .pr_bind = udp6_bind, .pr_listen = udp6_listen, .pr_connect = udp6_connect, + .pr_connect2 = udp6_connect2, .pr_disconnect = udp6_disconnect, .pr_shutdown = udp6_shutdown, .pr_abort = udp6_abort, @@ -1040,5 +1056,6 @@ const struct pr_usrreqs udp6_usrreqs = { .pr_recvoob = udp6_recvoob, .pr_send = udp6_send, .pr_sendoob = udp6_sendoob, + .pr_purgeif = udp6_purgeif, .pr_generic = udp6_usrreq, }; diff --git a/sys/netipsec/keysock.c b/sys/netipsec/keysock.c index 81d01670c24a..c7e66bbcd481 100644 --- a/sys/netipsec/keysock.c +++ b/sys/netipsec/keysock.c @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: keysock.c,v 1.43 2014/08/09 05:33:01 rtr Exp $ */ /* $FreeBSD: src/sys/netipsec/keysock.c,v 1.3.2.1 2003/01/24 05:11:36 sam Exp $ */ /* $KAME: keysock.c,v 1.25 2001/08/13 20:07:41 itojun Exp $ */ @@ -32,7 +32,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.43 2014/08/09 05:33:01 rtr Exp $"); #include "opt_ipsec.h" @@ -518,6 +518,14 @@ key_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return EOPNOTSUPP; } +static int +key_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int key_disconnect(struct socket *so) { @@ -651,6 +659,15 @@ key_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +key_purgeif(struct socket *so, struct ifnet *ifa) +{ + + panic("key_purgeif"); + + return EOPNOTSUPP; +} + /* * key_usrreq() * derived from net/rtsock.c:route_usrreq() @@ -667,6 +684,7 @@ key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -678,6 +696,7 @@ key_usrreq(struct socket *so, int req,struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); s = splsoftnet(); error = raw_usrreq(so, req, m, nam, control, l); @@ -700,6 +719,7 @@ PR_WRAP_USRREQS(key) #define key_bind key_bind_wrapper #define key_listen key_listen_wrapper #define key_connect key_connect_wrapper +#define key_connect2 key_connect2_wrapper #define key_disconnect key_disconnect_wrapper #define key_shutdown key_shutdown_wrapper #define key_abort key_abort_wrapper @@ -711,6 +731,7 @@ PR_WRAP_USRREQS(key) #define key_recvoob key_recvoob_wrapper #define key_send key_send_wrapper #define key_sendoob key_sendoob_wrapper +#define key_purgeif key_purgeif_wrapper #define key_usrreq key_usrreq_wrapper const struct pr_usrreqs key_usrreqs = { @@ -720,6 +741,7 @@ const struct pr_usrreqs key_usrreqs = { .pr_bind = key_bind, .pr_listen = key_listen, .pr_connect = key_connect, + .pr_connect2 = key_connect2, .pr_disconnect = key_disconnect, .pr_shutdown = key_shutdown, .pr_abort = key_abort, @@ -731,6 +753,7 @@ const struct pr_usrreqs key_usrreqs = { .pr_recvoob = key_recvoob, .pr_send = key_send, .pr_sendoob = key_sendoob, + .pr_purgeif = key_purgeif, .pr_generic = key_usrreq, }; diff --git a/sys/netmpls/mpls_proto.c b/sys/netmpls/mpls_proto.c index 4be013c9dd7b..c90d2b8351bc 100644 --- a/sys/netmpls/mpls_proto.c +++ b/sys/netmpls/mpls_proto.c @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: mpls_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.24 2014/08/09 05:33:01 rtr Exp $"); #include "opt_inet.h" #include "opt_mbuftrace.h" @@ -126,6 +126,14 @@ mpls_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return EOPNOTSUPP; } +static int +mpls_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int mpls_disconnect(struct socket *so) { @@ -213,17 +221,24 @@ mpls_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) return EOPNOTSUPP; } +static int +mpls_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; +} + static int mpls_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -235,6 +250,7 @@ mpls_usrreq(struct socket *so, int req, struct mbuf *m, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); return EOPNOTSUPP; } @@ -327,6 +343,7 @@ PR_WRAP_USRREQS(mpls) #define mpls_bind mpls_bind_wrapper #define mpls_listen mpls_listen_wrapper #define mpls_connect mpls_connect_wrapper +#define mpls_connect2 mpls_connect2_wrapper #define mpls_disconnect mpls_disconnect_wrapper #define mpls_shutdown mpls_shutdown_wrapper #define mpls_abort mpls_abort_wrapper @@ -338,6 +355,7 @@ PR_WRAP_USRREQS(mpls) #define mpls_recvoob mpls_recvoob_wrapper #define mpls_send mpls_send_wrapper #define mpls_sendoob mpls_sendoob_wrapper +#define mpls_purgeif mpls_purgeif_wrapper #define mpls_usrreq mpls_usrreq_wrapper static const struct pr_usrreqs mpls_usrreqs = { @@ -347,6 +365,7 @@ static const struct pr_usrreqs mpls_usrreqs = { .pr_bind = mpls_bind, .pr_listen = mpls_listen, .pr_connect = mpls_connect, + .pr_connect2 = mpls_connect2, .pr_disconnect = mpls_disconnect, .pr_shutdown = mpls_shutdown, .pr_abort = mpls_abort, @@ -358,6 +377,7 @@ static const struct pr_usrreqs mpls_usrreqs = { .pr_recvoob = mpls_recvoob, .pr_send = mpls_send, .pr_sendoob = mpls_sendoob, + .pr_purgeif = mpls_purgeif, .pr_generic = mpls_usrreq, }; diff --git a/sys/netnatm/natm.c b/sys/netnatm/natm.c index bc66ce6938f1..99445e7f62d8 100644 --- a/sys/netnatm/natm.c +++ b/sys/netnatm/natm.c @@ -1,4 +1,4 @@ -/* $NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: natm.c,v 1.45 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 1996 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.45 2014/08/09 05:33:01 rtr Exp $"); #include #include @@ -189,6 +189,14 @@ natm_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +natm_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + static int natm_disconnect(struct socket *so) { @@ -409,9 +417,16 @@ natm_send(struct socket *so, struct mbuf *m, struct mbuf *nam, static int natm_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) { - KASSERT(solocked(so)); + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} - return EOPNOTSUPP; +static int +natm_purgeif(struct socket *so, struct ifnet *ifp) +{ + + return EOPNOTSUPP; } /* @@ -436,6 +451,7 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -447,18 +463,12 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - s = SPLSOFTNET(); - - npcb = (struct natmpcb *) so->so_pcb; - - if (npcb == NULL) { - error = EINVAL; - goto done; - } + if (so->so_pcb == NULL) + return EINVAL; switch (req) { - case PRU_CONNECT2: /* connect two sockets */ case PRU_FASTTIMO: /* 200ms timeout */ case PRU_SLOWTIMO: /* 500ms timeout */ case PRU_PROTORCV: /* receive from below */ @@ -473,8 +483,7 @@ natm_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, } done: - splx(s); - return(error); + return error; } /* @@ -562,6 +571,7 @@ PR_WRAP_USRREQS(natm) #define natm_bind natm_bind_wrapper #define natm_listen natm_listen_wrapper #define natm_connect natm_connect_wrapper +#define natm_connect2 natm_connect2_wrapper #define natm_disconnect natm_disconnect_wrapper #define natm_shutdown natm_shutdown_wrapper #define natm_abort natm_abort_wrapper @@ -573,6 +583,7 @@ PR_WRAP_USRREQS(natm) #define natm_recvoob natm_recvoob_wrapper #define natm_send natm_send_wrapper #define natm_sendoob natm_sendoob_wrapper +#define natm_purgeif natm_purgeif_wrapper #define natm_usrreq natm_usrreq_wrapper const struct pr_usrreqs natm_usrreqs = { @@ -582,6 +593,7 @@ const struct pr_usrreqs natm_usrreqs = { .pr_bind = natm_bind, .pr_listen = natm_listen, .pr_connect = natm_connect, + .pr_connect2 = natm_connect2, .pr_disconnect = natm_disconnect, .pr_shutdown = natm_shutdown, .pr_abort = natm_abort, @@ -593,5 +605,6 @@ const struct pr_usrreqs natm_usrreqs = { .pr_recvoob = natm_recvoob, .pr_send = natm_send, .pr_sendoob = natm_sendoob, + .pr_purgeif = natm_purgeif, .pr_generic = natm_usrreq, }; diff --git a/sys/rump/net/lib/libsockin/sockin.c b/sys/rump/net/lib/libsockin/sockin.c index 390e93660480..01261a69510d 100644 --- a/sys/rump/net/lib/libsockin/sockin.c +++ b/sys/rump/net/lib/libsockin/sockin.c @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: sockin.c,v 1.58 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.58 2014/08/09 05:33:01 rtr Exp $"); #include #include @@ -69,6 +69,7 @@ static void sockin_init(void); static int sockin_attach(struct socket *, int); static void sockin_detach(struct socket *); static int sockin_accept(struct socket *, struct mbuf *); +static int sockin_connect2(struct socket *, struct socket *); static int sockin_bind(struct socket *, struct mbuf *, struct lwp *); static int sockin_listen(struct socket *, struct lwp *); static int sockin_connect(struct socket *, struct mbuf *, struct lwp *); @@ -84,6 +85,7 @@ static int sockin_recvoob(struct socket *, struct mbuf *, int); static int sockin_send(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static int sockin_sendoob(struct socket *, struct mbuf *, struct mbuf *); +static int sockin_purgeif(struct socket *, struct ifnet *); static int sockin_usrreq(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); static int sockin_ctloutput(int op, struct socket *, struct sockopt *); @@ -95,6 +97,7 @@ static const struct pr_usrreqs sockin_usrreqs = { .pr_bind = sockin_bind, .pr_listen = sockin_listen, .pr_connect = sockin_connect, + .pr_connect2 = sockin_connect2, .pr_disconnect = sockin_disconnect, .pr_shutdown = sockin_shutdown, .pr_abort = sockin_abort, @@ -106,6 +109,7 @@ static const struct pr_usrreqs sockin_usrreqs = { .pr_recvoob = sockin_recvoob, .pr_send = sockin_send, .pr_sendoob = sockin_sendoob, + .pr_purgeif = sockin_purgeif, .pr_generic = sockin_usrreq, }; @@ -524,6 +528,14 @@ sockin_connect(struct socket *so, struct mbuf *nam, struct lwp *l) return error; } +static int +sockin_connect2(struct socket *so, struct socket *so2) +{ + KASSERT(solocked(so)); + + panic("sockin_connect2: IMPLEMENT ME, connect2 not supported"); +} + static int sockin_disconnect(struct socket *so) { @@ -677,16 +689,22 @@ sockin_sendoob(struct socket *so, struct mbuf *m, struct mbuf *control) panic("sockin_sendoob: IMPLEMENT ME, sendoob not supported"); } +static int +sockin_purgeif(struct socket *so, struct ifnet *ifp) +{ + + panic("sockin_purgeif: IMPLEMENT ME, purgeif not supported"); +} + static int sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, struct mbuf *control, struct lwp *l) { - int error = 0; - KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_BIND); KASSERT(req != PRU_LISTEN); KASSERT(req != PRU_CONNECT); + KASSERT(req != PRU_CONNECT2); KASSERT(req != PRU_DISCONNECT); KASSERT(req != PRU_SHUTDOWN); KASSERT(req != PRU_ABORT); @@ -698,13 +716,11 @@ sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam, KASSERT(req != PRU_RCVOOB); KASSERT(req != PRU_SEND); KASSERT(req != PRU_SENDOOB); + KASSERT(req != PRU_PURGEIF); - switch (req) { - default: - panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req); - } + panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req); - return error; + return 0; } static int diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h index 39df46f10eb2..548292aef93e 100644 --- a/sys/sys/protosw.h +++ b/sys/sys/protosw.h @@ -1,4 +1,4 @@ -/* $NetBSD: protosw.h,v 1.59 2014/08/08 03:05:45 rtr Exp $ */ +/* $NetBSD: protosw.h,v 1.60 2014/08/09 05:33:01 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -117,7 +117,7 @@ struct protosw { #define PR_ABRTACPTDIS 0x80 /* abort on accept(2) to disconnected socket */ #define PR_PURGEIF 0x100 /* might store struct ifnet pointer; - PRU_PURGEIF must be called on ifnet + pr_purgeif() must be called on ifnet deletion */ /* @@ -239,9 +239,10 @@ struct pr_usrreqs { int (*pr_attach)(struct socket *, int); void (*pr_detach)(struct socket *); int (*pr_accept)(struct socket *, struct mbuf *); + int (*pr_connect)(struct socket *, struct mbuf *, struct lwp *); + int (*pr_connect2)(struct socket *, struct socket *); int (*pr_bind)(struct socket *, struct mbuf *, struct lwp *); int (*pr_listen)(struct socket *, struct lwp *); - int (*pr_connect)(struct socket *, struct mbuf *, struct lwp *); int (*pr_disconnect)(struct socket *); int (*pr_shutdown)(struct socket *); int (*pr_abort)(struct socket *); @@ -254,6 +255,7 @@ struct pr_usrreqs { int (*pr_send)(struct socket *, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); int (*pr_sendoob)(struct socket *, struct mbuf *, struct mbuf *); + int (*pr_purgeif)(struct socket *, struct ifnet *); int (*pr_generic)(struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *, struct lwp *); }; @@ -335,6 +337,16 @@ name##_connect_wrapper(struct socket *a, \ return rv; \ } \ static int \ +name##_connect2_wrapper(struct socket *a, \ + struct socket *b) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_connect2(a, b); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_listen_wrapper(struct socket *a, struct lwp *b) \ { \ int rv; \ @@ -448,6 +460,16 @@ name##_sendoob_wrapper(struct socket *a, \ return rv; \ } \ static int \ +name##_purgeif_wrapper(struct socket *a, \ + struct ifnet *b) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_purgeif(a, b); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_usrreq_wrapper(struct socket *a, int b, \ struct mbuf *c, struct mbuf *d, struct mbuf *e, \ struct lwp *f) \ diff --git a/sys/sys/un.h b/sys/sys/un.h index 3f152c0e091e..da114d62e1de 100644 --- a/sys/sys/un.h +++ b/sys/sys/un.h @@ -1,4 +1,4 @@ -/* $NetBSD: un.h,v 1.54 2014/08/05 14:02:42 rtr Exp $ */ +/* $NetBSD: un.h,v 1.55 2014/08/09 05:33:01 rtr Exp $ */ /* * Copyright (c) 1982, 1986, 1993 @@ -85,7 +85,7 @@ kmutex_t *uipc_streamlock(void); kmutex_t *uipc_rawlock(void); int unp_connect(struct socket *, struct mbuf *, struct lwp *); -int unp_connect2(struct socket *, struct socket *, int); +int unp_connect2(struct socket *, struct socket *); void unp_dispose(struct mbuf *); int unp_externalize(struct mbuf *, struct lwp *, int);