mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-24 16:28:23 -05:00
BSS: Use wrapper function for getting a pointer to the IE buffer
This makes it easier to change the internal struct wpa_bss design for storing the variable length IE buffers. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
95edd81441
commit
be7ee264f6
@ -361,8 +361,7 @@ static bool is_p2p_pending_bss(struct wpa_supplicant *wpa_s,
|
|||||||
ETH_ALEN) == 0)
|
ETH_ALEN) == 0)
|
||||||
return true;
|
return true;
|
||||||
if (!is_zero_ether_addr(wpa_s->pending_join_dev_addr) &&
|
if (!is_zero_ether_addr(wpa_s->pending_join_dev_addr) &&
|
||||||
p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
|
p2p_parse_dev_addr(wpa_bss_ie_ptr(bss), bss->ie_len, addr) == 0 &&
|
||||||
addr) == 0 &&
|
|
||||||
os_memcmp(addr, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0)
|
os_memcmp(addr, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0)
|
||||||
return true;
|
return true;
|
||||||
#endif /* CONFIG_P2P */
|
#endif /* CONFIG_P2P */
|
||||||
@ -568,7 +567,7 @@ static u32 wpa_bss_compare_res(const struct wpa_bss *old,
|
|||||||
changes |= WPA_BSS_MODE_CHANGED_FLAG;
|
changes |= WPA_BSS_MODE_CHANGED_FLAG;
|
||||||
|
|
||||||
if (old->ie_len == new_res->ie_len &&
|
if (old->ie_len == new_res->ie_len &&
|
||||||
os_memcmp(old + 1, new_res + 1, old->ie_len) == 0)
|
os_memcmp(wpa_bss_ie_ptr(old), new_res + 1, old->ie_len) == 0)
|
||||||
return changes;
|
return changes;
|
||||||
changes |= WPA_BSS_IES_CHANGED_FLAG;
|
changes |= WPA_BSS_IES_CHANGED_FLAG;
|
||||||
|
|
||||||
@ -1075,7 +1074,7 @@ struct wpa_bss * wpa_bss_get_p2p_dev_addr(struct wpa_supplicant *wpa_s,
|
|||||||
struct wpa_bss *bss, *found = NULL;
|
struct wpa_bss *bss, *found = NULL;
|
||||||
dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
|
dl_list_for_each_reverse(bss, &wpa_s->bss, struct wpa_bss, list) {
|
||||||
u8 addr[ETH_ALEN];
|
u8 addr[ETH_ALEN];
|
||||||
if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
|
if (p2p_parse_dev_addr(wpa_bss_ie_ptr(bss), bss->ie_len,
|
||||||
addr) != 0 ||
|
addr) != 0 ||
|
||||||
os_memcmp(addr, dev_addr, ETH_ALEN) != 0)
|
os_memcmp(addr, dev_addr, ETH_ALEN) != 0)
|
||||||
continue;
|
continue;
|
||||||
@ -1139,7 +1138,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)
|
||||||
{
|
{
|
||||||
return get_ie((const u8 *) (bss + 1), bss->ie_len, ie);
|
return get_ie(wpa_bss_ie_ptr(bss), bss->ie_len, ie);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1154,7 +1153,7 @@ const u8 * wpa_bss_get_ie(const struct wpa_bss *bss, u8 ie)
|
|||||||
*/
|
*/
|
||||||
const u8 * wpa_bss_get_ie_ext(const struct wpa_bss *bss, u8 ext)
|
const u8 * wpa_bss_get_ie_ext(const struct wpa_bss *bss, u8 ext)
|
||||||
{
|
{
|
||||||
return get_ie_ext((const u8 *) (bss + 1), bss->ie_len, ext);
|
return get_ie_ext(wpa_bss_ie_ptr(bss), bss->ie_len, ext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1172,7 +1171,7 @@ const u8 * wpa_bss_get_vendor_ie(const struct wpa_bss *bss, u32 vendor_type)
|
|||||||
const u8 *ies;
|
const u8 *ies;
|
||||||
const struct element *elem;
|
const struct element *elem;
|
||||||
|
|
||||||
ies = (const u8 *) (bss + 1);
|
ies = wpa_bss_ie_ptr(bss);
|
||||||
|
|
||||||
for_each_element_id(elem, WLAN_EID_VENDOR_SPECIFIC, ies, bss->ie_len) {
|
for_each_element_id(elem, WLAN_EID_VENDOR_SPECIFIC, ies, bss->ie_len) {
|
||||||
if (elem->datalen >= 4 &&
|
if (elem->datalen >= 4 &&
|
||||||
@ -1205,7 +1204,7 @@ const u8 * wpa_bss_get_vendor_ie_beacon(const struct wpa_bss *bss,
|
|||||||
if (bss->beacon_ie_len == 0)
|
if (bss->beacon_ie_len == 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
ies = (const u8 *) (bss + 1);
|
ies = wpa_bss_ie_ptr(bss);
|
||||||
ies += bss->ie_len;
|
ies += bss->ie_len;
|
||||||
|
|
||||||
for_each_element_id(elem, WLAN_EID_VENDOR_SPECIFIC, ies,
|
for_each_element_id(elem, WLAN_EID_VENDOR_SPECIFIC, ies,
|
||||||
@ -1239,7 +1238,7 @@ struct wpabuf * wpa_bss_get_vendor_ie_multi(const struct wpa_bss *bss,
|
|||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pos = (const u8 *) (bss + 1);
|
pos = wpa_bss_ie_ptr(bss);
|
||||||
end = pos + bss->ie_len;
|
end = pos + bss->ie_len;
|
||||||
|
|
||||||
while (end - pos > 1) {
|
while (end - pos > 1) {
|
||||||
@ -1288,7 +1287,7 @@ struct wpabuf * wpa_bss_get_vendor_ie_multi_beacon(const struct wpa_bss *bss,
|
|||||||
if (buf == NULL)
|
if (buf == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pos = (const u8 *) (bss + 1);
|
pos = wpa_bss_ie_ptr(bss);
|
||||||
pos += bss->ie_len;
|
pos += bss->ie_len;
|
||||||
end = pos + bss->beacon_ie_len;
|
end = pos + bss->beacon_ie_len;
|
||||||
|
|
||||||
|
@ -113,6 +113,11 @@ struct wpa_bss {
|
|||||||
/* followed by beacon_ie_len octets of IEs */
|
/* followed by beacon_ie_len octets of IEs */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline const u8 * wpa_bss_ie_ptr(const struct wpa_bss *bss)
|
||||||
|
{
|
||||||
|
return (const u8 *) (bss + 1);
|
||||||
|
}
|
||||||
|
|
||||||
void wpa_bss_update_start(struct wpa_supplicant *wpa_s);
|
void wpa_bss_update_start(struct wpa_supplicant *wpa_s);
|
||||||
void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
|
void wpa_bss_update_scan_res(struct wpa_supplicant *wpa_s,
|
||||||
struct wpa_scan_res *res,
|
struct wpa_scan_res *res,
|
||||||
|
@ -5022,7 +5022,7 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
return 0;
|
return 0;
|
||||||
pos += ret;
|
pos += ret;
|
||||||
|
|
||||||
ie = (const u8 *) (bss + 1);
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
for (i = 0; i < bss->ie_len; i++) {
|
for (i = 0; i < bss->ie_len; i++) {
|
||||||
ret = os_snprintf(pos, end - pos, "%02x", *ie++);
|
ret = os_snprintf(pos, end - pos, "%02x", *ie++);
|
||||||
if (os_snprintf_error(end - pos, ret))
|
if (os_snprintf_error(end - pos, ret))
|
||||||
@ -5189,7 +5189,7 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
|
|
||||||
#ifdef CONFIG_WPS
|
#ifdef CONFIG_WPS
|
||||||
if (mask & WPA_BSS_MASK_WPS_SCAN) {
|
if (mask & WPA_BSS_MASK_WPS_SCAN) {
|
||||||
ie = (const u8 *) (bss + 1);
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
ret = wpas_wps_scan_result_text(ie, bss->ie_len, pos, end);
|
ret = wpas_wps_scan_result_text(ie, bss->ie_len, pos, end);
|
||||||
if (ret >= end - pos)
|
if (ret >= end - pos)
|
||||||
return 0;
|
return 0;
|
||||||
@ -5200,7 +5200,7 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
|
|
||||||
#ifdef CONFIG_P2P
|
#ifdef CONFIG_P2P
|
||||||
if (mask & WPA_BSS_MASK_P2P_SCAN) {
|
if (mask & WPA_BSS_MASK_P2P_SCAN) {
|
||||||
ie = (const u8 *) (bss + 1);
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
ret = wpas_p2p_scan_result_text(ie, bss->ie_len, pos, end);
|
ret = wpas_p2p_scan_result_text(ie, bss->ie_len, pos, end);
|
||||||
if (ret >= end - pos)
|
if (ret >= end - pos)
|
||||||
return 0;
|
return 0;
|
||||||
@ -5212,7 +5212,8 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
#ifdef CONFIG_WIFI_DISPLAY
|
#ifdef CONFIG_WIFI_DISPLAY
|
||||||
if (mask & WPA_BSS_MASK_WIFI_DISPLAY) {
|
if (mask & WPA_BSS_MASK_WIFI_DISPLAY) {
|
||||||
struct wpabuf *wfd;
|
struct wpabuf *wfd;
|
||||||
ie = (const u8 *) (bss + 1);
|
|
||||||
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
wfd = ieee802_11_vendor_ie_concat(ie, bss->ie_len,
|
wfd = ieee802_11_vendor_ie_concat(ie, bss->ie_len,
|
||||||
WFD_IE_VENDOR_TYPE);
|
WFD_IE_VENDOR_TYPE);
|
||||||
if (wfd) {
|
if (wfd) {
|
||||||
@ -5290,7 +5291,7 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
|
|
||||||
#ifdef CONFIG_MESH
|
#ifdef CONFIG_MESH
|
||||||
if (mask & WPA_BSS_MASK_MESH_SCAN) {
|
if (mask & WPA_BSS_MASK_MESH_SCAN) {
|
||||||
ie = (const u8 *) (bss + 1);
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
ret = wpas_mesh_scan_result_text(ie, bss->ie_len, pos, end);
|
ret = wpas_mesh_scan_result_text(ie, bss->ie_len, pos, end);
|
||||||
if (ret >= end - pos)
|
if (ret >= end - pos)
|
||||||
return 0;
|
return 0;
|
||||||
@ -5337,7 +5338,7 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
|
|||||||
return 0;
|
return 0;
|
||||||
pos += ret;
|
pos += ret;
|
||||||
|
|
||||||
ie = (const u8 *) (bss + 1);
|
ie = wpa_bss_ie_ptr(bss);
|
||||||
ie += bss->ie_len;
|
ie += bss->ie_len;
|
||||||
for (i = 0; i < bss->beacon_ie_len; i++) {
|
for (i = 0; i < bss->beacon_ie_len; i++) {
|
||||||
ret = os_snprintf(pos, end - pos, "%02x", *ie++);
|
ret = os_snprintf(pos, end - pos, "%02x", *ie++);
|
||||||
|
@ -1852,7 +1852,7 @@ wpas_get_est_throughput_from_bss_snr(const struct wpa_supplicant *wpa_s,
|
|||||||
const struct wpa_bss *bss, int snr)
|
const struct wpa_bss *bss, int snr)
|
||||||
{
|
{
|
||||||
int rate = wpa_bss_get_max_rate(bss);
|
int rate = wpa_bss_get_max_rate(bss);
|
||||||
const u8 *ies = (const void *) (bss + 1);
|
const u8 *ies = wpa_bss_ie_ptr(bss);
|
||||||
size_t ie_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
size_t ie_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
||||||
|
|
||||||
return wpas_get_est_tpt(wpa_s, ies, ie_len, rate, snr);
|
return wpas_get_est_tpt(wpa_s, ies, ie_len, rate, snr);
|
||||||
@ -3029,7 +3029,7 @@ static void wpas_fst_update_mb_assoc(struct wpa_supplicant *wpa_s,
|
|||||||
if (!bss)
|
if (!bss)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ieprb = (const u8 *) (bss + 1);
|
ieprb = wpa_bss_ie_ptr(bss);
|
||||||
iebcn = ieprb + bss->ie_len;
|
iebcn = ieprb + bss->ie_len;
|
||||||
|
|
||||||
if (!wpas_fst_update_mbie(wpa_s, ieprb, bss->ie_len))
|
if (!wpas_fst_update_mbie(wpa_s, ieprb, bss->ie_len))
|
||||||
|
@ -424,12 +424,13 @@ static int wpas_sta_secondary_channel_offset(struct wpa_bss *bss, u8 *current,
|
|||||||
u8 *channel)
|
u8 *channel)
|
||||||
{
|
{
|
||||||
|
|
||||||
u8 *ies, phy_type;
|
const u8 *ies;
|
||||||
|
u8 phy_type;
|
||||||
size_t ies_len;
|
size_t ies_len;
|
||||||
|
|
||||||
if (!bss)
|
if (!bss)
|
||||||
return -1;
|
return -1;
|
||||||
ies = (u8 *) (bss + 1);
|
ies = wpa_bss_ie_ptr(bss);
|
||||||
ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
||||||
return wpas_get_op_chan_phy(bss->freq, ies, ies_len, current,
|
return wpas_get_op_chan_phy(bss->freq, ies, ies_len, current,
|
||||||
channel, &phy_type);
|
channel, &phy_type);
|
||||||
|
@ -1107,9 +1107,9 @@ static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s,
|
|||||||
"group is persistent - BSS " MACSTR
|
"group is persistent - BSS " MACSTR
|
||||||
" did not include P2P IE", MAC2STR(bssid));
|
" did not include P2P IE", MAC2STR(bssid));
|
||||||
wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs",
|
wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs",
|
||||||
(u8 *) (bss + 1), bss->ie_len);
|
wpa_bss_ie_ptr(bss), bss->ie_len);
|
||||||
wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs",
|
wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs",
|
||||||
((u8 *) bss + 1) + bss->ie_len,
|
wpa_bss_ie_ptr(bss) + bss->ie_len,
|
||||||
bss->beacon_ie_len);
|
bss->beacon_ie_len);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -5200,7 +5200,7 @@ static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
|
|||||||
wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
|
wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
|
||||||
"from BSS table: %d MHz (SSID %s)", freq,
|
"from BSS table: %d MHz (SSID %s)", freq,
|
||||||
wpa_ssid_txt(bss->ssid, bss->ssid_len));
|
wpa_ssid_txt(bss->ssid, bss->ssid_len));
|
||||||
if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
|
if (p2p_parse_dev_addr(wpa_bss_ie_ptr(bss), bss->ie_len,
|
||||||
dev_addr) == 0 &&
|
dev_addr) == 0 &&
|
||||||
os_memcmp(wpa_s->pending_join_dev_addr,
|
os_memcmp(wpa_s->pending_join_dev_addr,
|
||||||
wpa_s->pending_join_iface_addr, ETH_ALEN) == 0 &&
|
wpa_s->pending_join_iface_addr, ETH_ALEN) == 0 &&
|
||||||
|
@ -775,10 +775,10 @@ int wpas_get_op_chan_phy(int freq, const u8 *ies, size_t ies_len,
|
|||||||
static int wpas_beacon_rep_add_frame_body(struct bitfield *eids,
|
static int wpas_beacon_rep_add_frame_body(struct bitfield *eids,
|
||||||
enum beacon_report_detail detail,
|
enum beacon_report_detail detail,
|
||||||
struct wpa_bss *bss, u8 *buf,
|
struct wpa_bss *bss, u8 *buf,
|
||||||
size_t buf_len, u8 **ies_buf,
|
size_t buf_len, const u8 **ies_buf,
|
||||||
size_t *ie_len, int add_fixed)
|
size_t *ie_len, int add_fixed)
|
||||||
{
|
{
|
||||||
u8 *ies = *ies_buf;
|
const u8 *ies = *ies_buf;
|
||||||
size_t ies_len = *ie_len;
|
size_t ies_len = *ie_len;
|
||||||
u8 *pos = buf;
|
u8 *pos = buf;
|
||||||
int rem_len;
|
int rem_len;
|
||||||
@ -860,7 +860,7 @@ static int wpas_add_beacon_rep_elem(struct beacon_rep_data *data,
|
|||||||
struct wpa_bss *bss,
|
struct wpa_bss *bss,
|
||||||
struct wpabuf **wpa_buf,
|
struct wpabuf **wpa_buf,
|
||||||
struct rrm_measurement_beacon_report *rep,
|
struct rrm_measurement_beacon_report *rep,
|
||||||
u8 **ie, size_t *ie_len, u8 idx)
|
const u8 **ie, size_t *ie_len, u8 idx)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
u8 *buf, *pos;
|
u8 *buf, *pos;
|
||||||
@ -927,8 +927,8 @@ static int wpas_add_beacon_rep(struct wpa_supplicant *wpa_s,
|
|||||||
u64 start, u64 parent_tsf)
|
u64 start, u64 parent_tsf)
|
||||||
{
|
{
|
||||||
struct beacon_rep_data *data = &wpa_s->beacon_rep_data;
|
struct beacon_rep_data *data = &wpa_s->beacon_rep_data;
|
||||||
u8 *ies = (u8 *) (bss + 1);
|
const u8 *ies = wpa_bss_ie_ptr(bss);
|
||||||
u8 *pos = ies;
|
const u8 *pos = ies;
|
||||||
size_t ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
size_t ies_len = bss->ie_len ? bss->ie_len : bss->beacon_ie_len;
|
||||||
struct rrm_measurement_beacon_report rep;
|
struct rrm_measurement_beacon_report rep;
|
||||||
u8 idx = 0;
|
u8 idx = 0;
|
||||||
|
@ -2276,8 +2276,7 @@ void wpa_supplicant_associate(struct wpa_supplicant *wpa_s,
|
|||||||
|
|
||||||
#ifdef CONFIG_TDLS
|
#ifdef CONFIG_TDLS
|
||||||
if (bss)
|
if (bss)
|
||||||
wpa_tdls_ap_ies(wpa_s->wpa, (const u8 *) (bss + 1),
|
wpa_tdls_ap_ies(wpa_s->wpa, wpa_bss_ie_ptr(bss), bss->ie_len);
|
||||||
bss->ie_len);
|
|
||||||
#endif /* CONFIG_TDLS */
|
#endif /* CONFIG_TDLS */
|
||||||
|
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
|
Loading…
Reference in New Issue
Block a user