rtlwifi: unlink bss when un-association
authorTsang-Shian Lin <thlin@realtek.com>
Wed, 17 Jan 2018 06:15:23 +0000 (14:15 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 17 Jan 2018 15:09:13 +0000 (17:09 +0200)
When AP change bandwidth setting from 20M to 40M, STA may use old 20M AP
information to association with AP. Driver unlink bss in the
.bss_info_changed of ieee80211_ops to make sure that later scan can get
correct AP bandwidth capability.

Signed-off-by: Tsang-Shian Lin <thlin@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtlwifi/core.c

index a78b828f531a4e027b0244d2800f80e7e82d0ef1..a16aa94273e8cdeaee78ceb893f337f634520252 100644 (file)
@@ -1162,6 +1162,8 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                        RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
                                 "BSS_CHANGED_ASSOC\n");
                } else {
+                       struct cfg80211_bss *bss = NULL;
+
                        mstatus = RT_MEDIA_DISCONNECT;
 
                        if (mac->link_state == MAC80211_LINKED)
@@ -1169,6 +1171,22 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
                        if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
                                rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
                        mac->link_state = MAC80211_NOLINK;
+
+                       bss = cfg80211_get_bss(hw->wiphy, NULL,
+                                              (u8 *)mac->bssid, NULL, 0,
+                                              IEEE80211_BSS_TYPE_ESS,
+                                              IEEE80211_PRIVACY_OFF);
+
+                       RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
+                                "bssid = %pMF\n", mac->bssid);
+
+                       if (bss) {
+                               cfg80211_unlink_bss(hw->wiphy, bss);
+                               cfg80211_put_bss(hw->wiphy, bss);
+                               RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
+                                        "cfg80211_unlink !!\n");
+                       }
+
                        eth_zero_addr(mac->bssid);
                        mac->vendor = PEER_UNKNOWN;
                        mac->mode = 0;