int anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst, u16 info_ids[], size_t num_ids) { struct wpabuf *buf; int ret = 0; int freq; struct wpa_bss *bss; int res; freq = wpa_s->assoc_freq; bss = wpa_bss_get_bssid(wpa_s, dst); if (bss) freq = bss->freq; if (freq <= 0) return -1; wpa_printf(MSG_DEBUG, "ANQP: Query Request to " MACSTR " for %u id(s)", MAC2STR(dst), (unsigned int) num_ids); buf = anqp_build_req(info_ids, num_ids, NULL); if (buf == NULL) return -1; res = gas_query_req(wpa_s->gas, dst, freq, buf, anqp_resp_cb, wpa_s); if (res < 0) { wpa_printf(MSG_DEBUG, "ANQP: Failed to send Query Request"); ret = -1; } else wpa_printf(MSG_DEBUG, "ANQP: Query started with dialog token " "%u", res); wpabuf_free(buf); return ret; }
int hs20_anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst, u32 stypes, const u8 *payload, size_t payload_len, int inmem) { struct wpabuf *buf; int ret = 0; int freq; struct wpa_bss *bss; int res; struct icon_entry *icon_entry; bss = wpa_bss_get_bssid(wpa_s, dst); if (!bss) { wpa_printf(MSG_WARNING, "ANQP: Cannot send query to unknown BSS " MACSTR, MAC2STR(dst)); return -1; } wpa_bss_anqp_unshare_alloc(bss); freq = bss->freq; wpa_printf(MSG_DEBUG, "HS20: ANQP Query Request to " MACSTR " for " "subtypes 0x%x", MAC2STR(dst), stypes); buf = hs20_build_anqp_req(stypes, payload, payload_len); if (buf == NULL) return -1; res = gas_query_req(wpa_s->gas, dst, freq, buf, anqp_resp_cb, wpa_s); if (res < 0) { wpa_printf(MSG_DEBUG, "ANQP: Failed to send Query Request"); wpabuf_free(buf); return -1; } else wpa_printf(MSG_DEBUG, "ANQP: Query started with dialog token " "%u", res); if (inmem) { icon_entry = os_zalloc(sizeof(struct icon_entry)); if (!icon_entry) return -1; os_memcpy(icon_entry->bssid, dst, ETH_ALEN); icon_entry->file_name = os_malloc(payload_len + 1); if (!icon_entry->file_name) { os_free(icon_entry); return -1; } os_memcpy(icon_entry->file_name, payload, payload_len); icon_entry->file_name[payload_len] = '\0'; icon_entry->dialog_token = res; dl_list_add(&wpa_s->icon_head, &icon_entry->list); } return ret; }
static int interworking_anqp_send_req(struct wpa_supplicant *wpa_s, struct wpa_bss *bss) { struct wpabuf *buf; int ret = 0; int res; u16 info_ids[] = { ANQP_CAPABILITY_LIST, ANQP_VENUE_NAME, ANQP_NETWORK_AUTH_TYPE, ANQP_ROAMING_CONSORTIUM, ANQP_IP_ADDR_TYPE_AVAILABILITY, ANQP_NAI_REALM, ANQP_3GPP_CELLULAR_NETWORK, ANQP_DOMAIN_NAME }; struct wpabuf *extra = NULL; wpa_printf(MSG_DEBUG, "Interworking: ANQP Query Request to " MACSTR, MAC2STR(bss->bssid)); buf = anqp_build_req(info_ids, sizeof(info_ids) / sizeof(info_ids[0]), extra); wpabuf_free(extra); if (buf == NULL) return -1; res = gas_query_req(wpa_s->gas, bss->bssid, bss->freq, buf, interworking_anqp_resp_cb, wpa_s); if (res < 0) { wpa_printf(MSG_DEBUG, "ANQP: Failed to send Query Request"); ret = -1; } else wpa_printf(MSG_DEBUG, "ANQP: Query started with dialog token " "%u", res); wpabuf_free(buf); return ret; }
int hs20_anqp_send_req(struct wpa_supplicant *wpa_s, const u8 *dst, u32 stypes, const u8 *payload, size_t payload_len) { struct wpabuf *buf; int ret = 0; int freq; struct wpa_bss *bss; int res; freq = wpa_s->assoc_freq; bss = wpa_bss_get_bssid(wpa_s, dst); if (bss) { wpa_bss_anqp_unshare_alloc(bss); freq = bss->freq; } if (freq <= 0) return -1; wpa_printf(MSG_DEBUG, "HS20: ANQP Query Request to " MACSTR " for " "subtypes 0x%x", MAC2STR(dst), stypes); buf = hs20_build_anqp_req(stypes, payload, payload_len); if (buf == NULL) return -1; res = gas_query_req(wpa_s->gas, dst, freq, buf, anqp_resp_cb, wpa_s); if (res < 0) { wpa_printf(MSG_DEBUG, "ANQP: Failed to send Query Request"); wpabuf_free(buf); ret = -1; } else wpa_printf(MSG_DEBUG, "ANQP: Query started with dialog token " "%u", res); return ret; }