Module Name: src
Committed By: ozaki-r
Date: Wed Dec 6 07:40:16 UTC 2017
Modified Files:
src/sys/net: if_bridge.c if_etherip.c if_faith.c if_loop.c if_tun.c
if_vlan.c
src/sys/net/agr: if_agr.c
src/sys/netcan: if_canloop.c
Log Message:
Ensure to not turn on IFF_RUNNING of an interface until its initialization
completes
And ensure to turn off it before destruction as per IFF_RUNNING's description
"resource allocated". (The description is a bit doubtful though, I believe the
change is still proper.)
To generate a diff of this commit:
cvs rdiff -u -r1.142 -r1.143 src/sys/net/if_bridge.c
cvs rdiff -u -r1.39 -r1.40 src/sys/net/if_etherip.c
cvs rdiff -u -r1.56 -r1.57 src/sys/net/if_faith.c
cvs rdiff -u -r1.99 -r1.100 src/sys/net/if_loop.c
cvs rdiff -u -r1.141 -r1.142 src/sys/net/if_tun.c
cvs rdiff -u -r1.115 -r1.116 src/sys/net/if_vlan.c
cvs rdiff -u -r1.42 -r1.43 src/sys/net/agr/if_agr.c
cvs rdiff -u -r1.3 -r1.4 src/sys/netcan/if_canloop.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/if_bridge.c
diff -u src/sys/net/if_bridge.c:1.142 src/sys/net/if_bridge.c:1.143
--- src/sys/net/if_bridge.c:1.142 Wed Dec 6 05:11:10 2017
+++ src/sys/net/if_bridge.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_bridge.c,v 1.142 2017/12/06 05:11:10 ozaki-r Exp $ */
+/* $NetBSD: if_bridge.c,v 1.143 2017/12/06 07:40:16 ozaki-r Exp $ */
/*
* Copyright 2001 Wasabi Systems, Inc.
@@ -80,7 +80,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.142 2017/12/06 05:11:10 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_bridge.c,v 1.143 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_bridge_ipf.h"
@@ -1328,14 +1328,13 @@ bridge_init(struct ifnet *ifp)
{
struct bridge_softc *sc = ifp->if_softc;
- if (ifp->if_flags & IFF_RUNNING)
- return 0;
+ KASSERT((ifp->if_flags & IFF_RUNNING) == 0);
callout_reset(&sc->sc_brcallout, bridge_rtable_prune_period * hz,
bridge_timer, sc);
+ bstp_initialization(sc);
ifp->if_flags |= IFF_RUNNING;
- bstp_initialization(sc);
return 0;
}
@@ -1349,15 +1348,12 @@ bridge_stop(struct ifnet *ifp, int disab
{
struct bridge_softc *sc = ifp->if_softc;
- if ((ifp->if_flags & IFF_RUNNING) == 0)
- return;
+ KASSERT((ifp->if_flags & IFF_RUNNING) != 0);
+ ifp->if_flags &= ~IFF_RUNNING;
callout_stop(&sc->sc_brcallout);
bstp_stop(sc);
-
bridge_rtflush(sc, IFBF_FLUSHDYN);
-
- ifp->if_flags &= ~IFF_RUNNING;
}
/*
Index: src/sys/net/if_etherip.c
diff -u src/sys/net/if_etherip.c:1.39 src/sys/net/if_etherip.c:1.40
--- src/sys/net/if_etherip.c:1.39 Mon Oct 23 09:31:18 2017
+++ src/sys/net/if_etherip.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_etherip.c,v 1.39 2017/10/23 09:31:18 msaitoh Exp $ */
+/* $NetBSD: if_etherip.c,v 1.40 2017/12/06 07:40:16 ozaki-r Exp $ */
/*
* Copyright (c) 2006, Hans Rosenfeld <[email protected]>
@@ -86,7 +86,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.39 2017/10/23 09:31:18 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_etherip.c,v 1.40 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -549,12 +549,11 @@ etherip_set_tunnel(struct ifnet *ifp,
if (odst)
sockaddr_free(odst);
- ifp->if_flags |= IFF_RUNNING;
-
sc->sc_si = softint_establish(SOFTINT_NET, etheripintr, sc);
if (sc->sc_si == NULL)
error = ENOMEM;
+ ifp->if_flags |= IFF_RUNNING;
out:
splx(s);
@@ -569,6 +568,8 @@ etherip_delete_tunnel(struct ifnet *ifp)
s = splsoftnet();
+ ifp->if_flags &= ~IFF_RUNNING;
+
if (sc->sc_si) {
softint_disestablish(sc->sc_si);
sc->sc_si = NULL;
@@ -583,7 +584,6 @@ etherip_delete_tunnel(struct ifnet *ifp)
sc->sc_dst = NULL;
}
- ifp->if_flags &= ~IFF_RUNNING;
splx(s);
}
Index: src/sys/net/if_faith.c
diff -u src/sys/net/if_faith.c:1.56 src/sys/net/if_faith.c:1.57
--- src/sys/net/if_faith.c:1.56 Mon Oct 23 09:32:00 2017
+++ src/sys/net/if_faith.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_faith.c,v 1.56 2017/10/23 09:32:00 msaitoh Exp $ */
+/* $NetBSD: if_faith.c,v 1.57 2017/12/06 07:40:16 ozaki-r Exp $ */
/* $KAME: if_faith.c,v 1.21 2001/02/20 07:59:26 itojun Exp $ */
/*
@@ -40,7 +40,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.56 2017/10/23 09:32:00 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_faith.c,v 1.57 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -263,9 +263,9 @@ faithioctl(struct ifnet *ifp, u_long cmd
switch (cmd) {
case SIOCINITIFADDR:
- ifp->if_flags |= IFF_UP | IFF_RUNNING;
ifa = (struct ifaddr *)data;
ifa->ifa_rtrequest = faithrtrequest;
+ ifp->if_flags |= IFF_UP | IFF_RUNNING;
/*
* Everything else is done at a higher level.
*/
Index: src/sys/net/if_loop.c
diff -u src/sys/net/if_loop.c:1.99 src/sys/net/if_loop.c:1.100
--- src/sys/net/if_loop.c:1.99 Fri Nov 17 07:37:12 2017
+++ src/sys/net/if_loop.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_loop.c,v 1.99 2017/11/17 07:37:12 ozaki-r Exp $ */
+/* $NetBSD: if_loop.c,v 1.100 2017/12/06 07:40:16 ozaki-r 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.99 2017/11/17 07:37:12 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_loop.c,v 1.100 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -182,7 +182,7 @@ loop_clone_create(struct if_clone *ifc,
if_initname(ifp, ifc->ifc_name, unit);
ifp->if_mtu = LOMTU;
- ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST | IFF_RUNNING;
+ ifp->if_flags = IFF_LOOPBACK | IFF_MULTICAST;
ifp->if_extflags = IFEF_MPSAFE;
ifp->if_ioctl = loioctl;
ifp->if_output = looutput;
@@ -211,6 +211,8 @@ loop_clone_create(struct if_clone *ifc,
MOWNER_ATTACH(ifp->if_mowner);
#endif
+ ifp->if_flags |= IFF_RUNNING;
+
return (0);
}
@@ -221,6 +223,8 @@ loop_clone_destroy(struct ifnet *ifp)
if (ifp == lo0ifp)
return (EPERM);
+ ifp->if_flags &= ~IFF_RUNNING;
+
#ifdef MBUFTRACE
MOWNER_DETACH(ifp->if_mowner);
free(ifp->if_mowner, M_DEVBUF);
Index: src/sys/net/if_tun.c
diff -u src/sys/net/if_tun.c:1.141 src/sys/net/if_tun.c:1.142
--- src/sys/net/if_tun.c:1.141 Mon Oct 30 16:01:19 2017
+++ src/sys/net/if_tun.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_tun.c,v 1.141 2017/10/30 16:01:19 ozaki-r Exp $ */
+/* $NetBSD: if_tun.c,v 1.142 2017/12/06 07:40:16 ozaki-r Exp $ */
/*
* Copyright (c) 1988, Julian Onions <[email protected]>
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_tun.c,v 1.141 2017/10/30 16:01:19 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_tun.c,v 1.142 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -421,8 +421,6 @@ tun_enable(struct tun_softc *tp, const s
TUNDEBUG("%s: %s\n", __func__, ifp->if_xname);
mutex_enter(&tp->tun_lock);
- ifp->if_flags |= IFF_UP | IFF_RUNNING;
-
tp->tun_flags &= ~(TUN_IASET|TUN_DSTADDR);
switch (ifa->ifa_addr->sa_family) {
@@ -462,6 +460,7 @@ tun_enable(struct tun_softc *tp, const s
default:
break;
}
+ ifp->if_flags |= IFF_UP | IFF_RUNNING;
mutex_exit(&tp->tun_lock);
}
Index: src/sys/net/if_vlan.c
diff -u src/sys/net/if_vlan.c:1.115 src/sys/net/if_vlan.c:1.116
--- src/sys/net/if_vlan.c:1.115 Wed Dec 6 05:59:59 2017
+++ src/sys/net/if_vlan.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vlan.c,v 1.115 2017/12/06 05:59:59 ozaki-r Exp $ */
+/* $NetBSD: if_vlan.c,v 1.116 2017/12/06 07:40:16 ozaki-r 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.115 2017/12/06 05:59:59 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vlan.c,v 1.116 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -584,6 +584,8 @@ vlan_unconfig_locked(struct ifvlan *ifv,
KASSERT(mutex_owned(ifp->if_ioctl_lock));
KASSERT(mutex_owned(&ifv->ifv_lock));
+ ifp->if_flags &= ~(IFF_UP|IFF_RUNNING);
+
omib = ifv->ifv_mib;
p = omib->ifvm_p;
@@ -652,7 +654,6 @@ vlan_unconfig_locked(struct ifvlan *ifv,
if ((ifp->if_flags & IFF_PROMISC) != 0)
vlan_safe_ifpromisc_locked(ifp, 0);
if_down(ifp);
- ifp->if_flags &= ~(IFF_UP|IFF_RUNNING);
ifp->if_capabilities = 0;
mutex_enter(&ifv->ifv_lock);
done:
@@ -974,10 +975,11 @@ vlan_ioctl(struct ifnet *ifp, u_long cmd
if (error != 0) {
break;
}
- ifp->if_flags |= IFF_RUNNING;
/* Update promiscuous mode, if necessary. */
vlan_set_promisc(ifp);
+
+ ifp->if_flags |= IFF_RUNNING;
break;
case SIOCGETVLAN:
Index: src/sys/net/agr/if_agr.c
diff -u src/sys/net/agr/if_agr.c:1.42 src/sys/net/agr/if_agr.c:1.43
--- src/sys/net/agr/if_agr.c:1.42 Wed Dec 6 04:37:00 2017
+++ src/sys/net/agr/if_agr.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_agr.c,v 1.42 2017/12/06 04:37:00 ozaki-r Exp $ */
+/* $NetBSD: if_agr.c,v 1.43 2017/12/06 07:40:16 ozaki-r Exp $ */
/*-
* Copyright (c)2005 YAMAMOTO Takashi,
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.42 2017/12/06 04:37:00 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_agr.c,v 1.43 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -648,8 +648,6 @@ agr_addport(struct ifnet *ifp, struct if
goto cleanup;
}
- ifp->if_flags |= IFF_RUNNING;
-
agrport_config_promisc(port, (ifp->if_flags & IFF_PROMISC) != 0);
error = (*sc->sc_iftop->iftop_configmulti_port)(sc, port, true);
if (error) {
@@ -664,6 +662,8 @@ out:
if (error && port) {
free(port, M_DEVBUF);
}
+ if (error == 0)
+ ifp->if_flags |= IFF_RUNNING;
return error;
cleanup:
Index: src/sys/netcan/if_canloop.c
diff -u src/sys/netcan/if_canloop.c:1.3 src/sys/netcan/if_canloop.c:1.4
--- src/sys/netcan/if_canloop.c:1.3 Thu Nov 16 03:07:18 2017
+++ src/sys/netcan/if_canloop.c Wed Dec 6 07:40:16 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: if_canloop.c,v 1.3 2017/11/16 03:07:18 ozaki-r Exp $ */
+/* $NetBSD: if_canloop.c,v 1.4 2017/12/06 07:40:16 ozaki-r Exp $ */
/*-
* Copyright (c) 2017 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_canloop.c,v 1.3 2017/11/16 03:07:18 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_canloop.c,v 1.4 2017/12/06 07:40:16 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_can.h"
@@ -111,7 +111,7 @@ canloop_clone_create(struct if_clone *if
if_initname(ifp, ifc->ifc_name, unit);
- ifp->if_flags = IFF_LOOPBACK | IFF_RUNNING;
+ ifp->if_flags = IFF_LOOPBACK;
ifp->if_extflags = IFEF_MPSAFE;
ifp->if_ioctl = canloop_ioctl;
ifp->if_start = canloop_ifstart;
@@ -124,6 +124,7 @@ canloop_clone_create(struct if_clone *if
MOWNER_ATTACH(ifp->if_mowner);
#endif
canloop_count++;
+ ifp->if_flags |= IFF_RUNNING;
return (0);
}
@@ -132,6 +133,8 @@ static int
canloop_clone_destroy(struct ifnet *ifp)
{
+ ifp->if_flags &= ~IFF_RUNNING;
+
#ifdef MBUFTRACE
MOWNER_DETACH(ifp->if_mowner);
free(ifp->if_mowner, M_DEVBUF);