nl80211: Fix AP MLD frequency update on channel switch

mlme_event() calls nl80211_get_link_id_by_freq() to determine the link
to handle reported events. However, in channel switch event it is always
setting freq to the default link that leads to the issue that all other
events that go to mlme_event() will be handled in the default link.

Fix this by setting freq to the correct link specified by the link ID
when processing the event for a completed channel switch.

Signed-off-by: Chenming Huang <quic_chenhuan@quicinc.com>
This commit is contained in:
Chenming Huang 2024-03-13 18:08:26 +05:30 committed by Jouni Malinen
parent bd52684498
commit 9be122d2e0

View file

@ -1260,14 +1260,23 @@ static void mlme_event_ch_switch(struct wpa_driver_nl80211_data *drv,
if (cf2) if (cf2)
data.ch_switch.cf2 = nla_get_u32(cf2); data.ch_switch.cf2 = nla_get_u32(cf2);
if (finished)
bss->flink->freq = data.ch_switch.freq;
if (link) if (link)
data.ch_switch.link_id = nla_get_u8(link); data.ch_switch.link_id = nla_get_u8(link);
else else
data.ch_switch.link_id = NL80211_DRV_LINK_ID_NA; data.ch_switch.link_id = NL80211_DRV_LINK_ID_NA;
if (finished) {
if (data.ch_switch.link_id != NL80211_DRV_LINK_ID_NA) {
struct i802_link *mld_link;
mld_link = nl80211_get_link(bss,
data.ch_switch.link_id);
mld_link->freq = data.ch_switch.freq;
} else {
bss->flink->freq = data.ch_switch.freq;
}
}
if (link && is_sta_interface(drv->nlmode)) { if (link && is_sta_interface(drv->nlmode)) {
u8 link_id = data.ch_switch.link_id; u8 link_id = data.ch_switch.link_id;