Module Name:    src
Committed By:   rtr
Date:           Fri Aug  8 03:05:45 UTC 2014

Modified Files:
        src/sys/dev: kttcp.c
        src/sys/kern: uipc_socket.c uipc_usrreq.c
        src/sys/net: if_gre.c link_proto.c raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci_socket.c l2cap_socket.c rfcomm.h rfcomm_socket.c
            rfcomm_upper.c sco_socket.c
        src/sys/netinet: raw_ip.c tcp_input.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_RCVD function out of pr_generic() usrreq switches and put into
separate functions

  - always KASSERT(solocked(so)) even if not implemented

  - replace calls to pr_generic() with req = PRU_RCVD with calls to
    pr_rcvd()


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.37 src/sys/dev/kttcp.c
cvs rdiff -u -r1.232 -r1.233 src/sys/kern/uipc_socket.c
cvs rdiff -u -r1.167 -r1.168 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.158 -r1.159 src/sys/net/if_gre.c
cvs rdiff -u -r1.22 -r1.23 src/sys/net/link_proto.c
cvs rdiff -u -r1.50 -r1.51 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.161 -r1.162 src/sys/net/rtsock.c
cvs rdiff -u -r1.61 -r1.62 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.38 -r1.39 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.29 -r1.30 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/rfcomm.h
cvs rdiff -u -r1.31 -r1.32 src/sys/netbt/rfcomm_socket.c \
    src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.20 -r1.21 src/sys/netbt/rfcomm_upper.c
cvs rdiff -u -r1.143 -r1.144 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.333 -r1.334 src/sys/netinet/tcp_input.c
cvs rdiff -u -r1.198 -r1.199 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.215 -r1.216 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.134 -r1.135 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.113 -r1.114 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.41 -r1.42 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.22 -r1.23 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.43 -r1.44 src/sys/netnatm/natm.c
cvs rdiff -u -r1.56 -r1.57 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.58 -r1.59 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/dev/kttcp.c
diff -u src/sys/dev/kttcp.c:1.36 src/sys/dev/kttcp.c:1.37
--- src/sys/dev/kttcp.c:1.36	Tue Aug  5 07:55:31 2014
+++ src/sys/dev/kttcp.c	Fri Aug  8 03:05:44 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: kttcp.c,v 1.36 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: kttcp.c,v 1.37 2014/08/08 03:05:44 rtr Exp $	*/
 
 /*
  * Copyright (c) 2002 Wasabi Systems, Inc.
@@ -42,7 +42,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.36 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kttcp.c,v 1.37 2014/08/08 03:05:44 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/types.h>
@@ -635,8 +635,7 @@ kttcp_soreceive(struct socket *so, unsig
 			 * get it filled again.
 			 */
 			if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb) {
-				(*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL,
-				    (struct mbuf *)(long)flags, NULL, NULL);
+				(*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
 			}
 			SBLASTRECORDCHK(&so->so_rcv,
 			    "kttcp_soreceive sbwait 2");
@@ -675,8 +674,7 @@ kttcp_soreceive(struct socket *so, unsig
 		SBLASTRECORDCHK(&so->so_rcv, "kttcp_soreceive 4");
 		SBLASTMBUFCHK(&so->so_rcv, "kttcp_soreceive 4");
 		if (pr->pr_flags & PR_WANTRCVD && so->so_pcb) {
-			(*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL,
-			    (struct mbuf *)(long)flags, NULL, NULL);
+			(*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
 		}
 	}
 	if (orig_resid == resid && orig_resid &&

Index: src/sys/kern/uipc_socket.c
diff -u src/sys/kern/uipc_socket.c:1.232 src/sys/kern/uipc_socket.c:1.233
--- src/sys/kern/uipc_socket.c:1.232	Tue Aug  5 07:55:31 2014
+++ src/sys/kern/uipc_socket.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket.c,v 1.232 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 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.232 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.233 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_compat_netbsd.h"
 #include "opt_sock_counters.h"
@@ -1532,8 +1532,7 @@ soreceive(struct socket *so, struct mbuf
 			 * get it filled again.
 			 */
 			if ((pr->pr_flags & PR_WANTRCVD) && so->so_pcb)
-				(*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD,
-				    NULL, (struct mbuf *)(long)flags, NULL, l);
+				(*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
 			SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2");
 			SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2");
 			if (wakeup_state & SS_RESTARTSYS)
@@ -1574,8 +1573,7 @@ soreceive(struct socket *so, struct mbuf
 		SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
 		SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
 		if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
-			(*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL,
-			    (struct mbuf *)(long)flags, NULL, l);
+			(*pr->pr_usrreqs->pr_rcvd)(so, flags, l);
 	}
 	if (orig_resid == uio->uio_resid && orig_resid &&
 	    (flags & MSG_EOR) == 0 && (so->so_state & SS_CANTRCVMORE) == 0) {

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.167 src/sys/kern/uipc_usrreq.c:1.168
--- src/sys/kern/uipc_usrreq.c:1.167	Tue Aug  5 08:52:10 2014
+++ src/sys/kern/uipc_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.167 2014/08/05 08:52:10 rtr Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 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.167 2014/08/05 08:52:10 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.168 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -369,6 +369,52 @@ unp_setaddr(struct socket *so, struct mb
 }
 
 static int
+unp_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	struct unpcb *unp = sotounpcb(so);
+	struct socket *so2;
+	u_int newhiwat;
+
+	KASSERT(solocked(so));
+	KASSERT(unp != NULL);
+
+	switch (so->so_type) {
+
+	case SOCK_DGRAM:
+		panic("uipc 1");
+		/*NOTREACHED*/
+
+	case SOCK_SEQPACKET: /* FALLTHROUGH */
+	case SOCK_STREAM:
+#define	rcv (&so->so_rcv)
+#define snd (&so2->so_snd)
+		if (unp->unp_conn == 0)
+			break;
+		so2 = unp->unp_conn->unp_socket;
+		KASSERT(solocked2(so, so2));
+		/*
+		 * Adjust backpressure on sender
+		 * and wakeup any waiting to write.
+		 */
+		snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt;
+		unp->unp_mbcnt = rcv->sb_mbcnt;
+		newhiwat = snd->sb_hiwat + unp->unp_cc - rcv->sb_cc;
+		(void)chgsbsize(so2->so_uidinfo,
+		    &snd->sb_hiwat, newhiwat, RLIM_INFINITY);
+		unp->unp_cc = rcv->sb_cc;
+		sowwakeup(so2);
+#undef snd
+#undef rcv
+		break;
+
+	default:
+		panic("uipc 2");
+	}
+
+	return 0;
+}
+
+static int
 unp_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -520,8 +566,6 @@ unp_usrreq(struct socket *so, int req, s
     struct mbuf *control, struct lwp *l)
 {
 	struct unpcb *unp;
-	struct socket *so2;
-	u_int newhiwat;
 	int error = 0;
 
 	KASSERT(req != PRU_ATTACH);
@@ -537,6 +581,7 @@ unp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -555,41 +600,6 @@ unp_usrreq(struct socket *so, int req, s
 		error = unp_connect2(so, (struct socket *)nam, PRU_CONNECT2);
 		break;
 
-	case PRU_RCVD:
-		switch (so->so_type) {
-
-		case SOCK_DGRAM:
-			panic("uipc 1");
-			/*NOTREACHED*/
-
-		case SOCK_SEQPACKET: /* FALLTHROUGH */
-		case SOCK_STREAM:
-#define	rcv (&so->so_rcv)
-#define snd (&so2->so_snd)
-			if (unp->unp_conn == 0)
-				break;
-			so2 = unp->unp_conn->unp_socket;
-			KASSERT(solocked2(so, so2));
-			/*
-			 * Adjust backpressure on sender
-			 * and wakeup any waiting to write.
-			 */
-			snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt;
-			unp->unp_mbcnt = rcv->sb_mbcnt;
-			newhiwat = snd->sb_hiwat + unp->unp_cc - rcv->sb_cc;
-			(void)chgsbsize(so2->so_uidinfo,
-			    &snd->sb_hiwat, newhiwat, RLIM_INFINITY);
-			unp->unp_cc = rcv->sb_cc;
-			sowwakeup(so2);
-#undef snd
-#undef rcv
-			break;
-
-		default:
-			panic("uipc 2");
-		}
-		break;
-
 	default:
 		panic("piusrreq");
 	}
@@ -1925,6 +1935,7 @@ const struct pr_usrreqs unp_usrreqs = {
 	.pr_stat	= unp_stat,
 	.pr_peeraddr	= unp_peeraddr,
 	.pr_sockaddr	= unp_sockaddr,
+	.pr_rcvd	= unp_rcvd,
 	.pr_recvoob	= unp_recvoob,
 	.pr_send	= unp_send,
 	.pr_sendoob	= unp_sendoob,

Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.158 src/sys/net/if_gre.c:1.159
--- src/sys/net/if_gre.c:1.158	Tue Aug  5 07:55:31 2014
+++ src/sys/net/if_gre.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gre.c,v 1.158 2014/08/05 07:55:31 rtr Exp $ */
+/*	$NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $ */
 
 /*
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.158 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.159 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_atalk.h"
 #include "opt_gre.h"
@@ -724,8 +724,7 @@ gre_soreceive(struct socket *so, struct 
 	SBLASTRECORDCHK(&so->so_rcv, "soreceive 4");
 	SBLASTMBUFCHK(&so->so_rcv, "soreceive 4");
 	if (pr->pr_flags & PR_WANTRCVD && so->so_pcb)
-		(*pr->pr_usrreqs->pr_generic)(so, PRU_RCVD, NULL,
-		    (struct mbuf *)(long)flags, NULL, curlwp);
+		(*pr->pr_usrreqs->pr_rcvd)(so, flags, curlwp);
 	if (*mp0 == NULL && (flags & MSG_EOR) == 0 &&
 	    (so->so_state & SS_CANTRCVMORE) == 0) {
 		sbunlock(&so->so_rcv);

Index: src/sys/net/link_proto.c
diff -u src/sys/net/link_proto.c:1.22 src/sys/net/link_proto.c:1.23
--- src/sys/net/link_proto.c:1.22	Tue Aug  5 07:55:31 2014
+++ src/sys/net/link_proto.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: link_proto.c,v 1.22 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.22 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -61,6 +61,7 @@ static int link_ioctl(struct socket *, u
 static int link_stat(struct socket *, struct stat *);
 static int link_peeraddr(struct socket *, struct mbuf *);
 static int link_sockaddr(struct socket *, struct mbuf *);
+static int link_rcvd(struct socket *, int, struct lwp *);
 static int link_recvoob(struct socket *, struct mbuf *, int);
 static int link_send(struct socket *, struct mbuf *, struct mbuf *,
     struct mbuf *, struct lwp *);
@@ -89,6 +90,7 @@ static const struct pr_usrreqs link_usrr
 	.pr_stat	= link_stat,
 	.pr_peeraddr	= link_peeraddr,
 	.pr_sockaddr	= link_sockaddr,
+	.pr_rcvd	= link_rcvd,
 	.pr_recvoob	= link_recvoob,
 	.pr_send	= link_send,
 	.pr_sendoob	= link_sendoob,
@@ -346,6 +348,14 @@ link_sockaddr(struct socket *so, struct 
 }
 
 static int
+link_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 link_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -387,6 +397,7 @@ link_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.50 src/sys/net/raw_usrreq.c:1.51
--- src/sys/net/raw_usrreq.c:1.50	Tue Aug  5 07:55:31 2014
+++ src/sys/net/raw_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.50 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.50 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.51 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -215,6 +215,7 @@ raw_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -239,10 +240,6 @@ raw_usrreq(struct socket *so, int req, s
 		error = EOPNOTSUPP;
 		break;
 
-	case PRU_RCVD:
-		error = EOPNOTSUPP;
-		break;
-
 	default:
 		panic("raw_usrreq");
 	}

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.161 src/sys/net/rtsock.c:1.162
--- src/sys/net/rtsock.c:1.161	Tue Aug  5 07:55:31 2014
+++ src/sys/net/rtsock.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.161 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 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.161 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.162 2014/08/08 03:05:45 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -348,6 +348,14 @@ COMPATNAME(route_sockaddr)(struct socket
 }
 
 static int
+COMPATNAME(route_rcvd)(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 COMPATNAME(route_recvoob)(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -402,6 +410,7 @@ COMPATNAME(route_usrreq)(struct socket *
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -1512,6 +1521,7 @@ static const struct pr_usrreqs route_usr
 	.pr_stat	= COMPATNAME(route_stat_wrapper),
 	.pr_peeraddr	= COMPATNAME(route_peeraddr_wrapper),
 	.pr_sockaddr	= COMPATNAME(route_sockaddr_wrapper),
+	.pr_rcvd	= COMPATNAME(route_rcvd_wrapper),
 	.pr_recvoob	= COMPATNAME(route_recvoob_wrapper),
 	.pr_send	= COMPATNAME(route_send_wrapper),
 	.pr_sendoob	= COMPATNAME(route_sendoob_wrapper),

Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.61 src/sys/netatalk/ddp_usrreq.c:1.62
--- src/sys/netatalk/ddp_usrreq.c:1.61	Thu Aug  7 07:51:28 2014
+++ src/sys/netatalk/ddp_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.61 2014/08/07 07:51:28 rtr Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 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.61 2014/08/07 07:51:28 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.62 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -95,6 +95,7 @@ ddp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -124,12 +125,6 @@ ddp_usrreq(struct socket *so, int req, s
 		error = EOPNOTSUPP;
 		break;
 
-	case PRU_RCVD:
-		/*
-		 * Don't mfree. Good architecture...
-		 */
-		return (EOPNOTSUPP);
-
 	default:
 		error = EOPNOTSUPP;
 	}
@@ -528,6 +523,14 @@ ddp_sockaddr(struct socket *so, struct m
 }
 
 static int
+ddp_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 ddp_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -665,6 +668,7 @@ PR_WRAP_USRREQS(ddp)
 #define	ddp_stat	ddp_stat_wrapper
 #define	ddp_peeraddr	ddp_peeraddr_wrapper
 #define	ddp_sockaddr	ddp_sockaddr_wrapper
+#define	ddp_rcvd	ddp_rcvd_wrapper
 #define	ddp_recvoob	ddp_recvoob_wrapper
 #define	ddp_send	ddp_send_wrapper
 #define	ddp_sendoob	ddp_sendoob_wrapper
@@ -684,6 +688,7 @@ const struct pr_usrreqs ddp_usrreqs = {
 	.pr_stat	= ddp_stat,
 	.pr_peeraddr	= ddp_peeraddr,
 	.pr_sockaddr	= ddp_sockaddr,
+	.pr_rcvd	= ddp_rcvd,
 	.pr_recvoob	= ddp_recvoob,
 	.pr_send	= ddp_send,
 	.pr_sendoob	= ddp_sendoob,

Index: src/sys/netbt/hci_socket.c
diff -u src/sys/netbt/hci_socket.c:1.38 src/sys/netbt/hci_socket.c:1.39
--- src/sys/netbt/hci_socket.c:1.38	Tue Aug  5 07:55:31 2014
+++ src/sys/netbt/hci_socket.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.38 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.39 2014/08/08 03:05:45 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -647,6 +647,14 @@ hci_sockaddr(struct socket *so, struct m
 }
 
 static int
+hci_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 hci_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -735,6 +743,7 @@ hci_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -751,9 +760,6 @@ hci_usrreq(struct socket *up, int req, s
 	}
 
 	switch(req) {
-	case PRU_RCVD:
-		return EOPNOTSUPP;	/* (no release) */
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -995,6 +1001,7 @@ PR_WRAP_USRREQS(hci)
 #define	hci_stat		hci_stat_wrapper
 #define	hci_peeraddr		hci_peeraddr_wrapper
 #define	hci_sockaddr		hci_sockaddr_wrapper
+#define	hci_rcvd		hci_rcvd_wrapper
 #define	hci_recvoob		hci_recvoob_wrapper
 #define	hci_send		hci_send_wrapper
 #define	hci_sendoob		hci_sendoob_wrapper
@@ -1014,6 +1021,7 @@ const struct pr_usrreqs hci_usrreqs = {
 	.pr_stat	= hci_stat,
 	.pr_peeraddr	= hci_peeraddr,
 	.pr_sockaddr	= hci_sockaddr,
+	.pr_rcvd	= hci_rcvd,
 	.pr_recvoob	= hci_recvoob,
 	.pr_send	= hci_send,
 	.pr_sendoob	= hci_sendoob,

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.29 src/sys/netbt/l2cap_socket.c:1.30
--- src/sys/netbt/l2cap_socket.c:1.29	Tue Aug  5 07:55:31 2014
+++ src/sys/netbt/l2cap_socket.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.29 2014/08/05 07:55:31 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.30 2014/08/08 03:05:45 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -275,6 +275,14 @@ l2cap_sockaddr(struct socket *so, struct
 }
 
 static int
+l2cap_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 l2cap_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -342,9 +350,6 @@ l2cap_sendoob(struct socket *so, struct 
  * User Request.
  * up is socket
  * m is optional mbuf chain containing message
- * nam is either
- *	optional mbuf chain containing an address
- *	message flags (PRU_RCVD)
  * ctl is either
  *	optional mbuf chain containing socket options
  *	optional interface pointer PRU_PURGEIF
@@ -374,6 +379,7 @@ l2cap_usrreq(struct socket *up, int req,
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -389,9 +395,6 @@ l2cap_usrreq(struct socket *up, int req,
 	}
 
 	switch(req) {
-	case PRU_RCVD:
-		return EOPNOTSUPP;	/* (no release) */
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -567,6 +570,7 @@ PR_WRAP_USRREQS(l2cap)
 #define	l2cap_stat		l2cap_stat_wrapper
 #define	l2cap_peeraddr		l2cap_peeraddr_wrapper
 #define	l2cap_sockaddr		l2cap_sockaddr_wrapper
+#define	l2cap_rcvd		l2cap_rcvd_wrapper
 #define	l2cap_recvoob		l2cap_recvoob_wrapper
 #define	l2cap_send		l2cap_send_wrapper
 #define	l2cap_sendoob		l2cap_sendoob_wrapper
@@ -586,6 +590,7 @@ const struct pr_usrreqs l2cap_usrreqs = 
 	.pr_stat	= l2cap_stat,
 	.pr_peeraddr	= l2cap_peeraddr,
 	.pr_sockaddr	= l2cap_sockaddr,
+	.pr_rcvd	= l2cap_rcvd,
 	.pr_recvoob	= l2cap_recvoob,
 	.pr_send	= l2cap_send,
 	.pr_sendoob	= l2cap_sendoob,

Index: src/sys/netbt/rfcomm.h
diff -u src/sys/netbt/rfcomm.h:1.17 src/sys/netbt/rfcomm.h:1.18
--- src/sys/netbt/rfcomm.h:1.17	Tue Aug  5 07:55:32 2014
+++ src/sys/netbt/rfcomm.h	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm.h,v 1.17 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: rfcomm.h,v 1.18 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -55,7 +55,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: rfcomm.h,v 1.17 2014/08/05 07:55:32 rtr Exp $
+ * $Id: rfcomm.h,v 1.18 2014/08/08 03:05:45 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_btsocket_rfcomm.h,v 1.4 2005/01/11 01:39:53 emax Exp $
  */
 
@@ -416,7 +416,7 @@ int rfcomm_disconnect_pcb(struct rfcomm_
 void rfcomm_detach_pcb(struct rfcomm_dlc **);
 int rfcomm_listen_pcb(struct rfcomm_dlc *);
 int rfcomm_send_pcb(struct rfcomm_dlc *, struct mbuf *);
-int rfcomm_rcvd(struct rfcomm_dlc *, size_t);
+int rfcomm_rcvd_pcb(struct rfcomm_dlc *, size_t);
 int rfcomm_setopt(struct rfcomm_dlc *, const struct sockopt *);
 int rfcomm_getopt(struct rfcomm_dlc *, struct sockopt *);
 

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.31 src/sys/netbt/rfcomm_socket.c:1.32
--- src/sys/netbt/rfcomm_socket.c:1.31	Tue Aug  5 07:55:32 2014
+++ src/sys/netbt/rfcomm_socket.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -108,7 +108,7 @@ rfcomm_attach(struct socket *so, int pro
 	if (error)
 		return error;
 
-	error = rfcomm_rcvd(so->so_pcb, sbspace(&so->so_rcv));
+	error = rfcomm_rcvd_pcb(so->so_pcb, sbspace(&so->so_rcv));
 	if (error) {
 		rfcomm_detach_pcb((struct rfcomm_dlc **)&so->so_pcb);
 		return error;
@@ -283,6 +283,19 @@ rfcomm_sockaddr(struct socket *so, struc
 }
 
 static int
+rfcomm_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	struct rfcomm_dlc *pcb = so->so_pcb;
+
+	KASSERT(solocked(so));
+
+	if (pcb == NULL)
+		return EINVAL;
+
+	return rfcomm_rcvd_pcb(pcb, sbspace(&so->so_rcv));
+}
+
+static int
 rfcomm_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -340,9 +353,6 @@ rfcomm_sendoob(struct socket *so, struct
  * User Request.
  * up is socket
  * m is optional mbuf chain containing message
- * nam is either
- *	optional mbuf chain containing an address
- *	message flags (PRU_RCVD)
  * ctl is either
  *	optional mbuf chain containing socket options
  *	optional interface pointer PRU_PURGEIF
@@ -372,6 +382,7 @@ rfcomm_usrreq(struct socket *up, int req
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -386,9 +397,6 @@ rfcomm_usrreq(struct socket *up, int req
 	}
 
 	switch(req) {
-	case PRU_RCVD:
-		return rfcomm_rcvd(pcb, sbspace(&up->so_rcv));
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -576,6 +584,7 @@ PR_WRAP_USRREQS(rfcomm)
 #define	rfcomm_stat		rfcomm_stat_wrapper
 #define	rfcomm_peeraddr		rfcomm_peeraddr_wrapper
 #define	rfcomm_sockaddr		rfcomm_sockaddr_wrapper
+#define	rfcomm_rcvd		rfcomm_rcvd_wrapper
 #define	rfcomm_recvoob		rfcomm_recvoob_wrapper
 #define	rfcomm_send		rfcomm_send_wrapper
 #define	rfcomm_sendoob		rfcomm_sendoob_wrapper
@@ -595,6 +604,7 @@ const struct pr_usrreqs rfcomm_usrreqs =
 	.pr_stat	= rfcomm_stat,
 	.pr_peeraddr	= rfcomm_peeraddr,
 	.pr_sockaddr	= rfcomm_sockaddr,
+	.pr_rcvd	= rfcomm_rcvd,
 	.pr_recvoob	= rfcomm_recvoob,
 	.pr_send	= rfcomm_send,
 	.pr_sendoob	= rfcomm_sendoob,
Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.31 src/sys/netbt/sco_socket.c:1.32
--- src/sys/netbt/sco_socket.c:1.31	Tue Aug  5 07:55:32 2014
+++ src/sys/netbt/sco_socket.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.31 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.32 2014/08/08 03:05:45 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -266,6 +266,14 @@ sco_sockaddr(struct socket *so, struct m
 }
 
 static int
+sco_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 sco_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -359,6 +367,7 @@ sco_usrreq(struct socket *up, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -375,9 +384,6 @@ sco_usrreq(struct socket *up, int req, s
 	}
 
 	switch(req) {
-	case PRU_RCVD:
-		return EOPNOTSUPP;	/* (no release) */
-
 	case PRU_CONNECT2:
 	case PRU_FASTTIMO:
 	case PRU_SLOWTIMO:
@@ -532,6 +538,7 @@ PR_WRAP_USRREQS(sco)
 #define	sco_stat		sco_stat_wrapper
 #define	sco_peeraddr		sco_peeraddr_wrapper
 #define	sco_sockaddr		sco_sockaddr_wrapper
+#define	sco_rcvd		sco_rcvd_wrapper
 #define	sco_recvoob		sco_recvoob_wrapper
 #define	sco_send		sco_send_wrapper
 #define	sco_sendoob		sco_sendoob_wrapper
@@ -551,6 +558,7 @@ const struct pr_usrreqs sco_usrreqs = {
 	.pr_stat	= sco_stat,
 	.pr_peeraddr	= sco_peeraddr,
 	.pr_sockaddr	= sco_sockaddr,
+	.pr_rcvd	= sco_rcvd,
 	.pr_recvoob	= sco_recvoob,
 	.pr_send	= sco_send,
 	.pr_sendoob	= sco_sendoob,

Index: src/sys/netbt/rfcomm_upper.c
diff -u src/sys/netbt/rfcomm_upper.c:1.20 src/sys/netbt/rfcomm_upper.c:1.21
--- src/sys/netbt/rfcomm_upper.c:1.20	Tue Aug  5 07:55:32 2014
+++ src/sys/netbt/rfcomm_upper.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: rfcomm_upper.c,v 1.21 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.20 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_upper.c,v 1.21 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -406,7 +406,7 @@ rfcomm_send_pcb(struct rfcomm_dlc *dlc, 
 }
 
 /*
- * rfcomm_rcvd(dlc, space)
+ * rfcomm_rcvd_pcb(dlc, space)
  *
  * Indicate space now available in receive buffer
  *
@@ -415,7 +415,7 @@ rfcomm_send_pcb(struct rfcomm_dlc *dlc, 
  * buffer after that.
  */
 int
-rfcomm_rcvd(struct rfcomm_dlc *dlc, size_t space)
+rfcomm_rcvd_pcb(struct rfcomm_dlc *dlc, size_t space)
 {
 
 	KASSERT(dlc != NULL);

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.143 src/sys/netinet/raw_ip.c:1.144
--- src/sys/netinet/raw_ip.c:1.143	Tue Aug  5 07:55:32 2014
+++ src/sys/netinet/raw_ip.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.143 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 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.143 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.144 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -715,6 +715,14 @@ rip_sockaddr(struct socket *so, struct m
 }
 
 static int
+rip_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -802,6 +810,7 @@ rip_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -832,10 +841,6 @@ rip_usrreq(struct socket *so, int req, s
 		error = EOPNOTSUPP;
 		break;
 
-	case PRU_RCVD:
-		error = EOPNOTSUPP;
-		break;
-
 	default:
 		panic("rip_usrreq");
 	}
@@ -858,6 +863,7 @@ PR_WRAP_USRREQS(rip)
 #define	rip_stat	rip_stat_wrapper
 #define	rip_peeraddr	rip_peeraddr_wrapper
 #define	rip_sockaddr	rip_sockaddr_wrapper
+#define	rip_rcvd	rip_rcvd_wrapper
 #define	rip_recvoob	rip_recvoob_wrapper
 #define	rip_send	rip_send_wrapper
 #define	rip_sendoob	rip_sendoob_wrapper
@@ -877,6 +883,7 @@ const struct pr_usrreqs rip_usrreqs = {
 	.pr_stat	= rip_stat,
 	.pr_peeraddr	= rip_peeraddr,
 	.pr_sockaddr	= rip_sockaddr,
+	.pr_rcvd	= rip_rcvd,
 	.pr_recvoob	= rip_recvoob,
 	.pr_send	= rip_send,
 	.pr_sendoob	= rip_sendoob,

Index: src/sys/netinet/tcp_input.c
diff -u src/sys/netinet/tcp_input.c:1.333 src/sys/netinet/tcp_input.c:1.334
--- src/sys/netinet/tcp_input.c:1.333	Fri May 30 02:27:29 2014
+++ src/sys/netinet/tcp_input.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_input.c,v 1.333 2014/05/30 02:27:29 rmind Exp $	*/
+/*	$NetBSD: tcp_input.c,v 1.334 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.333 2014/05/30 02:27:29 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.334 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -2879,7 +2879,7 @@ dodata:							/* XXX */
 	 * and arranging for acknowledgement of receipt if necessary.
 	 * This process logically involves adjusting tp->rcv_wnd as data
 	 * is presented to the user (this happens in tcp_usrreq.c,
-	 * case PRU_RCVD).  If a FIN has already been received on this
+	 * tcp_rcvd()).  If a FIN has already been received on this
 	 * connection then we just ignore the text.
 	 */
 	if ((tlen || (tiflags & TH_FIN)) &&

Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.198 src/sys/netinet/tcp_usrreq.c:1.199
--- src/sys/netinet/tcp_usrreq.c:1.198	Tue Aug  5 07:55:32 2014
+++ src/sys/netinet/tcp_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.198 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 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.198 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.199 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -244,6 +244,7 @@ tcp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -298,21 +299,6 @@ tcp_usrreq(struct socket *so, int req, s
 		error = EOPNOTSUPP;
 		break;
 
-	/*
-	 * After a receive, possibly send window update to peer.
-	 */
-	case PRU_RCVD:
-		/*
-		 * soreceive() calls this function when a user receives
-		 * ancillary data on a listening socket. We don't call
-		 * tcp_output in such a case, since there is no header
-		 * template for a listening socket and hence the kernel
-		 * will panic.
-		 */
-		if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) != 0)
-			(void) tcp_output(tp);
-		break;
-
 	default:
 		panic("tcp_usrreq");
 	}
@@ -1067,6 +1053,40 @@ tcp_sockaddr(struct socket *so, struct m
 }
 
 static int
+tcp_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	struct inpcb *inp = NULL;
+	struct in6pcb *in6p = NULL;
+	struct tcpcb *tp = NULL;
+	int ostate = 0;
+	int error = 0;
+	int s;
+
+	if ((error = tcp_getpcb(so, &inp, &in6p, &tp)) != 0)
+		return error;
+
+	ostate = tcp_debug_capture(tp, PRU_RCVD);
+
+	/*
+	 * After a receive, possibly send window update to peer.
+	 *
+	 * soreceive() calls this function when a user receives
+	 * ancillary data on a listening socket. We don't call
+	 * tcp_output in such a case, since there is no header
+	 * template for a listening socket and hence the kernel
+	 * will panic.
+	 */
+	s = splsoftnet();
+	if ((so->so_state & (SS_ISCONNECTED|SS_ISCONNECTING)) != 0)
+		(void) tcp_output(tp);
+	splx(s);
+
+	tcp_debug_trace(so, tp, ostate, PRU_RCVD);
+
+	return 0;
+}
+
+static int
 tcp_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	struct inpcb *inp = NULL;
@@ -2430,6 +2450,7 @@ PR_WRAP_USRREQS(tcp)
 #define	tcp_stat	tcp_stat_wrapper
 #define	tcp_peeraddr	tcp_peeraddr_wrapper
 #define	tcp_sockaddr	tcp_sockaddr_wrapper
+#define	tcp_rcvd	tcp_rcvd_wrapper
 #define	tcp_recvoob	tcp_recvoob_wrapper
 #define	tcp_send	tcp_send_wrapper
 #define	tcp_sendoob	tcp_sendoob_wrapper
@@ -2449,6 +2470,7 @@ const struct pr_usrreqs tcp_usrreqs = {
 	.pr_stat	= tcp_stat,
 	.pr_peeraddr	= tcp_peeraddr,
 	.pr_sockaddr	= tcp_sockaddr,
+	.pr_rcvd	= tcp_rcvd,
 	.pr_recvoob	= tcp_recvoob,
 	.pr_send	= tcp_send,
 	.pr_sendoob	= tcp_sendoob,

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.215 src/sys/netinet/udp_usrreq.c:1.216
--- src/sys/netinet/udp_usrreq.c:1.215	Tue Aug  5 07:55:32 2014
+++ src/sys/netinet/udp_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.215 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 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.215 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.216 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -1041,6 +1041,14 @@ udp_sockaddr(struct socket *so, struct m
 }
 
 static int
+udp_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -1131,6 +1139,7 @@ udp_usrreq(struct socket *so, int req, s
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -1164,10 +1173,6 @@ udp_usrreq(struct socket *so, int req, s
 		error = EOPNOTSUPP;
 		break;
 
-	case PRU_RCVD:
-		error = EOPNOTSUPP;
-		break;
-
 	default:
 		panic("udp_usrreq");
 	}
@@ -1407,6 +1412,7 @@ PR_WRAP_USRREQS(udp)
 #define	udp_stat	udp_stat_wrapper
 #define	udp_peeraddr	udp_peeraddr_wrapper
 #define	udp_sockaddr	udp_sockaddr_wrapper
+#define	udp_rcvd	udp_rcvd_wrapper
 #define	udp_recvoob	udp_recvoob_wrapper
 #define	udp_send	udp_send_wrapper
 #define	udp_sendoob	udp_sendoob_wrapper
@@ -1426,6 +1432,7 @@ const struct pr_usrreqs udp_usrreqs = {
 	.pr_stat	= udp_stat,
 	.pr_peeraddr	= udp_peeraddr,
 	.pr_sockaddr	= udp_sockaddr,
+	.pr_rcvd	= udp_rcvd,
 	.pr_recvoob	= udp_recvoob,
 	.pr_send	= udp_send,
 	.pr_sendoob	= udp_sendoob,

Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.134 src/sys/netinet6/raw_ip6.c:1.135
--- src/sys/netinet6/raw_ip6.c:1.134	Tue Aug  5 07:55:32 2014
+++ src/sys/netinet6/raw_ip6.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.134 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 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.134 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.135 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -830,6 +830,14 @@ rip6_sockaddr(struct socket *so, struct 
 }
 
 static int
+rip6_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 rip6_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -920,6 +928,7 @@ rip6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -938,13 +947,6 @@ rip6_usrreq(struct socket *so, int req, 
 		error = EOPNOTSUPP;
 		break;
 
-	/*
-	 * Not supported.
-	 */
-	case PRU_RCVD:
-		error = EOPNOTSUPP;
-		break;
-
 	default:
 		panic("rip6_usrreq");
 	}
@@ -1006,6 +1008,7 @@ PR_WRAP_USRREQS(rip6)
 #define	rip6_stat		rip6_stat_wrapper
 #define	rip6_peeraddr		rip6_peeraddr_wrapper
 #define	rip6_sockaddr		rip6_sockaddr_wrapper
+#define	rip6_rcvd		rip6_rcvd_wrapper
 #define	rip6_recvoob		rip6_recvoob_wrapper
 #define	rip6_send		rip6_send_wrapper
 #define	rip6_sendoob		rip6_sendoob_wrapper
@@ -1025,6 +1028,7 @@ const struct pr_usrreqs rip6_usrreqs = {
 	.pr_stat	= rip6_stat,
 	.pr_peeraddr	= rip6_peeraddr,
 	.pr_sockaddr	= rip6_sockaddr,
+	.pr_rcvd	= rip6_rcvd,
 	.pr_recvoob	= rip6_recvoob,
 	.pr_send	= rip6_send,
 	.pr_sendoob	= rip6_sendoob,

Index: src/sys/netinet6/udp6_usrreq.c
diff -u src/sys/netinet6/udp6_usrreq.c:1.113 src/sys/netinet6/udp6_usrreq.c:1.114
--- src/sys/netinet6/udp6_usrreq.c:1.113	Tue Aug  5 07:55:32 2014
+++ src/sys/netinet6/udp6_usrreq.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.113 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 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.113 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.114 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -828,6 +828,14 @@ udp6_sockaddr(struct socket *so, struct 
 }
 
 static int
+udp6_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 udp6_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -887,6 +895,7 @@ udp6_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -913,9 +922,6 @@ udp6_usrreq(struct socket *so, int req, 
 		error = EOPNOTSUPP;
 		break;
 
-	case PRU_RCVD:
-		return EOPNOTSUPP;	/* do not free mbuf's */
-
 	default:
 		panic("udp6_usrreq");
 	}
@@ -1010,6 +1016,7 @@ PR_WRAP_USRREQS(udp6)
 #define	udp6_stat	udp6_stat_wrapper
 #define	udp6_peeraddr	udp6_peeraddr_wrapper
 #define	udp6_sockaddr	udp6_sockaddr_wrapper
+#define	udp6_rcvd	udp6_rcvd_wrapper
 #define	udp6_recvoob	udp6_recvoob_wrapper
 #define	udp6_send	udp6_send_wrapper
 #define	udp6_sendoob	udp6_sendoob_wrapper
@@ -1029,6 +1036,7 @@ const struct pr_usrreqs udp6_usrreqs = {
 	.pr_stat	= udp6_stat,
 	.pr_peeraddr	= udp6_peeraddr,
 	.pr_sockaddr	= udp6_sockaddr,
+	.pr_rcvd	= udp6_rcvd,
 	.pr_recvoob	= udp6_recvoob,
 	.pr_send	= udp6_send,
 	.pr_sendoob	= udp6_sendoob,

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.41 src/sys/netipsec/keysock.c:1.42
--- src/sys/netipsec/keysock.c:1.41	Tue Aug  5 07:55:32 2014
+++ src/sys/netipsec/keysock.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.41 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 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.41 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.42 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -609,6 +609,14 @@ key_sockaddr(struct socket *so, struct m
 }
 
 static int
+key_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 key_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -666,6 +674,7 @@ key_usrreq(struct socket *so, int req,st
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -698,6 +707,7 @@ PR_WRAP_USRREQS(key)
 #define	key_stat	key_stat_wrapper
 #define	key_peeraddr	key_peeraddr_wrapper
 #define	key_sockaddr	key_sockaddr_wrapper
+#define	key_rcvd	key_rcvd_wrapper
 #define	key_recvoob	key_recvoob_wrapper
 #define	key_send	key_send_wrapper
 #define	key_sendoob	key_sendoob_wrapper
@@ -717,6 +727,7 @@ const struct pr_usrreqs key_usrreqs = {
 	.pr_stat	= key_stat,
 	.pr_peeraddr	= key_peeraddr,
 	.pr_sockaddr	= key_sockaddr,
+	.pr_rcvd	= key_rcvd,
 	.pr_recvoob	= key_recvoob,
 	.pr_send	= key_send,
 	.pr_sendoob	= key_sendoob,

Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.22 src/sys/netmpls/mpls_proto.c:1.23
--- src/sys/netmpls/mpls_proto.c:1.22	Tue Aug  5 07:55:32 2014
+++ src/sys/netmpls/mpls_proto.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.22 2014/08/05 07:55:32 rtr Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 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.22 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.23 2014/08/08 03:05:45 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -181,6 +181,14 @@ mpls_sockaddr(struct socket *so, struct 
 }
 
 static int
+mpls_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -223,6 +231,7 @@ mpls_usrreq(struct socket *so, int req, 
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);
@@ -325,6 +334,7 @@ PR_WRAP_USRREQS(mpls)
 #define	mpls_stat	mpls_stat_wrapper
 #define	mpls_peeraddr	mpls_peeraddr_wrapper
 #define	mpls_sockaddr	mpls_sockaddr_wrapper
+#define	mpls_rcvd	mpls_rcvd_wrapper
 #define	mpls_recvoob	mpls_recvoob_wrapper
 #define	mpls_send	mpls_send_wrapper
 #define	mpls_sendoob	mpls_sendoob_wrapper
@@ -344,6 +354,7 @@ static const struct pr_usrreqs mpls_usrr
 	.pr_stat	= mpls_stat,
 	.pr_peeraddr	= mpls_peeraddr,
 	.pr_sockaddr	= mpls_sockaddr,
+	.pr_rcvd	= mpls_rcvd,
 	.pr_recvoob	= mpls_recvoob,
 	.pr_send	= mpls_send,
 	.pr_sendoob	= mpls_sendoob,

Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.43 src/sys/netnatm/natm.c:1.44
--- src/sys/netnatm/natm.c:1.43	Tue Aug  5 07:55:32 2014
+++ src/sys/netnatm/natm.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.43 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 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.43 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.44 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/kmem.h>
@@ -313,17 +313,61 @@ natm_peeraddr(struct socket *so, struct 
 static int
 natm_sockaddr(struct socket *so, struct mbuf *nam)
 {
-  KASSERT(solocked(so));
+	KASSERT(solocked(so));
 
-  return EOPNOTSUPP;
+	return EOPNOTSUPP;
+}
+
+static int
+natm_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	return EOPNOTSUPP;
 }
 
 static int
 natm_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
-  KASSERT(solocked(so));
+	KASSERT(solocked(so));
 
-  return EOPNOTSUPP;
+	return EOPNOTSUPP;
+}
+
+static int
+natm_send(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control)
+{
+	struct natmpcb *npcb = (struct natmpcb *) so->so_pcb;
+	struct atm_pseudohdr *aph;
+
+	KASSERT(solocked(so));
+	KASSERT(pcb != NULL);
+	KASSERT(m != NULL);
+
+	if (control && control->m_len) {
+		m_freem(control);
+		m_freem(m);
+		return EINVAL;
+	}
+
+	/*
+	 * send the data.   we must put an atm_pseudohdr on first
+	 */
+	s = SPLSOFTNET();
+	M_PREPEND(m, sizeof(*aph), M_WAITOK);
+	if (m == NULL) {
+		error = ENOBUFS;
+		break;
+	}
+	aph = mtod(m, struct atm_pseudohdr *);
+	ATM_PH_VPI(aph) = npcb->npcb_vpi;
+	ATM_PH_SETVCI(aph, npcb->npcb_vci);
+	ATM_PH_FLAGS(aph) = (proto == PROTO_NATMAAL5) ? ATM_PH_AAL5 : 0;
+	error = atm_output(npcb->npcb_ifp, m, NULL, NULL);
+	splx(s);
+
+	return error;
 }
 
 static int
@@ -399,6 +443,7 @@ natm_usrreq(struct socket *so, int req, 
   KASSERT(req != PRU_SENSE);
   KASSERT(req != PRU_PEERADDR);
   KASSERT(req != PRU_SOCKADDR);
+  KASSERT(req != PRU_RCVD);
   KASSERT(req != PRU_RCVOOB);
   KASSERT(req != PRU_SEND);
   KASSERT(req != PRU_SENDOOB);
@@ -414,7 +459,6 @@ natm_usrreq(struct socket *so, int req, 
 
   switch (req) {
     case PRU_CONNECT2:			/* connect two sockets */
-    case PRU_RCVD:			/* have taken data; more room now */
     case PRU_FASTTIMO:			/* 200ms timeout */
     case PRU_SLOWTIMO:			/* 500ms timeout */
     case PRU_PROTORCV:			/* receive from below */
@@ -525,6 +569,7 @@ PR_WRAP_USRREQS(natm)
 #define	natm_stat	natm_stat_wrapper
 #define	natm_peeraddr	natm_peeraddr_wrapper
 #define	natm_sockaddr	natm_sockaddr_wrapper
+#define	natm_rcvd	natm_rcvd_wrapper
 #define	natm_recvoob	natm_recvoob_wrapper
 #define	natm_send	natm_send_wrapper
 #define	natm_sendoob	natm_sendoob_wrapper
@@ -544,6 +589,7 @@ const struct pr_usrreqs natm_usrreqs = {
 	.pr_stat	= natm_stat,
 	.pr_peeraddr	= natm_peeraddr,
 	.pr_sockaddr	= natm_sockaddr,
+	.pr_rcvd	= natm_rcvd,
 	.pr_recvoob	= natm_recvoob,
 	.pr_send	= natm_send,
 	.pr_sendoob	= natm_sendoob,

Index: src/sys/rump/net/lib/libsockin/sockin.c
diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.56 src/sys/rump/net/lib/libsockin/sockin.c:1.57
--- src/sys/rump/net/lib/libsockin/sockin.c:1.56	Tue Aug  5 07:55:32 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.56 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 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.56 2014/08/05 07:55:32 rtr Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.57 2014/08/08 03:05:45 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -79,6 +79,7 @@ static int	sockin_ioctl(struct socket *,
 static int	sockin_stat(struct socket *, struct stat *);
 static int	sockin_peeraddr(struct socket *, struct mbuf *);
 static int	sockin_sockaddr(struct socket *, struct mbuf *);
+static int	sockin_rcvd(struct socket *, int, struct lwp *);
 static int	sockin_recvoob(struct socket *, struct mbuf *, int);
 static int	sockin_send(struct socket *, struct mbuf *, struct mbuf *,
 			    struct mbuf *, struct lwp *);
@@ -101,6 +102,7 @@ static const struct pr_usrreqs sockin_us
 	.pr_stat = sockin_stat,
 	.pr_peeraddr = sockin_peeraddr,
 	.pr_sockaddr = sockin_sockaddr,
+	.pr_rcvd = sockin_rcvd,
 	.pr_recvoob = sockin_recvoob,
 	.pr_send = sockin_send,
 	.pr_sendoob = sockin_sendoob,
@@ -592,6 +594,14 @@ sockin_sockaddr(struct socket *so, struc
 }
 
 static int
+sockin_rcvd(struct socket *so, int flags, struct lwp *l)
+{
+	KASSERT(solocked(so));
+
+	panic("sockin_rcvd: IMPLEMENT ME, rcvd not supported");
+}
+
+static int
 sockin_recvoob(struct socket *so, struct mbuf *m, int flags)
 {
 	KASSERT(solocked(so));
@@ -684,6 +694,7 @@ sockin_usrreq(struct socket *so, int req
 	KASSERT(req != PRU_SENSE);
 	KASSERT(req != PRU_PEERADDR);
 	KASSERT(req != PRU_SOCKADDR);
+	KASSERT(req != PRU_RCVD);
 	KASSERT(req != PRU_RCVOOB);
 	KASSERT(req != PRU_SEND);
 	KASSERT(req != PRU_SENDOOB);

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.58 src/sys/sys/protosw.h:1.59
--- src/sys/sys/protosw.h:1.58	Tue Aug  5 07:55:32 2014
+++ src/sys/sys/protosw.h	Fri Aug  8 03:05:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.58 2014/08/05 07:55:32 rtr Exp $	*/
+/*	$NetBSD: protosw.h,v 1.59 2014/08/08 03:05:45 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -110,7 +110,7 @@ struct protosw {
 #define	PR_ATOMIC	0x01		/* exchange atomic messages only */
 #define	PR_ADDR		0x02		/* addresses given with messages */
 #define	PR_CONNREQUIRED	0x04		/* connection required by protocol */
-#define	PR_WANTRCVD	0x08		/* want PRU_RCVD calls */
+#define	PR_WANTRCVD	0x08		/* want pr_rcvd() calls */
 #define	PR_RIGHTS	0x10		/* passes capabilities */
 #define	PR_LISTEN	0x20		/* supports listen(2) and accept(2) */
 #define	PR_LASTHDR	0x40		/* enforce ipsec policy; last header */
@@ -249,6 +249,7 @@ struct pr_usrreqs {
 	int	(*pr_stat)(struct socket *, struct stat *);
 	int	(*pr_peeraddr)(struct socket *, struct mbuf *);
 	int	(*pr_sockaddr)(struct socket *, struct mbuf *);
+	int	(*pr_rcvd)(struct socket *, int, struct lwp *);
 	int	(*pr_recvoob)(struct socket *, struct mbuf *, int);
 	int	(*pr_send)(struct socket *, struct mbuf *, struct mbuf *,
 	    struct mbuf *, struct lwp *);
@@ -407,6 +408,16 @@ name##_sockaddr_wrapper(struct socket *a
 	return rv;					\
 }							\
 static int						\
+name##_rcvd_wrapper(struct socket *a, int b,		\
+    struct lwp *c)					\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_rcvd(a, b, c);			\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_recvoob_wrapper(struct socket *a,		\
     struct mbuf *b, int c)				\
 {							\

Reply via email to