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;
|
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);
|
struct wpabuf * mb_ies_by_info(struct mb_ies_info *info);
|
||||||
|
|
||||||
const char * fc2str(u16 fc);
|
const char * fc2str(u16 fc);
|
||||||
|
|
||||||
|
const u8 * get_ie(const u8 *ies, size_t len, u8 eid);
|
||||||
|
|
||||||
#endif /* IEEE802_11_COMMON_H */
|
#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);
|
struct wpa_scan_results * wpa_driver_nl80211_get_scan_results(void *priv);
|
||||||
void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv);
|
void nl80211_dump_scan(struct wpa_driver_nl80211_data *drv);
|
||||||
int wpa_driver_nl80211_abort_scan(void *priv);
|
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,
|
int wpa_driver_nl80211_vendor_scan(struct i802_bss *bss,
|
||||||
struct wpa_driver_scan_params *params);
|
struct wpa_driver_scan_params *params);
|
||||||
|
|
||||||
|
|
|
@ -335,9 +335,9 @@ static void mlme_event_connect(struct wpa_driver_nl80211_data *drv,
|
||||||
event.assoc_info.req_ies_len = nla_len(req_ie);
|
event.assoc_info.req_ies_len = nla_len(req_ie);
|
||||||
|
|
||||||
if (cmd == NL80211_CMD_ROAM) {
|
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,
|
event.assoc_info.req_ies_len,
|
||||||
WLAN_EID_SSID);
|
WLAN_EID_SSID);
|
||||||
if (ssid && ssid[1] > 0 && ssid[1] <= 32) {
|
if (ssid && ssid[1] > 0 && ssid[1] <= 32) {
|
||||||
drv->ssid_len = ssid[1];
|
drv->ssid_len = ssid[1];
|
||||||
os_memcpy(drv->ssid, ssid + 2, ssid[1]);
|
os_memcpy(drv->ssid, ssid + 2, ssid[1]);
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "utils/common.h"
|
#include "utils/common.h"
|
||||||
#include "utils/eloop.h"
|
#include "utils/eloop.h"
|
||||||
#include "common/ieee802_11_defs.h"
|
#include "common/ieee802_11_defs.h"
|
||||||
|
#include "common/ieee802_11_common.h"
|
||||||
#include "common/qca-vendor.h"
|
#include "common/qca-vendor.h"
|
||||||
#include "driver_nl80211.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,
|
static int nl80211_scan_filtered(struct wpa_driver_nl80211_data *drv,
|
||||||
const u8 *ie, size_t ie_len)
|
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)
|
if (drv->filter_ssids == NULL)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ssid = nl80211_get_ie(ie, ie_len, WLAN_EID_SSID);
|
ssid = get_ie(ie, ie_len, WLAN_EID_SSID);
|
||||||
if (ssid == NULL)
|
if (ssid == NULL)
|
||||||
return 1;
|
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)
|
if (os_memcmp(res->res[i]->bssid, r->bssid, ETH_ALEN) != 0)
|
||||||
continue;
|
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);
|
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] ||
|
if (s1 == NULL || s2 == NULL || s1[1] != s2[1] ||
|
||||||
os_memcmp(s1, s2, 2 + s1[1]) != 0)
|
os_memcmp(s1, s2, 2 + s1[1]) != 0)
|
||||||
continue;
|
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 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
|
||||||
{
|
{
|
||||||
const u8 *end, *pos;
|
return get_ie((const u8 *) (bss + 1), bss->ie_len, ie);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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 * wpa_scan_get_ie(const struct wpa_scan_res *res, u8 ie)
|
||||||
{
|
{
|
||||||
const u8 *end, *pos;
|
return get_ie((const u8 *) (res + 1), res->ie_len, ie);
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue