mac80211: remove BSS from cfg80211 list when leaving IBSS
authorTeemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Mon, 14 Jun 2010 09:55:33 +0000 (12:55 +0300)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 14 Jun 2010 19:39:34 +0000 (15:39 -0400)
Remove BSS from cfg80211 BSS list if we are only member in IBSS when
leaving it.

Signed-off-by: Teemu Paasikivi <ext-teemu.3.paasikivi@nokia.com>
Acked-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
net/mac80211/ibss.c

index 93481eb51d2464d2262102cc8ca7dbc598f5f30a..d4e84b22a66d8b92a082b483b3003f80bce7cf6d 100644 (file)
@@ -917,6 +917,31 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
 int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
 {
        struct sk_buff *skb;
+       struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
+       struct ieee80211_local *local = sdata->local;
+       struct cfg80211_bss *cbss;
+       u16 capability;
+       int active_ibss = 0;
+
+       active_ibss = ieee80211_sta_active_ibss(sdata);
+
+       if (!active_ibss && !is_zero_ether_addr(ifibss->bssid)) {
+               capability = WLAN_CAPABILITY_IBSS;
+
+               if (ifibss->privacy)
+                       capability |= WLAN_CAPABILITY_PRIVACY;
+
+               cbss = cfg80211_get_bss(local->hw.wiphy, ifibss->channel,
+                                       ifibss->bssid, ifibss->ssid,
+                                       ifibss->ssid_len, WLAN_CAPABILITY_IBSS |
+                                       WLAN_CAPABILITY_PRIVACY,
+                                       capability);
+
+               if (cbss) {
+                       cfg80211_unlink_bss(local->hw.wiphy, cbss);
+                       cfg80211_put_bss(cbss);
+               }
+       }
 
        del_timer_sync(&sdata->u.ibss.timer);
        clear_bit(IEEE80211_IBSS_REQ_RUN, &sdata->u.ibss.request);