P2PS: Add support to send ASP-RESP events

Send P2P-SERV-ASP-RESP events upon receiving GAS responses with
ASP services.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Krishna Vamsi 2014-12-09 21:05:41 +05:30 committed by Jouni Malinen
parent 6df08d0341
commit d4b43b5886
2 changed files with 80 additions and 0 deletions

View file

@ -164,6 +164,7 @@ extern "C" {
#define P2P_EVENT_SERV_DISC_REQ "P2P-SERV-DISC-REQ "
/* parameters: <src addr> <update indicator> <TLVs> */
#define P2P_EVENT_SERV_DISC_RESP "P2P-SERV-DISC-RESP "
#define P2P_EVENT_SERV_ASP_RESP "P2P-SERV-ASP-RESP "
#define P2P_EVENT_INVITATION_RECEIVED "P2P-INVITATION-RECEIVED "
#define P2P_EVENT_INVITATION_RESULT "P2P-INVITATION-RESULT "
#define P2P_EVENT_FIND_STOPPED "P2P-FIND-STOPPED "

View file

@ -2849,6 +2849,80 @@ done:
}
static void wpas_sd_p2ps_serv_response(struct wpa_supplicant *wpa_s,
const u8 *sa, u8 srv_trans_id,
const u8 *pos, const u8 *tlv_end)
{
u8 left = *pos++;
u32 adv_id;
u8 svc_status;
u16 config_methods;
char svc_str[256];
while (left-- && pos < tlv_end) {
char *buf = NULL;
size_t buf_len;
u8 svc_len;
/* Sanity check fixed length+svc_str */
if (pos + 6 >= tlv_end)
break;
svc_len = pos[6];
if (pos + svc_len + 10 > tlv_end)
break;
/* Advertisement ID */
adv_id = WPA_GET_LE32(pos);
pos += sizeof(u32);
/* Config Methods */
config_methods = WPA_GET_BE16(pos);
pos += sizeof(u16);
/* Service Name */
pos++; /* svc_len */
os_memcpy(svc_str, pos, svc_len);
svc_str[svc_len] = '\0';
pos += svc_len;
/* Service Status */
svc_status = *pos++;
/* Service Information Length */
buf_len = WPA_GET_LE16(pos);
pos += sizeof(u16);
/* Sanity check buffer length */
if (buf_len > (unsigned int) (tlv_end - pos))
break;
if (buf_len) {
buf = os_zalloc(2 * buf_len + 1);
if (buf) {
utf8_escape((const char *) pos, buf_len, buf,
2 * buf_len + 1);
}
}
pos += buf_len;
if (buf) {
wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_SERV_ASP_RESP
MACSTR " %x %x %x %x %s '%s'",
MAC2STR(sa), srv_trans_id, adv_id,
svc_status, config_methods, svc_str,
buf);
os_free(buf);
} else {
wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_SERV_ASP_RESP
MACSTR " %x %x %x %x %s",
MAC2STR(sa), srv_trans_id, adv_id,
svc_status, config_methods, svc_str);
}
}
}
static void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic,
const u8 *tlvs, size_t tlvs_len)
{
@ -2907,6 +2981,11 @@ static void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic,
wpa_hexdump(MSG_MSGDUMP, "P2P: Response Data",
pos, tlv_end - pos);
if (srv_proto == P2P_SERV_P2PS && pos < tlv_end) {
wpas_sd_p2ps_serv_response(wpa_s, sa, srv_trans_id,
pos, tlv_end);
}
pos = tlv_end;
}