xref: /freebsd/contrib/wpa/src/p2p/p2p.c (revision 71e72c9e91c4b8007a4292e09669e8b549c29e97)
1 /*
2  * Wi-Fi Direct - P2P module
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/defs.h"
14 #include "common/ieee802_11_defs.h"
15 #include "common/ieee802_11_common.h"
16 #include "common/wpa_common.h"
17 #include "common/wpa_ctrl.h"
18 #include "common/sae.h"
19 #include "crypto/sha256.h"
20 #include "crypto/sha384.h"
21 #include "crypto/crypto.h"
22 #include "pasn/pasn_common.h"
23 #include "wps/wps_i.h"
24 #include "p2p_i.h"
25 #include "p2p.h"
26 
27 
28 static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx);
29 static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev);
30 static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
31 				     const u8 *sa, const u8 *data, size_t len,
32 				     int rx_freq);
33 static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
34 				      const u8 *sa, const u8 *data,
35 				      size_t len);
36 static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx);
37 static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx);
38 
39 
40 /*
41  * p2p_scan recovery timeout
42  *
43  * Many drivers are using 30 second timeout on scan results. Allow a bit larger
44  * timeout for this to avoid hitting P2P timeout unnecessarily.
45  */
46 #define P2P_SCAN_TIMEOUT 35
47 
48 /**
49  * P2P_PEER_EXPIRATION_AGE - Number of seconds after which inactive peer
50  * entries will be removed
51  */
52 #ifndef P2P_PEER_EXPIRATION_AGE
53 #define P2P_PEER_EXPIRATION_AGE 60
54 #endif /* P2P_PEER_EXPIRATION_AGE */
55 
56 
p2p_expire_peers(struct p2p_data * p2p)57 void p2p_expire_peers(struct p2p_data *p2p)
58 {
59 	struct p2p_device *dev, *n;
60 	struct os_reltime now;
61 	size_t i;
62 
63 	os_get_reltime(&now);
64 	dl_list_for_each_safe(dev, n, &p2p->devices, struct p2p_device, list) {
65 		if (dev->last_seen.sec + P2P_PEER_EXPIRATION_AGE >= now.sec)
66 			continue;
67 
68 		if (dev == p2p->go_neg_peer) {
69 			/*
70 			 * GO Negotiation is in progress with the peer, so
71 			 * don't expire the peer entry until GO Negotiation
72 			 * fails or times out.
73 			 */
74 			continue;
75 		}
76 
77 		if (p2p->cfg->go_connected &&
78 		    p2p->cfg->go_connected(p2p->cfg->cb_ctx,
79 					   dev->info.p2p_device_addr)) {
80 			/*
81 			 * We are connected as a client to a group in which the
82 			 * peer is the GO, so do not expire the peer entry.
83 			 */
84 			os_get_reltime(&dev->last_seen);
85 			continue;
86 		}
87 
88 		for (i = 0; i < p2p->num_groups; i++) {
89 			if (p2p_group_is_client_connected(
90 				    p2p->groups[i], dev->info.p2p_device_addr))
91 				break;
92 		}
93 		if (i < p2p->num_groups) {
94 			/*
95 			 * The peer is connected as a client in a group where
96 			 * we are the GO, so do not expire the peer entry.
97 			 */
98 			os_get_reltime(&dev->last_seen);
99 			continue;
100 		}
101 
102 		p2p_dbg(p2p, "Expiring old peer entry " MACSTR,
103 			MAC2STR(dev->info.p2p_device_addr));
104 		dl_list_del(&dev->list);
105 		p2p_device_free(p2p, dev);
106 	}
107 }
108 
109 
p2p_state_txt(int state)110 static const char * p2p_state_txt(int state)
111 {
112 	switch (state) {
113 	case P2P_IDLE:
114 		return "IDLE";
115 	case P2P_SEARCH:
116 		return "SEARCH";
117 	case P2P_CONNECT:
118 		return "CONNECT";
119 	case P2P_CONNECT_LISTEN:
120 		return "CONNECT_LISTEN";
121 	case P2P_GO_NEG:
122 		return "GO_NEG";
123 	case P2P_LISTEN_ONLY:
124 		return "LISTEN_ONLY";
125 	case P2P_WAIT_PEER_CONNECT:
126 		return "WAIT_PEER_CONNECT";
127 	case P2P_WAIT_PEER_IDLE:
128 		return "WAIT_PEER_IDLE";
129 	case P2P_SD_DURING_FIND:
130 		return "SD_DURING_FIND";
131 	case P2P_PROVISIONING:
132 		return "PROVISIONING";
133 	case P2P_PD_DURING_FIND:
134 		return "PD_DURING_FIND";
135 	case P2P_INVITE:
136 		return "INVITE";
137 	case P2P_INVITE_LISTEN:
138 		return "INVITE_LISTEN";
139 	default:
140 		return "?";
141 	}
142 }
143 
144 
p2p_get_state_txt(struct p2p_data * p2p)145 const char * p2p_get_state_txt(struct p2p_data *p2p)
146 {
147 	return p2p_state_txt(p2p->state);
148 }
149 
150 
p2p_get_p2ps_adv_list(struct p2p_data * p2p)151 struct p2ps_advertisement * p2p_get_p2ps_adv_list(struct p2p_data *p2p)
152 {
153 	return p2p ? p2p->p2ps_adv_list : NULL;
154 }
155 
156 
p2p_set_intended_addr(struct p2p_data * p2p,const u8 * intended_addr)157 void p2p_set_intended_addr(struct p2p_data *p2p, const u8 *intended_addr)
158 {
159 	if (p2p && intended_addr)
160 		os_memcpy(p2p->intended_addr, intended_addr, ETH_ALEN);
161 }
162 
163 
p2p_get_provisioning_info(struct p2p_data * p2p,const u8 * addr)164 u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr)
165 {
166 	struct p2p_device *dev = NULL;
167 
168 	if (!addr || !p2p)
169 		return 0;
170 
171 	dev = p2p_get_device(p2p, addr);
172 	if (dev)
173 		return dev->wps_prov_info;
174 	else
175 		return 0;
176 }
177 
178 
p2p_clear_provisioning_info(struct p2p_data * p2p,const u8 * addr)179 void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr)
180 {
181 	struct p2p_device *dev = NULL;
182 
183 	if (!addr || !p2p)
184 		return;
185 
186 	dev = p2p_get_device(p2p, addr);
187 	if (dev)
188 		dev->wps_prov_info = 0;
189 }
190 
191 
p2p_set_state(struct p2p_data * p2p,int new_state)192 void p2p_set_state(struct p2p_data *p2p, int new_state)
193 {
194 	p2p_dbg(p2p, "State %s -> %s",
195 		p2p_state_txt(p2p->state), p2p_state_txt(new_state));
196 	p2p->state = new_state;
197 
198 	if (new_state == P2P_IDLE && p2p->pending_channel) {
199 		p2p_dbg(p2p, "Apply change in listen channel");
200 		p2p->cfg->reg_class = p2p->pending_reg_class;
201 		p2p->cfg->channel = p2p->pending_channel;
202 		p2p->pending_reg_class = 0;
203 		p2p->pending_channel = 0;
204 	}
205 }
206 
207 
p2p_set_timeout(struct p2p_data * p2p,unsigned int sec,unsigned int usec)208 void p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, unsigned int usec)
209 {
210 	p2p_dbg(p2p, "Set timeout (state=%s): %u.%06u sec",
211 		p2p_state_txt(p2p->state), sec, usec);
212 	eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
213 	eloop_register_timeout(sec, usec, p2p_state_timeout, p2p, NULL);
214 }
215 
216 
p2p_clear_timeout(struct p2p_data * p2p)217 void p2p_clear_timeout(struct p2p_data *p2p)
218 {
219 	p2p_dbg(p2p, "Clear timeout (state=%s)", p2p_state_txt(p2p->state));
220 	eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
221 }
222 
223 
p2p_go_neg_failed(struct p2p_data * p2p,int status)224 void p2p_go_neg_failed(struct p2p_data *p2p, int status)
225 {
226 	struct p2p_go_neg_results res;
227 	struct p2p_device *peer = p2p->go_neg_peer;
228 
229 	if (!peer)
230 		return;
231 
232 	eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
233 	if (p2p->state != P2P_SEARCH) {
234 		/*
235 		 * Clear timeouts related to GO Negotiation if no new p2p_find
236 		 * has been started.
237 		 */
238 		p2p_clear_timeout(p2p);
239 		p2p_set_state(p2p, P2P_IDLE);
240 	}
241 
242 	peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
243 	peer->wps_method = WPS_NOT_READY;
244 	peer->oob_pw_id = 0;
245 	wpabuf_free(peer->go_neg_conf);
246 	peer->go_neg_conf = NULL;
247 	p2p->go_neg_peer = NULL;
248 
249 #ifdef CONFIG_PASN
250 	if (peer->p2p2 && peer->pasn)
251 		wpa_pasn_reset(peer->pasn);
252 	os_memset(p2p->dev_sae_password, 0, sizeof(p2p->dev_sae_password));
253 	os_memset(p2p->peer_sae_password, 0, sizeof(p2p->peer_sae_password));
254 #endif /* CONFIG_PASN */
255 
256 	os_memset(&res, 0, sizeof(res));
257 	res.status = status;
258 	res.p2p2 = peer->p2p2;
259 	os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr, ETH_ALEN);
260 	os_memcpy(res.peer_interface_addr, peer->intended_addr, ETH_ALEN);
261 	p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
262 }
263 
264 
p2p_listen_in_find(struct p2p_data * p2p,int dev_disc)265 static void p2p_listen_in_find(struct p2p_data *p2p, int dev_disc)
266 {
267 	unsigned int r, tu;
268 	int freq;
269 	struct wpabuf *ies;
270 
271 	p2p_dbg(p2p, "Starting short listen state (state=%s)",
272 		p2p_state_txt(p2p->state));
273 
274 	if (p2p->pending_listen_freq) {
275 		/* We have a pending p2p_listen request */
276 		p2p_dbg(p2p, "p2p_listen command pending already");
277 		return;
278 	}
279 
280 	freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
281 	if (freq < 0) {
282 		p2p_dbg(p2p, "Unknown regulatory class/channel");
283 		return;
284 	}
285 
286 	if (os_get_random((u8 *) &r, sizeof(r)) < 0)
287 		r = 0;
288 	tu = (r % ((p2p->max_disc_int - p2p->min_disc_int) + 1) +
289 	      p2p->min_disc_int) * 100;
290 	if (p2p->max_disc_tu >= 0 && tu > (unsigned int) p2p->max_disc_tu)
291 		tu = p2p->max_disc_tu;
292 	if (!dev_disc && tu < 100)
293 		tu = 100; /* Need to wait in non-device discovery use cases */
294 	if (p2p->cfg->max_listen && 1024 * tu / 1000 > p2p->cfg->max_listen)
295 		tu = p2p->cfg->max_listen * 1000 / 1024;
296 
297 	if (tu == 0) {
298 		p2p_dbg(p2p, "Skip listen state since duration was 0 TU");
299 		p2p_set_timeout(p2p, 0, 0);
300 		return;
301 	}
302 
303 	ies = p2p_build_probe_resp_ies(p2p, NULL, 0);
304 	if (ies == NULL)
305 		return;
306 
307 	p2p->pending_listen_freq = freq;
308 	p2p->pending_listen_sec = 0;
309 	p2p->pending_listen_usec = 1024 * tu;
310 
311 	if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, 1024 * tu / 1000,
312 		    ies) < 0) {
313 		p2p_dbg(p2p, "Failed to start listen mode");
314 		p2p->pending_listen_freq = 0;
315 	} else {
316 		p2p->pending_listen_wait_drv = true;
317 	}
318 	wpabuf_free(ies);
319 }
320 
321 
p2p_listen(struct p2p_data * p2p,unsigned int timeout)322 int p2p_listen(struct p2p_data *p2p, unsigned int timeout)
323 {
324 	int freq;
325 	struct wpabuf *ies;
326 
327 	p2p_dbg(p2p, "Going to listen(only) state");
328 
329 	if (p2p->pending_listen_freq) {
330 		/* We have a pending p2p_listen request */
331 		p2p_dbg(p2p, "p2p_listen command pending already");
332 		return -1;
333 	}
334 
335 	freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
336 	if (freq < 0) {
337 		p2p_dbg(p2p, "Unknown regulatory class/channel");
338 		return -1;
339 	}
340 
341 	p2p->pending_listen_sec = timeout / 1000;
342 	p2p->pending_listen_usec = (timeout % 1000) * 1000;
343 
344 	if (p2p->p2p_scan_running) {
345 		if (p2p->start_after_scan == P2P_AFTER_SCAN_CONNECT) {
346 			p2p_dbg(p2p, "p2p_scan running - connect is already pending - skip listen");
347 			return 0;
348 		}
349 		p2p_dbg(p2p, "p2p_scan running - delay start of listen state");
350 		p2p->start_after_scan = P2P_AFTER_SCAN_LISTEN;
351 		return 0;
352 	}
353 
354 	ies = p2p_build_probe_resp_ies(p2p, NULL, 0);
355 	if (ies == NULL)
356 		return -1;
357 
358 	p2p->pending_listen_freq = freq;
359 
360 	if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, timeout, ies) < 0) {
361 		p2p_dbg(p2p, "Failed to start listen mode");
362 		p2p->pending_listen_freq = 0;
363 		wpabuf_free(ies);
364 		return -1;
365 	}
366 	p2p->pending_listen_wait_drv = true;
367 	wpabuf_free(ies);
368 
369 	p2p_set_state(p2p, P2P_LISTEN_ONLY);
370 
371 	return 0;
372 }
373 
374 
p2p_device_clear_reported(struct p2p_data * p2p)375 static void p2p_device_clear_reported(struct p2p_data *p2p)
376 {
377 	struct p2p_device *dev;
378 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
379 		dev->flags &= ~P2P_DEV_REPORTED;
380 		dev->sd_reqs = 0;
381 	}
382 }
383 
384 
385 /**
386  * p2p_get_device - Fetch a peer entry
387  * @p2p: P2P module context from p2p_init()
388  * @addr: P2P Device Address of the peer
389  * Returns: Pointer to the device entry or %NULL if not found
390  */
p2p_get_device(struct p2p_data * p2p,const u8 * addr)391 struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr)
392 {
393 	struct p2p_device *dev;
394 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
395 		if (ether_addr_equal(dev->info.p2p_device_addr, addr))
396 			return dev;
397 	}
398 	return NULL;
399 }
400 
401 
402 /**
403  * p2p_get_device_interface - Fetch a peer entry based on P2P Interface Address
404  * @p2p: P2P module context from p2p_init()
405  * @addr: P2P Interface Address of the peer
406  * Returns: Pointer to the device entry or %NULL if not found
407  */
p2p_get_device_interface(struct p2p_data * p2p,const u8 * addr)408 struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
409 					     const u8 *addr)
410 {
411 	struct p2p_device *dev;
412 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
413 		if (ether_addr_equal(dev->interface_addr, addr))
414 			return dev;
415 	}
416 	return NULL;
417 }
418 
419 
420 /**
421  * p2p_create_device - Create a peer entry
422  * @p2p: P2P module context from p2p_init()
423  * @addr: P2P Device Address of the peer
424  * Returns: Pointer to the device entry or %NULL on failure
425  *
426  * If there is already an entry for the peer, it will be returned instead of
427  * creating a new one.
428  */
p2p_create_device(struct p2p_data * p2p,const u8 * addr)429 static struct p2p_device * p2p_create_device(struct p2p_data *p2p,
430 					     const u8 *addr)
431 {
432 	struct p2p_device *dev, *oldest = NULL;
433 	size_t count = 0;
434 
435 	dev = p2p_get_device(p2p, addr);
436 	if (dev)
437 		return dev;
438 
439 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
440 		count++;
441 		if (oldest == NULL ||
442 		    os_reltime_before(&dev->last_seen, &oldest->last_seen))
443 			oldest = dev;
444 	}
445 	if (count + 1 > p2p->cfg->max_peers && oldest) {
446 		p2p_dbg(p2p,
447 			"Remove oldest peer entry to make room for a new peer "
448 			MACSTR, MAC2STR(oldest->info.p2p_device_addr));
449 		dl_list_del(&oldest->list);
450 		p2p_device_free(p2p, oldest);
451 	}
452 
453 	dev = os_zalloc(sizeof(*dev));
454 	if (dev == NULL)
455 		return NULL;
456 	dl_list_add(&p2p->devices, &dev->list);
457 	os_memcpy(dev->info.p2p_device_addr, addr, ETH_ALEN);
458 	dev->support_6ghz = false;
459 
460 	return dev;
461 }
462 
463 
p2p_copy_client_info(struct p2p_device * dev,struct p2p_client_info * cli)464 static void p2p_copy_client_info(struct p2p_device *dev,
465 				 struct p2p_client_info *cli)
466 {
467 	p2p_copy_filter_devname(dev->info.device_name,
468 				sizeof(dev->info.device_name),
469 				cli->dev_name, cli->dev_name_len);
470 	dev->info.dev_capab = cli->dev_capab;
471 	dev->info.config_methods = cli->config_methods;
472 	os_memcpy(dev->info.pri_dev_type, cli->pri_dev_type, 8);
473 	dev->info.wps_sec_dev_type_list_len = 8 * cli->num_sec_dev_types;
474 	if (dev->info.wps_sec_dev_type_list_len > WPS_SEC_DEV_TYPE_MAX_LEN)
475 		dev->info.wps_sec_dev_type_list_len = WPS_SEC_DEV_TYPE_MAX_LEN;
476 	os_memcpy(dev->info.wps_sec_dev_type_list, cli->sec_dev_types,
477 		  dev->info.wps_sec_dev_type_list_len);
478 }
479 
480 
p2p_add_group_clients(struct p2p_data * p2p,const u8 * go_dev_addr,const u8 * go_interface_addr,int freq,const u8 * gi,size_t gi_len,struct os_reltime * rx_time)481 static int p2p_add_group_clients(struct p2p_data *p2p, const u8 *go_dev_addr,
482 				 const u8 *go_interface_addr, int freq,
483 				 const u8 *gi, size_t gi_len,
484 				 struct os_reltime *rx_time)
485 {
486 	struct p2p_group_info info;
487 	size_t c;
488 	struct p2p_device *dev;
489 
490 	if (gi == NULL)
491 		return 0;
492 
493 	if (p2p_group_info_parse(gi, gi_len, &info) < 0)
494 		return -1;
495 
496 	/*
497 	 * Clear old data for this group; if the devices are still in the
498 	 * group, the information will be restored in the loop following this.
499 	 */
500 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
501 		if (ether_addr_equal(dev->member_in_go_iface,
502 				     go_interface_addr)) {
503 			os_memset(dev->member_in_go_iface, 0, ETH_ALEN);
504 			os_memset(dev->member_in_go_dev, 0, ETH_ALEN);
505 		}
506 	}
507 
508 	for (c = 0; c < info.num_clients; c++) {
509 		struct p2p_client_info *cli = &info.client[c];
510 		if (ether_addr_equal(cli->p2p_device_addr, p2p->cfg->dev_addr))
511 			continue; /* ignore our own entry */
512 		dev = p2p_get_device(p2p, cli->p2p_device_addr);
513 		if (dev) {
514 			if (dev->flags & (P2P_DEV_GROUP_CLIENT_ONLY |
515 					  P2P_DEV_PROBE_REQ_ONLY)) {
516 				/*
517 				 * Update information since we have not
518 				 * received this directly from the client.
519 				 */
520 				p2p_copy_client_info(dev, cli);
521 			} else {
522 				/*
523 				 * Need to update P2P Client Discoverability
524 				 * flag since it is valid only in P2P Group
525 				 * Info attribute.
526 				 */
527 				dev->info.dev_capab &=
528 					~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
529 				dev->info.dev_capab |=
530 					cli->dev_capab &
531 					P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
532 			}
533 			if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
534 				dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
535 			}
536 		} else {
537 			dev = p2p_create_device(p2p, cli->p2p_device_addr);
538 			if (dev == NULL)
539 				continue;
540 			dev->flags |= P2P_DEV_GROUP_CLIENT_ONLY;
541 			p2p_copy_client_info(dev, cli);
542 			dev->oper_freq = freq;
543 			p2p->cfg->dev_found(p2p->cfg->cb_ctx,
544 					    dev->info.p2p_device_addr,
545 					    &dev->info, 1);
546 			dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
547 		}
548 
549 		os_memcpy(dev->interface_addr, cli->p2p_interface_addr,
550 			  ETH_ALEN);
551 		os_memcpy(&dev->last_seen, rx_time, sizeof(struct os_reltime));
552 		os_memcpy(dev->member_in_go_dev, go_dev_addr, ETH_ALEN);
553 		os_memcpy(dev->member_in_go_iface, go_interface_addr,
554 			  ETH_ALEN);
555 		dev->flags |= P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT;
556 	}
557 
558 	return 0;
559 }
560 
561 
p2p_copy_wps_info(struct p2p_data * p2p,struct p2p_device * dev,int probe_req,const struct p2p_message * msg)562 static void p2p_copy_wps_info(struct p2p_data *p2p, struct p2p_device *dev,
563 			      int probe_req, const struct p2p_message *msg)
564 {
565 	os_memcpy(dev->info.device_name, msg->device_name,
566 		  sizeof(dev->info.device_name));
567 
568 	if (msg->manufacturer &&
569 	    msg->manufacturer_len < sizeof(dev->info.manufacturer)) {
570 		os_memset(dev->info.manufacturer, 0,
571 			  sizeof(dev->info.manufacturer));
572 		os_memcpy(dev->info.manufacturer, msg->manufacturer,
573 			  msg->manufacturer_len);
574 	}
575 
576 	if (msg->model_name &&
577 	    msg->model_name_len < sizeof(dev->info.model_name)) {
578 		os_memset(dev->info.model_name, 0,
579 			  sizeof(dev->info.model_name));
580 		os_memcpy(dev->info.model_name, msg->model_name,
581 			  msg->model_name_len);
582 	}
583 
584 	if (msg->model_number &&
585 	    msg->model_number_len < sizeof(dev->info.model_number)) {
586 		os_memset(dev->info.model_number, 0,
587 			  sizeof(dev->info.model_number));
588 		os_memcpy(dev->info.model_number, msg->model_number,
589 			  msg->model_number_len);
590 	}
591 
592 	if (msg->serial_number &&
593 	    msg->serial_number_len < sizeof(dev->info.serial_number)) {
594 		os_memset(dev->info.serial_number, 0,
595 			  sizeof(dev->info.serial_number));
596 		os_memcpy(dev->info.serial_number, msg->serial_number,
597 			  msg->serial_number_len);
598 	}
599 
600 	if (msg->pri_dev_type)
601 		os_memcpy(dev->info.pri_dev_type, msg->pri_dev_type,
602 			  sizeof(dev->info.pri_dev_type));
603 	else if (msg->wps_pri_dev_type)
604 		os_memcpy(dev->info.pri_dev_type, msg->wps_pri_dev_type,
605 			  sizeof(dev->info.pri_dev_type));
606 
607 	if (msg->wps_sec_dev_type_list) {
608 		os_memcpy(dev->info.wps_sec_dev_type_list,
609 			  msg->wps_sec_dev_type_list,
610 			  msg->wps_sec_dev_type_list_len);
611 		dev->info.wps_sec_dev_type_list_len =
612 			msg->wps_sec_dev_type_list_len;
613 	}
614 
615 	if (msg->capability) {
616 		/*
617 		 * P2P Client Discoverability bit is reserved in all frames
618 		 * that use this function, so do not change its value here.
619 		 */
620 		dev->info.dev_capab &= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
621 		dev->info.dev_capab |= msg->capability[0] &
622 			~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
623 		dev->info.group_capab = msg->capability[1];
624 	}
625 
626 	p2p_update_peer_6ghz_capab(dev, msg);
627 
628 	if (msg->ext_listen_timing) {
629 		dev->ext_listen_period = WPA_GET_LE16(msg->ext_listen_timing);
630 		dev->ext_listen_interval =
631 			WPA_GET_LE16(msg->ext_listen_timing + 2);
632 	}
633 
634 	if (!probe_req) {
635 		u16 new_config_methods;
636 		new_config_methods = msg->config_methods ?
637 			msg->config_methods : msg->wps_config_methods;
638 		if (new_config_methods &&
639 		    dev->info.config_methods != new_config_methods) {
640 			p2p_dbg(p2p, "Update peer " MACSTR
641 				" config_methods 0x%x -> 0x%x",
642 				MAC2STR(dev->info.p2p_device_addr),
643 				dev->info.config_methods,
644 				new_config_methods);
645 			dev->info.config_methods = new_config_methods;
646 		}
647 	}
648 }
649 
650 
p2p_update_peer_6ghz_capab(struct p2p_device * dev,const struct p2p_message * msg)651 void p2p_update_peer_6ghz_capab(struct p2p_device *dev,
652 				const struct p2p_message *msg)
653 {
654 	if (msg->capability &&
655 	    (msg->capability[0] & P2P_DEV_CAPAB_6GHZ_BAND_CAPABLE))
656 		dev->support_6ghz = true;
657 }
658 
659 
p2p_update_peer_vendor_elems(struct p2p_device * dev,const u8 * ies,size_t ies_len)660 static void p2p_update_peer_vendor_elems(struct p2p_device *dev, const u8 *ies,
661 					 size_t ies_len)
662 {
663 	const u8 *pos, *end;
664 	u8 id, len;
665 
666 	wpabuf_free(dev->info.vendor_elems);
667 	dev->info.vendor_elems = NULL;
668 
669 	end = ies + ies_len;
670 
671 	for (pos = ies; end - pos > 1; pos += len) {
672 		id = *pos++;
673 		len = *pos++;
674 
675 		if (len > end - pos)
676 			break;
677 
678 		if (id != WLAN_EID_VENDOR_SPECIFIC || len < 3)
679 			continue;
680 
681 		if (len >= 4) {
682 			u32 type = WPA_GET_BE32(pos);
683 
684 			if (type == WPA_IE_VENDOR_TYPE ||
685 			    type == WMM_IE_VENDOR_TYPE ||
686 			    type == WPS_IE_VENDOR_TYPE ||
687 			    type == P2P_IE_VENDOR_TYPE ||
688 			    type == WFD_IE_VENDOR_TYPE)
689 				continue;
690 		}
691 
692 		/* Unknown vendor element - make raw IE data available */
693 		if (wpabuf_resize(&dev->info.vendor_elems, 2 + len) < 0)
694 			break;
695 		wpabuf_put_data(dev->info.vendor_elems, pos - 2, 2 + len);
696 		if (wpabuf_size(dev->info.vendor_elems) > 2000)
697 			break;
698 	}
699 }
700 
701 
p2p_compare_wfd_info(struct p2p_device * dev,const struct p2p_message * msg)702 static int p2p_compare_wfd_info(struct p2p_device *dev,
703 			      const struct p2p_message *msg)
704 {
705 	if (dev->info.wfd_subelems && msg->wfd_subelems) {
706 		if (dev->info.wfd_subelems->used != msg->wfd_subelems->used)
707 			return 1;
708 
709 		return os_memcmp(dev->info.wfd_subelems->buf,
710 				 msg->wfd_subelems->buf,
711 				 dev->info.wfd_subelems->used);
712 	}
713 	if (dev->info.wfd_subelems || msg->wfd_subelems)
714 		return 1;
715 
716 	return 0;
717 }
718 
719 
720 /**
721  * p2p_add_device - Add peer entries based on scan results or P2P frames
722  * @p2p: P2P module context from p2p_init()
723  * @addr: Source address of Beacon or Probe Response frame (may be either
724  *	P2P Device Address or P2P Interface Address)
725  * @level: Signal level (signal strength of the received frame from the peer)
726  * @freq: Frequency on which the Beacon or Probe Response frame was received
727  * @rx_time: Time when the result was received
728  * @ies: IEs from the Beacon or Probe Response frame
729  * @ies_len: Length of ies buffer in octets
730  * @scan_res: Whether this was based on scan results
731  * Returns: 0 on success, -1 on failure
732  *
733  * If the scan result is for a GO, the clients in the group will also be added
734  * to the peer table. This function can also be used with some other frames
735  * like Provision Discovery Request that contains P2P Capability and P2P Device
736  * Info attributes.
737  */
p2p_add_device(struct p2p_data * p2p,const u8 * addr,int freq,struct os_reltime * rx_time,int level,const u8 * ies,size_t ies_len,int scan_res)738 int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
739 		   struct os_reltime *rx_time, int level, const u8 *ies,
740 		   size_t ies_len, int scan_res)
741 {
742 	struct p2p_device *dev;
743 	struct p2p_message msg;
744 	const u8 *p2p_dev_addr;
745 	int wfd_changed;
746 	int dev_name_changed;
747 	int i;
748 	struct os_reltime time_now;
749 
750 	os_memset(&msg, 0, sizeof(msg));
751 	if (p2p_parse_ies(ies, ies_len, &msg)) {
752 		p2p_dbg(p2p, "Failed to parse P2P IE for a device entry");
753 		p2p_parse_free(&msg);
754 		return -1;
755 	}
756 
757 	if (msg.p2p_device_addr)
758 		p2p_dev_addr = msg.p2p_device_addr;
759 	else if (msg.device_id)
760 		p2p_dev_addr = msg.device_id;
761 	else {
762 		p2p_dbg(p2p, "Ignore scan data without P2P Device Info or P2P Device Id");
763 		p2p_parse_free(&msg);
764 		return -1;
765 	}
766 
767 	if (!is_zero_ether_addr(p2p->peer_filter) &&
768 	    !ether_addr_equal(p2p_dev_addr, p2p->peer_filter)) {
769 		p2p_dbg(p2p, "Do not add peer filter for " MACSTR
770 			" due to peer filter", MAC2STR(p2p_dev_addr));
771 		p2p_parse_free(&msg);
772 		return 0;
773 	}
774 
775 	dev = p2p_create_device(p2p, p2p_dev_addr);
776 	if (dev == NULL) {
777 		p2p_parse_free(&msg);
778 		return -1;
779 	}
780 
781 	if (rx_time == NULL) {
782 		os_get_reltime(&time_now);
783 		rx_time = &time_now;
784 	}
785 
786 	/*
787 	 * Update the device entry only if the new peer
788 	 * entry is newer than the one previously stored, or if
789 	 * the device was previously seen as a P2P Client in a group
790 	 * and the new entry isn't older than a threshold.
791 	 */
792 	if (dev->last_seen.sec > 0 &&
793 	    os_reltime_before(rx_time, &dev->last_seen) &&
794 	    (!(dev->flags & P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT) ||
795 	     os_reltime_expired(&dev->last_seen, rx_time,
796 				P2P_DEV_GROUP_CLIENT_RESP_THRESHOLD))) {
797 		p2p_dbg(p2p,
798 			"Do not update peer entry based on old frame (rx_time=%u.%06u last_seen=%u.%06u flags=0x%x)",
799 			(unsigned int) rx_time->sec,
800 			(unsigned int) rx_time->usec,
801 			(unsigned int) dev->last_seen.sec,
802 			(unsigned int) dev->last_seen.usec,
803 			dev->flags);
804 		p2p_parse_free(&msg);
805 		return -1;
806 	}
807 
808 	os_memcpy(&dev->last_seen, rx_time, sizeof(struct os_reltime));
809 
810 	dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY |
811 			P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT);
812 
813 	if (!ether_addr_equal(addr, p2p_dev_addr))
814 		os_memcpy(dev->interface_addr, addr, ETH_ALEN);
815 	if (msg.ssid &&
816 	    msg.ssid[1] <= sizeof(dev->oper_ssid) &&
817 	    (msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
818 	     os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
819 	     != 0)) {
820 		os_memcpy(dev->oper_ssid, msg.ssid + 2, msg.ssid[1]);
821 		dev->oper_ssid_len = msg.ssid[1];
822 	}
823 
824 	wpabuf_free(dev->info.p2ps_instance);
825 	dev->info.p2ps_instance = NULL;
826 	if (msg.adv_service_instance && msg.adv_service_instance_len)
827 		dev->info.p2ps_instance = wpabuf_alloc_copy(
828 			msg.adv_service_instance, msg.adv_service_instance_len);
829 
830 	if (freq >= 2412 && freq <= 2484 && msg.ds_params &&
831 	    *msg.ds_params >= 1 && *msg.ds_params <= 14) {
832 		int ds_freq;
833 		if (*msg.ds_params == 14)
834 			ds_freq = 2484;
835 		else
836 			ds_freq = 2407 + *msg.ds_params * 5;
837 		if (freq != ds_freq) {
838 			p2p_dbg(p2p, "Update Listen frequency based on DS Parameter Set IE: %d -> %d MHz",
839 				freq, ds_freq);
840 			freq = ds_freq;
841 		}
842 	}
843 
844 	if (dev->listen_freq && dev->listen_freq != freq && scan_res) {
845 		p2p_dbg(p2p, "Update Listen frequency based on scan results ("
846 			MACSTR " %d -> %d MHz (DS param %d)",
847 			MAC2STR(dev->info.p2p_device_addr), dev->listen_freq,
848 			freq, msg.ds_params ? *msg.ds_params : -1);
849 	}
850 	if (scan_res) {
851 		dev->listen_freq = freq;
852 		if (msg.group_info)
853 			dev->oper_freq = freq;
854 	}
855 	dev->info.level = level;
856 
857 	dev_name_changed = os_strncmp(dev->info.device_name, msg.device_name,
858 				      WPS_DEV_NAME_MAX_LEN) != 0;
859 
860 	p2p_copy_wps_info(p2p, dev, 0, &msg);
861 
862 	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
863 		wpabuf_free(dev->info.wps_vendor_ext[i]);
864 		dev->info.wps_vendor_ext[i] = NULL;
865 	}
866 
867 	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
868 		if (msg.wps_vendor_ext[i] == NULL)
869 			break;
870 		dev->info.wps_vendor_ext[i] = wpabuf_alloc_copy(
871 			msg.wps_vendor_ext[i], msg.wps_vendor_ext_len[i]);
872 		if (dev->info.wps_vendor_ext[i] == NULL)
873 			break;
874 	}
875 
876 	wfd_changed = p2p_compare_wfd_info(dev, &msg);
877 
878 	if (wfd_changed) {
879 		wpabuf_free(dev->info.wfd_subelems);
880 		if (msg.wfd_subelems)
881 			dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
882 		else
883 			dev->info.wfd_subelems = NULL;
884 	}
885 
886 	if (scan_res) {
887 		p2p_add_group_clients(p2p, p2p_dev_addr, addr, freq,
888 				      msg.group_info, msg.group_info_len,
889 				      rx_time);
890 	}
891 
892 	p2p_parse_free(&msg);
893 
894 	p2p_update_peer_vendor_elems(dev, ies, ies_len);
895 
896 	if (dev->flags & P2P_DEV_REPORTED && !wfd_changed &&
897 	    !dev_name_changed &&
898 	    (!msg.adv_service_instance ||
899 	     (dev->flags & P2P_DEV_P2PS_REPORTED)))
900 		return 0;
901 
902 	p2p_dbg(p2p, "Peer found with Listen frequency %d MHz (rx_time=%u.%06u)",
903 		freq, (unsigned int) rx_time->sec,
904 		(unsigned int) rx_time->usec);
905 	if (dev->flags & P2P_DEV_USER_REJECTED) {
906 		p2p_dbg(p2p, "Do not report rejected device");
907 		return 0;
908 	}
909 
910 	if (dev->info.config_methods == 0 &&
911 	    (freq == 2412 || freq == 2437 || freq == 2462)) {
912 		/*
913 		 * If we have only seen a Beacon frame from a GO, we do not yet
914 		 * know what WPS config methods it supports. Since some
915 		 * applications use config_methods value from P2P-DEVICE-FOUND
916 		 * events, postpone reporting this peer until we've fully
917 		 * discovered its capabilities.
918 		 *
919 		 * At least for now, do this only if the peer was detected on
920 		 * one of the social channels since that peer can be easily be
921 		 * found again and there are no limitations of having to use
922 		 * passive scan on this channels, so this can be done through
923 		 * Probe Response frame that includes the config_methods
924 		 * information.
925 		 */
926 		p2p_dbg(p2p, "Do not report peer " MACSTR
927 			" with unknown config methods", MAC2STR(addr));
928 		return 0;
929 	}
930 
931 	p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
932 			    !(dev->flags & P2P_DEV_REPORTED_ONCE));
933 	dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
934 
935 	if (msg.adv_service_instance)
936 		dev->flags |= P2P_DEV_P2PS_REPORTED;
937 
938 	return 0;
939 }
940 
941 
p2p_device_free(struct p2p_data * p2p,struct p2p_device * dev)942 static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev)
943 {
944 	int i;
945 
946 	if (p2p->go_neg_peer == dev) {
947 		/*
948 		 * If GO Negotiation is in progress, report that it has failed.
949 		 */
950 		p2p_go_neg_failed(p2p, -1);
951 	}
952 	if (p2p->invite_peer == dev)
953 		p2p->invite_peer = NULL;
954 	if (p2p->sd_peer == dev)
955 		p2p->sd_peer = NULL;
956 	if (p2p->pending_client_disc_go == dev)
957 		p2p->pending_client_disc_go = NULL;
958 
959 	/* dev_lost() device, but only if it was previously dev_found() */
960 	if (dev->flags & P2P_DEV_REPORTED_ONCE)
961 		p2p->cfg->dev_lost(p2p->cfg->cb_ctx,
962 				   dev->info.p2p_device_addr);
963 
964 	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
965 		wpabuf_free(dev->info.wps_vendor_ext[i]);
966 		dev->info.wps_vendor_ext[i] = NULL;
967 	}
968 
969 	os_free(dev->bootstrap_params);
970 
971 	wpabuf_free(dev->action_frame_wrapper);
972 
973 #ifdef CONFIG_PASN
974 	if (dev->pasn) {
975 		wpa_pasn_reset(dev->pasn);
976 		pasn_data_deinit(dev->pasn);
977 	}
978 #endif /* CONFIG_PASN */
979 
980 	wpabuf_free(dev->info.wfd_subelems);
981 	wpabuf_free(dev->info.vendor_elems);
982 	wpabuf_free(dev->go_neg_conf);
983 	wpabuf_free(dev->info.p2ps_instance);
984 
985 	os_free(dev);
986 }
987 
988 
p2p_get_next_prog_freq(struct p2p_data * p2p)989 static int p2p_get_next_prog_freq(struct p2p_data *p2p)
990 {
991 	struct p2p_channels *c;
992 	struct p2p_reg_class *cla;
993 	size_t cl, ch;
994 	int found = 0;
995 	u8 reg_class;
996 	u8 channel;
997 	int freq;
998 
999 	c = &p2p->cfg->channels;
1000 	for (cl = 0; cl < c->reg_classes; cl++) {
1001 		cla = &c->reg_class[cl];
1002 		if (cla->reg_class != p2p->last_prog_scan_class)
1003 			continue;
1004 		for (ch = 0; ch < cla->channels; ch++) {
1005 			if (cla->channel[ch] == p2p->last_prog_scan_chan) {
1006 				found = 1;
1007 				break;
1008 			}
1009 		}
1010 		if (found)
1011 			break;
1012 	}
1013 
1014 	if (!found) {
1015 		/* Start from beginning */
1016 		reg_class = c->reg_class[0].reg_class;
1017 		channel = c->reg_class[0].channel[0];
1018 	} else {
1019 		/* Pick the next channel */
1020 		ch++;
1021 		if (ch == cla->channels) {
1022 			cl++;
1023 			if (cl == c->reg_classes)
1024 				cl = 0;
1025 			ch = 0;
1026 		}
1027 		reg_class = c->reg_class[cl].reg_class;
1028 		channel = c->reg_class[cl].channel[ch];
1029 	}
1030 
1031 	freq = p2p_channel_to_freq(reg_class, channel);
1032 	p2p_dbg(p2p, "Next progressive search channel: reg_class %u channel %u -> %d MHz",
1033 		reg_class, channel, freq);
1034 	p2p->last_prog_scan_class = reg_class;
1035 	p2p->last_prog_scan_chan = channel;
1036 
1037 	if (freq == 2412 || freq == 2437 || freq == 2462)
1038 		return 0; /* No need to add social channels */
1039 	return freq;
1040 }
1041 
1042 
p2p_search(struct p2p_data * p2p)1043 static void p2p_search(struct p2p_data *p2p)
1044 {
1045 	int freq = 0;
1046 	enum p2p_scan_type type;
1047 	u16 pw_id = DEV_PW_DEFAULT;
1048 	int res;
1049 
1050 	if (p2p->drv_in_listen) {
1051 		p2p_dbg(p2p, "Driver is still in Listen state - wait for it to end before continuing");
1052 		return;
1053 	}
1054 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1055 	p2p->pending_listen_wait_drv = false;
1056 
1057 	if (p2p->find_pending_full &&
1058 	    (p2p->find_type == P2P_FIND_PROGRESSIVE ||
1059 	     p2p->find_type == P2P_FIND_START_WITH_FULL)) {
1060 		type = P2P_SCAN_FULL;
1061 		p2p_dbg(p2p, "Starting search (pending full scan)");
1062 		p2p->find_pending_full = 0;
1063 	} else if ((p2p->find_type == P2P_FIND_PROGRESSIVE &&
1064 	    (freq = p2p_get_next_prog_freq(p2p)) > 0) ||
1065 	    (p2p->find_type == P2P_FIND_START_WITH_FULL &&
1066 	     (freq = p2p->find_specified_freq) > 0)) {
1067 		type = P2P_SCAN_SOCIAL_PLUS_ONE;
1068 		p2p_dbg(p2p, "Starting search (+ freq %u)", freq);
1069 	} else {
1070 		type = P2P_SCAN_SOCIAL;
1071 		p2p_dbg(p2p, "Starting search");
1072 	}
1073 
1074 	res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, type, freq,
1075 				 p2p->num_req_dev_types, p2p->req_dev_types,
1076 				 p2p->find_dev_id, pw_id, p2p->include_6ghz);
1077 	if (res < 0) {
1078 		p2p_dbg(p2p, "Scan request schedule failed");
1079 		p2p_continue_find(p2p);
1080 	}
1081 }
1082 
1083 
p2p_find_timeout(void * eloop_ctx,void * timeout_ctx)1084 static void p2p_find_timeout(void *eloop_ctx, void *timeout_ctx)
1085 {
1086 	struct p2p_data *p2p = eloop_ctx;
1087 	p2p_dbg(p2p, "Find timeout -> stop");
1088 	p2p_stop_find(p2p);
1089 }
1090 
1091 
p2p_notify_scan_trigger_status(struct p2p_data * p2p,int status)1092 void p2p_notify_scan_trigger_status(struct p2p_data *p2p, int status)
1093 {
1094 	if (status != 0) {
1095 		p2p_dbg(p2p, "Scan request failed");
1096 		/* Do continue find even for the first p2p_find_scan */
1097 		p2p_continue_find(p2p);
1098 	} else {
1099 		p2p_dbg(p2p, "Running p2p_scan");
1100 		p2p->p2p_scan_running = 1;
1101 		eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
1102 		eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
1103 				       p2p, NULL);
1104 	}
1105 }
1106 
1107 
p2p_run_after_scan(struct p2p_data * p2p)1108 static int p2p_run_after_scan(struct p2p_data *p2p)
1109 {
1110 	struct p2p_device *dev;
1111 	enum p2p_after_scan op;
1112 
1113 	op = p2p->start_after_scan;
1114 	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1115 	switch (op) {
1116 	case P2P_AFTER_SCAN_NOTHING:
1117 		break;
1118 	case P2P_AFTER_SCAN_LISTEN:
1119 		p2p_dbg(p2p, "Start previously requested Listen state");
1120 		p2p_listen(p2p, p2p->pending_listen_sec * 1000 +
1121 			   p2p->pending_listen_usec / 1000);
1122 		return 1;
1123 	case P2P_AFTER_SCAN_CONNECT:
1124 		p2p_dbg(p2p, "Start previously requested connect with " MACSTR,
1125 			MAC2STR(p2p->after_scan_peer));
1126 		dev = p2p_get_device(p2p, p2p->after_scan_peer);
1127 		if (dev == NULL) {
1128 			p2p_dbg(p2p, "Peer not known anymore");
1129 			break;
1130 		}
1131 		p2p_connect_send(p2p, dev);
1132 		return 1;
1133 	}
1134 
1135 	return 0;
1136 }
1137 
1138 
p2p_scan_timeout(void * eloop_ctx,void * timeout_ctx)1139 static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1140 {
1141 	struct p2p_data *p2p = eloop_ctx;
1142 	int running;
1143 	p2p_dbg(p2p, "p2p_scan timeout (running=%d)", p2p->p2p_scan_running);
1144 	running = p2p->p2p_scan_running;
1145 	/* Make sure we recover from missed scan results callback */
1146 	p2p->p2p_scan_running = 0;
1147 
1148 	if (running)
1149 		p2p_run_after_scan(p2p);
1150 }
1151 
1152 
p2p_free_req_dev_types(struct p2p_data * p2p)1153 static void p2p_free_req_dev_types(struct p2p_data *p2p)
1154 {
1155 	p2p->num_req_dev_types = 0;
1156 	os_free(p2p->req_dev_types);
1157 	p2p->req_dev_types = NULL;
1158 }
1159 
1160 
p2ps_gen_hash(struct p2p_data * p2p,const char * str,u8 * hash)1161 static int p2ps_gen_hash(struct p2p_data *p2p, const char *str, u8 *hash)
1162 {
1163 	u8 buf[SHA256_MAC_LEN];
1164 	char str_buf[256];
1165 	const u8 *adv_array;
1166 	size_t i, adv_len;
1167 
1168 	if (!str || !hash)
1169 		return 0;
1170 
1171 	if (!str[0]) {
1172 		os_memcpy(hash, p2p->wild_card_hash, P2PS_HASH_LEN);
1173 		return 1;
1174 	}
1175 
1176 	adv_array = (u8 *) str_buf;
1177 	adv_len = os_strlen(str);
1178 	if (adv_len >= sizeof(str_buf))
1179 		return 0;
1180 
1181 	for (i = 0; i < adv_len; i++) {
1182 		if (str[i] >= 'A' && str[i] <= 'Z')
1183 			str_buf[i] = str[i] - 'A' + 'a';
1184 		else
1185 			str_buf[i] = str[i];
1186 	}
1187 
1188 	if (sha256_vector(1, &adv_array, &adv_len, buf))
1189 		return 0;
1190 
1191 	os_memcpy(hash, buf, P2PS_HASH_LEN);
1192 	return 1;
1193 }
1194 
1195 
p2p_find(struct p2p_data * p2p,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,u8 seek_count,const char ** seek,int freq,bool include_6ghz)1196 int p2p_find(struct p2p_data *p2p, unsigned int timeout,
1197 	     enum p2p_discovery_type type,
1198 	     unsigned int num_req_dev_types, const u8 *req_dev_types,
1199 	     const u8 *dev_id, unsigned int search_delay,
1200 	     u8 seek_count, const char **seek, int freq, bool include_6ghz)
1201 {
1202 	int res;
1203 	struct os_reltime start;
1204 
1205 	p2p_dbg(p2p, "Starting find (type=%d)", type);
1206 	if (p2p->p2p_scan_running) {
1207 		p2p_dbg(p2p, "p2p_scan is already running");
1208 	}
1209 
1210 	p2p_free_req_dev_types(p2p);
1211 	if (req_dev_types && num_req_dev_types) {
1212 		p2p->req_dev_types = os_memdup(req_dev_types,
1213 					       num_req_dev_types *
1214 					       WPS_DEV_TYPE_LEN);
1215 		if (p2p->req_dev_types == NULL)
1216 			return -1;
1217 		p2p->num_req_dev_types = num_req_dev_types;
1218 	}
1219 
1220 	if (dev_id) {
1221 		os_memcpy(p2p->find_dev_id_buf, dev_id, ETH_ALEN);
1222 		p2p->find_dev_id = p2p->find_dev_id_buf;
1223 	} else
1224 		p2p->find_dev_id = NULL;
1225 	p2p->include_6ghz = p2p_wfd_enabled(p2p) && include_6ghz;
1226 	if (seek_count == 0 || !seek) {
1227 		/* Not an ASP search */
1228 		p2p->p2ps_seek = 0;
1229 	} else if (seek_count == 1 && seek && (!seek[0] || !seek[0][0])) {
1230 		/*
1231 		 * An empty seek string means no hash values, but still an ASP
1232 		 * search.
1233 		 */
1234 		p2p_dbg(p2p, "ASP search");
1235 		p2p->p2ps_seek_count = 0;
1236 		p2p->p2ps_seek = 1;
1237 	} else if (seek && seek_count <= P2P_MAX_QUERY_HASH) {
1238 		u8 buf[P2PS_HASH_LEN];
1239 		int i, count = 0;
1240 
1241 		for (i = 0; i < seek_count; i++) {
1242 			if (!p2ps_gen_hash(p2p, seek[i], buf))
1243 				continue;
1244 
1245 			p2p_dbg(p2p, "Seek service %s hash " MACSTR,
1246 				seek[i], MAC2STR(buf));
1247 			os_memcpy(&p2p->p2ps_seek_hash[count * P2PS_HASH_LEN],
1248 				  buf, P2PS_HASH_LEN);
1249 			count++;
1250 		}
1251 
1252 		p2p->p2ps_seek_count = count;
1253 		p2p->p2ps_seek = 1;
1254 	} else {
1255 		p2p->p2ps_seek_count = 0;
1256 		p2p->p2ps_seek = 1;
1257 	}
1258 
1259 	/* Special case to perform wildcard search */
1260 	if (p2p->p2ps_seek_count == 0 && p2p->p2ps_seek) {
1261 		p2p->p2ps_seek_count = 1;
1262 		os_memcpy(&p2p->p2ps_seek_hash, p2p->wild_card_hash,
1263 			  P2PS_HASH_LEN);
1264 	}
1265 
1266 	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1267 	p2p_clear_timeout(p2p);
1268 	if (p2p->pending_listen_freq) {
1269 		p2p_dbg(p2p, "Clear pending_listen_freq for p2p_find");
1270 		p2p->pending_listen_freq = 0;
1271 	}
1272 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1273 	p2p->pending_listen_wait_drv = false;
1274 	p2p->find_pending_full = 0;
1275 	p2p->find_type = type;
1276 	if (freq != 2412 && freq != 2437 && freq != 2462 && freq != 60480)
1277 		p2p->find_specified_freq = freq;
1278 	else
1279 		p2p->find_specified_freq = 0;
1280 	p2p_device_clear_reported(p2p);
1281 	os_memset(p2p->sd_query_no_ack, 0, ETH_ALEN);
1282 	p2p_set_state(p2p, P2P_SEARCH);
1283 	p2p->search_delay = search_delay;
1284 	p2p->in_search_delay = 0;
1285 	eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1286 	p2p->last_p2p_find_timeout = timeout;
1287 	if (timeout)
1288 		eloop_register_timeout(timeout, 0, p2p_find_timeout,
1289 				       p2p, NULL);
1290 	os_get_reltime(&start);
1291 	switch (type) {
1292 	case P2P_FIND_START_WITH_FULL:
1293 		if (freq > 0) {
1294 			/*
1295 			 * Start with the specified channel and then move to
1296 			 * scans for social channels and this specific channel.
1297 			 */
1298 			res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx,
1299 						 P2P_SCAN_SPECIFIC, freq,
1300 						 p2p->num_req_dev_types,
1301 						 p2p->req_dev_types, dev_id,
1302 						 DEV_PW_DEFAULT,
1303 						 p2p->include_6ghz);
1304 			break;
1305 		}
1306 		/* fall through */
1307 	case P2P_FIND_PROGRESSIVE:
1308 		res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_FULL, 0,
1309 					 p2p->num_req_dev_types,
1310 					 p2p->req_dev_types, dev_id,
1311 					 DEV_PW_DEFAULT, p2p->include_6ghz);
1312 		break;
1313 	case P2P_FIND_ONLY_SOCIAL:
1314 		res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_SOCIAL, 0,
1315 					 p2p->num_req_dev_types,
1316 					 p2p->req_dev_types, dev_id,
1317 					 DEV_PW_DEFAULT, p2p->include_6ghz);
1318 		break;
1319 	default:
1320 		return -1;
1321 	}
1322 
1323 	if (!res)
1324 		p2p->find_start = start;
1325 
1326 	if (res != 0 && p2p->p2p_scan_running) {
1327 		p2p_dbg(p2p, "Failed to start p2p_scan - another p2p_scan was already running");
1328 		/* wait for the previous p2p_scan to complete */
1329 		if (type == P2P_FIND_PROGRESSIVE ||
1330 		    (type == P2P_FIND_START_WITH_FULL && freq == 0))
1331 			p2p->find_pending_full = 1;
1332 		res = 0; /* do not report failure */
1333 	} else if (res != 0) {
1334 		p2p_dbg(p2p, "Failed to start p2p_scan");
1335 		p2p_set_state(p2p, P2P_IDLE);
1336 		eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1337 	}
1338 
1339 	return res;
1340 }
1341 
1342 
p2p_stop_find_for_freq(struct p2p_data * p2p,int freq)1343 void p2p_stop_find_for_freq(struct p2p_data *p2p, int freq)
1344 {
1345 	p2p_dbg(p2p, "Stopping find");
1346 	eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1347 	p2p_clear_timeout(p2p);
1348 	if (p2p->state == P2P_SEARCH || p2p->state == P2P_SD_DURING_FIND)
1349 		p2p->cfg->find_stopped(p2p->cfg->cb_ctx);
1350 
1351 	p2p->p2ps_seek_count = 0;
1352 
1353 	p2p_set_state(p2p, P2P_IDLE);
1354 	p2p_free_req_dev_types(p2p);
1355 	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1356 	if (p2p->go_neg_peer)
1357 		p2p->go_neg_peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
1358 	p2p->go_neg_peer = NULL;
1359 	p2p->sd_peer = NULL;
1360 	p2p->invite_peer = NULL;
1361 	p2p_stop_listen_for_freq(p2p, freq);
1362 	p2p->send_action_in_progress = 0;
1363 }
1364 
1365 
p2p_stop_listen_for_freq(struct p2p_data * p2p,int freq)1366 void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq)
1367 {
1368 	p2p_dbg(p2p,
1369 		"%s(freq=%d) pending_listen_freq=%d in_listen=%d drv_in_listen=%d",
1370 		__func__, freq, p2p->pending_listen_freq, p2p->in_listen,
1371 		p2p->drv_in_listen);
1372 	if (freq > 0 &&
1373 	    ((p2p->drv_in_listen == freq && p2p->in_listen) ||
1374 	     p2p->pending_listen_freq == (unsigned int) freq)) {
1375 		p2p_dbg(p2p, "Skip stop_listen since we are on correct channel for response");
1376 		return;
1377 	}
1378 	if (p2p->in_listen) {
1379 		p2p->in_listen = 0;
1380 		p2p_clear_timeout(p2p);
1381 	}
1382 	if (p2p->drv_in_listen) {
1383 		/*
1384 		 * The driver may not deliver callback to p2p_listen_end()
1385 		 * when the operation gets canceled, so clear the internal
1386 		 * variable that is tracking driver state.
1387 		 */
1388 		p2p_dbg(p2p, "Clear drv_in_listen (%d)", p2p->drv_in_listen);
1389 		p2p->drv_in_listen = 0;
1390 	}
1391 	if (p2p->pending_listen_freq &&
1392 	    p2p->pending_listen_freq != (unsigned int) freq &&
1393 	    !p2p->drv_in_listen && p2p->pending_listen_wait_drv) {
1394 		p2p_dbg(p2p,
1395 			"Clear pending_listen_freq since the started listen did not complete before being stopped");
1396 		p2p->pending_listen_freq = 0;
1397 	}
1398 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1399 	p2p->pending_listen_wait_drv = false;
1400 }
1401 
1402 
p2p_stop_listen(struct p2p_data * p2p)1403 void p2p_stop_listen(struct p2p_data *p2p)
1404 {
1405 	if (p2p->state != P2P_LISTEN_ONLY) {
1406 		p2p_dbg(p2p, "Skip stop_listen since not in listen_only state.");
1407 		return;
1408 	}
1409 
1410 	p2p_stop_listen_for_freq(p2p, 0);
1411 	p2p_set_state(p2p, P2P_IDLE);
1412 }
1413 
1414 
p2p_stop_find(struct p2p_data * p2p)1415 void p2p_stop_find(struct p2p_data *p2p)
1416 {
1417 	p2p->pending_listen_freq = 0;
1418 	p2p_stop_find_for_freq(p2p, 0);
1419 }
1420 
1421 
p2p_prepare_channel_pref(struct p2p_data * p2p,unsigned int force_freq,unsigned int pref_freq,int go)1422 static int p2p_prepare_channel_pref(struct p2p_data *p2p,
1423 				    unsigned int force_freq,
1424 				    unsigned int pref_freq, int go)
1425 {
1426 	u8 op_class, op_channel;
1427 	unsigned int freq = force_freq ? force_freq : pref_freq;
1428 
1429 	p2p_dbg(p2p, "Prepare channel pref - force_freq=%u pref_freq=%u go=%d",
1430 		force_freq, pref_freq, go);
1431 
1432 	if (p2p->cfg->is_p2p_dfs_chan &&
1433 	    p2p->cfg->is_p2p_dfs_chan(p2p->cfg->cb_ctx, freq, 0, 0) &&
1434 	     p2p->dfs_ap_connected) {
1435 		if (ieee80211_chaninfo_to_channel(
1436 			    freq, p2p->sta_connected_chan_width, 0,
1437 			    &op_class, &op_channel) < 0) {
1438 			p2p_dbg(p2p, "Unsupported frequency %u MHz", freq);
1439 			return -1;
1440 		}
1441 	} else if (p2p_freq_to_channel(freq, &op_class, &op_channel) < 0) {
1442 		p2p_dbg(p2p, "Unsupported frequency %u MHz", freq);
1443 		return -1;
1444 	}
1445 
1446 	if (!p2p_channels_includes(&p2p->cfg->channels, op_class, op_channel) &&
1447 	    (go || !p2p_channels_includes(&p2p->cfg->cli_channels, op_class,
1448 					  op_channel))) {
1449 		p2p_dbg(p2p, "Frequency %u MHz (oper_class %u channel %u) not allowed for P2P",
1450 			freq, op_class, op_channel);
1451 		return -1;
1452 	}
1453 
1454 	p2p->op_reg_class = op_class;
1455 	p2p->op_channel = op_channel;
1456 
1457 	if (force_freq) {
1458 		p2p->channels.reg_classes = 1;
1459 		p2p->channels.reg_class[0].channels = 1;
1460 		p2p->channels.reg_class[0].reg_class = p2p->op_reg_class;
1461 		p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
1462 	} else {
1463 		p2p_copy_channels(&p2p->channels, &p2p->cfg->channels,
1464 				  p2p->allow_6ghz);
1465 	}
1466 
1467 	return 0;
1468 }
1469 
1470 
p2p_prepare_channel_best(struct p2p_data * p2p)1471 static void p2p_prepare_channel_best(struct p2p_data *p2p)
1472 {
1473 	u8 op_class, op_channel;
1474 	const int op_classes_5ghz[] = { 124, 125, 115, 0 };
1475 	const int op_classes_ht40[] = { 126, 127, 116, 117, 0 };
1476 	const int op_classes_vht[] = { 128, 0 };
1477 	const int op_classes_edmg[] = { 181, 182, 183, 0 };
1478 	const int op_classes_6ghz[] = { 131, 0 };
1479 
1480 	p2p_dbg(p2p, "Prepare channel best");
1481 
1482 	if (!p2p->cfg->cfg_op_channel && p2p->best_freq_overall > 0 &&
1483 	    p2p_supported_freq(p2p, p2p->best_freq_overall) &&
1484 	    p2p_freq_to_channel(p2p->best_freq_overall, &op_class, &op_channel)
1485 	    == 0) {
1486 		p2p_dbg(p2p, "Select best overall channel as operating channel preference");
1487 		p2p->op_reg_class = op_class;
1488 		p2p->op_channel = op_channel;
1489 	} else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_5 > 0 &&
1490 		   p2p_supported_freq(p2p, p2p->best_freq_5) &&
1491 		   p2p_freq_to_channel(p2p->best_freq_5, &op_class, &op_channel)
1492 		   == 0) {
1493 		p2p_dbg(p2p, "Select best 5 GHz channel as operating channel preference");
1494 		p2p->op_reg_class = op_class;
1495 		p2p->op_channel = op_channel;
1496 	} else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_24 > 0 &&
1497 		   p2p_supported_freq(p2p, p2p->best_freq_24) &&
1498 		   p2p_freq_to_channel(p2p->best_freq_24, &op_class,
1499 				       &op_channel) == 0) {
1500 		p2p_dbg(p2p, "Select best 2.4 GHz channel as operating channel preference");
1501 		p2p->op_reg_class = op_class;
1502 		p2p->op_channel = op_channel;
1503 	} else if (p2p->cfg->num_pref_chan > 0 &&
1504 		   p2p_channels_includes(&p2p->cfg->channels,
1505 					 p2p->cfg->pref_chan[0].op_class,
1506 					 p2p->cfg->pref_chan[0].chan)) {
1507 		p2p_dbg(p2p, "Select first pref_chan entry as operating channel preference");
1508 		p2p->op_reg_class = p2p->cfg->pref_chan[0].op_class;
1509 		p2p->op_channel = p2p->cfg->pref_chan[0].chan;
1510 	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_edmg,
1511 				      &p2p->op_reg_class, &p2p->op_channel) ==
1512 		   0) {
1513 		p2p_dbg(p2p, "Select possible EDMG channel (op_class %u channel %u) as operating channel preference",
1514 			p2p->op_reg_class, p2p->op_channel);
1515 	} else if (p2p->allow_6ghz &&
1516 		   (p2p_channel_select(&p2p->cfg->channels, op_classes_6ghz,
1517 				       &p2p->op_reg_class, &p2p->op_channel) ==
1518 		    0)) {
1519 		p2p_dbg(p2p, "Select possible 6 GHz channel (op_class %u channel %u) as operating channel preference",
1520 			p2p->op_reg_class, p2p->op_channel);
1521 	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_vht,
1522 				      &p2p->op_reg_class, &p2p->op_channel) ==
1523 		   0) {
1524 		p2p_dbg(p2p, "Select possible VHT channel (op_class %u channel %u) as operating channel preference",
1525 			p2p->op_reg_class, p2p->op_channel);
1526 	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_ht40,
1527 				      &p2p->op_reg_class, &p2p->op_channel) ==
1528 		   0) {
1529 		p2p_dbg(p2p, "Select possible HT40 channel (op_class %u channel %u) as operating channel preference",
1530 			p2p->op_reg_class, p2p->op_channel);
1531 	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_5ghz,
1532 				      &p2p->op_reg_class, &p2p->op_channel) ==
1533 		   0) {
1534 		p2p_dbg(p2p, "Select possible 5 GHz channel (op_class %u channel %u) as operating channel preference",
1535 			p2p->op_reg_class, p2p->op_channel);
1536 	} else if (p2p_channels_includes(&p2p->cfg->channels,
1537 					 p2p->cfg->op_reg_class,
1538 					 p2p->cfg->op_channel)) {
1539 		p2p_dbg(p2p, "Select pre-configured channel as operating channel preference");
1540 		p2p->op_reg_class = p2p->cfg->op_reg_class;
1541 		p2p->op_channel = p2p->cfg->op_channel;
1542 	} else if (p2p_channel_random_social(&p2p->cfg->channels,
1543 					     &p2p->op_reg_class,
1544 					     &p2p->op_channel,
1545 					     NULL, NULL) == 0) {
1546 		p2p_dbg(p2p, "Select random available social channel (op_class %u channel %u) as operating channel preference",
1547 			p2p->op_reg_class, p2p->op_channel);
1548 	} else {
1549 		/* Select any random available channel from the first available
1550 		 * operating class */
1551 		if (p2p_channel_select(&p2p->cfg->channels, NULL,
1552 				       &p2p->op_reg_class,
1553 				       &p2p->op_channel) == 0)
1554 			p2p_dbg(p2p,
1555 				"Select random available channel %d from operating class %d as operating channel preference",
1556 				p2p->op_channel, p2p->op_reg_class);
1557 	}
1558 
1559 	p2p_copy_channels(&p2p->channels, &p2p->cfg->channels, p2p->allow_6ghz);
1560 }
1561 
1562 
1563 /**
1564  * p2p_prepare_channel - Select operating channel for GO Negotiation or P2PS PD
1565  * @p2p: P2P module context from p2p_init()
1566  * @dev: Selected peer device
1567  * @force_freq: Forced frequency in MHz or 0 if not forced
1568  * @pref_freq: Preferred frequency in MHz or 0 if no preference
1569  * @go: Whether the local end will be forced to be GO
1570  * Returns: 0 on success, -1 on failure (channel not supported for P2P)
1571  *
1572  * This function is used to do initial operating channel selection for GO
1573  * Negotiation prior to having received peer information or for P2PS PD
1574  * signalling. The selected channel may be further optimized in
1575  * p2p_reselect_channel() once the peer information is available.
1576  */
p2p_prepare_channel(struct p2p_data * p2p,struct p2p_device * dev,unsigned int force_freq,unsigned int pref_freq,int go)1577 int p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev,
1578 			unsigned int force_freq, unsigned int pref_freq, int go)
1579 {
1580 	p2p_dbg(p2p, "Prepare channel - force_freq=%u pref_freq=%u go=%d",
1581 		force_freq, pref_freq, go);
1582 	if (force_freq || pref_freq) {
1583 		if (p2p_prepare_channel_pref(p2p, force_freq, pref_freq, go) <
1584 		    0)
1585 			return -1;
1586 	} else {
1587 		p2p_prepare_channel_best(p2p);
1588 	}
1589 
1590 	if (p2p->cfg->is_p2p_dfs_chan &&
1591 	    p2p->cfg->is_p2p_dfs_chan(p2p->cfg->cb_ctx, 0,
1592 				      p2p->op_reg_class, p2p->op_channel)) {
1593 		struct p2p_channels p2p_chanlist;
1594 
1595 		p2p_dfs_channel_filter(p2p, &p2p->channels, &p2p_chanlist, go);
1596 		p2p_channels_dump(p2p,
1597 				  "Filtered channel list with allowed DFS channels",
1598 				  &p2p_chanlist);
1599 		p2p_copy_channels(&p2p->channels, &p2p_chanlist,
1600 				  p2p->allow_6ghz);
1601 	}
1602 
1603 	p2p_channels_dump(p2p, "prepared channels", &p2p->channels);
1604 	if (go)
1605 		p2p_channels_remove_freqs(&p2p->channels, &p2p->no_go_freq);
1606 	else if (!force_freq)
1607 		p2p_channels_union_inplace(&p2p->channels,
1608 					   &p2p->cfg->cli_channels);
1609 	p2p_channels_dump(p2p, "after go/cli filter/add", &p2p->channels);
1610 
1611 	p2p_dbg(p2p, "Own preference for operation channel: Operating Class %u Channel %u%s",
1612 		p2p->op_reg_class, p2p->op_channel,
1613 		force_freq ? " (forced)" : "");
1614 
1615 	if (force_freq)
1616 		dev->flags |= P2P_DEV_FORCE_FREQ;
1617 	else
1618 		dev->flags &= ~P2P_DEV_FORCE_FREQ;
1619 
1620 	return 0;
1621 }
1622 
1623 
p2p_set_dev_persistent(struct p2p_device * dev,int persistent_group)1624 static void p2p_set_dev_persistent(struct p2p_device *dev,
1625 				   int persistent_group)
1626 {
1627 	switch (persistent_group) {
1628 	case 0:
1629 		dev->flags &= ~(P2P_DEV_PREFER_PERSISTENT_GROUP |
1630 				P2P_DEV_PREFER_PERSISTENT_RECONN);
1631 		break;
1632 	case 1:
1633 		dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP;
1634 		dev->flags &= ~P2P_DEV_PREFER_PERSISTENT_RECONN;
1635 		break;
1636 	case 2:
1637 		dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP |
1638 			P2P_DEV_PREFER_PERSISTENT_RECONN;
1639 		break;
1640 	}
1641 }
1642 
1643 
p2p_connect(struct p2p_data * p2p,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,const u8 * force_ssid,size_t force_ssid_len,int pd_before_go_neg,unsigned int pref_freq,u16 oob_pw_id,bool p2p2,u16 bootstrap,const char * password)1644 int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
1645 		enum p2p_wps_method wps_method,
1646 		int go_intent, const u8 *own_interface_addr,
1647 		unsigned int force_freq, int persistent_group,
1648 		const u8 *force_ssid, size_t force_ssid_len,
1649 		int pd_before_go_neg, unsigned int pref_freq, u16 oob_pw_id,
1650 		bool p2p2, u16 bootstrap, const char *password)
1651 {
1652 	struct p2p_device *dev;
1653 
1654 	p2p_dbg(p2p, "Request to start group negotiation - peer=" MACSTR
1655 		"  GO Intent=%d  Intended Interface Address=" MACSTR
1656 		" wps_method=%d persistent_group=%d pd_before_go_neg=%d "
1657 		"oob_pw_id=%u allow_6ghz=%d",
1658 		MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
1659 		wps_method, persistent_group, pd_before_go_neg, oob_pw_id,
1660 		p2p->allow_6ghz);
1661 
1662 	dev = p2p_get_device(p2p, peer_addr);
1663 	if (dev == NULL || (dev->flags & P2P_DEV_PROBE_REQ_ONLY)) {
1664 		p2p_dbg(p2p, "Cannot connect to unknown P2P Device " MACSTR,
1665 			MAC2STR(peer_addr));
1666 		return -1;
1667 	}
1668 
1669 	if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq,
1670 				go_intent == 15) < 0)
1671 		return -1;
1672 
1673 	if (dev->flags & P2P_DEV_GROUP_CLIENT_ONLY) {
1674 		if (!(dev->info.dev_capab &
1675 		      P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY)) {
1676 			p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
1677 				" that is in a group and is not discoverable",
1678 				MAC2STR(peer_addr));
1679 			return -1;
1680 		}
1681 		if (dev->oper_freq <= 0) {
1682 			p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
1683 				" with incomplete information",
1684 				MAC2STR(peer_addr));
1685 			return -1;
1686 		}
1687 
1688 		/*
1689 		 * First, try to connect directly. If the peer does not
1690 		 * acknowledge frames, assume it is sleeping and use device
1691 		 * discoverability via the GO at that point.
1692 		 */
1693 	}
1694 
1695 	p2p->ssid_set = 0;
1696 	if (force_ssid) {
1697 		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
1698 				  force_ssid, force_ssid_len);
1699 		os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
1700 		p2p->ssid_len = force_ssid_len;
1701 		p2p->ssid_set = 1;
1702 	}
1703 
1704 	dev->flags &= ~P2P_DEV_NOT_YET_READY;
1705 	dev->flags &= ~P2P_DEV_USER_REJECTED;
1706 	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
1707 	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
1708 	if (pd_before_go_neg)
1709 		dev->flags |= P2P_DEV_PD_BEFORE_GO_NEG;
1710 	else {
1711 		dev->flags &= ~P2P_DEV_PD_BEFORE_GO_NEG;
1712 		/*
1713 		 * Assign dialog token and tie breaker here to use the same
1714 		 * values in each retry within the same GO Negotiation exchange.
1715 		 */
1716 		dev->dialog_token++;
1717 		if (dev->dialog_token == 0)
1718 			dev->dialog_token = 1;
1719 		dev->tie_breaker = p2p->next_tie_breaker;
1720 		p2p->next_tie_breaker = !p2p->next_tie_breaker;
1721 	}
1722 	dev->connect_reqs = 0;
1723 	dev->go_neg_req_sent = 0;
1724 	dev->go_state = UNKNOWN_GO;
1725 	p2p_set_dev_persistent(dev, persistent_group);
1726 	p2p->go_intent = go_intent;
1727 	os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
1728 
1729 	if (p2p->state != P2P_IDLE)
1730 		p2p_stop_find(p2p);
1731 
1732 	dev->wps_method = wps_method;
1733 	dev->oob_pw_id = oob_pw_id;
1734 	dev->p2p2 = p2p2;
1735 	dev->req_bootstrap_method = bootstrap;
1736 	if (password && os_strlen(password) < sizeof(dev->password))
1737 		os_strlcpy(dev->password, password, sizeof(dev->password));
1738 	dev->status = P2P_SC_SUCCESS;
1739 
1740 	if (p2p->p2p_scan_running) {
1741 		p2p_dbg(p2p, "p2p_scan running - delay connect send");
1742 		p2p->start_after_scan = P2P_AFTER_SCAN_CONNECT;
1743 		os_memcpy(p2p->after_scan_peer, peer_addr, ETH_ALEN);
1744 		return 0;
1745 	}
1746 
1747 	return p2p_connect_send(p2p, dev);
1748 }
1749 
1750 
p2p_authorize(struct p2p_data * p2p,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,const u8 * force_ssid,size_t force_ssid_len,unsigned int pref_freq,u16 oob_pw_id,u16 bootstrap,const char * password)1751 int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
1752 		  enum p2p_wps_method wps_method,
1753 		  int go_intent, const u8 *own_interface_addr,
1754 		  unsigned int force_freq, int persistent_group,
1755 		  const u8 *force_ssid, size_t force_ssid_len,
1756 		  unsigned int pref_freq, u16 oob_pw_id, u16 bootstrap,
1757 		  const char *password)
1758 {
1759 	struct p2p_device *dev;
1760 
1761 	p2p_dbg(p2p, "Request to authorize group negotiation - peer=" MACSTR
1762 		"  GO Intent=%d  Intended Interface Address=" MACSTR
1763 		" wps_method=%d  persistent_group=%d oob_pw_id=%u allow_6ghz=%d",
1764 		MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
1765 		wps_method, persistent_group, oob_pw_id, p2p->allow_6ghz);
1766 
1767 	dev = p2p_get_device(p2p, peer_addr);
1768 	if (dev == NULL) {
1769 		p2p_dbg(p2p, "Cannot authorize unknown P2P Device " MACSTR,
1770 			MAC2STR(peer_addr));
1771 		return -1;
1772 	}
1773 
1774 	if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq, go_intent ==
1775 				15) < 0)
1776 		return -1;
1777 
1778 	p2p->ssid_set = 0;
1779 	if (force_ssid) {
1780 		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
1781 				  force_ssid, force_ssid_len);
1782 		os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
1783 		p2p->ssid_len = force_ssid_len;
1784 		p2p->ssid_set = 1;
1785 	}
1786 
1787 	dev->flags &= ~P2P_DEV_NOT_YET_READY;
1788 	dev->flags &= ~P2P_DEV_USER_REJECTED;
1789 	dev->go_neg_req_sent = 0;
1790 	dev->go_state = UNKNOWN_GO;
1791 	dev->req_bootstrap_method = bootstrap;
1792 
1793 	if (password && os_strlen(password) < sizeof(dev->password))
1794 		os_strlcpy(dev->password, password, sizeof(dev->password));
1795 	p2p_set_dev_persistent(dev, persistent_group);
1796 	p2p->go_intent = go_intent;
1797 	os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
1798 
1799 	dev->wps_method = wps_method;
1800 	dev->oob_pw_id = oob_pw_id;
1801 	dev->status = P2P_SC_SUCCESS;
1802 
1803 	return 0;
1804 }
1805 
1806 
p2p_add_dev_info(struct p2p_data * p2p,const u8 * addr,struct p2p_device * dev,struct p2p_message * msg)1807 void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
1808 		      struct p2p_device *dev, struct p2p_message *msg)
1809 {
1810 	os_get_reltime(&dev->last_seen);
1811 
1812 	p2p_copy_wps_info(p2p, dev, 0, msg);
1813 
1814 	if (msg->listen_channel) {
1815 		int freq;
1816 		freq = p2p_channel_to_freq(msg->listen_channel[3],
1817 					   msg->listen_channel[4]);
1818 		if (freq < 0) {
1819 			p2p_dbg(p2p, "Unknown peer Listen channel: "
1820 				"country=%c%c(0x%02x) reg_class=%u channel=%u",
1821 				msg->listen_channel[0],
1822 				msg->listen_channel[1],
1823 				msg->listen_channel[2],
1824 				msg->listen_channel[3],
1825 				msg->listen_channel[4]);
1826 		} else {
1827 			p2p_dbg(p2p, "Update peer " MACSTR
1828 				" Listen channel: %u -> %u MHz",
1829 				MAC2STR(dev->info.p2p_device_addr),
1830 				dev->listen_freq, freq);
1831 			dev->listen_freq = freq;
1832 		}
1833 	}
1834 
1835 	if (msg->wfd_subelems) {
1836 		wpabuf_free(dev->info.wfd_subelems);
1837 		dev->info.wfd_subelems = wpabuf_dup(msg->wfd_subelems);
1838 	}
1839 
1840 	if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
1841 		dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
1842 		p2p_dbg(p2p, "Completed device entry based on data from GO Negotiation Request");
1843 	} else {
1844 		p2p_dbg(p2p, "Created device entry based on GO Neg Req: "
1845 			MACSTR " dev_capab=0x%x group_capab=0x%x name='%s' "
1846 			"listen_freq=%d",
1847 			MAC2STR(dev->info.p2p_device_addr),
1848 			dev->info.dev_capab, dev->info.group_capab,
1849 			dev->info.device_name, dev->listen_freq);
1850 	}
1851 
1852 	dev->flags &= ~P2P_DEV_GROUP_CLIENT_ONLY;
1853 
1854 	if (dev->flags & P2P_DEV_USER_REJECTED) {
1855 		p2p_dbg(p2p, "Do not report rejected device");
1856 		return;
1857 	}
1858 
1859 	p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
1860 			    !(dev->flags & P2P_DEV_REPORTED_ONCE));
1861 	dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
1862 }
1863 
1864 
p2p_build_ssid(struct p2p_data * p2p,u8 * ssid,size_t * ssid_len)1865 void p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len)
1866 {
1867 	os_memcpy(ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
1868 	p2p_random((char *) &ssid[P2P_WILDCARD_SSID_LEN], 2);
1869 	os_memcpy(&ssid[P2P_WILDCARD_SSID_LEN + 2],
1870 		  p2p->cfg->ssid_postfix, p2p->cfg->ssid_postfix_len);
1871 	*ssid_len = P2P_WILDCARD_SSID_LEN + 2 + p2p->cfg->ssid_postfix_len;
1872 }
1873 
1874 
p2p_go_params(struct p2p_data * p2p,struct p2p_go_neg_results * params)1875 int p2p_go_params(struct p2p_data *p2p, struct p2p_go_neg_results *params)
1876 {
1877 	if (p2p->ssid_set) {
1878 		os_memcpy(params->ssid, p2p->ssid, p2p->ssid_len);
1879 		params->ssid_len = p2p->ssid_len;
1880 	} else {
1881 		p2p_build_ssid(p2p, params->ssid, &params->ssid_len);
1882 	}
1883 	p2p->ssid_set = 0;
1884 
1885 	params->cipher = WPA_CIPHER_CCMP;
1886 	if (p2p->cfg->pairing_config.pasn_type & 0xc)
1887 		params->cipher |= WPA_CIPHER_GCMP_256;
1888 
1889 	p2p_random(params->passphrase, p2p->cfg->passphrase_len);
1890 	params->passphrase[p2p->cfg->passphrase_len] = '\0';
1891 
1892 	if (params->p2p2) {
1893 		os_strlcpy(p2p->dev_sae_password, params->passphrase,
1894 			   sizeof(p2p->dev_sae_password));
1895 		os_strlcpy(params->sae_password, p2p->dev_sae_password,
1896 			   sizeof(params->sae_password));
1897 	}
1898 
1899 	return 0;
1900 }
1901 
1902 
p2p_set_go_role(struct p2p_data * p2p,bool val)1903 void p2p_set_go_role(struct p2p_data *p2p, bool val)
1904 {
1905 	p2p->go_role = val;
1906 }
1907 
1908 
p2p_go_complete(struct p2p_data * p2p,struct p2p_device * peer)1909 void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer)
1910 {
1911 	struct p2p_go_neg_results res;
1912 	int go = peer->go_state == LOCAL_GO;
1913 	struct p2p_channels intersection;
1914 
1915 	p2p_dbg(p2p, "GO Negotiation with " MACSTR " completed (%s will be GO)",
1916 		MAC2STR(peer->info.p2p_device_addr), go ? "local end" : "peer");
1917 
1918 	os_memset(&res, 0, sizeof(res));
1919 	res.role_go = go;
1920 	os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr, ETH_ALEN);
1921 	os_memcpy(res.peer_interface_addr, peer->intended_addr, ETH_ALEN);
1922 	res.wps_method = peer->wps_method;
1923 	if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
1924 		if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
1925 			res.persistent_group = 2;
1926 		else
1927 			res.persistent_group = 1;
1928 	}
1929 
1930 	if (go) {
1931 		/* Setup AP mode for WPS provisioning */
1932 		res.freq = p2p_channel_to_freq(p2p->op_reg_class,
1933 					       p2p->op_channel);
1934 		os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
1935 		res.ssid_len = p2p->ssid_len;
1936 		p2p_random(res.passphrase, p2p->cfg->passphrase_len);
1937 		res.passphrase[p2p->cfg->passphrase_len] = '\0';
1938 	} else {
1939 		res.freq = peer->oper_freq;
1940 		if (p2p->ssid_len) {
1941 			os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
1942 			res.ssid_len = p2p->ssid_len;
1943 		}
1944 	}
1945 
1946 	p2p_channels_dump(p2p, "own channels", &p2p->channels);
1947 	p2p_channels_dump(p2p, "peer channels", &peer->channels);
1948 	p2p_channels_intersect(&p2p->channels, &peer->channels,
1949 			       &intersection);
1950 	if (go) {
1951 		p2p_channels_remove_freqs(&intersection, &p2p->no_go_freq);
1952 		p2p_channels_dump(p2p, "intersection after no-GO removal",
1953 				  &intersection);
1954 	}
1955 
1956 	p2p_channels_to_freqs(&intersection, res.freq_list,
1957 			      P2P_MAX_CHANNELS);
1958 
1959 	res.peer_config_timeout = go ? peer->client_timeout : peer->go_timeout;
1960 
1961 	p2p_clear_timeout(p2p);
1962 	p2p->ssid_set = 0;
1963 	peer->go_neg_req_sent = 0;
1964 	peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
1965 	peer->wps_method = WPS_NOT_READY;
1966 	peer->oob_pw_id = 0;
1967 	wpabuf_free(peer->go_neg_conf);
1968 	peer->go_neg_conf = NULL;
1969 
1970 #ifdef CONFIG_PASN
1971 	if (peer->p2p2 && peer->pasn) {
1972 		res.p2p2 = peer->p2p2;
1973 		res.akmp = peer->pasn->akmp;
1974 		res.cipher = peer->pasn->cipher;
1975 
1976 		if (res.akmp == WPA_KEY_MGMT_PASN) {
1977 			if (go) {
1978 				os_strlcpy(res.sae_password,
1979 					   p2p->dev_sae_password,
1980 					   sizeof(res.sae_password));
1981 			} else {
1982 				if (!os_strlen(p2p->peer_sae_password)) {
1983 					p2p_dbg(p2p, "No password from peer GO for P2P2 group formation");
1984 					return;
1985 				}
1986 				os_strlcpy(res.sae_password,
1987 					   p2p->peer_sae_password,
1988 					   sizeof(res.sae_password));
1989 			}
1990 		} else if (res.akmp == WPA_KEY_MGMT_SAE) {
1991 			if (peer->role == P2P_ROLE_PAIRING_INITIATOR) {
1992 				pasn_initiator_pmksa_cache_get(
1993 					peer->pasn->pmksa,
1994 					peer->pasn->peer_addr,
1995 					res.pmkid, res.pmk, &res.pmk_len);
1996 			} else {
1997 				pasn_responder_pmksa_cache_get(
1998 					peer->pasn->pmksa,
1999 					peer->pasn->peer_addr,
2000 					res.pmkid, res.pmk, &res.pmk_len);
2001 			}
2002 		}
2003 
2004 		os_memset(p2p->dev_sae_password, 0,
2005 			  sizeof(p2p->dev_sae_password));
2006 		os_memset(p2p->peer_sae_password, 0,
2007 			  sizeof(p2p->peer_sae_password));
2008 		wpa_pasn_reset(peer->pasn);
2009 	}
2010 #endif /* CONFIG_PASN */
2011 
2012 	if (p2p->go_role && peer->p2p2) {
2013 		p2p_set_state(p2p, P2P_IDLE);
2014 		p2p->cfg->set_go_security_config(p2p->cfg->cb_ctx, &res);
2015 		p2p->go_role = false;
2016 	} else {
2017 		p2p_set_state(p2p, P2P_PROVISIONING);
2018 		p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
2019 	}
2020 
2021 	forced_memzero(&res, sizeof(res));
2022 }
2023 
2024 
p2p_rx_p2p_action(struct p2p_data * p2p,const u8 * sa,const u8 * data,size_t len,int rx_freq)2025 static void p2p_rx_p2p_action(struct p2p_data *p2p, const u8 *sa,
2026 			      const u8 *data, size_t len, int rx_freq)
2027 {
2028 	p2p_dbg(p2p, "RX P2P Public Action from " MACSTR, MAC2STR(sa));
2029 	wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Public Action contents", data, len);
2030 
2031 	if (len < 1)
2032 		return;
2033 
2034 	switch (data[0]) {
2035 	case P2P_GO_NEG_REQ:
2036 		p2p_handle_go_neg_req(p2p, sa, data + 1, len - 1, rx_freq);
2037 		break;
2038 	case P2P_GO_NEG_RESP:
2039 		p2p_handle_go_neg_resp(p2p, sa, data + 1, len - 1, rx_freq);
2040 		break;
2041 	case P2P_GO_NEG_CONF:
2042 		p2p_handle_go_neg_conf(p2p, sa, data + 1, len - 1, false);
2043 		break;
2044 	case P2P_INVITATION_REQ:
2045 		p2p_handle_invitation_req(p2p, sa, data + 1, len - 1, rx_freq);
2046 		break;
2047 	case P2P_INVITATION_RESP:
2048 		p2p_process_invitation_resp(p2p, sa, data + 1, len - 1);
2049 		break;
2050 	case P2P_PROV_DISC_REQ:
2051 		p2p_handle_prov_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
2052 		break;
2053 	case P2P_PROV_DISC_RESP:
2054 		p2p_handle_prov_disc_resp(p2p, sa, data + 1, len - 1, rx_freq);
2055 		break;
2056 	case P2P_DEV_DISC_REQ:
2057 		p2p_process_dev_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
2058 		break;
2059 	case P2P_DEV_DISC_RESP:
2060 		p2p_process_dev_disc_resp(p2p, sa, data + 1, len - 1);
2061 		break;
2062 	default:
2063 		p2p_dbg(p2p, "Unsupported P2P Public Action frame type %d",
2064 			data[0]);
2065 		break;
2066 	}
2067 }
2068 
2069 
p2p_rx_action_public(struct p2p_data * p2p,const u8 * da,const u8 * sa,const u8 * bssid,const u8 * data,size_t len,int freq)2070 static void p2p_rx_action_public(struct p2p_data *p2p, const u8 *da,
2071 				 const u8 *sa, const u8 *bssid, const u8 *data,
2072 				 size_t len, int freq)
2073 {
2074 	if (len < 1)
2075 		return;
2076 
2077 	switch (data[0]) {
2078 	case WLAN_PA_VENDOR_SPECIFIC:
2079 		data++;
2080 		len--;
2081 		if (len < 4)
2082 			return;
2083 		if (WPA_GET_BE32(data) != P2P_IE_VENDOR_TYPE)
2084 			return;
2085 
2086 		data += 4;
2087 		len -= 4;
2088 
2089 		p2p_rx_p2p_action(p2p, sa, data, len, freq);
2090 		break;
2091 	case WLAN_PA_GAS_INITIAL_REQ:
2092 		p2p_rx_gas_initial_req(p2p, sa, data + 1, len - 1, freq);
2093 		break;
2094 	case WLAN_PA_GAS_INITIAL_RESP:
2095 		p2p_rx_gas_initial_resp(p2p, sa, data + 1, len - 1, freq);
2096 		break;
2097 	case WLAN_PA_GAS_COMEBACK_REQ:
2098 		p2p_rx_gas_comeback_req(p2p, sa, data + 1, len - 1, freq);
2099 		break;
2100 	case WLAN_PA_GAS_COMEBACK_RESP:
2101 		p2p_rx_gas_comeback_resp(p2p, sa, data + 1, len - 1, freq);
2102 		break;
2103 	}
2104 }
2105 
2106 
p2p_rx_action(struct p2p_data * p2p,const u8 * da,const u8 * sa,const u8 * bssid,u8 category,const u8 * data,size_t len,int freq)2107 void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
2108 		   const u8 *bssid, u8 category,
2109 		   const u8 *data, size_t len, int freq)
2110 {
2111 	if (category == WLAN_ACTION_PUBLIC) {
2112 		p2p_rx_action_public(p2p, da, sa, bssid, data, len, freq);
2113 		return;
2114 	}
2115 
2116 	if (category != WLAN_ACTION_VENDOR_SPECIFIC)
2117 		return;
2118 
2119 	if (len < 4)
2120 		return;
2121 
2122 	if (WPA_GET_BE32(data) != P2P_IE_VENDOR_TYPE)
2123 		return;
2124 	data += 4;
2125 	len -= 4;
2126 
2127 	/* P2P action frame */
2128 	p2p_dbg(p2p, "RX P2P Action from " MACSTR, MAC2STR(sa));
2129 	wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Action contents", data, len);
2130 
2131 	if (len < 1)
2132 		return;
2133 	switch (data[0]) {
2134 	case P2P_NOA:
2135 		p2p_dbg(p2p, "Received P2P Action - Notice of Absence");
2136 		/* TODO */
2137 		break;
2138 	case P2P_PRESENCE_REQ:
2139 		p2p_process_presence_req(p2p, da, sa, data + 1, len - 1, freq);
2140 		break;
2141 	case P2P_PRESENCE_RESP:
2142 		p2p_process_presence_resp(p2p, da, sa, data + 1, len - 1);
2143 		break;
2144 	case P2P_GO_DISC_REQ:
2145 		p2p_process_go_disc_req(p2p, da, sa, data + 1, len - 1, freq);
2146 		break;
2147 	default:
2148 		p2p_dbg(p2p, "Received P2P Action - unknown type %u", data[0]);
2149 		break;
2150 	}
2151 }
2152 
2153 
p2p_go_neg_start(void * eloop_ctx,void * timeout_ctx)2154 static void p2p_go_neg_start(void *eloop_ctx, void *timeout_ctx)
2155 {
2156 	struct p2p_data *p2p = eloop_ctx;
2157 	if (p2p->go_neg_peer == NULL)
2158 		return;
2159 	if (p2p->pending_listen_freq) {
2160 		p2p_dbg(p2p, "Clear pending_listen_freq for p2p_go_neg_start");
2161 		p2p->pending_listen_freq = 0;
2162 	}
2163 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
2164 	p2p->pending_listen_wait_drv = false;
2165 	p2p->go_neg_peer->status = P2P_SC_SUCCESS;
2166 	/*
2167 	 * Set new timeout to make sure a previously set one does not expire
2168 	 * too quickly while waiting for the GO Negotiation to complete.
2169 	 */
2170 	p2p_set_timeout(p2p, 0, 500000);
2171 	p2p_connect_send(p2p, p2p->go_neg_peer);
2172 }
2173 
2174 
p2p_invite_start(void * eloop_ctx,void * timeout_ctx)2175 static void p2p_invite_start(void *eloop_ctx, void *timeout_ctx)
2176 {
2177 	struct p2p_data *p2p = eloop_ctx;
2178 	if (p2p->invite_peer == NULL)
2179 		return;
2180 	if (p2p->pending_listen_freq) {
2181 		p2p_dbg(p2p, "Clear pending_listen_freq for p2p_invite_start");
2182 		p2p->pending_listen_freq = 0;
2183 	}
2184 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
2185 	p2p->pending_listen_wait_drv = false;
2186 	p2p_invite_send(p2p, p2p->invite_peer, p2p->invite_go_dev_addr,
2187 			p2p->invite_dev_pw_id);
2188 }
2189 
2190 
p2p_add_dev_from_probe_req(struct p2p_data * p2p,const u8 * addr,const u8 * ie,size_t ie_len)2191 static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
2192 				       const u8 *ie, size_t ie_len)
2193 {
2194 	struct p2p_message msg;
2195 	struct p2p_device *dev;
2196 
2197 	os_memset(&msg, 0, sizeof(msg));
2198 	if (p2p_parse_ies(ie, ie_len, &msg) < 0 || msg.p2p_attributes == NULL)
2199 	{
2200 		p2p_parse_free(&msg);
2201 		return; /* not a P2P probe */
2202 	}
2203 
2204 	if (msg.ssid == NULL || msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
2205 	    os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
2206 	    != 0) {
2207 		/* The Probe Request is not part of P2P Device Discovery. It is
2208 		 * not known whether the source address of the frame is the P2P
2209 		 * Device Address or P2P Interface Address. Do not add a new
2210 		 * peer entry based on this frames.
2211 		 */
2212 		p2p_parse_free(&msg);
2213 		return;
2214 	}
2215 
2216 	dev = p2p_get_device(p2p, addr);
2217 	if (dev) {
2218 		if (msg.listen_channel) {
2219 			int freq;
2220 
2221 			if (dev->country[0] == 0)
2222 				os_memcpy(dev->country, msg.listen_channel, 3);
2223 
2224 			freq = p2p_channel_to_freq(msg.listen_channel[3],
2225 						   msg.listen_channel[4]);
2226 
2227 			if (freq > 0 && dev->listen_freq != freq) {
2228 				p2p_dbg(p2p,
2229 					"Updated peer " MACSTR " Listen channel (Probe Request): %d -> %d MHz",
2230 					MAC2STR(addr), dev->listen_freq, freq);
2231 				dev->listen_freq = freq;
2232 			}
2233 		}
2234 
2235 		p2p_update_peer_6ghz_capab(dev, &msg);
2236 		os_get_reltime(&dev->last_seen);
2237 		p2p_parse_free(&msg);
2238 		return; /* already known */
2239 	}
2240 
2241 	dev = p2p_create_device(p2p, addr);
2242 	if (dev == NULL) {
2243 		p2p_parse_free(&msg);
2244 		return;
2245 	}
2246 
2247 	os_get_reltime(&dev->last_seen);
2248 	dev->flags |= P2P_DEV_PROBE_REQ_ONLY;
2249 
2250 	if (msg.listen_channel) {
2251 		os_memcpy(dev->country, msg.listen_channel, 3);
2252 		dev->listen_freq = p2p_channel_to_freq(msg.listen_channel[3],
2253 						       msg.listen_channel[4]);
2254 	}
2255 
2256 	p2p_copy_wps_info(p2p, dev, 1, &msg);
2257 
2258 	if (msg.wfd_subelems) {
2259 		wpabuf_free(dev->info.wfd_subelems);
2260 		dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
2261 	}
2262 
2263 	p2p_parse_free(&msg);
2264 
2265 	p2p_dbg(p2p, "Created device entry based on Probe Req: " MACSTR
2266 		" dev_capab=0x%x group_capab=0x%x name='%s' listen_freq=%d",
2267 		MAC2STR(dev->info.p2p_device_addr), dev->info.dev_capab,
2268 		dev->info.group_capab, dev->info.device_name,
2269 		dev->listen_freq);
2270 }
2271 
2272 
p2p_add_dev_from_go_neg_req(struct p2p_data * p2p,const u8 * addr,struct p2p_message * msg)2273 struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p,
2274 						const u8 *addr,
2275 						struct p2p_message *msg)
2276 {
2277 	struct p2p_device *dev;
2278 
2279 	dev = p2p_get_device(p2p, addr);
2280 	if (dev) {
2281 		os_get_reltime(&dev->last_seen);
2282 		return dev; /* already known */
2283 	}
2284 
2285 	dev = p2p_create_device(p2p, addr);
2286 	if (dev == NULL)
2287 		return NULL;
2288 
2289 	p2p_add_dev_info(p2p, addr, dev, msg);
2290 
2291 	return dev;
2292 }
2293 
2294 
dev_type_match(const u8 * dev_type,const u8 * req_dev_type)2295 static int dev_type_match(const u8 *dev_type, const u8 *req_dev_type)
2296 {
2297 	if (os_memcmp(dev_type, req_dev_type, WPS_DEV_TYPE_LEN) == 0)
2298 		return 1;
2299 	if (os_memcmp(dev_type, req_dev_type, 2) == 0 &&
2300 	    WPA_GET_BE32(&req_dev_type[2]) == 0 &&
2301 	    WPA_GET_BE16(&req_dev_type[6]) == 0)
2302 		return 1; /* Category match with wildcard OUI/sub-category */
2303 	return 0;
2304 }
2305 
2306 
dev_type_list_match(const u8 * dev_type,const u8 * req_dev_type[],size_t num_req_dev_type)2307 int dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[],
2308 			size_t num_req_dev_type)
2309 {
2310 	size_t i;
2311 	for (i = 0; i < num_req_dev_type; i++) {
2312 		if (dev_type_match(dev_type, req_dev_type[i]))
2313 			return 1;
2314 	}
2315 	return 0;
2316 }
2317 
2318 
2319 /**
2320  * p2p_match_dev_type - Match local device type with requested type
2321  * @p2p: P2P module context from p2p_init()
2322  * @wps: WPS TLVs from Probe Request frame (concatenated WPS IEs)
2323  * Returns: 1 on match, 0 on mismatch
2324  *
2325  * This function can be used to match the Requested Device Type attribute in
2326  * WPS IE with the local device types for deciding whether to reply to a Probe
2327  * Request frame.
2328  */
p2p_match_dev_type(struct p2p_data * p2p,struct wpabuf * wps)2329 int p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps)
2330 {
2331 	struct wps_parse_attr attr;
2332 	size_t i;
2333 
2334 	if (wps_parse_msg(wps, &attr))
2335 		return 1; /* assume no Requested Device Type attributes */
2336 
2337 	if (attr.num_req_dev_type == 0)
2338 		return 1; /* no Requested Device Type attributes -> match */
2339 
2340 	if (dev_type_list_match(p2p->cfg->pri_dev_type, attr.req_dev_type,
2341 				attr.num_req_dev_type))
2342 		return 1; /* Own Primary Device Type matches */
2343 
2344 	for (i = 0; i < p2p->cfg->num_sec_dev_types; i++) {
2345 		if (dev_type_list_match(p2p->cfg->sec_dev_type[i],
2346 					attr.req_dev_type,
2347 					attr.num_req_dev_type))
2348 			return 1; /* Own Secondary Device Type matches */
2349 	}
2350 
2351 	/* No matching device type found */
2352 	return 0;
2353 }
2354 
2355 
p2p_build_probe_resp_ies(struct p2p_data * p2p,const u8 * query_hash,u8 query_count)2356 struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p,
2357 					 const u8 *query_hash,
2358 					 u8 query_count)
2359 {
2360 	struct wpabuf *buf;
2361 	u8 *len;
2362 	int pw_id = -1;
2363 	size_t extra = 0;
2364 
2365 #ifdef CONFIG_WIFI_DISPLAY
2366 	if (p2p->wfd_ie_probe_resp)
2367 		extra = wpabuf_len(p2p->wfd_ie_probe_resp);
2368 #endif /* CONFIG_WIFI_DISPLAY */
2369 
2370 	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P])
2371 		extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P]);
2372 
2373 	if (query_count)
2374 		extra += MAX_SVC_ADV_IE_LEN;
2375 
2376 	buf = wpabuf_alloc(1000 + extra);
2377 	if (buf == NULL)
2378 		return NULL;
2379 
2380 	if (p2p->go_neg_peer) {
2381 		/* Advertise immediate availability of WPS credential */
2382 		pw_id = p2p_wps_method_pw_id(p2p->go_neg_peer->wps_method);
2383 	}
2384 
2385 	if (p2p_build_wps_ie(p2p, buf, pw_id, 1) < 0) {
2386 		p2p_dbg(p2p, "Failed to build WPS IE for Probe Response");
2387 		wpabuf_free(buf);
2388 		return NULL;
2389 	}
2390 
2391 #ifdef CONFIG_WIFI_DISPLAY
2392 	if (p2p->wfd_ie_probe_resp)
2393 		wpabuf_put_buf(buf, p2p->wfd_ie_probe_resp);
2394 #endif /* CONFIG_WIFI_DISPLAY */
2395 
2396 	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P])
2397 		wpabuf_put_buf(buf,
2398 			       p2p->vendor_elem[VENDOR_ELEM_PROBE_RESP_P2P]);
2399 
2400 	/* P2P IE */
2401 	len = p2p_buf_add_ie_hdr(buf);
2402 	p2p_buf_add_capability(buf, p2p->dev_capab &
2403 			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
2404 	if (p2p->ext_listen_interval)
2405 		p2p_buf_add_ext_listen_timing(buf, p2p->ext_listen_period,
2406 					      p2p->ext_listen_interval);
2407 	p2p_buf_add_device_info(buf, p2p, NULL);
2408 	p2p_buf_update_ie_hdr(buf, len);
2409 
2410 	if (query_count) {
2411 		p2p_buf_add_service_instance(buf, p2p, query_count, query_hash,
2412 					     p2p->p2ps_adv_list);
2413 	}
2414 
2415 	return buf;
2416 }
2417 
p2p_build_probe_resp_buf(struct p2p_data * p2p,struct wpabuf * buf,struct wpabuf * ies,const u8 * addr,int rx_freq)2418 static int p2p_build_probe_resp_buf(struct p2p_data *p2p, struct wpabuf *buf,
2419 				    struct wpabuf *ies,
2420 				    const u8 *addr, int rx_freq)
2421 {
2422 	struct ieee80211_mgmt *resp;
2423 	u8 channel, op_class;
2424 
2425 	resp = wpabuf_put(buf, offsetof(struct ieee80211_mgmt,
2426 					u.probe_resp.variable));
2427 
2428 	resp->frame_control = host_to_le16((WLAN_FC_TYPE_MGMT << 2) |
2429 					   (WLAN_FC_STYPE_PROBE_RESP << 4));
2430 	os_memcpy(resp->da, addr, ETH_ALEN);
2431 	os_memcpy(resp->sa, p2p->cfg->dev_addr, ETH_ALEN);
2432 	os_memcpy(resp->bssid, p2p->cfg->dev_addr, ETH_ALEN);
2433 	resp->u.probe_resp.beacon_int = host_to_le16(100);
2434 	/* hardware or low-level driver will setup seq_ctrl and timestamp */
2435 	resp->u.probe_resp.capab_info =
2436 	    host_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE |
2437 		     WLAN_CAPABILITY_PRIVACY |
2438 		     WLAN_CAPABILITY_SHORT_SLOT_TIME);
2439 
2440 	wpabuf_put_u8(buf, WLAN_EID_SSID);
2441 	wpabuf_put_u8(buf, P2P_WILDCARD_SSID_LEN);
2442 	wpabuf_put_data(buf, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
2443 
2444 	wpabuf_put_u8(buf, WLAN_EID_SUPP_RATES);
2445 	wpabuf_put_u8(buf, 8);
2446 	wpabuf_put_u8(buf, (60 / 5) | 0x80);
2447 	wpabuf_put_u8(buf, 90 / 5);
2448 	wpabuf_put_u8(buf, (120 / 5) | 0x80);
2449 	wpabuf_put_u8(buf, 180 / 5);
2450 	wpabuf_put_u8(buf, (240 / 5) | 0x80);
2451 	wpabuf_put_u8(buf, 360 / 5);
2452 	wpabuf_put_u8(buf, 480 / 5);
2453 	wpabuf_put_u8(buf, 540 / 5);
2454 
2455 	if (!rx_freq) {
2456 		channel = p2p->cfg->channel;
2457 	} else if (p2p_freq_to_channel(rx_freq, &op_class, &channel)) {
2458 		p2p_err(p2p, "Failed to convert freq to channel");
2459 		return -1;
2460 	}
2461 
2462 	wpabuf_put_u8(buf, WLAN_EID_DS_PARAMS);
2463 	wpabuf_put_u8(buf, 1);
2464 	wpabuf_put_u8(buf, channel);
2465 
2466 	wpabuf_put_buf(buf, ies);
2467 
2468 	return 0;
2469 }
2470 
p2p_service_find_asp(struct p2p_data * p2p,const u8 * hash)2471 static int p2p_service_find_asp(struct p2p_data *p2p, const u8 *hash)
2472 {
2473 	struct p2ps_advertisement *adv_data;
2474 	int any_wfa;
2475 
2476 	p2p_dbg(p2p, "ASP find - ASP list: %p", p2p->p2ps_adv_list);
2477 
2478 	/* Wildcard org.wi-fi.wfds matches any WFA spec defined service */
2479 	any_wfa = os_memcmp(hash, p2p->wild_card_hash, P2PS_HASH_LEN) == 0;
2480 
2481 	adv_data = p2p->p2ps_adv_list;
2482 	while (adv_data) {
2483 		if (os_memcmp(hash, adv_data->hash, P2PS_HASH_LEN) == 0)
2484 			return 1; /* exact hash match */
2485 		if (any_wfa &&
2486 		    os_strncmp(adv_data->svc_name, P2PS_WILD_HASH_STR,
2487 			       os_strlen(P2PS_WILD_HASH_STR)) == 0)
2488 			return 1; /* WFA service match */
2489 		adv_data = adv_data->next;
2490 	}
2491 
2492 	return 0;
2493 }
2494 
2495 
2496 static enum p2p_probe_req_status
p2p_reply_probe(struct p2p_data * p2p,const u8 * addr,const u8 * dst,const u8 * bssid,const u8 * ie,size_t ie_len,unsigned int rx_freq)2497 p2p_reply_probe(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
2498 		const u8 *bssid, const u8 *ie, size_t ie_len,
2499 		unsigned int rx_freq)
2500 {
2501 	struct ieee802_11_elems elems;
2502 	struct wpabuf *buf;
2503 	struct p2p_message msg;
2504 	struct wpabuf *ies;
2505 
2506 	if (ieee802_11_parse_elems((u8 *) ie, ie_len, &elems, 0) ==
2507 	    ParseFailed) {
2508 		/* Ignore invalid Probe Request frames */
2509 		p2p_dbg(p2p, "Could not parse Probe Request frame - ignore it");
2510 		return P2P_PREQ_MALFORMED;
2511 	}
2512 
2513 	if (elems.p2p == NULL) {
2514 		/* not a P2P probe - ignore it */
2515 		p2p_dbg(p2p, "Not a P2P probe - ignore it");
2516 		return P2P_PREQ_NOT_P2P;
2517 	}
2518 
2519 	if (dst && !is_broadcast_ether_addr(dst) &&
2520 	    !ether_addr_equal(dst, p2p->cfg->dev_addr)) {
2521 		/* Not sent to the broadcast address or our P2P Device Address
2522 		 */
2523 		p2p_dbg(p2p, "Probe Req DA " MACSTR " not ours - ignore it",
2524 			MAC2STR(dst));
2525 		return P2P_PREQ_NOT_PROCESSED;
2526 	}
2527 
2528 	if (bssid && !is_broadcast_ether_addr(bssid)) {
2529 		/* Not sent to the Wildcard BSSID */
2530 		p2p_dbg(p2p, "Probe Req BSSID " MACSTR " not wildcard - ignore it",
2531 			MAC2STR(bssid));
2532 		return P2P_PREQ_NOT_PROCESSED;
2533 	}
2534 
2535 	if (elems.ssid == NULL || elems.ssid_len != P2P_WILDCARD_SSID_LEN ||
2536 	    os_memcmp(elems.ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN) !=
2537 	    0) {
2538 		/* not using P2P Wildcard SSID - ignore */
2539 		p2p_dbg(p2p, "Probe Req not using P2P Wildcard SSID - ignore it");
2540 		return P2P_PREQ_NOT_PROCESSED;
2541 	}
2542 
2543 	if (supp_rates_11b_only(&elems)) {
2544 		/* Indicates support for 11b rates only */
2545 		p2p_dbg(p2p, "Probe Req with 11b rates only supported - ignore it");
2546 		return P2P_PREQ_NOT_P2P;
2547 	}
2548 
2549 	os_memset(&msg, 0, sizeof(msg));
2550 	if (p2p_parse_ies(ie, ie_len, &msg) < 0) {
2551 		/* Could not parse P2P attributes */
2552 		p2p_dbg(p2p, "Could not parse P2P attributes in Probe Req - ignore it");
2553 		return P2P_PREQ_NOT_P2P;
2554 	}
2555 
2556 	if (msg.service_hash && msg.service_hash_count) {
2557 		const u8 *hash = msg.service_hash;
2558 		u8 i;
2559 		int p2ps_svc_found = 0;
2560 
2561 		p2p_dbg(p2p, "in_listen=%d drv_in_listen=%d when received P2PS Probe Request at %u MHz; own Listen channel %u, pending listen freq %u MHz",
2562 			p2p->in_listen, p2p->drv_in_listen, rx_freq,
2563 			p2p->cfg->channel, p2p->pending_listen_freq);
2564 
2565 		if (!p2p->in_listen && !p2p->drv_in_listen &&
2566 		    p2p->pending_listen_freq && rx_freq &&
2567 		    rx_freq != p2p->pending_listen_freq) {
2568 			p2p_dbg(p2p, "Do not reply to Probe Request frame that was received on %u MHz while waiting to start Listen state on %u MHz",
2569 				rx_freq, p2p->pending_listen_freq);
2570 			p2p_parse_free(&msg);
2571 			return P2P_PREQ_NOT_LISTEN;
2572 		}
2573 
2574 		for (i = 0; i < msg.service_hash_count; i++) {
2575 			if (p2p_service_find_asp(p2p, hash)) {
2576 				p2p_dbg(p2p, "Service Hash match found: "
2577 					MACSTR, MAC2STR(hash));
2578 				p2ps_svc_found = 1;
2579 				break;
2580 			}
2581 			hash += P2PS_HASH_LEN;
2582 		}
2583 
2584 		/* Probed hash unknown */
2585 		if (!p2ps_svc_found) {
2586 			p2p_dbg(p2p, "No Service Hash match found");
2587 			p2p_parse_free(&msg);
2588 			return P2P_PREQ_NOT_PROCESSED;
2589 		}
2590 	} else {
2591 		/* This is not a P2PS Probe Request */
2592 		p2p_dbg(p2p, "No P2PS Hash in Probe Request");
2593 
2594 		if (!p2p->in_listen || !p2p->drv_in_listen) {
2595 			/* not in Listen state - ignore Probe Request */
2596 			p2p_dbg(p2p, "Not in Listen state (in_listen=%d drv_in_listen=%d) - ignore Probe Request",
2597 				p2p->in_listen, p2p->drv_in_listen);
2598 			p2p_parse_free(&msg);
2599 			return P2P_PREQ_NOT_LISTEN;
2600 		}
2601 	}
2602 
2603 	if (msg.device_id &&
2604 	    !ether_addr_equal(msg.device_id, p2p->cfg->dev_addr)) {
2605 		/* Device ID did not match */
2606 		p2p_dbg(p2p, "Probe Req requested Device ID " MACSTR " did not match - ignore it",
2607 			MAC2STR(msg.device_id));
2608 		p2p_parse_free(&msg);
2609 		return P2P_PREQ_NOT_PROCESSED;
2610 	}
2611 
2612 	/* Check Requested Device Type match */
2613 	if (msg.wps_attributes &&
2614 	    !p2p_match_dev_type(p2p, msg.wps_attributes)) {
2615 		/* No match with Requested Device Type */
2616 		p2p_dbg(p2p, "Probe Req requested Device Type did not match - ignore it");
2617 		p2p_parse_free(&msg);
2618 		return P2P_PREQ_NOT_PROCESSED;
2619 	}
2620 
2621 	if (!p2p->cfg->send_probe_resp) {
2622 		/* Response generated elsewhere */
2623 		p2p_dbg(p2p, "Probe Resp generated elsewhere - do not generate additional response");
2624 		p2p_parse_free(&msg);
2625 		return P2P_PREQ_NOT_PROCESSED;
2626 	}
2627 
2628 	p2p_dbg(p2p, "Reply to P2P Probe Request in Listen state");
2629 
2630 	/*
2631 	 * We do not really have a specific BSS that this frame is advertising,
2632 	 * so build a frame that has some information in valid format. This is
2633 	 * really only used for discovery purposes, not to learn exact BSS
2634 	 * parameters.
2635 	 */
2636 	ies = p2p_build_probe_resp_ies(p2p, msg.service_hash,
2637 				       msg.service_hash_count);
2638 	p2p_parse_free(&msg);
2639 	if (ies == NULL)
2640 		return P2P_PREQ_NOT_PROCESSED;
2641 
2642 	buf = wpabuf_alloc(200 + wpabuf_len(ies));
2643 	if (buf == NULL) {
2644 		wpabuf_free(ies);
2645 		return P2P_PREQ_NOT_PROCESSED;
2646 	}
2647 
2648 	if (p2p_build_probe_resp_buf(p2p, buf, ies, addr, rx_freq)) {
2649 		wpabuf_free(ies);
2650 		wpabuf_free(buf);
2651 		return P2P_PREQ_NOT_PROCESSED;
2652 	}
2653 
2654 	wpabuf_free(ies);
2655 
2656 	p2p->cfg->send_probe_resp(p2p->cfg->cb_ctx, buf, rx_freq);
2657 
2658 	wpabuf_free(buf);
2659 
2660 	return P2P_PREQ_PROCESSED;
2661 }
2662 
2663 
2664 enum p2p_probe_req_status
p2p_probe_req_rx(struct p2p_data * p2p,const u8 * addr,const u8 * dst,const u8 * bssid,const u8 * ie,size_t ie_len,unsigned int rx_freq,int p2p_lo_started)2665 p2p_probe_req_rx(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
2666 		 const u8 *bssid, const u8 *ie, size_t ie_len,
2667 		 unsigned int rx_freq, int p2p_lo_started)
2668 {
2669 	enum p2p_probe_req_status res;
2670 
2671 	p2p_add_dev_from_probe_req(p2p, addr, ie, ie_len);
2672 
2673 	if (p2p_lo_started) {
2674 		p2p_dbg(p2p,
2675 			"Probe Response is offloaded, do not reply Probe Request");
2676 		return P2P_PREQ_PROCESSED;
2677 	}
2678 
2679 	res = p2p_reply_probe(p2p, addr, dst, bssid, ie, ie_len, rx_freq);
2680 	if (res != P2P_PREQ_PROCESSED && res != P2P_PREQ_NOT_PROCESSED)
2681 		return res;
2682 
2683 	/*
2684 	 * Activate a pending GO Negotiation/Invite flow if a received Probe
2685 	 * Request frame is from an expected peer. Some devices may share the
2686 	 * same address for P2P and non-P2P STA running simultaneously. The
2687 	 * P2P_PREQ_PROCESSED and P2P_PREQ_NOT_PROCESSED p2p_reply_probe()
2688 	 * return values verified above ensure we are handling a Probe Request
2689 	 * frame from a P2P peer.
2690 	 */
2691 	if ((p2p->state == P2P_CONNECT || p2p->state == P2P_CONNECT_LISTEN) &&
2692 	    p2p->go_neg_peer &&
2693 	    ether_addr_equal(addr, p2p->go_neg_peer->info.p2p_device_addr) &&
2694 	    !(p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
2695 		/* Received a Probe Request from GO Negotiation peer */
2696 		p2p_dbg(p2p, "Found GO Negotiation peer - try to start GO negotiation from timeout");
2697 		eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
2698 		eloop_register_timeout(0, 0, p2p_go_neg_start, p2p, NULL);
2699 		return res;
2700 	}
2701 
2702 	if ((p2p->state == P2P_INVITE || p2p->state == P2P_INVITE_LISTEN) &&
2703 	    p2p->invite_peer &&
2704 	    (p2p->invite_peer->flags & P2P_DEV_WAIT_INV_REQ_ACK) &&
2705 	    ether_addr_equal(addr, p2p->invite_peer->info.p2p_device_addr)) {
2706 		/* Received a Probe Request from Invite peer */
2707 		p2p_dbg(p2p, "Found Invite peer - try to start Invite from timeout");
2708 		eloop_cancel_timeout(p2p_invite_start, p2p, NULL);
2709 		eloop_register_timeout(0, 0, p2p_invite_start, p2p, NULL);
2710 		return res;
2711 	}
2712 
2713 	return res;
2714 }
2715 
2716 
p2p_assoc_req_ie_wlan_ap(struct p2p_data * p2p,const u8 * bssid,u8 * buf,size_t len,struct wpabuf * p2p_ie)2717 static int p2p_assoc_req_ie_wlan_ap(struct p2p_data *p2p, const u8 *bssid,
2718 				    u8 *buf, size_t len, struct wpabuf *p2p_ie)
2719 {
2720 	struct wpabuf *tmp;
2721 	u8 *lpos;
2722 	size_t tmplen;
2723 	int res;
2724 	u8 group_capab;
2725 	struct p2p_message msg;
2726 
2727 	if (p2p_ie == NULL)
2728 		return 0; /* WLAN AP is not a P2P manager */
2729 
2730 	os_memset(&msg, 0, sizeof(msg));
2731 	if (p2p_parse_p2p_ie(p2p_ie, &msg) < 0)
2732 		return 0;
2733 
2734 	p2p_dbg(p2p, "BSS P2P manageability %s",
2735 		msg.manageability ? "enabled" : "disabled");
2736 
2737 	if (!msg.manageability)
2738 		return 0;
2739 
2740 	/*
2741 	 * (Re)Association Request - P2P IE
2742 	 * P2P Capability attribute (shall be present)
2743 	 * P2P Interface attribute (present if concurrent device and
2744 	 *	P2P Management is enabled)
2745 	 */
2746 	tmp = wpabuf_alloc(200);
2747 	if (tmp == NULL)
2748 		return -1;
2749 
2750 	lpos = p2p_buf_add_ie_hdr(tmp);
2751 	group_capab = 0;
2752 	if (p2p->num_groups > 0) {
2753 		group_capab |= P2P_GROUP_CAPAB_GROUP_OWNER;
2754 		if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
2755 		    (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED) &&
2756 		    p2p->cross_connect)
2757 			group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
2758 	}
2759 	p2p_buf_add_capability(tmp, p2p->dev_capab, group_capab);
2760 	if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
2761 	    (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED))
2762 		p2p_buf_add_p2p_interface(tmp, p2p);
2763 	p2p_buf_update_ie_hdr(tmp, lpos);
2764 
2765 	tmplen = wpabuf_len(tmp);
2766 	if (tmplen > len)
2767 		res = -1;
2768 	else {
2769 		os_memcpy(buf, wpabuf_head(tmp), tmplen);
2770 		res = tmplen;
2771 	}
2772 	wpabuf_free(tmp);
2773 
2774 	return res;
2775 }
2776 
2777 
p2p_assoc_req_ie(struct p2p_data * p2p,const u8 * bssid,u8 * buf,size_t len,int p2p_group,struct wpabuf * p2p_ie)2778 int p2p_assoc_req_ie(struct p2p_data *p2p, const u8 *bssid, u8 *buf,
2779 		     size_t len, int p2p_group, struct wpabuf *p2p_ie)
2780 {
2781 	struct wpabuf *tmp;
2782 	u8 *lpos;
2783 	struct p2p_device *peer;
2784 	size_t tmplen;
2785 	int res;
2786 	size_t extra = 0;
2787 
2788 	if (!p2p_group)
2789 		return p2p_assoc_req_ie_wlan_ap(p2p, bssid, buf, len, p2p_ie);
2790 
2791 #ifdef CONFIG_WIFI_DISPLAY
2792 	if (p2p->wfd_ie_assoc_req)
2793 		extra = wpabuf_len(p2p->wfd_ie_assoc_req);
2794 #endif /* CONFIG_WIFI_DISPLAY */
2795 
2796 	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_REQ])
2797 		extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_REQ]);
2798 
2799 	/*
2800 	 * (Re)Association Request - P2P IE
2801 	 * P2P Capability attribute (shall be present)
2802 	 * Extended Listen Timing (may be present)
2803 	 * P2P Device Info attribute (shall be present)
2804 	 */
2805 	tmp = wpabuf_alloc(200 + extra);
2806 	if (tmp == NULL)
2807 		return -1;
2808 
2809 #ifdef CONFIG_WIFI_DISPLAY
2810 	if (p2p->wfd_ie_assoc_req)
2811 		wpabuf_put_buf(tmp, p2p->wfd_ie_assoc_req);
2812 #endif /* CONFIG_WIFI_DISPLAY */
2813 
2814 	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_REQ])
2815 		wpabuf_put_buf(tmp,
2816 			       p2p->vendor_elem[VENDOR_ELEM_P2P_ASSOC_REQ]);
2817 
2818 	peer = bssid ? p2p_get_device(p2p, bssid) : NULL;
2819 
2820 	lpos = p2p_buf_add_ie_hdr(tmp);
2821 	p2p_buf_add_capability(tmp, p2p->dev_capab, 0);
2822 	if (p2p->ext_listen_interval)
2823 		p2p_buf_add_ext_listen_timing(tmp, p2p->ext_listen_period,
2824 					      p2p->ext_listen_interval);
2825 	p2p_buf_add_device_info(tmp, p2p, peer);
2826 	p2p_buf_update_ie_hdr(tmp, lpos);
2827 
2828 	tmplen = wpabuf_len(tmp);
2829 	if (tmplen > len)
2830 		res = -1;
2831 	else {
2832 		os_memcpy(buf, wpabuf_head(tmp), tmplen);
2833 		res = tmplen;
2834 	}
2835 	wpabuf_free(tmp);
2836 
2837 	return res;
2838 }
2839 
2840 
p2p_scan_result_text(const u8 * ies,size_t ies_len,char * buf,char * end)2841 int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end)
2842 {
2843 	struct wpabuf *p2p_ie;
2844 	int ret;
2845 
2846 	p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len, P2P_IE_VENDOR_TYPE);
2847 	if (p2p_ie == NULL)
2848 		return 0;
2849 
2850 	ret = p2p_attr_text(p2p_ie, buf, end);
2851 	wpabuf_free(p2p_ie);
2852 	return ret;
2853 }
2854 
2855 
2856 struct p2ps_advertisement *
p2p_service_p2ps_id(struct p2p_data * p2p,u32 adv_id)2857 p2p_service_p2ps_id(struct p2p_data *p2p, u32 adv_id)
2858 {
2859 	struct p2ps_advertisement *adv_data;
2860 
2861 	if (!p2p)
2862 		return NULL;
2863 
2864 	adv_data = p2p->p2ps_adv_list;
2865 	while (adv_data) {
2866 		if (adv_data->id == adv_id)
2867 			return adv_data;
2868 		adv_data = adv_data->next;
2869 	}
2870 
2871 	return NULL;
2872 }
2873 
2874 
p2p_service_del_asp(struct p2p_data * p2p,u32 adv_id)2875 int p2p_service_del_asp(struct p2p_data *p2p, u32 adv_id)
2876 {
2877 	struct p2ps_advertisement *adv_data;
2878 	struct p2ps_advertisement **prior;
2879 
2880 	if (!p2p)
2881 		return -1;
2882 
2883 	adv_data = p2p->p2ps_adv_list;
2884 	prior = &p2p->p2ps_adv_list;
2885 	while (adv_data) {
2886 		if (adv_data->id == adv_id) {
2887 			p2p_dbg(p2p, "Delete ASP adv_id=0x%x", adv_id);
2888 			*prior = adv_data->next;
2889 			os_free(adv_data);
2890 			return 0;
2891 		}
2892 		prior = &adv_data->next;
2893 		adv_data = adv_data->next;
2894 	}
2895 
2896 	return -1;
2897 }
2898 
2899 
p2p_service_add_asp(struct p2p_data * p2p,int auto_accept,u32 adv_id,const char * adv_str,u8 svc_state,u16 config_methods,const char * svc_info,const u8 * cpt_priority)2900 int p2p_service_add_asp(struct p2p_data *p2p, int auto_accept, u32 adv_id,
2901 			const char *adv_str, u8 svc_state, u16 config_methods,
2902 			const char *svc_info, const u8 *cpt_priority)
2903 {
2904 	struct p2ps_advertisement *adv_data, *tmp, **prev;
2905 	u8 buf[P2PS_HASH_LEN];
2906 	size_t adv_data_len, adv_len, info_len = 0;
2907 	int i;
2908 
2909 	if (!p2p || !adv_str || !adv_str[0] || !cpt_priority)
2910 		return -1;
2911 
2912 	if (!(config_methods & p2p->cfg->config_methods)) {
2913 		p2p_dbg(p2p, "Config methods not supported svc: 0x%x dev: 0x%x",
2914 			config_methods, p2p->cfg->config_methods);
2915 		return -1;
2916 	}
2917 
2918 	if (!p2ps_gen_hash(p2p, adv_str, buf))
2919 		return -1;
2920 
2921 	if (svc_info)
2922 		info_len = os_strlen(svc_info);
2923 	adv_len = os_strlen(adv_str);
2924 	adv_data_len = sizeof(struct p2ps_advertisement) + adv_len + 1 +
2925 		info_len + 1;
2926 
2927 	adv_data = os_zalloc(adv_data_len);
2928 	if (!adv_data)
2929 		return -1;
2930 
2931 	os_memcpy(adv_data->hash, buf, P2PS_HASH_LEN);
2932 	adv_data->id = adv_id;
2933 	adv_data->state = svc_state;
2934 	adv_data->config_methods = config_methods & p2p->cfg->config_methods;
2935 	adv_data->auto_accept = (u8) auto_accept;
2936 	os_memcpy(adv_data->svc_name, adv_str, adv_len);
2937 
2938 	for (i = 0; cpt_priority[i] && i < P2PS_FEATURE_CAPAB_CPT_MAX; i++) {
2939 		adv_data->cpt_priority[i] = cpt_priority[i];
2940 		adv_data->cpt_mask |= cpt_priority[i];
2941 	}
2942 
2943 	if (svc_info && info_len) {
2944 		adv_data->svc_info = &adv_data->svc_name[adv_len + 1];
2945 		os_memcpy(adv_data->svc_info, svc_info, info_len);
2946 	}
2947 
2948 	/*
2949 	 * Group Advertisements by service string. They do not need to be
2950 	 * sorted, but groups allow easier Probe Response instance grouping
2951 	 */
2952 	tmp = p2p->p2ps_adv_list;
2953 	prev = &p2p->p2ps_adv_list;
2954 	while (tmp) {
2955 		if (tmp->id == adv_data->id) {
2956 			if (os_strcmp(tmp->svc_name, adv_data->svc_name) != 0) {
2957 				os_free(adv_data);
2958 				return -1;
2959 			}
2960 			adv_data->next = tmp->next;
2961 			*prev = adv_data;
2962 			os_free(tmp);
2963 			goto inserted;
2964 		} else {
2965 			if (os_strcmp(tmp->svc_name, adv_data->svc_name) == 0) {
2966 				adv_data->next = tmp->next;
2967 				tmp->next = adv_data;
2968 				goto inserted;
2969 			}
2970 		}
2971 		prev = &tmp->next;
2972 		tmp = tmp->next;
2973 	}
2974 
2975 	/* No svc_name match found */
2976 	adv_data->next = p2p->p2ps_adv_list;
2977 	p2p->p2ps_adv_list = adv_data;
2978 
2979 inserted:
2980 	p2p_dbg(p2p,
2981 		"Added ASP advertisement adv_id=0x%x config_methods=0x%x svc_state=0x%x adv_str='%s' cpt_mask=0x%x",
2982 		adv_id, adv_data->config_methods, svc_state, adv_str,
2983 		adv_data->cpt_mask);
2984 
2985 	return 0;
2986 }
2987 
2988 
p2p_service_flush_asp(struct p2p_data * p2p)2989 void p2p_service_flush_asp(struct p2p_data *p2p)
2990 {
2991 	struct p2ps_advertisement *adv, *prev;
2992 
2993 	if (!p2p)
2994 		return;
2995 
2996 	adv = p2p->p2ps_adv_list;
2997 	while (adv) {
2998 		prev = adv;
2999 		adv = adv->next;
3000 		os_free(prev);
3001 	}
3002 
3003 	p2p->p2ps_adv_list = NULL;
3004 	p2ps_prov_free(p2p);
3005 	p2p_dbg(p2p, "All ASP advertisements flushed");
3006 }
3007 
3008 
p2p_parse_dev_addr_in_p2p_ie(struct wpabuf * p2p_ie,u8 * dev_addr)3009 int p2p_parse_dev_addr_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr)
3010 {
3011 	struct p2p_message msg;
3012 
3013 	os_memset(&msg, 0, sizeof(msg));
3014 	if (p2p_parse_p2p_ie(p2p_ie, &msg))
3015 		return -1;
3016 
3017 	if (msg.p2p_device_addr) {
3018 		os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
3019 		return 0;
3020 	} else if (msg.device_id) {
3021 		os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
3022 		return 0;
3023 	}
3024 	return -1;
3025 }
3026 
3027 
p2p_parse_dev_addr(const u8 * ies,size_t ies_len,u8 * dev_addr)3028 int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
3029 {
3030 	struct wpabuf *p2p_ie;
3031 	int ret;
3032 
3033 	p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
3034 					     P2P_IE_VENDOR_TYPE);
3035 	if (p2p_ie == NULL)
3036 		return -1;
3037 	ret = p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr);
3038 	wpabuf_free(p2p_ie);
3039 	return ret;
3040 }
3041 
3042 
p2p_clear_go_neg(struct p2p_data * p2p)3043 static void p2p_clear_go_neg(struct p2p_data *p2p)
3044 {
3045 	p2p->go_neg_peer = NULL;
3046 	p2p_clear_timeout(p2p);
3047 	p2p_set_state(p2p, P2P_IDLE);
3048 }
3049 
3050 
p2p_wps_success_cb(struct p2p_data * p2p,const u8 * mac_addr)3051 void p2p_wps_success_cb(struct p2p_data *p2p, const u8 *mac_addr)
3052 {
3053 	if (p2p->go_neg_peer == NULL) {
3054 		p2p_dbg(p2p, "No pending Group Formation - ignore WPS registration success notification");
3055 		return; /* No pending Group Formation */
3056 	}
3057 
3058 	if (!ether_addr_equal(mac_addr, p2p->go_neg_peer->intended_addr)) {
3059 		p2p_dbg(p2p, "Ignore WPS registration success notification for "
3060 			MACSTR " (GO Negotiation peer " MACSTR ")",
3061 			MAC2STR(mac_addr),
3062 			MAC2STR(p2p->go_neg_peer->intended_addr));
3063 		return; /* Ignore unexpected peer address */
3064 	}
3065 
3066 	p2p_dbg(p2p, "Group Formation completed successfully with " MACSTR,
3067 		MAC2STR(mac_addr));
3068 
3069 	p2p_clear_go_neg(p2p);
3070 }
3071 
3072 
p2p_group_formation_failed(struct p2p_data * p2p)3073 void p2p_group_formation_failed(struct p2p_data *p2p)
3074 {
3075 	if (p2p->go_neg_peer == NULL) {
3076 		p2p_dbg(p2p, "No pending Group Formation - ignore group formation failure notification");
3077 		return; /* No pending Group Formation */
3078 	}
3079 
3080 	p2p_dbg(p2p, "Group Formation failed with " MACSTR,
3081 		MAC2STR(p2p->go_neg_peer->intended_addr));
3082 
3083 	p2p_clear_go_neg(p2p);
3084 }
3085 
3086 
is_p2p_6ghz_disabled(struct p2p_data * p2p)3087 bool is_p2p_6ghz_disabled(struct p2p_data *p2p)
3088 {
3089 	if (p2p)
3090 		return p2p->cfg->p2p_6ghz_disable;
3091 	return false;
3092 }
3093 
3094 
p2p_set_dev_addr(struct p2p_data * p2p,const u8 * addr)3095 void p2p_set_dev_addr(struct p2p_data *p2p, const u8 *addr)
3096 {
3097 	if (p2p && addr)
3098 		os_memcpy(p2p->cfg->dev_addr, addr, ETH_ALEN);
3099 }
3100 
3101 
p2p_update_dfs_ap_info(struct p2p_data * p2p,int freq,enum chan_width ap_ch_width,bool disconnect_evt)3102 void p2p_update_dfs_ap_info(struct p2p_data *p2p, int freq,
3103 			    enum chan_width ap_ch_width, bool disconnect_evt)
3104 {
3105 	if (disconnect_evt) {
3106 		p2p->dfs_ap_connected = false;
3107 		p2p->sta_connected_freq = 0;
3108 		p2p->sta_connected_chan_width = CHAN_WIDTH_UNKNOWN;
3109 		return;
3110 	}
3111 
3112 	p2p->sta_connected_freq = freq;
3113 	p2p->sta_connected_chan_width = ap_ch_width;
3114 	p2p->dfs_ap_connected = true;
3115 }
3116 
3117 
p2p_pairing_info_deinit(struct p2p_data * p2p)3118 static void p2p_pairing_info_deinit(struct p2p_data *p2p)
3119 {
3120 #ifdef CONFIG_PASN
3121 	pasn_initiator_pmksa_cache_deinit(p2p->initiator_pmksa);
3122 	pasn_responder_pmksa_cache_deinit(p2p->responder_pmksa);
3123 #endif /* CONFIG_PASN */
3124 	os_free(p2p->pairing_info);
3125 }
3126 
3127 
p2p_pairing_info_init(struct p2p_data * p2p)3128 static int p2p_pairing_info_init(struct p2p_data *p2p)
3129 {
3130 	struct p2p_pairing_info *pairing_info;
3131 
3132 	if (p2p->cfg->pairing_config.dik_len > DEVICE_IDENTITY_KEY_MAX_LEN)
3133 		return -1;
3134 
3135 	pairing_info = os_zalloc(sizeof(struct p2p_pairing_info));
3136 	if (!pairing_info)
3137 		return -1;
3138 
3139 	pairing_info->enable_pairing_setup =
3140 		p2p->cfg->pairing_config.enable_pairing_setup;
3141 	pairing_info->enable_pairing_cache =
3142 		p2p->cfg->pairing_config.enable_pairing_cache;
3143 	pairing_info->supported_bootstrap =
3144 		p2p->cfg->pairing_config.bootstrap_methods;
3145 
3146 	pairing_info->dev_ik.cipher_version =
3147 		p2p->cfg->pairing_config.dik_cipher;
3148 	pairing_info->dev_ik.dik_len = p2p->cfg->pairing_config.dik_len;
3149 	os_memcpy(pairing_info->dev_ik.dik_data,
3150 		  p2p->cfg->pairing_config.dik_data,
3151 		  p2p->cfg->pairing_config.dik_len);
3152 	pairing_info->dev_ik.expiration = 24; /* hours */
3153 
3154 	p2p_pairing_info_deinit(p2p);
3155 
3156 	p2p->pairing_info = pairing_info;
3157 #ifdef CONFIG_PASN
3158 	p2p->initiator_pmksa = pasn_initiator_pmksa_cache_init();
3159 	p2p->responder_pmksa = pasn_responder_pmksa_cache_init();
3160 #endif /* CONFIG_PASN */
3161 
3162 	return 0;
3163 }
3164 
3165 
p2p_init(const struct p2p_config * cfg)3166 struct p2p_data * p2p_init(const struct p2p_config *cfg)
3167 {
3168 	struct p2p_data *p2p;
3169 
3170 	if (cfg->max_peers < 1 ||
3171 	    cfg->passphrase_len < 8 || cfg->passphrase_len > 63)
3172 		return NULL;
3173 
3174 	p2p = os_zalloc(sizeof(*p2p) + sizeof(*cfg));
3175 	if (p2p == NULL)
3176 		return NULL;
3177 	p2p->cfg = (struct p2p_config *) (p2p + 1);
3178 	os_memcpy(p2p->cfg, cfg, sizeof(*cfg));
3179 	if (cfg->dev_name)
3180 		p2p->cfg->dev_name = os_strdup(cfg->dev_name);
3181 	if (cfg->manufacturer)
3182 		p2p->cfg->manufacturer = os_strdup(cfg->manufacturer);
3183 	if (cfg->model_name)
3184 		p2p->cfg->model_name = os_strdup(cfg->model_name);
3185 	if (cfg->model_number)
3186 		p2p->cfg->model_number = os_strdup(cfg->model_number);
3187 	if (cfg->serial_number)
3188 		p2p->cfg->serial_number = os_strdup(cfg->serial_number);
3189 	if (cfg->pref_chan) {
3190 		p2p->cfg->pref_chan = os_malloc(cfg->num_pref_chan *
3191 						sizeof(struct p2p_channel));
3192 		if (p2p->cfg->pref_chan) {
3193 			os_memcpy(p2p->cfg->pref_chan, cfg->pref_chan,
3194 				  cfg->num_pref_chan *
3195 				  sizeof(struct p2p_channel));
3196 		} else
3197 			p2p->cfg->num_pref_chan = 0;
3198 	}
3199 
3200 	p2ps_gen_hash(p2p, P2PS_WILD_HASH_STR, p2p->wild_card_hash);
3201 
3202 	p2p->min_disc_int = 1;
3203 	p2p->max_disc_int = 3;
3204 	p2p->max_disc_tu = -1;
3205 
3206 	if (os_get_random(&p2p->next_tie_breaker, 1) < 0)
3207 		p2p->next_tie_breaker = 0;
3208 	p2p->next_tie_breaker &= 0x01;
3209 	if (cfg->sd_request)
3210 		p2p->dev_capab |= P2P_DEV_CAPAB_SERVICE_DISCOVERY;
3211 	p2p->dev_capab |= P2P_DEV_CAPAB_INVITATION_PROCEDURE;
3212 	if (cfg->concurrent_operations)
3213 		p2p->dev_capab |= P2P_DEV_CAPAB_CONCURRENT_OPER;
3214 	p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
3215 
3216 	dl_list_init(&p2p->devices);
3217 
3218 	p2p->go_timeout = 100;
3219 	p2p->client_timeout = 20;
3220 	p2p->num_p2p_sd_queries = 0;
3221 	/* Default comeback after one second */
3222 	if (!p2p->cfg->comeback_after)
3223 		p2p->cfg->comeback_after = 977; /* TUs */
3224 	p2p_pairing_info_init(p2p);
3225 
3226 	p2p_dbg(p2p, "initialized");
3227 	p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
3228 	p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
3229 
3230 	return p2p;
3231 }
3232 
3233 
p2p_deinit(struct p2p_data * p2p)3234 void p2p_deinit(struct p2p_data *p2p)
3235 {
3236 #ifdef CONFIG_WIFI_DISPLAY
3237 	wpabuf_free(p2p->wfd_ie_beacon);
3238 	wpabuf_free(p2p->wfd_ie_probe_req);
3239 	wpabuf_free(p2p->wfd_ie_probe_resp);
3240 	wpabuf_free(p2p->wfd_ie_assoc_req);
3241 	wpabuf_free(p2p->wfd_ie_invitation);
3242 	wpabuf_free(p2p->wfd_ie_prov_disc_req);
3243 	wpabuf_free(p2p->wfd_ie_prov_disc_resp);
3244 	wpabuf_free(p2p->wfd_ie_go_neg);
3245 	wpabuf_free(p2p->wfd_dev_info);
3246 	wpabuf_free(p2p->wfd_assoc_bssid);
3247 	wpabuf_free(p2p->wfd_coupled_sink_info);
3248 	wpabuf_free(p2p->wfd_r2_dev_info);
3249 #endif /* CONFIG_WIFI_DISPLAY */
3250 
3251 	eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
3252 	eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
3253 	eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
3254 	p2p_flush(p2p);
3255 	p2p_free_req_dev_types(p2p);
3256 	os_free(p2p->cfg->dev_name);
3257 	os_free(p2p->cfg->manufacturer);
3258 	os_free(p2p->cfg->model_name);
3259 	os_free(p2p->cfg->model_number);
3260 	os_free(p2p->cfg->serial_number);
3261 	os_free(p2p->cfg->pref_chan);
3262 	os_free(p2p->groups);
3263 	p2ps_prov_free(p2p);
3264 	wpabuf_free(p2p->sd_resp);
3265 	p2p_remove_wps_vendor_extensions(p2p);
3266 	os_free(p2p->no_go_freq.range);
3267 	p2p_service_flush_asp(p2p);
3268 	p2p_pairing_info_deinit(p2p);
3269 
3270 	os_free(p2p);
3271 }
3272 
3273 
p2p_flush(struct p2p_data * p2p)3274 void p2p_flush(struct p2p_data *p2p)
3275 {
3276 	struct p2p_device *dev, *prev;
3277 
3278 	p2p_ext_listen(p2p, 0, 0);
3279 	p2p_stop_find(p2p);
3280 	dl_list_for_each_safe(dev, prev, &p2p->devices, struct p2p_device,
3281 			      list) {
3282 		dl_list_del(&dev->list);
3283 		p2p_device_free(p2p, dev);
3284 	}
3285 	p2p_free_sd_queries(p2p);
3286 	p2p->ssid_set = 0;
3287 	p2ps_prov_free(p2p);
3288 	p2p_reset_pending_pd(p2p);
3289 	p2p->override_pref_op_class = 0;
3290 	p2p->override_pref_channel = 0;
3291 }
3292 
3293 
p2p_unauthorize(struct p2p_data * p2p,const u8 * addr)3294 int p2p_unauthorize(struct p2p_data *p2p, const u8 *addr)
3295 {
3296 	struct p2p_device *dev;
3297 
3298 	dev = p2p_get_device(p2p, addr);
3299 	if (dev == NULL)
3300 		return -1;
3301 
3302 	p2p_dbg(p2p, "Unauthorizing " MACSTR, MAC2STR(addr));
3303 
3304 	if (p2p->go_neg_peer == dev) {
3305 		eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
3306 		p2p->go_neg_peer = NULL;
3307 	}
3308 
3309 	dev->wps_method = WPS_NOT_READY;
3310 	dev->oob_pw_id = 0;
3311 	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
3312 	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
3313 
3314 	return 0;
3315 }
3316 
3317 
p2p_set_dev_name(struct p2p_data * p2p,const char * dev_name)3318 int p2p_set_dev_name(struct p2p_data *p2p, const char *dev_name)
3319 {
3320 	os_free(p2p->cfg->dev_name);
3321 	if (dev_name) {
3322 		p2p->cfg->dev_name = os_strdup(dev_name);
3323 		if (p2p->cfg->dev_name == NULL)
3324 			return -1;
3325 	} else
3326 		p2p->cfg->dev_name = NULL;
3327 	return 0;
3328 }
3329 
3330 
p2p_set_manufacturer(struct p2p_data * p2p,const char * manufacturer)3331 int p2p_set_manufacturer(struct p2p_data *p2p, const char *manufacturer)
3332 {
3333 	os_free(p2p->cfg->manufacturer);
3334 	p2p->cfg->manufacturer = NULL;
3335 	if (manufacturer) {
3336 		p2p->cfg->manufacturer = os_strdup(manufacturer);
3337 		if (p2p->cfg->manufacturer == NULL)
3338 			return -1;
3339 	}
3340 
3341 	return 0;
3342 }
3343 
3344 
p2p_set_model_name(struct p2p_data * p2p,const char * model_name)3345 int p2p_set_model_name(struct p2p_data *p2p, const char *model_name)
3346 {
3347 	os_free(p2p->cfg->model_name);
3348 	p2p->cfg->model_name = NULL;
3349 	if (model_name) {
3350 		p2p->cfg->model_name = os_strdup(model_name);
3351 		if (p2p->cfg->model_name == NULL)
3352 			return -1;
3353 	}
3354 
3355 	return 0;
3356 }
3357 
3358 
p2p_set_model_number(struct p2p_data * p2p,const char * model_number)3359 int p2p_set_model_number(struct p2p_data *p2p, const char *model_number)
3360 {
3361 	os_free(p2p->cfg->model_number);
3362 	p2p->cfg->model_number = NULL;
3363 	if (model_number) {
3364 		p2p->cfg->model_number = os_strdup(model_number);
3365 		if (p2p->cfg->model_number == NULL)
3366 			return -1;
3367 	}
3368 
3369 	return 0;
3370 }
3371 
3372 
p2p_set_serial_number(struct p2p_data * p2p,const char * serial_number)3373 int p2p_set_serial_number(struct p2p_data *p2p, const char *serial_number)
3374 {
3375 	os_free(p2p->cfg->serial_number);
3376 	p2p->cfg->serial_number = NULL;
3377 	if (serial_number) {
3378 		p2p->cfg->serial_number = os_strdup(serial_number);
3379 		if (p2p->cfg->serial_number == NULL)
3380 			return -1;
3381 	}
3382 
3383 	return 0;
3384 }
3385 
3386 
p2p_set_config_methods(struct p2p_data * p2p,u16 config_methods)3387 void p2p_set_config_methods(struct p2p_data *p2p, u16 config_methods)
3388 {
3389 	p2p->cfg->config_methods = config_methods;
3390 }
3391 
3392 
p2p_set_uuid(struct p2p_data * p2p,const u8 * uuid)3393 void p2p_set_uuid(struct p2p_data *p2p, const u8 *uuid)
3394 {
3395 	os_memcpy(p2p->cfg->uuid, uuid, 16);
3396 }
3397 
3398 
p2p_set_pri_dev_type(struct p2p_data * p2p,const u8 * pri_dev_type)3399 int p2p_set_pri_dev_type(struct p2p_data *p2p, const u8 *pri_dev_type)
3400 {
3401 	os_memcpy(p2p->cfg->pri_dev_type, pri_dev_type, 8);
3402 	return 0;
3403 }
3404 
3405 
p2p_set_sec_dev_types(struct p2p_data * p2p,const u8 dev_types[][8],size_t num_dev_types)3406 int p2p_set_sec_dev_types(struct p2p_data *p2p, const u8 dev_types[][8],
3407 			  size_t num_dev_types)
3408 {
3409 	if (num_dev_types > P2P_SEC_DEVICE_TYPES)
3410 		num_dev_types = P2P_SEC_DEVICE_TYPES;
3411 	p2p->cfg->num_sec_dev_types = num_dev_types;
3412 	os_memcpy(p2p->cfg->sec_dev_type, dev_types, num_dev_types * 8);
3413 	return 0;
3414 }
3415 
3416 
p2p_remove_wps_vendor_extensions(struct p2p_data * p2p)3417 void p2p_remove_wps_vendor_extensions(struct p2p_data *p2p)
3418 {
3419 	int i;
3420 
3421 	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
3422 		wpabuf_free(p2p->wps_vendor_ext[i]);
3423 		p2p->wps_vendor_ext[i] = NULL;
3424 	}
3425 }
3426 
3427 
p2p_add_wps_vendor_extension(struct p2p_data * p2p,const struct wpabuf * vendor_ext)3428 int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
3429 				 const struct wpabuf *vendor_ext)
3430 {
3431 	int i;
3432 
3433 	if (vendor_ext == NULL)
3434 		return -1;
3435 
3436 	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
3437 		if (p2p->wps_vendor_ext[i] == NULL)
3438 			break;
3439 	}
3440 	if (i >= P2P_MAX_WPS_VENDOR_EXT)
3441 		return -1;
3442 
3443 	p2p->wps_vendor_ext[i] = wpabuf_dup(vendor_ext);
3444 	if (p2p->wps_vendor_ext[i] == NULL)
3445 		return -1;
3446 
3447 	return 0;
3448 }
3449 
3450 
p2p_set_country(struct p2p_data * p2p,const char * country)3451 int p2p_set_country(struct p2p_data *p2p, const char *country)
3452 {
3453 	os_memcpy(p2p->cfg->country, country, 3);
3454 	return 0;
3455 }
3456 
3457 
p2p_pre_find_operation(struct p2p_data * p2p,struct p2p_device * dev)3458 static int p2p_pre_find_operation(struct p2p_data *p2p, struct p2p_device *dev)
3459 {
3460 	int res;
3461 
3462 	if (dev->sd_pending_bcast_queries == 0) {
3463 		/* Initialize with total number of registered broadcast
3464 		 * SD queries. */
3465 		dev->sd_pending_bcast_queries = p2p->num_p2p_sd_queries;
3466 	}
3467 
3468 	res = p2p_start_sd(p2p, dev);
3469 	if (res == -2)
3470 		return -2;
3471 	if (res == 0)
3472 		return 1;
3473 
3474 	if (dev->req_config_methods &&
3475 	    !(dev->flags & P2P_DEV_PD_FOR_JOIN)) {
3476 		p2p_dbg(p2p, "Send pending Provision Discovery Request to "
3477 			MACSTR " (config methods 0x%x)",
3478 			MAC2STR(dev->info.p2p_device_addr),
3479 			dev->req_config_methods);
3480 		if (p2p_send_prov_disc_req(p2p, dev, 0, 0) == 0)
3481 			return 1;
3482 	}
3483 
3484 	return 0;
3485 }
3486 
3487 
p2p_continue_find(struct p2p_data * p2p)3488 void p2p_continue_find(struct p2p_data *p2p)
3489 {
3490 	struct p2p_device *dev;
3491 	int found, res;
3492 
3493 	p2p_set_state(p2p, P2P_SEARCH);
3494 
3495 	/* Continue from the device following the last iteration */
3496 	found = 0;
3497 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
3498 		if (dev == p2p->last_p2p_find_oper) {
3499 			found = 1;
3500 			continue;
3501 		}
3502 		if (!found)
3503 			continue;
3504 		res = p2p_pre_find_operation(p2p, dev);
3505 		if (res > 0) {
3506 			p2p->last_p2p_find_oper = dev;
3507 			return;
3508 		}
3509 		if (res == -2)
3510 			goto skip_sd;
3511 	}
3512 
3513 	/*
3514 	 * Wrap around to the beginning of the list and continue until the last
3515 	 * iteration device.
3516 	 */
3517 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
3518 		res = p2p_pre_find_operation(p2p, dev);
3519 		if (res > 0) {
3520 			p2p->last_p2p_find_oper = dev;
3521 			return;
3522 		}
3523 		if (res == -2)
3524 			goto skip_sd;
3525 		if (dev == p2p->last_p2p_find_oper)
3526 			break;
3527 	}
3528 
3529 skip_sd:
3530 	os_memset(p2p->sd_query_no_ack, 0, ETH_ALEN);
3531 	p2p_listen_in_find(p2p, 1);
3532 }
3533 
3534 
p2p_sd_query_cb(struct p2p_data * p2p,int success)3535 void p2p_sd_query_cb(struct p2p_data *p2p, int success)
3536 {
3537 	p2p_dbg(p2p, "Service Discovery Query TX callback: success=%d",
3538 		success);
3539 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3540 
3541 	if (!success) {
3542 		if (p2p->sd_peer) {
3543 			if (is_zero_ether_addr(p2p->sd_query_no_ack)) {
3544 				os_memcpy(p2p->sd_query_no_ack,
3545 					  p2p->sd_peer->info.p2p_device_addr,
3546 					  ETH_ALEN);
3547 				p2p_dbg(p2p,
3548 					"First SD Query no-ACK in this search iteration: "
3549 					MACSTR, MAC2STR(p2p->sd_query_no_ack));
3550 			}
3551 			p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3552 		}
3553 		p2p->sd_peer = NULL;
3554 		if (p2p->state != P2P_IDLE)
3555 			p2p_continue_find(p2p);
3556 		return;
3557 	}
3558 
3559 	if (p2p->sd_peer == NULL) {
3560 		p2p_dbg(p2p, "No SD peer entry known");
3561 		if (p2p->state != P2P_IDLE)
3562 			p2p_continue_find(p2p);
3563 		return;
3564 	}
3565 
3566 	if (p2p->sd_query && p2p->sd_query->for_all_peers) {
3567 		/* Update the pending broadcast SD query count for this device
3568 		 */
3569 		p2p->sd_peer->sd_pending_bcast_queries--;
3570 
3571 		/*
3572 		 * If there are no pending broadcast queries for this device,
3573 		 * mark it as done (-1).
3574 		 */
3575 		if (p2p->sd_peer->sd_pending_bcast_queries == 0)
3576 			p2p->sd_peer->sd_pending_bcast_queries = -1;
3577 	}
3578 
3579 	/* Wait for response from the peer */
3580 	p2p_set_state(p2p, P2P_SD_DURING_FIND);
3581 	p2p_set_timeout(p2p, 0, 200000);
3582 }
3583 
3584 
3585 /**
3586  * p2p_retry_pd - Retry any pending provision disc requests in IDLE state
3587  * @p2p: P2P module context from p2p_init()
3588  */
p2p_retry_pd(struct p2p_data * p2p)3589 static void p2p_retry_pd(struct p2p_data *p2p)
3590 {
3591 	struct p2p_device *dev;
3592 
3593 	/*
3594 	 * Retry the prov disc req attempt only for the peer that the user had
3595 	 * requested.
3596 	 */
3597 
3598 	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
3599 		if (!ether_addr_equal(p2p->pending_pd_devaddr,
3600 				      dev->info.p2p_device_addr))
3601 			continue;
3602 		if (!dev->req_config_methods && !dev->req_bootstrap_method)
3603 			continue;
3604 
3605 		p2p_dbg(p2p, "Send pending Provision Discovery Request to "
3606 			MACSTR " (config methods 0x%x)",
3607 			MAC2STR(dev->info.p2p_device_addr),
3608 			dev->req_config_methods);
3609 		p2p_send_prov_disc_req(p2p, dev,
3610 				       dev->flags & P2P_DEV_PD_FOR_JOIN,
3611 				       p2p->pd_force_freq);
3612 		return;
3613 	}
3614 }
3615 
3616 
p2p_prov_disc_cb(struct p2p_data * p2p,int success)3617 static void p2p_prov_disc_cb(struct p2p_data *p2p, int success)
3618 {
3619 	p2p_dbg(p2p, "Provision Discovery Request TX callback: success=%d",
3620 		success);
3621 
3622 	/*
3623 	 * Postpone resetting the pending action state till after we actually
3624 	 * time out. This allows us to take some action like notifying any
3625 	 * interested parties about no response to the request.
3626 	 *
3627 	 * When the timer (below) goes off we check in IDLE, SEARCH, or
3628 	 * LISTEN_ONLY state, which are the only allowed states to issue a PD
3629 	 * requests in, if this was still pending and then raise notification.
3630 	 */
3631 
3632 	if (!success) {
3633 		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3634 
3635 		if (p2p->user_initiated_pd &&
3636 		    (p2p->state == P2P_SEARCH || p2p->state == P2P_LISTEN_ONLY))
3637 		{
3638 			/* Retry request from timeout to avoid busy loops */
3639 			p2p->pending_action_state = P2P_PENDING_PD;
3640 			p2p_set_timeout(p2p, 0, 50000);
3641 		} else if (p2p->state != P2P_IDLE)
3642 			p2p_continue_find(p2p);
3643 		else if (p2p->user_initiated_pd) {
3644 			p2p->pending_action_state = P2P_PENDING_PD;
3645 			p2p_set_timeout(p2p, 0, 300000);
3646 		}
3647 		return;
3648 	}
3649 
3650 	/*
3651 	 * If after PD Request the peer doesn't expect to receive PD Response
3652 	 * the PD Request ACK indicates a completion of the current PD. This
3653 	 * happens only on the advertiser side sending the follow-on PD Request
3654 	 * with the status different than 12 (Success: accepted by user).
3655 	 */
3656 	if (p2p->p2ps_prov && !p2p->p2ps_prov->pd_seeker &&
3657 	    p2p->p2ps_prov->status != P2P_SC_SUCCESS_DEFERRED) {
3658 		p2p_dbg(p2p, "P2PS PD completion on Follow-on PD Request ACK");
3659 
3660 		if (p2p->send_action_in_progress) {
3661 			p2p->send_action_in_progress = 0;
3662 			p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3663 		}
3664 
3665 		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3666 
3667 		if (p2p->cfg->p2ps_prov_complete) {
3668 			p2p->cfg->p2ps_prov_complete(
3669 				p2p->cfg->cb_ctx,
3670 				p2p->p2ps_prov->status,
3671 				p2p->p2ps_prov->adv_mac,
3672 				p2p->p2ps_prov->adv_mac,
3673 				p2p->p2ps_prov->session_mac,
3674 				NULL, p2p->p2ps_prov->adv_id,
3675 				p2p->p2ps_prov->session_id,
3676 				0, 0, NULL, 0, 0, 0,
3677 				NULL, NULL, 0, 0, NULL, 0);
3678 		}
3679 
3680 		if (p2p->user_initiated_pd)
3681 			p2p_reset_pending_pd(p2p);
3682 
3683 		p2ps_prov_free(p2p);
3684 		return;
3685 	}
3686 
3687 	/*
3688 	 * This postponing, of resetting pending_action_state, needs to be
3689 	 * done only for user initiated PD requests and not internal ones.
3690 	 */
3691 	if (p2p->user_initiated_pd)
3692 		p2p->pending_action_state = P2P_PENDING_PD;
3693 	else
3694 		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3695 
3696 	/* Wait for response from the peer */
3697 	if (p2p->state == P2P_SEARCH)
3698 		p2p_set_state(p2p, P2P_PD_DURING_FIND);
3699 	p2p_set_timeout(p2p, 0, 200000);
3700 }
3701 
3702 
p2p_prov_disc_resp_cb(struct p2p_data * p2p,int success)3703 static void p2p_prov_disc_resp_cb(struct p2p_data *p2p, int success)
3704 {
3705 	p2p_dbg(p2p, "Provision Discovery Response TX callback: success=%d",
3706 		success);
3707 
3708 	if (p2p->send_action_in_progress) {
3709 		p2p->send_action_in_progress = 0;
3710 		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3711 	}
3712 
3713 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3714 
3715 	if (!success) {
3716 		if (p2p->state == P2P_SEARCH)
3717 			p2p_continue_find(p2p);
3718 		return;
3719 	}
3720 
3721 	if (!p2p->cfg->prov_disc_resp_cb ||
3722 	    p2p->cfg->prov_disc_resp_cb(p2p->cfg->cb_ctx) < 1) {
3723 		if (p2p->state == P2P_SEARCH)
3724 			p2p_continue_find(p2p);
3725 		return;
3726 	}
3727 
3728 	p2p_dbg(p2p,
3729 		"Post-Provision Discovery operations started - do not try to continue other P2P operations");
3730 }
3731 
3732 
p2p_scan_res_handler(struct p2p_data * p2p,const u8 * bssid,int freq,struct os_reltime * rx_time,int level,const u8 * ies,size_t ies_len)3733 int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
3734 			 struct os_reltime *rx_time, int level, const u8 *ies,
3735 			 size_t ies_len)
3736 {
3737 	if (os_reltime_before(rx_time, &p2p->find_start)) {
3738 		/*
3739 		 * The driver may have cached (e.g., in cfg80211 BSS table) the
3740 		 * scan results for relatively long time. To avoid reporting
3741 		 * stale information, update P2P peers only based on results
3742 		 * that have based on frames received after the last p2p_find
3743 		 * operation was started.
3744 		 */
3745 		p2p_dbg(p2p, "Ignore old scan result for " MACSTR
3746 			" (rx_time=%u.%06u find_start=%u.%06u)",
3747 			MAC2STR(bssid), (unsigned int) rx_time->sec,
3748 			(unsigned int) rx_time->usec,
3749 			(unsigned int) p2p->find_start.sec,
3750 			(unsigned int) p2p->find_start.usec);
3751 		return 0;
3752 	}
3753 
3754 	p2p_add_device(p2p, bssid, freq, rx_time, level, ies, ies_len, 1);
3755 
3756 	return 0;
3757 }
3758 
3759 
p2p_scan_res_handled(struct p2p_data * p2p,unsigned int delay)3760 void p2p_scan_res_handled(struct p2p_data *p2p, unsigned int delay)
3761 {
3762 	if (!p2p->p2p_scan_running) {
3763 		p2p_dbg(p2p, "p2p_scan was not running, but scan results received");
3764 	}
3765 	p2p->p2p_scan_running = 0;
3766 
3767 	/* Use this delay only when p2p_find doesn't set it */
3768 	if (!p2p->search_delay)
3769 		p2p->search_delay = delay;
3770 
3771 	eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
3772 
3773 	if (p2p_run_after_scan(p2p))
3774 		return;
3775 	if (p2p->state == P2P_SEARCH)
3776 		p2p_continue_find(p2p);
3777 }
3778 
3779 
p2p_scan_ie(struct p2p_data * p2p,struct wpabuf * ies,const u8 * dev_id,unsigned int bands)3780 void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id,
3781 		 unsigned int bands)
3782 {
3783 	u8 dev_capab;
3784 	u8 *len;
3785 
3786 #ifdef CONFIG_WIFI_DISPLAY
3787 	if (p2p->wfd_ie_probe_req)
3788 		wpabuf_put_buf(ies, p2p->wfd_ie_probe_req);
3789 #endif /* CONFIG_WIFI_DISPLAY */
3790 
3791 	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_PROBE_REQ_P2P])
3792 		wpabuf_put_buf(ies,
3793 			       p2p->vendor_elem[VENDOR_ELEM_PROBE_REQ_P2P]);
3794 
3795 	len = p2p_buf_add_ie_hdr(ies);
3796 
3797 	dev_capab = p2p->dev_capab & ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
3798 
3799 	/* P2PS requires Probe Request frames to include SD bit */
3800 	if (p2p->p2ps_seek && p2p->p2ps_seek_count)
3801 		dev_capab |= P2P_DEV_CAPAB_SERVICE_DISCOVERY;
3802 
3803 	p2p_buf_add_capability(ies, dev_capab, 0);
3804 
3805 	if (dev_id)
3806 		p2p_buf_add_device_id(ies, dev_id);
3807 	if (p2p->cfg->reg_class && p2p->cfg->channel)
3808 		p2p_buf_add_listen_channel(ies, p2p->cfg->country,
3809 					   p2p->cfg->reg_class,
3810 					   p2p->cfg->channel);
3811 	if (p2p->ext_listen_interval)
3812 		p2p_buf_add_ext_listen_timing(ies, p2p->ext_listen_period,
3813 					      p2p->ext_listen_interval);
3814 
3815 	if (bands & BAND_60_GHZ)
3816 		p2p_buf_add_device_info(ies, p2p, NULL);
3817 
3818 	if (p2p->p2ps_seek && p2p->p2ps_seek_count)
3819 		p2p_buf_add_service_hash(ies, p2p);
3820 
3821 	/* TODO: p2p_buf_add_operating_channel() if GO */
3822 	p2p_buf_update_ie_hdr(ies, len);
3823 }
3824 
3825 
p2p_scan_ie_buf_len(struct p2p_data * p2p)3826 size_t p2p_scan_ie_buf_len(struct p2p_data *p2p)
3827 {
3828 	size_t len = 100;
3829 
3830 #ifdef CONFIG_WIFI_DISPLAY
3831 	if (p2p && p2p->wfd_ie_probe_req)
3832 		len += wpabuf_len(p2p->wfd_ie_probe_req);
3833 #endif /* CONFIG_WIFI_DISPLAY */
3834 
3835 	if (p2p && p2p->vendor_elem &&
3836 	    p2p->vendor_elem[VENDOR_ELEM_PROBE_REQ_P2P])
3837 		len += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_PROBE_REQ_P2P]);
3838 
3839 	return len;
3840 }
3841 
3842 
p2p_ie_text(struct wpabuf * p2p_ie,char * buf,char * end)3843 int p2p_ie_text(struct wpabuf *p2p_ie, char *buf, char *end)
3844 {
3845 	return p2p_attr_text(p2p_ie, buf, end);
3846 }
3847 
3848 
p2p_go_neg_req_cb(struct p2p_data * p2p,int success)3849 static void p2p_go_neg_req_cb(struct p2p_data *p2p, int success)
3850 {
3851 	struct p2p_device *dev = p2p->go_neg_peer;
3852 	int timeout;
3853 
3854 	p2p_dbg(p2p, "GO Negotiation Request TX callback: success=%d", success);
3855 
3856 	if (dev == NULL) {
3857 		p2p_dbg(p2p, "No pending GO Negotiation");
3858 		return;
3859 	}
3860 
3861 	if (success) {
3862 		if (dev->flags & P2P_DEV_USER_REJECTED) {
3863 			p2p_set_state(p2p, P2P_IDLE);
3864 			return;
3865 		}
3866 	} else if (dev->go_neg_req_sent) {
3867 		/* Cancel the increment from p2p_connect_send() on failure */
3868 		dev->go_neg_req_sent--;
3869 	}
3870 
3871 	if (!success &&
3872 	    (dev->info.dev_capab & P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY) &&
3873 	    !is_zero_ether_addr(dev->member_in_go_dev)) {
3874 		p2p_dbg(p2p, "Peer " MACSTR " did not acknowledge request - try to use device discoverability through its GO",
3875 			MAC2STR(dev->info.p2p_device_addr));
3876 		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3877 		p2p_send_dev_disc_req(p2p, dev);
3878 		return;
3879 	}
3880 
3881 	/*
3882 	 * Use P2P find, if needed, to find the other device from its listen
3883 	 * channel.
3884 	 */
3885 	p2p_set_state(p2p, P2P_CONNECT);
3886 	timeout = success ? 500000 : 100000;
3887 	if (!success && p2p->go_neg_peer &&
3888 	    (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE)) {
3889 		unsigned int r;
3890 		/*
3891 		 * Peer is expected to wait our response and we will skip the
3892 		 * listen phase. Add some randomness to the wait time here to
3893 		 * make it less likely to hit cases where we could end up in
3894 		 * sync with peer not listening.
3895 		 */
3896 		if (os_get_random((u8 *) &r, sizeof(r)) < 0)
3897 			r = 0;
3898 		timeout += r % 100000;
3899 	}
3900 	p2p_set_timeout(p2p, 0, timeout);
3901 }
3902 
3903 
p2p_go_neg_resp_cb(struct p2p_data * p2p,int success)3904 static void p2p_go_neg_resp_cb(struct p2p_data *p2p, int success)
3905 {
3906 	p2p_dbg(p2p, "GO Negotiation Response TX callback: success=%d",
3907 		success);
3908 	if (!p2p->go_neg_peer && p2p->state == P2P_PROVISIONING) {
3909 		p2p_dbg(p2p, "Ignore TX callback event - GO Negotiation is not running anymore");
3910 		return;
3911 	}
3912 	p2p_set_state(p2p, P2P_CONNECT);
3913 	p2p_set_timeout(p2p, 0, 500000);
3914 }
3915 
3916 
p2p_go_neg_resp_failure_cb(struct p2p_data * p2p,int success,const u8 * addr)3917 static void p2p_go_neg_resp_failure_cb(struct p2p_data *p2p, int success,
3918 				       const u8 *addr)
3919 {
3920 	p2p_dbg(p2p, "GO Negotiation Response (failure) TX callback: success=%d", success);
3921 	if (p2p->go_neg_peer && p2p->go_neg_peer->status != P2P_SC_SUCCESS) {
3922 		p2p_go_neg_failed(p2p, p2p->go_neg_peer->status);
3923 		return;
3924 	}
3925 
3926 	if (success) {
3927 		struct p2p_device *dev;
3928 		dev = p2p_get_device(p2p, addr);
3929 		if (dev &&
3930 		    dev->status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
3931 			dev->flags |= P2P_DEV_PEER_WAITING_RESPONSE;
3932 	}
3933 
3934 	if (p2p->state == P2P_SEARCH || p2p->state == P2P_SD_DURING_FIND)
3935 		p2p_continue_find(p2p);
3936 }
3937 
3938 
p2p_go_neg_conf_cb(struct p2p_data * p2p,enum p2p_send_action_result result)3939 static void p2p_go_neg_conf_cb(struct p2p_data *p2p,
3940 			       enum p2p_send_action_result result)
3941 {
3942 	struct p2p_device *dev;
3943 
3944 	p2p_dbg(p2p, "GO Negotiation Confirm TX callback: result=%d", result);
3945 	if (result == P2P_SEND_ACTION_FAILED) {
3946 		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3947 		p2p_go_neg_failed(p2p, -1);
3948 		return;
3949 	}
3950 
3951 	dev = p2p->go_neg_peer;
3952 
3953 	if (result == P2P_SEND_ACTION_NO_ACK) {
3954 		/*
3955 		 * Retry GO Negotiation Confirmation
3956 		 * P2P_GO_NEG_CNF_MAX_RETRY_COUNT times if we did not receive
3957 		 * ACK for confirmation.
3958 		 */
3959 		if (dev && dev->go_neg_conf &&
3960 		    dev->go_neg_conf_sent <= P2P_GO_NEG_CNF_MAX_RETRY_COUNT) {
3961 			p2p_dbg(p2p, "GO Negotiation Confirm retry %d",
3962 				dev->go_neg_conf_sent);
3963 			p2p->pending_action_state = P2P_PENDING_GO_NEG_CONFIRM;
3964 			if (p2p_send_action(p2p, dev->go_neg_conf_freq,
3965 					    dev->info.p2p_device_addr,
3966 					    p2p->cfg->dev_addr,
3967 					    dev->info.p2p_device_addr,
3968 					    wpabuf_head(dev->go_neg_conf),
3969 					    wpabuf_len(dev->go_neg_conf), 0) >=
3970 			    0) {
3971 				dev->go_neg_conf_sent++;
3972 				return;
3973 			}
3974 			p2p_dbg(p2p, "Failed to re-send Action frame");
3975 
3976 			/*
3977 			 * Continue with the assumption that the first attempt
3978 			 * went through and just the ACK frame was lost.
3979 			 */
3980 		}
3981 
3982 		/*
3983 		 * It looks like the TX status for GO Negotiation Confirm is
3984 		 * often showing failure even when the peer has actually
3985 		 * received the frame. Since the peer may change channels
3986 		 * immediately after having received the frame, we may not see
3987 		 * an Ack for retries, so just dropping a single frame may
3988 		 * trigger this. To allow the group formation to succeed if the
3989 		 * peer did indeed receive the frame, continue regardless of
3990 		 * the TX status.
3991 		 */
3992 		p2p_dbg(p2p, "Assume GO Negotiation Confirm TX was actually received by the peer even though Ack was not reported");
3993 	}
3994 
3995 	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3996 
3997 	if (dev == NULL)
3998 		return;
3999 
4000 	p2p_go_complete(p2p, dev);
4001 }
4002 
4003 
p2p_send_action_cb(struct p2p_data * p2p,unsigned int freq,const u8 * dst,const u8 * src,const u8 * bssid,enum p2p_send_action_result result)4004 void p2p_send_action_cb(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
4005 			const u8 *src, const u8 *bssid,
4006 			enum p2p_send_action_result result)
4007 {
4008 	enum p2p_pending_action_state state;
4009 	int success;
4010 
4011 	p2p_dbg(p2p, "Action frame TX callback (state=%d freq=%u dst=" MACSTR
4012 		" src=" MACSTR " bssid=" MACSTR " result=%d p2p_state=%s)",
4013 		p2p->pending_action_state, freq, MAC2STR(dst), MAC2STR(src),
4014 		MAC2STR(bssid), result, p2p_state_txt(p2p->state));
4015 	success = result == P2P_SEND_ACTION_SUCCESS;
4016 	state = p2p->pending_action_state;
4017 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
4018 	switch (state) {
4019 	case P2P_NO_PENDING_ACTION:
4020 		if (p2p->send_action_in_progress) {
4021 			p2p->send_action_in_progress = 0;
4022 			p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
4023 		}
4024 		break;
4025 	case P2P_PENDING_GO_NEG_REQUEST:
4026 		p2p_go_neg_req_cb(p2p, success);
4027 		break;
4028 	case P2P_PENDING_GO_NEG_RESPONSE:
4029 		p2p_go_neg_resp_cb(p2p, success);
4030 		break;
4031 	case P2P_PENDING_GO_NEG_RESPONSE_FAILURE:
4032 		p2p_go_neg_resp_failure_cb(p2p, success, dst);
4033 		break;
4034 	case P2P_PENDING_GO_NEG_CONFIRM:
4035 		p2p_go_neg_conf_cb(p2p, result);
4036 		break;
4037 	case P2P_PENDING_SD:
4038 		p2p_sd_query_cb(p2p, success);
4039 		break;
4040 	case P2P_PENDING_PD:
4041 		p2p_prov_disc_cb(p2p, success);
4042 		break;
4043 	case P2P_PENDING_PD_RESPONSE:
4044 		p2p_prov_disc_resp_cb(p2p, success);
4045 		break;
4046 	case P2P_PENDING_INVITATION_REQUEST:
4047 		p2p_invitation_req_cb(p2p, success);
4048 		break;
4049 	case P2P_PENDING_INVITATION_RESPONSE:
4050 		p2p_invitation_resp_cb(p2p, dst, success);
4051 		break;
4052 	case P2P_PENDING_DEV_DISC_REQUEST:
4053 		p2p_dev_disc_req_cb(p2p, success);
4054 		break;
4055 	case P2P_PENDING_DEV_DISC_RESPONSE:
4056 		p2p_dev_disc_resp_cb(p2p, success);
4057 		break;
4058 	case P2P_PENDING_GO_DISC_REQ:
4059 		p2p_go_disc_req_cb(p2p, success);
4060 		break;
4061 	}
4062 }
4063 
4064 
p2p_listen_cb(struct p2p_data * p2p,unsigned int freq,unsigned int duration)4065 void p2p_listen_cb(struct p2p_data *p2p, unsigned int freq,
4066 		   unsigned int duration)
4067 {
4068 	if (freq == p2p->pending_client_disc_freq) {
4069 		p2p_dbg(p2p, "Client discoverability remain-awake completed");
4070 		p2p->pending_client_disc_freq = 0;
4071 		return;
4072 	}
4073 
4074 	if (freq != p2p->pending_listen_freq) {
4075 		p2p_dbg(p2p, "Unexpected listen callback for freq=%u duration=%u (pending_listen_freq=%u)",
4076 			freq, duration, p2p->pending_listen_freq);
4077 		return;
4078 	}
4079 
4080 	p2p_dbg(p2p, "Starting Listen timeout(%u,%u) on freq=%u based on callback",
4081 		p2p->pending_listen_sec, p2p->pending_listen_usec,
4082 		p2p->pending_listen_freq);
4083 	p2p->pending_listen_wait_drv = false;
4084 	p2p->in_listen = 1;
4085 	p2p->drv_in_listen = freq;
4086 	if (p2p->pending_listen_sec || p2p->pending_listen_usec) {
4087 		/*
4088 		 * Add 20 msec extra wait to avoid race condition with driver
4089 		 * remain-on-channel end event, i.e., give driver more time to
4090 		 * complete the operation before our timeout expires.
4091 		 */
4092 		p2p_set_timeout(p2p, p2p->pending_listen_sec,
4093 				p2p->pending_listen_usec + 20000);
4094 	}
4095 
4096 	p2p->pending_listen_freq = 0;
4097 }
4098 
4099 
p2p_listen_end(struct p2p_data * p2p,unsigned int freq)4100 int p2p_listen_end(struct p2p_data *p2p, unsigned int freq)
4101 {
4102 	p2p_dbg(p2p, "Driver ended Listen state (freq=%u)", freq);
4103 	p2p->drv_in_listen = 0;
4104 	if (p2p->in_listen)
4105 		return 0; /* Internal timeout will trigger the next step */
4106 
4107 	if (p2p->state == P2P_WAIT_PEER_CONNECT && p2p->go_neg_peer &&
4108 	    p2p->pending_listen_freq) {
4109 		/*
4110 		 * Better wait a bit if the driver is unable to start
4111 		 * offchannel operation for some reason to continue with
4112 		 * P2P_WAIT_PEER_(IDLE/CONNECT) state transitions.
4113 		 */
4114 		p2p_dbg(p2p,
4115 			"Listen operation did not seem to start - delay idle phase to avoid busy loop");
4116 		p2p_set_timeout(p2p, 0, 100000);
4117 		return 1;
4118 	}
4119 
4120 	if (p2p->state == P2P_CONNECT_LISTEN && p2p->go_neg_peer) {
4121 		if (p2p->go_neg_peer->connect_reqs >= 120) {
4122 			p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
4123 			p2p_go_neg_failed(p2p, -1);
4124 			return 0;
4125 		}
4126 
4127 		p2p_set_state(p2p, P2P_CONNECT);
4128 		p2p_connect_send(p2p, p2p->go_neg_peer);
4129 		return 1;
4130 	} else if (p2p->state == P2P_SEARCH) {
4131 		if (p2p->p2p_scan_running) {
4132 			 /*
4133 			  * Search is already in progress. This can happen if
4134 			  * an Action frame RX is reported immediately after
4135 			  * the end of a remain-on-channel operation and the
4136 			  * response frame to that is sent using an offchannel
4137 			  * operation while in p2p_find. Avoid an attempt to
4138 			  * restart a scan here.
4139 			  */
4140 			p2p_dbg(p2p, "p2p_scan already in progress - do not try to start a new one");
4141 			return 1;
4142 		}
4143 		if (p2p->pending_listen_freq) {
4144 			/*
4145 			 * Better wait a bit if the driver is unable to start
4146 			 * offchannel operation for some reason. p2p_search()
4147 			 * will be started from internal timeout.
4148 			 */
4149 			p2p_dbg(p2p, "Listen operation did not seem to start - delay search phase to avoid busy loop");
4150 			p2p_set_timeout(p2p, 0, 100000);
4151 			return 1;
4152 		}
4153 		if (p2p->search_delay) {
4154 			p2p_dbg(p2p, "Delay search operation by %u ms",
4155 				p2p->search_delay);
4156 			p2p_set_timeout(p2p, p2p->search_delay / 1000,
4157 					(p2p->search_delay % 1000) * 1000);
4158 			return 1;
4159 		}
4160 		p2p_search(p2p);
4161 		return 1;
4162 	}
4163 
4164 	return 0;
4165 }
4166 
4167 
p2p_listen_failed(struct p2p_data * p2p,unsigned int freq)4168 void p2p_listen_failed(struct p2p_data *p2p, unsigned int freq)
4169 {
4170 	if (freq != p2p->pending_listen_freq) {
4171 		p2p_dbg(p2p,
4172 			"Unexpected listen failed callback for freq=%u (pending_listen_freq=%u)",
4173 			freq, p2p->pending_listen_freq);
4174 		return;
4175 	}
4176 
4177 	p2p_dbg(p2p, "Listen failed on freq=%u", freq);
4178 	p2p->pending_listen_freq = 0;
4179 	p2p->pending_listen_wait_drv = false;
4180 
4181 	if (p2p->state == P2P_SEARCH ||
4182 	    p2p->state == P2P_CONNECT_LISTEN ||
4183 	    p2p->state == P2P_WAIT_PEER_CONNECT ||
4184 	    p2p->state == P2P_WAIT_PEER_IDLE ||
4185 	    p2p->state == P2P_INVITE_LISTEN) {
4186 		p2p_dbg(p2p,
4187 			"Schedule timeout after listen failure to continue state machine");
4188 		p2p_set_timeout(p2p, 0, 100000);
4189 	}
4190 }
4191 
4192 
p2p_timeout_connect(struct p2p_data * p2p)4193 static void p2p_timeout_connect(struct p2p_data *p2p)
4194 {
4195 	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
4196 	if (p2p->go_neg_peer &&
4197 	    (p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
4198 		p2p_dbg(p2p, "Wait for GO Negotiation Confirm timed out - assume GO Negotiation failed");
4199 		p2p_go_neg_failed(p2p, -1);
4200 		return;
4201 	}
4202 	if (p2p->go_neg_peer &&
4203 	    (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE) &&
4204 	    p2p->go_neg_peer->connect_reqs < 120) {
4205 		p2p_dbg(p2p, "Peer expected to wait our response - skip listen");
4206 		p2p_connect_send(p2p, p2p->go_neg_peer);
4207 		return;
4208 	}
4209 	if (p2p->go_neg_peer && p2p->go_neg_peer->oob_go_neg_freq > 0) {
4210 		p2p_dbg(p2p, "Skip connect-listen since GO Neg channel known (OOB)");
4211 		p2p_set_state(p2p, P2P_CONNECT_LISTEN);
4212 		p2p_set_timeout(p2p, 0, 30000);
4213 		return;
4214 	}
4215 	p2p_set_state(p2p, P2P_CONNECT_LISTEN);
4216 	p2p_listen_in_find(p2p, 0);
4217 }
4218 
4219 
p2p_timeout_connect_listen(struct p2p_data * p2p)4220 static void p2p_timeout_connect_listen(struct p2p_data *p2p)
4221 {
4222 	if (p2p->go_neg_peer) {
4223 		if (p2p->drv_in_listen) {
4224 			p2p_dbg(p2p, "Driver is still in Listen state; wait for it to complete");
4225 			return;
4226 		}
4227 
4228 		if (p2p->go_neg_peer->connect_reqs >= 120) {
4229 			p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
4230 			p2p_go_neg_failed(p2p, -1);
4231 			return;
4232 		}
4233 
4234 		p2p_set_state(p2p, P2P_CONNECT);
4235 		p2p_connect_send(p2p, p2p->go_neg_peer);
4236 	} else
4237 		p2p_set_state(p2p, P2P_IDLE);
4238 }
4239 
4240 
p2p_timeout_wait_peer_connect(struct p2p_data * p2p)4241 static void p2p_timeout_wait_peer_connect(struct p2p_data *p2p)
4242 {
4243 	p2p_set_state(p2p, P2P_WAIT_PEER_IDLE);
4244 
4245 	if (p2p->cfg->is_concurrent_session_active &&
4246 	    p2p->cfg->is_concurrent_session_active(p2p->cfg->cb_ctx))
4247 		p2p_set_timeout(p2p, 0, 500000);
4248 	else
4249 		p2p_set_timeout(p2p, 0, 200000);
4250 }
4251 
4252 
p2p_timeout_wait_peer_idle(struct p2p_data * p2p)4253 static void p2p_timeout_wait_peer_idle(struct p2p_data *p2p)
4254 {
4255 	struct p2p_device *dev = p2p->go_neg_peer;
4256 
4257 	if (dev == NULL) {
4258 		p2p_dbg(p2p, "Unknown GO Neg peer - stop GO Neg wait");
4259 		return;
4260 	}
4261 
4262 	p2p_dbg(p2p, "Go to Listen state while waiting for the peer to become ready for GO Negotiation");
4263 	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
4264 	p2p->pending_listen_wait_drv = false;
4265 	if (p2p->pending_listen_freq) {
4266 		p2p_dbg(p2p, "Clear pending_listen_freq for %s", __func__);
4267 		p2p->pending_listen_freq = 0;
4268 	}
4269 	p2p_set_state(p2p, P2P_WAIT_PEER_CONNECT);
4270 	p2p_listen_in_find(p2p, 0);
4271 }
4272 
4273 
p2p_timeout_sd_during_find(struct p2p_data * p2p)4274 static void p2p_timeout_sd_during_find(struct p2p_data *p2p)
4275 {
4276 	p2p_dbg(p2p, "Service Discovery Query timeout");
4277 	if (p2p->sd_peer) {
4278 		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
4279 		p2p->sd_peer = NULL;
4280 	}
4281 	p2p_continue_find(p2p);
4282 }
4283 
4284 
p2p_timeout_prov_disc_during_find(struct p2p_data * p2p)4285 static void p2p_timeout_prov_disc_during_find(struct p2p_data *p2p)
4286 {
4287 	p2p_dbg(p2p, "Provision Discovery Request timeout");
4288 	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
4289 	p2p_continue_find(p2p);
4290 }
4291 
4292 
p2p_timeout_prov_disc_req(struct p2p_data * p2p)4293 static void p2p_timeout_prov_disc_req(struct p2p_data *p2p)
4294 {
4295 	u32 adv_id = 0;
4296 	u8 *adv_mac = NULL;
4297 
4298 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
4299 
4300 	/*
4301 	 * For user initiated PD requests that we have not gotten any responses
4302 	 * for while in IDLE state, we retry them a couple of times before
4303 	 * giving up.
4304 	 */
4305 	if (!p2p->user_initiated_pd)
4306 		return;
4307 
4308 	p2p_dbg(p2p, "User initiated Provision Discovery Request timeout");
4309 
4310 	if (p2p->pd_retries) {
4311 		p2p->pd_retries--;
4312 		p2p_retry_pd(p2p);
4313 	} else {
4314 		struct p2p_device *dev;
4315 		int for_join = 0;
4316 
4317 		dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
4318 			if (!ether_addr_equal(p2p->pending_pd_devaddr,
4319 					      dev->info.p2p_device_addr))
4320 				continue;
4321 			if (dev->req_config_methods &&
4322 			    (dev->flags & P2P_DEV_PD_FOR_JOIN))
4323 				for_join = 1;
4324 		}
4325 
4326 		if (p2p->p2ps_prov) {
4327 			adv_id = p2p->p2ps_prov->adv_id;
4328 			adv_mac = p2p->p2ps_prov->adv_mac;
4329 		}
4330 
4331 		if (p2p->cfg->prov_disc_fail)
4332 			p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx,
4333 						 p2p->pending_pd_devaddr,
4334 						 for_join ?
4335 						 P2P_PROV_DISC_TIMEOUT_JOIN :
4336 						 P2P_PROV_DISC_TIMEOUT,
4337 						 adv_id, adv_mac, NULL);
4338 		p2p_reset_pending_pd(p2p);
4339 	}
4340 }
4341 
4342 
p2p_timeout_invite(struct p2p_data * p2p)4343 static void p2p_timeout_invite(struct p2p_data *p2p)
4344 {
4345 	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
4346 	p2p_set_state(p2p, P2P_INVITE_LISTEN);
4347 	if (p2p->inv_role == P2P_INVITE_ROLE_ACTIVE_GO) {
4348 		/*
4349 		 * Better remain on operating channel instead of listen channel
4350 		 * when running a group.
4351 		 * Wait 120 ms to let the P2P GO to send its beacon on the
4352 		 * intended TBTT.
4353 		 */
4354 		p2p_dbg(p2p, "Inviting in active GO role - wait on operating channel");
4355 		p2p_set_timeout(p2p, 0, 120000);
4356 		return;
4357 	}
4358 	p2p_listen_in_find(p2p, 0);
4359 }
4360 
4361 
p2p_timeout_invite_listen(struct p2p_data * p2p)4362 static void p2p_timeout_invite_listen(struct p2p_data *p2p)
4363 {
4364 	if (p2p->invite_peer && p2p->invite_peer->invitation_reqs < 100) {
4365 		p2p_set_state(p2p, P2P_INVITE);
4366 		p2p_invite_send(p2p, p2p->invite_peer,
4367 				p2p->invite_go_dev_addr, p2p->invite_dev_pw_id);
4368 	} else {
4369 		if (p2p->invite_peer) {
4370 			p2p_dbg(p2p, "Invitation Request retry limit reached");
4371 			if (p2p->cfg->invitation_result)
4372 				p2p->cfg->invitation_result(
4373 					p2p->cfg->cb_ctx, -1, NULL, 0, NULL,
4374 					NULL,
4375 					p2p->invite_peer->info.p2p_device_addr,
4376 					0, 0, NULL, NULL, 0,
4377 					p2p->invite_go_dev_addr);
4378 		}
4379 		p2p_set_state(p2p, P2P_IDLE);
4380 	}
4381 }
4382 
4383 
p2p_state_timeout(void * eloop_ctx,void * timeout_ctx)4384 static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx)
4385 {
4386 	struct p2p_data *p2p = eloop_ctx;
4387 
4388 	p2p_dbg(p2p, "Timeout (state=%s)", p2p_state_txt(p2p->state));
4389 
4390 	p2p->in_listen = 0;
4391 	if (p2p->drv_in_listen) {
4392 		p2p_dbg(p2p, "Driver is still in listen state - stop it");
4393 		p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
4394 		p2p->pending_listen_wait_drv = false;
4395 	}
4396 
4397 	switch (p2p->state) {
4398 	case P2P_IDLE:
4399 		/* Check if we timed out waiting for PD req */
4400 		if (p2p->pending_action_state == P2P_PENDING_PD)
4401 			p2p_timeout_prov_disc_req(p2p);
4402 		break;
4403 	case P2P_SEARCH:
4404 		/* Check if we timed out waiting for PD req */
4405 		if (p2p->pending_action_state == P2P_PENDING_PD)
4406 			p2p_timeout_prov_disc_req(p2p);
4407 		if (p2p->search_delay && !p2p->in_search_delay) {
4408 			p2p_dbg(p2p, "Delay search operation by %u ms",
4409 				p2p->search_delay);
4410 			p2p->in_search_delay = 1;
4411 			p2p_set_timeout(p2p, p2p->search_delay / 1000,
4412 					(p2p->search_delay % 1000) * 1000);
4413 			break;
4414 		}
4415 		p2p->in_search_delay = 0;
4416 		p2p_search(p2p);
4417 		break;
4418 	case P2P_CONNECT:
4419 		p2p_timeout_connect(p2p);
4420 		break;
4421 	case P2P_CONNECT_LISTEN:
4422 		p2p_timeout_connect_listen(p2p);
4423 		break;
4424 	case P2P_GO_NEG:
4425 		break;
4426 	case P2P_LISTEN_ONLY:
4427 		/* Check if we timed out waiting for PD req */
4428 		if (p2p->pending_action_state == P2P_PENDING_PD)
4429 			p2p_timeout_prov_disc_req(p2p);
4430 
4431 		if (p2p->ext_listen_only) {
4432 			p2p_dbg(p2p, "Extended Listen Timing - Listen State completed");
4433 			p2p->ext_listen_only = 0;
4434 			p2p_set_state(p2p, P2P_IDLE);
4435 		}
4436 		break;
4437 	case P2P_WAIT_PEER_CONNECT:
4438 		p2p_timeout_wait_peer_connect(p2p);
4439 		break;
4440 	case P2P_WAIT_PEER_IDLE:
4441 		p2p_timeout_wait_peer_idle(p2p);
4442 		break;
4443 	case P2P_SD_DURING_FIND:
4444 		p2p_timeout_sd_during_find(p2p);
4445 		break;
4446 	case P2P_PROVISIONING:
4447 		break;
4448 	case P2P_PD_DURING_FIND:
4449 		p2p_timeout_prov_disc_during_find(p2p);
4450 		break;
4451 	case P2P_INVITE:
4452 		p2p_timeout_invite(p2p);
4453 		break;
4454 	case P2P_INVITE_LISTEN:
4455 		p2p_timeout_invite_listen(p2p);
4456 		break;
4457 	}
4458 }
4459 
4460 
p2p_reject(struct p2p_data * p2p,const u8 * peer_addr)4461 int p2p_reject(struct p2p_data *p2p, const u8 *peer_addr)
4462 {
4463 	struct p2p_device *dev;
4464 
4465 	dev = p2p_get_device(p2p, peer_addr);
4466 	p2p_dbg(p2p, "Local request to reject connection attempts by peer "
4467 		MACSTR, MAC2STR(peer_addr));
4468 	if (dev == NULL) {
4469 		p2p_dbg(p2p, "Peer " MACSTR " unknown", MAC2STR(peer_addr));
4470 		return -1;
4471 	}
4472 	dev->status = P2P_SC_FAIL_REJECTED_BY_USER;
4473 	dev->flags |= P2P_DEV_USER_REJECTED;
4474 	return 0;
4475 }
4476 
4477 
p2p_wps_method_text(enum p2p_wps_method method)4478 const char * p2p_wps_method_text(enum p2p_wps_method method)
4479 {
4480 	switch (method) {
4481 	case WPS_NOT_READY:
4482 		return "not-ready";
4483 	case WPS_PIN_DISPLAY:
4484 		return "Display";
4485 	case WPS_PIN_KEYPAD:
4486 		return "Keypad";
4487 	case WPS_PBC:
4488 		return "PBC";
4489 	case WPS_NFC:
4490 		return "NFC";
4491 	case WPS_P2PS:
4492 		return "P2PS";
4493 	}
4494 
4495 	return "??";
4496 }
4497 
4498 
p2p_go_state_text(enum p2p_go_state go_state)4499 static const char * p2p_go_state_text(enum p2p_go_state go_state)
4500 {
4501 	switch (go_state) {
4502 	case UNKNOWN_GO:
4503 		return "unknown";
4504 	case LOCAL_GO:
4505 		return "local";
4506 	case  REMOTE_GO:
4507 		return "remote";
4508 	}
4509 
4510 	return "??";
4511 }
4512 
4513 
p2p_get_peer_info(struct p2p_data * p2p,const u8 * addr,int next)4514 const struct p2p_peer_info * p2p_get_peer_info(struct p2p_data *p2p,
4515 					       const u8 *addr, int next)
4516 {
4517 	struct p2p_device *dev;
4518 
4519 	if (addr)
4520 		dev = p2p_get_device(p2p, addr);
4521 	else
4522 		dev = dl_list_first(&p2p->devices, struct p2p_device, list);
4523 
4524 	if (dev && next) {
4525 		dev = dl_list_first(&dev->list, struct p2p_device, list);
4526 		if (&dev->list == &p2p->devices)
4527 			dev = NULL;
4528 	}
4529 
4530 	if (dev == NULL)
4531 		return NULL;
4532 
4533 	return &dev->info;
4534 }
4535 
4536 
p2p_get_peer_info_txt(const struct p2p_peer_info * info,char * buf,size_t buflen)4537 int p2p_get_peer_info_txt(const struct p2p_peer_info *info,
4538 			  char *buf, size_t buflen)
4539 {
4540 	struct p2p_device *dev;
4541 	int res;
4542 	char *pos, *end;
4543 	struct os_reltime now;
4544 
4545 	if (info == NULL)
4546 		return -1;
4547 
4548 	dev = (struct p2p_device *) (((u8 *) info) -
4549 				     offsetof(struct p2p_device, info));
4550 
4551 	pos = buf;
4552 	end = buf + buflen;
4553 
4554 	os_get_reltime(&now);
4555 	res = os_snprintf(pos, end - pos,
4556 			  "age=%d\n"
4557 			  "listen_freq=%d\n"
4558 			  "wps_method=%s\n"
4559 			  "interface_addr=" MACSTR "\n"
4560 			  "member_in_go_dev=" MACSTR "\n"
4561 			  "member_in_go_iface=" MACSTR "\n"
4562 			  "go_neg_req_sent=%d\n"
4563 			  "go_state=%s\n"
4564 			  "dialog_token=%u\n"
4565 			  "intended_addr=" MACSTR "\n"
4566 			  "country=%c%c\n"
4567 			  "oper_freq=%d\n"
4568 			  "req_config_methods=0x%x\n"
4569 			  "flags=%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n"
4570 			  "status=%d\n"
4571 			  "invitation_reqs=%u\n",
4572 			  (int) (now.sec - dev->last_seen.sec),
4573 			  dev->listen_freq,
4574 			  p2p_wps_method_text(dev->wps_method),
4575 			  MAC2STR(dev->interface_addr),
4576 			  MAC2STR(dev->member_in_go_dev),
4577 			  MAC2STR(dev->member_in_go_iface),
4578 			  dev->go_neg_req_sent,
4579 			  p2p_go_state_text(dev->go_state),
4580 			  dev->dialog_token,
4581 			  MAC2STR(dev->intended_addr),
4582 			  dev->country[0] ? dev->country[0] : '_',
4583 			  dev->country[1] ? dev->country[1] : '_',
4584 			  dev->oper_freq,
4585 			  dev->req_config_methods,
4586 			  dev->flags & P2P_DEV_PROBE_REQ_ONLY ?
4587 			  "[PROBE_REQ_ONLY]" : "",
4588 			  dev->flags & P2P_DEV_REPORTED ? "[REPORTED]" : "",
4589 			  dev->flags & P2P_DEV_NOT_YET_READY ?
4590 			  "[NOT_YET_READY]" : "",
4591 			  dev->flags & P2P_DEV_PD_PEER_DISPLAY ?
4592 			  "[PD_PEER_DISPLAY]" : "",
4593 			  dev->flags & P2P_DEV_PD_PEER_KEYPAD ?
4594 			  "[PD_PEER_KEYPAD]" : "",
4595 			  dev->flags & P2P_DEV_PD_PEER_P2PS ?
4596 			  "[PD_PEER_P2PS]" : "",
4597 			  dev->flags & P2P_DEV_USER_REJECTED ?
4598 			  "[USER_REJECTED]" : "",
4599 			  dev->flags & P2P_DEV_PEER_WAITING_RESPONSE ?
4600 			  "[PEER_WAITING_RESPONSE]" : "",
4601 			  dev->flags & P2P_DEV_PREFER_PERSISTENT_GROUP ?
4602 			  "[PREFER_PERSISTENT_GROUP]" : "",
4603 			  dev->flags & P2P_DEV_WAIT_GO_NEG_RESPONSE ?
4604 			  "[WAIT_GO_NEG_RESPONSE]" : "",
4605 			  dev->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM ?
4606 			  "[WAIT_GO_NEG_CONFIRM]" : "",
4607 			  dev->flags & P2P_DEV_GROUP_CLIENT_ONLY ?
4608 			  "[GROUP_CLIENT_ONLY]" : "",
4609 			  dev->flags & P2P_DEV_FORCE_FREQ ?
4610 			  "[FORCE_FREQ]" : "",
4611 			  dev->flags & P2P_DEV_PD_FOR_JOIN ?
4612 			  "[PD_FOR_JOIN]" : "",
4613 			  dev->flags & P2P_DEV_LAST_SEEN_AS_GROUP_CLIENT ?
4614 			  "[LAST_SEEN_AS_GROUP_CLIENT]" : "",
4615 			  dev->status,
4616 			  dev->invitation_reqs);
4617 	if (os_snprintf_error(end - pos, res))
4618 		return pos - buf;
4619 	pos += res;
4620 
4621 	if (dev->ext_listen_period) {
4622 		res = os_snprintf(pos, end - pos,
4623 				  "ext_listen_period=%u\n"
4624 				  "ext_listen_interval=%u\n",
4625 				  dev->ext_listen_period,
4626 				  dev->ext_listen_interval);
4627 		if (os_snprintf_error(end - pos, res))
4628 			return pos - buf;
4629 		pos += res;
4630 	}
4631 
4632 	if (dev->oper_ssid_len) {
4633 		res = os_snprintf(pos, end - pos,
4634 				  "oper_ssid=%s\n",
4635 				  wpa_ssid_txt(dev->oper_ssid,
4636 					       dev->oper_ssid_len));
4637 		if (os_snprintf_error(end - pos, res))
4638 			return pos - buf;
4639 		pos += res;
4640 	}
4641 
4642 #ifdef CONFIG_WIFI_DISPLAY
4643 	if (dev->info.wfd_subelems) {
4644 		res = os_snprintf(pos, end - pos, "wfd_subelems=");
4645 		if (os_snprintf_error(end - pos, res))
4646 			return pos - buf;
4647 		pos += res;
4648 
4649 		pos += wpa_snprintf_hex(pos, end - pos,
4650 					wpabuf_head(dev->info.wfd_subelems),
4651 					wpabuf_len(dev->info.wfd_subelems));
4652 
4653 		res = os_snprintf(pos, end - pos, "\n");
4654 		if (os_snprintf_error(end - pos, res))
4655 			return pos - buf;
4656 		pos += res;
4657 	}
4658 #endif /* CONFIG_WIFI_DISPLAY */
4659 
4660 	return pos - buf;
4661 }
4662 
4663 
p2p_peer_known(struct p2p_data * p2p,const u8 * addr)4664 int p2p_peer_known(struct p2p_data *p2p, const u8 *addr)
4665 {
4666 	return p2p_get_device(p2p, addr) != NULL;
4667 }
4668 
4669 
p2p_set_client_discoverability(struct p2p_data * p2p,int enabled)4670 void p2p_set_client_discoverability(struct p2p_data *p2p, int enabled)
4671 {
4672 	if (enabled) {
4673 		p2p_dbg(p2p, "Client discoverability enabled");
4674 		p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
4675 	} else {
4676 		p2p_dbg(p2p, "Client discoverability disabled");
4677 		p2p->dev_capab &= ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
4678 	}
4679 }
4680 
4681 
p2p_build_presence_req(u32 duration1,u32 interval1,u32 duration2,u32 interval2)4682 static struct wpabuf * p2p_build_presence_req(u32 duration1, u32 interval1,
4683 					      u32 duration2, u32 interval2)
4684 {
4685 	struct wpabuf *req;
4686 	struct p2p_noa_desc desc1, desc2, *ptr1 = NULL, *ptr2 = NULL;
4687 	u8 *len;
4688 
4689 	req = wpabuf_alloc(100);
4690 	if (req == NULL)
4691 		return NULL;
4692 
4693 	if (duration1 || interval1) {
4694 		os_memset(&desc1, 0, sizeof(desc1));
4695 		desc1.count_type = 1;
4696 		desc1.duration = duration1;
4697 		desc1.interval = interval1;
4698 		ptr1 = &desc1;
4699 
4700 		if (duration2 || interval2) {
4701 			os_memset(&desc2, 0, sizeof(desc2));
4702 			desc2.count_type = 2;
4703 			desc2.duration = duration2;
4704 			desc2.interval = interval2;
4705 			ptr2 = &desc2;
4706 		}
4707 	}
4708 
4709 	p2p_buf_add_action_hdr(req, P2P_PRESENCE_REQ, 1);
4710 	len = p2p_buf_add_ie_hdr(req);
4711 	p2p_buf_add_noa(req, 0, 0, 0, ptr1, ptr2);
4712 	p2p_buf_update_ie_hdr(req, len);
4713 
4714 	return req;
4715 }
4716 
4717 
p2p_presence_req(struct p2p_data * p2p,const u8 * go_interface_addr,const u8 * own_interface_addr,unsigned int freq,u32 duration1,u32 interval1,u32 duration2,u32 interval2)4718 int p2p_presence_req(struct p2p_data *p2p, const u8 *go_interface_addr,
4719 		     const u8 *own_interface_addr, unsigned int freq,
4720 		     u32 duration1, u32 interval1, u32 duration2,
4721 		     u32 interval2)
4722 {
4723 	struct wpabuf *req;
4724 
4725 	p2p_dbg(p2p, "Send Presence Request to GO " MACSTR
4726 		" (own interface " MACSTR ") freq=%u dur1=%u int1=%u "
4727 		"dur2=%u int2=%u",
4728 		MAC2STR(go_interface_addr), MAC2STR(own_interface_addr),
4729 		freq, duration1, interval1, duration2, interval2);
4730 
4731 	req = p2p_build_presence_req(duration1, interval1, duration2,
4732 				     interval2);
4733 	if (req == NULL)
4734 		return -1;
4735 
4736 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
4737 	if (p2p_send_action(p2p, freq, go_interface_addr, own_interface_addr,
4738 			    go_interface_addr,
4739 			    wpabuf_head(req), wpabuf_len(req), 200) < 0) {
4740 		p2p_dbg(p2p, "Failed to send Action frame");
4741 	}
4742 	wpabuf_free(req);
4743 
4744 	return 0;
4745 }
4746 
4747 
p2p_build_presence_resp(u8 status,const u8 * noa,size_t noa_len,u8 dialog_token)4748 static struct wpabuf * p2p_build_presence_resp(u8 status, const u8 *noa,
4749 					       size_t noa_len, u8 dialog_token)
4750 {
4751 	struct wpabuf *resp;
4752 	u8 *len;
4753 
4754 	resp = wpabuf_alloc(100 + noa_len);
4755 	if (resp == NULL)
4756 		return NULL;
4757 
4758 	p2p_buf_add_action_hdr(resp, P2P_PRESENCE_RESP, dialog_token);
4759 	len = p2p_buf_add_ie_hdr(resp);
4760 	p2p_buf_add_status(resp, status);
4761 	if (noa) {
4762 		wpabuf_put_u8(resp, P2P_ATTR_NOTICE_OF_ABSENCE);
4763 		wpabuf_put_le16(resp, noa_len);
4764 		wpabuf_put_data(resp, noa, noa_len);
4765 	} else
4766 		p2p_buf_add_noa(resp, 0, 0, 0, NULL, NULL);
4767 	p2p_buf_update_ie_hdr(resp, len);
4768 
4769 	return resp;
4770 }
4771 
4772 
p2p_process_presence_req(struct p2p_data * p2p,const u8 * da,const u8 * sa,const u8 * data,size_t len,int rx_freq)4773 static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
4774 				     const u8 *sa, const u8 *data, size_t len,
4775 				     int rx_freq)
4776 {
4777 	struct p2p_message msg;
4778 	u8 status;
4779 	struct wpabuf *resp;
4780 	size_t g;
4781 	struct p2p_group *group = NULL;
4782 	int parsed = 0;
4783 	u8 noa[50];
4784 	int noa_len;
4785 
4786 	p2p_dbg(p2p, "Received P2P Action - P2P Presence Request");
4787 
4788 	for (g = 0; g < p2p->num_groups; g++) {
4789 		if (ether_addr_equal(
4790 			    da, p2p_group_get_interface_addr(p2p->groups[g]))) {
4791 			group = p2p->groups[g];
4792 			break;
4793 		}
4794 	}
4795 	if (group == NULL) {
4796 		p2p_dbg(p2p, "Ignore P2P Presence Request for unknown group "
4797 			MACSTR, MAC2STR(da));
4798 		return;
4799 	}
4800 
4801 	if (p2p_parse(data, len, &msg) < 0) {
4802 		p2p_dbg(p2p, "Failed to parse P2P Presence Request");
4803 		status = P2P_SC_FAIL_INVALID_PARAMS;
4804 		goto fail;
4805 	}
4806 	parsed = 1;
4807 
4808 	if (msg.noa == NULL) {
4809 		p2p_dbg(p2p, "No NoA attribute in P2P Presence Request");
4810 		status = P2P_SC_FAIL_INVALID_PARAMS;
4811 		goto fail;
4812 	}
4813 
4814 	status = p2p_group_presence_req(group, sa, msg.noa, msg.noa_len);
4815 
4816 fail:
4817 	if (p2p->cfg->get_noa)
4818 		noa_len = p2p->cfg->get_noa(p2p->cfg->cb_ctx, da, noa,
4819 					    sizeof(noa));
4820 	else
4821 		noa_len = -1;
4822 	resp = p2p_build_presence_resp(status, noa_len > 0 ? noa : NULL,
4823 				       noa_len > 0 ? noa_len : 0,
4824 				       msg.dialog_token);
4825 	if (parsed)
4826 		p2p_parse_free(&msg);
4827 	if (resp == NULL)
4828 		return;
4829 
4830 	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
4831 	if (p2p_send_action(p2p, rx_freq, sa, da, da,
4832 			    wpabuf_head(resp), wpabuf_len(resp), 200) < 0) {
4833 		p2p_dbg(p2p, "Failed to send Action frame");
4834 	}
4835 	wpabuf_free(resp);
4836 }
4837 
4838 
p2p_process_presence_resp(struct p2p_data * p2p,const u8 * da,const u8 * sa,const u8 * data,size_t len)4839 static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
4840 				      const u8 *sa, const u8 *data, size_t len)
4841 {
4842 	struct p2p_message msg;
4843 
4844 	p2p_dbg(p2p, "Received P2P Action - P2P Presence Response");
4845 
4846 	if (p2p_parse(data, len, &msg) < 0) {
4847 		p2p_dbg(p2p, "Failed to parse P2P Presence Response");
4848 		return;
4849 	}
4850 
4851 	if (msg.status == NULL || msg.noa == NULL) {
4852 		p2p_dbg(p2p, "No Status or NoA attribute in P2P Presence Response");
4853 		p2p_parse_free(&msg);
4854 		return;
4855 	}
4856 
4857 	if (p2p->cfg->presence_resp) {
4858 		p2p->cfg->presence_resp(p2p->cfg->cb_ctx, sa, *msg.status,
4859 					msg.noa, msg.noa_len);
4860 	}
4861 
4862 	if (*msg.status) {
4863 		p2p_dbg(p2p, "P2P Presence Request was rejected: status %u",
4864 			*msg.status);
4865 		p2p_parse_free(&msg);
4866 		return;
4867 	}
4868 
4869 	p2p_dbg(p2p, "P2P Presence Request was accepted");
4870 	wpa_hexdump(MSG_DEBUG, "P2P: P2P Presence Response - NoA",
4871 		    msg.noa, msg.noa_len);
4872 	/* TODO: process NoA */
4873 	p2p_parse_free(&msg);
4874 }
4875 
4876 
p2p_ext_listen_timeout(void * eloop_ctx,void * timeout_ctx)4877 static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx)
4878 {
4879 	struct p2p_data *p2p = eloop_ctx;
4880 
4881 	if (p2p->ext_listen_interval) {
4882 		/* Schedule next extended listen timeout */
4883 		eloop_register_timeout(p2p->ext_listen_interval_sec,
4884 				       p2p->ext_listen_interval_usec,
4885 				       p2p_ext_listen_timeout, p2p, NULL);
4886 	}
4887 
4888 	if (p2p->state == P2P_LISTEN_ONLY && p2p->ext_listen_only) {
4889 		/*
4890 		 * This should not really happen, but it looks like the Listen
4891 		 * command may fail is something else (e.g., a scan) was
4892 		 * running at an inconvenient time. As a workaround, allow new
4893 		 * Extended Listen operation to be started.
4894 		 */
4895 		p2p_dbg(p2p, "Previous Extended Listen operation had not been completed - try again");
4896 		p2p->ext_listen_only = 0;
4897 		p2p_set_state(p2p, P2P_IDLE);
4898 	}
4899 
4900 	if ((p2p->cfg->is_p2p_in_progress &&
4901 	     p2p->cfg->is_p2p_in_progress(p2p->cfg->cb_ctx)) ||
4902 	    (p2p->pending_action_state == P2P_PENDING_PD &&
4903 	     p2p->pd_retries > 0)) {
4904 		p2p_dbg(p2p, "Operation in progress - skip Extended Listen timeout (%s)",
4905 			p2p_state_txt(p2p->state));
4906 		return;
4907 	}
4908 
4909 	if (p2p->state != P2P_IDLE) {
4910 		p2p_dbg(p2p, "Skip Extended Listen timeout in active state (%s)", p2p_state_txt(p2p->state));
4911 		return;
4912 	}
4913 
4914 	p2p_dbg(p2p, "Extended Listen timeout");
4915 	p2p->ext_listen_only = 1;
4916 	if (p2p_listen(p2p, p2p->ext_listen_period) < 0) {
4917 		p2p_dbg(p2p, "Failed to start Listen state for Extended Listen Timing");
4918 		p2p->ext_listen_only = 0;
4919 	}
4920 }
4921 
4922 
p2p_ext_listen(struct p2p_data * p2p,unsigned int period,unsigned int interval)4923 int p2p_ext_listen(struct p2p_data *p2p, unsigned int period,
4924 		   unsigned int interval)
4925 {
4926 	if (period > 65535 || interval > 65535 || period > interval ||
4927 	    (period == 0 && interval > 0) || (period > 0 && interval == 0)) {
4928 		p2p_dbg(p2p, "Invalid Extended Listen Timing request: period=%u interval=%u",
4929 			period, interval);
4930 		return -1;
4931 	}
4932 
4933 	eloop_cancel_timeout(p2p_ext_listen_timeout, p2p, NULL);
4934 
4935 	if (interval == 0) {
4936 		p2p_dbg(p2p, "Disabling Extended Listen Timing");
4937 		p2p->ext_listen_period = 0;
4938 		p2p->ext_listen_interval = 0;
4939 		return 0;
4940 	}
4941 
4942 	p2p_dbg(p2p, "Enabling Extended Listen Timing: period %u msec, interval %u msec",
4943 		period, interval);
4944 	p2p->ext_listen_period = period;
4945 	p2p->ext_listen_interval = interval;
4946 	p2p->ext_listen_interval_sec = interval / 1000;
4947 	p2p->ext_listen_interval_usec = (interval % 1000) * 1000;
4948 
4949 	eloop_register_timeout(p2p->ext_listen_interval_sec,
4950 			       p2p->ext_listen_interval_usec,
4951 			       p2p_ext_listen_timeout, p2p, NULL);
4952 
4953 	return 0;
4954 }
4955 
4956 
p2p_deauth_notif(struct p2p_data * p2p,const u8 * bssid,u16 reason_code,const u8 * ie,size_t ie_len)4957 void p2p_deauth_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
4958 		      const u8 *ie, size_t ie_len)
4959 {
4960 	struct p2p_message msg;
4961 
4962 	if (bssid == NULL || ie == NULL)
4963 		return;
4964 
4965 	os_memset(&msg, 0, sizeof(msg));
4966 	if (p2p_parse_ies(ie, ie_len, &msg))
4967 		return;
4968 	if (msg.minor_reason_code == NULL) {
4969 		p2p_parse_free(&msg);
4970 		return;
4971 	}
4972 
4973 	p2p_dbg(p2p, "Deauthentication notification BSSID " MACSTR
4974 		" reason_code=%u minor_reason_code=%u",
4975 		MAC2STR(bssid), reason_code, *msg.minor_reason_code);
4976 
4977 	p2p_parse_free(&msg);
4978 }
4979 
4980 
p2p_disassoc_notif(struct p2p_data * p2p,const u8 * bssid,u16 reason_code,const u8 * ie,size_t ie_len)4981 void p2p_disassoc_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
4982 			const u8 *ie, size_t ie_len)
4983 {
4984 	struct p2p_message msg;
4985 
4986 	if (bssid == NULL || ie == NULL)
4987 		return;
4988 
4989 	os_memset(&msg, 0, sizeof(msg));
4990 	if (p2p_parse_ies(ie, ie_len, &msg))
4991 		return;
4992 	if (msg.minor_reason_code == NULL) {
4993 		p2p_parse_free(&msg);
4994 		return;
4995 	}
4996 
4997 	p2p_dbg(p2p, "Disassociation notification BSSID " MACSTR
4998 		" reason_code=%u minor_reason_code=%u",
4999 		MAC2STR(bssid), reason_code, *msg.minor_reason_code);
5000 
5001 	p2p_parse_free(&msg);
5002 }
5003 
5004 
p2p_set_managed_oper(struct p2p_data * p2p,int enabled)5005 void p2p_set_managed_oper(struct p2p_data *p2p, int enabled)
5006 {
5007 	if (enabled) {
5008 		p2p_dbg(p2p, "Managed P2P Device operations enabled");
5009 		p2p->dev_capab |= P2P_DEV_CAPAB_INFRA_MANAGED;
5010 	} else {
5011 		p2p_dbg(p2p, "Managed P2P Device operations disabled");
5012 		p2p->dev_capab &= ~P2P_DEV_CAPAB_INFRA_MANAGED;
5013 	}
5014 }
5015 
5016 
p2p_set_bootstrapmethods(struct p2p_data * p2p,int bootstrap_methods)5017 void p2p_set_bootstrapmethods(struct p2p_data *p2p, int bootstrap_methods)
5018 {
5019 	p2p_dbg(p2p, "Bootstraping methods: 0x%x", bootstrap_methods);
5020 	p2p->cfg->pairing_config.bootstrap_methods = bootstrap_methods;
5021 	if (p2p->pairing_info)
5022 		p2p->pairing_info->supported_bootstrap = bootstrap_methods;
5023 }
5024 
5025 
p2p_set_pasn_type(struct p2p_data * p2p,u8 pasn_type)5026 void p2p_set_pasn_type(struct p2p_data *p2p, u8 pasn_type)
5027 {
5028 	p2p_dbg(p2p, "PASN type: 0x%x", pasn_type);
5029 	p2p->cfg->pairing_config.pasn_type = pasn_type;
5030 }
5031 
5032 
p2p_set_comeback_after(struct p2p_data * p2p,int comeback_after)5033 void p2p_set_comeback_after(struct p2p_data *p2p, int comeback_after)
5034 {
5035 	p2p_dbg(p2p, "Comeback after: %d", comeback_after);
5036 	p2p->cfg->comeback_after = comeback_after;
5037 }
5038 
5039 
p2p_set_reg_info(struct p2p_data * p2p,u8 val)5040 void p2p_set_reg_info(struct p2p_data *p2p, u8 val)
5041 {
5042 	p2p->cfg->reg_info = val;
5043 }
5044 
5045 
p2p_set_twt_power_mgmt(struct p2p_data * p2p,int val)5046 void p2p_set_twt_power_mgmt(struct p2p_data *p2p, int val)
5047 {
5048 	p2p_dbg(p2p, "TWT-based P2P Power Mgmt: %s",
5049 		     val ? "Enabled" : "Disabled");
5050 	if (val)
5051 		p2p->cfg->twt_power_mgmt = true;
5052 	else
5053 		p2p->cfg->twt_power_mgmt = false;
5054 }
5055 
5056 
p2p_set_chan_switch_req_enable(struct p2p_data * p2p,bool val)5057 void p2p_set_chan_switch_req_enable(struct p2p_data *p2p, bool val)
5058 {
5059 	p2p->cfg->chan_switch_req_enable = val;
5060 }
5061 
5062 
p2p_set_invitation_op_freq(struct p2p_data * p2p,int freq)5063 void p2p_set_invitation_op_freq(struct p2p_data *p2p, int freq)
5064 {
5065 	u8 op_class, channel;
5066 
5067 	if (freq == -1) {
5068 		p2p->cfg->inv_op_class = 0;
5069 		p2p->cfg->inv_op_channel = 0;
5070 		return;
5071 	}
5072 
5073 	if (p2p_freq_to_channel(freq, &op_class, &channel) < 0)
5074 		return;
5075 
5076 	p2p->cfg->inv_op_class = op_class;
5077 	p2p->cfg->inv_op_channel = channel;
5078 }
5079 
5080 
p2p_config_get_random_social(struct p2p_config * p2p,u8 * op_class,u8 * op_channel,struct wpa_freq_range_list * avoid_list,struct wpa_freq_range_list * disallow_list)5081 int p2p_config_get_random_social(struct p2p_config *p2p, u8 *op_class,
5082 				 u8 *op_channel,
5083 				 struct wpa_freq_range_list *avoid_list,
5084 				 struct wpa_freq_range_list *disallow_list)
5085 {
5086 	return p2p_channel_random_social(&p2p->channels, op_class, op_channel,
5087 					 avoid_list, disallow_list);
5088 }
5089 
5090 
p2p_set_listen_channel(struct p2p_data * p2p,u8 reg_class,u8 channel,u8 forced)5091 int p2p_set_listen_channel(struct p2p_data *p2p, u8 reg_class, u8 channel,
5092 			   u8 forced)
5093 {
5094 	if (p2p_channel_to_freq(reg_class, channel) < 0)
5095 		return -1;
5096 
5097 	/*
5098 	 * Listen channel was set in configuration or set by control interface;
5099 	 * cannot override it.
5100 	 */
5101 	if (p2p->cfg->channel_forced && forced == 0) {
5102 		p2p_dbg(p2p,
5103 			"Listen channel was previously configured - do not override based on optimization");
5104 		return -1;
5105 	}
5106 
5107 	p2p_dbg(p2p, "Set Listen channel: reg_class %u channel %u",
5108 		reg_class, channel);
5109 
5110 	if (p2p->state == P2P_IDLE) {
5111 		p2p->cfg->reg_class = reg_class;
5112 		p2p->cfg->channel = channel;
5113 		p2p->cfg->channel_forced = forced;
5114 	} else {
5115 		p2p_dbg(p2p, "Defer setting listen channel");
5116 		p2p->pending_reg_class = reg_class;
5117 		p2p->pending_channel = channel;
5118 		p2p->pending_channel_forced = forced;
5119 	}
5120 
5121 	return 0;
5122 }
5123 
5124 
p2p_get_listen_channel(struct p2p_data * p2p)5125 u8 p2p_get_listen_channel(struct p2p_data *p2p)
5126 {
5127 	return p2p->cfg->channel;
5128 }
5129 
5130 
p2p_set_ssid_postfix(struct p2p_data * p2p,const u8 * postfix,size_t len)5131 int p2p_set_ssid_postfix(struct p2p_data *p2p, const u8 *postfix, size_t len)
5132 {
5133 	p2p_dbg(p2p, "New SSID postfix: %s", wpa_ssid_txt(postfix, len));
5134 	if (postfix == NULL) {
5135 		p2p->cfg->ssid_postfix_len = 0;
5136 		return 0;
5137 	}
5138 	if (len > sizeof(p2p->cfg->ssid_postfix))
5139 		return -1;
5140 	os_memcpy(p2p->cfg->ssid_postfix, postfix, len);
5141 	p2p->cfg->ssid_postfix_len = len;
5142 	return 0;
5143 }
5144 
5145 
p2p_set_oper_channel(struct p2p_data * p2p,u8 op_reg_class,u8 op_channel,int cfg_op_channel)5146 int p2p_set_oper_channel(struct p2p_data *p2p, u8 op_reg_class, u8 op_channel,
5147 			 int cfg_op_channel)
5148 {
5149 	if (p2p_channel_to_freq(op_reg_class, op_channel) < 0)
5150 		return -1;
5151 
5152 	p2p_dbg(p2p, "Set Operating channel: reg_class %u channel %u",
5153 		op_reg_class, op_channel);
5154 	p2p->cfg->op_reg_class = op_reg_class;
5155 	p2p->cfg->op_channel = op_channel;
5156 	p2p->cfg->cfg_op_channel = cfg_op_channel;
5157 	return 0;
5158 }
5159 
5160 
p2p_set_pref_chan(struct p2p_data * p2p,unsigned int num_pref_chan,const struct p2p_channel * pref_chan)5161 int p2p_set_pref_chan(struct p2p_data *p2p, unsigned int num_pref_chan,
5162 		      const struct p2p_channel *pref_chan)
5163 {
5164 	struct p2p_channel *n;
5165 
5166 	if (pref_chan) {
5167 		n = os_memdup(pref_chan,
5168 			      num_pref_chan * sizeof(struct p2p_channel));
5169 		if (n == NULL)
5170 			return -1;
5171 	} else
5172 		n = NULL;
5173 
5174 	os_free(p2p->cfg->pref_chan);
5175 	p2p->cfg->pref_chan = n;
5176 	p2p->cfg->num_pref_chan = num_pref_chan;
5177 
5178 	return 0;
5179 }
5180 
5181 
p2p_set_no_go_freq(struct p2p_data * p2p,const struct wpa_freq_range_list * list)5182 int p2p_set_no_go_freq(struct p2p_data *p2p,
5183 		       const struct wpa_freq_range_list *list)
5184 {
5185 	struct wpa_freq_range *tmp;
5186 
5187 	if (list == NULL || list->num == 0) {
5188 		os_free(p2p->no_go_freq.range);
5189 		p2p->no_go_freq.range = NULL;
5190 		p2p->no_go_freq.num = 0;
5191 		return 0;
5192 	}
5193 
5194 	tmp = os_calloc(list->num, sizeof(struct wpa_freq_range));
5195 	if (tmp == NULL)
5196 		return -1;
5197 	os_memcpy(tmp, list->range, list->num * sizeof(struct wpa_freq_range));
5198 	os_free(p2p->no_go_freq.range);
5199 	p2p->no_go_freq.range = tmp;
5200 	p2p->no_go_freq.num = list->num;
5201 	p2p_dbg(p2p, "Updated no GO chan list");
5202 
5203 	return 0;
5204 }
5205 
5206 
p2p_get_interface_addr(struct p2p_data * p2p,const u8 * dev_addr,u8 * iface_addr)5207 int p2p_get_interface_addr(struct p2p_data *p2p, const u8 *dev_addr,
5208 			   u8 *iface_addr)
5209 {
5210 	struct p2p_device *dev = p2p_get_device(p2p, dev_addr);
5211 
5212 	if (!dev || is_zero_ether_addr(dev->interface_addr)) {
5213 		p2p_dbg(p2p,
5214 			"P2P: Failed to get interface address from device addr "
5215 			MACSTR, MAC2STR(dev_addr));
5216 		return -1;
5217 	}
5218 	os_memcpy(iface_addr, dev->interface_addr, ETH_ALEN);
5219 	return 0;
5220 }
5221 
5222 
p2p_get_dev_addr(struct p2p_data * p2p,const u8 * iface_addr,u8 * dev_addr)5223 int p2p_get_dev_addr(struct p2p_data *p2p, const u8 *iface_addr,
5224 			   u8 *dev_addr)
5225 {
5226 	struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
5227 
5228 	if (!dev) {
5229 		p2p_dbg(p2p,
5230 			"P2P: Failed to get device address from interface address "
5231 			MACSTR, MAC2STR(iface_addr));
5232 		return -1;
5233 	}
5234 	os_memcpy(dev_addr, dev->info.p2p_device_addr, ETH_ALEN);
5235 	return 0;
5236 }
5237 
5238 
p2p_get_dev_identity_key(struct p2p_data * p2p,const u8 * dev_addr,const u8 ** dik_data,size_t * dik_len,u8 * cipher)5239 int p2p_get_dev_identity_key(struct p2p_data *p2p, const u8 *dev_addr,
5240 			     const u8 **dik_data, size_t *dik_len, u8 *cipher)
5241 {
5242 	if (!p2p || !p2p->peer_dik_len) {
5243 		wpa_printf(MSG_DEBUG,
5244 			   "P2P2: Failed to get device identity key for "
5245 			   MACSTR, MAC2STR(dev_addr));
5246 		return -1;
5247 	}
5248 
5249 	*dik_data = p2p->peer_dik_data;
5250 	*dik_len = p2p->peer_dik_len;
5251 	*cipher = p2p->dik_cipher_version;
5252 
5253 	/* Reset DIK length to invalidate DIK for successive iteration of a new
5254 	 * peer. */
5255 	p2p->peer_dik_len = 0;
5256 
5257 	return 0;
5258 }
5259 
5260 
p2p_set_peer_filter(struct p2p_data * p2p,const u8 * addr)5261 void p2p_set_peer_filter(struct p2p_data *p2p, const u8 *addr)
5262 {
5263 	os_memcpy(p2p->peer_filter, addr, ETH_ALEN);
5264 	if (is_zero_ether_addr(p2p->peer_filter))
5265 		p2p_dbg(p2p, "Disable peer filter");
5266 	else
5267 		p2p_dbg(p2p, "Enable peer filter for " MACSTR,
5268 			MAC2STR(p2p->peer_filter));
5269 }
5270 
5271 
p2p_set_cross_connect(struct p2p_data * p2p,int enabled)5272 void p2p_set_cross_connect(struct p2p_data *p2p, int enabled)
5273 {
5274 	p2p_dbg(p2p, "Cross connection %s", enabled ? "enabled" : "disabled");
5275 	if (p2p->cross_connect == enabled)
5276 		return;
5277 	p2p->cross_connect = enabled;
5278 	/* TODO: may need to tear down any action group where we are GO(?) */
5279 }
5280 
5281 
p2p_get_oper_freq(struct p2p_data * p2p,const u8 * iface_addr)5282 int p2p_get_oper_freq(struct p2p_data *p2p, const u8 *iface_addr)
5283 {
5284 	struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
5285 	if (dev == NULL)
5286 		return -1;
5287 	if (dev->oper_freq <= 0)
5288 		return -1;
5289 	return dev->oper_freq;
5290 }
5291 
5292 
p2p_set_intra_bss_dist(struct p2p_data * p2p,int enabled)5293 void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled)
5294 {
5295 	p2p_dbg(p2p, "Intra BSS distribution %s",
5296 		enabled ? "enabled" : "disabled");
5297 	p2p->cfg->p2p_intra_bss = enabled;
5298 }
5299 
5300 
p2p_update_channel_list(struct p2p_data * p2p,const struct p2p_channels * chan,const struct p2p_channels * cli_chan)5301 void p2p_update_channel_list(struct p2p_data *p2p,
5302 			     const struct p2p_channels *chan,
5303 			     const struct p2p_channels *cli_chan)
5304 {
5305 	p2p_dbg(p2p, "Update channel list");
5306 	os_memcpy(&p2p->cfg->channels, chan, sizeof(struct p2p_channels));
5307 	p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
5308 	os_memcpy(&p2p->cfg->cli_channels, cli_chan,
5309 		  sizeof(struct p2p_channels));
5310 	p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
5311 }
5312 
5313 
p2p_send_action(struct p2p_data * p2p,unsigned int freq,const u8 * dst,const u8 * src,const u8 * bssid,const u8 * buf,size_t len,unsigned int wait_time)5314 int p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
5315 		    const u8 *src, const u8 *bssid, const u8 *buf,
5316 		    size_t len, unsigned int wait_time)
5317 {
5318 	int res, scheduled;
5319 
5320 	res = p2p->cfg->send_action(p2p->cfg->cb_ctx, freq, dst, src, bssid,
5321 				    buf, len, wait_time, &scheduled);
5322 	if (res == 0 && scheduled && p2p->in_listen && freq > 0 &&
5323 	    p2p->drv_in_listen > 0 &&
5324 	    (unsigned int) p2p->drv_in_listen != freq) {
5325 		p2p_dbg(p2p,
5326 			"Stop listen on %d MHz to allow a frame to be sent immediately on %d MHz",
5327 			p2p->drv_in_listen, freq);
5328 		p2p_stop_listen_for_freq(p2p, freq);
5329 	}
5330 	return res;
5331 }
5332 
5333 
p2p_set_best_channels(struct p2p_data * p2p,int freq_24,int freq_5,int freq_overall)5334 void p2p_set_best_channels(struct p2p_data *p2p, int freq_24, int freq_5,
5335 			   int freq_overall)
5336 {
5337 	p2p_dbg(p2p, "Best channel: 2.4 GHz: %d,  5 GHz: %d,  overall: %d",
5338 		freq_24, freq_5, freq_overall);
5339 	p2p->best_freq_24 = freq_24;
5340 	p2p->best_freq_5 = freq_5;
5341 	p2p->best_freq_overall = freq_overall;
5342 }
5343 
5344 
p2p_set_own_freq_preference(struct p2p_data * p2p,int freq)5345 void p2p_set_own_freq_preference(struct p2p_data *p2p, int freq)
5346 {
5347 	p2p_dbg(p2p, "Own frequency preference: %d MHz", freq);
5348 	p2p->own_freq_preference = freq;
5349 }
5350 
5351 
p2p_get_go_neg_peer(struct p2p_data * p2p)5352 const u8 * p2p_get_go_neg_peer(struct p2p_data *p2p)
5353 {
5354 	if (p2p == NULL || p2p->go_neg_peer == NULL)
5355 		return NULL;
5356 	return p2p->go_neg_peer->info.p2p_device_addr;
5357 }
5358 
5359 
5360 const struct p2p_peer_info *
p2p_get_peer_found(struct p2p_data * p2p,const u8 * addr,int next)5361 p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next)
5362 {
5363 	struct p2p_device *dev;
5364 
5365 	if (addr) {
5366 		dev = p2p_get_device(p2p, addr);
5367 		if (!dev)
5368 			return NULL;
5369 
5370 		if (!next) {
5371 			if (dev->flags & P2P_DEV_PROBE_REQ_ONLY)
5372 				return NULL;
5373 
5374 			return &dev->info;
5375 		} else {
5376 			do {
5377 				dev = dl_list_first(&dev->list,
5378 						    struct p2p_device,
5379 						    list);
5380 				if (!dev || &dev->list == &p2p->devices)
5381 					return NULL;
5382 			} while (dev->flags & P2P_DEV_PROBE_REQ_ONLY);
5383 		}
5384 	} else {
5385 		dev = dl_list_first(&p2p->devices, struct p2p_device, list);
5386 		if (!dev)
5387 			return NULL;
5388 		while (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
5389 			dev = dl_list_first(&dev->list,
5390 					    struct p2p_device,
5391 					    list);
5392 			if (!dev || &dev->list == &p2p->devices)
5393 				return NULL;
5394 		}
5395 	}
5396 
5397 	return &dev->info;
5398 }
5399 
5400 
p2p_in_progress(struct p2p_data * p2p)5401 int p2p_in_progress(struct p2p_data *p2p)
5402 {
5403 	if (p2p == NULL)
5404 		return 0;
5405 	if (p2p->state == P2P_SEARCH)
5406 		return 2;
5407 	return p2p->state != P2P_IDLE && p2p->state != P2P_PROVISIONING;
5408 }
5409 
5410 
p2p_set_config_timeout(struct p2p_data * p2p,u8 go_timeout,u8 client_timeout)5411 void p2p_set_config_timeout(struct p2p_data *p2p, u8 go_timeout,
5412 			    u8 client_timeout)
5413 {
5414 	if (p2p) {
5415 		p2p->go_timeout = go_timeout;
5416 		p2p->client_timeout = client_timeout;
5417 	}
5418 }
5419 
5420 
5421 #ifdef CONFIG_WIFI_DISPLAY
5422 
p2p_update_wfd_ie_groups(struct p2p_data * p2p)5423 static void p2p_update_wfd_ie_groups(struct p2p_data *p2p)
5424 {
5425 	size_t g;
5426 	struct p2p_group *group;
5427 
5428 	for (g = 0; g < p2p->num_groups; g++) {
5429 		group = p2p->groups[g];
5430 		p2p_group_force_beacon_update_ies(group);
5431 	}
5432 }
5433 
5434 
p2p_set_wfd_ie_beacon(struct p2p_data * p2p,struct wpabuf * ie)5435 int p2p_set_wfd_ie_beacon(struct p2p_data *p2p, struct wpabuf *ie)
5436 {
5437 	wpabuf_free(p2p->wfd_ie_beacon);
5438 	p2p->wfd_ie_beacon = ie;
5439 	p2p_update_wfd_ie_groups(p2p);
5440 	return 0;
5441 }
5442 
5443 
p2p_set_wfd_ie_probe_req(struct p2p_data * p2p,struct wpabuf * ie)5444 int p2p_set_wfd_ie_probe_req(struct p2p_data *p2p, struct wpabuf *ie)
5445 {
5446 	wpabuf_free(p2p->wfd_ie_probe_req);
5447 	p2p->wfd_ie_probe_req = ie;
5448 	return 0;
5449 }
5450 
5451 
p2p_set_wfd_ie_probe_resp(struct p2p_data * p2p,struct wpabuf * ie)5452 int p2p_set_wfd_ie_probe_resp(struct p2p_data *p2p, struct wpabuf *ie)
5453 {
5454 	wpabuf_free(p2p->wfd_ie_probe_resp);
5455 	p2p->wfd_ie_probe_resp = ie;
5456 	p2p_update_wfd_ie_groups(p2p);
5457 	return 0;
5458 }
5459 
5460 
p2p_set_wfd_ie_assoc_req(struct p2p_data * p2p,struct wpabuf * ie)5461 int p2p_set_wfd_ie_assoc_req(struct p2p_data *p2p, struct wpabuf *ie)
5462 {
5463 	wpabuf_free(p2p->wfd_ie_assoc_req);
5464 	p2p->wfd_ie_assoc_req = ie;
5465 	return 0;
5466 }
5467 
5468 
p2p_set_wfd_ie_invitation(struct p2p_data * p2p,struct wpabuf * ie)5469 int p2p_set_wfd_ie_invitation(struct p2p_data *p2p, struct wpabuf *ie)
5470 {
5471 	wpabuf_free(p2p->wfd_ie_invitation);
5472 	p2p->wfd_ie_invitation = ie;
5473 	return 0;
5474 }
5475 
5476 
p2p_set_wfd_ie_prov_disc_req(struct p2p_data * p2p,struct wpabuf * ie)5477 int p2p_set_wfd_ie_prov_disc_req(struct p2p_data *p2p, struct wpabuf *ie)
5478 {
5479 	wpabuf_free(p2p->wfd_ie_prov_disc_req);
5480 	p2p->wfd_ie_prov_disc_req = ie;
5481 	return 0;
5482 }
5483 
5484 
p2p_set_wfd_ie_prov_disc_resp(struct p2p_data * p2p,struct wpabuf * ie)5485 int p2p_set_wfd_ie_prov_disc_resp(struct p2p_data *p2p, struct wpabuf *ie)
5486 {
5487 	wpabuf_free(p2p->wfd_ie_prov_disc_resp);
5488 	p2p->wfd_ie_prov_disc_resp = ie;
5489 	return 0;
5490 }
5491 
5492 
p2p_set_wfd_ie_go_neg(struct p2p_data * p2p,struct wpabuf * ie)5493 int p2p_set_wfd_ie_go_neg(struct p2p_data *p2p, struct wpabuf *ie)
5494 {
5495 	wpabuf_free(p2p->wfd_ie_go_neg);
5496 	p2p->wfd_ie_go_neg = ie;
5497 	return 0;
5498 }
5499 
5500 
p2p_set_wfd_dev_info(struct p2p_data * p2p,const struct wpabuf * elem)5501 int p2p_set_wfd_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
5502 {
5503 	wpabuf_free(p2p->wfd_dev_info);
5504 	if (elem) {
5505 		p2p->wfd_dev_info = wpabuf_dup(elem);
5506 		if (p2p->wfd_dev_info == NULL)
5507 			return -1;
5508 	} else
5509 		p2p->wfd_dev_info = NULL;
5510 
5511 	return 0;
5512 }
5513 
5514 
p2p_set_wfd_r2_dev_info(struct p2p_data * p2p,const struct wpabuf * elem)5515 int p2p_set_wfd_r2_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
5516 {
5517 	wpabuf_free(p2p->wfd_r2_dev_info);
5518 	if (elem) {
5519 		p2p->wfd_r2_dev_info = wpabuf_dup(elem);
5520 		if (p2p->wfd_r2_dev_info == NULL)
5521 			return -1;
5522 	} else
5523 		p2p->wfd_r2_dev_info = NULL;
5524 
5525 	return 0;
5526 }
5527 
5528 
p2p_set_wfd_assoc_bssid(struct p2p_data * p2p,const struct wpabuf * elem)5529 int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem)
5530 {
5531 	wpabuf_free(p2p->wfd_assoc_bssid);
5532 	if (elem) {
5533 		p2p->wfd_assoc_bssid = wpabuf_dup(elem);
5534 		if (p2p->wfd_assoc_bssid == NULL)
5535 			return -1;
5536 	} else
5537 		p2p->wfd_assoc_bssid = NULL;
5538 
5539 	return 0;
5540 }
5541 
5542 
p2p_set_wfd_coupled_sink_info(struct p2p_data * p2p,const struct wpabuf * elem)5543 int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p,
5544 				  const struct wpabuf *elem)
5545 {
5546 	wpabuf_free(p2p->wfd_coupled_sink_info);
5547 	if (elem) {
5548 		p2p->wfd_coupled_sink_info = wpabuf_dup(elem);
5549 		if (p2p->wfd_coupled_sink_info == NULL)
5550 			return -1;
5551 	} else
5552 		p2p->wfd_coupled_sink_info = NULL;
5553 
5554 	return 0;
5555 }
5556 
5557 #endif /* CONFIG_WIFI_DISPLAY */
5558 
5559 
p2p_set_disc_int(struct p2p_data * p2p,int min_disc_int,int max_disc_int,int max_disc_tu)5560 int p2p_set_disc_int(struct p2p_data *p2p, int min_disc_int, int max_disc_int,
5561 		     int max_disc_tu)
5562 {
5563 	if (min_disc_int > max_disc_int || min_disc_int < 0 || max_disc_int < 0)
5564 		return -1;
5565 
5566 	p2p->min_disc_int = min_disc_int;
5567 	p2p->max_disc_int = max_disc_int;
5568 	p2p->max_disc_tu = max_disc_tu;
5569 	p2p_dbg(p2p, "Set discoverable interval: min=%d max=%d max_tu=%d",
5570 		min_disc_int, max_disc_int, max_disc_tu);
5571 
5572 	return 0;
5573 }
5574 
5575 
p2p_dbg(struct p2p_data * p2p,const char * fmt,...)5576 void p2p_dbg(struct p2p_data *p2p, const char *fmt, ...)
5577 {
5578 	va_list ap;
5579 	char buf[500];
5580 
5581 	if (!p2p->cfg->debug_print)
5582 		return;
5583 
5584 	va_start(ap, fmt);
5585 	vsnprintf(buf, sizeof(buf), fmt, ap);
5586 	buf[sizeof(buf) - 1] = '\0';
5587 	va_end(ap);
5588 	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_DEBUG, buf);
5589 }
5590 
5591 
p2p_info(struct p2p_data * p2p,const char * fmt,...)5592 void p2p_info(struct p2p_data *p2p, const char *fmt, ...)
5593 {
5594 	va_list ap;
5595 	char buf[500];
5596 
5597 	if (!p2p->cfg->debug_print)
5598 		return;
5599 
5600 	va_start(ap, fmt);
5601 	vsnprintf(buf, sizeof(buf), fmt, ap);
5602 	buf[sizeof(buf) - 1] = '\0';
5603 	va_end(ap);
5604 	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_INFO, buf);
5605 }
5606 
5607 
p2p_err(struct p2p_data * p2p,const char * fmt,...)5608 void p2p_err(struct p2p_data *p2p, const char *fmt, ...)
5609 {
5610 	va_list ap;
5611 	char buf[500];
5612 
5613 	if (!p2p->cfg->debug_print)
5614 		return;
5615 
5616 	va_start(ap, fmt);
5617 	vsnprintf(buf, sizeof(buf), fmt, ap);
5618 	buf[sizeof(buf) - 1] = '\0';
5619 	va_end(ap);
5620 	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_ERROR, buf);
5621 }
5622 
5623 
p2p_loop_on_known_peers(struct p2p_data * p2p,void (* peer_callback)(struct p2p_peer_info * peer,void * user_data),void * user_data)5624 void p2p_loop_on_known_peers(struct p2p_data *p2p,
5625 			     void (*peer_callback)(struct p2p_peer_info *peer,
5626 						   void *user_data),
5627 			     void *user_data)
5628 {
5629 	struct p2p_device *dev, *n;
5630 
5631 	dl_list_for_each_safe(dev, n, &p2p->devices, struct p2p_device, list) {
5632 		peer_callback(&dev->info, user_data);
5633 	}
5634 }
5635 
5636 
5637 #ifdef CONFIG_WPS_NFC
5638 
p2p_build_nfc_handover(struct p2p_data * p2p,int client_freq,const u8 * go_dev_addr,const u8 * ssid,size_t ssid_len)5639 static struct wpabuf * p2p_build_nfc_handover(struct p2p_data *p2p,
5640 					      int client_freq,
5641 					      const u8 *go_dev_addr,
5642 					      const u8 *ssid, size_t ssid_len)
5643 {
5644 	struct wpabuf *buf;
5645 	u8 op_class, channel;
5646 	enum p2p_role_indication role = P2P_DEVICE_NOT_IN_GROUP;
5647 
5648 	buf = wpabuf_alloc(1000);
5649 	if (buf == NULL)
5650 		return NULL;
5651 
5652 	op_class = p2p->cfg->reg_class;
5653 	channel = p2p->cfg->channel;
5654 
5655 	p2p_buf_add_capability(buf, p2p->dev_capab &
5656 			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
5657 	p2p_buf_add_device_info(buf, p2p, NULL);
5658 
5659 	if (p2p->num_groups > 0) {
5660 		int freq = p2p_group_get_freq(p2p->groups[0]);
5661 		role = P2P_GO_IN_A_GROUP;
5662 		if (p2p_freq_to_channel(freq, &op_class, &channel) < 0) {
5663 			p2p_dbg(p2p,
5664 				"Unknown GO operating frequency %d MHz for NFC handover",
5665 				freq);
5666 			wpabuf_free(buf);
5667 			return NULL;
5668 		}
5669 	} else if (client_freq > 0) {
5670 		role = P2P_CLIENT_IN_A_GROUP;
5671 		if (p2p_freq_to_channel(client_freq, &op_class, &channel) < 0) {
5672 			p2p_dbg(p2p,
5673 				"Unknown client operating frequency %d MHz for NFC handover",
5674 				client_freq);
5675 			wpabuf_free(buf);
5676 			return NULL;
5677 		}
5678 	}
5679 
5680 	p2p_buf_add_oob_go_neg_channel(buf, p2p->cfg->country, op_class,
5681 				       channel, role);
5682 
5683 	if (p2p->num_groups > 0) {
5684 		/* Limit number of clients to avoid very long message */
5685 		p2p_buf_add_group_info(p2p->groups[0], buf, 5);
5686 		p2p_group_buf_add_id(p2p->groups[0], buf);
5687 	} else if (client_freq > 0 &&
5688 		   go_dev_addr && !is_zero_ether_addr(go_dev_addr) &&
5689 		   ssid && ssid_len > 0) {
5690 		/*
5691 		 * Add the optional P2P Group ID to indicate in which group this
5692 		 * device is a P2P Client.
5693 		 */
5694 		p2p_buf_add_group_id(buf, go_dev_addr, ssid, ssid_len);
5695 	}
5696 
5697 	return buf;
5698 }
5699 
5700 
p2p_build_nfc_handover_req(struct p2p_data * p2p,int client_freq,const u8 * go_dev_addr,const u8 * ssid,size_t ssid_len)5701 struct wpabuf * p2p_build_nfc_handover_req(struct p2p_data *p2p,
5702 					   int client_freq,
5703 					   const u8 *go_dev_addr,
5704 					   const u8 *ssid, size_t ssid_len)
5705 {
5706 	return p2p_build_nfc_handover(p2p, client_freq, go_dev_addr, ssid,
5707 				      ssid_len);
5708 }
5709 
5710 
p2p_build_nfc_handover_sel(struct p2p_data * p2p,int client_freq,const u8 * go_dev_addr,const u8 * ssid,size_t ssid_len)5711 struct wpabuf * p2p_build_nfc_handover_sel(struct p2p_data *p2p,
5712 					   int client_freq,
5713 					   const u8 *go_dev_addr,
5714 					   const u8 *ssid, size_t ssid_len)
5715 {
5716 	return p2p_build_nfc_handover(p2p, client_freq, go_dev_addr, ssid,
5717 				      ssid_len);
5718 }
5719 
5720 
p2p_process_nfc_connection_handover(struct p2p_data * p2p,struct p2p_nfc_params * params)5721 int p2p_process_nfc_connection_handover(struct p2p_data *p2p,
5722 					struct p2p_nfc_params *params)
5723 {
5724 	struct p2p_message msg;
5725 	struct p2p_device *dev;
5726 	const u8 *p2p_dev_addr;
5727 	int freq;
5728 	enum p2p_role_indication role;
5729 
5730 	params->next_step = NO_ACTION;
5731 
5732 	if (p2p_parse_ies_separate(params->wsc_attr, params->wsc_len,
5733 				   params->p2p_attr, params->p2p_len, &msg)) {
5734 		p2p_dbg(p2p, "Failed to parse WSC/P2P attributes from NFC");
5735 		p2p_parse_free(&msg);
5736 		return -1;
5737 	}
5738 
5739 	if (msg.p2p_device_addr)
5740 		p2p_dev_addr = msg.p2p_device_addr;
5741 	else if (msg.device_id)
5742 		p2p_dev_addr = msg.device_id;
5743 	else {
5744 		p2p_dbg(p2p, "Ignore scan data without P2P Device Info or P2P Device Id");
5745 		p2p_parse_free(&msg);
5746 		return -1;
5747 	}
5748 
5749 	if (msg.oob_dev_password) {
5750 		os_memcpy(params->oob_dev_pw, msg.oob_dev_password,
5751 			  msg.oob_dev_password_len);
5752 		params->oob_dev_pw_len = msg.oob_dev_password_len;
5753 	}
5754 
5755 	dev = p2p_create_device(p2p, p2p_dev_addr);
5756 	if (dev == NULL) {
5757 		p2p_parse_free(&msg);
5758 		return -1;
5759 	}
5760 
5761 	params->peer = &dev->info;
5762 
5763 	os_get_reltime(&dev->last_seen);
5764 	dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY);
5765 	p2p_copy_wps_info(p2p, dev, 0, &msg);
5766 
5767 	if (!msg.oob_go_neg_channel) {
5768 		p2p_dbg(p2p, "OOB GO Negotiation Channel attribute not included");
5769 		p2p_parse_free(&msg);
5770 		return -1;
5771 	}
5772 
5773 	if (msg.oob_go_neg_channel[3] == 0 &&
5774 	    msg.oob_go_neg_channel[4] == 0)
5775 		freq = 0;
5776 	else
5777 		freq = p2p_channel_to_freq(msg.oob_go_neg_channel[3],
5778 					   msg.oob_go_neg_channel[4]);
5779 	if (freq < 0) {
5780 		p2p_dbg(p2p, "Unknown peer OOB GO Neg channel");
5781 		p2p_parse_free(&msg);
5782 		return -1;
5783 	}
5784 	role = msg.oob_go_neg_channel[5];
5785 
5786 	if (role == P2P_GO_IN_A_GROUP) {
5787 		p2p_dbg(p2p, "Peer OOB GO operating channel: %u MHz", freq);
5788 		params->go_freq = freq;
5789 	} else if (role == P2P_CLIENT_IN_A_GROUP) {
5790 		p2p_dbg(p2p, "Peer (client) OOB GO operating channel: %u MHz",
5791 			freq);
5792 		params->go_freq = freq;
5793 	} else
5794 		p2p_dbg(p2p, "Peer OOB GO Neg channel: %u MHz", freq);
5795 	dev->oob_go_neg_freq = freq;
5796 
5797 	if (!params->sel && role != P2P_GO_IN_A_GROUP) {
5798 		freq = p2p_channel_to_freq(p2p->cfg->reg_class,
5799 					   p2p->cfg->channel);
5800 		if (freq < 0) {
5801 			p2p_dbg(p2p, "Own listen channel not known");
5802 			p2p_parse_free(&msg);
5803 			return -1;
5804 		}
5805 		p2p_dbg(p2p, "Use own Listen channel as OOB GO Neg channel: %u MHz", freq);
5806 		dev->oob_go_neg_freq = freq;
5807 	}
5808 
5809 	if (msg.group_id) {
5810 		os_memcpy(params->go_dev_addr, msg.group_id, ETH_ALEN);
5811 		params->go_ssid_len = msg.group_id_len - ETH_ALEN;
5812 		os_memcpy(params->go_ssid, msg.group_id + ETH_ALEN,
5813 			  params->go_ssid_len);
5814 	}
5815 
5816 	if (dev->flags & P2P_DEV_USER_REJECTED) {
5817 		p2p_dbg(p2p, "Do not report rejected device");
5818 		p2p_parse_free(&msg);
5819 		return 0;
5820 	}
5821 
5822 	if (!(dev->flags & P2P_DEV_REPORTED)) {
5823 		p2p->cfg->dev_found(p2p->cfg->cb_ctx, p2p_dev_addr, &dev->info,
5824 				    !(dev->flags & P2P_DEV_REPORTED_ONCE));
5825 		dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
5826 	}
5827 	p2p_parse_free(&msg);
5828 
5829 	if (role == P2P_GO_IN_A_GROUP && p2p->num_groups > 0)
5830 		params->next_step = BOTH_GO;
5831 	else if (role == P2P_GO_IN_A_GROUP)
5832 		params->next_step = JOIN_GROUP;
5833 	else if (role == P2P_CLIENT_IN_A_GROUP) {
5834 		dev->flags |= P2P_DEV_GROUP_CLIENT_ONLY;
5835 		params->next_step = PEER_CLIENT;
5836 	} else if (p2p->num_groups > 0)
5837 		params->next_step = AUTH_JOIN;
5838 	else if (params->sel)
5839 		params->next_step = INIT_GO_NEG;
5840 	else
5841 		params->next_step = RESP_GO_NEG;
5842 
5843 	return 0;
5844 }
5845 
5846 
p2p_set_authorized_oob_dev_pw_id(struct p2p_data * p2p,u16 dev_pw_id,int go_intent,const u8 * own_interface_addr)5847 void p2p_set_authorized_oob_dev_pw_id(struct p2p_data *p2p, u16 dev_pw_id,
5848 				      int go_intent,
5849 				      const u8 *own_interface_addr)
5850 {
5851 
5852 	p2p->authorized_oob_dev_pw_id = dev_pw_id;
5853 	if (dev_pw_id == 0) {
5854 		p2p_dbg(p2p, "NFC OOB Password unauthorized for static handover");
5855 		return;
5856 	}
5857 
5858 	p2p_dbg(p2p, "NFC OOB Password (id=%u) authorized for static handover",
5859 		dev_pw_id);
5860 
5861 	p2p->go_intent = go_intent;
5862 	os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
5863 }
5864 
5865 #endif /* CONFIG_WPS_NFC */
5866 
5867 
p2p_set_passphrase_len(struct p2p_data * p2p,unsigned int len)5868 int p2p_set_passphrase_len(struct p2p_data *p2p, unsigned int len)
5869 {
5870 	if (len < 8 || len > 63)
5871 		return -1;
5872 	p2p->cfg->passphrase_len = len;
5873 	return 0;
5874 }
5875 
5876 
p2p_set_vendor_elems(struct p2p_data * p2p,struct wpabuf ** vendor_elem)5877 void p2p_set_vendor_elems(struct p2p_data *p2p, struct wpabuf **vendor_elem)
5878 {
5879 	p2p->vendor_elem = vendor_elem;
5880 }
5881 
5882 
p2p_go_neg_wait_timeout(void * eloop_ctx,void * timeout_ctx)5883 void p2p_go_neg_wait_timeout(void *eloop_ctx, void *timeout_ctx)
5884 {
5885 	struct p2p_data *p2p = eloop_ctx;
5886 
5887 	p2p_dbg(p2p,
5888 		"Timeout on waiting peer to become ready for GO Negotiation");
5889 	p2p_go_neg_failed(p2p, -1);
5890 }
5891 
5892 
p2p_set_own_pref_freq_list(struct p2p_data * p2p,const struct weighted_pcl * pref_freq_list,unsigned int size)5893 void p2p_set_own_pref_freq_list(struct p2p_data *p2p,
5894 				const struct weighted_pcl *pref_freq_list,
5895 				unsigned int size)
5896 {
5897 	unsigned int i;
5898 
5899 	if (size > P2P_MAX_PREF_CHANNELS)
5900 		size = P2P_MAX_PREF_CHANNELS;
5901 	p2p->num_pref_freq = size;
5902 	os_memcpy(p2p->pref_freq_list, pref_freq_list,
5903 		  size * sizeof(struct weighted_pcl));
5904 	for (i = 0; i < size; i++) {
5905 		p2p_dbg(p2p, "Own preferred frequency list[%u]=%u MHz",
5906 			i, p2p->pref_freq_list[i].freq);
5907 	}
5908 }
5909 
5910 
p2p_set_override_pref_op_chan(struct p2p_data * p2p,u8 op_class,u8 chan)5911 void p2p_set_override_pref_op_chan(struct p2p_data *p2p, u8 op_class,
5912 				   u8 chan)
5913 {
5914 	p2p->override_pref_op_class = op_class;
5915 	p2p->override_pref_channel = chan;
5916 }
5917 
5918 
p2p_build_probe_resp_template(struct p2p_data * p2p,unsigned int freq)5919 struct wpabuf * p2p_build_probe_resp_template(struct p2p_data *p2p,
5920 					      unsigned int freq)
5921 {
5922 	struct wpabuf *ies, *buf;
5923 	u8 addr[] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };
5924 	int ret;
5925 
5926 	ies = p2p_build_probe_resp_ies(p2p, NULL, 0);
5927 	if (!ies) {
5928 		wpa_printf(MSG_ERROR,
5929 			   "CTRL: Failed to build Probe Response IEs");
5930 		return NULL;
5931 	}
5932 
5933 	buf = wpabuf_alloc(200 + wpabuf_len(ies));
5934 	if (!buf) {
5935 		wpabuf_free(ies);
5936 		return NULL;
5937 	}
5938 
5939 	ret = p2p_build_probe_resp_buf(p2p, buf, ies, addr, freq);
5940 	wpabuf_free(ies);
5941 	if (ret) {
5942 		wpabuf_free(buf);
5943 		return NULL;
5944 	}
5945 
5946 	return buf;
5947 }
5948 
5949 
p2p_is_peer_6ghz_capab(struct p2p_data * p2p,const u8 * addr)5950 bool p2p_is_peer_6ghz_capab(struct p2p_data *p2p, const u8 *addr)
5951 {
5952 	struct p2p_device *dev;
5953 
5954 	dev = p2p_get_device(p2p, addr);
5955 	if (!dev)
5956 		return false;
5957 
5958 	return dev->support_6ghz;
5959 }
5960 
5961 
p2p_set_6ghz_dev_capab(struct p2p_data * p2p,bool allow_6ghz)5962 void p2p_set_6ghz_dev_capab(struct p2p_data *p2p, bool allow_6ghz)
5963 {
5964 	p2p->p2p_6ghz_capable = allow_6ghz;
5965 	p2p->allow_6ghz = allow_6ghz;
5966 	p2p_dbg(p2p, "Set 6 GHz capability to %d", allow_6ghz);
5967 
5968 	if (allow_6ghz)
5969 		p2p->dev_capab |= P2P_DEV_CAPAB_6GHZ_BAND_CAPABLE;
5970 	else
5971 		p2p->dev_capab &= ~P2P_DEV_CAPAB_6GHZ_BAND_CAPABLE;
5972 }
5973 
5974 
is_p2p_6ghz_capable(struct p2p_data * p2p)5975 bool is_p2p_6ghz_capable(struct p2p_data *p2p)
5976 {
5977 	return p2p->p2p_6ghz_capable;
5978 }
5979 
5980 
p2p_wfd_enabled(struct p2p_data * p2p)5981 bool p2p_wfd_enabled(struct p2p_data *p2p)
5982 {
5983 #ifdef CONFIG_WIFI_DISPLAY
5984 	return p2p->wfd_ie_probe_req != NULL;
5985 #else /* CONFIG_WIFI_DISPLAY */
5986 	return false;
5987 #endif /* CONFIG_WIFI_DISPLAY */
5988 }
5989 
5990 
p2p_peer_wfd_enabled(struct p2p_data * p2p,const u8 * peer_addr)5991 bool p2p_peer_wfd_enabled(struct p2p_data *p2p, const u8 *peer_addr)
5992 {
5993 #ifdef CONFIG_WIFI_DISPLAY
5994 	struct p2p_device *dev;
5995 
5996 	dev = p2p_get_device(p2p, peer_addr);
5997 	return dev && dev->info.wfd_subelems != NULL;
5998 #else /* CONFIG_WIFI_DISPLAY */
5999 	return false;
6000 #endif /* CONFIG_WIFI_DISPLAY */
6001 }
6002 
6003 
is_p2p_allow_6ghz(struct p2p_data * p2p)6004 bool is_p2p_allow_6ghz(struct p2p_data *p2p)
6005 {
6006 	return p2p->allow_6ghz;
6007 }
6008 
6009 
set_p2p_allow_6ghz(struct p2p_data * p2p,bool value)6010 void set_p2p_allow_6ghz(struct p2p_data *p2p, bool value)
6011 {
6012 	p2p->allow_6ghz = value;
6013 }
6014 
6015 
p2p_derive_nonce_tag(struct p2p_data * p2p)6016 static int p2p_derive_nonce_tag(struct p2p_data *p2p)
6017 {
6018 	u8 dira_nonce[DEVICE_IDENTITY_NONCE_LEN];
6019 	u8 dira_tag[DEVICE_MAX_HASH_LEN];
6020 	u8 data[DIR_STR_LEN + DEVICE_IDENTITY_NONCE_LEN + ETH_ALEN];
6021 	struct p2p_id_key *dev_ik;
6022 
6023 	dev_ik = &p2p->pairing_info->dev_ik;
6024 
6025 	if (dev_ik->cipher_version != DIRA_CIPHER_VERSION_128) {
6026 		wpa_printf(MSG_INFO,
6027 			   "P2P: Unsupported DIRA Cipher version = %d",
6028 			   dev_ik->cipher_version);
6029 		return -1;
6030 	}
6031 
6032 	if (dev_ik->dik_len != DEVICE_IDENTITY_KEY_LEN) {
6033 		wpa_printf(MSG_INFO, "P2P: Invalid DIK length = %zu",
6034 			   dev_ik->dik_len);
6035 		return -1;
6036 	}
6037 
6038 	os_memset(data, 0, sizeof(data));
6039 
6040 	if (os_get_random(dira_nonce, DEVICE_IDENTITY_NONCE_LEN) < 0) {
6041 		wpa_printf(MSG_ERROR, "P2P: Failed to generate DIRA nonce");
6042 		return -1;
6043 	}
6044 
6045 	/* Tag = Truncate-64(HMAC-SHA-256(DevIK,
6046 	 *                                "DIR" || P2P Device Address || Nonce))
6047 	 */
6048 	os_memcpy(data, "DIR", DIR_STR_LEN);
6049 	os_memcpy(&data[DIR_STR_LEN], p2p->cfg->dev_addr, ETH_ALEN);
6050 	os_memcpy(&data[DIR_STR_LEN + ETH_ALEN], dira_nonce,
6051 		  DEVICE_IDENTITY_NONCE_LEN);
6052 
6053 	if (hmac_sha256(dev_ik->dik_data, dev_ik->dik_len, data, sizeof(data),
6054 			dira_tag) < 0) {
6055 		wpa_printf(MSG_ERROR, "P2P: Could not derive DIRA tag");
6056 		return -1;
6057 	}
6058 
6059 	dev_ik->dira_nonce_len = DEVICE_IDENTITY_NONCE_LEN;
6060 	os_memcpy(dev_ik->dira_nonce, dira_nonce, DEVICE_IDENTITY_NONCE_LEN);
6061 	dev_ik->dira_tag_len = DEVICE_IDENTITY_TAG_LEN;
6062 	os_memcpy(dev_ik->dira_tag, dira_tag, DEVICE_IDENTITY_TAG_LEN);
6063 
6064 	wpa_hexdump_key(MSG_DEBUG, "P2P: DIK", dev_ik->dik_data,
6065 			dev_ik->dik_len);
6066 	wpa_hexdump_key(MSG_DEBUG, "P2P: DIRA-NONCE", dev_ik->dira_nonce,
6067 			dev_ik->dira_nonce_len);
6068 	wpa_hexdump_key(MSG_DEBUG, "P2P: DIRA-TAG", dev_ik->dira_tag,
6069 			dev_ik->dira_tag_len);
6070 	return 0;
6071 }
6072 
6073 
p2p_validate_dira(struct p2p_data * p2p,struct p2p_device * dev,const u8 * dira,u16 dira_len)6074 static int p2p_validate_dira(struct p2p_data *p2p, struct p2p_device *dev,
6075 			     const u8 *dira, u16 dira_len)
6076 {
6077 	if (dira_len < 1 || dira[0] != DIRA_CIPHER_VERSION_128) {
6078 		p2p_dbg(p2p, "Unsupported DIRA cipher version %d",
6079 			dira[0]);
6080 		return 0;
6081 	}
6082 
6083 	if (dira_len < 1 + DEVICE_IDENTITY_NONCE_LEN + DEVICE_IDENTITY_TAG_LEN)
6084 	{
6085 		p2p_dbg(p2p, "Truncated DIRA (length %u)", dira_len);
6086 		return 0;
6087 	}
6088 
6089 	if (p2p->cfg->validate_dira) {
6090 		const u8 *nonce = &dira[1];
6091 		const u8 *tag = &dira[1 + DEVICE_IDENTITY_NONCE_LEN];
6092 
6093 		return p2p->cfg->validate_dira(p2p->cfg->cb_ctx,
6094 					       dev->info.p2p_device_addr,
6095 					       nonce, tag);
6096 	}
6097 
6098 	return 0;
6099 }
6100 
6101 
p2p_usd_service_hash(struct p2p_data * p2p,const char * service_name)6102 void p2p_usd_service_hash(struct p2p_data *p2p, const char *service_name)
6103 {
6104 	u8 buf[P2PS_HASH_LEN];
6105 
6106 	p2p->usd_service = false;
6107 
6108 	if (!service_name)
6109 		return;
6110 
6111 	if (!p2ps_gen_hash(p2p, service_name, buf))
6112 		return;
6113 	p2p_dbg(p2p, "USD service %s hash " MACSTR,
6114 		service_name, MAC2STR(buf));
6115 	p2p->usd_service = true;
6116 	os_memcpy(&p2p->p2p_service_hash, buf, P2PS_HASH_LEN);
6117 }
6118 
6119 
p2p_usd_elems(struct p2p_data * p2p)6120 struct wpabuf * p2p_usd_elems(struct p2p_data *p2p)
6121 {
6122 	struct wpabuf *buf;
6123 	u8 *len;
6124 	u8 group_capab;
6125 
6126 	buf = wpabuf_alloc(1000);
6127 	if (!buf)
6128 		return NULL;
6129 
6130 	len = p2p_buf_add_ie_hdr(buf);
6131 
6132 	/* P2P Capability attribute */
6133 	group_capab = 0;
6134 	if (p2p->num_groups) {
6135 		group_capab |= P2P_GROUP_CAPAB_GROUP_OWNER;
6136 		if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
6137 		    (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED) &&
6138 		    p2p->cross_connect)
6139 			group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
6140 	}
6141 	if (p2p->cfg->p2p_intra_bss)
6142 		group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
6143 	p2p_buf_add_capability(buf, p2p->dev_capab &
6144 			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
6145 			       group_capab);
6146 
6147 	/* P2P Device Info attribute */
6148 	p2p_buf_add_device_info(buf, p2p, NULL);
6149 
6150 	p2p_buf_update_ie_hdr(buf, len);
6151 
6152 	len = p2p_buf_add_p2p2_ie_hdr(buf);
6153 
6154 	/* P2P Capability Extension attribute */
6155 	p2p_buf_add_pcea(buf, p2p);
6156 
6157 	/* P2P Pairing Bootstrapping Method attribute */
6158 	p2p_buf_add_pbma(buf, p2p->cfg->pairing_config.bootstrap_methods, NULL,
6159 			 0, 0);
6160 
6161 	/* P2P Device Identity Resolution attribute */
6162 	if (p2p->pairing_info &&
6163 	    p2p->cfg->pairing_config.pairing_capable &&
6164 	    p2p->cfg->pairing_config.enable_pairing_cache &&
6165 	    p2p_derive_nonce_tag(p2p) == 0)
6166 		p2p_buf_add_dira(buf, p2p);
6167 
6168 	p2p_buf_update_ie_hdr(buf, len);
6169 
6170 	return buf;
6171 }
6172 
6173 
p2p_process_usd_elems(struct p2p_data * p2p,const u8 * ies,u16 ies_len,const u8 * peer_addr,unsigned int freq)6174 void p2p_process_usd_elems(struct p2p_data *p2p, const u8 *ies, u16 ies_len,
6175 			   const u8 *peer_addr, unsigned int freq)
6176 {
6177 	struct p2p_device *dev;
6178 	struct p2p_message msg;
6179 	const u8 *p2p_dev_addr;
6180 
6181 	os_memset(&msg, 0, sizeof(msg));
6182 	if (p2p_parse_ies(ies, ies_len, &msg)) {
6183 		p2p_dbg(p2p, "Failed to parse P2P IE for a device entry");
6184 		p2p_parse_free(&msg);
6185 		return;
6186 	}
6187 	if (msg.p2p_device_addr)
6188 		p2p_dev_addr = msg.p2p_device_addr;
6189 	else
6190 		p2p_dev_addr = peer_addr;
6191 
6192 	dev = p2p_create_device(p2p, p2p_dev_addr);
6193 	if (!dev) {
6194 		p2p_parse_free(&msg);
6195 		p2p_dbg(p2p, "Failed to add a peer P2P Device");
6196 		return;
6197 	}
6198 
6199 	if (msg.device_name[0])
6200 		os_memcpy(dev->info.device_name, msg.device_name,
6201 			  sizeof(dev->info.device_name));
6202 
6203 	dev->p2p2 = true;
6204 	/* Reset info from old IEs */
6205 	dev->info.reg_info = 0;
6206 	os_memset(&dev->info.pairing_config, 0,
6207 		  sizeof(struct p2p_pairing_config));
6208 
6209 	os_get_reltime(&dev->last_seen);
6210 	dev->listen_freq = freq;
6211 	dev->oper_freq = freq;
6212 
6213 	if (msg.capability) {
6214 		/*
6215 		 * P2P Client Discoverability bit is reserved in all frames
6216 		 * that use this function, so do not change its value here.
6217 		 */
6218 		dev->info.dev_capab &= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
6219 		dev->info.dev_capab |= msg.capability[0] &
6220 			~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
6221 		dev->info.group_capab = msg.capability[1];
6222 	}
6223 
6224 	if (msg.pcea_info && msg.pcea_info_len >= 2)
6225 		p2p_process_pcea(p2p, &msg, dev);
6226 
6227 	if (msg.pbma_info && msg.pbma_info_len == 2)
6228 		dev->info.pairing_config.bootstrap_methods =
6229 			WPA_GET_LE16(msg.pbma_info);
6230 
6231 	if (!ether_addr_equal(peer_addr, p2p_dev_addr))
6232 		os_memcpy(dev->interface_addr, peer_addr, ETH_ALEN);
6233 
6234 	if (msg.dira && msg.dira_len) {
6235 		dev->info.nonce_tag_valid = false;
6236 		dev->info.dik_id = p2p_validate_dira(p2p, dev, msg.dira,
6237 						     msg.dira_len);
6238 		if (dev->info.dik_id) {
6239 			os_memcpy(dev->info.nonce, &msg.dira[1],
6240 				  DEVICE_IDENTITY_NONCE_LEN);
6241 			os_memcpy(dev->info.tag,
6242 				  &msg.dira[1 + DEVICE_IDENTITY_NONCE_LEN],
6243 				  DEVICE_IDENTITY_TAG_LEN);
6244 			dev->info.pairing_config.dik_cipher = msg.dira[0];
6245 			dev->info.nonce_tag_valid = true;
6246 		}
6247 	}
6248 
6249 	p2p_dbg(p2p, "Updated device entry based on USD frame: " MACSTR
6250 		" dev_capab=0x%x group_capab=0x%x listen_freq=%d",
6251 		MAC2STR(dev->info.p2p_device_addr), dev->info.dev_capab,
6252 		dev->info.group_capab, dev->listen_freq);
6253 
6254 	p2p->cfg->dev_found(p2p->cfg->cb_ctx, dev->info.p2p_device_addr,
6255 			    &dev->info, !(dev->flags & P2P_DEV_REPORTED_ONCE));
6256 	dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
6257 
6258 	p2p_parse_free(&msg);
6259 }
6260 
6261 
p2p_get_dik_id(struct p2p_data * p2p,const u8 * peer)6262 int p2p_get_dik_id(struct p2p_data *p2p, const u8 *peer)
6263 {
6264 	struct p2p_device *dev;
6265 
6266 	dev = p2p_get_device(p2p, peer);
6267 	if (!dev)
6268 		return 0;
6269 
6270 	return dev->info.dik_id;
6271 }
6272 
6273 
6274 #ifdef CONFIG_PASN
6275 
p2p_config_sae_password(struct p2p_data * p2p,const char * pw)6276 int p2p_config_sae_password(struct p2p_data *p2p, const char *pw)
6277 {
6278 	os_memset(p2p->dev_sae_password, 0, sizeof(p2p->dev_sae_password));
6279 	if (os_strlen(pw) >= sizeof(p2p->dev_sae_password))
6280 		return -1;
6281 
6282 	os_strlcpy(p2p->dev_sae_password, pw, sizeof(p2p->dev_sae_password));
6283 	return 0;
6284 }
6285 
6286 
p2p_prepare_pasn_extra_ie(struct p2p_data * p2p,struct wpabuf * extra_ies,const struct wpabuf * frame,bool add_dira)6287 static int p2p_prepare_pasn_extra_ie(struct p2p_data *p2p,
6288 				     struct wpabuf *extra_ies,
6289 				     const struct wpabuf *frame, bool add_dira)
6290 {
6291 	struct wpabuf *buf, *buf2;
6292 	size_t len;
6293 
6294 	len = 100;
6295 	if (frame)
6296 		len += wpabuf_len(frame);
6297 	buf = wpabuf_alloc(len);
6298 	if (!buf)
6299 		return -1;
6300 
6301 	/* P2P Capability Extension attribute */
6302 	p2p_buf_add_pcea(buf, p2p);
6303 
6304 	if (add_dira) {
6305 		/* Device Identity Resolution attribute */
6306 		p2p_buf_add_dira(buf, p2p);
6307 	}
6308 
6309 	if (frame) {
6310 		p2p_dbg(p2p, "Add Action frame wrapper for PASN");
6311 		wpabuf_put_u8(buf, P2P_ATTR_ACTION_FRAME_WRAPPER);
6312 		wpabuf_put_le16(buf, wpabuf_len(frame));
6313 		wpabuf_put_buf(buf, frame);
6314 	}
6315 
6316 	buf2 = p2p_encaps_ie(buf, P2P2_IE_VENDOR_TYPE);
6317 	wpabuf_free(buf);
6318 
6319 	if (wpabuf_tailroom(extra_ies) < wpabuf_len(buf2)) {
6320 		p2p_err(p2p, "Not enough room for P2P2 IE in PASN extra IEs");
6321 		wpabuf_free(buf2);
6322 		return -1;
6323 	}
6324 	wpabuf_put_buf(extra_ies, buf2);
6325 	wpabuf_free(buf2);
6326 
6327 	return 0;
6328 }
6329 
6330 
p2p_pasn_service_hash(struct p2p_data * p2p,struct wpabuf * extra_ies)6331 static struct wpabuf * p2p_pasn_service_hash(struct p2p_data *p2p,
6332 					     struct wpabuf *extra_ies)
6333 {
6334 	struct wpabuf *buf;
6335 	u8 *ie_len = NULL;
6336 
6337 	if (!p2p->usd_service)
6338 		return extra_ies;
6339 
6340 	p2p_dbg(p2p, "Add P2P2 USD service hash in extra IE");
6341 	buf = wpabuf_alloc(100);
6342 	if (!buf) {
6343 		wpabuf_free(extra_ies);
6344 		return NULL;
6345 	}
6346 
6347 	ie_len = p2p_buf_add_ie_hdr(buf);
6348 	p2p_buf_add_usd_service_hash(buf, p2p);
6349 	p2p_buf_update_ie_hdr(buf, ie_len);
6350 
6351 	return wpabuf_concat(buf, extra_ies);
6352 }
6353 
6354 
p2p_pairing_generate_rsnxe(struct p2p_data * p2p,int akmp)6355 static struct wpabuf * p2p_pairing_generate_rsnxe(struct p2p_data *p2p,
6356 						  int akmp)
6357 {
6358 	u32 capab;
6359 	size_t flen = 0;
6360 	struct wpabuf *buf;
6361 
6362 	capab = BIT(WLAN_RSNX_CAPAB_KEK_IN_PASN);
6363 
6364 	if (wpa_key_mgmt_sae(akmp))
6365 		capab |= BIT(WLAN_RSNX_CAPAB_SAE_H2E);
6366 
6367 	while (capab >> flen * 8)
6368 		flen++;
6369 
6370 	buf = wpabuf_alloc(2 + flen);
6371 	if (!buf)
6372 		return NULL;
6373 
6374 	if (wpabuf_tailroom(buf) < 2 + flen) {
6375 		p2p_dbg(p2p, "wpabuf tail room too small");
6376 		wpabuf_free(buf);
6377 		return NULL;
6378 	}
6379 	capab |= flen - 1; /* bit 0-3 = Field length (n - 1) */
6380 
6381 	p2p_dbg(p2p, "RSNXE capabilities: %04x", capab);
6382 	wpabuf_put_u8(buf, WLAN_EID_RSNX);
6383 	wpabuf_put_u8(buf, flen);
6384 	while (flen--) {
6385 		wpabuf_put_u8(buf, (capab & 0xff));
6386 		capab = capab >> 8;
6387 	}
6388 	return buf;
6389 }
6390 
6391 
6392 /* SSID used for deriving SAE pt for pairing */
6393 #define P2P_PAIRING_SSID "516F9A020000"
6394 
p2p_pairing_set_password(struct pasn_data * pasn,u8 pasn_type,const char * passphrase)6395 static void p2p_pairing_set_password(struct pasn_data *pasn, u8 pasn_type,
6396 				     const char *passphrase)
6397 {
6398 	int pasn_groups[4] = { 0 };
6399 	size_t len;
6400 
6401 	if (!passphrase)
6402 		return;
6403 
6404 	len = os_strlen(passphrase);
6405 
6406 	if (pasn_type & 0xc && pasn_type & 0x3) {
6407 		pasn_groups[0] = 20;
6408 		pasn_groups[1] = 19;
6409 	} else if (pasn_type & 0xc) {
6410 		pasn_groups[0] = 20;
6411 	} else {
6412 		pasn_groups[0] = 19;
6413 	}
6414 	pasn->pt = sae_derive_pt(pasn_groups, (const u8 *) P2P_PAIRING_SSID,
6415 				 os_strlen(P2P_PAIRING_SSID),
6416 				 (const u8 *) passphrase, len, NULL, 0);
6417 }
6418 
6419 
p2p_pasn_initialize(struct p2p_data * p2p,struct p2p_device * dev,const u8 * addr,int freq,bool verify,bool derive_kek)6420 void p2p_pasn_initialize(struct p2p_data *p2p, struct p2p_device *dev,
6421 			 const u8 *addr, int freq, bool verify, bool derive_kek)
6422 {
6423 	struct pasn_data *pasn;
6424 	struct wpabuf *rsnxe;
6425 
6426 	if (!p2p || !dev)
6427 		return;
6428 
6429 	if (dev->pasn) {
6430 		wpa_pasn_reset(dev->pasn);
6431 	} else {
6432 		dev->pasn = pasn_data_init();
6433 		if (!dev->pasn)
6434 			return;
6435 	}
6436 
6437 	pasn = dev->pasn;
6438 
6439 	os_memcpy(pasn->own_addr, p2p->cfg->dev_addr, ETH_ALEN);
6440 	os_memcpy(pasn->peer_addr, addr, ETH_ALEN);
6441 
6442 	os_memcpy(pasn->bssid, dev->role == P2P_ROLE_PAIRING_INITIATOR ?
6443 		  pasn->peer_addr : pasn->own_addr, ETH_ALEN);
6444 
6445 	pasn->noauth = 1;
6446 
6447 	if ((p2p->cfg->pairing_config.pasn_type & 0xc) &&
6448 	    (dev->info.pairing_config.pasn_type & 0xc)) {
6449 		pasn->group = 20;
6450 		pasn->cipher = WPA_CIPHER_GCMP_256;
6451 		pasn->kek_len = 32;
6452 		pasn->derive_kek = true;
6453 	} else {
6454 		pasn->group = 19;
6455 		pasn->cipher = WPA_CIPHER_CCMP;
6456 		pasn->kek_len = 16;
6457 		pasn->derive_kek = true;
6458 	}
6459 
6460 	if (!derive_kek) {
6461 		pasn->derive_kek = false;
6462 		pasn->kek_len = 0;
6463 	}
6464 
6465 	if (dev->password[0]) {
6466 		pasn->akmp = WPA_KEY_MGMT_SAE;
6467 		p2p_pairing_set_password(pasn,
6468 					 p2p->cfg->pairing_config.pasn_type,
6469 					 dev->password);
6470 	} else if (verify) {
6471 		pasn->akmp = WPA_KEY_MGMT_SAE;
6472 		if (p2p->cfg->set_pmksa)
6473 			p2p->cfg->set_pmksa(p2p->cfg->cb_ctx,
6474 					    dev->info.p2p_device_addr,
6475 					    dev->info.dik_id);
6476 	} else {
6477 		pasn->akmp = WPA_KEY_MGMT_PASN;
6478 	}
6479 
6480 	pasn->rsn_pairwise = pasn->cipher;
6481 	pasn->wpa_key_mgmt = pasn->akmp;
6482 
6483 	rsnxe = p2p_pairing_generate_rsnxe(p2p, pasn->akmp);
6484 	if (rsnxe) {
6485 		os_free(pasn->rsnxe_ie);
6486 		pasn->rsnxe_ie = os_memdup(wpabuf_head_u8(rsnxe),
6487 					   wpabuf_len(rsnxe));
6488 		if (!pasn->rsnxe_ie) {
6489 			wpabuf_free(rsnxe);
6490 			return;
6491 		}
6492 		wpabuf_free(rsnxe);
6493 	}
6494 
6495 	if (dev->role == P2P_ROLE_PAIRING_INITIATOR)
6496 		pasn->pmksa = p2p->initiator_pmksa;
6497 	else
6498 		pasn->pmksa = p2p->responder_pmksa;
6499 
6500 	pasn->cb_ctx = p2p->cfg->cb_ctx;
6501 	pasn->send_mgmt = p2p->cfg->pasn_send_mgmt;
6502 	pasn->prepare_data_element = p2p->cfg->prepare_data_element;
6503 	pasn->parse_data_element = p2p->cfg->parse_data_element;
6504 	pasn->validate_custom_pmkid = p2p->cfg->pasn_validate_pmkid;
6505 
6506 	pasn->freq = freq;
6507 }
6508 
6509 
p2p_get_listen_freq(struct p2p_data * p2p,const u8 * peer_addr)6510 int p2p_get_listen_freq(struct p2p_data *p2p, const u8 *peer_addr)
6511 {
6512 	int freq;
6513 	struct p2p_device *dev;
6514 
6515 	if (!peer_addr) {
6516 		p2p_dbg(p2p, "Peer address NULL");
6517 		return -1;
6518 	}
6519 
6520 	dev = p2p_get_device(p2p, peer_addr);
6521 	if (!dev) {
6522 		p2p_dbg(p2p, "Peer not known");
6523 		return -1;
6524 	}
6525 
6526 	freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
6527 	if (freq <= 0)
6528 		freq = dev->oob_go_neg_freq;
6529 	if (freq <= 0) {
6530 		p2p_dbg(p2p, "No listen/operating frequency known for the peer "
6531 			MACSTR, MAC2STR(dev->info.p2p_device_addr));
6532 		return -1;
6533 	}
6534 	return freq;
6535 }
6536 
6537 
p2p_initiate_pasn_verify(struct p2p_data * p2p,const u8 * peer_addr,int freq,enum p2p_invite_role role,const u8 * bssid,const u8 * ssid,size_t ssid_len,unsigned int force_freq,const u8 * go_dev_addr,unsigned int pref_freq)6538 int p2p_initiate_pasn_verify(struct p2p_data *p2p, const u8 *peer_addr,
6539 			     int freq, enum p2p_invite_role role,
6540 			     const u8 *bssid, const u8 *ssid, size_t ssid_len,
6541 			     unsigned int force_freq, const u8 *go_dev_addr,
6542 			     unsigned int pref_freq)
6543 {
6544 	struct pasn_data *pasn;
6545 	struct p2p_device *dev;
6546 	struct wpabuf *extra_ies, *req;
6547 	int ret = 0;
6548 	u8 *pasn_extra_ies = NULL;
6549 	u8 pmkid[PMKID_LEN];
6550 
6551 	if (!peer_addr) {
6552 		p2p_dbg(p2p, "Peer address NULL");
6553 		return -1;
6554 	}
6555 
6556 	dev = p2p_get_device(p2p, peer_addr);
6557 	if (!dev) {
6558 		p2p_dbg(p2p, "Peer not known");
6559 		return -1;
6560 	}
6561 
6562 	if (p2p_invite(p2p, peer_addr, role, bssid, ssid, ssid_len, force_freq,
6563 		       go_dev_addr, 1, pref_freq, -1, 1)) {
6564 		p2p_dbg(p2p, "p2p_invite() failed");
6565 		return -1;
6566 	}
6567 
6568 	dev->role = P2P_ROLE_PAIRING_INITIATOR;
6569 	p2p_pasn_initialize(p2p, dev, peer_addr, freq, true, true);
6570 	pasn = dev->pasn;
6571 
6572 	req = p2p_build_invitation_req(p2p, dev, go_dev_addr, -1);
6573 	if (!req)
6574 		return -1;
6575 
6576 	p2p_set_state(p2p, P2P_INVITE);
6577 	p2p->pending_action_state = P2P_PENDING_INVITATION_REQUEST;
6578 	p2p->invite_peer = dev;
6579 	dev->invitation_reqs++;
6580 
6581 	extra_ies = wpabuf_alloc(1500);
6582 	if (!extra_ies) {
6583 		wpabuf_free(req);
6584 		p2p_dbg(p2p, "Memory allocation failed for extra_ies");
6585 		return -1;
6586 	}
6587 
6588 	if (os_get_random(pmkid, PMKID_LEN) < 0) {
6589 		wpabuf_free(req);
6590 		wpabuf_free(extra_ies);
6591 		return -1;
6592 	}
6593 	wpa_hexdump(MSG_DEBUG,
6594 		    "P2P2: Use new random PMKID for pairing verification",
6595 		    pmkid, PMKID_LEN);
6596 	pasn_set_custom_pmkid(pasn, pmkid);
6597 
6598 	if (p2p_prepare_pasn_extra_ie(p2p, extra_ies, req, true)) {
6599 		p2p_dbg(p2p, "Prepare PASN extra IEs failed");
6600 		ret = -1;
6601 		goto out;
6602 	}
6603 
6604 	extra_ies = p2p_pasn_service_hash(p2p, extra_ies);
6605 	if (!extra_ies)
6606 		goto out;
6607 
6608 	pasn_extra_ies = os_memdup(wpabuf_head_u8(extra_ies),
6609 				   wpabuf_len(extra_ies));
6610 	if (!pasn_extra_ies) {
6611 		p2p_dbg(p2p, "Memory allocation failed for PASN extra IEs");
6612 		ret = -1;
6613 		goto out;
6614 	}
6615 
6616 	pasn->extra_ies = pasn_extra_ies;
6617 	pasn->extra_ies_len = wpabuf_len(extra_ies);
6618 
6619 	/* Start PASN verify */
6620 	if (wpa_pasn_verify(pasn, pasn->own_addr, pasn->peer_addr, pasn->bssid,
6621 			    pasn->akmp, pasn->cipher, pasn->group, pasn->freq,
6622 			    NULL, 0, NULL, 0, NULL)) {
6623 		p2p_dbg(p2p, "PASN verify failed");
6624 		ret = -1;
6625 	} else {
6626 		dev->flags |= P2P_DEV_WAIT_INV_REQ_ACK;
6627 	}
6628 out:
6629 	pasn->extra_ies = NULL;
6630 	pasn->extra_ies_len = 0;
6631 	os_free(pasn_extra_ies);
6632 	wpabuf_free(req);
6633 	wpabuf_free(extra_ies);
6634 	return ret;
6635 }
6636 
6637 
p2p_initiate_pasn_auth(struct p2p_data * p2p,const u8 * addr,int freq)6638 int p2p_initiate_pasn_auth(struct p2p_data *p2p, const u8 *addr, int freq)
6639 {
6640 	struct pasn_data *pasn;
6641 	struct p2p_device *dev;
6642 	struct wpabuf *extra_ies, *req;
6643 	u8 *ies = NULL;
6644 	int ret = 0;
6645 	size_t ies_len;
6646 
6647 	if (!addr) {
6648 		p2p_dbg(p2p, "Peer address NULL");
6649 		return -1;
6650 	}
6651 
6652 	dev = p2p_get_device(p2p, addr);
6653 	if (!dev) {
6654 		p2p_dbg(p2p, "Peer not known");
6655 		return -1;
6656 	}
6657 
6658 	if (freq == 0)
6659 		freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
6660 
6661 	dev->role = P2P_ROLE_PAIRING_INITIATOR;
6662 	p2p_pasn_initialize(p2p, dev, addr, freq, false, true);
6663 	pasn = dev->pasn;
6664 
6665 	pasn_initiator_pmksa_cache_remove(pasn->pmksa, (u8 *)addr);
6666 
6667 	req = p2p_build_go_neg_req(p2p, dev);
6668 	if (!req)
6669 		return -1;
6670 
6671 	p2p->go_neg_peer = dev;
6672 	dev->flags |= P2P_DEV_WAIT_GO_NEG_RESPONSE;
6673 
6674 	extra_ies = wpabuf_alloc(1500);
6675 	if (!extra_ies) {
6676 		wpabuf_free(req);
6677 		return -1;
6678 	}
6679 
6680 	if (p2p_prepare_pasn_extra_ie(p2p, extra_ies, req, false)) {
6681 		p2p_dbg(p2p, "Failed to prepare PASN extra elements");
6682 		ret = -1;
6683 		goto out;
6684 	}
6685 
6686 	extra_ies = p2p_pasn_service_hash(p2p, extra_ies);
6687 	if (!extra_ies)
6688 		goto out;
6689 
6690 	ies_len = wpabuf_len(extra_ies);
6691 	ies = os_memdup(wpabuf_head_u8(extra_ies), ies_len);
6692 	if (!ies) {
6693 		ret = -1;
6694 		goto out;
6695 	}
6696 
6697 	pasn->extra_ies = ies;
6698 	pasn->extra_ies_len = ies_len;
6699 
6700 	/* Start PASN authentication */
6701 	if (wpas_pasn_start(pasn, pasn->own_addr, pasn->peer_addr, pasn->bssid,
6702 			    pasn->akmp, pasn->cipher, pasn->group, pasn->freq,
6703 			    NULL, 0, NULL, 0, NULL)) {
6704 		p2p_dbg(p2p, "Failed to start PASN");
6705 		ret = -1;
6706 	}
6707 out:
6708 	os_free(ies);
6709 	pasn->extra_ies = NULL;
6710 	pasn->extra_ies_len = 0;
6711 	wpabuf_free(req);
6712 	wpabuf_free(extra_ies);
6713 	return ret;
6714 }
6715 
6716 
p2p_pasn_handle_action_wrapper(struct p2p_data * p2p,struct p2p_device * dev,const struct ieee80211_mgmt * mgmt,size_t len,int freq,int trans_seq)6717 static int p2p_pasn_handle_action_wrapper(struct p2p_data *p2p,
6718 					  struct p2p_device *dev,
6719 					  const struct ieee80211_mgmt *mgmt,
6720 					  size_t len, int freq, int trans_seq)
6721 {
6722 	const u8 *ies;
6723 	size_t ies_len;
6724 	size_t data_len = 0;
6725 	bool derive_kek;
6726 	const u8 *data = NULL;
6727 	struct p2p_message msg;
6728 	struct ieee802_11_elems elems;
6729 
6730 	ies = mgmt->u.auth.variable;
6731 	ies_len = len - offsetof(struct ieee80211_mgmt, u.auth.variable);
6732 
6733 	os_memset(&msg, 0, sizeof(msg));
6734 	if (p2p_parse_ies(ies, ies_len, &msg)) {
6735 		p2p_dbg(p2p,
6736 			"Failed to parse P2P IE from PASN Authentication frame");
6737 		p2p_parse_free(&msg);
6738 		return -1;
6739 	}
6740 
6741 	if (msg.action_frame_wrapper && msg.action_frame_wrapper_len) {
6742 		data = msg.action_frame_wrapper;
6743 		data_len = msg.action_frame_wrapper_len;
6744 		if (data_len >= 2 &&
6745 		    data[0] == WLAN_ACTION_PUBLIC &&
6746 		    data[1] == WLAN_PA_VENDOR_SPECIFIC) {
6747 			data += 2;
6748 			data_len -= 2;
6749 			if (data_len < 4 ||
6750 			    WPA_GET_BE32(data) != P2P_IE_VENDOR_TYPE) {
6751 				p2p_parse_free(&msg);
6752 				return -1;
6753 			}
6754 			data += 4;
6755 			data_len -= 4;
6756 		} else {
6757 			p2p_dbg(p2p,
6758 				"Invalid category in Action frame wrapper in Authentication frame seq %d",
6759 				trans_seq);
6760 			p2p_parse_free(&msg);
6761 			return -1;
6762 		}
6763 	}
6764 
6765 	if (trans_seq == WLAN_AUTH_TR_SEQ_PASN_AUTH1) {
6766 		if (ieee802_11_parse_elems(mgmt->u.auth.variable,
6767 					   len - offsetof(struct ieee80211_mgmt,
6768 							  u.auth.variable),
6769 					   &elems, 0) == ParseFailed) {
6770 			wpa_printf(MSG_DEBUG,
6771 				   "PASN: Failed parsing Authentication frame");
6772 			return -1;
6773 		}
6774 		derive_kek = ieee802_11_rsnx_capab_len(
6775 			elems.rsnxe, elems.rsnxe_len,
6776 			WLAN_RSNX_CAPAB_KEK_IN_PASN);
6777 		if (data && data_len >= 1 && data[0] == P2P_INVITATION_REQ) {
6778 			struct wpabuf *resp;
6779 
6780 			resp = p2p_process_invitation_req(p2p, mgmt->sa,
6781 							  data + 1,
6782 							  data_len - 1, freq,
6783 							  true);
6784 			if (!resp)
6785 				p2p_dbg(p2p, "No Invitation Response found");
6786 
6787 			dev->role = P2P_ROLE_PAIRING_RESPONDER;
6788 			p2p_pasn_initialize(p2p, dev, mgmt->sa, freq, true,
6789 					    derive_kek);
6790 			wpabuf_free(dev->action_frame_wrapper);
6791 			dev->action_frame_wrapper = resp;
6792 			if (msg.dira && msg.dira_len &&
6793 			    p2p_validate_dira(p2p, dev, msg.dira,
6794 					      msg.dira_len)) {
6795 				struct wpa_ie_data rsn_data;
6796 
6797 				if (p2p->cfg->set_pmksa)
6798 					p2p->cfg->set_pmksa(
6799 						p2p->cfg->cb_ctx,
6800 						dev->info.p2p_device_addr,
6801 						dev->info.dik_id);
6802 
6803 				if (wpa_parse_wpa_ie_rsn(elems.rsn_ie - 2,
6804 							 elems.rsn_ie_len + 2,
6805 							 &rsn_data) == 0 &&
6806 				    rsn_data.num_pmkid)
6807 					pasn_set_custom_pmkid(dev->pasn,
6808 							      rsn_data.pmkid);
6809 			}
6810 		} else if (data && data_len >= 1 && data[0] == P2P_GO_NEG_REQ) {
6811 			struct wpabuf *resp;
6812 
6813 			if (!derive_kek) {
6814 				p2p_dbg(p2p, "KEK-in-PASN not set in RSNXE");
6815 				return -1;
6816 			}
6817 			resp = p2p_process_go_neg_req(p2p, mgmt->sa, data + 1,
6818 						      data_len - 1, freq, true);
6819 			if (!resp)
6820 				p2p_dbg(p2p,
6821 					"No GO Negotiation Response found");
6822 			wpabuf_free(dev->action_frame_wrapper);
6823 			dev->action_frame_wrapper = resp;
6824 		} else {
6825 			p2p_dbg(p2p, "Invalid action frame wrapper in Auth1");
6826 		}
6827 	} else if (trans_seq == WLAN_AUTH_TR_SEQ_PASN_AUTH2) {
6828 		if (data && data_len >= 1 && data[0] == P2P_INVITATION_RESP) {
6829 			p2p_process_invitation_resp(p2p, mgmt->sa, data + 1,
6830 						    data_len - 1);
6831 			wpabuf_free(dev->action_frame_wrapper);
6832 			dev->action_frame_wrapper = NULL;
6833 		} else if (data && data_len >= 1 &&
6834 			   data[0] == P2P_GO_NEG_RESP) {
6835 			struct wpabuf *conf;
6836 
6837 			conf = p2p_process_go_neg_resp(p2p, mgmt->sa, data + 1,
6838 						       data_len - 1, freq,
6839 						       true);
6840 			if (!conf)
6841 				p2p_dbg(p2p, "No GO Negotiation Confirm found");
6842 			wpabuf_free(dev->action_frame_wrapper);
6843 			dev->action_frame_wrapper = conf;
6844 		} else {
6845 			p2p_dbg(p2p, "Invalid action frame wrapper in Auth2");
6846 		}
6847 	} else if (trans_seq == WLAN_AUTH_TR_SEQ_PASN_AUTH3) {
6848 		if (data && data_len >= 1 && data[0] == P2P_GO_NEG_CONF)
6849 			p2p_handle_go_neg_conf(p2p, mgmt->sa, data + 1,
6850 					       data_len - 1, true);
6851 		else
6852 			p2p_invitation_resp_cb(p2p, mgmt->sa,
6853 					       P2P_SEND_ACTION_SUCCESS);
6854 	}
6855 	p2p_parse_free(&msg);
6856 	return 0;
6857 }
6858 
6859 
p2p_pasn_add_encrypted_data(struct p2p_data * p2p,struct p2p_device * dev,struct wpabuf * buf)6860 static int p2p_pasn_add_encrypted_data(struct p2p_data *p2p,
6861 				       struct p2p_device *dev,
6862 				       struct wpabuf *buf)
6863 {
6864 	struct pasn_data *pasn;
6865 	struct wpabuf *p2p2_ie;
6866 	u8 *dika_len, *p2p2_ie_len;
6867 	int ret;
6868 
6869 	if (!p2p || !dev || !dev->pasn)
6870 		return 0;
6871 
6872 	pasn = dev->pasn;
6873 
6874 	if (dev->req_bootstrap_method != P2P_PBMA_OPPORTUNISTIC &&
6875 	    !p2p->pairing_info->enable_pairing_cache)
6876 		return 0;
6877 
6878 	p2p2_ie = wpabuf_alloc(100);
6879 	if (!p2p2_ie)
6880 		return -1;
6881 
6882 	p2p2_ie_len = p2p_buf_add_p2p2_ie_hdr(p2p2_ie);
6883 
6884 	if (p2p->pairing_info->enable_pairing_cache) {
6885 		wpabuf_put_u8(p2p2_ie, P2P_ATTR_DEVICE_IDENTITY_KEY);
6886 		dika_len = wpabuf_put(p2p2_ie, 2);
6887 
6888 		wpabuf_put_u8(p2p2_ie,
6889 			      p2p->pairing_info->dev_ik.cipher_version);
6890 		wpabuf_put_data(p2p2_ie, p2p->pairing_info->dev_ik.dik_data,
6891 				p2p->pairing_info->dev_ik.dik_len);
6892 		wpabuf_put_be32(p2p2_ie, p2p->pairing_info->dev_ik.expiration);
6893 
6894 		WPA_PUT_LE16(dika_len,
6895 			     (u8 *) wpabuf_put(p2p2_ie, 0) - dika_len - 2);
6896 	}
6897 
6898 	if (dev->req_bootstrap_method == P2P_PBMA_OPPORTUNISTIC) {
6899 		if (!p2p->dev_sae_password[0]) {
6900 			int password_len;
6901 
6902 			/* SAE password is not available as the request is not
6903 			 * for an existing GO. Pick a random SAE password of
6904 			 * length between 10 and 20. */
6905 			password_len = 10 + os_random() % 10;
6906 			if (p2p_random(p2p->dev_sae_password,
6907 				       password_len) < 0) {
6908 				wpabuf_free(p2p2_ie);
6909 				return -1;
6910 			}
6911 			p2p->dev_sae_password[password_len] = '\0';
6912 		}
6913 
6914 		wpabuf_put_u8(p2p2_ie, P2P_ATTR_PASSWORD);
6915 		wpabuf_put_le16(p2p2_ie, os_strlen(p2p->dev_sae_password));
6916 		wpabuf_put_str(p2p2_ie, p2p->dev_sae_password);
6917 	}
6918 
6919 	p2p_buf_update_ie_hdr(p2p2_ie, p2p2_ie_len);
6920 
6921 	ret = pasn_add_encrypted_data(pasn, buf, wpabuf_mhead_u8(p2p2_ie),
6922 				      wpabuf_len(p2p2_ie));
6923 	wpabuf_free(p2p2_ie);
6924 	return ret;
6925 }
6926 
6927 
p2p_prepare_data_element(struct p2p_data * p2p,const u8 * peer_addr)6928 int p2p_prepare_data_element(struct p2p_data *p2p, const u8 *peer_addr)
6929 {
6930 	int ret = -1;
6931 	struct p2p_device *dev;
6932 	struct pasn_data *pasn;
6933 	struct wpabuf *extra_ies;
6934 
6935 	if (!p2p)
6936 		return -1;
6937 
6938 	dev = p2p_get_device(p2p, peer_addr);
6939 	if (!dev || !dev->pasn) {
6940 		p2p_dbg(p2p, "PASN: Peer not found " MACSTR,
6941 			MAC2STR(peer_addr));
6942 		return -1;
6943 	}
6944 	pasn = dev->pasn;
6945 
6946 	extra_ies = wpabuf_alloc(1500);
6947 	if (!extra_ies ||
6948 	    p2p_prepare_pasn_extra_ie(p2p, extra_ies,
6949 				      dev->action_frame_wrapper, false)) {
6950 		p2p_dbg(p2p, "Failed to prepare PASN extra elements");
6951 		goto out;
6952 	}
6953 
6954 	if (p2p_pasn_add_encrypted_data(p2p, dev, extra_ies) < 0)
6955 		p2p_dbg(p2p, "Failed to add PASN encrypted elements");
6956 
6957 	ret = pasn_set_extra_ies(pasn, wpabuf_head_u8(extra_ies),
6958 				 wpabuf_len(extra_ies));
6959 
6960 out:
6961 	wpabuf_free(extra_ies);
6962 	wpabuf_free(dev->action_frame_wrapper);
6963 	dev->action_frame_wrapper = NULL;
6964 
6965 	return ret;
6966 }
6967 
6968 
p2p_parse_data_element(struct p2p_data * p2p,const u8 * data,size_t len)6969 int p2p_parse_data_element(struct p2p_data *p2p, const u8 *data, size_t len)
6970 {
6971 	u8 attr_id;
6972 	const u8 *pos, *next;
6973 	u16 rem_len, attr_len;
6974 
6975 	if (!p2p || !data || !len)
6976 		return -1;
6977 
6978 	pos = data;
6979 	rem_len = len;
6980 
6981 	if (rem_len < 6 ||
6982 	    pos[0] != WLAN_EID_VENDOR_SPECIFIC ||
6983 	    pos[1] < 4 ||
6984 	    rem_len < 2 + pos[1] ||
6985 	    WPA_GET_BE32(&pos[2]) != P2P2_IE_VENDOR_TYPE) {
6986 		p2p_dbg(p2p,
6987 			"P2P: P2P2 IE not present in PASN Encrypted Data element");
6988 		return -1;
6989 	}
6990 
6991 	pos += 6;
6992 	rem_len -= 6;
6993 
6994 	while (rem_len >= 3) {
6995 		attr_id = *pos++;
6996 		attr_len = WPA_GET_LE16(pos);
6997 		pos += 2;
6998 		rem_len -= 3;
6999 		if (rem_len < attr_len)
7000 			return -1;
7001 		next = pos + attr_len;
7002 		rem_len -= attr_len;
7003 
7004 		switch (attr_id) {
7005 		case P2P_ATTR_DEVICE_IDENTITY_KEY:
7006 			if (attr_len < 1) {
7007 				p2p_dbg(p2p,
7008 					"Too short Device Identity Key attribute");
7009 				return -1;
7010 			}
7011 			p2p->dik_cipher_version = *pos++;
7012 			attr_len--;
7013 			if (p2p->dik_cipher_version ==
7014 			    DIRA_CIPHER_VERSION_128) {
7015 				if (attr_len < DEVICE_IDENTITY_KEY_LEN) {
7016 					p2p_dbg(p2p, "Too short DevIK");
7017 					return -1;
7018 				}
7019 				os_memcpy(p2p->peer_dik_data, pos,
7020 					  DEVICE_IDENTITY_KEY_LEN);
7021 				p2p->peer_dik_len = DEVICE_IDENTITY_KEY_LEN;
7022 				pos += DEVICE_IDENTITY_KEY_LEN;
7023 				attr_len -= DEVICE_IDENTITY_KEY_LEN;
7024 			} else {
7025 				p2p_dbg(p2p,
7026 					"Unsupported cipher version %u in Device Identity Key attribute",
7027 					p2p->dik_cipher_version);
7028 				return -1;
7029 			}
7030 			if (attr_len < 4) {
7031 				p2p_dbg(p2p,
7032 					"Not enough room for DevIK lifetime");
7033 				return -1;
7034 			}
7035 			p2p->peer_dik_lifetime = WPA_GET_BE32(pos);
7036 			p2p_dbg(p2p,
7037 				"Received peer DevIK of length %zu octets and lifetime %u",
7038 				p2p->peer_dik_len, p2p->peer_dik_lifetime);
7039 			break;
7040 		case P2P_ATTR_PASSWORD:
7041 			if (attr_len < 1 ||
7042 			    attr_len > sizeof(p2p->peer_sae_password) - 1) {
7043 				p2p_dbg(p2p,
7044 					"P2P: Invalid password length %d",
7045 					attr_len);
7046 				return -1;
7047 			}
7048 			os_memset(p2p->peer_sae_password, 0,
7049 				  sizeof(p2p->peer_sae_password));
7050 			os_memcpy(p2p->peer_sae_password, pos, attr_len);
7051 			break;
7052 		default:
7053 			p2p_dbg(p2p,
7054 				"Unsupported Attribute ID %u in P2P2 IE in PASN Encrypted Data element",
7055 				attr_id);
7056 			break;
7057 		}
7058 		pos = next;
7059 	}
7060 
7061 	return 0;
7062 }
7063 
7064 
p2p_validate_custom_pmkid(struct p2p_data * p2p,struct p2p_device * dev,const u8 * pmkid)7065 static int p2p_validate_custom_pmkid(struct p2p_data *p2p,
7066 				     struct p2p_device *dev, const u8 *pmkid)
7067 {
7068 	if (dev->pasn->custom_pmkid_valid &&
7069 	    os_memcmp(dev->pasn->custom_pmkid, pmkid, PMKID_LEN) == 0) {
7070 		p2p_dbg(p2p, "Customized PMKID valid");
7071 		return 0;
7072 	}
7073 	return -1;
7074 }
7075 
7076 
p2p_pasn_pmksa_get_pmk(struct p2p_data * p2p,const u8 * addr,u8 * pmkid,u8 * pmk,size_t * pmk_len)7077 static int p2p_pasn_pmksa_get_pmk(struct p2p_data *p2p, const u8 *addr,
7078 				  u8 *pmkid, u8 *pmk, size_t *pmk_len)
7079 {
7080 	struct p2p_device *dev;
7081 
7082 	dev = p2p_get_device(p2p, addr);
7083 	if (!dev) {
7084 		p2p_dbg(p2p, "PASN: Peer not found " MACSTR, MAC2STR(addr));
7085 		return -1;
7086 	}
7087 
7088 	if (dev->role == P2P_ROLE_PAIRING_INITIATOR)
7089 		return pasn_initiator_pmksa_cache_get(p2p->initiator_pmksa,
7090 						      addr, pmkid, pmk,
7091 						      pmk_len);
7092 	else
7093 		return pasn_responder_pmksa_cache_get(p2p->responder_pmksa,
7094 						      addr, pmkid, pmk,
7095 						      pmk_len);
7096 }
7097 
7098 
p2p_pasn_validate_and_update_pmkid(struct p2p_data * p2p,const u8 * addr,const u8 * rsn_pmkid)7099 int p2p_pasn_validate_and_update_pmkid(struct p2p_data *p2p, const u8 *addr,
7100 				       const u8 *rsn_pmkid)
7101 {
7102 	size_t pmk_len;
7103 	u8 pmkid[PMKID_LEN];
7104 	u8 pmk[PMK_LEN_MAX];
7105 	struct p2p_device *dev;
7106 
7107 	if (!p2p)
7108 		return -1;
7109 
7110 	dev = p2p_get_device(p2p, addr);
7111 	if (!dev || !dev->pasn) {
7112 		p2p_dbg(p2p, "P2P PASN: Peer not found " MACSTR,
7113 			MAC2STR(addr));
7114 		return -1;
7115 	}
7116 
7117 	if (p2p_validate_custom_pmkid(p2p, dev, rsn_pmkid))
7118 		return -1;
7119 
7120 	if (p2p_pasn_pmksa_get_pmk(p2p, addr, pmkid, pmk, &pmk_len)) {
7121 		p2p_dbg(p2p, "P2P PASN: Failed to get PMK from cache");
7122 		return -1;
7123 	}
7124 
7125 	p2p_pasn_pmksa_set_pmk(p2p, p2p->cfg->dev_addr, addr, pmk, pmk_len,
7126 			       rsn_pmkid);
7127 	return 0;
7128 }
7129 
7130 
p2p_pasn_auth_tx_status(struct p2p_data * p2p,const u8 * data,size_t data_len,bool acked,bool verify)7131 int p2p_pasn_auth_tx_status(struct p2p_data *p2p, const u8 *data,
7132 			    size_t data_len, bool acked, bool verify)
7133 {
7134 	int ret = 0;
7135 	struct p2p_device *dev;
7136 	struct pasn_data *pasn;
7137 	const struct ieee80211_mgmt *mgmt =
7138 		(const struct ieee80211_mgmt *) data;
7139 
7140 	if (!p2p)
7141 		return -1;
7142 
7143 	dev = p2p_get_device(p2p, mgmt->da);
7144 	if (!dev || !dev->pasn) {
7145 		p2p_dbg(p2p, "P2P PASN: Peer not found " MACSTR,
7146 			MAC2STR(mgmt->da));
7147 		return -1;
7148 	}
7149 
7150 	pasn = dev->pasn;
7151 
7152 	ret = wpa_pasn_auth_tx_status(pasn, data, data_len, acked);
7153 	if (ret == 2 && pasn->frame)
7154 		return pasn->send_mgmt(pasn->cb_ctx, wpabuf_head(pasn->frame),
7155 				       wpabuf_len(pasn->frame), 0, pasn->freq,
7156 				       1000);
7157 
7158 	wpabuf_free(pasn->frame);
7159 	pasn->frame = NULL;
7160 
7161 	if (ret != 1)
7162 		return ret;
7163 
7164 	if (verify && dev == p2p->invite_peer)
7165 		p2p_start_invitation_connect(p2p, dev);
7166 	else if (dev == p2p->go_neg_peer)
7167 		p2p_go_complete(p2p, dev);
7168 
7169 	return 0;
7170 }
7171 
7172 
p2p_handle_pasn_auth(struct p2p_data * p2p,struct p2p_device * dev,const struct ieee80211_mgmt * mgmt,size_t len,int freq)7173 static int p2p_handle_pasn_auth(struct p2p_data *p2p, struct p2p_device *dev,
7174 				const struct ieee80211_mgmt *mgmt, size_t len,
7175 				int freq)
7176 {
7177 	struct pasn_data *pasn;
7178 	u8 pasn_type;
7179 	int pasn_groups[4] = { 0 };
7180 	u16 auth_alg, auth_transaction, status_code;
7181 
7182 	if (!p2p || !dev || !dev->pasn)
7183 		return -1;
7184 
7185 	if (os_memcmp(mgmt->da, p2p->cfg->dev_addr, ETH_ALEN) != 0) {
7186 		p2p_dbg(p2p, "PASN Responder: Not our frame");
7187 		return -1;
7188 	}
7189 
7190 	if (len < offsetof(struct ieee80211_mgmt, u.auth.variable))
7191 		return -1;
7192 
7193 	pasn = dev->pasn;
7194 	auth_alg = le_to_host16(mgmt->u.auth.auth_alg);
7195 	status_code = le_to_host16(mgmt->u.auth.status_code);
7196 
7197 	auth_transaction = le_to_host16(mgmt->u.auth.auth_transaction);
7198 
7199 	if (status_code != WLAN_STATUS_SUCCESS &&
7200 	    status_code != WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY) {
7201 		p2p_dbg(p2p, "PASN: Authentication rejected - status=%u",
7202 			status_code);
7203 		return -1;
7204 	}
7205 
7206 	if (auth_alg != WLAN_AUTH_PASN ||
7207 	    auth_transaction == WLAN_AUTH_TR_SEQ_PASN_AUTH2) {
7208 		p2p_dbg(p2p,
7209 			"PASN Responder: Not a PASN frame or unexpected Authentication frame, auth_alg=%d",
7210 			auth_alg);
7211 		return -1;
7212 	}
7213 	if (auth_transaction == WLAN_AUTH_TR_SEQ_PASN_AUTH1) {
7214 		pasn_type = p2p->cfg->pairing_config.pasn_type;
7215 		if (pasn_type & 0xc && pasn_type & 0x3) {
7216 			pasn_groups[0] = 20;
7217 			pasn_groups[1] = 19;
7218 		} else if (pasn_type & 0xc) {
7219 			pasn_groups[0] = 20;
7220 		} else {
7221 			pasn_groups[0] = 19;
7222 		}
7223 		os_free(pasn->pasn_groups);
7224 		pasn->pasn_groups = int_array_dup(pasn_groups);
7225 
7226 		if (p2p_pasn_handle_action_wrapper(p2p, dev, mgmt, len, freq,
7227 						   auth_transaction)) {
7228 			p2p_dbg(p2p,
7229 				"PASN Responder: Handle Auth 1 action wrapper failed");
7230 			return -1;
7231 		}
7232 		if (handle_auth_pasn_1(pasn, p2p->cfg->dev_addr, mgmt->sa, mgmt,
7233 				       len, false) < 0) {
7234 			p2p_dbg(p2p,
7235 				"PASN Responder: Handle Auth 1 failed");
7236 			return -1;
7237 		}
7238 	} else if (auth_transaction == WLAN_AUTH_TR_SEQ_PASN_AUTH3) {
7239 		if (handle_auth_pasn_3(pasn, p2p->cfg->dev_addr, mgmt->sa, mgmt,
7240 				       len) < 0) {
7241 			p2p_dbg(p2p,
7242 				"PASN Responder: Handle Auth 3 failed");
7243 			return -1;
7244 		}
7245 #ifdef CONFIG_TESTING_OPTIONS
7246 		p2p_pasn_store_ptk(p2p, &pasn->ptk);
7247 #endif /* CONFIG_TESTING_OPTIONS */
7248 		if (p2p_pasn_handle_action_wrapper(p2p, dev, mgmt, len, freq,
7249 						   auth_transaction)) {
7250 			p2p_dbg(p2p,
7251 				"PASN Responder: Handle Auth 3 action wrapper failed");
7252 			/* Drop keying material from a failed pairing attempt */
7253 			os_memset(p2p->peer_dik_data, 0,
7254 				  sizeof(p2p->peer_dik_data));
7255 			os_memset(p2p->peer_sae_password, 0,
7256 				  sizeof(p2p->peer_sae_password));
7257 			return -1;
7258 		}
7259 		forced_memzero(pasn_get_ptk(pasn), sizeof(pasn->ptk));
7260 	}
7261 	return 0;
7262 }
7263 
7264 
p2p_pasn_auth_rx(struct p2p_data * p2p,const struct ieee80211_mgmt * mgmt,size_t len,int freq)7265 int p2p_pasn_auth_rx(struct p2p_data *p2p, const struct ieee80211_mgmt *mgmt,
7266 		     size_t len, int freq)
7267 {
7268 	int ret = 0;
7269 	u8 auth_transaction;
7270 	struct p2p_device *dev;
7271 	struct pasn_data *pasn;
7272 	struct wpa_pasn_params_data pasn_data;
7273 
7274 	dev = p2p_get_device(p2p, mgmt->sa);
7275 	if (!dev) {
7276 		p2p_dbg(p2p, "PASN: Peer not found " MACSTR,
7277 			MAC2STR(mgmt->sa));
7278 		return -1;
7279 	}
7280 
7281 	if (!dev->pasn) {
7282 		dev->pasn = pasn_data_init();
7283 		if (!dev->pasn) {
7284 			p2p_dbg(p2p, "PASN: Uninitialized");
7285 			return -1;
7286 		}
7287 	}
7288 
7289 	pasn = dev->pasn;
7290 
7291 	wpabuf_free(pasn->frame);
7292 	pasn->frame = NULL;
7293 
7294 	pasn_register_callbacks(pasn, p2p->cfg->cb_ctx,
7295 				p2p->cfg->pasn_send_mgmt,
7296 				p2p->cfg->pasn_validate_pmkid,
7297 				NULL, NULL);
7298 	auth_transaction = le_to_host16(mgmt->u.auth.auth_transaction);
7299 
7300 	if (dev->role == P2P_ROLE_PAIRING_INITIATOR &&
7301 	    auth_transaction == WLAN_AUTH_TR_SEQ_PASN_AUTH2) {
7302 		if (p2p_pasn_handle_action_wrapper(p2p, dev, mgmt, len, freq,
7303 						   auth_transaction)) {
7304 			p2p_dbg(p2p,
7305 				"PASN Initiator: Handle Auth 2 action wrapper failed");
7306 			return -1;
7307 		}
7308 		ret = wpa_pasn_auth_rx(pasn, (const u8 *) mgmt, len,
7309 				       &pasn_data);
7310 		if (ret < 0) {
7311 			p2p_dbg(p2p, "PASN: wpa_pasn_auth_rx() failed");
7312 			dev->role = P2P_ROLE_IDLE;
7313 		}
7314 #ifdef CONFIG_TESTING_OPTIONS
7315 		p2p_pasn_store_ptk(p2p, &pasn->ptk);
7316 #endif /* CONFIG_TESTING_OPTIONS */
7317 		forced_memzero(pasn_get_ptk(pasn), sizeof(pasn->ptk));
7318 	} else {
7319 		ret = p2p_handle_pasn_auth(p2p, dev, mgmt, len, freq);
7320 	}
7321 	return ret;
7322 }
7323 
7324 
p2p_pasn_pmksa_set_pmk(struct p2p_data * p2p,const u8 * src,const u8 * dst,const u8 * pmk,size_t pmk_len,const u8 * pmkid)7325 void p2p_pasn_pmksa_set_pmk(struct p2p_data *p2p, const u8 *src, const u8 *dst,
7326 			    const u8 *pmk, size_t pmk_len, const u8 *pmkid)
7327 {
7328 	pasn_initiator_pmksa_cache_add(p2p->initiator_pmksa, src, dst, pmk,
7329 				       pmk_len, pmkid, WPA_KEY_MGMT_SAE);
7330 	pasn_responder_pmksa_cache_add(p2p->responder_pmksa, src, dst, pmk,
7331 				       pmk_len, pmkid, WPA_KEY_MGMT_SAE);
7332 }
7333 
7334 
7335 #ifdef CONFIG_TESTING_OPTIONS
7336 
p2p_pasn_store_ptk(struct p2p_data * p2p,struct wpa_ptk * ptk)7337 void p2p_pasn_store_ptk(struct p2p_data *p2p, struct wpa_ptk *ptk)
7338 {
7339 	u8 *pos;
7340 
7341 	if (ptk->ptk_len > sizeof(p2p->pasn_ptk)) {
7342 		p2p_dbg(p2p, "P2P PASN PTK exceeds: (len=%ld)", ptk->ptk_len);
7343 		return;
7344 	}
7345 
7346 	pos = p2p->pasn_ptk;
7347 	p2p->pasn_ptk_len = ptk->ptk_len;
7348 	if (ptk->kck_len) {
7349 		os_memcpy(pos, ptk->kck, ptk->kck_len);
7350 		pos += ptk->kck_len;
7351 	}
7352 	if (ptk->kek_len) {
7353 		os_memcpy(pos, ptk->kek, ptk->kek_len);
7354 		pos += ptk->kek_len;
7355 	}
7356 	if (ptk->tk_len) {
7357 		os_memcpy(pos, ptk->tk, ptk->tk_len);
7358 		pos += ptk->tk_len;
7359 	}
7360 	if (ptk->kdk_len) {
7361 		os_memcpy(pos, ptk->kdk, ptk->kdk_len);
7362 		pos += ptk->kdk_len;
7363 	}
7364 }
7365 
7366 
p2p_pasn_get_ptk(struct p2p_data * p2p,const u8 ** buf,size_t * buf_len)7367 int p2p_pasn_get_ptk(struct p2p_data *p2p, const u8 **buf, size_t *buf_len)
7368 {
7369 	if (!p2p || !p2p->pasn_ptk_len)
7370 		return -1;
7371 
7372 	*buf_len = p2p->pasn_ptk_len;
7373 	*buf = p2p->pasn_ptk;
7374 	return 0;
7375 }
7376 
7377 #endif /* CONFIG_TESTING_OPTIONS */
7378 
7379 #endif /* CONFIG_PASN */
7380 
7381 
p2p_get_dira_info(struct p2p_data * p2p,char * buf,size_t buflen)7382 int p2p_get_dira_info(struct p2p_data *p2p, char *buf, size_t buflen)
7383 {
7384 	int res;
7385 	char *pos, *end;
7386 	struct p2p_id_key *dev_ik;
7387 
7388 	if (!p2p->pairing_info ||
7389 	    !p2p->cfg->pairing_config.pairing_capable ||
7390 	    !p2p->cfg->pairing_config.enable_pairing_cache)
7391 		return 0;
7392 
7393 	if (p2p_derive_nonce_tag(p2p))
7394 		return 0;
7395 
7396 	pos = buf;
7397 	end = buf + buflen;
7398 	dev_ik = &p2p->pairing_info->dev_ik;
7399 
7400 	res = os_snprintf(pos, end - pos, MACSTR,
7401 			  MAC2STR(p2p->cfg->dev_addr));
7402 	if (os_snprintf_error(end - pos, res))
7403 		return pos - buf;
7404 	pos += res;
7405 
7406 	res = os_snprintf(pos, end - pos, " ");
7407 	if (os_snprintf_error(end - pos, res))
7408 		return pos - buf;
7409 	pos += res;
7410 
7411 	pos += wpa_snprintf_hex(pos, end - pos, dev_ik->dira_nonce,
7412 				dev_ik->dira_nonce_len);
7413 
7414 	res = os_snprintf(pos, end - pos, " ");
7415 	if (os_snprintf_error(end - pos, res))
7416 		return pos - buf;
7417 	pos += res;
7418 
7419 	pos += wpa_snprintf_hex(pos, end - pos, dev_ik->dira_tag,
7420 				dev_ik->dira_tag_len);
7421 
7422 	res = os_snprintf(pos, end - pos, "\n");
7423 	if (os_snprintf_error(end - pos, res))
7424 		return pos - buf;
7425 	pos += res;
7426 
7427 	return pos - buf;
7428 }
7429