Commit 5dfad108 authored by Johannes Berg's avatar Johannes Berg

mac80211: mlme: track assoc_bss/associated separately

We currently track whether we're associated and which the
BSS is in the same variable (ifmgd->associated), but for
MLD we'll need to move the BSS pointer to be per link,
while the question whether we're associated or not is for
the whole interface.

Add ifmgd->assoc_bss that stores the pointer and change
ifmgd->associated to be just a bool, so the question of
whether we're associated can continue working after MLD
rework, without requiring changes, while the BSS pointer
will have to be changed/used checked per link.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 16d0364c
...@@ -453,9 +453,10 @@ struct ieee80211_if_managed { ...@@ -453,9 +453,10 @@ struct ieee80211_if_managed {
bool nullfunc_failed; bool nullfunc_failed;
u8 connection_loss:1, u8 connection_loss:1,
driver_disconnect:1, driver_disconnect:1,
reconnect:1; reconnect:1,
associated:1;
struct cfg80211_bss *associated; struct cfg80211_bss *assoc_bss;
struct ieee80211_mgd_auth_data *auth_data; struct ieee80211_mgd_auth_data *auth_data;
struct ieee80211_mgd_assoc_data *assoc_data; struct ieee80211_mgd_assoc_data *assoc_data;
......
...@@ -1376,7 +1376,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata, ...@@ -1376,7 +1376,7 @@ ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
{ {
struct ieee80211_local *local = sdata->local; struct ieee80211_local *local = sdata->local;
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
struct cfg80211_bss *cbss = ifmgd->associated; struct cfg80211_bss *cbss = ifmgd->assoc_bss;
struct ieee80211_chanctx_conf *conf; struct ieee80211_chanctx_conf *conf;
struct ieee80211_chanctx *chanctx; struct ieee80211_chanctx *chanctx;
enum nl80211_band current_band; enum nl80211_band current_band;
...@@ -2266,7 +2266,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, ...@@ -2266,7 +2266,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec( sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec(
beacon_loss_count * bss_conf->beacon_int)); beacon_loss_count * bss_conf->beacon_int));
sdata->u.mgd.associated = cbss; sdata->u.mgd.associated = true;
sdata->u.mgd.assoc_bss = cbss;
memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN); memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN);
ieee80211_check_rate_mask(sdata); ieee80211_check_rate_mask(sdata);
...@@ -2361,7 +2362,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, ...@@ -2361,7 +2362,8 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
ieee80211_stop_poll(sdata); ieee80211_stop_poll(sdata);
ifmgd->associated = NULL; ifmgd->associated = false;
ifmgd->assoc_bss = NULL;
netif_carrier_off(sdata->dev); netif_carrier_off(sdata->dev);
/* /*
...@@ -2644,7 +2646,7 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) ...@@ -2644,7 +2646,7 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst,
sdata->vif.bss_conf.ssid, sdata->vif.bss_conf.ssid,
sdata->vif.bss_conf.ssid_len, sdata->vif.bss_conf.ssid_len,
ifmgd->associated->channel); ifmgd->assoc_bss->channel);
} }
ifmgd->probe_timeout = jiffies + msecs_to_jiffies(probe_wait_ms); ifmgd->probe_timeout = jiffies + msecs_to_jiffies(probe_wait_ms);
...@@ -2734,7 +2736,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw, ...@@ -2734,7 +2736,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
sdata_assert_lock(sdata); sdata_assert_lock(sdata);
if (ifmgd->associated) if (ifmgd->associated)
cbss = ifmgd->associated; cbss = ifmgd->assoc_bss;
else if (ifmgd->auth_data) else if (ifmgd->auth_data)
cbss = ifmgd->auth_data->bss; cbss = ifmgd->auth_data->bss;
else if (ifmgd->assoc_data) else if (ifmgd->assoc_data)
...@@ -2799,7 +2801,7 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata) ...@@ -2799,7 +2801,7 @@ static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
* AP is probably out of range (or not reachable for another * AP is probably out of range (or not reachable for another
* reason) so remove the bss struct for that AP. * reason) so remove the bss struct for that AP.
*/ */
cfg80211_unlink_bss(local->hw.wiphy, ifmgd->associated); cfg80211_unlink_bss(local->hw.wiphy, ifmgd->assoc_bss);
} }
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
...@@ -4185,7 +4187,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, ...@@ -4185,7 +4187,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
} }
if (!ifmgd->associated || if (!ifmgd->associated ||
!ieee80211_rx_our_beacon(bssid, ifmgd->associated)) !ieee80211_rx_our_beacon(bssid, ifmgd->assoc_bss))
return; return;
bssid = ifmgd->bssid; bssid = ifmgd->bssid;
...@@ -6287,7 +6289,7 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, ...@@ -6287,7 +6289,7 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
* to cfg80211 while that's in a locked section already * to cfg80211 while that's in a locked section already
* trying to tell us that the user wants to disconnect. * trying to tell us that the user wants to disconnect.
*/ */
if (ifmgd->associated != req->bss) if (ifmgd->assoc_bss != req->bss)
return -ENOLINK; return -ENOLINK;
sdata_info(sdata, sdata_info(sdata,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment