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