1/*
2 * wpa_supplicant - P2P
3 * Copyright (c) 2009-2010, Atheros Communications
4 *
5 * This software may be distributed under the terms of the BSD license.
6 * See README for more details.
7 */
8
9#include "includes.h"
10
11#include "common.h"
12#include "eloop.h"
13#include "common/ieee802_11_common.h"
14#include "common/ieee802_11_defs.h"
15#include "common/wpa_ctrl.h"
16#include "wps/wps_i.h"
17#include "p2p/p2p.h"
18#include "ap/hostapd.h"
19#include "ap/ap_config.h"
20#include "ap/p2p_hostapd.h"
21#include "eapol_supp/eapol_supp_sm.h"
22#include "rsn_supp/wpa.h"
23#include "wpa_supplicant_i.h"
24#include "driver_i.h"
25#include "ap.h"
26#include "config_ssid.h"
27#include "config.h"
28#include "notify.h"
29#include "scan.h"
30#include "bss.h"
31#include "offchannel.h"
32#include "wps_supplicant.h"
33#include "p2p_supplicant.h"
34
35
36/*
37 * How many times to try to scan to find the GO before giving up on join
38 * request.
39 */
40#define P2P_MAX_JOIN_SCAN_ATTEMPTS 10
41
42#define P2P_AUTO_PD_SCAN_ATTEMPTS 5
43
44#ifndef P2P_MAX_CLIENT_IDLE
45/*
46 * How many seconds to try to reconnect to the GO when connection in P2P client
47 * role has been lost.
48 */
49#ifdef ANDROID_P2P
50#define P2P_MAX_CLIENT_IDLE 20
51#else
52#define P2P_MAX_CLIENT_IDLE 10
53#endif /* ANDROID_P2P */
54#endif /* P2P_MAX_CLIENT_IDLE */
55
56#ifndef P2P_MAX_INITIAL_CONN_WAIT
57/*
58 * How many seconds to wait for initial 4-way handshake to get completed after
59 * WPS provisioning step.
60 */
61#define P2P_MAX_INITIAL_CONN_WAIT 10
62#endif /* P2P_MAX_INITIAL_CONN_WAIT */
63
64#ifndef P2P_CONCURRENT_SEARCH_DELAY
65#define P2P_CONCURRENT_SEARCH_DELAY 500
66#endif /* P2P_CONCURRENT_SEARCH_DELAY */
67
68enum p2p_group_removal_reason {
69	P2P_GROUP_REMOVAL_UNKNOWN,
70	P2P_GROUP_REMOVAL_SILENT,
71	P2P_GROUP_REMOVAL_FORMATION_FAILED,
72	P2P_GROUP_REMOVAL_REQUESTED,
73	P2P_GROUP_REMOVAL_IDLE_TIMEOUT,
74	P2P_GROUP_REMOVAL_UNAVAILABLE,
75	P2P_GROUP_REMOVAL_GO_ENDING_SESSION,
76#ifdef ANDROID_P2P
77	P2P_GROUP_REMOVAL_FREQ_CONFLICT
78#endif
79};
80
81
82static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
83static struct wpa_supplicant *
84wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
85			 int go);
86static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s);
87static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq);
88static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx);
89static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
90			 const u8 *dev_addr, enum p2p_wps_method wps_method,
91			 int auto_join);
92static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s);
93static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
94static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx);
95static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
96static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
97					     void *timeout_ctx);
98static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
99					int group_added);
100static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s);
101
102
103static void wpas_p2p_set_own_freq_preference(struct wpa_supplicant *wpa_s,
104					     int freq)
105{
106	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
107		return;
108	if (freq > 0 &&
109	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&
110	    wpa_s->parent->conf->p2p_ignore_shared_freq)
111		freq = 0;
112	p2p_set_own_freq_preference(wpa_s->global->p2p, freq);
113}
114
115
116static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
117				      struct wpa_scan_results *scan_res)
118{
119	size_t i;
120
121	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
122		return;
123
124	wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS)",
125		   (int) scan_res->num);
126
127	for (i = 0; i < scan_res->num; i++) {
128		struct wpa_scan_res *bss = scan_res->res[i];
129		struct os_time time_tmp_age, entry_ts;
130		time_tmp_age.sec = bss->age / 1000;
131		time_tmp_age.usec = (bss->age % 1000) * 1000;
132		os_time_sub(&scan_res->fetch_time, &time_tmp_age, &entry_ts);
133		if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
134					 bss->freq, &entry_ts, bss->level,
135					 (const u8 *) (bss + 1),
136					 bss->ie_len) > 0)
137			break;
138	}
139
140	p2p_scan_res_handled(wpa_s->global->p2p);
141}
142
143
144static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
145			 unsigned int num_req_dev_types,
146			 const u8 *req_dev_types, const u8 *dev_id, u16 pw_id)
147{
148	struct wpa_supplicant *wpa_s = ctx;
149	struct wpa_supplicant *ifs;
150	struct wpa_driver_scan_params params;
151	int ret;
152	struct wpabuf *wps_ie, *ies;
153	int social_channels[] = { 2412, 2437, 2462, 0, 0 };
154	size_t ielen;
155
156	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
157		return -1;
158
159	for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
160		if (ifs->sta_scan_pending &&
161		    (wpas_scan_scheduled(ifs) || ifs->scanning) &&
162		    wpas_p2p_in_progress(wpa_s) == 2) {
163			wpa_printf(MSG_DEBUG, "Delaying P2P scan to allow "
164				   "pending station mode scan to be "
165				   "completed on interface %s", ifs->ifname);
166			wpa_s->global->p2p_cb_on_scan_complete = 1;
167			wpa_supplicant_req_scan(ifs, 0, 0);
168			return 1;
169		}
170	}
171
172	os_memset(&params, 0, sizeof(params));
173
174	/* P2P Wildcard SSID */
175	params.num_ssids = 1;
176	params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
177	params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
178
179	wpa_s->wps->dev.p2p = 1;
180	wps_ie = wps_build_probe_req_ie(pw_id, &wpa_s->wps->dev,
181					wpa_s->wps->uuid, WPS_REQ_ENROLLEE,
182					num_req_dev_types, req_dev_types);
183	if (wps_ie == NULL)
184		return -1;
185
186	ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
187	ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
188	if (ies == NULL) {
189		wpabuf_free(wps_ie);
190		return -1;
191	}
192	wpabuf_put_buf(ies, wps_ie);
193	wpabuf_free(wps_ie);
194
195	p2p_scan_ie(wpa_s->global->p2p, ies, dev_id);
196
197	params.p2p_probe = 1;
198	params.extra_ies = wpabuf_head(ies);
199	params.extra_ies_len = wpabuf_len(ies);
200
201	switch (type) {
202	case P2P_SCAN_SOCIAL:
203		params.freqs = social_channels;
204		break;
205	case P2P_SCAN_FULL:
206		break;
207	case P2P_SCAN_SPECIFIC:
208		social_channels[0] = freq;
209		social_channels[1] = 0;
210		params.freqs = social_channels;
211		break;
212	case P2P_SCAN_SOCIAL_PLUS_ONE:
213		social_channels[3] = freq;
214		params.freqs = social_channels;
215		break;
216	}
217
218	ret = wpa_drv_scan(wpa_s, &params);
219
220	wpabuf_free(ies);
221
222	if (ret) {
223		for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
224			if (ifs->scanning ||
225			    ifs->scan_res_handler == wpas_p2p_scan_res_handler) {
226				wpa_s->global->p2p_cb_on_scan_complete = 1;
227				ret = 1;
228				break;
229			}
230		}
231	} else {
232		os_get_time(&wpa_s->scan_trigger_time);
233		wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
234	}
235
236	return ret;
237}
238
239
240static enum wpa_driver_if_type wpas_p2p_if_type(int p2p_group_interface)
241{
242	switch (p2p_group_interface) {
243	case P2P_GROUP_INTERFACE_PENDING:
244		return WPA_IF_P2P_GROUP;
245	case P2P_GROUP_INTERFACE_GO:
246		return WPA_IF_P2P_GO;
247	case P2P_GROUP_INTERFACE_CLIENT:
248		return WPA_IF_P2P_CLIENT;
249	}
250
251	return WPA_IF_P2P_GROUP;
252}
253
254
255static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s,
256						  const u8 *ssid,
257						  size_t ssid_len, int *go)
258{
259	struct wpa_ssid *s;
260
261	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
262		for (s = wpa_s->conf->ssid; s; s = s->next) {
263			if (s->disabled != 0 || !s->p2p_group ||
264			    s->ssid_len != ssid_len ||
265			    os_memcmp(ssid, s->ssid, ssid_len) != 0)
266				continue;
267			if (s->mode == WPAS_MODE_P2P_GO &&
268			    s != wpa_s->current_ssid)
269				continue;
270			if (go)
271				*go = s->mode == WPAS_MODE_P2P_GO;
272			return wpa_s;
273		}
274	}
275
276	return NULL;
277}
278
279
280static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s,
281				 enum p2p_group_removal_reason removal_reason)
282{
283	struct wpa_ssid *ssid;
284	char *gtype;
285	const char *reason;
286
287	ssid = wpa_s->current_ssid;
288	if (ssid == NULL) {
289		/*
290		 * The current SSID was not known, but there may still be a
291		 * pending P2P group interface waiting for provisioning or a
292		 * P2P group that is trying to reconnect.
293		 */
294		ssid = wpa_s->conf->ssid;
295		while (ssid) {
296			if (ssid->p2p_group && ssid->disabled != 2)
297				break;
298			ssid = ssid->next;
299		}
300		if (ssid == NULL &&
301			wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)
302		{
303			wpa_printf(MSG_ERROR, "P2P: P2P group interface "
304				   "not found");
305			return -1;
306		}
307	}
308	if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO)
309		gtype = "GO";
310	else if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT ||
311		 (ssid && ssid->mode == WPAS_MODE_INFRA)) {
312		wpa_s->reassociate = 0;
313		wpa_s->disconnected = 1;
314		wpa_supplicant_deauthenticate(wpa_s,
315					      WLAN_REASON_DEAUTH_LEAVING);
316		gtype = "client";
317	} else
318		gtype = "GO";
319	if (wpa_s->cross_connect_in_use) {
320		wpa_s->cross_connect_in_use = 0;
321		wpa_msg(wpa_s->parent, MSG_INFO,
322			P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
323			wpa_s->ifname, wpa_s->cross_connect_uplink);
324	}
325	switch (removal_reason) {
326	case P2P_GROUP_REMOVAL_REQUESTED:
327		reason = " reason=REQUESTED";
328		break;
329	case P2P_GROUP_REMOVAL_FORMATION_FAILED:
330		reason = " reason=FORMATION_FAILED";
331		break;
332	case P2P_GROUP_REMOVAL_IDLE_TIMEOUT:
333		reason = " reason=IDLE";
334		break;
335	case P2P_GROUP_REMOVAL_UNAVAILABLE:
336		reason = " reason=UNAVAILABLE";
337		break;
338	case P2P_GROUP_REMOVAL_GO_ENDING_SESSION:
339		reason = " reason=GO_ENDING_SESSION";
340		break;
341#ifdef ANDROID_P2P
342	case P2P_GROUP_REMOVAL_FREQ_CONFLICT:
343		reason = " reason=FREQ_CONFLICT";
344		break;
345#endif
346	default:
347		reason = "";
348		break;
349	}
350	if (removal_reason != P2P_GROUP_REMOVAL_SILENT) {
351		wpa_msg(wpa_s->parent, MSG_INFO,
352			P2P_EVENT_GROUP_REMOVED "%s %s%s",
353			wpa_s->ifname, gtype, reason);
354	}
355
356	if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
357		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
358	if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
359				 wpa_s->parent, NULL) > 0) {
360		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group formation "
361			   "timeout");
362		wpa_s->p2p_in_provisioning = 0;
363	}
364
365	if (removal_reason != P2P_GROUP_REMOVAL_SILENT && ssid)
366		wpas_notify_p2p_group_removed(wpa_s, ssid, gtype);
367
368	if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
369		struct wpa_global *global;
370		char *ifname;
371		enum wpa_driver_if_type type;
372		wpa_printf(MSG_DEBUG, "P2P: Remove group interface %s",
373			wpa_s->ifname);
374		global = wpa_s->global;
375		ifname = os_strdup(wpa_s->ifname);
376		type = wpas_p2p_if_type(wpa_s->p2p_group_interface);
377		wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0);
378		wpa_s = global->ifaces;
379		if (wpa_s && ifname)
380			wpa_drv_if_remove(wpa_s, type, ifname);
381		os_free(ifname);
382		return 1;
383	}
384
385	wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network");
386	if (ssid && (ssid->p2p_group ||
387		     ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION ||
388		     (ssid->key_mgmt & WPA_KEY_MGMT_WPS))) {
389		int id = ssid->id;
390		if (ssid == wpa_s->current_ssid) {
391			wpa_sm_set_config(wpa_s->wpa, NULL);
392			eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
393			wpa_s->current_ssid = NULL;
394		}
395		/*
396		 * Networks objects created during any P2P activities are not
397		 * exposed out as they might/will confuse certain non-P2P aware
398		 * applications since these network objects won't behave like
399		 * regular ones.
400		 *
401		 * Likewise, we don't send out network removed signals for such
402		 * network objects.
403		 */
404		wpa_config_remove_network(wpa_s->conf, id);
405		wpa_supplicant_clear_status(wpa_s);
406		wpa_supplicant_cancel_sched_scan(wpa_s);
407		wpa_s->sta_scan_pending = 0;
408	} else {
409		wpa_printf(MSG_DEBUG, "P2P: Temporary group network not "
410			   "found");
411	}
412	if (wpa_s->ap_iface)
413		wpa_supplicant_ap_deinit(wpa_s);
414	else
415		wpa_drv_deinit_p2p_cli(wpa_s);
416
417	return 0;
418}
419
420
421static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s,
422				     u8 *go_dev_addr,
423				     const u8 *ssid, size_t ssid_len)
424{
425	struct wpa_bss *bss;
426	const u8 *bssid;
427	struct wpabuf *p2p;
428	u8 group_capab;
429	const u8 *addr;
430
431	if (wpa_s->go_params)
432		bssid = wpa_s->go_params->peer_interface_addr;
433	else
434		bssid = wpa_s->bssid;
435
436	bss = wpa_bss_get(wpa_s, bssid, ssid, ssid_len);
437	if (bss == NULL) {
438		u8 iface_addr[ETH_ALEN];
439		if (p2p_get_interface_addr(wpa_s->global->p2p, bssid,
440					   iface_addr) == 0)
441			bss = wpa_bss_get(wpa_s, iface_addr, ssid, ssid_len);
442	}
443	if (bss == NULL) {
444		wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
445			   "group is persistent - BSS " MACSTR " not found",
446			   MAC2STR(bssid));
447		return 0;
448	}
449
450	p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
451	if (p2p == NULL) {
452		wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
453			   "group is persistent - BSS " MACSTR
454			   " did not include P2P IE", MAC2STR(bssid));
455		wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs",
456			    (u8 *) (bss + 1), bss->ie_len);
457		wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs",
458			    ((u8 *) bss + 1) + bss->ie_len,
459			    bss->beacon_ie_len);
460		return 0;
461	}
462
463	group_capab = p2p_get_group_capab(p2p);
464	addr = p2p_get_go_dev_addr(p2p);
465	wpa_printf(MSG_DEBUG, "P2P: Checking whether group is persistent: "
466		   "group_capab=0x%x", group_capab);
467	if (addr) {
468		os_memcpy(go_dev_addr, addr, ETH_ALEN);
469		wpa_printf(MSG_DEBUG, "P2P: GO Device Address " MACSTR,
470			   MAC2STR(addr));
471	} else
472		os_memset(go_dev_addr, 0, ETH_ALEN);
473	wpabuf_free(p2p);
474
475	wpa_printf(MSG_DEBUG, "P2P: BSS " MACSTR " group_capab=0x%x "
476		   "go_dev_addr=" MACSTR,
477		   MAC2STR(bssid), group_capab, MAC2STR(go_dev_addr));
478
479	return group_capab & P2P_GROUP_CAPAB_PERSISTENT_GROUP;
480}
481
482
483static int wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
484					   struct wpa_ssid *ssid,
485					   const u8 *go_dev_addr)
486{
487	struct wpa_ssid *s;
488	int changed = 0;
489
490	wpa_printf(MSG_DEBUG, "P2P: Storing credentials for a persistent "
491		   "group (GO Dev Addr " MACSTR ")", MAC2STR(go_dev_addr));
492	for (s = wpa_s->conf->ssid; s; s = s->next) {
493		if (s->disabled == 2 &&
494		    os_memcmp(go_dev_addr, s->bssid, ETH_ALEN) == 0 &&
495		    s->ssid_len == ssid->ssid_len &&
496		    os_memcmp(ssid->ssid, s->ssid, ssid->ssid_len) == 0)
497			break;
498	}
499
500	if (s) {
501		wpa_printf(MSG_DEBUG, "P2P: Update existing persistent group "
502			   "entry");
503		if (ssid->passphrase && !s->passphrase)
504			changed = 1;
505		else if (ssid->passphrase && s->passphrase &&
506			 os_strcmp(ssid->passphrase, s->passphrase) != 0)
507			changed = 1;
508	} else {
509		wpa_printf(MSG_DEBUG, "P2P: Create a new persistent group "
510			   "entry");
511		changed = 1;
512		s = wpa_config_add_network(wpa_s->conf);
513		if (s == NULL)
514			return -1;
515
516		/*
517		 * Instead of network_added we emit persistent_group_added
518		 * notification. Also to keep the defense checks in
519		 * persistent_group obj registration method, we set the
520		 * relevant flags in s to designate it as a persistent group.
521		 */
522		s->p2p_group = 1;
523		s->p2p_persistent_group = 1;
524		wpas_notify_persistent_group_added(wpa_s, s);
525		wpa_config_set_network_defaults(s);
526	}
527
528	s->p2p_group = 1;
529	s->p2p_persistent_group = 1;
530	s->disabled = 2;
531	s->bssid_set = 1;
532	os_memcpy(s->bssid, go_dev_addr, ETH_ALEN);
533	s->mode = ssid->mode;
534	s->auth_alg = WPA_AUTH_ALG_OPEN;
535	s->key_mgmt = WPA_KEY_MGMT_PSK;
536	s->proto = WPA_PROTO_RSN;
537	s->pairwise_cipher = WPA_CIPHER_CCMP;
538	s->export_keys = 1;
539	if (ssid->passphrase) {
540		os_free(s->passphrase);
541		s->passphrase = os_strdup(ssid->passphrase);
542	}
543	if (ssid->psk_set) {
544		s->psk_set = 1;
545		os_memcpy(s->psk, ssid->psk, 32);
546	}
547	if (s->passphrase && !s->psk_set)
548		wpa_config_update_psk(s);
549	if (s->ssid == NULL || s->ssid_len < ssid->ssid_len) {
550		os_free(s->ssid);
551		s->ssid = os_malloc(ssid->ssid_len);
552	}
553	if (s->ssid) {
554		s->ssid_len = ssid->ssid_len;
555		os_memcpy(s->ssid, ssid->ssid, s->ssid_len);
556	}
557
558#ifndef CONFIG_NO_CONFIG_WRITE
559	if (changed && wpa_s->conf->update_config &&
560	    wpa_config_write(wpa_s->confname, wpa_s->conf)) {
561		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
562	}
563#endif /* CONFIG_NO_CONFIG_WRITE */
564
565	return s->id;
566}
567
568
569static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
570						 const u8 *addr)
571{
572	struct wpa_ssid *ssid, *s;
573	u8 *n;
574	size_t i;
575	int found = 0;
576
577	ssid = wpa_s->current_ssid;
578	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
579	    !ssid->p2p_persistent_group)
580		return;
581
582	for (s = wpa_s->parent->conf->ssid; s; s = s->next) {
583		if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO)
584			continue;
585
586		if (s->ssid_len == ssid->ssid_len &&
587		    os_memcmp(s->ssid, ssid->ssid, s->ssid_len) == 0)
588			break;
589	}
590
591	if (s == NULL)
592		return;
593
594	for (i = 0; s->p2p_client_list && i < s->num_p2p_clients; i++) {
595		if (os_memcmp(s->p2p_client_list + i * ETH_ALEN, addr,
596			      ETH_ALEN) != 0)
597			continue;
598
599		if (i == s->num_p2p_clients - 1)
600			return; /* already the most recent entry */
601
602		/* move the entry to mark it most recent */
603		os_memmove(s->p2p_client_list + i * ETH_ALEN,
604			   s->p2p_client_list + (i + 1) * ETH_ALEN,
605			   (s->num_p2p_clients - i - 1) * ETH_ALEN);
606		os_memcpy(s->p2p_client_list +
607			  (s->num_p2p_clients - 1) * ETH_ALEN, addr, ETH_ALEN);
608		found = 1;
609		break;
610	}
611
612	if (!found && s->num_p2p_clients < P2P_MAX_STORED_CLIENTS) {
613		n = os_realloc_array(s->p2p_client_list,
614				     s->num_p2p_clients + 1, ETH_ALEN);
615		if (n == NULL)
616			return;
617		os_memcpy(n + s->num_p2p_clients * ETH_ALEN, addr, ETH_ALEN);
618		s->p2p_client_list = n;
619		s->num_p2p_clients++;
620	} else if (!found) {
621		/* Not enough room for an additional entry - drop the oldest
622		 * entry */
623		os_memmove(s->p2p_client_list,
624			   s->p2p_client_list + ETH_ALEN,
625			   (s->num_p2p_clients - 1) * ETH_ALEN);
626		os_memcpy(s->p2p_client_list +
627			  (s->num_p2p_clients - 1) * ETH_ALEN,
628			  addr, ETH_ALEN);
629	}
630
631#ifndef CONFIG_NO_CONFIG_WRITE
632	if (wpa_s->parent->conf->update_config &&
633	    wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
634		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
635#endif /* CONFIG_NO_CONFIG_WRITE */
636}
637
638
639static void wpas_group_formation_completed(struct wpa_supplicant *wpa_s,
640					   int success)
641{
642	struct wpa_ssid *ssid;
643	const char *ssid_txt;
644	int client;
645	int persistent;
646	u8 go_dev_addr[ETH_ALEN];
647	int network_id = -1;
648
649	/*
650	 * This callback is likely called for the main interface. Update wpa_s
651	 * to use the group interface if a new interface was created for the
652	 * group.
653	 */
654	if (wpa_s->global->p2p_group_formation)
655		wpa_s = wpa_s->global->p2p_group_formation;
656	wpa_s->global->p2p_group_formation = NULL;
657	wpa_s->p2p_in_provisioning = 0;
658
659	if (!success) {
660		wpa_msg(wpa_s->parent, MSG_INFO,
661			P2P_EVENT_GROUP_FORMATION_FAILURE);
662		wpas_p2p_group_delete(wpa_s,
663				      P2P_GROUP_REMOVAL_FORMATION_FAILED);
664		return;
665	}
666
667	wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_FORMATION_SUCCESS);
668
669	ssid = wpa_s->current_ssid;
670	if (ssid && ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
671		ssid->mode = WPAS_MODE_P2P_GO;
672		p2p_group_notif_formation_done(wpa_s->p2p_group);
673		wpa_supplicant_ap_mac_addr_filter(wpa_s, NULL);
674	}
675
676	persistent = 0;
677	if (ssid) {
678		ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len);
679		client = ssid->mode == WPAS_MODE_INFRA;
680		if (ssid->mode == WPAS_MODE_P2P_GO) {
681			persistent = ssid->p2p_persistent_group;
682			os_memcpy(go_dev_addr, wpa_s->global->p2p_dev_addr,
683				  ETH_ALEN);
684		} else
685			persistent = wpas_p2p_persistent_group(wpa_s,
686							       go_dev_addr,
687							       ssid->ssid,
688							       ssid->ssid_len);
689	} else {
690		ssid_txt = "";
691		client = wpa_s->p2p_group_interface ==
692			P2P_GROUP_INTERFACE_CLIENT;
693		os_memset(go_dev_addr, 0, ETH_ALEN);
694	}
695
696	wpa_s->show_group_started = 0;
697	if (client) {
698		/*
699		 * Indicate event only after successfully completed 4-way
700		 * handshake, i.e., when the interface is ready for data
701		 * packets.
702		 */
703		wpa_s->show_group_started = 1;
704#ifdef ANDROID_P2P
705		/* For client Second phase of Group formation (4-way handshake) can be still pending
706		 * So we need to restore wpa_s->global->p2p_group_formation */
707		wpa_printf(MSG_INFO, "Restoring back wpa_s->global->p2p_group_formation to wpa_s %p\n", wpa_s);
708		wpa_s->global->p2p_group_formation = wpa_s;
709#endif
710
711	} else if (ssid && ssid->passphrase == NULL && ssid->psk_set) {
712		char psk[65];
713		wpa_snprintf_hex(psk, sizeof(psk), ssid->psk, 32);
714		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
715			"%s GO ssid=\"%s\" freq=%d psk=%s go_dev_addr=" MACSTR
716			"%s",
717			wpa_s->ifname, ssid_txt, ssid->frequency, psk,
718			MAC2STR(go_dev_addr),
719			persistent ? " [PERSISTENT]" : "");
720		wpas_p2p_cross_connect_setup(wpa_s);
721		wpas_p2p_set_group_idle_timeout(wpa_s);
722	} else {
723		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
724			"%s GO ssid=\"%s\" freq=%d passphrase=\"%s\" "
725			"go_dev_addr=" MACSTR "%s",
726			wpa_s->ifname, ssid_txt, ssid ? ssid->frequency : 0,
727			ssid && ssid->passphrase ? ssid->passphrase : "",
728			MAC2STR(go_dev_addr),
729			persistent ? " [PERSISTENT]" : "");
730		wpas_p2p_cross_connect_setup(wpa_s);
731		wpas_p2p_set_group_idle_timeout(wpa_s);
732	}
733
734	if (persistent)
735		network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
736							     ssid, go_dev_addr);
737	if (network_id < 0 && ssid)
738		network_id = ssid->id;
739	if (!client)
740		wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
741}
742
743
744static void wpas_p2p_send_action_tx_status(struct wpa_supplicant *wpa_s,
745					   unsigned int freq,
746					   const u8 *dst, const u8 *src,
747					   const u8 *bssid,
748					   const u8 *data, size_t data_len,
749					   enum offchannel_send_action_result
750					   result)
751{
752	enum p2p_send_action_result res = P2P_SEND_ACTION_SUCCESS;
753
754	if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
755		return;
756	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
757		return;
758
759	switch (result) {
760	case OFFCHANNEL_SEND_ACTION_SUCCESS:
761		res = P2P_SEND_ACTION_SUCCESS;
762		break;
763	case OFFCHANNEL_SEND_ACTION_NO_ACK:
764		res = P2P_SEND_ACTION_NO_ACK;
765		break;
766	case OFFCHANNEL_SEND_ACTION_FAILED:
767		res = P2P_SEND_ACTION_FAILED;
768		break;
769	}
770
771	p2p_send_action_cb(wpa_s->global->p2p, freq, dst, src, bssid, res);
772
773	if (result != OFFCHANNEL_SEND_ACTION_SUCCESS &&
774	    wpa_s->pending_pd_before_join &&
775	    (os_memcmp(dst, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
776	     os_memcmp(dst, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0) &&
777	    wpa_s->p2p_fallback_to_go_neg) {
778		wpa_s->pending_pd_before_join = 0;
779		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No ACK for PD Req "
780			"during p2p_connect-auto");
781		wpas_p2p_fallback_to_go_neg(wpa_s, 0);
782		return;
783	}
784}
785
786
787static int wpas_send_action(void *ctx, unsigned int freq, const u8 *dst,
788			    const u8 *src, const u8 *bssid, const u8 *buf,
789			    size_t len, unsigned int wait_time)
790{
791	struct wpa_supplicant *wpa_s = ctx;
792	return offchannel_send_action(wpa_s, freq, dst, src, bssid, buf, len,
793				      wait_time,
794				      wpas_p2p_send_action_tx_status, 1);
795}
796
797
798static void wpas_send_action_done(void *ctx)
799{
800	struct wpa_supplicant *wpa_s = ctx;
801	offchannel_send_action_done(wpa_s);
802}
803
804
805static int wpas_copy_go_neg_results(struct wpa_supplicant *wpa_s,
806				    struct p2p_go_neg_results *params)
807{
808	if (wpa_s->go_params == NULL) {
809		wpa_s->go_params = os_malloc(sizeof(*params));
810		if (wpa_s->go_params == NULL)
811			return -1;
812	}
813	os_memcpy(wpa_s->go_params, params, sizeof(*params));
814	return 0;
815}
816
817
818static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s,
819				    struct p2p_go_neg_results *res)
820{
821	wpa_printf(MSG_DEBUG, "P2P: Start WPS Enrollee for peer " MACSTR,
822		   MAC2STR(res->peer_interface_addr));
823	wpa_hexdump_ascii(MSG_DEBUG, "P2P: Start WPS Enrollee for SSID",
824			  res->ssid, res->ssid_len);
825	wpa_supplicant_ap_deinit(wpa_s);
826	wpas_copy_go_neg_results(wpa_s, res);
827	if (res->wps_method == WPS_PBC)
828		wpas_wps_start_pbc(wpa_s, res->peer_interface_addr, 1);
829	else {
830		u16 dev_pw_id = DEV_PW_DEFAULT;
831		if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
832			dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED;
833		wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
834				   wpa_s->p2p_pin, 1, dev_pw_id);
835	}
836}
837
838
839static void p2p_go_configured(void *ctx, void *data)
840{
841	struct wpa_supplicant *wpa_s = ctx;
842	struct p2p_go_neg_results *params = data;
843	struct wpa_ssid *ssid;
844	int network_id = -1;
845
846	ssid = wpa_s->current_ssid;
847	if (ssid && ssid->mode == WPAS_MODE_P2P_GO) {
848		wpa_printf(MSG_DEBUG, "P2P: Group setup without provisioning");
849		if (wpa_s->global->p2p_group_formation == wpa_s)
850			wpa_s->global->p2p_group_formation = NULL;
851		if (os_strlen(params->passphrase) > 0) {
852			wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
853				"%s GO ssid=\"%s\" freq=%d passphrase=\"%s\" "
854				"go_dev_addr=" MACSTR "%s", wpa_s->ifname,
855				wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
856				ssid->frequency, params->passphrase,
857				MAC2STR(wpa_s->global->p2p_dev_addr),
858				params->persistent_group ? " [PERSISTENT]" :
859				"");
860		} else {
861			char psk[65];
862			wpa_snprintf_hex(psk, sizeof(psk), params->psk,
863					 sizeof(params->psk));
864			wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
865				"%s GO ssid=\"%s\" freq=%d psk=%s "
866				"go_dev_addr=" MACSTR "%s", wpa_s->ifname,
867				wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
868				ssid->frequency, psk,
869				MAC2STR(wpa_s->global->p2p_dev_addr),
870				params->persistent_group ? " [PERSISTENT]" :
871				"");
872		}
873
874		if (params->persistent_group)
875			network_id = wpas_p2p_store_persistent_group(
876				wpa_s->parent, ssid,
877				wpa_s->global->p2p_dev_addr);
878		if (network_id < 0)
879			network_id = ssid->id;
880		wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
881		wpas_p2p_cross_connect_setup(wpa_s);
882		wpas_p2p_set_group_idle_timeout(wpa_s);
883		return;
884	}
885
886	wpa_printf(MSG_DEBUG, "P2P: Setting up WPS for GO provisioning");
887	if (wpa_supplicant_ap_mac_addr_filter(wpa_s,
888					      params->peer_interface_addr)) {
889		wpa_printf(MSG_DEBUG, "P2P: Failed to setup MAC address "
890			   "filtering");
891		return;
892	}
893	if (params->wps_method == WPS_PBC)
894		wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,
895					  params->peer_device_addr);
896	else if (wpa_s->p2p_pin[0])
897		wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,
898					  wpa_s->p2p_pin, NULL, 0, 0);
899	os_free(wpa_s->go_params);
900	wpa_s->go_params = NULL;
901}
902
903
904static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
905			      struct p2p_go_neg_results *params,
906			      int group_formation)
907{
908	struct wpa_ssid *ssid;
909
910	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Starting GO");
911	if (wpas_copy_go_neg_results(wpa_s, params) < 0) {
912		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not copy GO Negotiation "
913			"results");
914		return;
915	}
916
917	ssid = wpa_config_add_network(wpa_s->conf);
918	if (ssid == NULL) {
919		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not add network for GO");
920		return;
921	}
922
923	wpa_s->show_group_started = 0;
924
925	wpa_config_set_network_defaults(ssid);
926	ssid->temporary = 1;
927	ssid->p2p_group = 1;
928	ssid->p2p_persistent_group = params->persistent_group;
929	ssid->mode = group_formation ? WPAS_MODE_P2P_GROUP_FORMATION :
930		WPAS_MODE_P2P_GO;
931	ssid->frequency = params->freq;
932	ssid->ht40 = params->ht40;
933	ssid->ssid = os_zalloc(params->ssid_len + 1);
934	if (ssid->ssid) {
935		os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
936		ssid->ssid_len = params->ssid_len;
937	}
938	ssid->auth_alg = WPA_AUTH_ALG_OPEN;
939	ssid->key_mgmt = WPA_KEY_MGMT_PSK;
940	ssid->proto = WPA_PROTO_RSN;
941	ssid->pairwise_cipher = WPA_CIPHER_CCMP;
942	if (os_strlen(params->passphrase) > 0) {
943		ssid->passphrase = os_strdup(params->passphrase);
944		if (ssid->passphrase == NULL) {
945			wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to copy "
946				"passphrase for GO");
947			wpa_config_remove_network(wpa_s->conf, ssid->id);
948			return;
949		}
950	} else
951		ssid->passphrase = NULL;
952	ssid->psk_set = params->psk_set;
953	if (ssid->psk_set)
954		os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk));
955	else if (ssid->passphrase)
956		wpa_config_update_psk(ssid);
957	ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
958
959	wpa_s->ap_configured_cb = p2p_go_configured;
960	wpa_s->ap_configured_cb_ctx = wpa_s;
961	wpa_s->ap_configured_cb_data = wpa_s->go_params;
962	wpa_s->connect_without_scan = ssid;
963	wpa_s->reassociate = 1;
964	wpa_s->disconnected = 0;
965	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Request scan (that will be skipped) to "
966		"start GO)");
967	wpa_supplicant_req_scan(wpa_s, 0, 0);
968}
969
970
971static void wpas_p2p_clone_config(struct wpa_supplicant *dst,
972				  const struct wpa_supplicant *src)
973{
974	struct wpa_config *d;
975	const struct wpa_config *s;
976
977	d = dst->conf;
978	s = src->conf;
979
980#define C(n) if (s->n) d->n = os_strdup(s->n)
981	C(device_name);
982	C(manufacturer);
983	C(model_name);
984	C(model_number);
985	C(serial_number);
986	C(config_methods);
987#undef C
988
989	os_memcpy(d->device_type, s->device_type, WPS_DEV_TYPE_LEN);
990	os_memcpy(d->sec_device_type, s->sec_device_type,
991		  sizeof(d->sec_device_type));
992	d->num_sec_device_types = s->num_sec_device_types;
993
994	d->p2p_group_idle = s->p2p_group_idle;
995	d->p2p_intra_bss = s->p2p_intra_bss;
996	d->persistent_reconnect = s->persistent_reconnect;
997	d->max_num_sta = s->max_num_sta;
998	d->pbc_in_m1 = s->pbc_in_m1;
999	d->ignore_old_scan_res = s->ignore_old_scan_res;
1000}
1001
1002
1003static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s,
1004					enum wpa_driver_if_type type)
1005{
1006	char ifname[120], force_ifname[120];
1007
1008	if (wpa_s->pending_interface_name[0]) {
1009		wpa_printf(MSG_DEBUG, "P2P: Pending virtual interface exists "
1010			   "- skip creation of a new one");
1011		if (is_zero_ether_addr(wpa_s->pending_interface_addr)) {
1012			wpa_printf(MSG_DEBUG, "P2P: Pending virtual address "
1013				   "unknown?! ifname='%s'",
1014				   wpa_s->pending_interface_name);
1015			return -1;
1016		}
1017		return 0;
1018	}
1019
1020	os_snprintf(ifname, sizeof(ifname), "p2p-%s-%d", wpa_s->ifname,
1021		    wpa_s->p2p_group_idx);
1022	if (os_strlen(ifname) >= IFNAMSIZ &&
1023	    os_strlen(wpa_s->ifname) < IFNAMSIZ) {
1024		/* Try to avoid going over the IFNAMSIZ length limit */
1025		os_snprintf(ifname, sizeof(ifname), "p2p-%d",
1026			    wpa_s->p2p_group_idx);
1027	}
1028	force_ifname[0] = '\0';
1029
1030	wpa_printf(MSG_DEBUG, "P2P: Create a new interface %s for the group",
1031		   ifname);
1032	wpa_s->p2p_group_idx++;
1033
1034	wpa_s->pending_interface_type = type;
1035	if (wpa_drv_if_add(wpa_s, type, ifname, NULL, NULL, force_ifname,
1036			   wpa_s->pending_interface_addr, NULL) < 0) {
1037		wpa_printf(MSG_ERROR, "P2P: Failed to create new group "
1038			   "interface");
1039		return -1;
1040	}
1041
1042	if (force_ifname[0]) {
1043		wpa_printf(MSG_DEBUG, "P2P: Driver forced interface name %s",
1044			   force_ifname);
1045		os_strlcpy(wpa_s->pending_interface_name, force_ifname,
1046			   sizeof(wpa_s->pending_interface_name));
1047	} else
1048		os_strlcpy(wpa_s->pending_interface_name, ifname,
1049			   sizeof(wpa_s->pending_interface_name));
1050	wpa_printf(MSG_DEBUG, "P2P: Created pending virtual interface %s addr "
1051		   MACSTR, wpa_s->pending_interface_name,
1052		   MAC2STR(wpa_s->pending_interface_addr));
1053
1054	return 0;
1055}
1056
1057
1058static void wpas_p2p_remove_pending_group_interface(
1059	struct wpa_supplicant *wpa_s)
1060{
1061	if (!wpa_s->pending_interface_name[0] ||
1062	    is_zero_ether_addr(wpa_s->pending_interface_addr))
1063		return; /* No pending virtual interface */
1064
1065	wpa_printf(MSG_DEBUG, "P2P: Removing pending group interface %s",
1066		   wpa_s->pending_interface_name);
1067	wpa_drv_if_remove(wpa_s, wpa_s->pending_interface_type,
1068			  wpa_s->pending_interface_name);
1069	os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
1070	wpa_s->pending_interface_name[0] = '\0';
1071}
1072
1073
1074static struct wpa_supplicant *
1075wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go)
1076{
1077	struct wpa_interface iface;
1078	struct wpa_supplicant *group_wpa_s;
1079
1080	if (!wpa_s->pending_interface_name[0]) {
1081		wpa_printf(MSG_ERROR, "P2P: No pending group interface");
1082		if (!wpas_p2p_create_iface(wpa_s))
1083			return NULL;
1084		/*
1085		 * Something has forced us to remove the pending interface; try
1086		 * to create a new one and hope for the best that we will get
1087		 * the same local address.
1088		 */
1089		if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
1090						 WPA_IF_P2P_CLIENT) < 0)
1091			return NULL;
1092	}
1093
1094	os_memset(&iface, 0, sizeof(iface));
1095	iface.ifname = wpa_s->pending_interface_name;
1096	iface.driver = wpa_s->driver->name;
1097	iface.ctrl_interface = wpa_s->conf->ctrl_interface;
1098	iface.driver_param = wpa_s->conf->driver_param;
1099	group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
1100	if (group_wpa_s == NULL) {
1101		wpa_printf(MSG_ERROR, "P2P: Failed to create new "
1102			   "wpa_supplicant interface");
1103		return NULL;
1104	}
1105	wpa_s->pending_interface_name[0] = '\0';
1106	group_wpa_s->parent = wpa_s;
1107	group_wpa_s->p2p_group_interface = go ? P2P_GROUP_INTERFACE_GO :
1108		P2P_GROUP_INTERFACE_CLIENT;
1109	wpa_s->global->p2p_group_formation = group_wpa_s;
1110
1111	wpas_p2p_clone_config(group_wpa_s, wpa_s);
1112
1113	return group_wpa_s;
1114}
1115
1116
1117static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
1118					     void *timeout_ctx)
1119{
1120	struct wpa_supplicant *wpa_s = eloop_ctx;
1121	wpa_printf(MSG_DEBUG, "P2P: Group Formation timed out");
1122	if (wpa_s->global->p2p)
1123		p2p_group_formation_failed(wpa_s->global->p2p);
1124	else if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
1125		wpa_drv_p2p_group_formation_failed(wpa_s);
1126	wpas_group_formation_completed(wpa_s, 0);
1127}
1128
1129
1130void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
1131{
1132	struct wpa_supplicant *wpa_s = ctx;
1133
1134	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
1135		wpa_drv_cancel_remain_on_channel(wpa_s);
1136		wpa_s->off_channel_freq = 0;
1137		wpa_s->roc_waiting_drv_freq = 0;
1138	}
1139
1140	if (res->status) {
1141		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_FAILURE "status=%d",
1142			res->status);
1143		wpas_notify_p2p_go_neg_completed(wpa_s, res);
1144		wpas_p2p_remove_pending_group_interface(wpa_s);
1145		return;
1146	}
1147
1148	if (wpa_s->p2p_go_ht40)
1149		res->ht40 = 1;
1150
1151	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS);
1152	wpas_notify_p2p_go_neg_completed(wpa_s, res);
1153
1154	if (res->role_go && wpa_s->p2p_persistent_id >= 0) {
1155		struct wpa_ssid *ssid;
1156		ssid = wpa_config_get_network(wpa_s->conf,
1157					      wpa_s->p2p_persistent_id);
1158		if (ssid && ssid->disabled == 2 &&
1159		    ssid->mode == WPAS_MODE_P2P_GO && ssid->passphrase) {
1160			size_t len = os_strlen(ssid->passphrase);
1161			wpa_printf(MSG_DEBUG, "P2P: Override passphrase based "
1162				   "on requested persistent group");
1163			os_memcpy(res->passphrase, ssid->passphrase, len);
1164			res->passphrase[len] = '\0';
1165		}
1166	}
1167
1168	if (wpa_s->create_p2p_iface) {
1169		struct wpa_supplicant *group_wpa_s =
1170			wpas_p2p_init_group_interface(wpa_s, res->role_go);
1171		if (group_wpa_s == NULL) {
1172			wpas_p2p_remove_pending_group_interface(wpa_s);
1173			return;
1174		}
1175		if (group_wpa_s != wpa_s) {
1176			os_memcpy(group_wpa_s->p2p_pin, wpa_s->p2p_pin,
1177				  sizeof(group_wpa_s->p2p_pin));
1178			group_wpa_s->p2p_wps_method = wpa_s->p2p_wps_method;
1179		}
1180		os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
1181		wpa_s->pending_interface_name[0] = '\0';
1182		group_wpa_s->p2p_in_provisioning = 1;
1183
1184		if (res->role_go)
1185			wpas_start_wps_go(group_wpa_s, res, 1);
1186		else
1187			wpas_start_wps_enrollee(group_wpa_s, res);
1188	} else {
1189		wpa_s->p2p_in_provisioning = 1;
1190		wpa_s->global->p2p_group_formation = wpa_s;
1191
1192		if (res->role_go)
1193			wpas_start_wps_go(wpa_s, res, 1);
1194		else
1195			wpas_start_wps_enrollee(ctx, res);
1196	}
1197
1198	wpa_s->p2p_long_listen = 0;
1199	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
1200
1201	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
1202	eloop_register_timeout(15 + res->peer_config_timeout / 100,
1203			       (res->peer_config_timeout % 100) * 10000,
1204			       wpas_p2p_group_formation_timeout, wpa_s, NULL);
1205}
1206
1207
1208void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id)
1209{
1210	struct wpa_supplicant *wpa_s = ctx;
1211	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR
1212		" dev_passwd_id=%u", MAC2STR(src), dev_passwd_id);
1213
1214	wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id);
1215}
1216
1217
1218void wpas_dev_found(void *ctx, const u8 *addr,
1219		    const struct p2p_peer_info *info,
1220		    int new_device)
1221{
1222#ifndef CONFIG_NO_STDOUT_DEBUG
1223	struct wpa_supplicant *wpa_s = ctx;
1224	char devtype[WPS_DEV_TYPE_BUFSIZE];
1225#define WFD_DEV_INFO_SIZE 9
1226	char wfd_dev_info_hex[2 * WFD_DEV_INFO_SIZE + 1];
1227	os_memset(wfd_dev_info_hex, 0, sizeof(wfd_dev_info_hex));
1228#ifdef CONFIG_WIFI_DISPLAY
1229	if (info->wfd_subelems) {
1230		wpa_snprintf_hex(wfd_dev_info_hex, sizeof(wfd_dev_info_hex),
1231					wpabuf_head(info->wfd_subelems),
1232					WFD_DEV_INFO_SIZE);
1233	}
1234#endif /* CONFIG_WIFI_DISPLAY */
1235	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_FOUND MACSTR
1236		" p2p_dev_addr=" MACSTR
1237		" pri_dev_type=%s name='%s' config_methods=0x%x "
1238		"dev_capab=0x%x group_capab=0x%x%s%s",
1239		MAC2STR(addr), MAC2STR(info->p2p_device_addr),
1240		wps_dev_type_bin2str(info->pri_dev_type, devtype,
1241				     sizeof(devtype)),
1242		info->device_name, info->config_methods,
1243		info->dev_capab, info->group_capab,
1244		wfd_dev_info_hex[0] ? " wfd_dev_info=0x" : "", wfd_dev_info_hex);
1245#endif /* CONFIG_NO_STDOUT_DEBUG */
1246
1247	wpas_notify_p2p_device_found(ctx, info->p2p_device_addr, new_device);
1248}
1249
1250
1251static void wpas_dev_lost(void *ctx, const u8 *dev_addr)
1252{
1253	struct wpa_supplicant *wpa_s = ctx;
1254
1255	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_LOST
1256		"p2p_dev_addr=" MACSTR, MAC2STR(dev_addr));
1257
1258	wpas_notify_p2p_device_lost(wpa_s, dev_addr);
1259}
1260
1261
1262static int wpas_start_listen(void *ctx, unsigned int freq,
1263			     unsigned int duration,
1264			     const struct wpabuf *probe_resp_ie)
1265{
1266	struct wpa_supplicant *wpa_s = ctx;
1267
1268	wpa_drv_set_ap_wps_ie(wpa_s, NULL, probe_resp_ie, NULL);
1269
1270	if (wpa_drv_probe_req_report(wpa_s, 1) < 0) {
1271		wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver to "
1272			   "report received Probe Request frames");
1273		return -1;
1274	}
1275
1276	wpa_s->pending_listen_freq = freq;
1277	wpa_s->pending_listen_duration = duration;
1278
1279	if (wpa_drv_remain_on_channel(wpa_s, freq, duration) < 0) {
1280		wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver "
1281			   "to remain on channel (%u MHz) for Listen "
1282			   "state", freq);
1283		wpa_s->pending_listen_freq = 0;
1284		return -1;
1285	}
1286	wpa_s->off_channel_freq = 0;
1287	wpa_s->roc_waiting_drv_freq = freq;
1288
1289	return 0;
1290}
1291
1292
1293static void wpas_stop_listen(void *ctx)
1294{
1295	struct wpa_supplicant *wpa_s = ctx;
1296	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
1297		wpa_drv_cancel_remain_on_channel(wpa_s);
1298		wpa_s->off_channel_freq = 0;
1299		wpa_s->roc_waiting_drv_freq = 0;
1300	}
1301	wpa_drv_set_ap_wps_ie(wpa_s, NULL, NULL, NULL);
1302	wpa_drv_probe_req_report(wpa_s, 0);
1303}
1304
1305
1306static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf)
1307{
1308	struct wpa_supplicant *wpa_s = ctx;
1309	return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1);
1310}
1311
1312
1313/*
1314 * DNS Header section is used only to calculate compression pointers, so the
1315 * contents of this data does not matter, but the length needs to be reserved
1316 * in the virtual packet.
1317 */
1318#define DNS_HEADER_LEN 12
1319
1320/*
1321 * 27-octet in-memory packet from P2P specification containing two implied
1322 * queries for _tcp.lcoal. PTR IN and _udp.local. PTR IN
1323 */
1324#define P2P_SD_IN_MEMORY_LEN 27
1325
1326static int p2p_sd_dns_uncompress_label(char **upos, char *uend, u8 *start,
1327				       u8 **spos, const u8 *end)
1328{
1329	while (*spos < end) {
1330		u8 val = ((*spos)[0] & 0xc0) >> 6;
1331		int len;
1332
1333		if (val == 1 || val == 2) {
1334			/* These are reserved values in RFC 1035 */
1335			wpa_printf(MSG_DEBUG, "P2P: Invalid domain name "
1336				   "sequence starting with 0x%x", val);
1337			return -1;
1338		}
1339
1340		if (val == 3) {
1341			u16 offset;
1342			u8 *spos_tmp;
1343
1344			/* Offset */
1345			if (*spos + 2 > end) {
1346				wpa_printf(MSG_DEBUG, "P2P: No room for full "
1347					   "DNS offset field");
1348				return -1;
1349			}
1350
1351			offset = (((*spos)[0] & 0x3f) << 8) | (*spos)[1];
1352			if (offset >= *spos - start) {
1353				wpa_printf(MSG_DEBUG, "P2P: Invalid DNS "
1354					   "pointer offset %u", offset);
1355				return -1;
1356			}
1357
1358			(*spos) += 2;
1359			spos_tmp = start + offset;
1360			return p2p_sd_dns_uncompress_label(upos, uend, start,
1361							   &spos_tmp,
1362							   *spos - 2);
1363		}
1364
1365		/* Label */
1366		len = (*spos)[0] & 0x3f;
1367		if (len == 0)
1368			return 0;
1369
1370		(*spos)++;
1371		if (*spos + len > end) {
1372			wpa_printf(MSG_DEBUG, "P2P: Invalid domain name "
1373				   "sequence - no room for label with length "
1374				   "%u", len);
1375			return -1;
1376		}
1377
1378		if (*upos + len + 2 > uend)
1379			return -2;
1380
1381		os_memcpy(*upos, *spos, len);
1382		*spos += len;
1383		*upos += len;
1384		(*upos)[0] = '.';
1385		(*upos)++;
1386		(*upos)[0] = '\0';
1387	}
1388
1389	return 0;
1390}
1391
1392
1393/* Uncompress domain names per RFC 1035 using the P2P SD in-memory packet.
1394 * Returns -1 on parsing error (invalid input sequence), -2 if output buffer is
1395 * not large enough */
1396static int p2p_sd_dns_uncompress(char *buf, size_t buf_len, const u8 *msg,
1397				 size_t msg_len, size_t offset)
1398{
1399	/* 27-octet in-memory packet from P2P specification */
1400	const char *prefix = "\x04_tcp\x05local\x00\x00\x0C\x00\x01"
1401		"\x04_udp\xC0\x11\x00\x0C\x00\x01";
1402	u8 *tmp, *end, *spos;
1403	char *upos, *uend;
1404	int ret = 0;
1405
1406	if (buf_len < 2)
1407		return -1;
1408	if (offset > msg_len)
1409		return -1;
1410
1411	tmp = os_malloc(DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN + msg_len);
1412	if (tmp == NULL)
1413		return -1;
1414	spos = tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN;
1415	end = spos + msg_len;
1416	spos += offset;
1417
1418	os_memset(tmp, 0, DNS_HEADER_LEN);
1419	os_memcpy(tmp + DNS_HEADER_LEN, prefix, P2P_SD_IN_MEMORY_LEN);
1420	os_memcpy(tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN, msg, msg_len);
1421
1422	upos = buf;
1423	uend = buf + buf_len;
1424
1425	ret = p2p_sd_dns_uncompress_label(&upos, uend, tmp, &spos, end);
1426	if (ret) {
1427		os_free(tmp);
1428		return ret;
1429	}
1430
1431	if (upos == buf) {
1432		upos[0] = '.';
1433		upos[1] = '\0';
1434	} else if (upos[-1] == '.')
1435		upos[-1] = '\0';
1436
1437	os_free(tmp);
1438	return 0;
1439}
1440
1441
1442static struct p2p_srv_bonjour *
1443wpas_p2p_service_get_bonjour(struct wpa_supplicant *wpa_s,
1444			     const struct wpabuf *query)
1445{
1446	struct p2p_srv_bonjour *bsrv;
1447	size_t len;
1448
1449	len = wpabuf_len(query);
1450	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
1451			 struct p2p_srv_bonjour, list) {
1452		if (len == wpabuf_len(bsrv->query) &&
1453		    os_memcmp(wpabuf_head(query), wpabuf_head(bsrv->query),
1454			      len) == 0)
1455			return bsrv;
1456	}
1457	return NULL;
1458}
1459
1460
1461static struct p2p_srv_upnp *
1462wpas_p2p_service_get_upnp(struct wpa_supplicant *wpa_s, u8 version,
1463			  const char *service)
1464{
1465	struct p2p_srv_upnp *usrv;
1466
1467	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
1468			 struct p2p_srv_upnp, list) {
1469		if (version == usrv->version &&
1470		    os_strcmp(service, usrv->service) == 0)
1471			return usrv;
1472	}
1473	return NULL;
1474}
1475
1476
1477static void wpas_sd_add_proto_not_avail(struct wpabuf *resp, u8 srv_proto,
1478					u8 srv_trans_id)
1479{
1480	u8 *len_pos;
1481
1482	if (wpabuf_tailroom(resp) < 5)
1483		return;
1484
1485	/* Length (to be filled) */
1486	len_pos = wpabuf_put(resp, 2);
1487	wpabuf_put_u8(resp, srv_proto);
1488	wpabuf_put_u8(resp, srv_trans_id);
1489	/* Status Code */
1490	wpabuf_put_u8(resp, P2P_SD_PROTO_NOT_AVAILABLE);
1491	/* Response Data: empty */
1492	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
1493}
1494
1495
1496static void wpas_sd_all_bonjour(struct wpa_supplicant *wpa_s,
1497				struct wpabuf *resp, u8 srv_trans_id)
1498{
1499	struct p2p_srv_bonjour *bsrv;
1500	u8 *len_pos;
1501
1502	wpa_printf(MSG_DEBUG, "P2P: SD Request for all Bonjour services");
1503
1504	if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
1505		wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available");
1506		return;
1507	}
1508
1509	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
1510			 struct p2p_srv_bonjour, list) {
1511		if (wpabuf_tailroom(resp) <
1512		    5 + wpabuf_len(bsrv->query) + wpabuf_len(bsrv->resp))
1513			return;
1514		/* Length (to be filled) */
1515		len_pos = wpabuf_put(resp, 2);
1516		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
1517		wpabuf_put_u8(resp, srv_trans_id);
1518		/* Status Code */
1519		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
1520		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service",
1521				  wpabuf_head(bsrv->resp),
1522				  wpabuf_len(bsrv->resp));
1523		/* Response Data */
1524		wpabuf_put_buf(resp, bsrv->query); /* Key */
1525		wpabuf_put_buf(resp, bsrv->resp); /* Value */
1526		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
1527			     2);
1528	}
1529}
1530
1531
1532static int match_bonjour_query(struct p2p_srv_bonjour *bsrv, const u8 *query,
1533			       size_t query_len)
1534{
1535	char str_rx[256], str_srv[256];
1536
1537	if (query_len < 3 || wpabuf_len(bsrv->query) < 3)
1538		return 0; /* Too short to include DNS Type and Version */
1539	if (os_memcmp(query + query_len - 3,
1540		      wpabuf_head_u8(bsrv->query) + wpabuf_len(bsrv->query) - 3,
1541		      3) != 0)
1542		return 0; /* Mismatch in DNS Type or Version */
1543	if (query_len == wpabuf_len(bsrv->query) &&
1544	    os_memcmp(query, wpabuf_head(bsrv->query), query_len - 3) == 0)
1545		return 1; /* Binary match */
1546
1547	if (p2p_sd_dns_uncompress(str_rx, sizeof(str_rx), query, query_len - 3,
1548				  0))
1549		return 0; /* Failed to uncompress query */
1550	if (p2p_sd_dns_uncompress(str_srv, sizeof(str_srv),
1551				  wpabuf_head(bsrv->query),
1552				  wpabuf_len(bsrv->query) - 3, 0))
1553		return 0; /* Failed to uncompress service */
1554
1555	return os_strcmp(str_rx, str_srv) == 0;
1556}
1557
1558
1559static void wpas_sd_req_bonjour(struct wpa_supplicant *wpa_s,
1560				struct wpabuf *resp, u8 srv_trans_id,
1561				const u8 *query, size_t query_len)
1562{
1563	struct p2p_srv_bonjour *bsrv;
1564	u8 *len_pos;
1565	int matches = 0;
1566
1567	wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for Bonjour",
1568			  query, query_len);
1569	if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
1570		wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available");
1571		wpas_sd_add_proto_not_avail(resp, P2P_SERV_BONJOUR,
1572					    srv_trans_id);
1573		return;
1574	}
1575
1576	if (query_len == 0) {
1577		wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
1578		return;
1579	}
1580
1581	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
1582			 struct p2p_srv_bonjour, list) {
1583		if (!match_bonjour_query(bsrv, query, query_len))
1584			continue;
1585
1586		if (wpabuf_tailroom(resp) <
1587		    5 + query_len + wpabuf_len(bsrv->resp))
1588			return;
1589
1590		matches++;
1591
1592		/* Length (to be filled) */
1593		len_pos = wpabuf_put(resp, 2);
1594		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
1595		wpabuf_put_u8(resp, srv_trans_id);
1596
1597		/* Status Code */
1598		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
1599		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service",
1600				  wpabuf_head(bsrv->resp),
1601				  wpabuf_len(bsrv->resp));
1602
1603		/* Response Data */
1604		wpabuf_put_data(resp, query, query_len); /* Key */
1605		wpabuf_put_buf(resp, bsrv->resp); /* Value */
1606
1607		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
1608	}
1609
1610	if (matches == 0) {
1611		wpa_printf(MSG_DEBUG, "P2P: Requested Bonjour service not "
1612			   "available");
1613		if (wpabuf_tailroom(resp) < 5)
1614			return;
1615
1616		/* Length (to be filled) */
1617		len_pos = wpabuf_put(resp, 2);
1618		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
1619		wpabuf_put_u8(resp, srv_trans_id);
1620
1621		/* Status Code */
1622		wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
1623		/* Response Data: empty */
1624		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
1625			     2);
1626	}
1627}
1628
1629
1630static void wpas_sd_all_upnp(struct wpa_supplicant *wpa_s,
1631			     struct wpabuf *resp, u8 srv_trans_id)
1632{
1633	struct p2p_srv_upnp *usrv;
1634	u8 *len_pos;
1635
1636	wpa_printf(MSG_DEBUG, "P2P: SD Request for all UPnP services");
1637
1638	if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
1639		wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available");
1640		return;
1641	}
1642
1643	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
1644			 struct p2p_srv_upnp, list) {
1645		if (wpabuf_tailroom(resp) < 5 + 1 + os_strlen(usrv->service))
1646			return;
1647
1648		/* Length (to be filled) */
1649		len_pos = wpabuf_put(resp, 2);
1650		wpabuf_put_u8(resp, P2P_SERV_UPNP);
1651		wpabuf_put_u8(resp, srv_trans_id);
1652
1653		/* Status Code */
1654		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
1655		/* Response Data */
1656		wpabuf_put_u8(resp, usrv->version);
1657		wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s",
1658			   usrv->service);
1659		wpabuf_put_str(resp, usrv->service);
1660		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
1661			     2);
1662	}
1663}
1664
1665
1666static void wpas_sd_req_upnp(struct wpa_supplicant *wpa_s,
1667			     struct wpabuf *resp, u8 srv_trans_id,
1668			     const u8 *query, size_t query_len)
1669{
1670	struct p2p_srv_upnp *usrv;
1671	u8 *len_pos;
1672	u8 version;
1673	char *str;
1674	int count = 0;
1675
1676	wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for UPnP",
1677			  query, query_len);
1678
1679	if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
1680		wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available");
1681		wpas_sd_add_proto_not_avail(resp, P2P_SERV_UPNP,
1682					    srv_trans_id);
1683		return;
1684	}
1685
1686	if (query_len == 0) {
1687		wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
1688		return;
1689	}
1690
1691	if (wpabuf_tailroom(resp) < 5)
1692		return;
1693
1694	/* Length (to be filled) */
1695	len_pos = wpabuf_put(resp, 2);
1696	wpabuf_put_u8(resp, P2P_SERV_UPNP);
1697	wpabuf_put_u8(resp, srv_trans_id);
1698
1699	version = query[0];
1700	str = os_malloc(query_len);
1701	if (str == NULL)
1702		return;
1703	os_memcpy(str, query + 1, query_len - 1);
1704	str[query_len - 1] = '\0';
1705
1706	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
1707			 struct p2p_srv_upnp, list) {
1708		if (version != usrv->version)
1709			continue;
1710
1711		if (os_strcmp(str, "ssdp:all") != 0 &&
1712		    os_strstr(usrv->service, str) == NULL)
1713			continue;
1714
1715		if (wpabuf_tailroom(resp) < 2)
1716			break;
1717		if (count == 0) {
1718			/* Status Code */
1719			wpabuf_put_u8(resp, P2P_SD_SUCCESS);
1720			/* Response Data */
1721			wpabuf_put_u8(resp, version);
1722		} else
1723			wpabuf_put_u8(resp, ',');
1724
1725		count++;
1726
1727		wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s",
1728			   usrv->service);
1729		if (wpabuf_tailroom(resp) < os_strlen(usrv->service))
1730			break;
1731		wpabuf_put_str(resp, usrv->service);
1732	}
1733	os_free(str);
1734
1735	if (count == 0) {
1736		wpa_printf(MSG_DEBUG, "P2P: Requested UPnP service not "
1737			   "available");
1738		/* Status Code */
1739		wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
1740		/* Response Data: empty */
1741	}
1742
1743	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
1744}
1745
1746
1747#ifdef CONFIG_WIFI_DISPLAY
1748static void wpas_sd_req_wfd(struct wpa_supplicant *wpa_s,
1749			    struct wpabuf *resp, u8 srv_trans_id,
1750			    const u8 *query, size_t query_len)
1751{
1752	const u8 *pos;
1753	u8 role;
1754	u8 *len_pos;
1755
1756	wpa_hexdump(MSG_DEBUG, "P2P: SD Request for WFD", query, query_len);
1757
1758	if (!wpa_s->global->wifi_display) {
1759		wpa_printf(MSG_DEBUG, "P2P: WFD protocol not available");
1760		wpas_sd_add_proto_not_avail(resp, P2P_SERV_WIFI_DISPLAY,
1761					    srv_trans_id);
1762		return;
1763	}
1764
1765	if (query_len < 1) {
1766		wpa_printf(MSG_DEBUG, "P2P: Missing WFD Requested Device "
1767			   "Role");
1768		return;
1769	}
1770
1771	if (wpabuf_tailroom(resp) < 5)
1772		return;
1773
1774	pos = query;
1775	role = *pos++;
1776	wpa_printf(MSG_DEBUG, "P2P: WSD for device role 0x%x", role);
1777
1778	/* TODO: role specific handling */
1779
1780	/* Length (to be filled) */
1781	len_pos = wpabuf_put(resp, 2);
1782	wpabuf_put_u8(resp, P2P_SERV_WIFI_DISPLAY);
1783	wpabuf_put_u8(resp, srv_trans_id);
1784	wpabuf_put_u8(resp, P2P_SD_SUCCESS); /* Status Code */
1785
1786	while (pos < query + query_len) {
1787		if (*pos < MAX_WFD_SUBELEMS &&
1788		    wpa_s->global->wfd_subelem[*pos] &&
1789		    wpabuf_tailroom(resp) >=
1790		    wpabuf_len(wpa_s->global->wfd_subelem[*pos])) {
1791			wpa_printf(MSG_DEBUG, "P2P: Add WSD response "
1792				   "subelement %u", *pos);
1793			wpabuf_put_buf(resp, wpa_s->global->wfd_subelem[*pos]);
1794		}
1795		pos++;
1796	}
1797
1798	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
1799}
1800#endif /* CONFIG_WIFI_DISPLAY */
1801
1802
1803void wpas_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token,
1804		     u16 update_indic, const u8 *tlvs, size_t tlvs_len)
1805{
1806	struct wpa_supplicant *wpa_s = ctx;
1807	const u8 *pos = tlvs;
1808	const u8 *end = tlvs + tlvs_len;
1809	const u8 *tlv_end;
1810	u16 slen;
1811	struct wpabuf *resp;
1812	u8 srv_proto, srv_trans_id;
1813	size_t buf_len;
1814	char *buf;
1815
1816	wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Request TLVs",
1817		    tlvs, tlvs_len);
1818	buf_len = 2 * tlvs_len + 1;
1819	buf = os_malloc(buf_len);
1820	if (buf) {
1821		wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
1822		wpa_msg_ctrl(wpa_s, MSG_INFO, P2P_EVENT_SERV_DISC_REQ "%d "
1823			     MACSTR " %u %u %s",
1824			     freq, MAC2STR(sa), dialog_token, update_indic,
1825			     buf);
1826		os_free(buf);
1827	}
1828
1829	if (wpa_s->p2p_sd_over_ctrl_iface) {
1830		wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
1831					   update_indic, tlvs, tlvs_len);
1832		return; /* to be processed by an external program */
1833	}
1834
1835	resp = wpabuf_alloc(10000);
1836	if (resp == NULL)
1837		return;
1838
1839	while (pos + 1 < end) {
1840		wpa_printf(MSG_DEBUG, "P2P: Service Request TLV");
1841		slen = WPA_GET_LE16(pos);
1842		pos += 2;
1843		if (pos + slen > end || slen < 2) {
1844			wpa_printf(MSG_DEBUG, "P2P: Unexpected Query Data "
1845				   "length");
1846			wpabuf_free(resp);
1847			return;
1848		}
1849		tlv_end = pos + slen;
1850
1851		srv_proto = *pos++;
1852		wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u",
1853			   srv_proto);
1854		srv_trans_id = *pos++;
1855		wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u",
1856			   srv_trans_id);
1857
1858		wpa_hexdump(MSG_MSGDUMP, "P2P: Query Data",
1859			    pos, tlv_end - pos);
1860
1861
1862		if (wpa_s->force_long_sd) {
1863			wpa_printf(MSG_DEBUG, "P2P: SD test - force long "
1864				   "response");
1865			wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
1866			wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
1867			goto done;
1868		}
1869
1870		switch (srv_proto) {
1871		case P2P_SERV_ALL_SERVICES:
1872			wpa_printf(MSG_DEBUG, "P2P: Service Discovery Request "
1873				   "for all services");
1874			if (dl_list_empty(&wpa_s->global->p2p_srv_upnp) &&
1875			    dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
1876				wpa_printf(MSG_DEBUG, "P2P: No service "
1877					   "discovery protocols available");
1878				wpas_sd_add_proto_not_avail(
1879					resp, P2P_SERV_ALL_SERVICES,
1880					srv_trans_id);
1881				break;
1882			}
1883			wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
1884			wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
1885			break;
1886		case P2P_SERV_BONJOUR:
1887			wpas_sd_req_bonjour(wpa_s, resp, srv_trans_id,
1888					    pos, tlv_end - pos);
1889			break;
1890		case P2P_SERV_UPNP:
1891			wpas_sd_req_upnp(wpa_s, resp, srv_trans_id,
1892					 pos, tlv_end - pos);
1893			break;
1894#ifdef CONFIG_WIFI_DISPLAY
1895		case P2P_SERV_WIFI_DISPLAY:
1896			wpas_sd_req_wfd(wpa_s, resp, srv_trans_id,
1897					pos, tlv_end - pos);
1898			break;
1899#endif /* CONFIG_WIFI_DISPLAY */
1900		default:
1901			wpa_printf(MSG_DEBUG, "P2P: Unavailable service "
1902				   "protocol %u", srv_proto);
1903			wpas_sd_add_proto_not_avail(resp, srv_proto,
1904						    srv_trans_id);
1905			break;
1906		}
1907
1908		pos = tlv_end;
1909	}
1910
1911done:
1912	wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
1913				   update_indic, tlvs, tlvs_len);
1914
1915	wpas_p2p_sd_response(wpa_s, freq, sa, dialog_token, resp);
1916
1917	wpabuf_free(resp);
1918}
1919
1920
1921void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic,
1922		      const u8 *tlvs, size_t tlvs_len)
1923{
1924	struct wpa_supplicant *wpa_s = ctx;
1925	const u8 *pos = tlvs;
1926	const u8 *end = tlvs + tlvs_len;
1927	const u8 *tlv_end;
1928	u16 slen;
1929	size_t buf_len;
1930	char *buf;
1931
1932	wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Response TLVs",
1933		    tlvs, tlvs_len);
1934	if (tlvs_len > 1500) {
1935		/* TODO: better way for handling this */
1936		wpa_msg_ctrl(wpa_s, MSG_INFO,
1937			     P2P_EVENT_SERV_DISC_RESP MACSTR
1938			     " %u <long response: %u bytes>",
1939			     MAC2STR(sa), update_indic,
1940			     (unsigned int) tlvs_len);
1941	} else {
1942		buf_len = 2 * tlvs_len + 1;
1943		buf = os_malloc(buf_len);
1944		if (buf) {
1945			wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
1946			wpa_msg_ctrl(wpa_s, MSG_INFO,
1947				     P2P_EVENT_SERV_DISC_RESP MACSTR " %u %s",
1948				     MAC2STR(sa), update_indic, buf);
1949			os_free(buf);
1950		}
1951	}
1952
1953	while (pos < end) {
1954		u8 srv_proto, srv_trans_id, status;
1955
1956		wpa_printf(MSG_DEBUG, "P2P: Service Response TLV");
1957		slen = WPA_GET_LE16(pos);
1958		pos += 2;
1959		if (pos + slen > end || slen < 3) {
1960			wpa_printf(MSG_DEBUG, "P2P: Unexpected Response Data "
1961				   "length");
1962			return;
1963		}
1964		tlv_end = pos + slen;
1965
1966		srv_proto = *pos++;
1967		wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u",
1968			   srv_proto);
1969		srv_trans_id = *pos++;
1970		wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u",
1971			   srv_trans_id);
1972		status = *pos++;
1973		wpa_printf(MSG_DEBUG, "P2P: Status Code ID %u",
1974			   status);
1975
1976		wpa_hexdump(MSG_MSGDUMP, "P2P: Response Data",
1977			    pos, tlv_end - pos);
1978
1979		pos = tlv_end;
1980	}
1981
1982	wpas_notify_p2p_sd_response(wpa_s, sa, update_indic, tlvs, tlvs_len);
1983}
1984
1985
1986u64 wpas_p2p_sd_request(struct wpa_supplicant *wpa_s, const u8 *dst,
1987			const struct wpabuf *tlvs)
1988{
1989	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
1990		return wpa_drv_p2p_sd_request(wpa_s, dst, tlvs);
1991	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
1992		return 0;
1993	return (uintptr_t) p2p_sd_request(wpa_s->global->p2p, dst, tlvs);
1994}
1995
1996
1997u64 wpas_p2p_sd_request_upnp(struct wpa_supplicant *wpa_s, const u8 *dst,
1998			     u8 version, const char *query)
1999{
2000	struct wpabuf *tlvs;
2001	u64 ret;
2002
2003	tlvs = wpabuf_alloc(2 + 1 + 1 + 1 + os_strlen(query));
2004	if (tlvs == NULL)
2005		return 0;
2006	wpabuf_put_le16(tlvs, 1 + 1 + 1 + os_strlen(query));
2007	wpabuf_put_u8(tlvs, P2P_SERV_UPNP); /* Service Protocol Type */
2008	wpabuf_put_u8(tlvs, 1); /* Service Transaction ID */
2009	wpabuf_put_u8(tlvs, version);
2010	wpabuf_put_str(tlvs, query);
2011	ret = wpas_p2p_sd_request(wpa_s, dst, tlvs);
2012	wpabuf_free(tlvs);
2013	return ret;
2014}
2015
2016
2017#ifdef CONFIG_WIFI_DISPLAY
2018
2019static u64 wpas_p2p_sd_request_wfd(struct wpa_supplicant *wpa_s, const u8 *dst,
2020				   const struct wpabuf *tlvs)
2021{
2022	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
2023		return 0;
2024	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2025		return 0;
2026	return (uintptr_t) p2p_sd_request_wfd(wpa_s->global->p2p, dst, tlvs);
2027}
2028
2029
2030#define MAX_WFD_SD_SUBELEMS 20
2031
2032static void wfd_add_sd_req_role(struct wpabuf *tlvs, u8 id, u8 role,
2033				const char *subelems)
2034{
2035	u8 *len;
2036	const char *pos;
2037	int val;
2038	int count = 0;
2039
2040	len = wpabuf_put(tlvs, 2);
2041	wpabuf_put_u8(tlvs, P2P_SERV_WIFI_DISPLAY); /* Service Protocol Type */
2042	wpabuf_put_u8(tlvs, id); /* Service Transaction ID */
2043
2044	wpabuf_put_u8(tlvs, role);
2045
2046	pos = subelems;
2047	while (*pos) {
2048		val = atoi(pos);
2049		if (val >= 0 && val < 256) {
2050			wpabuf_put_u8(tlvs, val);
2051			count++;
2052			if (count == MAX_WFD_SD_SUBELEMS)
2053				break;
2054		}
2055		pos = os_strchr(pos + 1, ',');
2056		if (pos == NULL)
2057			break;
2058		pos++;
2059	}
2060
2061	WPA_PUT_LE16(len, (u8 *) wpabuf_put(tlvs, 0) - len - 2);
2062}
2063
2064
2065u64 wpas_p2p_sd_request_wifi_display(struct wpa_supplicant *wpa_s,
2066				     const u8 *dst, const char *role)
2067{
2068	struct wpabuf *tlvs;
2069	u64 ret;
2070	const char *subelems;
2071	u8 id = 1;
2072
2073	subelems = os_strchr(role, ' ');
2074	if (subelems == NULL)
2075		return 0;
2076	subelems++;
2077
2078	tlvs = wpabuf_alloc(4 * (2 + 1 + 1 + 1 + MAX_WFD_SD_SUBELEMS));
2079	if (tlvs == NULL)
2080		return 0;
2081
2082	if (os_strstr(role, "[source]"))
2083		wfd_add_sd_req_role(tlvs, id++, 0x00, subelems);
2084	if (os_strstr(role, "[pri-sink]"))
2085		wfd_add_sd_req_role(tlvs, id++, 0x01, subelems);
2086	if (os_strstr(role, "[sec-sink]"))
2087		wfd_add_sd_req_role(tlvs, id++, 0x02, subelems);
2088	if (os_strstr(role, "[source+sink]"))
2089		wfd_add_sd_req_role(tlvs, id++, 0x03, subelems);
2090
2091	ret = wpas_p2p_sd_request_wfd(wpa_s, dst, tlvs);
2092	wpabuf_free(tlvs);
2093	return ret;
2094}
2095
2096#endif /* CONFIG_WIFI_DISPLAY */
2097
2098
2099int wpas_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s, u64 req)
2100{
2101	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
2102		return wpa_drv_p2p_sd_cancel_request(wpa_s, req);
2103	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2104		return -1;
2105	return p2p_sd_cancel_request(wpa_s->global->p2p,
2106				     (void *) (uintptr_t) req);
2107}
2108
2109
2110void wpas_p2p_sd_response(struct wpa_supplicant *wpa_s, int freq,
2111			  const u8 *dst, u8 dialog_token,
2112			  const struct wpabuf *resp_tlvs)
2113{
2114	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
2115		wpa_drv_p2p_sd_response(wpa_s, freq, dst, dialog_token,
2116					resp_tlvs);
2117		return;
2118	}
2119	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
2120		return;
2121	p2p_sd_response(wpa_s->global->p2p, freq, dst, dialog_token,
2122			resp_tlvs);
2123}
2124
2125#ifdef ANDROID_P2P
2126void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s, int action)
2127#else
2128void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s)
2129#endif
2130{
2131	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
2132		wpa_drv_p2p_service_update(wpa_s);
2133		return;
2134	}
2135	if (wpa_s->global->p2p)
2136#ifdef ANDROID_P2P
2137		p2p_sd_service_update(wpa_s->global->p2p, action);
2138#else
2139		p2p_sd_service_update(wpa_s->global->p2p);
2140#endif
2141}
2142
2143
2144static void wpas_p2p_srv_bonjour_free(struct p2p_srv_bonjour *bsrv)
2145{
2146	dl_list_del(&bsrv->list);
2147	wpabuf_free(bsrv->query);
2148	wpabuf_free(bsrv->resp);
2149	os_free(bsrv);
2150}
2151
2152
2153static void wpas_p2p_srv_upnp_free(struct p2p_srv_upnp *usrv)
2154{
2155	dl_list_del(&usrv->list);
2156	os_free(usrv->service);
2157	os_free(usrv);
2158}
2159
2160
2161void wpas_p2p_service_flush(struct wpa_supplicant *wpa_s)
2162{
2163	struct p2p_srv_bonjour *bsrv, *bn;
2164	struct p2p_srv_upnp *usrv, *un;
2165
2166	dl_list_for_each_safe(bsrv, bn, &wpa_s->global->p2p_srv_bonjour,
2167			      struct p2p_srv_bonjour, list)
2168		wpas_p2p_srv_bonjour_free(bsrv);
2169
2170	dl_list_for_each_safe(usrv, un, &wpa_s->global->p2p_srv_upnp,
2171			      struct p2p_srv_upnp, list)
2172		wpas_p2p_srv_upnp_free(usrv);
2173
2174#ifdef ANDROID_P2P
2175	wpas_p2p_sd_service_update(wpa_s, SRV_FLUSH);
2176#else
2177	wpas_p2p_sd_service_update(wpa_s);
2178#endif
2179}
2180
2181
2182int wpas_p2p_service_add_bonjour(struct wpa_supplicant *wpa_s,
2183				 struct wpabuf *query, struct wpabuf *resp)
2184{
2185	struct p2p_srv_bonjour *bsrv;
2186
2187	bsrv = os_zalloc(sizeof(*bsrv));
2188	if (bsrv == NULL)
2189		return -1;
2190	bsrv->query = query;
2191	bsrv->resp = resp;
2192	dl_list_add(&wpa_s->global->p2p_srv_bonjour, &bsrv->list);
2193
2194#ifdef ANDROID_P2P
2195	wpas_p2p_sd_service_update(wpa_s, SRV_ADD);
2196#else
2197	wpas_p2p_sd_service_update(wpa_s);
2198#endif
2199	return 0;
2200}
2201
2202
2203int wpas_p2p_service_del_bonjour(struct wpa_supplicant *wpa_s,
2204				 const struct wpabuf *query)
2205{
2206	struct p2p_srv_bonjour *bsrv;
2207
2208	bsrv = wpas_p2p_service_get_bonjour(wpa_s, query);
2209	if (bsrv == NULL)
2210		return -1;
2211	wpas_p2p_srv_bonjour_free(bsrv);
2212#ifdef ANDROID_P2P
2213	wpas_p2p_sd_service_update(wpa_s, SRV_DEL);
2214#else
2215	wpas_p2p_sd_service_update(wpa_s);
2216#endif
2217	return 0;
2218}
2219
2220
2221int wpas_p2p_service_add_upnp(struct wpa_supplicant *wpa_s, u8 version,
2222			      const char *service)
2223{
2224	struct p2p_srv_upnp *usrv;
2225
2226	if (wpas_p2p_service_get_upnp(wpa_s, version, service))
2227		return 0; /* Already listed */
2228	usrv = os_zalloc(sizeof(*usrv));
2229	if (usrv == NULL)
2230		return -1;
2231	usrv->version = version;
2232	usrv->service = os_strdup(service);
2233	if (usrv->service == NULL) {
2234		os_free(usrv);
2235		return -1;
2236	}
2237	dl_list_add(&wpa_s->global->p2p_srv_upnp, &usrv->list);
2238
2239#ifdef ANDROID_P2P
2240	wpas_p2p_sd_service_update(wpa_s, SRV_ADD);
2241#else
2242	wpas_p2p_sd_service_update(wpa_s);
2243#endif
2244	return 0;
2245}
2246
2247
2248int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version,
2249			      const char *service)
2250{
2251	struct p2p_srv_upnp *usrv;
2252
2253	usrv = wpas_p2p_service_get_upnp(wpa_s, version, service);
2254	if (usrv == NULL)
2255		return -1;
2256	wpas_p2p_srv_upnp_free(usrv);
2257#ifdef ANDROID_P2P
2258	wpas_p2p_sd_service_update(wpa_s, SRV_DEL);
2259#else
2260	wpas_p2p_sd_service_update(wpa_s);
2261#endif
2262	return 0;
2263}
2264
2265
2266static void wpas_prov_disc_local_display(struct wpa_supplicant *wpa_s,
2267					 const u8 *peer, const char *params,
2268					 unsigned int generated_pin)
2269{
2270	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_SHOW_PIN MACSTR " %08d%s",
2271		MAC2STR(peer), generated_pin, params);
2272}
2273
2274
2275static void wpas_prov_disc_local_keypad(struct wpa_supplicant *wpa_s,
2276					const u8 *peer, const char *params)
2277{
2278	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_ENTER_PIN MACSTR "%s",
2279		MAC2STR(peer), params);
2280}
2281
2282
2283void wpas_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods,
2284			const u8 *dev_addr, const u8 *pri_dev_type,
2285			const char *dev_name, u16 supp_config_methods,
2286			u8 dev_capab, u8 group_capab, const u8 *group_id,
2287			size_t group_id_len)
2288{
2289	struct wpa_supplicant *wpa_s = ctx;
2290	char devtype[WPS_DEV_TYPE_BUFSIZE];
2291	char params[300];
2292	u8 empty_dev_type[8];
2293	unsigned int generated_pin = 0;
2294	struct wpa_supplicant *group = NULL;
2295
2296	if (group_id) {
2297		for (group = wpa_s->global->ifaces; group; group = group->next)
2298		{
2299			struct wpa_ssid *s = group->current_ssid;
2300			if (s != NULL &&
2301			    s->mode == WPAS_MODE_P2P_GO &&
2302			    group_id_len - ETH_ALEN == s->ssid_len &&
2303			    os_memcmp(group_id + ETH_ALEN, s->ssid,
2304				      s->ssid_len) == 0)
2305				break;
2306		}
2307	}
2308
2309	if (pri_dev_type == NULL) {
2310		os_memset(empty_dev_type, 0, sizeof(empty_dev_type));
2311		pri_dev_type = empty_dev_type;
2312	}
2313	os_snprintf(params, sizeof(params), " p2p_dev_addr=" MACSTR
2314		    " pri_dev_type=%s name='%s' config_methods=0x%x "
2315		    "dev_capab=0x%x group_capab=0x%x%s%s",
2316		    MAC2STR(dev_addr),
2317		    wps_dev_type_bin2str(pri_dev_type, devtype,
2318					 sizeof(devtype)),
2319		    dev_name, supp_config_methods, dev_capab, group_capab,
2320		    group ? " group=" : "",
2321		    group ? group->ifname : "");
2322	params[sizeof(params) - 1] = '\0';
2323
2324	if (config_methods & WPS_CONFIG_DISPLAY) {
2325		generated_pin = wps_generate_pin();
2326		wpas_prov_disc_local_display(wpa_s, peer, params,
2327					     generated_pin);
2328	} else if (config_methods & WPS_CONFIG_KEYPAD)
2329		wpas_prov_disc_local_keypad(wpa_s, peer, params);
2330	else if (config_methods & WPS_CONFIG_PUSHBUTTON)
2331		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_REQ MACSTR
2332			"%s", MAC2STR(peer), params);
2333
2334	wpas_notify_p2p_provision_discovery(wpa_s, peer, 1 /* request */,
2335					    P2P_PROV_DISC_SUCCESS,
2336					    config_methods, generated_pin);
2337}
2338
2339
2340void wpas_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods)
2341{
2342	struct wpa_supplicant *wpa_s = ctx;
2343	unsigned int generated_pin = 0;
2344	char params[20];
2345
2346	if (wpa_s->pending_pd_before_join &&
2347	    (os_memcmp(peer, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
2348	     os_memcmp(peer, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0)) {
2349		wpa_s->pending_pd_before_join = 0;
2350		wpa_printf(MSG_DEBUG, "P2P: Starting pending "
2351			   "join-existing-group operation");
2352		wpas_p2p_join_start(wpa_s);
2353		return;
2354	}
2355
2356	if (wpa_s->pending_pd_use == AUTO_PD_JOIN ||
2357	    wpa_s->pending_pd_use == AUTO_PD_GO_NEG)
2358		os_snprintf(params, sizeof(params), " peer_go=%d",
2359			    wpa_s->pending_pd_use == AUTO_PD_JOIN);
2360	else
2361		params[0] = '\0';
2362
2363	if (config_methods & WPS_CONFIG_DISPLAY)
2364		wpas_prov_disc_local_keypad(wpa_s, peer, params);
2365	else if (config_methods & WPS_CONFIG_KEYPAD) {
2366		generated_pin = wps_generate_pin();
2367		wpas_prov_disc_local_display(wpa_s, peer, params,
2368					     generated_pin);
2369	} else if (config_methods & WPS_CONFIG_PUSHBUTTON)
2370		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_RESP MACSTR
2371			"%s", MAC2STR(peer), params);
2372
2373	wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
2374					    P2P_PROV_DISC_SUCCESS,
2375					    config_methods, generated_pin);
2376}
2377
2378
2379static void wpas_prov_disc_fail(void *ctx, const u8 *peer,
2380				enum p2p_prov_disc_status status)
2381{
2382	struct wpa_supplicant *wpa_s = ctx;
2383
2384	if (wpa_s->p2p_fallback_to_go_neg) {
2385		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: PD for p2p_connect-auto "
2386			"failed - fall back to GO Negotiation");
2387		wpas_p2p_fallback_to_go_neg(wpa_s, 0);
2388		return;
2389	}
2390
2391	if (status == P2P_PROV_DISC_TIMEOUT_JOIN) {
2392		wpa_s->pending_pd_before_join = 0;
2393		wpa_printf(MSG_DEBUG, "P2P: Starting pending "
2394			   "join-existing-group operation (no ACK for PD "
2395			   "Req attempts)");
2396		wpas_p2p_join_start(wpa_s);
2397		return;
2398	}
2399
2400	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
2401		" p2p_dev_addr=" MACSTR " status=%d",
2402		MAC2STR(peer), status);
2403
2404	wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
2405					    status, 0, 0);
2406}
2407
2408
2409static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid,
2410				  const u8 *go_dev_addr, const u8 *ssid,
2411				  size_t ssid_len, int *go, u8 *group_bssid,
2412				  int *force_freq, int persistent_group)
2413{
2414	struct wpa_supplicant *wpa_s = ctx;
2415	struct wpa_ssid *s;
2416	u8 cur_bssid[ETH_ALEN];
2417	int res;
2418	struct wpa_supplicant *grp;
2419
2420	if (!persistent_group) {
2421		wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
2422			   " to join an active group", MAC2STR(sa));
2423		if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
2424		    (os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN)
2425		     == 0 ||
2426		     os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0)) {
2427			wpa_printf(MSG_DEBUG, "P2P: Accept previously "
2428				   "authorized invitation");
2429			goto accept_inv;
2430		}
2431		/*
2432		 * Do not accept the invitation automatically; notify user and
2433		 * request approval.
2434		 */
2435		return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
2436	}
2437
2438	grp = wpas_get_p2p_group(wpa_s, ssid, ssid_len, go);
2439	if (grp) {
2440		wpa_printf(MSG_DEBUG, "P2P: Accept invitation to already "
2441			   "running persistent group");
2442		if (*go)
2443			os_memcpy(group_bssid, grp->own_addr, ETH_ALEN);
2444		goto accept_inv;
2445	}
2446
2447	if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
2448	    os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0) {
2449		wpa_printf(MSG_DEBUG, "P2P: Accept previously initiated "
2450			   "invitation to re-invoke a persistent group");
2451	} else if (!wpa_s->conf->persistent_reconnect)
2452		return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
2453
2454	for (s = wpa_s->conf->ssid; s; s = s->next) {
2455		if (s->disabled == 2 &&
2456		    os_memcmp(s->bssid, go_dev_addr, ETH_ALEN) == 0 &&
2457		    s->ssid_len == ssid_len &&
2458		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
2459			break;
2460	}
2461
2462	if (!s) {
2463		wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
2464			   " requested reinvocation of an unknown group",
2465			   MAC2STR(sa));
2466		return P2P_SC_FAIL_UNKNOWN_GROUP;
2467	}
2468
2469	if (s->mode == WPAS_MODE_P2P_GO && !wpas_p2p_create_iface(wpa_s)) {
2470		*go = 1;
2471		if (wpa_s->wpa_state >= WPA_AUTHENTICATING) {
2472			wpa_printf(MSG_DEBUG, "P2P: The only available "
2473				   "interface is already in use - reject "
2474				   "invitation");
2475			return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
2476		}
2477		os_memcpy(group_bssid, wpa_s->own_addr, ETH_ALEN);
2478	} else if (s->mode == WPAS_MODE_P2P_GO) {
2479		*go = 1;
2480		if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO) < 0)
2481		{
2482			wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
2483				   "interface address for the group");
2484			return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
2485		}
2486		os_memcpy(group_bssid, wpa_s->pending_interface_addr,
2487			  ETH_ALEN);
2488	}
2489
2490accept_inv:
2491	wpas_p2p_set_own_freq_preference(wpa_s, 0);
2492
2493	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, cur_bssid) == 0 &&
2494	    wpa_s->assoc_freq) {
2495		wpa_printf(MSG_DEBUG, "P2P: Trying to force channel to match "
2496			   "the channel we are already using");
2497		*force_freq = wpa_s->assoc_freq;
2498		wpas_p2p_set_own_freq_preference(wpa_s, wpa_s->assoc_freq);
2499	}
2500
2501	res = wpa_drv_shared_freq(wpa_s);
2502	if (res > 0) {
2503		wpa_printf(MSG_DEBUG, "P2P: Trying to force channel to match "
2504			   "with the channel we are already using on a "
2505			   "shared interface");
2506		*force_freq = res;
2507		wpas_p2p_set_own_freq_preference(wpa_s, res);
2508	}
2509
2510	return P2P_SC_SUCCESS;
2511}
2512
2513
2514static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
2515				     const u8 *ssid, size_t ssid_len,
2516				     const u8 *go_dev_addr, u8 status,
2517				     int op_freq)
2518{
2519	struct wpa_supplicant *wpa_s = ctx;
2520	struct wpa_ssid *s;
2521
2522	for (s = wpa_s->conf->ssid; s; s = s->next) {
2523		if (s->disabled == 2 &&
2524		    s->ssid_len == ssid_len &&
2525		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
2526			break;
2527	}
2528
2529	if (status == P2P_SC_SUCCESS) {
2530		wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
2531			   " was accepted; op_freq=%d MHz",
2532			   MAC2STR(sa), op_freq);
2533		if (s) {
2534			int go = s->mode == WPAS_MODE_P2P_GO;
2535			wpas_p2p_group_add_persistent(
2536				wpa_s, s, go, go ? op_freq : 0, 0, NULL);
2537		} else if (bssid) {
2538			wpa_s->user_initiated_pd = 0;
2539			wpas_p2p_join(wpa_s, bssid, go_dev_addr,
2540				      wpa_s->p2p_wps_method, 0);
2541		}
2542		return;
2543	}
2544
2545	if (status != P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
2546		wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
2547			   " was rejected (status %u)", MAC2STR(sa), status);
2548		return;
2549	}
2550
2551	if (!s) {
2552		if (bssid) {
2553			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
2554				"sa=" MACSTR " go_dev_addr=" MACSTR
2555				" bssid=" MACSTR " unknown-network",
2556				MAC2STR(sa), MAC2STR(go_dev_addr),
2557				MAC2STR(bssid));
2558		} else {
2559			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
2560				"sa=" MACSTR " go_dev_addr=" MACSTR
2561				" unknown-network",
2562				MAC2STR(sa), MAC2STR(go_dev_addr));
2563		}
2564		return;
2565	}
2566
2567	if (s->mode == WPAS_MODE_P2P_GO && op_freq) {
2568		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED "sa="
2569			MACSTR " persistent=%d freq=%d",
2570			MAC2STR(sa), s->id, op_freq);
2571	} else {
2572		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED "sa="
2573			MACSTR " persistent=%d", MAC2STR(sa), s->id);
2574	}
2575}
2576
2577
2578static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
2579					struct wpa_ssid *ssid,
2580					const u8 *peer)
2581{
2582	size_t i;
2583
2584	if (ssid == NULL)
2585		return;
2586
2587	for (i = 0; ssid->p2p_client_list && i < ssid->num_p2p_clients; i++) {
2588		if (os_memcmp(ssid->p2p_client_list + i * ETH_ALEN, peer,
2589			      ETH_ALEN) == 0)
2590			break;
2591	}
2592	if (i >= ssid->num_p2p_clients) {
2593		if (ssid->mode != WPAS_MODE_P2P_GO &&
2594		    os_memcmp(ssid->bssid, peer, ETH_ALEN) == 0) {
2595			wpa_printf(MSG_DEBUG, "P2P: Remove persistent group %d "
2596				   "due to invitation result", ssid->id);
2597			wpas_notify_network_removed(wpa_s, ssid);
2598			wpa_config_remove_network(wpa_s->conf, ssid->id);
2599			return;
2600		}
2601		return; /* Peer not found in client list */
2602	}
2603
2604	wpa_printf(MSG_DEBUG, "P2P: Remove peer " MACSTR " from persistent "
2605		   "group %d client list due to invitation result",
2606		   MAC2STR(peer), ssid->id);
2607	os_memmove(ssid->p2p_client_list + i * ETH_ALEN,
2608		   ssid->p2p_client_list + (i + 1) * ETH_ALEN,
2609		   (ssid->num_p2p_clients - i - 1) * ETH_ALEN);
2610	ssid->num_p2p_clients--;
2611#ifndef CONFIG_NO_CONFIG_WRITE
2612	if (wpa_s->parent->conf->update_config &&
2613	    wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
2614		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
2615#endif /* CONFIG_NO_CONFIG_WRITE */
2616}
2617
2618
2619static void wpas_remove_persistent_client(struct wpa_supplicant *wpa_s,
2620					  const u8 *peer)
2621{
2622	struct wpa_ssid *ssid;
2623
2624	wpa_s = wpa_s->global->p2p_invite_group;
2625	if (wpa_s == NULL)
2626		return; /* No known invitation group */
2627	ssid = wpa_s->current_ssid;
2628	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
2629	    !ssid->p2p_persistent_group)
2630		return; /* Not operating as a GO in persistent group */
2631	ssid = wpas_p2p_get_persistent(wpa_s->parent, peer,
2632				       ssid->ssid, ssid->ssid_len);
2633	wpas_remove_persistent_peer(wpa_s, ssid, peer);
2634}
2635
2636
2637static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
2638				   const struct p2p_channels *channels,
2639				   const u8 *peer)
2640{
2641	struct wpa_supplicant *wpa_s = ctx;
2642	struct wpa_ssid *ssid;
2643
2644	if (bssid) {
2645		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
2646			"status=%d " MACSTR,
2647			status, MAC2STR(bssid));
2648	} else {
2649		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
2650			"status=%d ", status);
2651	}
2652	wpas_notify_p2p_invitation_result(wpa_s, status, bssid);
2653
2654	wpa_printf(MSG_DEBUG, "P2P: Invitation result - status=%d peer=" MACSTR,
2655		   status, MAC2STR(peer));
2656	if (wpa_s->pending_invite_ssid_id == -1) {
2657		if (status == P2P_SC_FAIL_UNKNOWN_GROUP)
2658			wpas_remove_persistent_client(wpa_s, peer);
2659		return; /* Invitation to active group */
2660	}
2661
2662	if (status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
2663		wpa_printf(MSG_DEBUG, "P2P: Waiting for peer to start another "
2664			   "invitation exchange to indicate readiness for "
2665			   "re-invocation");
2666	}
2667
2668	if (status != P2P_SC_SUCCESS) {
2669		if (status == P2P_SC_FAIL_UNKNOWN_GROUP) {
2670			ssid = wpa_config_get_network(
2671				wpa_s->conf, wpa_s->pending_invite_ssid_id);
2672			wpas_remove_persistent_peer(wpa_s, ssid, peer);
2673		}
2674		wpas_p2p_remove_pending_group_interface(wpa_s);
2675		return;
2676	}
2677
2678	ssid = wpa_config_get_network(wpa_s->conf,
2679				      wpa_s->pending_invite_ssid_id);
2680	if (ssid == NULL) {
2681		wpa_printf(MSG_ERROR, "P2P: Could not find persistent group "
2682			   "data matching with invitation");
2683		return;
2684	}
2685
2686	/*
2687	 * The peer could have missed our ctrl::ack frame for Invitation
2688	 * Response and continue retransmitting the frame. To reduce the
2689	 * likelihood of the peer not getting successful TX status for the
2690	 * Invitation Response frame, wait a short time here before starting
2691	 * the persistent group so that we will remain on the current channel to
2692	 * acknowledge any possible retransmission from the peer.
2693	 */
2694#ifndef ANDROID_P2P
2695	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before "
2696		"starting persistent group");
2697	os_sleep(0, 50000);
2698#else
2699	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 100 ms wait on current channel before "
2700		"starting persistent group");
2701	os_sleep(0, 100000);
2702#endif
2703
2704	wpas_p2p_group_add_persistent(wpa_s, ssid,
2705				      ssid->mode == WPAS_MODE_P2P_GO,
2706				      wpa_s->p2p_persistent_go_freq,
2707				      wpa_s->p2p_go_ht40, channels);
2708}
2709
2710
2711static int wpas_p2p_disallowed_freq(struct wpa_global *global,
2712				    unsigned int freq)
2713{
2714	unsigned int i;
2715
2716	if (global->p2p_disallow_freq == NULL)
2717		return 0;
2718
2719	for (i = 0; i < global->num_p2p_disallow_freq; i++) {
2720		if (freq >= global->p2p_disallow_freq[i].min &&
2721		    freq <= global->p2p_disallow_freq[i].max)
2722			return 1;
2723	}
2724
2725	return 0;
2726}
2727
2728
2729static void wpas_p2p_add_chan(struct p2p_reg_class *reg, u8 chan)
2730{
2731	reg->channel[reg->channels] = chan;
2732	reg->channels++;
2733}
2734
2735
2736static int wpas_p2p_default_channels(struct wpa_supplicant *wpa_s,
2737				     struct p2p_channels *chan)
2738{
2739	int i, cla = 0;
2740
2741	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for 2.4 GHz "
2742		   "band");
2743
2744	/* Operating class 81 - 2.4 GHz band channels 1..13 */
2745	chan->reg_class[cla].reg_class = 81;
2746	chan->reg_class[cla].channels = 0;
2747	for (i = 0; i < 11; i++) {
2748		if (!wpas_p2p_disallowed_freq(wpa_s->global, 2412 + i * 5))
2749			wpas_p2p_add_chan(&chan->reg_class[cla], i + 1);
2750	}
2751	if (chan->reg_class[cla].channels)
2752		cla++;
2753
2754	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for lower 5 GHz "
2755		   "band");
2756
2757	/* Operating class 115 - 5 GHz, channels 36-48 */
2758	chan->reg_class[cla].reg_class = 115;
2759	chan->reg_class[cla].channels = 0;
2760	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 36 * 5))
2761		wpas_p2p_add_chan(&chan->reg_class[cla], 36);
2762	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 40 * 5))
2763		wpas_p2p_add_chan(&chan->reg_class[cla], 40);
2764	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 44 * 5))
2765		wpas_p2p_add_chan(&chan->reg_class[cla], 44);
2766	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 48 * 5))
2767		wpas_p2p_add_chan(&chan->reg_class[cla], 48);
2768	if (chan->reg_class[cla].channels)
2769		cla++;
2770
2771	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for higher 5 GHz "
2772		   "band");
2773
2774	/* Operating class 124 - 5 GHz, channels 149,153,157,161 */
2775	chan->reg_class[cla].reg_class = 124;
2776	chan->reg_class[cla].channels = 0;
2777	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 149 * 5))
2778		wpas_p2p_add_chan(&chan->reg_class[cla], 149);
2779	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 153 * 5))
2780		wpas_p2p_add_chan(&chan->reg_class[cla], 153);
2781	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 156 * 5))
2782		wpas_p2p_add_chan(&chan->reg_class[cla], 157);
2783	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 161 * 5))
2784		wpas_p2p_add_chan(&chan->reg_class[cla], 161);
2785	if (chan->reg_class[cla].channels)
2786		cla++;
2787
2788	chan->reg_classes = cla;
2789	return 0;
2790}
2791
2792
2793static struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes,
2794					  u16 num_modes,
2795					  enum hostapd_hw_mode mode)
2796{
2797	u16 i;
2798
2799	for (i = 0; i < num_modes; i++) {
2800		if (modes[i].mode == mode)
2801			return &modes[i];
2802	}
2803
2804	return NULL;
2805}
2806
2807
2808static int has_channel(struct wpa_global *global,
2809		       struct hostapd_hw_modes *mode, u8 chan, int *flags)
2810{
2811	int i;
2812	unsigned int freq;
2813
2814	freq = (mode->mode == HOSTAPD_MODE_IEEE80211A ? 5000 : 2407) +
2815		chan * 5;
2816	if (wpas_p2p_disallowed_freq(global, freq))
2817		return 0;
2818
2819	for (i = 0; i < mode->num_channels; i++) {
2820		if (mode->channels[i].chan == chan) {
2821			if (flags)
2822				*flags = mode->channels[i].flag;
2823			return !(mode->channels[i].flag &
2824				 (HOSTAPD_CHAN_DISABLED |
2825				  HOSTAPD_CHAN_PASSIVE_SCAN |
2826				  HOSTAPD_CHAN_NO_IBSS |
2827				  HOSTAPD_CHAN_RADAR));
2828		}
2829	}
2830
2831	return 0;
2832}
2833
2834
2835struct p2p_oper_class_map {
2836	enum hostapd_hw_mode mode;
2837	u8 op_class;
2838	u8 min_chan;
2839	u8 max_chan;
2840	u8 inc;
2841	enum { BW20, BW40PLUS, BW40MINUS } bw;
2842};
2843
2844static struct p2p_oper_class_map op_class[] = {
2845	{ HOSTAPD_MODE_IEEE80211G, 81, 1, 13, 1, BW20 },
2846#if 0 /* Do not enable HT40 on 2 GHz for now */
2847	{ HOSTAPD_MODE_IEEE80211G, 83, 1, 9, 1, BW40PLUS },
2848	{ HOSTAPD_MODE_IEEE80211G, 84, 5, 13, 1, BW40MINUS },
2849#endif
2850	{ HOSTAPD_MODE_IEEE80211A, 115, 36, 48, 4, BW20 },
2851	{ HOSTAPD_MODE_IEEE80211A, 124, 149, 161, 4, BW20 },
2852	{ HOSTAPD_MODE_IEEE80211A, 116, 36, 44, 8, BW40PLUS },
2853	{ HOSTAPD_MODE_IEEE80211A, 117, 40, 48, 8, BW40MINUS },
2854	{ HOSTAPD_MODE_IEEE80211A, 126, 149, 157, 8, BW40PLUS },
2855	{ HOSTAPD_MODE_IEEE80211A, 127, 153, 161, 8, BW40MINUS },
2856	{ -1, 0, 0, 0, 0, BW20 }
2857};
2858
2859
2860static int wpas_p2p_verify_channel(struct wpa_supplicant *wpa_s,
2861				   struct hostapd_hw_modes *mode,
2862				   u8 channel, u8 bw)
2863{
2864	int flag;
2865
2866	if (!has_channel(wpa_s->global, mode, channel, &flag))
2867		return -1;
2868	if (bw == BW40MINUS &&
2869	    (!(flag & HOSTAPD_CHAN_HT40MINUS) ||
2870	     !has_channel(wpa_s->global, mode, channel - 4, NULL)))
2871		return 0;
2872	if (bw == BW40PLUS &&
2873	    (!(flag & HOSTAPD_CHAN_HT40PLUS) ||
2874	     !has_channel(wpa_s->global, mode, channel + 4, NULL)))
2875		return 0;
2876	return 1;
2877}
2878
2879
2880static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s,
2881				   struct p2p_channels *chan)
2882{
2883	struct hostapd_hw_modes *mode;
2884	int cla, op;
2885
2886	if (wpa_s->hw.modes == NULL) {
2887		wpa_printf(MSG_DEBUG, "P2P: Driver did not support fetching "
2888			   "of all supported channels; assume dualband "
2889			   "support");
2890		return wpas_p2p_default_channels(wpa_s, chan);
2891	}
2892
2893	cla = 0;
2894
2895	for (op = 0; op_class[op].op_class; op++) {
2896		struct p2p_oper_class_map *o = &op_class[op];
2897		u8 ch;
2898		struct p2p_reg_class *reg = NULL;
2899
2900		mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode);
2901		if (mode == NULL)
2902			continue;
2903		for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
2904			if (wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw) < 1)
2905				continue;
2906			if (reg == NULL) {
2907				wpa_printf(MSG_DEBUG, "P2P: Add operating "
2908					   "class %u", o->op_class);
2909				reg = &chan->reg_class[cla];
2910				cla++;
2911				reg->reg_class = o->op_class;
2912			}
2913			reg->channel[reg->channels] = ch;
2914			reg->channels++;
2915		}
2916		if (reg) {
2917			wpa_hexdump(MSG_DEBUG, "P2P: Channels",
2918				    reg->channel, reg->channels);
2919		}
2920	}
2921
2922	chan->reg_classes = cla;
2923
2924	return 0;
2925}
2926
2927
2928int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
2929			   struct hostapd_hw_modes *mode, u8 channel)
2930{
2931	int op, ret;
2932
2933	for (op = 0; op_class[op].op_class; op++) {
2934		struct p2p_oper_class_map *o = &op_class[op];
2935		u8 ch;
2936
2937		for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
2938			if (o->mode != HOSTAPD_MODE_IEEE80211A ||
2939			    o->bw == BW20 || ch != channel)
2940				continue;
2941			ret = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
2942			if (ret < 0)
2943				continue;
2944			else if (ret > 0)
2945				return (o->bw == BW40MINUS) ? -1 : 1;
2946			else
2947				return 0;
2948		}
2949	}
2950	return 0;
2951}
2952
2953
2954static int wpas_get_noa(void *ctx, const u8 *interface_addr, u8 *buf,
2955			size_t buf_len)
2956{
2957	struct wpa_supplicant *wpa_s = ctx;
2958
2959	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2960		if (os_memcmp(wpa_s->own_addr, interface_addr, ETH_ALEN) == 0)
2961			break;
2962	}
2963	if (wpa_s == NULL)
2964		return -1;
2965
2966	return wpa_drv_get_noa(wpa_s, buf, buf_len);
2967}
2968
2969
2970static int wpas_go_connected(void *ctx, const u8 *dev_addr)
2971{
2972	struct wpa_supplicant *wpa_s = ctx;
2973
2974	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
2975		struct wpa_ssid *ssid = wpa_s->current_ssid;
2976		if (ssid == NULL)
2977			continue;
2978		if (ssid->mode != WPAS_MODE_INFRA)
2979			continue;
2980		if (wpa_s->wpa_state != WPA_COMPLETED &&
2981		    wpa_s->wpa_state != WPA_GROUP_HANDSHAKE)
2982			continue;
2983		if (os_memcmp(wpa_s->go_dev_addr, dev_addr, ETH_ALEN) == 0)
2984			return 1;
2985	}
2986
2987	return 0;
2988}
2989
2990
2991/**
2992 * wpas_p2p_init - Initialize P2P module for %wpa_supplicant
2993 * @global: Pointer to global data from wpa_supplicant_init()
2994 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
2995 * Returns: 0 on success, -1 on failure
2996 */
2997int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
2998{
2999	struct p2p_config p2p;
3000	unsigned int r;
3001	int i;
3002
3003	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
3004		return 0;
3005
3006	if (global->p2p)
3007		return 0;
3008
3009	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
3010		struct p2p_params params;
3011
3012		wpa_printf(MSG_DEBUG, "P2P: Use driver-based P2P management");
3013		os_memset(&params, 0, sizeof(params));
3014		params.dev_name = wpa_s->conf->device_name;
3015		os_memcpy(params.pri_dev_type, wpa_s->conf->device_type,
3016			  WPS_DEV_TYPE_LEN);
3017		params.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
3018		os_memcpy(params.sec_dev_type,
3019			  wpa_s->conf->sec_device_type,
3020			  params.num_sec_dev_types * WPS_DEV_TYPE_LEN);
3021
3022		if (wpa_drv_p2p_set_params(wpa_s, &params) < 0)
3023			return -1;
3024
3025		return 0;
3026	}
3027
3028	os_memset(&p2p, 0, sizeof(p2p));
3029	p2p.msg_ctx = wpa_s;
3030	p2p.cb_ctx = wpa_s;
3031	p2p.p2p_scan = wpas_p2p_scan;
3032	p2p.send_action = wpas_send_action;
3033	p2p.send_action_done = wpas_send_action_done;
3034	p2p.go_neg_completed = wpas_go_neg_completed;
3035	p2p.go_neg_req_rx = wpas_go_neg_req_rx;
3036	p2p.dev_found = wpas_dev_found;
3037	p2p.dev_lost = wpas_dev_lost;
3038	p2p.start_listen = wpas_start_listen;
3039	p2p.stop_listen = wpas_stop_listen;
3040	p2p.send_probe_resp = wpas_send_probe_resp;
3041	p2p.sd_request = wpas_sd_request;
3042	p2p.sd_response = wpas_sd_response;
3043	p2p.prov_disc_req = wpas_prov_disc_req;
3044	p2p.prov_disc_resp = wpas_prov_disc_resp;
3045	p2p.prov_disc_fail = wpas_prov_disc_fail;
3046	p2p.invitation_process = wpas_invitation_process;
3047	p2p.invitation_received = wpas_invitation_received;
3048	p2p.invitation_result = wpas_invitation_result;
3049	p2p.get_noa = wpas_get_noa;
3050	p2p.go_connected = wpas_go_connected;
3051
3052	os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
3053	os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
3054	p2p.dev_name = wpa_s->conf->device_name;
3055	p2p.manufacturer = wpa_s->conf->manufacturer;
3056	p2p.model_name = wpa_s->conf->model_name;
3057	p2p.model_number = wpa_s->conf->model_number;
3058	p2p.serial_number = wpa_s->conf->serial_number;
3059	if (wpa_s->wps) {
3060		os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);
3061		p2p.config_methods = wpa_s->wps->config_methods;
3062	}
3063
3064	if (wpa_s->conf->p2p_listen_reg_class &&
3065	    wpa_s->conf->p2p_listen_channel) {
3066		p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;
3067		p2p.channel = wpa_s->conf->p2p_listen_channel;
3068	} else {
3069		p2p.reg_class = 81;
3070		/*
3071		 * Pick one of the social channels randomly as the listen
3072		 * channel.
3073		 */
3074		os_get_random((u8 *) &r, sizeof(r));
3075		p2p.channel = 1 + (r % 3) * 5;
3076	}
3077	wpa_printf(MSG_DEBUG, "P2P: Own listen channel: %d", p2p.channel);
3078
3079	if (wpa_s->conf->p2p_oper_reg_class &&
3080	    wpa_s->conf->p2p_oper_channel) {
3081		p2p.op_reg_class = wpa_s->conf->p2p_oper_reg_class;
3082		p2p.op_channel = wpa_s->conf->p2p_oper_channel;
3083		p2p.cfg_op_channel = 1;
3084		wpa_printf(MSG_DEBUG, "P2P: Configured operating channel: "
3085			   "%d:%d", p2p.op_reg_class, p2p.op_channel);
3086
3087	} else {
3088		p2p.op_reg_class = 81;
3089		/*
3090		 * Use random operation channel from (1, 6, 11) if no other
3091		 * preference is indicated.
3092		 */
3093		os_get_random((u8 *) &r, sizeof(r));
3094		p2p.op_channel = 1 + (r % 3) * 5;
3095		p2p.cfg_op_channel = 0;
3096		wpa_printf(MSG_DEBUG, "P2P: Random operating channel: "
3097			   "%d:%d", p2p.op_reg_class, p2p.op_channel);
3098	}
3099	if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
3100		os_memcpy(p2p.country, wpa_s->conf->country, 2);
3101		p2p.country[2] = 0x04;
3102	} else
3103		os_memcpy(p2p.country, "XX\x04", 3);
3104
3105	if (wpas_p2p_setup_channels(wpa_s, &p2p.channels)) {
3106		wpa_printf(MSG_ERROR, "P2P: Failed to configure supported "
3107			   "channel list");
3108		return -1;
3109	}
3110
3111	os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,
3112		  WPS_DEV_TYPE_LEN);
3113
3114	p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
3115	os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,
3116		  p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN);
3117
3118	p2p.concurrent_operations = !!(wpa_s->drv_flags &
3119				       WPA_DRIVER_FLAGS_P2P_CONCURRENT);
3120
3121	p2p.max_peers = 100;
3122
3123	if (wpa_s->conf->p2p_ssid_postfix) {
3124		p2p.ssid_postfix_len =
3125			os_strlen(wpa_s->conf->p2p_ssid_postfix);
3126		if (p2p.ssid_postfix_len > sizeof(p2p.ssid_postfix))
3127			p2p.ssid_postfix_len = sizeof(p2p.ssid_postfix);
3128		os_memcpy(p2p.ssid_postfix, wpa_s->conf->p2p_ssid_postfix,
3129			  p2p.ssid_postfix_len);
3130	}
3131
3132	p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;
3133
3134	p2p.max_listen = wpa_s->max_remain_on_chan;
3135
3136#ifdef ANDROID_P2P
3137	if(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
3138		p2p.p2p_concurrency = P2P_MULTI_CHANNEL_CONCURRENT;
3139		wpa_printf(MSG_DEBUG, "P2P: Multi channel concurrency support");
3140	} else {
3141	// Add support for WPA_DRIVER_FLAGS_P2P_CONCURRENT
3142		p2p.p2p_concurrency = P2P_SINGLE_CHANNEL_CONCURRENT;
3143		wpa_printf(MSG_DEBUG, "P2P: Single channel concurrency support");
3144	}
3145#endif
3146
3147	global->p2p = p2p_init(&p2p);
3148	if (global->p2p == NULL)
3149		return -1;
3150	global->p2p_init_wpa_s = wpa_s;
3151
3152	for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
3153		if (wpa_s->conf->wps_vendor_ext[i] == NULL)
3154			continue;
3155		p2p_add_wps_vendor_extension(
3156			global->p2p, wpa_s->conf->wps_vendor_ext[i]);
3157	}
3158
3159	return 0;
3160}
3161
3162
3163/**
3164 * wpas_p2p_deinit - Deinitialize per-interface P2P data
3165 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
3166 *
3167 * This function deinitialize per-interface P2P data.
3168 */
3169void wpas_p2p_deinit(struct wpa_supplicant *wpa_s)
3170{
3171	if (wpa_s->driver && wpa_s->drv_priv)
3172		wpa_drv_probe_req_report(wpa_s, 0);
3173
3174	if (wpa_s->go_params) {
3175		/* Clear any stored provisioning info */
3176		p2p_clear_provisioning_info(
3177			wpa_s->global->p2p,
3178			wpa_s->go_params->peer_device_addr);
3179	}
3180
3181	os_free(wpa_s->go_params);
3182	wpa_s->go_params = NULL;
3183	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
3184	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
3185	wpa_s->p2p_long_listen = 0;
3186	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
3187	eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
3188	wpas_p2p_remove_pending_group_interface(wpa_s);
3189
3190	/* TODO: remove group interface from the driver if this wpa_s instance
3191	 * is on top of a P2P group interface */
3192}
3193
3194
3195/**
3196 * wpas_p2p_deinit_global - Deinitialize global P2P module
3197 * @global: Pointer to global data from wpa_supplicant_init()
3198 *
3199 * This function deinitializes the global (per device) P2P module.
3200 */
3201void wpas_p2p_deinit_global(struct wpa_global *global)
3202{
3203	struct wpa_supplicant *wpa_s, *tmp;
3204
3205	wpa_s = global->ifaces;
3206	if (wpa_s)
3207		wpas_p2p_service_flush(wpa_s);
3208
3209	if (global->p2p == NULL)
3210		return;
3211
3212	/* Remove remaining P2P group interfaces */
3213	while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
3214		wpa_s = wpa_s->next;
3215	while (wpa_s) {
3216		tmp = global->ifaces;
3217		while (tmp &&
3218		       (tmp == wpa_s ||
3219			tmp->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)) {
3220			tmp = tmp->next;
3221		}
3222		if (tmp == NULL)
3223			break;
3224		/* Disconnect from the P2P group and deinit the interface */
3225		wpas_p2p_disconnect(tmp);
3226	}
3227
3228	/*
3229	 * Deinit GO data on any possibly remaining interface (if main
3230	 * interface is used as GO).
3231	 */
3232	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
3233		if (wpa_s->ap_iface)
3234			wpas_p2p_group_deinit(wpa_s);
3235	}
3236
3237	p2p_deinit(global->p2p);
3238	global->p2p = NULL;
3239	global->p2p_init_wpa_s = NULL;
3240}
3241
3242
3243static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s)
3244{
3245	if (wpa_s->conf->p2p_no_group_iface)
3246		return 0; /* separate interface disabled per configuration */
3247	if (wpa_s->drv_flags &
3248	    (WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE |
3249	     WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P))
3250		return 1; /* P2P group requires a new interface in every case
3251			   */
3252	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CONCURRENT))
3253		return 0; /* driver does not support concurrent operations */
3254	if (wpa_s->global->ifaces->next)
3255		return 1; /* more that one interface already in use */
3256	if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
3257		return 1; /* this interface is already in use */
3258	return 0;
3259}
3260
3261
3262static int wpas_p2p_start_go_neg(struct wpa_supplicant *wpa_s,
3263				 const u8 *peer_addr,
3264				 enum p2p_wps_method wps_method,
3265				 int go_intent, const u8 *own_interface_addr,
3266				 unsigned int force_freq, int persistent_group,
3267				 struct wpa_ssid *ssid, unsigned int pref_freq)
3268{
3269	if (persistent_group && wpa_s->conf->persistent_reconnect)
3270		persistent_group = 2;
3271
3272	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
3273		return wpa_drv_p2p_connect(wpa_s, peer_addr, wps_method,
3274					   go_intent, own_interface_addr,
3275					   force_freq, persistent_group);
3276	}
3277
3278	/*
3279	 * Increase GO config timeout if HT40 is used since it takes some time
3280	 * to scan channels for coex purposes before the BSS can be started.
3281	 */
3282	p2p_set_config_timeout(wpa_s->global->p2p,
3283			       wpa_s->p2p_go_ht40 ? 255 : 100, 20);
3284
3285	return p2p_connect(wpa_s->global->p2p, peer_addr, wps_method,
3286			   go_intent, own_interface_addr, force_freq,
3287			   persistent_group, ssid ? ssid->ssid : NULL,
3288			   ssid ? ssid->ssid_len : 0,
3289			   wpa_s->p2p_pd_before_go_neg, pref_freq);
3290}
3291
3292
3293static int wpas_p2p_auth_go_neg(struct wpa_supplicant *wpa_s,
3294				const u8 *peer_addr,
3295				enum p2p_wps_method wps_method,
3296				int go_intent, const u8 *own_interface_addr,
3297				unsigned int force_freq, int persistent_group,
3298				struct wpa_ssid *ssid, unsigned int pref_freq)
3299{
3300	if (persistent_group && wpa_s->conf->persistent_reconnect)
3301		persistent_group = 2;
3302
3303	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
3304		return -1;
3305
3306	return p2p_authorize(wpa_s->global->p2p, peer_addr, wps_method,
3307			     go_intent, own_interface_addr, force_freq,
3308			     persistent_group, ssid ? ssid->ssid : NULL,
3309			     ssid ? ssid->ssid_len : 0, pref_freq);
3310}
3311
3312
3313static void wpas_p2p_check_join_scan_limit(struct wpa_supplicant *wpa_s)
3314{
3315	wpa_s->p2p_join_scan_count++;
3316	wpa_printf(MSG_DEBUG, "P2P: Join scan attempt %d",
3317		   wpa_s->p2p_join_scan_count);
3318	if (wpa_s->p2p_join_scan_count > P2P_MAX_JOIN_SCAN_ATTEMPTS) {
3319		wpa_printf(MSG_DEBUG, "P2P: Failed to find GO " MACSTR
3320			   " for join operationg - stop join attempt",
3321			   MAC2STR(wpa_s->pending_join_iface_addr));
3322		eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
3323		if (wpa_s->p2p_auto_pd) {
3324			wpa_s->p2p_auto_pd = 0;
3325			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
3326				" p2p_dev_addr=" MACSTR " status=N/A",
3327				MAC2STR(wpa_s->pending_join_dev_addr));
3328			return;
3329		}
3330		wpa_msg(wpa_s->parent, MSG_INFO,
3331			P2P_EVENT_GROUP_FORMATION_FAILURE);
3332	}
3333}
3334
3335
3336static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq)
3337{
3338	struct wpa_supplicant *iface;
3339	int shared_freq;
3340	u8 bssid[ETH_ALEN];
3341
3342	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)
3343		return 0;
3344
3345	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
3346		if (!wpas_p2p_create_iface(wpa_s) && iface == wpa_s)
3347			continue;
3348		if (iface->current_ssid == NULL || iface->assoc_freq == 0)
3349			continue;
3350		if (iface->current_ssid->mode == WPAS_MODE_AP ||
3351		    iface->current_ssid->mode == WPAS_MODE_P2P_GO)
3352			shared_freq = iface->current_ssid->frequency;
3353		else if (wpa_drv_get_bssid(iface, bssid) == 0)
3354			shared_freq = iface->assoc_freq;
3355		else
3356			shared_freq = 0;
3357
3358		if (shared_freq && freq != shared_freq) {
3359			wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - %s "
3360				   "connected on %d MHz - new connection on "
3361				   "%d MHz", iface->ifname, shared_freq, freq);
3362			return 1;
3363		}
3364	}
3365
3366	shared_freq = wpa_drv_shared_freq(wpa_s);
3367	if (shared_freq > 0 && shared_freq != freq) {
3368		wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - shared "
3369			   "virtual interface connected on %d MHz - new "
3370			   "connection on %d MHz", shared_freq, freq);
3371		return 1;
3372	}
3373
3374	return 0;
3375}
3376
3377
3378static int wpas_p2p_peer_go(struct wpa_supplicant *wpa_s,
3379			    const u8 *peer_dev_addr)
3380{
3381	struct wpa_bss *bss;
3382	int updated;
3383
3384	bss = wpa_bss_get_p2p_dev_addr(wpa_s, peer_dev_addr);
3385	if (bss == NULL)
3386		return -1;
3387	if (bss->last_update_idx < wpa_s->bss_update_idx) {
3388		wpa_printf(MSG_DEBUG, "P2P: Peer BSS entry not updated in the "
3389			   "last scan");
3390		return 0;
3391	}
3392
3393	updated = os_time_before(&wpa_s->p2p_auto_started, &bss->last_update);
3394	wpa_printf(MSG_DEBUG, "P2P: Current BSS entry for peer updated at "
3395		   "%ld.%06ld (%supdated in last scan)",
3396		   bss->last_update.sec, bss->last_update.usec,
3397		   updated ? "": "not ");
3398
3399	return updated;
3400}
3401
3402
3403static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
3404				   struct wpa_scan_results *scan_res)
3405{
3406	struct wpa_bss *bss;
3407	int freq;
3408	u8 iface_addr[ETH_ALEN];
3409
3410	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
3411
3412	if (wpa_s->global->p2p_disabled)
3413		return;
3414
3415	wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS) for %sjoin",
3416		   scan_res ? (int) scan_res->num : -1,
3417		   wpa_s->p2p_auto_join ? "auto_" : "");
3418
3419	if (scan_res)
3420		wpas_p2p_scan_res_handler(wpa_s, scan_res);
3421
3422	if (wpa_s->p2p_auto_pd) {
3423		int join = wpas_p2p_peer_go(wpa_s,
3424					    wpa_s->pending_join_dev_addr);
3425		if (join == 0 &&
3426		    wpa_s->auto_pd_scan_retry < P2P_AUTO_PD_SCAN_ATTEMPTS) {
3427			wpa_s->auto_pd_scan_retry++;
3428			bss = wpa_bss_get_bssid_latest(
3429				wpa_s, wpa_s->pending_join_dev_addr);
3430			if (bss) {
3431				freq = bss->freq;
3432				wpa_printf(MSG_DEBUG, "P2P: Scan retry %d for "
3433					   "the peer " MACSTR " at %d MHz",
3434					   wpa_s->auto_pd_scan_retry,
3435					   MAC2STR(wpa_s->
3436						   pending_join_dev_addr),
3437					   freq);
3438				wpas_p2p_join_scan_req(wpa_s, freq);
3439				return;
3440			}
3441		}
3442
3443		if (join < 0)
3444			join = 0;
3445
3446		wpa_s->p2p_auto_pd = 0;
3447		wpa_s->pending_pd_use = join ? AUTO_PD_JOIN : AUTO_PD_GO_NEG;
3448		wpa_printf(MSG_DEBUG, "P2P: Auto PD with " MACSTR " join=%d",
3449			   MAC2STR(wpa_s->pending_join_dev_addr), join);
3450		if (p2p_prov_disc_req(wpa_s->global->p2p,
3451				      wpa_s->pending_join_dev_addr,
3452				      wpa_s->pending_pd_config_methods, join,
3453				      0, wpa_s->user_initiated_pd) < 0) {
3454			wpa_s->p2p_auto_pd = 0;
3455			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
3456				" p2p_dev_addr=" MACSTR " status=N/A",
3457				MAC2STR(wpa_s->pending_join_dev_addr));
3458		}
3459		return;
3460	}
3461
3462	if (wpa_s->p2p_auto_join) {
3463		int join = wpas_p2p_peer_go(wpa_s,
3464					    wpa_s->pending_join_dev_addr);
3465		if (join < 0) {
3466			wpa_printf(MSG_DEBUG, "P2P: Peer was not found to be "
3467				   "running a GO -> use GO Negotiation");
3468			wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr,
3469					 wpa_s->p2p_pin, wpa_s->p2p_wps_method,
3470					 wpa_s->p2p_persistent_group, 0, 0, 0,
3471					 wpa_s->p2p_go_intent,
3472					 wpa_s->p2p_connect_freq,
3473					 wpa_s->p2p_persistent_id,
3474					 wpa_s->p2p_pd_before_go_neg,
3475					 wpa_s->p2p_go_ht40);
3476			return;
3477		}
3478
3479		wpa_printf(MSG_DEBUG, "P2P: Peer was found running GO%s -> "
3480			   "try to join the group", join ? "" :
3481			   " in older scan");
3482		if (!join)
3483			wpa_s->p2p_fallback_to_go_neg = 1;
3484	}
3485
3486	freq = p2p_get_oper_freq(wpa_s->global->p2p,
3487				 wpa_s->pending_join_iface_addr);
3488	if (freq < 0 &&
3489	    p2p_get_interface_addr(wpa_s->global->p2p,
3490				   wpa_s->pending_join_dev_addr,
3491				   iface_addr) == 0 &&
3492	    os_memcmp(iface_addr, wpa_s->pending_join_dev_addr, ETH_ALEN) != 0)
3493	{
3494		wpa_printf(MSG_DEBUG, "P2P: Overwrite pending interface "
3495			   "address for join from " MACSTR " to " MACSTR
3496			   " based on newly discovered P2P peer entry",
3497			   MAC2STR(wpa_s->pending_join_iface_addr),
3498			   MAC2STR(iface_addr));
3499		os_memcpy(wpa_s->pending_join_iface_addr, iface_addr,
3500			  ETH_ALEN);
3501
3502		freq = p2p_get_oper_freq(wpa_s->global->p2p,
3503					 wpa_s->pending_join_iface_addr);
3504	}
3505	if (freq >= 0) {
3506		wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
3507			   "from P2P peer table: %d MHz", freq);
3508	}
3509	bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->pending_join_iface_addr);
3510	if (bss) {
3511		freq = bss->freq;
3512		wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
3513			   "from BSS table: %d MHz", freq);
3514	}
3515	if (freq > 0) {
3516		u16 method;
3517
3518		if (wpas_check_freq_conflict(wpa_s, freq) > 0) {
3519			wpa_msg(wpa_s->parent, MSG_INFO,
3520				P2P_EVENT_GROUP_FORMATION_FAILURE
3521				"reason=FREQ_CONFLICT");
3522			return;
3523		}
3524
3525		wpa_printf(MSG_DEBUG, "P2P: Send Provision Discovery Request "
3526			   "prior to joining an existing group (GO " MACSTR
3527			   " freq=%u MHz)",
3528			   MAC2STR(wpa_s->pending_join_dev_addr), freq);
3529		wpa_s->pending_pd_before_join = 1;
3530
3531		switch (wpa_s->pending_join_wps_method) {
3532		case WPS_PIN_DISPLAY:
3533			method = WPS_CONFIG_KEYPAD;
3534			break;
3535		case WPS_PIN_KEYPAD:
3536			method = WPS_CONFIG_DISPLAY;
3537			break;
3538		case WPS_PBC:
3539			method = WPS_CONFIG_PUSHBUTTON;
3540			break;
3541		default:
3542			method = 0;
3543			break;
3544		}
3545
3546		if ((p2p_get_provisioning_info(wpa_s->global->p2p,
3547					       wpa_s->pending_join_dev_addr) ==
3548		     method)) {
3549			/*
3550			 * We have already performed provision discovery for
3551			 * joining the group. Proceed directly to join
3552			 * operation without duplicated provision discovery. */
3553			wpa_printf(MSG_DEBUG, "P2P: Provision discovery "
3554				   "with " MACSTR " already done - proceed to "
3555				   "join",
3556				   MAC2STR(wpa_s->pending_join_dev_addr));
3557			wpa_s->pending_pd_before_join = 0;
3558			goto start;
3559		}
3560
3561		if (p2p_prov_disc_req(wpa_s->global->p2p,
3562				      wpa_s->pending_join_dev_addr, method, 1,
3563				      freq, wpa_s->user_initiated_pd) < 0) {
3564			wpa_printf(MSG_DEBUG, "P2P: Failed to send Provision "
3565				   "Discovery Request before joining an "
3566				   "existing group");
3567			wpa_s->pending_pd_before_join = 0;
3568			goto start;
3569		}
3570		return;
3571	}
3572
3573	wpa_printf(MSG_DEBUG, "P2P: Failed to find BSS/GO - try again later");
3574	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
3575	eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
3576	wpas_p2p_check_join_scan_limit(wpa_s);
3577	return;
3578
3579start:
3580	/* Start join operation immediately */
3581	wpas_p2p_join_start(wpa_s);
3582}
3583
3584
3585static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq)
3586{
3587	int ret;
3588	struct wpa_driver_scan_params params;
3589	struct wpabuf *wps_ie, *ies;
3590	size_t ielen;
3591	int freqs[2] = { 0, 0 };
3592#ifdef ANDROID_P2P
3593	int oper_freq;
3594
3595	/* If freq is not provided, check the operating freq of the GO and do a
3596	 * a directed scan to save time
3597	 */
3598	if(!freq) {
3599		freq = (oper_freq = p2p_get_oper_freq(wpa_s->global->p2p,
3600			 wpa_s->pending_join_iface_addr) == -1) ? 0 : oper_freq;
3601	}
3602#endif
3603	os_memset(&params, 0, sizeof(params));
3604
3605	/* P2P Wildcard SSID */
3606	params.num_ssids = 1;
3607	params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
3608	params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
3609
3610	wpa_s->wps->dev.p2p = 1;
3611	wps_ie = wps_build_probe_req_ie(DEV_PW_DEFAULT, &wpa_s->wps->dev,
3612					wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 0,
3613					NULL);
3614	if (wps_ie == NULL) {
3615		wpas_p2p_scan_res_join(wpa_s, NULL);
3616		return;
3617	}
3618
3619	ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
3620	ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
3621	if (ies == NULL) {
3622		wpabuf_free(wps_ie);
3623		wpas_p2p_scan_res_join(wpa_s, NULL);
3624		return;
3625	}
3626	wpabuf_put_buf(ies, wps_ie);
3627	wpabuf_free(wps_ie);
3628
3629	p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
3630
3631	params.p2p_probe = 1;
3632	params.extra_ies = wpabuf_head(ies);
3633	params.extra_ies_len = wpabuf_len(ies);
3634	if (freq > 0) {
3635		freqs[0] = freq;
3636		params.freqs = freqs;
3637	}
3638
3639	/*
3640	 * Run a scan to update BSS table and start Provision Discovery once
3641	 * the new scan results become available.
3642	 */
3643	ret = wpa_drv_scan(wpa_s, &params);
3644	if (!ret) {
3645		os_get_time(&wpa_s->scan_trigger_time);
3646		wpa_s->scan_res_handler = wpas_p2p_scan_res_join;
3647	}
3648
3649	wpabuf_free(ies);
3650
3651	if (ret) {
3652		wpa_printf(MSG_DEBUG, "P2P: Failed to start scan for join - "
3653			   "try again later");
3654		eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
3655		eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
3656		wpas_p2p_check_join_scan_limit(wpa_s);
3657	}
3658}
3659
3660
3661static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx)
3662{
3663	struct wpa_supplicant *wpa_s = eloop_ctx;
3664	wpas_p2p_join_scan_req(wpa_s, 0);
3665}
3666
3667
3668static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
3669			 const u8 *dev_addr, enum p2p_wps_method wps_method,
3670			 int auto_join)
3671{
3672	wpa_printf(MSG_DEBUG, "P2P: Request to join existing group (iface "
3673		   MACSTR " dev " MACSTR ")%s",
3674		   MAC2STR(iface_addr), MAC2STR(dev_addr),
3675		   auto_join ? " (auto_join)" : "");
3676
3677	wpa_s->p2p_auto_pd = 0;
3678	wpa_s->p2p_auto_join = !!auto_join;
3679	os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, ETH_ALEN);
3680	os_memcpy(wpa_s->pending_join_dev_addr, dev_addr, ETH_ALEN);
3681	wpa_s->pending_join_wps_method = wps_method;
3682
3683	/* Make sure we are not running find during connection establishment */
3684	wpas_p2p_stop_find(wpa_s);
3685
3686	wpa_s->p2p_join_scan_count = 0;
3687	wpas_p2p_join_scan(wpa_s, NULL);
3688	return 0;
3689}
3690
3691
3692static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s)
3693{
3694	struct wpa_supplicant *group;
3695	struct p2p_go_neg_results res;
3696	struct wpa_bss *bss;
3697
3698	group = wpas_p2p_get_group_iface(wpa_s, 0, 0);
3699	if (group == NULL)
3700		return -1;
3701	if (group != wpa_s) {
3702		os_memcpy(group->p2p_pin, wpa_s->p2p_pin,
3703			  sizeof(group->p2p_pin));
3704		group->p2p_wps_method = wpa_s->p2p_wps_method;
3705	} else {
3706		/*
3707		 * Need to mark the current interface for p2p_group_formation
3708		 * when a separate group interface is not used. This is needed
3709		 * to allow p2p_cancel stop a pending p2p_connect-join.
3710		 * wpas_p2p_init_group_interface() addresses this for the case
3711		 * where a separate group interface is used.
3712		 */
3713		wpa_s->global->p2p_group_formation = wpa_s;
3714	}
3715
3716	group->p2p_in_provisioning = 1;
3717	group->p2p_fallback_to_go_neg = wpa_s->p2p_fallback_to_go_neg;
3718
3719	os_memset(&res, 0, sizeof(res));
3720	os_memcpy(res.peer_interface_addr, wpa_s->pending_join_iface_addr,
3721		  ETH_ALEN);
3722	res.wps_method = wpa_s->pending_join_wps_method;
3723	bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->pending_join_iface_addr);
3724	if (bss) {
3725		res.freq = bss->freq;
3726		res.ssid_len = bss->ssid_len;
3727		os_memcpy(res.ssid, bss->ssid, bss->ssid_len);
3728	}
3729
3730	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
3731		wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel prior to "
3732			   "starting client");
3733		wpa_drv_cancel_remain_on_channel(wpa_s);
3734		wpa_s->off_channel_freq = 0;
3735		wpa_s->roc_waiting_drv_freq = 0;
3736	}
3737	wpas_start_wps_enrollee(group, &res);
3738
3739	/*
3740	 * Allow a longer timeout for join-a-running-group than normal 15
3741	 * second group formation timeout since the GO may not have authorized
3742	 * our connection yet.
3743	 */
3744	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
3745	eloop_register_timeout(60, 0, wpas_p2p_group_formation_timeout,
3746			       wpa_s, NULL);
3747
3748	return 0;
3749}
3750
3751
3752static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq,
3753				int *force_freq, int *pref_freq,
3754				int *oper_freq)
3755{
3756	if (freq > 0) {
3757		if (!p2p_supported_freq(wpa_s->global->p2p, freq)) {
3758			wpa_printf(MSG_DEBUG, "P2P: The forced channel "
3759				   "(%u MHz) is not supported for P2P uses",
3760				   freq);
3761			return -3;
3762		}
3763
3764		if (*oper_freq > 0 && freq != *oper_freq &&
3765		    !(wpa_s->drv_flags &
3766		      WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
3767			wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group "
3768				   "on %u MHz while connected on another "
3769				   "channel (%u MHz)", freq, *oper_freq);
3770			return -2;
3771		}
3772		wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the "
3773			   "requested channel (%u MHz)", freq);
3774		*force_freq = freq;
3775	} else if (*oper_freq > 0 &&
3776		   !p2p_supported_freq(wpa_s->global->p2p, *oper_freq)) {
3777		if (!(wpa_s->drv_flags &
3778		      WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
3779			wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group "
3780				   "while connected on non-P2P supported "
3781				   "channel (%u MHz)", *oper_freq);
3782			return -2;
3783		}
3784		wpa_printf(MSG_DEBUG, "P2P: Current operating channel "
3785			   "(%u MHz) not available for P2P - try to use "
3786			   "another channel", *oper_freq);
3787		*force_freq = 0;
3788	} else if (*oper_freq > 0 && *pref_freq == 0 &&
3789		   (wpa_s->drv_flags &
3790		    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
3791		wpa_printf(MSG_DEBUG, "P2P: Trying to prefer the channel we "
3792			   "are already using (%u MHz) on another interface",
3793			   *oper_freq);
3794		*pref_freq = *oper_freq;
3795	} else if (*oper_freq > 0) {
3796		wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the "
3797			   "channel we are already using (%u MHz) on another "
3798			   "interface", *oper_freq);
3799		*force_freq = *oper_freq;
3800	}
3801
3802	return 0;
3803}
3804
3805
3806/**
3807 * wpas_p2p_connect - Request P2P Group Formation to be started
3808 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
3809 * @peer_addr: Address of the peer P2P Device
3810 * @pin: PIN to use during provisioning or %NULL to indicate PBC mode
3811 * @persistent_group: Whether to create a persistent group
3812 * @auto_join: Whether to select join vs. GO Negotiation automatically
3813 * @join: Whether to join an existing group (as a client) instead of starting
3814 *	Group Owner negotiation; @peer_addr is BSSID in that case
3815 * @auth: Whether to only authorize the connection instead of doing that and
3816 *	initiating Group Owner negotiation
3817 * @go_intent: GO Intent or -1 to use default
3818 * @freq: Frequency for the group or 0 for auto-selection
3819 * @persistent_id: Persistent group credentials to use for forcing GO
3820 *	parameters or -1 to generate new values (SSID/passphrase)
3821 * @pd: Whether to send Provision Discovery prior to GO Negotiation as an
3822 *	interoperability workaround when initiating group formation
3823 * @ht40: Start GO with 40 MHz channel width
3824 * Returns: 0 or new PIN (if pin was %NULL) on success, -1 on unspecified
3825 *	failure, -2 on failure due to channel not currently available,
3826 *	-3 if forced channel is not supported
3827 */
3828int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
3829		     const char *pin, enum p2p_wps_method wps_method,
3830		     int persistent_group, int auto_join, int join, int auth,
3831		     int go_intent, int freq, int persistent_id, int pd,
3832		     int ht40)
3833{
3834	int force_freq = 0, pref_freq = 0, oper_freq = 0;
3835	u8 bssid[ETH_ALEN];
3836	int ret = 0, res;
3837	enum wpa_driver_if_type iftype;
3838	const u8 *if_addr;
3839	struct wpa_ssid *ssid = NULL;
3840
3841	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
3842		return -1;
3843
3844	if (persistent_id >= 0) {
3845		ssid = wpa_config_get_network(wpa_s->conf, persistent_id);
3846		if (ssid == NULL || ssid->disabled != 2 ||
3847		    ssid->mode != WPAS_MODE_P2P_GO)
3848			return -1;
3849	}
3850
3851	if (go_intent < 0)
3852		go_intent = wpa_s->conf->p2p_go_intent;
3853
3854	if (!auth)
3855		wpa_s->p2p_long_listen = 0;
3856
3857	wpa_s->p2p_wps_method = wps_method;
3858	wpa_s->p2p_persistent_group = !!persistent_group;
3859	wpa_s->p2p_persistent_id = persistent_id;
3860	wpa_s->p2p_go_intent = go_intent;
3861	wpa_s->p2p_connect_freq = freq;
3862	wpa_s->p2p_fallback_to_go_neg = 0;
3863	wpa_s->p2p_pd_before_go_neg = !!pd;
3864	wpa_s->p2p_go_ht40 = !!ht40;
3865
3866	if (pin)
3867		os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
3868	else if (wps_method == WPS_PIN_DISPLAY) {
3869		ret = wps_generate_pin();
3870		os_snprintf(wpa_s->p2p_pin, sizeof(wpa_s->p2p_pin), "%08d",
3871			    ret);
3872		wpa_printf(MSG_DEBUG, "P2P: Randomly generated PIN: %s",
3873			   wpa_s->p2p_pin);
3874	} else
3875		wpa_s->p2p_pin[0] = '\0';
3876
3877	if (join || auto_join) {
3878		u8 iface_addr[ETH_ALEN], dev_addr[ETH_ALEN];
3879		if (auth) {
3880			wpa_printf(MSG_DEBUG, "P2P: Authorize invitation to "
3881				   "connect a running group from " MACSTR,
3882				   MAC2STR(peer_addr));
3883			os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
3884			return ret;
3885		}
3886		os_memcpy(dev_addr, peer_addr, ETH_ALEN);
3887		if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr,
3888					   iface_addr) < 0) {
3889			os_memcpy(iface_addr, peer_addr, ETH_ALEN);
3890			p2p_get_dev_addr(wpa_s->global->p2p, peer_addr,
3891					 dev_addr);
3892		}
3893		if (auto_join) {
3894			os_get_time(&wpa_s->p2p_auto_started);
3895			wpa_printf(MSG_DEBUG, "P2P: Auto join started at "
3896				   "%ld.%06ld",
3897				   wpa_s->p2p_auto_started.sec,
3898				   wpa_s->p2p_auto_started.usec);
3899		}
3900		wpa_s->user_initiated_pd = 1;
3901		if (wpas_p2p_join(wpa_s, iface_addr, dev_addr, wps_method,
3902				  auto_join) < 0)
3903			return -1;
3904		return ret;
3905	}
3906
3907	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid) == 0 &&
3908	    wpa_s->assoc_freq) {
3909		oper_freq = wpa_s->assoc_freq;
3910	} else {
3911		oper_freq = wpa_drv_shared_freq(wpa_s);
3912		if (oper_freq < 0)
3913			oper_freq = 0;
3914	}
3915
3916	res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
3917				   &oper_freq);
3918	if (res)
3919		return res;
3920	wpas_p2p_set_own_freq_preference(wpa_s, oper_freq);
3921
3922	wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
3923
3924	if (wpa_s->create_p2p_iface) {
3925		/* Prepare to add a new interface for the group */
3926		iftype = WPA_IF_P2P_GROUP;
3927		if (go_intent == 15)
3928			iftype = WPA_IF_P2P_GO;
3929		if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
3930			wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
3931				   "interface for the group");
3932			return -1;
3933		}
3934
3935		if_addr = wpa_s->pending_interface_addr;
3936	} else
3937		if_addr = wpa_s->own_addr;
3938
3939	if (auth) {
3940		if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method,
3941					 go_intent, if_addr,
3942					 force_freq, persistent_group, ssid,
3943					 pref_freq) < 0)
3944			return -1;
3945		return ret;
3946	}
3947
3948	if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method,
3949				  go_intent, if_addr, force_freq,
3950				  persistent_group, ssid, pref_freq) < 0) {
3951		if (wpa_s->create_p2p_iface)
3952			wpas_p2p_remove_pending_group_interface(wpa_s);
3953		return -1;
3954	}
3955	return ret;
3956}
3957
3958
3959/**
3960 * wpas_p2p_remain_on_channel_cb - Indication of remain-on-channel start
3961 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
3962 * @freq: Frequency of the channel in MHz
3963 * @duration: Duration of the stay on the channel in milliseconds
3964 *
3965 * This callback is called when the driver indicates that it has started the
3966 * requested remain-on-channel duration.
3967 */
3968void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
3969				   unsigned int freq, unsigned int duration)
3970{
3971	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
3972		return;
3973	if (wpa_s->off_channel_freq == wpa_s->pending_listen_freq) {
3974		p2p_listen_cb(wpa_s->global->p2p, wpa_s->pending_listen_freq,
3975			      wpa_s->pending_listen_duration);
3976		wpa_s->pending_listen_freq = 0;
3977	}
3978}
3979
3980
3981static int wpas_p2p_listen_start(struct wpa_supplicant *wpa_s,
3982				 unsigned int timeout)
3983{
3984	/* Limit maximum Listen state time based on driver limitation. */
3985	if (timeout > wpa_s->max_remain_on_chan)
3986		timeout = wpa_s->max_remain_on_chan;
3987
3988	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
3989		return wpa_drv_p2p_listen(wpa_s, timeout);
3990
3991	return p2p_listen(wpa_s->global->p2p, timeout);
3992}
3993
3994
3995/**
3996 * wpas_p2p_cancel_remain_on_channel_cb - Remain-on-channel timeout
3997 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
3998 * @freq: Frequency of the channel in MHz
3999 *
4000 * This callback is called when the driver indicates that a remain-on-channel
4001 * operation has been completed, i.e., the duration on the requested channel
4002 * has timed out.
4003 */
4004void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
4005					  unsigned int freq)
4006{
4007	wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel callback "
4008		   "(p2p_long_listen=%d ms pending_action_tx=%p)",
4009		   wpa_s->p2p_long_listen, offchannel_pending_action_tx(wpa_s));
4010	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4011		return;
4012	if (p2p_listen_end(wpa_s->global->p2p, freq) > 0)
4013		return; /* P2P module started a new operation */
4014	if (offchannel_pending_action_tx(wpa_s))
4015		return;
4016	if (wpa_s->p2p_long_listen > 0)
4017		wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
4018	if (wpa_s->p2p_long_listen > 0) {
4019		wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
4020		wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
4021	}
4022}
4023
4024
4025/**
4026 * wpas_p2p_group_remove - Remove a P2P group
4027 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4028 * @ifname: Network interface name of the group interface or "*" to remove all
4029 *	groups
4030 * Returns: 0 on success, -1 on failure
4031 *
4032 * This function is used to remove a P2P group. This can be used to disconnect
4033 * from a group in which the local end is a P2P Client or to end a P2P Group in
4034 * case the local end is the Group Owner. If a virtual network interface was
4035 * created for this group, that interface will be removed. Otherwise, only the
4036 * configured P2P group network will be removed from the interface.
4037 */
4038int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
4039{
4040	struct wpa_global *global = wpa_s->global;
4041
4042	if (os_strcmp(ifname, "*") == 0) {
4043		struct wpa_supplicant *prev;
4044		wpa_s = global->ifaces;
4045		while (wpa_s) {
4046			prev = wpa_s;
4047			wpa_s = wpa_s->next;
4048			wpas_p2p_disconnect(prev);
4049		}
4050		return 0;
4051	}
4052
4053	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4054		if (os_strcmp(wpa_s->ifname, ifname) == 0)
4055			break;
4056	}
4057
4058	return wpas_p2p_disconnect(wpa_s);
4059}
4060
4061
4062static int freq_included(const struct p2p_channels *channels, unsigned int freq)
4063{
4064	if (channels == NULL)
4065		return 1; /* Assume no restrictions */
4066	return p2p_channels_includes_freq(channels, freq);
4067}
4068
4069
4070static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
4071				   struct p2p_go_neg_results *params,
4072				   int freq, int ht40,
4073				   const struct p2p_channels *channels)
4074{
4075	u8 bssid[ETH_ALEN];
4076	int res;
4077
4078	os_memset(params, 0, sizeof(*params));
4079	params->role_go = 1;
4080	params->ht40 = ht40;
4081	if (freq) {
4082		if (!freq_included(channels, freq)) {
4083			wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not "
4084				   "accepted", freq);
4085			return -1;
4086		}
4087		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on forced "
4088			   "frequency %d MHz", freq);
4089		params->freq = freq;
4090	} else if (wpa_s->conf->p2p_oper_reg_class == 81 &&
4091		   wpa_s->conf->p2p_oper_channel >= 1 &&
4092		   wpa_s->conf->p2p_oper_channel <= 11 &&
4093		   freq_included(channels,
4094				 2407 + 5 * wpa_s->conf->p2p_oper_channel)) {
4095		params->freq = 2407 + 5 * wpa_s->conf->p2p_oper_channel;
4096		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
4097			   "frequency %d MHz", params->freq);
4098	} else if ((wpa_s->conf->p2p_oper_reg_class == 115 ||
4099		    wpa_s->conf->p2p_oper_reg_class == 116 ||
4100		    wpa_s->conf->p2p_oper_reg_class == 117 ||
4101		    wpa_s->conf->p2p_oper_reg_class == 124 ||
4102		    wpa_s->conf->p2p_oper_reg_class == 126 ||
4103		    wpa_s->conf->p2p_oper_reg_class == 127) &&
4104		   freq_included(channels,
4105				 5000 + 5 * wpa_s->conf->p2p_oper_channel)) {
4106		params->freq = 5000 + 5 * wpa_s->conf->p2p_oper_channel;
4107		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
4108			   "frequency %d MHz", params->freq);
4109	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
4110		   wpa_s->best_overall_freq > 0 &&
4111		   p2p_supported_freq(wpa_s->global->p2p,
4112				      wpa_s->best_overall_freq) &&
4113		   freq_included(channels, wpa_s->best_overall_freq)) {
4114		params->freq = wpa_s->best_overall_freq;
4115		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best overall "
4116			   "channel %d MHz", params->freq);
4117	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
4118		   wpa_s->best_24_freq > 0 &&
4119		   p2p_supported_freq(wpa_s->global->p2p,
4120				      wpa_s->best_24_freq) &&
4121		   freq_included(channels, wpa_s->best_24_freq)) {
4122		params->freq = wpa_s->best_24_freq;
4123		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 2.4 GHz "
4124			   "channel %d MHz", params->freq);
4125	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
4126		   wpa_s->best_5_freq > 0 &&
4127		   p2p_supported_freq(wpa_s->global->p2p,
4128				      wpa_s->best_5_freq) &&
4129		   freq_included(channels, wpa_s->best_5_freq)) {
4130		params->freq = wpa_s->best_5_freq;
4131		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 5 GHz "
4132			   "channel %d MHz", params->freq);
4133	} else {
4134		int chan;
4135		for (chan = 0; chan < 11; chan++) {
4136			params->freq = 2412 + chan * 5;
4137			if (!wpas_p2p_disallowed_freq(wpa_s->global,
4138						      params->freq) &&
4139			    freq_included(channels, params->freq))
4140				break;
4141		}
4142		if (chan == 11) {
4143			wpa_printf(MSG_DEBUG, "P2P: No 2.4 GHz channel "
4144				   "allowed");
4145			return -1;
4146		}
4147		wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz (no preference "
4148			   "known)", params->freq);
4149	}
4150
4151	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid) == 0 &&
4152	    wpa_s->assoc_freq && !freq) {
4153		if (!p2p_supported_freq(wpa_s->global->p2p, wpa_s->assoc_freq)
4154		    || !freq_included(channels, wpa_s->assoc_freq)) {
4155			if (wpa_s->drv_flags &
4156			    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
4157				wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on "
4158					   "the channel we are already using "
4159					   "(%u MHz) - allow multi-channel "
4160					   "concurrency", wpa_s->assoc_freq);
4161			} else {
4162				wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on "
4163					   "the channel we are already using "
4164					   "(%u MHz)", wpa_s->assoc_freq);
4165				return -1;
4166			}
4167		} else {
4168			wpa_printf(MSG_DEBUG, "P2P: Force GO on the channel we "
4169				   "are already using (%u MHz)",
4170				   wpa_s->assoc_freq);
4171			params->freq = wpa_s->assoc_freq;
4172		}
4173	}
4174
4175	res = wpa_drv_shared_freq(wpa_s);
4176	if (res > 0 && !freq &&
4177	    (!p2p_supported_freq(wpa_s->global->p2p, res) ||
4178	     !freq_included(channels, res))) {
4179		if (wpa_s->drv_flags &
4180		    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
4181			wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on the "
4182				   "channel we are already using on a shared "
4183				   "interface (%u MHz) - allow multi-channel "
4184				   "concurrency", res);
4185		} else {
4186			wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on the "
4187				   "channel we are already using on a shared "
4188				   "interface (%u MHz)", res);
4189			return -1;
4190		}
4191	} else if (res > 0 && !freq) {
4192		wpa_printf(MSG_DEBUG, "P2P: Force GO on the channel we are "
4193			   "already using on a shared interface");
4194		params->freq = res;
4195		if (!freq_included(channels, params->freq)) {
4196			wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not "
4197				   "accepted", params->freq);
4198			return -1;
4199		}
4200	} else if (res > 0 && freq != res &&
4201		   !(wpa_s->drv_flags &
4202		     WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
4203		wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group on %u MHz "
4204			   "while connected on another channel (%u MHz)",
4205			   freq, res);
4206		return -1;
4207	}
4208
4209	return 0;
4210}
4211
4212
4213static struct wpa_supplicant *
4214wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
4215			 int go)
4216{
4217	struct wpa_supplicant *group_wpa_s;
4218
4219	if (!wpas_p2p_create_iface(wpa_s)) {
4220		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use same interface for group "
4221			"operations");
4222		return wpa_s;
4223	}
4224
4225	if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
4226					 WPA_IF_P2P_CLIENT) < 0) {
4227		wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to add group interface");
4228		return NULL;
4229	}
4230	group_wpa_s = wpas_p2p_init_group_interface(wpa_s, go);
4231	if (group_wpa_s == NULL) {
4232		wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to initialize group "
4233			"interface");
4234		wpas_p2p_remove_pending_group_interface(wpa_s);
4235		return NULL;
4236	}
4237
4238	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use separate group interface %s",
4239		group_wpa_s->ifname);
4240	return group_wpa_s;
4241}
4242
4243
4244/**
4245 * wpas_p2p_group_add - Add a new P2P group with local end as Group Owner
4246 * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
4247 * @persistent_group: Whether to create a persistent group
4248 * @freq: Frequency for the group or 0 to indicate no hardcoding
4249 * Returns: 0 on success, -1 on failure
4250 *
4251 * This function creates a new P2P group with the local end as the Group Owner,
4252 * i.e., without using Group Owner Negotiation.
4253 */
4254int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
4255		       int freq, int ht40)
4256{
4257	struct p2p_go_neg_results params;
4258	unsigned int r;
4259
4260	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4261		return -1;
4262
4263	/* Make sure we are not running find during connection establishment */
4264	wpa_printf(MSG_DEBUG, "P2P: Stop any on-going P2P FIND");
4265	wpas_p2p_stop_find_oper(wpa_s);
4266
4267	if (freq == 2) {
4268		wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 2.4 GHz "
4269			   "band");
4270		if (wpa_s->best_24_freq > 0 &&
4271		    p2p_supported_freq(wpa_s->global->p2p,
4272				       wpa_s->best_24_freq)) {
4273			freq = wpa_s->best_24_freq;
4274			wpa_printf(MSG_DEBUG, "P2P: Use best 2.4 GHz band "
4275				   "channel: %d MHz", freq);
4276		} else {
4277			os_get_random((u8 *) &r, sizeof(r));
4278			freq = 2412 + (r % 3) * 25;
4279			wpa_printf(MSG_DEBUG, "P2P: Use random 2.4 GHz band "
4280				   "channel: %d MHz", freq);
4281		}
4282	}
4283
4284	if (freq == 5) {
4285		wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 5 GHz "
4286			   "band");
4287		if (wpa_s->best_5_freq > 0 &&
4288		    p2p_supported_freq(wpa_s->global->p2p,
4289				       wpa_s->best_5_freq)) {
4290			freq = wpa_s->best_5_freq;
4291			wpa_printf(MSG_DEBUG, "P2P: Use best 5 GHz band "
4292				   "channel: %d MHz", freq);
4293		} else {
4294			os_get_random((u8 *) &r, sizeof(r));
4295			freq = 5180 + (r % 4) * 20;
4296			if (!p2p_supported_freq(wpa_s->global->p2p, freq)) {
4297				wpa_printf(MSG_DEBUG, "P2P: Could not select "
4298					   "5 GHz channel for P2P group");
4299				return -1;
4300			}
4301			wpa_printf(MSG_DEBUG, "P2P: Use random 5 GHz band "
4302				   "channel: %d MHz", freq);
4303		}
4304	}
4305
4306	if (freq > 0 && !p2p_supported_freq(wpa_s->global->p2p, freq)) {
4307		wpa_printf(MSG_DEBUG, "P2P: The forced channel for GO "
4308			   "(%u MHz) is not supported for P2P uses",
4309			   freq);
4310		return -1;
4311	}
4312
4313	if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, NULL))
4314		return -1;
4315	if (params.freq &&
4316	    !p2p_supported_freq(wpa_s->global->p2p, params.freq)) {
4317		wpa_printf(MSG_DEBUG, "P2P: The selected channel for GO "
4318			   "(%u MHz) is not supported for P2P uses",
4319			   params.freq);
4320		return -1;
4321	}
4322	p2p_go_params(wpa_s->global->p2p, &params);
4323	params.persistent_group = persistent_group;
4324
4325	wpa_s = wpas_p2p_get_group_iface(wpa_s, 0, 1);
4326	if (wpa_s == NULL)
4327		return -1;
4328	wpas_start_wps_go(wpa_s, &params, 0);
4329
4330	return 0;
4331}
4332
4333
4334static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
4335				 struct wpa_ssid *params, int addr_allocated)
4336{
4337	struct wpa_ssid *ssid;
4338
4339	wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0);
4340	if (wpa_s == NULL)
4341		return -1;
4342
4343	wpa_supplicant_ap_deinit(wpa_s);
4344
4345	ssid = wpa_config_add_network(wpa_s->conf);
4346	if (ssid == NULL)
4347		return -1;
4348	wpa_config_set_network_defaults(ssid);
4349	ssid->temporary = 1;
4350	ssid->proto = WPA_PROTO_RSN;
4351	ssid->pairwise_cipher = WPA_CIPHER_CCMP;
4352	ssid->group_cipher = WPA_CIPHER_CCMP;
4353	ssid->key_mgmt = WPA_KEY_MGMT_PSK;
4354	ssid->ssid = os_malloc(params->ssid_len);
4355	if (ssid->ssid == NULL) {
4356		wpa_config_remove_network(wpa_s->conf, ssid->id);
4357		return -1;
4358	}
4359	os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
4360	ssid->ssid_len = params->ssid_len;
4361	ssid->p2p_group = 1;
4362	ssid->export_keys = 1;
4363	if (params->psk_set) {
4364		os_memcpy(ssid->psk, params->psk, 32);
4365		ssid->psk_set = 1;
4366	}
4367	if (params->passphrase)
4368		ssid->passphrase = os_strdup(params->passphrase);
4369
4370	wpa_supplicant_select_network(wpa_s, ssid);
4371
4372	wpa_s->show_group_started = 1;
4373
4374	return 0;
4375}
4376
4377
4378int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
4379				  struct wpa_ssid *ssid, int addr_allocated,
4380				  int freq, int ht40,
4381				  const struct p2p_channels *channels)
4382{
4383	struct p2p_go_neg_results params;
4384	int go = 0;
4385
4386	if (ssid->disabled != 2 || ssid->ssid == NULL)
4387		return -1;
4388
4389	if (wpas_get_p2p_group(wpa_s, ssid->ssid, ssid->ssid_len, &go) &&
4390	    go == (ssid->mode == WPAS_MODE_P2P_GO)) {
4391		wpa_printf(MSG_DEBUG, "P2P: Requested persistent group is "
4392			   "already running");
4393		return 0;
4394	}
4395
4396	/* Make sure we are not running find during connection establishment */
4397	wpas_p2p_stop_find_oper(wpa_s);
4398
4399	wpa_s->p2p_fallback_to_go_neg = 0;
4400
4401	if (ssid->mode == WPAS_MODE_INFRA)
4402		return wpas_start_p2p_client(wpa_s, ssid, addr_allocated);
4403
4404	if (ssid->mode != WPAS_MODE_P2P_GO)
4405		return -1;
4406
4407	if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, channels))
4408		return -1;
4409
4410	params.role_go = 1;
4411	params.psk_set = ssid->psk_set;
4412	if (params.psk_set)
4413		os_memcpy(params.psk, ssid->psk, sizeof(params.psk));
4414	if (ssid->passphrase) {
4415		if (os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
4416			wpa_printf(MSG_ERROR, "P2P: Invalid passphrase in "
4417				   "persistent group");
4418			return -1;
4419		}
4420		os_strlcpy(params.passphrase, ssid->passphrase,
4421			   sizeof(params.passphrase));
4422	}
4423	os_memcpy(params.ssid, ssid->ssid, ssid->ssid_len);
4424	params.ssid_len = ssid->ssid_len;
4425	params.persistent_group = 1;
4426
4427	wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1);
4428	if (wpa_s == NULL)
4429		return -1;
4430
4431	wpas_start_wps_go(wpa_s, &params, 0);
4432
4433	return 0;
4434}
4435
4436
4437static void wpas_p2p_ie_update(void *ctx, struct wpabuf *beacon_ies,
4438			       struct wpabuf *proberesp_ies)
4439{
4440	struct wpa_supplicant *wpa_s = ctx;
4441	if (wpa_s->ap_iface) {
4442		struct hostapd_data *hapd = wpa_s->ap_iface->bss[0];
4443		if (!(hapd->conf->p2p & P2P_GROUP_OWNER)) {
4444			wpabuf_free(beacon_ies);
4445			wpabuf_free(proberesp_ies);
4446			return;
4447		}
4448		if (beacon_ies) {
4449			wpabuf_free(hapd->p2p_beacon_ie);
4450			hapd->p2p_beacon_ie = beacon_ies;
4451		}
4452		wpabuf_free(hapd->p2p_probe_resp_ie);
4453		hapd->p2p_probe_resp_ie = proberesp_ies;
4454	} else {
4455		wpabuf_free(beacon_ies);
4456		wpabuf_free(proberesp_ies);
4457	}
4458	wpa_supplicant_ap_update_beacon(wpa_s);
4459}
4460
4461
4462static void wpas_p2p_idle_update(void *ctx, int idle)
4463{
4464	struct wpa_supplicant *wpa_s = ctx;
4465	if (!wpa_s->ap_iface)
4466		return;
4467	wpa_printf(MSG_DEBUG, "P2P: GO - group %sidle", idle ? "" : "not ");
4468	if (idle)
4469		wpas_p2p_set_group_idle_timeout(wpa_s);
4470	else
4471		eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
4472}
4473
4474
4475struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
4476				       struct wpa_ssid *ssid)
4477{
4478	struct p2p_group *group;
4479	struct p2p_group_config *cfg;
4480
4481	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4482		return NULL;
4483	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4484		return NULL;
4485
4486	cfg = os_zalloc(sizeof(*cfg));
4487	if (cfg == NULL)
4488		return NULL;
4489
4490	if (ssid->p2p_persistent_group && wpa_s->conf->persistent_reconnect)
4491		cfg->persistent_group = 2;
4492	else if (ssid->p2p_persistent_group)
4493		cfg->persistent_group = 1;
4494	os_memcpy(cfg->interface_addr, wpa_s->own_addr, ETH_ALEN);
4495	if (wpa_s->max_stations &&
4496	    wpa_s->max_stations < wpa_s->conf->max_num_sta)
4497		cfg->max_clients = wpa_s->max_stations;
4498	else
4499		cfg->max_clients = wpa_s->conf->max_num_sta;
4500	os_memcpy(cfg->ssid, ssid->ssid, ssid->ssid_len);
4501	cfg->ssid_len = ssid->ssid_len;
4502	cfg->cb_ctx = wpa_s;
4503	cfg->ie_update = wpas_p2p_ie_update;
4504	cfg->idle_update = wpas_p2p_idle_update;
4505
4506	group = p2p_group_init(wpa_s->global->p2p, cfg);
4507	if (group == NULL)
4508		os_free(cfg);
4509	if (ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION)
4510		p2p_group_notif_formation_done(group);
4511	wpa_s->p2p_group = group;
4512	return group;
4513}
4514
4515
4516void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
4517			  int registrar)
4518{
4519	struct wpa_ssid *ssid = wpa_s->current_ssid;
4520
4521	if (!wpa_s->p2p_in_provisioning) {
4522		wpa_printf(MSG_DEBUG, "P2P: Ignore WPS success event - P2P "
4523			   "provisioning not in progress");
4524		return;
4525	}
4526
4527	if (ssid && ssid->mode == WPAS_MODE_INFRA) {
4528		u8 go_dev_addr[ETH_ALEN];
4529		os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN);
4530		wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
4531					  ssid->ssid_len);
4532		/* Clear any stored provisioning info */
4533		p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr);
4534	}
4535
4536	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent,
4537			     NULL);
4538	if (ssid && ssid->mode == WPAS_MODE_INFRA) {
4539		/*
4540		 * Use a separate timeout for initial data connection to
4541		 * complete to allow the group to be removed automatically if
4542		 * something goes wrong in this step before the P2P group idle
4543		 * timeout mechanism is taken into use.
4544		 */
4545		eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0,
4546				       wpas_p2p_group_formation_timeout,
4547				       wpa_s->parent, NULL);
4548	}
4549	if (wpa_s->global->p2p)
4550		p2p_wps_success_cb(wpa_s->global->p2p, peer_addr);
4551	else if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4552		wpa_drv_wps_success_cb(wpa_s, peer_addr);
4553	wpas_group_formation_completed(wpa_s, 1);
4554}
4555
4556
4557void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s,
4558			 struct wps_event_fail *fail)
4559{
4560	if (!wpa_s->p2p_in_provisioning) {
4561		wpa_printf(MSG_DEBUG, "P2P: Ignore WPS fail event - P2P "
4562			   "provisioning not in progress");
4563		return;
4564	}
4565
4566	if (wpa_s->go_params) {
4567		p2p_clear_provisioning_info(
4568			wpa_s->global->p2p,
4569			wpa_s->go_params->peer_device_addr);
4570	}
4571
4572	wpas_notify_p2p_wps_failed(wpa_s, fail);
4573}
4574
4575
4576int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
4577		       const char *config_method,
4578		       enum wpas_p2p_prov_disc_use use)
4579{
4580	u16 config_methods;
4581
4582	wpa_s->p2p_fallback_to_go_neg = 0;
4583	wpa_s->pending_pd_use = NORMAL_PD;
4584	if (os_strncmp(config_method, "display", 7) == 0)
4585		config_methods = WPS_CONFIG_DISPLAY;
4586	else if (os_strncmp(config_method, "keypad", 6) == 0)
4587		config_methods = WPS_CONFIG_KEYPAD;
4588	else if (os_strncmp(config_method, "pbc", 3) == 0 ||
4589		 os_strncmp(config_method, "pushbutton", 10) == 0)
4590		config_methods = WPS_CONFIG_PUSHBUTTON;
4591	else {
4592		wpa_printf(MSG_DEBUG, "P2P: Unknown config method");
4593		return -1;
4594	}
4595
4596	if (use == WPAS_P2P_PD_AUTO) {
4597		os_memcpy(wpa_s->pending_join_dev_addr, peer_addr, ETH_ALEN);
4598		wpa_s->pending_pd_config_methods = config_methods;
4599		wpa_s->p2p_auto_pd = 1;
4600		wpa_s->p2p_auto_join = 0;
4601		wpa_s->pending_pd_before_join = 0;
4602		wpa_s->auto_pd_scan_retry = 0;
4603		wpas_p2p_stop_find(wpa_s);
4604		wpa_s->p2p_join_scan_count = 0;
4605		os_get_time(&wpa_s->p2p_auto_started);
4606		wpa_printf(MSG_DEBUG, "P2P: Auto PD started at %ld.%06ld",
4607			   wpa_s->p2p_auto_started.sec,
4608			   wpa_s->p2p_auto_started.usec);
4609		wpas_p2p_join_scan(wpa_s, NULL);
4610		return 0;
4611	}
4612
4613	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
4614		return wpa_drv_p2p_prov_disc_req(wpa_s, peer_addr,
4615						 config_methods,
4616						 use == WPAS_P2P_PD_FOR_JOIN);
4617	}
4618
4619	if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
4620		return -1;
4621
4622	return p2p_prov_disc_req(wpa_s->global->p2p, peer_addr,
4623				 config_methods, use == WPAS_P2P_PD_FOR_JOIN,
4624				 0, 1);
4625}
4626
4627
4628int wpas_p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf,
4629			      char *end)
4630{
4631	return p2p_scan_result_text(ies, ies_len, buf, end);
4632}
4633
4634
4635static void wpas_p2p_clear_pending_action_tx(struct wpa_supplicant *wpa_s)
4636{
4637	if (!offchannel_pending_action_tx(wpa_s))
4638		return;
4639
4640	wpa_printf(MSG_DEBUG, "P2P: Drop pending Action TX due to new "
4641		   "operation request");
4642	offchannel_clear_pending_action_tx(wpa_s);
4643}
4644
4645
4646int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout,
4647		  enum p2p_discovery_type type,
4648		  unsigned int num_req_dev_types, const u8 *req_dev_types,
4649		  const u8 *dev_id, unsigned int search_delay)
4650{
4651	wpas_p2p_clear_pending_action_tx(wpa_s);
4652	wpa_s->p2p_long_listen = 0;
4653
4654	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4655		return wpa_drv_p2p_find(wpa_s, timeout, type);
4656
4657	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL ||
4658	    wpa_s->p2p_in_provisioning)
4659		return -1;
4660
4661	wpa_supplicant_cancel_sched_scan(wpa_s);
4662
4663	return p2p_find(wpa_s->global->p2p, timeout, type,
4664			num_req_dev_types, req_dev_types, dev_id,
4665			search_delay);
4666}
4667
4668
4669static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s)
4670{
4671	wpas_p2p_clear_pending_action_tx(wpa_s);
4672	wpa_s->p2p_long_listen = 0;
4673	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
4674	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
4675	wpa_s->global->p2p_cb_on_scan_complete = 0;
4676
4677	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
4678		wpa_drv_p2p_stop_find(wpa_s);
4679		return 1;
4680	}
4681
4682	if (wpa_s->global->p2p)
4683		p2p_stop_find(wpa_s->global->p2p);
4684
4685	return 0;
4686}
4687
4688
4689void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s)
4690{
4691	if (wpas_p2p_stop_find_oper(wpa_s) > 0)
4692		return;
4693	wpas_p2p_remove_pending_group_interface(wpa_s);
4694}
4695
4696
4697static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx)
4698{
4699	struct wpa_supplicant *wpa_s = eloop_ctx;
4700	wpa_s->p2p_long_listen = 0;
4701}
4702
4703
4704int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout)
4705{
4706	int res;
4707
4708	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4709		return -1;
4710
4711	wpa_supplicant_cancel_sched_scan(wpa_s);
4712	wpas_p2p_clear_pending_action_tx(wpa_s);
4713
4714	if (timeout == 0) {
4715		/*
4716		 * This is a request for unlimited Listen state. However, at
4717		 * least for now, this is mapped to a Listen state for one
4718		 * hour.
4719		 */
4720		timeout = 3600;
4721	}
4722	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
4723	wpa_s->p2p_long_listen = 0;
4724
4725	/*
4726	 * Stop previous find/listen operation to avoid trying to request a new
4727	 * remain-on-channel operation while the driver is still running the
4728	 * previous one.
4729	 */
4730	if (wpa_s->global->p2p)
4731		p2p_stop_find(wpa_s->global->p2p);
4732
4733	res = wpas_p2p_listen_start(wpa_s, timeout * 1000);
4734	if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) {
4735		wpa_s->p2p_long_listen = timeout * 1000;
4736		eloop_register_timeout(timeout, 0,
4737				       wpas_p2p_long_listen_timeout,
4738				       wpa_s, NULL);
4739	}
4740
4741	return res;
4742}
4743
4744
4745int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
4746			  u8 *buf, size_t len, int p2p_group)
4747{
4748	struct wpabuf *p2p_ie;
4749	int ret;
4750
4751	if (wpa_s->global->p2p_disabled)
4752		return -1;
4753	if (wpa_s->global->p2p == NULL)
4754		return -1;
4755	if (bss == NULL)
4756		return -1;
4757
4758	p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
4759	ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len,
4760			       p2p_group, p2p_ie);
4761	wpabuf_free(p2p_ie);
4762
4763	return ret;
4764}
4765
4766
4767int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
4768			  const u8 *dst, const u8 *bssid,
4769			  const u8 *ie, size_t ie_len, int ssi_signal)
4770{
4771	if (wpa_s->global->p2p_disabled)
4772		return 0;
4773	if (wpa_s->global->p2p == NULL)
4774		return 0;
4775
4776	switch (p2p_probe_req_rx(wpa_s->global->p2p, addr, dst, bssid,
4777				 ie, ie_len)) {
4778	case P2P_PREQ_NOT_P2P:
4779		wpas_notify_preq(wpa_s, addr, dst, bssid, ie, ie_len,
4780				 ssi_signal);
4781		/* fall through */
4782	case P2P_PREQ_MALFORMED:
4783	case P2P_PREQ_NOT_LISTEN:
4784	case P2P_PREQ_NOT_PROCESSED:
4785	default: /* make gcc happy */
4786		return 0;
4787	case P2P_PREQ_PROCESSED:
4788		return 1;
4789	}
4790}
4791
4792
4793void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
4794			const u8 *sa, const u8 *bssid,
4795			u8 category, const u8 *data, size_t len, int freq)
4796{
4797	if (wpa_s->global->p2p_disabled)
4798		return;
4799	if (wpa_s->global->p2p == NULL)
4800		return;
4801
4802	p2p_rx_action(wpa_s->global->p2p, da, sa, bssid, category, data, len,
4803		      freq);
4804}
4805
4806
4807void wpas_p2p_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ies)
4808{
4809	if (wpa_s->global->p2p_disabled)
4810		return;
4811	if (wpa_s->global->p2p == NULL)
4812		return;
4813
4814	p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
4815}
4816
4817
4818void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s)
4819{
4820	p2p_group_deinit(wpa_s->p2p_group);
4821	wpa_s->p2p_group = NULL;
4822
4823	wpa_s->ap_configured_cb = NULL;
4824	wpa_s->ap_configured_cb_ctx = NULL;
4825	wpa_s->ap_configured_cb_data = NULL;
4826	wpa_s->connect_without_scan = NULL;
4827}
4828
4829
4830int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
4831{
4832	wpa_s->p2p_long_listen = 0;
4833
4834	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4835		return wpa_drv_p2p_reject(wpa_s, addr);
4836
4837	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4838		return -1;
4839
4840	return p2p_reject(wpa_s->global->p2p, addr);
4841}
4842
4843
4844/* Invite to reinvoke a persistent group */
4845int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
4846		    struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
4847		    int ht40, int pref_freq)
4848{
4849	enum p2p_invite_role role;
4850	u8 *bssid = NULL, bssid_buf[ETH_ALEN];
4851	int force_freq = 0, oper_freq = 0;
4852	int res;
4853
4854	wpa_s->global->p2p_invite_group = NULL;
4855	if (peer_addr)
4856		os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
4857	else
4858		os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
4859
4860	wpa_s->p2p_persistent_go_freq = freq;
4861	wpa_s->p2p_go_ht40 = !!ht40;
4862	if (ssid->mode == WPAS_MODE_P2P_GO) {
4863		role = P2P_INVITE_ROLE_GO;
4864		if (peer_addr == NULL) {
4865			wpa_printf(MSG_DEBUG, "P2P: Missing peer "
4866				   "address in invitation command");
4867			return -1;
4868		}
4869		if (wpas_p2p_create_iface(wpa_s)) {
4870			if (wpas_p2p_add_group_interface(wpa_s,
4871							 WPA_IF_P2P_GO) < 0) {
4872				wpa_printf(MSG_ERROR, "P2P: Failed to "
4873					   "allocate a new interface for the "
4874					   "group");
4875				return -1;
4876			}
4877			bssid = wpa_s->pending_interface_addr;
4878		} else
4879			bssid = wpa_s->own_addr;
4880	} else {
4881		role = P2P_INVITE_ROLE_CLIENT;
4882		peer_addr = ssid->bssid;
4883	}
4884	wpa_s->pending_invite_ssid_id = ssid->id;
4885
4886	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid_buf) == 0 &&
4887	    wpa_s->assoc_freq) {
4888		oper_freq = wpa_s->assoc_freq;
4889		if (bssid == NULL)
4890			bssid = bssid_buf;
4891	} else {
4892		oper_freq = wpa_drv_shared_freq(wpa_s);
4893		if (oper_freq < 0)
4894			oper_freq = 0;
4895	}
4896
4897	res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
4898				   &oper_freq);
4899	if (res)
4900		return res;
4901
4902	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4903		return wpa_drv_p2p_invite(wpa_s, peer_addr, role, bssid,
4904					  ssid->ssid, ssid->ssid_len,
4905					  go_dev_addr, 1);
4906
4907	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4908		return -1;
4909
4910	return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
4911			  ssid->ssid, ssid->ssid_len, force_freq, go_dev_addr,
4912			  1, pref_freq);
4913}
4914
4915
4916/* Invite to join an active group */
4917int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
4918			  const u8 *peer_addr, const u8 *go_dev_addr)
4919{
4920	struct wpa_global *global = wpa_s->global;
4921	enum p2p_invite_role role;
4922	u8 *bssid = NULL, bssid_buf[ETH_ALEN];
4923	struct wpa_ssid *ssid;
4924	int persistent;
4925	int force_freq = 0, oper_freq = 0, pref_freq = 0;
4926	int res;
4927
4928	wpa_s->p2p_persistent_go_freq = 0;
4929	wpa_s->p2p_go_ht40 = 0;
4930
4931	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
4932		if (os_strcmp(wpa_s->ifname, ifname) == 0)
4933			break;
4934	}
4935	if (wpa_s == NULL) {
4936		wpa_printf(MSG_DEBUG, "P2P: Interface '%s' not found", ifname);
4937		return -1;
4938	}
4939
4940	ssid = wpa_s->current_ssid;
4941	if (ssid == NULL) {
4942		wpa_printf(MSG_DEBUG, "P2P: No current SSID to use for "
4943			   "invitation");
4944		return -1;
4945	}
4946
4947	wpa_s->global->p2p_invite_group = wpa_s;
4948	persistent = ssid->p2p_persistent_group &&
4949		wpas_p2p_get_persistent(wpa_s->parent, peer_addr,
4950					ssid->ssid, ssid->ssid_len);
4951
4952	if (ssid->mode == WPAS_MODE_P2P_GO) {
4953		role = P2P_INVITE_ROLE_ACTIVE_GO;
4954		bssid = wpa_s->own_addr;
4955		if (go_dev_addr == NULL)
4956			go_dev_addr = wpa_s->global->p2p_dev_addr;
4957	} else {
4958		role = P2P_INVITE_ROLE_CLIENT;
4959		if (wpa_s->wpa_state < WPA_ASSOCIATED) {
4960			wpa_printf(MSG_DEBUG, "P2P: Not associated - cannot "
4961				   "invite to current group");
4962			return -1;
4963		}
4964		bssid = wpa_s->bssid;
4965		if (go_dev_addr == NULL &&
4966		    !is_zero_ether_addr(wpa_s->go_dev_addr))
4967			go_dev_addr = wpa_s->go_dev_addr;
4968	}
4969	wpa_s->parent->pending_invite_ssid_id = -1;
4970
4971	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
4972		return wpa_drv_p2p_invite(wpa_s, peer_addr, role, bssid,
4973					  ssid->ssid, ssid->ssid_len,
4974					  go_dev_addr, persistent);
4975
4976	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
4977		return -1;
4978
4979	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid_buf) == 0 &&
4980	    wpa_s->assoc_freq) {
4981		oper_freq = wpa_s->assoc_freq;
4982		if (bssid == NULL)
4983			bssid = bssid_buf;
4984	} else {
4985		oper_freq = wpa_drv_shared_freq(wpa_s);
4986		if (oper_freq < 0)
4987			oper_freq = 0;
4988	}
4989
4990	res = wpas_p2p_setup_freqs(wpa_s, 0, &force_freq, &pref_freq,
4991				   &oper_freq);
4992	if (res)
4993		return res;
4994	wpas_p2p_set_own_freq_preference(wpa_s, oper_freq);
4995
4996	return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
4997			  ssid->ssid, ssid->ssid_len, force_freq,
4998			  go_dev_addr, persistent, pref_freq);
4999}
5000
5001
5002void wpas_p2p_completed(struct wpa_supplicant *wpa_s)
5003{
5004	struct wpa_ssid *ssid = wpa_s->current_ssid;
5005	const char *ssid_txt;
5006	u8 go_dev_addr[ETH_ALEN];
5007	int network_id = -1;
5008	int persistent;
5009	int freq;
5010
5011	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION) {
5012		eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
5013				     wpa_s->parent, NULL);
5014	}
5015
5016	if (!wpa_s->show_group_started || !ssid)
5017		goto done;
5018
5019	wpa_s->show_group_started = 0;
5020
5021	ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len);
5022	os_memset(go_dev_addr, 0, ETH_ALEN);
5023	if (ssid->bssid_set)
5024		os_memcpy(go_dev_addr, ssid->bssid, ETH_ALEN);
5025	persistent = wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
5026					       ssid->ssid_len);
5027	os_memcpy(wpa_s->go_dev_addr, go_dev_addr, ETH_ALEN);
5028
5029	if (wpa_s->global->p2p_group_formation == wpa_s)
5030		wpa_s->global->p2p_group_formation = NULL;
5031
5032	freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
5033		(int) wpa_s->assoc_freq;
5034	if (ssid->passphrase == NULL && ssid->psk_set) {
5035		char psk[65];
5036		wpa_snprintf_hex(psk, sizeof(psk), ssid->psk, 32);
5037		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
5038			"%s client ssid=\"%s\" freq=%d psk=%s go_dev_addr="
5039			MACSTR "%s",
5040			wpa_s->ifname, ssid_txt, freq, psk,
5041			MAC2STR(go_dev_addr),
5042			persistent ? " [PERSISTENT]" : "");
5043	} else {
5044		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
5045			"%s client ssid=\"%s\" freq=%d passphrase=\"%s\" "
5046			"go_dev_addr=" MACSTR "%s",
5047			wpa_s->ifname, ssid_txt, freq,
5048			ssid->passphrase ? ssid->passphrase : "",
5049			MAC2STR(go_dev_addr),
5050			persistent ? " [PERSISTENT]" : "");
5051	}
5052
5053	if (persistent)
5054		network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
5055							     ssid, go_dev_addr);
5056	if (network_id < 0)
5057		network_id = ssid->id;
5058	wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 1);
5059
5060done:
5061	wpas_p2p_continue_after_scan(wpa_s);
5062}
5063
5064
5065int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
5066			  u32 interval1, u32 duration2, u32 interval2)
5067{
5068	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
5069		return -1;
5070	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5071		return -1;
5072
5073	if (wpa_s->wpa_state < WPA_ASSOCIATED ||
5074	    wpa_s->current_ssid == NULL ||
5075	    wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
5076		return -1;
5077
5078	return p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
5079				wpa_s->own_addr, wpa_s->assoc_freq,
5080				duration1, interval1, duration2, interval2);
5081}
5082
5083
5084int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
5085			unsigned int interval)
5086{
5087	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
5088		return -1;
5089
5090	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5091		return -1;
5092
5093	return p2p_ext_listen(wpa_s->global->p2p, period, interval);
5094}
5095
5096
5097static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
5098{
5099	if (wpa_s->current_ssid == NULL) {
5100		/*
5101		 * current_ssid can be cleared when P2P client interface gets
5102		 * disconnected, so assume this interface was used as P2P
5103		 * client.
5104		 */
5105		return 1;
5106	}
5107	return wpa_s->current_ssid->p2p_group &&
5108		wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
5109}
5110
5111
5112static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx)
5113{
5114	struct wpa_supplicant *wpa_s = eloop_ctx;
5115
5116	if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) {
5117		wpa_printf(MSG_DEBUG, "P2P: Ignore group idle timeout - "
5118			   "disabled");
5119		return;
5120	}
5121
5122	wpa_printf(MSG_DEBUG, "P2P: Group idle timeout reached - terminate "
5123		   "group");
5124	wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_IDLE_TIMEOUT);
5125}
5126
5127
5128static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s)
5129{
5130	int timeout;
5131
5132	if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
5133		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
5134
5135	if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
5136		return;
5137
5138	timeout = wpa_s->conf->p2p_group_idle;
5139	if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
5140	    (timeout == 0 || timeout > P2P_MAX_CLIENT_IDLE))
5141	    timeout = P2P_MAX_CLIENT_IDLE;
5142
5143	if (timeout == 0)
5144		return;
5145
5146	if (timeout < 0) {
5147		if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA)
5148			timeout = 0; /* special client mode no-timeout */
5149		else
5150			return;
5151	}
5152
5153	if (wpa_s->p2p_in_provisioning) {
5154		/*
5155		 * Use the normal group formation timeout during the
5156		 * provisioning phase to avoid terminating this process too
5157		 * early due to group idle timeout.
5158		 */
5159		wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
5160			   "during provisioning");
5161		return;
5162	}
5163#ifndef ANDROID_P2P
5164	if (wpa_s->show_group_started) {
5165		/*
5166		 * Use the normal group formation timeout between the end of
5167		 * the provisioning phase and completion of 4-way handshake to
5168		 * avoid terminating this process too early due to group idle
5169		 * timeout.
5170		 */
5171		wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
5172			   "while waiting for initial 4-way handshake to "
5173			   "complete");
5174		return;
5175	}
5176#endif
5177
5178	wpa_printf(MSG_DEBUG, "P2P: Set P2P group idle timeout to %u seconds",
5179		   timeout);
5180	eloop_register_timeout(timeout, 0, wpas_p2p_group_idle_timeout,
5181			       wpa_s, NULL);
5182}
5183
5184
5185/* Returns 1 if the interface was removed */
5186int wpas_p2p_deauth_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
5187			  u16 reason_code, const u8 *ie, size_t ie_len,
5188			  int locally_generated)
5189{
5190	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5191		return 0;
5192	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
5193		return 0;
5194
5195	if (!locally_generated)
5196		p2p_deauth_notif(wpa_s->global->p2p, bssid, reason_code, ie,
5197				 ie_len);
5198
5199	if (reason_code == WLAN_REASON_DEAUTH_LEAVING && !locally_generated &&
5200	    wpa_s->current_ssid &&
5201	    wpa_s->current_ssid->p2p_group &&
5202	    wpa_s->current_ssid->mode == WPAS_MODE_INFRA) {
5203		wpa_printf(MSG_DEBUG, "P2P: GO indicated that the P2P Group "
5204			   "session is ending");
5205		if (wpas_p2p_group_delete(wpa_s,
5206					  P2P_GROUP_REMOVAL_GO_ENDING_SESSION)
5207		    > 0)
5208			return 1;
5209	}
5210
5211	return 0;
5212}
5213
5214
5215void wpas_p2p_disassoc_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
5216			     u16 reason_code, const u8 *ie, size_t ie_len,
5217			     int locally_generated)
5218{
5219	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5220		return;
5221	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
5222		return;
5223
5224	if (!locally_generated)
5225		p2p_disassoc_notif(wpa_s->global->p2p, bssid, reason_code, ie,
5226				   ie_len);
5227}
5228
5229
5230void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
5231{
5232	struct p2p_data *p2p = wpa_s->global->p2p;
5233
5234	if (p2p == NULL)
5235		return;
5236
5237	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
5238		return;
5239
5240	if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME)
5241		p2p_set_dev_name(p2p, wpa_s->conf->device_name);
5242
5243	if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE)
5244		p2p_set_pri_dev_type(p2p, wpa_s->conf->device_type);
5245
5246	if (wpa_s->wps &&
5247	    (wpa_s->conf->changed_parameters & CFG_CHANGED_CONFIG_METHODS))
5248		p2p_set_config_methods(p2p, wpa_s->wps->config_methods);
5249
5250	if (wpa_s->wps && (wpa_s->conf->changed_parameters & CFG_CHANGED_UUID))
5251		p2p_set_uuid(p2p, wpa_s->wps->uuid);
5252
5253	if (wpa_s->conf->changed_parameters & CFG_CHANGED_WPS_STRING) {
5254		p2p_set_manufacturer(p2p, wpa_s->conf->manufacturer);
5255		p2p_set_model_name(p2p, wpa_s->conf->model_name);
5256		p2p_set_model_number(p2p, wpa_s->conf->model_number);
5257		p2p_set_serial_number(p2p, wpa_s->conf->serial_number);
5258	}
5259
5260	if (wpa_s->conf->changed_parameters & CFG_CHANGED_SEC_DEVICE_TYPE)
5261		p2p_set_sec_dev_types(p2p,
5262				      (void *) wpa_s->conf->sec_device_type,
5263				      wpa_s->conf->num_sec_device_types);
5264
5265	if (wpa_s->conf->changed_parameters & CFG_CHANGED_VENDOR_EXTENSION) {
5266		int i;
5267		p2p_remove_wps_vendor_extensions(p2p);
5268		for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
5269			if (wpa_s->conf->wps_vendor_ext[i] == NULL)
5270				continue;
5271			p2p_add_wps_vendor_extension(
5272				p2p, wpa_s->conf->wps_vendor_ext[i]);
5273		}
5274	}
5275
5276	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
5277	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
5278		char country[3];
5279		country[0] = wpa_s->conf->country[0];
5280		country[1] = wpa_s->conf->country[1];
5281		country[2] = 0x04;
5282		p2p_set_country(p2p, country);
5283	}
5284
5285	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_SSID_POSTFIX) {
5286		p2p_set_ssid_postfix(p2p, (u8 *) wpa_s->conf->p2p_ssid_postfix,
5287				     wpa_s->conf->p2p_ssid_postfix ?
5288				     os_strlen(wpa_s->conf->p2p_ssid_postfix) :
5289				     0);
5290	}
5291
5292	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_INTRA_BSS)
5293		p2p_set_intra_bss_dist(p2p, wpa_s->conf->p2p_intra_bss);
5294
5295	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_LISTEN_CHANNEL) {
5296		u8 reg_class, channel;
5297		int ret;
5298		unsigned int r;
5299		if (wpa_s->conf->p2p_listen_reg_class &&
5300		    wpa_s->conf->p2p_listen_channel) {
5301			reg_class = wpa_s->conf->p2p_listen_reg_class;
5302			channel = wpa_s->conf->p2p_listen_channel;
5303		} else {
5304			reg_class = 81;
5305			/*
5306			 * Pick one of the social channels randomly as the
5307			 * listen channel.
5308			 */
5309			os_get_random((u8 *) &r, sizeof(r));
5310			channel = 1 + (r % 3) * 5;
5311		}
5312		ret = p2p_set_listen_channel(p2p, reg_class, channel);
5313		if (ret)
5314			wpa_printf(MSG_ERROR, "P2P: Own listen channel update "
5315				   "failed: %d", ret);
5316	}
5317	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_OPER_CHANNEL) {
5318		u8 op_reg_class, op_channel, cfg_op_channel;
5319		int ret = 0;
5320		unsigned int r;
5321		if (wpa_s->conf->p2p_oper_reg_class &&
5322		    wpa_s->conf->p2p_oper_channel) {
5323			op_reg_class = wpa_s->conf->p2p_oper_reg_class;
5324			op_channel = wpa_s->conf->p2p_oper_channel;
5325			cfg_op_channel = 1;
5326		} else {
5327			op_reg_class = 81;
5328			/*
5329			 * Use random operation channel from (1, 6, 11)
5330			 *if no other preference is indicated.
5331			 */
5332			os_get_random((u8 *) &r, sizeof(r));
5333			op_channel = 1 + (r % 3) * 5;
5334			cfg_op_channel = 0;
5335		}
5336		ret = p2p_set_oper_channel(p2p, op_reg_class, op_channel,
5337					   cfg_op_channel);
5338		if (ret)
5339			wpa_printf(MSG_ERROR, "P2P: Own oper channel update "
5340				   "failed: %d", ret);
5341	}
5342
5343	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PREF_CHAN) {
5344		if (p2p_set_pref_chan(p2p, wpa_s->conf->num_p2p_pref_chan,
5345				      wpa_s->conf->p2p_pref_chan) < 0) {
5346			wpa_printf(MSG_ERROR, "P2P: Preferred channel list "
5347				   "update failed");
5348		}
5349	}
5350}
5351
5352
5353int wpas_p2p_set_noa(struct wpa_supplicant *wpa_s, u8 count, int start,
5354		     int duration)
5355{
5356	if (!wpa_s->ap_iface)
5357		return -1;
5358	return hostapd_p2p_set_noa(wpa_s->ap_iface->bss[0], count, start,
5359				   duration);
5360}
5361
5362
5363int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled)
5364{
5365	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5366		return -1;
5367	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
5368		return -1;
5369
5370	wpa_s->global->cross_connection = enabled;
5371	p2p_set_cross_connect(wpa_s->global->p2p, enabled);
5372
5373	if (!enabled) {
5374		struct wpa_supplicant *iface;
5375
5376		for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
5377		{
5378			if (iface->cross_connect_enabled == 0)
5379				continue;
5380
5381			iface->cross_connect_enabled = 0;
5382			iface->cross_connect_in_use = 0;
5383			wpa_msg(iface->parent, MSG_INFO,
5384				P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
5385				iface->ifname, iface->cross_connect_uplink);
5386		}
5387	}
5388
5389	return 0;
5390}
5391
5392
5393static void wpas_p2p_enable_cross_connect(struct wpa_supplicant *uplink)
5394{
5395	struct wpa_supplicant *iface;
5396
5397	if (!uplink->global->cross_connection)
5398		return;
5399
5400	for (iface = uplink->global->ifaces; iface; iface = iface->next) {
5401		if (!iface->cross_connect_enabled)
5402			continue;
5403		if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
5404		    0)
5405			continue;
5406		if (iface->ap_iface == NULL)
5407			continue;
5408		if (iface->cross_connect_in_use)
5409			continue;
5410
5411		iface->cross_connect_in_use = 1;
5412		wpa_msg(iface->parent, MSG_INFO,
5413			P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
5414			iface->ifname, iface->cross_connect_uplink);
5415	}
5416}
5417
5418
5419static void wpas_p2p_disable_cross_connect(struct wpa_supplicant *uplink)
5420{
5421	struct wpa_supplicant *iface;
5422
5423	for (iface = uplink->global->ifaces; iface; iface = iface->next) {
5424		if (!iface->cross_connect_enabled)
5425			continue;
5426		if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
5427		    0)
5428			continue;
5429		if (!iface->cross_connect_in_use)
5430			continue;
5431
5432		wpa_msg(iface->parent, MSG_INFO,
5433			P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
5434			iface->ifname, iface->cross_connect_uplink);
5435		iface->cross_connect_in_use = 0;
5436	}
5437}
5438
5439
5440void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s)
5441{
5442	if (wpa_s->ap_iface || wpa_s->current_ssid == NULL ||
5443	    wpa_s->current_ssid->mode != WPAS_MODE_INFRA ||
5444	    wpa_s->cross_connect_disallowed)
5445		wpas_p2p_disable_cross_connect(wpa_s);
5446	else
5447		wpas_p2p_enable_cross_connect(wpa_s);
5448	if (!wpa_s->ap_iface &&
5449	    eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
5450		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
5451}
5452
5453
5454void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s)
5455{
5456	wpas_p2p_disable_cross_connect(wpa_s);
5457	if (!wpa_s->ap_iface &&
5458	    !eloop_is_timeout_registered(wpas_p2p_group_idle_timeout,
5459					 wpa_s, NULL))
5460		wpas_p2p_set_group_idle_timeout(wpa_s);
5461}
5462
5463
5464static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s)
5465{
5466	struct wpa_supplicant *iface;
5467
5468	if (!wpa_s->global->cross_connection)
5469		return;
5470
5471	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
5472		if (iface == wpa_s)
5473			continue;
5474		if (iface->drv_flags &
5475		    WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)
5476			continue;
5477		if (iface->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE)
5478			continue;
5479
5480		wpa_s->cross_connect_enabled = 1;
5481		os_strlcpy(wpa_s->cross_connect_uplink, iface->ifname,
5482			   sizeof(wpa_s->cross_connect_uplink));
5483		wpa_printf(MSG_DEBUG, "P2P: Enable cross connection from "
5484			   "%s to %s whenever uplink is available",
5485			   wpa_s->ifname, wpa_s->cross_connect_uplink);
5486
5487		if (iface->ap_iface || iface->current_ssid == NULL ||
5488		    iface->current_ssid->mode != WPAS_MODE_INFRA ||
5489		    iface->cross_connect_disallowed ||
5490		    iface->wpa_state != WPA_COMPLETED)
5491			break;
5492
5493		wpa_s->cross_connect_in_use = 1;
5494		wpa_msg(wpa_s->parent, MSG_INFO,
5495			P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
5496			wpa_s->ifname, wpa_s->cross_connect_uplink);
5497		break;
5498	}
5499}
5500
5501
5502int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s)
5503{
5504	if (wpa_s->p2p_group_interface != P2P_GROUP_INTERFACE_CLIENT &&
5505	    !wpa_s->p2p_in_provisioning)
5506		return 0; /* not P2P client operation */
5507
5508	wpa_printf(MSG_DEBUG, "P2P: Terminate connection due to WPS PBC "
5509		   "session overlap");
5510	if (wpa_s != wpa_s->parent)
5511		wpa_msg_ctrl(wpa_s->parent, MSG_INFO, WPS_EVENT_OVERLAP);
5512
5513	if (wpa_s->global->p2p)
5514		p2p_group_formation_failed(wpa_s->global->p2p);
5515
5516	eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
5517			     wpa_s->parent, NULL);
5518
5519	wpas_group_formation_completed(wpa_s, 0);
5520	return 1;
5521}
5522
5523
5524void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s)
5525{
5526	struct p2p_channels chan;
5527
5528	if (wpa_s->global == NULL || wpa_s->global->p2p == NULL)
5529		return;
5530
5531	os_memset(&chan, 0, sizeof(chan));
5532	if (wpas_p2p_setup_channels(wpa_s, &chan)) {
5533		wpa_printf(MSG_ERROR, "P2P: Failed to update supported "
5534			   "channel list");
5535		return;
5536	}
5537
5538	p2p_update_channel_list(wpa_s->global->p2p, &chan);
5539}
5540
5541
5542static void wpas_p2p_scan_res_ignore(struct wpa_supplicant *wpa_s,
5543				     struct wpa_scan_results *scan_res)
5544{
5545	wpa_printf(MSG_DEBUG, "P2P: Ignore scan results");
5546}
5547
5548
5549int wpas_p2p_cancel(struct wpa_supplicant *wpa_s)
5550{
5551	struct wpa_global *global = wpa_s->global;
5552	int found = 0;
5553	const u8 *peer;
5554
5555	if (global->p2p == NULL)
5556		return -1;
5557
5558	wpa_printf(MSG_DEBUG, "P2P: Request to cancel group formation");
5559
5560	if (wpa_s->pending_interface_name[0] &&
5561	    !is_zero_ether_addr(wpa_s->pending_interface_addr))
5562		found = 1;
5563
5564	peer = p2p_get_go_neg_peer(global->p2p);
5565	if (peer) {
5566		wpa_printf(MSG_DEBUG, "P2P: Unauthorize pending GO Neg peer "
5567			   MACSTR, MAC2STR(peer));
5568		p2p_unauthorize(global->p2p, peer);
5569		found = 1;
5570	}
5571
5572	if (wpa_s->scan_res_handler == wpas_p2p_scan_res_join) {
5573		wpa_printf(MSG_DEBUG, "P2P: Stop pending scan for join");
5574		wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore;
5575		found = 1;
5576	}
5577
5578	if (wpa_s->pending_pd_before_join) {
5579		wpa_printf(MSG_DEBUG, "P2P: Stop pending PD before join");
5580		wpa_s->pending_pd_before_join = 0;
5581		found = 1;
5582	}
5583
5584	wpas_p2p_stop_find(wpa_s);
5585
5586	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
5587		if (wpa_s == global->p2p_group_formation &&
5588		    (wpa_s->p2p_in_provisioning ||
5589		     wpa_s->parent->pending_interface_type ==
5590		     WPA_IF_P2P_CLIENT)) {
5591			wpa_printf(MSG_DEBUG, "P2P: Interface %s in group "
5592				   "formation found - cancelling",
5593				   wpa_s->ifname);
5594			found = 1;
5595			eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
5596					     wpa_s->parent, NULL);
5597			if (wpa_s->p2p_in_provisioning) {
5598				wpas_group_formation_completed(wpa_s, 0);
5599				break;
5600			}
5601			wpas_p2p_group_delete(wpa_s,
5602					      P2P_GROUP_REMOVAL_REQUESTED);
5603			break;
5604		}
5605	}
5606
5607	if (!found) {
5608		wpa_printf(MSG_DEBUG, "P2P: No ongoing group formation found");
5609		return -1;
5610	}
5611
5612	return 0;
5613}
5614
5615
5616void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s)
5617{
5618	if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
5619		return;
5620
5621	wpa_printf(MSG_DEBUG, "P2P: Remove group due to driver resource not "
5622		   "being available anymore");
5623	wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_UNAVAILABLE);
5624}
5625
5626
5627void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s,
5628				   int freq_24, int freq_5, int freq_overall)
5629{
5630	struct p2p_data *p2p = wpa_s->global->p2p;
5631	if (p2p == NULL || (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT))
5632		return;
5633	p2p_set_best_channels(p2p, freq_24, freq_5, freq_overall);
5634}
5635
5636
5637int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr)
5638{
5639	u8 peer[ETH_ALEN];
5640	struct p2p_data *p2p = wpa_s->global->p2p;
5641
5642	if (p2p == NULL || (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT))
5643		return -1;
5644
5645	if (hwaddr_aton(addr, peer))
5646		return -1;
5647
5648	return p2p_unauthorize(p2p, peer);
5649}
5650
5651
5652/**
5653 * wpas_p2p_disconnect - Disconnect from a P2P Group
5654 * @wpa_s: Pointer to wpa_supplicant data
5655 * Returns: 0 on success, -1 on failure
5656 *
5657 * This can be used to disconnect from a group in which the local end is a P2P
5658 * Client or to end a P2P Group in case the local end is the Group Owner. If a
5659 * virtual network interface was created for this group, that interface will be
5660 * removed. Otherwise, only the configured P2P group network will be removed
5661 * from the interface.
5662 */
5663int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s)
5664{
5665
5666	if (wpa_s == NULL)
5667		return -1;
5668
5669	return wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_REQUESTED) < 0 ?
5670		-1 : 0;
5671}
5672
5673
5674int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s)
5675{
5676	int ret;
5677
5678	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5679		return 0;
5680
5681	ret = p2p_in_progress(wpa_s->global->p2p);
5682	if (ret == 0) {
5683		/*
5684		 * Check whether there is an ongoing WPS provisioning step (or
5685		 * other parts of group formation) on another interface since
5686		 * p2p_in_progress() does not report this to avoid issues for
5687		 * scans during such provisioning step.
5688		 */
5689		if (wpa_s->global->p2p_group_formation &&
5690		    wpa_s->global->p2p_group_formation != wpa_s) {
5691			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Another interface (%s) "
5692				"in group formation",
5693				wpa_s->global->p2p_group_formation->ifname);
5694			ret = 1;
5695		}
5696	}
5697
5698	return ret;
5699}
5700
5701
5702void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
5703			      struct wpa_ssid *ssid)
5704{
5705	if (wpa_s->p2p_in_provisioning && ssid->p2p_group &&
5706	    eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
5707				 wpa_s->parent, NULL) > 0) {
5708		/**
5709		 * Remove the network by scheduling the group formation
5710		 * timeout to happen immediately. The teardown code
5711		 * needs to be scheduled to run asynch later so that we
5712		 * don't delete data from under ourselves unexpectedly.
5713		 * Calling wpas_p2p_group_formation_timeout directly
5714		 * causes a series of crashes in WPS failure scenarios.
5715		 */
5716		wpa_printf(MSG_DEBUG, "P2P: Canceled group formation due to "
5717			   "P2P group network getting removed");
5718		eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout,
5719				       wpa_s->parent, NULL);
5720	}
5721}
5722
5723
5724struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
5725					  const u8 *addr, const u8 *ssid,
5726					  size_t ssid_len)
5727{
5728	struct wpa_ssid *s;
5729	size_t i;
5730
5731	for (s = wpa_s->conf->ssid; s; s = s->next) {
5732		if (s->disabled != 2)
5733			continue;
5734		if (ssid &&
5735		    (ssid_len != s->ssid_len ||
5736		     os_memcmp(ssid, s->ssid, ssid_len) != 0))
5737			continue;
5738		if (os_memcmp(s->bssid, addr, ETH_ALEN) == 0)
5739			return s; /* peer is GO in the persistent group */
5740		if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL)
5741			continue;
5742		for (i = 0; i < s->num_p2p_clients; i++) {
5743			if (os_memcmp(s->p2p_client_list + i * ETH_ALEN,
5744				      addr, ETH_ALEN) == 0)
5745				return s; /* peer is P2P client in persistent
5746					   * group */
5747		}
5748	}
5749
5750	return NULL;
5751}
5752
5753
5754void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
5755				       const u8 *addr)
5756{
5757	if (addr == NULL)
5758		return;
5759	wpas_p2p_add_persistent_group_client(wpa_s, addr);
5760}
5761
5762
5763static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
5764					int group_added)
5765{
5766	struct wpa_supplicant *group = wpa_s;
5767	if (wpa_s->global->p2p_group_formation)
5768		group = wpa_s->global->p2p_group_formation;
5769	wpa_s = wpa_s->parent;
5770	offchannel_send_action_done(wpa_s);
5771	if (group_added)
5772		wpas_p2p_group_delete(group, P2P_GROUP_REMOVAL_SILENT);
5773	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Fall back to GO Negotiation");
5774	wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, wpa_s->p2p_pin,
5775			 wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
5776			 0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
5777			 wpa_s->p2p_persistent_id,
5778			 wpa_s->p2p_pd_before_go_neg,
5779			 wpa_s->p2p_go_ht40);
5780}
5781
5782
5783int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s)
5784{
5785	if (!wpa_s->p2p_fallback_to_go_neg ||
5786	    wpa_s->p2p_in_provisioning <= 5)
5787		return 0;
5788
5789	if (wpas_p2p_peer_go(wpa_s, wpa_s->pending_join_dev_addr) > 0)
5790		return 0; /* peer operating as a GO */
5791
5792	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: GO not found for p2p_connect-auto - "
5793		"fallback to GO Negotiation");
5794	wpas_p2p_fallback_to_go_neg(wpa_s, 1);
5795
5796	return 1;
5797}
5798
5799
5800unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s)
5801{
5802	const char *rn, *rn2;
5803	struct wpa_supplicant *ifs;
5804
5805	if (wpa_s->wpa_state > WPA_SCANNING) {
5806		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to "
5807			"concurrent operation",
5808			P2P_CONCURRENT_SEARCH_DELAY);
5809		return P2P_CONCURRENT_SEARCH_DELAY;
5810	}
5811
5812	if (!wpa_s->driver->get_radio_name)
5813		return 0;
5814	rn = wpa_s->driver->get_radio_name(wpa_s->drv_priv);
5815	if (rn == NULL || rn[0] == '\0')
5816		return 0;
5817
5818	for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
5819		if (ifs == wpa_s || !ifs->driver->get_radio_name)
5820			continue;
5821
5822		rn2 = ifs->driver->get_radio_name(ifs->drv_priv);
5823		if (!rn2 || os_strcmp(rn, rn2) != 0)
5824			continue;
5825		if (ifs->wpa_state > WPA_SCANNING) {
5826			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search "
5827				"delay due to concurrent operation on "
5828				"interface %s",
5829				P2P_CONCURRENT_SEARCH_DELAY, ifs->ifname);
5830			return P2P_CONCURRENT_SEARCH_DELAY;
5831		}
5832	}
5833
5834	return 0;
5835}
5836
5837
5838void wpas_p2p_continue_after_scan(struct wpa_supplicant *wpa_s)
5839{
5840	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Station mode scan operation not "
5841		"pending anymore (sta_scan_pending=%d "
5842		"p2p_cb_on_scan_complete=%d)", wpa_s->sta_scan_pending,
5843		wpa_s->global->p2p_cb_on_scan_complete);
5844	wpa_s->sta_scan_pending = 0;
5845
5846	if (!wpa_s->global->p2p_cb_on_scan_complete)
5847		return;
5848	wpa_s->global->p2p_cb_on_scan_complete = 0;
5849
5850	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
5851		return;
5852
5853	if (p2p_other_scan_completed(wpa_s->global->p2p) == 1) {
5854		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Pending P2P operation "
5855			"continued after successful connection");
5856		p2p_increase_search_delay(wpa_s->global->p2p,
5857					  wpas_p2p_search_delay(wpa_s));
5858	}
5859}
5860
5861#ifdef ANDROID_P2P
5862int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq,
5863	struct wpa_ssid *ssid)
5864{
5865	struct wpa_supplicant *iface = NULL;
5866	struct p2p_data *p2p = wpa_s->global->p2p;
5867
5868	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
5869		if ((iface->current_ssid) &&
5870		    (iface->current_ssid->frequency != freq) &&
5871		    ((iface->p2p_group_interface) ||
5872		     (iface->current_ssid->p2p_group))) {
5873
5874			if ((iface->p2p_group_interface == P2P_GROUP_INTERFACE_GO)  ||
5875			    (iface->current_ssid->mode == WPAS_MODE_P2P_GO)) {
5876				/* Try to see whether we can move the GO. If it
5877				 * is not possible, remove the GO interface
5878				 */
5879				if (wpa_drv_switch_channel(iface, freq) == 0) {
5880					wpa_printf(MSG_ERROR, "P2P: GO Moved to freq(%d)", freq);
5881					iface->current_ssid->frequency = freq;
5882					continue;
5883				}
5884			}
5885
5886			/* If GO cannot be moved or if the conflicting interface is a
5887			 * P2P Client, remove the interface depending up on the connection
5888			 * priority */
5889			if(!wpas_is_p2p_prioritized(iface)) {
5890				/* STA connection has priority over existing
5891				 * P2P connection. So remove the interface */
5892				wpa_printf(MSG_DEBUG, "P2P: Removing P2P connection due to Single channel"
5893						"concurrent mode frequency conflict");
5894				wpas_p2p_group_delete(iface, P2P_GROUP_REMOVAL_FREQ_CONFLICT);
5895				/* If connection in progress is p2p connection, do not proceed for the connection */
5896				if (wpa_s == iface)
5897					return -1;
5898				else
5899					/* If connection in progress is STA connection, proceed for the connection */
5900					return 0;
5901			} else {
5902				/* P2p connection has priority, disable the STA network*/
5903				wpa_supplicant_disable_network(wpa_s->global->ifaces, ssid);
5904				wpa_msg(wpa_s->global->ifaces, MSG_INFO, WPA_EVENT_FREQ_CONFLICT
5905					" id=%d", ssid->id);
5906				os_memset(wpa_s->global->ifaces->pending_bssid, 0, ETH_ALEN);
5907				if (wpa_s == iface) {
5908					/* p2p connection is in progress, continue connecting...*/
5909					return 0;
5910				}
5911				else {
5912					/* STA connection is in progress, do not allow to continue */
5913					return -1;
5914				}
5915			}
5916		}
5917	}
5918	return 0;
5919}
5920#endif
5921