Commit 81151ce4 authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: support MLO authentication/association with one link

It might seem a bit pointless to do a multi-link operation
connection with just a single link, but this is already a
big change, so for now, limit MLO connections to a single
link.

Extending that to multiple links will require
 * work on parsing the multi-link element with STA profile
   properly, including element fragmentation;
 * checking the per-link status in the multi-link element
 * implementing logic to have active/inactive links to let
   drivers decide which links should be active;
 * implementing multicast RX deduplication;
 * and likely more.

For now this is still useful since it lets us do multi-link
connections for the purposes of testing APIs and the higher
layers such as wpa_supplicant.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 425f4b5f
...@@ -389,37 +389,55 @@ struct ieee80211_mgd_auth_data { ...@@ -389,37 +389,55 @@ struct ieee80211_mgd_auth_data {
bool peer_confirmed; bool peer_confirmed;
bool timeout_started; bool timeout_started;
u8 ap_addr[ETH_ALEN] __aligned(2);
u16 sae_trans, sae_status; u16 sae_trans, sae_status;
size_t data_len; size_t data_len;
u8 data[]; u8 data[];
}; };
struct ieee80211_mgd_assoc_data { struct ieee80211_mgd_assoc_data {
struct cfg80211_bss *bss; struct {
struct cfg80211_bss *bss;
u8 addr[ETH_ALEN] __aligned(2);
u8 ap_ht_param;
struct ieee80211_vht_cap ap_vht_cap;
size_t elems_len;
u8 *elems; /* pointing to inside ie[] below */
ieee80211_conn_flags_t conn_flags;
} link[IEEE80211_MLD_MAX_NUM_LINKS];
u8 ap_addr[ETH_ALEN] __aligned(2);
/* this is for a workaround, so we use it only for non-MLO */
const u8 *supp_rates; const u8 *supp_rates;
u8 supp_rates_len;
unsigned long timeout; unsigned long timeout;
int tries; int tries;
u16 capability; u8 prev_ap_addr[ETH_ALEN];
u8 prev_bssid[ETH_ALEN];
u8 ssid[IEEE80211_MAX_SSID_LEN]; u8 ssid[IEEE80211_MAX_SSID_LEN];
u8 ssid_len; u8 ssid_len;
u8 supp_rates_len;
bool wmm, uapsd; bool wmm, uapsd;
bool need_beacon; bool need_beacon;
bool synced; bool synced;
bool timeout_started; bool timeout_started;
bool s1g;
u8 ap_ht_param; unsigned int assoc_link_id;
struct ieee80211_vht_cap ap_vht_cap;
u8 fils_nonces[2 * FILS_NONCE_LEN]; u8 fils_nonces[2 * FILS_NONCE_LEN];
u8 fils_kek[FILS_MAX_KEK_LEN]; u8 fils_kek[FILS_MAX_KEK_LEN];
size_t fils_kek_len; size_t fils_kek_len;
size_t ie_len; size_t ie_len;
u8 *ie_pos; /* used to fill ie[] with link[].elems */
u8 ie[]; u8 ie[];
}; };
......
This diff is collapsed.
...@@ -2478,7 +2478,7 @@ int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata, ...@@ -2478,7 +2478,7 @@ int ieee80211_lookup_ra_sta(struct ieee80211_sub_if_data *sdata,
} }
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 -ENOLINK; return -ENOLINK;
break; break;
......
...@@ -50,6 +50,9 @@ void cfg80211_rx_assoc_resp(struct net_device *dev, ...@@ -50,6 +50,9 @@ void cfg80211_rx_assoc_resp(struct net_device *dev,
/* need to have local link addresses for MLO connections */ /* need to have local link addresses for MLO connections */
WARN_ON(cr.ap_mld_addr && !cr.links[link_id].addr); WARN_ON(cr.ap_mld_addr && !cr.links[link_id].addr);
printk(KERN_CRIT "BSS pointer 0x%lx\n", (unsigned long)cr.links[link_id].bss);
BUG_ON(!cr.links[link_id].bss->channel);
if (cr.links[link_id].bss->channel->band == NL80211_BAND_S1GHZ) { if (cr.links[link_id].bss->channel->band == NL80211_BAND_S1GHZ) {
WARN_ON(link_id); WARN_ON(link_id);
cr.resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable; cr.resp_ie = (u8 *)&mgmt->u.s1g_assoc_resp.variable;
......
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