Module Name:    src
Committed By:   knakahara
Date:           Thu Apr 28 01:37:17 UTC 2016

Modified Files:
        src/sys/dev/usb: if_upl.c
        src/sys/net: if.c if.h if_bridge.c if_ieee1394subr.c if_loop.c
            if_vlan.c
        src/sys/netipsec: ipsec_osdep.h

Log Message:
introduce new ifnet MP-scalable sending interface "if_transmit".


To generate a diff of this commit:
cvs rdiff -u -r1.52 -r1.53 src/sys/dev/usb/if_upl.c
cvs rdiff -u -r1.331 -r1.332 src/sys/net/if.c
cvs rdiff -u -r1.202 -r1.203 src/sys/net/if.h
cvs rdiff -u -r1.120 -r1.121 src/sys/net/if_bridge.c
cvs rdiff -u -r1.54 -r1.55 src/sys/net/if_ieee1394subr.c
cvs rdiff -u -r1.85 -r1.86 src/sys/net/if_loop.c
cvs rdiff -u -r1.86 -r1.87 src/sys/net/if_vlan.c
cvs rdiff -u -r1.24 -r1.25 src/sys/netipsec/ipsec_osdep.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/usb/if_upl.c
diff -u src/sys/dev/usb/if_upl.c:1.52 src/sys/dev/usb/if_upl.c:1.53
--- src/sys/dev/usb/if_upl.c:1.52	Thu Apr 28 00:16:56 2016
+++ src/sys/dev/usb/if_upl.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_upl.c,v 1.52 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if_upl.c,v 1.53 2016/04/28 01:37:17 knakahara Exp $	*/
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.52 2016/04/28 00:16:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_upl.c,v 1.53 2016/04/28 01:37:17 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -987,7 +987,7 @@ Static int
 upl_output(struct ifnet *ifp, struct mbuf *m, const struct sockaddr *dst,
     const struct rtentry *rt0)
 {
-	int s, len, error;
+	int error;
 
 	DPRINTFN(10,("%s: %s: enter\n",
 		     device_xname(((struct upl_softc *)ifp->if_softc)->sc_dev),
@@ -999,24 +999,13 @@ upl_output(struct ifnet *ifp, struct mbu
 	 */
 	IFQ_CLASSIFY(&ifp->if_snd, m, dst->sa_family);
 
-	len = m->m_pkthdr.len;
-	s = splnet();
 	/*
 	 * Queue message on interface, and start output if interface
 	 * not yet active.
 	 */
-	IFQ_ENQUEUE(&ifp->if_snd, m, error);
-	if (error) {
-		/* mbuf is already freed */
-		splx(s);
-		return error;
-	}
-	ifp->if_obytes += len;
-	if ((ifp->if_flags & IFF_OACTIVE) == 0)
-		(*ifp->if_start)(ifp);
-	splx(s);
+	error = (*ifp->if_transmit)(ifp, m);
 
-	return 0;
+	return error;
 }
 
 Static void

Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.331 src/sys/net/if.c:1.332
--- src/sys/net/if.c:1.331	Thu Apr 28 00:16:56 2016
+++ src/sys/net/if.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.c,v 1.331 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if.c,v 1.332 2016/04/28 01:37:17 knakahara 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.331 2016/04/28 00:16:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.332 2016/04/28 01:37:17 knakahara Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -329,6 +329,13 @@ if_nullstart(struct ifnet *ifp)
 }
 
 int
+if_nulltransmit(struct ifnet *ifp, struct mbuf *m)
+{
+
+	return ENXIO;
+}
+
+int
 if_nullioctl(struct ifnet *ifp, u_long cmd, void *data)
 {
 
@@ -665,6 +672,9 @@ if_register(ifnet_t *ifp)
 		if_slowtimo(ifp);
 	}
 
+	if (ifp->if_transmit == NULL || ifp->if_transmit == if_nulltransmit)
+		ifp->if_transmit = if_transmit;
+
 	TAILQ_INSERT_TAIL(&ifnet_list, ifp, if_list);
 }
 
@@ -959,6 +969,7 @@ if_deactivate(struct ifnet *ifp)
 	ifp->if_output	 = if_nulloutput;
 	ifp->_if_input	 = if_nullinput;
 	ifp->if_start	 = if_nullstart;
+	ifp->if_transmit = if_nulltransmit;
 	ifp->if_ioctl	 = if_nullioctl;
 	ifp->if_init	 = if_nullinit;
 	ifp->if_stop	 = if_nullstop;
@@ -2667,31 +2678,45 @@ ifreq_setaddr(u_long cmd, struct ifreq *
 }
 
 /*
- * Queue message on interface, and start output if interface
- * not yet active.
+ * wrapper function for the drivers which doesn't have if_transmit().
  */
 int
-ifq_enqueue(struct ifnet *ifp, struct mbuf *m)
+if_transmit(struct ifnet *ifp, struct mbuf *m)
 {
-	int len = m->m_pkthdr.len;
-	int mflags = m->m_flags;
-	int s = splnet();
-	int error;
+	int s, error;
+
+	s = splnet();
 
 	IFQ_ENQUEUE(&ifp->if_snd, m, error);
-	if (error != 0)
+	if (error != 0) {
+		/* mbuf is already freed */
 		goto out;
-	ifp->if_obytes += len;
-	if (mflags & M_MCAST)
+	}
+
+	ifp->if_obytes += m->m_pkthdr.len;;
+	if (m->m_flags & M_MCAST)
 		ifp->if_omcasts++;
+
 	if ((ifp->if_flags & IFF_OACTIVE) == 0)
 		(*ifp->if_start)(ifp);
 out:
 	splx(s);
+
 	return error;
 }
 
 /*
+ * Queue message on interface, and start output if interface
+ * not yet active.
+ */
+int
+ifq_enqueue(struct ifnet *ifp, struct mbuf *m)
+{
+
+	return (*ifp->if_transmit)(ifp, m);
+}
+
+/*
  * Queue message on interface, possibly using a second fast queue
  */
 int

Index: src/sys/net/if.h
diff -u src/sys/net/if.h:1.202 src/sys/net/if.h:1.203
--- src/sys/net/if.h:1.202	Thu Apr 28 00:16:56 2016
+++ src/sys/net/if.h	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if.h,v 1.202 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if.h,v 1.203 2016/04/28 01:37:17 knakahara Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc.
@@ -272,6 +272,8 @@ typedef struct ifnet {
 		    (struct ifnet *, struct mbuf *);
 	void	(*if_start)		/* initiate output routine */
 		    (struct ifnet *);
+	int	(*if_transmit)		/* output routine (direct) */
+		    (struct ifnet *, struct mbuf *);
 	int	(*if_ioctl)		/* ioctl routine */
 		    (struct ifnet *, u_long, void *);
 	int	(*if_init)		/* init routine */
@@ -939,6 +941,8 @@ void	p2p_rtrequest(int, struct rtentry *
 void	if_clone_attach(struct if_clone *);
 void	if_clone_detach(struct if_clone *);
 
+int	if_transmit(struct ifnet *, struct mbuf *);
+
 int	ifq_enqueue(struct ifnet *, struct mbuf *);
 int	ifq_enqueue2(struct ifnet *, struct ifqueue *, struct mbuf *);
 
@@ -956,6 +960,7 @@ int	if_nulloutput(struct ifnet *, struct
 	    const struct sockaddr *, const struct rtentry *);
 void	if_nullinput(struct ifnet *, struct mbuf *);
 void	if_nullstart(struct ifnet *);
+int	if_nulltransmit(struct ifnet *, struct mbuf *);
 int	if_nullioctl(struct ifnet *, u_long, void *);
 int	if_nullinit(struct ifnet *);
 void	if_nullstop(struct ifnet *, int);

Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.120 src/sys/net/if_bridge.c:1.121
--- src/sys/net/if_bridge.c:1.120	Thu Apr 28 00:16:56 2016
+++ src/sys/net/if_bridge.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_bridge.c,v 1.120 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if_bridge.c,v 1.121 2016/04/28 01:37:17 knakahara Exp $	*/
 
 /*
  * Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.120 2016/04/28 00:16:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.121 2016/04/28 01:37:17 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bridge_ipf.h"
@@ -1381,8 +1381,7 @@ bridge_enqueue(struct bridge_softc *sc, 
 	len = m->m_pkthdr.len;
 	mflags = m->m_flags;
 
-	IFQ_ENQUEUE(&dst_ifp->if_snd, m, error);
-
+	error = (*dst_ifp->if_transmit)(dst_ifp, m);
 	if (error) {
 		/* mbuf is already freed */
 		sc->sc_if.if_oerrors++;
@@ -1391,16 +1390,8 @@ bridge_enqueue(struct bridge_softc *sc, 
 
 	sc->sc_if.if_opackets++;
 	sc->sc_if.if_obytes += len;
-
-	dst_ifp->if_obytes += len;
-
-	if (mflags & M_MCAST) {
+	if (mflags & M_MCAST)
 		sc->sc_if.if_omcasts++;
-		dst_ifp->if_omcasts++;
-	}
-
-	if ((dst_ifp->if_flags & IFF_OACTIVE) == 0)
-		(*dst_ifp->if_start)(dst_ifp);
 }
 
 /*

Index: src/sys/net/if_ieee1394subr.c
diff -u src/sys/net/if_ieee1394subr.c:1.54 src/sys/net/if_ieee1394subr.c:1.55
--- src/sys/net/if_ieee1394subr.c:1.54	Thu Apr 28 00:16:56 2016
+++ src/sys/net/if_ieee1394subr.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ieee1394subr.c,v 1.54 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if_ieee1394subr.c,v 1.55 2016/04/28 01:37:17 knakahara Exp $	*/
 
 /*
  * Copyright (c) 2000 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.54 2016/04/28 00:16:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ieee1394subr.c,v 1.55 2016/04/28 01:37:17 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -88,7 +88,7 @@ ieee1394_output(struct ifnet *ifp, struc
 {
 	uint16_t etype = 0;
 	struct mbuf *m;
-	int s, hdrlen, error = 0;
+	int hdrlen, error = 0;
 	struct mbuf *mcopy = NULL;
 	struct ieee1394_hwaddr *hwdst, baddr;
 	const struct ieee1394_hwaddr *myaddr;
@@ -218,26 +218,15 @@ ieee1394_output(struct ifnet *ifp, struc
 	if (m0 == NULL)
 		senderr(ENOBUFS);
 
-	s = splnet();
-	ifp->if_obytes += m0->m_pkthdr.len;
-	if (m0->m_flags & M_MCAST)
-		ifp->if_omcasts++;
 	while ((m = m0) != NULL) {
 		m0 = m->m_nextpkt;
-		if (m == NULL) {
-			splx(s);
-			senderr(ENOBUFS);
-		}
-		IFQ_ENQUEUE(&ifp->if_snd, m, error);
+
+		error = (*ifp->if_transmit)(ifp, m);
 		if (error) {
 			/* mbuf is already freed */
-			splx(s);
 			goto bad;
 		}
 	}
-	if ((ifp->if_flags & IFF_OACTIVE) == 0)
-		(*ifp->if_start)(ifp);
-	splx(s);
 	return 0;
 
   bad:

Index: src/sys/net/if_loop.c
diff -u src/sys/net/if_loop.c:1.85 src/sys/net/if_loop.c:1.86
--- src/sys/net/if_loop.c:1.85	Thu Apr 28 00:16:56 2016
+++ src/sys/net/if_loop.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_loop.c,v 1.85 2016/04/28 00:16:56 ozaki-r Exp $	*/
+/*	$NetBSD: if_loop.c,v 1.86 2016/04/28 01:37:17 knakahara Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -65,7 +65,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.85 2016/04/28 00:16:56 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.86 2016/04/28 01:37:17 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -254,10 +254,7 @@ looutput(struct ifnet *ifp, struct mbuf 
 			return (ENOBUFS);
 		*(mtod(m, uint32_t *)) = dst->sa_family;
 
-		s = splnet();
-		IFQ_ENQUEUE(&ifp->if_snd, m, error);
-		(*ifp->if_start)(ifp);
-		splx(s);
+		error = ifp->if_transmit(ifp, m);
 		return (error);
 	}
 #endif /* ALTQ */

Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.86 src/sys/net/if_vlan.c:1.87
--- src/sys/net/if_vlan.c:1.86	Wed Apr 20 09:01:04 2016
+++ src/sys/net/if_vlan.c	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_vlan.c,v 1.86 2016/04/20 09:01:04 knakahara Exp $	*/
+/*	$NetBSD: if_vlan.c,v 1.87 2016/04/28 01:37:17 knakahara Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2001 The NetBSD Foundation, Inc.
@@ -78,7 +78,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.86 2016/04/20 09:01:04 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.87 2016/04/28 01:37:17 knakahara Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -807,20 +807,16 @@ vlan_start(struct ifnet *ifp)
 		 * Send it, precisely as the parent's output routine
 		 * would have.  We are already running at splnet.
 		 */
-		IFQ_ENQUEUE(&p->if_snd, m, error);
-		if (error) {
-			/* mbuf is already freed */
-			ifp->if_oerrors++;
-			continue;
+		if ((p->if_flags & IFF_RUNNING) != 0) {
+			error = (*p->if_transmit)(p, m);
+			if (error) {
+				/* mbuf is already freed */
+				ifp->if_oerrors++;
+				continue;
+			}
 		}
 
 		ifp->if_opackets++;
-
-		p->if_obytes += m->m_pkthdr.len;
-		if (m->m_flags & M_MCAST)
-			p->if_omcasts++;
-		if ((p->if_flags & (IFF_RUNNING|IFF_OACTIVE)) == IFF_RUNNING)
-			(*p->if_start)(p);
 	}
 
 	ifp->if_flags &= ~IFF_OACTIVE;

Index: src/sys/netipsec/ipsec_osdep.h
diff -u src/sys/netipsec/ipsec_osdep.h:1.24 src/sys/netipsec/ipsec_osdep.h:1.25
--- src/sys/netipsec/ipsec_osdep.h:1.24	Thu May  9 19:21:50 2013
+++ src/sys/netipsec/ipsec_osdep.h	Thu Apr 28 01:37:17 2016
@@ -1,4 +1,4 @@
-/*	$NetBSD: ipsec_osdep.h,v 1.24 2013/05/09 19:21:50 gdt Exp $	*/
+/*	$NetBSD: ipsec_osdep.h,v 1.25 2016/04/28 01:37:17 knakahara Exp $	*/
 /*	$FreeBSD: /repoman/r/ncvs/src/sys/netipsec/ipsec_osdep.h,v 1.1 2003/09/29 22:47:45 sam Exp $	*/
 
 /*
@@ -141,7 +141,6 @@ read_random(void *bufp, u_int len)
 static __inline int
 if_handoff(struct ifqueue *ifq, struct mbuf *m, struct ifnet *ifp, int adjust)
 {
-	int need_if_start = 0;
 	int s = splnet();
 
 	KERNEL_LOCK(1, NULL);
@@ -152,15 +151,9 @@ if_handoff(struct ifqueue *ifq, struct m
 		m_freem(m);
 		return (0);
 	}
-	if (ifp != NULL) {
-		ifp->if_obytes += m->m_pkthdr.len + adjust;
-		if (m->m_flags & M_MCAST)
-			ifp->if_omcasts++;
-		need_if_start = !(ifp->if_flags & IFF_OACTIVE);
-	}
-	IF_ENQUEUE(ifq, m);
-	if (need_if_start)
-		(*ifp->if_start)(ifp);
+	if (ifp != NULL)
+		(void)(*ifp->if_transmit)(ifp, m);
+
 	KERNEL_UNLOCK_ONE(NULL);
 	splx(s);
 	return (1);

Reply via email to