Commit b65567b0 authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: mlme: track AP (MLD) address separately

To prepare a bit more for MLO in the client code,
track the AP's address (for now only the BSSID, but
will track the AP MLD's address later) separately
from the per-link BSSID.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 7ebe994f
...@@ -1728,6 +1728,8 @@ enum ieee80211_offload_flags { ...@@ -1728,6 +1728,8 @@ enum ieee80211_offload_flags {
* @idle: This interface is idle. There's also a global idle flag in the * @idle: This interface is idle. There's also a global idle flag in the
* hardware config which may be more appropriate depending on what * hardware config which may be more appropriate depending on what
* your driver/device needs to do. * your driver/device needs to do.
* @ap_addr: AP MLD address, or BSSID for non-MLO connections
* (station mode only)
*/ */
struct ieee80211_vif_cfg { struct ieee80211_vif_cfg {
/* association related data */ /* association related data */
...@@ -1742,6 +1744,7 @@ struct ieee80211_vif_cfg { ...@@ -1742,6 +1744,7 @@ struct ieee80211_vif_cfg {
size_t ssid_len; size_t ssid_len;
bool s1g; bool s1g;
bool idle; bool idle;
u8 ap_addr[ETH_ALEN] __aligned(2);
}; };
/** /**
......
...@@ -1808,7 +1808,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata) ...@@ -1808,7 +1808,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
return false; return false;
rcu_read_lock(); rcu_read_lock();
sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
if (sta) if (sta)
authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED); authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
rcu_read_unlock(); rcu_read_unlock();
...@@ -2313,6 +2313,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, ...@@ -2313,6 +2313,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
sdata->u.mgd.associated = true; sdata->u.mgd.associated = true;
sdata->deflink.u.mgd.bss = cbss; sdata->deflink.u.mgd.bss = cbss;
memcpy(sdata->deflink.u.mgd.bssid, cbss->bssid, ETH_ALEN); memcpy(sdata->deflink.u.mgd.bssid, cbss->bssid, ETH_ALEN);
memcpy(sdata->vif.cfg.ap_addr, cbss->bssid, ETH_ALEN);
ieee80211_check_rate_mask(sdata); ieee80211_check_rate_mask(sdata);
...@@ -2463,6 +2464,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, ...@@ -2463,6 +2464,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
/* clear bssid only after building the needed mgmt frames */ /* clear bssid only after building the needed mgmt frames */
eth_zero_addr(sdata->deflink.u.mgd.bssid); eth_zero_addr(sdata->deflink.u.mgd.bssid);
eth_zero_addr(sdata->vif.cfg.ap_addr);
sdata->vif.cfg.ssid_len = 0; sdata->vif.cfg.ssid_len = 0;
/* remove AP and TDLS peers */ /* remove AP and TDLS peers */
...@@ -2653,7 +2655,7 @@ static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata, ...@@ -2653,7 +2655,7 @@ static void ieee80211_mlme_send_probe_req(struct ieee80211_sub_if_data *sdata,
static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata) static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
{ {
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
u8 *dst = sdata->deflink.u.mgd.bssid; u8 *dst = sdata->vif.cfg.ap_addr;
u8 unicast_limit = max(1, max_probe_tries - 3); u8 unicast_limit = max(1, max_probe_tries - 3);
struct sta_info *sta; struct sta_info *sta;
...@@ -2882,13 +2884,13 @@ static void ieee80211_beacon_connection_loss_work(struct work_struct *work) ...@@ -2882,13 +2884,13 @@ static void ieee80211_beacon_connection_loss_work(struct work_struct *work)
if (ifmgd->connection_loss) { if (ifmgd->connection_loss) {
sdata_info(sdata, "Connection to AP %pM lost\n", sdata_info(sdata, "Connection to AP %pM lost\n",
sdata->deflink.u.mgd.bssid); sdata->vif.cfg.ap_addr);
__ieee80211_disconnect(sdata); __ieee80211_disconnect(sdata);
ifmgd->connection_loss = false; ifmgd->connection_loss = false;
} else if (ifmgd->driver_disconnect) { } else if (ifmgd->driver_disconnect) {
sdata_info(sdata, sdata_info(sdata,
"Driver requested disconnection from AP %pM\n", "Driver requested disconnection from AP %pM\n",
sdata->deflink.u.mgd.bssid); sdata->vif.cfg.ap_addr);
__ieee80211_disconnect(sdata); __ieee80211_disconnect(sdata);
ifmgd->driver_disconnect = false; ifmgd->driver_disconnect = false;
} else { } else {
...@@ -3042,7 +3044,7 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata, ...@@ -3042,7 +3044,7 @@ static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
} }
static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata,
const u8 *bssid) const u8 *ap_addr)
{ {
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
struct sta_info *sta; struct sta_info *sta;
...@@ -3056,14 +3058,14 @@ static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata, ...@@ -3056,14 +3058,14 @@ static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata,
/* move station state to auth */ /* move station state to auth */
mutex_lock(&sdata->local->sta_mtx); mutex_lock(&sdata->local->sta_mtx);
sta = sta_info_get(sdata, bssid); sta = sta_info_get(sdata, ap_addr);
if (!sta) { if (!sta) {
WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid); WARN_ONCE(1, "%s: STA %pM not found", sdata->name, ap_addr);
result = false; result = false;
goto out; goto out;
} }
if (sta_info_move_state(sta, IEEE80211_STA_AUTH)) { if (sta_info_move_state(sta, IEEE80211_STA_AUTH)) {
sdata_info(sdata, "failed moving %pM to auth\n", bssid); sdata_info(sdata, "failed moving %pM to auth\n", ap_addr);
result = false; result = false;
goto out; goto out;
} }
...@@ -4402,7 +4404,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata, ...@@ -4402,7 +4404,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
erp_valid, erp_value); erp_valid, erp_value);
mutex_lock(&local->sta_mtx); mutex_lock(&local->sta_mtx);
sta = sta_info_get(sdata, bssid); sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
changed |= ieee80211_recalc_twt_req(sdata, sta, elems); changed |= ieee80211_recalc_twt_req(sdata, sta, elems);
...@@ -4885,7 +4887,7 @@ static void ieee80211_sta_conn_mon_timer(struct timer_list *t) ...@@ -4885,7 +4887,7 @@ static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
!sdata->deflink.u.mgd.csa_waiting_bcn) !sdata->deflink.u.mgd.csa_waiting_bcn)
return; return;
sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid); sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
if (!sta) if (!sta)
return; return;
...@@ -4981,7 +4983,7 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata) ...@@ -4981,7 +4983,7 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
.bssid = bssid, .bssid = bssid,
}; };
memcpy(bssid, sdata->deflink.u.mgd.bssid, ETH_ALEN); memcpy(bssid, sdata->vif.cfg.ap_addr, ETH_ALEN);
ieee80211_mgd_deauth(sdata, &req); ieee80211_mgd_deauth(sdata, &req);
} }
...@@ -5909,7 +5911,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata, ...@@ -5909,7 +5911,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
sdata_info(sdata, sdata_info(sdata,
"disconnect from AP %pM for new auth to %pM\n", "disconnect from AP %pM for new auth to %pM\n",
sdata->deflink.u.mgd.bssid, req->bss->bssid); sdata->vif.cfg.ap_addr, req->bss->bssid);
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
WLAN_REASON_UNSPECIFIED, WLAN_REASON_UNSPECIFIED,
false, frame_buf); false, frame_buf);
...@@ -5986,7 +5988,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, ...@@ -5986,7 +5988,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
sdata_info(sdata, sdata_info(sdata,
"disconnect from AP %pM for new assoc to %pM\n", "disconnect from AP %pM for new assoc to %pM\n",
sdata->deflink.u.mgd.bssid, req->bss->bssid); sdata->vif.cfg.ap_addr, req->bss->bssid);
ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
WLAN_REASON_UNSPECIFIED, WLAN_REASON_UNSPECIFIED,
false, frame_buf); false, frame_buf);
...@@ -6344,7 +6346,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, ...@@ -6344,7 +6346,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
} }
if (ifmgd->associated && if (ifmgd->associated &&
ether_addr_equal(sdata->deflink.u.mgd.bssid, req->bssid)) { ether_addr_equal(sdata->vif.cfg.ap_addr, req->bssid)) {
sdata_info(sdata, sdata_info(sdata,
"deauthenticating from %pM by local choice (Reason: %u=%s)\n", "deauthenticating from %pM by local choice (Reason: %u=%s)\n",
req->bssid, req->reason_code, req->bssid, req->reason_code,
......
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