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; }
struct wpabuf * gas_anqp_build_initial_resp_buf(u8 dialog_token, u16 status_code, u16 comeback_delay, struct wpabuf *payload) { struct wpabuf *buf; buf = gas_anqp_build_initial_resp(dialog_token, status_code, comeback_delay, payload ? wpabuf_len(payload) : 0); if (buf == NULL) return NULL; if (payload) wpabuf_put_buf(buf, payload); gas_anqp_set_len(buf); return buf; }
static struct wpabuf * p2p_build_sd_query(u16 update_indic, struct wpabuf *tlvs) { struct wpabuf *buf; u8 *len_pos; buf = gas_anqp_build_initial_req(0, 100 + wpabuf_len(tlvs)); if (buf == NULL) return NULL; /* ANQP Query Request Frame */ len_pos = gas_anqp_add_element(buf, ANQP_VENDOR_SPECIFIC); wpabuf_put_be32(buf, P2P_IE_VENDOR_TYPE); wpabuf_put_le16(buf, update_indic); /* Service Update Indicator */ wpabuf_put_buf(buf, tlvs); gas_anqp_set_element_len(buf, len_pos); gas_anqp_set_len(buf); return buf; }
struct wpabuf * hs20_build_anqp_req(u32 stypes, const u8 *payload, size_t payload_len) { struct wpabuf *buf; u8 *len_pos; buf = gas_anqp_build_initial_req(0, 100 + payload_len); if (buf == NULL) return NULL; len_pos = gas_anqp_add_element(buf, ANQP_VENDOR_SPECIFIC); wpabuf_put_be24(buf, OUI_WFA); wpabuf_put_u8(buf, HS20_ANQP_OUI_TYPE); if (stypes == BIT(HS20_STYPE_NAI_HOME_REALM_QUERY)) { wpabuf_put_u8(buf, HS20_STYPE_NAI_HOME_REALM_QUERY); wpabuf_put_u8(buf, 0); /* Reserved */ if (payload) wpabuf_put_data(buf, payload, payload_len); } else if (stypes == BIT(HS20_STYPE_ICON_REQUEST)) { wpabuf_put_u8(buf, HS20_STYPE_ICON_REQUEST); wpabuf_put_u8(buf, 0); /* Reserved */ if (payload) wpabuf_put_data(buf, payload, payload_len); } else { u8 i; wpabuf_put_u8(buf, HS20_STYPE_QUERY_LIST); wpabuf_put_u8(buf, 0); /* Reserved */ for (i = 0; i < 32; i++) { if (stypes & BIT(i)) wpabuf_put_u8(buf, i); } } gas_anqp_set_element_len(buf, len_pos); gas_anqp_set_len(buf); return buf; }
static struct wpabuf * anqp_build_req(u16 info_ids[], size_t num_ids, struct wpabuf *extra) { struct wpabuf *buf; size_t i; u8 *len_pos; buf = gas_anqp_build_initial_req(0, 4 + num_ids * 2 + (extra ? wpabuf_len(extra) : 0)); if (buf == NULL) return NULL; len_pos = gas_anqp_add_element(buf, ANQP_QUERY_LIST); for (i = 0; i < num_ids; i++) wpabuf_put_le16(buf, info_ids[i]); gas_anqp_set_element_len(buf, len_pos); if (extra) wpabuf_put_buf(buf, extra); gas_anqp_set_len(buf); return buf; }