svn commit: r208382 - stable/8/sys/net
John Baldwin
jhb at FreeBSD.org
Fri May 21 16:07:21 UTC 2010
Author: jhb
Date: Fri May 21 16:07:20 2010
New Revision: 208382
URL: http://svn.freebsd.org/changeset/base/208382
Log:
MFC 208212:
Ignore failures from removing multicast addresses from the parent (trunk)
interface when tearing down a vlan interface.
Modified:
stable/8/sys/net/if_vlan.c
Directory Properties:
stable/8/sys/ (props changed)
stable/8/sys/amd64/include/xen/ (props changed)
stable/8/sys/cddl/contrib/opensolaris/ (props changed)
stable/8/sys/contrib/dev/acpica/ (props changed)
stable/8/sys/contrib/pf/ (props changed)
stable/8/sys/dev/xen/xenpci/ (props changed)
stable/8/sys/geom/sched/ (props changed)
Modified: stable/8/sys/net/if_vlan.c
==============================================================================
--- stable/8/sys/net/if_vlan.c Fri May 21 16:03:57 2010 (r208381)
+++ stable/8/sys/net/if_vlan.c Fri May 21 16:07:20 2010 (r208382)
@@ -186,8 +186,8 @@ static int vlan_setflag(struct ifnet *if
int (*func)(struct ifnet *, int));
static int vlan_setflags(struct ifnet *ifp, int status);
static int vlan_setmulti(struct ifnet *ifp);
-static int vlan_unconfig(struct ifnet *ifp);
-static int vlan_unconfig_locked(struct ifnet *ifp);
+static void vlan_unconfig(struct ifnet *ifp);
+static void vlan_unconfig_locked(struct ifnet *ifp);
static int vlan_config(struct ifvlan *ifv, struct ifnet *p, uint16_t tag);
static void vlan_link_state(struct ifnet *ifp, int link);
static void vlan_capabilities(struct ifvlan *ifv);
@@ -1081,25 +1081,22 @@ done:
return (error);
}
-static int
+static void
vlan_unconfig(struct ifnet *ifp)
{
- int ret;
VLAN_LOCK();
- ret = vlan_unconfig_locked(ifp);
+ vlan_unconfig_locked(ifp);
VLAN_UNLOCK();
- return (ret);
}
-static int
+static void
vlan_unconfig_locked(struct ifnet *ifp)
{
struct ifvlantrunk *trunk;
struct vlan_mc_entry *mc;
struct ifvlan *ifv;
struct ifnet *parent;
- int error;
VLAN_LOCK_ASSERT();
@@ -1128,9 +1125,15 @@ vlan_unconfig_locked(struct ifnet *ifp)
while ((mc = SLIST_FIRST(&ifv->vlan_mc_listhead)) != NULL) {
bcopy((char *)&mc->mc_addr, LLADDR(&sdl),
ETHER_ADDR_LEN);
- error = if_delmulti(parent, (struct sockaddr *)&sdl);
- if (error)
- return (error);
+
+ /*
+ * This may fail if the parent interface is
+ * being detached. Regardless, we should do a
+ * best effort to free this interface as much
+ * as possible as all callers expect vlan
+ * destruction to succeed.
+ */
+ (void)if_delmulti(parent, (struct sockaddr *)&sdl);
SLIST_REMOVE_HEAD(&ifv->vlan_mc_listhead, mc_entries);
free(mc, M_VLAN);
}
@@ -1176,8 +1179,6 @@ vlan_unconfig_locked(struct ifnet *ifp)
*/
if (parent != NULL)
EVENTHANDLER_INVOKE(vlan_unconfig, parent, ifv->ifv_tag);
-
- return (0);
}
/* Handle a reference counted flag that should be set on the parent as well */
More information about the svn-src-all
mailing list