Indicate whether additional ANQP elements were protected

Store information on whether extra ANQP elements were received using the
protection alternative (protected GAS during an association using PMF)
and make this available through the control interface BSS command.

For example:
anqp[277]=<hexdump>
protected-anqp-info[277]=1

Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
Jouni Malinen 2020-11-23 20:32:26 +02:00 committed by Jouni Malinen
parent 90ca804e47
commit 1c77f3d3f9
3 changed files with 17 additions and 4 deletions

View File

@ -23,6 +23,7 @@ struct wpa_scan_res;
struct wpa_bss_anqp_elem { struct wpa_bss_anqp_elem {
struct dl_list list; struct dl_list list;
u16 infoid; u16 infoid;
bool protected; /* received in a protected GAS response */
struct wpabuf *payload; struct wpabuf *payload;
}; };

View File

@ -5285,6 +5285,14 @@ static int print_bss_info(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
os_snprintf(title, sizeof(title), "anqp[%u]", os_snprintf(title, sizeof(title), "anqp[%u]",
elem->infoid); elem->infoid);
pos = anqp_add_hex(pos, end, title, elem->payload); pos = anqp_add_hex(pos, end, title, elem->payload);
if (elem->protected) {
ret = os_snprintf(pos, end - pos,
"protected-anqp-info[%u]=1\n",
elem->infoid);
if (os_snprintf_error(end - pos, ret))
return 0;
pos += ret;
}
} }
} }
#endif /* CONFIG_INTERWORKING */ #endif /* CONFIG_INTERWORKING */

View File

@ -2831,7 +2831,7 @@ int anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst, int freq,
static void anqp_add_extra(struct wpa_supplicant *wpa_s, static void anqp_add_extra(struct wpa_supplicant *wpa_s,
struct wpa_bss_anqp *anqp, u16 info_id, struct wpa_bss_anqp *anqp, u16 info_id,
const u8 *data, size_t slen) const u8 *data, size_t slen, bool protected)
{ {
struct wpa_bss_anqp_elem *tmp, *elem = NULL; struct wpa_bss_anqp_elem *tmp, *elem = NULL;
@ -2856,6 +2856,7 @@ static void anqp_add_extra(struct wpa_supplicant *wpa_s,
wpabuf_free(elem->payload); wpabuf_free(elem->payload);
} }
elem->protected = protected;
elem->payload = wpabuf_alloc_copy(data, slen); elem->payload = wpabuf_alloc_copy(data, slen);
if (!elem->payload) { if (!elem->payload) {
dl_list_del(&elem->list); dl_list_del(&elem->list);
@ -2898,6 +2899,7 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
const u8 *pos = data; const u8 *pos = data;
struct wpa_bss_anqp *anqp = NULL; struct wpa_bss_anqp *anqp = NULL;
u8 type; u8 type;
bool protected;
if (bss) if (bss)
anqp = bss->anqp; anqp = bss->anqp;
@ -2998,9 +3000,10 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
case ANQP_VENUE_URL: case ANQP_VENUE_URL:
wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR " Venue URL", wpa_msg(wpa_s, MSG_INFO, RX_ANQP MACSTR " Venue URL",
MAC2STR(sa)); MAC2STR(sa));
anqp_add_extra(wpa_s, anqp, info_id, pos, slen); protected = pmf_in_use(wpa_s, sa);
anqp_add_extra(wpa_s, anqp, info_id, pos, slen, protected);
if (!pmf_in_use(wpa_s, sa)) { if (!protected) {
wpa_printf(MSG_DEBUG, wpa_printf(MSG_DEBUG,
"ANQP: Ignore Venue URL since PMF was not enabled"); "ANQP: Ignore Venue URL since PMF was not enabled");
break; break;
@ -3052,7 +3055,8 @@ static void interworking_parse_rx_anqp_resp(struct wpa_supplicant *wpa_s,
default: default:
wpa_msg(wpa_s, MSG_DEBUG, wpa_msg(wpa_s, MSG_DEBUG,
"Interworking: Unsupported ANQP Info ID %u", info_id); "Interworking: Unsupported ANQP Info ID %u", info_id);
anqp_add_extra(wpa_s, anqp, info_id, data, slen); anqp_add_extra(wpa_s, anqp, info_id, data, slen,
pmf_in_use(wpa_s, sa));
break; break;
} }
} }