1 /* 2 * wpa_supplicant - P2P 3 * Copyright (c) 2009-2010, Atheros Communications 4 * Copyright (c) 2010-2014, Jouni Malinen <j@w1.fi> 5 * 6 * This software may be distributed under the terms of the BSD license. 7 * See README for more details. 8 */ 9 10 #include "includes.h" 11 12 #include "common.h" 13 #include "eloop.h" 14 #include "common/ieee802_11_common.h" 15 #include "common/ieee802_11_defs.h" 16 #include "common/wpa_ctrl.h" 17 #include "wps/wps_i.h" 18 #include "p2p/p2p.h" 19 #include "ap/hostapd.h" 20 #include "ap/ap_config.h" 21 #include "ap/sta_info.h" 22 #include "ap/ap_drv_ops.h" 23 #include "ap/wps_hostapd.h" 24 #include "ap/p2p_hostapd.h" 25 #include "ap/dfs.h" 26 #include "eapol_supp/eapol_supp_sm.h" 27 #include "rsn_supp/wpa.h" 28 #include "wpa_supplicant_i.h" 29 #include "driver_i.h" 30 #include "ap.h" 31 #include "config_ssid.h" 32 #include "config.h" 33 #include "notify.h" 34 #include "scan.h" 35 #include "bss.h" 36 #include "offchannel.h" 37 #include "wps_supplicant.h" 38 #include "p2p_supplicant.h" 39 #include "wifi_display.h" 40 41 42 /* 43 * How many times to try to scan to find the GO before giving up on join 44 * request. 45 */ 46 #define P2P_MAX_JOIN_SCAN_ATTEMPTS 10 47 48 #define P2P_AUTO_PD_SCAN_ATTEMPTS 5 49 50 #ifndef P2P_MAX_CLIENT_IDLE 51 /* 52 * How many seconds to try to reconnect to the GO when connection in P2P client 53 * role has been lost. 54 */ 55 #define P2P_MAX_CLIENT_IDLE 10 56 #endif /* P2P_MAX_CLIENT_IDLE */ 57 58 #ifndef P2P_MAX_INITIAL_CONN_WAIT 59 /* 60 * How many seconds to wait for initial 4-way handshake to get completed after 61 * WPS provisioning step or after the re-invocation of a persistent group on a 62 * P2P Client. 63 */ 64 #define P2P_MAX_INITIAL_CONN_WAIT 10 65 #endif /* P2P_MAX_INITIAL_CONN_WAIT */ 66 67 #ifndef P2P_MAX_INITIAL_CONN_WAIT_GO 68 /* 69 * How many seconds to wait for initial 4-way handshake to get completed after 70 * WPS provisioning step on the GO. This controls the extra time the P2P 71 * operation is considered to be in progress (e.g., to delay other scans) after 72 * WPS provisioning has been completed on the GO during group formation. 73 */ 74 #define P2P_MAX_INITIAL_CONN_WAIT_GO 10 75 #endif /* P2P_MAX_INITIAL_CONN_WAIT_GO */ 76 77 #ifndef P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE 78 /* 79 * How many seconds to wait for initial 4-way handshake to get completed after 80 * re-invocation of a persistent group on the GO when the client is expected 81 * to connect automatically (no user interaction). 82 */ 83 #define P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE 15 84 #endif /* P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE */ 85 86 #define P2P_MGMT_DEVICE_PREFIX "p2p-dev-" 87 88 enum p2p_group_removal_reason { 89 P2P_GROUP_REMOVAL_UNKNOWN, 90 P2P_GROUP_REMOVAL_SILENT, 91 P2P_GROUP_REMOVAL_FORMATION_FAILED, 92 P2P_GROUP_REMOVAL_REQUESTED, 93 P2P_GROUP_REMOVAL_IDLE_TIMEOUT, 94 P2P_GROUP_REMOVAL_UNAVAILABLE, 95 P2P_GROUP_REMOVAL_GO_ENDING_SESSION, 96 P2P_GROUP_REMOVAL_PSK_FAILURE, 97 P2P_GROUP_REMOVAL_FREQ_CONFLICT 98 }; 99 100 101 static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx); 102 static struct wpa_supplicant * 103 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated, 104 int go); 105 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq, 106 const u8 *ssid, size_t ssid_len); 107 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq, 108 const u8 *ssid, size_t ssid_len); 109 static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx); 110 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr, 111 const u8 *dev_addr, enum p2p_wps_method wps_method, 112 int auto_join, int freq, 113 const u8 *ssid, size_t ssid_len); 114 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s); 115 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s); 116 static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx); 117 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s); 118 static void wpas_p2p_group_formation_timeout(void *eloop_ctx, 119 void *timeout_ctx); 120 static void wpas_p2p_group_freq_conflict(void *eloop_ctx, void *timeout_ctx); 121 static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s, 122 int group_added); 123 static void wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s); 124 static void wpas_stop_listen(void *ctx); 125 static void wpas_p2p_psk_failure_removal(void *eloop_ctx, void *timeout_ctx); 126 static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s); 127 static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s, 128 enum wpa_driver_if_type type); 129 130 131 /* 132 * Get the number of concurrent channels that the HW can operate, but that are 133 * currently not in use by any of the wpa_supplicant interfaces. 134 */ 135 static int wpas_p2p_num_unused_channels(struct wpa_supplicant *wpa_s) 136 { 137 int *freqs; 138 int num, unused; 139 140 freqs = os_calloc(wpa_s->num_multichan_concurrent, sizeof(int)); 141 if (!freqs) 142 return -1; 143 144 num = get_shared_radio_freqs(wpa_s, freqs, 145 wpa_s->num_multichan_concurrent); 146 os_free(freqs); 147 148 unused = wpa_s->num_multichan_concurrent - num; 149 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: num_unused_channels: %d", unused); 150 return unused; 151 } 152 153 154 /* 155 * Get the frequencies that are currently in use by one or more of the virtual 156 * interfaces, and that are also valid for P2P operation. 157 */ 158 static unsigned int 159 wpas_p2p_valid_oper_freqs(struct wpa_supplicant *wpa_s, 160 struct wpa_used_freq_data *p2p_freqs, 161 unsigned int len) 162 { 163 struct wpa_used_freq_data *freqs; 164 unsigned int num, i, j; 165 166 freqs = os_calloc(wpa_s->num_multichan_concurrent, 167 sizeof(struct wpa_used_freq_data)); 168 if (!freqs) 169 return 0; 170 171 num = get_shared_radio_freqs_data(wpa_s, freqs, 172 wpa_s->num_multichan_concurrent); 173 174 os_memset(p2p_freqs, 0, sizeof(struct wpa_used_freq_data) * len); 175 176 for (i = 0, j = 0; i < num && j < len; i++) { 177 if (p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq)) 178 p2p_freqs[j++] = freqs[i]; 179 } 180 181 os_free(freqs); 182 183 dump_freq_data(wpa_s, "valid for P2P", p2p_freqs, j); 184 185 return j; 186 } 187 188 189 static void wpas_p2p_set_own_freq_preference(struct wpa_supplicant *wpa_s, 190 int freq) 191 { 192 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 193 return; 194 if (wpa_s->parent->conf->p2p_ignore_shared_freq && 195 freq > 0 && wpa_s->num_multichan_concurrent > 1 && 196 wpas_p2p_num_unused_channels(wpa_s) > 0) { 197 wpa_printf(MSG_DEBUG, "P2P: Ignore own channel preference %d MHz due to p2p_ignore_shared_freq=1 configuration", 198 freq); 199 freq = 0; 200 } 201 p2p_set_own_freq_preference(wpa_s->global->p2p, freq); 202 } 203 204 205 static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s, 206 struct wpa_scan_results *scan_res) 207 { 208 size_t i; 209 210 if (wpa_s->p2p_scan_work) { 211 struct wpa_radio_work *work = wpa_s->p2p_scan_work; 212 wpa_s->p2p_scan_work = NULL; 213 radio_work_done(work); 214 } 215 216 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 217 return; 218 219 wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS)", 220 (int) scan_res->num); 221 222 for (i = 0; i < scan_res->num; i++) { 223 struct wpa_scan_res *bss = scan_res->res[i]; 224 struct os_reltime time_tmp_age, entry_ts; 225 const u8 *ies; 226 size_t ies_len; 227 228 time_tmp_age.sec = bss->age / 1000; 229 time_tmp_age.usec = (bss->age % 1000) * 1000; 230 os_reltime_sub(&scan_res->fetch_time, &time_tmp_age, &entry_ts); 231 232 ies = (const u8 *) (bss + 1); 233 ies_len = bss->ie_len; 234 if (bss->beacon_ie_len > 0 && 235 !wpa_scan_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE) && 236 wpa_scan_get_vendor_ie_beacon(bss, P2P_IE_VENDOR_TYPE)) { 237 wpa_printf(MSG_DEBUG, "P2P: Use P2P IE(s) from Beacon frame since no P2P IE(s) in Probe Response frames received for " 238 MACSTR, MAC2STR(bss->bssid)); 239 ies = ies + ies_len; 240 ies_len = bss->beacon_ie_len; 241 } 242 243 244 if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid, 245 bss->freq, &entry_ts, bss->level, 246 ies, ies_len) > 0) 247 break; 248 } 249 250 p2p_scan_res_handled(wpa_s->global->p2p); 251 } 252 253 254 static void wpas_p2p_trigger_scan_cb(struct wpa_radio_work *work, int deinit) 255 { 256 struct wpa_supplicant *wpa_s = work->wpa_s; 257 struct wpa_driver_scan_params *params = work->ctx; 258 int ret; 259 260 if (deinit) { 261 if (!work->started) { 262 wpa_scan_free_params(params); 263 return; 264 } 265 266 wpa_s->p2p_scan_work = NULL; 267 return; 268 } 269 270 ret = wpa_drv_scan(wpa_s, params); 271 wpa_scan_free_params(params); 272 work->ctx = NULL; 273 if (ret) { 274 radio_work_done(work); 275 p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret); 276 return; 277 } 278 279 p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret); 280 os_get_reltime(&wpa_s->scan_trigger_time); 281 wpa_s->scan_res_handler = wpas_p2p_scan_res_handler; 282 wpa_s->own_scan_requested = 1; 283 wpa_s->p2p_scan_work = work; 284 } 285 286 287 static int wpas_p2p_search_social_channel(struct wpa_supplicant *wpa_s, 288 int freq) 289 { 290 if (wpa_s->global->p2p_24ghz_social_channels && 291 (freq == 2412 || freq == 2437 || freq == 2462)) { 292 /* 293 * Search all social channels regardless of whether these have 294 * been disabled for P2P operating channel use to avoid missing 295 * peers. 296 */ 297 return 1; 298 } 299 return p2p_supported_freq(wpa_s->global->p2p, freq); 300 } 301 302 303 static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq, 304 unsigned int num_req_dev_types, 305 const u8 *req_dev_types, const u8 *dev_id, u16 pw_id) 306 { 307 struct wpa_supplicant *wpa_s = ctx; 308 struct wpa_driver_scan_params *params = NULL; 309 struct wpabuf *wps_ie, *ies; 310 unsigned int num_channels = 0; 311 int social_channels_freq[] = { 2412, 2437, 2462, 60480 }; 312 size_t ielen; 313 u8 *n, i; 314 315 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 316 return -1; 317 318 if (wpa_s->p2p_scan_work) { 319 wpa_dbg(wpa_s, MSG_INFO, "P2P: Reject scan trigger since one is already pending"); 320 return -1; 321 } 322 323 params = os_zalloc(sizeof(*params)); 324 if (params == NULL) 325 return -1; 326 327 /* P2P Wildcard SSID */ 328 params->num_ssids = 1; 329 n = os_malloc(P2P_WILDCARD_SSID_LEN); 330 if (n == NULL) 331 goto fail; 332 os_memcpy(n, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN); 333 params->ssids[0].ssid = n; 334 params->ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN; 335 336 wpa_s->wps->dev.p2p = 1; 337 wps_ie = wps_build_probe_req_ie(pw_id, &wpa_s->wps->dev, 338 wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 339 num_req_dev_types, req_dev_types); 340 if (wps_ie == NULL) 341 goto fail; 342 343 ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p); 344 ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen); 345 if (ies == NULL) { 346 wpabuf_free(wps_ie); 347 goto fail; 348 } 349 wpabuf_put_buf(ies, wps_ie); 350 wpabuf_free(wps_ie); 351 352 p2p_scan_ie(wpa_s->global->p2p, ies, dev_id); 353 354 params->p2p_probe = 1; 355 n = os_malloc(wpabuf_len(ies)); 356 if (n == NULL) { 357 wpabuf_free(ies); 358 goto fail; 359 } 360 os_memcpy(n, wpabuf_head(ies), wpabuf_len(ies)); 361 params->extra_ies = n; 362 params->extra_ies_len = wpabuf_len(ies); 363 wpabuf_free(ies); 364 365 switch (type) { 366 case P2P_SCAN_SOCIAL: 367 params->freqs = os_calloc(ARRAY_SIZE(social_channels_freq) + 1, 368 sizeof(int)); 369 if (params->freqs == NULL) 370 goto fail; 371 for (i = 0; i < ARRAY_SIZE(social_channels_freq); i++) { 372 if (wpas_p2p_search_social_channel( 373 wpa_s, social_channels_freq[i])) 374 params->freqs[num_channels++] = 375 social_channels_freq[i]; 376 } 377 params->freqs[num_channels++] = 0; 378 break; 379 case P2P_SCAN_FULL: 380 break; 381 case P2P_SCAN_SPECIFIC: 382 params->freqs = os_calloc(2, sizeof(int)); 383 if (params->freqs == NULL) 384 goto fail; 385 params->freqs[0] = freq; 386 params->freqs[1] = 0; 387 break; 388 case P2P_SCAN_SOCIAL_PLUS_ONE: 389 params->freqs = os_calloc(ARRAY_SIZE(social_channels_freq) + 2, 390 sizeof(int)); 391 if (params->freqs == NULL) 392 goto fail; 393 for (i = 0; i < ARRAY_SIZE(social_channels_freq); i++) { 394 if (wpas_p2p_search_social_channel( 395 wpa_s, social_channels_freq[i])) 396 params->freqs[num_channels++] = 397 social_channels_freq[i]; 398 } 399 if (p2p_supported_freq(wpa_s->global->p2p, freq)) 400 params->freqs[num_channels++] = freq; 401 params->freqs[num_channels++] = 0; 402 break; 403 } 404 405 radio_remove_works(wpa_s, "p2p-scan", 0); 406 if (radio_add_work(wpa_s, 0, "p2p-scan", 0, wpas_p2p_trigger_scan_cb, 407 params) < 0) 408 goto fail; 409 return 0; 410 411 fail: 412 wpa_scan_free_params(params); 413 return -1; 414 } 415 416 417 static enum wpa_driver_if_type wpas_p2p_if_type(int p2p_group_interface) 418 { 419 switch (p2p_group_interface) { 420 case P2P_GROUP_INTERFACE_PENDING: 421 return WPA_IF_P2P_GROUP; 422 case P2P_GROUP_INTERFACE_GO: 423 return WPA_IF_P2P_GO; 424 case P2P_GROUP_INTERFACE_CLIENT: 425 return WPA_IF_P2P_CLIENT; 426 } 427 428 return WPA_IF_P2P_GROUP; 429 } 430 431 432 static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s, 433 const u8 *ssid, 434 size_t ssid_len, int *go) 435 { 436 struct wpa_ssid *s; 437 438 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 439 for (s = wpa_s->conf->ssid; s; s = s->next) { 440 if (s->disabled != 0 || !s->p2p_group || 441 s->ssid_len != ssid_len || 442 os_memcmp(ssid, s->ssid, ssid_len) != 0) 443 continue; 444 if (s->mode == WPAS_MODE_P2P_GO && 445 s != wpa_s->current_ssid) 446 continue; 447 if (go) 448 *go = s->mode == WPAS_MODE_P2P_GO; 449 return wpa_s; 450 } 451 } 452 453 return NULL; 454 } 455 456 457 static void run_wpas_p2p_disconnect(void *eloop_ctx, void *timeout_ctx) 458 { 459 struct wpa_supplicant *wpa_s = eloop_ctx; 460 wpa_printf(MSG_DEBUG, 461 "P2P: Complete previously requested removal of %s", 462 wpa_s->ifname); 463 wpas_p2p_disconnect(wpa_s); 464 } 465 466 467 static int wpas_p2p_disconnect_safely(struct wpa_supplicant *wpa_s, 468 struct wpa_supplicant *calling_wpa_s) 469 { 470 if (calling_wpa_s == wpa_s && wpa_s && 471 wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) { 472 /* 473 * The calling wpa_s instance is going to be removed. Do that 474 * from an eloop callback to keep the instance available until 475 * the caller has returned. This my be needed, e.g., to provide 476 * control interface responses on the per-interface socket. 477 */ 478 if (eloop_register_timeout(0, 0, run_wpas_p2p_disconnect, 479 wpa_s, NULL) < 0) 480 return -1; 481 return 0; 482 } 483 484 return wpas_p2p_disconnect(wpa_s); 485 } 486 487 488 /* Determine total number of clients in active groups where we are the GO */ 489 static unsigned int p2p_group_go_member_count(struct wpa_supplicant *wpa_s) 490 { 491 unsigned int count = 0; 492 struct wpa_ssid *s; 493 494 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 495 for (s = wpa_s->conf->ssid; s; s = s->next) { 496 wpa_printf(MSG_DEBUG, 497 "P2P: sup:%p ssid:%p disabled:%d p2p:%d mode:%d", 498 wpa_s, s, s->disabled, s->p2p_group, 499 s->mode); 500 if (!s->disabled && s->p2p_group && 501 s->mode == WPAS_MODE_P2P_GO) { 502 count += p2p_get_group_num_members( 503 wpa_s->p2p_group); 504 } 505 } 506 } 507 508 return count; 509 } 510 511 512 /* Find an interface for a P2P group where we are the GO */ 513 static struct wpa_supplicant * 514 wpas_p2p_get_go_group(struct wpa_supplicant *wpa_s) 515 { 516 struct wpa_supplicant *save = NULL; 517 struct wpa_ssid *s; 518 519 if (!wpa_s) 520 return NULL; 521 522 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 523 for (s = wpa_s->conf->ssid; s; s = s->next) { 524 if (s->disabled || !s->p2p_group || 525 s->mode != WPAS_MODE_P2P_GO) 526 continue; 527 528 /* Prefer a group with connected clients */ 529 if (p2p_get_group_num_members(wpa_s->p2p_group)) 530 return wpa_s; 531 save = wpa_s; 532 } 533 } 534 535 /* No group with connected clients, so pick the one without (if any) */ 536 return save; 537 } 538 539 540 /* Find an active P2P group where we are the GO */ 541 static struct wpa_ssid * wpas_p2p_group_go_ssid(struct wpa_supplicant *wpa_s, 542 u8 *bssid) 543 { 544 struct wpa_ssid *s, *empty = NULL; 545 546 if (!wpa_s) 547 return 0; 548 549 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 550 for (s = wpa_s->conf->ssid; s; s = s->next) { 551 if (s->disabled || !s->p2p_group || 552 s->mode != WPAS_MODE_P2P_GO) 553 continue; 554 555 os_memcpy(bssid, wpa_s->own_addr, ETH_ALEN); 556 if (p2p_get_group_num_members(wpa_s->p2p_group)) 557 return s; 558 empty = s; 559 } 560 } 561 562 return empty; 563 } 564 565 566 /* Find a persistent group where we are the GO */ 567 static struct wpa_ssid * 568 wpas_p2p_get_persistent_go(struct wpa_supplicant *wpa_s) 569 { 570 struct wpa_ssid *s; 571 572 for (s = wpa_s->conf->ssid; s; s = s->next) { 573 if (s->disabled == 2 && s->mode == WPAS_MODE_P2P_GO) 574 return s; 575 } 576 577 return NULL; 578 } 579 580 581 static u8 p2ps_group_capability(void *ctx, u8 incoming, u8 role) 582 { 583 struct wpa_supplicant *wpa_s = ctx, *tmp_wpa_s; 584 struct wpa_ssid *s; 585 u8 conncap = P2PS_SETUP_NONE; 586 unsigned int owned_members = 0; 587 unsigned int owner = 0; 588 unsigned int client = 0; 589 struct wpa_supplicant *go_wpa_s; 590 struct wpa_ssid *persistent_go; 591 int p2p_no_group_iface; 592 593 wpa_printf(MSG_DEBUG, "P2P: Conncap - in:%d role:%d", incoming, role); 594 595 /* 596 * For non-concurrent capable devices: 597 * If persistent_go, then no new. 598 * If GO, then no client. 599 * If client, then no GO. 600 */ 601 go_wpa_s = wpas_p2p_get_go_group(wpa_s); 602 persistent_go = wpas_p2p_get_persistent_go(wpa_s); 603 p2p_no_group_iface = wpa_s->conf->p2p_no_group_iface; 604 605 wpa_printf(MSG_DEBUG, "P2P: GO(iface)=%p persistent(ssid)=%p", 606 go_wpa_s, persistent_go); 607 608 for (tmp_wpa_s = wpa_s->global->ifaces; tmp_wpa_s; 609 tmp_wpa_s = tmp_wpa_s->next) { 610 for (s = tmp_wpa_s->conf->ssid; s; s = s->next) { 611 wpa_printf(MSG_DEBUG, 612 "P2P: sup:%p ssid:%p disabled:%d p2p:%d mode:%d", 613 tmp_wpa_s, s, s->disabled, 614 s->p2p_group, s->mode); 615 if (!s->disabled && s->p2p_group) { 616 if (s->mode == WPAS_MODE_P2P_GO) { 617 owned_members += 618 p2p_get_group_num_members( 619 tmp_wpa_s->p2p_group); 620 owner++; 621 } else 622 client++; 623 } 624 } 625 } 626 627 /* If not concurrent, restrict our choices */ 628 if (p2p_no_group_iface) { 629 wpa_printf(MSG_DEBUG, "P2P: p2p_no_group_iface"); 630 631 if (client) 632 return P2PS_SETUP_NONE; 633 634 if (go_wpa_s) { 635 if (role == P2PS_SETUP_CLIENT || 636 incoming == P2PS_SETUP_GROUP_OWNER || 637 p2p_client_limit_reached(go_wpa_s->p2p_group)) 638 return P2PS_SETUP_NONE; 639 640 return P2PS_SETUP_GROUP_OWNER; 641 } 642 643 if (persistent_go) { 644 if (role == P2PS_SETUP_NONE || role == P2PS_SETUP_NEW) { 645 if (!incoming) 646 return P2PS_SETUP_GROUP_OWNER | 647 P2PS_SETUP_CLIENT; 648 if (incoming == P2PS_SETUP_NEW) { 649 u8 r; 650 651 if (os_get_random(&r, sizeof(r)) < 0 || 652 (r & 1)) 653 return P2PS_SETUP_CLIENT; 654 return P2PS_SETUP_GROUP_OWNER; 655 } 656 } 657 } 658 } 659 660 /* If a required role has been specified, handle it here */ 661 if (role && role != P2PS_SETUP_NEW) { 662 switch (incoming) { 663 case P2PS_SETUP_NONE: 664 case P2PS_SETUP_NEW: 665 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT: 666 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_NEW: 667 conncap = role; 668 goto grp_owner; 669 670 case P2PS_SETUP_GROUP_OWNER: 671 /* 672 * Must be a complimentary role - cannot be a client to 673 * more than one peer. 674 */ 675 if (incoming == role || client) 676 return P2PS_SETUP_NONE; 677 678 return P2PS_SETUP_CLIENT; 679 680 case P2PS_SETUP_CLIENT: 681 /* Must be a complimentary role */ 682 if (incoming != role) { 683 conncap = P2PS_SETUP_GROUP_OWNER; 684 goto grp_owner; 685 } 686 687 default: 688 return P2PS_SETUP_NONE; 689 } 690 } 691 692 /* 693 * For now, we only will support ownership of one group, and being a 694 * client of one group. Therefore, if we have either an existing GO 695 * group, or an existing client group, we will not do a new GO 696 * negotiation, but rather try to re-use the existing groups. 697 */ 698 switch (incoming) { 699 case P2PS_SETUP_NONE: 700 case P2PS_SETUP_NEW: 701 if (client) 702 conncap = P2PS_SETUP_GROUP_OWNER; 703 else if (!owned_members) 704 conncap = P2PS_SETUP_NEW; 705 else if (incoming == P2PS_SETUP_NONE) 706 conncap = P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT; 707 else 708 conncap = P2PS_SETUP_CLIENT; 709 break; 710 711 case P2PS_SETUP_CLIENT: 712 conncap = P2PS_SETUP_GROUP_OWNER; 713 break; 714 715 case P2PS_SETUP_GROUP_OWNER: 716 if (!client) 717 conncap = P2PS_SETUP_CLIENT; 718 break; 719 720 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_NEW: 721 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT: 722 if (client) 723 conncap = P2PS_SETUP_GROUP_OWNER; 724 else { 725 u8 r; 726 727 if (os_get_random(&r, sizeof(r)) < 0 || 728 (r & 1)) 729 conncap = P2PS_SETUP_CLIENT; 730 else 731 conncap = P2PS_SETUP_GROUP_OWNER; 732 } 733 break; 734 735 default: 736 return P2PS_SETUP_NONE; 737 } 738 739 grp_owner: 740 if ((conncap & P2PS_SETUP_GROUP_OWNER) || 741 (!incoming && (conncap & P2PS_SETUP_NEW))) { 742 if (go_wpa_s && p2p_client_limit_reached(go_wpa_s->p2p_group)) 743 conncap &= ~P2PS_SETUP_GROUP_OWNER; 744 wpa_printf(MSG_DEBUG, "P2P: GOs:%d members:%d conncap:%d", 745 owner, owned_members, conncap); 746 747 s = wpas_p2p_get_persistent_go(wpa_s); 748 749 if (!s && !owner && p2p_no_group_iface) { 750 p2p_set_intended_addr(wpa_s->global->p2p, 751 wpa_s->own_addr); 752 } else if (!s && !owner) { 753 if (wpas_p2p_add_group_interface(wpa_s, 754 WPA_IF_P2P_GO) < 0) { 755 wpa_printf(MSG_ERROR, 756 "P2P: Failed to allocate a new interface for the group"); 757 return P2PS_SETUP_NONE; 758 } 759 wpa_s->global->pending_group_iface_for_p2ps = 1; 760 p2p_set_intended_addr(wpa_s->global->p2p, 761 wpa_s->pending_interface_addr); 762 } 763 } 764 765 return conncap; 766 } 767 768 769 static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s, 770 enum p2p_group_removal_reason removal_reason) 771 { 772 struct wpa_ssid *ssid; 773 char *gtype; 774 const char *reason; 775 776 ssid = wpa_s->current_ssid; 777 if (ssid == NULL) { 778 /* 779 * The current SSID was not known, but there may still be a 780 * pending P2P group interface waiting for provisioning or a 781 * P2P group that is trying to reconnect. 782 */ 783 ssid = wpa_s->conf->ssid; 784 while (ssid) { 785 if (ssid->p2p_group && ssid->disabled != 2) 786 break; 787 ssid = ssid->next; 788 } 789 if (ssid == NULL && 790 wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE) 791 { 792 wpa_printf(MSG_ERROR, "P2P: P2P group interface " 793 "not found"); 794 return -1; 795 } 796 } 797 if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO) 798 gtype = "GO"; 799 else if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT || 800 (ssid && ssid->mode == WPAS_MODE_INFRA)) { 801 wpa_s->reassociate = 0; 802 wpa_s->disconnected = 1; 803 gtype = "client"; 804 } else 805 gtype = "GO"; 806 807 if (removal_reason != P2P_GROUP_REMOVAL_SILENT && ssid) 808 wpas_notify_p2p_group_removed(wpa_s, ssid, gtype); 809 810 if (os_strcmp(gtype, "client") == 0) { 811 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); 812 if (eloop_is_timeout_registered(wpas_p2p_psk_failure_removal, 813 wpa_s, NULL)) { 814 wpa_printf(MSG_DEBUG, 815 "P2P: PSK failure removal was scheduled, so use PSK failure as reason for group removal"); 816 removal_reason = P2P_GROUP_REMOVAL_PSK_FAILURE; 817 eloop_cancel_timeout(wpas_p2p_psk_failure_removal, 818 wpa_s, NULL); 819 } 820 } 821 822 if (wpa_s->cross_connect_in_use) { 823 wpa_s->cross_connect_in_use = 0; 824 wpa_msg_global(wpa_s->parent, MSG_INFO, 825 P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s", 826 wpa_s->ifname, wpa_s->cross_connect_uplink); 827 } 828 switch (removal_reason) { 829 case P2P_GROUP_REMOVAL_REQUESTED: 830 reason = " reason=REQUESTED"; 831 break; 832 case P2P_GROUP_REMOVAL_FORMATION_FAILED: 833 reason = " reason=FORMATION_FAILED"; 834 break; 835 case P2P_GROUP_REMOVAL_IDLE_TIMEOUT: 836 reason = " reason=IDLE"; 837 break; 838 case P2P_GROUP_REMOVAL_UNAVAILABLE: 839 reason = " reason=UNAVAILABLE"; 840 break; 841 case P2P_GROUP_REMOVAL_GO_ENDING_SESSION: 842 reason = " reason=GO_ENDING_SESSION"; 843 break; 844 case P2P_GROUP_REMOVAL_PSK_FAILURE: 845 reason = " reason=PSK_FAILURE"; 846 break; 847 case P2P_GROUP_REMOVAL_FREQ_CONFLICT: 848 reason = " reason=FREQ_CONFLICT"; 849 break; 850 default: 851 reason = ""; 852 break; 853 } 854 if (removal_reason != P2P_GROUP_REMOVAL_SILENT) { 855 wpa_msg_global(wpa_s->parent, MSG_INFO, 856 P2P_EVENT_GROUP_REMOVED "%s %s%s", 857 wpa_s->ifname, gtype, reason); 858 } 859 860 if (eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL) > 0) 861 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group freq_conflict timeout"); 862 if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0) 863 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout"); 864 if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 865 wpa_s->parent, NULL) > 0) { 866 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group formation " 867 "timeout"); 868 wpa_s->p2p_in_provisioning = 0; 869 } 870 871 wpa_s->p2p_in_invitation = 0; 872 873 /* 874 * Make sure wait for the first client does not remain active after the 875 * group has been removed. 876 */ 877 wpa_s->global->p2p_go_wait_client.sec = 0; 878 879 if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) { 880 struct wpa_global *global; 881 char *ifname; 882 enum wpa_driver_if_type type; 883 wpa_printf(MSG_DEBUG, "P2P: Remove group interface %s", 884 wpa_s->ifname); 885 global = wpa_s->global; 886 ifname = os_strdup(wpa_s->ifname); 887 type = wpas_p2p_if_type(wpa_s->p2p_group_interface); 888 eloop_cancel_timeout(run_wpas_p2p_disconnect, wpa_s, NULL); 889 wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0); 890 wpa_s = global->ifaces; 891 if (wpa_s && ifname) 892 wpa_drv_if_remove(wpa_s, type, ifname); 893 os_free(ifname); 894 return 1; 895 } 896 897 if (!wpa_s->p2p_go_group_formation_completed) { 898 wpa_s->global->p2p_group_formation = NULL; 899 wpa_s->p2p_in_provisioning = 0; 900 } 901 902 wpa_s->show_group_started = 0; 903 os_free(wpa_s->go_params); 904 wpa_s->go_params = NULL; 905 906 os_free(wpa_s->p2p_group_common_freqs); 907 wpa_s->p2p_group_common_freqs = NULL; 908 wpa_s->p2p_group_common_freqs_num = 0; 909 910 wpa_s->waiting_presence_resp = 0; 911 912 wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network"); 913 if (ssid && (ssid->p2p_group || 914 ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION || 915 (ssid->key_mgmt & WPA_KEY_MGMT_WPS))) { 916 int id = ssid->id; 917 if (ssid == wpa_s->current_ssid) { 918 wpa_sm_set_config(wpa_s->wpa, NULL); 919 eapol_sm_notify_config(wpa_s->eapol, NULL, NULL); 920 wpa_s->current_ssid = NULL; 921 } 922 /* 923 * Networks objects created during any P2P activities are not 924 * exposed out as they might/will confuse certain non-P2P aware 925 * applications since these network objects won't behave like 926 * regular ones. 927 * 928 * Likewise, we don't send out network removed signals for such 929 * network objects. 930 */ 931 wpa_config_remove_network(wpa_s->conf, id); 932 wpa_supplicant_clear_status(wpa_s); 933 wpa_supplicant_cancel_sched_scan(wpa_s); 934 } else { 935 wpa_printf(MSG_DEBUG, "P2P: Temporary group network not " 936 "found"); 937 } 938 if (wpa_s->ap_iface) 939 wpa_supplicant_ap_deinit(wpa_s); 940 else 941 wpa_drv_deinit_p2p_cli(wpa_s); 942 943 return 0; 944 } 945 946 947 static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s, 948 u8 *go_dev_addr, 949 const u8 *ssid, size_t ssid_len) 950 { 951 struct wpa_bss *bss; 952 const u8 *bssid; 953 struct wpabuf *p2p; 954 u8 group_capab; 955 const u8 *addr; 956 957 if (wpa_s->go_params) 958 bssid = wpa_s->go_params->peer_interface_addr; 959 else 960 bssid = wpa_s->bssid; 961 962 bss = wpa_bss_get(wpa_s, bssid, ssid, ssid_len); 963 if (bss == NULL && wpa_s->go_params && 964 !is_zero_ether_addr(wpa_s->go_params->peer_device_addr)) 965 bss = wpa_bss_get_p2p_dev_addr( 966 wpa_s, wpa_s->go_params->peer_device_addr); 967 if (bss == NULL) { 968 u8 iface_addr[ETH_ALEN]; 969 if (p2p_get_interface_addr(wpa_s->global->p2p, bssid, 970 iface_addr) == 0) 971 bss = wpa_bss_get(wpa_s, iface_addr, ssid, ssid_len); 972 } 973 if (bss == NULL) { 974 wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether " 975 "group is persistent - BSS " MACSTR " not found", 976 MAC2STR(bssid)); 977 return 0; 978 } 979 980 p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE); 981 if (p2p == NULL) 982 p2p = wpa_bss_get_vendor_ie_multi_beacon(bss, 983 P2P_IE_VENDOR_TYPE); 984 if (p2p == NULL) { 985 wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether " 986 "group is persistent - BSS " MACSTR 987 " did not include P2P IE", MAC2STR(bssid)); 988 wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs", 989 (u8 *) (bss + 1), bss->ie_len); 990 wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs", 991 ((u8 *) bss + 1) + bss->ie_len, 992 bss->beacon_ie_len); 993 return 0; 994 } 995 996 group_capab = p2p_get_group_capab(p2p); 997 addr = p2p_get_go_dev_addr(p2p); 998 wpa_printf(MSG_DEBUG, "P2P: Checking whether group is persistent: " 999 "group_capab=0x%x", group_capab); 1000 if (addr) { 1001 os_memcpy(go_dev_addr, addr, ETH_ALEN); 1002 wpa_printf(MSG_DEBUG, "P2P: GO Device Address " MACSTR, 1003 MAC2STR(addr)); 1004 } else 1005 os_memset(go_dev_addr, 0, ETH_ALEN); 1006 wpabuf_free(p2p); 1007 1008 wpa_printf(MSG_DEBUG, "P2P: BSS " MACSTR " group_capab=0x%x " 1009 "go_dev_addr=" MACSTR, 1010 MAC2STR(bssid), group_capab, MAC2STR(go_dev_addr)); 1011 1012 return group_capab & P2P_GROUP_CAPAB_PERSISTENT_GROUP; 1013 } 1014 1015 1016 static int wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s, 1017 struct wpa_ssid *ssid, 1018 const u8 *go_dev_addr) 1019 { 1020 struct wpa_ssid *s; 1021 int changed = 0; 1022 1023 wpa_printf(MSG_DEBUG, "P2P: Storing credentials for a persistent " 1024 "group (GO Dev Addr " MACSTR ")", MAC2STR(go_dev_addr)); 1025 for (s = wpa_s->conf->ssid; s; s = s->next) { 1026 if (s->disabled == 2 && 1027 os_memcmp(go_dev_addr, s->bssid, ETH_ALEN) == 0 && 1028 s->ssid_len == ssid->ssid_len && 1029 os_memcmp(ssid->ssid, s->ssid, ssid->ssid_len) == 0) 1030 break; 1031 } 1032 1033 if (s) { 1034 wpa_printf(MSG_DEBUG, "P2P: Update existing persistent group " 1035 "entry"); 1036 if (ssid->passphrase && !s->passphrase) 1037 changed = 1; 1038 else if (ssid->passphrase && s->passphrase && 1039 os_strcmp(ssid->passphrase, s->passphrase) != 0) 1040 changed = 1; 1041 } else { 1042 wpa_printf(MSG_DEBUG, "P2P: Create a new persistent group " 1043 "entry"); 1044 changed = 1; 1045 s = wpa_config_add_network(wpa_s->conf); 1046 if (s == NULL) 1047 return -1; 1048 1049 /* 1050 * Instead of network_added we emit persistent_group_added 1051 * notification. Also to keep the defense checks in 1052 * persistent_group obj registration method, we set the 1053 * relevant flags in s to designate it as a persistent group. 1054 */ 1055 s->p2p_group = 1; 1056 s->p2p_persistent_group = 1; 1057 wpas_notify_persistent_group_added(wpa_s, s); 1058 wpa_config_set_network_defaults(s); 1059 } 1060 1061 s->p2p_group = 1; 1062 s->p2p_persistent_group = 1; 1063 s->disabled = 2; 1064 s->bssid_set = 1; 1065 os_memcpy(s->bssid, go_dev_addr, ETH_ALEN); 1066 s->mode = ssid->mode; 1067 s->auth_alg = WPA_AUTH_ALG_OPEN; 1068 s->key_mgmt = WPA_KEY_MGMT_PSK; 1069 s->proto = WPA_PROTO_RSN; 1070 s->pairwise_cipher = WPA_CIPHER_CCMP; 1071 s->export_keys = 1; 1072 if (ssid->passphrase) { 1073 os_free(s->passphrase); 1074 s->passphrase = os_strdup(ssid->passphrase); 1075 } 1076 if (ssid->psk_set) { 1077 s->psk_set = 1; 1078 os_memcpy(s->psk, ssid->psk, 32); 1079 } 1080 if (s->passphrase && !s->psk_set) 1081 wpa_config_update_psk(s); 1082 if (s->ssid == NULL || s->ssid_len < ssid->ssid_len) { 1083 os_free(s->ssid); 1084 s->ssid = os_malloc(ssid->ssid_len); 1085 } 1086 if (s->ssid) { 1087 s->ssid_len = ssid->ssid_len; 1088 os_memcpy(s->ssid, ssid->ssid, s->ssid_len); 1089 } 1090 if (ssid->mode == WPAS_MODE_P2P_GO && wpa_s->global->add_psk) { 1091 dl_list_add(&s->psk_list, &wpa_s->global->add_psk->list); 1092 wpa_s->global->add_psk = NULL; 1093 changed = 1; 1094 } 1095 1096 if (changed && wpa_s->conf->update_config && 1097 wpa_config_write(wpa_s->confname, wpa_s->conf)) { 1098 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration"); 1099 } 1100 1101 return s->id; 1102 } 1103 1104 1105 static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s, 1106 const u8 *addr) 1107 { 1108 struct wpa_ssid *ssid, *s; 1109 u8 *n; 1110 size_t i; 1111 int found = 0; 1112 1113 ssid = wpa_s->current_ssid; 1114 if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO || 1115 !ssid->p2p_persistent_group) 1116 return; 1117 1118 for (s = wpa_s->parent->conf->ssid; s; s = s->next) { 1119 if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO) 1120 continue; 1121 1122 if (s->ssid_len == ssid->ssid_len && 1123 os_memcmp(s->ssid, ssid->ssid, s->ssid_len) == 0) 1124 break; 1125 } 1126 1127 if (s == NULL) 1128 return; 1129 1130 for (i = 0; s->p2p_client_list && i < s->num_p2p_clients; i++) { 1131 if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN, addr, 1132 ETH_ALEN) != 0) 1133 continue; 1134 1135 if (i == s->num_p2p_clients - 1) 1136 return; /* already the most recent entry */ 1137 1138 /* move the entry to mark it most recent */ 1139 os_memmove(s->p2p_client_list + i * 2 * ETH_ALEN, 1140 s->p2p_client_list + (i + 1) * 2 * ETH_ALEN, 1141 (s->num_p2p_clients - i - 1) * 2 * ETH_ALEN); 1142 os_memcpy(s->p2p_client_list + 1143 (s->num_p2p_clients - 1) * 2 * ETH_ALEN, addr, 1144 ETH_ALEN); 1145 os_memset(s->p2p_client_list + 1146 (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN, 1147 0xff, ETH_ALEN); 1148 found = 1; 1149 break; 1150 } 1151 1152 if (!found && s->num_p2p_clients < P2P_MAX_STORED_CLIENTS) { 1153 n = os_realloc_array(s->p2p_client_list, 1154 s->num_p2p_clients + 1, 2 * ETH_ALEN); 1155 if (n == NULL) 1156 return; 1157 os_memcpy(n + s->num_p2p_clients * 2 * ETH_ALEN, addr, 1158 ETH_ALEN); 1159 os_memset(n + s->num_p2p_clients * 2 * ETH_ALEN + ETH_ALEN, 1160 0xff, ETH_ALEN); 1161 s->p2p_client_list = n; 1162 s->num_p2p_clients++; 1163 } else if (!found && s->p2p_client_list) { 1164 /* Not enough room for an additional entry - drop the oldest 1165 * entry */ 1166 os_memmove(s->p2p_client_list, 1167 s->p2p_client_list + 2 * ETH_ALEN, 1168 (s->num_p2p_clients - 1) * 2 * ETH_ALEN); 1169 os_memcpy(s->p2p_client_list + 1170 (s->num_p2p_clients - 1) * 2 * ETH_ALEN, 1171 addr, ETH_ALEN); 1172 os_memset(s->p2p_client_list + 1173 (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN, 1174 0xff, ETH_ALEN); 1175 } 1176 1177 if (wpa_s->parent->conf->update_config && 1178 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf)) 1179 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration"); 1180 } 1181 1182 1183 static void wpas_p2p_group_started(struct wpa_supplicant *wpa_s, 1184 int go, struct wpa_ssid *ssid, int freq, 1185 const u8 *psk, const char *passphrase, 1186 const u8 *go_dev_addr, int persistent, 1187 const char *extra) 1188 { 1189 const char *ssid_txt; 1190 char psk_txt[65]; 1191 1192 if (psk) 1193 wpa_snprintf_hex(psk_txt, sizeof(psk_txt), psk, 32); 1194 else 1195 psk_txt[0] = '\0'; 1196 1197 if (ssid) 1198 ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len); 1199 else 1200 ssid_txt = ""; 1201 1202 if (passphrase && passphrase[0] == '\0') 1203 passphrase = NULL; 1204 1205 /* 1206 * Include PSK/passphrase only in the control interface message and 1207 * leave it out from the debug log entry. 1208 */ 1209 wpa_msg_global_ctrl(wpa_s->parent, MSG_INFO, 1210 P2P_EVENT_GROUP_STARTED 1211 "%s %s ssid=\"%s\" freq=%d%s%s%s%s%s go_dev_addr=" 1212 MACSTR "%s%s", 1213 wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq, 1214 psk ? " psk=" : "", psk_txt, 1215 passphrase ? " passphrase=\"" : "", 1216 passphrase ? passphrase : "", 1217 passphrase ? "\"" : "", 1218 MAC2STR(go_dev_addr), 1219 persistent ? " [PERSISTENT]" : "", extra); 1220 wpa_printf(MSG_INFO, P2P_EVENT_GROUP_STARTED 1221 "%s %s ssid=\"%s\" freq=%d go_dev_addr=" MACSTR "%s%s", 1222 wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq, 1223 MAC2STR(go_dev_addr), persistent ? " [PERSISTENT]" : "", 1224 extra); 1225 } 1226 1227 1228 static void wpas_group_formation_completed(struct wpa_supplicant *wpa_s, 1229 int success) 1230 { 1231 struct wpa_ssid *ssid; 1232 int client; 1233 int persistent; 1234 u8 go_dev_addr[ETH_ALEN]; 1235 int network_id = -1; 1236 1237 /* 1238 * This callback is likely called for the main interface. Update wpa_s 1239 * to use the group interface if a new interface was created for the 1240 * group. 1241 */ 1242 if (wpa_s->global->p2p_group_formation) 1243 wpa_s = wpa_s->global->p2p_group_formation; 1244 if (wpa_s->p2p_go_group_formation_completed) { 1245 wpa_s->global->p2p_group_formation = NULL; 1246 wpa_s->p2p_in_provisioning = 0; 1247 } 1248 wpa_s->p2p_in_invitation = 0; 1249 wpa_s->group_formation_reported = 1; 1250 1251 if (!success) { 1252 wpa_msg_global(wpa_s->parent, MSG_INFO, 1253 P2P_EVENT_GROUP_FORMATION_FAILURE); 1254 wpas_p2p_group_delete(wpa_s, 1255 P2P_GROUP_REMOVAL_FORMATION_FAILED); 1256 return; 1257 } 1258 1259 wpa_msg_global(wpa_s->parent, MSG_INFO, 1260 P2P_EVENT_GROUP_FORMATION_SUCCESS); 1261 1262 ssid = wpa_s->current_ssid; 1263 if (ssid && ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) { 1264 ssid->mode = WPAS_MODE_P2P_GO; 1265 p2p_group_notif_formation_done(wpa_s->p2p_group); 1266 wpa_supplicant_ap_mac_addr_filter(wpa_s, NULL); 1267 } 1268 1269 persistent = 0; 1270 if (ssid) { 1271 client = ssid->mode == WPAS_MODE_INFRA; 1272 if (ssid->mode == WPAS_MODE_P2P_GO) { 1273 persistent = ssid->p2p_persistent_group; 1274 os_memcpy(go_dev_addr, wpa_s->global->p2p_dev_addr, 1275 ETH_ALEN); 1276 } else 1277 persistent = wpas_p2p_persistent_group(wpa_s, 1278 go_dev_addr, 1279 ssid->ssid, 1280 ssid->ssid_len); 1281 } else { 1282 client = wpa_s->p2p_group_interface == 1283 P2P_GROUP_INTERFACE_CLIENT; 1284 os_memset(go_dev_addr, 0, ETH_ALEN); 1285 } 1286 1287 wpa_s->show_group_started = 0; 1288 if (client) { 1289 /* 1290 * Indicate event only after successfully completed 4-way 1291 * handshake, i.e., when the interface is ready for data 1292 * packets. 1293 */ 1294 wpa_s->show_group_started = 1; 1295 } else { 1296 wpas_p2p_group_started(wpa_s, 1, ssid, 1297 ssid ? ssid->frequency : 0, 1298 ssid && ssid->passphrase == NULL && 1299 ssid->psk_set ? ssid->psk : NULL, 1300 ssid ? ssid->passphrase : NULL, 1301 go_dev_addr, persistent, ""); 1302 wpas_p2p_cross_connect_setup(wpa_s); 1303 wpas_p2p_set_group_idle_timeout(wpa_s); 1304 } 1305 1306 if (persistent) 1307 network_id = wpas_p2p_store_persistent_group(wpa_s->parent, 1308 ssid, go_dev_addr); 1309 else { 1310 os_free(wpa_s->global->add_psk); 1311 wpa_s->global->add_psk = NULL; 1312 } 1313 if (network_id < 0 && ssid) 1314 network_id = ssid->id; 1315 if (!client) { 1316 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0); 1317 os_get_reltime(&wpa_s->global->p2p_go_wait_client); 1318 } 1319 } 1320 1321 1322 struct send_action_work { 1323 unsigned int freq; 1324 u8 dst[ETH_ALEN]; 1325 u8 src[ETH_ALEN]; 1326 u8 bssid[ETH_ALEN]; 1327 size_t len; 1328 unsigned int wait_time; 1329 u8 buf[0]; 1330 }; 1331 1332 1333 static void wpas_p2p_send_action_work_timeout(void *eloop_ctx, 1334 void *timeout_ctx) 1335 { 1336 struct wpa_supplicant *wpa_s = eloop_ctx; 1337 1338 if (!wpa_s->p2p_send_action_work) 1339 return; 1340 1341 wpa_printf(MSG_DEBUG, "P2P: Send Action frame radio work timed out"); 1342 os_free(wpa_s->p2p_send_action_work->ctx); 1343 radio_work_done(wpa_s->p2p_send_action_work); 1344 wpa_s->p2p_send_action_work = NULL; 1345 } 1346 1347 1348 static void wpas_p2p_action_tx_clear(struct wpa_supplicant *wpa_s) 1349 { 1350 if (wpa_s->p2p_send_action_work) { 1351 struct send_action_work *awork; 1352 awork = wpa_s->p2p_send_action_work->ctx; 1353 if (awork->wait_time == 0) { 1354 os_free(awork); 1355 radio_work_done(wpa_s->p2p_send_action_work); 1356 wpa_s->p2p_send_action_work = NULL; 1357 } else { 1358 /* 1359 * In theory, this should not be needed, but number of 1360 * places in the P2P code is still using non-zero wait 1361 * time for the last Action frame in the sequence and 1362 * some of these do not call send_action_done(). 1363 */ 1364 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, 1365 wpa_s, NULL); 1366 eloop_register_timeout( 1367 0, awork->wait_time * 1000, 1368 wpas_p2p_send_action_work_timeout, 1369 wpa_s, NULL); 1370 } 1371 } 1372 } 1373 1374 1375 static void wpas_p2p_send_action_tx_status(struct wpa_supplicant *wpa_s, 1376 unsigned int freq, 1377 const u8 *dst, const u8 *src, 1378 const u8 *bssid, 1379 const u8 *data, size_t data_len, 1380 enum offchannel_send_action_result 1381 result) 1382 { 1383 enum p2p_send_action_result res = P2P_SEND_ACTION_SUCCESS; 1384 1385 wpas_p2p_action_tx_clear(wpa_s); 1386 1387 if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled) 1388 return; 1389 1390 switch (result) { 1391 case OFFCHANNEL_SEND_ACTION_SUCCESS: 1392 res = P2P_SEND_ACTION_SUCCESS; 1393 break; 1394 case OFFCHANNEL_SEND_ACTION_NO_ACK: 1395 res = P2P_SEND_ACTION_NO_ACK; 1396 break; 1397 case OFFCHANNEL_SEND_ACTION_FAILED: 1398 res = P2P_SEND_ACTION_FAILED; 1399 break; 1400 } 1401 1402 p2p_send_action_cb(wpa_s->global->p2p, freq, dst, src, bssid, res); 1403 1404 if (result != OFFCHANNEL_SEND_ACTION_SUCCESS && 1405 wpa_s->pending_pd_before_join && 1406 (os_memcmp(dst, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 || 1407 os_memcmp(dst, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0) && 1408 wpa_s->p2p_fallback_to_go_neg) { 1409 wpa_s->pending_pd_before_join = 0; 1410 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No ACK for PD Req " 1411 "during p2p_connect-auto"); 1412 wpa_msg_global(wpa_s->parent, MSG_INFO, 1413 P2P_EVENT_FALLBACK_TO_GO_NEG 1414 "reason=no-ACK-to-PD-Req"); 1415 wpas_p2p_fallback_to_go_neg(wpa_s, 0); 1416 return; 1417 } 1418 } 1419 1420 1421 static void wpas_send_action_cb(struct wpa_radio_work *work, int deinit) 1422 { 1423 struct wpa_supplicant *wpa_s = work->wpa_s; 1424 struct send_action_work *awork = work->ctx; 1425 1426 if (deinit) { 1427 if (work->started) { 1428 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, 1429 wpa_s, NULL); 1430 wpa_s->p2p_send_action_work = NULL; 1431 offchannel_send_action_done(wpa_s); 1432 } 1433 os_free(awork); 1434 return; 1435 } 1436 1437 if (offchannel_send_action(wpa_s, awork->freq, awork->dst, awork->src, 1438 awork->bssid, awork->buf, awork->len, 1439 awork->wait_time, 1440 wpas_p2p_send_action_tx_status, 1) < 0) { 1441 os_free(awork); 1442 radio_work_done(work); 1443 return; 1444 } 1445 wpa_s->p2p_send_action_work = work; 1446 } 1447 1448 1449 static int wpas_send_action_work(struct wpa_supplicant *wpa_s, 1450 unsigned int freq, const u8 *dst, 1451 const u8 *src, const u8 *bssid, const u8 *buf, 1452 size_t len, unsigned int wait_time) 1453 { 1454 struct send_action_work *awork; 1455 1456 if (wpa_s->p2p_send_action_work) { 1457 wpa_printf(MSG_DEBUG, "P2P: Cannot schedule new p2p-send-action work since one is already pending"); 1458 return -1; 1459 } 1460 1461 awork = os_zalloc(sizeof(*awork) + len); 1462 if (awork == NULL) 1463 return -1; 1464 1465 awork->freq = freq; 1466 os_memcpy(awork->dst, dst, ETH_ALEN); 1467 os_memcpy(awork->src, src, ETH_ALEN); 1468 os_memcpy(awork->bssid, bssid, ETH_ALEN); 1469 awork->len = len; 1470 awork->wait_time = wait_time; 1471 os_memcpy(awork->buf, buf, len); 1472 1473 if (radio_add_work(wpa_s, freq, "p2p-send-action", 0, 1474 wpas_send_action_cb, awork) < 0) { 1475 os_free(awork); 1476 return -1; 1477 } 1478 1479 return 0; 1480 } 1481 1482 1483 static int wpas_send_action(void *ctx, unsigned int freq, const u8 *dst, 1484 const u8 *src, const u8 *bssid, const u8 *buf, 1485 size_t len, unsigned int wait_time) 1486 { 1487 struct wpa_supplicant *wpa_s = ctx; 1488 int listen_freq = -1, send_freq = -1; 1489 1490 if (wpa_s->p2p_listen_work) 1491 listen_freq = wpa_s->p2p_listen_work->freq; 1492 if (wpa_s->p2p_send_action_work) 1493 send_freq = wpa_s->p2p_send_action_work->freq; 1494 if (listen_freq != (int) freq && send_freq != (int) freq) { 1495 wpa_printf(MSG_DEBUG, "P2P: Schedule new radio work for Action frame TX (listen_freq=%d send_freq=%d)", 1496 listen_freq, send_freq); 1497 return wpas_send_action_work(wpa_s, freq, dst, src, bssid, buf, 1498 len, wait_time); 1499 } 1500 1501 wpa_printf(MSG_DEBUG, "P2P: Use ongoing radio work for Action frame TX"); 1502 return offchannel_send_action(wpa_s, freq, dst, src, bssid, buf, len, 1503 wait_time, 1504 wpas_p2p_send_action_tx_status, 1); 1505 } 1506 1507 1508 static void wpas_send_action_done(void *ctx) 1509 { 1510 struct wpa_supplicant *wpa_s = ctx; 1511 1512 if (wpa_s->p2p_send_action_work) { 1513 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, 1514 wpa_s, NULL); 1515 os_free(wpa_s->p2p_send_action_work->ctx); 1516 radio_work_done(wpa_s->p2p_send_action_work); 1517 wpa_s->p2p_send_action_work = NULL; 1518 } 1519 1520 offchannel_send_action_done(wpa_s); 1521 } 1522 1523 1524 static int wpas_copy_go_neg_results(struct wpa_supplicant *wpa_s, 1525 struct p2p_go_neg_results *params) 1526 { 1527 if (wpa_s->go_params == NULL) { 1528 wpa_s->go_params = os_malloc(sizeof(*params)); 1529 if (wpa_s->go_params == NULL) 1530 return -1; 1531 } 1532 os_memcpy(wpa_s->go_params, params, sizeof(*params)); 1533 return 0; 1534 } 1535 1536 1537 static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s, 1538 struct p2p_go_neg_results *res) 1539 { 1540 wpa_s->group_formation_reported = 0; 1541 wpa_printf(MSG_DEBUG, "P2P: Start WPS Enrollee for peer " MACSTR 1542 " dev_addr " MACSTR " wps_method %d", 1543 MAC2STR(res->peer_interface_addr), 1544 MAC2STR(res->peer_device_addr), res->wps_method); 1545 wpa_hexdump_ascii(MSG_DEBUG, "P2P: Start WPS Enrollee for SSID", 1546 res->ssid, res->ssid_len); 1547 wpa_supplicant_ap_deinit(wpa_s); 1548 wpas_copy_go_neg_results(wpa_s, res); 1549 if (res->wps_method == WPS_PBC) { 1550 wpas_wps_start_pbc(wpa_s, res->peer_interface_addr, 1); 1551 #ifdef CONFIG_WPS_NFC 1552 } else if (res->wps_method == WPS_NFC) { 1553 wpas_wps_start_nfc(wpa_s, res->peer_device_addr, 1554 res->peer_interface_addr, 1555 wpa_s->parent->p2p_oob_dev_pw, 1556 wpa_s->parent->p2p_oob_dev_pw_id, 1, 1557 wpa_s->parent->p2p_oob_dev_pw_id == 1558 DEV_PW_NFC_CONNECTION_HANDOVER ? 1559 wpa_s->parent->p2p_peer_oob_pubkey_hash : 1560 NULL, 1561 NULL, 0, 0); 1562 #endif /* CONFIG_WPS_NFC */ 1563 } else { 1564 u16 dev_pw_id = DEV_PW_DEFAULT; 1565 if (wpa_s->p2p_wps_method == WPS_P2PS) 1566 dev_pw_id = DEV_PW_P2PS_DEFAULT; 1567 if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD) 1568 dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED; 1569 wpas_wps_start_pin(wpa_s, res->peer_interface_addr, 1570 wpa_s->p2p_pin, 1, dev_pw_id); 1571 } 1572 } 1573 1574 1575 static void wpas_p2p_add_psk_list(struct wpa_supplicant *wpa_s, 1576 struct wpa_ssid *ssid) 1577 { 1578 struct wpa_ssid *persistent; 1579 struct psk_list_entry *psk; 1580 struct hostapd_data *hapd; 1581 1582 if (!wpa_s->ap_iface) 1583 return; 1584 1585 persistent = wpas_p2p_get_persistent(wpa_s->parent, NULL, ssid->ssid, 1586 ssid->ssid_len); 1587 if (persistent == NULL) 1588 return; 1589 1590 hapd = wpa_s->ap_iface->bss[0]; 1591 1592 dl_list_for_each(psk, &persistent->psk_list, struct psk_list_entry, 1593 list) { 1594 struct hostapd_wpa_psk *hpsk; 1595 1596 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add persistent group PSK entry for " 1597 MACSTR " psk=%d", 1598 MAC2STR(psk->addr), psk->p2p); 1599 hpsk = os_zalloc(sizeof(*hpsk)); 1600 if (hpsk == NULL) 1601 break; 1602 os_memcpy(hpsk->psk, psk->psk, PMK_LEN); 1603 if (psk->p2p) 1604 os_memcpy(hpsk->p2p_dev_addr, psk->addr, ETH_ALEN); 1605 else 1606 os_memcpy(hpsk->addr, psk->addr, ETH_ALEN); 1607 hpsk->next = hapd->conf->ssid.wpa_psk; 1608 hapd->conf->ssid.wpa_psk = hpsk; 1609 } 1610 } 1611 1612 1613 static void p2p_go_dump_common_freqs(struct wpa_supplicant *wpa_s) 1614 { 1615 unsigned int i; 1616 1617 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Common group frequencies (len=%u):", 1618 wpa_s->p2p_group_common_freqs_num); 1619 1620 for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) 1621 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d", 1622 i, wpa_s->p2p_group_common_freqs[i]); 1623 } 1624 1625 1626 static void p2p_go_save_group_common_freqs(struct wpa_supplicant *wpa_s, 1627 struct p2p_go_neg_results *params) 1628 { 1629 unsigned int i, len = int_array_len(wpa_s->go_params->freq_list); 1630 1631 wpa_s->p2p_group_common_freqs_num = 0; 1632 os_free(wpa_s->p2p_group_common_freqs); 1633 wpa_s->p2p_group_common_freqs = os_calloc(len, sizeof(int)); 1634 if (!wpa_s->p2p_group_common_freqs) 1635 return; 1636 1637 for (i = 0; i < len; i++) { 1638 if (!wpa_s->go_params->freq_list[i]) 1639 break; 1640 wpa_s->p2p_group_common_freqs[i] = 1641 wpa_s->go_params->freq_list[i]; 1642 } 1643 wpa_s->p2p_group_common_freqs_num = i; 1644 } 1645 1646 1647 static void p2p_config_write(struct wpa_supplicant *wpa_s) 1648 { 1649 #ifndef CONFIG_NO_CONFIG_WRITE 1650 if (wpa_s->parent->conf->update_config && 1651 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf)) 1652 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration"); 1653 #endif /* CONFIG_NO_CONFIG_WRITE */ 1654 } 1655 1656 1657 static void p2p_go_configured(void *ctx, void *data) 1658 { 1659 struct wpa_supplicant *wpa_s = ctx; 1660 struct p2p_go_neg_results *params = data; 1661 struct wpa_ssid *ssid; 1662 int network_id = -1; 1663 1664 p2p_go_save_group_common_freqs(wpa_s, params); 1665 p2p_go_dump_common_freqs(wpa_s); 1666 1667 ssid = wpa_s->current_ssid; 1668 if (ssid && ssid->mode == WPAS_MODE_P2P_GO) { 1669 wpa_printf(MSG_DEBUG, "P2P: Group setup without provisioning"); 1670 if (wpa_s->global->p2p_group_formation == wpa_s) 1671 wpa_s->global->p2p_group_formation = NULL; 1672 wpas_p2p_group_started(wpa_s, 1, ssid, ssid->frequency, 1673 params->passphrase[0] == '\0' ? 1674 params->psk : NULL, 1675 params->passphrase, 1676 wpa_s->global->p2p_dev_addr, 1677 params->persistent_group, ""); 1678 wpa_s->group_formation_reported = 1; 1679 1680 if (wpa_s->parent->p2ps_join_addr_valid) { 1681 wpa_dbg(wpa_s, MSG_DEBUG, 1682 "P2PS: Setting default PIN for " MACSTR, 1683 MAC2STR(wpa_s->parent->p2ps_join_addr)); 1684 wpa_supplicant_ap_wps_pin(wpa_s, 1685 wpa_s->parent->p2ps_join_addr, 1686 "12345670", NULL, 0, 0); 1687 wpa_s->parent->p2ps_join_addr_valid = 0; 1688 } 1689 1690 os_get_reltime(&wpa_s->global->p2p_go_wait_client); 1691 if (params->persistent_group) { 1692 network_id = wpas_p2p_store_persistent_group( 1693 wpa_s->parent, ssid, 1694 wpa_s->global->p2p_dev_addr); 1695 wpas_p2p_add_psk_list(wpa_s, ssid); 1696 } 1697 if (network_id < 0) 1698 network_id = ssid->id; 1699 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0); 1700 wpas_p2p_cross_connect_setup(wpa_s); 1701 wpas_p2p_set_group_idle_timeout(wpa_s); 1702 1703 if (wpa_s->p2p_first_connection_timeout) { 1704 wpa_dbg(wpa_s, MSG_DEBUG, 1705 "P2P: Start group formation timeout of %d seconds until first data connection on GO", 1706 wpa_s->p2p_first_connection_timeout); 1707 wpa_s->p2p_go_group_formation_completed = 0; 1708 wpa_s->global->p2p_group_formation = wpa_s; 1709 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 1710 wpa_s->parent, NULL); 1711 eloop_register_timeout( 1712 wpa_s->p2p_first_connection_timeout, 0, 1713 wpas_p2p_group_formation_timeout, 1714 wpa_s->parent, NULL); 1715 } 1716 1717 return; 1718 } 1719 1720 wpa_printf(MSG_DEBUG, "P2P: Setting up WPS for GO provisioning"); 1721 if (wpa_supplicant_ap_mac_addr_filter(wpa_s, 1722 params->peer_interface_addr)) { 1723 wpa_printf(MSG_DEBUG, "P2P: Failed to setup MAC address " 1724 "filtering"); 1725 return; 1726 } 1727 if (params->wps_method == WPS_PBC) { 1728 wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr, 1729 params->peer_device_addr); 1730 #ifdef CONFIG_WPS_NFC 1731 } else if (params->wps_method == WPS_NFC) { 1732 if (wpa_s->parent->p2p_oob_dev_pw_id != 1733 DEV_PW_NFC_CONNECTION_HANDOVER && 1734 !wpa_s->parent->p2p_oob_dev_pw) { 1735 wpa_printf(MSG_DEBUG, "P2P: No NFC Dev Pw known"); 1736 return; 1737 } 1738 wpas_ap_wps_add_nfc_pw( 1739 wpa_s, wpa_s->parent->p2p_oob_dev_pw_id, 1740 wpa_s->parent->p2p_oob_dev_pw, 1741 wpa_s->parent->p2p_peer_oob_pk_hash_known ? 1742 wpa_s->parent->p2p_peer_oob_pubkey_hash : NULL); 1743 #endif /* CONFIG_WPS_NFC */ 1744 } else if (wpa_s->p2p_pin[0]) 1745 wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr, 1746 wpa_s->p2p_pin, NULL, 0, 0); 1747 os_free(wpa_s->go_params); 1748 wpa_s->go_params = NULL; 1749 } 1750 1751 1752 static void wpas_start_wps_go(struct wpa_supplicant *wpa_s, 1753 struct p2p_go_neg_results *params, 1754 int group_formation) 1755 { 1756 struct wpa_ssid *ssid; 1757 1758 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Starting GO"); 1759 if (wpas_copy_go_neg_results(wpa_s, params) < 0) { 1760 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not copy GO Negotiation " 1761 "results"); 1762 return; 1763 } 1764 1765 ssid = wpa_config_add_network(wpa_s->conf); 1766 if (ssid == NULL) { 1767 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not add network for GO"); 1768 return; 1769 } 1770 1771 wpa_s->show_group_started = 0; 1772 wpa_s->p2p_go_group_formation_completed = 0; 1773 wpa_s->group_formation_reported = 0; 1774 1775 wpa_config_set_network_defaults(ssid); 1776 ssid->temporary = 1; 1777 ssid->p2p_group = 1; 1778 ssid->p2p_persistent_group = params->persistent_group; 1779 ssid->mode = group_formation ? WPAS_MODE_P2P_GROUP_FORMATION : 1780 WPAS_MODE_P2P_GO; 1781 ssid->frequency = params->freq; 1782 ssid->ht40 = params->ht40; 1783 ssid->vht = params->vht; 1784 ssid->ssid = os_zalloc(params->ssid_len + 1); 1785 if (ssid->ssid) { 1786 os_memcpy(ssid->ssid, params->ssid, params->ssid_len); 1787 ssid->ssid_len = params->ssid_len; 1788 } 1789 ssid->auth_alg = WPA_AUTH_ALG_OPEN; 1790 ssid->key_mgmt = WPA_KEY_MGMT_PSK; 1791 ssid->proto = WPA_PROTO_RSN; 1792 ssid->pairwise_cipher = WPA_CIPHER_CCMP; 1793 ssid->group_cipher = WPA_CIPHER_CCMP; 1794 if (params->freq > 56160) { 1795 /* 1796 * Enable GCMP instead of CCMP as pairwise_cipher and 1797 * group_cipher in 60 GHz. 1798 */ 1799 ssid->pairwise_cipher = WPA_CIPHER_GCMP; 1800 ssid->group_cipher = WPA_CIPHER_GCMP; 1801 } 1802 if (os_strlen(params->passphrase) > 0) { 1803 ssid->passphrase = os_strdup(params->passphrase); 1804 if (ssid->passphrase == NULL) { 1805 wpa_msg_global(wpa_s, MSG_ERROR, 1806 "P2P: Failed to copy passphrase for GO"); 1807 wpa_config_remove_network(wpa_s->conf, ssid->id); 1808 return; 1809 } 1810 } else 1811 ssid->passphrase = NULL; 1812 ssid->psk_set = params->psk_set; 1813 if (ssid->psk_set) 1814 os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk)); 1815 else if (ssid->passphrase) 1816 wpa_config_update_psk(ssid); 1817 ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity; 1818 1819 wpa_s->ap_configured_cb = p2p_go_configured; 1820 wpa_s->ap_configured_cb_ctx = wpa_s; 1821 wpa_s->ap_configured_cb_data = wpa_s->go_params; 1822 wpa_s->scan_req = NORMAL_SCAN_REQ; 1823 wpa_s->connect_without_scan = ssid; 1824 wpa_s->reassociate = 1; 1825 wpa_s->disconnected = 0; 1826 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Request scan (that will be skipped) to " 1827 "start GO)"); 1828 wpa_supplicant_req_scan(wpa_s, 0, 0); 1829 } 1830 1831 1832 static void wpas_p2p_clone_config(struct wpa_supplicant *dst, 1833 const struct wpa_supplicant *src) 1834 { 1835 struct wpa_config *d; 1836 const struct wpa_config *s; 1837 1838 d = dst->conf; 1839 s = src->conf; 1840 1841 #define C(n) if (s->n) d->n = os_strdup(s->n) 1842 C(device_name); 1843 C(manufacturer); 1844 C(model_name); 1845 C(model_number); 1846 C(serial_number); 1847 C(config_methods); 1848 #undef C 1849 1850 os_memcpy(d->device_type, s->device_type, WPS_DEV_TYPE_LEN); 1851 os_memcpy(d->sec_device_type, s->sec_device_type, 1852 sizeof(d->sec_device_type)); 1853 d->num_sec_device_types = s->num_sec_device_types; 1854 1855 d->p2p_group_idle = s->p2p_group_idle; 1856 d->p2p_intra_bss = s->p2p_intra_bss; 1857 d->persistent_reconnect = s->persistent_reconnect; 1858 d->max_num_sta = s->max_num_sta; 1859 d->pbc_in_m1 = s->pbc_in_m1; 1860 d->ignore_old_scan_res = s->ignore_old_scan_res; 1861 d->beacon_int = s->beacon_int; 1862 d->dtim_period = s->dtim_period; 1863 d->p2p_go_ctwindow = s->p2p_go_ctwindow; 1864 d->disassoc_low_ack = s->disassoc_low_ack; 1865 d->disable_scan_offload = s->disable_scan_offload; 1866 d->passive_scan = s->passive_scan; 1867 1868 if (s->wps_nfc_dh_privkey && s->wps_nfc_dh_pubkey) { 1869 d->wps_nfc_dh_privkey = wpabuf_dup(s->wps_nfc_dh_privkey); 1870 d->wps_nfc_dh_pubkey = wpabuf_dup(s->wps_nfc_dh_pubkey); 1871 } 1872 } 1873 1874 1875 static void wpas_p2p_get_group_ifname(struct wpa_supplicant *wpa_s, 1876 char *ifname, size_t len) 1877 { 1878 char *ifname_ptr = wpa_s->ifname; 1879 1880 if (os_strncmp(wpa_s->ifname, P2P_MGMT_DEVICE_PREFIX, 1881 os_strlen(P2P_MGMT_DEVICE_PREFIX)) == 0) { 1882 ifname_ptr = os_strrchr(wpa_s->ifname, '-') + 1; 1883 } 1884 1885 os_snprintf(ifname, len, "p2p-%s-%d", ifname_ptr, wpa_s->p2p_group_idx); 1886 if (os_strlen(ifname) >= IFNAMSIZ && 1887 os_strlen(wpa_s->ifname) < IFNAMSIZ) { 1888 int res; 1889 1890 /* Try to avoid going over the IFNAMSIZ length limit */ 1891 res = os_snprintf(ifname, len, "p2p-%d", wpa_s->p2p_group_idx); 1892 if (os_snprintf_error(len, res) && len) 1893 ifname[len - 1] = '\0'; 1894 } 1895 } 1896 1897 1898 static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s, 1899 enum wpa_driver_if_type type) 1900 { 1901 char ifname[120], force_ifname[120]; 1902 1903 if (wpa_s->pending_interface_name[0]) { 1904 wpa_printf(MSG_DEBUG, "P2P: Pending virtual interface exists " 1905 "- skip creation of a new one"); 1906 if (is_zero_ether_addr(wpa_s->pending_interface_addr)) { 1907 wpa_printf(MSG_DEBUG, "P2P: Pending virtual address " 1908 "unknown?! ifname='%s'", 1909 wpa_s->pending_interface_name); 1910 return -1; 1911 } 1912 return 0; 1913 } 1914 1915 wpas_p2p_get_group_ifname(wpa_s, ifname, sizeof(ifname)); 1916 force_ifname[0] = '\0'; 1917 1918 wpa_printf(MSG_DEBUG, "P2P: Create a new interface %s for the group", 1919 ifname); 1920 wpa_s->p2p_group_idx++; 1921 1922 wpa_s->pending_interface_type = type; 1923 if (wpa_drv_if_add(wpa_s, type, ifname, NULL, NULL, force_ifname, 1924 wpa_s->pending_interface_addr, NULL) < 0) { 1925 wpa_printf(MSG_ERROR, "P2P: Failed to create new group " 1926 "interface"); 1927 return -1; 1928 } 1929 1930 if (force_ifname[0]) { 1931 wpa_printf(MSG_DEBUG, "P2P: Driver forced interface name %s", 1932 force_ifname); 1933 os_strlcpy(wpa_s->pending_interface_name, force_ifname, 1934 sizeof(wpa_s->pending_interface_name)); 1935 } else 1936 os_strlcpy(wpa_s->pending_interface_name, ifname, 1937 sizeof(wpa_s->pending_interface_name)); 1938 wpa_printf(MSG_DEBUG, "P2P: Created pending virtual interface %s addr " 1939 MACSTR, wpa_s->pending_interface_name, 1940 MAC2STR(wpa_s->pending_interface_addr)); 1941 1942 return 0; 1943 } 1944 1945 1946 static void wpas_p2p_remove_pending_group_interface( 1947 struct wpa_supplicant *wpa_s) 1948 { 1949 if (!wpa_s->pending_interface_name[0] || 1950 is_zero_ether_addr(wpa_s->pending_interface_addr)) 1951 return; /* No pending virtual interface */ 1952 1953 wpa_printf(MSG_DEBUG, "P2P: Removing pending group interface %s", 1954 wpa_s->pending_interface_name); 1955 wpa_drv_if_remove(wpa_s, wpa_s->pending_interface_type, 1956 wpa_s->pending_interface_name); 1957 os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN); 1958 wpa_s->pending_interface_name[0] = '\0'; 1959 wpa_s->global->pending_group_iface_for_p2ps = 0; 1960 } 1961 1962 1963 static struct wpa_supplicant * 1964 wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go) 1965 { 1966 struct wpa_interface iface; 1967 struct wpa_supplicant *group_wpa_s; 1968 1969 if (!wpa_s->pending_interface_name[0]) { 1970 wpa_printf(MSG_ERROR, "P2P: No pending group interface"); 1971 if (!wpas_p2p_create_iface(wpa_s)) 1972 return NULL; 1973 /* 1974 * Something has forced us to remove the pending interface; try 1975 * to create a new one and hope for the best that we will get 1976 * the same local address. 1977 */ 1978 if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO : 1979 WPA_IF_P2P_CLIENT) < 0) 1980 return NULL; 1981 } 1982 1983 os_memset(&iface, 0, sizeof(iface)); 1984 iface.ifname = wpa_s->pending_interface_name; 1985 iface.driver = wpa_s->driver->name; 1986 if (wpa_s->conf->ctrl_interface == NULL && 1987 wpa_s->parent != wpa_s && 1988 wpa_s->p2p_mgmt && 1989 (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE)) 1990 iface.ctrl_interface = wpa_s->parent->conf->ctrl_interface; 1991 else 1992 iface.ctrl_interface = wpa_s->conf->ctrl_interface; 1993 iface.driver_param = wpa_s->conf->driver_param; 1994 group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s); 1995 if (group_wpa_s == NULL) { 1996 wpa_printf(MSG_ERROR, "P2P: Failed to create new " 1997 "wpa_supplicant interface"); 1998 return NULL; 1999 } 2000 wpa_s->pending_interface_name[0] = '\0'; 2001 group_wpa_s->p2p_group_interface = go ? P2P_GROUP_INTERFACE_GO : 2002 P2P_GROUP_INTERFACE_CLIENT; 2003 wpa_s->global->p2p_group_formation = group_wpa_s; 2004 wpa_s->global->pending_group_iface_for_p2ps = 0; 2005 2006 wpas_p2p_clone_config(group_wpa_s, wpa_s); 2007 2008 return group_wpa_s; 2009 } 2010 2011 2012 static void wpas_p2p_group_formation_timeout(void *eloop_ctx, 2013 void *timeout_ctx) 2014 { 2015 struct wpa_supplicant *wpa_s = eloop_ctx; 2016 wpa_printf(MSG_DEBUG, "P2P: Group Formation timed out"); 2017 wpas_p2p_group_formation_failed(wpa_s); 2018 } 2019 2020 2021 void wpas_p2p_group_formation_failed(struct wpa_supplicant *wpa_s) 2022 { 2023 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 2024 wpa_s->parent, NULL); 2025 if (wpa_s->global->p2p) 2026 p2p_group_formation_failed(wpa_s->global->p2p); 2027 wpas_group_formation_completed(wpa_s, 0); 2028 } 2029 2030 2031 static void wpas_p2p_grpform_fail_after_wps(struct wpa_supplicant *wpa_s) 2032 { 2033 wpa_printf(MSG_DEBUG, "P2P: Reject group formation due to WPS provisioning failure"); 2034 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 2035 wpa_s->parent, NULL); 2036 eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout, 2037 wpa_s->parent, NULL); 2038 wpa_s->global->p2p_fail_on_wps_complete = 0; 2039 } 2040 2041 2042 void wpas_p2p_ap_setup_failed(struct wpa_supplicant *wpa_s) 2043 { 2044 if (wpa_s->global->p2p_group_formation != wpa_s) 2045 return; 2046 /* Speed up group formation timeout since this cannot succeed */ 2047 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 2048 wpa_s->parent, NULL); 2049 eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout, 2050 wpa_s->parent, NULL); 2051 } 2052 2053 2054 static void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res) 2055 { 2056 struct wpa_supplicant *wpa_s = ctx; 2057 2058 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) { 2059 wpa_drv_cancel_remain_on_channel(wpa_s); 2060 wpa_s->off_channel_freq = 0; 2061 wpa_s->roc_waiting_drv_freq = 0; 2062 } 2063 2064 if (res->status) { 2065 wpa_msg_global(wpa_s, MSG_INFO, 2066 P2P_EVENT_GO_NEG_FAILURE "status=%d", 2067 res->status); 2068 wpas_notify_p2p_go_neg_completed(wpa_s, res); 2069 wpas_p2p_remove_pending_group_interface(wpa_s); 2070 return; 2071 } 2072 2073 if (wpa_s->p2p_go_ht40) 2074 res->ht40 = 1; 2075 if (wpa_s->p2p_go_vht) 2076 res->vht = 1; 2077 2078 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS "role=%s " 2079 "freq=%d ht40=%d peer_dev=" MACSTR " peer_iface=" MACSTR 2080 " wps_method=%s", 2081 res->role_go ? "GO" : "client", res->freq, res->ht40, 2082 MAC2STR(res->peer_device_addr), 2083 MAC2STR(res->peer_interface_addr), 2084 p2p_wps_method_text(res->wps_method)); 2085 wpas_notify_p2p_go_neg_completed(wpa_s, res); 2086 2087 if (res->role_go && wpa_s->p2p_persistent_id >= 0) { 2088 struct wpa_ssid *ssid; 2089 ssid = wpa_config_get_network(wpa_s->conf, 2090 wpa_s->p2p_persistent_id); 2091 if (ssid && ssid->disabled == 2 && 2092 ssid->mode == WPAS_MODE_P2P_GO && ssid->passphrase) { 2093 size_t len = os_strlen(ssid->passphrase); 2094 wpa_printf(MSG_DEBUG, "P2P: Override passphrase based " 2095 "on requested persistent group"); 2096 os_memcpy(res->passphrase, ssid->passphrase, len); 2097 res->passphrase[len] = '\0'; 2098 } 2099 } 2100 2101 if (wpa_s->create_p2p_iface) { 2102 struct wpa_supplicant *group_wpa_s = 2103 wpas_p2p_init_group_interface(wpa_s, res->role_go); 2104 if (group_wpa_s == NULL) { 2105 wpas_p2p_remove_pending_group_interface(wpa_s); 2106 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, 2107 wpa_s, NULL); 2108 wpas_p2p_group_formation_failed(wpa_s); 2109 return; 2110 } 2111 if (group_wpa_s != wpa_s) { 2112 os_memcpy(group_wpa_s->p2p_pin, wpa_s->p2p_pin, 2113 sizeof(group_wpa_s->p2p_pin)); 2114 group_wpa_s->p2p_wps_method = wpa_s->p2p_wps_method; 2115 } 2116 os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN); 2117 wpa_s->pending_interface_name[0] = '\0'; 2118 group_wpa_s->p2p_in_provisioning = 1; 2119 2120 if (res->role_go) 2121 wpas_start_wps_go(group_wpa_s, res, 1); 2122 else 2123 wpas_start_wps_enrollee(group_wpa_s, res); 2124 } else { 2125 wpa_s->p2p_in_provisioning = 1; 2126 wpa_s->global->p2p_group_formation = wpa_s; 2127 2128 if (res->role_go) 2129 wpas_start_wps_go(wpa_s, res, 1); 2130 else 2131 wpas_start_wps_enrollee(ctx, res); 2132 } 2133 2134 wpa_s->p2p_long_listen = 0; 2135 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); 2136 2137 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL); 2138 eloop_register_timeout(15 + res->peer_config_timeout / 100, 2139 (res->peer_config_timeout % 100) * 10000, 2140 wpas_p2p_group_formation_timeout, wpa_s, NULL); 2141 } 2142 2143 2144 static void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id) 2145 { 2146 struct wpa_supplicant *wpa_s = ctx; 2147 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR 2148 " dev_passwd_id=%u", MAC2STR(src), dev_passwd_id); 2149 2150 wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id); 2151 } 2152 2153 2154 static void wpas_dev_found(void *ctx, const u8 *addr, 2155 const struct p2p_peer_info *info, 2156 int new_device) 2157 { 2158 #ifndef CONFIG_NO_STDOUT_DEBUG 2159 struct wpa_supplicant *wpa_s = ctx; 2160 char devtype[WPS_DEV_TYPE_BUFSIZE]; 2161 char *wfd_dev_info_hex = NULL; 2162 2163 #ifdef CONFIG_WIFI_DISPLAY 2164 wfd_dev_info_hex = wifi_display_subelem_hex(info->wfd_subelems, 2165 WFD_SUBELEM_DEVICE_INFO); 2166 #endif /* CONFIG_WIFI_DISPLAY */ 2167 2168 if (info->p2ps_instance) { 2169 char str[256]; 2170 const u8 *buf = wpabuf_head(info->p2ps_instance); 2171 size_t len = wpabuf_len(info->p2ps_instance); 2172 2173 while (len) { 2174 u32 id; 2175 u16 methods; 2176 u8 str_len; 2177 2178 if (len < 4 + 2 + 1) 2179 break; 2180 id = WPA_GET_LE32(buf); 2181 buf += sizeof(u32); 2182 methods = WPA_GET_BE16(buf); 2183 buf += sizeof(u16); 2184 str_len = *buf++; 2185 if (str_len > len - 4 - 2 - 1) 2186 break; 2187 os_memcpy(str, buf, str_len); 2188 str[str_len] = '\0'; 2189 buf += str_len; 2190 len -= str_len + sizeof(u32) + sizeof(u16) + sizeof(u8); 2191 2192 wpa_msg_global(wpa_s, MSG_INFO, 2193 P2P_EVENT_DEVICE_FOUND MACSTR 2194 " p2p_dev_addr=" MACSTR 2195 " pri_dev_type=%s name='%s'" 2196 " config_methods=0x%x" 2197 " dev_capab=0x%x" 2198 " group_capab=0x%x" 2199 " adv_id=%x asp_svc=%s%s", 2200 MAC2STR(addr), 2201 MAC2STR(info->p2p_device_addr), 2202 wps_dev_type_bin2str( 2203 info->pri_dev_type, 2204 devtype, sizeof(devtype)), 2205 info->device_name, methods, 2206 info->dev_capab, info->group_capab, 2207 id, str, 2208 info->vendor_elems ? 2209 " vendor_elems=1" : ""); 2210 } 2211 goto done; 2212 } 2213 2214 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_FOUND MACSTR 2215 " p2p_dev_addr=" MACSTR 2216 " pri_dev_type=%s name='%s' config_methods=0x%x " 2217 "dev_capab=0x%x group_capab=0x%x%s%s%s new=%d", 2218 MAC2STR(addr), MAC2STR(info->p2p_device_addr), 2219 wps_dev_type_bin2str(info->pri_dev_type, devtype, 2220 sizeof(devtype)), 2221 info->device_name, info->config_methods, 2222 info->dev_capab, info->group_capab, 2223 wfd_dev_info_hex ? " wfd_dev_info=0x" : "", 2224 wfd_dev_info_hex ? wfd_dev_info_hex : "", 2225 info->vendor_elems ? " vendor_elems=1" : "", 2226 new_device); 2227 2228 done: 2229 os_free(wfd_dev_info_hex); 2230 #endif /* CONFIG_NO_STDOUT_DEBUG */ 2231 2232 wpas_notify_p2p_device_found(ctx, info->p2p_device_addr, new_device); 2233 } 2234 2235 2236 static void wpas_dev_lost(void *ctx, const u8 *dev_addr) 2237 { 2238 struct wpa_supplicant *wpa_s = ctx; 2239 2240 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_LOST 2241 "p2p_dev_addr=" MACSTR, MAC2STR(dev_addr)); 2242 2243 wpas_notify_p2p_device_lost(wpa_s, dev_addr); 2244 } 2245 2246 2247 static void wpas_find_stopped(void *ctx) 2248 { 2249 struct wpa_supplicant *wpa_s = ctx; 2250 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_FIND_STOPPED); 2251 } 2252 2253 2254 struct wpas_p2p_listen_work { 2255 unsigned int freq; 2256 unsigned int duration; 2257 struct wpabuf *probe_resp_ie; 2258 }; 2259 2260 2261 static void wpas_p2p_listen_work_free(struct wpas_p2p_listen_work *lwork) 2262 { 2263 if (lwork == NULL) 2264 return; 2265 wpabuf_free(lwork->probe_resp_ie); 2266 os_free(lwork); 2267 } 2268 2269 2270 static void wpas_p2p_listen_work_done(struct wpa_supplicant *wpa_s) 2271 { 2272 struct wpas_p2p_listen_work *lwork; 2273 2274 if (!wpa_s->p2p_listen_work) 2275 return; 2276 2277 lwork = wpa_s->p2p_listen_work->ctx; 2278 wpas_p2p_listen_work_free(lwork); 2279 radio_work_done(wpa_s->p2p_listen_work); 2280 wpa_s->p2p_listen_work = NULL; 2281 } 2282 2283 2284 static void wpas_start_listen_cb(struct wpa_radio_work *work, int deinit) 2285 { 2286 struct wpa_supplicant *wpa_s = work->wpa_s; 2287 struct wpas_p2p_listen_work *lwork = work->ctx; 2288 unsigned int duration; 2289 2290 if (deinit) { 2291 if (work->started) { 2292 wpa_s->p2p_listen_work = NULL; 2293 wpas_stop_listen(wpa_s); 2294 } 2295 wpas_p2p_listen_work_free(lwork); 2296 return; 2297 } 2298 2299 wpa_s->p2p_listen_work = work; 2300 2301 wpa_drv_set_ap_wps_ie(wpa_s, NULL, lwork->probe_resp_ie, NULL); 2302 2303 if (wpa_drv_probe_req_report(wpa_s, 1) < 0) { 2304 wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver to " 2305 "report received Probe Request frames"); 2306 wpas_p2p_listen_work_done(wpa_s); 2307 return; 2308 } 2309 2310 wpa_s->pending_listen_freq = lwork->freq; 2311 wpa_s->pending_listen_duration = lwork->duration; 2312 2313 duration = lwork->duration; 2314 #ifdef CONFIG_TESTING_OPTIONS 2315 if (wpa_s->extra_roc_dur) { 2316 wpa_printf(MSG_DEBUG, "TESTING: Increase ROC duration %u -> %u", 2317 duration, duration + wpa_s->extra_roc_dur); 2318 duration += wpa_s->extra_roc_dur; 2319 } 2320 #endif /* CONFIG_TESTING_OPTIONS */ 2321 2322 if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration) < 0) { 2323 wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver " 2324 "to remain on channel (%u MHz) for Listen " 2325 "state", lwork->freq); 2326 wpas_p2p_listen_work_done(wpa_s); 2327 wpa_s->pending_listen_freq = 0; 2328 return; 2329 } 2330 wpa_s->off_channel_freq = 0; 2331 wpa_s->roc_waiting_drv_freq = lwork->freq; 2332 } 2333 2334 2335 static int wpas_start_listen(void *ctx, unsigned int freq, 2336 unsigned int duration, 2337 const struct wpabuf *probe_resp_ie) 2338 { 2339 struct wpa_supplicant *wpa_s = ctx; 2340 struct wpas_p2p_listen_work *lwork; 2341 2342 if (wpa_s->p2p_listen_work) { 2343 wpa_printf(MSG_DEBUG, "P2P: Reject start_listen since p2p_listen_work already exists"); 2344 return -1; 2345 } 2346 2347 lwork = os_zalloc(sizeof(*lwork)); 2348 if (lwork == NULL) 2349 return -1; 2350 lwork->freq = freq; 2351 lwork->duration = duration; 2352 if (probe_resp_ie) { 2353 lwork->probe_resp_ie = wpabuf_dup(probe_resp_ie); 2354 if (lwork->probe_resp_ie == NULL) { 2355 wpas_p2p_listen_work_free(lwork); 2356 return -1; 2357 } 2358 } 2359 2360 if (radio_add_work(wpa_s, freq, "p2p-listen", 0, wpas_start_listen_cb, 2361 lwork) < 0) { 2362 wpas_p2p_listen_work_free(lwork); 2363 return -1; 2364 } 2365 2366 return 0; 2367 } 2368 2369 2370 static void wpas_stop_listen(void *ctx) 2371 { 2372 struct wpa_supplicant *wpa_s = ctx; 2373 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) { 2374 wpa_drv_cancel_remain_on_channel(wpa_s); 2375 wpa_s->off_channel_freq = 0; 2376 wpa_s->roc_waiting_drv_freq = 0; 2377 } 2378 wpa_drv_set_ap_wps_ie(wpa_s, NULL, NULL, NULL); 2379 wpa_drv_probe_req_report(wpa_s, 0); 2380 wpas_p2p_listen_work_done(wpa_s); 2381 } 2382 2383 2384 static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf) 2385 { 2386 struct wpa_supplicant *wpa_s = ctx; 2387 return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1); 2388 } 2389 2390 2391 /* 2392 * DNS Header section is used only to calculate compression pointers, so the 2393 * contents of this data does not matter, but the length needs to be reserved 2394 * in the virtual packet. 2395 */ 2396 #define DNS_HEADER_LEN 12 2397 2398 /* 2399 * 27-octet in-memory packet from P2P specification containing two implied 2400 * queries for _tcp.lcoal. PTR IN and _udp.local. PTR IN 2401 */ 2402 #define P2P_SD_IN_MEMORY_LEN 27 2403 2404 static int p2p_sd_dns_uncompress_label(char **upos, char *uend, u8 *start, 2405 u8 **spos, const u8 *end) 2406 { 2407 while (*spos < end) { 2408 u8 val = ((*spos)[0] & 0xc0) >> 6; 2409 int len; 2410 2411 if (val == 1 || val == 2) { 2412 /* These are reserved values in RFC 1035 */ 2413 wpa_printf(MSG_DEBUG, "P2P: Invalid domain name " 2414 "sequence starting with 0x%x", val); 2415 return -1; 2416 } 2417 2418 if (val == 3) { 2419 u16 offset; 2420 u8 *spos_tmp; 2421 2422 /* Offset */ 2423 if (*spos + 2 > end) { 2424 wpa_printf(MSG_DEBUG, "P2P: No room for full " 2425 "DNS offset field"); 2426 return -1; 2427 } 2428 2429 offset = (((*spos)[0] & 0x3f) << 8) | (*spos)[1]; 2430 if (offset >= *spos - start) { 2431 wpa_printf(MSG_DEBUG, "P2P: Invalid DNS " 2432 "pointer offset %u", offset); 2433 return -1; 2434 } 2435 2436 (*spos) += 2; 2437 spos_tmp = start + offset; 2438 return p2p_sd_dns_uncompress_label(upos, uend, start, 2439 &spos_tmp, 2440 *spos - 2); 2441 } 2442 2443 /* Label */ 2444 len = (*spos)[0] & 0x3f; 2445 if (len == 0) 2446 return 0; 2447 2448 (*spos)++; 2449 if (*spos + len > end) { 2450 wpa_printf(MSG_DEBUG, "P2P: Invalid domain name " 2451 "sequence - no room for label with length " 2452 "%u", len); 2453 return -1; 2454 } 2455 2456 if (*upos + len + 2 > uend) 2457 return -2; 2458 2459 os_memcpy(*upos, *spos, len); 2460 *spos += len; 2461 *upos += len; 2462 (*upos)[0] = '.'; 2463 (*upos)++; 2464 (*upos)[0] = '\0'; 2465 } 2466 2467 return 0; 2468 } 2469 2470 2471 /* Uncompress domain names per RFC 1035 using the P2P SD in-memory packet. 2472 * Returns -1 on parsing error (invalid input sequence), -2 if output buffer is 2473 * not large enough */ 2474 static int p2p_sd_dns_uncompress(char *buf, size_t buf_len, const u8 *msg, 2475 size_t msg_len, size_t offset) 2476 { 2477 /* 27-octet in-memory packet from P2P specification */ 2478 const char *prefix = "\x04_tcp\x05local\x00\x00\x0C\x00\x01" 2479 "\x04_udp\xC0\x11\x00\x0C\x00\x01"; 2480 u8 *tmp, *end, *spos; 2481 char *upos, *uend; 2482 int ret = 0; 2483 2484 if (buf_len < 2) 2485 return -1; 2486 if (offset > msg_len) 2487 return -1; 2488 2489 tmp = os_malloc(DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN + msg_len); 2490 if (tmp == NULL) 2491 return -1; 2492 spos = tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN; 2493 end = spos + msg_len; 2494 spos += offset; 2495 2496 os_memset(tmp, 0, DNS_HEADER_LEN); 2497 os_memcpy(tmp + DNS_HEADER_LEN, prefix, P2P_SD_IN_MEMORY_LEN); 2498 os_memcpy(tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN, msg, msg_len); 2499 2500 upos = buf; 2501 uend = buf + buf_len; 2502 2503 ret = p2p_sd_dns_uncompress_label(&upos, uend, tmp, &spos, end); 2504 if (ret) { 2505 os_free(tmp); 2506 return ret; 2507 } 2508 2509 if (upos == buf) { 2510 upos[0] = '.'; 2511 upos[1] = '\0'; 2512 } else if (upos[-1] == '.') 2513 upos[-1] = '\0'; 2514 2515 os_free(tmp); 2516 return 0; 2517 } 2518 2519 2520 static struct p2p_srv_bonjour * 2521 wpas_p2p_service_get_bonjour(struct wpa_supplicant *wpa_s, 2522 const struct wpabuf *query) 2523 { 2524 struct p2p_srv_bonjour *bsrv; 2525 size_t len; 2526 2527 len = wpabuf_len(query); 2528 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour, 2529 struct p2p_srv_bonjour, list) { 2530 if (len == wpabuf_len(bsrv->query) && 2531 os_memcmp(wpabuf_head(query), wpabuf_head(bsrv->query), 2532 len) == 0) 2533 return bsrv; 2534 } 2535 return NULL; 2536 } 2537 2538 2539 static struct p2p_srv_upnp * 2540 wpas_p2p_service_get_upnp(struct wpa_supplicant *wpa_s, u8 version, 2541 const char *service) 2542 { 2543 struct p2p_srv_upnp *usrv; 2544 2545 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp, 2546 struct p2p_srv_upnp, list) { 2547 if (version == usrv->version && 2548 os_strcmp(service, usrv->service) == 0) 2549 return usrv; 2550 } 2551 return NULL; 2552 } 2553 2554 2555 static void wpas_sd_add_empty(struct wpabuf *resp, u8 srv_proto, 2556 u8 srv_trans_id, u8 status) 2557 { 2558 u8 *len_pos; 2559 2560 if (wpabuf_tailroom(resp) < 5) 2561 return; 2562 2563 /* Length (to be filled) */ 2564 len_pos = wpabuf_put(resp, 2); 2565 wpabuf_put_u8(resp, srv_proto); 2566 wpabuf_put_u8(resp, srv_trans_id); 2567 /* Status Code */ 2568 wpabuf_put_u8(resp, status); 2569 /* Response Data: empty */ 2570 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2); 2571 } 2572 2573 2574 static void wpas_sd_add_proto_not_avail(struct wpabuf *resp, u8 srv_proto, 2575 u8 srv_trans_id) 2576 { 2577 wpas_sd_add_empty(resp, srv_proto, srv_trans_id, 2578 P2P_SD_PROTO_NOT_AVAILABLE); 2579 } 2580 2581 2582 static void wpas_sd_add_bad_request(struct wpabuf *resp, u8 srv_proto, 2583 u8 srv_trans_id) 2584 { 2585 wpas_sd_add_empty(resp, srv_proto, srv_trans_id, P2P_SD_BAD_REQUEST); 2586 } 2587 2588 2589 static void wpas_sd_add_not_found(struct wpabuf *resp, u8 srv_proto, 2590 u8 srv_trans_id) 2591 { 2592 wpas_sd_add_empty(resp, srv_proto, srv_trans_id, 2593 P2P_SD_REQUESTED_INFO_NOT_AVAILABLE); 2594 } 2595 2596 2597 static void wpas_sd_all_bonjour(struct wpa_supplicant *wpa_s, 2598 struct wpabuf *resp, u8 srv_trans_id) 2599 { 2600 struct p2p_srv_bonjour *bsrv; 2601 u8 *len_pos; 2602 2603 wpa_printf(MSG_DEBUG, "P2P: SD Request for all Bonjour services"); 2604 2605 if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) { 2606 wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available"); 2607 return; 2608 } 2609 2610 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour, 2611 struct p2p_srv_bonjour, list) { 2612 if (wpabuf_tailroom(resp) < 2613 5 + wpabuf_len(bsrv->query) + wpabuf_len(bsrv->resp)) 2614 return; 2615 /* Length (to be filled) */ 2616 len_pos = wpabuf_put(resp, 2); 2617 wpabuf_put_u8(resp, P2P_SERV_BONJOUR); 2618 wpabuf_put_u8(resp, srv_trans_id); 2619 /* Status Code */ 2620 wpabuf_put_u8(resp, P2P_SD_SUCCESS); 2621 wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service", 2622 wpabuf_head(bsrv->resp), 2623 wpabuf_len(bsrv->resp)); 2624 /* Response Data */ 2625 wpabuf_put_buf(resp, bsrv->query); /* Key */ 2626 wpabuf_put_buf(resp, bsrv->resp); /* Value */ 2627 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2628 2); 2629 } 2630 } 2631 2632 2633 static int match_bonjour_query(struct p2p_srv_bonjour *bsrv, const u8 *query, 2634 size_t query_len) 2635 { 2636 char str_rx[256], str_srv[256]; 2637 2638 if (query_len < 3 || wpabuf_len(bsrv->query) < 3) 2639 return 0; /* Too short to include DNS Type and Version */ 2640 if (os_memcmp(query + query_len - 3, 2641 wpabuf_head_u8(bsrv->query) + wpabuf_len(bsrv->query) - 3, 2642 3) != 0) 2643 return 0; /* Mismatch in DNS Type or Version */ 2644 if (query_len == wpabuf_len(bsrv->query) && 2645 os_memcmp(query, wpabuf_head(bsrv->query), query_len - 3) == 0) 2646 return 1; /* Binary match */ 2647 2648 if (p2p_sd_dns_uncompress(str_rx, sizeof(str_rx), query, query_len - 3, 2649 0)) 2650 return 0; /* Failed to uncompress query */ 2651 if (p2p_sd_dns_uncompress(str_srv, sizeof(str_srv), 2652 wpabuf_head(bsrv->query), 2653 wpabuf_len(bsrv->query) - 3, 0)) 2654 return 0; /* Failed to uncompress service */ 2655 2656 return os_strcmp(str_rx, str_srv) == 0; 2657 } 2658 2659 2660 static void wpas_sd_req_bonjour(struct wpa_supplicant *wpa_s, 2661 struct wpabuf *resp, u8 srv_trans_id, 2662 const u8 *query, size_t query_len) 2663 { 2664 struct p2p_srv_bonjour *bsrv; 2665 u8 *len_pos; 2666 int matches = 0; 2667 2668 wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for Bonjour", 2669 query, query_len); 2670 if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) { 2671 wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available"); 2672 wpas_sd_add_proto_not_avail(resp, P2P_SERV_BONJOUR, 2673 srv_trans_id); 2674 return; 2675 } 2676 2677 if (query_len == 0) { 2678 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id); 2679 return; 2680 } 2681 2682 dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour, 2683 struct p2p_srv_bonjour, list) { 2684 if (!match_bonjour_query(bsrv, query, query_len)) 2685 continue; 2686 2687 if (wpabuf_tailroom(resp) < 2688 5 + query_len + wpabuf_len(bsrv->resp)) 2689 return; 2690 2691 matches++; 2692 2693 /* Length (to be filled) */ 2694 len_pos = wpabuf_put(resp, 2); 2695 wpabuf_put_u8(resp, P2P_SERV_BONJOUR); 2696 wpabuf_put_u8(resp, srv_trans_id); 2697 2698 /* Status Code */ 2699 wpabuf_put_u8(resp, P2P_SD_SUCCESS); 2700 wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service", 2701 wpabuf_head(bsrv->resp), 2702 wpabuf_len(bsrv->resp)); 2703 2704 /* Response Data */ 2705 wpabuf_put_data(resp, query, query_len); /* Key */ 2706 wpabuf_put_buf(resp, bsrv->resp); /* Value */ 2707 2708 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2); 2709 } 2710 2711 if (matches == 0) { 2712 wpa_printf(MSG_DEBUG, "P2P: Requested Bonjour service not " 2713 "available"); 2714 if (wpabuf_tailroom(resp) < 5) 2715 return; 2716 2717 /* Length (to be filled) */ 2718 len_pos = wpabuf_put(resp, 2); 2719 wpabuf_put_u8(resp, P2P_SERV_BONJOUR); 2720 wpabuf_put_u8(resp, srv_trans_id); 2721 2722 /* Status Code */ 2723 wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE); 2724 /* Response Data: empty */ 2725 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2726 2); 2727 } 2728 } 2729 2730 2731 static void wpas_sd_all_upnp(struct wpa_supplicant *wpa_s, 2732 struct wpabuf *resp, u8 srv_trans_id) 2733 { 2734 struct p2p_srv_upnp *usrv; 2735 u8 *len_pos; 2736 2737 wpa_printf(MSG_DEBUG, "P2P: SD Request for all UPnP services"); 2738 2739 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) { 2740 wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available"); 2741 return; 2742 } 2743 2744 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp, 2745 struct p2p_srv_upnp, list) { 2746 if (wpabuf_tailroom(resp) < 5 + 1 + os_strlen(usrv->service)) 2747 return; 2748 2749 /* Length (to be filled) */ 2750 len_pos = wpabuf_put(resp, 2); 2751 wpabuf_put_u8(resp, P2P_SERV_UPNP); 2752 wpabuf_put_u8(resp, srv_trans_id); 2753 2754 /* Status Code */ 2755 wpabuf_put_u8(resp, P2P_SD_SUCCESS); 2756 /* Response Data */ 2757 wpabuf_put_u8(resp, usrv->version); 2758 wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s", 2759 usrv->service); 2760 wpabuf_put_str(resp, usrv->service); 2761 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2762 2); 2763 } 2764 } 2765 2766 2767 static void wpas_sd_req_upnp(struct wpa_supplicant *wpa_s, 2768 struct wpabuf *resp, u8 srv_trans_id, 2769 const u8 *query, size_t query_len) 2770 { 2771 struct p2p_srv_upnp *usrv; 2772 u8 *len_pos; 2773 u8 version; 2774 char *str; 2775 int count = 0; 2776 2777 wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for UPnP", 2778 query, query_len); 2779 2780 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) { 2781 wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available"); 2782 wpas_sd_add_proto_not_avail(resp, P2P_SERV_UPNP, 2783 srv_trans_id); 2784 return; 2785 } 2786 2787 if (query_len == 0) { 2788 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id); 2789 return; 2790 } 2791 2792 if (wpabuf_tailroom(resp) < 5) 2793 return; 2794 2795 /* Length (to be filled) */ 2796 len_pos = wpabuf_put(resp, 2); 2797 wpabuf_put_u8(resp, P2P_SERV_UPNP); 2798 wpabuf_put_u8(resp, srv_trans_id); 2799 2800 version = query[0]; 2801 str = os_malloc(query_len); 2802 if (str == NULL) 2803 return; 2804 os_memcpy(str, query + 1, query_len - 1); 2805 str[query_len - 1] = '\0'; 2806 2807 dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp, 2808 struct p2p_srv_upnp, list) { 2809 if (version != usrv->version) 2810 continue; 2811 2812 if (os_strcmp(str, "ssdp:all") != 0 && 2813 os_strstr(usrv->service, str) == NULL) 2814 continue; 2815 2816 if (wpabuf_tailroom(resp) < 2) 2817 break; 2818 if (count == 0) { 2819 /* Status Code */ 2820 wpabuf_put_u8(resp, P2P_SD_SUCCESS); 2821 /* Response Data */ 2822 wpabuf_put_u8(resp, version); 2823 } else 2824 wpabuf_put_u8(resp, ','); 2825 2826 count++; 2827 2828 wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s", 2829 usrv->service); 2830 if (wpabuf_tailroom(resp) < os_strlen(usrv->service)) 2831 break; 2832 wpabuf_put_str(resp, usrv->service); 2833 } 2834 os_free(str); 2835 2836 if (count == 0) { 2837 wpa_printf(MSG_DEBUG, "P2P: Requested UPnP service not " 2838 "available"); 2839 /* Status Code */ 2840 wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE); 2841 /* Response Data: empty */ 2842 } 2843 2844 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2); 2845 } 2846 2847 2848 #ifdef CONFIG_WIFI_DISPLAY 2849 static void wpas_sd_req_wfd(struct wpa_supplicant *wpa_s, 2850 struct wpabuf *resp, u8 srv_trans_id, 2851 const u8 *query, size_t query_len) 2852 { 2853 const u8 *pos; 2854 u8 role; 2855 u8 *len_pos; 2856 2857 wpa_hexdump(MSG_DEBUG, "P2P: SD Request for WFD", query, query_len); 2858 2859 if (!wpa_s->global->wifi_display) { 2860 wpa_printf(MSG_DEBUG, "P2P: WFD protocol not available"); 2861 wpas_sd_add_proto_not_avail(resp, P2P_SERV_WIFI_DISPLAY, 2862 srv_trans_id); 2863 return; 2864 } 2865 2866 if (query_len < 1) { 2867 wpa_printf(MSG_DEBUG, "P2P: Missing WFD Requested Device " 2868 "Role"); 2869 return; 2870 } 2871 2872 if (wpabuf_tailroom(resp) < 5) 2873 return; 2874 2875 pos = query; 2876 role = *pos++; 2877 wpa_printf(MSG_DEBUG, "P2P: WSD for device role 0x%x", role); 2878 2879 /* TODO: role specific handling */ 2880 2881 /* Length (to be filled) */ 2882 len_pos = wpabuf_put(resp, 2); 2883 wpabuf_put_u8(resp, P2P_SERV_WIFI_DISPLAY); 2884 wpabuf_put_u8(resp, srv_trans_id); 2885 wpabuf_put_u8(resp, P2P_SD_SUCCESS); /* Status Code */ 2886 2887 while (pos < query + query_len) { 2888 if (*pos < MAX_WFD_SUBELEMS && 2889 wpa_s->global->wfd_subelem[*pos] && 2890 wpabuf_tailroom(resp) >= 2891 wpabuf_len(wpa_s->global->wfd_subelem[*pos])) { 2892 wpa_printf(MSG_DEBUG, "P2P: Add WSD response " 2893 "subelement %u", *pos); 2894 wpabuf_put_buf(resp, wpa_s->global->wfd_subelem[*pos]); 2895 } 2896 pos++; 2897 } 2898 2899 WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2); 2900 } 2901 #endif /* CONFIG_WIFI_DISPLAY */ 2902 2903 2904 static int find_p2ps_substr(struct p2ps_advertisement *adv_data, 2905 const u8 *needle, size_t needle_len) 2906 { 2907 const u8 *haystack = (const u8 *) adv_data->svc_info; 2908 size_t haystack_len, i; 2909 2910 /* Allow search term to be empty */ 2911 if (!needle || !needle_len) 2912 return 1; 2913 2914 if (!haystack) 2915 return 0; 2916 2917 haystack_len = os_strlen(adv_data->svc_info); 2918 for (i = 0; i < haystack_len; i++) { 2919 if (haystack_len - i < needle_len) 2920 break; 2921 if (os_memcmp(haystack + i, needle, needle_len) == 0) 2922 return 1; 2923 } 2924 2925 return 0; 2926 } 2927 2928 2929 static void wpas_sd_req_asp(struct wpa_supplicant *wpa_s, 2930 struct wpabuf *resp, u8 srv_trans_id, 2931 const u8 *query, size_t query_len) 2932 { 2933 struct p2ps_advertisement *adv_data; 2934 const u8 *svc = &query[1]; 2935 const u8 *info = NULL; 2936 size_t svc_len = query[0]; 2937 size_t info_len = 0; 2938 int prefix = 0; 2939 u8 *count_pos = NULL; 2940 u8 *len_pos = NULL; 2941 2942 wpa_hexdump(MSG_DEBUG, "P2P: SD Request for ASP", query, query_len); 2943 2944 if (!wpa_s->global->p2p) { 2945 wpa_printf(MSG_DEBUG, "P2P: ASP protocol not available"); 2946 wpas_sd_add_proto_not_avail(resp, P2P_SERV_P2PS, srv_trans_id); 2947 return; 2948 } 2949 2950 /* Info block is optional */ 2951 if (svc_len + 1 < query_len) { 2952 info = &svc[svc_len]; 2953 info_len = *info++; 2954 } 2955 2956 /* Range check length of svc string and info block */ 2957 if (svc_len + (info_len ? info_len + 2 : 1) > query_len) { 2958 wpa_printf(MSG_DEBUG, "P2P: ASP bad request"); 2959 wpas_sd_add_bad_request(resp, P2P_SERV_P2PS, srv_trans_id); 2960 return; 2961 } 2962 2963 /* Detect and correct for prefix search */ 2964 if (svc_len && svc[svc_len - 1] == '*') { 2965 prefix = 1; 2966 svc_len--; 2967 } 2968 2969 for (adv_data = p2p_get_p2ps_adv_list(wpa_s->global->p2p); 2970 adv_data; adv_data = adv_data->next) { 2971 /* If not a prefix match, reject length mismatches */ 2972 if (!prefix && svc_len != os_strlen(adv_data->svc_name)) 2973 continue; 2974 2975 /* Search each service for request */ 2976 if (os_memcmp(adv_data->svc_name, svc, svc_len) == 0 && 2977 find_p2ps_substr(adv_data, info, info_len)) { 2978 size_t len = os_strlen(adv_data->svc_name); 2979 size_t svc_info_len = 0; 2980 2981 if (adv_data->svc_info) 2982 svc_info_len = os_strlen(adv_data->svc_info); 2983 2984 if (len > 0xff || svc_info_len > 0xffff) 2985 return; 2986 2987 /* Length & Count to be filled as we go */ 2988 if (!len_pos && !count_pos) { 2989 if (wpabuf_tailroom(resp) < 2990 len + svc_info_len + 16) 2991 return; 2992 2993 len_pos = wpabuf_put(resp, 2); 2994 wpabuf_put_u8(resp, P2P_SERV_P2PS); 2995 wpabuf_put_u8(resp, srv_trans_id); 2996 /* Status Code */ 2997 wpabuf_put_u8(resp, P2P_SD_SUCCESS); 2998 count_pos = wpabuf_put(resp, 1); 2999 *count_pos = 0; 3000 } else if (wpabuf_tailroom(resp) < 3001 len + svc_info_len + 10) 3002 return; 3003 3004 if (svc_info_len) { 3005 wpa_printf(MSG_DEBUG, 3006 "P2P: Add Svc: %s info: %s", 3007 adv_data->svc_name, 3008 adv_data->svc_info); 3009 } else { 3010 wpa_printf(MSG_DEBUG, "P2P: Add Svc: %s", 3011 adv_data->svc_name); 3012 } 3013 3014 /* Advertisement ID */ 3015 wpabuf_put_le32(resp, adv_data->id); 3016 3017 /* Config Methods */ 3018 wpabuf_put_be16(resp, adv_data->config_methods); 3019 3020 /* Service Name */ 3021 wpabuf_put_u8(resp, (u8) len); 3022 wpabuf_put_data(resp, adv_data->svc_name, len); 3023 3024 /* Service State */ 3025 wpabuf_put_u8(resp, adv_data->state); 3026 3027 /* Service Information */ 3028 wpabuf_put_le16(resp, (u16) svc_info_len); 3029 wpabuf_put_data(resp, adv_data->svc_info, svc_info_len); 3030 3031 /* Update length and count */ 3032 (*count_pos)++; 3033 WPA_PUT_LE16(len_pos, 3034 (u8 *) wpabuf_put(resp, 0) - len_pos - 2); 3035 } 3036 } 3037 3038 /* Return error if no matching svc found */ 3039 if (count_pos == NULL) { 3040 wpa_printf(MSG_DEBUG, "P2P: ASP service not found"); 3041 wpas_sd_add_not_found(resp, P2P_SERV_P2PS, srv_trans_id); 3042 } 3043 } 3044 3045 3046 static void wpas_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token, 3047 u16 update_indic, const u8 *tlvs, size_t tlvs_len) 3048 { 3049 struct wpa_supplicant *wpa_s = ctx; 3050 const u8 *pos = tlvs; 3051 const u8 *end = tlvs + tlvs_len; 3052 const u8 *tlv_end; 3053 u16 slen; 3054 struct wpabuf *resp; 3055 u8 srv_proto, srv_trans_id; 3056 size_t buf_len; 3057 char *buf; 3058 3059 wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Request TLVs", 3060 tlvs, tlvs_len); 3061 buf_len = 2 * tlvs_len + 1; 3062 buf = os_malloc(buf_len); 3063 if (buf) { 3064 wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len); 3065 wpa_msg_ctrl(wpa_s, MSG_INFO, P2P_EVENT_SERV_DISC_REQ "%d " 3066 MACSTR " %u %u %s", 3067 freq, MAC2STR(sa), dialog_token, update_indic, 3068 buf); 3069 os_free(buf); 3070 } 3071 3072 if (wpa_s->p2p_sd_over_ctrl_iface) { 3073 wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token, 3074 update_indic, tlvs, tlvs_len); 3075 return; /* to be processed by an external program */ 3076 } 3077 3078 resp = wpabuf_alloc(10000); 3079 if (resp == NULL) 3080 return; 3081 3082 while (pos + 1 < end) { 3083 wpa_printf(MSG_DEBUG, "P2P: Service Request TLV"); 3084 slen = WPA_GET_LE16(pos); 3085 pos += 2; 3086 if (pos + slen > end || slen < 2) { 3087 wpa_printf(MSG_DEBUG, "P2P: Unexpected Query Data " 3088 "length"); 3089 wpabuf_free(resp); 3090 return; 3091 } 3092 tlv_end = pos + slen; 3093 3094 srv_proto = *pos++; 3095 wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u", 3096 srv_proto); 3097 srv_trans_id = *pos++; 3098 wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u", 3099 srv_trans_id); 3100 3101 wpa_hexdump(MSG_MSGDUMP, "P2P: Query Data", 3102 pos, tlv_end - pos); 3103 3104 3105 if (wpa_s->force_long_sd) { 3106 wpa_printf(MSG_DEBUG, "P2P: SD test - force long " 3107 "response"); 3108 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id); 3109 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id); 3110 goto done; 3111 } 3112 3113 switch (srv_proto) { 3114 case P2P_SERV_ALL_SERVICES: 3115 wpa_printf(MSG_DEBUG, "P2P: Service Discovery Request " 3116 "for all services"); 3117 if (dl_list_empty(&wpa_s->global->p2p_srv_upnp) && 3118 dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) { 3119 wpa_printf(MSG_DEBUG, "P2P: No service " 3120 "discovery protocols available"); 3121 wpas_sd_add_proto_not_avail( 3122 resp, P2P_SERV_ALL_SERVICES, 3123 srv_trans_id); 3124 break; 3125 } 3126 wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id); 3127 wpas_sd_all_upnp(wpa_s, resp, srv_trans_id); 3128 break; 3129 case P2P_SERV_BONJOUR: 3130 wpas_sd_req_bonjour(wpa_s, resp, srv_trans_id, 3131 pos, tlv_end - pos); 3132 break; 3133 case P2P_SERV_UPNP: 3134 wpas_sd_req_upnp(wpa_s, resp, srv_trans_id, 3135 pos, tlv_end - pos); 3136 break; 3137 #ifdef CONFIG_WIFI_DISPLAY 3138 case P2P_SERV_WIFI_DISPLAY: 3139 wpas_sd_req_wfd(wpa_s, resp, srv_trans_id, 3140 pos, tlv_end - pos); 3141 break; 3142 #endif /* CONFIG_WIFI_DISPLAY */ 3143 case P2P_SERV_P2PS: 3144 wpas_sd_req_asp(wpa_s, resp, srv_trans_id, 3145 pos, tlv_end - pos); 3146 break; 3147 default: 3148 wpa_printf(MSG_DEBUG, "P2P: Unavailable service " 3149 "protocol %u", srv_proto); 3150 wpas_sd_add_proto_not_avail(resp, srv_proto, 3151 srv_trans_id); 3152 break; 3153 } 3154 3155 pos = tlv_end; 3156 } 3157 3158 done: 3159 wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token, 3160 update_indic, tlvs, tlvs_len); 3161 3162 wpas_p2p_sd_response(wpa_s, freq, sa, dialog_token, resp); 3163 3164 wpabuf_free(resp); 3165 } 3166 3167 3168 static void wpas_sd_p2ps_serv_response(struct wpa_supplicant *wpa_s, 3169 const u8 *sa, u8 srv_trans_id, 3170 const u8 *pos, const u8 *tlv_end) 3171 { 3172 u8 left = *pos++; 3173 u32 adv_id; 3174 u8 svc_status; 3175 u16 config_methods; 3176 char svc_str[256]; 3177 3178 while (left-- && pos < tlv_end) { 3179 char *buf = NULL; 3180 size_t buf_len; 3181 u8 svc_len; 3182 3183 /* Sanity check fixed length+svc_str */ 3184 if (pos + 6 >= tlv_end) 3185 break; 3186 svc_len = pos[6]; 3187 if (pos + svc_len + 10 > tlv_end) 3188 break; 3189 3190 /* Advertisement ID */ 3191 adv_id = WPA_GET_LE32(pos); 3192 pos += sizeof(u32); 3193 3194 /* Config Methods */ 3195 config_methods = WPA_GET_BE16(pos); 3196 pos += sizeof(u16); 3197 3198 /* Service Name */ 3199 pos++; /* svc_len */ 3200 os_memcpy(svc_str, pos, svc_len); 3201 svc_str[svc_len] = '\0'; 3202 pos += svc_len; 3203 3204 /* Service Status */ 3205 svc_status = *pos++; 3206 3207 /* Service Information Length */ 3208 buf_len = WPA_GET_LE16(pos); 3209 pos += sizeof(u16); 3210 3211 /* Sanity check buffer length */ 3212 if (buf_len > (unsigned int) (tlv_end - pos)) 3213 break; 3214 3215 if (buf_len) { 3216 buf = os_zalloc(2 * buf_len + 1); 3217 if (buf) { 3218 utf8_escape((const char *) pos, buf_len, buf, 3219 2 * buf_len + 1); 3220 } 3221 } 3222 3223 pos += buf_len; 3224 3225 if (buf) { 3226 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_SERV_ASP_RESP 3227 MACSTR " %x %x %x %x %s '%s'", 3228 MAC2STR(sa), srv_trans_id, adv_id, 3229 svc_status, config_methods, svc_str, 3230 buf); 3231 os_free(buf); 3232 } else { 3233 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_SERV_ASP_RESP 3234 MACSTR " %x %x %x %x %s", 3235 MAC2STR(sa), srv_trans_id, adv_id, 3236 svc_status, config_methods, svc_str); 3237 } 3238 } 3239 } 3240 3241 3242 static void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic, 3243 const u8 *tlvs, size_t tlvs_len) 3244 { 3245 struct wpa_supplicant *wpa_s = ctx; 3246 const u8 *pos = tlvs; 3247 const u8 *end = tlvs + tlvs_len; 3248 const u8 *tlv_end; 3249 u16 slen; 3250 size_t buf_len; 3251 char *buf; 3252 3253 wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Response TLVs", 3254 tlvs, tlvs_len); 3255 if (tlvs_len > 1500) { 3256 /* TODO: better way for handling this */ 3257 wpa_msg_ctrl(wpa_s, MSG_INFO, 3258 P2P_EVENT_SERV_DISC_RESP MACSTR 3259 " %u <long response: %u bytes>", 3260 MAC2STR(sa), update_indic, 3261 (unsigned int) tlvs_len); 3262 } else { 3263 buf_len = 2 * tlvs_len + 1; 3264 buf = os_malloc(buf_len); 3265 if (buf) { 3266 wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len); 3267 wpa_msg_ctrl(wpa_s, MSG_INFO, 3268 P2P_EVENT_SERV_DISC_RESP MACSTR " %u %s", 3269 MAC2STR(sa), update_indic, buf); 3270 os_free(buf); 3271 } 3272 } 3273 3274 while (pos < end) { 3275 u8 srv_proto, srv_trans_id, status; 3276 3277 wpa_printf(MSG_DEBUG, "P2P: Service Response TLV"); 3278 slen = WPA_GET_LE16(pos); 3279 pos += 2; 3280 if (pos + slen > end || slen < 3) { 3281 wpa_printf(MSG_DEBUG, "P2P: Unexpected Response Data " 3282 "length"); 3283 return; 3284 } 3285 tlv_end = pos + slen; 3286 3287 srv_proto = *pos++; 3288 wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u", 3289 srv_proto); 3290 srv_trans_id = *pos++; 3291 wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u", 3292 srv_trans_id); 3293 status = *pos++; 3294 wpa_printf(MSG_DEBUG, "P2P: Status Code ID %u", 3295 status); 3296 3297 wpa_hexdump(MSG_MSGDUMP, "P2P: Response Data", 3298 pos, tlv_end - pos); 3299 3300 if (srv_proto == P2P_SERV_P2PS && pos < tlv_end) { 3301 wpas_sd_p2ps_serv_response(wpa_s, sa, srv_trans_id, 3302 pos, tlv_end); 3303 } 3304 3305 pos = tlv_end; 3306 } 3307 3308 wpas_notify_p2p_sd_response(wpa_s, sa, update_indic, tlvs, tlvs_len); 3309 } 3310 3311 3312 u64 wpas_p2p_sd_request(struct wpa_supplicant *wpa_s, const u8 *dst, 3313 const struct wpabuf *tlvs) 3314 { 3315 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 3316 return 0; 3317 return (uintptr_t) p2p_sd_request(wpa_s->global->p2p, dst, tlvs); 3318 } 3319 3320 3321 u64 wpas_p2p_sd_request_upnp(struct wpa_supplicant *wpa_s, const u8 *dst, 3322 u8 version, const char *query) 3323 { 3324 struct wpabuf *tlvs; 3325 u64 ret; 3326 3327 tlvs = wpabuf_alloc(2 + 1 + 1 + 1 + os_strlen(query)); 3328 if (tlvs == NULL) 3329 return 0; 3330 wpabuf_put_le16(tlvs, 1 + 1 + 1 + os_strlen(query)); 3331 wpabuf_put_u8(tlvs, P2P_SERV_UPNP); /* Service Protocol Type */ 3332 wpabuf_put_u8(tlvs, 1); /* Service Transaction ID */ 3333 wpabuf_put_u8(tlvs, version); 3334 wpabuf_put_str(tlvs, query); 3335 ret = wpas_p2p_sd_request(wpa_s, dst, tlvs); 3336 wpabuf_free(tlvs); 3337 return ret; 3338 } 3339 3340 3341 u64 wpas_p2p_sd_request_asp(struct wpa_supplicant *wpa_s, const u8 *dst, u8 id, 3342 const char *svc_str, const char *info_substr) 3343 { 3344 struct wpabuf *tlvs; 3345 size_t plen, svc_len, substr_len = 0; 3346 u64 ret; 3347 3348 svc_len = os_strlen(svc_str); 3349 if (info_substr) 3350 substr_len = os_strlen(info_substr); 3351 3352 if (svc_len > 0xff || substr_len > 0xff) 3353 return 0; 3354 3355 plen = 1 + 1 + 1 + svc_len + 1 + substr_len; 3356 tlvs = wpabuf_alloc(2 + plen); 3357 if (tlvs == NULL) 3358 return 0; 3359 3360 wpabuf_put_le16(tlvs, plen); 3361 wpabuf_put_u8(tlvs, P2P_SERV_P2PS); 3362 wpabuf_put_u8(tlvs, id); /* Service Transaction ID */ 3363 wpabuf_put_u8(tlvs, (u8) svc_len); /* Service String Length */ 3364 wpabuf_put_data(tlvs, svc_str, svc_len); 3365 wpabuf_put_u8(tlvs, (u8) substr_len); /* Info Substring Length */ 3366 wpabuf_put_data(tlvs, info_substr, substr_len); 3367 ret = wpas_p2p_sd_request(wpa_s, dst, tlvs); 3368 wpabuf_free(tlvs); 3369 3370 return ret; 3371 } 3372 3373 3374 #ifdef CONFIG_WIFI_DISPLAY 3375 3376 static u64 wpas_p2p_sd_request_wfd(struct wpa_supplicant *wpa_s, const u8 *dst, 3377 const struct wpabuf *tlvs) 3378 { 3379 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 3380 return 0; 3381 return (uintptr_t) p2p_sd_request_wfd(wpa_s->global->p2p, dst, tlvs); 3382 } 3383 3384 3385 #define MAX_WFD_SD_SUBELEMS 20 3386 3387 static void wfd_add_sd_req_role(struct wpabuf *tlvs, u8 id, u8 role, 3388 const char *subelems) 3389 { 3390 u8 *len; 3391 const char *pos; 3392 int val; 3393 int count = 0; 3394 3395 len = wpabuf_put(tlvs, 2); 3396 wpabuf_put_u8(tlvs, P2P_SERV_WIFI_DISPLAY); /* Service Protocol Type */ 3397 wpabuf_put_u8(tlvs, id); /* Service Transaction ID */ 3398 3399 wpabuf_put_u8(tlvs, role); 3400 3401 pos = subelems; 3402 while (*pos) { 3403 val = atoi(pos); 3404 if (val >= 0 && val < 256) { 3405 wpabuf_put_u8(tlvs, val); 3406 count++; 3407 if (count == MAX_WFD_SD_SUBELEMS) 3408 break; 3409 } 3410 pos = os_strchr(pos + 1, ','); 3411 if (pos == NULL) 3412 break; 3413 pos++; 3414 } 3415 3416 WPA_PUT_LE16(len, (u8 *) wpabuf_put(tlvs, 0) - len - 2); 3417 } 3418 3419 3420 u64 wpas_p2p_sd_request_wifi_display(struct wpa_supplicant *wpa_s, 3421 const u8 *dst, const char *role) 3422 { 3423 struct wpabuf *tlvs; 3424 u64 ret; 3425 const char *subelems; 3426 u8 id = 1; 3427 3428 subelems = os_strchr(role, ' '); 3429 if (subelems == NULL) 3430 return 0; 3431 subelems++; 3432 3433 tlvs = wpabuf_alloc(4 * (2 + 1 + 1 + 1 + MAX_WFD_SD_SUBELEMS)); 3434 if (tlvs == NULL) 3435 return 0; 3436 3437 if (os_strstr(role, "[source]")) 3438 wfd_add_sd_req_role(tlvs, id++, 0x00, subelems); 3439 if (os_strstr(role, "[pri-sink]")) 3440 wfd_add_sd_req_role(tlvs, id++, 0x01, subelems); 3441 if (os_strstr(role, "[sec-sink]")) 3442 wfd_add_sd_req_role(tlvs, id++, 0x02, subelems); 3443 if (os_strstr(role, "[source+sink]")) 3444 wfd_add_sd_req_role(tlvs, id++, 0x03, subelems); 3445 3446 ret = wpas_p2p_sd_request_wfd(wpa_s, dst, tlvs); 3447 wpabuf_free(tlvs); 3448 return ret; 3449 } 3450 3451 #endif /* CONFIG_WIFI_DISPLAY */ 3452 3453 3454 int wpas_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s, u64 req) 3455 { 3456 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 3457 return -1; 3458 return p2p_sd_cancel_request(wpa_s->global->p2p, 3459 (void *) (uintptr_t) req); 3460 } 3461 3462 3463 void wpas_p2p_sd_response(struct wpa_supplicant *wpa_s, int freq, 3464 const u8 *dst, u8 dialog_token, 3465 const struct wpabuf *resp_tlvs) 3466 { 3467 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 3468 return; 3469 p2p_sd_response(wpa_s->global->p2p, freq, dst, dialog_token, 3470 resp_tlvs); 3471 } 3472 3473 3474 void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s) 3475 { 3476 if (wpa_s->global->p2p) 3477 p2p_sd_service_update(wpa_s->global->p2p); 3478 } 3479 3480 3481 static void wpas_p2p_srv_bonjour_free(struct p2p_srv_bonjour *bsrv) 3482 { 3483 dl_list_del(&bsrv->list); 3484 wpabuf_free(bsrv->query); 3485 wpabuf_free(bsrv->resp); 3486 os_free(bsrv); 3487 } 3488 3489 3490 static void wpas_p2p_srv_upnp_free(struct p2p_srv_upnp *usrv) 3491 { 3492 dl_list_del(&usrv->list); 3493 os_free(usrv->service); 3494 os_free(usrv); 3495 } 3496 3497 3498 void wpas_p2p_service_flush(struct wpa_supplicant *wpa_s) 3499 { 3500 struct p2p_srv_bonjour *bsrv, *bn; 3501 struct p2p_srv_upnp *usrv, *un; 3502 3503 dl_list_for_each_safe(bsrv, bn, &wpa_s->global->p2p_srv_bonjour, 3504 struct p2p_srv_bonjour, list) 3505 wpas_p2p_srv_bonjour_free(bsrv); 3506 3507 dl_list_for_each_safe(usrv, un, &wpa_s->global->p2p_srv_upnp, 3508 struct p2p_srv_upnp, list) 3509 wpas_p2p_srv_upnp_free(usrv); 3510 3511 wpas_p2p_sd_service_update(wpa_s); 3512 } 3513 3514 3515 int wpas_p2p_service_p2ps_id_exists(struct wpa_supplicant *wpa_s, u32 adv_id) 3516 { 3517 if (adv_id == 0) 3518 return 1; 3519 3520 if (p2p_service_p2ps_id(wpa_s->global->p2p, adv_id)) 3521 return 1; 3522 3523 return 0; 3524 } 3525 3526 3527 int wpas_p2p_service_del_asp(struct wpa_supplicant *wpa_s, u32 adv_id) 3528 { 3529 return p2p_service_del_asp(wpa_s->global->p2p, adv_id); 3530 } 3531 3532 3533 int wpas_p2p_service_add_asp(struct wpa_supplicant *wpa_s, 3534 int auto_accept, u32 adv_id, 3535 const char *adv_str, u8 svc_state, 3536 u16 config_methods, const char *svc_info) 3537 { 3538 return p2p_service_add_asp(wpa_s->global->p2p, auto_accept, adv_id, 3539 adv_str, svc_state, config_methods, 3540 svc_info); 3541 } 3542 3543 3544 int wpas_p2p_service_add_bonjour(struct wpa_supplicant *wpa_s, 3545 struct wpabuf *query, struct wpabuf *resp) 3546 { 3547 struct p2p_srv_bonjour *bsrv; 3548 3549 bsrv = os_zalloc(sizeof(*bsrv)); 3550 if (bsrv == NULL) 3551 return -1; 3552 bsrv->query = query; 3553 bsrv->resp = resp; 3554 dl_list_add(&wpa_s->global->p2p_srv_bonjour, &bsrv->list); 3555 3556 wpas_p2p_sd_service_update(wpa_s); 3557 return 0; 3558 } 3559 3560 3561 int wpas_p2p_service_del_bonjour(struct wpa_supplicant *wpa_s, 3562 const struct wpabuf *query) 3563 { 3564 struct p2p_srv_bonjour *bsrv; 3565 3566 bsrv = wpas_p2p_service_get_bonjour(wpa_s, query); 3567 if (bsrv == NULL) 3568 return -1; 3569 wpas_p2p_srv_bonjour_free(bsrv); 3570 wpas_p2p_sd_service_update(wpa_s); 3571 return 0; 3572 } 3573 3574 3575 int wpas_p2p_service_add_upnp(struct wpa_supplicant *wpa_s, u8 version, 3576 const char *service) 3577 { 3578 struct p2p_srv_upnp *usrv; 3579 3580 if (wpas_p2p_service_get_upnp(wpa_s, version, service)) 3581 return 0; /* Already listed */ 3582 usrv = os_zalloc(sizeof(*usrv)); 3583 if (usrv == NULL) 3584 return -1; 3585 usrv->version = version; 3586 usrv->service = os_strdup(service); 3587 if (usrv->service == NULL) { 3588 os_free(usrv); 3589 return -1; 3590 } 3591 dl_list_add(&wpa_s->global->p2p_srv_upnp, &usrv->list); 3592 3593 wpas_p2p_sd_service_update(wpa_s); 3594 return 0; 3595 } 3596 3597 3598 int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version, 3599 const char *service) 3600 { 3601 struct p2p_srv_upnp *usrv; 3602 3603 usrv = wpas_p2p_service_get_upnp(wpa_s, version, service); 3604 if (usrv == NULL) 3605 return -1; 3606 wpas_p2p_srv_upnp_free(usrv); 3607 wpas_p2p_sd_service_update(wpa_s); 3608 return 0; 3609 } 3610 3611 3612 static void wpas_prov_disc_local_display(struct wpa_supplicant *wpa_s, 3613 const u8 *peer, const char *params, 3614 unsigned int generated_pin) 3615 { 3616 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_SHOW_PIN MACSTR 3617 " %08d%s", MAC2STR(peer), generated_pin, params); 3618 } 3619 3620 3621 static void wpas_prov_disc_local_keypad(struct wpa_supplicant *wpa_s, 3622 const u8 *peer, const char *params) 3623 { 3624 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_ENTER_PIN MACSTR 3625 "%s", MAC2STR(peer), params); 3626 } 3627 3628 3629 static void wpas_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods, 3630 const u8 *dev_addr, const u8 *pri_dev_type, 3631 const char *dev_name, u16 supp_config_methods, 3632 u8 dev_capab, u8 group_capab, const u8 *group_id, 3633 size_t group_id_len) 3634 { 3635 struct wpa_supplicant *wpa_s = ctx; 3636 char devtype[WPS_DEV_TYPE_BUFSIZE]; 3637 char params[300]; 3638 u8 empty_dev_type[8]; 3639 unsigned int generated_pin = 0; 3640 struct wpa_supplicant *group = NULL; 3641 int res; 3642 3643 if (group_id) { 3644 for (group = wpa_s->global->ifaces; group; group = group->next) 3645 { 3646 struct wpa_ssid *s = group->current_ssid; 3647 if (s != NULL && 3648 s->mode == WPAS_MODE_P2P_GO && 3649 group_id_len - ETH_ALEN == s->ssid_len && 3650 os_memcmp(group_id + ETH_ALEN, s->ssid, 3651 s->ssid_len) == 0) 3652 break; 3653 } 3654 } 3655 3656 if (pri_dev_type == NULL) { 3657 os_memset(empty_dev_type, 0, sizeof(empty_dev_type)); 3658 pri_dev_type = empty_dev_type; 3659 } 3660 res = os_snprintf(params, sizeof(params), " p2p_dev_addr=" MACSTR 3661 " pri_dev_type=%s name='%s' config_methods=0x%x " 3662 "dev_capab=0x%x group_capab=0x%x%s%s", 3663 MAC2STR(dev_addr), 3664 wps_dev_type_bin2str(pri_dev_type, devtype, 3665 sizeof(devtype)), 3666 dev_name, supp_config_methods, dev_capab, group_capab, 3667 group ? " group=" : "", 3668 group ? group->ifname : ""); 3669 if (os_snprintf_error(sizeof(params), res)) 3670 wpa_printf(MSG_DEBUG, "P2P: PD Request event truncated"); 3671 params[sizeof(params) - 1] = '\0'; 3672 3673 if (config_methods & WPS_CONFIG_DISPLAY) { 3674 generated_pin = wps_generate_pin(); 3675 wpas_prov_disc_local_display(wpa_s, peer, params, 3676 generated_pin); 3677 } else if (config_methods & WPS_CONFIG_KEYPAD) 3678 wpas_prov_disc_local_keypad(wpa_s, peer, params); 3679 else if (config_methods & WPS_CONFIG_PUSHBUTTON) 3680 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_REQ 3681 MACSTR "%s", MAC2STR(peer), params); 3682 3683 wpas_notify_p2p_provision_discovery(wpa_s, peer, 1 /* request */, 3684 P2P_PROV_DISC_SUCCESS, 3685 config_methods, generated_pin); 3686 } 3687 3688 3689 static void wpas_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods) 3690 { 3691 struct wpa_supplicant *wpa_s = ctx; 3692 unsigned int generated_pin = 0; 3693 char params[20]; 3694 3695 if (wpa_s->pending_pd_before_join && 3696 (os_memcmp(peer, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 || 3697 os_memcmp(peer, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0)) { 3698 wpa_s->pending_pd_before_join = 0; 3699 wpa_printf(MSG_DEBUG, "P2P: Starting pending " 3700 "join-existing-group operation"); 3701 wpas_p2p_join_start(wpa_s, 0, NULL, 0); 3702 return; 3703 } 3704 3705 if (wpa_s->pending_pd_use == AUTO_PD_JOIN || 3706 wpa_s->pending_pd_use == AUTO_PD_GO_NEG) { 3707 int res; 3708 3709 res = os_snprintf(params, sizeof(params), " peer_go=%d", 3710 wpa_s->pending_pd_use == AUTO_PD_JOIN); 3711 if (os_snprintf_error(sizeof(params), res)) 3712 params[sizeof(params) - 1] = '\0'; 3713 } else 3714 params[0] = '\0'; 3715 3716 if (config_methods & WPS_CONFIG_DISPLAY) 3717 wpas_prov_disc_local_keypad(wpa_s, peer, params); 3718 else if (config_methods & WPS_CONFIG_KEYPAD) { 3719 generated_pin = wps_generate_pin(); 3720 wpas_prov_disc_local_display(wpa_s, peer, params, 3721 generated_pin); 3722 } else if (config_methods & WPS_CONFIG_PUSHBUTTON) 3723 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_RESP 3724 MACSTR "%s", MAC2STR(peer), params); 3725 3726 wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */, 3727 P2P_PROV_DISC_SUCCESS, 3728 config_methods, generated_pin); 3729 } 3730 3731 3732 static void wpas_prov_disc_fail(void *ctx, const u8 *peer, 3733 enum p2p_prov_disc_status status, 3734 u32 adv_id, const u8 *adv_mac, 3735 const char *deferred_session_resp) 3736 { 3737 struct wpa_supplicant *wpa_s = ctx; 3738 3739 if (wpa_s->p2p_fallback_to_go_neg) { 3740 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: PD for p2p_connect-auto " 3741 "failed - fall back to GO Negotiation"); 3742 wpa_msg_global(wpa_s->parent, MSG_INFO, 3743 P2P_EVENT_FALLBACK_TO_GO_NEG 3744 "reason=PD-failed"); 3745 wpas_p2p_fallback_to_go_neg(wpa_s, 0); 3746 return; 3747 } 3748 3749 if (status == P2P_PROV_DISC_TIMEOUT_JOIN) { 3750 wpa_s->pending_pd_before_join = 0; 3751 wpa_printf(MSG_DEBUG, "P2P: Starting pending " 3752 "join-existing-group operation (no ACK for PD " 3753 "Req attempts)"); 3754 wpas_p2p_join_start(wpa_s, 0, NULL, 0); 3755 return; 3756 } 3757 3758 if (adv_id && adv_mac && deferred_session_resp) { 3759 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE 3760 " p2p_dev_addr=" MACSTR " status=%d adv_id=%x" 3761 " deferred_session_resp='%s'", 3762 MAC2STR(peer), status, adv_id, 3763 deferred_session_resp); 3764 } else if (adv_id && adv_mac) { 3765 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE 3766 " p2p_dev_addr=" MACSTR " status=%d adv_id=%x", 3767 MAC2STR(peer), status, adv_id); 3768 } else { 3769 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE 3770 " p2p_dev_addr=" MACSTR " status=%d", 3771 MAC2STR(peer), status); 3772 } 3773 3774 wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */, 3775 status, 0, 0); 3776 } 3777 3778 3779 static int freq_included(const struct p2p_channels *channels, unsigned int freq) 3780 { 3781 if (channels == NULL) 3782 return 1; /* Assume no restrictions */ 3783 return p2p_channels_includes_freq(channels, freq); 3784 3785 } 3786 3787 3788 /** 3789 * Pick the best frequency to use from all the currently used frequencies. 3790 */ 3791 static int wpas_p2p_pick_best_used_freq(struct wpa_supplicant *wpa_s, 3792 struct wpa_used_freq_data *freqs, 3793 unsigned int num) 3794 { 3795 unsigned int i, c; 3796 3797 /* find a candidate freq that is supported by P2P */ 3798 for (c = 0; c < num; c++) 3799 if (p2p_supported_freq(wpa_s->global->p2p, freqs[c].freq)) 3800 break; 3801 3802 if (c == num) 3803 return 0; 3804 3805 /* once we have a candidate, try to find a 'better' one */ 3806 for (i = c + 1; i < num; i++) { 3807 if (!p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq)) 3808 continue; 3809 3810 /* 3811 * 1. Infrastructure station interfaces have higher preference. 3812 * 2. P2P Clients have higher preference. 3813 * 3. All others. 3814 */ 3815 if (freqs[i].flags & WPA_FREQ_USED_BY_INFRA_STATION) { 3816 c = i; 3817 break; 3818 } 3819 3820 if ((freqs[i].flags & WPA_FREQ_USED_BY_P2P_CLIENT)) 3821 c = i; 3822 } 3823 return freqs[c].freq; 3824 } 3825 3826 3827 static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid, 3828 const u8 *go_dev_addr, const u8 *ssid, 3829 size_t ssid_len, int *go, u8 *group_bssid, 3830 int *force_freq, int persistent_group, 3831 const struct p2p_channels *channels, 3832 int dev_pw_id) 3833 { 3834 struct wpa_supplicant *wpa_s = ctx; 3835 struct wpa_ssid *s; 3836 struct wpa_used_freq_data *freqs; 3837 struct wpa_supplicant *grp; 3838 int best_freq; 3839 3840 if (!persistent_group) { 3841 wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR 3842 " to join an active group (SSID: %s)", 3843 MAC2STR(sa), wpa_ssid_txt(ssid, ssid_len)); 3844 if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) && 3845 (os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN) 3846 == 0 || 3847 os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0)) { 3848 wpa_printf(MSG_DEBUG, "P2P: Accept previously " 3849 "authorized invitation"); 3850 goto accept_inv; 3851 } 3852 3853 #ifdef CONFIG_WPS_NFC 3854 if (dev_pw_id >= 0 && wpa_s->p2p_nfc_tag_enabled && 3855 dev_pw_id == wpa_s->p2p_oob_dev_pw_id) { 3856 wpa_printf(MSG_DEBUG, "P2P: Accept invitation based on local enabled NFC Tag"); 3857 wpa_s->p2p_wps_method = WPS_NFC; 3858 wpa_s->pending_join_wps_method = WPS_NFC; 3859 os_memcpy(wpa_s->pending_join_dev_addr, 3860 go_dev_addr, ETH_ALEN); 3861 os_memcpy(wpa_s->pending_join_iface_addr, 3862 bssid, ETH_ALEN); 3863 goto accept_inv; 3864 } 3865 #endif /* CONFIG_WPS_NFC */ 3866 3867 /* 3868 * Do not accept the invitation automatically; notify user and 3869 * request approval. 3870 */ 3871 return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE; 3872 } 3873 3874 grp = wpas_get_p2p_group(wpa_s, ssid, ssid_len, go); 3875 if (grp) { 3876 wpa_printf(MSG_DEBUG, "P2P: Accept invitation to already " 3877 "running persistent group"); 3878 if (*go) 3879 os_memcpy(group_bssid, grp->own_addr, ETH_ALEN); 3880 goto accept_inv; 3881 } 3882 3883 if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) && 3884 os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0) { 3885 wpa_printf(MSG_DEBUG, "P2P: Accept previously initiated " 3886 "invitation to re-invoke a persistent group"); 3887 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN); 3888 } else if (!wpa_s->conf->persistent_reconnect) 3889 return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE; 3890 3891 for (s = wpa_s->conf->ssid; s; s = s->next) { 3892 if (s->disabled == 2 && 3893 os_memcmp(s->bssid, go_dev_addr, ETH_ALEN) == 0 && 3894 s->ssid_len == ssid_len && 3895 os_memcmp(ssid, s->ssid, ssid_len) == 0) 3896 break; 3897 } 3898 3899 if (!s) { 3900 wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR 3901 " requested reinvocation of an unknown group", 3902 MAC2STR(sa)); 3903 return P2P_SC_FAIL_UNKNOWN_GROUP; 3904 } 3905 3906 if (s->mode == WPAS_MODE_P2P_GO && !wpas_p2p_create_iface(wpa_s)) { 3907 *go = 1; 3908 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) { 3909 wpa_printf(MSG_DEBUG, "P2P: The only available " 3910 "interface is already in use - reject " 3911 "invitation"); 3912 return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE; 3913 } 3914 os_memcpy(group_bssid, wpa_s->own_addr, ETH_ALEN); 3915 } else if (s->mode == WPAS_MODE_P2P_GO) { 3916 *go = 1; 3917 if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO) < 0) 3918 { 3919 wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new " 3920 "interface address for the group"); 3921 return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE; 3922 } 3923 os_memcpy(group_bssid, wpa_s->pending_interface_addr, 3924 ETH_ALEN); 3925 } 3926 3927 accept_inv: 3928 wpas_p2p_set_own_freq_preference(wpa_s, 0); 3929 3930 best_freq = 0; 3931 freqs = os_calloc(wpa_s->num_multichan_concurrent, 3932 sizeof(struct wpa_used_freq_data)); 3933 if (freqs) { 3934 int num_channels = wpa_s->num_multichan_concurrent; 3935 int num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, num_channels); 3936 best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num); 3937 os_free(freqs); 3938 } 3939 3940 /* Get one of the frequencies currently in use */ 3941 if (best_freq > 0) { 3942 wpa_printf(MSG_DEBUG, "P2P: Trying to prefer a channel already used by one of the interfaces"); 3943 wpas_p2p_set_own_freq_preference(wpa_s, best_freq); 3944 3945 if (wpa_s->num_multichan_concurrent < 2 || 3946 wpas_p2p_num_unused_channels(wpa_s) < 1) { 3947 wpa_printf(MSG_DEBUG, "P2P: No extra channels available - trying to force channel to match a channel already used by one of the interfaces"); 3948 *force_freq = best_freq; 3949 } 3950 } 3951 3952 if (*force_freq > 0 && wpa_s->num_multichan_concurrent > 1 && 3953 wpas_p2p_num_unused_channels(wpa_s) > 0) { 3954 if (*go == 0) { 3955 /* We are the client */ 3956 wpa_printf(MSG_DEBUG, "P2P: Peer was found to be " 3957 "running a GO but we are capable of MCC, " 3958 "figure out the best channel to use"); 3959 *force_freq = 0; 3960 } else if (!freq_included(channels, *force_freq)) { 3961 /* We are the GO, and *force_freq is not in the 3962 * intersection */ 3963 wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not " 3964 "in intersection but we are capable of MCC, " 3965 "figure out the best channel to use", 3966 *force_freq); 3967 *force_freq = 0; 3968 } 3969 } 3970 3971 return P2P_SC_SUCCESS; 3972 } 3973 3974 3975 static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid, 3976 const u8 *ssid, size_t ssid_len, 3977 const u8 *go_dev_addr, u8 status, 3978 int op_freq) 3979 { 3980 struct wpa_supplicant *wpa_s = ctx; 3981 struct wpa_ssid *s; 3982 3983 for (s = wpa_s->conf->ssid; s; s = s->next) { 3984 if (s->disabled == 2 && 3985 s->ssid_len == ssid_len && 3986 os_memcmp(ssid, s->ssid, ssid_len) == 0) 3987 break; 3988 } 3989 3990 if (status == P2P_SC_SUCCESS) { 3991 wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR 3992 " was accepted; op_freq=%d MHz, SSID=%s", 3993 MAC2STR(sa), op_freq, wpa_ssid_txt(ssid, ssid_len)); 3994 if (s) { 3995 int go = s->mode == WPAS_MODE_P2P_GO; 3996 wpas_p2p_group_add_persistent( 3997 wpa_s, s, go, 0, op_freq, 0, 0, NULL, 3998 go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0); 3999 } else if (bssid) { 4000 wpa_s->user_initiated_pd = 0; 4001 wpas_p2p_join(wpa_s, bssid, go_dev_addr, 4002 wpa_s->p2p_wps_method, 0, op_freq, 4003 ssid, ssid_len); 4004 } 4005 return; 4006 } 4007 4008 if (status != P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) { 4009 wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR 4010 " was rejected (status %u)", MAC2STR(sa), status); 4011 return; 4012 } 4013 4014 if (!s) { 4015 if (bssid) { 4016 wpa_msg_global(wpa_s, MSG_INFO, 4017 P2P_EVENT_INVITATION_RECEIVED 4018 "sa=" MACSTR " go_dev_addr=" MACSTR 4019 " bssid=" MACSTR " unknown-network", 4020 MAC2STR(sa), MAC2STR(go_dev_addr), 4021 MAC2STR(bssid)); 4022 } else { 4023 wpa_msg_global(wpa_s, MSG_INFO, 4024 P2P_EVENT_INVITATION_RECEIVED 4025 "sa=" MACSTR " go_dev_addr=" MACSTR 4026 " unknown-network", 4027 MAC2STR(sa), MAC2STR(go_dev_addr)); 4028 } 4029 return; 4030 } 4031 4032 if (s->mode == WPAS_MODE_P2P_GO && op_freq) { 4033 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED 4034 "sa=" MACSTR " persistent=%d freq=%d", 4035 MAC2STR(sa), s->id, op_freq); 4036 } else { 4037 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED 4038 "sa=" MACSTR " persistent=%d", 4039 MAC2STR(sa), s->id); 4040 } 4041 } 4042 4043 4044 static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s, 4045 struct wpa_ssid *ssid, 4046 const u8 *peer, int inv) 4047 { 4048 size_t i; 4049 4050 if (ssid == NULL) 4051 return; 4052 4053 for (i = 0; ssid->p2p_client_list && i < ssid->num_p2p_clients; i++) { 4054 if (os_memcmp(ssid->p2p_client_list + i * 2 * ETH_ALEN, peer, 4055 ETH_ALEN) == 0) 4056 break; 4057 } 4058 if (i >= ssid->num_p2p_clients || !ssid->p2p_client_list) { 4059 if (ssid->mode != WPAS_MODE_P2P_GO && 4060 os_memcmp(ssid->bssid, peer, ETH_ALEN) == 0) { 4061 wpa_printf(MSG_DEBUG, "P2P: Remove persistent group %d " 4062 "due to invitation result", ssid->id); 4063 wpas_notify_network_removed(wpa_s, ssid); 4064 wpa_config_remove_network(wpa_s->conf, ssid->id); 4065 return; 4066 } 4067 return; /* Peer not found in client list */ 4068 } 4069 4070 wpa_printf(MSG_DEBUG, "P2P: Remove peer " MACSTR " from persistent " 4071 "group %d client list%s", 4072 MAC2STR(peer), ssid->id, 4073 inv ? " due to invitation result" : ""); 4074 os_memmove(ssid->p2p_client_list + i * 2 * ETH_ALEN, 4075 ssid->p2p_client_list + (i + 1) * 2 * ETH_ALEN, 4076 (ssid->num_p2p_clients - i - 1) * 2 * ETH_ALEN); 4077 ssid->num_p2p_clients--; 4078 if (wpa_s->parent->conf->update_config && 4079 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf)) 4080 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration"); 4081 } 4082 4083 4084 static void wpas_remove_persistent_client(struct wpa_supplicant *wpa_s, 4085 const u8 *peer) 4086 { 4087 struct wpa_ssid *ssid; 4088 4089 wpa_s = wpa_s->global->p2p_invite_group; 4090 if (wpa_s == NULL) 4091 return; /* No known invitation group */ 4092 ssid = wpa_s->current_ssid; 4093 if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO || 4094 !ssid->p2p_persistent_group) 4095 return; /* Not operating as a GO in persistent group */ 4096 ssid = wpas_p2p_get_persistent(wpa_s->parent, peer, 4097 ssid->ssid, ssid->ssid_len); 4098 wpas_remove_persistent_peer(wpa_s, ssid, peer, 1); 4099 } 4100 4101 4102 static void wpas_invitation_result(void *ctx, int status, const u8 *bssid, 4103 const struct p2p_channels *channels, 4104 const u8 *peer, int neg_freq, 4105 int peer_oper_freq) 4106 { 4107 struct wpa_supplicant *wpa_s = ctx; 4108 struct wpa_ssid *ssid; 4109 int freq; 4110 4111 if (bssid) { 4112 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT 4113 "status=%d " MACSTR, 4114 status, MAC2STR(bssid)); 4115 } else { 4116 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT 4117 "status=%d ", status); 4118 } 4119 wpas_notify_p2p_invitation_result(wpa_s, status, bssid); 4120 4121 wpa_printf(MSG_DEBUG, "P2P: Invitation result - status=%d peer=" MACSTR, 4122 status, MAC2STR(peer)); 4123 if (wpa_s->pending_invite_ssid_id == -1) { 4124 if (status == P2P_SC_FAIL_UNKNOWN_GROUP) 4125 wpas_remove_persistent_client(wpa_s, peer); 4126 return; /* Invitation to active group */ 4127 } 4128 4129 if (status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) { 4130 wpa_printf(MSG_DEBUG, "P2P: Waiting for peer to start another " 4131 "invitation exchange to indicate readiness for " 4132 "re-invocation"); 4133 } 4134 4135 if (status != P2P_SC_SUCCESS) { 4136 if (status == P2P_SC_FAIL_UNKNOWN_GROUP) { 4137 ssid = wpa_config_get_network( 4138 wpa_s->conf, wpa_s->pending_invite_ssid_id); 4139 wpas_remove_persistent_peer(wpa_s, ssid, peer, 1); 4140 } 4141 wpas_p2p_remove_pending_group_interface(wpa_s); 4142 return; 4143 } 4144 4145 ssid = wpa_config_get_network(wpa_s->conf, 4146 wpa_s->pending_invite_ssid_id); 4147 if (ssid == NULL) { 4148 wpa_printf(MSG_ERROR, "P2P: Could not find persistent group " 4149 "data matching with invitation"); 4150 return; 4151 } 4152 4153 /* 4154 * The peer could have missed our ctrl::ack frame for Invitation 4155 * Response and continue retransmitting the frame. To reduce the 4156 * likelihood of the peer not getting successful TX status for the 4157 * Invitation Response frame, wait a short time here before starting 4158 * the persistent group so that we will remain on the current channel to 4159 * acknowledge any possible retransmission from the peer. 4160 */ 4161 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before " 4162 "starting persistent group"); 4163 os_sleep(0, 50000); 4164 4165 if (neg_freq > 0 && ssid->mode == WPAS_MODE_P2P_GO && 4166 freq_included(channels, neg_freq)) 4167 freq = neg_freq; 4168 else if (peer_oper_freq > 0 && ssid->mode != WPAS_MODE_P2P_GO && 4169 freq_included(channels, peer_oper_freq)) 4170 freq = peer_oper_freq; 4171 else 4172 freq = 0; 4173 4174 wpa_printf(MSG_DEBUG, "P2P: Persistent group invitation success - op_freq=%d MHz SSID=%s", 4175 freq, wpa_ssid_txt(ssid->ssid, ssid->ssid_len)); 4176 wpas_p2p_group_add_persistent(wpa_s, ssid, 4177 ssid->mode == WPAS_MODE_P2P_GO, 4178 wpa_s->p2p_persistent_go_freq, 4179 freq, 4180 wpa_s->p2p_go_ht40, wpa_s->p2p_go_vht, 4181 channels, 4182 ssid->mode == WPAS_MODE_P2P_GO ? 4183 P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 4184 0); 4185 } 4186 4187 4188 static int wpas_p2p_disallowed_freq(struct wpa_global *global, 4189 unsigned int freq) 4190 { 4191 if (freq_range_list_includes(&global->p2p_go_avoid_freq, freq)) 4192 return 1; 4193 return freq_range_list_includes(&global->p2p_disallow_freq, freq); 4194 } 4195 4196 4197 static void wpas_p2p_add_chan(struct p2p_reg_class *reg, u8 chan) 4198 { 4199 reg->channel[reg->channels] = chan; 4200 reg->channels++; 4201 } 4202 4203 4204 static int wpas_p2p_default_channels(struct wpa_supplicant *wpa_s, 4205 struct p2p_channels *chan, 4206 struct p2p_channels *cli_chan) 4207 { 4208 int i, cla = 0; 4209 4210 wpa_s->global->p2p_24ghz_social_channels = 1; 4211 4212 os_memset(cli_chan, 0, sizeof(*cli_chan)); 4213 4214 wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for 2.4 GHz " 4215 "band"); 4216 4217 /* Operating class 81 - 2.4 GHz band channels 1..13 */ 4218 chan->reg_class[cla].reg_class = 81; 4219 chan->reg_class[cla].channels = 0; 4220 for (i = 0; i < 11; i++) { 4221 if (!wpas_p2p_disallowed_freq(wpa_s->global, 2412 + i * 5)) 4222 wpas_p2p_add_chan(&chan->reg_class[cla], i + 1); 4223 } 4224 if (chan->reg_class[cla].channels) 4225 cla++; 4226 4227 wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for lower 5 GHz " 4228 "band"); 4229 4230 /* Operating class 115 - 5 GHz, channels 36-48 */ 4231 chan->reg_class[cla].reg_class = 115; 4232 chan->reg_class[cla].channels = 0; 4233 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 36 * 5)) 4234 wpas_p2p_add_chan(&chan->reg_class[cla], 36); 4235 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 40 * 5)) 4236 wpas_p2p_add_chan(&chan->reg_class[cla], 40); 4237 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 44 * 5)) 4238 wpas_p2p_add_chan(&chan->reg_class[cla], 44); 4239 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 48 * 5)) 4240 wpas_p2p_add_chan(&chan->reg_class[cla], 48); 4241 if (chan->reg_class[cla].channels) 4242 cla++; 4243 4244 wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for higher 5 GHz " 4245 "band"); 4246 4247 /* Operating class 124 - 5 GHz, channels 149,153,157,161 */ 4248 chan->reg_class[cla].reg_class = 124; 4249 chan->reg_class[cla].channels = 0; 4250 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 149 * 5)) 4251 wpas_p2p_add_chan(&chan->reg_class[cla], 149); 4252 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 153 * 5)) 4253 wpas_p2p_add_chan(&chan->reg_class[cla], 153); 4254 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 156 * 5)) 4255 wpas_p2p_add_chan(&chan->reg_class[cla], 157); 4256 if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 161 * 5)) 4257 wpas_p2p_add_chan(&chan->reg_class[cla], 161); 4258 if (chan->reg_class[cla].channels) 4259 cla++; 4260 4261 chan->reg_classes = cla; 4262 return 0; 4263 } 4264 4265 4266 static struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes, 4267 u16 num_modes, 4268 enum hostapd_hw_mode mode) 4269 { 4270 u16 i; 4271 4272 for (i = 0; i < num_modes; i++) { 4273 if (modes[i].mode == mode) 4274 return &modes[i]; 4275 } 4276 4277 return NULL; 4278 } 4279 4280 4281 enum chan_allowed { 4282 NOT_ALLOWED, NO_IR, ALLOWED 4283 }; 4284 4285 static int has_channel(struct wpa_global *global, 4286 struct hostapd_hw_modes *mode, u8 chan, int *flags) 4287 { 4288 int i; 4289 unsigned int freq; 4290 4291 freq = (mode->mode == HOSTAPD_MODE_IEEE80211A ? 5000 : 2407) + 4292 chan * 5; 4293 if (wpas_p2p_disallowed_freq(global, freq)) 4294 return NOT_ALLOWED; 4295 4296 for (i = 0; i < mode->num_channels; i++) { 4297 if (mode->channels[i].chan == chan) { 4298 if (flags) 4299 *flags = mode->channels[i].flag; 4300 if (mode->channels[i].flag & 4301 (HOSTAPD_CHAN_DISABLED | 4302 HOSTAPD_CHAN_RADAR)) 4303 return NOT_ALLOWED; 4304 if (mode->channels[i].flag & HOSTAPD_CHAN_NO_IR) 4305 return NO_IR; 4306 return ALLOWED; 4307 } 4308 } 4309 4310 return NOT_ALLOWED; 4311 } 4312 4313 4314 struct p2p_oper_class_map { 4315 enum hostapd_hw_mode mode; 4316 u8 op_class; 4317 u8 min_chan; 4318 u8 max_chan; 4319 u8 inc; 4320 enum { BW20, BW40PLUS, BW40MINUS, BW80, BW2160 } bw; 4321 }; 4322 4323 static struct p2p_oper_class_map op_class[] = { 4324 { HOSTAPD_MODE_IEEE80211G, 81, 1, 13, 1, BW20 }, 4325 #if 0 /* Do not enable HT40 on 2 GHz for now */ 4326 { HOSTAPD_MODE_IEEE80211G, 83, 1, 9, 1, BW40PLUS }, 4327 { HOSTAPD_MODE_IEEE80211G, 84, 5, 13, 1, BW40MINUS }, 4328 #endif 4329 { HOSTAPD_MODE_IEEE80211A, 115, 36, 48, 4, BW20 }, 4330 { HOSTAPD_MODE_IEEE80211A, 124, 149, 161, 4, BW20 }, 4331 { HOSTAPD_MODE_IEEE80211A, 116, 36, 44, 8, BW40PLUS }, 4332 { HOSTAPD_MODE_IEEE80211A, 117, 40, 48, 8, BW40MINUS }, 4333 { HOSTAPD_MODE_IEEE80211A, 126, 149, 157, 8, BW40PLUS }, 4334 { HOSTAPD_MODE_IEEE80211A, 127, 153, 161, 8, BW40MINUS }, 4335 4336 /* 4337 * IEEE P802.11ac/D7.0 Table E-4 actually talks about channel center 4338 * frequency index 42, 58, 106, 122, 138, 155 with channel spacing of 4339 * 80 MHz, but currently use the following definition for simplicity 4340 * (these center frequencies are not actual channels, which makes 4341 * has_channel() fail). wpas_p2p_verify_80mhz() should take care of 4342 * removing invalid channels. 4343 */ 4344 { HOSTAPD_MODE_IEEE80211A, 128, 36, 161, 4, BW80 }, 4345 { HOSTAPD_MODE_IEEE80211AD, 180, 1, 4, 1, BW2160 }, 4346 { -1, 0, 0, 0, 0, BW20 } 4347 }; 4348 4349 4350 static int wpas_p2p_get_center_80mhz(struct wpa_supplicant *wpa_s, 4351 struct hostapd_hw_modes *mode, 4352 u8 channel) 4353 { 4354 u8 center_channels[] = { 42, 58, 106, 122, 138, 155 }; 4355 unsigned int i; 4356 4357 if (mode->mode != HOSTAPD_MODE_IEEE80211A) 4358 return 0; 4359 4360 for (i = 0; i < ARRAY_SIZE(center_channels); i++) 4361 /* 4362 * In 80 MHz, the bandwidth "spans" 12 channels (e.g., 36-48), 4363 * so the center channel is 6 channels away from the start/end. 4364 */ 4365 if (channel >= center_channels[i] - 6 && 4366 channel <= center_channels[i] + 6) 4367 return center_channels[i]; 4368 4369 return 0; 4370 } 4371 4372 4373 static enum chan_allowed wpas_p2p_verify_80mhz(struct wpa_supplicant *wpa_s, 4374 struct hostapd_hw_modes *mode, 4375 u8 channel, u8 bw) 4376 { 4377 u8 center_chan; 4378 int i, flags; 4379 enum chan_allowed res, ret = ALLOWED; 4380 4381 center_chan = wpas_p2p_get_center_80mhz(wpa_s, mode, channel); 4382 if (!center_chan) 4383 return NOT_ALLOWED; 4384 if (center_chan >= 58 && center_chan <= 138) 4385 return NOT_ALLOWED; /* Do not allow DFS channels for P2P */ 4386 4387 /* check all the channels are available */ 4388 for (i = 0; i < 4; i++) { 4389 int adj_chan = center_chan - 6 + i * 4; 4390 4391 res = has_channel(wpa_s->global, mode, adj_chan, &flags); 4392 if (res == NOT_ALLOWED) 4393 return NOT_ALLOWED; 4394 if (res == NO_IR) 4395 ret = NO_IR; 4396 4397 if (i == 0 && !(flags & HOSTAPD_CHAN_VHT_10_70)) 4398 return NOT_ALLOWED; 4399 if (i == 1 && !(flags & HOSTAPD_CHAN_VHT_30_50)) 4400 return NOT_ALLOWED; 4401 if (i == 2 && !(flags & HOSTAPD_CHAN_VHT_50_30)) 4402 return NOT_ALLOWED; 4403 if (i == 3 && !(flags & HOSTAPD_CHAN_VHT_70_10)) 4404 return NOT_ALLOWED; 4405 } 4406 4407 return ret; 4408 } 4409 4410 4411 static enum chan_allowed wpas_p2p_verify_channel(struct wpa_supplicant *wpa_s, 4412 struct hostapd_hw_modes *mode, 4413 u8 channel, u8 bw) 4414 { 4415 int flag = 0; 4416 enum chan_allowed res, res2; 4417 4418 res2 = res = has_channel(wpa_s->global, mode, channel, &flag); 4419 if (bw == BW40MINUS) { 4420 if (!(flag & HOSTAPD_CHAN_HT40MINUS)) 4421 return NOT_ALLOWED; 4422 res2 = has_channel(wpa_s->global, mode, channel - 4, NULL); 4423 } else if (bw == BW40PLUS) { 4424 if (!(flag & HOSTAPD_CHAN_HT40PLUS)) 4425 return NOT_ALLOWED; 4426 res2 = has_channel(wpa_s->global, mode, channel + 4, NULL); 4427 } else if (bw == BW80) { 4428 res2 = wpas_p2p_verify_80mhz(wpa_s, mode, channel, bw); 4429 } 4430 4431 if (res == NOT_ALLOWED || res2 == NOT_ALLOWED) 4432 return NOT_ALLOWED; 4433 if (res == NO_IR || res2 == NO_IR) 4434 return NO_IR; 4435 return res; 4436 } 4437 4438 4439 static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s, 4440 struct p2p_channels *chan, 4441 struct p2p_channels *cli_chan) 4442 { 4443 struct hostapd_hw_modes *mode; 4444 int cla, op, cli_cla; 4445 4446 if (wpa_s->hw.modes == NULL) { 4447 wpa_printf(MSG_DEBUG, "P2P: Driver did not support fetching " 4448 "of all supported channels; assume dualband " 4449 "support"); 4450 return wpas_p2p_default_channels(wpa_s, chan, cli_chan); 4451 } 4452 4453 cla = cli_cla = 0; 4454 4455 for (op = 0; op_class[op].op_class; op++) { 4456 struct p2p_oper_class_map *o = &op_class[op]; 4457 u8 ch; 4458 struct p2p_reg_class *reg = NULL, *cli_reg = NULL; 4459 4460 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode); 4461 if (mode == NULL) 4462 continue; 4463 if (mode->mode == HOSTAPD_MODE_IEEE80211G) 4464 wpa_s->global->p2p_24ghz_social_channels = 1; 4465 for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) { 4466 enum chan_allowed res; 4467 res = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw); 4468 if (res == ALLOWED) { 4469 if (reg == NULL) { 4470 wpa_printf(MSG_DEBUG, "P2P: Add operating class %u", 4471 o->op_class); 4472 reg = &chan->reg_class[cla]; 4473 cla++; 4474 reg->reg_class = o->op_class; 4475 } 4476 reg->channel[reg->channels] = ch; 4477 reg->channels++; 4478 } else if (res == NO_IR && 4479 wpa_s->conf->p2p_add_cli_chan) { 4480 if (cli_reg == NULL) { 4481 wpa_printf(MSG_DEBUG, "P2P: Add operating class %u (client only)", 4482 o->op_class); 4483 cli_reg = &cli_chan->reg_class[cli_cla]; 4484 cli_cla++; 4485 cli_reg->reg_class = o->op_class; 4486 } 4487 cli_reg->channel[cli_reg->channels] = ch; 4488 cli_reg->channels++; 4489 } 4490 } 4491 if (reg) { 4492 wpa_hexdump(MSG_DEBUG, "P2P: Channels", 4493 reg->channel, reg->channels); 4494 } 4495 if (cli_reg) { 4496 wpa_hexdump(MSG_DEBUG, "P2P: Channels (client only)", 4497 cli_reg->channel, cli_reg->channels); 4498 } 4499 } 4500 4501 chan->reg_classes = cla; 4502 cli_chan->reg_classes = cli_cla; 4503 4504 return 0; 4505 } 4506 4507 4508 int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s, 4509 struct hostapd_hw_modes *mode, u8 channel) 4510 { 4511 int op; 4512 enum chan_allowed ret; 4513 4514 for (op = 0; op_class[op].op_class; op++) { 4515 struct p2p_oper_class_map *o = &op_class[op]; 4516 u8 ch; 4517 4518 for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) { 4519 if (o->mode != HOSTAPD_MODE_IEEE80211A || 4520 o->bw == BW20 || ch != channel) 4521 continue; 4522 ret = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw); 4523 if (ret == ALLOWED) 4524 return (o->bw == BW40MINUS) ? -1 : 1; 4525 } 4526 } 4527 return 0; 4528 } 4529 4530 4531 int wpas_p2p_get_vht80_center(struct wpa_supplicant *wpa_s, 4532 struct hostapd_hw_modes *mode, u8 channel) 4533 { 4534 if (!wpas_p2p_verify_channel(wpa_s, mode, channel, BW80)) 4535 return 0; 4536 4537 return wpas_p2p_get_center_80mhz(wpa_s, mode, channel); 4538 } 4539 4540 4541 static int wpas_get_noa(void *ctx, const u8 *interface_addr, u8 *buf, 4542 size_t buf_len) 4543 { 4544 struct wpa_supplicant *wpa_s = ctx; 4545 4546 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 4547 if (os_memcmp(wpa_s->own_addr, interface_addr, ETH_ALEN) == 0) 4548 break; 4549 } 4550 if (wpa_s == NULL) 4551 return -1; 4552 4553 return wpa_drv_get_noa(wpa_s, buf, buf_len); 4554 } 4555 4556 4557 struct wpa_supplicant * wpas_get_p2p_go_iface(struct wpa_supplicant *wpa_s, 4558 const u8 *ssid, size_t ssid_len) 4559 { 4560 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 4561 struct wpa_ssid *s = wpa_s->current_ssid; 4562 if (s == NULL) 4563 continue; 4564 if (s->mode != WPAS_MODE_P2P_GO && 4565 s->mode != WPAS_MODE_AP && 4566 s->mode != WPAS_MODE_P2P_GROUP_FORMATION) 4567 continue; 4568 if (s->ssid_len != ssid_len || 4569 os_memcmp(ssid, s->ssid, ssid_len) != 0) 4570 continue; 4571 return wpa_s; 4572 } 4573 4574 return NULL; 4575 4576 } 4577 4578 4579 struct wpa_supplicant * wpas_get_p2p_client_iface(struct wpa_supplicant *wpa_s, 4580 const u8 *peer_dev_addr) 4581 { 4582 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 4583 struct wpa_ssid *ssid = wpa_s->current_ssid; 4584 if (ssid == NULL) 4585 continue; 4586 if (ssid->mode != WPAS_MODE_INFRA) 4587 continue; 4588 if (wpa_s->wpa_state != WPA_COMPLETED && 4589 wpa_s->wpa_state != WPA_GROUP_HANDSHAKE) 4590 continue; 4591 if (os_memcmp(wpa_s->go_dev_addr, peer_dev_addr, ETH_ALEN) == 0) 4592 return wpa_s; 4593 } 4594 4595 return NULL; 4596 } 4597 4598 4599 static int wpas_go_connected(void *ctx, const u8 *dev_addr) 4600 { 4601 struct wpa_supplicant *wpa_s = ctx; 4602 4603 return wpas_get_p2p_client_iface(wpa_s, dev_addr) != NULL; 4604 } 4605 4606 4607 static int wpas_is_concurrent_session_active(void *ctx) 4608 { 4609 struct wpa_supplicant *wpa_s = ctx; 4610 struct wpa_supplicant *ifs; 4611 4612 for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) { 4613 if (ifs == wpa_s) 4614 continue; 4615 if (ifs->wpa_state > WPA_ASSOCIATED) 4616 return 1; 4617 } 4618 return 0; 4619 } 4620 4621 4622 static void wpas_p2p_debug_print(void *ctx, int level, const char *msg) 4623 { 4624 struct wpa_supplicant *wpa_s = ctx; 4625 wpa_msg_global(wpa_s, level, "P2P: %s", msg); 4626 } 4627 4628 4629 int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s, 4630 const char *conf_p2p_dev) 4631 { 4632 struct wpa_interface iface; 4633 struct wpa_supplicant *p2pdev_wpa_s; 4634 char ifname[100]; 4635 char force_name[100]; 4636 int ret; 4637 4638 ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s", 4639 wpa_s->ifname); 4640 if (os_snprintf_error(sizeof(ifname), ret)) 4641 return -1; 4642 force_name[0] = '\0'; 4643 wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE; 4644 ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL, 4645 force_name, wpa_s->pending_interface_addr, NULL); 4646 if (ret < 0) { 4647 wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface"); 4648 return ret; 4649 } 4650 os_strlcpy(wpa_s->pending_interface_name, ifname, 4651 sizeof(wpa_s->pending_interface_name)); 4652 4653 os_memset(&iface, 0, sizeof(iface)); 4654 iface.p2p_mgmt = 1; 4655 iface.ifname = wpa_s->pending_interface_name; 4656 iface.driver = wpa_s->driver->name; 4657 iface.driver_param = wpa_s->conf->driver_param; 4658 4659 /* 4660 * If a P2P Device configuration file was given, use it as the interface 4661 * configuration file (instead of using parent's configuration file. 4662 */ 4663 if (conf_p2p_dev) { 4664 iface.confname = conf_p2p_dev; 4665 iface.ctrl_interface = NULL; 4666 } else { 4667 iface.confname = wpa_s->confname; 4668 iface.ctrl_interface = wpa_s->conf->ctrl_interface; 4669 } 4670 iface.conf_p2p_dev = NULL; 4671 4672 p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s); 4673 if (!p2pdev_wpa_s) { 4674 wpa_printf(MSG_DEBUG, "P2P: Failed to add P2P Device interface"); 4675 return -1; 4676 } 4677 wpa_s->p2p_dev = p2pdev_wpa_s; 4678 4679 wpa_s->pending_interface_name[0] = '\0'; 4680 return 0; 4681 } 4682 4683 4684 static void wpas_presence_resp(void *ctx, const u8 *src, u8 status, 4685 const u8 *noa, size_t noa_len) 4686 { 4687 struct wpa_supplicant *wpa_s, *intf = ctx; 4688 char hex[100]; 4689 4690 for (wpa_s = intf->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 4691 if (wpa_s->waiting_presence_resp) 4692 break; 4693 } 4694 if (!wpa_s) { 4695 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No group interface was waiting for presence response"); 4696 return; 4697 } 4698 wpa_s->waiting_presence_resp = 0; 4699 4700 wpa_snprintf_hex(hex, sizeof(hex), noa, noa_len); 4701 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PRESENCE_RESPONSE "src=" MACSTR 4702 " status=%u noa=%s", MAC2STR(src), status, hex); 4703 } 4704 4705 4706 static int wpas_get_persistent_group(void *ctx, const u8 *addr, const u8 *ssid, 4707 size_t ssid_len, u8 *go_dev_addr, 4708 u8 *ret_ssid, size_t *ret_ssid_len) 4709 { 4710 struct wpa_supplicant *wpa_s = ctx; 4711 struct wpa_ssid *s; 4712 4713 s = wpas_p2p_get_persistent(wpa_s, addr, ssid, ssid_len); 4714 if (s) { 4715 os_memcpy(ret_ssid, s->ssid, s->ssid_len); 4716 *ret_ssid_len = s->ssid_len; 4717 os_memcpy(go_dev_addr, s->bssid, ETH_ALEN); 4718 return 1; 4719 } 4720 4721 return 0; 4722 } 4723 4724 4725 static int wpas_get_go_info(void *ctx, u8 *intended_addr, 4726 u8 *ssid, size_t *ssid_len, int *group_iface) 4727 { 4728 struct wpa_supplicant *wpa_s = ctx; 4729 struct wpa_ssid *s; 4730 u8 bssid[ETH_ALEN]; 4731 4732 s = wpas_p2p_group_go_ssid(wpa_s, bssid); 4733 if (!s) { 4734 s = wpas_p2p_get_persistent_go(wpa_s); 4735 if (s) 4736 os_memcpy(bssid, s->bssid, ETH_ALEN); 4737 } 4738 4739 *group_iface = wpas_p2p_create_iface(wpa_s); 4740 if (!s) 4741 return 0; 4742 4743 os_memcpy(intended_addr, bssid, ETH_ALEN); 4744 os_memcpy(ssid, s->ssid, s->ssid_len); 4745 *ssid_len = s->ssid_len; 4746 4747 return 1; 4748 } 4749 4750 4751 static int wpas_remove_stale_groups(void *ctx, const u8 *peer, const u8 *go, 4752 const u8 *ssid, size_t ssid_len) 4753 { 4754 struct wpa_supplicant *wpa_s = ctx; 4755 struct wpa_ssid *s; 4756 int save_config = 0; 4757 size_t i; 4758 4759 /* Start with our first choice of Persistent Groups */ 4760 while ((s = wpas_p2p_get_persistent(wpa_s, peer, NULL, 0))) { 4761 if (go && ssid && ssid_len && 4762 s->ssid_len == ssid_len && 4763 os_memcmp(go, s->bssid, ETH_ALEN) == 0 && 4764 os_memcmp(ssid, s->ssid, ssid_len) == 0) 4765 break; 4766 4767 /* Remove stale persistent group */ 4768 if (s->mode != WPAS_MODE_P2P_GO || s->num_p2p_clients <= 1) { 4769 wpa_config_remove_network(wpa_s->conf, s->id); 4770 save_config = 1; 4771 continue; 4772 } 4773 4774 for (i = 0; i < s->num_p2p_clients; i++) { 4775 if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN, 4776 peer, ETH_ALEN) != 0) 4777 continue; 4778 4779 os_memmove(s->p2p_client_list + i * 2 * ETH_ALEN, 4780 s->p2p_client_list + (i + 1) * 2 * ETH_ALEN, 4781 (s->num_p2p_clients - i - 1) * 2 * ETH_ALEN); 4782 break; 4783 } 4784 s->num_p2p_clients--; 4785 save_config = 1; 4786 } 4787 4788 if (save_config) 4789 p2p_config_write(wpa_s); 4790 4791 /* Return TRUE if valid SSID remains */ 4792 return s != NULL; 4793 } 4794 4795 4796 static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev, 4797 const u8 *adv_mac, const u8 *ses_mac, 4798 const u8 *grp_mac, u32 adv_id, u32 ses_id, 4799 u8 conncap, int passwd_id, 4800 const u8 *persist_ssid, 4801 size_t persist_ssid_size, int response_done, 4802 int prov_start, const char *session_info) 4803 { 4804 struct wpa_supplicant *wpa_s = ctx; 4805 u8 mac[ETH_ALEN]; 4806 struct wpa_ssid *persistent_go, *stale, *s; 4807 int save_config = 0; 4808 struct wpa_supplicant *go_wpa_s; 4809 4810 if (!dev) 4811 return; 4812 4813 os_memset(mac, 0, ETH_ALEN); 4814 if (!adv_mac) 4815 adv_mac = mac; 4816 if (!ses_mac) 4817 ses_mac = mac; 4818 if (!grp_mac) 4819 grp_mac = mac; 4820 4821 if (prov_start) { 4822 if (session_info == NULL) { 4823 wpa_msg_global(wpa_s, MSG_INFO, 4824 P2P_EVENT_P2PS_PROVISION_START MACSTR 4825 " adv_id=%x conncap=%x" 4826 " adv_mac=" MACSTR 4827 " session=%x mac=" MACSTR 4828 " dev_passwd_id=%d", 4829 MAC2STR(dev), adv_id, conncap, 4830 MAC2STR(adv_mac), 4831 ses_id, MAC2STR(ses_mac), 4832 passwd_id); 4833 } else { 4834 wpa_msg_global(wpa_s, MSG_INFO, 4835 P2P_EVENT_P2PS_PROVISION_START MACSTR 4836 " adv_id=%x conncap=%x" 4837 " adv_mac=" MACSTR 4838 " session=%x mac=" MACSTR 4839 " dev_passwd_id=%d info='%s'", 4840 MAC2STR(dev), adv_id, conncap, 4841 MAC2STR(adv_mac), 4842 ses_id, MAC2STR(ses_mac), 4843 passwd_id, session_info); 4844 } 4845 return; 4846 } 4847 4848 go_wpa_s = wpas_p2p_get_go_group(wpa_s); 4849 persistent_go = wpas_p2p_get_persistent_go(wpa_s); 4850 4851 if (status && status != P2P_SC_SUCCESS_DEFERRED) { 4852 if (go_wpa_s && !p2p_group_go_member_count(wpa_s)) 4853 wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname); 4854 4855 if (persistent_go && !persistent_go->num_p2p_clients) { 4856 /* remove empty persistent GO */ 4857 wpa_config_remove_network(wpa_s->conf, 4858 persistent_go->id); 4859 } 4860 4861 wpa_msg_global(wpa_s, MSG_INFO, 4862 P2P_EVENT_P2PS_PROVISION_DONE MACSTR 4863 " status=%d" 4864 " adv_id=%x adv_mac=" MACSTR 4865 " session=%x mac=" MACSTR, 4866 MAC2STR(dev), status, 4867 adv_id, MAC2STR(adv_mac), 4868 ses_id, MAC2STR(ses_mac)); 4869 return; 4870 } 4871 4872 /* Clean up stale persistent groups with this device */ 4873 s = wpas_p2p_get_persistent(wpa_s, dev, persist_ssid, 4874 persist_ssid_size); 4875 for (;;) { 4876 stale = wpas_p2p_get_persistent(wpa_s, dev, NULL, 0); 4877 if (!stale) 4878 break; 4879 4880 if (s && s->ssid_len == stale->ssid_len && 4881 os_memcmp(stale->bssid, s->bssid, ETH_ALEN) == 0 && 4882 os_memcmp(stale->ssid, s->ssid, s->ssid_len) == 0) 4883 break; 4884 4885 /* Remove stale persistent group */ 4886 if (stale->mode != WPAS_MODE_P2P_GO || 4887 stale->num_p2p_clients <= 1) { 4888 wpa_config_remove_network(wpa_s->conf, stale->id); 4889 } else { 4890 size_t i; 4891 4892 for (i = 0; i < stale->num_p2p_clients; i++) { 4893 if (os_memcmp(stale->p2p_client_list + 4894 i * ETH_ALEN, 4895 dev, ETH_ALEN) == 0) { 4896 os_memmove(stale->p2p_client_list + 4897 i * ETH_ALEN, 4898 stale->p2p_client_list + 4899 (i + 1) * ETH_ALEN, 4900 (stale->num_p2p_clients - 4901 i - 1) * ETH_ALEN); 4902 break; 4903 } 4904 } 4905 stale->num_p2p_clients--; 4906 } 4907 save_config = 1; 4908 } 4909 4910 if (save_config) 4911 p2p_config_write(wpa_s); 4912 4913 if (s) { 4914 if (go_wpa_s && !p2p_group_go_member_count(wpa_s)) 4915 wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname); 4916 4917 if (persistent_go && s != persistent_go && 4918 !persistent_go->num_p2p_clients) { 4919 /* remove empty persistent GO */ 4920 wpa_config_remove_network(wpa_s->conf, 4921 persistent_go->id); 4922 /* Save config */ 4923 } 4924 4925 wpa_msg_global(wpa_s, MSG_INFO, 4926 P2P_EVENT_P2PS_PROVISION_DONE MACSTR 4927 " status=%d" 4928 " adv_id=%x adv_mac=" MACSTR 4929 " session=%x mac=" MACSTR 4930 " persist=%d", 4931 MAC2STR(dev), status, 4932 adv_id, MAC2STR(adv_mac), 4933 ses_id, MAC2STR(ses_mac), s->id); 4934 return; 4935 } 4936 4937 if (conncap == P2PS_SETUP_GROUP_OWNER) { 4938 const char *go_ifname = NULL; 4939 if (!go_wpa_s) { 4940 wpa_s->global->pending_p2ps_group = 1; 4941 4942 if (wpa_s->conf->p2p_no_group_iface) 4943 go_ifname = wpa_s->ifname; 4944 else if (wpa_s->pending_interface_name[0]) 4945 go_ifname = wpa_s->pending_interface_name; 4946 4947 if (!go_ifname) { 4948 wpas_p2ps_prov_complete( 4949 wpa_s, P2P_SC_FAIL_UNKNOWN_GROUP, 4950 dev, adv_mac, ses_mac, 4951 NULL, adv_id, ses_id, 0, 0, 4952 NULL, 0, 0, 0, NULL); 4953 return; 4954 } 4955 4956 /* If PD Resp complete, start up the GO */ 4957 if (response_done && persistent_go) { 4958 wpas_p2p_group_add_persistent( 4959 wpa_s, persistent_go, 4960 0, 0, 0, 0, 0, NULL, 4961 persistent_go->mode == 4962 WPAS_MODE_P2P_GO ? 4963 P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 4964 0); 4965 } else if (response_done) { 4966 wpas_p2p_group_add(wpa_s, 1, 0, 0, 0); 4967 } 4968 4969 if (passwd_id == DEV_PW_P2PS_DEFAULT) { 4970 os_memcpy(wpa_s->p2ps_join_addr, dev, ETH_ALEN); 4971 wpa_s->p2ps_join_addr_valid = 1; 4972 wpa_dbg(wpa_s, MSG_DEBUG, 4973 "P2PS: Saving PIN for " MACSTR, 4974 MAC2STR(dev)); 4975 } 4976 } else if (passwd_id == DEV_PW_P2PS_DEFAULT) { 4977 go_ifname = go_wpa_s->ifname; 4978 4979 wpa_dbg(go_wpa_s, MSG_DEBUG, 4980 "P2P: Setting PIN-1 For " MACSTR, MAC2STR(dev)); 4981 wpa_supplicant_ap_wps_pin(go_wpa_s, dev, "12345670", 4982 NULL, 0, 0); 4983 4984 os_memcpy(wpa_s->p2ps_join_addr, dev, ETH_ALEN); 4985 wpa_s->p2ps_join_addr_valid = 1; 4986 wpa_dbg(wpa_s, MSG_DEBUG, 4987 "P2PS: Saving PIN for " MACSTR, MAC2STR(dev)); 4988 } 4989 4990 wpa_msg_global(wpa_s, MSG_INFO, 4991 P2P_EVENT_P2PS_PROVISION_DONE MACSTR 4992 " status=%d conncap=%x" 4993 " adv_id=%x adv_mac=" MACSTR 4994 " session=%x mac=" MACSTR 4995 " dev_passwd_id=%d go=%s", 4996 MAC2STR(dev), status, conncap, 4997 adv_id, MAC2STR(adv_mac), 4998 ses_id, MAC2STR(ses_mac), 4999 passwd_id, go_ifname); 5000 return; 5001 } 5002 5003 if (go_wpa_s && !p2p_group_go_member_count(wpa_s)) 5004 wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname); 5005 5006 if (persistent_go && !persistent_go->num_p2p_clients) { 5007 /* remove empty persistent GO */ 5008 wpa_config_remove_network(wpa_s->conf, persistent_go->id); 5009 } 5010 5011 if (conncap == P2PS_SETUP_CLIENT) { 5012 wpa_msg_global(wpa_s, MSG_INFO, 5013 P2P_EVENT_P2PS_PROVISION_DONE MACSTR 5014 " status=%d conncap=%x" 5015 " adv_id=%x adv_mac=" MACSTR 5016 " session=%x mac=" MACSTR 5017 " dev_passwd_id=%d join=" MACSTR, 5018 MAC2STR(dev), status, conncap, 5019 adv_id, MAC2STR(adv_mac), 5020 ses_id, MAC2STR(ses_mac), 5021 passwd_id, MAC2STR(grp_mac)); 5022 } else { 5023 wpa_msg_global(wpa_s, MSG_INFO, 5024 P2P_EVENT_P2PS_PROVISION_DONE MACSTR 5025 " status=%d conncap=%x" 5026 " adv_id=%x adv_mac=" MACSTR 5027 " session=%x mac=" MACSTR 5028 " dev_passwd_id=%d", 5029 MAC2STR(dev), status, conncap, 5030 adv_id, MAC2STR(adv_mac), 5031 ses_id, MAC2STR(ses_mac), 5032 passwd_id); 5033 } 5034 } 5035 5036 5037 static int _wpas_p2p_in_progress(void *ctx) 5038 { 5039 struct wpa_supplicant *wpa_s = ctx; 5040 return wpas_p2p_in_progress(wpa_s); 5041 } 5042 5043 5044 static int wpas_prov_disc_resp_cb(void *ctx) 5045 { 5046 struct wpa_supplicant *wpa_s = ctx; 5047 struct wpa_ssid *persistent_go; 5048 5049 if (!wpa_s->global->pending_p2ps_group) 5050 return 0; 5051 5052 wpa_s->global->pending_p2ps_group = 0; 5053 5054 if (wpas_p2p_get_go_group(wpa_s)) 5055 return 0; 5056 persistent_go = wpas_p2p_get_persistent_go(wpa_s); 5057 5058 if (persistent_go) { 5059 wpas_p2p_group_add_persistent( 5060 wpa_s, persistent_go, 0, 0, 0, 0, 0, NULL, 5061 persistent_go->mode == WPAS_MODE_P2P_GO ? 5062 P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0); 5063 } else { 5064 wpas_p2p_group_add(wpa_s, 1, 0, 0, 0); 5065 } 5066 5067 return 1; 5068 } 5069 5070 5071 /** 5072 * wpas_p2p_init - Initialize P2P module for %wpa_supplicant 5073 * @global: Pointer to global data from wpa_supplicant_init() 5074 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 5075 * Returns: 0 on success, -1 on failure 5076 */ 5077 int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s) 5078 { 5079 struct p2p_config p2p; 5080 int i; 5081 5082 if (wpa_s->conf->p2p_disabled) 5083 return 0; 5084 5085 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE)) 5086 return 0; 5087 5088 if (global->p2p) 5089 return 0; 5090 5091 os_memset(&p2p, 0, sizeof(p2p)); 5092 p2p.cb_ctx = wpa_s; 5093 p2p.debug_print = wpas_p2p_debug_print; 5094 p2p.p2p_scan = wpas_p2p_scan; 5095 p2p.send_action = wpas_send_action; 5096 p2p.send_action_done = wpas_send_action_done; 5097 p2p.go_neg_completed = wpas_go_neg_completed; 5098 p2p.go_neg_req_rx = wpas_go_neg_req_rx; 5099 p2p.dev_found = wpas_dev_found; 5100 p2p.dev_lost = wpas_dev_lost; 5101 p2p.find_stopped = wpas_find_stopped; 5102 p2p.start_listen = wpas_start_listen; 5103 p2p.stop_listen = wpas_stop_listen; 5104 p2p.send_probe_resp = wpas_send_probe_resp; 5105 p2p.sd_request = wpas_sd_request; 5106 p2p.sd_response = wpas_sd_response; 5107 p2p.prov_disc_req = wpas_prov_disc_req; 5108 p2p.prov_disc_resp = wpas_prov_disc_resp; 5109 p2p.prov_disc_fail = wpas_prov_disc_fail; 5110 p2p.invitation_process = wpas_invitation_process; 5111 p2p.invitation_received = wpas_invitation_received; 5112 p2p.invitation_result = wpas_invitation_result; 5113 p2p.get_noa = wpas_get_noa; 5114 p2p.go_connected = wpas_go_connected; 5115 p2p.presence_resp = wpas_presence_resp; 5116 p2p.is_concurrent_session_active = wpas_is_concurrent_session_active; 5117 p2p.is_p2p_in_progress = _wpas_p2p_in_progress; 5118 p2p.get_persistent_group = wpas_get_persistent_group; 5119 p2p.get_go_info = wpas_get_go_info; 5120 p2p.remove_stale_groups = wpas_remove_stale_groups; 5121 p2p.p2ps_prov_complete = wpas_p2ps_prov_complete; 5122 p2p.prov_disc_resp_cb = wpas_prov_disc_resp_cb; 5123 p2p.p2ps_group_capability = p2ps_group_capability; 5124 5125 os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN); 5126 os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN); 5127 p2p.dev_name = wpa_s->conf->device_name; 5128 p2p.manufacturer = wpa_s->conf->manufacturer; 5129 p2p.model_name = wpa_s->conf->model_name; 5130 p2p.model_number = wpa_s->conf->model_number; 5131 p2p.serial_number = wpa_s->conf->serial_number; 5132 if (wpa_s->wps) { 5133 os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16); 5134 p2p.config_methods = wpa_s->wps->config_methods; 5135 } 5136 5137 if (wpas_p2p_setup_channels(wpa_s, &p2p.channels, &p2p.cli_channels)) { 5138 wpa_printf(MSG_ERROR, 5139 "P2P: Failed to configure supported channel list"); 5140 return -1; 5141 } 5142 5143 if (wpa_s->conf->p2p_listen_reg_class && 5144 wpa_s->conf->p2p_listen_channel) { 5145 p2p.reg_class = wpa_s->conf->p2p_listen_reg_class; 5146 p2p.channel = wpa_s->conf->p2p_listen_channel; 5147 p2p.channel_forced = 1; 5148 } else { 5149 /* 5150 * Pick one of the social channels randomly as the listen 5151 * channel. 5152 */ 5153 if (p2p_config_get_random_social(&p2p, &p2p.reg_class, 5154 &p2p.channel) != 0) { 5155 wpa_printf(MSG_ERROR, 5156 "P2P: Failed to select random social channel as listen channel"); 5157 return -1; 5158 } 5159 p2p.channel_forced = 0; 5160 } 5161 wpa_printf(MSG_DEBUG, "P2P: Own listen channel: %d:%d", 5162 p2p.reg_class, p2p.channel); 5163 5164 if (wpa_s->conf->p2p_oper_reg_class && 5165 wpa_s->conf->p2p_oper_channel) { 5166 p2p.op_reg_class = wpa_s->conf->p2p_oper_reg_class; 5167 p2p.op_channel = wpa_s->conf->p2p_oper_channel; 5168 p2p.cfg_op_channel = 1; 5169 wpa_printf(MSG_DEBUG, "P2P: Configured operating channel: " 5170 "%d:%d", p2p.op_reg_class, p2p.op_channel); 5171 5172 } else { 5173 /* 5174 * Use random operation channel from 2.4 GHz band social 5175 * channels (1, 6, 11) or band 60 GHz social channel (2) if no 5176 * other preference is indicated. 5177 */ 5178 if (p2p_config_get_random_social(&p2p, &p2p.op_reg_class, 5179 &p2p.op_channel) != 0) { 5180 wpa_printf(MSG_ERROR, 5181 "P2P: Failed to select random social channel as operation channel"); 5182 return -1; 5183 } 5184 p2p.cfg_op_channel = 0; 5185 wpa_printf(MSG_DEBUG, "P2P: Random operating channel: " 5186 "%d:%d", p2p.op_reg_class, p2p.op_channel); 5187 } 5188 5189 if (wpa_s->conf->p2p_pref_chan && wpa_s->conf->num_p2p_pref_chan) { 5190 p2p.pref_chan = wpa_s->conf->p2p_pref_chan; 5191 p2p.num_pref_chan = wpa_s->conf->num_p2p_pref_chan; 5192 } 5193 5194 if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) { 5195 os_memcpy(p2p.country, wpa_s->conf->country, 2); 5196 p2p.country[2] = 0x04; 5197 } else 5198 os_memcpy(p2p.country, "XX\x04", 3); 5199 5200 os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type, 5201 WPS_DEV_TYPE_LEN); 5202 5203 p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types; 5204 os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type, 5205 p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN); 5206 5207 p2p.concurrent_operations = !!(wpa_s->drv_flags & 5208 WPA_DRIVER_FLAGS_P2P_CONCURRENT); 5209 5210 p2p.max_peers = 100; 5211 5212 if (wpa_s->conf->p2p_ssid_postfix) { 5213 p2p.ssid_postfix_len = 5214 os_strlen(wpa_s->conf->p2p_ssid_postfix); 5215 if (p2p.ssid_postfix_len > sizeof(p2p.ssid_postfix)) 5216 p2p.ssid_postfix_len = sizeof(p2p.ssid_postfix); 5217 os_memcpy(p2p.ssid_postfix, wpa_s->conf->p2p_ssid_postfix, 5218 p2p.ssid_postfix_len); 5219 } 5220 5221 p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss; 5222 5223 p2p.max_listen = wpa_s->max_remain_on_chan; 5224 5225 if (wpa_s->conf->p2p_passphrase_len >= 8 && 5226 wpa_s->conf->p2p_passphrase_len <= 63) 5227 p2p.passphrase_len = wpa_s->conf->p2p_passphrase_len; 5228 else 5229 p2p.passphrase_len = 8; 5230 5231 global->p2p = p2p_init(&p2p); 5232 if (global->p2p == NULL) 5233 return -1; 5234 global->p2p_init_wpa_s = wpa_s; 5235 5236 for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) { 5237 if (wpa_s->conf->wps_vendor_ext[i] == NULL) 5238 continue; 5239 p2p_add_wps_vendor_extension( 5240 global->p2p, wpa_s->conf->wps_vendor_ext[i]); 5241 } 5242 5243 p2p_set_no_go_freq(global->p2p, &wpa_s->conf->p2p_no_go_freq); 5244 5245 return 0; 5246 } 5247 5248 5249 /** 5250 * wpas_p2p_deinit - Deinitialize per-interface P2P data 5251 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 5252 * 5253 * This function deinitialize per-interface P2P data. 5254 */ 5255 void wpas_p2p_deinit(struct wpa_supplicant *wpa_s) 5256 { 5257 if (wpa_s->driver && wpa_s->drv_priv) 5258 wpa_drv_probe_req_report(wpa_s, 0); 5259 5260 if (wpa_s->go_params) { 5261 /* Clear any stored provisioning info */ 5262 p2p_clear_provisioning_info( 5263 wpa_s->global->p2p, 5264 wpa_s->go_params->peer_device_addr); 5265 } 5266 5267 os_free(wpa_s->go_params); 5268 wpa_s->go_params = NULL; 5269 eloop_cancel_timeout(wpas_p2p_psk_failure_removal, wpa_s, NULL); 5270 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL); 5271 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 5272 wpa_s->p2p_long_listen = 0; 5273 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); 5274 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL); 5275 wpas_p2p_remove_pending_group_interface(wpa_s); 5276 eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL); 5277 wpas_p2p_listen_work_done(wpa_s); 5278 if (wpa_s->p2p_send_action_work) { 5279 os_free(wpa_s->p2p_send_action_work->ctx); 5280 radio_work_done(wpa_s->p2p_send_action_work); 5281 wpa_s->p2p_send_action_work = NULL; 5282 } 5283 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, wpa_s, NULL); 5284 5285 wpabuf_free(wpa_s->p2p_oob_dev_pw); 5286 wpa_s->p2p_oob_dev_pw = NULL; 5287 5288 os_free(wpa_s->p2p_group_common_freqs); 5289 wpa_s->p2p_group_common_freqs = NULL; 5290 wpa_s->p2p_group_common_freqs_num = 0; 5291 5292 /* TODO: remove group interface from the driver if this wpa_s instance 5293 * is on top of a P2P group interface */ 5294 } 5295 5296 5297 /** 5298 * wpas_p2p_deinit_global - Deinitialize global P2P module 5299 * @global: Pointer to global data from wpa_supplicant_init() 5300 * 5301 * This function deinitializes the global (per device) P2P module. 5302 */ 5303 static void wpas_p2p_deinit_global(struct wpa_global *global) 5304 { 5305 struct wpa_supplicant *wpa_s, *tmp; 5306 5307 wpa_s = global->ifaces; 5308 5309 wpas_p2p_service_flush(global->p2p_init_wpa_s); 5310 5311 /* Remove remaining P2P group interfaces */ 5312 while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) 5313 wpa_s = wpa_s->next; 5314 while (wpa_s) { 5315 tmp = global->ifaces; 5316 while (tmp && 5317 (tmp == wpa_s || 5318 tmp->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)) { 5319 tmp = tmp->next; 5320 } 5321 if (tmp == NULL) 5322 break; 5323 /* Disconnect from the P2P group and deinit the interface */ 5324 wpas_p2p_disconnect(tmp); 5325 } 5326 5327 /* 5328 * Deinit GO data on any possibly remaining interface (if main 5329 * interface is used as GO). 5330 */ 5331 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 5332 if (wpa_s->ap_iface) 5333 wpas_p2p_group_deinit(wpa_s); 5334 } 5335 5336 p2p_deinit(global->p2p); 5337 global->p2p = NULL; 5338 global->p2p_init_wpa_s = NULL; 5339 } 5340 5341 5342 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s) 5343 { 5344 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE) && 5345 wpa_s->conf->p2p_no_group_iface) 5346 return 0; /* separate interface disabled per configuration */ 5347 if (wpa_s->drv_flags & 5348 (WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE | 5349 WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P)) 5350 return 1; /* P2P group requires a new interface in every case 5351 */ 5352 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CONCURRENT)) 5353 return 0; /* driver does not support concurrent operations */ 5354 if (wpa_s->global->ifaces->next) 5355 return 1; /* more that one interface already in use */ 5356 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) 5357 return 1; /* this interface is already in use */ 5358 return 0; 5359 } 5360 5361 5362 static int wpas_p2p_start_go_neg(struct wpa_supplicant *wpa_s, 5363 const u8 *peer_addr, 5364 enum p2p_wps_method wps_method, 5365 int go_intent, const u8 *own_interface_addr, 5366 unsigned int force_freq, int persistent_group, 5367 struct wpa_ssid *ssid, unsigned int pref_freq) 5368 { 5369 if (persistent_group && wpa_s->conf->persistent_reconnect) 5370 persistent_group = 2; 5371 5372 /* 5373 * Increase GO config timeout if HT40 is used since it takes some time 5374 * to scan channels for coex purposes before the BSS can be started. 5375 */ 5376 p2p_set_config_timeout(wpa_s->global->p2p, 5377 wpa_s->p2p_go_ht40 ? 255 : 100, 20); 5378 5379 return p2p_connect(wpa_s->global->p2p, peer_addr, wps_method, 5380 go_intent, own_interface_addr, force_freq, 5381 persistent_group, ssid ? ssid->ssid : NULL, 5382 ssid ? ssid->ssid_len : 0, 5383 wpa_s->p2p_pd_before_go_neg, pref_freq, 5384 wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id : 5385 0); 5386 } 5387 5388 5389 static int wpas_p2p_auth_go_neg(struct wpa_supplicant *wpa_s, 5390 const u8 *peer_addr, 5391 enum p2p_wps_method wps_method, 5392 int go_intent, const u8 *own_interface_addr, 5393 unsigned int force_freq, int persistent_group, 5394 struct wpa_ssid *ssid, unsigned int pref_freq) 5395 { 5396 if (persistent_group && wpa_s->conf->persistent_reconnect) 5397 persistent_group = 2; 5398 5399 return p2p_authorize(wpa_s->global->p2p, peer_addr, wps_method, 5400 go_intent, own_interface_addr, force_freq, 5401 persistent_group, ssid ? ssid->ssid : NULL, 5402 ssid ? ssid->ssid_len : 0, pref_freq, 5403 wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id : 5404 0); 5405 } 5406 5407 5408 static void wpas_p2p_check_join_scan_limit(struct wpa_supplicant *wpa_s) 5409 { 5410 wpa_s->p2p_join_scan_count++; 5411 wpa_printf(MSG_DEBUG, "P2P: Join scan attempt %d", 5412 wpa_s->p2p_join_scan_count); 5413 if (wpa_s->p2p_join_scan_count > P2P_MAX_JOIN_SCAN_ATTEMPTS) { 5414 wpa_printf(MSG_DEBUG, "P2P: Failed to find GO " MACSTR 5415 " for join operationg - stop join attempt", 5416 MAC2STR(wpa_s->pending_join_iface_addr)); 5417 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 5418 if (wpa_s->p2p_auto_pd) { 5419 wpa_s->p2p_auto_pd = 0; 5420 wpa_msg_global(wpa_s, MSG_INFO, 5421 P2P_EVENT_PROV_DISC_FAILURE 5422 " p2p_dev_addr=" MACSTR " status=N/A", 5423 MAC2STR(wpa_s->pending_join_dev_addr)); 5424 return; 5425 } 5426 wpa_msg_global(wpa_s->parent, MSG_INFO, 5427 P2P_EVENT_GROUP_FORMATION_FAILURE); 5428 } 5429 } 5430 5431 5432 static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq) 5433 { 5434 int res; 5435 unsigned int num, i; 5436 struct wpa_used_freq_data *freqs; 5437 5438 if (wpas_p2p_num_unused_channels(wpa_s) > 0) { 5439 /* Multiple channels are supported and not all are in use */ 5440 return 0; 5441 } 5442 5443 freqs = os_calloc(wpa_s->num_multichan_concurrent, 5444 sizeof(struct wpa_used_freq_data)); 5445 if (!freqs) 5446 return 1; 5447 5448 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, 5449 wpa_s->num_multichan_concurrent); 5450 5451 for (i = 0; i < num; i++) { 5452 if (freqs[i].freq == freq) { 5453 wpa_printf(MSG_DEBUG, "P2P: Frequency %d MHz in use by another virtual interface and can be used", 5454 freq); 5455 res = 0; 5456 goto exit_free; 5457 } 5458 } 5459 5460 wpa_printf(MSG_DEBUG, "P2P: No valid operating frequencies"); 5461 res = 1; 5462 5463 exit_free: 5464 os_free(freqs); 5465 return res; 5466 } 5467 5468 5469 static int wpas_p2p_peer_go(struct wpa_supplicant *wpa_s, 5470 const u8 *peer_dev_addr) 5471 { 5472 struct wpa_bss *bss; 5473 int updated; 5474 5475 bss = wpa_bss_get_p2p_dev_addr(wpa_s, peer_dev_addr); 5476 if (bss == NULL) 5477 return -1; 5478 if (bss->last_update_idx < wpa_s->bss_update_idx) { 5479 wpa_printf(MSG_DEBUG, "P2P: Peer BSS entry not updated in the " 5480 "last scan"); 5481 return 0; 5482 } 5483 5484 updated = os_reltime_before(&wpa_s->p2p_auto_started, 5485 &bss->last_update); 5486 wpa_printf(MSG_DEBUG, "P2P: Current BSS entry for peer updated at " 5487 "%ld.%06ld (%supdated in last scan)", 5488 bss->last_update.sec, bss->last_update.usec, 5489 updated ? "": "not "); 5490 5491 return updated; 5492 } 5493 5494 5495 static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s, 5496 struct wpa_scan_results *scan_res) 5497 { 5498 struct wpa_bss *bss = NULL; 5499 int freq; 5500 u8 iface_addr[ETH_ALEN]; 5501 5502 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 5503 5504 if (wpa_s->global->p2p_disabled) 5505 return; 5506 5507 wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS) for %sjoin", 5508 scan_res ? (int) scan_res->num : -1, 5509 wpa_s->p2p_auto_join ? "auto_" : ""); 5510 5511 if (scan_res) 5512 wpas_p2p_scan_res_handler(wpa_s, scan_res); 5513 5514 if (wpa_s->p2p_auto_pd) { 5515 int join = wpas_p2p_peer_go(wpa_s, 5516 wpa_s->pending_join_dev_addr); 5517 if (join == 0 && 5518 wpa_s->auto_pd_scan_retry < P2P_AUTO_PD_SCAN_ATTEMPTS) { 5519 wpa_s->auto_pd_scan_retry++; 5520 bss = wpa_bss_get_bssid_latest( 5521 wpa_s, wpa_s->pending_join_dev_addr); 5522 if (bss) { 5523 freq = bss->freq; 5524 wpa_printf(MSG_DEBUG, "P2P: Scan retry %d for " 5525 "the peer " MACSTR " at %d MHz", 5526 wpa_s->auto_pd_scan_retry, 5527 MAC2STR(wpa_s-> 5528 pending_join_dev_addr), 5529 freq); 5530 wpas_p2p_join_scan_req(wpa_s, freq, NULL, 0); 5531 return; 5532 } 5533 } 5534 5535 if (join < 0) 5536 join = 0; 5537 5538 wpa_s->p2p_auto_pd = 0; 5539 wpa_s->pending_pd_use = join ? AUTO_PD_JOIN : AUTO_PD_GO_NEG; 5540 wpa_printf(MSG_DEBUG, "P2P: Auto PD with " MACSTR " join=%d", 5541 MAC2STR(wpa_s->pending_join_dev_addr), join); 5542 if (p2p_prov_disc_req(wpa_s->global->p2p, 5543 wpa_s->pending_join_dev_addr, NULL, 5544 wpa_s->pending_pd_config_methods, join, 5545 0, wpa_s->user_initiated_pd) < 0) { 5546 wpa_s->p2p_auto_pd = 0; 5547 wpa_msg_global(wpa_s, MSG_INFO, 5548 P2P_EVENT_PROV_DISC_FAILURE 5549 " p2p_dev_addr=" MACSTR " status=N/A", 5550 MAC2STR(wpa_s->pending_join_dev_addr)); 5551 } 5552 return; 5553 } 5554 5555 if (wpa_s->p2p_auto_join) { 5556 int join = wpas_p2p_peer_go(wpa_s, 5557 wpa_s->pending_join_dev_addr); 5558 if (join < 0) { 5559 wpa_printf(MSG_DEBUG, "P2P: Peer was not found to be " 5560 "running a GO -> use GO Negotiation"); 5561 wpa_msg_global(wpa_s->parent, MSG_INFO, 5562 P2P_EVENT_FALLBACK_TO_GO_NEG 5563 "reason=peer-not-running-GO"); 5564 wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, 5565 wpa_s->p2p_pin, wpa_s->p2p_wps_method, 5566 wpa_s->p2p_persistent_group, 0, 0, 0, 5567 wpa_s->p2p_go_intent, 5568 wpa_s->p2p_connect_freq, 5569 wpa_s->p2p_persistent_id, 5570 wpa_s->p2p_pd_before_go_neg, 5571 wpa_s->p2p_go_ht40, 5572 wpa_s->p2p_go_vht); 5573 return; 5574 } 5575 5576 wpa_printf(MSG_DEBUG, "P2P: Peer was found running GO%s -> " 5577 "try to join the group", join ? "" : 5578 " in older scan"); 5579 if (!join) { 5580 wpa_msg_global(wpa_s->parent, MSG_INFO, 5581 P2P_EVENT_FALLBACK_TO_GO_NEG_ENABLED); 5582 wpa_s->p2p_fallback_to_go_neg = 1; 5583 } 5584 } 5585 5586 freq = p2p_get_oper_freq(wpa_s->global->p2p, 5587 wpa_s->pending_join_iface_addr); 5588 if (freq < 0 && 5589 p2p_get_interface_addr(wpa_s->global->p2p, 5590 wpa_s->pending_join_dev_addr, 5591 iface_addr) == 0 && 5592 os_memcmp(iface_addr, wpa_s->pending_join_dev_addr, ETH_ALEN) != 0 5593 && !wpa_bss_get_bssid(wpa_s, wpa_s->pending_join_iface_addr)) { 5594 wpa_printf(MSG_DEBUG, "P2P: Overwrite pending interface " 5595 "address for join from " MACSTR " to " MACSTR 5596 " based on newly discovered P2P peer entry", 5597 MAC2STR(wpa_s->pending_join_iface_addr), 5598 MAC2STR(iface_addr)); 5599 os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, 5600 ETH_ALEN); 5601 5602 freq = p2p_get_oper_freq(wpa_s->global->p2p, 5603 wpa_s->pending_join_iface_addr); 5604 } 5605 if (freq >= 0) { 5606 wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency " 5607 "from P2P peer table: %d MHz", freq); 5608 } 5609 if (wpa_s->p2p_join_ssid_len) { 5610 wpa_printf(MSG_DEBUG, "P2P: Trying to find target GO BSS entry based on BSSID " 5611 MACSTR " and SSID %s", 5612 MAC2STR(wpa_s->pending_join_iface_addr), 5613 wpa_ssid_txt(wpa_s->p2p_join_ssid, 5614 wpa_s->p2p_join_ssid_len)); 5615 bss = wpa_bss_get(wpa_s, wpa_s->pending_join_iface_addr, 5616 wpa_s->p2p_join_ssid, 5617 wpa_s->p2p_join_ssid_len); 5618 } 5619 if (!bss) { 5620 wpa_printf(MSG_DEBUG, "P2P: Trying to find target GO BSS entry based on BSSID " 5621 MACSTR, MAC2STR(wpa_s->pending_join_iface_addr)); 5622 bss = wpa_bss_get_bssid_latest(wpa_s, 5623 wpa_s->pending_join_iface_addr); 5624 } 5625 if (bss) { 5626 freq = bss->freq; 5627 wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency " 5628 "from BSS table: %d MHz (SSID %s)", freq, 5629 wpa_ssid_txt(bss->ssid, bss->ssid_len)); 5630 } 5631 if (freq > 0) { 5632 u16 method; 5633 5634 if (wpas_check_freq_conflict(wpa_s, freq) > 0) { 5635 wpa_msg_global(wpa_s->parent, MSG_INFO, 5636 P2P_EVENT_GROUP_FORMATION_FAILURE 5637 "reason=FREQ_CONFLICT"); 5638 return; 5639 } 5640 5641 wpa_printf(MSG_DEBUG, "P2P: Send Provision Discovery Request " 5642 "prior to joining an existing group (GO " MACSTR 5643 " freq=%u MHz)", 5644 MAC2STR(wpa_s->pending_join_dev_addr), freq); 5645 wpa_s->pending_pd_before_join = 1; 5646 5647 switch (wpa_s->pending_join_wps_method) { 5648 case WPS_PIN_DISPLAY: 5649 method = WPS_CONFIG_KEYPAD; 5650 break; 5651 case WPS_PIN_KEYPAD: 5652 method = WPS_CONFIG_DISPLAY; 5653 break; 5654 case WPS_PBC: 5655 method = WPS_CONFIG_PUSHBUTTON; 5656 break; 5657 default: 5658 method = 0; 5659 break; 5660 } 5661 5662 if ((p2p_get_provisioning_info(wpa_s->global->p2p, 5663 wpa_s->pending_join_dev_addr) == 5664 method)) { 5665 /* 5666 * We have already performed provision discovery for 5667 * joining the group. Proceed directly to join 5668 * operation without duplicated provision discovery. */ 5669 wpa_printf(MSG_DEBUG, "P2P: Provision discovery " 5670 "with " MACSTR " already done - proceed to " 5671 "join", 5672 MAC2STR(wpa_s->pending_join_dev_addr)); 5673 wpa_s->pending_pd_before_join = 0; 5674 goto start; 5675 } 5676 5677 if (p2p_prov_disc_req(wpa_s->global->p2p, 5678 wpa_s->pending_join_dev_addr, 5679 NULL, method, 1, 5680 freq, wpa_s->user_initiated_pd) < 0) { 5681 wpa_printf(MSG_DEBUG, "P2P: Failed to send Provision " 5682 "Discovery Request before joining an " 5683 "existing group"); 5684 wpa_s->pending_pd_before_join = 0; 5685 goto start; 5686 } 5687 return; 5688 } 5689 5690 wpa_printf(MSG_DEBUG, "P2P: Failed to find BSS/GO - try again later"); 5691 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 5692 eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL); 5693 wpas_p2p_check_join_scan_limit(wpa_s); 5694 return; 5695 5696 start: 5697 /* Start join operation immediately */ 5698 wpas_p2p_join_start(wpa_s, 0, NULL, 0); 5699 } 5700 5701 5702 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq, 5703 const u8 *ssid, size_t ssid_len) 5704 { 5705 int ret; 5706 struct wpa_driver_scan_params params; 5707 struct wpabuf *wps_ie, *ies; 5708 size_t ielen; 5709 int freqs[2] = { 0, 0 }; 5710 5711 os_memset(¶ms, 0, sizeof(params)); 5712 5713 /* P2P Wildcard SSID */ 5714 params.num_ssids = 1; 5715 if (ssid && ssid_len) { 5716 params.ssids[0].ssid = ssid; 5717 params.ssids[0].ssid_len = ssid_len; 5718 os_memcpy(wpa_s->p2p_join_ssid, ssid, ssid_len); 5719 wpa_s->p2p_join_ssid_len = ssid_len; 5720 } else { 5721 params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID; 5722 params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN; 5723 wpa_s->p2p_join_ssid_len = 0; 5724 } 5725 5726 wpa_s->wps->dev.p2p = 1; 5727 wps_ie = wps_build_probe_req_ie(DEV_PW_DEFAULT, &wpa_s->wps->dev, 5728 wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 0, 5729 NULL); 5730 if (wps_ie == NULL) { 5731 wpas_p2p_scan_res_join(wpa_s, NULL); 5732 return; 5733 } 5734 5735 ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p); 5736 ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen); 5737 if (ies == NULL) { 5738 wpabuf_free(wps_ie); 5739 wpas_p2p_scan_res_join(wpa_s, NULL); 5740 return; 5741 } 5742 wpabuf_put_buf(ies, wps_ie); 5743 wpabuf_free(wps_ie); 5744 5745 p2p_scan_ie(wpa_s->global->p2p, ies, NULL); 5746 5747 params.p2p_probe = 1; 5748 params.extra_ies = wpabuf_head(ies); 5749 params.extra_ies_len = wpabuf_len(ies); 5750 5751 if (!freq) { 5752 int oper_freq; 5753 /* 5754 * If freq is not provided, check the operating freq of the GO 5755 * and use a single channel scan on if possible. 5756 */ 5757 oper_freq = p2p_get_oper_freq(wpa_s->global->p2p, 5758 wpa_s->pending_join_iface_addr); 5759 if (oper_freq > 0) 5760 freq = oper_freq; 5761 } 5762 if (freq > 0) { 5763 freqs[0] = freq; 5764 params.freqs = freqs; 5765 } 5766 5767 /* 5768 * Run a scan to update BSS table and start Provision Discovery once 5769 * the new scan results become available. 5770 */ 5771 ret = wpa_drv_scan(wpa_s, ¶ms); 5772 if (!ret) { 5773 os_get_reltime(&wpa_s->scan_trigger_time); 5774 wpa_s->scan_res_handler = wpas_p2p_scan_res_join; 5775 wpa_s->own_scan_requested = 1; 5776 } 5777 5778 wpabuf_free(ies); 5779 5780 if (ret) { 5781 wpa_printf(MSG_DEBUG, "P2P: Failed to start scan for join - " 5782 "try again later"); 5783 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 5784 eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL); 5785 wpas_p2p_check_join_scan_limit(wpa_s); 5786 } 5787 } 5788 5789 5790 static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx) 5791 { 5792 struct wpa_supplicant *wpa_s = eloop_ctx; 5793 wpas_p2p_join_scan_req(wpa_s, 0, NULL, 0); 5794 } 5795 5796 5797 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr, 5798 const u8 *dev_addr, enum p2p_wps_method wps_method, 5799 int auto_join, int op_freq, 5800 const u8 *ssid, size_t ssid_len) 5801 { 5802 wpa_printf(MSG_DEBUG, "P2P: Request to join existing group (iface " 5803 MACSTR " dev " MACSTR " op_freq=%d)%s", 5804 MAC2STR(iface_addr), MAC2STR(dev_addr), op_freq, 5805 auto_join ? " (auto_join)" : ""); 5806 if (ssid && ssid_len) { 5807 wpa_printf(MSG_DEBUG, "P2P: Group SSID specified: %s", 5808 wpa_ssid_txt(ssid, ssid_len)); 5809 } 5810 5811 wpa_s->p2p_auto_pd = 0; 5812 wpa_s->p2p_auto_join = !!auto_join; 5813 os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, ETH_ALEN); 5814 os_memcpy(wpa_s->pending_join_dev_addr, dev_addr, ETH_ALEN); 5815 wpa_s->pending_join_wps_method = wps_method; 5816 5817 /* Make sure we are not running find during connection establishment */ 5818 wpas_p2p_stop_find(wpa_s); 5819 5820 wpa_s->p2p_join_scan_count = 0; 5821 wpas_p2p_join_scan_req(wpa_s, op_freq, ssid, ssid_len); 5822 return 0; 5823 } 5824 5825 5826 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq, 5827 const u8 *ssid, size_t ssid_len) 5828 { 5829 struct wpa_supplicant *group; 5830 struct p2p_go_neg_results res; 5831 struct wpa_bss *bss; 5832 5833 group = wpas_p2p_get_group_iface(wpa_s, 0, 0); 5834 if (group == NULL) 5835 return -1; 5836 if (group != wpa_s) { 5837 os_memcpy(group->p2p_pin, wpa_s->p2p_pin, 5838 sizeof(group->p2p_pin)); 5839 group->p2p_wps_method = wpa_s->p2p_wps_method; 5840 } else { 5841 /* 5842 * Need to mark the current interface for p2p_group_formation 5843 * when a separate group interface is not used. This is needed 5844 * to allow p2p_cancel stop a pending p2p_connect-join. 5845 * wpas_p2p_init_group_interface() addresses this for the case 5846 * where a separate group interface is used. 5847 */ 5848 wpa_s->global->p2p_group_formation = wpa_s; 5849 } 5850 5851 group->p2p_in_provisioning = 1; 5852 group->p2p_fallback_to_go_neg = wpa_s->p2p_fallback_to_go_neg; 5853 5854 os_memset(&res, 0, sizeof(res)); 5855 os_memcpy(res.peer_device_addr, wpa_s->pending_join_dev_addr, ETH_ALEN); 5856 os_memcpy(res.peer_interface_addr, wpa_s->pending_join_iface_addr, 5857 ETH_ALEN); 5858 res.wps_method = wpa_s->pending_join_wps_method; 5859 if (freq && ssid && ssid_len) { 5860 res.freq = freq; 5861 res.ssid_len = ssid_len; 5862 os_memcpy(res.ssid, ssid, ssid_len); 5863 } else { 5864 bss = wpa_bss_get_bssid_latest(wpa_s, 5865 wpa_s->pending_join_iface_addr); 5866 if (bss) { 5867 res.freq = bss->freq; 5868 res.ssid_len = bss->ssid_len; 5869 os_memcpy(res.ssid, bss->ssid, bss->ssid_len); 5870 wpa_printf(MSG_DEBUG, "P2P: Join target GO operating frequency from BSS table: %d MHz (SSID %s)", 5871 bss->freq, 5872 wpa_ssid_txt(bss->ssid, bss->ssid_len)); 5873 } 5874 } 5875 5876 if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) { 5877 wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel prior to " 5878 "starting client"); 5879 wpa_drv_cancel_remain_on_channel(wpa_s); 5880 wpa_s->off_channel_freq = 0; 5881 wpa_s->roc_waiting_drv_freq = 0; 5882 } 5883 wpas_start_wps_enrollee(group, &res); 5884 5885 /* 5886 * Allow a longer timeout for join-a-running-group than normal 15 5887 * second group formation timeout since the GO may not have authorized 5888 * our connection yet. 5889 */ 5890 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL); 5891 eloop_register_timeout(60, 0, wpas_p2p_group_formation_timeout, 5892 wpa_s, NULL); 5893 5894 return 0; 5895 } 5896 5897 5898 static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq, 5899 int *force_freq, int *pref_freq, int go) 5900 { 5901 struct wpa_used_freq_data *freqs; 5902 int res, best_freq, num_unused; 5903 unsigned int freq_in_use = 0, num, i; 5904 5905 freqs = os_calloc(wpa_s->num_multichan_concurrent, 5906 sizeof(struct wpa_used_freq_data)); 5907 if (!freqs) 5908 return -1; 5909 5910 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, 5911 wpa_s->num_multichan_concurrent); 5912 5913 /* 5914 * It is possible that the total number of used frequencies is bigger 5915 * than the number of frequencies used for P2P, so get the system wide 5916 * number of unused frequencies. 5917 */ 5918 num_unused = wpas_p2p_num_unused_channels(wpa_s); 5919 5920 wpa_printf(MSG_DEBUG, 5921 "P2P: Setup freqs: freq=%d num_MCC=%d shared_freqs=%u num_unused=%d", 5922 freq, wpa_s->num_multichan_concurrent, num, num_unused); 5923 5924 if (freq > 0) { 5925 int ret; 5926 if (go) 5927 ret = p2p_supported_freq(wpa_s->global->p2p, freq); 5928 else 5929 ret = p2p_supported_freq_cli(wpa_s->global->p2p, freq); 5930 if (!ret) { 5931 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && 5932 ieee80211_is_dfs(freq)) { 5933 /* 5934 * If freq is a DFS channel and DFS is offloaded 5935 * to the driver, allow P2P GO to use it. 5936 */ 5937 wpa_printf(MSG_DEBUG, 5938 "P2P: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to the driver", 5939 freq); 5940 } else { 5941 wpa_printf(MSG_DEBUG, 5942 "P2P: The forced channel (%u MHz) is not supported for P2P uses", 5943 freq); 5944 res = -3; 5945 goto exit_free; 5946 } 5947 } 5948 5949 for (i = 0; i < num; i++) { 5950 if (freqs[i].freq == freq) 5951 freq_in_use = 1; 5952 } 5953 5954 if (num_unused <= 0 && !freq_in_use) { 5955 wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group on %u MHz as there are no available channels", 5956 freq); 5957 res = -2; 5958 goto exit_free; 5959 } 5960 wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the " 5961 "requested channel (%u MHz)", freq); 5962 *force_freq = freq; 5963 goto exit_ok; 5964 } 5965 5966 best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num); 5967 5968 /* We have a candidate frequency to use */ 5969 if (best_freq > 0) { 5970 if (*pref_freq == 0 && num_unused > 0) { 5971 wpa_printf(MSG_DEBUG, "P2P: Try to prefer a frequency (%u MHz) we are already using", 5972 best_freq); 5973 *pref_freq = best_freq; 5974 } else { 5975 wpa_printf(MSG_DEBUG, "P2P: Try to force us to use frequency (%u MHz) which is already in use", 5976 best_freq); 5977 *force_freq = best_freq; 5978 } 5979 } else if (num_unused > 0) { 5980 wpa_printf(MSG_DEBUG, 5981 "P2P: Current operating channels are not available for P2P. Try to use another channel"); 5982 *force_freq = 0; 5983 } else { 5984 wpa_printf(MSG_DEBUG, 5985 "P2P: All channels are in use and none of them are P2P enabled. Cannot start P2P group"); 5986 res = -2; 5987 goto exit_free; 5988 } 5989 5990 exit_ok: 5991 res = 0; 5992 exit_free: 5993 os_free(freqs); 5994 return res; 5995 } 5996 5997 5998 /** 5999 * wpas_p2p_connect - Request P2P Group Formation to be started 6000 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 6001 * @peer_addr: Address of the peer P2P Device 6002 * @pin: PIN to use during provisioning or %NULL to indicate PBC mode 6003 * @persistent_group: Whether to create a persistent group 6004 * @auto_join: Whether to select join vs. GO Negotiation automatically 6005 * @join: Whether to join an existing group (as a client) instead of starting 6006 * Group Owner negotiation; @peer_addr is BSSID in that case 6007 * @auth: Whether to only authorize the connection instead of doing that and 6008 * initiating Group Owner negotiation 6009 * @go_intent: GO Intent or -1 to use default 6010 * @freq: Frequency for the group or 0 for auto-selection 6011 * @persistent_id: Persistent group credentials to use for forcing GO 6012 * parameters or -1 to generate new values (SSID/passphrase) 6013 * @pd: Whether to send Provision Discovery prior to GO Negotiation as an 6014 * interoperability workaround when initiating group formation 6015 * @ht40: Start GO with 40 MHz channel width 6016 * @vht: Start GO with VHT support 6017 * Returns: 0 or new PIN (if pin was %NULL) on success, -1 on unspecified 6018 * failure, -2 on failure due to channel not currently available, 6019 * -3 if forced channel is not supported 6020 */ 6021 int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr, 6022 const char *pin, enum p2p_wps_method wps_method, 6023 int persistent_group, int auto_join, int join, int auth, 6024 int go_intent, int freq, int persistent_id, int pd, 6025 int ht40, int vht) 6026 { 6027 int force_freq = 0, pref_freq = 0; 6028 int ret = 0, res; 6029 enum wpa_driver_if_type iftype; 6030 const u8 *if_addr; 6031 struct wpa_ssid *ssid = NULL; 6032 6033 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 6034 return -1; 6035 6036 if (persistent_id >= 0) { 6037 ssid = wpa_config_get_network(wpa_s->conf, persistent_id); 6038 if (ssid == NULL || ssid->disabled != 2 || 6039 ssid->mode != WPAS_MODE_P2P_GO) 6040 return -1; 6041 } 6042 6043 os_free(wpa_s->global->add_psk); 6044 wpa_s->global->add_psk = NULL; 6045 6046 wpa_s->global->p2p_fail_on_wps_complete = 0; 6047 wpa_s->global->pending_p2ps_group = 0; 6048 6049 if (go_intent < 0) 6050 go_intent = wpa_s->conf->p2p_go_intent; 6051 6052 if (!auth) 6053 wpa_s->p2p_long_listen = 0; 6054 6055 wpa_s->p2p_wps_method = wps_method; 6056 wpa_s->p2p_persistent_group = !!persistent_group; 6057 wpa_s->p2p_persistent_id = persistent_id; 6058 wpa_s->p2p_go_intent = go_intent; 6059 wpa_s->p2p_connect_freq = freq; 6060 wpa_s->p2p_fallback_to_go_neg = 0; 6061 wpa_s->p2p_pd_before_go_neg = !!pd; 6062 wpa_s->p2p_go_ht40 = !!ht40; 6063 wpa_s->p2p_go_vht = !!vht; 6064 6065 if (pin) 6066 os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin)); 6067 else if (wps_method == WPS_PIN_DISPLAY) { 6068 ret = wps_generate_pin(); 6069 res = os_snprintf(wpa_s->p2p_pin, sizeof(wpa_s->p2p_pin), 6070 "%08d", ret); 6071 if (os_snprintf_error(sizeof(wpa_s->p2p_pin), res)) 6072 wpa_s->p2p_pin[sizeof(wpa_s->p2p_pin) - 1] = '\0'; 6073 wpa_printf(MSG_DEBUG, "P2P: Randomly generated PIN: %s", 6074 wpa_s->p2p_pin); 6075 } else 6076 wpa_s->p2p_pin[0] = '\0'; 6077 6078 if (join || auto_join) { 6079 u8 iface_addr[ETH_ALEN], dev_addr[ETH_ALEN]; 6080 if (auth) { 6081 wpa_printf(MSG_DEBUG, "P2P: Authorize invitation to " 6082 "connect a running group from " MACSTR, 6083 MAC2STR(peer_addr)); 6084 os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN); 6085 return ret; 6086 } 6087 os_memcpy(dev_addr, peer_addr, ETH_ALEN); 6088 if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr, 6089 iface_addr) < 0) { 6090 os_memcpy(iface_addr, peer_addr, ETH_ALEN); 6091 p2p_get_dev_addr(wpa_s->global->p2p, peer_addr, 6092 dev_addr); 6093 } 6094 if (auto_join) { 6095 os_get_reltime(&wpa_s->p2p_auto_started); 6096 wpa_printf(MSG_DEBUG, "P2P: Auto join started at " 6097 "%ld.%06ld", 6098 wpa_s->p2p_auto_started.sec, 6099 wpa_s->p2p_auto_started.usec); 6100 } 6101 wpa_s->user_initiated_pd = 1; 6102 if (wpas_p2p_join(wpa_s, iface_addr, dev_addr, wps_method, 6103 auto_join, freq, NULL, 0) < 0) 6104 return -1; 6105 return ret; 6106 } 6107 6108 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq, 6109 go_intent == 15); 6110 if (res) 6111 return res; 6112 wpas_p2p_set_own_freq_preference(wpa_s, 6113 force_freq ? force_freq : pref_freq); 6114 6115 wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s); 6116 6117 if (wpa_s->create_p2p_iface) { 6118 /* Prepare to add a new interface for the group */ 6119 iftype = WPA_IF_P2P_GROUP; 6120 if (go_intent == 15) 6121 iftype = WPA_IF_P2P_GO; 6122 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) { 6123 wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new " 6124 "interface for the group"); 6125 return -1; 6126 } 6127 6128 if_addr = wpa_s->pending_interface_addr; 6129 } else 6130 if_addr = wpa_s->own_addr; 6131 6132 if (auth) { 6133 if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method, 6134 go_intent, if_addr, 6135 force_freq, persistent_group, ssid, 6136 pref_freq) < 0) 6137 return -1; 6138 return ret; 6139 } 6140 6141 if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method, 6142 go_intent, if_addr, force_freq, 6143 persistent_group, ssid, pref_freq) < 0) { 6144 if (wpa_s->create_p2p_iface) 6145 wpas_p2p_remove_pending_group_interface(wpa_s); 6146 return -1; 6147 } 6148 return ret; 6149 } 6150 6151 6152 /** 6153 * wpas_p2p_remain_on_channel_cb - Indication of remain-on-channel start 6154 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 6155 * @freq: Frequency of the channel in MHz 6156 * @duration: Duration of the stay on the channel in milliseconds 6157 * 6158 * This callback is called when the driver indicates that it has started the 6159 * requested remain-on-channel duration. 6160 */ 6161 void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s, 6162 unsigned int freq, unsigned int duration) 6163 { 6164 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 6165 return; 6166 wpa_printf(MSG_DEBUG, "P2P: remain-on-channel callback (off_channel_freq=%u pending_listen_freq=%d roc_waiting_drv_freq=%d freq=%u duration=%u)", 6167 wpa_s->off_channel_freq, wpa_s->pending_listen_freq, 6168 wpa_s->roc_waiting_drv_freq, freq, duration); 6169 if (wpa_s->off_channel_freq && 6170 wpa_s->off_channel_freq == wpa_s->pending_listen_freq) { 6171 p2p_listen_cb(wpa_s->global->p2p, wpa_s->pending_listen_freq, 6172 wpa_s->pending_listen_duration); 6173 wpa_s->pending_listen_freq = 0; 6174 } else { 6175 wpa_printf(MSG_DEBUG, "P2P: Ignore remain-on-channel callback (off_channel_freq=%u pending_listen_freq=%d freq=%u duration=%u)", 6176 wpa_s->off_channel_freq, wpa_s->pending_listen_freq, 6177 freq, duration); 6178 } 6179 } 6180 6181 6182 int wpas_p2p_listen_start(struct wpa_supplicant *wpa_s, unsigned int timeout) 6183 { 6184 /* Limit maximum Listen state time based on driver limitation. */ 6185 if (timeout > wpa_s->max_remain_on_chan) 6186 timeout = wpa_s->max_remain_on_chan; 6187 6188 return p2p_listen(wpa_s->global->p2p, timeout); 6189 } 6190 6191 6192 /** 6193 * wpas_p2p_cancel_remain_on_channel_cb - Remain-on-channel timeout 6194 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 6195 * @freq: Frequency of the channel in MHz 6196 * 6197 * This callback is called when the driver indicates that a remain-on-channel 6198 * operation has been completed, i.e., the duration on the requested channel 6199 * has timed out. 6200 */ 6201 void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s, 6202 unsigned int freq) 6203 { 6204 wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel callback " 6205 "(p2p_long_listen=%d ms pending_action_tx=%p)", 6206 wpa_s->p2p_long_listen, offchannel_pending_action_tx(wpa_s)); 6207 wpas_p2p_listen_work_done(wpa_s); 6208 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 6209 return; 6210 if (wpa_s->p2p_long_listen > 0) 6211 wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan; 6212 if (p2p_listen_end(wpa_s->global->p2p, freq) > 0) 6213 return; /* P2P module started a new operation */ 6214 if (offchannel_pending_action_tx(wpa_s)) 6215 return; 6216 if (wpa_s->p2p_long_listen > 0) { 6217 wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state"); 6218 wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen); 6219 } else { 6220 /* 6221 * When listen duration is over, stop listen & update p2p_state 6222 * to IDLE. 6223 */ 6224 p2p_stop_listen(wpa_s->global->p2p); 6225 } 6226 } 6227 6228 6229 /** 6230 * wpas_p2p_group_remove - Remove a P2P group 6231 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 6232 * @ifname: Network interface name of the group interface or "*" to remove all 6233 * groups 6234 * Returns: 0 on success, -1 on failure 6235 * 6236 * This function is used to remove a P2P group. This can be used to disconnect 6237 * from a group in which the local end is a P2P Client or to end a P2P Group in 6238 * case the local end is the Group Owner. If a virtual network interface was 6239 * created for this group, that interface will be removed. Otherwise, only the 6240 * configured P2P group network will be removed from the interface. 6241 */ 6242 int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname) 6243 { 6244 struct wpa_global *global = wpa_s->global; 6245 struct wpa_supplicant *calling_wpa_s = wpa_s; 6246 6247 if (os_strcmp(ifname, "*") == 0) { 6248 struct wpa_supplicant *prev; 6249 wpa_s = global->ifaces; 6250 while (wpa_s) { 6251 prev = wpa_s; 6252 wpa_s = wpa_s->next; 6253 if (prev->p2p_group_interface != 6254 NOT_P2P_GROUP_INTERFACE || 6255 (prev->current_ssid && 6256 prev->current_ssid->p2p_group)) 6257 wpas_p2p_disconnect_safely(prev, calling_wpa_s); 6258 } 6259 return 0; 6260 } 6261 6262 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 6263 if (os_strcmp(wpa_s->ifname, ifname) == 0) 6264 break; 6265 } 6266 6267 return wpas_p2p_disconnect_safely(wpa_s, calling_wpa_s); 6268 } 6269 6270 6271 static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq) 6272 { 6273 unsigned int r; 6274 6275 if (freq == 2) { 6276 wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 2.4 GHz " 6277 "band"); 6278 if (wpa_s->best_24_freq > 0 && 6279 p2p_supported_freq_go(wpa_s->global->p2p, 6280 wpa_s->best_24_freq)) { 6281 freq = wpa_s->best_24_freq; 6282 wpa_printf(MSG_DEBUG, "P2P: Use best 2.4 GHz band " 6283 "channel: %d MHz", freq); 6284 } else { 6285 if (os_get_random((u8 *) &r, sizeof(r)) < 0) 6286 return -1; 6287 freq = 2412 + (r % 3) * 25; 6288 wpa_printf(MSG_DEBUG, "P2P: Use random 2.4 GHz band " 6289 "channel: %d MHz", freq); 6290 } 6291 } 6292 6293 if (freq == 5) { 6294 wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 5 GHz " 6295 "band"); 6296 if (wpa_s->best_5_freq > 0 && 6297 p2p_supported_freq_go(wpa_s->global->p2p, 6298 wpa_s->best_5_freq)) { 6299 freq = wpa_s->best_5_freq; 6300 wpa_printf(MSG_DEBUG, "P2P: Use best 5 GHz band " 6301 "channel: %d MHz", freq); 6302 } else { 6303 if (os_get_random((u8 *) &r, sizeof(r)) < 0) 6304 return -1; 6305 freq = 5180 + (r % 4) * 20; 6306 if (!p2p_supported_freq_go(wpa_s->global->p2p, freq)) { 6307 wpa_printf(MSG_DEBUG, "P2P: Could not select " 6308 "5 GHz channel for P2P group"); 6309 return -1; 6310 } 6311 wpa_printf(MSG_DEBUG, "P2P: Use random 5 GHz band " 6312 "channel: %d MHz", freq); 6313 } 6314 } 6315 6316 if (freq > 0 && !p2p_supported_freq_go(wpa_s->global->p2p, freq)) { 6317 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && 6318 ieee80211_is_dfs(freq)) { 6319 /* 6320 * If freq is a DFS channel and DFS is offloaded to the 6321 * driver, allow P2P GO to use it. 6322 */ 6323 wpa_printf(MSG_DEBUG, "P2P: " 6324 "%s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded", 6325 __func__, freq); 6326 return freq; 6327 } 6328 wpa_printf(MSG_DEBUG, "P2P: The forced channel for GO " 6329 "(%u MHz) is not supported for P2P uses", 6330 freq); 6331 return -1; 6332 } 6333 6334 return freq; 6335 } 6336 6337 6338 static int wpas_p2p_select_freq_no_pref(struct wpa_supplicant *wpa_s, 6339 struct p2p_go_neg_results *params, 6340 const struct p2p_channels *channels) 6341 { 6342 unsigned int i, r; 6343 6344 /* first try some random selection of the social channels */ 6345 if (os_get_random((u8 *) &r, sizeof(r)) < 0) 6346 return -1; 6347 6348 for (i = 0; i < 3; i++) { 6349 params->freq = 2412 + ((r + i) % 3) * 25; 6350 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6351 freq_included(channels, params->freq) && 6352 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6353 goto out; 6354 } 6355 6356 /* try all channels in reg. class 81 */ 6357 for (i = 0; i < 11; i++) { 6358 params->freq = 2412 + i * 5; 6359 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6360 freq_included(channels, params->freq) && 6361 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6362 goto out; 6363 } 6364 6365 /* try all channels in operating class 115 */ 6366 for (i = 0; i < 4; i++) { 6367 params->freq = 5180 + i * 20; 6368 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6369 freq_included(channels, params->freq) && 6370 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6371 goto out; 6372 } 6373 6374 /* try all channels in operating class 124 */ 6375 for (i = 0; i < 4; i++) { 6376 params->freq = 5745 + i * 20; 6377 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6378 freq_included(channels, params->freq) && 6379 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6380 goto out; 6381 } 6382 6383 /* try social channel class 180 channel 2 */ 6384 params->freq = 58320 + 1 * 2160; 6385 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6386 freq_included(channels, params->freq) && 6387 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6388 goto out; 6389 6390 /* try all channels in reg. class 180 */ 6391 for (i = 0; i < 4; i++) { 6392 params->freq = 58320 + i * 2160; 6393 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) && 6394 freq_included(channels, params->freq) && 6395 p2p_supported_freq(wpa_s->global->p2p, params->freq)) 6396 goto out; 6397 } 6398 6399 wpa_printf(MSG_DEBUG, "P2P: No 2.4, 5, or 60 GHz channel allowed"); 6400 return -1; 6401 out: 6402 wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz (no preference known)", 6403 params->freq); 6404 return 0; 6405 } 6406 6407 6408 static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s, 6409 struct p2p_go_neg_results *params, 6410 int freq, int ht40, int vht, 6411 const struct p2p_channels *channels) 6412 { 6413 struct wpa_used_freq_data *freqs; 6414 unsigned int pref_freq, cand_freq; 6415 unsigned int num, i; 6416 6417 os_memset(params, 0, sizeof(*params)); 6418 params->role_go = 1; 6419 params->ht40 = ht40; 6420 params->vht = vht; 6421 if (freq) { 6422 if (!freq_included(channels, freq)) { 6423 wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not " 6424 "accepted", freq); 6425 return -1; 6426 } 6427 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on forced " 6428 "frequency %d MHz", freq); 6429 params->freq = freq; 6430 } else if (wpa_s->conf->p2p_oper_reg_class == 81 && 6431 wpa_s->conf->p2p_oper_channel >= 1 && 6432 wpa_s->conf->p2p_oper_channel <= 11 && 6433 freq_included(channels, 6434 2407 + 5 * wpa_s->conf->p2p_oper_channel)) { 6435 params->freq = 2407 + 5 * wpa_s->conf->p2p_oper_channel; 6436 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured " 6437 "frequency %d MHz", params->freq); 6438 } else if ((wpa_s->conf->p2p_oper_reg_class == 115 || 6439 wpa_s->conf->p2p_oper_reg_class == 116 || 6440 wpa_s->conf->p2p_oper_reg_class == 117 || 6441 wpa_s->conf->p2p_oper_reg_class == 124 || 6442 wpa_s->conf->p2p_oper_reg_class == 126 || 6443 wpa_s->conf->p2p_oper_reg_class == 127) && 6444 freq_included(channels, 6445 5000 + 5 * wpa_s->conf->p2p_oper_channel)) { 6446 params->freq = 5000 + 5 * wpa_s->conf->p2p_oper_channel; 6447 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured " 6448 "frequency %d MHz", params->freq); 6449 } else if (wpa_s->conf->p2p_oper_channel == 0 && 6450 wpa_s->best_overall_freq > 0 && 6451 p2p_supported_freq_go(wpa_s->global->p2p, 6452 wpa_s->best_overall_freq) && 6453 freq_included(channels, wpa_s->best_overall_freq)) { 6454 params->freq = wpa_s->best_overall_freq; 6455 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best overall " 6456 "channel %d MHz", params->freq); 6457 } else if (wpa_s->conf->p2p_oper_channel == 0 && 6458 wpa_s->best_24_freq > 0 && 6459 p2p_supported_freq_go(wpa_s->global->p2p, 6460 wpa_s->best_24_freq) && 6461 freq_included(channels, wpa_s->best_24_freq)) { 6462 params->freq = wpa_s->best_24_freq; 6463 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 2.4 GHz " 6464 "channel %d MHz", params->freq); 6465 } else if (wpa_s->conf->p2p_oper_channel == 0 && 6466 wpa_s->best_5_freq > 0 && 6467 p2p_supported_freq_go(wpa_s->global->p2p, 6468 wpa_s->best_5_freq) && 6469 freq_included(channels, wpa_s->best_5_freq)) { 6470 params->freq = wpa_s->best_5_freq; 6471 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 5 GHz " 6472 "channel %d MHz", params->freq); 6473 } else if ((pref_freq = p2p_get_pref_freq(wpa_s->global->p2p, 6474 channels))) { 6475 params->freq = pref_freq; 6476 wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz from preferred " 6477 "channels", params->freq); 6478 } else { 6479 /* no preference, select some channel */ 6480 if (wpas_p2p_select_freq_no_pref(wpa_s, params, channels) < 0) 6481 return -1; 6482 } 6483 6484 freqs = os_calloc(wpa_s->num_multichan_concurrent, 6485 sizeof(struct wpa_used_freq_data)); 6486 if (!freqs) 6487 return -1; 6488 6489 num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, 6490 wpa_s->num_multichan_concurrent); 6491 6492 cand_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num); 6493 6494 /* First try the best used frequency if possible */ 6495 if (!freq && cand_freq > 0 && freq_included(channels, cand_freq)) { 6496 params->freq = cand_freq; 6497 } else if (!freq) { 6498 /* Try any of the used frequencies */ 6499 for (i = 0; i < num; i++) { 6500 if (freq_included(channels, freqs[i].freq)) { 6501 wpa_printf(MSG_DEBUG, "P2P: Force GO on a channel we are already using (%u MHz)", 6502 freqs[i].freq); 6503 params->freq = freqs[i].freq; 6504 break; 6505 } 6506 } 6507 6508 if (i == num) { 6509 if (wpas_p2p_num_unused_channels(wpa_s) <= 0) { 6510 wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on any of the channels we are already using"); 6511 os_free(freqs); 6512 return -1; 6513 } else { 6514 wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on any of the channels we are already using. Use one of the free channels"); 6515 } 6516 } 6517 } else { 6518 for (i = 0; i < num; i++) { 6519 if (freqs[i].freq == freq) 6520 break; 6521 } 6522 6523 if (i == num) { 6524 if (wpas_p2p_num_unused_channels(wpa_s) <= 0) { 6525 if (freq) 6526 wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on freq (%u MHz) as all the channels are in use", freq); 6527 os_free(freqs); 6528 return -1; 6529 } else { 6530 wpa_printf(MSG_DEBUG, "P2P: Use one of the free channels"); 6531 } 6532 } 6533 } 6534 6535 os_free(freqs); 6536 return 0; 6537 } 6538 6539 6540 static struct wpa_supplicant * 6541 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated, 6542 int go) 6543 { 6544 struct wpa_supplicant *group_wpa_s; 6545 6546 if (!wpas_p2p_create_iface(wpa_s)) { 6547 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use same interface for group " 6548 "operations"); 6549 wpa_s->p2p_first_connection_timeout = 0; 6550 return wpa_s; 6551 } 6552 6553 if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO : 6554 WPA_IF_P2P_CLIENT) < 0) { 6555 wpa_msg_global(wpa_s, MSG_ERROR, 6556 "P2P: Failed to add group interface"); 6557 return NULL; 6558 } 6559 group_wpa_s = wpas_p2p_init_group_interface(wpa_s, go); 6560 if (group_wpa_s == NULL) { 6561 wpa_msg_global(wpa_s, MSG_ERROR, 6562 "P2P: Failed to initialize group interface"); 6563 wpas_p2p_remove_pending_group_interface(wpa_s); 6564 return NULL; 6565 } 6566 6567 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use separate group interface %s", 6568 group_wpa_s->ifname); 6569 group_wpa_s->p2p_first_connection_timeout = 0; 6570 return group_wpa_s; 6571 } 6572 6573 6574 /** 6575 * wpas_p2p_group_add - Add a new P2P group with local end as Group Owner 6576 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface() 6577 * @persistent_group: Whether to create a persistent group 6578 * @freq: Frequency for the group or 0 to indicate no hardcoding 6579 * @ht40: Start GO with 40 MHz channel width 6580 * @vht: Start GO with VHT support 6581 * Returns: 0 on success, -1 on failure 6582 * 6583 * This function creates a new P2P group with the local end as the Group Owner, 6584 * i.e., without using Group Owner Negotiation. 6585 */ 6586 int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group, 6587 int freq, int ht40, int vht) 6588 { 6589 struct p2p_go_neg_results params; 6590 6591 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 6592 return -1; 6593 6594 os_free(wpa_s->global->add_psk); 6595 wpa_s->global->add_psk = NULL; 6596 6597 /* Make sure we are not running find during connection establishment */ 6598 wpa_printf(MSG_DEBUG, "P2P: Stop any on-going P2P FIND"); 6599 wpas_p2p_stop_find_oper(wpa_s); 6600 6601 freq = wpas_p2p_select_go_freq(wpa_s, freq); 6602 if (freq < 0) 6603 return -1; 6604 6605 if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, ht40, vht, NULL)) 6606 return -1; 6607 if (params.freq && 6608 !p2p_supported_freq_go(wpa_s->global->p2p, params.freq)) { 6609 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) && 6610 ieee80211_is_dfs(params.freq)) { 6611 /* 6612 * If freq is a DFS channel and DFS is offloaded to the 6613 * driver, allow P2P GO to use it. 6614 */ 6615 wpa_printf(MSG_DEBUG, 6616 "P2P: %s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to driver", 6617 __func__, params.freq); 6618 } else { 6619 wpa_printf(MSG_DEBUG, 6620 "P2P: The selected channel for GO (%u MHz) is not supported for P2P uses", 6621 params.freq); 6622 return -1; 6623 } 6624 } 6625 p2p_go_params(wpa_s->global->p2p, ¶ms); 6626 params.persistent_group = persistent_group; 6627 6628 wpa_s = wpas_p2p_get_group_iface(wpa_s, 0, 1); 6629 if (wpa_s == NULL) 6630 return -1; 6631 wpas_start_wps_go(wpa_s, ¶ms, 0); 6632 6633 return 0; 6634 } 6635 6636 6637 static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s, 6638 struct wpa_ssid *params, int addr_allocated, 6639 int freq) 6640 { 6641 struct wpa_ssid *ssid; 6642 6643 wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0); 6644 if (wpa_s == NULL) 6645 return -1; 6646 wpa_s->p2p_last_4way_hs_fail = NULL; 6647 6648 wpa_supplicant_ap_deinit(wpa_s); 6649 6650 ssid = wpa_config_add_network(wpa_s->conf); 6651 if (ssid == NULL) 6652 return -1; 6653 wpa_config_set_network_defaults(ssid); 6654 ssid->temporary = 1; 6655 ssid->proto = WPA_PROTO_RSN; 6656 ssid->pairwise_cipher = WPA_CIPHER_CCMP; 6657 ssid->group_cipher = WPA_CIPHER_CCMP; 6658 ssid->key_mgmt = WPA_KEY_MGMT_PSK; 6659 ssid->ssid = os_malloc(params->ssid_len); 6660 if (ssid->ssid == NULL) { 6661 wpa_config_remove_network(wpa_s->conf, ssid->id); 6662 return -1; 6663 } 6664 os_memcpy(ssid->ssid, params->ssid, params->ssid_len); 6665 ssid->ssid_len = params->ssid_len; 6666 ssid->p2p_group = 1; 6667 ssid->export_keys = 1; 6668 if (params->psk_set) { 6669 os_memcpy(ssid->psk, params->psk, 32); 6670 ssid->psk_set = 1; 6671 } 6672 if (params->passphrase) 6673 ssid->passphrase = os_strdup(params->passphrase); 6674 6675 wpa_s->show_group_started = 1; 6676 wpa_s->p2p_in_invitation = 1; 6677 wpa_s->p2p_invite_go_freq = freq; 6678 6679 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent, 6680 NULL); 6681 eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0, 6682 wpas_p2p_group_formation_timeout, 6683 wpa_s->parent, NULL); 6684 wpa_supplicant_select_network(wpa_s, ssid); 6685 6686 return 0; 6687 } 6688 6689 6690 int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s, 6691 struct wpa_ssid *ssid, int addr_allocated, 6692 int force_freq, int neg_freq, int ht40, 6693 int vht, const struct p2p_channels *channels, 6694 int connection_timeout) 6695 { 6696 struct p2p_go_neg_results params; 6697 int go = 0, freq; 6698 6699 if (ssid->disabled != 2 || ssid->ssid == NULL) 6700 return -1; 6701 6702 if (wpas_get_p2p_group(wpa_s, ssid->ssid, ssid->ssid_len, &go) && 6703 go == (ssid->mode == WPAS_MODE_P2P_GO)) { 6704 wpa_printf(MSG_DEBUG, "P2P: Requested persistent group is " 6705 "already running"); 6706 return 0; 6707 } 6708 6709 os_free(wpa_s->global->add_psk); 6710 wpa_s->global->add_psk = NULL; 6711 6712 /* Make sure we are not running find during connection establishment */ 6713 wpas_p2p_stop_find_oper(wpa_s); 6714 6715 wpa_s->p2p_fallback_to_go_neg = 0; 6716 6717 if (ssid->mode == WPAS_MODE_P2P_GO) { 6718 if (force_freq > 0) { 6719 freq = wpas_p2p_select_go_freq(wpa_s, force_freq); 6720 if (freq < 0) 6721 return -1; 6722 } else { 6723 freq = wpas_p2p_select_go_freq(wpa_s, neg_freq); 6724 if (freq < 0 || 6725 (freq > 0 && !freq_included(channels, freq))) 6726 freq = 0; 6727 } 6728 } else { 6729 freq = neg_freq; 6730 if (freq < 0 || 6731 (freq > 0 && !freq_included(channels, freq))) 6732 freq = 0; 6733 } 6734 6735 if (ssid->mode == WPAS_MODE_INFRA) 6736 return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq); 6737 6738 if (ssid->mode != WPAS_MODE_P2P_GO) 6739 return -1; 6740 6741 if (wpas_p2p_init_go_params(wpa_s, ¶ms, freq, ht40, vht, channels)) 6742 return -1; 6743 6744 params.role_go = 1; 6745 params.psk_set = ssid->psk_set; 6746 if (params.psk_set) 6747 os_memcpy(params.psk, ssid->psk, sizeof(params.psk)); 6748 if (ssid->passphrase) { 6749 if (os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) { 6750 wpa_printf(MSG_ERROR, "P2P: Invalid passphrase in " 6751 "persistent group"); 6752 return -1; 6753 } 6754 os_strlcpy(params.passphrase, ssid->passphrase, 6755 sizeof(params.passphrase)); 6756 } 6757 os_memcpy(params.ssid, ssid->ssid, ssid->ssid_len); 6758 params.ssid_len = ssid->ssid_len; 6759 params.persistent_group = 1; 6760 6761 wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1); 6762 if (wpa_s == NULL) 6763 return -1; 6764 6765 p2p_channels_to_freqs(channels, params.freq_list, P2P_MAX_CHANNELS); 6766 6767 wpa_s->p2p_first_connection_timeout = connection_timeout; 6768 wpas_start_wps_go(wpa_s, ¶ms, 0); 6769 6770 return 0; 6771 } 6772 6773 6774 static void wpas_p2p_ie_update(void *ctx, struct wpabuf *beacon_ies, 6775 struct wpabuf *proberesp_ies) 6776 { 6777 struct wpa_supplicant *wpa_s = ctx; 6778 if (wpa_s->ap_iface) { 6779 struct hostapd_data *hapd = wpa_s->ap_iface->bss[0]; 6780 if (!(hapd->conf->p2p & P2P_GROUP_OWNER)) { 6781 wpabuf_free(beacon_ies); 6782 wpabuf_free(proberesp_ies); 6783 return; 6784 } 6785 if (beacon_ies) { 6786 wpabuf_free(hapd->p2p_beacon_ie); 6787 hapd->p2p_beacon_ie = beacon_ies; 6788 } 6789 wpabuf_free(hapd->p2p_probe_resp_ie); 6790 hapd->p2p_probe_resp_ie = proberesp_ies; 6791 } else { 6792 wpabuf_free(beacon_ies); 6793 wpabuf_free(proberesp_ies); 6794 } 6795 wpa_supplicant_ap_update_beacon(wpa_s); 6796 } 6797 6798 6799 static void wpas_p2p_idle_update(void *ctx, int idle) 6800 { 6801 struct wpa_supplicant *wpa_s = ctx; 6802 if (!wpa_s->ap_iface) 6803 return; 6804 wpa_printf(MSG_DEBUG, "P2P: GO - group %sidle", idle ? "" : "not "); 6805 if (idle) { 6806 if (wpa_s->global->p2p_fail_on_wps_complete && 6807 wpa_s->p2p_in_provisioning) { 6808 wpas_p2p_grpform_fail_after_wps(wpa_s); 6809 return; 6810 } 6811 wpas_p2p_set_group_idle_timeout(wpa_s); 6812 } else 6813 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL); 6814 } 6815 6816 6817 struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s, 6818 struct wpa_ssid *ssid) 6819 { 6820 struct p2p_group *group; 6821 struct p2p_group_config *cfg; 6822 6823 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 6824 return NULL; 6825 6826 cfg = os_zalloc(sizeof(*cfg)); 6827 if (cfg == NULL) 6828 return NULL; 6829 6830 if (ssid->p2p_persistent_group && wpa_s->conf->persistent_reconnect) 6831 cfg->persistent_group = 2; 6832 else if (ssid->p2p_persistent_group) 6833 cfg->persistent_group = 1; 6834 os_memcpy(cfg->interface_addr, wpa_s->own_addr, ETH_ALEN); 6835 if (wpa_s->max_stations && 6836 wpa_s->max_stations < wpa_s->conf->max_num_sta) 6837 cfg->max_clients = wpa_s->max_stations; 6838 else 6839 cfg->max_clients = wpa_s->conf->max_num_sta; 6840 os_memcpy(cfg->ssid, ssid->ssid, ssid->ssid_len); 6841 cfg->ssid_len = ssid->ssid_len; 6842 cfg->freq = ssid->frequency; 6843 cfg->cb_ctx = wpa_s; 6844 cfg->ie_update = wpas_p2p_ie_update; 6845 cfg->idle_update = wpas_p2p_idle_update; 6846 6847 group = p2p_group_init(wpa_s->global->p2p, cfg); 6848 if (group == NULL) 6849 os_free(cfg); 6850 if (ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION) 6851 p2p_group_notif_formation_done(group); 6852 wpa_s->p2p_group = group; 6853 return group; 6854 } 6855 6856 6857 void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr, 6858 int registrar) 6859 { 6860 struct wpa_ssid *ssid = wpa_s->current_ssid; 6861 6862 if (!wpa_s->p2p_in_provisioning) { 6863 wpa_printf(MSG_DEBUG, "P2P: Ignore WPS success event - P2P " 6864 "provisioning not in progress"); 6865 return; 6866 } 6867 6868 if (ssid && ssid->mode == WPAS_MODE_INFRA) { 6869 u8 go_dev_addr[ETH_ALEN]; 6870 os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN); 6871 wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid, 6872 ssid->ssid_len); 6873 /* Clear any stored provisioning info */ 6874 p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr); 6875 } 6876 6877 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent, 6878 NULL); 6879 wpa_s->p2p_go_group_formation_completed = 1; 6880 if (ssid && ssid->mode == WPAS_MODE_INFRA) { 6881 /* 6882 * Use a separate timeout for initial data connection to 6883 * complete to allow the group to be removed automatically if 6884 * something goes wrong in this step before the P2P group idle 6885 * timeout mechanism is taken into use. 6886 */ 6887 wpa_dbg(wpa_s, MSG_DEBUG, 6888 "P2P: Re-start group formation timeout (%d seconds) as client for initial connection", 6889 P2P_MAX_INITIAL_CONN_WAIT); 6890 eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0, 6891 wpas_p2p_group_formation_timeout, 6892 wpa_s->parent, NULL); 6893 } else if (ssid) { 6894 /* 6895 * Use a separate timeout for initial data connection to 6896 * complete to allow the group to be removed automatically if 6897 * the client does not complete data connection successfully. 6898 */ 6899 wpa_dbg(wpa_s, MSG_DEBUG, 6900 "P2P: Re-start group formation timeout (%d seconds) as GO for initial connection", 6901 P2P_MAX_INITIAL_CONN_WAIT_GO); 6902 eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT_GO, 0, 6903 wpas_p2p_group_formation_timeout, 6904 wpa_s->parent, NULL); 6905 /* 6906 * Complete group formation on first successful data connection 6907 */ 6908 wpa_s->p2p_go_group_formation_completed = 0; 6909 } 6910 if (wpa_s->global->p2p) 6911 p2p_wps_success_cb(wpa_s->global->p2p, peer_addr); 6912 wpas_group_formation_completed(wpa_s, 1); 6913 } 6914 6915 6916 void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s, 6917 struct wps_event_fail *fail) 6918 { 6919 if (!wpa_s->p2p_in_provisioning) { 6920 wpa_printf(MSG_DEBUG, "P2P: Ignore WPS fail event - P2P " 6921 "provisioning not in progress"); 6922 return; 6923 } 6924 6925 if (wpa_s->go_params) { 6926 p2p_clear_provisioning_info( 6927 wpa_s->global->p2p, 6928 wpa_s->go_params->peer_device_addr); 6929 } 6930 6931 wpas_notify_p2p_wps_failed(wpa_s, fail); 6932 6933 if (wpa_s == wpa_s->global->p2p_group_formation) { 6934 /* 6935 * Allow some time for the failed WPS negotiation exchange to 6936 * complete, but remove the group since group formation cannot 6937 * succeed after provisioning failure. 6938 */ 6939 wpa_printf(MSG_DEBUG, "P2P: WPS step failed during group formation - reject connection from timeout"); 6940 wpa_s->global->p2p_fail_on_wps_complete = 1; 6941 eloop_deplete_timeout(0, 50000, 6942 wpas_p2p_group_formation_timeout, 6943 wpa_s->parent, NULL); 6944 } 6945 } 6946 6947 6948 int wpas_p2p_wps_eapol_cb(struct wpa_supplicant *wpa_s) 6949 { 6950 if (!wpa_s->global->p2p_fail_on_wps_complete || 6951 !wpa_s->p2p_in_provisioning) 6952 return 0; 6953 6954 wpas_p2p_grpform_fail_after_wps(wpa_s); 6955 6956 return 1; 6957 } 6958 6959 6960 int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr, 6961 const char *config_method, 6962 enum wpas_p2p_prov_disc_use use, 6963 struct p2ps_provision *p2ps_prov) 6964 { 6965 u16 config_methods; 6966 6967 wpa_s->global->pending_p2ps_group = 0; 6968 wpa_s->p2p_fallback_to_go_neg = 0; 6969 wpa_s->pending_pd_use = NORMAL_PD; 6970 if (p2ps_prov && use == WPAS_P2P_PD_FOR_ASP) { 6971 p2ps_prov->conncap = p2ps_group_capability( 6972 wpa_s, P2PS_SETUP_NONE, p2ps_prov->role); 6973 wpa_printf(MSG_DEBUG, 6974 "P2P: %s conncap: %d - ASP parsed: %x %x %d %s", 6975 __func__, p2ps_prov->conncap, 6976 p2ps_prov->adv_id, p2ps_prov->conncap, 6977 p2ps_prov->status, p2ps_prov->info); 6978 6979 config_methods = 0; 6980 } else if (os_strncmp(config_method, "display", 7) == 0) 6981 config_methods = WPS_CONFIG_DISPLAY; 6982 else if (os_strncmp(config_method, "keypad", 6) == 0) 6983 config_methods = WPS_CONFIG_KEYPAD; 6984 else if (os_strncmp(config_method, "pbc", 3) == 0 || 6985 os_strncmp(config_method, "pushbutton", 10) == 0) 6986 config_methods = WPS_CONFIG_PUSHBUTTON; 6987 else { 6988 wpa_printf(MSG_DEBUG, "P2P: Unknown config method"); 6989 os_free(p2ps_prov); 6990 return -1; 6991 } 6992 6993 if (use == WPAS_P2P_PD_AUTO) { 6994 os_memcpy(wpa_s->pending_join_dev_addr, peer_addr, ETH_ALEN); 6995 wpa_s->pending_pd_config_methods = config_methods; 6996 wpa_s->p2p_auto_pd = 1; 6997 wpa_s->p2p_auto_join = 0; 6998 wpa_s->pending_pd_before_join = 0; 6999 wpa_s->auto_pd_scan_retry = 0; 7000 wpas_p2p_stop_find(wpa_s); 7001 wpa_s->p2p_join_scan_count = 0; 7002 os_get_reltime(&wpa_s->p2p_auto_started); 7003 wpa_printf(MSG_DEBUG, "P2P: Auto PD started at %ld.%06ld", 7004 wpa_s->p2p_auto_started.sec, 7005 wpa_s->p2p_auto_started.usec); 7006 wpas_p2p_join_scan(wpa_s, NULL); 7007 return 0; 7008 } 7009 7010 if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled) { 7011 os_free(p2ps_prov); 7012 return -1; 7013 } 7014 7015 return p2p_prov_disc_req(wpa_s->global->p2p, peer_addr, p2ps_prov, 7016 config_methods, use == WPAS_P2P_PD_FOR_JOIN, 7017 0, 1); 7018 } 7019 7020 7021 int wpas_p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, 7022 char *end) 7023 { 7024 return p2p_scan_result_text(ies, ies_len, buf, end); 7025 } 7026 7027 7028 static void wpas_p2p_clear_pending_action_tx(struct wpa_supplicant *wpa_s) 7029 { 7030 if (!offchannel_pending_action_tx(wpa_s)) 7031 return; 7032 7033 wpas_p2p_action_tx_clear(wpa_s); 7034 7035 wpa_printf(MSG_DEBUG, "P2P: Drop pending Action TX due to new " 7036 "operation request"); 7037 offchannel_clear_pending_action_tx(wpa_s); 7038 } 7039 7040 7041 int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout, 7042 enum p2p_discovery_type type, 7043 unsigned int num_req_dev_types, const u8 *req_dev_types, 7044 const u8 *dev_id, unsigned int search_delay, 7045 u8 seek_cnt, const char **seek_string, int freq) 7046 { 7047 wpas_p2p_clear_pending_action_tx(wpa_s); 7048 wpa_s->p2p_long_listen = 0; 7049 7050 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL || 7051 wpa_s->p2p_in_provisioning) 7052 return -1; 7053 7054 wpa_supplicant_cancel_sched_scan(wpa_s); 7055 7056 return p2p_find(wpa_s->global->p2p, timeout, type, 7057 num_req_dev_types, req_dev_types, dev_id, 7058 search_delay, seek_cnt, seek_string, freq); 7059 } 7060 7061 7062 static void wpas_p2p_scan_res_ignore_search(struct wpa_supplicant *wpa_s, 7063 struct wpa_scan_results *scan_res) 7064 { 7065 wpa_printf(MSG_DEBUG, "P2P: Ignore scan results"); 7066 7067 if (wpa_s->p2p_scan_work) { 7068 struct wpa_radio_work *work = wpa_s->p2p_scan_work; 7069 wpa_s->p2p_scan_work = NULL; 7070 radio_work_done(work); 7071 } 7072 7073 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7074 return; 7075 7076 /* 7077 * Indicate that results have been processed so that the P2P module can 7078 * continue pending tasks. 7079 */ 7080 p2p_scan_res_handled(wpa_s->global->p2p); 7081 } 7082 7083 7084 static void wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s) 7085 { 7086 wpas_p2p_clear_pending_action_tx(wpa_s); 7087 wpa_s->p2p_long_listen = 0; 7088 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); 7089 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL); 7090 7091 if (wpa_s->global->p2p) 7092 p2p_stop_find(wpa_s->global->p2p); 7093 7094 if (wpa_s->scan_res_handler == wpas_p2p_scan_res_handler) { 7095 wpa_printf(MSG_DEBUG, 7096 "P2P: Do not consider the scan results after stop_find"); 7097 wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore_search; 7098 } 7099 } 7100 7101 7102 void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s) 7103 { 7104 wpas_p2p_stop_find_oper(wpa_s); 7105 if (!wpa_s->global->pending_group_iface_for_p2ps) 7106 wpas_p2p_remove_pending_group_interface(wpa_s); 7107 } 7108 7109 7110 static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx) 7111 { 7112 struct wpa_supplicant *wpa_s = eloop_ctx; 7113 wpa_s->p2p_long_listen = 0; 7114 } 7115 7116 7117 int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout) 7118 { 7119 int res; 7120 7121 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7122 return -1; 7123 7124 wpa_supplicant_cancel_sched_scan(wpa_s); 7125 wpas_p2p_clear_pending_action_tx(wpa_s); 7126 7127 if (timeout == 0) { 7128 /* 7129 * This is a request for unlimited Listen state. However, at 7130 * least for now, this is mapped to a Listen state for one 7131 * hour. 7132 */ 7133 timeout = 3600; 7134 } 7135 eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL); 7136 wpa_s->p2p_long_listen = 0; 7137 7138 /* 7139 * Stop previous find/listen operation to avoid trying to request a new 7140 * remain-on-channel operation while the driver is still running the 7141 * previous one. 7142 */ 7143 if (wpa_s->global->p2p) 7144 p2p_stop_find(wpa_s->global->p2p); 7145 7146 res = wpas_p2p_listen_start(wpa_s, timeout * 1000); 7147 if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) { 7148 wpa_s->p2p_long_listen = timeout * 1000; 7149 eloop_register_timeout(timeout, 0, 7150 wpas_p2p_long_listen_timeout, 7151 wpa_s, NULL); 7152 } 7153 7154 return res; 7155 } 7156 7157 7158 int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss, 7159 u8 *buf, size_t len, int p2p_group) 7160 { 7161 struct wpabuf *p2p_ie; 7162 int ret; 7163 7164 if (wpa_s->global->p2p_disabled) 7165 return -1; 7166 if (wpa_s->conf->p2p_disabled) 7167 return -1; 7168 if (wpa_s->global->p2p == NULL) 7169 return -1; 7170 if (bss == NULL) 7171 return -1; 7172 7173 p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE); 7174 ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len, 7175 p2p_group, p2p_ie); 7176 wpabuf_free(p2p_ie); 7177 7178 return ret; 7179 } 7180 7181 7182 int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr, 7183 const u8 *dst, const u8 *bssid, 7184 const u8 *ie, size_t ie_len, int ssi_signal) 7185 { 7186 if (wpa_s->global->p2p_disabled) 7187 return 0; 7188 if (wpa_s->global->p2p == NULL) 7189 return 0; 7190 7191 switch (p2p_probe_req_rx(wpa_s->global->p2p, addr, dst, bssid, 7192 ie, ie_len)) { 7193 case P2P_PREQ_NOT_P2P: 7194 wpas_notify_preq(wpa_s, addr, dst, bssid, ie, ie_len, 7195 ssi_signal); 7196 /* fall through */ 7197 case P2P_PREQ_MALFORMED: 7198 case P2P_PREQ_NOT_LISTEN: 7199 case P2P_PREQ_NOT_PROCESSED: 7200 default: /* make gcc happy */ 7201 return 0; 7202 case P2P_PREQ_PROCESSED: 7203 return 1; 7204 } 7205 } 7206 7207 7208 void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da, 7209 const u8 *sa, const u8 *bssid, 7210 u8 category, const u8 *data, size_t len, int freq) 7211 { 7212 if (wpa_s->global->p2p_disabled) 7213 return; 7214 if (wpa_s->global->p2p == NULL) 7215 return; 7216 7217 p2p_rx_action(wpa_s->global->p2p, da, sa, bssid, category, data, len, 7218 freq); 7219 } 7220 7221 7222 void wpas_p2p_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ies) 7223 { 7224 if (wpa_s->global->p2p_disabled) 7225 return; 7226 if (wpa_s->global->p2p == NULL) 7227 return; 7228 7229 p2p_scan_ie(wpa_s->global->p2p, ies, NULL); 7230 } 7231 7232 7233 static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s) 7234 { 7235 p2p_group_deinit(wpa_s->p2p_group); 7236 wpa_s->p2p_group = NULL; 7237 7238 wpa_s->ap_configured_cb = NULL; 7239 wpa_s->ap_configured_cb_ctx = NULL; 7240 wpa_s->ap_configured_cb_data = NULL; 7241 wpa_s->connect_without_scan = NULL; 7242 } 7243 7244 7245 int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr) 7246 { 7247 wpa_s->p2p_long_listen = 0; 7248 7249 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7250 return -1; 7251 7252 return p2p_reject(wpa_s->global->p2p, addr); 7253 } 7254 7255 7256 /* Invite to reinvoke a persistent group */ 7257 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr, 7258 struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq, 7259 int ht40, int vht, int pref_freq) 7260 { 7261 enum p2p_invite_role role; 7262 u8 *bssid = NULL; 7263 int force_freq = 0; 7264 int res; 7265 int no_pref_freq_given = pref_freq == 0; 7266 7267 wpa_s->global->p2p_invite_group = NULL; 7268 if (peer_addr) 7269 os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN); 7270 else 7271 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN); 7272 7273 wpa_s->p2p_persistent_go_freq = freq; 7274 wpa_s->p2p_go_ht40 = !!ht40; 7275 if (ssid->mode == WPAS_MODE_P2P_GO) { 7276 role = P2P_INVITE_ROLE_GO; 7277 if (peer_addr == NULL) { 7278 wpa_printf(MSG_DEBUG, "P2P: Missing peer " 7279 "address in invitation command"); 7280 return -1; 7281 } 7282 if (wpas_p2p_create_iface(wpa_s)) { 7283 if (wpas_p2p_add_group_interface(wpa_s, 7284 WPA_IF_P2P_GO) < 0) { 7285 wpa_printf(MSG_ERROR, "P2P: Failed to " 7286 "allocate a new interface for the " 7287 "group"); 7288 return -1; 7289 } 7290 bssid = wpa_s->pending_interface_addr; 7291 } else 7292 bssid = wpa_s->own_addr; 7293 } else { 7294 role = P2P_INVITE_ROLE_CLIENT; 7295 peer_addr = ssid->bssid; 7296 } 7297 wpa_s->pending_invite_ssid_id = ssid->id; 7298 7299 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq, 7300 role == P2P_INVITE_ROLE_GO); 7301 if (res) 7302 return res; 7303 7304 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7305 return -1; 7306 7307 if (wpa_s->parent->conf->p2p_ignore_shared_freq && 7308 no_pref_freq_given && pref_freq > 0 && 7309 wpa_s->num_multichan_concurrent > 1 && 7310 wpas_p2p_num_unused_channels(wpa_s) > 0) { 7311 wpa_printf(MSG_DEBUG, "P2P: Ignore own channel preference %d MHz for invitation due to p2p_ignore_shared_freq=1 configuration", 7312 pref_freq); 7313 pref_freq = 0; 7314 } 7315 7316 /* 7317 * Stop any find/listen operations before invitation and possibly 7318 * connection establishment. 7319 */ 7320 wpas_p2p_stop_find_oper(wpa_s); 7321 7322 return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid, 7323 ssid->ssid, ssid->ssid_len, force_freq, go_dev_addr, 7324 1, pref_freq, -1); 7325 } 7326 7327 7328 /* Invite to join an active group */ 7329 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname, 7330 const u8 *peer_addr, const u8 *go_dev_addr) 7331 { 7332 struct wpa_global *global = wpa_s->global; 7333 enum p2p_invite_role role; 7334 u8 *bssid = NULL; 7335 struct wpa_ssid *ssid; 7336 int persistent; 7337 int freq = 0, force_freq = 0, pref_freq = 0; 7338 int res; 7339 7340 wpa_s->p2p_persistent_go_freq = 0; 7341 wpa_s->p2p_go_ht40 = 0; 7342 wpa_s->p2p_go_vht = 0; 7343 7344 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 7345 if (os_strcmp(wpa_s->ifname, ifname) == 0) 7346 break; 7347 } 7348 if (wpa_s == NULL) { 7349 wpa_printf(MSG_DEBUG, "P2P: Interface '%s' not found", ifname); 7350 return -1; 7351 } 7352 7353 ssid = wpa_s->current_ssid; 7354 if (ssid == NULL) { 7355 wpa_printf(MSG_DEBUG, "P2P: No current SSID to use for " 7356 "invitation"); 7357 return -1; 7358 } 7359 7360 wpa_s->global->p2p_invite_group = wpa_s; 7361 persistent = ssid->p2p_persistent_group && 7362 wpas_p2p_get_persistent(wpa_s->parent, peer_addr, 7363 ssid->ssid, ssid->ssid_len); 7364 7365 if (ssid->mode == WPAS_MODE_P2P_GO) { 7366 role = P2P_INVITE_ROLE_ACTIVE_GO; 7367 bssid = wpa_s->own_addr; 7368 if (go_dev_addr == NULL) 7369 go_dev_addr = wpa_s->global->p2p_dev_addr; 7370 freq = ssid->frequency; 7371 } else { 7372 role = P2P_INVITE_ROLE_CLIENT; 7373 if (wpa_s->wpa_state < WPA_ASSOCIATED) { 7374 wpa_printf(MSG_DEBUG, "P2P: Not associated - cannot " 7375 "invite to current group"); 7376 return -1; 7377 } 7378 bssid = wpa_s->bssid; 7379 if (go_dev_addr == NULL && 7380 !is_zero_ether_addr(wpa_s->go_dev_addr)) 7381 go_dev_addr = wpa_s->go_dev_addr; 7382 freq = wpa_s->current_bss ? wpa_s->current_bss->freq : 7383 (int) wpa_s->assoc_freq; 7384 } 7385 wpa_s->parent->pending_invite_ssid_id = -1; 7386 7387 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7388 return -1; 7389 7390 res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq, 7391 role == P2P_INVITE_ROLE_ACTIVE_GO); 7392 if (res) 7393 return res; 7394 wpas_p2p_set_own_freq_preference(wpa_s, force_freq); 7395 7396 return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid, 7397 ssid->ssid, ssid->ssid_len, force_freq, 7398 go_dev_addr, persistent, pref_freq, -1); 7399 } 7400 7401 7402 void wpas_p2p_completed(struct wpa_supplicant *wpa_s) 7403 { 7404 struct wpa_ssid *ssid = wpa_s->current_ssid; 7405 u8 go_dev_addr[ETH_ALEN]; 7406 int network_id = -1; 7407 int persistent; 7408 int freq; 7409 u8 ip[3 * 4]; 7410 char ip_addr[100]; 7411 7412 if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION) { 7413 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 7414 wpa_s->parent, NULL); 7415 } 7416 7417 if (!wpa_s->show_group_started || !ssid) 7418 return; 7419 7420 wpa_s->show_group_started = 0; 7421 7422 os_memset(go_dev_addr, 0, ETH_ALEN); 7423 if (ssid->bssid_set) 7424 os_memcpy(go_dev_addr, ssid->bssid, ETH_ALEN); 7425 persistent = wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid, 7426 ssid->ssid_len); 7427 os_memcpy(wpa_s->go_dev_addr, go_dev_addr, ETH_ALEN); 7428 7429 if (wpa_s->global->p2p_group_formation == wpa_s) 7430 wpa_s->global->p2p_group_formation = NULL; 7431 7432 freq = wpa_s->current_bss ? wpa_s->current_bss->freq : 7433 (int) wpa_s->assoc_freq; 7434 7435 ip_addr[0] = '\0'; 7436 if (wpa_sm_get_p2p_ip_addr(wpa_s->wpa, ip) == 0) { 7437 int res; 7438 7439 res = os_snprintf(ip_addr, sizeof(ip_addr), 7440 " ip_addr=%u.%u.%u.%u " 7441 "ip_mask=%u.%u.%u.%u go_ip_addr=%u.%u.%u.%u", 7442 ip[0], ip[1], ip[2], ip[3], 7443 ip[4], ip[5], ip[6], ip[7], 7444 ip[8], ip[9], ip[10], ip[11]); 7445 if (os_snprintf_error(sizeof(ip_addr), res)) 7446 ip_addr[0] = '\0'; 7447 } 7448 7449 wpas_p2p_group_started(wpa_s, 0, ssid, freq, 7450 ssid->passphrase == NULL && ssid->psk_set ? 7451 ssid->psk : NULL, 7452 ssid->passphrase, go_dev_addr, persistent, 7453 ip_addr); 7454 7455 if (persistent) 7456 network_id = wpas_p2p_store_persistent_group(wpa_s->parent, 7457 ssid, go_dev_addr); 7458 if (network_id < 0) 7459 network_id = ssid->id; 7460 wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 1); 7461 } 7462 7463 7464 int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1, 7465 u32 interval1, u32 duration2, u32 interval2) 7466 { 7467 int ret; 7468 7469 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7470 return -1; 7471 7472 if (wpa_s->wpa_state < WPA_ASSOCIATED || 7473 wpa_s->current_ssid == NULL || 7474 wpa_s->current_ssid->mode != WPAS_MODE_INFRA) 7475 return -1; 7476 7477 ret = p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid, 7478 wpa_s->own_addr, wpa_s->assoc_freq, 7479 duration1, interval1, duration2, interval2); 7480 if (ret == 0) 7481 wpa_s->waiting_presence_resp = 1; 7482 7483 return ret; 7484 } 7485 7486 7487 int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period, 7488 unsigned int interval) 7489 { 7490 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7491 return -1; 7492 7493 return p2p_ext_listen(wpa_s->global->p2p, period, interval); 7494 } 7495 7496 7497 static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s) 7498 { 7499 if (wpa_s->current_ssid == NULL) { 7500 /* 7501 * current_ssid can be cleared when P2P client interface gets 7502 * disconnected, so assume this interface was used as P2P 7503 * client. 7504 */ 7505 return 1; 7506 } 7507 return wpa_s->current_ssid->p2p_group && 7508 wpa_s->current_ssid->mode == WPAS_MODE_INFRA; 7509 } 7510 7511 7512 static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx) 7513 { 7514 struct wpa_supplicant *wpa_s = eloop_ctx; 7515 7516 if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) { 7517 wpa_printf(MSG_DEBUG, "P2P: Ignore group idle timeout - " 7518 "disabled"); 7519 return; 7520 } 7521 7522 wpa_printf(MSG_DEBUG, "P2P: Group idle timeout reached - terminate " 7523 "group"); 7524 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_IDLE_TIMEOUT); 7525 } 7526 7527 7528 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s) 7529 { 7530 int timeout; 7531 7532 if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0) 7533 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout"); 7534 7535 if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group) 7536 return; 7537 7538 timeout = wpa_s->conf->p2p_group_idle; 7539 if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA && 7540 (timeout == 0 || timeout > P2P_MAX_CLIENT_IDLE)) 7541 timeout = P2P_MAX_CLIENT_IDLE; 7542 7543 if (timeout == 0) 7544 return; 7545 7546 if (timeout < 0) { 7547 if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA) 7548 timeout = 0; /* special client mode no-timeout */ 7549 else 7550 return; 7551 } 7552 7553 if (wpa_s->p2p_in_provisioning) { 7554 /* 7555 * Use the normal group formation timeout during the 7556 * provisioning phase to avoid terminating this process too 7557 * early due to group idle timeout. 7558 */ 7559 wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout " 7560 "during provisioning"); 7561 return; 7562 } 7563 7564 if (wpa_s->show_group_started) { 7565 /* 7566 * Use the normal group formation timeout between the end of 7567 * the provisioning phase and completion of 4-way handshake to 7568 * avoid terminating this process too early due to group idle 7569 * timeout. 7570 */ 7571 wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout " 7572 "while waiting for initial 4-way handshake to " 7573 "complete"); 7574 return; 7575 } 7576 7577 wpa_printf(MSG_DEBUG, "P2P: Set P2P group idle timeout to %u seconds", 7578 timeout); 7579 eloop_register_timeout(timeout, 0, wpas_p2p_group_idle_timeout, 7580 wpa_s, NULL); 7581 } 7582 7583 7584 /* Returns 1 if the interface was removed */ 7585 int wpas_p2p_deauth_notif(struct wpa_supplicant *wpa_s, const u8 *bssid, 7586 u16 reason_code, const u8 *ie, size_t ie_len, 7587 int locally_generated) 7588 { 7589 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7590 return 0; 7591 7592 if (!locally_generated) 7593 p2p_deauth_notif(wpa_s->global->p2p, bssid, reason_code, ie, 7594 ie_len); 7595 7596 if (reason_code == WLAN_REASON_DEAUTH_LEAVING && !locally_generated && 7597 wpa_s->current_ssid && 7598 wpa_s->current_ssid->p2p_group && 7599 wpa_s->current_ssid->mode == WPAS_MODE_INFRA) { 7600 wpa_printf(MSG_DEBUG, "P2P: GO indicated that the P2P Group " 7601 "session is ending"); 7602 if (wpas_p2p_group_delete(wpa_s, 7603 P2P_GROUP_REMOVAL_GO_ENDING_SESSION) 7604 > 0) 7605 return 1; 7606 } 7607 7608 return 0; 7609 } 7610 7611 7612 void wpas_p2p_disassoc_notif(struct wpa_supplicant *wpa_s, const u8 *bssid, 7613 u16 reason_code, const u8 *ie, size_t ie_len, 7614 int locally_generated) 7615 { 7616 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7617 return; 7618 7619 if (!locally_generated) 7620 p2p_disassoc_notif(wpa_s->global->p2p, bssid, reason_code, ie, 7621 ie_len); 7622 } 7623 7624 7625 void wpas_p2p_update_config(struct wpa_supplicant *wpa_s) 7626 { 7627 struct p2p_data *p2p = wpa_s->global->p2p; 7628 7629 if (p2p == NULL) 7630 return; 7631 7632 if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE)) 7633 return; 7634 7635 if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME) 7636 p2p_set_dev_name(p2p, wpa_s->conf->device_name); 7637 7638 if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE) 7639 p2p_set_pri_dev_type(p2p, wpa_s->conf->device_type); 7640 7641 if (wpa_s->wps && 7642 (wpa_s->conf->changed_parameters & CFG_CHANGED_CONFIG_METHODS)) 7643 p2p_set_config_methods(p2p, wpa_s->wps->config_methods); 7644 7645 if (wpa_s->wps && (wpa_s->conf->changed_parameters & CFG_CHANGED_UUID)) 7646 p2p_set_uuid(p2p, wpa_s->wps->uuid); 7647 7648 if (wpa_s->conf->changed_parameters & CFG_CHANGED_WPS_STRING) { 7649 p2p_set_manufacturer(p2p, wpa_s->conf->manufacturer); 7650 p2p_set_model_name(p2p, wpa_s->conf->model_name); 7651 p2p_set_model_number(p2p, wpa_s->conf->model_number); 7652 p2p_set_serial_number(p2p, wpa_s->conf->serial_number); 7653 } 7654 7655 if (wpa_s->conf->changed_parameters & CFG_CHANGED_SEC_DEVICE_TYPE) 7656 p2p_set_sec_dev_types(p2p, 7657 (void *) wpa_s->conf->sec_device_type, 7658 wpa_s->conf->num_sec_device_types); 7659 7660 if (wpa_s->conf->changed_parameters & CFG_CHANGED_VENDOR_EXTENSION) { 7661 int i; 7662 p2p_remove_wps_vendor_extensions(p2p); 7663 for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) { 7664 if (wpa_s->conf->wps_vendor_ext[i] == NULL) 7665 continue; 7666 p2p_add_wps_vendor_extension( 7667 p2p, wpa_s->conf->wps_vendor_ext[i]); 7668 } 7669 } 7670 7671 if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) && 7672 wpa_s->conf->country[0] && wpa_s->conf->country[1]) { 7673 char country[3]; 7674 country[0] = wpa_s->conf->country[0]; 7675 country[1] = wpa_s->conf->country[1]; 7676 country[2] = 0x04; 7677 p2p_set_country(p2p, country); 7678 } 7679 7680 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_SSID_POSTFIX) { 7681 p2p_set_ssid_postfix(p2p, (u8 *) wpa_s->conf->p2p_ssid_postfix, 7682 wpa_s->conf->p2p_ssid_postfix ? 7683 os_strlen(wpa_s->conf->p2p_ssid_postfix) : 7684 0); 7685 } 7686 7687 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_INTRA_BSS) 7688 p2p_set_intra_bss_dist(p2p, wpa_s->conf->p2p_intra_bss); 7689 7690 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_LISTEN_CHANNEL) { 7691 u8 reg_class, channel; 7692 int ret; 7693 unsigned int r; 7694 u8 channel_forced; 7695 7696 if (wpa_s->conf->p2p_listen_reg_class && 7697 wpa_s->conf->p2p_listen_channel) { 7698 reg_class = wpa_s->conf->p2p_listen_reg_class; 7699 channel = wpa_s->conf->p2p_listen_channel; 7700 channel_forced = 1; 7701 } else { 7702 reg_class = 81; 7703 /* 7704 * Pick one of the social channels randomly as the 7705 * listen channel. 7706 */ 7707 if (os_get_random((u8 *) &r, sizeof(r)) < 0) 7708 channel = 1; 7709 else 7710 channel = 1 + (r % 3) * 5; 7711 channel_forced = 0; 7712 } 7713 ret = p2p_set_listen_channel(p2p, reg_class, channel, 7714 channel_forced); 7715 if (ret) 7716 wpa_printf(MSG_ERROR, "P2P: Own listen channel update " 7717 "failed: %d", ret); 7718 } 7719 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_OPER_CHANNEL) { 7720 u8 op_reg_class, op_channel, cfg_op_channel; 7721 int ret = 0; 7722 unsigned int r; 7723 if (wpa_s->conf->p2p_oper_reg_class && 7724 wpa_s->conf->p2p_oper_channel) { 7725 op_reg_class = wpa_s->conf->p2p_oper_reg_class; 7726 op_channel = wpa_s->conf->p2p_oper_channel; 7727 cfg_op_channel = 1; 7728 } else { 7729 op_reg_class = 81; 7730 /* 7731 * Use random operation channel from (1, 6, 11) 7732 *if no other preference is indicated. 7733 */ 7734 if (os_get_random((u8 *) &r, sizeof(r)) < 0) 7735 op_channel = 1; 7736 else 7737 op_channel = 1 + (r % 3) * 5; 7738 cfg_op_channel = 0; 7739 } 7740 ret = p2p_set_oper_channel(p2p, op_reg_class, op_channel, 7741 cfg_op_channel); 7742 if (ret) 7743 wpa_printf(MSG_ERROR, "P2P: Own oper channel update " 7744 "failed: %d", ret); 7745 } 7746 7747 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PREF_CHAN) { 7748 if (p2p_set_pref_chan(p2p, wpa_s->conf->num_p2p_pref_chan, 7749 wpa_s->conf->p2p_pref_chan) < 0) { 7750 wpa_printf(MSG_ERROR, "P2P: Preferred channel list " 7751 "update failed"); 7752 } 7753 7754 if (p2p_set_no_go_freq(p2p, &wpa_s->conf->p2p_no_go_freq) < 0) { 7755 wpa_printf(MSG_ERROR, "P2P: No GO channel list " 7756 "update failed"); 7757 } 7758 } 7759 7760 if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PASSPHRASE_LEN) 7761 p2p_set_passphrase_len(p2p, wpa_s->conf->p2p_passphrase_len); 7762 } 7763 7764 7765 int wpas_p2p_set_noa(struct wpa_supplicant *wpa_s, u8 count, int start, 7766 int duration) 7767 { 7768 if (!wpa_s->ap_iface) 7769 return -1; 7770 return hostapd_p2p_set_noa(wpa_s->ap_iface->bss[0], count, start, 7771 duration); 7772 } 7773 7774 7775 int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled) 7776 { 7777 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 7778 return -1; 7779 7780 wpa_s->global->cross_connection = enabled; 7781 p2p_set_cross_connect(wpa_s->global->p2p, enabled); 7782 7783 if (!enabled) { 7784 struct wpa_supplicant *iface; 7785 7786 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) 7787 { 7788 if (iface->cross_connect_enabled == 0) 7789 continue; 7790 7791 iface->cross_connect_enabled = 0; 7792 iface->cross_connect_in_use = 0; 7793 wpa_msg_global(iface->parent, MSG_INFO, 7794 P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s", 7795 iface->ifname, 7796 iface->cross_connect_uplink); 7797 } 7798 } 7799 7800 return 0; 7801 } 7802 7803 7804 static void wpas_p2p_enable_cross_connect(struct wpa_supplicant *uplink) 7805 { 7806 struct wpa_supplicant *iface; 7807 7808 if (!uplink->global->cross_connection) 7809 return; 7810 7811 for (iface = uplink->global->ifaces; iface; iface = iface->next) { 7812 if (!iface->cross_connect_enabled) 7813 continue; 7814 if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) != 7815 0) 7816 continue; 7817 if (iface->ap_iface == NULL) 7818 continue; 7819 if (iface->cross_connect_in_use) 7820 continue; 7821 7822 iface->cross_connect_in_use = 1; 7823 wpa_msg_global(iface->parent, MSG_INFO, 7824 P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s", 7825 iface->ifname, iface->cross_connect_uplink); 7826 } 7827 } 7828 7829 7830 static void wpas_p2p_disable_cross_connect(struct wpa_supplicant *uplink) 7831 { 7832 struct wpa_supplicant *iface; 7833 7834 for (iface = uplink->global->ifaces; iface; iface = iface->next) { 7835 if (!iface->cross_connect_enabled) 7836 continue; 7837 if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) != 7838 0) 7839 continue; 7840 if (!iface->cross_connect_in_use) 7841 continue; 7842 7843 wpa_msg_global(iface->parent, MSG_INFO, 7844 P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s", 7845 iface->ifname, iface->cross_connect_uplink); 7846 iface->cross_connect_in_use = 0; 7847 } 7848 } 7849 7850 7851 void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s) 7852 { 7853 if (wpa_s->ap_iface || wpa_s->current_ssid == NULL || 7854 wpa_s->current_ssid->mode != WPAS_MODE_INFRA || 7855 wpa_s->cross_connect_disallowed) 7856 wpas_p2p_disable_cross_connect(wpa_s); 7857 else 7858 wpas_p2p_enable_cross_connect(wpa_s); 7859 if (!wpa_s->ap_iface && 7860 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0) 7861 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout"); 7862 } 7863 7864 7865 void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s) 7866 { 7867 wpas_p2p_disable_cross_connect(wpa_s); 7868 if (!wpa_s->ap_iface && 7869 !eloop_is_timeout_registered(wpas_p2p_group_idle_timeout, 7870 wpa_s, NULL)) 7871 wpas_p2p_set_group_idle_timeout(wpa_s); 7872 } 7873 7874 7875 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s) 7876 { 7877 struct wpa_supplicant *iface; 7878 7879 if (!wpa_s->global->cross_connection) 7880 return; 7881 7882 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) { 7883 if (iface == wpa_s) 7884 continue; 7885 if (iface->drv_flags & 7886 WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE) 7887 continue; 7888 if ((iface->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) && 7889 iface != wpa_s->parent) 7890 continue; 7891 7892 wpa_s->cross_connect_enabled = 1; 7893 os_strlcpy(wpa_s->cross_connect_uplink, iface->ifname, 7894 sizeof(wpa_s->cross_connect_uplink)); 7895 wpa_printf(MSG_DEBUG, "P2P: Enable cross connection from " 7896 "%s to %s whenever uplink is available", 7897 wpa_s->ifname, wpa_s->cross_connect_uplink); 7898 7899 if (iface->ap_iface || iface->current_ssid == NULL || 7900 iface->current_ssid->mode != WPAS_MODE_INFRA || 7901 iface->cross_connect_disallowed || 7902 iface->wpa_state != WPA_COMPLETED) 7903 break; 7904 7905 wpa_s->cross_connect_in_use = 1; 7906 wpa_msg_global(wpa_s->parent, MSG_INFO, 7907 P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s", 7908 wpa_s->ifname, wpa_s->cross_connect_uplink); 7909 break; 7910 } 7911 } 7912 7913 7914 int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s) 7915 { 7916 if (wpa_s->p2p_group_interface != P2P_GROUP_INTERFACE_CLIENT && 7917 !wpa_s->p2p_in_provisioning) 7918 return 0; /* not P2P client operation */ 7919 7920 wpa_printf(MSG_DEBUG, "P2P: Terminate connection due to WPS PBC " 7921 "session overlap"); 7922 if (wpa_s != wpa_s->parent) 7923 wpa_msg_ctrl(wpa_s->parent, MSG_INFO, WPS_EVENT_OVERLAP); 7924 wpas_p2p_group_formation_failed(wpa_s); 7925 return 1; 7926 } 7927 7928 7929 void wpas_p2p_pbc_overlap_cb(void *eloop_ctx, void *timeout_ctx) 7930 { 7931 struct wpa_supplicant *wpa_s = eloop_ctx; 7932 wpas_p2p_notif_pbc_overlap(wpa_s); 7933 } 7934 7935 7936 void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s) 7937 { 7938 struct p2p_channels chan, cli_chan; 7939 struct wpa_supplicant *ifs; 7940 7941 if (wpa_s->global == NULL || wpa_s->global->p2p == NULL) 7942 return; 7943 7944 os_memset(&chan, 0, sizeof(chan)); 7945 os_memset(&cli_chan, 0, sizeof(cli_chan)); 7946 if (wpas_p2p_setup_channels(wpa_s, &chan, &cli_chan)) { 7947 wpa_printf(MSG_ERROR, "P2P: Failed to update supported " 7948 "channel list"); 7949 return; 7950 } 7951 7952 p2p_update_channel_list(wpa_s->global->p2p, &chan, &cli_chan); 7953 7954 for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) { 7955 int freq; 7956 if (!ifs->current_ssid || 7957 !ifs->current_ssid->p2p_group || 7958 (ifs->current_ssid->mode != WPAS_MODE_P2P_GO && 7959 ifs->current_ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION)) 7960 continue; 7961 freq = ifs->current_ssid->frequency; 7962 if (freq_included(&chan, freq)) { 7963 wpa_dbg(ifs, MSG_DEBUG, 7964 "P2P GO operating frequency %d MHz in valid range", 7965 freq); 7966 continue; 7967 } 7968 7969 wpa_dbg(ifs, MSG_DEBUG, 7970 "P2P GO operating in invalid frequency %d MHz", freq); 7971 /* TODO: Consider using CSA or removing the group within 7972 * wpa_supplicant */ 7973 wpa_msg(ifs, MSG_INFO, P2P_EVENT_REMOVE_AND_REFORM_GROUP); 7974 } 7975 } 7976 7977 7978 static void wpas_p2p_scan_res_ignore(struct wpa_supplicant *wpa_s, 7979 struct wpa_scan_results *scan_res) 7980 { 7981 wpa_printf(MSG_DEBUG, "P2P: Ignore scan results"); 7982 } 7983 7984 7985 int wpas_p2p_cancel(struct wpa_supplicant *wpa_s) 7986 { 7987 struct wpa_global *global = wpa_s->global; 7988 int found = 0; 7989 const u8 *peer; 7990 7991 if (global->p2p == NULL) 7992 return -1; 7993 7994 wpa_printf(MSG_DEBUG, "P2P: Request to cancel group formation"); 7995 7996 if (wpa_s->pending_interface_name[0] && 7997 !is_zero_ether_addr(wpa_s->pending_interface_addr)) 7998 found = 1; 7999 8000 peer = p2p_get_go_neg_peer(global->p2p); 8001 if (peer) { 8002 wpa_printf(MSG_DEBUG, "P2P: Unauthorize pending GO Neg peer " 8003 MACSTR, MAC2STR(peer)); 8004 p2p_unauthorize(global->p2p, peer); 8005 found = 1; 8006 } 8007 8008 if (wpa_s->scan_res_handler == wpas_p2p_scan_res_join) { 8009 wpa_printf(MSG_DEBUG, "P2P: Stop pending scan for join"); 8010 wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore; 8011 found = 1; 8012 } 8013 8014 if (wpa_s->pending_pd_before_join) { 8015 wpa_printf(MSG_DEBUG, "P2P: Stop pending PD before join"); 8016 wpa_s->pending_pd_before_join = 0; 8017 found = 1; 8018 } 8019 8020 wpas_p2p_stop_find(wpa_s); 8021 8022 for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) { 8023 if (wpa_s == global->p2p_group_formation && 8024 (wpa_s->p2p_in_provisioning || 8025 wpa_s->parent->pending_interface_type == 8026 WPA_IF_P2P_CLIENT)) { 8027 wpa_printf(MSG_DEBUG, "P2P: Interface %s in group " 8028 "formation found - cancelling", 8029 wpa_s->ifname); 8030 found = 1; 8031 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 8032 wpa_s->parent, NULL); 8033 if (wpa_s->p2p_in_provisioning) { 8034 wpas_group_formation_completed(wpa_s, 0); 8035 break; 8036 } 8037 wpas_p2p_group_delete(wpa_s, 8038 P2P_GROUP_REMOVAL_REQUESTED); 8039 break; 8040 } else if (wpa_s->p2p_in_invitation) { 8041 wpa_printf(MSG_DEBUG, "P2P: Interface %s in invitation found - cancelling", 8042 wpa_s->ifname); 8043 found = 1; 8044 wpas_p2p_group_formation_failed(wpa_s); 8045 } 8046 } 8047 8048 if (!found) { 8049 wpa_printf(MSG_DEBUG, "P2P: No ongoing group formation found"); 8050 return -1; 8051 } 8052 8053 return 0; 8054 } 8055 8056 8057 void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s) 8058 { 8059 if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group) 8060 return; 8061 8062 wpa_printf(MSG_DEBUG, "P2P: Remove group due to driver resource not " 8063 "being available anymore"); 8064 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_UNAVAILABLE); 8065 } 8066 8067 8068 void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s, 8069 int freq_24, int freq_5, int freq_overall) 8070 { 8071 struct p2p_data *p2p = wpa_s->global->p2p; 8072 if (p2p == NULL) 8073 return; 8074 p2p_set_best_channels(p2p, freq_24, freq_5, freq_overall); 8075 } 8076 8077 8078 int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr) 8079 { 8080 u8 peer[ETH_ALEN]; 8081 struct p2p_data *p2p = wpa_s->global->p2p; 8082 8083 if (p2p == NULL) 8084 return -1; 8085 8086 if (hwaddr_aton(addr, peer)) 8087 return -1; 8088 8089 return p2p_unauthorize(p2p, peer); 8090 } 8091 8092 8093 /** 8094 * wpas_p2p_disconnect - Disconnect from a P2P Group 8095 * @wpa_s: Pointer to wpa_supplicant data 8096 * Returns: 0 on success, -1 on failure 8097 * 8098 * This can be used to disconnect from a group in which the local end is a P2P 8099 * Client or to end a P2P Group in case the local end is the Group Owner. If a 8100 * virtual network interface was created for this group, that interface will be 8101 * removed. Otherwise, only the configured P2P group network will be removed 8102 * from the interface. 8103 */ 8104 int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s) 8105 { 8106 8107 if (wpa_s == NULL) 8108 return -1; 8109 8110 return wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_REQUESTED) < 0 ? 8111 -1 : 0; 8112 } 8113 8114 8115 int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s) 8116 { 8117 int ret; 8118 8119 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 8120 return 0; 8121 8122 ret = p2p_in_progress(wpa_s->global->p2p); 8123 if (ret == 0) { 8124 /* 8125 * Check whether there is an ongoing WPS provisioning step (or 8126 * other parts of group formation) on another interface since 8127 * p2p_in_progress() does not report this to avoid issues for 8128 * scans during such provisioning step. 8129 */ 8130 if (wpa_s->global->p2p_group_formation && 8131 wpa_s->global->p2p_group_formation != wpa_s) { 8132 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Another interface (%s) " 8133 "in group formation", 8134 wpa_s->global->p2p_group_formation->ifname); 8135 ret = 1; 8136 } 8137 } 8138 8139 if (!ret && wpa_s->global->p2p_go_wait_client.sec) { 8140 struct os_reltime now; 8141 os_get_reltime(&now); 8142 if (os_reltime_expired(&now, &wpa_s->global->p2p_go_wait_client, 8143 P2P_MAX_INITIAL_CONN_WAIT_GO)) { 8144 /* Wait for the first client has expired */ 8145 wpa_s->global->p2p_go_wait_client.sec = 0; 8146 } else { 8147 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Waiting for initial client connection during group formation"); 8148 ret = 1; 8149 } 8150 } 8151 8152 return ret; 8153 } 8154 8155 8156 void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s, 8157 struct wpa_ssid *ssid) 8158 { 8159 if (wpa_s->p2p_in_provisioning && ssid->p2p_group && 8160 eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 8161 wpa_s->parent, NULL) > 0) { 8162 /** 8163 * Remove the network by scheduling the group formation 8164 * timeout to happen immediately. The teardown code 8165 * needs to be scheduled to run asynch later so that we 8166 * don't delete data from under ourselves unexpectedly. 8167 * Calling wpas_p2p_group_formation_timeout directly 8168 * causes a series of crashes in WPS failure scenarios. 8169 */ 8170 wpa_printf(MSG_DEBUG, "P2P: Canceled group formation due to " 8171 "P2P group network getting removed"); 8172 eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout, 8173 wpa_s->parent, NULL); 8174 } 8175 } 8176 8177 8178 struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s, 8179 const u8 *addr, const u8 *ssid, 8180 size_t ssid_len) 8181 { 8182 struct wpa_ssid *s; 8183 size_t i; 8184 8185 for (s = wpa_s->conf->ssid; s; s = s->next) { 8186 if (s->disabled != 2) 8187 continue; 8188 if (ssid && 8189 (ssid_len != s->ssid_len || 8190 os_memcmp(ssid, s->ssid, ssid_len) != 0)) 8191 continue; 8192 if (addr == NULL) { 8193 if (s->mode == WPAS_MODE_P2P_GO) 8194 return s; 8195 continue; 8196 } 8197 if (os_memcmp(s->bssid, addr, ETH_ALEN) == 0) 8198 return s; /* peer is GO in the persistent group */ 8199 if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL) 8200 continue; 8201 for (i = 0; i < s->num_p2p_clients; i++) { 8202 if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN, 8203 addr, ETH_ALEN) == 0) 8204 return s; /* peer is P2P client in persistent 8205 * group */ 8206 } 8207 } 8208 8209 return NULL; 8210 } 8211 8212 8213 void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s, 8214 const u8 *addr) 8215 { 8216 if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout, 8217 wpa_s->parent, NULL) > 0) { 8218 /* 8219 * This can happen if WPS provisioning step is not terminated 8220 * cleanly (e.g., P2P Client does not send WSC_Done). Since the 8221 * peer was able to connect, there is no need to time out group 8222 * formation after this, though. In addition, this is used with 8223 * the initial connection wait on the GO as a separate formation 8224 * timeout and as such, expected to be hit after the initial WPS 8225 * provisioning step. 8226 */ 8227 wpa_printf(MSG_DEBUG, "P2P: Canceled P2P group formation timeout on data connection"); 8228 8229 if (!wpa_s->p2p_go_group_formation_completed && 8230 !wpa_s->group_formation_reported) { 8231 /* 8232 * GO has not yet notified group formation success since 8233 * the WPS step was not completed cleanly. Do that 8234 * notification now since the P2P Client was able to 8235 * connect and as such, must have received the 8236 * credential from the WPS step. 8237 */ 8238 if (wpa_s->global->p2p) 8239 p2p_wps_success_cb(wpa_s->global->p2p, addr); 8240 wpas_group_formation_completed(wpa_s, 1); 8241 } 8242 } 8243 if (!wpa_s->p2p_go_group_formation_completed) { 8244 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Marking group formation completed on GO on first data connection"); 8245 wpa_s->p2p_go_group_formation_completed = 1; 8246 wpa_s->global->p2p_group_formation = NULL; 8247 wpa_s->p2p_in_provisioning = 0; 8248 wpa_s->p2p_in_invitation = 0; 8249 } 8250 wpa_s->global->p2p_go_wait_client.sec = 0; 8251 if (addr == NULL) 8252 return; 8253 wpas_p2p_add_persistent_group_client(wpa_s, addr); 8254 } 8255 8256 8257 static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s, 8258 int group_added) 8259 { 8260 struct wpa_supplicant *group = wpa_s; 8261 int ret = 0; 8262 8263 if (wpa_s->global->p2p_group_formation) 8264 group = wpa_s->global->p2p_group_formation; 8265 wpa_s = wpa_s->parent; 8266 offchannel_send_action_done(wpa_s); 8267 if (group_added) 8268 ret = wpas_p2p_group_delete(group, P2P_GROUP_REMOVAL_SILENT); 8269 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Fall back to GO Negotiation"); 8270 wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, wpa_s->p2p_pin, 8271 wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0, 8272 0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq, 8273 wpa_s->p2p_persistent_id, 8274 wpa_s->p2p_pd_before_go_neg, 8275 wpa_s->p2p_go_ht40, 8276 wpa_s->p2p_go_vht); 8277 return ret; 8278 } 8279 8280 8281 int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s) 8282 { 8283 int res; 8284 8285 if (!wpa_s->p2p_fallback_to_go_neg || 8286 wpa_s->p2p_in_provisioning <= 5) 8287 return 0; 8288 8289 if (wpas_p2p_peer_go(wpa_s, wpa_s->pending_join_dev_addr) > 0) 8290 return 0; /* peer operating as a GO */ 8291 8292 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: GO not found for p2p_connect-auto - " 8293 "fallback to GO Negotiation"); 8294 wpa_msg_global(wpa_s->parent, MSG_INFO, P2P_EVENT_FALLBACK_TO_GO_NEG 8295 "reason=GO-not-found"); 8296 res = wpas_p2p_fallback_to_go_neg(wpa_s, 1); 8297 8298 return res == 1 ? 2 : 1; 8299 } 8300 8301 8302 unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s) 8303 { 8304 struct wpa_supplicant *ifs; 8305 8306 if (wpa_s->wpa_state > WPA_SCANNING) { 8307 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to " 8308 "concurrent operation", 8309 wpa_s->conf->p2p_search_delay); 8310 return wpa_s->conf->p2p_search_delay; 8311 } 8312 8313 dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant, 8314 radio_list) { 8315 if (ifs != wpa_s && ifs->wpa_state > WPA_SCANNING) { 8316 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search " 8317 "delay due to concurrent operation on " 8318 "interface %s", 8319 wpa_s->conf->p2p_search_delay, 8320 ifs->ifname); 8321 return wpa_s->conf->p2p_search_delay; 8322 } 8323 } 8324 8325 return 0; 8326 } 8327 8328 8329 static int wpas_p2p_remove_psk_entry(struct wpa_supplicant *wpa_s, 8330 struct wpa_ssid *s, const u8 *addr, 8331 int iface_addr) 8332 { 8333 struct psk_list_entry *psk, *tmp; 8334 int changed = 0; 8335 8336 dl_list_for_each_safe(psk, tmp, &s->psk_list, struct psk_list_entry, 8337 list) { 8338 if ((iface_addr && !psk->p2p && 8339 os_memcmp(addr, psk->addr, ETH_ALEN) == 0) || 8340 (!iface_addr && psk->p2p && 8341 os_memcmp(addr, psk->addr, ETH_ALEN) == 0)) { 8342 wpa_dbg(wpa_s, MSG_DEBUG, 8343 "P2P: Remove persistent group PSK list entry for " 8344 MACSTR " p2p=%u", 8345 MAC2STR(psk->addr), psk->p2p); 8346 dl_list_del(&psk->list); 8347 os_free(psk); 8348 changed++; 8349 } 8350 } 8351 8352 return changed; 8353 } 8354 8355 8356 void wpas_p2p_new_psk_cb(struct wpa_supplicant *wpa_s, const u8 *mac_addr, 8357 const u8 *p2p_dev_addr, 8358 const u8 *psk, size_t psk_len) 8359 { 8360 struct wpa_ssid *ssid = wpa_s->current_ssid; 8361 struct wpa_ssid *persistent; 8362 struct psk_list_entry *p, *last; 8363 8364 if (psk_len != sizeof(p->psk)) 8365 return; 8366 8367 if (p2p_dev_addr) { 8368 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR 8369 " p2p_dev_addr=" MACSTR, 8370 MAC2STR(mac_addr), MAC2STR(p2p_dev_addr)); 8371 if (is_zero_ether_addr(p2p_dev_addr)) 8372 p2p_dev_addr = NULL; 8373 } else { 8374 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR, 8375 MAC2STR(mac_addr)); 8376 } 8377 8378 if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) { 8379 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: new_psk_cb during group formation"); 8380 /* To be added to persistent group once created */ 8381 if (wpa_s->global->add_psk == NULL) { 8382 wpa_s->global->add_psk = os_zalloc(sizeof(*p)); 8383 if (wpa_s->global->add_psk == NULL) 8384 return; 8385 } 8386 p = wpa_s->global->add_psk; 8387 if (p2p_dev_addr) { 8388 p->p2p = 1; 8389 os_memcpy(p->addr, p2p_dev_addr, ETH_ALEN); 8390 } else { 8391 p->p2p = 0; 8392 os_memcpy(p->addr, mac_addr, ETH_ALEN); 8393 } 8394 os_memcpy(p->psk, psk, psk_len); 8395 return; 8396 } 8397 8398 if (ssid->mode != WPAS_MODE_P2P_GO || !ssid->p2p_persistent_group) { 8399 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Ignore new_psk_cb on not-persistent GO"); 8400 return; 8401 } 8402 8403 persistent = wpas_p2p_get_persistent(wpa_s->parent, NULL, ssid->ssid, 8404 ssid->ssid_len); 8405 if (!persistent) { 8406 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not find persistent group information to store the new PSK"); 8407 return; 8408 } 8409 8410 p = os_zalloc(sizeof(*p)); 8411 if (p == NULL) 8412 return; 8413 if (p2p_dev_addr) { 8414 p->p2p = 1; 8415 os_memcpy(p->addr, p2p_dev_addr, ETH_ALEN); 8416 } else { 8417 p->p2p = 0; 8418 os_memcpy(p->addr, mac_addr, ETH_ALEN); 8419 } 8420 os_memcpy(p->psk, psk, psk_len); 8421 8422 if (dl_list_len(&persistent->psk_list) > P2P_MAX_STORED_CLIENTS && 8423 (last = dl_list_last(&persistent->psk_list, 8424 struct psk_list_entry, list))) { 8425 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove oldest PSK entry for " 8426 MACSTR " (p2p=%u) to make room for a new one", 8427 MAC2STR(last->addr), last->p2p); 8428 dl_list_del(&last->list); 8429 os_free(last); 8430 } 8431 8432 wpas_p2p_remove_psk_entry(wpa_s->parent, persistent, 8433 p2p_dev_addr ? p2p_dev_addr : mac_addr, 8434 p2p_dev_addr == NULL); 8435 if (p2p_dev_addr) { 8436 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for p2p_dev_addr=" 8437 MACSTR, MAC2STR(p2p_dev_addr)); 8438 } else { 8439 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for addr=" MACSTR, 8440 MAC2STR(mac_addr)); 8441 } 8442 dl_list_add(&persistent->psk_list, &p->list); 8443 8444 if (wpa_s->parent->conf->update_config && 8445 wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf)) 8446 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration"); 8447 } 8448 8449 8450 static void wpas_p2p_remove_psk(struct wpa_supplicant *wpa_s, 8451 struct wpa_ssid *s, const u8 *addr, 8452 int iface_addr) 8453 { 8454 int res; 8455 8456 res = wpas_p2p_remove_psk_entry(wpa_s, s, addr, iface_addr); 8457 if (res > 0 && wpa_s->conf->update_config && 8458 wpa_config_write(wpa_s->confname, wpa_s->conf)) 8459 wpa_dbg(wpa_s, MSG_DEBUG, 8460 "P2P: Failed to update configuration"); 8461 } 8462 8463 8464 static void wpas_p2p_remove_client_go(struct wpa_supplicant *wpa_s, 8465 const u8 *peer, int iface_addr) 8466 { 8467 struct hostapd_data *hapd; 8468 struct hostapd_wpa_psk *psk, *prev, *rem; 8469 struct sta_info *sta; 8470 8471 if (wpa_s->ap_iface == NULL || wpa_s->current_ssid == NULL || 8472 wpa_s->current_ssid->mode != WPAS_MODE_P2P_GO) 8473 return; 8474 8475 /* Remove per-station PSK entry */ 8476 hapd = wpa_s->ap_iface->bss[0]; 8477 prev = NULL; 8478 psk = hapd->conf->ssid.wpa_psk; 8479 while (psk) { 8480 if ((iface_addr && os_memcmp(peer, psk->addr, ETH_ALEN) == 0) || 8481 (!iface_addr && 8482 os_memcmp(peer, psk->p2p_dev_addr, ETH_ALEN) == 0)) { 8483 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove operating group PSK entry for " 8484 MACSTR " iface_addr=%d", 8485 MAC2STR(peer), iface_addr); 8486 if (prev) 8487 prev->next = psk->next; 8488 else 8489 hapd->conf->ssid.wpa_psk = psk->next; 8490 rem = psk; 8491 psk = psk->next; 8492 os_free(rem); 8493 } else { 8494 prev = psk; 8495 psk = psk->next; 8496 } 8497 } 8498 8499 /* Disconnect from group */ 8500 if (iface_addr) 8501 sta = ap_get_sta(hapd, peer); 8502 else 8503 sta = ap_get_sta_p2p(hapd, peer); 8504 if (sta) { 8505 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disconnect peer " MACSTR 8506 " (iface_addr=%d) from group", 8507 MAC2STR(peer), iface_addr); 8508 hostapd_drv_sta_deauth(hapd, sta->addr, 8509 WLAN_REASON_DEAUTH_LEAVING); 8510 ap_sta_deauthenticate(hapd, sta, WLAN_REASON_DEAUTH_LEAVING); 8511 } 8512 } 8513 8514 8515 void wpas_p2p_remove_client(struct wpa_supplicant *wpa_s, const u8 *peer, 8516 int iface_addr) 8517 { 8518 struct wpa_ssid *s; 8519 struct wpa_supplicant *w; 8520 8521 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove client " MACSTR, MAC2STR(peer)); 8522 8523 /* Remove from any persistent group */ 8524 for (s = wpa_s->parent->conf->ssid; s; s = s->next) { 8525 if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO) 8526 continue; 8527 if (!iface_addr) 8528 wpas_remove_persistent_peer(wpa_s, s, peer, 0); 8529 wpas_p2p_remove_psk(wpa_s->parent, s, peer, iface_addr); 8530 } 8531 8532 /* Remove from any operating group */ 8533 for (w = wpa_s->global->ifaces; w; w = w->next) 8534 wpas_p2p_remove_client_go(w, peer, iface_addr); 8535 } 8536 8537 8538 static void wpas_p2p_psk_failure_removal(void *eloop_ctx, void *timeout_ctx) 8539 { 8540 struct wpa_supplicant *wpa_s = eloop_ctx; 8541 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_PSK_FAILURE); 8542 } 8543 8544 8545 static void wpas_p2p_group_freq_conflict(void *eloop_ctx, void *timeout_ctx) 8546 { 8547 struct wpa_supplicant *wpa_s = eloop_ctx; 8548 8549 wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - terminate group"); 8550 wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_FREQ_CONFLICT); 8551 } 8552 8553 8554 int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq, 8555 struct wpa_ssid *ssid) 8556 { 8557 struct wpa_supplicant *iface; 8558 8559 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) { 8560 if (!iface->current_ssid || 8561 iface->current_ssid->frequency == freq || 8562 (iface->p2p_group_interface == NOT_P2P_GROUP_INTERFACE && 8563 !iface->current_ssid->p2p_group)) 8564 continue; 8565 8566 /* Remove the connection with least priority */ 8567 if (!wpas_is_p2p_prioritized(iface)) { 8568 /* STA connection has priority over existing 8569 * P2P connection, so remove the interface. */ 8570 wpa_printf(MSG_DEBUG, "P2P: Removing P2P connection due to single channel concurrent mode frequency conflict"); 8571 eloop_register_timeout(0, 0, 8572 wpas_p2p_group_freq_conflict, 8573 iface, NULL); 8574 /* If connection in progress is P2P connection, do not 8575 * proceed for the connection. */ 8576 if (wpa_s == iface) 8577 return -1; 8578 else 8579 return 0; 8580 } else { 8581 /* P2P connection has priority, disable the STA network 8582 */ 8583 wpa_supplicant_disable_network(wpa_s->global->ifaces, 8584 ssid); 8585 wpa_msg(wpa_s->global->ifaces, MSG_INFO, 8586 WPA_EVENT_FREQ_CONFLICT " id=%d", ssid->id); 8587 os_memset(wpa_s->global->ifaces->pending_bssid, 0, 8588 ETH_ALEN); 8589 /* If P2P connection is in progress, continue 8590 * connecting...*/ 8591 if (wpa_s == iface) 8592 return 0; 8593 else 8594 return -1; 8595 } 8596 } 8597 8598 return 0; 8599 } 8600 8601 8602 int wpas_p2p_4way_hs_failed(struct wpa_supplicant *wpa_s) 8603 { 8604 struct wpa_ssid *ssid = wpa_s->current_ssid; 8605 8606 if (ssid == NULL || !ssid->p2p_group) 8607 return 0; 8608 8609 if (wpa_s->p2p_last_4way_hs_fail && 8610 wpa_s->p2p_last_4way_hs_fail == ssid) { 8611 u8 go_dev_addr[ETH_ALEN]; 8612 struct wpa_ssid *persistent; 8613 8614 if (wpas_p2p_persistent_group(wpa_s, go_dev_addr, 8615 ssid->ssid, 8616 ssid->ssid_len) <= 0) { 8617 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not determine whether 4-way handshake failures were for a persistent group"); 8618 goto disconnect; 8619 } 8620 8621 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Two 4-way handshake failures for a P2P group - go_dev_addr=" 8622 MACSTR, MAC2STR(go_dev_addr)); 8623 persistent = wpas_p2p_get_persistent(wpa_s->parent, go_dev_addr, 8624 ssid->ssid, 8625 ssid->ssid_len); 8626 if (persistent == NULL || persistent->mode != WPAS_MODE_INFRA) { 8627 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No matching persistent group stored"); 8628 goto disconnect; 8629 } 8630 wpa_msg_global(wpa_s->parent, MSG_INFO, 8631 P2P_EVENT_PERSISTENT_PSK_FAIL "%d", 8632 persistent->id); 8633 disconnect: 8634 wpa_s->p2p_last_4way_hs_fail = NULL; 8635 /* 8636 * Remove the group from a timeout to avoid issues with caller 8637 * continuing to use the interface if this is on a P2P group 8638 * interface. 8639 */ 8640 eloop_register_timeout(0, 0, wpas_p2p_psk_failure_removal, 8641 wpa_s, NULL); 8642 return 1; 8643 } 8644 8645 wpa_s->p2p_last_4way_hs_fail = ssid; 8646 return 0; 8647 } 8648 8649 8650 #ifdef CONFIG_WPS_NFC 8651 8652 static struct wpabuf * wpas_p2p_nfc_handover(int ndef, struct wpabuf *wsc, 8653 struct wpabuf *p2p) 8654 { 8655 struct wpabuf *ret; 8656 size_t wsc_len; 8657 8658 if (p2p == NULL) { 8659 wpabuf_free(wsc); 8660 wpa_printf(MSG_DEBUG, "P2P: No p2p buffer for handover"); 8661 return NULL; 8662 } 8663 8664 wsc_len = wsc ? wpabuf_len(wsc) : 0; 8665 ret = wpabuf_alloc(2 + wsc_len + 2 + wpabuf_len(p2p)); 8666 if (ret == NULL) { 8667 wpabuf_free(wsc); 8668 wpabuf_free(p2p); 8669 return NULL; 8670 } 8671 8672 wpabuf_put_be16(ret, wsc_len); 8673 if (wsc) 8674 wpabuf_put_buf(ret, wsc); 8675 wpabuf_put_be16(ret, wpabuf_len(p2p)); 8676 wpabuf_put_buf(ret, p2p); 8677 8678 wpabuf_free(wsc); 8679 wpabuf_free(p2p); 8680 wpa_hexdump_buf(MSG_DEBUG, 8681 "P2P: Generated NFC connection handover message", ret); 8682 8683 if (ndef && ret) { 8684 struct wpabuf *tmp; 8685 tmp = ndef_build_p2p(ret); 8686 wpabuf_free(ret); 8687 if (tmp == NULL) { 8688 wpa_printf(MSG_DEBUG, "P2P: Failed to NDEF encapsulate handover request"); 8689 return NULL; 8690 } 8691 ret = tmp; 8692 } 8693 8694 return ret; 8695 } 8696 8697 8698 static int wpas_p2p_cli_freq(struct wpa_supplicant *wpa_s, 8699 struct wpa_ssid **ssid, u8 *go_dev_addr) 8700 { 8701 struct wpa_supplicant *iface; 8702 8703 if (go_dev_addr) 8704 os_memset(go_dev_addr, 0, ETH_ALEN); 8705 if (ssid) 8706 *ssid = NULL; 8707 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) { 8708 if (iface->wpa_state < WPA_ASSOCIATING || 8709 iface->current_ssid == NULL || iface->assoc_freq == 0 || 8710 !iface->current_ssid->p2p_group || 8711 iface->current_ssid->mode != WPAS_MODE_INFRA) 8712 continue; 8713 if (ssid) 8714 *ssid = iface->current_ssid; 8715 if (go_dev_addr) 8716 os_memcpy(go_dev_addr, iface->go_dev_addr, ETH_ALEN); 8717 return iface->assoc_freq; 8718 } 8719 return 0; 8720 } 8721 8722 8723 struct wpabuf * wpas_p2p_nfc_handover_req(struct wpa_supplicant *wpa_s, 8724 int ndef) 8725 { 8726 struct wpabuf *wsc, *p2p; 8727 struct wpa_ssid *ssid; 8728 u8 go_dev_addr[ETH_ALEN]; 8729 int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr); 8730 8731 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) { 8732 wpa_printf(MSG_DEBUG, "P2P: P2P disabled - cannot build handover request"); 8733 return NULL; 8734 } 8735 8736 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL && 8737 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey, 8738 &wpa_s->conf->wps_nfc_dh_privkey) < 0) { 8739 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No DH key available for handover request"); 8740 return NULL; 8741 } 8742 8743 if (cli_freq == 0) { 8744 wsc = wps_build_nfc_handover_req_p2p( 8745 wpa_s->parent->wps, wpa_s->conf->wps_nfc_dh_pubkey); 8746 } else 8747 wsc = NULL; 8748 p2p = p2p_build_nfc_handover_req(wpa_s->global->p2p, cli_freq, 8749 go_dev_addr, ssid ? ssid->ssid : NULL, 8750 ssid ? ssid->ssid_len : 0); 8751 8752 return wpas_p2p_nfc_handover(ndef, wsc, p2p); 8753 } 8754 8755 8756 struct wpabuf * wpas_p2p_nfc_handover_sel(struct wpa_supplicant *wpa_s, 8757 int ndef, int tag) 8758 { 8759 struct wpabuf *wsc, *p2p; 8760 struct wpa_ssid *ssid; 8761 u8 go_dev_addr[ETH_ALEN]; 8762 int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr); 8763 8764 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 8765 return NULL; 8766 8767 if (!tag && wpa_s->conf->wps_nfc_dh_pubkey == NULL && 8768 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey, 8769 &wpa_s->conf->wps_nfc_dh_privkey) < 0) 8770 return NULL; 8771 8772 if (cli_freq == 0) { 8773 wsc = wps_build_nfc_handover_sel_p2p( 8774 wpa_s->parent->wps, 8775 tag ? wpa_s->conf->wps_nfc_dev_pw_id : 8776 DEV_PW_NFC_CONNECTION_HANDOVER, 8777 wpa_s->conf->wps_nfc_dh_pubkey, 8778 tag ? wpa_s->conf->wps_nfc_dev_pw : NULL); 8779 } else 8780 wsc = NULL; 8781 p2p = p2p_build_nfc_handover_sel(wpa_s->global->p2p, cli_freq, 8782 go_dev_addr, ssid ? ssid->ssid : NULL, 8783 ssid ? ssid->ssid_len : 0); 8784 8785 return wpas_p2p_nfc_handover(ndef, wsc, p2p); 8786 } 8787 8788 8789 static int wpas_p2p_nfc_join_group(struct wpa_supplicant *wpa_s, 8790 struct p2p_nfc_params *params) 8791 { 8792 wpa_printf(MSG_DEBUG, "P2P: Initiate join-group based on NFC " 8793 "connection handover (freq=%d)", 8794 params->go_freq); 8795 8796 if (params->go_freq && params->go_ssid_len) { 8797 wpa_s->p2p_wps_method = WPS_NFC; 8798 wpa_s->pending_join_wps_method = WPS_NFC; 8799 os_memset(wpa_s->pending_join_iface_addr, 0, ETH_ALEN); 8800 os_memcpy(wpa_s->pending_join_dev_addr, params->go_dev_addr, 8801 ETH_ALEN); 8802 return wpas_p2p_join_start(wpa_s, params->go_freq, 8803 params->go_ssid, 8804 params->go_ssid_len); 8805 } 8806 8807 return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL, 8808 WPS_NFC, 0, 0, 1, 0, wpa_s->conf->p2p_go_intent, 8809 params->go_freq, -1, 0, 1, 1); 8810 } 8811 8812 8813 static int wpas_p2p_nfc_auth_join(struct wpa_supplicant *wpa_s, 8814 struct p2p_nfc_params *params, int tag) 8815 { 8816 int res, persistent; 8817 struct wpa_ssid *ssid; 8818 8819 wpa_printf(MSG_DEBUG, "P2P: Authorize join-group based on NFC " 8820 "connection handover"); 8821 for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) { 8822 ssid = wpa_s->current_ssid; 8823 if (ssid == NULL) 8824 continue; 8825 if (ssid->mode != WPAS_MODE_P2P_GO) 8826 continue; 8827 if (wpa_s->ap_iface == NULL) 8828 continue; 8829 break; 8830 } 8831 if (wpa_s == NULL) { 8832 wpa_printf(MSG_DEBUG, "P2P: Could not find GO interface"); 8833 return -1; 8834 } 8835 8836 if (wpa_s->parent->p2p_oob_dev_pw_id != 8837 DEV_PW_NFC_CONNECTION_HANDOVER && 8838 !wpa_s->parent->p2p_oob_dev_pw) { 8839 wpa_printf(MSG_DEBUG, "P2P: No NFC Dev Pw known"); 8840 return -1; 8841 } 8842 res = wpas_ap_wps_add_nfc_pw( 8843 wpa_s, wpa_s->parent->p2p_oob_dev_pw_id, 8844 wpa_s->parent->p2p_oob_dev_pw, 8845 wpa_s->parent->p2p_peer_oob_pk_hash_known ? 8846 wpa_s->parent->p2p_peer_oob_pubkey_hash : NULL); 8847 if (res) 8848 return res; 8849 8850 if (!tag) { 8851 wpa_printf(MSG_DEBUG, "P2P: Negotiated handover - wait for peer to join without invitation"); 8852 return 0; 8853 } 8854 8855 if (!params->peer || 8856 !(params->peer->dev_capab & P2P_DEV_CAPAB_INVITATION_PROCEDURE)) 8857 return 0; 8858 8859 wpa_printf(MSG_DEBUG, "P2P: Static handover - invite peer " MACSTR 8860 " to join", MAC2STR(params->peer->p2p_device_addr)); 8861 8862 wpa_s->global->p2p_invite_group = wpa_s; 8863 persistent = ssid->p2p_persistent_group && 8864 wpas_p2p_get_persistent(wpa_s->parent, 8865 params->peer->p2p_device_addr, 8866 ssid->ssid, ssid->ssid_len); 8867 wpa_s->parent->pending_invite_ssid_id = -1; 8868 8869 return p2p_invite(wpa_s->global->p2p, params->peer->p2p_device_addr, 8870 P2P_INVITE_ROLE_ACTIVE_GO, wpa_s->own_addr, 8871 ssid->ssid, ssid->ssid_len, ssid->frequency, 8872 wpa_s->global->p2p_dev_addr, persistent, 0, 8873 wpa_s->parent->p2p_oob_dev_pw_id); 8874 } 8875 8876 8877 static int wpas_p2p_nfc_init_go_neg(struct wpa_supplicant *wpa_s, 8878 struct p2p_nfc_params *params, 8879 int forced_freq) 8880 { 8881 wpa_printf(MSG_DEBUG, "P2P: Initiate GO Negotiation based on NFC " 8882 "connection handover"); 8883 return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL, 8884 WPS_NFC, 0, 0, 0, 0, wpa_s->conf->p2p_go_intent, 8885 forced_freq, -1, 0, 1, 1); 8886 } 8887 8888 8889 static int wpas_p2p_nfc_resp_go_neg(struct wpa_supplicant *wpa_s, 8890 struct p2p_nfc_params *params, 8891 int forced_freq) 8892 { 8893 int res; 8894 8895 wpa_printf(MSG_DEBUG, "P2P: Authorize GO Negotiation based on NFC " 8896 "connection handover"); 8897 res = wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL, 8898 WPS_NFC, 0, 0, 0, 1, wpa_s->conf->p2p_go_intent, 8899 forced_freq, -1, 0, 1, 1); 8900 if (res) 8901 return res; 8902 8903 res = wpas_p2p_listen(wpa_s, 60); 8904 if (res) { 8905 p2p_unauthorize(wpa_s->global->p2p, 8906 params->peer->p2p_device_addr); 8907 } 8908 8909 return res; 8910 } 8911 8912 8913 static int wpas_p2p_nfc_connection_handover(struct wpa_supplicant *wpa_s, 8914 const struct wpabuf *data, 8915 int sel, int tag, int forced_freq) 8916 { 8917 const u8 *pos, *end; 8918 u16 len, id; 8919 struct p2p_nfc_params params; 8920 int res; 8921 8922 os_memset(¶ms, 0, sizeof(params)); 8923 params.sel = sel; 8924 8925 wpa_hexdump_buf(MSG_DEBUG, "P2P: Received NFC tag payload", data); 8926 8927 pos = wpabuf_head(data); 8928 end = pos + wpabuf_len(data); 8929 8930 if (end - pos < 2) { 8931 wpa_printf(MSG_DEBUG, "P2P: Not enough data for Length of WSC " 8932 "attributes"); 8933 return -1; 8934 } 8935 len = WPA_GET_BE16(pos); 8936 pos += 2; 8937 if (len > end - pos) { 8938 wpa_printf(MSG_DEBUG, "P2P: Not enough data for WSC " 8939 "attributes"); 8940 return -1; 8941 } 8942 params.wsc_attr = pos; 8943 params.wsc_len = len; 8944 pos += len; 8945 8946 if (end - pos < 2) { 8947 wpa_printf(MSG_DEBUG, "P2P: Not enough data for Length of P2P " 8948 "attributes"); 8949 return -1; 8950 } 8951 len = WPA_GET_BE16(pos); 8952 pos += 2; 8953 if (len > end - pos) { 8954 wpa_printf(MSG_DEBUG, "P2P: Not enough data for P2P " 8955 "attributes"); 8956 return -1; 8957 } 8958 params.p2p_attr = pos; 8959 params.p2p_len = len; 8960 pos += len; 8961 8962 wpa_hexdump(MSG_DEBUG, "P2P: WSC attributes", 8963 params.wsc_attr, params.wsc_len); 8964 wpa_hexdump(MSG_DEBUG, "P2P: P2P attributes", 8965 params.p2p_attr, params.p2p_len); 8966 if (pos < end) { 8967 wpa_hexdump(MSG_DEBUG, 8968 "P2P: Ignored extra data after P2P attributes", 8969 pos, end - pos); 8970 } 8971 8972 res = p2p_process_nfc_connection_handover(wpa_s->global->p2p, ¶ms); 8973 if (res) 8974 return res; 8975 8976 if (params.next_step == NO_ACTION) 8977 return 0; 8978 8979 if (params.next_step == BOTH_GO) { 8980 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_BOTH_GO "peer=" MACSTR, 8981 MAC2STR(params.peer->p2p_device_addr)); 8982 return 0; 8983 } 8984 8985 if (params.next_step == PEER_CLIENT) { 8986 if (!is_zero_ether_addr(params.go_dev_addr)) { 8987 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT 8988 "peer=" MACSTR " freq=%d go_dev_addr=" MACSTR 8989 " ssid=\"%s\"", 8990 MAC2STR(params.peer->p2p_device_addr), 8991 params.go_freq, 8992 MAC2STR(params.go_dev_addr), 8993 wpa_ssid_txt(params.go_ssid, 8994 params.go_ssid_len)); 8995 } else { 8996 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT 8997 "peer=" MACSTR " freq=%d", 8998 MAC2STR(params.peer->p2p_device_addr), 8999 params.go_freq); 9000 } 9001 return 0; 9002 } 9003 9004 if (wpas_p2p_cli_freq(wpa_s, NULL, NULL)) { 9005 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_WHILE_CLIENT "peer=" 9006 MACSTR, MAC2STR(params.peer->p2p_device_addr)); 9007 return 0; 9008 } 9009 9010 wpabuf_free(wpa_s->p2p_oob_dev_pw); 9011 wpa_s->p2p_oob_dev_pw = NULL; 9012 9013 if (params.oob_dev_pw_len < WPS_OOB_PUBKEY_HASH_LEN + 2) { 9014 wpa_printf(MSG_DEBUG, "P2P: No peer OOB Dev Pw " 9015 "received"); 9016 return -1; 9017 } 9018 9019 id = WPA_GET_BE16(params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN); 9020 wpa_printf(MSG_DEBUG, "P2P: Peer OOB Dev Pw %u", id); 9021 wpa_hexdump(MSG_DEBUG, "P2P: Peer OOB Public Key hash", 9022 params.oob_dev_pw, WPS_OOB_PUBKEY_HASH_LEN); 9023 os_memcpy(wpa_s->p2p_peer_oob_pubkey_hash, 9024 params.oob_dev_pw, WPS_OOB_PUBKEY_HASH_LEN); 9025 wpa_s->p2p_peer_oob_pk_hash_known = 1; 9026 9027 if (tag) { 9028 if (id < 0x10) { 9029 wpa_printf(MSG_DEBUG, "P2P: Static handover - invalid " 9030 "peer OOB Device Password Id %u", id); 9031 return -1; 9032 } 9033 wpa_printf(MSG_DEBUG, "P2P: Static handover - use peer OOB " 9034 "Device Password Id %u", id); 9035 wpa_hexdump_key(MSG_DEBUG, "P2P: Peer OOB Device Password", 9036 params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN + 2, 9037 params.oob_dev_pw_len - 9038 WPS_OOB_PUBKEY_HASH_LEN - 2); 9039 wpa_s->p2p_oob_dev_pw_id = id; 9040 wpa_s->p2p_oob_dev_pw = wpabuf_alloc_copy( 9041 params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN + 2, 9042 params.oob_dev_pw_len - 9043 WPS_OOB_PUBKEY_HASH_LEN - 2); 9044 if (wpa_s->p2p_oob_dev_pw == NULL) 9045 return -1; 9046 9047 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL && 9048 wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey, 9049 &wpa_s->conf->wps_nfc_dh_privkey) < 0) 9050 return -1; 9051 } else { 9052 wpa_printf(MSG_DEBUG, "P2P: Using abbreviated WPS handshake " 9053 "without Device Password"); 9054 wpa_s->p2p_oob_dev_pw_id = DEV_PW_NFC_CONNECTION_HANDOVER; 9055 } 9056 9057 switch (params.next_step) { 9058 case NO_ACTION: 9059 case BOTH_GO: 9060 case PEER_CLIENT: 9061 /* already covered above */ 9062 return 0; 9063 case JOIN_GROUP: 9064 return wpas_p2p_nfc_join_group(wpa_s, ¶ms); 9065 case AUTH_JOIN: 9066 return wpas_p2p_nfc_auth_join(wpa_s, ¶ms, tag); 9067 case INIT_GO_NEG: 9068 return wpas_p2p_nfc_init_go_neg(wpa_s, ¶ms, forced_freq); 9069 case RESP_GO_NEG: 9070 /* TODO: use own OOB Dev Pw */ 9071 return wpas_p2p_nfc_resp_go_neg(wpa_s, ¶ms, forced_freq); 9072 } 9073 9074 return -1; 9075 } 9076 9077 9078 int wpas_p2p_nfc_tag_process(struct wpa_supplicant *wpa_s, 9079 const struct wpabuf *data, int forced_freq) 9080 { 9081 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 9082 return -1; 9083 9084 return wpas_p2p_nfc_connection_handover(wpa_s, data, 1, 1, forced_freq); 9085 } 9086 9087 9088 int wpas_p2p_nfc_report_handover(struct wpa_supplicant *wpa_s, int init, 9089 const struct wpabuf *req, 9090 const struct wpabuf *sel, int forced_freq) 9091 { 9092 struct wpabuf *tmp; 9093 int ret; 9094 9095 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 9096 return -1; 9097 9098 wpa_printf(MSG_DEBUG, "NFC: P2P connection handover reported"); 9099 9100 wpa_hexdump_ascii(MSG_DEBUG, "NFC: Req", 9101 wpabuf_head(req), wpabuf_len(req)); 9102 wpa_hexdump_ascii(MSG_DEBUG, "NFC: Sel", 9103 wpabuf_head(sel), wpabuf_len(sel)); 9104 if (forced_freq) 9105 wpa_printf(MSG_DEBUG, "NFC: Forced freq %d", forced_freq); 9106 tmp = ndef_parse_p2p(init ? sel : req); 9107 if (tmp == NULL) { 9108 wpa_printf(MSG_DEBUG, "P2P: Could not parse NDEF"); 9109 return -1; 9110 } 9111 9112 ret = wpas_p2p_nfc_connection_handover(wpa_s, tmp, init, 0, 9113 forced_freq); 9114 wpabuf_free(tmp); 9115 9116 return ret; 9117 } 9118 9119 9120 int wpas_p2p_nfc_tag_enabled(struct wpa_supplicant *wpa_s, int enabled) 9121 { 9122 const u8 *if_addr; 9123 int go_intent = wpa_s->conf->p2p_go_intent; 9124 struct wpa_supplicant *iface; 9125 9126 if (wpa_s->global->p2p == NULL) 9127 return -1; 9128 9129 if (!enabled) { 9130 wpa_printf(MSG_DEBUG, "P2P: Disable use of own NFC Tag"); 9131 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) 9132 { 9133 if (!iface->ap_iface) 9134 continue; 9135 hostapd_wps_nfc_token_disable(iface->ap_iface->bss[0]); 9136 } 9137 p2p_set_authorized_oob_dev_pw_id(wpa_s->global->p2p, 0, 9138 0, NULL); 9139 if (wpa_s->p2p_nfc_tag_enabled) 9140 wpas_p2p_remove_pending_group_interface(wpa_s); 9141 wpa_s->p2p_nfc_tag_enabled = 0; 9142 return 0; 9143 } 9144 9145 if (wpa_s->global->p2p_disabled) 9146 return -1; 9147 9148 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL || 9149 wpa_s->conf->wps_nfc_dh_privkey == NULL || 9150 wpa_s->conf->wps_nfc_dev_pw == NULL || 9151 wpa_s->conf->wps_nfc_dev_pw_id < 0x10) { 9152 wpa_printf(MSG_DEBUG, "P2P: NFC password token not configured " 9153 "to allow static handover cases"); 9154 return -1; 9155 } 9156 9157 wpa_printf(MSG_DEBUG, "P2P: Enable use of own NFC Tag"); 9158 9159 wpa_s->p2p_oob_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id; 9160 wpabuf_free(wpa_s->p2p_oob_dev_pw); 9161 wpa_s->p2p_oob_dev_pw = wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw); 9162 if (wpa_s->p2p_oob_dev_pw == NULL) 9163 return -1; 9164 wpa_s->p2p_peer_oob_pk_hash_known = 0; 9165 9166 if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO || 9167 wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT) { 9168 /* 9169 * P2P Group Interface present and the command came on group 9170 * interface, so enable the token for the current interface. 9171 */ 9172 wpa_s->create_p2p_iface = 0; 9173 } else { 9174 wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s); 9175 } 9176 9177 if (wpa_s->create_p2p_iface) { 9178 enum wpa_driver_if_type iftype; 9179 /* Prepare to add a new interface for the group */ 9180 iftype = WPA_IF_P2P_GROUP; 9181 if (go_intent == 15) 9182 iftype = WPA_IF_P2P_GO; 9183 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) { 9184 wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new " 9185 "interface for the group"); 9186 return -1; 9187 } 9188 9189 if_addr = wpa_s->pending_interface_addr; 9190 } else 9191 if_addr = wpa_s->own_addr; 9192 9193 wpa_s->p2p_nfc_tag_enabled = enabled; 9194 9195 for (iface = wpa_s->global->ifaces; iface; iface = iface->next) { 9196 struct hostapd_data *hapd; 9197 if (iface->ap_iface == NULL) 9198 continue; 9199 hapd = iface->ap_iface->bss[0]; 9200 wpabuf_free(hapd->conf->wps_nfc_dh_pubkey); 9201 hapd->conf->wps_nfc_dh_pubkey = 9202 wpabuf_dup(wpa_s->conf->wps_nfc_dh_pubkey); 9203 wpabuf_free(hapd->conf->wps_nfc_dh_privkey); 9204 hapd->conf->wps_nfc_dh_privkey = 9205 wpabuf_dup(wpa_s->conf->wps_nfc_dh_privkey); 9206 wpabuf_free(hapd->conf->wps_nfc_dev_pw); 9207 hapd->conf->wps_nfc_dev_pw = 9208 wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw); 9209 hapd->conf->wps_nfc_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id; 9210 9211 if (hostapd_wps_nfc_token_enable(iface->ap_iface->bss[0]) < 0) { 9212 wpa_dbg(iface, MSG_DEBUG, 9213 "P2P: Failed to enable NFC Tag for GO"); 9214 } 9215 } 9216 p2p_set_authorized_oob_dev_pw_id( 9217 wpa_s->global->p2p, wpa_s->conf->wps_nfc_dev_pw_id, go_intent, 9218 if_addr); 9219 9220 return 0; 9221 } 9222 9223 #endif /* CONFIG_WPS_NFC */ 9224 9225 9226 static void wpas_p2p_optimize_listen_channel(struct wpa_supplicant *wpa_s, 9227 struct wpa_used_freq_data *freqs, 9228 unsigned int num) 9229 { 9230 u8 curr_chan, cand, chan; 9231 unsigned int i; 9232 9233 curr_chan = p2p_get_listen_channel(wpa_s->global->p2p); 9234 for (i = 0, cand = 0; i < num; i++) { 9235 ieee80211_freq_to_chan(freqs[i].freq, &chan); 9236 if (curr_chan == chan) { 9237 cand = 0; 9238 break; 9239 } 9240 9241 if (chan == 1 || chan == 6 || chan == 11) 9242 cand = chan; 9243 } 9244 9245 if (cand) { 9246 wpa_dbg(wpa_s, MSG_DEBUG, 9247 "P2P: Update Listen channel to %u based on operating channel", 9248 cand); 9249 p2p_set_listen_channel(wpa_s->global->p2p, 81, cand, 0); 9250 } 9251 } 9252 9253 9254 void wpas_p2p_indicate_state_change(struct wpa_supplicant *wpa_s) 9255 { 9256 struct wpa_used_freq_data *freqs; 9257 unsigned int num = wpa_s->num_multichan_concurrent; 9258 9259 if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) 9260 return; 9261 9262 /* 9263 * If possible, optimize the Listen channel to be a channel that is 9264 * already used by one of the other interfaces. 9265 */ 9266 if (!wpa_s->conf->p2p_optimize_listen_chan) 9267 return; 9268 9269 if (!wpa_s->current_ssid || wpa_s->wpa_state != WPA_COMPLETED) 9270 return; 9271 9272 freqs = os_calloc(num, sizeof(struct wpa_used_freq_data)); 9273 if (!freqs) 9274 return; 9275 9276 num = get_shared_radio_freqs_data(wpa_s, freqs, num); 9277 9278 wpas_p2p_optimize_listen_channel(wpa_s, freqs, num); 9279 os_free(freqs); 9280 } 9281 9282 9283 void wpas_p2p_deinit_iface(struct wpa_supplicant *wpa_s) 9284 { 9285 if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) { 9286 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing " 9287 "the management interface is being removed"); 9288 wpas_p2p_deinit_global(wpa_s->global); 9289 } 9290 } 9291 9292 9293 void wpas_p2p_ap_deinit(struct wpa_supplicant *wpa_s) 9294 { 9295 if (wpa_s->ap_iface->bss) 9296 wpa_s->ap_iface->bss[0]->p2p_group = NULL; 9297 wpas_p2p_group_deinit(wpa_s); 9298 } 9299