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);