static void anqp_add_venue_name(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di) { if (hapd->conf->hs20_venue_name) { wpabuf_put_le16(buf, ANQP_VENUE_NAME); wpabuf_put_le16(buf, hapd->conf->hs20_venue_name_len); wpabuf_put_data(buf, hapd->conf->hs20_venue_name, hapd->conf->hs20_venue_name_len); } else if (hapd->conf->venue_name) { u8 *len; unsigned int i; len = gas_anqp_add_element(buf, ANQP_VENUE_NAME); wpabuf_put_u8(buf, hapd->conf->venue_group); wpabuf_put_u8(buf, hapd->conf->venue_type); for (i = 0; i < hapd->conf->venue_name_count; i++) { struct hostapd_venue_name *vn; vn = &hapd->conf->venue_name[i]; wpabuf_put_u8(buf, 3 + vn->name_len); wpabuf_put_data(buf, vn->lang, 3); wpabuf_put_data(buf, vn->name, vn->name_len); } gas_anqp_set_element_len(buf, len); } else if (di) { wpabuf_put_data(buf, di->venue_name, di->venue_name_len); } }
static struct wpabuf * p2p_build_gas_comeback_resp(u8 dialog_token, u16 status_code, u16 update_indic, const u8 *data, size_t len, u8 frag_id, u8 more, u16 total_len) { struct wpabuf *buf; buf = gas_anqp_build_comeback_resp(dialog_token, status_code, frag_id, more, 0, 100 + len); if (buf == NULL) return NULL; if (frag_id == 0) { /* ANQP Query Response Frame */ wpabuf_put_le16(buf, ANQP_VENDOR_SPECIFIC); /* Info ID */ wpabuf_put_le16(buf, 3 + 1 + 2 + total_len); wpabuf_put_be32(buf, P2P_IE_VENDOR_TYPE); /* Service Update Indicator */ wpabuf_put_le16(buf, update_indic); } wpabuf_put_data(buf, data, len); gas_anqp_set_len(buf); return buf; }
static void anqp_add_domain_name(struct hostapd_data *hapd, struct wpabuf *buf) { if (hapd->conf->domain_name) { wpabuf_put_le16(buf, ANQP_DOMAIN_NAME); wpabuf_put_le16(buf, hapd->conf->domain_name_len); wpabuf_put_data(buf, hapd->conf->domain_name, hapd->conf->domain_name_len); } }
static void anqp_add_nai_realm(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di, struct anqp_query_info *qi, int nai_realm, int nai_home_realm) { /* dynamically set nai_realm_list overrides static configuration */ if (nai_realm && hapd->conf->hs20_nai_realm_list) { wpabuf_put_le16(buf, ANQP_NAI_REALM); wpabuf_put_le16(buf, hapd->conf->hs20_nai_realm_list_len); wpabuf_put_data(buf, hapd->conf->hs20_nai_realm_list, hapd->conf->hs20_nai_realm_list_len); } else if (nai_realm && hapd->conf->nai_realm_data) { u8 *len; unsigned int i, j; len = gas_anqp_add_element(buf, ANQP_NAI_REALM); wpabuf_put_le16(buf, hapd->conf->nai_realm_count); for (i = 0; i < hapd->conf->nai_realm_count; i++) { u8 *realm_data_len, *realm_len; struct hostapd_nai_realm_data *realm; realm = &hapd->conf->nai_realm_data[i]; realm_data_len = wpabuf_put(buf, 2); wpabuf_put_u8(buf, realm->encoding); realm_len = wpabuf_put(buf, 1); for (j = 0; realm->realm[j]; j++) { if (j > 0) wpabuf_put_u8(buf, ';'); wpabuf_put_str(buf, realm->realm[j]); } *realm_len = (u8 *) wpabuf_put(buf, 0) - realm_len - 1; if (realm->num_auths) { wpabuf_put_u8(buf, 1); /* EAP method count */ wpabuf_put_u8(buf, 2 + (3 * realm->num_auths)); wpabuf_put_u8(buf, realm->eap_method); wpabuf_put_u8(buf, realm->num_auths); for (j = 0; j < realm->num_auths; j++) { wpabuf_put_u8(buf, realm->auth_id[j]); wpabuf_put_u8(buf, 1); wpabuf_put_u8(buf, realm->auth_val[j]); } } else { wpabuf_put_u8(buf, 0); /* EAP method count */ } gas_anqp_set_element_len(buf, realm_data_len); } gas_anqp_set_element_len(buf, len); } else if (nai_home_realm && hapd->conf->nai_realm_data) { process_hs_nai_home_realm(hapd, buf, qi); } else if (di) { if (nai_realm) wpabuf_put_data(buf, di->nai_realm, di->nai_realm_len); if (nai_home_realm) wpabuf_put_data(buf, di->nai_home_realm, di->nai_home_realm_len); } }
static void anqp_add_ip_addr_type_availability(struct hostapd_data *hapd, struct wpabuf *buf) { if (hapd->conf->ipaddr_type_configured) { wpabuf_put_le16(buf, ANQP_IP_ADDR_TYPE_AVAILABILITY); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, hapd->conf->ipaddr_type_availability); } }
static void anqp_add_network_auth_type(struct hostapd_data *hapd, struct wpabuf *buf) { if (hapd->conf->network_auth_type) { wpabuf_put_le16(buf, ANQP_NETWORK_AUTH_TYPE); wpabuf_put_le16(buf, hapd->conf->network_auth_type_len); wpabuf_put_data(buf, hapd->conf->network_auth_type, hapd->conf->network_auth_type_len); } }
static void anqp_add_3gpp_cellular_network(struct hostapd_data *hapd, struct wpabuf *buf) { if (hapd->conf->anqp_3gpp_cell_net) { wpabuf_put_le16(buf, ANQP_3GPP_CELLULAR_NETWORK); wpabuf_put_le16(buf, hapd->conf->anqp_3gpp_cell_net_len); wpabuf_put_data(buf, hapd->conf->anqp_3gpp_cell_net, hapd->conf->anqp_3gpp_cell_net_len); } }
void p2p_buf_add_ext_listen_timing(struct wpabuf *buf, u16 period, u16 interval) { /* Extended Listen Timing */ wpabuf_put_u8(buf, P2P_ATTR_EXT_LISTEN_TIMING); wpabuf_put_le16(buf, 4); wpabuf_put_le16(buf, period); wpabuf_put_le16(buf, interval); wpa_printf(MSG_DEBUG, "P2P: * Extended Listen Timing (period %u msec " "interval %u msec)", period, interval); }
static void anqp_add_icon_binary_file(struct hostapd_data *hapd, struct wpabuf *buf, const u8 *name, size_t name_len) { struct hs20_icon *icon; size_t i; u8 *len; wpa_hexdump_ascii(MSG_DEBUG, "HS 2.0: Requested Icon Filename", name, name_len); for (i = 0; i < hapd->conf->hs20_icons_count; i++) { icon = &hapd->conf->hs20_icons[i]; if (name_len == os_strlen(icon->name) && os_memcmp(name, icon->name, name_len) == 0) break; } if (i < hapd->conf->hs20_icons_count) icon = &hapd->conf->hs20_icons[i]; else icon = NULL; len = gas_anqp_add_element(buf, ANQP_VENDOR_SPECIFIC); wpabuf_put_be24(buf, OUI_WFA); wpabuf_put_u8(buf, HS20_ANQP_OUI_TYPE); wpabuf_put_u8(buf, HS20_STYPE_ICON_BINARY_FILE); wpabuf_put_u8(buf, 0); /* Reserved */ if (icon) { char *data; size_t data_len; data = os_readfile(icon->file, &data_len); if (data == NULL || data_len > 65535) { wpabuf_put_u8(buf, 2); /* Download Status: * Unspecified file error */ wpabuf_put_u8(buf, 0); wpabuf_put_le16(buf, 0); } else { wpabuf_put_u8(buf, 0); /* Download Status: Success */ wpabuf_put_u8(buf, os_strlen(icon->type)); wpabuf_put_str(buf, icon->type); wpabuf_put_le16(buf, data_len); wpabuf_put_data(buf, data, data_len); } os_free(data); } else { wpabuf_put_u8(buf, 1); /* Download Status: File not found */ wpabuf_put_u8(buf, 0); wpabuf_put_le16(buf, 0); } gas_anqp_set_element_len(buf, len); }
static void anqp_add_ip_addr_type_availability(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di) { if (hapd->conf->hs20_ipaddr_type_configured) { wpabuf_put_le16(buf, ANQP_IP_ADDR_TYPE_AVAILABILITY); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, hapd->conf->hs20_ipaddr_type_availability); } else if (di) { wpabuf_put_data(buf, di->ipaddr_type, di->ipaddr_type_len); } }
static void anqp_add_domain_name(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di) { if (hapd->conf->hs20_domain_name_list_value) { wpabuf_put_le16(buf, ANQP_DOMAIN_NAME); wpabuf_put_le16(buf, hapd->conf->hs20_domain_name_list_len); wpabuf_put_data(buf, hapd->conf->hs20_domain_name_list_value, hapd->conf->hs20_domain_name_list_len); } else if (di) { wpabuf_put_data(buf, di->domain_name, di->domain_name_len); } }
static void anqp_add_network_auth_type(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di) { if (hapd->conf->hs20_network_auth_type) { wpabuf_put_le16(buf, ANQP_NETWORK_AUTH_TYPE); wpabuf_put_le16(buf, hapd->conf->hs20_network_auth_type_len); wpabuf_put_data(buf, hapd->conf->hs20_network_auth_type, hapd->conf->hs20_network_auth_type_len); } else if (di) { wpabuf_put_data(buf, di->net_auth_type, di->net_auth_type_len); } }
static void anqp_add_capab_list(struct hostapd_data *hapd, struct wpabuf *buf) { u8 *len; len = gas_anqp_add_element(buf, ANQP_CAPABILITY_LIST); wpabuf_put_le16(buf, ANQP_CAPABILITY_LIST); if (hapd->conf->venue_name) wpabuf_put_le16(buf, ANQP_VENUE_NAME); if (hapd->conf->network_auth_type) wpabuf_put_le16(buf, ANQP_NETWORK_AUTH_TYPE); if (hapd->conf->roaming_consortium) wpabuf_put_le16(buf, ANQP_ROAMING_CONSORTIUM); if (hapd->conf->ipaddr_type_configured) wpabuf_put_le16(buf, ANQP_IP_ADDR_TYPE_AVAILABILITY); if (hapd->conf->nai_realm_data) wpabuf_put_le16(buf, ANQP_NAI_REALM); if (hapd->conf->anqp_3gpp_cell_net) wpabuf_put_le16(buf, ANQP_3GPP_CELLULAR_NETWORK); if (hapd->conf->domain_name) wpabuf_put_le16(buf, ANQP_DOMAIN_NAME); #ifdef CONFIG_HS20 anqp_add_hs_capab_list(hapd, buf); #endif /* CONFIG_HS20 */ gas_anqp_set_element_len(buf, len); }
static void anqp_add_3gpp_cellular_network(struct hostapd_data *hapd, struct wpabuf *buf, struct gas_dialog_info *di) { if (hapd->conf->hs20_3gpp_cellular_network) { wpabuf_put_le16(buf, ANQP_3GPP_CELLULAR_NETWORK); wpabuf_put_le16(buf, hapd->conf->hs20_3gpp_cellular_network_len); wpabuf_put_data(buf, hapd->conf->hs20_3gpp_cellular_network, hapd->conf->hs20_3gpp_cellular_network_len); } else if (di) { wpabuf_put_data(buf, di->cell_net, di->cell_net_len); } }
static void anqp_add_capab_list(struct hostapd_data *hapd, struct wpabuf *buf) { u8 *len; len = gas_anqp_add_element(buf, ANQP_CAPABILITY_LIST); wpabuf_put_le16(buf, ANQP_CAPABILITY_LIST); if (hapd->conf->venue_name || hapd->conf->hs20_venue_name || (hapd->anqp_type_mask & ANQP_REQ_VENUE_NAME)) wpabuf_put_le16(buf, ANQP_VENUE_NAME); if (hapd->conf->hs20_network_auth_type || (hapd->anqp_type_mask & ANQP_REQ_NETWORK_AUTH_TYPE)) wpabuf_put_le16(buf, ANQP_NETWORK_AUTH_TYPE); if (hapd->conf->roaming_consortium || (hapd->anqp_type_mask & ANQP_REQ_ROAMING_CONSORTIUM)) wpabuf_put_le16(buf, ANQP_ROAMING_CONSORTIUM); if (hapd->conf->hs20_ipaddr_type_configured || (hapd->anqp_type_mask & ANQP_REQ_IP_ADDR_TYPE_AVAILABILITY)) wpabuf_put_le16(buf, ANQP_IP_ADDR_TYPE_AVAILABILITY); if (hapd->conf->hs20_nai_realm_list || hapd->conf->nai_realm_data || (hapd->anqp_type_mask & ANQP_REQ_NAI_REALM)) wpabuf_put_le16(buf, ANQP_NAI_REALM); if (hapd->conf->hs20_3gpp_cellular_network || (hapd->anqp_type_mask & ANQP_REQ_3GPP_CELLULAR_NETWORK)) wpabuf_put_le16(buf, ANQP_3GPP_CELLULAR_NETWORK); if (hapd->conf->hs20_domain_name_list_value || (hapd->anqp_type_mask & ANQP_REQ_DOMAIN_NAME)) wpabuf_put_le16(buf, ANQP_DOMAIN_NAME); anqp_add_hs_capab_list(hapd, buf); gas_anqp_set_element_len(buf, len); }
static struct wpabuf * sme_auth_build_sae_confirm(struct wpa_supplicant *wpa_s) { struct wpabuf *buf; buf = wpabuf_alloc(4 + SAE_CONFIRM_MAX_LEN); if (buf == NULL) return NULL; wpabuf_put_le16(buf, 2); /* Transaction seq# */ wpabuf_put_le16(buf, WLAN_STATUS_SUCCESS); sae_write_confirm(&wpa_s->sme.sae, buf); return buf; }
static void anqp_add_nai_realm(struct hostapd_data *hapd, struct wpabuf *buf, const u8 *home_realm, size_t home_realm_len, int nai_realm, int nai_home_realm) { if (nai_realm && hapd->conf->nai_realm_data) { u8 *len; unsigned int i, j; len = gas_anqp_add_element(buf, ANQP_NAI_REALM); wpabuf_put_le16(buf, hapd->conf->nai_realm_count); for (i = 0; i < hapd->conf->nai_realm_count; i++) { u8 *realm_data_len, *realm_len; struct hostapd_nai_realm_data *realm; realm = &hapd->conf->nai_realm_data[i]; realm_data_len = wpabuf_put(buf, 2); wpabuf_put_u8(buf, realm->encoding); realm_len = wpabuf_put(buf, 1); for (j = 0; realm->realm[j]; j++) { if (j > 0) wpabuf_put_u8(buf, ';'); wpabuf_put_str(buf, realm->realm[j]); } *realm_len = (u8 *) wpabuf_put(buf, 0) - realm_len - 1; anqp_add_nai_realm_eap(buf, realm); gas_anqp_set_element_len(buf, realm_data_len); } gas_anqp_set_element_len(buf, len); } else if (nai_home_realm && hapd->conf->nai_realm_data) { hs20_add_nai_home_realm_matches(hapd, buf, home_realm, home_realm_len); } }
static struct wpabuf * p2p_group_build_probe_resp_ie(struct p2p_group *group) { u8 *group_info; struct wpabuf *ie; struct p2p_group_member *m; u8 *len; ie = wpabuf_alloc(257); if (ie == NULL) return NULL; len = p2p_buf_add_ie_hdr(ie); p2p_group_add_common_ies(group, ie); p2p_group_add_noa(ie, group->noa); /* P2P Device Info */ p2p_buf_add_device_info(ie, group->p2p, NULL); /* P2P Group Info */ group_info = wpabuf_put(ie, 0); wpabuf_put_u8(ie, P2P_ATTR_GROUP_INFO); wpabuf_put_le16(ie, 0); /* Length to be filled */ for (m = group->members; m; m = m->next) p2p_client_info(ie, m); WPA_PUT_LE16(group_info + 1, (u8 *) wpabuf_put(ie, 0) - group_info - 3); p2p_buf_update_ie_hdr(ie, len); return ie; }
static struct wpabuf * p2p_build_sd_response(u8 dialog_token, u16 status_code, u16 comeback_delay, u16 update_indic, const struct wpabuf *tlvs) { struct wpabuf *buf; u8 *len_pos; buf = gas_anqp_build_initial_resp(dialog_token, status_code, comeback_delay, 100 + (tlvs ? wpabuf_len(tlvs) : 0)); if (buf == NULL) return NULL; if (tlvs) { /* ANQP Query Response Frame */ len_pos = gas_anqp_add_element(buf, ANQP_VENDOR_SPECIFIC); wpabuf_put_be32(buf, P2P_IE_VENDOR_TYPE); /* Service Update Indicator */ wpabuf_put_le16(buf, update_indic); wpabuf_put_buf(buf, tlvs); gas_anqp_set_element_len(buf, len_pos); } gas_anqp_set_len(buf); return buf; }
void p2p_buf_add_invitation_flags(struct wpabuf *buf, u8 flags) { /* Invitation Flags */ wpabuf_put_u8(buf, P2P_ATTR_INVITATION_FLAGS); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, flags); wpa_printf(MSG_DEBUG, "P2P: * Invitation Flags: bitmap 0x%x", flags); }
void p2p_buf_add_device_id(struct wpabuf *buf, const u8 *dev_addr) { /* P2P Device ID */ wpabuf_put_u8(buf, P2P_ATTR_DEVICE_ID); wpabuf_put_le16(buf, ETH_ALEN); wpabuf_put_data(buf, dev_addr, ETH_ALEN); wpa_printf(MSG_DEBUG, "P2P: * Device ID: " MACSTR, MAC2STR(dev_addr)); }
void p2p_buf_add_status(struct wpabuf *buf, u8 status) { /* Status */ wpabuf_put_u8(buf, P2P_ATTR_STATUS); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, status); wpa_printf(MSG_DEBUG, "P2P: * Status: %d", status); }
static struct wpabuf * p2p_build_gas_comeback_resp(u8 dialog_token, u16 status_code, u16 update_indic, const u8 *data, size_t len, u8 frag_id, u8 more, u16 total_len) { struct wpabuf *buf; u8 *len_pos; buf = wpabuf_alloc(1000 + len); if (buf == NULL) return NULL; wpabuf_put_u8(buf, WLAN_ACTION_PUBLIC); wpabuf_put_u8(buf, WLAN_PA_GAS_COMEBACK_RESP); wpabuf_put_u8(buf, dialog_token); wpabuf_put_le16(buf, status_code); wpabuf_put_u8(buf, frag_id | (more ? 0x80 : 0)); wpabuf_put_le16(buf, 0); /* Comeback Delay */ /* Advertisement Protocol IE */ wpabuf_put_u8(buf, WLAN_EID_ADV_PROTO); wpabuf_put_u8(buf, 2); /* Length */ wpabuf_put_u8(buf, 0x7f); /* QueryRespLenLimit | PAME-BI */ wpabuf_put_u8(buf, NATIVE_QUERY_PROTOCOL); /* Advertisement Protocol */ /* Query Response */ len_pos = wpabuf_put(buf, 2); /* Length (to be filled) */ if (frag_id == 0) { /* NQP Query Response Frame */ wpabuf_put_le16(buf, NQP_VENDOR_SPECIFIC); /* Info ID */ wpabuf_put_le16(buf, 3 + 1 + 2 + total_len); wpabuf_put_be24(buf, OUI_WFA); wpabuf_put_u8(buf, P2P_OUI_TYPE); /* Service Update Indicator */ wpabuf_put_le16(buf, update_indic); } wpabuf_put_data(buf, data, len); WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(buf, 0) - len_pos - 2); return buf; }
static struct wpabuf * p2p_build_sd_response(u8 dialog_token, u16 status_code, u16 comeback_delay, u16 update_indic, const struct wpabuf *tlvs) { struct wpabuf *buf; u8 *len_pos, *len_pos2; buf = wpabuf_alloc(1000 + (tlvs ? wpabuf_len(tlvs) : 0)); if (buf == NULL) return NULL; wpabuf_put_u8(buf, WLAN_ACTION_PUBLIC); wpabuf_put_u8(buf, WLAN_PA_GAS_INITIAL_RESP); wpabuf_put_u8(buf, dialog_token); wpabuf_put_le16(buf, status_code); wpabuf_put_le16(buf, comeback_delay); /* Advertisement Protocol IE */ wpabuf_put_u8(buf, WLAN_EID_ADV_PROTO); wpabuf_put_u8(buf, 2); /* Length */ wpabuf_put_u8(buf, 0x7f); /* QueryRespLenLimit | PAME-BI */ wpabuf_put_u8(buf, NATIVE_QUERY_PROTOCOL); /* Advertisement Protocol */ /* Query Response */ len_pos = wpabuf_put(buf, 2); /* Length (to be filled) */ if (tlvs) { /* NQP Query Response Frame */ wpabuf_put_le16(buf, NQP_VENDOR_SPECIFIC); /* Info ID */ len_pos2 = wpabuf_put(buf, 2); /* Length (to be filled) */ wpabuf_put_be24(buf, OUI_WFA); wpabuf_put_u8(buf, P2P_OUI_TYPE); /* Service Update Indicator */ wpabuf_put_le16(buf, update_indic); wpabuf_put_buf(buf, tlvs); WPA_PUT_LE16(len_pos2, (u8 *) wpabuf_put(buf, 0) - len_pos2 - 2); } WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(buf, 0) - len_pos - 2); return buf; }
void p2p_buf_add_go_intent(struct wpabuf *buf, u8 go_intent) { /* Group Owner Intent */ wpabuf_put_u8(buf, P2P_ATTR_GROUP_OWNER_INTENT); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, go_intent); wpa_printf(MSG_DEBUG, "P2P: * GO Intent: Intent %u Tie breaker %u", go_intent >> 1, go_intent & 0x01); }
void p2p_buf_add_group_bssid(struct wpabuf *buf, const u8 *bssid) { /* P2P Group BSSID */ wpabuf_put_u8(buf, P2P_ATTR_GROUP_BSSID); wpabuf_put_le16(buf, ETH_ALEN); wpabuf_put_data(buf, bssid, ETH_ALEN); wpa_printf(MSG_DEBUG, "P2P: * P2P Group BSSID " MACSTR, MAC2STR(bssid)); }
void p2p_buf_add_intended_addr(struct wpabuf *buf, const u8 *interface_addr) { /* Intended P2P Interface Address */ wpabuf_put_u8(buf, P2P_ATTR_INTENDED_INTERFACE_ADDR); wpabuf_put_le16(buf, ETH_ALEN); wpabuf_put_data(buf, interface_addr, ETH_ALEN); wpa_printf(MSG_DEBUG, "P2P: * Intended P2P Interface Address " MACSTR, MAC2STR(interface_addr)); }
static void p2p_group_add_noa(struct wpabuf *ie, struct wpabuf *noa) { if (noa == NULL) return; /* Notice of Absence */ wpabuf_put_u8(ie, P2P_ATTR_NOTICE_OF_ABSENCE); wpabuf_put_le16(ie, wpabuf_len(noa)); wpabuf_put_buf(ie, noa); }
void p2p_buf_add_connection_capability(struct wpabuf *buf, u8 connection_cap) { /* Connection Capability Info */ wpabuf_put_u8(buf, P2P_ATTR_CONNECTION_CAPABILITY); wpabuf_put_le16(buf, 1); wpabuf_put_u8(buf, connection_cap); wpa_printf(MSG_DEBUG, "P2P: * Connection Capability: 0x%x", connection_cap); }
static void anqp_add_elem(struct hostapd_data *hapd, struct wpabuf *buf, u16 infoid) { struct anqp_element *elem; elem = get_anqp_elem(hapd, infoid); if (!elem) return; if (wpabuf_tailroom(buf) < 2 + 2 + wpabuf_len(elem->payload)) { wpa_printf(MSG_DEBUG, "ANQP: No room for InfoID %u payload", infoid); return; } wpabuf_put_le16(buf, infoid); wpabuf_put_le16(buf, wpabuf_len(elem->payload)); wpabuf_put_buf(buf, elem->payload); }