Lines Matching refs:p2p
43 static void p2ps_add_new_group_info(struct p2p_data *p2p, in p2ps_add_new_group_info() argument
54 if (!p2p->cfg->get_go_info) in p2ps_add_new_group_info()
57 found = p2p->cfg->get_go_info( in p2ps_add_new_group_info()
58 p2p->cfg->cb_ctx, intended_addr, ssid, in p2ps_add_new_group_info()
62 p2p->p2ps_prov->force_freq = force_freq; in p2ps_add_new_group_info()
63 p2p->p2ps_prov->pref_freq = 0; in p2ps_add_new_group_info()
66 p2p_prepare_channel(p2p, dev, force_freq, 0, 0); in p2ps_add_new_group_info()
68 p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, in p2ps_add_new_group_info()
72 p2p_buf_add_intended_addr(buf, p2p->intended_addr); in p2ps_add_new_group_info()
76 if (!p2p->ssid_set) { in p2ps_add_new_group_info()
77 p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len); in p2ps_add_new_group_info()
78 p2p->ssid_set = 1; in p2ps_add_new_group_info()
82 p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, in p2ps_add_new_group_info()
83 p2p->ssid, p2p->ssid_len); in p2ps_add_new_group_info()
87 buf, p2p->intended_addr); in p2ps_add_new_group_info()
90 buf, p2p->cfg->dev_addr); in p2ps_add_new_group_info()
95 static void p2ps_add_pd_req_attrs(struct p2p_data *p2p, struct p2p_device *dev, in p2ps_add_pd_req_attrs() argument
98 struct p2ps_provision *prov = p2p->p2ps_prov; in p2ps_add_pd_req_attrs()
111 p2ps_add_new_group_info(p2p, dev, buf); in p2ps_add_pd_req_attrs()
119 if (p2p->cfg->get_persistent_group) { in p2ps_add_pd_req_attrs()
120 shared_group = p2p->cfg->get_persistent_group( in p2ps_add_pd_req_attrs()
121 p2p->cfg->cb_ctx, dev->info.p2p_device_addr, in p2ps_add_pd_req_attrs()
128 p2p_buf_add_channel_list(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
129 &p2p->channels); in p2ps_add_pd_req_attrs()
133 p2p_buf_add_operating_channel(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
134 p2p->op_reg_class, in p2ps_add_pd_req_attrs()
135 p2p->op_channel); in p2ps_add_pd_req_attrs()
153 p2p_buf_add_config_timeout(buf, p2p->go_timeout, in p2ps_add_pd_req_attrs()
154 p2p->client_timeout); in p2ps_add_pd_req_attrs()
157 p2p_buf_add_listen_channel(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
158 p2p->cfg->reg_class, in p2ps_add_pd_req_attrs()
159 p2p->cfg->channel); in p2ps_add_pd_req_attrs()
178 static struct wpabuf * p2p_build_prov_disc_req(struct p2p_data *p2p, in p2p_build_prov_disc_req() argument
191 if (p2p->wfd_ie_prov_disc_req) in p2p_build_prov_disc_req()
192 extra = wpabuf_len(p2p->wfd_ie_prov_disc_req); in p2p_build_prov_disc_req()
195 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]) in p2p_build_prov_disc_req()
196 extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]); in p2p_build_prov_disc_req()
198 if (p2p->p2ps_prov) in p2p_build_prov_disc_req()
199 extra += os_strlen(p2p->p2ps_prov->info) + 1 + in p2p_build_prov_disc_req()
211 if (p2p->p2ps_prov) { in p2p_build_prov_disc_req()
214 if (p2p->cross_connect) in p2p_build_prov_disc_req()
216 if (p2p->cfg->p2p_intra_bss) in p2p_build_prov_disc_req()
219 p2p_buf_add_capability(buf, p2p->dev_capab & in p2p_build_prov_disc_req()
222 p2p_buf_add_device_info(buf, p2p, NULL); in p2p_build_prov_disc_req()
223 if (p2p->p2ps_prov) { in p2p_build_prov_disc_req()
224 p2ps_add_pd_req_attrs(p2p, dev, buf, config_methods); in p2p_build_prov_disc_req()
235 if (p2p->wfd_ie_prov_disc_req) in p2p_build_prov_disc_req()
236 wpabuf_put_buf(buf, p2p->wfd_ie_prov_disc_req); in p2p_build_prov_disc_req()
239 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]) in p2p_build_prov_disc_req()
240 wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]); in p2p_build_prov_disc_req()
246 static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p, in p2p_build_prov_disc_resp() argument
264 struct wpabuf *wfd_ie = p2p->wfd_ie_prov_disc_resp; in p2p_build_prov_disc_resp()
267 for (i = 0; i < p2p->num_groups; i++) { in p2p_build_prov_disc_resp()
268 struct p2p_group *g = p2p->groups[i]; in p2p_build_prov_disc_resp()
284 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]) in p2p_build_prov_disc_resp()
285 extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]); in p2p_build_prov_disc_resp()
294 if (p2p->p2ps_prov && p2p->p2ps_prov->adv_id == adv_id) { in p2p_build_prov_disc_resp()
296 struct p2ps_provision *prov = p2p->p2ps_prov; in p2p_build_prov_disc_resp()
310 if (p2p->cross_connect) in p2p_build_prov_disc_resp()
312 if (p2p->cfg->p2p_intra_bss) in p2p_build_prov_disc_resp()
314 p2p_buf_add_capability(buf, p2p->dev_capab & in p2p_build_prov_disc_resp()
317 p2p_buf_add_device_info(buf, p2p, NULL); in p2p_build_prov_disc_resp()
319 if (persist_ssid && p2p->cfg->get_persistent_group && dev && in p2p_build_prov_disc_resp()
327 persist = p2p->cfg->get_persistent_group( in p2p_build_prov_disc_resp()
328 p2p->cfg->cb_ctx, in p2p_build_prov_disc_resp()
342 p2ps_add_new_group_info(p2p, dev, buf); in p2p_build_prov_disc_resp()
346 if (p2p->op_reg_class && p2p->op_channel) in p2p_build_prov_disc_resp()
348 buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
349 p2p->op_reg_class, in p2p_build_prov_disc_resp()
350 p2p->op_channel); in p2p_build_prov_disc_resp()
353 buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
354 p2p->cfg->op_reg_class, in p2p_build_prov_disc_resp()
355 p2p->cfg->op_channel); in p2p_build_prov_disc_resp()
360 p2p_buf_add_channel_list(buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
361 &p2p->channels); in p2p_build_prov_disc_resp()
370 p2p_buf_add_config_timeout(buf, p2p->go_timeout, in p2p_build_prov_disc_resp()
371 p2p->client_timeout); in p2p_build_prov_disc_resp()
383 if (p2p->p2ps_prov) in p2p_build_prov_disc_resp()
385 p2p->p2ps_prov->adv_mac); in p2p_build_prov_disc_resp()
398 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]) in p2p_build_prov_disc_resp()
399 wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]); in p2p_build_prov_disc_resp()
405 static int p2ps_setup_p2ps_prov(struct p2p_data *p2p, u32 adv_id, in p2ps_setup_p2ps_prov() argument
411 if (!p2p->p2ps_prov) { in p2ps_setup_p2ps_prov()
412 p2p->p2ps_prov = os_zalloc(sizeof(struct p2ps_provision) + 1); in p2ps_setup_p2ps_prov()
413 if (!p2p->p2ps_prov) in p2ps_setup_p2ps_prov()
416 os_memset(p2p->p2ps_prov, 0, sizeof(struct p2ps_provision) + 1); in p2ps_setup_p2ps_prov()
419 tmp = p2p->p2ps_prov; in p2ps_setup_p2ps_prov()
444 static int p2ps_validate_pd_req(struct p2p_data *p2p, struct p2p_message *msg, in p2ps_validate_pd_req() argument
457 p2p_dbg(p2p, "Not P2PS PD Request. Missing %s", #_attr); \ in p2ps_validate_pd_req()
491 p2p_dbg(p2p, "P2PS: Invalid feature capability len"); in p2ps_validate_pd_req()
528 p2p_dbg(p2p, "Invalid P2PS PD connection capability"); in p2ps_validate_pd_req()
554 void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa, in p2p_process_prov_disc_req() argument
581 p2p_dbg(p2p, "Received Provision Discovery Request from " MACSTR in p2p_process_prov_disc_req()
586 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_req()
588 p2p_dbg(p2p, "Provision Discovery Request from unknown peer " in p2p_process_prov_disc_req()
591 if (p2p_add_device(p2p, sa, rx_freq, NULL, 0, data + 1, len - 1, in p2p_process_prov_disc_req()
593 p2p_dbg(p2p, "Provision Discovery Request add device failed " in p2p_process_prov_disc_req()
598 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_req()
600 p2p_dbg(p2p, in p2p_process_prov_disc_req()
613 p2p_dbg(p2p, in p2p_process_prov_disc_req()
622 for (i = 0; i < p2p->num_groups; i++) { in p2p_process_prov_disc_req()
624 p2p->groups[i], in p2p_process_prov_disc_req()
628 if (i == p2p->num_groups) { in p2p_process_prov_disc_req()
629 p2p_dbg(p2p, in p2p_process_prov_disc_req()
642 if (p2ps_validate_pd_req(p2p, &msg, sa) < 0) { in p2p_process_prov_disc_req()
664 p2p_dbg(p2p, in p2p_process_prov_disc_req()
680 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_req()
685 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_req()
691 p2p_dbg(p2p, "Peer " MACSTR " requesting P2PS PIN", in p2p_process_prov_disc_req()
698 if (p2p->cfg->remove_stale_groups) { in p2p_process_prov_disc_req()
699 p2p->cfg->remove_stale_groups( in p2p_process_prov_disc_req()
700 p2p->cfg->cb_ctx, dev->info.p2p_device_addr, in p2p_process_prov_disc_req()
719 if (os_memcmp(p2p->cfg->dev_addr, msg.adv_mac, ETH_ALEN)) { in p2p_process_prov_disc_req()
720 p2p_dbg(p2p, in p2p_process_prov_disc_req()
726 p2ps_adv = p2p_service_p2ps_id(p2p, adv_id); in p2p_process_prov_disc_req()
728 p2p_dbg(p2p, "P2PS PD invalid adv_id=0x%X", adv_id); in p2p_process_prov_disc_req()
732 p2p_dbg(p2p, "adv_id: 0x%X, p2ps_adv: %p", adv_id, p2ps_adv); in p2p_process_prov_disc_req()
735 conncap = p2p->cfg->p2ps_group_capability(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
740 p2p_dbg(p2p, "Conncap: local:%d remote:%d result:%d", in p2p_process_prov_disc_req()
743 p2p_prepare_channel(p2p, dev, forced_freq, pref_freq, 0); in p2p_process_prov_disc_req()
748 p2p_dbg(p2p, "cpt: service:0x%x remote:0x%x result:0x%x", in p2p_process_prov_disc_req()
752 p2p_dbg(p2p, in p2p_process_prov_disc_req()
758 p2p_dbg(p2p, in p2p_process_prov_disc_req()
764 p2p_dbg(p2p, "P2PS state unavailable"); in p2p_process_prov_disc_req()
767 p2p_dbg(p2p, "Conncap resolution failed"); in p2p_process_prov_disc_req()
772 p2p_dbg(p2p, "Keypad - always defer"); in p2p_process_prov_disc_req()
779 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_req()
782 p2p_dbg(p2p, in p2p_process_prov_disc_req()
812 p2p_channels_intersect(&p2p->channels, &dev->channels, in p2p_process_prov_disc_req()
816 p2p_dbg(p2p, in p2p_process_prov_disc_req()
825 if (p2ps_setup_p2ps_prov(p2p, adv_id, session_id, in p2p_process_prov_disc_req()
832 tmp = p2p->p2ps_prov; in p2p_process_prov_disc_req()
849 (!p2p->p2ps_prov || p2p->p2ps_prov->adv_id != adv_id)) { in p2p_process_prov_disc_req()
857 if (p2ps_setup_p2ps_prov(p2p, adv_id, session_id, in p2p_process_prov_disc_req()
863 tmp = p2p->p2ps_prov; in p2p_process_prov_disc_req()
877 if (*msg.status != P2P_SC_SUCCESS_DEFERRED || !p2p->p2ps_prov) in p2p_process_prov_disc_req()
880 if (p2p->p2ps_prov->adv_id != adv_id || in p2p_process_prov_disc_req()
881 os_memcmp(p2p->p2ps_prov->adv_mac, msg.adv_mac, ETH_ALEN)) { in p2p_process_prov_disc_req()
882 p2p_dbg(p2p, in p2p_process_prov_disc_req()
887 if (p2p->p2ps_prov->session_id != session_id || in p2p_process_prov_disc_req()
888 os_memcmp(p2p->p2ps_prov->session_mac, msg.session_mac, ETH_ALEN)) { in p2p_process_prov_disc_req()
889 p2p_dbg(p2p, "P2PS Follow-on PD with mismatch Session ID/MAC"); in p2p_process_prov_disc_req()
893 method = p2p->p2ps_prov->method; in p2p_process_prov_disc_req()
895 conncap = p2p->cfg->p2ps_group_capability(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
897 p2p->p2ps_prov->conncap, in p2p_process_prov_disc_req()
898 &p2p->p2ps_prov->force_freq, in p2p_process_prov_disc_req()
899 &p2p->p2ps_prov->pref_freq); in p2p_process_prov_disc_req()
901 resp_fcap.cpt = p2ps_own_preferred_cpt(p2p->p2ps_prov->cpt_priority, in p2p_process_prov_disc_req()
904 p2p_dbg(p2p, "cpt: local:0x%x remote:0x%x result:0x%x", in p2p_process_prov_disc_req()
905 p2p->p2ps_prov->cpt_mask, req_fcap->cpt, resp_fcap.cpt); in p2p_process_prov_disc_req()
907 p2p_prepare_channel(p2p, dev, p2p->p2ps_prov->force_freq, in p2p_process_prov_disc_req()
908 p2p->p2ps_prov->pref_freq, 0); in p2p_process_prov_disc_req()
926 p2p_dbg(p2p, in p2p_process_prov_disc_req()
932 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_req()
935 p2p_dbg(p2p, in p2p_process_prov_disc_req()
952 p2p_go_select_channel(p2p, dev, &tmp) < 0) in p2p_process_prov_disc_req()
956 p2p->p2ps_prov->status = reject; in p2p_process_prov_disc_req()
957 p2p->p2ps_prov->conncap = conncap; in p2p_process_prov_disc_req()
971 resp = p2p_build_prov_disc_resp(p2p, dev, msg.dialog_token, in p2p_process_prov_disc_req()
982 p2p_dbg(p2p, "Sending Provision Discovery Response"); in p2p_process_prov_disc_req()
986 freq = p2p_channel_to_freq(p2p->cfg->reg_class, in p2p_process_prov_disc_req()
987 p2p->cfg->channel); in p2p_process_prov_disc_req()
989 p2p_dbg(p2p, "Unknown regulatory class/channel"); in p2p_process_prov_disc_req()
994 p2p->pending_action_state = P2P_PENDING_PD_RESPONSE; in p2p_process_prov_disc_req()
995 if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr, in p2p_process_prov_disc_req()
996 p2p->cfg->dev_addr, in p2p_process_prov_disc_req()
999 p2p_dbg(p2p, "Failed to send Action frame"); in p2p_process_prov_disc_req()
1001 p2p->send_action_in_progress = 1; in p2p_process_prov_disc_req()
1013 freq = p2p_channel_to_freq(p2p->op_reg_class, in p2p_process_prov_disc_req()
1014 p2p->op_channel); in p2p_process_prov_disc_req()
1019 if (!p2p->cfg->p2ps_prov_complete) { in p2p_process_prov_disc_req()
1024 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, reject, in p2p_process_prov_disc_req()
1032 p2p->p2ps_prov) { in p2p_process_prov_disc_req()
1033 p2p->p2ps_prov->status = reject; in p2p_process_prov_disc_req()
1034 p2p->p2ps_prov->conncap = conncap; in p2p_process_prov_disc_req()
1037 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, reject, in p2p_process_prov_disc_req()
1046 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
1058 } else if (msg.status && p2p->p2ps_prov) { in p2p_process_prov_disc_req()
1059 p2p->p2ps_prov->status = P2P_SC_SUCCESS; in p2p_process_prov_disc_req()
1060 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, *msg.status, sa, in p2p_process_prov_disc_req()
1071 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, P2P_SC_SUCCESS, in p2p_process_prov_disc_req()
1086 p2p->p2ps_prov->method = msg.wps_config_methods; in p2p_process_prov_disc_req()
1088 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, P2P_SC_SUCCESS, in p2p_process_prov_disc_req()
1102 p2p->p2ps_prov->method = msg.wps_config_methods; in p2p_process_prov_disc_req()
1107 p2p->cfg->p2ps_prov_complete( in p2p_process_prov_disc_req()
1108 p2p->cfg->cb_ctx, P2P_SC_SUCCESS, sa, in p2p_process_prov_disc_req()
1138 if (p2p->cfg->prov_disc_req && in p2p_process_prov_disc_req()
1154 p2p->cfg->prov_disc_req(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_req()
1165 p2ps_prov_free(p2p); in p2p_process_prov_disc_req()
1194 static int p2p_validate_p2ps_pd_resp(struct p2p_data *p2p, in p2p_validate_p2ps_pd_resp() argument
1205 p2p_dbg(p2p, "P2PS PD Response missing " #_attr); \ in p2p_validate_p2ps_pd_resp()
1222 if (p2p->p2ps_prov->session_id != session_id) { in p2p_validate_p2ps_pd_resp()
1223 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1228 if (os_memcmp(p2p->p2ps_prov->session_mac, msg->session_mac, in p2p_validate_p2ps_pd_resp()
1230 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1235 if (p2p->p2ps_prov->adv_id != adv_id) { in p2p_validate_p2ps_pd_resp()
1236 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1241 if (os_memcmp(p2p->p2ps_prov->adv_mac, msg->adv_mac, ETH_ALEN) != 0) { in p2p_validate_p2ps_pd_resp()
1242 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1248 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1255 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1261 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1293 void p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa, in p2p_process_prov_disc_resp() argument
1310 if (p2p->p2ps_prov && p2p_validate_p2ps_pd_resp(p2p, &msg)) { in p2p_process_prov_disc_resp()
1343 p2p_dbg(p2p, "Received Provision Discovery Response from " MACSTR in p2p_process_prov_disc_resp()
1347 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_resp()
1349 p2p_dbg(p2p, "Ignore Provision Discovery Response from " MACSTR in p2p_process_prov_disc_resp()
1359 p2p_dbg(p2p, "Ignore Provision Discovery Response with unexpected Dialog Token %u (expected %u)", in p2p_process_prov_disc_resp()
1365 if (p2p->pending_action_state == P2P_PENDING_PD) { in p2p_process_prov_disc_resp()
1366 os_memset(p2p->pending_pd_devaddr, 0, ETH_ALEN); in p2p_process_prov_disc_resp()
1367 p2p->pending_action_state = P2P_NO_PENDING_ACTION; in p2p_process_prov_disc_resp()
1370 p2ps_seeker = p2p->p2ps_prov && p2p->p2ps_prov->pd_seeker; in p2p_process_prov_disc_resp()
1382 if (p2p->user_initiated_pd && in p2p_process_prov_disc_resp()
1383 os_memcmp(p2p->pending_pd_devaddr, sa, ETH_ALEN) == 0) in p2p_process_prov_disc_resp()
1384 p2p_reset_pending_pd(p2p); in p2p_process_prov_disc_resp()
1387 …p2p_dbg(p2p, "Peer rejected our Provision Discovery Request (received config_methods 0x%x expected… in p2p_process_prov_disc_resp()
1389 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1390 p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1394 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1403 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_resp()
1408 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_resp()
1414 p2p_dbg(p2p, "Peer " MACSTR " accepted P2PS PIN", in p2p_process_prov_disc_resp()
1421 p2p->p2ps_prov) { in p2p_process_prov_disc_resp()
1433 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_resp()
1436 p2p_dbg(p2p, "P2PS PD Response - no common channels"); in p2p_process_prov_disc_resp()
1439 if (p2p_channels_includes(&p2p->channels, in p2p_process_prov_disc_resp()
1450 p2p_dbg(p2p, in p2p_process_prov_disc_resp()
1455 if (p2p->cfg->p2ps_prov_complete) { in p2p_process_prov_disc_resp()
1466 if (p2p_go_select_channel(p2p, dev, &tmp) < 0) in p2p_process_prov_disc_resp()
1467 p2p_dbg(p2p, in p2p_process_prov_disc_resp()
1470 freq = p2p_channel_to_freq(p2p->op_reg_class, in p2p_process_prov_disc_resp()
1471 p2p->op_channel); in p2p_process_prov_disc_resp()
1476 p2p->cfg->p2ps_prov_complete( in p2p_process_prov_disc_resp()
1477 p2p->cfg->cb_ctx, status, sa, adv_mac, in p2p_process_prov_disc_resp()
1478 p2p->p2ps_prov->session_mac, in p2p_process_prov_disc_resp()
1479 group_mac, adv_id, p2p->p2ps_prov->session_id, in p2p_process_prov_disc_resp()
1486 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1489 status != P2P_SC_SUCCESS_DEFERRED && p2p->p2ps_prov) { in p2p_process_prov_disc_resp()
1490 if (p2p->cfg->p2ps_prov_complete) in p2p_process_prov_disc_resp()
1491 p2p->cfg->p2ps_prov_complete( in p2p_process_prov_disc_resp()
1492 p2p->cfg->cb_ctx, status, sa, adv_mac, in p2p_process_prov_disc_resp()
1493 p2p->p2ps_prov->session_mac, in p2p_process_prov_disc_resp()
1494 group_mac, adv_id, p2p->p2ps_prov->session_id, in p2p_process_prov_disc_resp()
1496 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1500 if (p2p->cfg->remove_stale_groups) { in p2p_process_prov_disc_resp()
1501 p2p->cfg->remove_stale_groups(p2p->cfg->cb_ctx, in p2p_process_prov_disc_resp()
1512 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1518 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1519 p2p->cfg->prov_disc_fail( in p2p_process_prov_disc_resp()
1520 p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1526 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1527 p2p->cfg->prov_disc_fail( in p2p_process_prov_disc_resp()
1528 p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1532 p2p_dbg(p2p, "Peer rejected our Provision Discovery Request"); in p2p_process_prov_disc_resp()
1533 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1534 p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1538 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1551 p2p->cfg->send_action_done(p2p->cfg->cb_ctx); in p2p_process_prov_disc_resp()
1553 p2p_dbg(p2p, "Start GO Neg after the PD-before-GO-Neg workaround with " in p2p_process_prov_disc_resp()
1556 p2p_connect_send(p2p, dev); in p2p_process_prov_disc_resp()
1574 if (p2p->cfg->prov_disc_resp && in p2p_process_prov_disc_resp()
1581 p2p->cfg->prov_disc_resp(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1584 if (p2p->state == P2P_PD_DURING_FIND) { in p2p_process_prov_disc_resp()
1585 p2p_stop_listen_for_freq(p2p, 0); in p2p_process_prov_disc_resp()
1586 p2p_continue_find(p2p); in p2p_process_prov_disc_resp()
1591 int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev, in p2p_send_prov_disc_req() argument
1603 p2p_dbg(p2p, "No Listen/Operating frequency known for the peer " in p2p_send_prov_disc_req()
1612 p2p_dbg(p2p, "Cannot use PD with P2P Device " MACSTR in p2p_send_prov_disc_req()
1620 if (p2p->p2ps_prov) { in p2p_send_prov_disc_req()
1621 if (p2p->p2ps_prov->status == P2P_SC_SUCCESS_DEFERRED) { in p2p_send_prov_disc_req()
1622 if (p2p->p2ps_prov->method == WPS_CONFIG_DISPLAY) in p2p_send_prov_disc_req()
1624 else if (p2p->p2ps_prov->method == WPS_CONFIG_KEYPAD) in p2p_send_prov_disc_req()
1630 if (p2p->p2ps_prov->method) in p2p_send_prov_disc_req()
1632 p2p->p2ps_prov->method; in p2p_send_prov_disc_req()
1640 p2p_dbg(p2p, in p2p_send_prov_disc_req()
1642 p2p->p2ps_prov->method, p2p->p2ps_prov->status, in p2p_send_prov_disc_req()
1645 if (p2p_prepare_channel(p2p, dev, p2p->p2ps_prov->force_freq, in p2p_send_prov_disc_req()
1646 p2p->p2ps_prov->pref_freq, 1) < 0) in p2p_send_prov_disc_req()
1650 req = p2p_build_prov_disc_req(p2p, dev, join); in p2p_send_prov_disc_req()
1654 if (p2p->state != P2P_IDLE) in p2p_send_prov_disc_req()
1655 p2p_stop_listen_for_freq(p2p, freq); in p2p_send_prov_disc_req()
1656 p2p->pending_action_state = P2P_PENDING_PD; in p2p_send_prov_disc_req()
1657 if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr, in p2p_send_prov_disc_req()
1658 p2p->cfg->dev_addr, dev->info.p2p_device_addr, in p2p_send_prov_disc_req()
1660 p2p_dbg(p2p, "Failed to send Action frame"); in p2p_send_prov_disc_req()
1665 os_memcpy(p2p->pending_pd_devaddr, dev->info.p2p_device_addr, ETH_ALEN); in p2p_send_prov_disc_req()
1672 int p2p_prov_disc_req(struct p2p_data *p2p, const u8 *peer_addr, in p2p_prov_disc_req() argument
1679 dev = p2p_get_device(p2p, peer_addr); in p2p_prov_disc_req()
1681 dev = p2p_get_device_interface(p2p, peer_addr); in p2p_prov_disc_req()
1683 p2p_dbg(p2p, "Provision Discovery Request destination " MACSTR in p2p_prov_disc_req()
1689 p2p_dbg(p2p, "Provision Discovery Request with " MACSTR in p2p_prov_disc_req()
1698 p2p->p2ps_prov) { in p2p_prov_disc_req()
1700 p2ps_prov->method = p2p->p2ps_prov->method; in p2p_prov_disc_req()
1705 p2ps_prov_free(p2p); in p2p_prov_disc_req()
1706 p2p->p2ps_prov = p2ps_prov; in p2p_prov_disc_req()
1714 if (p2p->state != P2P_IDLE && p2p->state != P2P_SEARCH && in p2p_prov_disc_req()
1715 p2p->state != P2P_LISTEN_ONLY) { in p2p_prov_disc_req()
1716 p2p_dbg(p2p, "Busy with other operations; postpone Provision Discovery Request with " in p2p_prov_disc_req()
1722 p2p->user_initiated_pd = user_initiated_pd; in p2p_prov_disc_req()
1723 p2p->pd_force_freq = force_freq; in p2p_prov_disc_req()
1725 if (p2p->user_initiated_pd) in p2p_prov_disc_req()
1726 p2p->pd_retries = MAX_PROV_DISC_REQ_RETRIES; in p2p_prov_disc_req()
1736 return p2p_send_prov_disc_req(p2p, dev, join, force_freq); in p2p_prov_disc_req()
1740 void p2p_reset_pending_pd(struct p2p_data *p2p) in p2p_reset_pending_pd() argument
1744 dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) { in p2p_reset_pending_pd()
1745 if (os_memcmp(p2p->pending_pd_devaddr, in p2p_reset_pending_pd()
1756 p2p->user_initiated_pd = 0; in p2p_reset_pending_pd()
1757 os_memset(p2p->pending_pd_devaddr, 0, ETH_ALEN); in p2p_reset_pending_pd()
1758 p2p->pd_retries = 0; in p2p_reset_pending_pd()
1759 p2p->pd_force_freq = 0; in p2p_reset_pending_pd()
1763 void p2ps_prov_free(struct p2p_data *p2p) in p2ps_prov_free() argument
1765 os_free(p2p->p2ps_prov); in p2ps_prov_free()
1766 p2p->p2ps_prov = NULL; in p2ps_prov_free()