[PATCH 16/18] Interworking: make sure interworking is supported before sending ANQP
andrei.otcheretianski at intel.com
andrei.otcheretianski at intel.com
Mon Sep 5 07:33:09 PDT 2016
From: David Spinadel <david.spinadel at intel.com>
Check that AP supports interworking before sending ANQP query.
While at it prevent sending GAS query to unknown BSSs.
Signed-off-by: David Spinadel <david.spinadel at intel.com>
---
wpa_supplicant/hs20_supplicant.c | 6 ++++++
wpa_supplicant/interworking.c | 35 +++++++++++++++++++++++++++++++----
wpa_supplicant/interworking.h | 1 +
3 files changed, 38 insertions(+), 4 deletions(-)
diff --git a/wpa_supplicant/hs20_supplicant.c b/wpa_supplicant/hs20_supplicant.c
index e88f147..4a504a9 100644
--- a/wpa_supplicant/hs20_supplicant.c
+++ b/wpa_supplicant/hs20_supplicant.c
@@ -238,6 +238,12 @@ int hs20_anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst, u32 stypes,
return -1;
}
+ if (!interworking_supported_bss(bss)) {
+ wpa_printf(MSG_WARNING,
+ "HS20: Cannot send query. AP does not support interworking");
+ return -1;
+ }
+
wpa_bss_anqp_unshare_alloc(bss);
freq = bss->freq;
diff --git a/wpa_supplicant/interworking.c b/wpa_supplicant/interworking.c
index 697810e..1585490 100644
--- a/wpa_supplicant/interworking.c
+++ b/wpa_supplicant/interworking.c
@@ -2691,6 +2691,18 @@ void interworking_stop_fetch_anqp(struct wpa_supplicant *wpa_s)
}
+int interworking_supported_bss(const struct wpa_bss *bss)
+{
+ const u8 *ext_capab;
+
+ if (!bss)
+ return 0;
+
+ ext_capab = wpa_bss_get_ie(bss, WLAN_EID_EXT_CAPAB);
+ return ext_capab && ext_capab[1] >= 4 && (ext_capab[5] & 0x80);
+}
+
+
int anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst,
u16 info_ids[], size_t num_ids, u32 subtypes)
{
@@ -2709,6 +2721,12 @@ int anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst,
return -1;
}
+ if (!interworking_supported_bss(bss)) {
+ wpa_printf(MSG_WARNING,
+ "ANQP: Cannot send query. AP does not support interworking");
+ return -1;
+ }
+
wpa_bss_anqp_unshare_alloc(bss);
freq = bss->freq;
@@ -3084,12 +3102,21 @@ int gas_send_request(struct wpa_supplicant *wpa_s, const u8 *dst,
size_t len;
u8 query_resp_len_limit = 0;
- freq = wpa_s->assoc_freq;
bss = wpa_bss_get_bssid(wpa_s, dst);
- if (bss)
- freq = bss->freq;
- if (freq <= 0)
+ if (!bss) {
+ wpa_msg(wpa_s, MSG_WARNING,
+ "GAS: Cannot send query to unknown BSS "
+ MACSTR, MAC2STR(dst));
return -1;
+ }
+
+ if (!interworking_supported_bss(bss)) {
+ wpa_msg(wpa_s, MSG_WARNING,
+ "GAS: Cannot send query. AP does not support interworking");
+ return -1;
+ }
+
+ freq = bss->freq;
wpa_msg(wpa_s, MSG_DEBUG, "GAS request to " MACSTR " (freq %d MHz)",
MAC2STR(dst), freq);
diff --git a/wpa_supplicant/interworking.h b/wpa_supplicant/interworking.h
index 3743dc0..8090cf7 100644
--- a/wpa_supplicant/interworking.h
+++ b/wpa_supplicant/interworking.h
@@ -32,5 +32,6 @@ int interworking_home_sp_cred(struct wpa_supplicant *wpa_s,
struct wpabuf *domain_names);
int domain_name_list_contains(struct wpabuf *domain_names,
const char *domain, int exact_match);
+int interworking_supported_bss(const struct wpa_bss *bss);
#endif /* INTERWORKING_H */
--
1.9.1
More information about the Hostap
mailing list