Module Name:    src
Committed By:   rtr
Date:           Sun Jun 22 08:10:19 UTC 2014

Modified Files:
        src/sys/compat/common: if_43.c
        src/sys/kern: sys_socket.c uipc_usrreq.c
        src/sys/net: if.c link_proto.c raw_usrreq.c rtsock.c
        src/sys/netatalk: ddp_usrreq.c
        src/sys/netbt: hci.h hci_ioctl.c 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_CONTROL functionality out of xxx_userreq() switches and place
  into separate xxx_ioctl() functions.
* place KASSERT(req != PRU_CONTROL) inside xxx_userreq() as it is now
  inappropriate for req = PRU_CONTROL in xxx_userreq().
* replace calls to pr_generic() with req = PRU_CONTROL with pr_ioctl().
* remove & fixup references to PRU_CONTROL xxx_userreq() function comments.
* fix various comments references for xxx_userreq() that mentioned
  PRU_CONTROL as xxx_userreq() no longer handles the request.

a further change will follow to fix parameter and naming inconsistencies
retained from original code.

Reviewed by rmind@


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/compat/common/if_43.c
cvs rdiff -u -r1.68 -r1.69 src/sys/kern/sys_socket.c
cvs rdiff -u -r1.153 -r1.154 src/sys/kern/uipc_usrreq.c
cvs rdiff -u -r1.282 -r1.283 src/sys/net/if.c
cvs rdiff -u -r1.9 -r1.10 src/sys/net/link_proto.c
cvs rdiff -u -r1.39 -r1.40 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.147 -r1.148 src/sys/net/rtsock.c
cvs rdiff -u -r1.44 -r1.45 src/sys/netatalk/ddp_usrreq.c
cvs rdiff -u -r1.37 -r1.38 src/sys/netbt/hci.h
cvs rdiff -u -r1.10 -r1.11 src/sys/netbt/hci_ioctl.c
cvs rdiff -u -r1.24 -r1.25 src/sys/netbt/hci_socket.c
cvs rdiff -u -r1.15 -r1.16 src/sys/netbt/l2cap_socket.c
cvs rdiff -u -r1.16 -r1.17 src/sys/netbt/rfcomm_socket.c
cvs rdiff -u -r1.17 -r1.18 src/sys/netbt/sco_socket.c
cvs rdiff -u -r1.124 -r1.125 src/sys/netinet/raw_ip.c
cvs rdiff -u -r1.177 -r1.178 src/sys/netinet/tcp_usrreq.c
cvs rdiff -u -r1.199 -r1.200 src/sys/netinet/udp_usrreq.c
cvs rdiff -u -r1.118 -r1.119 src/sys/netinet6/raw_ip6.c
cvs rdiff -u -r1.98 -r1.99 src/sys/netinet6/udp6_usrreq.c
cvs rdiff -u -r1.27 -r1.28 src/sys/netipsec/keysock.c
cvs rdiff -u -r1.9 -r1.10 src/sys/netmpls/mpls_proto.c
cvs rdiff -u -r1.27 -r1.28 src/sys/netnatm/natm.c
cvs rdiff -u -r1.40 -r1.41 src/sys/rump/net/lib/libsockin/sockin.c
cvs rdiff -u -r1.47 -r1.48 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/compat/common/if_43.c
diff -u src/sys/compat/common/if_43.c:1.5 src/sys/compat/common/if_43.c:1.6
--- src/sys/compat/common/if_43.c:1.5	Sun May 18 14:46:15 2014
+++ src/sys/compat/common/if_43.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_43.c,v 1.5 2014/05/18 14:46:15 rmind Exp $	*/
+/*	$NetBSD: if_43.c,v 1.6 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1990, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1.5 2014/05/18 14:46:15 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1.6 2014/06/22 08:10:18 rtr Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -256,7 +256,7 @@ compat_ifioctl(struct socket *so, u_long
 		cmd = SIOCGIFNETMASK;
 	}
 
-	error = (*so->so_proto->pr_usrreqs->pr_generic)(so, PRU_CONTROL,
+	error = (*so->so_proto->pr_usrreqs->pr_ioctl)(so,
 	    (struct mbuf *)cmd, (struct mbuf *)ifr, (struct mbuf *)ifp, l);
 
 	switch (ocmd) {

Index: src/sys/kern/sys_socket.c
diff -u src/sys/kern/sys_socket.c:1.68 src/sys/kern/sys_socket.c:1.69
--- src/sys/kern/sys_socket.c:1.68	Sun May 18 14:46:15 2014
+++ src/sys/kern/sys_socket.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sys_socket.c,v 1.68 2014/05/18 14:46:15 rmind Exp $	*/
+/*	$NetBSD: sys_socket.c,v 1.69 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.68 2014/05/18 14:46:15 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_socket.c,v 1.69 2014/06/22 08:10:18 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -201,8 +201,8 @@ soo_ioctl(file_t *fp, u_long cmd, void *
 		if (IOCGROUP(cmd) == 'i')
 			error = ifioctl(so, cmd, data, curlwp);
 		else {
-			error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-			    PRU_CONTROL, (struct mbuf *)cmd,
+			error = (*so->so_proto->pr_usrreqs->pr_ioctl)(so,
+			    (struct mbuf *)cmd,
 			    (struct mbuf *)data, NULL, curlwp);
 		}
 		KERNEL_UNLOCK_ONE(NULL);

Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.153 src/sys/kern/uipc_usrreq.c:1.154
--- src/sys/kern/uipc_usrreq.c:1.153	Sun Jun  8 02:52:50 2014
+++ src/sys/kern/uipc_usrreq.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_usrreq.c,v 1.153 2014/06/08 02:52:50 christos Exp $	*/
+/*	$NetBSD: uipc_usrreq.c,v 1.154 2014/06/22 08:10:18 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.153 2014/06/08 02:52:50 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.154 2014/06/22 08:10:18 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -376,10 +376,8 @@ unp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
-	if (req == PRU_CONTROL) {
-		return EOPNOTSUPP;
-	}
 	KASSERT(solocked(so));
 	unp = sotounpcb(so);
 
@@ -867,6 +865,13 @@ unp_detach(struct socket *so)
 		unp_free(unp);
 }
 
+static int
+unp_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+	return EOPNOTSUPP;
+}
+
 /*
  * Allocate the new sockaddr.  We have to allocate one
  * extra byte so that we can ensure that the pathname
@@ -1812,5 +1817,6 @@ unp_discard_later(file_t *fp)
 const struct pr_usrreqs unp_usrreqs = {
 	.pr_attach	= unp_attach,
 	.pr_detach	= unp_detach,
+	.pr_ioctl	= unp_ioctl,
 	.pr_generic	= unp_usrreq,
 };

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.282 src/sys/net/if.c:1.283
--- src/sys/net/if.c:1.282	Mon Jun 16 00:40:10 2014
+++ src/sys/net/if.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.282 2014/06/16 00:40:10 ozaki-r Exp $	*/
+/*	$NetBSD: if.c,v 1.283 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.282 2014/06/16 00:40:10 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.283 2014/06/22 08:10:18 rtr Exp $");
 
 #include "opt_inet.h"
 
@@ -1922,8 +1922,8 @@ doifioctl(struct socket *so, u_long cmd,
 #ifdef COMPAT_OSOCK
 		error = compat_ifioctl(so, ocmd, cmd, data, l);
 #else
-		error = (*so->so_proto->pr_usrreqs->pr_generic)(so,
-		    PRU_CONTROL, (struct mbuf *)cmd, (struct mbuf *)data,
+		error = (*so->so_proto->pr_usrreqs->pr_ioctl)(so,
+		    (struct mbuf *)cmd, (struct mbuf *)data,
 		    (struct mbuf *)ifp, l);
 #endif
 	}

Index: src/sys/net/link_proto.c
diff -u src/sys/net/link_proto.c:1.9 src/sys/net/link_proto.c:1.10
--- src/sys/net/link_proto.c:1.9	Mon May 19 02:51:24 2014
+++ src/sys/net/link_proto.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: link_proto.c,v 1.9 2014/05/19 02:51:24 rmind Exp $	*/
+/*	$NetBSD: link_proto.c,v 1.10 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.9 2014/05/19 02:51:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: link_proto.c,v 1.10 2014/06/22 08:10:18 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/socket.h>
@@ -50,6 +50,8 @@ __KERNEL_RCSID(0, "$NetBSD: link_proto.c
 static int sockaddr_dl_cmp(const struct sockaddr *, const struct sockaddr *);
 static int link_attach(struct socket *, int);
 static void link_detach(struct socket *);
+static int link_ioctl(struct socket *, struct mbuf *, struct mbuf *,
+	struct mbuf *, struct lwp *);
 static int link_usrreq(struct socket *, int, struct mbuf *, struct mbuf *,
     struct mbuf *, struct lwp *);
 static void link_init(void);
@@ -63,6 +65,7 @@ DOMAIN_DEFINE(linkdomain);	/* forward de
 static const struct pr_usrreqs link_usrreqs = {
 	.pr_attach	= link_attach,
 	.pr_detach	= link_detach,
+	.pr_ioctl	= link_ioctl,
 	.pr_generic	= link_usrreq,
 };
 
@@ -230,19 +233,22 @@ link_detach(struct socket *so)
 }
 
 static int
+link_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+	struct mbuf *control, struct lwp *l)
+{
+	return link_control(so, (unsigned long)m, nam,
+	    (struct ifnet *)control, l);
+}
+
+static int
 link_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
 	struct mbuf *control, struct lwp *l)
 {
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
-	switch (req) {
-	case PRU_CONTROL:
-		return link_control(so, (unsigned long)m, nam,
-		    (struct ifnet *)control, l);
-	default:
-		return EOPNOTSUPP;
-	}
+	return EOPNOTSUPP;
 }
 
 /* Compare the field at byte offsets [fieldstart, fieldend) in

Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.39 src/sys/net/raw_usrreq.c:1.40
--- src/sys/net/raw_usrreq.c:1.39	Mon May 19 02:51:24 2014
+++ src/sys/net/raw_usrreq.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_usrreq.c,v 1.39 2014/05/19 02:51:24 rmind Exp $	*/
+/*	$NetBSD: raw_usrreq.c,v 1.40 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.39 2014/05/19 02:51:24 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.40 2014/06/22 08:10:18 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -162,9 +162,7 @@ raw_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
-
-	if (req == PRU_CONTROL)
-		return EOPNOTSUPP;
+	KASSERT(req != PRU_CONTROL);
 
 	s = splsoftnet();
 	KERNEL_LOCK(1, NULL);

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.147 src/sys/net/rtsock.c:1.148
--- src/sys/net/rtsock.c:1.147	Wed May 21 20:43:56 2014
+++ src/sys/net/rtsock.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.147 2014/05/21 20:43:56 rmind Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.148 2014/06/22 08:10:18 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.147 2014/05/21 20:43:56 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.148 2014/06/22 08:10:18 rtr Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -224,6 +224,13 @@ COMPATNAME(route_detach)(struct socket *
 }
 
 static int
+COMPATNAME(route_ioctl)(struct socket *so, struct mbuf *m,
+    struct mbuf *nam, struct mbuf *control, struct lwp *l)
+{
+	return EOPNOTSUPP;
+}
+
+static int
 COMPATNAME(route_usrreq)(struct socket *so, int req, struct mbuf *m,
     struct mbuf *nam, struct mbuf *control, struct lwp *l)
 {
@@ -231,6 +238,7 @@ COMPATNAME(route_usrreq)(struct socket *
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -1327,6 +1335,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_ioctl	= COMPATNAME(route_ioctl_wrapper),
 	.pr_generic	= COMPATNAME(route_usrreq_wrapper),
 };
 

Index: src/sys/netatalk/ddp_usrreq.c
diff -u src/sys/netatalk/ddp_usrreq.c:1.44 src/sys/netatalk/ddp_usrreq.c:1.45
--- src/sys/netatalk/ddp_usrreq.c:1.44	Tue May 20 19:04:00 2014
+++ src/sys/netatalk/ddp_usrreq.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ddp_usrreq.c,v 1.44 2014/05/20 19:04:00 rmind Exp $	 */
+/*	$NetBSD: ddp_usrreq.c,v 1.45 2014/06/22 08:10:18 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.44 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.45 2014/06/22 08:10:18 rtr Exp $");
 
 #include "opt_mbuftrace.h"
 
@@ -84,12 +84,10 @@ ddp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
+
 	ddp = sotoddpcb(so);
 
-	if (req == PRU_CONTROL) {
-		return (at_control((long) m, (void *) addr,
-		    (struct ifnet *) rights, l));
-	}
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
 		at_purgeif((struct ifnet *) rights);
@@ -480,6 +478,14 @@ ddp_detach(struct socket *so)
 	kmem_free(ddp, sizeof(*ddp));
 }
 
+static int
+ddp_ioctl(struct socket *so, struct mbuf *m, struct mbuf *addr,
+    struct mbuf *rights, struct lwp *l)
+{
+	return (at_control((long) m, (void *) addr,
+	    (struct ifnet *) rights, l));
+}
+
 /*
  * For the moment, this just find the pcb with the correct local address.
  * In the future, this will actually do some real searching, so we can use
@@ -553,11 +559,13 @@ ddp_init(void)
 PR_WRAP_USRREQS(ddp)
 #define	ddp_attach	ddp_attach_wrapper
 #define	ddp_detach	ddp_detach_wrapper
+#define	ddp_ioctl	ddp_ioctl_wrapper
 #define	ddp_usrreq	ddp_usrreq_wrapper
 
 const struct pr_usrreqs ddp_usrreqs = {
 	.pr_attach	= ddp_attach,
 	.pr_detach	= ddp_detach,
+	.pr_ioctl	= ddp_ioctl,
 	.pr_generic	= ddp_usrreq,
 };
 

Index: src/sys/netbt/hci.h
diff -u src/sys/netbt/hci.h:1.37 src/sys/netbt/hci.h:1.38
--- src/sys/netbt/hci.h:1.37	Tue May 20 18:25:54 2014
+++ src/sys/netbt/hci.h	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci.h,v 1.37 2014/05/20 18:25:54 rmind Exp $	*/
+/*	$NetBSD: hci.h,v 1.38 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -54,7 +54,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $Id: hci.h,v 1.37 2014/05/20 18:25:54 rmind Exp $
+ * $Id: hci.h,v 1.38 2014/06/22 08:10:18 rtr Exp $
  * $FreeBSD: src/sys/netgraph/bluetooth/include/ng_hci.h,v 1.6 2005/01/07 01:45:43 imp Exp $
  */
 
@@ -2536,7 +2536,7 @@ extern SIMPLEQ_HEAD(hci_unit_list, hci_u
 void hci_event(struct mbuf *, struct hci_unit *);
 
 /* hci_ioctl.c */
-int hci_ioctl(unsigned long, void *, struct lwp *);
+int hci_ioctl_pcb(unsigned long, void *, struct lwp *);
 
 /* hci_link.c */
 struct hci_link *hci_acl_open(struct hci_unit *, bdaddr_t *);

Index: src/sys/netbt/hci_ioctl.c
diff -u src/sys/netbt/hci_ioctl.c:1.10 src/sys/netbt/hci_ioctl.c:1.11
--- src/sys/netbt/hci_ioctl.c:1.10	Mon Nov 22 19:56:51 2010
+++ src/sys/netbt/hci_ioctl.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_ioctl.c,v 1.10 2010/11/22 19:56:51 plunky Exp $	*/
+/*	$NetBSD: hci_ioctl.c,v 1.11 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_ioctl.c,v 1.10 2010/11/22 19:56:51 plunky Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_ioctl.c,v 1.11 2014/06/22 08:10:18 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/domain.h>
@@ -132,7 +132,7 @@ hci_dump(void)
 #endif
 
 int
-hci_ioctl(unsigned long cmd, void *data, struct lwp *l)
+hci_ioctl_pcb(unsigned long cmd, void *data, struct lwp *l)
 {
 	struct btreq *btr = data;
 	struct hci_unit *unit;

Index: src/sys/netbt/hci_socket.c
diff -u src/sys/netbt/hci_socket.c:1.24 src/sys/netbt/hci_socket.c:1.25
--- src/sys/netbt/hci_socket.c:1.24	Tue May 20 19:04:00 2014
+++ src/sys/netbt/hci_socket.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: hci_socket.c,v 1.24 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: hci_socket.c,v 1.25 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.24 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hci_socket.c,v 1.25 2014/06/22 08:10:18 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -483,20 +483,26 @@ hci_detach(struct socket *so)
 	kmem_free(pcb, sizeof(*pcb));
 }
 
+static int
+hci_ioctl(struct socket *up, struct mbuf *m,
+		struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
+{
+	int err;
+	mutex_enter(bt_lock);
+	err = hci_ioctl_pcb((unsigned long)m, (void *)nam, l);
+	mutex_exit(bt_lock);
+	return err;
+}
+
 /*
  * User Request.
  * up is socket
- * m is either
- *	optional mbuf chain containing message
- *	ioctl command (PRU_CONTROL)
- * nam is either
- *	optional mbuf chain containing an address
- *	ioctl data (PRU_CONTROL)
+ * m is optional mbuf chain containing message
+ * nam is optional mbuf chain containing an address
  * ctl is optional mbuf chain containing socket options
  * l is pointer to process requesting action (if any)
  *
- * we are responsible for disposing of m and ctl if
- * they are mbuf chains
+ * we are responsible for disposing of m and ctl
  */
 static int
 hci_usrreq(struct socket *up, int req, struct mbuf *m,
@@ -509,14 +515,9 @@ 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_CONTROL);
 
 	switch(req) {
-	case PRU_CONTROL:
-		mutex_enter(bt_lock);
-		err = hci_ioctl((unsigned long)m, (void *)nam, l);
-		mutex_exit(bt_lock);
-		return err;
-
 	case PRU_PURGEIF:
 		return EOPNOTSUPP;
 	}
@@ -868,10 +869,12 @@ PR_WRAP_USRREQS(hci)
 
 #define	hci_attach		hci_attach_wrapper
 #define	hci_detach		hci_detach_wrapper
+#define	hci_ioctl		hci_ioctl_wrapper
 #define	hci_usrreq		hci_usrreq_wrapper
 
 const struct pr_usrreqs hci_usrreqs = {
 	.pr_attach	= hci_attach,
 	.pr_detach	= hci_detach,
+	.pr_ioctl	= hci_ioctl,
 	.pr_generic	= hci_usrreq,
 };

Index: src/sys/netbt/l2cap_socket.c
diff -u src/sys/netbt/l2cap_socket.c:1.15 src/sys/netbt/l2cap_socket.c:1.16
--- src/sys/netbt/l2cap_socket.c:1.15	Tue May 20 19:04:00 2014
+++ src/sys/netbt/l2cap_socket.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: l2cap_socket.c,v 1.15 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: l2cap_socket.c,v 1.16 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2005 Iain Hibbert.
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.15 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: l2cap_socket.c,v 1.16 2014/06/22 08:10:18 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -116,19 +116,23 @@ l2cap_detach(struct socket *so)
 	KASSERT(so->so_pcb == NULL);
 }
 
+static int
+l2cap_ioctl(struct socket *up, struct mbuf *m,
+    struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
+{
+	return EPASSTHROUGH;
+}
+
 /*
  * User Request.
  * up is socket
- * m is either
- *	optional mbuf chain containing message
- *	ioctl command (PRU_CONTROL)
+ * m is optional mbuf chain containing message
  * nam is either
  *	optional mbuf chain containing an address
- *	ioctl data (PRU_CONTROL)
  *	message flags (PRU_RCVD)
  * ctl is either
  *	optional mbuf chain containing socket options
- *	optional interface pointer (PRU_CONTROL, PRU_PURGEIF)
+ *	optional interface pointer PRU_PURGEIF
  * l is pointer to process requesting action (if any)
  *
  * we are responsible for disposing of m and ctl if
@@ -146,11 +150,9 @@ l2cap_usrreq(struct socket *up, int req,
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
 	switch (req) {
-	case PRU_CONTROL:
-		return EPASSTHROUGH;
-
 	case PRU_PURGEIF:
 		return EOPNOTSUPP;
 	}
@@ -415,10 +417,12 @@ PR_WRAP_USRREQS(l2cap)
 
 #define	l2cap_attach		l2cap_attach_wrapper
 #define	l2cap_detach		l2cap_detach_wrapper
+#define	l2cap_ioctl		l2cap_ioctl_wrapper
 #define	l2cap_usrreq		l2cap_usrreq_wrapper
 
 const struct pr_usrreqs l2cap_usrreqs = {
 	.pr_attach	= l2cap_attach,
 	.pr_detach	= l2cap_detach,
+	.pr_ioctl	= l2cap_ioctl,
 	.pr_generic	= l2cap_usrreq,
 };

Index: src/sys/netbt/rfcomm_socket.c
diff -u src/sys/netbt/rfcomm_socket.c:1.16 src/sys/netbt/rfcomm_socket.c:1.17
--- src/sys/netbt/rfcomm_socket.c:1.16	Tue May 20 19:04:00 2014
+++ src/sys/netbt/rfcomm_socket.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: rfcomm_socket.c,v 1.16 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: rfcomm_socket.c,v 1.17 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.16 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rfcomm_socket.c,v 1.17 2014/06/22 08:10:18 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -124,19 +124,23 @@ rfcomm_detach(struct socket *so)
 	KASSERT(so->so_pcb == NULL);
 }
 
+static int
+rfcomm_ioctl(struct socket *up, struct mbuf *m,
+		struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
+{
+	return EPASSTHROUGH;
+}
+
 /*
  * User Request.
  * up is socket
- * m is either
- *	optional mbuf chain containing message
- *	ioctl command (PRU_CONTROL)
+ * m is optional mbuf chain containing message
  * nam is either
  *	optional mbuf chain containing an address
- *	ioctl data (PRU_CONTROL)
  *	message flags (PRU_RCVD)
  * ctl is either
  *	optional mbuf chain containing socket options
- *	optional interface pointer (PRU_CONTROL, PRU_PURGEIF)
+ *	optional interface pointer PRU_PURGEIF
  * l is pointer to process requesting action (if any)
  *
  * we are responsible for disposing of m and ctl if
@@ -154,11 +158,9 @@ rfcomm_usrreq(struct socket *up, int req
 	DPRINTFN(2, "%s\n", prurequests[req]);
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
 	switch (req) {
-	case PRU_CONTROL:
-		return EPASSTHROUGH;
-
 	case PRU_PURGEIF:
 		return EOPNOTSUPP;
 	}
@@ -428,10 +430,12 @@ PR_WRAP_USRREQS(rfcomm)
 
 #define	rfcomm_attach		rfcomm_attach_wrapper
 #define	rfcomm_detach		rfcomm_detach_wrapper
+#define	rfcomm_ioctl		rfcomm_ioctl_wrapper
 #define	rfcomm_usrreq		rfcomm_usrreq_wrapper
 
 const struct pr_usrreqs rfcomm_usrreqs = {
 	.pr_attach	= rfcomm_attach,
 	.pr_detach	= rfcomm_detach,
+	.pr_ioctl	= rfcomm_ioctl,
 	.pr_generic	= rfcomm_usrreq,
 };

Index: src/sys/netbt/sco_socket.c
diff -u src/sys/netbt/sco_socket.c:1.17 src/sys/netbt/sco_socket.c:1.18
--- src/sys/netbt/sco_socket.c:1.17	Tue May 20 19:04:00 2014
+++ src/sys/netbt/sco_socket.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sco_socket.c,v 1.17 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: sco_socket.c,v 1.18 2014/06/22 08:10:18 rtr Exp $	*/
 
 /*-
  * Copyright (c) 2006 Itronix Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.17 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sco_socket.c,v 1.18 2014/06/22 08:10:18 rtr Exp $");
 
 /* load symbolic names */
 #ifdef BLUETOOTH_DEBUG
@@ -107,15 +107,18 @@ sco_detach(struct socket *so)
 	KASSERT(so->so_pcb == NULL);
 }
 
+static int
+sco_ioctl(struct socket *up, struct mbuf *m,
+    struct mbuf *nam, struct mbuf *ctl, struct lwp *l)
+{
+	return EOPNOTSUPP;
+}
+
 /*
  * User Request.
  * up is socket
- * m is either
- *	optional mbuf chain containing message
- *	ioctl command (PRU_CONTROL)
- * nam is either
- *	optional mbuf chain containing an address
- *	ioctl data (PRU_CONTROL)
+ * m is optional mbuf chain containing message
+ * nam is optional mbuf chain containing an address
  * ctl is optional mbuf chain containing socket options
  * l is pointer to process requesting action (if any)
  *
@@ -134,11 +137,9 @@ 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_CONTROL);
 
 	switch(req) {
-	case PRU_CONTROL:
-		return EOPNOTSUPP;
-
 	case PRU_PURGEIF:
 		return EOPNOTSUPP;
 	}
@@ -383,10 +384,12 @@ PR_WRAP_USRREQS(sco)
 
 #define	sco_attach		sco_attach_wrapper
 #define	sco_detach		sco_detach_wrapper
+#define	sco_ioctl		sco_ioctl_wrapper
 #define	sco_usrreq		sco_usrreq_wrapper
 
 const struct pr_usrreqs sco_usrreqs = {
 	.pr_attach	= sco_attach,
 	.pr_detach	= sco_detach,
+	.pr_ioctl	= sco_ioctl,
 	.pr_generic	= sco_usrreq,
 };

Index: src/sys/netinet/raw_ip.c
diff -u src/sys/netinet/raw_ip.c:1.124 src/sys/netinet/raw_ip.c:1.125
--- src/sys/netinet/raw_ip.c:1.124	Fri May 30 01:39:03 2014
+++ src/sys/netinet/raw_ip.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip.c,v 1.124 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: raw_ip.c,v 1.125 2014/06/22 08:10:18 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.124 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip.c,v 1.125 2014/06/22 08:10:18 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -566,6 +566,13 @@ rip_detach(struct socket *so)
 	in_pcbdetach(inp);
 }
 
+static int
+rip_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+	return in_control(so, (long)m, nam, (ifnet_t *)control, l);
+}
+
 int
 rip_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
@@ -575,10 +582,8 @@ rip_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
-	if (req == PRU_CONTROL) {
-		return in_control(so, (long)m, nam, (ifnet_t *)control, l);
-	}
 	s = splsoftnet();
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
@@ -707,11 +712,13 @@ 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_ioctl	rip_ioctl_wrapper
 #define	rip_usrreq	rip_usrreq_wrapper
 
 const struct pr_usrreqs rip_usrreqs = {
 	.pr_attach	= rip_attach,
 	.pr_detach	= rip_detach,
+	.pr_ioctl	= rip_ioctl,
 	.pr_generic	= rip_usrreq,
 };
 

Index: src/sys/netinet/tcp_usrreq.c
diff -u src/sys/netinet/tcp_usrreq.c:1.177 src/sys/netinet/tcp_usrreq.c:1.178
--- src/sys/netinet/tcp_usrreq.c:1.177	Thu May 22 00:28:32 2014
+++ src/sys/netinet/tcp_usrreq.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: tcp_usrreq.c,v 1.177 2014/05/22 00:28:32 rmind Exp $	*/
+/*	$NetBSD: tcp_usrreq.c,v 1.178 2014/06/22 08:10:18 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.177 2014/05/22 00:28:32 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: tcp_usrreq.c,v 1.178 2014/06/22 08:10:18 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_ipsec.h"
@@ -179,26 +179,10 @@ tcp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
 	family = so->so_proto->pr_domain->dom_family;
 
-	if (req == PRU_CONTROL) {
-		switch (family) {
-#ifdef INET
-		case PF_INET:
-			return (in_control(so, (long)m, (void *)nam,
-			    (struct ifnet *)control, l));
-#endif
-#ifdef INET6
-		case PF_INET6:
-			return (in6_control(so, (long)m, (void *)nam,
-			    (struct ifnet *)control, l));
-#endif
-		default:
-			return EAFNOSUPPORT;
-		}
-	}
-
 	s = splsoftnet();
 
 	if (req == PRU_PURGEIF) {
@@ -958,6 +942,26 @@ tcp_detach(struct socket *so)
 	splx(s);
 }
 
+static int
+tcp_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+	switch (so->so_proto->pr_domain->dom_family) {
+#ifdef INET
+	case PF_INET:
+		return (in_control(so, (long)m, (void *)nam,
+		    (struct ifnet *)control, l));
+#endif
+#ifdef INET6
+	case PF_INET6:
+		return (in6_control(so, (long)m, (void *)nam,
+		    (struct ifnet *)control, l));
+#endif
+	default:
+		return EAFNOSUPPORT;
+	}
+}
+
 /*
  * Initiate (or continue) disconnect.
  * If embryonic state, just send reset (once).
@@ -2194,10 +2198,12 @@ tcp_usrreq_init(void)
 PR_WRAP_USRREQS(tcp)
 #define	tcp_attach	tcp_attach_wrapper
 #define	tcp_detach	tcp_detach_wrapper
+#define	tcp_ioctl	tcp_ioctl_wrapper
 #define	tcp_usrreq	tcp_usrreq_wrapper
 
 const struct pr_usrreqs tcp_usrreqs = {
 	.pr_attach	= tcp_attach,
 	.pr_detach	= tcp_detach,
+	.pr_ioctl	= tcp_ioctl,
 	.pr_generic	= tcp_usrreq,
 };

Index: src/sys/netinet/udp_usrreq.c
diff -u src/sys/netinet/udp_usrreq.c:1.199 src/sys/netinet/udp_usrreq.c:1.200
--- src/sys/netinet/udp_usrreq.c:1.199	Fri May 30 01:39:03 2014
+++ src/sys/netinet/udp_usrreq.c	Sun Jun 22 08:10:18 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp_usrreq.c,v 1.199 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: udp_usrreq.c,v 1.200 2014/06/22 08:10:18 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.199 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp_usrreq.c,v 1.200 2014/06/22 08:10:18 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_compat_netbsd.h"
@@ -895,6 +895,14 @@ udp_detach(struct socket *so)
 }
 
 static int
+udp_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+	return in_control(so, (long)m, (void *)nam,
+	    (struct ifnet *)control, l);
+}
+
+static int
 udp_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
     struct mbuf *control, struct lwp *l)
 {
@@ -903,11 +911,8 @@ udp_usrreq(struct socket *so, int req, s
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
-	if (req == PRU_CONTROL) {
-		return in_control(so, (long)m, (void *)nam,
-		    (struct ifnet *)control, l);
-	}
 	s = splsoftnet();
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
@@ -1260,10 +1265,12 @@ 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_ioctl	udp_ioctl_wrapper
 #define	udp_usrreq	udp_usrreq_wrapper
 
 const struct pr_usrreqs udp_usrreqs = {
 	.pr_attach	= udp_attach,
 	.pr_detach	= udp_detach,
+	.pr_ioctl	= udp_ioctl,
 	.pr_generic	= udp_usrreq,
 };

Index: src/sys/netinet6/raw_ip6.c
diff -u src/sys/netinet6/raw_ip6.c:1.118 src/sys/netinet6/raw_ip6.c:1.119
--- src/sys/netinet6/raw_ip6.c:1.118	Fri May 30 01:39:03 2014
+++ src/sys/netinet6/raw_ip6.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: raw_ip6.c,v 1.118 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: raw_ip6.c,v 1.119 2014/06/22 08:10:19 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.118 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_ip6.c,v 1.119 2014/06/22 08:10:19 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -644,6 +644,14 @@ rip6_detach(struct socket *so)
 	in6_pcbdetach(in6p);
 }
 
+static int
+rip6_ioctl(struct socket *so, struct mbuf *m, 
+	struct mbuf *nam, struct mbuf *control, struct lwp *l)
+{
+	return in6_control(so, (u_long)m, (void *)nam,
+	    (struct ifnet *)control, l);
+}
+
 int
 rip6_usrreq(struct socket *so, int req, struct mbuf *m, 
 	struct mbuf *nam, struct mbuf *control, struct lwp *l)
@@ -651,9 +659,7 @@ rip6_usrreq(struct socket *so, int req, 
 	struct in6pcb *in6p = sotoin6pcb(so);
 	int error = 0;
 
-	if (req == PRU_CONTROL)
-		return in6_control(so, (u_long)m, (void *)nam,
-		    (struct ifnet *)control, l);
+	KASSERT(req != PRU_CONTROL);
 
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
@@ -896,10 +902,12 @@ 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_ioctl		rip6_ioctl_wrapper
 #define	rip6_usrreq		rip6_usrreq_wrapper
 
 const struct pr_usrreqs rip6_usrreqs = {
 	.pr_attach	= rip6_attach,
 	.pr_detach	= rip6_detach,
+	.pr_ioctl	= rip6_ioctl,
 	.pr_generic	= rip6_usrreq,
 };

Index: src/sys/netinet6/udp6_usrreq.c
diff -u src/sys/netinet6/udp6_usrreq.c:1.98 src/sys/netinet6/udp6_usrreq.c:1.99
--- src/sys/netinet6/udp6_usrreq.c:1.98	Fri May 30 01:39:03 2014
+++ src/sys/netinet6/udp6_usrreq.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: udp6_usrreq.c,v 1.98 2014/05/30 01:39:03 christos Exp $	*/
+/*	$NetBSD: udp6_usrreq.c,v 1.99 2014/06/22 08:10:19 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.98 2014/05/30 01:39:03 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: udp6_usrreq.c,v 1.99 2014/06/22 08:10:19 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_inet_csum.h"
@@ -677,16 +677,10 @@ udp6_detach(struct socket *so)
 	splx(s);
 }
 
-int
-udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6,
+static int
+udp6_ioctl(struct socket *so, struct mbuf *m, struct mbuf *addr6,
     struct mbuf *control, struct lwp *l)
 {
-	struct in6pcb *in6p = sotoin6pcb(so);
-	int s, error = 0;
-
-	KASSERT(req != PRU_ATTACH);
-	KASSERT(req != PRU_DETACH);
-
 	/*
 	 * MAPPED_ADDR implementation info:
 	 *  Mapped addr support for PRU_CONTROL is not necessary.
@@ -697,10 +691,21 @@ udp6_usrreq(struct socket *so, int req, 
 	 *  So AF_INET socket need to be used to control AF_INET addrs,
 	 *  and AF_INET6 socket for AF_INET6 addrs.
 	 */
-	if (req == PRU_CONTROL) {
-		return in6_control(so, (u_long)m, (void *)addr6,
-				   (struct ifnet *)control, l);
-	}
+	return in6_control(so, (u_long)m, (void *)addr6,
+			   (struct ifnet *)control, l);
+}
+
+int
+udp6_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *addr6,
+    struct mbuf *control, struct lwp *l)
+{
+	struct in6pcb *in6p = sotoin6pcb(so);
+	int s, error = 0;
+
+	KASSERT(req != PRU_ATTACH);
+	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
+
 	if (req == PRU_PURGEIF) {
 		mutex_enter(softnet_lock);
 		in6_pcbpurgeif0(&udbtable, (struct ifnet *)control);
@@ -874,10 +879,12 @@ udp6_statinc(u_int stat)
 PR_WRAP_USRREQS(udp6)
 #define	udp6_attach	udp6_attach_wrapper
 #define	udp6_detach	udp6_detach_wrapper
+#define	udp6_ioctl	udp6_ioctl_wrapper
 #define	udp6_usrreq	udp6_usrreq_wrapper
 
 const struct pr_usrreqs udp6_usrreqs = {
 	.pr_attach	= udp6_attach,
 	.pr_detach	= udp6_detach,
+	.pr_ioctl	= udp6_ioctl,
 	.pr_generic	= udp6_usrreq,
 };

Index: src/sys/netipsec/keysock.c
diff -u src/sys/netipsec/keysock.c:1.27 src/sys/netipsec/keysock.c:1.28
--- src/sys/netipsec/keysock.c:1.27	Thu Jun  5 17:17:26 2014
+++ src/sys/netipsec/keysock.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: keysock.c,v 1.27 2014/06/05 17:17:26 christos Exp $	*/
+/*	$NetBSD: keysock.c,v 1.28 2014/06/22 08:10:19 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.27 2014/06/05 17:17:26 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: keysock.c,v 1.28 2014/06/22 08:10:19 rtr Exp $");
 
 #include "opt_ipsec.h"
 
@@ -484,6 +484,13 @@ key_detach(struct socket *so)
 	splx(s);
 }
 
+static int
+key_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+	return EOPNOTSUPP;
+}
+
 /*
  * key_usrreq()
  * derived from net/rtsock.c:route_usrreq()
@@ -496,6 +503,7 @@ key_usrreq(struct socket *so, int req,st
 
 	KASSERT(req != PRU_ATTACH);
 	KASSERT(req != PRU_DETACH);
+	KASSERT(req != PRU_CONTROL);
 
 	s = splsoftnet();
 	error = raw_usrreq(so, req, m, nam, control, l);
@@ -514,11 +522,13 @@ DOMAIN_DEFINE(keydomain);
 PR_WRAP_USRREQS(key)
 #define	key_attach	key_attach_wrapper
 #define	key_detach	key_detach_wrapper
+#define	key_ioctl	key_ioctl_wrapper
 #define	key_usrreq	key_usrreq_wrapper
 
 const struct pr_usrreqs key_usrreqs = {
 	.pr_attach	= key_attach,
 	.pr_detach	= key_detach,
+	.pr_ioctl	= key_ioctl,
 	.pr_generic	= key_usrreq,
 };
 

Index: src/sys/netmpls/mpls_proto.c
diff -u src/sys/netmpls/mpls_proto.c:1.9 src/sys/netmpls/mpls_proto.c:1.10
--- src/sys/netmpls/mpls_proto.c:1.9	Tue May 20 19:04:00 2014
+++ src/sys/netmpls/mpls_proto.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: mpls_proto.c,v 1.9 2014/05/20 19:04:00 rmind Exp $ */
+/*	$NetBSD: mpls_proto.c,v 1.10 2014/06/22 08:10:19 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.9 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: mpls_proto.c,v 1.10 2014/06/22 08:10:19 rtr Exp $");
 
 #include "opt_inet.h"
 #include "opt_mbuftrace.h"
@@ -95,6 +95,13 @@ mpls_detach(struct socket *so)
 }
 
 static int
+mpls_ioctl(struct socket *so, struct mbuf *m,
+    struct mbuf *nam, struct mbuf *control, struct lwp *l)
+{
+	return EOPNOTSUPP;
+}
+
+static int
 mpls_usrreq(struct socket *so, int req, struct mbuf *m,
     struct mbuf *nam, struct mbuf *control, struct lwp *l)
 {
@@ -185,11 +192,13 @@ DOMAIN_DEFINE(mplsdomain);
 PR_WRAP_USRREQS(mpls)
 #define	mpls_attach	mpls_attach_wrapper
 #define	mpls_detach	mpls_detach_wrapper
+#define	mpls_ioctl	mpls_ioctl_wrapper
 #define	mpls_usrreq	mpls_usrreq_wrapper
 
 static const struct pr_usrreqs mpls_usrreqs = {
 	.pr_attach	= mpls_attach,
 	.pr_detach	= mpls_detach,
+	.pr_ioctl	= mpls_ioctl,
 	.pr_generic	= mpls_usrreq,
 };
 

Index: src/sys/netnatm/natm.c
diff -u src/sys/netnatm/natm.c:1.27 src/sys/netnatm/natm.c:1.28
--- src/sys/netnatm/natm.c:1.27	Tue May 20 19:04:00 2014
+++ src/sys/netnatm/natm.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: natm.c,v 1.27 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: natm.c,v 1.28 2014/06/22 08:10:19 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.27 2014/05/20 19:04:00 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: natm.c,v 1.28 2014/06/22 08:10:19 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -95,6 +95,43 @@ natm_detach(struct socket *so)
 	mutex_enter(softnet_lock);
 }
 
+static int
+natm_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+    struct mbuf *control, struct lwp *l)
+{
+  int error = 0;
+
+  s = SPLSOFTNET();
+
+  /*
+   * raw atm ioctl.   comes in as a SIOCRAWATM.   we convert it to
+   * SIOCXRAWATM and pass it to the driver.
+   */
+  if ((u_long)m == SIOCRAWATM) {
+    if (npcb->npcb_ifp == NULL) {
+      error = ENOTCONN;
+      goto done;
+    }
+    ario.npcb = npcb;
+    ario.rawvalue = *((int *)nam);
+    error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, &ario);
+    if (!error) {
+      if (ario.rawvalue)
+	npcb->npcb_flags |= NPCB_RAW;
+      else
+	npcb->npcb_flags &= ~(NPCB_RAW);
+    }
+
+    goto done;
+  }
+
+  error = EOPNOTSUPP;
+
+done:
+  splx(s);
+  return(error);
+}
+
 /*
  * user requests
  */
@@ -114,6 +151,7 @@ natm_usrreq(struct socket *so, int req, 
 
   KASSERT(req != PRU_ATTACH);
   KASSERT(req != PRU_DETACH);
+  KASSERT(req != PRU_CONTROL);
 
   s = SPLSOFTNET();
 
@@ -264,32 +302,6 @@ natm_usrreq(struct socket *so, int req, 
       snatm->snatm_vpi = npcb->npcb_vpi;
       break;
 
-    case PRU_CONTROL:			/* control operations on protocol */
-      /*
-       * raw atm ioctl.   comes in as a SIOCRAWATM.   we convert it to
-       * SIOCXRAWATM and pass it to the driver.
-       */
-      if ((u_long)m == SIOCRAWATM) {
-        if (npcb->npcb_ifp == NULL) {
-          error = ENOTCONN;
-          break;
-        }
-        ario.npcb = npcb;
-        ario.rawvalue = *((int *)nam);
-        error = npcb->npcb_ifp->if_ioctl(npcb->npcb_ifp, SIOCXRAWATM, &ario);
-	if (!error) {
-          if (ario.rawvalue)
-	    npcb->npcb_flags |= NPCB_RAW;
-	  else
-	    npcb->npcb_flags &= ~(NPCB_RAW);
-	}
-
-        break;
-      }
-
-      error = EOPNOTSUPP;
-      break;
-
     case PRU_BIND:			/* bind socket to address */
     case PRU_LISTEN:			/* listen for connection */
     case PRU_ACCEPT:			/* accept connection from peer */
@@ -399,10 +411,12 @@ 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_ioctl	natm_ioctl_wrapper
 #define	natm_usrreq	natm_usrreq_wrapper
 
 const struct pr_usrreqs natm_usrreqs = {
 	.pr_attach	= natm_attach,
 	.pr_detach	= natm_detach,
+	.pr_ioctl	= natm_ioctl,
 	.pr_generic	= natm_usrreq,
 };

Index: src/sys/rump/net/lib/libsockin/sockin.c
diff -u src/sys/rump/net/lib/libsockin/sockin.c:1.40 src/sys/rump/net/lib/libsockin/sockin.c:1.41
--- src/sys/rump/net/lib/libsockin/sockin.c:1.40	Mon May 19 02:51:25 2014
+++ src/sys/rump/net/lib/libsockin/sockin.c	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: sockin.c,v 1.40 2014/05/19 02:51:25 rmind Exp $	*/
+/*	$NetBSD: sockin.c,v 1.41 2014/06/22 08:10:19 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.40 2014/05/19 02:51:25 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sockin.c,v 1.41 2014/06/22 08:10:19 rtr Exp $");
 
 #include <sys/param.h>
 #include <sys/condvar.h>
@@ -68,6 +68,8 @@ 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_ioctl(struct socket *, struct mbuf *, struct mbuf *,
+			     struct mbuf *control, struct lwp *);
 static int	sockin_usrreq(struct socket *, int, struct mbuf *,
 			      struct mbuf *, struct mbuf *, struct lwp *);
 static int	sockin_ctloutput(int op, struct socket *, struct sockopt *);
@@ -75,6 +77,7 @@ static int	sockin_ctloutput(int op, stru
 static const struct pr_usrreqs sockin_usrreqs = {
 	.pr_attach = sockin_attach,
 	.pr_detach = sockin_detach,
+	.pr_ioctl = sockin_ioctl,
 	.pr_generic = sockin_usrreq,
 };
 
@@ -450,11 +453,20 @@ sockin_detach(struct socket *so)
 }
 
 static int
+sockin_ioctl(struct socket *so, struct mbuf *m, struct mbuf *nam,
+	struct mbuf *control, struct lwp *l)
+{
+	return ENOTTY;
+}
+
+static int
 sockin_usrreq(struct socket *so, int req, struct mbuf *m, struct mbuf *nam,
 	struct mbuf *control, struct lwp *l)
 {
 	int error = 0;
 
+	KASSERT(req != PRU_CONTROL);
+
 	switch (req) {
 	case PRU_ACCEPT:
 		/* we do all the work in the worker thread */
@@ -554,10 +566,6 @@ sockin_usrreq(struct socket *so, int req
 		break;
 	}
 
-	case PRU_CONTROL:
-		error = ENOTTY;
-		break;
-
 	default:
 		panic("sockin_usrreq: IMPLEMENT ME, req %d not supported", req);
 	}

Index: src/sys/sys/protosw.h
diff -u src/sys/sys/protosw.h:1.47 src/sys/sys/protosw.h:1.48
--- src/sys/sys/protosw.h:1.47	Tue May 20 19:04:00 2014
+++ src/sys/sys/protosw.h	Sun Jun 22 08:10:19 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: protosw.h,v 1.47 2014/05/20 19:04:00 rmind Exp $	*/
+/*	$NetBSD: protosw.h,v 1.48 2014/06/22 08:10:19 rtr Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1993
@@ -236,6 +236,8 @@ static const char * const prcorequests[]
 struct pr_usrreqs {
 	int	(*pr_attach)(struct socket *, int);
 	void	(*pr_detach)(struct socket *);
+	int	(*pr_ioctl)(struct socket *, struct mbuf *,
+	    struct mbuf *, struct mbuf *, struct lwp *);
 	int	(*pr_generic)(struct socket *, int, struct mbuf *,
 	    struct mbuf *, struct mbuf *, struct lwp *);
 };
@@ -288,6 +290,17 @@ name##_detach_wrapper(struct socket *a)	
 	KERNEL_UNLOCK_ONE(NULL);			\
 }							\
 static int						\
+name##_ioctl_wrapper(struct socket *a,			\
+    struct mbuf *b, struct mbuf *c, struct mbuf *d,	\
+    struct lwp *e)					\
+{							\
+	int rv;						\
+	KERNEL_LOCK(1, NULL);				\
+	rv = name##_ioctl(a, b, c, d, e);		\
+	KERNEL_UNLOCK_ONE(NULL);			\
+	return rv;					\
+}							\
+static int						\
 name##_usrreq_wrapper(struct socket *a, int b,		\
     struct mbuf *c, struct mbuf *d, struct mbuf *e,	\
     struct lwp *f)					\

Reply via email to