Module Name: src Committed By: rtr Date: Wed Jul 9 14:41:43 UTC 2014
Modified Files: src/sys/kern: uipc_socket.c uipc_usrreq.c src/sys/net: if_mpls.c raw_usrreq.c rtsock.c src/sys/netatalk: ddp_usrreq.c src/sys/netbt: hci_socket.c l2cap_socket.c rfcomm_socket.c sco_socket.c src/sys/netinet: raw_ip.c tcp_usrreq.c udp_usrreq.c src/sys/netinet6: raw_ip6.c udp6_usrreq.c src/sys/netipsec: keysock.c src/sys/netmpls: mpls_proto.c src/sys/netnatm: natm.c src/sys/rump/net/lib/libsockin: sockin.c src/sys/sys: protosw.h Log Message: * split PRU_ACCEPT function out of pr_generic() usrreq switches and put into a separate function xxx_accept(struct socket *, struct mbuf *) note: future cleanup will take place to remove struct mbuf parameter type and replace it with a more appropriate type. patch reviewed by rmind To generate a diff of this commit: cvs rdiff -u -r1.224 -r1.225 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.158 -r1.159 src/sys/kern/uipc_usrreq.c cvs rdiff -u -r1.14 -r1.15 src/sys/net/if_mpls.c cvs rdiff -u -r1.42 -r1.43 src/sys/net/raw_usrreq.c cvs rdiff -u -r1.154 -r1.155 src/sys/net/rtsock.c cvs rdiff -u -r1.52 -r1.53 src/sys/netatalk/ddp_usrreq.c cvs rdiff -u -r1.31 -r1.32 src/sys/netbt/hci_socket.c cvs rdiff -u -r1.22 -r1.23 src/sys/netbt/l2cap_socket.c cvs rdiff -u -r1.23 -r1.24 src/sys/netbt/rfcomm_socket.c cvs rdiff -u -r1.24 -r1.25 src/sys/netbt/sco_socket.c cvs rdiff -u -r1.132 -r1.133 src/sys/netinet/raw_ip.c cvs rdiff -u -r1.185 -r1.186 src/sys/netinet/tcp_usrreq.c cvs rdiff -u -r1.207 -r1.208 src/sys/netinet/udp_usrreq.c cvs rdiff -u -r1.126 -r1.127 src/sys/netinet6/raw_ip6.c cvs rdiff -u -r1.106 -r1.107 src/sys/netinet6/udp6_usrreq.c cvs rdiff -u -r1.34 -r1.35 src/sys/netipsec/keysock.c cvs rdiff -u -r1.14 -r1.15 src/sys/netmpls/mpls_proto.c cvs rdiff -u -r1.36 -r1.37 src/sys/netnatm/natm.c cvs rdiff -u -r1.47 -r1.48 src/sys/rump/net/lib/libsockin/sockin.c cvs rdiff -u -r1.51 -r1.52 src/sys/sys/protosw.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.224 src/sys/kern/uipc_socket.c:1.225 --- src/sys/kern/uipc_socket.c:1.224 Mon May 19 02:51:24 2014 +++ src/sys/kern/uipc_socket.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.224 2014/05/19 02:51:24 rmind Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.225 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.224 2014/05/19 02:51:24 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.225 2014/07/09 14:41:42 rtr Exp $"); #include "opt_compat_netbsd.h" #include "opt_sock_counters.h" @@ -802,8 +802,7 @@ soaccept(struct socket *so, struct mbuf so->so_state &= ~SS_NOFDREF; if ((so->so_state & SS_ISDISCONNECTED) == 0 || (so->so_proto->pr_flags & PR_ABRTACPTDIS) == 0) - error = (*so->so_proto->pr_usrreqs->pr_generic)(so, - PRU_ACCEPT, NULL, nam, NULL, NULL); + error = (*so->so_proto->pr_usrreqs->pr_accept)(so, nam); else error = ECONNABORTED; Index: src/sys/kern/uipc_usrreq.c diff -u src/sys/kern/uipc_usrreq.c:1.158 src/sys/kern/uipc_usrreq.c:1.159 --- src/sys/kern/uipc_usrreq.c:1.158 Wed Jul 9 04:54:03 2014 +++ src/sys/kern/uipc_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_usrreq.c,v 1.158 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: uipc_usrreq.c,v 1.159 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc. @@ -96,7 +96,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.158 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.159 2014/07/09 14:41:42 rtr Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -376,6 +376,7 @@ unp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -419,56 +420,6 @@ unp_usrreq(struct socket *so, int req, s unp_disconnect(unp); break; - case PRU_ACCEPT: - KASSERT(so->so_lock == uipc_lock); - /* - * Mark the initiating STREAM socket as connected *ONLY* - * after it's been accepted. This prevents a client from - * overrunning a server and receiving ECONNREFUSED. - */ - if (unp->unp_conn == NULL) { - /* - * This will use the empty socket and will not - * allocate. - */ - unp_setaddr(so, nam, true); - break; - } - so2 = unp->unp_conn->unp_socket; - if (so2->so_state & SS_ISCONNECTING) { - KASSERT(solocked2(so, so->so_head)); - KASSERT(solocked2(so2, so->so_head)); - soisconnected(so2); - } - /* - * If the connection is fully established, break the - * association with uipc_lock and give the connected - * pair a separate lock to share. - * There is a race here: sotounpcb(so2)->unp_streamlock - * is not locked, so when changing so2->so_lock - * another thread can grab it while so->so_lock is still - * pointing to the (locked) uipc_lock. - * this should be harmless, except that this makes - * solocked2() and solocked() unreliable. - * Another problem is that unp_setaddr() expects the - * the socket locked. Grabing sotounpcb(so2)->unp_streamlock - * fixes both issues. - */ - mutex_enter(sotounpcb(so2)->unp_streamlock); - unp_setpeerlocks(so2, so); - /* - * Only now return peer's address, as we may need to - * block in order to allocate memory. - * - * XXX Minor race: connection can be broken while - * lock is dropped in unp_setaddr(). We will return - * error == 0 and sun_noname as the peer address. - */ - unp_setaddr(so, nam, true); - /* so_lock now points to unp_streamlock */ - mutex_exit(so2->so_lock); - break; - case PRU_SHUTDOWN: socantsendmore(so); unp_shutdown(unp); @@ -837,6 +788,69 @@ unp_detach(struct socket *so) } static int +unp_accept(struct socket *so, struct mbuf *nam) +{ + struct unpcb *unp = sotounpcb(so); + struct socket *so2; + + KASSERT(solocked(so)); + KASSERT(nam != NULL); + + /* XXX code review required to determine if unp can ever be NULL */ + if (unp == NULL) + return EINVAL; + + KASSERT(so->so_lock == uipc_lock); + /* + * Mark the initiating STREAM socket as connected *ONLY* + * after it's been accepted. This prevents a client from + * overrunning a server and receiving ECONNREFUSED. + */ + if (unp->unp_conn == NULL) { + /* + * This will use the empty socket and will not + * allocate. + */ + unp_setaddr(so, nam, true); + return 0; + } + so2 = unp->unp_conn->unp_socket; + if (so2->so_state & SS_ISCONNECTING) { + KASSERT(solocked2(so, so->so_head)); + KASSERT(solocked2(so2, so->so_head)); + soisconnected(so2); + } + /* + * If the connection is fully established, break the + * association with uipc_lock and give the connected + * pair a separate lock to share. + * There is a race here: sotounpcb(so2)->unp_streamlock + * is not locked, so when changing so2->so_lock + * another thread can grab it while so->so_lock is still + * pointing to the (locked) uipc_lock. + * this should be harmless, except that this makes + * solocked2() and solocked() unreliable. + * Another problem is that unp_setaddr() expects the + * the socket locked. Grabing sotounpcb(so2)->unp_streamlock + * fixes both issues. + */ + mutex_enter(sotounpcb(so2)->unp_streamlock); + unp_setpeerlocks(so2, so); + /* + * Only now return peer's address, as we may need to + * block in order to allocate memory. + * + * XXX Minor race: connection can be broken while + * lock is dropped in unp_setaddr(). We will return + * error == 0 and sun_noname as the peer address. + */ + unp_setaddr(so, nam, true); + /* so_lock now points to unp_streamlock */ + mutex_exit(so2->so_lock); + return 0; +} + +static int unp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -1843,6 +1857,7 @@ unp_discard_later(file_t *fp) const struct pr_usrreqs unp_usrreqs = { .pr_attach = unp_attach, .pr_detach = unp_detach, + .pr_accept = unp_accept, .pr_ioctl = unp_ioctl, .pr_stat = unp_stat, .pr_peeraddr = unp_peeraddr, Index: src/sys/net/if_mpls.c diff -u src/sys/net/if_mpls.c:1.14 src/sys/net/if_mpls.c:1.15 --- src/sys/net/if_mpls.c:1.14 Fri Jun 6 01:02:47 2014 +++ src/sys/net/if_mpls.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mpls.c,v 1.14 2014/06/06 01:02:47 rmind Exp $ */ +/* $NetBSD: if_mpls.c,v 1.15 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.14 2014/06/06 01:02:47 rmind Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mpls.c,v 1.15 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_mpls.h" @@ -104,7 +104,7 @@ static struct mbuf *mpls_label_inet6(str static struct mbuf *mpls_prepend_shim(struct mbuf *, union mpls_shim *); extern int mpls_defttl, mpls_mapttl_inet, mpls_mapttl_inet6, mpls_icmp_respond, - mpls_forwarding, mpls_accept, mpls_mapprec_inet, mpls_mapclass_inet6, + mpls_forwarding, mpls_frame_accept, mpls_mapprec_inet, mpls_mapclass_inet6, mpls_rfc4182; /* ARGSUSED */ @@ -329,7 +329,7 @@ mpls_lse(struct mbuf *m) /* Check if we're accepting MPLS Frames */ error = EINVAL; - if (!mpls_accept) + if (!mpls_frame_accept) goto done; /* TTL decrement */ Index: src/sys/net/raw_usrreq.c diff -u src/sys/net/raw_usrreq.c:1.42 src/sys/net/raw_usrreq.c:1.43 --- src/sys/net/raw_usrreq.c:1.42 Wed Jul 9 04:54:03 2014 +++ src/sys/net/raw_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: raw_usrreq.c,v 1.43 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -36,7 +36,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.42 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.43 2014/07/09 14:41:42 rtr Exp $"); #include <sys/param.h> #include <sys/mbuf.h> @@ -162,6 +162,7 @@ raw_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); Index: src/sys/net/rtsock.c diff -u src/sys/net/rtsock.c:1.154 src/sys/net/rtsock.c:1.155 --- src/sys/net/rtsock.c:1.154 Wed Jul 9 04:54:03 2014 +++ src/sys/net/rtsock.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rtsock.c,v 1.154 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: rtsock.c,v 1.155 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.154 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.155 2014/07/09 14:41:42 rtr Exp $"); #ifdef _KERNEL_OPT #include "opt_inet.h" @@ -224,6 +224,16 @@ COMPATNAME(route_detach)(struct socket * } static int +COMPATNAME(route_accept)(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + panic("route_accept"); + /* NOT REACHED */ + return EOPNOTSUPP; +} + +static int COMPATNAME(route_ioctl)(struct socket *so, u_long cmd, void *nam, struct ifnet * ifp) { @@ -278,6 +288,7 @@ COMPATNAME(route_usrreq)(struct socket * KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -1378,6 +1389,7 @@ PR_WRAP_USRREQS(compat_50_route); static const struct pr_usrreqs route_usrreqs = { .pr_attach = COMPATNAME(route_attach_wrapper), .pr_detach = COMPATNAME(route_detach_wrapper), + .pr_accept = COMPATNAME(route_accept_wrapper), .pr_ioctl = COMPATNAME(route_ioctl_wrapper), .pr_stat = COMPATNAME(route_stat_wrapper), .pr_peeraddr = COMPATNAME(route_peeraddr_wrapper), Index: src/sys/netatalk/ddp_usrreq.c diff -u src/sys/netatalk/ddp_usrreq.c:1.52 src/sys/netatalk/ddp_usrreq.c:1.53 --- src/sys/netatalk/ddp_usrreq.c:1.52 Wed Jul 9 04:54:03 2014 +++ src/sys/netatalk/ddp_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.52 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.53 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.52 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.53 2014/07/09 14:41:42 rtr Exp $"); #include "opt_mbuftrace.h" @@ -84,6 +84,7 @@ ddp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -170,7 +171,6 @@ ddp_usrreq(struct socket *so, int req, s case PRU_LISTEN: case PRU_CONNECT2: - case PRU_ACCEPT: case PRU_SENDOOB: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -471,6 +471,14 @@ ddp_detach(struct socket *so) } static int +ddp_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int ddp_ioctl(struct socket *so, u_long cmd, void *addr, struct ifnet *ifp) { return at_control(cmd, addr, ifp); @@ -577,6 +585,7 @@ ddp_init(void) PR_WRAP_USRREQS(ddp) #define ddp_attach ddp_attach_wrapper #define ddp_detach ddp_detach_wrapper +#define ddp_accept ddp_accept_wrapper #define ddp_ioctl ddp_ioctl_wrapper #define ddp_stat ddp_stat_wrapper #define ddp_peeraddr ddp_peeraddr_wrapper @@ -586,6 +595,7 @@ PR_WRAP_USRREQS(ddp) const struct pr_usrreqs ddp_usrreqs = { .pr_attach = ddp_attach, .pr_detach = ddp_detach, + .pr_accept = ddp_accept, .pr_ioctl = ddp_ioctl, .pr_stat = ddp_stat, .pr_peeraddr = ddp_peeraddr, Index: src/sys/netbt/hci_socket.c diff -u src/sys/netbt/hci_socket.c:1.31 src/sys/netbt/hci_socket.c:1.32 --- src/sys/netbt/hci_socket.c:1.31 Wed Jul 9 04:54:03 2014 +++ src/sys/netbt/hci_socket.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: hci_socket.c,v 1.32 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.31 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.32 2014/07/09 14:41:42 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -484,6 +484,14 @@ hci_detach(struct socket *so) } static int +hci_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int hci_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { int err; @@ -560,6 +568,7 @@ hci_usrreq(struct socket *up, int req, s DPRINTFN(2, "%s\n", prurequests[req]); KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -659,7 +668,6 @@ hci_usrreq(struct socket *up, int req, s case PRU_RCVOOB: return EOPNOTSUPP; /* (no release) */ - case PRU_ACCEPT: case PRU_CONNECT2: case PRU_LISTEN: case PRU_SENDOOB: @@ -892,6 +900,7 @@ PR_WRAP_USRREQS(hci) #define hci_attach hci_attach_wrapper #define hci_detach hci_detach_wrapper +#define hci_accept hci_accept_wrapper #define hci_ioctl hci_ioctl_wrapper #define hci_stat hci_stat_wrapper #define hci_peeraddr hci_peeraddr_wrapper @@ -901,6 +910,7 @@ PR_WRAP_USRREQS(hci) const struct pr_usrreqs hci_usrreqs = { .pr_attach = hci_attach, .pr_detach = hci_detach, + .pr_accept = hci_accept, .pr_ioctl = hci_ioctl, .pr_stat = hci_stat, .pr_peeraddr = hci_peeraddr, Index: src/sys/netbt/l2cap_socket.c diff -u src/sys/netbt/l2cap_socket.c:1.22 src/sys/netbt/l2cap_socket.c:1.23 --- src/sys/netbt/l2cap_socket.c:1.22 Wed Jul 9 04:54:03 2014 +++ src/sys/netbt/l2cap_socket.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: l2cap_socket.c,v 1.23 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 2005 Iain Hibbert. @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.22 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.23 2014/07/09 14:41:42 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -117,6 +117,23 @@ l2cap_detach(struct socket *so) } static int +l2cap_accept(struct socket *so, struct mbuf *nam) +{ + struct l2cap_channel *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(nam != NULL); + + if (pcb == NULL) + return EINVAL; + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return l2cap_peeraddr_pcb(pcb, sa); +} + +static int l2cap_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EPASSTHROUGH; @@ -187,6 +204,7 @@ l2cap_usrreq(struct socket *up, int req, DPRINTFN(2, "%s\n", prurequests[req]); KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -271,12 +289,6 @@ l2cap_usrreq(struct socket *up, int req, case PRU_LISTEN: return l2cap_listen(pcb); - case PRU_ACCEPT: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return l2cap_peeraddr_pcb(pcb, sa); - case PRU_CONNECT2: case PRU_SENDOOB: case PRU_FASTTIMO: @@ -442,6 +454,7 @@ PR_WRAP_USRREQS(l2cap) #define l2cap_attach l2cap_attach_wrapper #define l2cap_detach l2cap_detach_wrapper +#define l2cap_accept l2cap_accept_wrapper #define l2cap_ioctl l2cap_ioctl_wrapper #define l2cap_stat l2cap_stat_wrapper #define l2cap_peeraddr l2cap_peeraddr_wrapper @@ -451,6 +464,7 @@ PR_WRAP_USRREQS(l2cap) const struct pr_usrreqs l2cap_usrreqs = { .pr_attach = l2cap_attach, .pr_detach = l2cap_detach, + .pr_accept = l2cap_accept, .pr_ioctl = l2cap_ioctl, .pr_stat = l2cap_stat, .pr_peeraddr = l2cap_peeraddr, Index: src/sys/netbt/rfcomm_socket.c diff -u src/sys/netbt/rfcomm_socket.c:1.23 src/sys/netbt/rfcomm_socket.c:1.24 --- src/sys/netbt/rfcomm_socket.c:1.23 Wed Jul 9 04:54:03 2014 +++ src/sys/netbt/rfcomm_socket.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: rfcomm_socket.c,v 1.24 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -32,7 +32,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.23 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.24 2014/07/09 14:41:42 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -125,6 +125,23 @@ rfcomm_detach(struct socket *so) } static int +rfcomm_accept(struct socket *so, struct mbuf *nam) +{ + struct rfcomm_dlc *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(nam != NULL); + + if (pcb == NULL) + return EINVAL; + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return rfcomm_peeraddr_pcb(pcb, sa); +} + +static int rfcomm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EPASSTHROUGH; @@ -195,6 +212,7 @@ rfcomm_usrreq(struct socket *up, int req DPRINTFN(2, "%s\n", prurequests[req]); KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -272,12 +290,6 @@ rfcomm_usrreq(struct socket *up, int req case PRU_LISTEN: return rfcomm_listen(pcb); - case PRU_ACCEPT: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return rfcomm_peeraddr_pcb(pcb, sa); - case PRU_CONNECT2: case PRU_SENDOOB: case PRU_FASTTIMO: @@ -455,6 +467,7 @@ PR_WRAP_USRREQS(rfcomm) #define rfcomm_attach rfcomm_attach_wrapper #define rfcomm_detach rfcomm_detach_wrapper +#define rfcomm_accept rfcomm_accept_wrapper #define rfcomm_ioctl rfcomm_ioctl_wrapper #define rfcomm_stat rfcomm_stat_wrapper #define rfcomm_peeraddr rfcomm_peeraddr_wrapper @@ -464,6 +477,7 @@ PR_WRAP_USRREQS(rfcomm) const struct pr_usrreqs rfcomm_usrreqs = { .pr_attach = rfcomm_attach, .pr_detach = rfcomm_detach, + .pr_accept = rfcomm_accept, .pr_ioctl = rfcomm_ioctl, .pr_stat = rfcomm_stat, .pr_peeraddr = rfcomm_peeraddr, Index: src/sys/netbt/sco_socket.c diff -u src/sys/netbt/sco_socket.c:1.24 src/sys/netbt/sco_socket.c:1.25 --- src/sys/netbt/sco_socket.c:1.24 Wed Jul 9 04:54:03 2014 +++ src/sys/netbt/sco_socket.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $ */ +/* $NetBSD: sco_socket.c,v 1.25 2014/07/09 14:41:42 rtr Exp $ */ /*- * Copyright (c) 2006 Itronix Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.24 2014/07/09 04:54:03 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.25 2014/07/09 14:41:42 rtr Exp $"); /* load symbolic names */ #ifdef BLUETOOTH_DEBUG @@ -108,6 +108,23 @@ sco_detach(struct socket *so) } static int +sco_accept(struct socket *so, struct mbuf *nam) +{ + struct sco_pcb *pcb = so->so_pcb; + struct sockaddr_bt *sa; + + KASSERT(solocked(so)); + KASSERT(nam != NULL); + + if (pcb == NULL) + return EINVAL; + + sa = mtod(nam, struct sockaddr_bt *); + nam->m_len = sizeof(struct sockaddr_bt); + return sco_peeraddr_pcb(pcb, sa); +} + +static int sco_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -174,6 +191,7 @@ sco_usrreq(struct socket *up, int req, s DPRINTFN(2, "%s\n", prurequests[req]); KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -259,12 +277,6 @@ sco_usrreq(struct socket *up, int req, s case PRU_LISTEN: return sco_listen(pcb); - case PRU_ACCEPT: - KASSERT(nam != NULL); - sa = mtod(nam, struct sockaddr_bt *); - nam->m_len = sizeof(struct sockaddr_bt); - return sco_peeraddr_pcb(pcb, sa); - case PRU_CONNECT2: case PRU_SENDOOB: case PRU_FASTTIMO: @@ -409,6 +421,7 @@ PR_WRAP_USRREQS(sco) #define sco_attach sco_attach_wrapper #define sco_detach sco_detach_wrapper +#define sco_accept sco_accept_wrapper #define sco_ioctl sco_ioctl_wrapper #define sco_stat sco_stat_wrapper #define sco_peeraddr sco_peeraddr_wrapper @@ -418,6 +431,7 @@ PR_WRAP_USRREQS(sco) const struct pr_usrreqs sco_usrreqs = { .pr_attach = sco_attach, .pr_detach = sco_detach, + .pr_accept = sco_accept, .pr_ioctl = sco_ioctl, .pr_stat = sco_stat, .pr_peeraddr = sco_peeraddr, Index: src/sys/netinet/raw_ip.c diff -u src/sys/netinet/raw_ip.c:1.132 src/sys/netinet/raw_ip.c:1.133 --- src/sys/netinet/raw_ip.c:1.132 Wed Jul 9 04:54:04 2014 +++ src/sys/netinet/raw_ip.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip.c,v 1.132 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: raw_ip.c,v 1.133 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -65,7 +65,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.132 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.133 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -567,6 +567,16 @@ rip_detach(struct socket *so) } static int +rip_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + panic("rip_accept"); + /* NOT REACHED */ + return EOPNOTSUPP; +} + +static int rip_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return in_control(so, cmd, nam, ifp); @@ -612,6 +622,7 @@ rip_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -730,6 +741,7 @@ rip_usrreq(struct socket *so, int req, s PR_WRAP_USRREQS(rip) #define rip_attach rip_attach_wrapper #define rip_detach rip_detach_wrapper +#define rip_accept rip_accept_wrapper #define rip_ioctl rip_ioctl_wrapper #define rip_stat rip_stat_wrapper #define rip_peeraddr rip_peeraddr_wrapper @@ -739,6 +751,7 @@ PR_WRAP_USRREQS(rip) const struct pr_usrreqs rip_usrreqs = { .pr_attach = rip_attach, .pr_detach = rip_detach, + .pr_accept = rip_accept, .pr_ioctl = rip_ioctl, .pr_stat = rip_stat, .pr_peeraddr = rip_peeraddr, Index: src/sys/netinet/tcp_usrreq.c diff -u src/sys/netinet/tcp_usrreq.c:1.185 src/sys/netinet/tcp_usrreq.c:1.186 --- src/sys/netinet/tcp_usrreq.c:1.185 Wed Jul 9 04:54:04 2014 +++ src/sys/netinet/tcp_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: tcp_usrreq.c,v 1.185 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: tcp_usrreq.c,v 1.186 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -99,7 +99,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.185 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.186 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -198,6 +198,7 @@ tcp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -425,22 +426,6 @@ tcp_usrreq(struct socket *so, int req, s break; /* - * Accept a connection. Essentially all the work is - * done at higher levels; just return the address - * of the peer, storing through addr. - */ - case PRU_ACCEPT: -#ifdef INET - if (inp) - in_setpeeraddr(inp, nam); -#endif -#ifdef INET6 - if (in6p) - in6_setpeeraddr(in6p, nam); -#endif - break; - - /* * Mark the connection as being incapable of further output. */ case PRU_SHUTDOWN: @@ -924,6 +909,80 @@ tcp_detach(struct socket *so) } static int +tcp_accept(struct socket *so, struct mbuf *nam) +{ + struct inpcb *inp = NULL; +#ifdef INET6 + struct in6pcb *in6p = NULL; +#endif + struct tcpcb *tp = NULL; + int ostate = 0; + + KASSERT(solocked(so)); + + switch (so->so_proto->pr_domain->dom_family) { +#ifdef INET + case PF_INET: + inp = sotoinpcb(so); + break; +#endif +#ifdef INET6 + case PF_INET6: + in6p = sotoin6pcb(so); + break; +#endif + default: + return EAFNOSUPPORT; + } + + /* + * When a TCP is attached to a socket, then there will be + * a (struct inpcb) pointed at by the socket, and this + * structure will point at a subsidary (struct tcpcb). + */ + if (inp == NULL +#ifdef INET6 + && in6p == NULL +#endif + ) + { + return EINVAL; + } +#ifdef INET + if (inp) { + tp = intotcpcb(inp); + /* WHAT IF TP IS 0? */ + ostate = tcp_debug_capture(tp, PRU_ACCEPT); + } +#endif +#ifdef INET6 + if (in6p) { + tp = in6totcpcb(in6p); + /* WHAT IF TP IS 0? */ + ostate = tcp_debug_capture(tp, PRU_ACCEPT); + } +#endif + + /* + * Accept a connection. Essentially all the work is + * done at higher levels; just return the address + * of the peer, storing through addr. + */ +#ifdef INET + if (inp) + in_setpeeraddr(inp, nam); +#endif +#ifdef INET6 + if (in6p) + in6_setpeeraddr(in6p, nam); +#endif + + tcp_debug_trace(so, tp, ostate, PRU_ACCEPT); + + return 0; +} + +static int tcp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { switch (so->so_proto->pr_domain->dom_family) { @@ -2289,6 +2348,7 @@ tcp_usrreq_init(void) PR_WRAP_USRREQS(tcp) #define tcp_attach tcp_attach_wrapper #define tcp_detach tcp_detach_wrapper +#define tcp_accept tcp_accept_wrapper #define tcp_ioctl tcp_ioctl_wrapper #define tcp_stat tcp_stat_wrapper #define tcp_peeraddr tcp_peeraddr_wrapper @@ -2298,6 +2358,7 @@ PR_WRAP_USRREQS(tcp) const struct pr_usrreqs tcp_usrreqs = { .pr_attach = tcp_attach, .pr_detach = tcp_detach, + .pr_accept = tcp_accept, .pr_ioctl = tcp_ioctl, .pr_stat = tcp_stat, .pr_peeraddr = tcp_peeraddr, Index: src/sys/netinet/udp_usrreq.c diff -u src/sys/netinet/udp_usrreq.c:1.207 src/sys/netinet/udp_usrreq.c:1.208 --- src/sys/netinet/udp_usrreq.c:1.207 Wed Jul 9 04:54:04 2014 +++ src/sys/netinet/udp_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: udp_usrreq.c,v 1.207 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: udp_usrreq.c,v 1.208 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -66,7 +66,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.207 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.208 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_compat_netbsd.h" @@ -895,6 +895,16 @@ udp_detach(struct socket *so) } static int +udp_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + panic("udp_accept"); + /* NOT REACHED */ + return EOPNOTSUPP; +} + +static int udp_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return in_control(so, cmd, nam, ifp); @@ -940,6 +950,7 @@ udp_usrreq(struct socket *so, int req, s KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -1282,6 +1293,7 @@ udp4_espinudp(struct mbuf **mp, int off, PR_WRAP_USRREQS(udp) #define udp_attach udp_attach_wrapper #define udp_detach udp_detach_wrapper +#define udp_accept udp_accept_wrapper #define udp_ioctl udp_ioctl_wrapper #define udp_stat udp_stat_wrapper #define udp_peeraddr udp_peeraddr_wrapper @@ -1291,6 +1303,7 @@ PR_WRAP_USRREQS(udp) const struct pr_usrreqs udp_usrreqs = { .pr_attach = udp_attach, .pr_detach = udp_detach, + .pr_accept = udp_accept, .pr_ioctl = udp_ioctl, .pr_stat = udp_stat, .pr_peeraddr = udp_peeraddr, Index: src/sys/netinet6/raw_ip6.c diff -u src/sys/netinet6/raw_ip6.c:1.126 src/sys/netinet6/raw_ip6.c:1.127 --- src/sys/netinet6/raw_ip6.c:1.126 Wed Jul 9 04:54:04 2014 +++ src/sys/netinet6/raw_ip6.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: raw_ip6.c,v 1.126 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: raw_ip6.c,v 1.127 2014/07/09 14:41:42 rtr Exp $ */ /* $KAME: raw_ip6.c,v 1.82 2001/07/23 18:57:56 jinmei Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.126 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.127 2014/07/09 14:41:42 rtr Exp $"); #include "opt_ipsec.h" @@ -645,6 +645,14 @@ rip6_detach(struct socket *so) } static int +rip6_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int rip6_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return in6_control(so, cmd, nam, ifp); @@ -688,6 +696,7 @@ rip6_usrreq(struct socket *so, int req, struct in6pcb *in6p = sotoin6pcb(so); int error = 0; + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -866,7 +875,6 @@ rip6_usrreq(struct socket *so, int req, case PRU_RCVOOB: case PRU_RCVD: case PRU_LISTEN: - case PRU_ACCEPT: case PRU_SENDOOB: error = EOPNOTSUPP; break; @@ -921,6 +929,7 @@ sysctl_net_inet6_raw6_setup(struct sysct PR_WRAP_USRREQS(rip6) #define rip6_attach rip6_attach_wrapper #define rip6_detach rip6_detach_wrapper +#define rip6_accept rip6_accept_wrapper #define rip6_ioctl rip6_ioctl_wrapper #define rip6_stat rip6_stat_wrapper #define rip6_peeraddr rip6_peeraddr_wrapper @@ -930,6 +939,7 @@ PR_WRAP_USRREQS(rip6) const struct pr_usrreqs rip6_usrreqs = { .pr_attach = rip6_attach, .pr_detach = rip6_detach, + .pr_accept = rip6_accept, .pr_ioctl = rip6_ioctl, .pr_stat = rip6_stat, .pr_peeraddr = rip6_peeraddr, Index: src/sys/netinet6/udp6_usrreq.c diff -u src/sys/netinet6/udp6_usrreq.c:1.106 src/sys/netinet6/udp6_usrreq.c:1.107 --- src/sys/netinet6/udp6_usrreq.c:1.106 Wed Jul 9 04:54:04 2014 +++ src/sys/netinet6/udp6_usrreq.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: udp6_usrreq.c,v 1.106 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: udp6_usrreq.c,v 1.107 2014/07/09 14:41:42 rtr Exp $ */ /* $KAME: udp6_usrreq.c,v 1.86 2001/05/27 17:33:00 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.106 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.107 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_inet_csum.h" @@ -678,6 +678,14 @@ udp6_detach(struct socket *so) } static int +udp6_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int udp6_ioctl(struct socket *so, u_long cmd, void *addr6, struct ifnet *ifp) { /* @@ -733,6 +741,7 @@ udp6_usrreq(struct socket *so, int req, KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -801,7 +810,6 @@ udp6_usrreq(struct socket *so, int req, case PRU_LISTEN: case PRU_CONNECT2: - case PRU_ACCEPT: case PRU_SENDOOB: case PRU_FASTTIMO: case PRU_SLOWTIMO: @@ -897,6 +905,7 @@ udp6_statinc(u_int stat) PR_WRAP_USRREQS(udp6) #define udp6_attach udp6_attach_wrapper #define udp6_detach udp6_detach_wrapper +#define udp6_accept udp6_accept_wrapper #define udp6_ioctl udp6_ioctl_wrapper #define udp6_stat udp6_stat_wrapper #define udp6_peeraddr udp6_peeraddr_wrapper @@ -906,6 +915,7 @@ PR_WRAP_USRREQS(udp6) const struct pr_usrreqs udp6_usrreqs = { .pr_attach = udp6_attach, .pr_detach = udp6_detach, + .pr_accept = udp6_accept, .pr_ioctl = udp6_ioctl, .pr_stat = udp6_stat, .pr_peeraddr = udp6_peeraddr, Index: src/sys/netipsec/keysock.c diff -u src/sys/netipsec/keysock.c:1.34 src/sys/netipsec/keysock.c:1.35 --- src/sys/netipsec/keysock.c:1.34 Wed Jul 9 04:54:04 2014 +++ src/sys/netipsec/keysock.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: keysock.c,v 1.34 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: keysock.c,v 1.35 2014/07/09 14:41:42 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 <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.34 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.35 2014/07/09 14:41:42 rtr Exp $"); #include "opt_ipsec.h" @@ -485,6 +485,16 @@ key_detach(struct socket *so) } static int +key_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + panic("key_accept"); + /* NOT REACHED */ + return EOPNOTSUPP; +} + +static int key_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -542,6 +552,7 @@ key_usrreq(struct socket *so, int req,st KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -564,6 +575,7 @@ DOMAIN_DEFINE(keydomain); PR_WRAP_USRREQS(key) #define key_attach key_attach_wrapper #define key_detach key_detach_wrapper +#define key_accept key_accept_wrapper #define key_ioctl key_ioctl_wrapper #define key_stat key_stat_wrapper #define key_peeraddr key_peeraddr_wrapper @@ -573,6 +585,7 @@ PR_WRAP_USRREQS(key) const struct pr_usrreqs key_usrreqs = { .pr_attach = key_attach, .pr_detach = key_detach, + .pr_accept = key_accept, .pr_ioctl = key_ioctl, .pr_stat = key_stat, .pr_peeraddr = key_peeraddr, Index: src/sys/netmpls/mpls_proto.c diff -u src/sys/netmpls/mpls_proto.c:1.14 src/sys/netmpls/mpls_proto.c:1.15 --- src/sys/netmpls/mpls_proto.c:1.14 Wed Jul 9 04:54:04 2014 +++ src/sys/netmpls/mpls_proto.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: mpls_proto.c,v 1.14 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: mpls_proto.c,v 1.15 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (c) 2010 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.14 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.15 2014/07/09 14:41:42 rtr Exp $"); #include "opt_inet.h" #include "opt_mbuftrace.h" @@ -61,7 +61,7 @@ int mpls_mapttl_inet = 1; int mpls_mapttl_inet6 = 1; int mpls_icmp_respond = 0; int mpls_forwarding = 0; -int mpls_accept = 0; +int mpls_frame_accept = 0; int mpls_mapprec_inet = 1; int mpls_mapclass_inet6 = 1; int mpls_rfc4182 = 1; @@ -95,6 +95,14 @@ mpls_detach(struct socket *so) } static int +mpls_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + return EOPNOTSUPP; +} + +static int mpls_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return EOPNOTSUPP; @@ -160,7 +168,7 @@ sysctl_net_mpls_setup(struct sysctllog * CTLFLAG_PERMANENT|CTLFLAG_READWRITE, CTLTYPE_INT, "accept", SYSCTL_DESCR("Accept MPLS Frames"), - NULL, 0, &mpls_accept, 0, + NULL, 0, &mpls_frame_accept, 0, CTL_NET, PF_MPLS, CTL_CREATE, CTL_EOL); sysctl_createv(clog, 0, NULL, NULL, CTLFLAG_PERMANENT|CTLFLAG_READWRITE, @@ -215,6 +223,7 @@ DOMAIN_DEFINE(mplsdomain); PR_WRAP_USRREQS(mpls) #define mpls_attach mpls_attach_wrapper #define mpls_detach mpls_detach_wrapper +#define mpls_accept mpls_accept_wrapper #define mpls_ioctl mpls_ioctl_wrapper #define mpls_stat mpls_stat_wrapper #define mpls_peeraddr mpls_peeraddr_wrapper @@ -224,6 +233,7 @@ PR_WRAP_USRREQS(mpls) static const struct pr_usrreqs mpls_usrreqs = { .pr_attach = mpls_attach, .pr_detach = mpls_detach, + .pr_accept = mpls_accept, .pr_ioctl = mpls_ioctl, .pr_stat = mpls_stat, .pr_peeraddr = mpls_peeraddr, Index: src/sys/netnatm/natm.c diff -u src/sys/netnatm/natm.c:1.36 src/sys/netnatm/natm.c:1.37 --- src/sys/netnatm/natm.c:1.36 Wed Jul 9 04:54:04 2014 +++ src/sys/netnatm/natm.c Wed Jul 9 14:41:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: natm.c,v 1.36 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: natm.c,v 1.37 2014/07/09 14:41:42 rtr Exp $ */ /* * Copyright (c) 1996 Charles D. Cranor and Washington University. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.36 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.37 2014/07/09 14:41:42 rtr Exp $"); #include <sys/param.h> #include <sys/kmem.h> @@ -98,6 +98,14 @@ natm_detach(struct socket *so) } static int +natm_accept(struct socket *so, struct mbuf *nam) +{ + KASSERt(solocked(so)); + + return EOPNOTSUPP; +} + +static int natm_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { int error = 0, s; @@ -191,6 +199,7 @@ natm_usrreq(struct socket *so, int req, KASSERT(req != PRU_ATTACH); KASSERT(req != PRU_DETACH); + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); @@ -333,7 +342,6 @@ natm_usrreq(struct socket *so, int req, case PRU_BIND: /* bind socket to address */ case PRU_LISTEN: /* listen for connection */ - case PRU_ACCEPT: /* accept connection from peer */ case PRU_CONNECT2: /* connect two sockets */ case PRU_ABORT: /* abort (fast DISCONNECT, DETATCH) */ /* (only happens if LISTEN socket) */ @@ -439,6 +447,7 @@ m->m_pkthdr.rcvif = NULL; /* null it out PR_WRAP_USRREQS(natm) #define natm_attach natm_attach_wrapper #define natm_detach natm_detach_wrapper +#define natm_accept natm_accept_wrapper #define natm_ioctl natm_ioctl_wrapper #define natm_stat natm_stat_wrapper #define natm_peeraddr natm_peeraddr_wrapper @@ -448,6 +457,7 @@ PR_WRAP_USRREQS(natm) const struct pr_usrreqs natm_usrreqs = { .pr_attach = natm_attach, .pr_detach = natm_detach, + .pr_accept = natm_accept, .pr_ioctl = natm_ioctl, .pr_stat = natm_stat, .pr_peeraddr = natm_peeraddr, Index: src/sys/rump/net/lib/libsockin/sockin.c diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.47 src/sys/rump/net/lib/libsockin/sockin.c:1.48 --- src/sys/rump/net/lib/libsockin/sockin.c:1.47 Wed Jul 9 04:54:04 2014 +++ src/sys/rump/net/lib/libsockin/sockin.c Wed Jul 9 14:41:43 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: sockin.c,v 1.47 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: sockin.c,v 1.48 2014/07/09 14:41:43 rtr Exp $ */ /* * Copyright (c) 2008, 2009 Antti Kantee. All Rights Reserved. @@ -26,7 +26,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.47 2014/07/09 04:54:04 rtr Exp $"); +__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.48 2014/07/09 14:41:43 rtr Exp $"); #include <sys/param.h> #include <sys/condvar.h> @@ -68,6 +68,7 @@ static int sockin_do_init(void); 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_ioctl(struct socket *, u_long, void *, struct ifnet *); static int sockin_stat(struct socket *, struct stat *); static int sockin_peeraddr(struct socket *, struct mbuf *); @@ -79,6 +80,7 @@ static int sockin_ctloutput(int op, stru static const struct pr_usrreqs sockin_usrreqs = { .pr_attach = sockin_attach, .pr_detach = sockin_detach, + .pr_accept = sockin_accept, .pr_ioctl = sockin_ioctl, .pr_stat = sockin_stat, .pr_peeraddr = sockin_peeraddr, @@ -458,6 +460,15 @@ sockin_detach(struct socket *so) } static int +sockin_accept(struct socket *so, struct mbuf *nam) +{ + KASSERT(solocked(so)); + + /* we do all the work in the worker thread */ + return 0; +} + +static int sockin_ioctl(struct socket *so, u_long cmd, void *nam, struct ifnet *ifp) { return ENOTTY; @@ -507,16 +518,13 @@ sockin_usrreq(struct socket *so, int req { int error = 0; + KASSERT(req != PRU_ACCEPT); KASSERT(req != PRU_CONTROL); KASSERT(req != PRU_SENSE); KASSERT(req != PRU_PEERADDR); KASSERT(req != PRU_SOCKADDR); switch (req) { - case PRU_ACCEPT: - /* we do all the work in the worker thread */ - break; - case PRU_BIND: error = rumpcomp_sockin_bind(SO2S(so), mtod(nam, const struct sockaddr *), Index: src/sys/sys/protosw.h diff -u src/sys/sys/protosw.h:1.51 src/sys/sys/protosw.h:1.52 --- src/sys/sys/protosw.h:1.51 Wed Jul 9 04:54:04 2014 +++ src/sys/sys/protosw.h Wed Jul 9 14:41:43 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: protosw.h,v 1.51 2014/07/09 04:54:04 rtr Exp $ */ +/* $NetBSD: protosw.h,v 1.52 2014/07/09 14:41:43 rtr Exp $ */ /*- * Copyright (c) 1982, 1986, 1993 @@ -238,6 +238,7 @@ static const char * const prcorequests[] struct pr_usrreqs { int (*pr_attach)(struct socket *, int); void (*pr_detach)(struct socket *); + int (*pr_accept)(struct socket *, struct mbuf *); int (*pr_ioctl)(struct socket *, u_long, void *, struct ifnet *); int (*pr_stat)(struct socket *, struct stat *); int (*pr_peeraddr)(struct socket *, struct mbuf *); @@ -294,6 +295,15 @@ name##_detach_wrapper(struct socket *a) KERNEL_UNLOCK_ONE(NULL); \ } \ static int \ +name##_accept_wrapper(struct socket *a, struct mbuf *b) \ +{ \ + int rv; \ + KERNEL_LOCK(1, NULL); \ + rv = name##_accept(a, b); \ + KERNEL_UNLOCK_ONE(NULL); \ + return rv; \ +} \ +static int \ name##_ioctl_wrapper(struct socket *a, u_long b, \ void *c, struct ifnet *d) \ { \