svn commit: r201599 - stable/7/sys/net

John Baldwin jhb at FreeBSD.org
Tue Jan 5 18:26:42 UTC 2010


Author: jhb
Date: Tue Jan  5 18:26:41 2010
New Revision: 201599
URL: http://svn.freebsd.org/changeset/base/201599

Log:
  MFC 201196:
  Change vlan interfaces to cope more usefully with the parent interface being
  renamed.  Previously the vlan interfaces would lose their configuration as if
  the parent interface had been physically removed.  Now vlan interfaces ignore
  rename events.
  - Add a new ifnet flag (IFF_RENAMING) that is set while an ifnet is being
    renamed.  This flag can be checked in ifnet departure/arrival event
    handlers to treat rename events differently.
  - Change the ifnet departure event handler in the if_vlan(4) driver to
    ignore departure events due to a trunk interface being renamed.

Modified:
  stable/7/sys/net/if.c
  stable/7/sys/net/if.h
  stable/7/sys/net/if_vlan.c
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/net/if.c
==============================================================================
--- stable/7/sys/net/if.c	Tue Jan  5 18:26:26 2010	(r201598)
+++ stable/7/sys/net/if.c	Tue Jan  5 18:26:41 2010	(r201599)
@@ -1754,6 +1754,14 @@ ifhwioctl(u_long cmd, struct ifnet *ifp,
 			return (EINVAL);
 		if (ifunit(new_name) != NULL)
 			return (EEXIST);
+
+		/*
+		 * XXX: Locking.  Nothing else seems to lock if_flags,
+		 * and there are numerous other races with the
+		 * ifunit() checks not being atomic with namespace
+		 * changes (renames, vmoves, if_attach, etc).
+		 */
+		ifp->if_flags |= IFF_RENAMING;
 		
 		/* Announce the departure of the interface. */
 		rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
@@ -1788,6 +1796,8 @@ ifhwioctl(u_long cmd, struct ifnet *ifp,
 		EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp);
 		/* Announce the return of the interface. */
 		rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
+
+		ifp->if_flags &= ~IFF_RENAMING;
 		break;
 
 	case SIOCSIFMETRIC:

Modified: stable/7/sys/net/if.h
==============================================================================
--- stable/7/sys/net/if.h	Tue Jan  5 18:26:26 2010	(r201598)
+++ stable/7/sys/net/if.h	Tue Jan  5 18:26:41 2010	(r201599)
@@ -150,6 +150,7 @@ struct if_data {
 #define	IFF_MONITOR	0x40000		/* (n) user-requested monitor mode */
 #define	IFF_STATICARP	0x80000		/* (n) static ARP */
 #define	IFF_NEEDSGIANT	0x100000	/* (i) hold Giant over if_start calls */
+#define	IFF_RENAMING	0x400000	/* (n) interface is being renamed */
 
 /*
  * Old names for driver flags so that user space tools can continue to use

Modified: stable/7/sys/net/if_vlan.c
==============================================================================
--- stable/7/sys/net/if_vlan.c	Tue Jan  5 18:26:26 2010	(r201598)
+++ stable/7/sys/net/if_vlan.c	Tue Jan  5 18:26:41 2010	(r201599)
@@ -462,7 +462,8 @@ vlan_setmulti(struct ifnet *ifp)
  * A handler for network interface departure events.
  * Track departure of trunks here so that we don't access invalid
  * pointers or whatever if a trunk is ripped from under us, e.g.,
- * by ejecting its hot-plug card.
+ * by ejecting its hot-plug card.  However, if an ifnet is simply
+ * being renamed, then there's no need to tear down the state.
  */
 static void
 vlan_ifdetach(void *arg __unused, struct ifnet *ifp)
@@ -477,6 +478,10 @@ vlan_ifdetach(void *arg __unused, struct
 	if (ifp->if_vlantrunk == NULL)
 		return;
 
+	/* If the ifnet is just being renamed, don't do anything. */
+	if (ifp->if_flags & IFF_RENAMING)
+		return;
+
 	VLAN_LOCK();
 	/*
 	 * OK, it's a trunk.  Loop over and detach all vlan's on it.


More information about the svn-src-all mailing list