mac80211: ibss: disable beaconing before freeing beacon
authorJohannes Berg <johannes.berg@intel.com>
Thu, 7 Mar 2013 19:22:28 +0000 (20:22 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 25 Mar 2013 13:42:39 +0000 (14:42 +0100)
If we don't disable beaconing, the driver might attempt
to continue, but would fail to request a beacon. That's
strange, so disable beaconing first.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ibss.c

index 539d4a11b47bc9be2d30625ef0d79c97c9d9cdd5..bd02fac188bdbd3fd7af2260b5ab0c2d44fa63ef 100644 (file)
@@ -58,14 +58,6 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        /* Reset own TSF to allow time synchronization work. */
        drv_reset_tsf(local, sdata);
 
-       skb = ifibss->skb;
-       RCU_INIT_POINTER(ifibss->presp, NULL);
-       synchronize_rcu();
-       skb->data = skb->head;
-       skb->len = 0;
-       skb_reset_tail_pointer(skb);
-       skb_reserve(skb, sdata->local->hw.extra_tx_headroom);
-
        if (!ether_addr_equal(ifibss->bssid, bssid))
                sta_info_flush(sdata);
 
@@ -73,10 +65,21 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        if (sdata->vif.bss_conf.ibss_joined) {
                sdata->vif.bss_conf.ibss_joined = false;
                sdata->vif.bss_conf.ibss_creator = false;
+               sdata->vif.bss_conf.enable_beacon = false;
                netif_carrier_off(sdata->dev);
-               ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_IBSS);
+               ieee80211_bss_info_change_notify(sdata,
+                                                BSS_CHANGED_IBSS |
+                                                BSS_CHANGED_BEACON_ENABLED);
        }
 
+       skb = ifibss->skb;
+       RCU_INIT_POINTER(ifibss->presp, NULL);
+       synchronize_rcu();
+       skb->data = skb->head;
+       skb->len = 0;
+       skb_reset_tail_pointer(skb);
+       skb_reserve(skb, sdata->local->hw.extra_tx_headroom);
+
        sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
 
        cfg80211_chandef_create(&chandef, chan, ifibss->channel_type);