summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/net80211/ieee80211.c22
-rw-r--r--sys/net80211/ieee80211_freebsd.c2
2 files changed, 24 insertions, 0 deletions
diff --git a/sys/net80211/ieee80211.c b/sys/net80211/ieee80211.c
index 78c876e..49f8a8e 100644
--- a/sys/net80211/ieee80211.c
+++ b/sys/net80211/ieee80211.c
@@ -317,7 +317,11 @@ ieee80211_ifattach(struct ieee80211com *ic,
ifp->if_addrlen = IEEE80211_ADDR_LEN;
ifp->if_hdrlen = 0;
+
+ CURVNET_SET(vnet0);
+
if_attach(ifp);
+
ifp->if_mtu = IEEE80211_MTU_MAX;
ifp->if_broadcastaddr = ieee80211broadcastaddr;
ifp->if_output = null_output;
@@ -331,6 +335,8 @@ ieee80211_ifattach(struct ieee80211com *ic,
sdl->sdl_alen = IEEE80211_ADDR_LEN;
IEEE80211_ADDR_COPY(LLADDR(sdl), macaddr);
ifa_free(ifa);
+
+ CURVNET_RESTORE();
}
/*
@@ -345,8 +351,18 @@ ieee80211_ifdetach(struct ieee80211com *ic)
struct ifnet *ifp = ic->ic_ifp;
struct ieee80211vap *vap;
+ /*
+ * This detaches the main interface, but not the vaps.
+ * Each VAP may be in a separate VIMAGE.
+ */
+ CURVNET_SET(ifp->if_vnet);
if_detach(ifp);
+ CURVNET_RESTORE();
+ /*
+ * The VAP is responsible for setting and clearing
+ * the VIMAGE context.
+ */
while ((vap = TAILQ_FIRST(&ic->ic_vaps)) != NULL)
ieee80211_vap_destroy(vap);
ieee80211_waitfor_parent(ic);
@@ -365,7 +381,9 @@ ieee80211_ifdetach(struct ieee80211com *ic)
ieee80211_power_detach(ic);
ieee80211_node_detach(ic);
+ /* XXX VNET needed? */
ifmedia_removeall(&ic->ic_media);
+
taskqueue_free(ic->ic_tq);
IEEE80211_LOCK_DESTROY(ic);
}
@@ -586,6 +604,8 @@ ieee80211_vap_detach(struct ieee80211vap *vap)
struct ieee80211com *ic = vap->iv_ic;
struct ifnet *ifp = vap->iv_ifp;
+ CURVNET_SET(ifp->if_vnet);
+
IEEE80211_DPRINTF(vap, IEEE80211_MSG_STATE, "%s: %s parent %s\n",
__func__, ieee80211_opmode_name[vap->iv_opmode],
ic->ic_ifp->if_xname);
@@ -638,6 +658,8 @@ ieee80211_vap_detach(struct ieee80211vap *vap)
ieee80211_sysctl_vdetach(vap);
if_free(ifp);
+
+ CURVNET_RESTORE();
}
/*
diff --git a/sys/net80211/ieee80211_freebsd.c b/sys/net80211/ieee80211_freebsd.c
index bf4acee..e307e9d 100644
--- a/sys/net80211/ieee80211_freebsd.c
+++ b/sys/net80211/ieee80211_freebsd.c
@@ -152,7 +152,9 @@ wlan_clone_destroy(struct ifnet *ifp)
void
ieee80211_vap_destroy(struct ieee80211vap *vap)
{
+ CURVNET_SET(vap->iv_ifp->if_vnet);
if_clone_destroyif(wlan_cloner, vap->iv_ifp);
+ CURVNET_RESTORE();
}
int
OpenPOWER on IntegriCloud