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()
130 is_6ghz_capab = is_p2p_6ghz_capable(p2p) && in p2ps_add_pd_req_attrs()
132 p2p, dev->info.p2p_device_addr); in p2ps_add_pd_req_attrs()
133 p2p_buf_add_channel_list(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
134 &p2p->channels, is_6ghz_capab); in p2ps_add_pd_req_attrs()
139 p2p_buf_add_operating_channel(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
140 p2p->op_reg_class, in p2ps_add_pd_req_attrs()
141 p2p->op_channel); in p2ps_add_pd_req_attrs()
159 p2p_buf_add_config_timeout(buf, p2p->go_timeout, in p2ps_add_pd_req_attrs()
160 p2p->client_timeout); in p2ps_add_pd_req_attrs()
163 p2p_buf_add_listen_channel(buf, p2p->cfg->country, in p2ps_add_pd_req_attrs()
164 p2p->cfg->reg_class, in p2ps_add_pd_req_attrs()
165 p2p->cfg->channel); in p2ps_add_pd_req_attrs()
184 static struct wpabuf * p2p_build_prov_disc_req(struct p2p_data *p2p, in p2p_build_prov_disc_req() argument
197 if (p2p->wfd_ie_prov_disc_req) in p2p_build_prov_disc_req()
198 extra = wpabuf_len(p2p->wfd_ie_prov_disc_req); in p2p_build_prov_disc_req()
201 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]) in p2p_build_prov_disc_req()
202 extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]); in p2p_build_prov_disc_req()
204 if (p2p->p2ps_prov) in p2p_build_prov_disc_req()
205 extra += os_strlen(p2p->p2ps_prov->info) + 1 + in p2p_build_prov_disc_req()
217 if (p2p->p2ps_prov) { in p2p_build_prov_disc_req()
220 if (p2p->cross_connect) in p2p_build_prov_disc_req()
222 if (p2p->cfg->p2p_intra_bss) in p2p_build_prov_disc_req()
225 p2p_buf_add_capability(buf, p2p->dev_capab & in p2p_build_prov_disc_req()
228 p2p_buf_add_device_info(buf, p2p, NULL); in p2p_build_prov_disc_req()
229 if (p2p->p2ps_prov) { in p2p_build_prov_disc_req()
230 p2ps_add_pd_req_attrs(p2p, dev, buf, config_methods); in p2p_build_prov_disc_req()
241 if (p2p->wfd_ie_prov_disc_req) in p2p_build_prov_disc_req()
242 wpabuf_put_buf(buf, p2p->wfd_ie_prov_disc_req); in p2p_build_prov_disc_req()
245 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]) in p2p_build_prov_disc_req()
246 wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_PD_REQ]); in p2p_build_prov_disc_req()
252 static struct wpabuf * p2p_build_prov_disc_resp(struct p2p_data *p2p, in p2p_build_prov_disc_resp() argument
270 struct wpabuf *wfd_ie = p2p->wfd_ie_prov_disc_resp; in p2p_build_prov_disc_resp()
273 for (i = 0; i < p2p->num_groups; i++) { in p2p_build_prov_disc_resp()
274 struct p2p_group *g = p2p->groups[i]; in p2p_build_prov_disc_resp()
290 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]) in p2p_build_prov_disc_resp()
291 extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]); in p2p_build_prov_disc_resp()
300 if (p2p->p2ps_prov && p2p->p2ps_prov->adv_id == adv_id) { in p2p_build_prov_disc_resp()
302 struct p2ps_provision *prov = p2p->p2ps_prov; in p2p_build_prov_disc_resp()
316 if (p2p->cross_connect) in p2p_build_prov_disc_resp()
318 if (p2p->cfg->p2p_intra_bss) in p2p_build_prov_disc_resp()
320 p2p_buf_add_capability(buf, p2p->dev_capab & in p2p_build_prov_disc_resp()
323 p2p_buf_add_device_info(buf, p2p, NULL); in p2p_build_prov_disc_resp()
325 if (persist_ssid && p2p->cfg->get_persistent_group && dev && in p2p_build_prov_disc_resp()
333 persist = p2p->cfg->get_persistent_group( in p2p_build_prov_disc_resp()
334 p2p->cfg->cb_ctx, in p2p_build_prov_disc_resp()
348 p2ps_add_new_group_info(p2p, dev, buf); in p2p_build_prov_disc_resp()
352 if (p2p->op_reg_class && p2p->op_channel) in p2p_build_prov_disc_resp()
354 buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
355 p2p->op_reg_class, in p2p_build_prov_disc_resp()
356 p2p->op_channel); in p2p_build_prov_disc_resp()
359 buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
360 p2p->cfg->op_reg_class, in p2p_build_prov_disc_resp()
361 p2p->cfg->op_channel); in p2p_build_prov_disc_resp()
368 is_6ghz_capab = is_p2p_6ghz_capable(p2p) && dev && in p2p_build_prov_disc_resp()
370 p2p, dev->info.p2p_device_addr); in p2p_build_prov_disc_resp()
371 p2p_buf_add_channel_list(buf, p2p->cfg->country, in p2p_build_prov_disc_resp()
372 &p2p->channels, is_6ghz_capab); in p2p_build_prov_disc_resp()
382 p2p_buf_add_config_timeout(buf, p2p->go_timeout, in p2p_build_prov_disc_resp()
383 p2p->client_timeout); in p2p_build_prov_disc_resp()
395 if (p2p->p2ps_prov) in p2p_build_prov_disc_resp()
397 p2p->p2ps_prov->adv_mac); in p2p_build_prov_disc_resp()
410 if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]) in p2p_build_prov_disc_resp()
411 wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_PD_RESP]); in p2p_build_prov_disc_resp()
417 static int p2ps_setup_p2ps_prov(struct p2p_data *p2p, u32 adv_id, in p2ps_setup_p2ps_prov() argument
423 if (!p2p->p2ps_prov) { in p2ps_setup_p2ps_prov()
424 p2p->p2ps_prov = os_zalloc(sizeof(struct p2ps_provision) + 1); in p2ps_setup_p2ps_prov()
425 if (!p2p->p2ps_prov) in p2ps_setup_p2ps_prov()
428 os_memset(p2p->p2ps_prov, 0, sizeof(struct p2ps_provision) + 1); in p2ps_setup_p2ps_prov()
431 tmp = p2p->p2ps_prov; in p2ps_setup_p2ps_prov()
456 static int p2ps_validate_pd_req(struct p2p_data *p2p, struct p2p_message *msg, in p2ps_validate_pd_req() argument
469 p2p_dbg(p2p, "Not P2PS PD Request. Missing %s", #_attr); \ in p2ps_validate_pd_req()
503 p2p_dbg(p2p, "P2PS: Invalid feature capability len"); in p2ps_validate_pd_req()
540 p2p_dbg(p2p, "Invalid P2PS PD connection capability"); in p2ps_validate_pd_req()
566 void p2p_process_prov_disc_req(struct p2p_data *p2p, const u8 *sa, in p2p_process_prov_disc_req() argument
593 p2p_dbg(p2p, "Received Provision Discovery Request from " MACSTR in p2p_process_prov_disc_req()
598 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_req()
600 p2p_dbg(p2p, "Provision Discovery Request from unknown peer " in p2p_process_prov_disc_req()
603 if (p2p_add_device(p2p, sa, rx_freq, NULL, 0, data + 1, len - 1, in p2p_process_prov_disc_req()
605 p2p_dbg(p2p, "Provision Discovery Request add device failed " in p2p_process_prov_disc_req()
610 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_req()
612 p2p_dbg(p2p, in p2p_process_prov_disc_req()
627 p2p_dbg(p2p, in p2p_process_prov_disc_req()
636 for (i = 0; i < p2p->num_groups; i++) { in p2p_process_prov_disc_req()
638 p2p->groups[i], in p2p_process_prov_disc_req()
642 if (i == p2p->num_groups) { in p2p_process_prov_disc_req()
643 p2p_dbg(p2p, in p2p_process_prov_disc_req()
656 if (p2ps_validate_pd_req(p2p, &msg, sa) < 0) { in p2p_process_prov_disc_req()
678 p2p_dbg(p2p, in p2p_process_prov_disc_req()
694 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_req()
699 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_req()
705 p2p_dbg(p2p, "Peer " MACSTR " requesting P2PS PIN", in p2p_process_prov_disc_req()
712 if (p2p->cfg->remove_stale_groups) { in p2p_process_prov_disc_req()
713 p2p->cfg->remove_stale_groups( in p2p_process_prov_disc_req()
714 p2p->cfg->cb_ctx, dev->info.p2p_device_addr, in p2p_process_prov_disc_req()
733 if (!ether_addr_equal(p2p->cfg->dev_addr, msg.adv_mac)) { in p2p_process_prov_disc_req()
734 p2p_dbg(p2p, in p2p_process_prov_disc_req()
740 p2ps_adv = p2p_service_p2ps_id(p2p, adv_id); in p2p_process_prov_disc_req()
742 p2p_dbg(p2p, "P2PS PD invalid adv_id=0x%X", adv_id); in p2p_process_prov_disc_req()
746 p2p_dbg(p2p, "adv_id: 0x%X, p2ps_adv: %p", adv_id, p2ps_adv); in p2p_process_prov_disc_req()
749 conncap = p2p->cfg->p2ps_group_capability(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
754 p2p_dbg(p2p, "Conncap: local:%d remote:%d result:%d", in p2p_process_prov_disc_req()
757 p2p_prepare_channel(p2p, dev, forced_freq, pref_freq, 0); in p2p_process_prov_disc_req()
762 p2p_dbg(p2p, "cpt: service:0x%x remote:0x%x result:0x%x", in p2p_process_prov_disc_req()
766 p2p_dbg(p2p, in p2p_process_prov_disc_req()
772 p2p_dbg(p2p, in p2p_process_prov_disc_req()
778 p2p_dbg(p2p, "P2PS state unavailable"); in p2p_process_prov_disc_req()
781 p2p_dbg(p2p, "Conncap resolution failed"); in p2p_process_prov_disc_req()
786 p2p_dbg(p2p, "Keypad - always defer"); in p2p_process_prov_disc_req()
793 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_req()
796 p2p_dbg(p2p, in p2p_process_prov_disc_req()
826 p2p_channels_intersect(&p2p->channels, &dev->channels, in p2p_process_prov_disc_req()
830 p2p_dbg(p2p, in p2p_process_prov_disc_req()
839 if (p2ps_setup_p2ps_prov(p2p, adv_id, session_id, in p2p_process_prov_disc_req()
846 tmp = p2p->p2ps_prov; in p2p_process_prov_disc_req()
863 (!p2p->p2ps_prov || p2p->p2ps_prov->adv_id != adv_id)) { in p2p_process_prov_disc_req()
871 if (p2ps_setup_p2ps_prov(p2p, adv_id, session_id, in p2p_process_prov_disc_req()
877 tmp = p2p->p2ps_prov; in p2p_process_prov_disc_req()
891 if (*msg.status != P2P_SC_SUCCESS_DEFERRED || !p2p->p2ps_prov) in p2p_process_prov_disc_req()
894 if (p2p->p2ps_prov->adv_id != adv_id || in p2p_process_prov_disc_req()
895 !ether_addr_equal(p2p->p2ps_prov->adv_mac, msg.adv_mac)) { in p2p_process_prov_disc_req()
896 p2p_dbg(p2p, in p2p_process_prov_disc_req()
901 if (p2p->p2ps_prov->session_id != session_id || in p2p_process_prov_disc_req()
902 !ether_addr_equal(p2p->p2ps_prov->session_mac, msg.session_mac)) { in p2p_process_prov_disc_req()
903 p2p_dbg(p2p, "P2PS Follow-on PD with mismatch Session ID/MAC"); in p2p_process_prov_disc_req()
907 method = p2p->p2ps_prov->method; in p2p_process_prov_disc_req()
909 conncap = p2p->cfg->p2ps_group_capability(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
911 p2p->p2ps_prov->conncap, in p2p_process_prov_disc_req()
912 &p2p->p2ps_prov->force_freq, in p2p_process_prov_disc_req()
913 &p2p->p2ps_prov->pref_freq); in p2p_process_prov_disc_req()
915 resp_fcap.cpt = p2ps_own_preferred_cpt(p2p->p2ps_prov->cpt_priority, in p2p_process_prov_disc_req()
918 p2p_dbg(p2p, "cpt: local:0x%x remote:0x%x result:0x%x", in p2p_process_prov_disc_req()
919 p2p->p2ps_prov->cpt_mask, req_fcap->cpt, resp_fcap.cpt); in p2p_process_prov_disc_req()
921 p2p_prepare_channel(p2p, dev, p2p->p2ps_prov->force_freq, in p2p_process_prov_disc_req()
922 p2p->p2ps_prov->pref_freq, 0); in p2p_process_prov_disc_req()
940 p2p_dbg(p2p, in p2p_process_prov_disc_req()
946 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_req()
949 p2p_dbg(p2p, in p2p_process_prov_disc_req()
966 p2p_go_select_channel(p2p, dev, &tmp) < 0) in p2p_process_prov_disc_req()
970 p2p->p2ps_prov->status = reject; in p2p_process_prov_disc_req()
971 p2p->p2ps_prov->conncap = conncap; in p2p_process_prov_disc_req()
985 resp = p2p_build_prov_disc_resp(p2p, dev, msg.dialog_token, in p2p_process_prov_disc_req()
996 p2p_dbg(p2p, "Sending Provision Discovery Response"); in p2p_process_prov_disc_req()
1000 freq = p2p_channel_to_freq(p2p->cfg->reg_class, in p2p_process_prov_disc_req()
1001 p2p->cfg->channel); in p2p_process_prov_disc_req()
1003 p2p_dbg(p2p, "Unknown regulatory class/channel"); in p2p_process_prov_disc_req()
1008 p2p->pending_action_state = P2P_PENDING_PD_RESPONSE; in p2p_process_prov_disc_req()
1009 if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr, in p2p_process_prov_disc_req()
1010 p2p->cfg->dev_addr, in p2p_process_prov_disc_req()
1013 p2p_dbg(p2p, "Failed to send Action frame"); in p2p_process_prov_disc_req()
1015 p2p->send_action_in_progress = 1; in p2p_process_prov_disc_req()
1027 freq = p2p_channel_to_freq(p2p->op_reg_class, in p2p_process_prov_disc_req()
1028 p2p->op_channel); in p2p_process_prov_disc_req()
1033 if (!p2p->cfg->p2ps_prov_complete) { in p2p_process_prov_disc_req()
1038 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, reject, in p2p_process_prov_disc_req()
1046 p2p->p2ps_prov) { in p2p_process_prov_disc_req()
1047 p2p->p2ps_prov->status = reject; in p2p_process_prov_disc_req()
1048 p2p->p2ps_prov->conncap = conncap; in p2p_process_prov_disc_req()
1051 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, reject, in p2p_process_prov_disc_req()
1060 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, in p2p_process_prov_disc_req()
1072 } else if (msg.status && p2p->p2ps_prov) { in p2p_process_prov_disc_req()
1073 p2p->p2ps_prov->status = P2P_SC_SUCCESS; in p2p_process_prov_disc_req()
1074 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, *msg.status, sa, in p2p_process_prov_disc_req()
1085 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, P2P_SC_SUCCESS, in p2p_process_prov_disc_req()
1100 p2p->p2ps_prov->method = msg.wps_config_methods; in p2p_process_prov_disc_req()
1102 p2p->cfg->p2ps_prov_complete(p2p->cfg->cb_ctx, P2P_SC_SUCCESS, in p2p_process_prov_disc_req()
1116 p2p->p2ps_prov->method = msg.wps_config_methods; in p2p_process_prov_disc_req()
1121 p2p->cfg->p2ps_prov_complete( in p2p_process_prov_disc_req()
1122 p2p->cfg->cb_ctx, P2P_SC_SUCCESS, sa, in p2p_process_prov_disc_req()
1152 if (p2p->cfg->prov_disc_req && in p2p_process_prov_disc_req()
1168 p2p->cfg->prov_disc_req(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_req()
1179 p2ps_prov_free(p2p); in p2p_process_prov_disc_req()
1208 static int p2p_validate_p2ps_pd_resp(struct p2p_data *p2p, in p2p_validate_p2ps_pd_resp() argument
1219 p2p_dbg(p2p, "P2PS PD Response missing " #_attr); \ in p2p_validate_p2ps_pd_resp()
1236 if (p2p->p2ps_prov->session_id != session_id) { in p2p_validate_p2ps_pd_resp()
1237 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1242 if (!ether_addr_equal(p2p->p2ps_prov->session_mac, msg->session_mac)) { in p2p_validate_p2ps_pd_resp()
1243 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1248 if (p2p->p2ps_prov->adv_id != adv_id) { in p2p_validate_p2ps_pd_resp()
1249 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1254 if (!ether_addr_equal(p2p->p2ps_prov->adv_mac, msg->adv_mac)) { 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()
1268 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1274 p2p_dbg(p2p, in p2p_validate_p2ps_pd_resp()
1306 void p2p_process_prov_disc_resp(struct p2p_data *p2p, const u8 *sa, in p2p_process_prov_disc_resp() argument
1323 if (p2p->p2ps_prov && p2p_validate_p2ps_pd_resp(p2p, &msg)) { in p2p_process_prov_disc_resp()
1356 p2p_dbg(p2p, "Received Provision Discovery Response from " MACSTR in p2p_process_prov_disc_resp()
1360 dev = p2p_get_device(p2p, sa); in p2p_process_prov_disc_resp()
1362 p2p_dbg(p2p, "Ignore Provision Discovery Response from " MACSTR in p2p_process_prov_disc_resp()
1374 p2p_dbg(p2p, "Ignore Provision Discovery Response with unexpected Dialog Token %u (expected %u)", in p2p_process_prov_disc_resp()
1380 if (p2p->pending_action_state == P2P_PENDING_PD) { in p2p_process_prov_disc_resp()
1381 os_memset(p2p->pending_pd_devaddr, 0, ETH_ALEN); in p2p_process_prov_disc_resp()
1382 p2p->pending_action_state = P2P_NO_PENDING_ACTION; in p2p_process_prov_disc_resp()
1385 p2ps_seeker = p2p->p2ps_prov && p2p->p2ps_prov->pd_seeker; in p2p_process_prov_disc_resp()
1397 if (p2p->user_initiated_pd && in p2p_process_prov_disc_resp()
1398 ether_addr_equal(p2p->pending_pd_devaddr, sa)) in p2p_process_prov_disc_resp()
1399 p2p_reset_pending_pd(p2p); in p2p_process_prov_disc_resp()
1402 …p2p_dbg(p2p, "Peer rejected our Provision Discovery Request (received config_methods 0x%x expected… in p2p_process_prov_disc_resp()
1404 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1405 p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1409 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1418 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_resp()
1423 p2p_dbg(p2p, "Peer " MACSTR in p2p_process_prov_disc_resp()
1429 p2p_dbg(p2p, "Peer " MACSTR " accepted P2PS PIN", in p2p_process_prov_disc_resp()
1436 p2p->p2ps_prov) { in p2p_process_prov_disc_resp()
1448 p2p_peer_channels_check(p2p, &p2p->channels, dev, in p2p_process_prov_disc_resp()
1451 p2p_dbg(p2p, "P2PS PD Response - no common channels"); in p2p_process_prov_disc_resp()
1454 if (p2p_channels_includes(&p2p->channels, in p2p_process_prov_disc_resp()
1465 p2p_dbg(p2p, in p2p_process_prov_disc_resp()
1470 if (p2p->cfg->p2ps_prov_complete) { in p2p_process_prov_disc_resp()
1481 if (p2p_go_select_channel(p2p, dev, &tmp) < 0) in p2p_process_prov_disc_resp()
1482 p2p_dbg(p2p, in p2p_process_prov_disc_resp()
1485 freq = p2p_channel_to_freq(p2p->op_reg_class, in p2p_process_prov_disc_resp()
1486 p2p->op_channel); 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()
1501 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1504 status != P2P_SC_SUCCESS_DEFERRED && p2p->p2ps_prov) { in p2p_process_prov_disc_resp()
1505 if (p2p->cfg->p2ps_prov_complete) in p2p_process_prov_disc_resp()
1506 p2p->cfg->p2ps_prov_complete( in p2p_process_prov_disc_resp()
1507 p2p->cfg->cb_ctx, status, sa, adv_mac, in p2p_process_prov_disc_resp()
1508 p2p->p2ps_prov->session_mac, in p2p_process_prov_disc_resp()
1509 group_mac, adv_id, p2p->p2ps_prov->session_id, in p2p_process_prov_disc_resp()
1511 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1515 if (p2p->cfg->remove_stale_groups) { in p2p_process_prov_disc_resp()
1516 p2p->cfg->remove_stale_groups(p2p->cfg->cb_ctx, in p2p_process_prov_disc_resp()
1527 p2ps_prov_free(p2p); 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( in p2p_process_prov_disc_resp()
1535 p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1541 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1542 p2p->cfg->prov_disc_fail( in p2p_process_prov_disc_resp()
1543 p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1547 p2p_dbg(p2p, "Peer rejected our Provision Discovery Request"); in p2p_process_prov_disc_resp()
1548 if (p2p->cfg->prov_disc_fail) in p2p_process_prov_disc_resp()
1549 p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1553 p2ps_prov_free(p2p); in p2p_process_prov_disc_resp()
1566 p2p->cfg->send_action_done(p2p->cfg->cb_ctx); in p2p_process_prov_disc_resp()
1568 p2p_dbg(p2p, "Start GO Neg after the PD-before-GO-Neg workaround with " in p2p_process_prov_disc_resp()
1571 p2p_connect_send(p2p, dev); in p2p_process_prov_disc_resp()
1589 if (p2p->cfg->prov_disc_resp && in p2p_process_prov_disc_resp()
1596 p2p->cfg->prov_disc_resp(p2p->cfg->cb_ctx, sa, in p2p_process_prov_disc_resp()
1599 if (p2p->state == P2P_PD_DURING_FIND) { in p2p_process_prov_disc_resp()
1600 p2p_stop_listen_for_freq(p2p, 0); in p2p_process_prov_disc_resp()
1601 p2p_continue_find(p2p); in p2p_process_prov_disc_resp()
1606 int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev, in p2p_send_prov_disc_req() argument
1618 p2p_dbg(p2p, "No Listen/Operating frequency known for the peer " in p2p_send_prov_disc_req()
1627 p2p_dbg(p2p, "Cannot use PD with P2P Device " MACSTR in p2p_send_prov_disc_req()
1635 if (p2p->p2ps_prov) { in p2p_send_prov_disc_req()
1636 if (p2p->p2ps_prov->status == P2P_SC_SUCCESS_DEFERRED) { in p2p_send_prov_disc_req()
1637 if (p2p->p2ps_prov->method == WPS_CONFIG_DISPLAY) in p2p_send_prov_disc_req()
1639 else if (p2p->p2ps_prov->method == WPS_CONFIG_KEYPAD) in p2p_send_prov_disc_req()
1645 if (p2p->p2ps_prov->method) in p2p_send_prov_disc_req()
1647 p2p->p2ps_prov->method; in p2p_send_prov_disc_req()
1655 p2p_dbg(p2p, in p2p_send_prov_disc_req()
1657 p2p->p2ps_prov->method, p2p->p2ps_prov->status, in p2p_send_prov_disc_req()
1660 if (p2p_prepare_channel(p2p, dev, p2p->p2ps_prov->force_freq, in p2p_send_prov_disc_req()
1661 p2p->p2ps_prov->pref_freq, 1) < 0) in p2p_send_prov_disc_req()
1665 req = p2p_build_prov_disc_req(p2p, dev, join); in p2p_send_prov_disc_req()
1669 if (p2p->state != P2P_IDLE) in p2p_send_prov_disc_req()
1670 p2p_stop_listen_for_freq(p2p, freq); in p2p_send_prov_disc_req()
1671 p2p->pending_action_state = P2P_PENDING_PD; in p2p_send_prov_disc_req()
1672 if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr, in p2p_send_prov_disc_req()
1673 p2p->cfg->dev_addr, dev->info.p2p_device_addr, in p2p_send_prov_disc_req()
1675 p2p_dbg(p2p, "Failed to send Action frame"); in p2p_send_prov_disc_req()
1680 os_memcpy(p2p->pending_pd_devaddr, dev->info.p2p_device_addr, ETH_ALEN); in p2p_send_prov_disc_req()
1687 int p2p_prov_disc_req(struct p2p_data *p2p, const u8 *peer_addr, in p2p_prov_disc_req() argument
1694 dev = p2p_get_device(p2p, peer_addr); in p2p_prov_disc_req()
1696 dev = p2p_get_device_interface(p2p, peer_addr); in p2p_prov_disc_req()
1698 p2p_dbg(p2p, "Provision Discovery Request destination " MACSTR in p2p_prov_disc_req()
1704 p2p_dbg(p2p, "Provision Discovery Request with " MACSTR in p2p_prov_disc_req()
1713 p2p->p2ps_prov) { in p2p_prov_disc_req()
1715 p2ps_prov->method = p2p->p2ps_prov->method; in p2p_prov_disc_req()
1720 p2ps_prov_free(p2p); in p2p_prov_disc_req()
1721 p2p->p2ps_prov = p2ps_prov; in p2p_prov_disc_req()
1729 if (p2p->state != P2P_IDLE && p2p->state != P2P_SEARCH && in p2p_prov_disc_req()
1730 p2p->state != P2P_LISTEN_ONLY) { in p2p_prov_disc_req()
1731 p2p_dbg(p2p, "Busy with other operations; postpone Provision Discovery Request with " in p2p_prov_disc_req()
1737 p2p->user_initiated_pd = user_initiated_pd; in p2p_prov_disc_req()
1738 p2p->pd_force_freq = force_freq; in p2p_prov_disc_req()
1740 if (p2p->user_initiated_pd) in p2p_prov_disc_req()
1741 p2p->pd_retries = MAX_PROV_DISC_REQ_RETRIES; in p2p_prov_disc_req()
1751 return p2p_send_prov_disc_req(p2p, dev, join, force_freq); in p2p_prov_disc_req()
1755 void p2p_reset_pending_pd(struct p2p_data *p2p) in p2p_reset_pending_pd() argument
1759 dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) { in p2p_reset_pending_pd()
1760 if (!ether_addr_equal(p2p->pending_pd_devaddr, in p2p_reset_pending_pd()
1771 p2p->user_initiated_pd = 0; in p2p_reset_pending_pd()
1772 os_memset(p2p->pending_pd_devaddr, 0, ETH_ALEN); in p2p_reset_pending_pd()
1773 p2p->pd_retries = 0; in p2p_reset_pending_pd()
1774 p2p->pd_force_freq = 0; in p2p_reset_pending_pd()
1778 void p2ps_prov_free(struct p2p_data *p2p) in p2ps_prov_free() argument
1780 os_free(p2p->p2ps_prov); in p2ps_prov_free()
1781 p2p->p2ps_prov = NULL; in p2ps_prov_free()