mirror of
https://github.com/outbackdingo/mt76.git
synced 2026-10-24 13:26:48 +00:00
wifi: mt76: mt7996: fix non-MLD station num_sta leak
The MLO link-reconfiguration rework moved the per-phy num_sta
decrement inside a link_valid guard. link_valid is only set for
MLO links, but num_sta is incremented for every station link,
including the non-MLO deflink. Non-MLO stations bump num_sta
on association and never drop it on removal.
A non-zero num_sta forces connected-mode off-channel scanning which
prevents the directed probe exchange needed to find hidden APs.
Decrement phy->num_sta on the actual link teardown, pairing it with
the unconditional increment on link creation.
Fixes: 018f60316d ("wifi: mt76: mt7996: Destroy active sta links in mt7996_mac_sta_remove()")
Signed-off-by: Chad Monroe <[email protected]>
Signed-off-by: Felix Fietkau <[email protected]>
This commit is contained in:
committed by
Felix Fietkau
parent
fe40221e05
commit
59676919ea
+6
-6
@@ -1201,15 +1201,9 @@ void mt7996_mac_sta_remove_link(struct mt7996_dev *dev,
|
||||
mt76_wcid_cleanup(&dev->mt76, &msta_link->wcid);
|
||||
|
||||
if (msta_link->wcid.link_valid) {
|
||||
struct mt7996_phy *phy;
|
||||
|
||||
mt7996_mac_wtbl_update(dev, msta_link->wcid.idx,
|
||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||
|
||||
phy = __mt7996_phy(dev, msta_link->wcid.phy_idx);
|
||||
if (phy)
|
||||
phy->mt76->num_sta--;
|
||||
|
||||
if (msta->deflink_id == link_id) {
|
||||
msta->deflink_id = IEEE80211_LINK_UNSPECIFIED;
|
||||
if (msta->seclink_id == link_id) {
|
||||
@@ -1235,6 +1229,12 @@ void mt7996_mac_sta_remove_link(struct mt7996_dev *dev,
|
||||
}
|
||||
|
||||
if (flush) {
|
||||
struct mt7996_phy *phy =
|
||||
__mt7996_phy(dev, msta_link->wcid.phy_idx);
|
||||
|
||||
if (phy)
|
||||
phy->mt76->num_sta--;
|
||||
|
||||
rcu_assign_pointer(msta->link[link_id], NULL);
|
||||
rcu_assign_pointer(dev->mt76.wcid[msta_link->wcid.idx], NULL);
|
||||
mt76_wcid_mask_clear(dev->mt76.wcid_mask, msta_link->wcid.idx);
|
||||
|
||||
Reference in New Issue
Block a user