wifi: mac80211: mlme: track AP (MLD) address separately
authorJohannes Berg <johannes.berg@intel.com>
Fri, 24 Jun 2022 14:08:39 +0000 (16:08 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 15 Jul 2022 09:43:16 +0000 (11:43 +0200)
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: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/mlme.c

index 7cf8d58eb5f0eec483a2c3536e699029b201da63..36eba96a1012cfc7a7bfdc98d8d648260c6645a8 100644 (file)
@@ -1728,6 +1728,8 @@ enum ieee80211_offload_flags {
  * @idle: This interface is idle. There's also a global idle flag in the
  *     hardware config which may be more appropriate depending on what
  *     your driver/device needs to do.
+ * @ap_addr: AP MLD address, or BSSID for non-MLO connections
+ *     (station mode only)
  */
 struct ieee80211_vif_cfg {
        /* association related data */
@@ -1742,6 +1744,7 @@ struct ieee80211_vif_cfg {
        size_t ssid_len;
        bool s1g;
        bool idle;
+       u8 ap_addr[ETH_ALEN] __aligned(2);
 };
 
 /**
index 7eab15920a703a448193b5faf2bb6f1cb4af8b4b..a2e8fe9b43ab606475c15de60c719144cbc862a2 100644 (file)
@@ -1808,7 +1808,7 @@ static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
                return false;
 
        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)
                authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
        rcu_read_unlock();
@@ -2313,6 +2313,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
        sdata->u.mgd.associated = true;
        sdata->deflink.u.mgd.bss = cbss;
        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);
 
@@ -2463,6 +2464,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
        /* clear bssid only after building the needed mgmt frames */
        eth_zero_addr(sdata->deflink.u.mgd.bssid);
 
+       eth_zero_addr(sdata->vif.cfg.ap_addr);
        sdata->vif.cfg.ssid_len = 0;
 
        /* remove AP and TDLS peers */
@@ -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)
 {
        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);
        struct sta_info *sta;
 
@@ -2882,13 +2884,13 @@ static void ieee80211_beacon_connection_loss_work(struct work_struct *work)
 
        if (ifmgd->connection_loss) {
                sdata_info(sdata, "Connection to AP %pM lost\n",
-                          sdata->deflink.u.mgd.bssid);
+                          sdata->vif.cfg.ap_addr);
                __ieee80211_disconnect(sdata);
                ifmgd->connection_loss = false;
        } else if (ifmgd->driver_disconnect) {
                sdata_info(sdata,
                           "Driver requested disconnection from AP %pM\n",
-                          sdata->deflink.u.mgd.bssid);
+                          sdata->vif.cfg.ap_addr);
                __ieee80211_disconnect(sdata);
                ifmgd->driver_disconnect = false;
        } else {
@@ -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,
-                                   const u8 *bssid)
+                                   const u8 *ap_addr)
 {
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct sta_info *sta;
@@ -3056,14 +3058,14 @@ static bool ieee80211_mark_sta_auth(struct ieee80211_sub_if_data *sdata,
 
        /* move station state to auth */
        mutex_lock(&sdata->local->sta_mtx);
-       sta = sta_info_get(sdata, bssid);
+       sta = sta_info_get(sdata, ap_addr);
        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;
                goto out;
        }
        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;
                goto out;
        }
@@ -4402,7 +4404,7 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
                                erp_valid, erp_value);
 
        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);
 
@@ -4885,7 +4887,7 @@ static void ieee80211_sta_conn_mon_timer(struct timer_list *t)
            !sdata->deflink.u.mgd.csa_waiting_bcn)
                return;
 
-       sta = sta_info_get(sdata, sdata->deflink.u.mgd.bssid);
+       sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
        if (!sta)
                return;
 
@@ -4981,7 +4983,7 @@ void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
                        .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);
        }
 
@@ -5909,7 +5911,7 @@ int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
 
                sdata_info(sdata,
                           "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,
                                       WLAN_REASON_UNSPECIFIED,
                                       false, frame_buf);
@@ -5986,7 +5988,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
 
                sdata_info(sdata,
                           "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,
                                       WLAN_REASON_UNSPECIFIED,
                                       false, frame_buf);
@@ -6344,7 +6346,7 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
        }
 
        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,
                           "deauthenticating from %pM by local choice (Reason: %u=%s)\n",
                           req->bssid, req->reason_code,