utils: Share a single helper function to get IE by ID
Add a helper function to find a certain IE inside IEs buffer by ID and use this function in several places that implemented similar functionality locally. Signed-off-by: Avraham Stern <avraham.stern@intel.com>
This commit is contained in:
parent
ea69d9737c
commit
231b04b6cb
7 changed files with 46 additions and 58 deletions
|
@ -1172,3 +1172,36 @@ struct wpabuf * mb_ies_by_info(struct mb_ies_info *info)
|
|||
|
||||
return mb_ies;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* get_ie - Fetch a specified information element from IEs buffer
|
||||
* @ies: Information elements buffer
|
||||
* @len: Information elements buffer length
|
||||
* @eid: Information element identifier (WLAN_EID_*)
|
||||
* Returns: Pointer to the information element (id field) or %NULL if not found
|
||||
*
|
||||
* This function returns the first matching information element in the IEs
|
||||
* buffer or %NULL in case the element is not found.
|
||||
*/
|
||||
const u8 * get_ie(const u8 *ies, size_t len, u8 eid)
|
||||
{
|
||||
const u8 *end;
|
||||
|
||||
if (!ies)
|
||||
return NULL;
|
||||
|
||||
end = ies + len;
|
||||
|
||||
while (end - ies > 1) {
|
||||
if (2 + ies[1] > end - ies)
|
||||
break;
|
||||
|
||||
if (ies[0] == eid)
|
||||
return ies;
|
||||
|
||||
ies += 2 + ies[1];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
|
|
@ -125,4 +125,7 @@ int mb_ies_info_by_ies(struct mb_ies_info *info, const u8 *ies_buf,
|
|||
struct wpabuf * mb_ies_by_info(struct mb_ies_info *info);
|
||||
|
||||
const char * fc2str(u16 fc);
|
||||
|
||||
const u8 * get_ie(const u8 *ies, size_t len, u8 eid);
|
||||
|
||||
#endif /* IEEE802_11_COMMON_H */
|
||||
|
|
|
@ -285,7 +285,6 @@ int wpa_driver_nl80211_stop_sched_scan(void *priv);
|
|||
struct wpa_scan_results * wpa_driver_nl80211_get_scan_results(void *priv);
|
||||
void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv);
|
||||
int wpa_driver_nl80211_abort_scan(void *priv);
|
||||
const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie);
|
||||
int wpa_driver_nl80211_vendor_scan(struct i802_bss *bss,
|
||||
struct wpa_driver_scan_params *params);
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@ static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
|
|||
event.assoc_info.req_ies_len = nla_len(req_ie);
|
||||
|
||||
if (cmd == NL80211_CMD_ROAM) {
|
||||
ssid = nl80211_get_ie(event.assoc_info.req_ies,
|
||||
ssid = get_ie(event.assoc_info.req_ies,
|
||||
event.assoc_info.req_ies_len,
|
||||
WLAN_EID_SSID);
|
||||
if (ssid && ssid[1] > 0 && ssid[1] <= 32) {
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
#include "utils/common.h"
|
||||
#include "utils/eloop.h"
|
||||
#include "common/ieee802_11_defs.h"
|
||||
#include "common/ieee802_11_common.h"
|
||||
#include "common/qca-vendor.h"
|
||||
#include "driver_nl80211.h"
|
||||
|
||||
|
@ -522,28 +523,6 @@ int wpa_driver_nl80211_stop_sched_scan(void *priv)
|
|||
}
|
||||
|
||||
|
||||
const u8 * nl80211_get_ie(const u8 *ies, size_t ies_len, u8 ie)
|
||||
{
|
||||
const u8 *end, *pos;
|
||||
|
||||
if (ies == NULL)
|
||||
return NULL;
|
||||
|
||||
pos = ies;
|
||||
end = ies + ies_len;
|
||||
|
||||
while (end - pos > 1) {
|
||||
if (2 + pos[1] > end - pos)
|
||||
break;
|
||||
if (pos[0] == ie)
|
||||
return pos;
|
||||
pos += 2 + pos[1];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static int nl80211_scan_filtered(struct wpa_driver_nl80211_data *drv,
|
||||
const u8 *ie, size_t ie_len)
|
||||
{
|
||||
|
@ -553,7 +532,7 @@ static int nl80211_scan_filtered(struct wpa_driver_nl80211_data *drv,
|
|||
if (drv->filter_ssids == NULL)
|
||||
return 0;
|
||||
|
||||
ssid = nl80211_get_ie(ie, ie_len, WLAN_EID_SSID);
|
||||
ssid = get_ie(ie, ie_len, WLAN_EID_SSID);
|
||||
if (ssid == NULL)
|
||||
return 1;
|
||||
|
||||
|
@ -714,9 +693,9 @@ int bss_info_handler(struct nl_msg *msg, void *arg)
|
|||
if (os_memcmp(res->res[i]->bssid, r->bssid, ETH_ALEN) != 0)
|
||||
continue;
|
||||
|
||||
s1 = nl80211_get_ie((u8 *) (res->res[i] + 1),
|
||||
s1 = get_ie((u8 *) (res->res[i] + 1),
|
||||
res->res[i]->ie_len, WLAN_EID_SSID);
|
||||
s2 = nl80211_get_ie((u8 *) (r + 1), r->ie_len, WLAN_EID_SSID);
|
||||
s2 = get_ie((u8 *) (r + 1), r->ie_len, WLAN_EID_SSID);
|
||||
if (s1 == NULL || s2 == NULL || s1[1] != s2[1] ||
|
||||
os_memcmp(s1, s2, 2 + s1[1]) != 0)
|
||||
continue;
|
||||
|
|
|
@ -1019,20 +1019,7 @@ struct wpa_bss * wpa_bss_get_id_range(struct wpa_supplicant *wpa_s,
|
|||
*/
|
||||
const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
|
||||
{
|
||||
const u8 *end, *pos;
|
||||
|
||||
pos = (const u8 *) (bss + 1);
|
||||
end = pos + bss->ie_len;
|
||||
|
||||
while (end - pos > 1) {
|
||||
if (2 + pos[1] > end - pos)
|
||||
break;
|
||||
if (pos[0] == ie)
|
||||
return pos;
|
||||
pos += 2 + pos[1];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return get_ie((const u8 *) (bss + 1), bss->ie_len, ie);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1535,20 +1535,7 @@ static int wpa_scan_get_max_rate(const struct wpa_scan_res *res)
|
|||
*/
|
||||
const u8 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
|
||||
{
|
||||
const u8 *end, *pos;
|
||||
|
||||
pos = (const u8 *) (res + 1);
|
||||
end = pos + res->ie_len;
|
||||
|
||||
while (end - pos > 1) {
|
||||
if (2 + pos[1] > end - pos)
|
||||
break;
|
||||
if (pos[0] == ie)
|
||||
return pos;
|
||||
pos += 2 + pos[1];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
return get_ie((const u8 *) (res + 1), res->ie_len, ie);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue