xref: /freebsd/contrib/wpa/wpa_supplicant/p2p_supplicant.c (revision f4b37ed0f8b307b1f3f0f630ca725d68f1dff30d)
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(&params, 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, &params);
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, &params, 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, &params);
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, &params, 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, &params, 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, &params, 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(&params, 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, &params);
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, &params);
9065 	case AUTH_JOIN:
9066 		return wpas_p2p_nfc_auth_join(wpa_s, &params, tag);
9067 	case INIT_GO_NEG:
9068 		return wpas_p2p_nfc_init_go_neg(wpa_s, &params, forced_freq);
9069 	case RESP_GO_NEG:
9070 		/* TODO: use own OOB Dev Pw */
9071 		return wpas_p2p_nfc_resp_go_neg(wpa_s, &params, 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