• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
68 enum 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 
82 static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
83 static struct wpa_supplicant *
84 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
85 			 int go);
86 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s);
87 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq);
88 static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx);
89 static 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);
92 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s);
93 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
94 static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx);
95 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
96 static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
97 					     void *timeout_ctx);
98 static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
99 					int group_added);
100 static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s);
101 
102 
wpas_p2p_set_own_freq_preference(struct wpa_supplicant * wpa_s,int freq)103 static 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 
wpas_p2p_scan_res_handler(struct wpa_supplicant * wpa_s,struct wpa_scan_results * scan_res)116 static 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 
wpas_p2p_scan(void * ctx,enum p2p_scan_type type,int freq,unsigned int num_req_dev_types,const u8 * req_dev_types,const u8 * dev_id,u16 pw_id)144 static 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 
wpas_p2p_if_type(int p2p_group_interface)240 static 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 
wpas_get_p2p_group(struct wpa_supplicant * wpa_s,const u8 * ssid,size_t ssid_len,int * go)255 static 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 
wpas_p2p_group_delete(struct wpa_supplicant * wpa_s,enum p2p_group_removal_reason removal_reason)280 static 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 
wpas_p2p_persistent_group(struct wpa_supplicant * wpa_s,u8 * go_dev_addr,const u8 * ssid,size_t ssid_len)421 static 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 
wpas_p2p_store_persistent_group(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,const u8 * go_dev_addr)483 static 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 
wpas_p2p_add_persistent_group_client(struct wpa_supplicant * wpa_s,const u8 * addr)569 static 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 
wpas_group_formation_completed(struct wpa_supplicant * wpa_s,int success)639 static 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 
wpas_p2p_send_action_tx_status(struct wpa_supplicant * wpa_s,unsigned int freq,const u8 * dst,const u8 * src,const u8 * bssid,const u8 * data,size_t data_len,enum offchannel_send_action_result result)744 static 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 
wpas_send_action(void * ctx,unsigned int freq,const u8 * dst,const u8 * src,const u8 * bssid,const u8 * buf,size_t len,unsigned int wait_time)787 static 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 
wpas_send_action_done(void * ctx)798 static 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 
wpas_copy_go_neg_results(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * params)805 static 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 
wpas_start_wps_enrollee(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * res)818 static 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 
p2p_go_configured(void * ctx,void * data)839 static 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 
wpas_start_wps_go(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * params,int group_formation)904 static 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 
wpas_p2p_clone_config(struct wpa_supplicant * dst,const struct wpa_supplicant * src)971 static 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 
wpas_p2p_add_group_interface(struct wpa_supplicant * wpa_s,enum wpa_driver_if_type type)1003 static 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 
wpas_p2p_remove_pending_group_interface(struct wpa_supplicant * wpa_s)1058 static 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 
1074 static struct wpa_supplicant *
wpas_p2p_init_group_interface(struct wpa_supplicant * wpa_s,int go)1075 wpas_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 
wpas_p2p_group_formation_timeout(void * eloop_ctx,void * timeout_ctx)1117 static 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 
wpas_go_neg_completed(void * ctx,struct p2p_go_neg_results * res)1130 void 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 
wpas_go_neg_req_rx(void * ctx,const u8 * src,u16 dev_passwd_id)1208 void 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 
wpas_dev_found(void * ctx,const u8 * addr,const struct p2p_peer_info * info,int new_device)1218 void 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 
wpas_dev_lost(void * ctx,const u8 * dev_addr)1251 static 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 
wpas_start_listen(void * ctx,unsigned int freq,unsigned int duration,const struct wpabuf * probe_resp_ie)1262 static 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 
wpas_stop_listen(void * ctx)1293 static 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 
wpas_send_probe_resp(void * ctx,const struct wpabuf * buf)1306 static 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 
p2p_sd_dns_uncompress_label(char ** upos,char * uend,u8 * start,u8 ** spos,const u8 * end)1326 static 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 */
p2p_sd_dns_uncompress(char * buf,size_t buf_len,const u8 * msg,size_t msg_len,size_t offset)1396 static 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 
1442 static struct p2p_srv_bonjour *
wpas_p2p_service_get_bonjour(struct wpa_supplicant * wpa_s,const struct wpabuf * query)1443 wpas_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 
1461 static struct p2p_srv_upnp *
wpas_p2p_service_get_upnp(struct wpa_supplicant * wpa_s,u8 version,const char * service)1462 wpas_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 
wpas_sd_add_proto_not_avail(struct wpabuf * resp,u8 srv_proto,u8 srv_trans_id)1477 static 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 
wpas_sd_all_bonjour(struct wpa_supplicant * wpa_s,struct wpabuf * resp,u8 srv_trans_id)1496 static 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 
match_bonjour_query(struct p2p_srv_bonjour * bsrv,const u8 * query,size_t query_len)1532 static 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 
wpas_sd_req_bonjour(struct wpa_supplicant * wpa_s,struct wpabuf * resp,u8 srv_trans_id,const u8 * query,size_t query_len)1559 static 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 
wpas_sd_all_upnp(struct wpa_supplicant * wpa_s,struct wpabuf * resp,u8 srv_trans_id)1630 static 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 
wpas_sd_req_upnp(struct wpa_supplicant * wpa_s,struct wpabuf * resp,u8 srv_trans_id,const u8 * query,size_t query_len)1666 static 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
wpas_sd_req_wfd(struct wpa_supplicant * wpa_s,struct wpabuf * resp,u8 srv_trans_id,const u8 * query,size_t query_len)1748 static 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 
wpas_sd_request(void * ctx,int freq,const u8 * sa,u8 dialog_token,u16 update_indic,const u8 * tlvs,size_t tlvs_len)1803 void 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 
1911 done:
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 
wpas_sd_response(void * ctx,const u8 * sa,u16 update_indic,const u8 * tlvs,size_t tlvs_len)1921 void 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 
wpas_p2p_sd_request(struct wpa_supplicant * wpa_s,const u8 * dst,const struct wpabuf * tlvs)1986 u64 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 
wpas_p2p_sd_request_upnp(struct wpa_supplicant * wpa_s,const u8 * dst,u8 version,const char * query)1997 u64 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 
wpas_p2p_sd_request_wfd(struct wpa_supplicant * wpa_s,const u8 * dst,const struct wpabuf * tlvs)2019 static 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 
wfd_add_sd_req_role(struct wpabuf * tlvs,u8 id,u8 role,const char * subelems)2032 static 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 
wpas_p2p_sd_request_wifi_display(struct wpa_supplicant * wpa_s,const u8 * dst,const char * role)2065 u64 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 
wpas_p2p_sd_cancel_request(struct wpa_supplicant * wpa_s,u64 req)2099 int 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 
wpas_p2p_sd_response(struct wpa_supplicant * wpa_s,int freq,const u8 * dst,u8 dialog_token,const struct wpabuf * resp_tlvs)2110 void 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
wpas_p2p_sd_service_update(struct wpa_supplicant * wpa_s,int action)2126 void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s, int action)
2127 #else
2128 void 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 
wpas_p2p_srv_bonjour_free(struct p2p_srv_bonjour * bsrv)2144 static 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 
wpas_p2p_srv_upnp_free(struct p2p_srv_upnp * usrv)2153 static 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 
wpas_p2p_service_flush(struct wpa_supplicant * wpa_s)2161 void 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 
wpas_p2p_service_add_bonjour(struct wpa_supplicant * wpa_s,struct wpabuf * query,struct wpabuf * resp)2182 int 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 
wpas_p2p_service_del_bonjour(struct wpa_supplicant * wpa_s,const struct wpabuf * query)2203 int 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 
wpas_p2p_service_add_upnp(struct wpa_supplicant * wpa_s,u8 version,const char * service)2221 int 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 
wpas_p2p_service_del_upnp(struct wpa_supplicant * wpa_s,u8 version,const char * service)2248 int 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 
wpas_prov_disc_local_display(struct wpa_supplicant * wpa_s,const u8 * peer,const char * params,unsigned int generated_pin)2266 static 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 
wpas_prov_disc_local_keypad(struct wpa_supplicant * wpa_s,const u8 * peer,const char * params)2275 static 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 
wpas_prov_disc_req(void * ctx,const u8 * peer,u16 config_methods,const u8 * dev_addr,const u8 * pri_dev_type,const char * dev_name,u16 supp_config_methods,u8 dev_capab,u8 group_capab,const u8 * group_id,size_t group_id_len)2283 void 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 
wpas_prov_disc_resp(void * ctx,const u8 * peer,u16 config_methods)2340 void 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 
wpas_prov_disc_fail(void * ctx,const u8 * peer,enum p2p_prov_disc_status status)2379 static 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 
wpas_invitation_process(void * ctx,const u8 * sa,const u8 * bssid,const u8 * go_dev_addr,const u8 * ssid,size_t ssid_len,int * go,u8 * group_bssid,int * force_freq,int persistent_group)2409 static 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 
2490 accept_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 
wpas_invitation_received(void * ctx,const u8 * sa,const u8 * bssid,const u8 * ssid,size_t ssid_len,const u8 * go_dev_addr,u8 status,int op_freq)2514 static 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 
wpas_remove_persistent_peer(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,const u8 * peer)2578 static 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 
wpas_remove_persistent_client(struct wpa_supplicant * wpa_s,const u8 * peer)2619 static 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 
wpas_invitation_result(void * ctx,int status,const u8 * bssid,const struct p2p_channels * channels,const u8 * peer)2637 static 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 
wpas_p2p_disallowed_freq(struct wpa_global * global,unsigned int freq)2711 static 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 
wpas_p2p_add_chan(struct p2p_reg_class * reg,u8 chan)2729 static 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 
wpas_p2p_default_channels(struct wpa_supplicant * wpa_s,struct p2p_channels * chan)2736 static 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 
get_mode(struct hostapd_hw_modes * modes,u16 num_modes,enum hostapd_hw_mode mode)2793 static 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 
has_channel(struct wpa_global * global,struct hostapd_hw_modes * mode,u8 chan,int * flags)2808 static 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 
2835 struct 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 
2844 static 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 
wpas_p2p_verify_channel(struct wpa_supplicant * wpa_s,struct hostapd_hw_modes * mode,u8 channel,u8 bw)2860 static 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 
wpas_p2p_setup_channels(struct wpa_supplicant * wpa_s,struct p2p_channels * chan)2880 static 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 
wpas_p2p_get_ht40_mode(struct wpa_supplicant * wpa_s,struct hostapd_hw_modes * mode,u8 channel)2928 int 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 
wpas_get_noa(void * ctx,const u8 * interface_addr,u8 * buf,size_t buf_len)2954 static 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 
wpas_go_connected(void * ctx,const u8 * dev_addr)2970 static 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  */
wpas_p2p_init(struct wpa_global * global,struct wpa_supplicant * wpa_s)2997 int 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  */
wpas_p2p_deinit(struct wpa_supplicant * wpa_s)3169 void 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  */
wpas_p2p_deinit_global(struct wpa_global * global)3201 void 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 
wpas_p2p_create_iface(struct wpa_supplicant * wpa_s)3243 static 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 
wpas_p2p_start_go_neg(struct wpa_supplicant * wpa_s,const u8 * peer_addr,enum p2p_wps_method wps_method,int go_intent,const u8 * own_interface_addr,unsigned int force_freq,int persistent_group,struct wpa_ssid * ssid,unsigned int pref_freq)3262 static 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 
wpas_p2p_auth_go_neg(struct wpa_supplicant * wpa_s,const u8 * peer_addr,enum p2p_wps_method wps_method,int go_intent,const u8 * own_interface_addr,unsigned int force_freq,int persistent_group,struct wpa_ssid * ssid,unsigned int pref_freq)3293 static 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 
wpas_p2p_check_join_scan_limit(struct wpa_supplicant * wpa_s)3313 static 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 
wpas_check_freq_conflict(struct wpa_supplicant * wpa_s,int freq)3336 static 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 
wpas_p2p_peer_go(struct wpa_supplicant * wpa_s,const u8 * peer_dev_addr)3378 static 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 
wpas_p2p_scan_res_join(struct wpa_supplicant * wpa_s,struct wpa_scan_results * scan_res)3403 static 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 
3579 start:
3580 	/* Start join operation immediately */
3581 	wpas_p2p_join_start(wpa_s);
3582 }
3583 
3584 
wpas_p2p_join_scan_req(struct wpa_supplicant * wpa_s,int freq)3585 static 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 
wpas_p2p_join_scan(void * eloop_ctx,void * timeout_ctx)3661 static 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 
wpas_p2p_join(struct wpa_supplicant * wpa_s,const u8 * iface_addr,const u8 * dev_addr,enum p2p_wps_method wps_method,int auto_join)3668 static 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 
wpas_p2p_join_start(struct wpa_supplicant * wpa_s)3692 static 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 
wpas_p2p_setup_freqs(struct wpa_supplicant * wpa_s,int freq,int * force_freq,int * pref_freq,int * oper_freq)3752 static 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  */
wpas_p2p_connect(struct wpa_supplicant * wpa_s,const u8 * peer_addr,const char * pin,enum p2p_wps_method wps_method,int persistent_group,int auto_join,int join,int auth,int go_intent,int freq,int persistent_id,int pd,int ht40)3828 int 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  */
wpas_p2p_remain_on_channel_cb(struct wpa_supplicant * wpa_s,unsigned int freq,unsigned int duration)3968 void 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 
wpas_p2p_listen_start(struct wpa_supplicant * wpa_s,unsigned int timeout)3981 static 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  */
wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant * wpa_s,unsigned int freq)4004 void 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  */
wpas_p2p_group_remove(struct wpa_supplicant * wpa_s,const char * ifname)4038 int 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 
freq_included(const struct p2p_channels * channels,unsigned int freq)4062 static 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 
wpas_p2p_init_go_params(struct wpa_supplicant * wpa_s,struct p2p_go_neg_results * params,int freq,int ht40,const struct p2p_channels * channels)4070 static 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 
4213 static struct wpa_supplicant *
wpas_p2p_get_group_iface(struct wpa_supplicant * wpa_s,int addr_allocated,int go)4214 wpas_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  */
wpas_p2p_group_add(struct wpa_supplicant * wpa_s,int persistent_group,int freq,int ht40)4254 int 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 
wpas_start_p2p_client(struct wpa_supplicant * wpa_s,struct wpa_ssid * params,int addr_allocated)4334 static 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 
wpas_p2p_group_add_persistent(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid,int addr_allocated,int freq,int ht40,const struct p2p_channels * channels)4378 int 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 
wpas_p2p_ie_update(void * ctx,struct wpabuf * beacon_ies,struct wpabuf * proberesp_ies)4437 static 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 
wpas_p2p_idle_update(void * ctx,int idle)4462 static 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 
wpas_p2p_group_init(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)4475 struct 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 
wpas_p2p_wps_success(struct wpa_supplicant * wpa_s,const u8 * peer_addr,int registrar)4516 void 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 
wpas_p2p_wps_failed(struct wpa_supplicant * wpa_s,struct wps_event_fail * fail)4557 void 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 
wpas_p2p_prov_disc(struct wpa_supplicant * wpa_s,const u8 * peer_addr,const char * config_method,enum wpas_p2p_prov_disc_use use)4576 int 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 
wpas_p2p_scan_result_text(const u8 * ies,size_t ies_len,char * buf,char * end)4628 int 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 
wpas_p2p_clear_pending_action_tx(struct wpa_supplicant * wpa_s)4635 static 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 
wpas_p2p_find(struct wpa_supplicant * wpa_s,unsigned int timeout,enum p2p_discovery_type type,unsigned int num_req_dev_types,const u8 * req_dev_types,const u8 * dev_id,unsigned int search_delay)4646 int 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 
wpas_p2p_stop_find_oper(struct wpa_supplicant * wpa_s)4669 static 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 
wpas_p2p_stop_find(struct wpa_supplicant * wpa_s)4689 void 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 
wpas_p2p_long_listen_timeout(void * eloop_ctx,void * timeout_ctx)4697 static 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 
wpas_p2p_listen(struct wpa_supplicant * wpa_s,unsigned int timeout)4704 int 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 
wpas_p2p_assoc_req_ie(struct wpa_supplicant * wpa_s,struct wpa_bss * bss,u8 * buf,size_t len,int p2p_group)4745 int 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 
wpas_p2p_probe_req_rx(struct wpa_supplicant * wpa_s,const u8 * addr,const u8 * dst,const u8 * bssid,const u8 * ie,size_t ie_len,int ssi_signal)4767 int 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 
wpas_p2p_rx_action(struct wpa_supplicant * wpa_s,const u8 * da,const u8 * sa,const u8 * bssid,u8 category,const u8 * data,size_t len,int freq)4793 void 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 
wpas_p2p_scan_ie(struct wpa_supplicant * wpa_s,struct wpabuf * ies)4807 void 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 
wpas_p2p_group_deinit(struct wpa_supplicant * wpa_s)4818 void 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 
wpas_p2p_reject(struct wpa_supplicant * wpa_s,const u8 * addr)4830 int 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 */
wpas_p2p_invite(struct wpa_supplicant * wpa_s,const u8 * peer_addr,struct wpa_ssid * ssid,const u8 * go_dev_addr,int freq,int ht40,int pref_freq)4845 int 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 */
wpas_p2p_invite_group(struct wpa_supplicant * wpa_s,const char * ifname,const u8 * peer_addr,const u8 * go_dev_addr)4917 int 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 
wpas_p2p_completed(struct wpa_supplicant * wpa_s)5002 void 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 
5060 done:
5061 	wpas_p2p_continue_after_scan(wpa_s);
5062 }
5063 
5064 
wpas_p2p_presence_req(struct wpa_supplicant * wpa_s,u32 duration1,u32 interval1,u32 duration2,u32 interval2)5065 int 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 
wpas_p2p_ext_listen(struct wpa_supplicant * wpa_s,unsigned int period,unsigned int interval)5084 int 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 
wpas_p2p_is_client(struct wpa_supplicant * wpa_s)5097 static 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 
wpas_p2p_group_idle_timeout(void * eloop_ctx,void * timeout_ctx)5112 static 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 
wpas_p2p_set_group_idle_timeout(struct wpa_supplicant * wpa_s)5128 static 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 */
wpas_p2p_deauth_notif(struct wpa_supplicant * wpa_s,const u8 * bssid,u16 reason_code,const u8 * ie,size_t ie_len,int locally_generated)5186 int 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 
wpas_p2p_disassoc_notif(struct wpa_supplicant * wpa_s,const u8 * bssid,u16 reason_code,const u8 * ie,size_t ie_len,int locally_generated)5215 void 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 
wpas_p2p_update_config(struct wpa_supplicant * wpa_s)5230 void 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 
wpas_p2p_set_noa(struct wpa_supplicant * wpa_s,u8 count,int start,int duration)5353 int 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 
wpas_p2p_set_cross_connect(struct wpa_supplicant * wpa_s,int enabled)5363 int 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 
wpas_p2p_enable_cross_connect(struct wpa_supplicant * uplink)5393 static 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 
wpas_p2p_disable_cross_connect(struct wpa_supplicant * uplink)5419 static 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 
wpas_p2p_notif_connected(struct wpa_supplicant * wpa_s)5440 void 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 
wpas_p2p_notif_disconnected(struct wpa_supplicant * wpa_s)5454 void 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 
wpas_p2p_cross_connect_setup(struct wpa_supplicant * wpa_s)5464 static 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 
wpas_p2p_notif_pbc_overlap(struct wpa_supplicant * wpa_s)5502 int 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 
wpas_p2p_update_channel_list(struct wpa_supplicant * wpa_s)5524 void 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 
wpas_p2p_scan_res_ignore(struct wpa_supplicant * wpa_s,struct wpa_scan_results * scan_res)5542 static 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 
wpas_p2p_cancel(struct wpa_supplicant * wpa_s)5549 int 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 
wpas_p2p_interface_unavailable(struct wpa_supplicant * wpa_s)5616 void 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 
wpas_p2p_update_best_channels(struct wpa_supplicant * wpa_s,int freq_24,int freq_5,int freq_overall)5627 void 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 
wpas_p2p_unauthorize(struct wpa_supplicant * wpa_s,const char * addr)5637 int 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  */
wpas_p2p_disconnect(struct wpa_supplicant * wpa_s)5663 int 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 
wpas_p2p_in_progress(struct wpa_supplicant * wpa_s)5674 int 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 
wpas_p2p_network_removed(struct wpa_supplicant * wpa_s,struct wpa_ssid * ssid)5702 void 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 
wpas_p2p_get_persistent(struct wpa_supplicant * wpa_s,const u8 * addr,const u8 * ssid,size_t ssid_len)5724 struct 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 
wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant * wpa_s,const u8 * addr)5754 void 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 
wpas_p2p_fallback_to_go_neg(struct wpa_supplicant * wpa_s,int group_added)5763 static 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 
wpas_p2p_scan_no_go_seen(struct wpa_supplicant * wpa_s)5783 int 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 
wpas_p2p_search_delay(struct wpa_supplicant * wpa_s)5800 unsigned 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 
wpas_p2p_continue_after_scan(struct wpa_supplicant * wpa_s)5838 void 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
wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant * wpa_s,int freq,struct wpa_ssid * ssid)5862 int 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