mac80211: improve cleanup when leaving mesh
authorThomas Pedersen <thomas@cozybit.com>
Fri, 3 Aug 2012 19:21:32 +0000 (12:21 -0700)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 3 Aug 2012 19:34:17 +0000 (21:34 +0200)
It is not necessary to stop the mesh beacon in the mac80211 ndo_stop
handler, since cfg80211 has already left the mesh on NETDEV_GOING_DOWN
notification.

Also some improvements to ieee80211_stop_mesh():

 - flush mpath entries.
 - flush sta entries per-sdata so we don't remove entries belonging to
   other vifs on the same hw.

Signed-off-by: Thomas Pedersen <thomas@cozybit.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/iface.c
net/mac80211/mesh.c

index 2d6ac78971eaf1134e70ca86f5051a0f686f7756..5a81577879edddd5bafb85bef5c6fe8b546307b1 100644 (file)
@@ -777,14 +777,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
                synchronize_rcu();
                skb_queue_purge(&sdata->skb_queue);
 
-               /*
-                * Disable beaconing here for mesh only, AP and IBSS
-                * are already taken care of.
-                */
-               if (sdata->vif.type == NL80211_IFTYPE_MESH_POINT)
-                       ieee80211_bss_info_change_notify(sdata,
-                               BSS_CHANGED_BEACON_ENABLED);
-
                /*
                 * Free all remaining keys, there shouldn't be any,
                 * except maybe group keys in AP more or WDS?
index 571d5183060e1b3642ef253d5b3c23f4197f9a31..035cd0c8ce33f298c642f77ab49fd9432b68a9bb 100644 (file)
@@ -621,9 +621,13 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata)
 
        netif_carrier_off(sdata->dev);
 
+       /* stop the beacon */
        ifmsh->mesh_id_len = 0;
        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
-       sta_info_flush(local, NULL);
+
+       /* flush STAs and mpaths on this iface */
+       sta_info_flush(sdata->local, sdata);
+       mesh_path_flush_by_iface(sdata);
 
        del_timer_sync(&sdata->u.mesh.housekeeping_timer);
        del_timer_sync(&sdata->u.mesh.mesh_path_root_timer);