Lines Matching +full:sd +full:- +full:hs
3 * Copyright (c) 2011-2014, Qualcomm Atheros, Inc.
67 sta->flags |= WLAN_STA_GAS; in gas_dialog_create()
74 hapd->conf->gas_comeback_delay / 1024 + in gas_dialog_create()
80 if (sta->gas_dialog == NULL) { in gas_dialog_create()
81 sta->gas_dialog = os_calloc(GAS_DIALOG_MAX, in gas_dialog_create()
83 if (sta->gas_dialog == NULL) in gas_dialog_create()
87 for (i = sta->gas_dialog_next, j = 0; j < GAS_DIALOG_MAX; i++, j++) { in gas_dialog_create()
90 if (sta->gas_dialog[i].valid) in gas_dialog_create()
92 dia = &sta->gas_dialog[i]; in gas_dialog_create()
93 dia->valid = 1; in gas_dialog_create()
94 dia->dialog_token = dialog_token; in gas_dialog_create()
95 sta->gas_dialog_next = (++i == GAS_DIALOG_MAX) ? 0 : i; in gas_dialog_create()
99 wpa_msg(hapd->msg_ctx, MSG_ERROR, "ANQP: Could not create dialog for " in gas_dialog_create()
120 for (i = 0; sta->gas_dialog && i < GAS_DIALOG_MAX; i++) { in gas_serv_dialog_find()
121 if (sta->gas_dialog[i].dialog_token != dialog_token || in gas_serv_dialog_find()
122 !sta->gas_dialog[i].valid) in gas_serv_dialog_find()
125 return &sta->gas_dialog[i]; in gas_serv_dialog_find()
135 wpabuf_free(dia->sd_resp); in gas_serv_dialog_clear()
147 if (sta == NULL || sta->gas_dialog == NULL) in gas_serv_free_dialogs()
151 if (sta->gas_dialog[i].valid) in gas_serv_free_dialogs()
155 os_free(sta->gas_dialog); in gas_serv_free_dialogs()
156 sta->gas_dialog = NULL; in gas_serv_free_dialogs()
172 if (hapd->conf->hs20_oper_friendly_name) in anqp_add_hs_capab_list()
174 if (hapd->conf->hs20_wan_metrics) in anqp_add_hs_capab_list()
176 if (hapd->conf->hs20_connection_capability) in anqp_add_hs_capab_list()
178 if (hapd->conf->nai_realm_data) in anqp_add_hs_capab_list()
180 if (hapd->conf->hs20_operating_class) in anqp_add_hs_capab_list()
182 if (hapd->conf->hs20_osu_providers_count) in anqp_add_hs_capab_list()
184 if (hapd->conf->hs20_osu_providers_nai_count) in anqp_add_hs_capab_list()
186 if (hapd->conf->hs20_icons_count) in anqp_add_hs_capab_list()
188 if (hapd->conf->hs20_operator_icon_count) in anqp_add_hs_capab_list()
200 dl_list_for_each(elem, &hapd->conf->anqp_elem, struct anqp_element, in get_anqp_elem()
202 if (elem->infoid == infoid) in get_anqp_elem()
218 if (wpabuf_tailroom(buf) < 2 + 2 + wpabuf_len(elem->payload)) { in anqp_add_elem()
225 wpabuf_put_le16(buf, wpabuf_len(elem->payload)); in anqp_add_elem()
226 wpabuf_put_buf(buf, elem->payload); in anqp_add_elem()
253 if (hapd->conf->venue_name || get_anqp_elem(hapd, ANQP_VENUE_NAME)) in anqp_add_capab_list()
257 if (hapd->conf->network_auth_type || in anqp_add_capab_list()
260 if (hapd->conf->roaming_consortium || in anqp_add_capab_list()
263 if (hapd->conf->ipaddr_type_configured || in anqp_add_capab_list()
266 if (hapd->conf->nai_realm_data || in anqp_add_capab_list()
269 if (hapd->conf->anqp_3gpp_cell_net || in anqp_add_capab_list()
278 if (hapd->conf->domain_name || get_anqp_elem(hapd, ANQP_DOMAIN_NAME)) in anqp_add_capab_list()
289 if (!dl_list_empty(&hapd->conf->fils_realms) || in anqp_add_capab_list()
295 if (hapd->conf->venue_url || get_anqp_elem(hapd, ANQP_VENUE_URL)) in anqp_add_capab_list()
317 if (hapd->conf->venue_name) { in anqp_add_venue_name()
321 wpabuf_put_u8(buf, hapd->conf->venue_group); in anqp_add_venue_name()
322 wpabuf_put_u8(buf, hapd->conf->venue_type); in anqp_add_venue_name()
323 for (i = 0; i < hapd->conf->venue_name_count; i++) { in anqp_add_venue_name()
325 vn = &hapd->conf->venue_name[i]; in anqp_add_venue_name()
326 wpabuf_put_u8(buf, 3 + vn->name_len); in anqp_add_venue_name()
327 wpabuf_put_data(buf, vn->lang, 3); in anqp_add_venue_name()
328 wpabuf_put_data(buf, vn->name, vn->name_len); in anqp_add_venue_name()
340 if (hapd->conf->venue_url) { in anqp_add_venue_url()
345 for (i = 0; i < hapd->conf->venue_url_count; i++) { in anqp_add_venue_url()
348 url = &hapd->conf->venue_url[i]; in anqp_add_venue_url()
349 wpabuf_put_u8(buf, 1 + url->url_len); in anqp_add_venue_url()
350 wpabuf_put_u8(buf, url->venue_number); in anqp_add_venue_url()
351 wpabuf_put_data(buf, url->url, url->url_len); in anqp_add_venue_url()
364 if (hapd->conf->network_auth_type) { in anqp_add_network_auth_type()
366 wpabuf_put_le16(buf, hapd->conf->network_auth_type_len); in anqp_add_network_auth_type()
367 wpabuf_put_data(buf, hapd->conf->network_auth_type, in anqp_add_network_auth_type()
368 hapd->conf->network_auth_type_len); in anqp_add_network_auth_type()
383 for (i = 0; i < hapd->conf->roaming_consortium_count; i++) { in anqp_add_roaming_consortium()
385 rc = &hapd->conf->roaming_consortium[i]; in anqp_add_roaming_consortium()
386 wpabuf_put_u8(buf, rc->len); in anqp_add_roaming_consortium()
387 wpabuf_put_data(buf, rc->oi, rc->len); in anqp_add_roaming_consortium()
399 if (hapd->conf->ipaddr_type_configured) { in anqp_add_ip_addr_type_availability()
402 wpabuf_put_u8(buf, hapd->conf->ipaddr_type_availability); in anqp_add_ip_addr_type_availability()
412 wpabuf_put_u8(buf, realm->eap_method_count); in anqp_add_nai_realm_eap()
414 for (i = 0; i < realm->eap_method_count; i++) { in anqp_add_nai_realm_eap()
415 struct hostapd_nai_realm_eap *eap = &realm->eap_method[i]; in anqp_add_nai_realm_eap()
416 wpabuf_put_u8(buf, 2 + (3 * eap->num_auths)); in anqp_add_nai_realm_eap()
417 wpabuf_put_u8(buf, eap->eap_method); in anqp_add_nai_realm_eap()
418 wpabuf_put_u8(buf, eap->num_auths); in anqp_add_nai_realm_eap()
419 for (j = 0; j < eap->num_auths; j++) { in anqp_add_nai_realm_eap()
420 wpabuf_put_u8(buf, eap->auth_id[j]); in anqp_add_nai_realm_eap()
422 wpabuf_put_u8(buf, eap->auth_val[j]); in anqp_add_nai_realm_eap()
434 wpa_printf(MSG_DEBUG, "realm=%s, len=%d", realm->realm[realm_idx], in anqp_add_nai_realm_data()
435 (int) os_strlen(realm->realm[realm_idx])); in anqp_add_nai_realm_data()
437 wpabuf_put_u8(buf, realm->encoding); in anqp_add_nai_realm_data()
438 wpabuf_put_u8(buf, os_strlen(realm->realm[realm_idx])); in anqp_add_nai_realm_data()
439 wpabuf_put_str(buf, realm->realm[realm_idx]); in anqp_add_nai_realm_data()
461 if (end - pos < 1) { in hs20_add_nai_home_realm_matches()
464 return -1; in hs20_add_nai_home_realm_matches()
469 if (end - pos < 2) { in hs20_add_nai_home_realm_matches()
473 return -1; in hs20_add_nai_home_realm_matches()
477 if (realm_len > end - pos) { in hs20_add_nai_home_realm_matches()
481 return -1; in hs20_add_nai_home_realm_matches()
484 for (j = 0; j < hapd->conf->nai_realm_count && in hs20_add_nai_home_realm_matches()
487 realm = &hapd->conf->nai_realm_data[j]; in hs20_add_nai_home_realm_matches()
488 if (encoding != realm->encoding) in hs20_add_nai_home_realm_matches()
500 realm->realm[k] && in hs20_add_nai_home_realm_matches()
502 if ((int) os_strlen(realm->realm[k]) != in hs20_add_nai_home_realm_matches()
503 rend - rpos || in hs20_add_nai_home_realm_matches()
505 realm->realm[k], in hs20_add_nai_home_realm_matches()
506 rend - rpos) != 0) in hs20_add_nai_home_realm_matches()
531 realm = &hapd->conf->nai_realm_data[matches[i].realm_data_idx]; in hs20_add_nai_home_realm_matches()
547 if (nai_realm && hapd->conf->nai_realm_data) { in anqp_add_nai_realm()
551 wpabuf_put_le16(buf, hapd->conf->nai_realm_count); in anqp_add_nai_realm()
552 for (i = 0; i < hapd->conf->nai_realm_count; i++) { in anqp_add_nai_realm()
556 realm = &hapd->conf->nai_realm_data[i]; in anqp_add_nai_realm()
558 wpabuf_put_u8(buf, realm->encoding); in anqp_add_nai_realm()
560 for (j = 0; realm->realm[j]; j++) { in anqp_add_nai_realm()
563 wpabuf_put_str(buf, realm->realm[j]); in anqp_add_nai_realm()
565 *realm_len = (u8 *) wpabuf_put(buf, 0) - realm_len - 1; in anqp_add_nai_realm()
570 } else if (nai_home_realm && hapd->conf->nai_realm_data && home_realm) { in anqp_add_nai_realm()
583 if (hapd->conf->anqp_3gpp_cell_net) { in anqp_add_3gpp_cellular_network()
586 hapd->conf->anqp_3gpp_cell_net_len); in anqp_add_3gpp_cellular_network()
587 wpabuf_put_data(buf, hapd->conf->anqp_3gpp_cell_net, in anqp_add_3gpp_cellular_network()
588 hapd->conf->anqp_3gpp_cell_net_len); in anqp_add_3gpp_cellular_network()
598 if (hapd->conf->domain_name) { in anqp_add_domain_name()
600 wpabuf_put_le16(buf, hapd->conf->domain_name_len); in anqp_add_domain_name()
601 wpabuf_put_data(buf, hapd->conf->domain_name, in anqp_add_domain_name()
602 hapd->conf->domain_name_len); in anqp_add_domain_name()
616 count = dl_list_len(&hapd->conf->fils_realms); in anqp_add_fils_realm_info()
625 dl_list_for_each(realm, &hapd->conf->fils_realms, in anqp_add_fils_realm_info()
629 wpabuf_put_data(buf, realm->hash, 2); in anqp_add_fils_realm_info()
630 count--; in anqp_add_fils_realm_info()
642 if (hapd->conf->hs20_oper_friendly_name) { in anqp_add_operator_friendly_name()
650 for (i = 0; i < hapd->conf->hs20_oper_friendly_name_count; i++) in anqp_add_operator_friendly_name()
653 vn = &hapd->conf->hs20_oper_friendly_name[i]; in anqp_add_operator_friendly_name()
654 wpabuf_put_u8(buf, 3 + vn->name_len); in anqp_add_operator_friendly_name()
655 wpabuf_put_data(buf, vn->lang, 3); in anqp_add_operator_friendly_name()
656 wpabuf_put_data(buf, vn->name, vn->name_len); in anqp_add_operator_friendly_name()
666 if (hapd->conf->hs20_wan_metrics) { in anqp_add_wan_metrics()
672 wpabuf_put_data(buf, hapd->conf->hs20_wan_metrics, 13); in anqp_add_wan_metrics()
681 if (hapd->conf->hs20_connection_capability) { in anqp_add_connection_capability()
687 wpabuf_put_data(buf, hapd->conf->hs20_connection_capability, in anqp_add_connection_capability()
688 hapd->conf->hs20_connection_capability_len); in anqp_add_connection_capability()
697 if (hapd->conf->hs20_operating_class) { in anqp_add_operating_class()
703 wpabuf_put_data(buf, hapd->conf->hs20_operating_class, in anqp_add_operating_class()
704 hapd->conf->hs20_operating_class_len); in anqp_add_operating_class()
716 for (j = 0; j < bss->hs20_icons_count && !icon; j++) { in anqp_add_icon()
717 if (os_strcmp(name, bss->hs20_icons[j].name) == 0) in anqp_add_icon()
718 icon = &bss->hs20_icons[j]; in anqp_add_icon()
723 wpabuf_put_le16(buf, icon->width); in anqp_add_icon()
724 wpabuf_put_le16(buf, icon->height); in anqp_add_icon()
725 wpabuf_put_data(buf, icon->language, 3); in anqp_add_icon()
726 wpabuf_put_u8(buf, os_strlen(icon->type)); in anqp_add_icon()
727 wpabuf_put_str(buf, icon->type); in anqp_add_icon()
728 wpabuf_put_u8(buf, os_strlen(icon->name)); in anqp_add_icon()
729 wpabuf_put_str(buf, icon->name); in anqp_add_icon()
744 for (i = 0; i < p->friendly_name_count; i++) { in anqp_add_osu_provider()
745 struct hostapd_lang_string *s = &p->friendly_name[i]; in anqp_add_osu_provider()
746 wpabuf_put_u8(buf, 3 + s->name_len); in anqp_add_osu_provider()
747 wpabuf_put_data(buf, s->lang, 3); in anqp_add_osu_provider()
748 wpabuf_put_data(buf, s->name, s->name_len); in anqp_add_osu_provider()
750 WPA_PUT_LE16(len2, (u8 *) wpabuf_put(buf, 0) - len2 - 2); in anqp_add_osu_provider()
753 if (p->server_uri) { in anqp_add_osu_provider()
754 wpabuf_put_u8(buf, os_strlen(p->server_uri)); in anqp_add_osu_provider()
755 wpabuf_put_str(buf, p->server_uri); in anqp_add_osu_provider()
761 for (i = 0; p->method_list && p->method_list[i] >= 0; i++) in anqp_add_osu_provider()
762 wpabuf_put_u8(buf, p->method_list[i]); in anqp_add_osu_provider()
767 for (i = 0; i < p->icons_count; i++) in anqp_add_osu_provider()
768 anqp_add_icon(buf, bss, p->icons[i]); in anqp_add_osu_provider()
769 WPA_PUT_LE16(len2, (u8 *) wpabuf_put(buf, 0) - len2 - 2); in anqp_add_osu_provider()
772 if (p->osu_nai) { in anqp_add_osu_provider()
773 wpabuf_put_u8(buf, os_strlen(p->osu_nai)); in anqp_add_osu_provider()
774 wpabuf_put_str(buf, p->osu_nai); in anqp_add_osu_provider()
780 for (i = 0; i < p->service_desc_count; i++) { in anqp_add_osu_provider()
781 struct hostapd_lang_string *s = &p->service_desc[i]; in anqp_add_osu_provider()
782 wpabuf_put_u8(buf, 3 + s->name_len); in anqp_add_osu_provider()
783 wpabuf_put_data(buf, s->lang, 3); in anqp_add_osu_provider()
784 wpabuf_put_data(buf, s->name, s->name_len); in anqp_add_osu_provider()
786 WPA_PUT_LE16(len2, (u8 *) wpabuf_put(buf, 0) - len2 - 2); in anqp_add_osu_provider()
788 WPA_PUT_LE16(len, (u8 *) wpabuf_put(buf, 0) - len - 2); in anqp_add_osu_provider()
795 if (hapd->conf->hs20_osu_providers_count) { in anqp_add_osu_providers_list()
804 wpabuf_put_u8(buf, hapd->conf->osu_ssid_len); in anqp_add_osu_providers_list()
805 wpabuf_put_data(buf, hapd->conf->osu_ssid, in anqp_add_osu_providers_list()
806 hapd->conf->osu_ssid_len); in anqp_add_osu_providers_list()
809 wpabuf_put_u8(buf, hapd->conf->hs20_osu_providers_count); in anqp_add_osu_providers_list()
811 for (i = 0; i < hapd->conf->hs20_osu_providers_count; i++) { in anqp_add_osu_providers_list()
813 buf, hapd->conf, in anqp_add_osu_providers_list()
814 &hapd->conf->hs20_osu_providers[i]); in anqp_add_osu_providers_list()
826 if (p->osu_nai2) { in anqp_add_osu_provider_nai()
827 wpabuf_put_u8(buf, os_strlen(p->osu_nai2)); in anqp_add_osu_provider_nai()
828 wpabuf_put_str(buf, p->osu_nai2); in anqp_add_osu_provider_nai()
838 if (hapd->conf->hs20_osu_providers_nai_count) { in anqp_add_osu_providers_nai_list()
846 for (i = 0; i < hapd->conf->hs20_osu_providers_count; i++) { in anqp_add_osu_providers_nai_list()
848 buf, &hapd->conf->hs20_osu_providers[i]); in anqp_add_osu_providers_nai_list()
864 wpa_hexdump_ascii(MSG_DEBUG, "HS 2.0: Requested Icon Filename", in anqp_add_icon_binary_file()
866 for (i = 0; i < hapd->conf->hs20_icons_count; i++) { in anqp_add_icon_binary_file()
867 icon = &hapd->conf->hs20_icons[i]; in anqp_add_icon_binary_file()
868 if (name_len == os_strlen(icon->name) && in anqp_add_icon_binary_file()
869 os_memcmp(name, icon->name, name_len) == 0) in anqp_add_icon_binary_file()
873 if (i < hapd->conf->hs20_icons_count) in anqp_add_icon_binary_file()
874 icon = &hapd->conf->hs20_icons[i]; in anqp_add_icon_binary_file()
888 data = os_readfile(icon->file, &data_len); in anqp_add_icon_binary_file()
896 wpabuf_put_u8(buf, os_strlen(icon->type)); in anqp_add_icon_binary_file()
897 wpabuf_put_str(buf, icon->type); in anqp_add_icon_binary_file()
915 struct hostapd_bss_config *bss = hapd->conf; in anqp_add_operator_icon_metadata()
919 if (!bss->hs20_operator_icon_count) in anqp_add_operator_icon_metadata()
929 for (i = 0; i < bss->hs20_operator_icon_count; i++) in anqp_add_operator_icon_metadata()
930 anqp_add_icon(buf, bss, bss->hs20_operator_icon[i]); in anqp_add_operator_icon_metadata()
942 if (hapd->conf->mbo_cell_data_conn_pref >= 0) { in anqp_add_mbo_cell_data_conn_pref()
947 wpabuf_put_u8(buf, hapd->conf->mbo_cell_data_conn_pref); in anqp_add_mbo_cell_data_conn_pref()
965 len += 2 + 2 + wpabuf_len(elem->payload); in anqp_get_required_len()
991 len += 2 * dl_list_len(&hapd->conf->fils_realms); in gas_serv_build_gas_resp_payload()
1093 qi->request |= bit; in set_anqp_req()
1112 hapd->conf->venue_name != NULL, qi); in rx_anqp_query_list_id()
1121 hapd->conf->network_auth_type != NULL, qi); in rx_anqp_query_list_id()
1125 hapd->conf->roaming_consortium != NULL, qi); in rx_anqp_query_list_id()
1130 hapd->conf->ipaddr_type_configured, qi); in rx_anqp_query_list_id()
1134 hapd->conf->nai_realm_data != NULL, qi); in rx_anqp_query_list_id()
1139 hapd->conf->anqp_3gpp_cell_net != NULL, qi); in rx_anqp_query_list_id()
1158 hapd->conf->domain_name != NULL, qi); in rx_anqp_query_list_id()
1178 !dl_list_empty(&hapd->conf->fils_realms)) { in rx_anqp_query_list_id()
1183 if (info_id == ANQP_VENUE_URL && hapd->conf->venue_url) { in rx_anqp_query_list_id()
1191 if (qi->num_extra_req == ANQP_MAX_EXTRA_REQ) { in rx_anqp_query_list_id()
1193 "ANQP: No more room for extra requests - ignore Info Id %u", in rx_anqp_query_list_id()
1198 qi->extra_req[qi->num_extra_req] = info_id; in rx_anqp_query_list_id()
1199 qi->num_extra_req++; in rx_anqp_query_list_id()
1210 (unsigned int) (end - pos) / 2); in rx_anqp_query_list()
1212 while (end - pos >= 2) { in rx_anqp_query_list()
1226 set_anqp_req(ANQP_REQ_HS_CAPABILITY_LIST, "HS Capability List", in rx_anqp_hs_query_list()
1232 hapd->conf->hs20_oper_friendly_name != NULL, qi); in rx_anqp_hs_query_list()
1236 hapd->conf->hs20_wan_metrics != NULL, qi); in rx_anqp_hs_query_list()
1241 hapd->conf->hs20_connection_capability != NULL, in rx_anqp_hs_query_list()
1246 hapd->conf->hs20_operating_class != NULL, qi); in rx_anqp_hs_query_list()
1250 hapd->conf->hs20_osu_providers_count, qi); in rx_anqp_hs_query_list()
1255 hapd->conf->hs20_operator_icon_count, qi); in rx_anqp_hs_query_list()
1260 hapd->conf->hs20_osu_providers_nai_count, qi); in rx_anqp_hs_query_list()
1263 wpa_printf(MSG_DEBUG, "ANQP: Unsupported HS 2.0 subtype %u", in rx_anqp_hs_query_list()
1274 qi->request |= ANQP_REQ_NAI_HOME_REALM; in rx_anqp_hs_nai_home_realm()
1275 qi->home_realm_query = pos; in rx_anqp_hs_nai_home_realm()
1276 qi->home_realm_query_len = end - pos; in rx_anqp_hs_nai_home_realm()
1277 if (hapd->conf->nai_realm_data != NULL) { in rx_anqp_hs_nai_home_realm()
1278 wpa_printf(MSG_DEBUG, "ANQP: HS 2.0 NAI Home Realm Query " in rx_anqp_hs_nai_home_realm()
1281 wpa_printf(MSG_DEBUG, "ANQP: HS 2.0 NAI Home Realm Query not " in rx_anqp_hs_nai_home_realm()
1291 qi->request |= ANQP_REQ_ICON_REQUEST; in rx_anqp_hs_icon_request()
1292 qi->icon_name = pos; in rx_anqp_hs_icon_request()
1293 qi->icon_name_len = end - pos; in rx_anqp_hs_icon_request()
1294 if (hapd->conf->hs20_icons_count) { in rx_anqp_hs_icon_request()
1295 wpa_printf(MSG_DEBUG, "ANQP: HS 2.0 Icon Request Query " in rx_anqp_hs_icon_request()
1298 wpa_printf(MSG_DEBUG, "ANQP: HS 2.0 Icon Request Query not " in rx_anqp_hs_icon_request()
1310 if (end - pos <= 1) in rx_anqp_vendor_specific_hs20()
1317 wpa_printf(MSG_DEBUG, "ANQP: HS 2.0 Query List"); in rx_anqp_vendor_specific_hs20()
1330 wpa_printf(MSG_DEBUG, "ANQP: Unsupported HS 2.0 query subtype " in rx_anqp_vendor_specific_hs20()
1344 * This is for P2P SD and will be taken care of by the P2P in rx_anqp_vendor_specific_p2p()
1349 "ANQP: Ignore WFA vendor type %u (P2P SD) in generic GAS server", in rx_anqp_vendor_specific_p2p()
1351 qi->p2p_sd = 1; in rx_anqp_vendor_specific_p2p()
1366 hapd->conf->mbo_cell_data_conn_pref >= 0, qi); in rx_anqp_mbo_query_list()
1382 if (end - pos < 1) in rx_anqp_vendor_specific_mbo()
1410 if (end - pos < 4) { in rx_anqp_vendor_specific()
1455 buf = gas_serv_build_gas_resp_payload(hapd, qi->request, in gas_serv_req_local_processing()
1456 qi->home_realm_query, in gas_serv_req_local_processing()
1457 qi->home_realm_query_len, in gas_serv_req_local_processing()
1458 qi->icon_name, qi->icon_name_len, in gas_serv_req_local_processing()
1459 qi->extra_req, qi->num_extra_req); in gas_serv_req_local_processing()
1465 if (wpabuf_len(buf) == 0 && qi->p2p_sd) { in gas_serv_req_local_processing()
1467 …"ANQP: Do not send response to P2P SD from generic GAS service (P2P SD implementation will process… in gas_serv_req_local_processing()
1473 if (wpabuf_len(buf) > hapd->conf->gas_frag_limit || in gas_serv_req_local_processing()
1474 hapd->conf->gas_comeback_delay) { in gas_serv_req_local_processing()
1478 if (hapd->conf->gas_comeback_delay) { in gas_serv_req_local_processing()
1479 /* Testing - allow overriding of the delay value */ in gas_serv_req_local_processing()
1480 comeback_delay = hapd->conf->gas_comeback_delay; in gas_serv_req_local_processing()
1484 "initial response - use GAS comeback"); in gas_serv_req_local_processing()
1495 di->prot = prot; in gas_serv_req_local_processing()
1496 di->sd_resp = buf; in gas_serv_req_local_processing()
1497 di->sd_resp_pos = 0; in gas_serv_req_local_processing()
1513 hostapd_drv_send_action(hapd, hapd->iface->freq, 0, sa, in gas_serv_req_local_processing()
1517 hostapd_drv_send_action_addr3_ap(hapd, hapd->iface->freq, 0, sa, in gas_serv_req_local_processing()
1531 if (wpabuf_len(buf) > hapd->conf->gas_frag_limit || in gas_serv_req_dpp_processing()
1532 hapd->conf->gas_comeback_delay) { in gas_serv_req_dpp_processing()
1536 if (hapd->conf->gas_comeback_delay) { in gas_serv_req_dpp_processing()
1537 /* Testing - allow overriding of the delay value */ in gas_serv_req_dpp_processing()
1538 comeback_delay = hapd->conf->gas_comeback_delay; in gas_serv_req_dpp_processing()
1542 "DPP: Too long response to fit in initial response - use GAS comeback"); in gas_serv_req_dpp_processing()
1555 di->prot = prot; in gas_serv_req_dpp_processing()
1556 di->sd_resp = buf; in gas_serv_req_dpp_processing()
1557 di->sd_resp_pos = 0; in gas_serv_req_dpp_processing()
1558 di->dpp = 1; in gas_serv_req_dpp_processing()
1585 hostapd_drv_send_action(hapd, freq ? freq : hapd->iface->freq, 0, sa, in gas_serv_req_dpp_processing()
1615 wpa_msg(hapd->msg_ctx, MSG_DEBUG, in gas_serv_rx_gas_initial_req()
1620 wpa_msg(hapd->msg_ctx, MSG_DEBUG, in gas_serv_rx_gas_initial_req()
1627 if (slen > end - pos || slen < 2) { in gas_serv_rx_gas_initial_req()
1628 wpa_msg(hapd->msg_ctx, MSG_DEBUG, in gas_serv_rx_gas_initial_req()
1633 pos++; /* skip QueryRespLenLimit and PAME-BI */ in gas_serv_rx_gas_initial_req()
1646 wpa_msg(hapd->msg_ctx, MSG_DEBUG, in gas_serv_rx_gas_initial_req()
1650 return; /* Invalid source address - drop silently */ in gas_serv_rx_gas_initial_req()
1661 hostapd_drv_send_action(hapd, hapd->iface->freq, 0, sa, in gas_serv_rx_gas_initial_req()
1666 hapd->iface->freq, 0, in gas_serv_rx_gas_initial_req()
1675 if (end - pos < 2) in gas_serv_rx_gas_initial_req()
1679 if (slen > end - pos) in gas_serv_rx_gas_initial_req()
1701 if (end - pos < 4) in gas_serv_rx_gas_initial_req()
1709 if (elen > end - pos) { in gas_serv_rx_gas_initial_req()
1750 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: Dialog Token: %u", in gas_serv_rx_gas_comeback_req()
1755 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: No pending SD " in gas_serv_rx_gas_comeback_req()
1760 return; /* Invalid source address - drop silently */ in gas_serv_rx_gas_comeback_req()
1769 frag_len = wpabuf_len(dialog->sd_resp) - dialog->sd_resp_pos; in gas_serv_rx_gas_comeback_req()
1770 if (frag_len > hapd->conf->gas_frag_limit) { in gas_serv_rx_gas_comeback_req()
1771 frag_len = hapd->conf->gas_frag_limit; in gas_serv_rx_gas_comeback_req()
1774 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: resp frag_len %u", in gas_serv_rx_gas_comeback_req()
1776 buf = wpabuf_alloc_copy(wpabuf_head_u8(dialog->sd_resp) + in gas_serv_rx_gas_comeback_req()
1777 dialog->sd_resp_pos, frag_len); in gas_serv_rx_gas_comeback_req()
1779 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: Failed to allocate " in gas_serv_rx_gas_comeback_req()
1785 if (dialog->dpp) { in gas_serv_rx_gas_comeback_req()
1788 dialog->sd_frag_id, more, 0, in gas_serv_rx_gas_comeback_req()
1799 dialog->sd_frag_id, in gas_serv_rx_gas_comeback_req()
1806 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: Tx GAS Comeback Response " in gas_serv_rx_gas_comeback_req()
1808 dialog->sd_frag_id, more, (int) frag_len); in gas_serv_rx_gas_comeback_req()
1809 dialog->sd_frag_id++; in gas_serv_rx_gas_comeback_req()
1810 dialog->sd_resp_pos += frag_len; in gas_serv_rx_gas_comeback_req()
1813 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: %d more bytes remain " in gas_serv_rx_gas_comeback_req()
1815 (int) (wpabuf_len(dialog->sd_resp) - in gas_serv_rx_gas_comeback_req()
1816 dialog->sd_resp_pos)); in gas_serv_rx_gas_comeback_req()
1818 wpa_msg(hapd->msg_ctx, MSG_DEBUG, "GAS: All fragments of " in gas_serv_rx_gas_comeback_req()
1819 "SD response sent"); in gas_serv_rx_gas_comeback_req()
1821 if (dialog->dpp) in gas_serv_rx_gas_comeback_req()
1832 hostapd_drv_send_action(hapd, hapd->iface->freq, 0, sa, in gas_serv_rx_gas_comeback_req()
1836 hostapd_drv_send_action_addr3_ap(hapd, hapd->iface->freq, 0, sa, in gas_serv_rx_gas_comeback_req()
1854 if (mgmt->u.action.category != WLAN_ACTION_PUBLIC && in gas_serv_rx_public_action()
1855 mgmt->u.action.category != WLAN_ACTION_PROTECTED_DUAL) in gas_serv_rx_public_action()
1862 prot = mgmt->u.action.category == WLAN_ACTION_PROTECTED_DUAL; in gas_serv_rx_public_action()
1863 sa = mgmt->sa; in gas_serv_rx_public_action()
1864 if (hapd->conf->gas_address3 == 1) in gas_serv_rx_public_action()
1866 else if (hapd->conf->gas_address3 == 2) in gas_serv_rx_public_action()
1869 std_addr3 = is_broadcast_ether_addr(mgmt->bssid); in gas_serv_rx_public_action()
1870 len -= IEEE80211_HDRLEN + 1; in gas_serv_rx_public_action()
1874 gas_serv_rx_gas_initial_req(hapd, sa, data + 1, len - 1, prot, in gas_serv_rx_public_action()
1878 gas_serv_rx_gas_comeback_req(hapd, sa, data + 1, len - 1, prot, in gas_serv_rx_public_action()
1887 hapd->public_action_cb2 = gas_serv_rx_public_action; in gas_serv_init()
1888 hapd->public_action_cb2_ctx = hapd; in gas_serv_init()