Commit fb8b53ac authored by Johannes Berg's avatar Johannes Berg

cfg80211: use ieee80211_bss_get_elem() instead of _get_ie()

Use the structured helper for finding an element instead of
the unstructured ieee80211_bss_get_ie().

Link: https://lore.kernel.org/r/20210930131130.e94709f341c3.I4ddb7fcb40efca27987deda7f9a144a5702ebfae@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent fb5f6a0e
...@@ -3670,14 +3670,16 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag ...@@ -3670,14 +3670,16 @@ static int nl80211_send_iface(struct sk_buff *msg, u32 portid, u32 seq, int flag
case NL80211_IFTYPE_STATION: case NL80211_IFTYPE_STATION:
case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_P2P_CLIENT:
case NL80211_IFTYPE_ADHOC: { case NL80211_IFTYPE_ADHOC: {
const u8 *ssid_ie; const struct element *ssid_elem;
if (!wdev->current_bss) if (!wdev->current_bss)
break; break;
rcu_read_lock(); rcu_read_lock();
ssid_ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, ssid_elem = ieee80211_bss_get_elem(&wdev->current_bss->pub,
WLAN_EID_SSID); WLAN_EID_SSID);
if (ssid_ie && if (ssid_elem &&
nla_put(msg, NL80211_ATTR_SSID, ssid_ie[1], ssid_ie + 2)) nla_put(msg, NL80211_ATTR_SSID, ssid_elem->datalen,
ssid_elem->data))
goto nla_put_failure_rcu_locked; goto nla_put_failure_rcu_locked;
rcu_read_unlock(); rcu_read_unlock();
break; break;
......
...@@ -406,22 +406,20 @@ static int ...@@ -406,22 +406,20 @@ static int
cfg80211_add_nontrans_list(struct cfg80211_bss *trans_bss, cfg80211_add_nontrans_list(struct cfg80211_bss *trans_bss,
struct cfg80211_bss *nontrans_bss) struct cfg80211_bss *nontrans_bss)
{ {
const u8 *ssid; const struct element *ssid_elem;
size_t ssid_len;
struct cfg80211_bss *bss = NULL; struct cfg80211_bss *bss = NULL;
rcu_read_lock(); rcu_read_lock();
ssid = ieee80211_bss_get_ie(nontrans_bss, WLAN_EID_SSID); ssid_elem = ieee80211_bss_get_elem(nontrans_bss, WLAN_EID_SSID);
if (!ssid) { if (!ssid_elem) {
rcu_read_unlock(); rcu_read_unlock();
return -EINVAL; return -EINVAL;
} }
ssid_len = ssid[1];
ssid = ssid + 2;
/* check if nontrans_bss is in the list */ /* check if nontrans_bss is in the list */
list_for_each_entry(bss, &trans_bss->nontrans_list, nontrans_list) { list_for_each_entry(bss, &trans_bss->nontrans_list, nontrans_list) {
if (is_bss(bss, nontrans_bss->bssid, ssid, ssid_len)) { if (is_bss(bss, nontrans_bss->bssid, ssid_elem->data,
ssid_elem->datalen)) {
rcu_read_unlock(); rcu_read_unlock();
return 0; return 0;
} }
...@@ -2234,7 +2232,8 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy, ...@@ -2234,7 +2232,8 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy,
struct ieee80211_mgmt *mgmt, size_t len) struct ieee80211_mgmt *mgmt, size_t len)
{ {
u8 *ie, *new_ie, *pos; u8 *ie, *new_ie, *pos;
const u8 *nontrans_ssid, *trans_ssid, *mbssid; const struct element *nontrans_ssid;
const u8 *trans_ssid, *mbssid;
size_t ielen = len - offsetof(struct ieee80211_mgmt, size_t ielen = len - offsetof(struct ieee80211_mgmt,
u.probe_resp.variable); u.probe_resp.variable);
size_t new_ie_len; size_t new_ie_len;
...@@ -2261,11 +2260,11 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy, ...@@ -2261,11 +2260,11 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy,
return; return;
new_ie_len -= mbssid[1]; new_ie_len -= mbssid[1];
nontrans_ssid = ieee80211_bss_get_ie(nontrans_bss, WLAN_EID_SSID); nontrans_ssid = ieee80211_bss_get_elem(nontrans_bss, WLAN_EID_SSID);
if (!nontrans_ssid) if (!nontrans_ssid)
return; return;
new_ie_len += nontrans_ssid[1]; new_ie_len += nontrans_ssid->datalen;
/* generate new ie for nontrans BSS /* generate new ie for nontrans BSS
* 1. replace SSID with nontrans BSS' SSID * 1. replace SSID with nontrans BSS' SSID
...@@ -2282,7 +2281,7 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy, ...@@ -2282,7 +2281,7 @@ cfg80211_update_notlisted_nontrans(struct wiphy *wiphy,
pos = new_ie; pos = new_ie;
/* copy the nontransmitted SSID */ /* copy the nontransmitted SSID */
cpy_len = nontrans_ssid[1] + 2; cpy_len = nontrans_ssid->datalen + 2;
memcpy(pos, nontrans_ssid, cpy_len); memcpy(pos, nontrans_ssid, cpy_len);
pos += cpy_len; pos += cpy_len;
/* copy the IEs between SSID and MBSSID */ /* copy the IEs between SSID and MBSSID */
......
...@@ -680,7 +680,9 @@ void __cfg80211_connect_result(struct net_device *dev, ...@@ -680,7 +680,9 @@ void __cfg80211_connect_result(struct net_device *dev,
bool wextev) bool wextev)
{ {
struct wireless_dev *wdev = dev->ieee80211_ptr; struct wireless_dev *wdev = dev->ieee80211_ptr;
const u8 *country_ie; const struct element *country_elem;
const u8 *country_data;
u8 country_datalen;
#ifdef CONFIG_CFG80211_WEXT #ifdef CONFIG_CFG80211_WEXT
union iwreq_data wrqu; union iwreq_data wrqu;
#endif #endif
...@@ -762,26 +764,22 @@ void __cfg80211_connect_result(struct net_device *dev, ...@@ -762,26 +764,22 @@ void __cfg80211_connect_result(struct net_device *dev,
cfg80211_upload_connect_keys(wdev); cfg80211_upload_connect_keys(wdev);
rcu_read_lock(); rcu_read_lock();
country_ie = ieee80211_bss_get_ie(cr->bss, WLAN_EID_COUNTRY); country_elem = ieee80211_bss_get_elem(cr->bss, WLAN_EID_COUNTRY);
if (!country_ie) { if (!country_elem) {
rcu_read_unlock(); rcu_read_unlock();
return; return;
} }
country_ie = kmemdup(country_ie, 2 + country_ie[1], GFP_ATOMIC); country_datalen = country_elem->datalen;
country_data = kmemdup(country_elem->data, country_datalen, GFP_ATOMIC);
rcu_read_unlock(); rcu_read_unlock();
if (!country_ie) if (!country_data)
return; return;
/*
* ieee80211_bss_get_ie() ensures we can access:
* - country_ie + 2, the start of the country ie data, and
* - and country_ie[1] which is the IE length
*/
regulatory_hint_country_ie(wdev->wiphy, cr->bss->channel->band, regulatory_hint_country_ie(wdev->wiphy, cr->bss->channel->band,
country_ie + 2, country_ie[1]); country_data, country_datalen);
kfree(country_ie); kfree(country_data);
} }
/* Consumes bss object one way or another */ /* Consumes bss object one way or another */
......
...@@ -212,18 +212,18 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev, ...@@ -212,18 +212,18 @@ int cfg80211_mgd_wext_giwessid(struct net_device *dev,
wdev_lock(wdev); wdev_lock(wdev);
if (wdev->current_bss) { if (wdev->current_bss) {
const u8 *ie; const struct element *ssid_elem;
rcu_read_lock(); rcu_read_lock();
ie = ieee80211_bss_get_ie(&wdev->current_bss->pub, ssid_elem = ieee80211_bss_get_elem(&wdev->current_bss->pub,
WLAN_EID_SSID); WLAN_EID_SSID);
if (ie) { if (ssid_elem) {
data->flags = 1; data->flags = 1;
data->length = ie[1]; data->length = ssid_elem->datalen;
if (data->length > IW_ESSID_MAX_SIZE) if (data->length > IW_ESSID_MAX_SIZE)
ret = -EINVAL; ret = -EINVAL;
else else
memcpy(ssid, ie + 2, data->length); memcpy(ssid, ssid_elem->data, data->length);
} }
rcu_read_unlock(); rcu_read_unlock();
} else if (wdev->wext.connect.ssid && wdev->wext.connect.ssid_len) { } else if (wdev->wext.connect.ssid && wdev->wext.connect.ssid_len) {
......
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