wifi: mac80211: tx: use AP address in some places for MLO
In a few places we need to use the AP (MLD) address, not the deflink BSSID, the link address translation will happen later. To make that work properly for fast-xmit, set up the ap_addr in the vif.cfg earlier. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
f1cee996f1
commit
8a9be422f5
@ -2743,8 +2743,6 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
|
|||||||
changed[link_id] |= ieee80211_link_set_associated(link, cbss);
|
changed[link_id] |= ieee80211_link_set_associated(link, cbss);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(sdata->vif.cfg.ap_addr, assoc_data->ap_addr, ETH_ALEN);
|
|
||||||
|
|
||||||
/* just to be sure */
|
/* just to be sure */
|
||||||
ieee80211_stop_poll(sdata);
|
ieee80211_stop_poll(sdata);
|
||||||
|
|
||||||
@ -4893,6 +4891,9 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
|||||||
sta->sta.wme = (elems->wmm_param || elems->s1g_capab) &&
|
sta->sta.wme = (elems->wmm_param || elems->s1g_capab) &&
|
||||||
local->hw.queues >= IEEE80211_NUM_ACS;
|
local->hw.queues >= IEEE80211_NUM_ACS;
|
||||||
|
|
||||||
|
/* needed for fast-xmit setup in sta_info_move_state() */
|
||||||
|
memcpy(sdata->vif.cfg.ap_addr, assoc_data->ap_addr, ETH_ALEN);
|
||||||
|
|
||||||
err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
|
err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
|
||||||
if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
|
if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
|
||||||
err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
|
err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
|
||||||
@ -4927,6 +4928,7 @@ static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
out_err:
|
out_err:
|
||||||
|
eth_zero_addr(sdata->vif.cfg.ap_addr);
|
||||||
mutex_unlock(&sdata->local->sta_mtx);
|
mutex_unlock(&sdata->local->sta_mtx);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2735,7 +2735,7 @@ static struct sk_buff *ieee80211_build_hdr(struct ieee80211_sub_if_data *sdata,
|
|||||||
} else {
|
} else {
|
||||||
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
|
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
|
||||||
/* BSSID SA DA */
|
/* BSSID SA DA */
|
||||||
memcpy(hdr.addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN);
|
memcpy(hdr.addr1, sdata->vif.cfg.ap_addr, ETH_ALEN);
|
||||||
memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
|
memcpy(hdr.addr2, skb->data + ETH_ALEN, ETH_ALEN);
|
||||||
memcpy(hdr.addr3, skb->data, ETH_ALEN);
|
memcpy(hdr.addr3, skb->data, ETH_ALEN);
|
||||||
hdrlen = 24;
|
hdrlen = 24;
|
||||||
@ -3023,7 +3023,7 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
|
|||||||
}
|
}
|
||||||
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
|
fc |= cpu_to_le16(IEEE80211_FCTL_TODS);
|
||||||
/* BSSID SA DA */
|
/* BSSID SA DA */
|
||||||
memcpy(hdr->addr1, sdata->deflink.u.mgd.bssid, ETH_ALEN);
|
memcpy(hdr->addr1, sdata->vif.cfg.ap_addr, ETH_ALEN);
|
||||||
build.da_offs = offsetof(struct ieee80211_hdr, addr3);
|
build.da_offs = offsetof(struct ieee80211_hdr, addr3);
|
||||||
build.sa_offs = offsetof(struct ieee80211_hdr, addr2);
|
build.sa_offs = offsetof(struct ieee80211_hdr, addr2);
|
||||||
build.hdr_len = 24;
|
build.hdr_len = 24;
|
||||||
@ -3250,7 +3250,7 @@ static bool ieee80211_amsdu_prepare_head(struct ieee80211_sub_if_data *sdata,
|
|||||||
*/
|
*/
|
||||||
switch (sdata->vif.type) {
|
switch (sdata->vif.type) {
|
||||||
case NL80211_IFTYPE_STATION:
|
case NL80211_IFTYPE_STATION:
|
||||||
bssid = sdata->deflink.u.mgd.bssid;
|
bssid = sdata->vif.cfg.ap_addr;
|
||||||
break;
|
break;
|
||||||
case NL80211_IFTYPE_AP:
|
case NL80211_IFTYPE_AP:
|
||||||
case NL80211_IFTYPE_AP_VLAN:
|
case NL80211_IFTYPE_AP_VLAN:
|
||||||
|
Loading…
Reference in New Issue
Block a user