mac80211: warn if unexpectedly removing stations
authorJohannes Berg <johannes.berg@intel.com>
Thu, 13 Dec 2012 22:26:57 +0000 (23:26 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Thu, 3 Jan 2013 12:01:17 +0000 (13:01 +0100)
When an interface is brought down it must have been
disconnected (or similar) in all modes other than WDS,
so warn if any stations were removed in other modes.

Tested-by: Ben Greear <greearb@candelatech.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/iface.c

index ecf7d15..604b4aa 100644 (file)
@@ -747,7 +747,7 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
        unsigned long flags;
        struct sk_buff *skb, *tmp;
        u32 hw_reconf_flags = 0;
-       int i;
+       int i, flushed;
 
        clear_bit(SDATA_STATE_RUNNING, &sdata->state);
 
@@ -772,11 +772,13 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
         * (because if we remove a STA after ops->remove_interface()
         * the driver will have removed the vif info already!)
         *
-        * This is relevant only in AP, WDS and mesh modes, since in
-        * all other modes we've already removed all stations when
-        * disconnecting etc.
+        * This is relevant only in WDS mode, in all other modes we've
+        * already removed all stations when disconnecting or similar,
+        * so warn otherwise.
         */
-       sta_info_flush(sdata);
+       flushed = sta_info_flush(sdata);
+       WARN_ON_ONCE((sdata->vif.type != NL80211_IFTYPE_WDS && flushed > 0) ||
+                    (sdata->vif.type == NL80211_IFTYPE_WDS && flushed != 1));
 
        /*
         * Don't count this interface for promisc/allmulti while it