Home | History | Annotate | Download | only in wpa_supplicant

Lines Matching refs:wpa_s

102 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
104 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq,
106 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq,
109 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
113 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s);
114 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
116 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
120 static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
122 static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s);
125 static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s);
132 static int wpas_p2p_num_unused_channels(struct wpa_supplicant *wpa_s)
137 freqs = os_calloc(wpa_s->num_multichan_concurrent, sizeof(int));
141 num = get_shared_radio_freqs(wpa_s, freqs,
142 wpa_s->num_multichan_concurrent);
145 unused = wpa_s->num_multichan_concurrent - num;
146 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: num_unused_channels: %d", unused);
156 wpas_p2p_valid_oper_freqs(struct wpa_supplicant *wpa_s,
163 freqs = os_calloc(wpa_s->num_multichan_concurrent,
168 num = get_shared_radio_freqs_data(wpa_s, freqs,
169 wpa_s->num_multichan_concurrent);
174 if (p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq))
180 dump_freq_data(wpa_s, "valid for P2P", p2p_freqs, j);
186 static void wpas_p2p_set_own_freq_preference(struct wpa_supplicant *wpa_s,
189 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
191 if (wpa_s->parent->conf->p2p_ignore_shared_freq &&
192 freq > 0 && wpa_s->num_multichan_concurrent > 1 &&
193 wpas_p2p_num_unused_channels(wpa_s) > 0) {
198 p2p_set_own_freq_preference(wpa_s->global->p2p, freq);
202 static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
207 if (wpa_s->p2p_scan_work) {
208 struct wpa_radio_work *work = wpa_s->p2p_scan_work;
209 wpa_s->p2p_scan_work = NULL;
213 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
241 if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
247 p2p_scan_res_handled(wpa_s->global->p2p);
253 struct wpa_supplicant *wpa_s = work->wpa_s;
263 wpa_s->p2p_scan_work = NULL;
267 ret = wpa_drv_scan(wpa_s, params);
275 os_get_reltime(&wpa_s->scan_trigger_time);
276 wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
277 wpa_s->own_scan_requested = 1;
278 wpa_s->p2p_scan_work = work;
286 struct wpa_supplicant *wpa_s = ctx;
294 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
297 if (wpa_s->p2p_scan_work) {
298 wpa_dbg(wpa_s, MSG_INFO, "P2P: Reject scan trigger since one is already pending");
315 wpa_s->wps->dev.p2p = 1;
316 wps_ie = wps_build_probe_req_ie(pw_id, &wpa_s->wps->dev,
317 wpa_s->wps->uuid, WPS_REQ_ENROLLEE,
322 ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
331 p2p_scan_ie(wpa_s->global->p2p, ies, dev_id);
351 if (p2p_supported_freq(wpa_s->global->p2p,
366 if (p2p_supported_freq(wpa_s->global->p2p,
371 if (p2p_supported_freq(wpa_s->global->p2p, freq))
377 radio_remove_works(wpa_s, "p2p-scan", 0);
378 if (radio_add_work(wpa_s, 0, "p2p-scan", 0, wpas_p2p_trigger_scan_cb,
404 static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s,
410 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
411 for (s = wpa_s->conf->ssid; s; s = s->next) {
417 s != wpa_s->current_ssid)
421 return wpa_s;
429 static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s,
436 ssid = wpa_s->current_ssid;
443 ssid = wpa_s->conf->ssid;
450 wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)
457 if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO)
459 else if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT ||
461 wpa_s->reassociate = 0;
462 wpa_s->disconnected = 1;
468 wpas_notify_p2p_group_removed(wpa_s, ssid, gtype);
471 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
473 if (wpa_s->cross_connect_in_use) {
474 wpa_s->cross_connect_in_use = 0;
475 wpa_msg_global(wpa_s->parent, MSG_INFO,
477 wpa_s->ifname, wpa_s->cross_connect_uplink);
506 wpa_msg_global(wpa_s->parent, MSG_INFO,
508 wpa_s->ifname, gtype, reason);
511 if (eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL) > 0)
513 if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
516 wpa_s->parent, NULL) > 0) {
519 wpa_s->p2p_in_provisioning = 0;
522 wpa_s->p2p_in_invitation = 0;
528 wpa_s->global->p2p_go_wait_client.sec = 0;
530 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
535 wpa_s->ifname);
536 global = wpa_s->global;
537 ifname = os_strdup(wpa_s->ifname);
538 type = wpas_p2p_if_type(wpa_s->p2p_group_interface);
539 wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0);
540 wpa_s = global->ifaces;
541 if (wpa_s && ifname)
542 wpa_drv_if_remove(wpa_s, type, ifname);
547 if (!wpa_s->p2p_go_group_formation_completed) {
548 wpa_s->global->p2p_group_formation = NULL;
549 wpa_s->p2p_in_provisioning = 0;
552 wpa_s->show_group_started = 0;
553 os_free(wpa_s->go_params);
554 wpa_s->go_params = NULL;
556 wpa_s->waiting_presence_resp = 0;
563 if (ssid == wpa_s->current_ssid) {
564 wpa_sm_set_config(wpa_s->wpa, NULL);
565 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
566 wpa_s->current_ssid = NULL;
577 wpa_config_remove_network(wpa_s->conf, id);
578 wpa_supplicant_clear_status(wpa_s);
579 wpa_supplicant_cancel_sched_scan(wpa_s);
584 if (wpa_s->ap_iface)
585 wpa_supplicant_ap_deinit(wpa_s);
587 wpa_drv_deinit_p2p_cli(wpa_s);
593 static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s,
603 if (wpa_s->go_params)
604 bssid = wpa_s->go_params->peer_interface_addr;
606 bssid = wpa_s->bssid;
608 bss = wpa_bss_get(wpa_s, bssid, ssid, ssid_len);
609 if (bss == NULL && wpa_s->go_params &&
610 !is_zero_ether_addr(wpa_s->go_params->peer_device_addr))
612 wpa_s, wpa_s->go_params->peer_device_addr);
615 if (p2p_get_interface_addr(wpa_s->global->p2p, bssid,
617 bss = wpa_bss_get(wpa_s, iface_addr, ssid, ssid_len);
662 static int wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
671 for (s = wpa_s->conf->ssid; s; s = s->next) {
691 s = wpa_config_add_network(wpa_s->conf);
703 wpas_notify_persistent_group_added(wpa_s, s);
736 if (ssid->mode == WPAS_MODE_P2P_GO && wpa_s->global->add_psk) {
737 dl_list_add(&s->psk_list, &wpa_s->global->add_psk->list);
738 wpa_s->global->add_psk = NULL;
742 if (changed && wpa_s->conf->update_config &&
743 wpa_config_write(wpa_s->confname, wpa_s->conf)) {
751 static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
759 ssid = wpa_s->current_ssid;
764 for (s = wpa_s->parent->conf->ssid; s; s = s->next) {
813 if (wpa_s->parent->conf->update_config &&
814 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
819 static void wpas_p2p_group_started(struct wpa_supplicant *wpa_s,
845 wpa_msg_global_ctrl(wpa_s->parent, MSG_INFO,
849 wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq,
858 wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq,
864 static void wpas_group_formation_completed(struct wpa_supplicant *wpa_s,
874 * This callback is likely called for the main interface. Update wpa_s
878 if (wpa_s->global->p2p_group_formation)
879 wpa_s = wpa_s->global->p2p_group_formation;
880 if (wpa_s->p2p_go_group_formation_completed) {
881 wpa_s->global->p2p_group_formation = NULL;
882 wpa_s->p2p_in_provisioning = 0;
884 wpa_s->p2p_in_invitation = 0;
887 wpa_msg_global(wpa_s->parent, MSG_INFO,
889 wpas_p2p_group_delete(wpa_s,
894 wpa_msg_global(wpa_s->parent, MSG_INFO,
897 ssid = wpa_s->current_ssid;
900 p2p_group_notif_formation_done(wpa_s->p2p_group);
901 wpa_supplicant_ap_mac_addr_filter(wpa_s, NULL);
909 os_memcpy(go_dev_addr, wpa_s->global->p2p_dev_addr,
912 persistent = wpas_p2p_persistent_group(wpa_s,
917 client = wpa_s->p2p_group_interface ==
922 wpa_s->show_group_started = 0;
929 wpa_s->show_group_started = 1;
931 wpas_p2p_group_started(wpa_s, 1, ssid,
937 wpas_p2p_cross_connect_setup(wpa_s);
938 wpas_p2p_set_group_idle_timeout(wpa_s);
942 network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
945 os_free(wpa_s->global->add_psk);
946 wpa_s->global->add_psk = NULL;
951 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
952 os_get_reltime(&wpa_s->global->p2p_go_wait_client);
971 struct wpa_supplicant *wpa_s = eloop_ctx;
973 if (!wpa_s->p2p_send_action_work)
977 os_free(wpa_s->p2p_send_action_work->ctx);
978 radio_work_done(wpa_s->p2p_send_action_work);
979 wpa_s->p2p_send_action_work = NULL;
983 static void wpas_p2p_action_tx_clear(struct wpa_supplicant *wpa_s)
985 if (wpa_s->p2p_send_action_work) {
987 awork = wpa_s->p2p_send_action_work->ctx;
990 radio_work_done(wpa_s->p2p_send_action_work);
991 wpa_s->p2p_send_action_work = NULL;
1000 wpa_s, NULL);
1004 wpa_s, NULL);
1010 static void wpas_p2p_send_action_tx_status(struct wpa_supplicant *wpa_s,
1020 wpas_p2p_action_tx_clear(wpa_s);
1022 if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
1037 p2p_send_action_cb(wpa_s->global->p2p, freq, dst, src, bssid, res);
1040 wpa_s->pending_pd_before_join &&
1041 (os_memcmp(dst, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
1042 os_memcmp(dst, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0) &&
1043 wpa_s->p2p_fallback_to_go_neg) {
1044 wpa_s->pending_pd_before_join = 0;
1045 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No ACK for PD Req "
1047 wpas_p2p_fallback_to_go_neg(wpa_s, 0);
1055 struct wpa_supplicant *wpa_s = work->wpa_s;
1061 wpa_s, NULL);
1062 wpa_s->p2p_send_action_work = NULL;
1063 offchannel_send_action_done(wpa_s);
1069 if (offchannel_send_action(wpa_s, awork->freq, awork->dst, awork->src,
1077 wpa_s->p2p_send_action_work = work;
1081 static int wpas_send_action_work(struct wpa_supplicant *wpa_s,
1088 if (wpa_s->p2p_send_action_work) {
1105 if (radio_add_work(wpa_s, freq, "p2p-send-action", 0,
1119 struct wpa_supplicant *wpa_s = ctx;
1122 if (wpa_s->p2p_listen_work)
1123 listen_freq = wpa_s->p2p_listen_work->freq;
1124 if (wpa_s->p2p_send_action_work)
1125 send_freq = wpa_s->p2p_send_action_work->freq;
1129 return wpas_send_action_work(wpa_s, freq, dst, src, bssid, buf,
1134 return offchannel_send_action(wpa_s, freq, dst, src, bssid, buf, len,
1142 struct wpa_supplicant *wpa_s = ctx;
1144 if (wpa_s->p2p_send_action_work) {
1146 wpa_s, NULL);
1147 os_free(wpa_s->p2p_send_action_work->ctx);
1148 radio_work_done(wpa_s->p2p_send_action_work);
1149 wpa_s->p2p_send_action_work = NULL;
1152 offchannel_send_action_done(wpa_s);
1156 static int wpas_copy_go_neg_results(struct wpa_supplicant *wpa_s,
1159 if (wpa_s->go_params == NULL) {
1160 wpa_s->go_params = os_malloc(sizeof(*params));
1161 if (wpa_s->go_params == NULL)
1164 wpa_s->go_params, params, sizeof(*params));
1169 static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s,
1178 wpa_supplicant_ap_deinit(wpa_s);
1179 wpas_copy_go_neg_results(wpa_s, res);
1181 wpas_wps_start_pbc(wpa_s, res->peer_interface_addr, 1);
1184 wpas_wps_start_nfc(wpa_s, res->peer_device_addr,
1186 wpa_s->parent->p2p_oob_dev_pw,
1187 wpa_s->parent->p2p_oob_dev_pw_id, 1,
1188 wpa_s->parent->p2p_oob_dev_pw_id ==
1190 wpa_s->parent->p2p_peer_oob_pubkey_hash :
1196 if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
1198 wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
1199 wpa_s->p2p_pin, 1, dev_pw_id);
1204 static void wpas_p2p_add_psk_list(struct wpa_supplicant *wpa_s,
1211 if (!wpa_s->ap_iface)
1214 persistent = wpas_p2p_get_persistent(wpa_s->parent, NULL, ssid->ssid,
1219 hapd = wpa_s->ap_iface->bss[0];
1225 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add persistent group PSK entry for "
1244 struct wpa_supplicant *wpa_s = ctx;
1249 ssid = wpa_s->current_ssid;
1252 if (wpa_s->global->p2p_group_formation == wpa_s)
1253 wpa_s->global->p2p_group_formation = NULL;
1254 wpas_p2p_group_started(wpa_s, 1, ssid, ssid->frequency,
1258 wpa_s->global->p2p_dev_addr,
1261 os_get_reltime(&wpa_s->global->p2p_go_wait_client);
1264 wpa_s->parent, ssid,
1265 wpa_s->global->p2p_dev_addr);
1266 wpas_p2p_add_psk_list(wpa_s, ssid);
1270 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
1271 wpas_p2p_cross_connect_setup(wpa_s);
1272 wpas_p2p_set_group_idle_timeout(wpa_s);
1274 if (wpa_s->p2p_first_connection_timeout) {
1275 wpa_dbg(wpa_s, MSG_DEBUG,
1277 wpa_s->p2p_first_connection_timeout);
1278 wpa_s->p2p_go_group_formation_completed = 0;
1279 wpa_s->global->p2p_group_formation = wpa_s;
1281 wpa_s->parent, NULL);
1283 wpa_s->p2p_first_connection_timeout, 0,
1285 wpa_s->parent, NULL);
1292 if (wpa_supplicant_ap_mac_addr_filter(wpa_s,
1299 wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,
1303 if (wpa_s->parent->p2p_oob_dev_pw_id !=
1305 !wpa_s->parent->p2p_oob_dev_pw) {
1310 wpa_s, wpa_s->parent->p2p_oob_dev_pw_id,
1311 wpa_s->parent->p2p_oob_dev_pw,
1312 wpa_s->parent->p2p_peer_oob_pk_hash_known ?
1313 wpa_s->parent->p2p_peer_oob_pubkey_hash : NULL);
1315 } else if (wpa_s->p2p_pin[0])
1316 wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,
1317 wpa_s->p2p_pin, NULL, 0, 0);
1318 os_free(wpa_s->go_params);
1319 wpa_s->go_params = NULL;
1323 static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
1329 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Starting GO");
1330 if (wpas_copy_go_neg_results(wpa_s, params) < 0) {
1331 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not copy GO Negotiation "
1336 ssid = wpa_config_add_network(wpa_s->conf);
1338 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not add network for GO");
1342 wpa_s->show_group_started = 0;
1365 wpa_msg_global(wpa_s, MSG_ERROR,
1367 wpa_config_remove_network(wpa_s->conf, ssid->id);
1377 ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
1379 wpa_s->ap_configured_cb = p2p_go_configured;
1380 wpa_s->ap_configured_cb_ctx = wpa_s;
1381 wpa_s->ap_configured_cb_data = wpa_s->go_params;
1382 wpa_s->scan_req = NORMAL_SCAN_REQ;
1383 wpa_s->connect_without_scan = ssid;
1384 wpa_s->reassociate = 1;
1385 wpa_s->disconnected = 0;
1386 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Request scan (that will be skipped) to "
1388 wpa_supplicant_req_scan(wpa_s, 0, 0);
1433 static void wpas_p2p_get_group_ifname(struct wpa_supplicant *wpa_s,
1436 char *ifname_ptr = wpa_s->ifname;
1438 if (os_strncmp(wpa_s->ifname, P2P_MGMT_DEVICE_PREFIX,
1440 ifname_ptr = os_strrchr(wpa_s->ifname, '-') + 1;
1443 os_snprintf(ifname, len, "p2p-%s-%d", ifname_ptr, wpa_s->p2p_group_idx);
1445 os_strlen(wpa_s->ifname) < IFNAMSIZ) {
1447 os_snprintf(ifname, len, "p2p-%d", wpa_s->p2p_group_idx);
1452 static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s,
1457 if (wpa_s->pending_interface_name[0]) {
1460 if (is_zero_ether_addr(wpa_s->pending_interface_addr)) {
1463 wpa_s->pending_interface_name);
1469 wpas_p2p_get_group_ifname(wpa_s, ifname, sizeof(ifname));
1474 wpa_s->p2p_group_idx++;
1476 wpa_s->pending_interface_type = type;
1477 if (wpa_drv_if_add(wpa_s, type, ifname, NULL, NULL, force_ifname,
1478 wpa_s->pending_interface_addr, NULL) < 0) {
1487 os_strlcpy(wpa_s->pending_interface_name, force_ifname,
1488 sizeof(wpa_s->pending_interface_name));
1490 os_strlcpy(wpa_s->pending_interface_name, ifname,
1491 sizeof(wpa_s->pending_interface_name));
1493 MACSTR, wpa_s->pending_interface_name,
1494 MAC2STR(wpa_s->pending_interface_addr));
1501 struct wpa_supplicant *wpa_s)
1503 if (!wpa_s->pending_interface_name[0] ||
1504 is_zero_ether_addr(wpa_s->pending_interface_addr))
1508 wpa_s->pending_interface_name);
1509 wpa_drv_if_remove(wpa_s, wpa_s->pending_interface_type,
1510 wpa_s->pending_interface_name);
1511 os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
1512 wpa_s->pending_interface_name[0] = '\0';
1517 wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go)
1522 if (!wpa_s->pending_interface_name[0]) {
1524 if (!wpas_p2p_create_iface(wpa_s))
1531 if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
1537 iface.ifname = wpa_s->pending_interface_name;
1538 iface.driver = wpa_s->driver->name;
1539 if (wpa_s->conf->ctrl_interface == NULL &&
1540 wpa_s->parent != wpa_s &&
1541 wpa_s->p2p_mgmt &&
1542 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE))
1543 iface.ctrl_interface = wpa_s->parent->conf->ctrl_interface;
1545 iface.ctrl_interface = wpa_s->conf->ctrl_interface;
1546 iface.driver_param = wpa_s->conf->driver_param;
1547 group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
1553 wpa_s->pending_interface_name[0] = '\0';
1554 group_wpa_s->parent = wpa_s;
1557 wpa_s->global->p2p_group_formation = group_wpa_s;
1559 wpas_p2p_clone_config(group_wpa_s, wpa_s);
1568 struct wpa_supplicant *wpa_s = eloop_ctx;
1570 wpas_p2p_group_formation_failed(wpa_s);
1574 void wpas_p2p_group_formation_failed(struct wpa_supplicant *wpa_s)
1577 wpa_s->parent, NULL);
1578 if (wpa_s->global->p2p)
1579 p2p_group_formation_failed(wpa_s->global->p2p);
1580 wpas_group_formation_completed(wpa_s, 0);
1584 static void wpas_p2p_grpform_fail_after_wps(struct wpa_supplicant *wpa_s)
1588 wpa_s->parent, NULL);
1590 wpa_s->parent, NULL);
1591 wpa_s->global->p2p_fail_on_wps_complete = 0;
1595 void wpas_p2p_ap_setup_failed(struct wpa_supplicant *wpa_s)
1597 if (wpa_s->global->p2p_group_formation != wpa_s)
1601 wpa_s->parent, NULL);
1603 wpa_s->parent, NULL);
1609 struct wpa_supplicant *wpa_s = ctx;
1611 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
1612 wpa_drv_cancel_remain_on_channel(wpa_s);
1613 wpa_s->off_channel_freq = 0;
1614 wpa_s->roc_waiting_drv_freq = 0;
1618 wpa_msg_global(wpa_s, MSG_INFO,
1621 wpas_notify_p2p_go_neg_completed(wpa_s, res);
1622 wpas_p2p_remove_pending_group_interface(wpa_s);
1626 if (wpa_s->p2p_go_ht40)
1628 if (wpa_s->p2p_go_vht)
1631 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS "role=%s "
1638 wpas_notify_p2p_go_neg_completed(wpa_s, res);
1640 if (res->role_go && wpa_s->p2p_persistent_id >= 0) {
1642 ssid = wpa_config_get_network(wpa_s->conf,
1643 wpa_s->p2p_persistent_id);
1654 if (wpa_s->create_p2p_iface) {
1656 wpas_p2p_init_group_interface(wpa_s, res->role_go);
1658 wpas_p2p_remove_pending_group_interface(wpa_s);
1660 wpa_s, NULL);
1661 wpas_p2p_group_formation_failed(wpa_s);
1664 if (group_wpa_s != wpa_s) {
1665 os_memcpy(group_wpa_s->p2p_pin, wpa_s->p2p_pin,
1667 group_wpa_s->p2p_wps_method = wpa_s->p2p_wps_method;
1669 os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
1670 wpa_s->pending_interface_name[0] = '\0';
1678 wpa_s->p2p_in_provisioning = 1;
1679 wpa_s->global->p2p_group_formation = wpa_s;
1682 wpas_start_wps_go(wpa_s, res, 1);
1687 wpa_s->p2p_long_listen = 0;
1688 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
1690 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
1693 wpa_s, NULL);
1699 struct wpa_supplicant *wpa_s = ctx;
1700 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR
1703 wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id);
1712 struct wpa_supplicant *wpa_s = ctx;
1721 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_FOUND MACSTR
1743 struct wpa_supplicant *wpa_s = ctx;
1745 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_LOST
1748 wpas_notify_p2p_device_lost(wpa_s, dev_addr);
1754 struct wpa_supplicant *wpa_s = ctx;
1755 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_FIND_STOPPED);
1775 static void wpas_p2p_listen_work_done(struct wpa_supplicant *wpa_s)
1779 if (!wpa_s->p2p_listen_work)
1782 lwork = wpa_s->p2p_listen_work->ctx;
1784 radio_work_done(wpa_s->p2p_listen_work);
1785 wpa_s->p2p_listen_work = NULL;
1791 struct wpa_supplicant *wpa_s = work->wpa_s;
1796 wpa_s->p2p_listen_work = NULL;
1797 wpas_stop_listen(wpa_s);
1803 wpa_s->p2p_listen_work = work;
1805 wpa_drv_set_ap_wps_ie(wpa_s, NULL, lwork->probe_resp_ie, NULL);
1807 if (wpa_drv_probe_req_report(wpa_s, 1) < 0) {
1810 wpas_p2p_listen_work_done(wpa_s);
1814 wpa_s->pending_listen_freq = lwork->freq;
1815 wpa_s->pending_listen_duration = lwork->duration;
1817 if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, lwork->duration) < 0)
1822 wpas_p2p_listen_work_done(wpa_s);
1823 wpa_s->pending_listen_freq = 0;
1826 wpa_s->off_channel_freq = 0;
1827 wpa_s->roc_waiting_drv_freq = lwork->freq;
1835 struct wpa_supplicant *wpa_s = ctx;
1838 if (wpa_s->p2p_listen_work) {
1856 if (radio_add_work(wpa_s, freq, "p2p-listen", 0, wpas_start_listen_cb,
1868 struct wpa_supplicant *wpa_s = ctx;
1869 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
1870 wpa_drv_cancel_remain_on_channel(wpa_s);
1871 wpa_s->off_channel_freq = 0;
1872 wpa_s->roc_waiting_drv_freq = 0;
1874 wpa_drv_set_ap_wps_ie(wpa_s, NULL, NULL, NULL);
1875 wpa_drv_probe_req_report(wpa_s, 0);
1876 wpas_p2p_listen_work_done(wpa_s);
1882 struct wpa_supplicant *wpa_s = ctx;
1883 return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1);
2017 wpas_p2p_service_get_bonjour(struct wpa_supplicant *wpa_s,
2024 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
2036 wpas_p2p_service_get_upnp(struct wpa_supplicant *wpa_s, u8 version,
2041 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
2070 static void wpas_sd_all_bonjour(struct wpa_supplicant *wpa_s,
2078 if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
2083 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
2133 static void wpas_sd_req_bonjour(struct wpa_supplicant *wpa_s,
2143 if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
2151 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
2155 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
2204 static void wpas_sd_all_upnp(struct wpa_supplicant *wpa_s,
2212 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
2217 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
2240 static void wpas_sd_req_upnp(struct wpa_supplicant *wpa_s,
2253 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
2261 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
2280 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
2322 static void wpas_sd_req_wfd(struct wpa_supplicant *wpa_s,
2332 if (!wpa_s->global->wifi_display) {
2362 wpa_s->global->wfd_subelem[*pos] &&
2364 wpabuf_len(wpa_s->global->wfd_subelem[*pos])) {
2367 wpabuf_put_buf(resp, wpa_s->global->wfd_subelem[*pos]);
2380 struct wpa_supplicant *wpa_s = ctx;
2396 wpa_msg_ctrl(wpa_s, MSG_INFO, P2P_EVENT_SERV_DISC_REQ "%d "
2403 if (wpa_s->p2p_sd_over_ctrl_iface) {
2404 wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
2436 if (wpa_s->force_long_sd) {
2439 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
2440 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
2448 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp) &&
2449 dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
2457 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
2458 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
2461 wpas_sd_req_bonjour(wpa_s, resp, srv_trans_id,
2465 wpas_sd_req_upnp(wpa_s, resp, srv_trans_id,
2470 wpas_sd_req_wfd(wpa_s, resp, srv_trans_id,
2486 wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
2489 wpas_p2p_sd_response(wpa_s, freq, sa, dialog_token, resp);
2498 struct wpa_supplicant *wpa_s = ctx;
2510 wpa_msg_ctrl(wpa_s, MSG_INFO,
2520 wpa_msg_ctrl(wpa_s, MSG_INFO,
2556 wpas_notify_p2p_sd_response(wpa_s, sa, update_indic, tlvs, tlvs_len);
2560 u64 wpas_p2p_sd_request(struct wpa_supplicant *wpa_s, const u8 *dst,
2563 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2565 return (uintptr_t) p2p_sd_request(wpa_s->global->p2p, dst, tlvs);
2569 u64 wpas_p2p_sd_request_upnp(struct wpa_supplicant *wpa_s, const u8 *dst,
2583 ret = wpas_p2p_sd_request(wpa_s, dst, tlvs);
2591 static u64 wpas_p2p_sd_request_wfd(struct wpa_supplicant *wpa_s, const u8 *dst,
2594 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2596 return (uintptr_t) p2p_sd_request_wfd(wpa_s->global->p2p, dst, tlvs);
2635 u64 wpas_p2p_sd_request_wifi_display(struct wpa_supplicant *wpa_s,
2661 ret = wpas_p2p_sd_request_wfd(wpa_s, dst, tlvs);
2669 int wpas_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s, u64 req)
2671 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2673 return p2p_sd_cancel_request(wpa_s->global->p2p,
2678 void wpas_p2p_sd_response(struct wpa_supplicant *wpa_s, int freq,
2682 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2684 p2p_sd_response(wpa_s->global->p2p, freq, dst, dialog_token,
2689 void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s)
2691 if (wpa_s->global->p2p)
2692 p2p_sd_service_update(wpa_s->global->p2p);
2713 void wpas_p2p_service_flush(struct wpa_supplicant *wpa_s)
2718 dl_list_for_each_safe(bsrv, bn, &wpa_s->global->p2p_srv_bonjour,
2722 dl_list_for_each_safe(usrv, un, &wpa_s->global->p2p_srv_upnp,
2726 wpas_p2p_sd_service_update(wpa_s);
2730 int wpas_p2p_service_add_bonjour(struct wpa_supplicant *wpa_s,
2740 dl_list_add(&wpa_s->global->p2p_srv_bonjour, &bsrv->list);
2742 wpas_p2p_sd_service_update(wpa_s);
2747 int wpas_p2p_service_del_bonjour(struct wpa_supplicant *wpa_s,
2752 bsrv = wpas_p2p_service_get_bonjour(wpa_s, query);
2756 wpas_p2p_sd_service_update(wpa_s);
2761 int wpas_p2p_service_add_upnp(struct wpa_supplicant *wpa_s, u8 version,
2766 if (wpas_p2p_service_get_upnp(wpa_s, version, service))
2777 dl_list_add(&wpa_s->global->p2p_srv_upnp, &usrv->list);
2779 wpas_p2p_sd_service_update(wpa_s);
2784 int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version,
2789 usrv = wpas_p2p_service_get_upnp(wpa_s, version, service);
2793 wpas_p2p_sd_service_update(wpa_s);
2798 static void wpas_prov_disc_local_display(struct wpa_supplicant *wpa_s,
2802 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_SHOW_PIN MACSTR
2807 static void wpas_prov_disc_local_keypad(struct wpa_supplicant *wpa_s,
2810 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_ENTER_PIN MACSTR
2821 struct wpa_supplicant *wpa_s = ctx;
2829 for (group = wpa_s->global->ifaces; group; group = group->next)
2858 wpas_prov_disc_local_display(wpa_s, peer, params,
2861 wpas_prov_disc_local_keypad(wpa_s, peer, params);
2863 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_REQ
2866 wpas_notify_p2p_provision_discovery(wpa_s, peer, 1 /* request */,
2874 struct wpa_supplicant *wpa_s = ctx;
2878 if (wpa_s->pending_pd_before_join &&
2879 (os_memcmp(peer, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
2880 os_memcmp(peer, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0)) {
2881 wpa_s->pending_pd_before_join = 0;
2884 wpas_p2p_join_start(wpa_s, 0, NULL, 0);
2888 if (wpa_s->pending_pd_use == AUTO_PD_JOIN ||
2889 wpa_s->pending_pd_use == AUTO_PD_GO_NEG)
2891 wpa_s->pending_pd_use == AUTO_PD_JOIN);
2896 wpas_prov_disc_local_keypad(wpa_s, peer, params);
2899 wpas_prov_disc_local_display(wpa_s, peer, params,
2902 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_RESP
2905 wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
2914 struct wpa_supplicant *wpa_s = ctx;
2916 if (wpa_s->p2p_fallback_to_go_neg) {
2917 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: PD for p2p_connect-auto "
2919 wpas_p2p_fallback_to_go_neg(wpa_s, 0);
2924 wpa_s->pending_pd_before_join = 0;
2928 wpas_p2p_join_start(wpa_s, 0, NULL, 0);
2932 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
2936 wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
2953 static int wpas_p2p_pick_best_used_freq(struct wpa_supplicant *wpa_s,
2961 if (p2p_supported_freq(wpa_s->global->p2p, freqs[c].freq))
2969 if (!p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq))
2996 struct wpa_supplicant *wpa_s = ctx;
3006 if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
3007 (os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN)
3009 os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0)) {
3016 if (dev_pw_id >= 0 && wpa_s->parent->p2p_nfc_tag_enabled &&
3017 dev_pw_id == wpa_s->parent->p2p_oob_dev_pw_id) {
3019 wpa_s->parent->p2p_wps_method = WPS_NFC;
3020 wpa_s->parent->pending_join_wps_method = WPS_NFC;
3021 os_memcpy(wpa_s->parent->pending_join_dev_addr,
3023 os_memcpy(wpa_s->parent->pending_join_iface_addr,
3036 grp = wpas_get_p2p_group(wpa_s, ssid, ssid_len, go);
3045 if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
3046 os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0) {
3049 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
3050 } else if (!wpa_s->conf->persistent_reconnect)
3053 for (s = wpa_s->conf->ssid; s; s = s->next) {
3068 if (s->mode == WPAS_MODE_P2P_GO && !wpas_p2p_create_iface(wpa_s)) {
3070 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) {
3076 os_memcpy(group_bssid, wpa_s->own_addr, ETH_ALEN);
3079 if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO) < 0)
3085 os_memcpy(group_bssid, wpa_s->pending_interface_addr,
3090 wpas_p2p_set_own_freq_preference(wpa_s, 0);
3093 freqs = os_calloc(wpa_s->num_multichan_concurrent,
3096 int num_channels = wpa_s->num_multichan_concurrent;
3097 int num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, num_channels);
3098 best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
3105 wpas_p2p_set_own_freq_preference(wpa_s, best_freq);
3107 if (wpa_s->num_multichan_concurrent < 2 ||
3108 wpas_p2p_num_unused_channels(wpa_s) < 1) {
3114 if (*force_freq > 0 && wpa_s->num_multichan_concurrent > 1 &&
3115 wpas_p2p_num_unused_channels(wpa_s) > 0) {
3142 struct wpa_supplicant *wpa_s = ctx;
3145 for (s = wpa_s->conf->ssid; s; s = s->next) {
3159 wpa_s, s, go, 0, op_freq, 0, 0, NULL,
3162 wpa_s->user_initiated_pd = 0;
3163 wpas_p2p_join(wpa_s, bssid, go_dev_addr,
3164 wpa_s->p2p_wps_method, 0, op_freq,
3178 wpa_msg_global(wpa_s, MSG_INFO,
3185 wpa_msg_global(wpa_s, MSG_INFO,
3195 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
3199 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
3206 static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
3225 wpas_notify_network_removed(wpa_s, ssid);
3226 wpa_config_remove_network(wpa_s->conf, ssid->id);
3240 if (wpa_s->parent->conf->update_config &&
3241 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
3246 static void wpas_remove_persistent_client(struct wpa_supplicant *wpa_s,
3251 wpa_s = wpa_s->global->p2p_invite_group;
3252 if (wpa_s == NULL)
3254 ssid = wpa_s->current_ssid;
3258 ssid = wpas_p2p_get_persistent(wpa_s->parent, peer,
3260 wpas_remove_persistent_peer(wpa_s, ssid, peer, 1);
3269 struct wpa_supplicant *wpa_s = ctx;
3274 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
3278 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
3281 wpas_notify_p2p_invitation_result(wpa_s, status, bssid);
3285 if (wpa_s->pending_invite_ssid_id == -1) {
3287 wpas_remove_persistent_client(wpa_s, peer);
3300 wpa_s->conf, wpa_s->pending_invite_ssid_id);
3301 wpas_remove_persistent_peer(wpa_s, ssid, peer, 1);
3303 wpas_p2p_remove_pending_group_interface(wpa_s);
3307 ssid = wpa_config_get_network(wpa_s->conf,
3308 wpa_s->pending_invite_ssid_id);
3323 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before "
3338 wpas_p2p_group_add_persistent(wpa_s, ssid,
3340 wpa_s->p2p_persistent_go_freq,
3342 wpa_s->p2p_go_ht40, wpa_s->p2p_go_vht,
3366 static int wpas_p2p_default_channels(struct wpa_supplicant *wpa_s,
3381 if (!wpas_p2p_disallowed_freq(wpa_s->global, 2412 + i * 5))
3393 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 36 * 5))
3395 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 40 * 5))
3397 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 44 * 5))
3399 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 48 * 5))
3410 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 149 * 5))
3412 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 153 * 5))
3414 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 156 * 5))
3416 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 161 * 5))
3512 static int wpas_p2p_get_center_80mhz(struct wpa_supplicant *wpa_s,
3535 static enum chan_allowed wpas_p2p_verify_80mhz(struct wpa_supplicant *wpa_s,
3543 center_chan = wpas_p2p_get_center_80mhz(wpa_s, mode, channel);
3553 res = has_channel(wpa_s->global, mode, adj_chan, &flags);
3573 static enum chan_allowed wpas_p2p_verify_channel(struct wpa_supplicant *wpa_s,
3580 res2 = res = has_channel(wpa_s->global, mode, channel, &flag);
3584 res2 = has_channel(wpa_s->global, mode, channel - 4, NULL);
3588 res2 = has_channel(wpa_s->global, mode, channel + 4, NULL);
3590 res2 = wpas_p2p_verify_80mhz(wpa_s, mode, channel, bw);
3601 static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s,
3608 if (wpa_s->hw.modes == NULL) {
3612 return wpas_p2p_default_channels(wpa_s, chan, cli_chan);
3622 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode);
3627 res = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
3639 wpa_s->conf->p2p_add_cli_chan) {
3668 int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
3682 ret = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
3691 int wpas_p2p_get_vht80_center(struct wpa_supplicant *wpa_s,
3694 if (!wpas_p2p_verify_channel(wpa_s, mode, channel, BW80))
3697 return wpas_p2p_get_center_80mhz(wpa_s, mode, channel);
3704 struct wpa_supplicant *wpa_s = ctx;
3706 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3707 if (os_memcmp(wpa_s->own_addr, interface_addr, ETH_ALEN) == 0)
3710 if (wpa_s == NULL)
3713 return wpa_drv_get_noa(wpa_s, buf, buf_len);
3717 struct wpa_supplicant * wpas_get_p2p_go_iface(struct wpa_supplicant *wpa_s,
3720 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3721 struct wpa_ssid *s = wpa_s->current_ssid;
3731 return wpa_s;
3739 struct wpa_supplicant * wpas_get_p2p_client_iface(struct wpa_supplicant *wpa_s,
3742 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3743 struct wpa_ssid *ssid = wpa_s->current_ssid;
3748 if (wpa_s->wpa_state != WPA_COMPLETED &&
3749 wpa_s->wpa_state != WPA_GROUP_HANDSHAKE)
3751 if (os_memcmp(wpa_s->go_dev_addr, peer_dev_addr, ETH_ALEN) == 0)
3752 return wpa_s;
3761 struct wpa_supplicant *wpa_s = ctx;
3763 return wpas_get_p2p_client_iface(wpa_s, dev_addr) != NULL;
3769 struct wpa_supplicant *wpa_s = ctx;
3772 for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
3773 if (ifs == wpa_s)
3784 struct wpa_supplicant *wpa_s = ctx;
3785 wpa_msg_global(wpa_s, level, "P2P: %s", msg);
3789 int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
3799 wpa_s->ifname);
3801 wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
3802 ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL,
3803 force_name, wpa_s->pending_interface_addr, NULL);
3808 os_strlcpy(wpa_s->pending_interface_name, ifname,
3809 sizeof(wpa_s->pending_interface_name));
3813 iface.ifname = wpa_s->pending_interface_name;
3814 iface.driver = wpa_s->driver->name;
3815 iface.driver_param = wpa_s->conf->driver_param;
3825 iface.confname = wpa_s->confname;
3826 iface.ctrl_interface = wpa_s->conf->ctrl_interface;
3830 p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
3835 p2pdev_wpa_s->parent = wpa_s;
3837 wpa_s->pending_interface_name[0] = '\0';
3845 struct wpa_supplicant *wpa_s, *intf = ctx;
3848 for (wpa_s = intf->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3849 if (wpa_s->waiting_presence_resp)
3852 if (!wpa_s) {
3853 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No group interface was waiting for presence response");
3856 wpa_s->waiting_presence_resp = 0;
3859 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PRESENCE_RESPONSE "src=" MACSTR
3866 struct wpa_supplicant *wpa_s = ctx;
3867 return wpas_p2p_in_progress(wpa_s);
3874 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
3877 int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
3882 if (wpa_s->conf->p2p_disabled)
3885 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
3892 p2p.cb_ctx = wpa_s;
3919 os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
3920 os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
3921 p2p.dev_name = wpa_s->conf->device_name;
3922 p2p.manufacturer = wpa_s->conf->manufacturer;
3923 p2p.model_name = wpa_s->conf->model_name;
3924 p2p.model_number = wpa_s->conf->model_number;
3925 p2p.serial_number = wpa_s->conf->serial_number;
3926 if (wpa_s->wps) {
3927 os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);
3928 p2p.config_methods = wpa_s->wps->config_methods;
3931 if (wpas_p2p_setup_channels(wpa_s, &p2p.channels, &p2p.cli_channels)) {
3937 if (wpa_s->conf->p2p_listen_reg_class &&
3938 wpa_s->conf->p2p_listen_channel) {
3939 p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;
3940 p2p.channel = wpa_s->conf->p2p_listen_channel;
3958 if (wpa_s->conf->p2p_oper_reg_class &&
3959 wpa_s->conf->p2p_oper_channel) {
3960 p2p.op_reg_class = wpa_s->conf->p2p_oper_reg_class;
3961 p2p.op_channel = wpa_s->conf->p2p_oper_channel;
3983 if (wpa_s->conf->p2p_pref_chan && wpa_s->conf->num_p2p_pref_chan) {
3984 p2p.pref_chan = wpa_s->conf->p2p_pref_chan;
3985 p2p.num_pref_chan = wpa_s->conf->num_p2p_pref_chan;
3988 if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
3989 os_memcpy(p2p.country, wpa_s->conf->country, 2);
3994 os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,
3997 p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
3998 os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,
4001 p2p.concurrent_operations = !!(wpa_s->drv_flags &
4006 if (wpa_s->conf->p2p_ssid_postfix) {
4008 os_strlen(wpa_s->conf->p2p_ssid_postfix);
4011 os_memcpy(p2p.ssid_postfix, wpa_s->conf->p2p_ssid_postfix,
4015 p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;
4017 p2p.max_listen = wpa_s->max_remain_on_chan;
4019 if (wpa_s->conf->p2p_passphrase_len >= 8 &&
4020 wpa_s->conf->p2p_passphrase_len <= 63)
4021 p2p.passphrase_len = wpa_s->conf->p2p_passphrase_len;
4028 global->p2p_init_wpa_s = wpa_s;
4031 if (wpa_s->conf->wps_vendor_ext[i] == NULL)
4034 global->p2p, wpa_s->conf->wps_vendor_ext[i]);
4037 p2p_set_no_go_freq(global->p2p, &wpa_s->conf->p2p_no_go_freq);
4045 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4049 void wpas_p2p_deinit(struct wpa_supplicant *wpa_s)
4051 if (wpa_s->driver && wpa_s->drv_priv)
4052 wpa_drv_probe_req_report(wpa_s, 0);
4054 if (wpa_s->go_params) {
4057 wpa_s->global->p2p,
4058 wpa_s->go_params->peer_device_addr);
4061 os_free(wpa_s->go_params);
4062 wpa_s->go_params = NULL;
4063 eloop_cancel_timeout(wpas_p2p_psk_failure_removal, wpa_s, NULL);
4064 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
4065 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4066 wpa_s->p2p_long_listen = 0;
4067 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
4068 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
4069 wpas_p2p_remove_pending_group_interface(wpa_s);
4070 eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL);
4071 wpas_p2p_listen_work_done(wpa_s);
4072 if (wpa_s->p2p_send_action_work) {
4073 os_free(wpa_s->p2p_send_action_work->ctx);
4074 radio_work_done(wpa_s->p2p_send_action_work);
4075 wpa_s
4077 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, wpa_s, NULL);
4079 wpabuf_free(wpa_s->p2p_oob_dev_pw);
4080 wpa_s->p2p_oob_dev_pw = NULL;
4082 /* TODO: remove group interface from the driver if this wpa_s instance
4095 struct wpa_supplicant *wpa_s, *tmp;
4097 wpa_s = global->ifaces;
4102 while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
4103 wpa_s = wpa_s->next;
4104 while (wpa_s) {
4107 (tmp == wpa_s ||
4121 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4122 if (wpa_s->ap_iface)
4123 wpas_p2p_group_deinit(wpa_s);
4132 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s)
4134 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) &&
4135 wpa_s->conf->p2p_no_group_iface)
4137 if (wpa_s->drv_flags &
4142 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CONCURRENT))
4144 if (wpa_s->global->ifaces->next)
4146 if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
4152 static int wpas_p2p_start_go_neg(struct wpa_supplicant *wpa_s,
4159 if (persistent_group && wpa_s->conf->persistent_reconnect)
4166 p2p_set_config_timeout(wpa_s->global->p2p,
4167 wpa_s->p2p_go_ht40 ? 255 : 100, 20);
4169 return p2p_connect(wpa_s->global->p2p, peer_addr, wps_method,
4173 wpa_s->p2p_pd_before_go_neg, pref_freq,
4174 wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id :
4179 static int wpas_p2p_auth_go_neg(struct wpa_supplicant *wpa_s,
4186 if (persistent_group && wpa_s->conf->persistent_reconnect)
4189 return p2p_authorize(wpa_s->global->p2p, peer_addr, wps_method,
4193 wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id :
4198 static void wpas_p2p_check_join_scan_limit(struct wpa_supplicant *wpa_s)
4200 wpa_s->p2p_join_scan_count++;
4202 wpa_s->p2p_join_scan_count);
4203 if (wpa_s->p2p_join_scan_count > P2P_MAX_JOIN_SCAN_ATTEMPTS) {
4206 MAC2STR(wpa_s->pending_join_iface_addr));
4207 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4208 if (wpa_s->p2p_auto_pd) {
4209 wpa_s->p2p_auto_pd = 0;
4210 wpa_msg_global(wpa_s, MSG_INFO,
4213 MAC2STR(wpa_s->pending_join_dev_addr));
4216 wpa_msg_global(wpa_s->parent, MSG_INFO,
4222 static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq)
4228 if (wpas_p2p_num_unused_channels(wpa_s) > 0) {
4233 freqs = os_calloc(wpa_s->num_multichan_concurrent,
4238 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs,
4239 wpa_s->num_multichan_concurrent);
4259 static int wpas_p2p_peer_go(struct wpa_supplicant *wpa_s,
4265 bss = wpa_bss_get_p2p_dev_addr(wpa_s, peer_dev_addr);
4268 if (bss->last_update_idx < wpa_s->bss_update_idx) {
4274 updated = os_reltime_before(&wpa_s->p2p_auto_started,
4285 static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
4292 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4294 if (wpa_s->global->p2p_disabled)
4299 wpa_s->p2p_auto_join ? "auto_" : "");
4302 wpas_p2p_scan_res_handler(wpa_s, scan_res);
4304 if (wpa_s->p2p_auto_pd) {
4305 int join = wpas_p2p_peer_go(wpa_s,
4306 wpa_s->pending_join_dev_addr);
4308 wpa_s->auto_pd_scan_retry < P2P_AUTO_PD_SCAN_ATTEMPTS) {
4309 wpa_s->auto_pd_scan_retry++;
4311 wpa_s, wpa_s->pending_join_dev_addr);
4316 wpa_s->auto_pd_scan_retry,
4317 MAC2STR(wpa_s->
4320 wpas_p2p_join_scan_req(wpa_s, freq, NULL, 0);
4328 wpa_s->p2p_auto_pd = 0;
4329 wpa_s->pending_pd_use = join ? AUTO_PD_JOIN : AUTO_PD_GO_NEG;
4331 MAC2STR(wpa_s->pending_join_dev_addr), join);
4332 if (p2p_prov_disc_req(wpa_s->global->p2p,
4333 wpa_s->pending_join_dev_addr,
4334 wpa_s->pending_pd_config_methods, join,
4335 0, wpa_s->user_initiated_pd) < 0) {
4336 wpa_s->p2p_auto_pd = 0;
4337 wpa_msg_global(wpa_s, MSG_INFO,
4340 MAC2STR(wpa_s->pending_join_dev_addr));
4345 if (wpa_s->p2p_auto_join) {
4346 int join = wpas_p2p_peer_go(wpa_s,
4347 wpa_s->pending_join_dev_addr);
4351 wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr,
4352 wpa_s->p2p_pin, wpa_s->p2p_wps_method,
4353 wpa_s->p2p_persistent_group, 0, 0, 0,
4354 wpa_s->p2p_go_intent,
4355 wpa_s->p2p_connect_freq,
4356 wpa_s->p2p_persistent_id,
4357 wpa_s->p2p_pd_before_go_neg,
4358 wpa_s->p2p_go_ht40,
4359 wpa_s->p2p_go_vht);
4367 wpa_s->p2p_fallback_to_go_neg = 1;
4370 freq = p2p_get_oper_freq(wpa_s->global->p2p,
4371 wpa_s->pending_join_iface_addr);
4373 p2p_get_interface_addr(wpa_s->global->p2p,
4374 wpa_s->pending_join_dev_addr,
4376 os_memcmp(iface_addr, wpa_s->pending_join_dev_addr, ETH_ALEN) != 0
4377 && !wpa_bss_get_bssid(wpa_s, wpa_s->pending_join_iface_addr)) {
4381 MAC2STR(wpa_s->pending_join_iface_addr),
4383 os_memcpy(wpa_s->pending_join_iface_addr, iface_addr,
4386 freq = p2p_get_oper_freq(wpa_s->global->p2p,
4387 wpa_s->pending_join_iface_addr);
4393 if (wpa_s->p2p_join_ssid_len) {
4396 MAC2STR(wpa_s->pending_join_iface_addr),
4397 wpa_ssid_txt(wpa_s->p2p_join_ssid,
4398 wpa_s->p2p_join_ssid_len));
4399 bss = wpa_bss_get(wpa_s, wpa_s->pending_join_iface_addr,
4400 wpa_s->p2p_join_ssid,
4401 wpa_s->p2p_join_ssid_len);
4405 MACSTR, MAC2STR(wpa_s->pending_join_iface_addr));
4406 bss = wpa_bss_get_bssid_latest(wpa_s,
4407 wpa_s->pending_join_iface_addr);
4418 if (wpas_check_freq_conflict(wpa_s, freq) > 0) {
4419 wpa_msg_global(wpa_s->parent, MSG_INFO,
4428 MAC2STR(wpa_s->pending_join_dev_addr), freq);
4429 wpa_s->pending_pd_before_join = 1;
4431 switch (wpa_s->pending_join_wps_method) {
4446 if ((p2p_get_provisioning_info(wpa_s->global->p2p,
4447 wpa_s->pending_join_dev_addr) ==
4456 MAC2STR(wpa_s->pending_join_dev_addr));
4457 wpa_s->pending_pd_before_join = 0;
4461 if (p2p_prov_disc_req(wpa_s->global->p2p,
4462 wpa_s->pending_join_dev_addr, method, 1,
4463 freq, wpa_s->user_initiated_pd) < 0) {
4467 wpa_s->pending_pd_before_join = 0;
4474 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4475 eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
4476 wpas_p2p_check_join_scan_limit(wpa_s);
4481 wpas_p2p_join_start(wpa_s, 0, NULL, 0);
4485 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq,
4501 os_memcpy(wpa_s->p2p_join_ssid, ssid, ssid_len);
4502 wpa_s->p2p_join_ssid_len = ssid_len;
4506 wpa_s->p2p_join_ssid_len = 0;
4509 wpa_s->wps->dev.p2p = 1;
4510 wps_ie = wps_build_probe_req_ie(DEV_PW_DEFAULT, &wpa_s->wps->dev,
4511 wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 0,
4514 wpas_p2p_scan_res_join(wpa_s, NULL);
4518 ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
4522 wpas_p2p_scan_res_join(wpa_s, NULL);
4528 p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
4540 oper_freq = p2p_get_oper_freq(wpa_s->global->p2p,
4541 wpa_s->pending_join_iface_addr);
4554 ret = wpa_drv_scan(wpa_s, &params);
4556 os_get_reltime(&wpa_s->scan_trigger_time);
4557 wpa_s->scan_res_handler = wpas_p2p_scan_res_join;
4558 wpa_s->own_scan_requested = 1;
4566 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4567 eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
4568 wpas_p2p_check_join_scan_limit(wpa_s);
4575 struct wpa_supplicant *wpa_s = eloop_ctx;
4576 wpas_p2p_join_scan_req(wpa_s, 0, NULL, 0);
4580 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
4594 wpa_s->p2p_auto_pd = 0;
4595 wpa_s->p2p_auto_join = !!auto_join;
4596 os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, ETH_ALEN);
4597 os_memcpy(wpa_s->pending_join_dev_addr, dev_addr, ETH_ALEN);
4598 wpa_s->pending_join_wps_method = wps_method;
4601 wpas_p2p_stop_find(wpa_s);
4603 wpa_s->p2p_join_scan_count = 0;
4604 wpas_p2p_join_scan_req(wpa_s, op_freq, ssid, ssid_len);
4609 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq,
4616 group = wpas_p2p_get_group_iface(wpa_s, 0, 0);
4619 if (group != wpa_s) {
4620 os_memcpy(group->p2p_pin, wpa_s->p2p_pin,
4622 group->p2p_wps_method = wpa_s->p2p_wps_method;
4631 wpa_s->global->p2p_group_formation = wpa_s;
4635 group->p2p_fallback_to_go_neg = wpa_s
4638 os_memcpy(res.peer_device_addr, wpa_s->pending_join_dev_addr, ETH_ALEN);
4639 os_memcpy(res.peer_interface_addr, wpa_s->pending_join_iface_addr,
4641 res.wps_method = wpa_s->pending_join_wps_method;
4647 bss = wpa_bss_get_bssid_latest(wpa_s,
4648 wpa_s->pending_join_iface_addr);
4659 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
4662 wpa_drv_cancel_remain_on_channel(wpa_s);
4663 wpa_s->off_channel_freq = 0;
4664 wpa_s->roc_waiting_drv_freq = 0;
4673 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
4675 wpa_s, NULL);
4681 static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq,
4688 freqs = os_calloc(wpa_s->num_multichan_concurrent,
4693 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs,
4694 wpa_s->num_multichan_concurrent);
4701 num_unused = wpas_p2p_num_unused_channels(wpa_s);
4705 freq, wpa_s->num_multichan_concurrent, num, num_unused);
4710 ret = p2p_supported_freq(wpa_s->global->p2p, freq);
4712 ret = p2p_supported_freq_cli(wpa_s->global->p2p, freq);
4738 best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
4772 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4793 int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
4805 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4809 ssid = wpa_config_get_network(wpa_s->conf, persistent_id);
4815 os_free(wpa_s->global->add_psk);
4816 wpa_s->global->add_psk = NULL;
4818 wpa_s->global->p2p_fail_on_wps_complete = 0;
4821 go_intent = wpa_s->conf->p2p_go_intent;
4824 wpa_s->p2p_long_listen = 0;
4826 wpa_s->p2p_wps_method = wps_method;
4827 wpa_s->p2p_persistent_group = !!persistent_group;
4828 wpa_s->p2p_persistent_id = persistent_id;
4829 wpa_s->p2p_go_intent = go_intent;
4830 wpa_s->p2p_connect_freq = freq;
4831 wpa_s->p2p_fallback_to_go_neg = 0;
4832 wpa_s->p2p_pd_before_go_neg = !!pd;
4833 wpa_s->p2p_go_ht40 = !!ht40;
4834 wpa_s->p2p_go_vht = !!vht;
4837 os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
4840 os_snprintf(wpa_s->p2p_pin, sizeof(wpa_s->p2p_pin), "%08d",
4843 wpa_s->p2p_pin);
4845 wpa_s->p2p_pin[0] = '\0';
4853 os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
4857 if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr,
4860 p2p_get_dev_addr(wpa_s->global->p2p, peer_addr,
4864 os_get_reltime(&wpa_s->p2p_auto_started);
4867 wpa_s->p2p_auto_started.sec,
4868 wpa_s->p2p_auto_started.usec);
4870 wpa_s->user_initiated_pd = 1;
4871 if (wpas_p2p_join(wpa_s, iface_addr, dev_addr, wps_method,
4877 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
4881 wpas_p2p_set_own_freq_preference(wpa_s,
4884 wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
4886 if (wpa_s->create_p2p_iface) {
4891 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
4897 if_addr = wpa_s->pending_interface_addr;
4899 if_addr = wpa_s->own_addr;
4902 if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method,
4910 if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method,
4913 if (wpa_s->create_p2p_iface)
4914 wpas_p2p_remove_pending_group_interface(wpa_s);
4923 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4930 void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
4933 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4935 if (wpa_s->off_channel_freq == wpa_s->pending_listen_freq) {
4936 p2p_listen_cb(wpa_s->global->p2p, wpa_s->pending_listen_freq,
4937 wpa_s->pending_listen_duration);
4938 wpa_s->pending_listen_freq = 0;
4941 wpa_s->off_channel_freq, wpa_s->pending_listen_freq,
4947 int wpas_p2p_listen_start(struct wpa_supplicant *wpa_s, unsigned int timeout)
4950 if (timeout > wpa_s->max_remain_on_chan)
4951 timeout = wpa_s->max_remain_on_chan;
4953 return p2p_listen(wpa_s->global->p2p, timeout);
4959 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4966 void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
4971 wpa_s->p2p_long_listen, offchannel_pending_action_tx(wpa_s));
4972 wpas_p2p_listen_work_done(wpa_s);
4973 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4975 if (wpa_s->p2p_long_listen > 0)
4976 wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
4977 if (p2p_listen_end(wpa_s->global->p2p, freq) > 0)
4979 if (offchannel_pending_action_tx(wpa_s))
4981 if (wpa_s->p2p_long_listen > 0) {
4983 wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
4989 p2p_stop_listen(wpa_s->global->p2p);
4996 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
5007 int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
5009 struct wpa_global *global = wpa_s->global;
5013 wpa_s = global->ifaces;
5014 while (wpa_s) {
5015 prev = wpa_s;
5016 wpa_s = wpa_s->next;
5026 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
5027 if (os_strcmp(wpa_s->ifname, ifname) == 0)
5031 return wpas_p2p_disconnect(wpa_s);
5035 static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq)
5042 if (wpa_s->best_24_freq > 0 &&
5043 p2p_supported_freq_go(wpa_s->global->p2p,
5044 wpa_s->best_24_freq)) {
5045 freq = wpa_s->best_24_freq;
5060 if (wpa_s->best_5_freq > 0 &&
5061 p2p_supported_freq_go(wpa_s->global->p2p,
5062 wpa_s->best_5_freq)) {
5063 freq = wpa_s->best_5_freq;
5070 if (!p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
5080 if (freq > 0 && !p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
5091 static int wpas_p2p_select_freq_no_pref(struct wpa_supplicant *wpa_s,
5103 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
5105 p2p_supported_freq(wpa_s->global->p2p, params->freq))
5112 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
5114 p2p_supported_freq(wpa_s->global->p2p, params->freq))
5120 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
5122 p2p_supported_freq(wpa_s->global->p2p, params->freq))
5128 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
5130 p2p_supported_freq(wpa_s->global->p2p, params->freq))
5143 static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
5165 } else if (wpa_s->conf->p2p_oper_reg_class == 81 &&
5166 wpa_s->conf->p2p_oper_channel >= 1 &&
5167 wpa_s->conf->p2p_oper_channel <= 11 &&
5169 2407 + 5 * wpa_s->conf->p2p_oper_channel)) {
5170 params->freq = 2407 + 5 * wpa_s->conf->p2p_oper_channel;
5173 } else if ((wpa_s->conf->p2p_oper_reg_class == 115 ||
5174 wpa_s->conf->p2p_oper_reg_class == 116 ||
5175 wpa_s->conf->p2p_oper_reg_class == 117 ||
5176 wpa_s->conf->p2p_oper_reg_class == 124 ||
5177 wpa_s->conf->p2p_oper_reg_class == 126 ||
5178 wpa_s->conf->p2p_oper_reg_class == 127) &&
5180 5000 + 5 * wpa_s->conf->p2p_oper_channel)) {
5181 params->freq = 5000 + 5 * wpa_s->conf->p2p_oper_channel;
5184 } else if (wpa_s->conf->p2p_oper_channel == 0 &&
5185 wpa_s->best_overall_freq > 0 &&
5186 p2p_supported_freq_go(wpa_s->global->p2p,
5187 wpa_s->best_overall_freq) &&
5188 freq_included(channels, wpa_s->best_overall_freq)) {
5189 params->freq = wpa_s->best_overall_freq;
5192 } else if (wpa_s->conf->p2p_oper_channel == 0 &&
5193 wpa_s->best_24_freq > 0 &&
5194 p2p_supported_freq_go(wpa_s->global->p2p,
5195 wpa_s->best_24_freq) &&
5196 freq_included(channels, wpa_s->best_24_freq)) {
5197 params->freq = wpa_s->best_24_freq;
5200 } else if (wpa_s->conf->p2p_oper_channel == 0 &&
5201 wpa_s->best_5_freq > 0 &&
5202 p2p_supported_freq_go(wpa_s->global->p2p,
5203 wpa_s->best_5_freq) &&
5204 freq_included(channels, wpa_s->best_5_freq)) {
5205 params->freq = wpa_s->best_5_freq;
5208 } else if ((pref_freq = p2p_get_pref_freq(wpa_s->global->p2p,
5215 if (wpas_p2p_select_freq_no_pref(wpa_s, params, channels) < 0)
5219 freqs = os_calloc(wpa_s->num_multichan_concurrent,
5224 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs,
5225 wpa_s->num_multichan_concurrent);
5227 cand_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
5244 if (wpas_p2p_num_unused_channels(wpa_s) <= 0) {
5259 if (wpas_p2p_num_unused_channels(wpa_s) <= 0) {
5276 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
5281 if (!wpas_p2p_create_iface(wpa_s)) {
5282 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use same interface for group "
5284 wpa_s->p2p_first_connection_timeout = 0;
5285 return wpa_s;
5288 if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
5290 wpa_msg_global(wpa_s, MSG_ERROR,
5294 group_wpa_s = wpas_p2p_init_group_interface(wpa_s, go);
5296 wpa_msg_global(wpa_s, MSG_ERROR,
5298 wpas_p2p_remove_pending_group_interface(wpa_s);
5302 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use separate group interface %s",
5311 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
5321 int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
5326 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5329 os_free(wpa_s->global->add_psk);
5330 wpa_s->global->add_psk = NULL;
5334 wpas_p2p_stop_find_oper(wpa_s);
5336 freq = wpas_p2p_select_go_freq(wpa_s, freq);
5340 if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, vht, NULL))
5343 !p2p_supported_freq_go(wpa_s->global->p2p, params.freq)) {
5349 p2p_go_params(wpa_s->global->p2p, &params);
5352 wpa_s = wpas_p2p_get_group_iface(wpa_s, 0, 1);
5353 if (wpa_s == NULL)
5355 wpas_start_wps_go(wpa_s, &params, 0);
5361 static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
5367 wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0);
5368 if (wpa_s == NULL)
5370 wpa_s->p2p_last_4way_hs_fail = NULL;
5372 wpa_supplicant_ap_deinit(wpa_s);
5374 ssid = wpa_config_add_network(wpa_s->conf);
5385 wpa_config_remove_network(wpa_s->conf, ssid->id);
5399 wpa_s->show_group_started = 1;
5400 wpa_s->p2p_in_invitation = 1;
5401 wpa_s->p2p_invite_go_freq = freq;
5403 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent,
5407 wpa_s->parent, NULL);
5408 wpa_supplicant_select_network(wpa_s, ssid);
5414 int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
5426 if (wpas_get_p2p_group(wpa_s, ssid->ssid, ssid->ssid_len, &go) &&
5433 os_free(wpa_s->global->add_psk);
5434 wpa_s->global->add_psk = NULL;
5437 wpas_p2p_stop_find_oper(wpa_s);
5439 wpa_s->p2p_fallback_to_go_neg = 0;
5442 freq = wpas_p2p_select_go_freq(wpa_s, force_freq);
5446 freq = wpas_p2p_select_go_freq(wpa_s, neg_freq);
5452 return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq);
5457 if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, vht, channels))
5477 wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1);
5478 if (wpa_s == NULL)
5481 wpa_s->p2p_first_connection_timeout = connection_timeout;
5482 wpas_start_wps_go(wpa_s, &params, 0);
5491 struct wpa_supplicant *wpa_s = ctx;
5492 if (wpa_s->ap_iface) {
5493 struct hostapd_data *hapd = wpa_s->ap_iface->bss[0];
5509 wpa_supplicant_ap_update_beacon(wpa_s);
5515 struct wpa_supplicant *wpa_s = ctx;
5516 if (!wpa_s->ap_iface)
5520 if (wpa_s->global->p2p_fail_on_wps_complete &&
5521 wpa_s->p2p_in_provisioning) {
5522 wpas_p2p_grpform_fail_after_wps(wpa_s);
5525 wpas_p2p_set_group_idle_timeout(wpa_s);
5527 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
5531 struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
5537 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5544 if (ssid->p2p_persistent_group && wpa_s->conf->persistent_reconnect)
5548 os_memcpy(cfg->interface_addr, wpa_s->own_addr, ETH_ALEN);
5549 if (wpa_s->max_stations &&
5550 wpa_s->max_stations < wpa_s->conf->max_num_sta)
5551 cfg->max_clients = wpa_s->max_stations;
5553 cfg->max_clients = wpa_s->conf->max_num_sta;
5557 cfg->cb_ctx = wpa_s;
5561 group = p2p_group_init(wpa_s->global->p2p, cfg);
5566 wpa_s->p2p_group = group;
5571 void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
5574 struct wpa_ssid *ssid = wpa_s->current_ssid;
5576 if (!wpa_s->p2p_in_provisioning) {
5584 os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN);
5585 wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
5588 p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr);
5591 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent,
5593 wpa_s->p2p_go_group_formation_completed = 1;
5601 wpa_dbg(wpa_s, MSG_DEBUG,
5606 wpa_s->parent, NULL);
5613 wpa_dbg(wpa_s, MSG_DEBUG,
5618 wpa_s->parent, NULL);
5622 wpa_s->p2p_go_group_formation_completed = 0;
5624 if (wpa_s->global->p2p)
5625 p2p_wps_success_cb(wpa_s->global->p2p, peer_addr);
5626 wpas_group_formation_completed(wpa_s, 1);
5630 void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s,
5633 if (!wpa_s->p2p_in_provisioning) {
5639 if (wpa_s->go_params) {
5641 wpa_s->global->p2p,
5642 wpa_s->go_params->peer_device_addr);
5645 wpas_notify_p2p_wps_failed(wpa_s, fail);
5647 if (wpa_s == wpa_s->global->p2p_group_formation) {
5654 wpa_s->global->p2p_fail_on_wps_complete = 1;
5657 wpa_s->parent, NULL);
5662 int wpas_p2p_wps_eapol_cb(struct wpa_supplicant *wpa_s)
5664 if (!wpa_s->global->p2p_fail_on_wps_complete ||
5665 !wpa_s->p2p_in_provisioning)
5668 wpas_p2p_grpform_fail_after_wps(wpa_s);
5674 int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
5680 wpa_s->p2p_fallback_to_go_neg = 0;
5681 wpa_s->pending_pd_use = NORMAL_PD;
5695 os_memcpy(wpa_s->pending_join_dev_addr, peer_addr, ETH_ALEN);
5696 wpa_s->pending_pd_config_methods = config_methods;
5697 wpa_s->p2p_auto_pd = 1;
5698 wpa_s->p2p_auto_join = 0;
5699 wpa_s->pending_pd_before_join = 0;
5700 wpa_s->auto_pd_scan_retry = 0;
5701 wpas_p2p_stop_find(wpa_s);
5702 wpa_s->p2p_join_scan_count = 0;
5703 os_get_reltime(&wpa_s
5705 wpa_s->p2p_auto_started.sec,
5706 wpa_s->p2p_auto_started.usec);
5707 wpas_p2p_join_scan(wpa_s, NULL);
5711 if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
5714 return p2p_prov_disc_req(wpa_s->global->p2p, peer_addr,
5727 static void wpas_p2p_clear_pending_action_tx(struct wpa_supplicant *wpa_s)
5729 if (!offchannel_pending_action_tx(wpa_s))
5732 wpas_p2p_action_tx_clear(wpa_s);
5736 offchannel_clear_pending_action_tx(wpa_s);
5740 int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout,
5745 wpas_p2p_clear_pending_action_tx(wpa_s);
5746 wpa_s->p2p_long_listen = 0;
5748 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL ||
5749 wpa_s->p2p_in_provisioning)
5752 wpa_supplicant_cancel_sched_scan(wpa_s);
5754 return p2p_find(wpa_s->global->p2p, timeout, type,
5760 static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s)
5762 wpas_p2p_clear_pending_action_tx(wpa_s);
5763 wpa_s->p2p_long_listen = 0;
5764 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
5765 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
5767 if (wpa_s->global->p2p)
5768 p2p_stop_find(wpa_s->global->p2p);
5774 void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s)
5776 if (wpas_p2p_stop_find_oper(wpa_s) > 0)
5778 wpas_p2p_remove_pending_group_interface(wpa_s);
5784 struct wpa_supplicant *wpa_s = eloop_ctx;
5785 wpa_s->p2p_long_listen = 0;
5789 int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout)
5793 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5796 wpa_supplicant_cancel_sched_scan(wpa_s);
5797 wpas_p2p_clear_pending_action_tx(wpa_s);
5807 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
5808 wpa_s->p2p_long_listen = 0;
5815 if (wpa_s->global->p2p)
5816 p2p_stop_find(wpa_s->global->p2p);
5818 res = wpas_p2p_listen_start(wpa_s, timeout * 1000);
5819 if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) {
5820 wpa_s->p2p_long_listen = timeout * 1000;
5823 wpa_s, NULL);
5830 int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
5836 if (wpa_s->global->p2p_disabled)
5838 if (wpa_s->conf->p2p_disabled)
5840 if (wpa_s->global->p2p == NULL)
5846 ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len,
5854 int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
5858 if (wpa_s->global->p2p_disabled)
5860 if (wpa_s->global->p2p == NULL)
5863 switch (p2p_probe_req_rx(wpa_s->global->p2p, addr, dst, bssid,
5866 wpas_notify_preq(wpa_s, addr, dst, bssid, ie, ie_len,
5880 void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
5884 if (wpa_s->global->p2p_disabled)
5886 if (wpa_s->global->p2p == NULL)
5889 p2p_rx_action(wpa_s->global->p2p, da, sa, bssid, category, data, len,
5894 void wpas_p2p_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ies)
5896 if (wpa_s->global->p2p_disabled)
5898 if (wpa_s->global->p2p == NULL)
5901 p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
5905 static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s)
5907 p2p_group_deinit(wpa_s->p2p_group);
5908 wpa_s->p2p_group = NULL;
5910 wpa_s->ap_configured_cb = NULL;
5911 wpa_s->ap_configured_cb_ctx = NULL;
5912 wpa_s->ap_configured_cb_data = NULL;
5913 wpa_s->connect_without_scan = NULL;
5917 int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
5919 wpa_s->p2p_long_listen = 0;
5921 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5924 return p2p_reject(wpa_s->global->p2p, addr);
5929 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
5939 wpa_s->global->p2p_invite_group = NULL;
5941 os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
5943 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
5945 wpa_s->p2p_persistent_go_freq = freq;
5946 wpa_s->p2p_go_ht40 = !!ht40;
5954 if (wpas_p2p_create_iface(wpa_s)) {
5955 if (wpas_p2p_add_group_interface(wpa_s,
5962 bssid = wpa_s->pending_interface_addr;
5964 bssid = wpa_s->own_addr;
5969 wpa_s->pending_invite_ssid_id = ssid->id;
5971 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
5976 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5979 if (wpa_s->parent->conf->p2p_ignore_shared_freq &&
5981 wpa_s->num_multichan_concurrent > 1 &&
5982 wpas_p2p_num_unused_channels(wpa_s) > 0) {
5988 return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
5995 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
5998 struct wpa_global *global = wpa_s->global;
6006 wpa_s->p2p_persistent_go_freq = 0;
6007 wpa_s->p2p_go_ht40 = 0;
6008 wpa_s->p2p_go_vht = 0;
6010 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
6011 if (os_strcmp(wpa_s->ifname, ifname) == 0)
6014 if (wpa_s == NULL) {
6019 ssid = wpa_s->current_ssid;
6026 wpa_s->global->p2p_invite_group = wpa_s;
6028 wpas_p2p_get_persistent(wpa_s->parent, peer_addr,
6033 bssid = wpa_s->own_addr;
6035 go_dev_addr = wpa_s->global->p2p_dev_addr;
6039 if (wpa_s->wpa_state < WPA_ASSOCIATED) {
6044 bssid = wpa_s->bssid;
6046 !is_zero_ether_addr(wpa_s->go_dev_addr))
6047 go_dev_addr = wpa_s->go_dev_addr;
6048 freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
6049 (int) wpa_s->assoc_freq;
6051 wpa_s->parent->pending_invite_ssid_id = -1;
6053 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6056 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
6060 wpas_p2p_set_own_freq_preference(wpa_s, force_freq);
6062 return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
6068 void wpas_p2p_completed(struct wpa_supplicant *wpa_s)
6070 struct wpa_ssid *ssid = wpa_s->current_ssid;
6080 wpa_s->parent, NULL);
6083 if (!wpa_s->show_group_started || !ssid)
6086 wpa_s->show_group_started = 0;
6091 persistent = wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
6093 os_memcpy(wpa_s->go_dev_addr, go_dev_addr, ETH_ALEN);
6095 if (wpa_s->global->p2p_group_formation == wpa_s)
6096 wpa_s->global->p2p_group_formation = NULL;
6098 freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
6099 (int) wpa_s->assoc_freq;
6102 if (wpa_sm_get_p2p_ip_addr(wpa_s->wpa, ip) == 0) {
6110 wpas_p2p_group_started(wpa_s, 0, ssid, freq,
6117 network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
6121 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 1);
6125 int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
6130 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6133 if (wpa_s->wpa_state < WPA_ASSOCIATED ||
6134 wpa_s->current_ssid == NULL ||
6135 wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
6138 ret = p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
6139 wpa_s->own_addr, wpa_s->assoc_freq,
6142 wpa_s->waiting_presence_resp = 1;
6148 int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
6151 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6154 return p2p_ext_listen(wpa_s->global->p2p, period, interval);
6158 static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
6160 if (wpa_s->current_ssid == NULL) {
6168 return wpa_s->current_ssid->p2p_group &&
6169 wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
6175 struct wpa_supplicant *wpa_s = eloop_ctx;
6177 if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) {
6185 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_IDLE_TIMEOUT);
6189 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s)
6193 if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
6196 if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
6199 timeout = wpa_s->conf->p2p_group_idle;
6200 if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
6208 if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA)
6214 if (wpa_s->p2p_in_provisioning) {
6225 if (wpa_s->show_group_started) {
6241 wpa_s, NULL);
6246 int wpas_p2p_deauth_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
6250 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6254 p2p_deauth_notif(wpa_s->global->p2p, bssid, reason_code, ie,
6258 wpa_s->current_ssid &&
6259 wpa_s->current_ssid->p2p_group &&
6260 wpa_s->current_ssid->mode == WPAS_MODE_INFRA) {
6263 if (wpas_p2p_group_delete(wpa_s,
6273 void wpas_p2p_disassoc_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
6277 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6281 p2p_disassoc_notif(wpa_s->global->p2p, bssid, reason_code, ie,
6286 void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
6288 struct p2p_data *p2p = wpa_s->global->p2p;
6293 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
6296 if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME)
6297 p2p_set_dev_name(p2p, wpa_s->conf->device_name);
6299 if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE)
6300 p2p_set_pri_dev_type(p2p, wpa_s->conf->device_type);
6302 if (wpa_s->wps &&
6303 (wpa_s->conf->changed_parameters & CFG_CHANGED_CONFIG_METHODS))
6304 p2p_set_config_methods(p2p, wpa_s->wps->config_methods);
6306 if (wpa_s->wps && (wpa_s->conf->changed_parameters & CFG_CHANGED_UUID))
6307 p2p_set_uuid(p2p, wpa_s->wps->uuid);
6309 if (wpa_s->conf->changed_parameters & CFG_CHANGED_WPS_STRING) {
6310 p2p_set_manufacturer(p2p, wpa_s->conf->manufacturer);
6311 p2p_set_model_name(p2p, wpa_s->conf->model_name);
6312 p2p_set_model_number(p2p, wpa_s->conf->model_number);
6313 p2p_set_serial_number(p2p, wpa_s->conf->serial_number);
6316 if (wpa_s->conf->changed_parameters & CFG_CHANGED_SEC_DEVICE_TYPE)
6318 wpa_s->conf->sec_device_type,
6319 wpa_s->conf->num_sec_device_types);
6321 if (wpa_s->conf->changed_parameters & CFG_CHANGED_VENDOR_EXTENSION) {
6325 if (wpa_s->conf->wps_vendor_ext[i] == NULL)
6328 p2p, wpa_s->conf->wps_vendor_ext[i]);
6332 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
6333 wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
6335 country[0] = wpa_s->conf->country[0];
6336 country[1] = wpa_s->conf->country[1];
6341 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_SSID_POSTFIX) {
6342 p2p_set_ssid_postfix(p2p, (u8 *) wpa_s->conf->p2p_ssid_postfix,
6343 wpa_s->conf->p2p_ssid_postfix ?
6344 os_strlen(wpa_s->conf->p2p_ssid_postfix) :
6348 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_INTRA_BSS)
6349 p2p_set_intra_bss_dist(p2p, wpa_s->conf->p2p_intra_bss);
6351 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_LISTEN_CHANNEL) {
6357 if (wpa_s->conf->p2p_listen_reg_class &&
6358 wpa_s->conf->p2p_listen_channel) {
6359 reg_class = wpa_s->conf->p2p_listen_reg_class;
6360 channel = wpa_s->conf->p2p_listen_channel;
6380 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_OPER_CHANNEL) {
6384 if (wpa_s->conf->p2p_oper_reg_class &&
6385 wpa_s->conf->p2p_oper_channel) {
6386 op_reg_class = wpa_s->conf->p2p_oper_reg_class;
6387 op_channel = wpa_s->conf->p2p_oper_channel;
6408 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PREF_CHAN) {
6409 if (p2p_set_pref_chan(p2p, wpa_s->conf->num_p2p_pref_chan,
6410 wpa_s->conf->p2p_pref_chan) < 0) {
6415 if (p2p_set_no_go_freq(p2p, &wpa_s->conf->p2p_no_go_freq) < 0) {
6421 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PASSPHRASE_LEN)
6422 p2p_set_passphrase_len(p2p, wpa_s->conf->p2p_passphrase_len);
6426 int wpas_p2p_set_noa(struct wpa_supplicant *wpa_s, u8 count, int start,
6429 if (!wpa_s->ap_iface)
6431 return hostapd_p2p_set_noa(wpa_s->ap_iface->bss[0], count, start,
6436 int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled)
6438 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6441 wpa_s->global->cross_connection = enabled;
6442 p2p_set_cross_connect(wpa_s->global->p2p, enabled);
6447 for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
6512 void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s)
6514 if (wpa_s->ap_iface || wpa_s->current_ssid == NULL ||
6515 wpa_s->current_ssid->mode != WPAS_MODE_INFRA ||
6516 wpa_s->cross_connect_disallowed)
6517 wpas_p2p_disable_cross_connect(wpa_s);
6519 wpas_p2p_enable_cross_connect(wpa_s);
6520 if (!wpa_s->ap_iface &&
6521 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
6526 void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s)
6528 wpas_p2p_disable_cross_connect(wpa_s);
6529 if (!wpa_s->ap_iface &&
6531 wpa_s, NULL))
6532 wpas_p2p_set_group_idle_timeout(wpa_s);
6536 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s)
6540 if (!wpa_s->global->cross_connection)
6543 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
6544 if (iface == wpa_s)
6552 wpa_s->cross_connect_enabled = 1;
6553 os_strlcpy(wpa_s->cross_connect_uplink, iface->ifname,
6554 sizeof(wpa_s->cross_connect_uplink));
6557 wpa_s->ifname, wpa_s->cross_connect_uplink);
6565 wpa_s->cross_connect_in_use = 1;
6566 wpa_msg_global(wpa_s->parent, MSG_INFO,
6568 wpa_s->ifname, wpa_s->cross_connect_uplink);
6574 int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s)
6576 if (wpa_s->p2p_group_interface != P2P_GROUP_INTERFACE_CLIENT &&
6577 !wpa_s->p2p_in_provisioning)
6582 if (wpa_s != wpa_s->parent)
6583 wpa_msg_ctrl(wpa_s->parent, MSG_INFO, WPS_EVENT_OVERLAP);
6584 wpas_p2p_group_formation_failed(wpa_s);
6591 struct wpa_supplicant *wpa_s = eloop_ctx;
6592 wpas_p2p_notif_pbc_overlap(wpa_s);
6596 void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s)
6601 if (wpa_s->global == NULL || wpa_s->global->p2p == NULL)
6606 if (wpas_p2p_setup_channels(wpa_s, &chan, &cli_chan)) {
6612 p2p_update_channel_list(wpa_s->global->p2p, &chan, &cli_chan);
6614 for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
6638 static void wpas_p2p_scan_res_ignore(struct wpa_supplicant *wpa_s,
6645 int wpas_p2p_cancel(struct wpa_supplicant *wpa_s)
6647 struct wpa_global *global = wpa_s->global;
6656 if (wpa_s->pending_interface_name[0] &&
6657 !is_zero_ether_addr(wpa_s->pending_interface_addr))
6668 if (wpa_s->scan_res_handler == wpas_p2p_scan_res_join) {
6670 wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore;
6674 if (wpa_s->pending_pd_before_join) {
6676 wpa_s->pending_pd_before_join = 0;
6680 wpas_p2p_stop_find(wpa_s);
6682 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
6683 if (wpa_s == global->p2p_group_formation &&
6684 (wpa_s->p2p_in_provisioning ||
6685 wpa_s->parent->pending_interface_type ==
6689 wpa_s->ifname);
6692 wpa_s->parent, NULL);
6693 if (wpa_s->p2p_in_provisioning) {
6694 wpas_group_formation_completed(wpa_s, 0);
6697 wpas_p2p_group_delete(wpa_s,
6700 } else if (wpa_s->p2p_in_invitation) {
6702 wpa_s->ifname);
6704 wpas_p2p_group_formation_failed(wpa_s);
6717 void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s)
6719 if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
6724 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_UNAVAILABLE);
6728 void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s,
6731 struct p2p_data *p2p = wpa_s->global->p2p;
6738 int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr)
6741 struct p2p_data *p2p = wpa_s->global->p2p;
6755 * @wpa_s: Pointer to wpa_supplicant data
6764 int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s)
6767 if (wpa_s == NULL)
6770 return wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_REQUESTED) < 0 ?
6775 int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s)
6779 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
6782 ret = p2p_in_progress(wpa_s->global->p2p);
6790 if (wpa_s->global->p2p_group_formation &&
6791 wpa_s->global->p2p_group_formation != wpa_s) {
6792 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Another interface (%s) "
6794 wpa_s->global->p2p_group_formation->ifname);
6799 if (!ret && wpa_s->global->p2p_go_wait_client.sec) {
6802 if (os_reltime_expired(&now, &wpa_s->global->p2p_go_wait_client,
6805 wpa_s->global->p2p_go_wait_client.sec = 0;
6807 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Waiting for initial client connection during group formation");
6816 void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
6819 if (wpa_s->p2p_in_provisioning && ssid->p2p_group &&
6821 wpa_s->parent, NULL) > 0) {
6833 wpa_s->parent, NULL);
6838 struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
6845 for (s = wpa_s->conf->ssid; s; s = s->next) {
6873 void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
6877 wpa_s->parent, NULL) > 0) {
6889 if (!wpa_s->p2p_go_group_formation_completed) {
6890 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Marking group formation completed on GO on first data connection");
6891 wpa_s->p2p_go_group_formation_completed = 1;
6892 wpa_s->global->p2p_group_formation = NULL;
6893 wpa_s->p2p_in_provisioning = 0;
6894 wpa_s->p2p_in_invitation = 0;
6896 wpa_s->global->p2p_go_wait_client.sec = 0;
6899 wpa_s, addr);
6903 static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
6906 struct wpa_supplicant *group = wpa_s;
6907 if (wpa_s->global->p2p_group_formation)
6908 group = wpa_s->global->p2p_group_formation;
6909 wpa_s = wpa_s->parent;
6910 offchannel_send_action_done(wpa_s);
6913 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Fall back to GO Negotiation");
6914 wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, wpa_s->p2p_pin,
6915 wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
6916 0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
6917 wpa_s->p2p_persistent_id,
6918 wpa_s->p2p_pd_before_go_neg,
6919 wpa_s->p2p_go_ht40,
6920 wpa_s->p2p_go_vht);
6924 int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s)
6926 if (!wpa_s->p2p_fallback_to_go_neg ||
6927 wpa_s->p2p_in_provisioning <= 5)
6930 if (wpas_p2p_peer_go(wpa_s, wpa_s->pending_join_dev_addr) > 0)
6933 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: GO not found for p2p_connect-auto - "
6935 wpas_p2p_fallback_to_go_neg(wpa_s, 1);
6941 unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s)
6945 if (wpa_s->wpa_state > WPA_SCANNING) {
6946 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to "
6948 wpa_s->conf->p2p_search_delay);
6949 return wpa_s->conf->p2p_search_delay;
6952 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
6954 if (ifs != wpa_s && ifs->wpa_state > WPA_SCANNING) {
6955 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search "
6958 wpa_s->conf->p2p_search_delay,
6960 return wpa_s->conf->p2p_search_delay;
6968 static int wpas_p2p_remove_psk_entry(struct wpa_supplicant *wpa_s,
6981 wpa_dbg(wpa_s, MSG_DEBUG,
6995 void wpas_p2p_new_psk_cb(struct wpa_supplicant *wpa_s, const u8 *mac_addr,
6999 struct wpa_ssid *ssid = wpa_s->current_ssid;
7007 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR
7013 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR,
7018 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: new_psk_cb during group formation");
7020 if (wpa_s->global->add_psk == NULL) {
7021 wpa_s->global->add_psk = os_zalloc(sizeof(*p));
7022 if (wpa_s->global->add_psk == NULL)
7025 p = wpa_s->global->add_psk;
7038 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Ignore new_psk_cb on not-persistent GO");
7042 persistent = wpas_p2p_get_persistent(wpa_s->parent, NULL, ssid->ssid,
7045 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not find persistent group information to store the new PSK");
7064 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove oldest PSK entry for "
7071 wpas_p2p_remove_psk_entry(wpa_s->parent, persistent,
7075 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for p2p_dev_addr="
7078 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for addr=" MACSTR,
7083 if (wpa_s->parent->conf->update_config &&
7084 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
7089 static void wpas_p2p_remove_psk(struct wpa_supplicant *wpa_s,
7095 res = wpas_p2p_remove_psk_entry(wpa_s, s, addr, iface_addr);
7096 if (res > 0 && wpa_s->conf->update_config &&
7097 wpa_config_write(wpa_s->confname, wpa_s->conf))
7098 wpa_dbg(wpa_s, MSG_DEBUG,
7103 static void wpas_p2p_remove_client_go(struct wpa_supplicant *wpa_s,
7110 if (wpa_s->ap_iface == NULL || wpa_s->current_ssid == NULL ||
7111 wpa_s->current_ssid->mode != WPAS_MODE_P2P_GO)
7115 hapd = wpa_s->ap_iface->bss[0];
7122 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove operating group PSK entry for "
7144 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disconnect peer " MACSTR
7154 void wpas_p2p_remove_client(struct wpa_supplicant *wpa_s, const u8 *peer,
7160 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove client " MACSTR, MAC2STR(peer));
7163 for (s = wpa_s->parent->conf->ssid; s; s = s->next) {
7167 wpas_remove_persistent_peer(wpa_s, s, peer, 0);
7168 wpas_p2p_remove_psk(wpa_s->parent, s, peer, iface_addr);
7172 for (w = wpa_s->global->ifaces; w; w = w->next)
7179 struct wpa_supplicant *wpa_s = eloop_ctx;
7180 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_PSK_FAILURE);
7186 struct wpa_supplicant *wpa_s = eloop_ctx;
7189 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_FREQ_CONFLICT);
7193 int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq,
7198 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
7215 if (wpa_s == iface)
7222 wpa_supplicant_disable_network(wpa_s->global->ifaces,
7224 wpa_msg(wpa_s->global->ifaces, MSG_INFO,
7226 os_memset(wpa_s->global->ifaces->pending_bssid, 0,
7230 if (wpa_s == iface)
7241 int wpas_p2p_4way_hs_failed(struct wpa_supplicant *wpa_s)
7243 struct wpa_ssid *ssid = wpa_s->current_ssid;
7248 if (wpa_s->p2p_last_4way_hs_fail &&
7249 wpa_s->p2p_last_4way_hs_fail == ssid) {
7253 if (wpas_p2p_persistent_group(wpa_s, go_dev_addr,
7256 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not determine whether 4-way handshake failures were for a persistent group");
7260 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Two 4-way handshake failures for a P2P group - go_dev_addr="
7262 persistent = wpas_p2p_get_persistent(wpa_s->parent, go_dev_addr,
7266 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No matching persistent group stored");
7269 wpa_msg_global(wpa_s->parent, MSG_INFO,
7273 wpa_s->p2p_last_4way_hs_fail = NULL;
7280 wpa_s, NULL);
7284 wpa_s->p2p_last_4way_hs_fail = ssid;
7337 static int wpas_p2p_cli_freq(struct wpa_supplicant *wpa_s,
7346 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
7362 struct wpabuf * wpas_p2p_nfc_handover_req(struct wpa_supplicant *wpa_s,
7368 int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr);
7370 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) {
7375 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
7376 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
7377 &wpa_s->conf->wps_nfc_dh_privkey) < 0) {
7378 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No DH key available for handover request");
7384 wpa_s->parent->wps, wpa_s->conf->wps_nfc_dh_pubkey);
7387 p2p = p2p_build_nfc_handover_req(wpa_s->global->p2p, cli_freq,
7395 struct wpabuf * wpas_p2p_nfc_handover_sel(struct wpa_supplicant *wpa_s,
7401 int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr);
7403 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
7406 if (!tag && wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
7407 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
7408 &wpa_s->conf->wps_nfc_dh_privkey) < 0)
7413 wpa_s->parent->wps,
7414 tag ? wpa_s->conf->wps_nfc_dev_pw_id :
7416 wpa_s->conf->wps_nfc_dh_pubkey,
7417 tag ? wpa_s->conf->wps_nfc_dev_pw : NULL);
7420 p2p = p2p_build_nfc_handover_sel(wpa_s->global->p2p, cli_freq,
7428 static int wpas_p2p_nfc_join_group(struct wpa_supplicant *wpa_s,
7436 wpa_s->p2p_wps_method = WPS_NFC;
7437 wpa_s->pending_join_wps_method = WPS_NFC;
7438 os_memset(wpa_s->pending_join_iface_addr, 0, ETH_ALEN);
7439 os_memcpy(wpa_s->pending_join_dev_addr, params->go_dev_addr,
7441 return wpas_p2p_join_start(wpa_s, params->go_freq,
7446 return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
7447 WPS_NFC, 0, 0, 1, 0, wpa_s->conf->p2p_go_intent,
7452 static int wpas_p2p_nfc_auth_join(struct wpa_supplicant *wpa_s,
7460 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
7461 ssid = wpa_s->current_ssid;
7466 if (wpa_s->ap_iface == NULL)
7470 if (wpa_s == NULL) {
7475 if (wpa_s->parent->p2p_oob_dev_pw_id !=
7477 !wpa_s->parent->p2p_oob_dev_pw) {
7482 wpa_s, wpa_s->parent->p2p_oob_dev_pw_id,
7483 wpa_s->parent->p2p_oob_dev_pw,
7484 wpa_s->parent->p2p_peer_oob_pk_hash_known ?
7485 wpa_s->parent->p2p_peer_oob_pubkey_hash : NULL);
7501 wpa_s->global->p2p_invite_group = wpa_s;
7503 wpas_p2p_get_persistent(wpa_s->parent,
7506 wpa_s->parent->pending_invite_ssid_id = -1;
7508 return p2p_invite(wpa_s->global->p2p, params->peer->p2p_device_addr,
7509 P2P_INVITE_ROLE_ACTIVE_GO, wpa_s->own_addr,
7511 wpa_s->global->p2p_dev_addr, persistent, 0,
7512 wpa_s->parent->p2p_oob_dev_pw_id);
7516 static int wpas_p2p_nfc_init_go_neg(struct wpa_supplicant *wpa_s,
7522 return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
7523 WPS_NFC, 0, 0, 0, 0, wpa_s->conf->p2p_go_intent,
7528 static int wpas_p2p_nfc_resp_go_neg(struct wpa_supplicant *wpa_s,
7536 res = wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
7537 WPS_NFC, 0, 0, 0, 1, wpa_s->conf->p2p_go_intent,
7542 res = wpas_p2p_listen(wpa_s, 60);
7544 p2p_unauthorize(wpa_s->global->p2p,
7552 static int wpas_p2p_nfc_connection_handover(struct wpa_supplicant *wpa_s,
7611 res = p2p_process_nfc_connection_handover(wpa_s->global->p2p, &params);
7619 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_BOTH_GO "peer=" MACSTR,
7626 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT
7635 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT
7643 if (wpas_p2p_cli_freq(wpa_s, NULL, NULL)) {
7644 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_WHILE_CLIENT "peer="
7649 wpabuf_free(wpa_s->p2p_oob_dev_pw);
7650 wpa_s->p2p_oob_dev_pw = NULL;
7662 os_memcpy(wpa_s->p2p_peer_oob_pubkey_hash,
7664 wpa_s->p2p_peer_oob_pk_hash_known = 1;
7678 wpa_s->p2p_oob_dev_pw_id = id;
7679 wpa_s->p2p_oob_dev_pw = wpabuf_alloc_copy(
7683 if (wpa_s->p2p_oob_dev_pw == NULL)
7686 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
7687 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
7688 &wpa_s->conf->wps_nfc_dh_privkey) < 0)
7693 wpa_s->p2p_oob_dev_pw_id = DEV_PW_NFC_CONNECTION_HANDOVER;
7703 return wpas_p2p_nfc_join_group(wpa_s, &params);
7705 return wpas_p2p_nfc_auth_join(wpa_s, &params, tag);
7707 return wpas_p2p_nfc_init_go_neg(wpa_s, &params, forced_freq);
7710 return wpas_p2p_nfc_resp_go_neg(wpa_s, &params, forced_freq);
7717 int wpas_p2p_nfc_tag_process(struct wpa_supplicant *wpa_s,
7720 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
7723 return wpas_p2p_nfc_connection_handover(wpa_s, data, 1, 1, forced_freq);
7727 int wpas_p2p_nfc_report_handover(struct wpa_supplicant *wpa_s, int init,
7734 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
7751 ret = wpas_p2p_nfc_connection_handover(wpa_s, tmp, init, 0,
7759 int wpas_p2p_nfc_tag_enabled(struct wpa_supplicant *wpa_s, int enabled)
7762 int go_intent = wpa_s->conf->p2p_go_intent;
7765 if (wpa_s->global->p2p == NULL)
7770 for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
7776 p2p_set_authorized_oob_dev_pw_id(wpa_s->global->p2p, 0,
7778 if (wpa_s->p2p_nfc_tag_enabled)
7779 wpas_p2p_remove_pending_group_interface(wpa_s);
7780 wpa_s->p2p_nfc_tag_enabled = 0;
7784 if (wpa_s->global->p2p_disabled)
7787 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL ||
7788 wpa_s->conf->wps_nfc_dh_privkey == NULL ||
7789 wpa_s->conf->wps_nfc_dev_pw == NULL ||
7790 wpa_s->conf->wps_nfc_dev_pw_id < 0x10) {
7798 wpa_s->p2p_oob_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id;
7799 wpabuf_free(wpa_s->p2p_oob_dev_pw);
7800 wpa_s->p2p_oob_dev_pw = wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw);
7801 if (wpa_s->p2p_oob_dev_pw == NULL)
7803 wpa_s->p2p_peer_oob_pk_hash_known = 0;
7805 if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO ||
7806 wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT) {
7811 wpa_s->create_p2p_iface = 0;
7813 wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
7816 if (wpa_s->create_p2p_iface) {
7822 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
7828 if_addr = wpa_s->pending_interface_addr;
7830 if_addr = wpa_s->own_addr;
7832 wpa_s->p2p_nfc_tag_enabled = enabled;
7834 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
7841 wpabuf_dup(wpa_s->conf->wps_nfc_dh_pubkey);
7844 wpabuf_dup(wpa_s->conf->wps_nfc_dh_privkey);
7847 wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw);
7848 hapd->conf->wps_nfc_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id;
7856 wpa_s->global->p2p, wpa_s->conf->wps_nfc_dev_pw_id, go_intent,
7865 static void wpas_p2p_optimize_listen_channel(struct wpa_supplicant *wpa_s,
7872 curr_chan = p2p_get_listen_channel(wpa_s->global->p2p);
7885 wpa_dbg(wpa_s, MSG_DEBUG,
7888 p2p_set_listen_channel(wpa_s->global->p2p, 81, cand, 0);
7893 void wpas_p2p_indicate_state_change(struct wpa_supplicant *wpa_s)
7896 unsigned int num = wpa_s->num_multichan_concurrent;
7898 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
7905 if (!wpa_s->conf->p2p_optimize_listen_chan)
7908 if (!wpa_s->current_ssid || wpa_s->wpa_state != WPA_COMPLETED)
7915 num = get_shared_radio_freqs_data(wpa_s, freqs, num);
7917 wpas_p2p_optimize_listen_channel(wpa_s, freqs, num);
7922 void wpas_p2p_deinit_iface(struct wpa_supplicant *wpa_s)
7924 if (wpa_s == wpa_s->parent)
7925 wpas_p2p_group_remove(wpa_s, "*");
7926 if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) {
7927 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing "
7929 wpas_p2p_deinit_global(wpa_s->global);
7934 void wpas_p2p_ap_deinit(struct wpa_supplicant *wpa_s)
7936 if (wpa_s->ap_iface->bss)
7937 wpa_s->ap_iface->bss[0]->p2p_group = NULL;
7938 wpas_p2p_group_deinit(wpa_s);