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) \
{ \