mac80211: use ieee80211_bss_get_elem() in most places

There are a number of uses of ieee80211_bss_get_ie(),
replace most of them with ieee80211_bss_get_elem().

Link: https://lore.kernel.org/r/20210930131130.9a413f12a151.I0699ba7e48c9d88dbbfa3107cf4d34a8345d02a0@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Johannes Berg 2021-09-30 13:11:31 +02:00
parent a3eca81792
commit f2622138f9

View file

@ -2514,7 +2514,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;
const u8 *ssid; const struct element *ssid;
u8 *dst = ifmgd->associated->bssid; u8 *dst = ifmgd->associated->bssid;
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;
@ -2551,14 +2551,14 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
int ssid_len; int ssid_len;
rcu_read_lock(); rcu_read_lock();
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID); ssid = ieee80211_bss_get_elem(ifmgd->associated, WLAN_EID_SSID);
if (WARN_ON_ONCE(ssid == NULL)) if (WARN_ON_ONCE(ssid == NULL))
ssid_len = 0; ssid_len = 0;
else else
ssid_len = ssid[1]; ssid_len = ssid->datalen;
ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst, ieee80211_mlme_send_probe_req(sdata, sdata->vif.addr, dst,
ssid + 2, ssid_len, ssid->data, ssid_len,
ifmgd->associated->channel); ifmgd->associated->channel);
rcu_read_unlock(); rcu_read_unlock();
} }
@ -2634,7 +2634,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
struct cfg80211_bss *cbss; struct cfg80211_bss *cbss;
struct sk_buff *skb; struct sk_buff *skb;
const u8 *ssid; const struct element *ssid;
int ssid_len; int ssid_len;
if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION)) if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
@ -2652,16 +2652,17 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
return NULL; return NULL;
rcu_read_lock(); rcu_read_lock();
ssid = ieee80211_bss_get_ie(cbss, WLAN_EID_SSID); ssid = ieee80211_bss_get_elem(cbss, WLAN_EID_SSID);
if (WARN_ONCE(!ssid || ssid[1] > IEEE80211_MAX_SSID_LEN, if (WARN_ONCE(!ssid || ssid->datalen > IEEE80211_MAX_SSID_LEN,
"invalid SSID element (len=%d)", ssid ? ssid[1] : -1)) "invalid SSID element (len=%d)",
ssid ? ssid->datalen : -1))
ssid_len = 0; ssid_len = 0;
else else
ssid_len = ssid[1]; ssid_len = ssid->datalen;
skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid, skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid,
(u32) -1, cbss->channel, (u32) -1, cbss->channel,
ssid + 2, ssid_len, ssid->data, ssid_len,
NULL, 0, IEEE80211_PROBE_FLAG_DIRECTED); NULL, 0, IEEE80211_PROBE_FLAG_DIRECTED);
rcu_read_unlock(); rcu_read_unlock();
@ -5538,7 +5539,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
const struct cfg80211_bss_ies *beacon_ies; const struct cfg80211_bss_ies *beacon_ies;
struct ieee80211_supported_band *sband; struct ieee80211_supported_band *sband;
struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf; struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
const u8 *ssidie, *ht_ie, *vht_ie; const struct element *ssid_elem, *ht_elem, *vht_elem;
int i, err; int i, err;
bool override = false; bool override = false;
@ -5547,14 +5548,14 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
return -ENOMEM; return -ENOMEM;
rcu_read_lock(); rcu_read_lock();
ssidie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID); ssid_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_SSID);
if (!ssidie || ssidie[1] > sizeof(assoc_data->ssid)) { if (!ssid_elem || ssid_elem->datalen > sizeof(assoc_data->ssid)) {
rcu_read_unlock(); rcu_read_unlock();
kfree(assoc_data); kfree(assoc_data);
return -EINVAL; return -EINVAL;
} }
memcpy(assoc_data->ssid, ssidie + 2, ssidie[1]); memcpy(assoc_data->ssid, ssid_elem->data, ssid_elem->datalen);
assoc_data->ssid_len = ssidie[1]; assoc_data->ssid_len = ssid_elem->datalen;
memcpy(bss_conf->ssid, assoc_data->ssid, assoc_data->ssid_len); memcpy(bss_conf->ssid, assoc_data->ssid, assoc_data->ssid_len);
bss_conf->ssid_len = assoc_data->ssid_len; bss_conf->ssid_len = assoc_data->ssid_len;
rcu_read_unlock(); rcu_read_unlock();
@ -5668,15 +5669,15 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
assoc_data->supp_rates_len = bss->supp_rates_len; assoc_data->supp_rates_len = bss->supp_rates_len;
rcu_read_lock(); rcu_read_lock();
ht_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_HT_OPERATION); ht_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_HT_OPERATION);
if (ht_ie && ht_ie[1] >= sizeof(struct ieee80211_ht_operation)) if (ht_elem && ht_elem->datalen >= sizeof(struct ieee80211_ht_operation))
assoc_data->ap_ht_param = assoc_data->ap_ht_param =
((struct ieee80211_ht_operation *)(ht_ie + 2))->ht_param; ((struct ieee80211_ht_operation *)(ht_elem->data))->ht_param;
else if (!is_6ghz) else if (!is_6ghz)
ifmgd->flags |= IEEE80211_STA_DISABLE_HT; ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
vht_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_VHT_CAPABILITY); vht_elem = ieee80211_bss_get_elem(req->bss, WLAN_EID_VHT_CAPABILITY);
if (vht_ie && vht_ie[1] >= sizeof(struct ieee80211_vht_cap)) if (vht_elem && vht_elem->datalen >= sizeof(struct ieee80211_vht_cap))
memcpy(&assoc_data->ap_vht_cap, vht_ie + 2, memcpy(&assoc_data->ap_vht_cap, vht_elem->data,
sizeof(struct ieee80211_vht_cap)); sizeof(struct ieee80211_vht_cap));
else if (is_5ghz) else if (is_5ghz)
ifmgd->flags |= IEEE80211_STA_DISABLE_VHT | ifmgd->flags |= IEEE80211_STA_DISABLE_VHT |