p2p.c revision fb79edc9df1f20461e90e478363d207348213d35
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/ieee802_11_defs.h"
14#include "common/ieee802_11_common.h"
15#include "wps/wps_i.h"
16#include "p2p_i.h"
17#include "p2p.h"
18
19
20static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx);
21static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev);
22static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
23				     const u8 *sa, const u8 *data, size_t len,
24				     int rx_freq);
25static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
26				      const u8 *sa, const u8 *data,
27				      size_t len);
28static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx);
29static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx);
30
31
32/*
33 * p2p_scan recovery timeout
34 *
35 * Many drivers are using 30 second timeout on scan results. Allow a bit larger
36 * timeout for this to avoid hitting P2P timeout unnecessarily.
37 */
38#define P2P_SCAN_TIMEOUT 35
39
40/**
41 * P2P_PEER_EXPIRATION_AGE - Number of seconds after which inactive peer
42 * entries will be removed
43 */
44#ifdef ANDROID_P2P
45#define P2P_PEER_EXPIRATION_AGE 30
46#else
47#define P2P_PEER_EXPIRATION_AGE 300
48#endif
49
50#define P2P_PEER_EXPIRATION_INTERVAL (P2P_PEER_EXPIRATION_AGE / 2)
51
52#ifdef ANDROID_P2P
53int p2p_connection_in_progress(struct p2p_data *p2p)
54{
55	int ret = 0;
56
57	switch (p2p->state) {
58		case P2P_CONNECT:
59		case P2P_CONNECT_LISTEN:
60		case P2P_GO_NEG:
61		case P2P_WAIT_PEER_CONNECT:
62		case P2P_WAIT_PEER_IDLE:
63		case P2P_PROVISIONING:
64		case P2P_INVITE:
65		case P2P_INVITE_LISTEN:
66			ret = 1;
67			break;
68
69		default:
70			wpa_printf(MSG_DEBUG, "p2p_connection_in_progress state %d", p2p->state);
71			ret = 0;
72	}
73
74	return ret;
75}
76#endif
77
78static void p2p_expire_peers(struct p2p_data *p2p)
79{
80	struct p2p_device *dev, *n;
81	struct os_reltime now;
82	size_t i;
83
84	os_get_reltime(&now);
85	dl_list_for_each_safe(dev, n, &p2p->devices, struct p2p_device, list) {
86		if (dev->last_seen.sec + P2P_PEER_EXPIRATION_AGE >= now.sec)
87			continue;
88
89		if (p2p->cfg->go_connected &&
90		    p2p->cfg->go_connected(p2p->cfg->cb_ctx,
91					   dev->info.p2p_device_addr)) {
92			/*
93			 * We are connected as a client to a group in which the
94			 * peer is the GO, so do not expire the peer entry.
95			 */
96			os_get_reltime(&dev->last_seen);
97			continue;
98		}
99
100		for (i = 0; i < p2p->num_groups; i++) {
101			if (p2p_group_is_client_connected(
102				    p2p->groups[i], dev->info.p2p_device_addr))
103				break;
104		}
105		if (i < p2p->num_groups) {
106			/*
107			 * The peer is connected as a client in a group where
108			 * we are the GO, so do not expire the peer entry.
109			 */
110			os_get_reltime(&dev->last_seen);
111			continue;
112		}
113
114#ifdef ANDROID_P2P
115		/* If Connection is in progress, don't expire the peer
116		*/
117		if (p2p_connection_in_progress(p2p))
118			continue;
119#endif
120
121		p2p_dbg(p2p, "Expiring old peer entry " MACSTR,
122			MAC2STR(dev->info.p2p_device_addr));
123
124#ifdef ANDROID_P2P
125		/* SD_FAIR_POLICY: Update the current sd_dev_list pointer to next device */
126		if(&dev->list == p2p->sd_dev_list)
127			p2p->sd_dev_list = dev->list.next;
128#endif
129		dl_list_del(&dev->list);
130		p2p_device_free(p2p, dev);
131	}
132}
133
134
135static void p2p_expiration_timeout(void *eloop_ctx, void *timeout_ctx)
136{
137	struct p2p_data *p2p = eloop_ctx;
138	p2p_expire_peers(p2p);
139	eloop_register_timeout(P2P_PEER_EXPIRATION_INTERVAL, 0,
140			       p2p_expiration_timeout, p2p, NULL);
141}
142
143
144static const char * p2p_state_txt(int state)
145{
146	switch (state) {
147	case P2P_IDLE:
148		return "IDLE";
149	case P2P_SEARCH:
150		return "SEARCH";
151	case P2P_CONNECT:
152		return "CONNECT";
153	case P2P_CONNECT_LISTEN:
154		return "CONNECT_LISTEN";
155	case P2P_GO_NEG:
156		return "GO_NEG";
157	case P2P_LISTEN_ONLY:
158		return "LISTEN_ONLY";
159	case P2P_WAIT_PEER_CONNECT:
160		return "WAIT_PEER_CONNECT";
161	case P2P_WAIT_PEER_IDLE:
162		return "WAIT_PEER_IDLE";
163	case P2P_SD_DURING_FIND:
164		return "SD_DURING_FIND";
165	case P2P_PROVISIONING:
166		return "PROVISIONING";
167	case P2P_PD_DURING_FIND:
168		return "PD_DURING_FIND";
169	case P2P_INVITE:
170		return "INVITE";
171	case P2P_INVITE_LISTEN:
172		return "INVITE_LISTEN";
173	default:
174		return "?";
175	}
176}
177
178
179const char * p2p_get_state_txt(struct p2p_data *p2p)
180{
181	return p2p_state_txt(p2p->state);
182}
183
184
185u16 p2p_get_provisioning_info(struct p2p_data *p2p, const u8 *addr)
186{
187	struct p2p_device *dev = NULL;
188
189	if (!addr || !p2p)
190		return 0;
191
192	dev = p2p_get_device(p2p, addr);
193	if (dev)
194		return dev->wps_prov_info;
195	else
196		return 0;
197}
198
199
200void p2p_clear_provisioning_info(struct p2p_data *p2p, const u8 *addr)
201{
202	struct p2p_device *dev = NULL;
203
204	if (!addr || !p2p)
205		return;
206
207	dev = p2p_get_device(p2p, addr);
208	if (dev)
209		dev->wps_prov_info = 0;
210}
211
212
213void p2p_set_state(struct p2p_data *p2p, int new_state)
214{
215	p2p_dbg(p2p, "State %s -> %s",
216		p2p_state_txt(p2p->state), p2p_state_txt(new_state));
217	p2p->state = new_state;
218}
219
220
221void p2p_set_timeout(struct p2p_data *p2p, unsigned int sec, unsigned int usec)
222{
223	p2p_dbg(p2p, "Set timeout (state=%s): %u.%06u sec",
224		p2p_state_txt(p2p->state), sec, usec);
225	eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
226	eloop_register_timeout(sec, usec, p2p_state_timeout, p2p, NULL);
227}
228
229
230void p2p_clear_timeout(struct p2p_data *p2p)
231{
232	p2p_dbg(p2p, "Clear timeout (state=%s)", p2p_state_txt(p2p->state));
233	eloop_cancel_timeout(p2p_state_timeout, p2p, NULL);
234}
235
236
237void p2p_go_neg_failed(struct p2p_data *p2p, struct p2p_device *peer,
238		       int status)
239{
240	struct p2p_go_neg_results res;
241	p2p_clear_timeout(p2p);
242	p2p_set_state(p2p, P2P_IDLE);
243	if (p2p->go_neg_peer) {
244		p2p->go_neg_peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
245		p2p->go_neg_peer->wps_method = WPS_NOT_READY;
246	}
247	p2p->go_neg_peer = NULL;
248
249	os_memset(&res, 0, sizeof(res));
250	res.status = status;
251	if (peer) {
252		os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr,
253			  ETH_ALEN);
254		os_memcpy(res.peer_interface_addr, peer->intended_addr,
255			  ETH_ALEN);
256	}
257	p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
258}
259
260
261static void p2p_listen_in_find(struct p2p_data *p2p, int dev_disc)
262{
263	unsigned int r, tu;
264	int freq;
265	struct wpabuf *ies;
266
267	p2p_dbg(p2p, "Starting short listen state (state=%s)",
268		p2p_state_txt(p2p->state));
269
270	freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
271	if (freq < 0) {
272		p2p_dbg(p2p, "Unknown regulatory class/channel");
273		return;
274	}
275
276	os_get_random((u8 *) &r, sizeof(r));
277	tu = (r % ((p2p->max_disc_int - p2p->min_disc_int) + 1) +
278	      p2p->min_disc_int) * 100;
279	if (p2p->max_disc_tu >= 0 && tu > (unsigned int) p2p->max_disc_tu)
280		tu = p2p->max_disc_tu;
281	if (!dev_disc && tu < 100)
282		tu = 100; /* Need to wait in non-device discovery use cases */
283	if (p2p->cfg->max_listen && 1024 * tu / 1000 > p2p->cfg->max_listen)
284		tu = p2p->cfg->max_listen * 1000 / 1024;
285
286	if (tu == 0) {
287		p2p_dbg(p2p, "Skip listen state since duration was 0 TU");
288		p2p_set_timeout(p2p, 0, 0);
289		return;
290	}
291
292	p2p->pending_listen_freq = freq;
293	p2p->pending_listen_sec = 0;
294	p2p->pending_listen_usec = 1024 * tu;
295
296	ies = p2p_build_probe_resp_ies(p2p);
297	if (ies == NULL)
298		return;
299
300	if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, 1024 * tu / 1000,
301		    ies) < 0) {
302		p2p_dbg(p2p, "Failed to start listen mode");
303		p2p->pending_listen_freq = 0;
304	}
305	wpabuf_free(ies);
306}
307
308
309int p2p_listen(struct p2p_data *p2p, unsigned int timeout)
310{
311	int freq;
312	struct wpabuf *ies;
313
314	p2p_dbg(p2p, "Going to listen(only) state");
315
316	freq = p2p_channel_to_freq(p2p->cfg->reg_class, p2p->cfg->channel);
317	if (freq < 0) {
318		p2p_dbg(p2p, "Unknown regulatory class/channel");
319		return -1;
320	}
321
322	p2p->pending_listen_freq = freq;
323	p2p->pending_listen_sec = timeout / 1000;
324	p2p->pending_listen_usec = (timeout % 1000) * 1000;
325
326	if (p2p->p2p_scan_running) {
327		if (p2p->start_after_scan == P2P_AFTER_SCAN_CONNECT) {
328			p2p_dbg(p2p, "p2p_scan running - connect is already pending - skip listen");
329			return 0;
330		}
331		p2p_dbg(p2p, "p2p_scan running - delay start of listen state");
332		p2p->start_after_scan = P2P_AFTER_SCAN_LISTEN;
333		return 0;
334	}
335
336	ies = p2p_build_probe_resp_ies(p2p);
337	if (ies == NULL)
338		return -1;
339
340	if (p2p->cfg->start_listen(p2p->cfg->cb_ctx, freq, timeout, ies) < 0) {
341		p2p_dbg(p2p, "Failed to start listen mode");
342		p2p->pending_listen_freq = 0;
343		wpabuf_free(ies);
344		return -1;
345	}
346	wpabuf_free(ies);
347
348	p2p_set_state(p2p, P2P_LISTEN_ONLY);
349
350	return 0;
351}
352
353
354static void p2p_device_clear_reported(struct p2p_data *p2p)
355{
356	struct p2p_device *dev;
357	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list)
358		dev->flags &= ~P2P_DEV_REPORTED;
359}
360
361
362/**
363 * p2p_get_device - Fetch a peer entry
364 * @p2p: P2P module context from p2p_init()
365 * @addr: P2P Device Address of the peer
366 * Returns: Pointer to the device entry or %NULL if not found
367 */
368struct p2p_device * p2p_get_device(struct p2p_data *p2p, const u8 *addr)
369{
370	struct p2p_device *dev;
371	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
372		if (os_memcmp(dev->info.p2p_device_addr, addr, ETH_ALEN) == 0)
373			return dev;
374	}
375	return NULL;
376}
377
378
379/**
380 * p2p_get_device_interface - Fetch a peer entry based on P2P Interface Address
381 * @p2p: P2P module context from p2p_init()
382 * @addr: P2P Interface Address of the peer
383 * Returns: Pointer to the device entry or %NULL if not found
384 */
385struct p2p_device * p2p_get_device_interface(struct p2p_data *p2p,
386					     const u8 *addr)
387{
388	struct p2p_device *dev;
389	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
390		if (os_memcmp(dev->interface_addr, addr, ETH_ALEN) == 0)
391			return dev;
392	}
393	return NULL;
394}
395
396
397/**
398 * p2p_create_device - Create a peer entry
399 * @p2p: P2P module context from p2p_init()
400 * @addr: P2P Device Address of the peer
401 * Returns: Pointer to the device entry or %NULL on failure
402 *
403 * If there is already an entry for the peer, it will be returned instead of
404 * creating a new one.
405 */
406static struct p2p_device * p2p_create_device(struct p2p_data *p2p,
407					     const u8 *addr)
408{
409	struct p2p_device *dev, *oldest = NULL;
410	size_t count = 0;
411
412	dev = p2p_get_device(p2p, addr);
413	if (dev)
414		return dev;
415
416	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
417		count++;
418		if (oldest == NULL ||
419		    os_reltime_before(&dev->last_seen, &oldest->last_seen))
420			oldest = dev;
421	}
422	if (count + 1 > p2p->cfg->max_peers && oldest) {
423		p2p_dbg(p2p, "Remove oldest peer entry to make room for a new peer");
424#ifdef ANDROID_P2P
425		/* SD_FAIR_POLICY: Update the current sd_dev_list pointer to next device */
426		if(&oldest->list == p2p->sd_dev_list)
427			p2p->sd_dev_list = oldest->list.next;
428#endif
429		dl_list_del(&oldest->list);
430		p2p_device_free(p2p, oldest);
431	}
432
433	dev = os_zalloc(sizeof(*dev));
434	if (dev == NULL)
435		return NULL;
436	dl_list_add(&p2p->devices, &dev->list);
437	os_memcpy(dev->info.p2p_device_addr, addr, ETH_ALEN);
438
439	return dev;
440}
441
442
443static void p2p_copy_client_info(struct p2p_device *dev,
444				 struct p2p_client_info *cli)
445{
446	os_memcpy(dev->info.device_name, cli->dev_name, cli->dev_name_len);
447	dev->info.device_name[cli->dev_name_len] = '\0';
448	dev->info.dev_capab = cli->dev_capab;
449	dev->info.config_methods = cli->config_methods;
450	os_memcpy(dev->info.pri_dev_type, cli->pri_dev_type, 8);
451	dev->info.wps_sec_dev_type_list_len = 8 * cli->num_sec_dev_types;
452	os_memcpy(dev->info.wps_sec_dev_type_list, cli->sec_dev_types,
453		  dev->info.wps_sec_dev_type_list_len);
454}
455
456
457static int p2p_add_group_clients(struct p2p_data *p2p, const u8 *go_dev_addr,
458				 const u8 *go_interface_addr, int freq,
459				 const u8 *gi, size_t gi_len)
460{
461	struct p2p_group_info info;
462	size_t c;
463	struct p2p_device *dev;
464
465	if (gi == NULL)
466		return 0;
467
468	if (p2p_group_info_parse(gi, gi_len, &info) < 0)
469		return -1;
470
471	/*
472	 * Clear old data for this group; if the devices are still in the
473	 * group, the information will be restored in the loop following this.
474	 */
475	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
476		if (os_memcmp(dev->member_in_go_iface, go_interface_addr,
477			      ETH_ALEN) == 0) {
478			os_memset(dev->member_in_go_iface, 0, ETH_ALEN);
479			os_memset(dev->member_in_go_dev, 0, ETH_ALEN);
480		}
481	}
482
483	for (c = 0; c < info.num_clients; c++) {
484		struct p2p_client_info *cli = &info.client[c];
485		if (os_memcmp(cli->p2p_device_addr, p2p->cfg->dev_addr,
486			      ETH_ALEN) == 0)
487			continue; /* ignore our own entry */
488		dev = p2p_get_device(p2p, cli->p2p_device_addr);
489		if (dev) {
490			if (dev->flags & (P2P_DEV_GROUP_CLIENT_ONLY |
491					  P2P_DEV_PROBE_REQ_ONLY)) {
492				/*
493				 * Update information since we have not
494				 * received this directly from the client.
495				 */
496				p2p_copy_client_info(dev, cli);
497			} else {
498				/*
499				 * Need to update P2P Client Discoverability
500				 * flag since it is valid only in P2P Group
501				 * Info attribute.
502				 */
503				dev->info.dev_capab &=
504					~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
505				dev->info.dev_capab |=
506					cli->dev_capab &
507					P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
508			}
509			if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
510				dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
511			}
512		} else {
513			dev = p2p_create_device(p2p, cli->p2p_device_addr);
514			if (dev == NULL)
515				continue;
516			dev->flags |= P2P_DEV_GROUP_CLIENT_ONLY;
517			p2p_copy_client_info(dev, cli);
518			dev->oper_freq = freq;
519			p2p->cfg->dev_found(p2p->cfg->cb_ctx,
520					    dev->info.p2p_device_addr,
521					    &dev->info, 1);
522			dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
523		}
524
525		os_memcpy(dev->interface_addr, cli->p2p_interface_addr,
526			  ETH_ALEN);
527		os_get_reltime(&dev->last_seen);
528		os_memcpy(dev->member_in_go_dev, go_dev_addr, ETH_ALEN);
529		os_memcpy(dev->member_in_go_iface, go_interface_addr,
530			  ETH_ALEN);
531	}
532
533	return 0;
534}
535
536
537static void p2p_copy_wps_info(struct p2p_data *p2p, struct p2p_device *dev,
538			      int probe_req, const struct p2p_message *msg)
539{
540	os_memcpy(dev->info.device_name, msg->device_name,
541		  sizeof(dev->info.device_name));
542
543	if (msg->manufacturer &&
544	    msg->manufacturer_len < sizeof(dev->info.manufacturer)) {
545		os_memset(dev->info.manufacturer, 0,
546			  sizeof(dev->info.manufacturer));
547		os_memcpy(dev->info.manufacturer, msg->manufacturer,
548			  msg->manufacturer_len);
549	}
550
551	if (msg->model_name &&
552	    msg->model_name_len < sizeof(dev->info.model_name)) {
553		os_memset(dev->info.model_name, 0,
554			  sizeof(dev->info.model_name));
555		os_memcpy(dev->info.model_name, msg->model_name,
556			  msg->model_name_len);
557	}
558
559	if (msg->model_number &&
560	    msg->model_number_len < sizeof(dev->info.model_number)) {
561		os_memset(dev->info.model_number, 0,
562			  sizeof(dev->info.model_number));
563		os_memcpy(dev->info.model_number, msg->model_number,
564			  msg->model_number_len);
565	}
566
567	if (msg->serial_number &&
568	    msg->serial_number_len < sizeof(dev->info.serial_number)) {
569		os_memset(dev->info.serial_number, 0,
570			  sizeof(dev->info.serial_number));
571		os_memcpy(dev->info.serial_number, msg->serial_number,
572			  msg->serial_number_len);
573	}
574
575	if (msg->pri_dev_type)
576		os_memcpy(dev->info.pri_dev_type, msg->pri_dev_type,
577			  sizeof(dev->info.pri_dev_type));
578	else if (msg->wps_pri_dev_type)
579		os_memcpy(dev->info.pri_dev_type, msg->wps_pri_dev_type,
580			  sizeof(dev->info.pri_dev_type));
581
582	if (msg->wps_sec_dev_type_list) {
583		os_memcpy(dev->info.wps_sec_dev_type_list,
584			  msg->wps_sec_dev_type_list,
585			  msg->wps_sec_dev_type_list_len);
586		dev->info.wps_sec_dev_type_list_len =
587			msg->wps_sec_dev_type_list_len;
588	}
589
590	if (msg->capability) {
591		/*
592		 * P2P Client Discoverability bit is reserved in all frames
593		 * that use this function, so do not change its value here.
594		 */
595		dev->info.dev_capab &= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
596		dev->info.dev_capab |= msg->capability[0] &
597			~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
598		dev->info.group_capab = msg->capability[1];
599	}
600
601	if (msg->ext_listen_timing) {
602		dev->ext_listen_period = WPA_GET_LE16(msg->ext_listen_timing);
603		dev->ext_listen_interval =
604			WPA_GET_LE16(msg->ext_listen_timing + 2);
605	}
606
607	if (!probe_req) {
608		u16 new_config_methods;
609		new_config_methods = msg->config_methods ?
610			msg->config_methods : msg->wps_config_methods;
611		if (new_config_methods &&
612		    dev->info.config_methods != new_config_methods) {
613			p2p_dbg(p2p, "Update peer " MACSTR
614				" config_methods 0x%x -> 0x%x",
615				MAC2STR(dev->info.p2p_device_addr),
616				dev->info.config_methods,
617				new_config_methods);
618			dev->info.config_methods = new_config_methods;
619		}
620	}
621}
622
623
624/**
625 * p2p_add_device - Add peer entries based on scan results or P2P frames
626 * @p2p: P2P module context from p2p_init()
627 * @addr: Source address of Beacon or Probe Response frame (may be either
628 *	P2P Device Address or P2P Interface Address)
629 * @level: Signal level (signal strength of the received frame from the peer)
630 * @freq: Frequency on which the Beacon or Probe Response frame was received
631 * @rx_time: Time when the result was received
632 * @ies: IEs from the Beacon or Probe Response frame
633 * @ies_len: Length of ies buffer in octets
634 * @scan_res: Whether this was based on scan results
635 * Returns: 0 on success, -1 on failure
636 *
637 * If the scan result is for a GO, the clients in the group will also be added
638 * to the peer table. This function can also be used with some other frames
639 * like Provision Discovery Request that contains P2P Capability and P2P Device
640 * Info attributes.
641 */
642int p2p_add_device(struct p2p_data *p2p, const u8 *addr, int freq,
643		   struct os_reltime *rx_time, int level, const u8 *ies,
644		   size_t ies_len, int scan_res)
645{
646	struct p2p_device *dev;
647	struct p2p_message msg;
648	const u8 *p2p_dev_addr;
649	int i;
650	struct os_reltime time_now;
651
652	os_memset(&msg, 0, sizeof(msg));
653	if (p2p_parse_ies(ies, ies_len, &msg)) {
654		p2p_dbg(p2p, "Failed to parse P2P IE for a device entry");
655		p2p_parse_free(&msg);
656		return -1;
657	}
658
659	if (msg.p2p_device_addr)
660		p2p_dev_addr = msg.p2p_device_addr;
661	else if (msg.device_id)
662		p2p_dev_addr = msg.device_id;
663	else {
664		p2p_dbg(p2p, "Ignore scan data without P2P Device Info or P2P Device Id");
665		p2p_parse_free(&msg);
666		return -1;
667	}
668
669	if (!is_zero_ether_addr(p2p->peer_filter) &&
670	    os_memcmp(p2p_dev_addr, p2p->peer_filter, ETH_ALEN) != 0) {
671		p2p_dbg(p2p, "Do not add peer filter for " MACSTR
672			" due to peer filter", MAC2STR(p2p_dev_addr));
673		p2p_parse_free(&msg);
674		return 0;
675	}
676
677	dev = p2p_create_device(p2p, p2p_dev_addr);
678	if (dev == NULL) {
679		p2p_parse_free(&msg);
680		return -1;
681	}
682
683	if (rx_time == NULL) {
684		os_get_reltime(&time_now);
685		rx_time = &time_now;
686	}
687
688	/*
689	 * Update the device entry only if the new peer
690	 * entry is newer than the one previously stored.
691	 */
692	if (dev->last_seen.sec > 0 &&
693	    os_reltime_before(rx_time, &dev->last_seen)) {
694		p2p_dbg(p2p, "Do not update peer entry based on old frame (rx_time=%u.%06u last_seen=%u.%06u)",
695			(unsigned int) rx_time->sec,
696			(unsigned int) rx_time->usec,
697			(unsigned int) dev->last_seen.sec,
698			(unsigned int) dev->last_seen.usec);
699		p2p_parse_free(&msg);
700		return -1;
701	}
702
703	os_memcpy(&dev->last_seen, rx_time, sizeof(struct os_reltime));
704
705	dev->flags &= ~(P2P_DEV_PROBE_REQ_ONLY | P2P_DEV_GROUP_CLIENT_ONLY);
706
707	if (os_memcmp(addr, p2p_dev_addr, ETH_ALEN) != 0)
708		os_memcpy(dev->interface_addr, addr, ETH_ALEN);
709	if (msg.ssid &&
710	    (msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
711	     os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
712	     != 0)) {
713		os_memcpy(dev->oper_ssid, msg.ssid + 2, msg.ssid[1]);
714		dev->oper_ssid_len = msg.ssid[1];
715	}
716
717	if (freq >= 2412 && freq <= 2484 && msg.ds_params &&
718	    *msg.ds_params >= 1 && *msg.ds_params <= 14) {
719		int ds_freq;
720		if (*msg.ds_params == 14)
721			ds_freq = 2484;
722		else
723			ds_freq = 2407 + *msg.ds_params * 5;
724		if (freq != ds_freq) {
725			p2p_dbg(p2p, "Update Listen frequency based on DS Parameter Set IE: %d -> %d MHz",
726				freq, ds_freq);
727			freq = ds_freq;
728		}
729	}
730
731	if (dev->listen_freq && dev->listen_freq != freq && scan_res) {
732		p2p_dbg(p2p, "Update Listen frequency based on scan results ("
733			MACSTR " %d -> %d MHz (DS param %d)",
734			MAC2STR(dev->info.p2p_device_addr), dev->listen_freq,
735			freq, msg.ds_params ? *msg.ds_params : -1);
736	}
737	if (scan_res) {
738		dev->listen_freq = freq;
739		if (msg.group_info)
740			dev->oper_freq = freq;
741	}
742	dev->info.level = level;
743
744	p2p_copy_wps_info(p2p, dev, 0, &msg);
745
746	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
747		wpabuf_free(dev->info.wps_vendor_ext[i]);
748		dev->info.wps_vendor_ext[i] = NULL;
749	}
750
751	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
752		if (msg.wps_vendor_ext[i] == NULL)
753			break;
754		dev->info.wps_vendor_ext[i] = wpabuf_alloc_copy(
755			msg.wps_vendor_ext[i], msg.wps_vendor_ext_len[i]);
756		if (dev->info.wps_vendor_ext[i] == NULL)
757			break;
758	}
759
760	if (msg.wfd_subelems) {
761		wpabuf_free(dev->info.wfd_subelems);
762		dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
763	}
764
765	if (scan_res) {
766		p2p_add_group_clients(p2p, p2p_dev_addr, addr, freq,
767				      msg.group_info, msg.group_info_len);
768	}
769
770	p2p_parse_free(&msg);
771
772	if (p2p_pending_sd_req(p2p, dev))
773		dev->flags |= P2P_DEV_SD_SCHEDULE;
774
775	if (dev->flags & P2P_DEV_REPORTED)
776		return 0;
777
778	p2p_dbg(p2p, "Peer found with Listen frequency %d MHz (rx_time=%u.%06u)",
779		freq, (unsigned int) rx_time->sec,
780		(unsigned int) rx_time->usec);
781	if (dev->flags & P2P_DEV_USER_REJECTED) {
782		p2p_dbg(p2p, "Do not report rejected device");
783		return 0;
784	}
785
786	if (dev->info.config_methods == 0 &&
787	    (freq == 2412 || freq == 2437 || freq == 2462)) {
788		/*
789		 * If we have only seen a Beacon frame from a GO, we do not yet
790		 * know what WPS config methods it supports. Since some
791		 * applications use config_methods value from P2P-DEVICE-FOUND
792		 * events, postpone reporting this peer until we've fully
793		 * discovered its capabilities.
794		 *
795		 * At least for now, do this only if the peer was detected on
796		 * one of the social channels since that peer can be easily be
797		 * found again and there are no limitations of having to use
798		 * passive scan on this channels, so this can be done through
799		 * Probe Response frame that includes the config_methods
800		 * information.
801		 */
802		p2p_dbg(p2p, "Do not report peer " MACSTR
803			" with unknown config methods", MAC2STR(addr));
804		return 0;
805	}
806
807	p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
808			    !(dev->flags & P2P_DEV_REPORTED_ONCE));
809	dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
810
811	return 0;
812}
813
814
815static void p2p_device_free(struct p2p_data *p2p, struct p2p_device *dev)
816{
817	int i;
818
819	if (p2p->go_neg_peer == dev) {
820		/*
821		 * If GO Negotiation is in progress, report that it has failed.
822		 */
823		p2p_go_neg_failed(p2p, dev, -1);
824		p2p->go_neg_peer = NULL;
825	}
826	if (p2p->invite_peer == dev)
827		p2p->invite_peer = NULL;
828	if (p2p->sd_peer == dev)
829		p2p->sd_peer = NULL;
830	if (p2p->pending_client_disc_go == dev)
831		p2p->pending_client_disc_go = NULL;
832
833	/* dev_lost() device, but only if it was previously dev_found() */
834	if (dev->flags & P2P_DEV_REPORTED_ONCE)
835		p2p->cfg->dev_lost(p2p->cfg->cb_ctx,
836				   dev->info.p2p_device_addr);
837
838	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
839		wpabuf_free(dev->info.wps_vendor_ext[i]);
840		dev->info.wps_vendor_ext[i] = NULL;
841	}
842
843	wpabuf_free(dev->info.wfd_subelems);
844
845	os_free(dev);
846}
847
848
849static int p2p_get_next_prog_freq(struct p2p_data *p2p)
850{
851	struct p2p_channels *c;
852	struct p2p_reg_class *cla;
853	size_t cl, ch;
854	int found = 0;
855	u8 reg_class;
856	u8 channel;
857	int freq;
858
859	c = &p2p->cfg->channels;
860	for (cl = 0; cl < c->reg_classes; cl++) {
861		cla = &c->reg_class[cl];
862		if (cla->reg_class != p2p->last_prog_scan_class)
863			continue;
864		for (ch = 0; ch < cla->channels; ch++) {
865			if (cla->channel[ch] == p2p->last_prog_scan_chan) {
866				found = 1;
867				break;
868			}
869		}
870		if (found)
871			break;
872	}
873
874	if (!found) {
875		/* Start from beginning */
876		reg_class = c->reg_class[0].reg_class;
877		channel = c->reg_class[0].channel[0];
878	} else {
879		/* Pick the next channel */
880		ch++;
881		if (ch == cla->channels) {
882			cl++;
883			if (cl == c->reg_classes)
884				cl = 0;
885			ch = 0;
886		}
887		reg_class = c->reg_class[cl].reg_class;
888		channel = c->reg_class[cl].channel[ch];
889	}
890
891	freq = p2p_channel_to_freq(reg_class, channel);
892	p2p_dbg(p2p, "Next progressive search channel: reg_class %u channel %u -> %d MHz",
893		reg_class, channel, freq);
894	p2p->last_prog_scan_class = reg_class;
895	p2p->last_prog_scan_chan = channel;
896
897	if (freq == 2412 || freq == 2437 || freq == 2462)
898		return 0; /* No need to add social channels */
899	return freq;
900}
901
902
903static void p2p_search(struct p2p_data *p2p)
904{
905	int freq = 0;
906	enum p2p_scan_type type;
907	u16 pw_id = DEV_PW_DEFAULT;
908	int res;
909
910	if (p2p->drv_in_listen) {
911		p2p_dbg(p2p, "Driver is still in Listen state - wait for it to end before continuing");
912		return;
913	}
914	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
915
916	if (p2p->find_type == P2P_FIND_PROGRESSIVE &&
917	    (freq = p2p_get_next_prog_freq(p2p)) > 0) {
918		type = P2P_SCAN_SOCIAL_PLUS_ONE;
919		p2p_dbg(p2p, "Starting search (+ freq %u)", freq);
920	} else {
921		type = P2P_SCAN_SOCIAL;
922		p2p_dbg(p2p, "Starting search");
923	}
924
925	res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, type, freq,
926				 p2p->num_req_dev_types, p2p->req_dev_types,
927				 p2p->find_dev_id, pw_id);
928	if (res < 0) {
929		p2p_dbg(p2p, "Scan request failed");
930		p2p_continue_find(p2p);
931	} else {
932		p2p_dbg(p2p, "Running p2p_scan");
933		p2p->p2p_scan_running = 1;
934		eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
935		eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
936				       p2p, NULL);
937	}
938}
939
940
941static void p2p_find_timeout(void *eloop_ctx, void *timeout_ctx)
942{
943	struct p2p_data *p2p = eloop_ctx;
944	p2p_dbg(p2p, "Find timeout -> stop");
945	p2p_stop_find(p2p);
946}
947
948
949static int p2p_run_after_scan(struct p2p_data *p2p)
950{
951	struct p2p_device *dev;
952	enum p2p_after_scan op;
953
954	if (p2p->after_scan_tx) {
955		p2p->after_scan_tx_in_progress = 1;
956		p2p_dbg(p2p, "Send pending Action frame at p2p_scan completion");
957		p2p->cfg->send_action(p2p->cfg->cb_ctx,
958				      p2p->after_scan_tx->freq,
959				      p2p->after_scan_tx->dst,
960				      p2p->after_scan_tx->src,
961				      p2p->after_scan_tx->bssid,
962				      (u8 *) (p2p->after_scan_tx + 1),
963				      p2p->after_scan_tx->len,
964				      p2p->after_scan_tx->wait_time);
965		os_free(p2p->after_scan_tx);
966		p2p->after_scan_tx = NULL;
967#ifdef ANDROID_P2P
968		/* For SD frames, there is a scenario, where we can receive a SD request frame during p2p_scan.
969		 * At that moment, we will send the SD response from this context. After sending the SD response,
970		 * we need to continue p2p_find. But if we return 1 from here, p2p_find is going to be stopped.
971		 */
972		return 0;
973#else
974		return 1;
975#endif
976	}
977
978	op = p2p->start_after_scan;
979	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
980	switch (op) {
981	case P2P_AFTER_SCAN_NOTHING:
982		break;
983	case P2P_AFTER_SCAN_LISTEN:
984		p2p_dbg(p2p, "Start previously requested Listen state");
985		p2p_listen(p2p, p2p->pending_listen_sec * 1000 +
986			   p2p->pending_listen_usec / 1000);
987		return 1;
988	case P2P_AFTER_SCAN_CONNECT:
989		p2p_dbg(p2p, "Start previously requested connect with " MACSTR,
990			MAC2STR(p2p->after_scan_peer));
991		dev = p2p_get_device(p2p, p2p->after_scan_peer);
992		if (dev == NULL) {
993			p2p_dbg(p2p, "Peer not known anymore");
994			break;
995		}
996		p2p_connect_send(p2p, dev);
997		return 1;
998	}
999
1000	return 0;
1001}
1002
1003
1004static void p2p_scan_timeout(void *eloop_ctx, void *timeout_ctx)
1005{
1006	struct p2p_data *p2p = eloop_ctx;
1007	int running;
1008	p2p_dbg(p2p, "p2p_scan timeout (running=%d)", p2p->p2p_scan_running);
1009	running = p2p->p2p_scan_running;
1010	/* Make sure we recover from missed scan results callback */
1011	p2p->p2p_scan_running = 0;
1012
1013	if (running)
1014		p2p_run_after_scan(p2p);
1015}
1016
1017
1018static void p2p_free_req_dev_types(struct p2p_data *p2p)
1019{
1020	p2p->num_req_dev_types = 0;
1021	os_free(p2p->req_dev_types);
1022	p2p->req_dev_types = NULL;
1023}
1024
1025
1026int p2p_find(struct p2p_data *p2p, unsigned int timeout,
1027	     enum p2p_discovery_type type,
1028	     unsigned int num_req_dev_types, const u8 *req_dev_types,
1029	     const u8 *dev_id, unsigned int search_delay)
1030{
1031	int res;
1032
1033	p2p_dbg(p2p, "Starting find (type=%d)", type);
1034	os_get_reltime(&p2p->find_start);
1035	if (p2p->p2p_scan_running) {
1036		p2p_dbg(p2p, "p2p_scan is already running");
1037	}
1038
1039	p2p_free_req_dev_types(p2p);
1040	if (req_dev_types && num_req_dev_types) {
1041		p2p->req_dev_types = os_malloc(num_req_dev_types *
1042					       WPS_DEV_TYPE_LEN);
1043		if (p2p->req_dev_types == NULL)
1044			return -1;
1045		os_memcpy(p2p->req_dev_types, req_dev_types,
1046			  num_req_dev_types * WPS_DEV_TYPE_LEN);
1047		p2p->num_req_dev_types = num_req_dev_types;
1048	}
1049
1050	if (dev_id) {
1051		os_memcpy(p2p->find_dev_id_buf, dev_id, ETH_ALEN);
1052		p2p->find_dev_id = p2p->find_dev_id_buf;
1053	} else
1054		p2p->find_dev_id = NULL;
1055
1056	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1057	p2p_clear_timeout(p2p);
1058	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1059	p2p->find_type = type;
1060	p2p_device_clear_reported(p2p);
1061	p2p_set_state(p2p, P2P_SEARCH);
1062	p2p->search_delay = search_delay;
1063	p2p->in_search_delay = 0;
1064	eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1065	p2p->last_p2p_find_timeout = timeout;
1066	if (timeout)
1067		eloop_register_timeout(timeout, 0, p2p_find_timeout,
1068				       p2p, NULL);
1069	switch (type) {
1070	case P2P_FIND_START_WITH_FULL:
1071	case P2P_FIND_PROGRESSIVE:
1072		res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_FULL, 0,
1073					 p2p->num_req_dev_types,
1074					 p2p->req_dev_types, dev_id,
1075					 DEV_PW_DEFAULT);
1076		break;
1077	case P2P_FIND_ONLY_SOCIAL:
1078		res = p2p->cfg->p2p_scan(p2p->cfg->cb_ctx, P2P_SCAN_SOCIAL, 0,
1079					 p2p->num_req_dev_types,
1080					 p2p->req_dev_types, dev_id,
1081					 DEV_PW_DEFAULT);
1082		break;
1083	default:
1084		return -1;
1085	}
1086
1087	if (res == 0) {
1088		p2p_dbg(p2p, "Running p2p_scan");
1089		p2p->p2p_scan_running = 1;
1090		eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
1091		eloop_register_timeout(P2P_SCAN_TIMEOUT, 0, p2p_scan_timeout,
1092				       p2p, NULL);
1093	} else if (p2p->p2p_scan_running) {
1094		p2p_dbg(p2p, "Failed to start p2p_scan - another p2p_scan was already running");
1095		/* wait for the previous p2p_scan to complete */
1096	} else {
1097		p2p_dbg(p2p, "Failed to start p2p_scan");
1098		p2p_set_state(p2p, P2P_IDLE);
1099		eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1100	}
1101
1102	return res;
1103}
1104
1105
1106void p2p_stop_find_for_freq(struct p2p_data *p2p, int freq)
1107{
1108	p2p_dbg(p2p, "Stopping find");
1109	eloop_cancel_timeout(p2p_find_timeout, p2p, NULL);
1110	p2p_clear_timeout(p2p);
1111	if (p2p->state == P2P_SEARCH)
1112		p2p->cfg->find_stopped(p2p->cfg->cb_ctx);
1113	p2p_set_state(p2p, P2P_IDLE);
1114	p2p_free_req_dev_types(p2p);
1115	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1116	if (p2p->go_neg_peer)
1117		p2p->go_neg_peer->flags &= ~P2P_DEV_PEER_WAITING_RESPONSE;
1118	p2p->go_neg_peer = NULL;
1119	p2p->sd_peer = NULL;
1120	p2p->invite_peer = NULL;
1121	p2p_stop_listen_for_freq(p2p, freq);
1122}
1123
1124
1125void p2p_stop_listen_for_freq(struct p2p_data *p2p, int freq)
1126{
1127	if (freq > 0 && p2p->drv_in_listen == freq && p2p->in_listen) {
1128		p2p_dbg(p2p, "Skip stop_listen since we are on correct channel for response");
1129		return;
1130	}
1131	if (p2p->in_listen) {
1132		p2p->in_listen = 0;
1133		p2p_clear_timeout(p2p);
1134	}
1135	if (p2p->drv_in_listen) {
1136		/*
1137		 * The driver may not deliver callback to p2p_listen_end()
1138		 * when the operation gets canceled, so clear the internal
1139		 * variable that is tracking driver state.
1140		 */
1141		p2p_dbg(p2p, "Clear drv_in_listen (%d)", p2p->drv_in_listen);
1142		p2p->drv_in_listen = 0;
1143	}
1144	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1145}
1146
1147
1148void p2p_stop_listen(struct p2p_data *p2p)
1149{
1150	if (p2p->state != P2P_LISTEN_ONLY) {
1151		p2p_dbg(p2p, "Skip stop_listen since not in listen_only state.");
1152		return;
1153	}
1154
1155	p2p_stop_listen_for_freq(p2p, 0);
1156	p2p_set_state(p2p, P2P_IDLE);
1157}
1158
1159
1160void p2p_stop_find(struct p2p_data *p2p)
1161{
1162	p2p_stop_find_for_freq(p2p, 0);
1163}
1164
1165
1166static int p2p_prepare_channel_pref(struct p2p_data *p2p,
1167				    unsigned int force_freq,
1168				    unsigned int pref_freq, int go)
1169{
1170	u8 op_class, op_channel;
1171	unsigned int freq = force_freq ? force_freq : pref_freq;
1172
1173	p2p_dbg(p2p, "Prepare channel pref - force_freq=%u pref_freq=%u go=%d",
1174		force_freq, pref_freq, go);
1175	if (p2p_freq_to_channel(freq, &op_class, &op_channel) < 0) {
1176		p2p_dbg(p2p, "Unsupported frequency %u MHz", freq);
1177		return -1;
1178	}
1179
1180	if (!p2p_channels_includes(&p2p->cfg->channels, op_class, op_channel) &&
1181	    (go || !p2p_channels_includes(&p2p->cfg->cli_channels, op_class,
1182					  op_channel))) {
1183		p2p_dbg(p2p, "Frequency %u MHz (oper_class %u channel %u) not allowed for P2P",
1184			freq, op_class, op_channel);
1185		return -1;
1186	}
1187
1188	p2p->op_reg_class = op_class;
1189	p2p->op_channel = op_channel;
1190
1191	if (force_freq) {
1192		p2p->channels.reg_classes = 1;
1193		p2p->channels.reg_class[0].channels = 1;
1194		p2p->channels.reg_class[0].reg_class = p2p->op_reg_class;
1195		p2p->channels.reg_class[0].channel[0] = p2p->op_channel;
1196	} else {
1197		os_memcpy(&p2p->channels, &p2p->cfg->channels,
1198			  sizeof(struct p2p_channels));
1199	}
1200
1201	return 0;
1202}
1203
1204
1205static void p2p_prepare_channel_best(struct p2p_data *p2p)
1206{
1207	u8 op_class, op_channel;
1208	const int op_classes_5ghz[] = { 124, 115, 0 };
1209	const int op_classes_ht40[] = { 126, 127, 116, 117, 0 };
1210	const int op_classes_vht[] = { 128, 0 };
1211
1212	p2p_dbg(p2p, "Prepare channel best");
1213
1214	if (!p2p->cfg->cfg_op_channel && p2p->best_freq_overall > 0 &&
1215	    p2p_supported_freq(p2p, p2p->best_freq_overall) &&
1216	    p2p_freq_to_channel(p2p->best_freq_overall, &op_class, &op_channel)
1217	    == 0) {
1218		p2p_dbg(p2p, "Select best overall channel as operating channel preference");
1219		p2p->op_reg_class = op_class;
1220		p2p->op_channel = op_channel;
1221	} else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_5 > 0 &&
1222		   p2p_supported_freq(p2p, p2p->best_freq_5) &&
1223		   p2p_freq_to_channel(p2p->best_freq_5, &op_class, &op_channel)
1224		   == 0) {
1225		p2p_dbg(p2p, "Select best 5 GHz channel as operating channel preference");
1226		p2p->op_reg_class = op_class;
1227		p2p->op_channel = op_channel;
1228	} else if (!p2p->cfg->cfg_op_channel && p2p->best_freq_24 > 0 &&
1229		   p2p_supported_freq(p2p, p2p->best_freq_24) &&
1230		   p2p_freq_to_channel(p2p->best_freq_24, &op_class,
1231				       &op_channel) == 0) {
1232		p2p_dbg(p2p, "Select best 2.4 GHz channel as operating channel preference");
1233		p2p->op_reg_class = op_class;
1234		p2p->op_channel = op_channel;
1235	} else if (p2p->cfg->num_pref_chan > 0 &&
1236		   p2p_channels_includes(&p2p->cfg->channels,
1237					 p2p->cfg->pref_chan[0].op_class,
1238					 p2p->cfg->pref_chan[0].chan)) {
1239		p2p_dbg(p2p, "Select first pref_chan entry as operating channel preference");
1240		p2p->op_reg_class = p2p->cfg->pref_chan[0].op_class;
1241		p2p->op_channel = p2p->cfg->pref_chan[0].chan;
1242	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_vht,
1243				      &p2p->op_reg_class, &p2p->op_channel) ==
1244		   0) {
1245		p2p_dbg(p2p, "Select possible VHT channel (op_class %u channel %u) as operating channel preference",
1246			p2p->op_reg_class, p2p->op_channel);
1247	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_ht40,
1248				      &p2p->op_reg_class, &p2p->op_channel) ==
1249		   0) {
1250		p2p_dbg(p2p, "Select possible HT40 channel (op_class %u channel %u) as operating channel preference",
1251			p2p->op_reg_class, p2p->op_channel);
1252	} else if (p2p_channel_select(&p2p->cfg->channels, op_classes_5ghz,
1253				      &p2p->op_reg_class, &p2p->op_channel) ==
1254		   0) {
1255		p2p_dbg(p2p, "Select possible 5 GHz channel (op_class %u channel %u) as operating channel preference",
1256			p2p->op_reg_class, p2p->op_channel);
1257	} else {
1258		p2p_dbg(p2p, "Select pre-configured channel as operating channel preference");
1259		p2p->op_reg_class = p2p->cfg->op_reg_class;
1260		p2p->op_channel = p2p->cfg->op_channel;
1261	}
1262
1263	os_memcpy(&p2p->channels, &p2p->cfg->channels,
1264		  sizeof(struct p2p_channels));
1265}
1266
1267
1268/**
1269 * p2p_prepare_channel - Select operating channel for GO Negotiation
1270 * @p2p: P2P module context from p2p_init()
1271 * @dev: Selected peer device
1272 * @force_freq: Forced frequency in MHz or 0 if not forced
1273 * @pref_freq: Preferred frequency in MHz or 0 if no preference
1274 * @go: Whether the local end will be forced to be GO
1275 * Returns: 0 on success, -1 on failure (channel not supported for P2P)
1276 *
1277 * This function is used to do initial operating channel selection for GO
1278 * Negotiation prior to having received peer information. The selected channel
1279 * may be further optimized in p2p_reselect_channel() once the peer information
1280 * is available.
1281 */
1282int p2p_prepare_channel(struct p2p_data *p2p, struct p2p_device *dev,
1283			unsigned int force_freq, unsigned int pref_freq, int go)
1284{
1285	p2p_dbg(p2p, "Prepare channel - force_freq=%u pref_freq=%u go=%d",
1286		force_freq, pref_freq, go);
1287	if (force_freq || pref_freq) {
1288		if (p2p_prepare_channel_pref(p2p, force_freq, pref_freq, go) <
1289		    0)
1290			return -1;
1291	} else {
1292		p2p_prepare_channel_best(p2p);
1293	}
1294	p2p_channels_dump(p2p, "prepared channels", &p2p->channels);
1295	if (go)
1296		p2p_channels_remove_freqs(&p2p->channels, &p2p->no_go_freq);
1297	else if (!force_freq)
1298		p2p_channels_union(&p2p->channels, &p2p->cfg->cli_channels,
1299				   &p2p->channels);
1300	p2p_channels_dump(p2p, "after go/cli filter/add", &p2p->channels);
1301
1302	p2p_dbg(p2p, "Own preference for operation channel: Operating Class %u Channel %u%s",
1303		p2p->op_reg_class, p2p->op_channel,
1304		force_freq ? " (forced)" : "");
1305
1306	if (force_freq)
1307		dev->flags |= P2P_DEV_FORCE_FREQ;
1308	else
1309		dev->flags &= ~P2P_DEV_FORCE_FREQ;
1310
1311	return 0;
1312}
1313
1314
1315static void p2p_set_dev_persistent(struct p2p_device *dev,
1316				   int persistent_group)
1317{
1318	switch (persistent_group) {
1319	case 0:
1320		dev->flags &= ~(P2P_DEV_PREFER_PERSISTENT_GROUP |
1321				P2P_DEV_PREFER_PERSISTENT_RECONN);
1322		break;
1323	case 1:
1324		dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP;
1325		dev->flags &= ~P2P_DEV_PREFER_PERSISTENT_RECONN;
1326		break;
1327	case 2:
1328		dev->flags |= P2P_DEV_PREFER_PERSISTENT_GROUP |
1329			P2P_DEV_PREFER_PERSISTENT_RECONN;
1330		break;
1331	}
1332}
1333
1334
1335int p2p_connect(struct p2p_data *p2p, const u8 *peer_addr,
1336		enum p2p_wps_method wps_method,
1337		int go_intent, const u8 *own_interface_addr,
1338		unsigned int force_freq, int persistent_group,
1339		const u8 *force_ssid, size_t force_ssid_len,
1340		int pd_before_go_neg, unsigned int pref_freq)
1341{
1342	struct p2p_device *dev;
1343
1344	p2p_dbg(p2p, "Request to start group negotiation - peer=" MACSTR
1345		"  GO Intent=%d  Intended Interface Address=" MACSTR
1346		" wps_method=%d persistent_group=%d pd_before_go_neg=%d",
1347		MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
1348		wps_method, persistent_group, pd_before_go_neg);
1349
1350	dev = p2p_get_device(p2p, peer_addr);
1351	if (dev == NULL || (dev->flags & P2P_DEV_PROBE_REQ_ONLY)) {
1352		p2p_dbg(p2p, "Cannot connect to unknown P2P Device " MACSTR,
1353			MAC2STR(peer_addr));
1354		return -1;
1355	}
1356
1357	if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq,
1358				go_intent == 15) < 0)
1359		return -1;
1360
1361	if (dev->flags & P2P_DEV_GROUP_CLIENT_ONLY) {
1362		if (!(dev->info.dev_capab &
1363		      P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY)) {
1364			p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
1365				" that is in a group and is not discoverable",
1366				MAC2STR(peer_addr));
1367			return -1;
1368		}
1369		if (dev->oper_freq <= 0) {
1370			p2p_dbg(p2p, "Cannot connect to P2P Device " MACSTR
1371				" with incomplete information",
1372				MAC2STR(peer_addr));
1373			return -1;
1374		}
1375
1376		/*
1377		 * First, try to connect directly. If the peer does not
1378		 * acknowledge frames, assume it is sleeping and use device
1379		 * discoverability via the GO at that point.
1380		 */
1381	}
1382
1383	p2p->ssid_set = 0;
1384	if (force_ssid) {
1385		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
1386				  force_ssid, force_ssid_len);
1387		os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
1388		p2p->ssid_len = force_ssid_len;
1389		p2p->ssid_set = 1;
1390	}
1391
1392	dev->flags &= ~P2P_DEV_NOT_YET_READY;
1393	dev->flags &= ~P2P_DEV_USER_REJECTED;
1394	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
1395	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
1396	if (pd_before_go_neg)
1397		dev->flags |= P2P_DEV_PD_BEFORE_GO_NEG;
1398	else {
1399		dev->flags &= ~P2P_DEV_PD_BEFORE_GO_NEG;
1400		/*
1401		 * Assign dialog token and tie breaker here to use the same
1402		 * values in each retry within the same GO Negotiation exchange.
1403		 */
1404		dev->dialog_token++;
1405		if (dev->dialog_token == 0)
1406			dev->dialog_token = 1;
1407		dev->tie_breaker = p2p->next_tie_breaker;
1408		p2p->next_tie_breaker = !p2p->next_tie_breaker;
1409	}
1410	dev->connect_reqs = 0;
1411	dev->go_neg_req_sent = 0;
1412	dev->go_state = UNKNOWN_GO;
1413	p2p_set_dev_persistent(dev, persistent_group);
1414	p2p->go_intent = go_intent;
1415	os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
1416
1417	if (p2p->state != P2P_IDLE)
1418		p2p_stop_find(p2p);
1419
1420	if (p2p->after_scan_tx) {
1421		/*
1422		 * We need to drop the pending frame to avoid issues with the
1423		 * new GO Negotiation, e.g., when the pending frame was from a
1424		 * previous attempt at starting a GO Negotiation.
1425		 */
1426		p2p_dbg(p2p, "Dropped previous pending Action frame TX that was waiting for p2p_scan completion");
1427		os_free(p2p->after_scan_tx);
1428		p2p->after_scan_tx = NULL;
1429	}
1430
1431	dev->wps_method = wps_method;
1432	dev->status = P2P_SC_SUCCESS;
1433
1434	if (p2p->p2p_scan_running) {
1435		p2p_dbg(p2p, "p2p_scan running - delay connect send");
1436		p2p->start_after_scan = P2P_AFTER_SCAN_CONNECT;
1437		os_memcpy(p2p->after_scan_peer, peer_addr, ETH_ALEN);
1438		return 0;
1439	}
1440	p2p->start_after_scan = P2P_AFTER_SCAN_NOTHING;
1441
1442	return p2p_connect_send(p2p, dev);
1443}
1444
1445
1446int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
1447		  enum p2p_wps_method wps_method,
1448		  int go_intent, const u8 *own_interface_addr,
1449		  unsigned int force_freq, int persistent_group,
1450		  const u8 *force_ssid, size_t force_ssid_len,
1451		  unsigned int pref_freq)
1452{
1453	struct p2p_device *dev;
1454
1455	p2p_dbg(p2p, "Request to authorize group negotiation - peer=" MACSTR
1456		"  GO Intent=%d  Intended Interface Address=" MACSTR
1457		" wps_method=%d  persistent_group=%d",
1458		MAC2STR(peer_addr), go_intent, MAC2STR(own_interface_addr),
1459		wps_method, persistent_group);
1460
1461	dev = p2p_get_device(p2p, peer_addr);
1462	if (dev == NULL) {
1463		p2p_dbg(p2p, "Cannot authorize unknown P2P Device " MACSTR,
1464			MAC2STR(peer_addr));
1465		return -1;
1466	}
1467
1468	if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq, go_intent ==
1469				15) < 0)
1470		return -1;
1471
1472	p2p->ssid_set = 0;
1473	if (force_ssid) {
1474		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Forced SSID",
1475				  force_ssid, force_ssid_len);
1476		os_memcpy(p2p->ssid, force_ssid, force_ssid_len);
1477		p2p->ssid_len = force_ssid_len;
1478		p2p->ssid_set = 1;
1479	}
1480
1481	dev->flags &= ~P2P_DEV_NOT_YET_READY;
1482	dev->flags &= ~P2P_DEV_USER_REJECTED;
1483	dev->go_neg_req_sent = 0;
1484	dev->go_state = UNKNOWN_GO;
1485	p2p_set_dev_persistent(dev, persistent_group);
1486	p2p->go_intent = go_intent;
1487	os_memcpy(p2p->intended_addr, own_interface_addr, ETH_ALEN);
1488
1489	dev->wps_method = wps_method;
1490	dev->status = P2P_SC_SUCCESS;
1491
1492	return 0;
1493}
1494
1495
1496void p2p_add_dev_info(struct p2p_data *p2p, const u8 *addr,
1497		      struct p2p_device *dev, struct p2p_message *msg)
1498{
1499	os_get_reltime(&dev->last_seen);
1500
1501	p2p_copy_wps_info(p2p, dev, 0, msg);
1502
1503	if (msg->listen_channel) {
1504		int freq;
1505		freq = p2p_channel_to_freq(msg->listen_channel[3],
1506					   msg->listen_channel[4]);
1507		if (freq < 0) {
1508			p2p_dbg(p2p, "Unknown peer Listen channel: "
1509				"country=%c%c(0x%02x) reg_class=%u channel=%u",
1510				msg->listen_channel[0],
1511				msg->listen_channel[1],
1512				msg->listen_channel[2],
1513				msg->listen_channel[3],
1514				msg->listen_channel[4]);
1515		} else {
1516			p2p_dbg(p2p, "Update peer " MACSTR
1517				" Listen channel: %u -> %u MHz",
1518				MAC2STR(dev->info.p2p_device_addr),
1519				dev->listen_freq, freq);
1520			dev->listen_freq = freq;
1521		}
1522	}
1523
1524	if (msg->wfd_subelems) {
1525		wpabuf_free(dev->info.wfd_subelems);
1526		dev->info.wfd_subelems = wpabuf_dup(msg->wfd_subelems);
1527	}
1528
1529	if (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
1530		dev->flags &= ~P2P_DEV_PROBE_REQ_ONLY;
1531		p2p_dbg(p2p, "Completed device entry based on data from GO Negotiation Request");
1532	} else {
1533		p2p_dbg(p2p, "Created device entry based on GO Neg Req: "
1534			MACSTR " dev_capab=0x%x group_capab=0x%x name='%s' "
1535			"listen_freq=%d",
1536			MAC2STR(dev->info.p2p_device_addr),
1537			dev->info.dev_capab, dev->info.group_capab,
1538			dev->info.device_name, dev->listen_freq);
1539	}
1540
1541	dev->flags &= ~P2P_DEV_GROUP_CLIENT_ONLY;
1542
1543	if (dev->flags & P2P_DEV_USER_REJECTED) {
1544		p2p_dbg(p2p, "Do not report rejected device");
1545		return;
1546	}
1547
1548	p2p->cfg->dev_found(p2p->cfg->cb_ctx, addr, &dev->info,
1549			    !(dev->flags & P2P_DEV_REPORTED_ONCE));
1550	dev->flags |= P2P_DEV_REPORTED | P2P_DEV_REPORTED_ONCE;
1551}
1552
1553
1554void p2p_build_ssid(struct p2p_data *p2p, u8 *ssid, size_t *ssid_len)
1555{
1556	os_memcpy(ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
1557	p2p_random((char *) &ssid[P2P_WILDCARD_SSID_LEN], 2);
1558	os_memcpy(&ssid[P2P_WILDCARD_SSID_LEN + 2],
1559		  p2p->cfg->ssid_postfix, p2p->cfg->ssid_postfix_len);
1560	*ssid_len = P2P_WILDCARD_SSID_LEN + 2 + p2p->cfg->ssid_postfix_len;
1561}
1562
1563
1564int p2p_go_params(struct p2p_data *p2p, struct p2p_go_neg_results *params)
1565{
1566	p2p_build_ssid(p2p, params->ssid, &params->ssid_len);
1567	p2p_random(params->passphrase, 8);
1568	return 0;
1569}
1570
1571
1572void p2p_go_complete(struct p2p_data *p2p, struct p2p_device *peer)
1573{
1574	struct p2p_go_neg_results res;
1575	int go = peer->go_state == LOCAL_GO;
1576	struct p2p_channels intersection;
1577	int freqs;
1578	size_t i, j;
1579
1580	p2p_dbg(p2p, "GO Negotiation with " MACSTR " completed (%s will be GO)",
1581		MAC2STR(peer->info.p2p_device_addr), go ? "local end" : "peer");
1582
1583	os_memset(&res, 0, sizeof(res));
1584	res.role_go = go;
1585	os_memcpy(res.peer_device_addr, peer->info.p2p_device_addr, ETH_ALEN);
1586	os_memcpy(res.peer_interface_addr, peer->intended_addr, ETH_ALEN);
1587	res.wps_method = peer->wps_method;
1588	if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
1589		if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
1590			res.persistent_group = 2;
1591		else
1592			res.persistent_group = 1;
1593	}
1594
1595	if (go) {
1596		/* Setup AP mode for WPS provisioning */
1597		res.freq = p2p_channel_to_freq(p2p->op_reg_class,
1598					       p2p->op_channel);
1599		os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
1600		res.ssid_len = p2p->ssid_len;
1601		p2p_random(res.passphrase, 8);
1602	} else {
1603		res.freq = peer->oper_freq;
1604		if (p2p->ssid_len) {
1605			os_memcpy(res.ssid, p2p->ssid, p2p->ssid_len);
1606			res.ssid_len = p2p->ssid_len;
1607		}
1608	}
1609
1610	p2p_channels_dump(p2p, "own channels", &p2p->channels);
1611	p2p_channels_dump(p2p, "peer channels", &peer->channels);
1612	p2p_channels_intersect(&p2p->channels, &peer->channels,
1613			       &intersection);
1614	if (go) {
1615		p2p_channels_remove_freqs(&intersection, &p2p->no_go_freq);
1616		p2p_channels_dump(p2p, "intersection after no-GO removal",
1617				  &intersection);
1618	}
1619	freqs = 0;
1620	for (i = 0; i < intersection.reg_classes; i++) {
1621		struct p2p_reg_class *c = &intersection.reg_class[i];
1622		if (freqs + 1 == P2P_MAX_CHANNELS)
1623			break;
1624		for (j = 0; j < c->channels; j++) {
1625			int freq;
1626			if (freqs + 1 == P2P_MAX_CHANNELS)
1627				break;
1628			freq = p2p_channel_to_freq(c->reg_class, c->channel[j]);
1629			if (freq < 0)
1630				continue;
1631			res.freq_list[freqs++] = freq;
1632		}
1633	}
1634
1635	res.peer_config_timeout = go ? peer->client_timeout : peer->go_timeout;
1636
1637	p2p_clear_timeout(p2p);
1638	p2p->ssid_set = 0;
1639	peer->go_neg_req_sent = 0;
1640	peer->wps_method = WPS_NOT_READY;
1641
1642	p2p_set_state(p2p, P2P_PROVISIONING);
1643	p2p->cfg->go_neg_completed(p2p->cfg->cb_ctx, &res);
1644}
1645
1646
1647static void p2p_rx_p2p_action(struct p2p_data *p2p, const u8 *sa,
1648			      const u8 *data, size_t len, int rx_freq)
1649{
1650	p2p_dbg(p2p, "RX P2P Public Action from " MACSTR, MAC2STR(sa));
1651	wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Public Action contents", data, len);
1652
1653	if (len < 1)
1654		return;
1655
1656	switch (data[0]) {
1657	case P2P_GO_NEG_REQ:
1658		p2p_process_go_neg_req(p2p, sa, data + 1, len - 1, rx_freq);
1659		break;
1660	case P2P_GO_NEG_RESP:
1661		p2p_process_go_neg_resp(p2p, sa, data + 1, len - 1, rx_freq);
1662		break;
1663	case P2P_GO_NEG_CONF:
1664		p2p_process_go_neg_conf(p2p, sa, data + 1, len - 1);
1665		break;
1666	case P2P_INVITATION_REQ:
1667		p2p_process_invitation_req(p2p, sa, data + 1, len - 1,
1668					   rx_freq);
1669		break;
1670	case P2P_INVITATION_RESP:
1671		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
1672		p2p_process_invitation_resp(p2p, sa, data + 1, len - 1);
1673		break;
1674	case P2P_PROV_DISC_REQ:
1675		p2p_process_prov_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
1676		break;
1677	case P2P_PROV_DISC_RESP:
1678		p2p_process_prov_disc_resp(p2p, sa, data + 1, len - 1);
1679		break;
1680	case P2P_DEV_DISC_REQ:
1681		p2p_process_dev_disc_req(p2p, sa, data + 1, len - 1, rx_freq);
1682		break;
1683	case P2P_DEV_DISC_RESP:
1684		p2p_process_dev_disc_resp(p2p, sa, data + 1, len - 1);
1685		break;
1686	default:
1687		p2p_dbg(p2p, "Unsupported P2P Public Action frame type %d",
1688			data[0]);
1689		break;
1690	}
1691}
1692
1693
1694static void p2p_rx_action_public(struct p2p_data *p2p, const u8 *da,
1695				 const u8 *sa, const u8 *bssid, const u8 *data,
1696				 size_t len, int freq)
1697{
1698	if (len < 1)
1699		return;
1700
1701	switch (data[0]) {
1702	case WLAN_PA_VENDOR_SPECIFIC:
1703		data++;
1704		len--;
1705		if (len < 3)
1706			return;
1707		if (WPA_GET_BE24(data) != OUI_WFA)
1708			return;
1709
1710		data += 3;
1711		len -= 3;
1712		if (len < 1)
1713			return;
1714
1715		if (*data != P2P_OUI_TYPE)
1716			return;
1717
1718		p2p_rx_p2p_action(p2p, sa, data + 1, len - 1, freq);
1719		break;
1720	case WLAN_PA_GAS_INITIAL_REQ:
1721		p2p_rx_gas_initial_req(p2p, sa, data + 1, len - 1, freq);
1722		break;
1723	case WLAN_PA_GAS_INITIAL_RESP:
1724		p2p_rx_gas_initial_resp(p2p, sa, data + 1, len - 1, freq);
1725		break;
1726	case WLAN_PA_GAS_COMEBACK_REQ:
1727		p2p_rx_gas_comeback_req(p2p, sa, data + 1, len - 1, freq);
1728		break;
1729	case WLAN_PA_GAS_COMEBACK_RESP:
1730		p2p_rx_gas_comeback_resp(p2p, sa, data + 1, len - 1, freq);
1731		break;
1732	}
1733}
1734
1735
1736void p2p_rx_action(struct p2p_data *p2p, const u8 *da, const u8 *sa,
1737		   const u8 *bssid, u8 category,
1738		   const u8 *data, size_t len, int freq)
1739{
1740	if (category == WLAN_ACTION_PUBLIC) {
1741		p2p_rx_action_public(p2p, da, sa, bssid, data, len, freq);
1742		return;
1743	}
1744
1745	if (category != WLAN_ACTION_VENDOR_SPECIFIC)
1746		return;
1747
1748	if (len < 4)
1749		return;
1750
1751	if (WPA_GET_BE24(data) != OUI_WFA)
1752		return;
1753	data += 3;
1754	len -= 3;
1755
1756	if (*data != P2P_OUI_TYPE)
1757		return;
1758	data++;
1759	len--;
1760
1761	/* P2P action frame */
1762	p2p_dbg(p2p, "RX P2P Action from " MACSTR, MAC2STR(sa));
1763	wpa_hexdump(MSG_MSGDUMP, "P2P: P2P Action contents", data, len);
1764
1765	if (len < 1)
1766		return;
1767	switch (data[0]) {
1768	case P2P_NOA:
1769		p2p_dbg(p2p, "Received P2P Action - Notice of Absence");
1770		/* TODO */
1771		break;
1772	case P2P_PRESENCE_REQ:
1773		p2p_process_presence_req(p2p, da, sa, data + 1, len - 1, freq);
1774		break;
1775	case P2P_PRESENCE_RESP:
1776		p2p_process_presence_resp(p2p, da, sa, data + 1, len - 1);
1777		break;
1778	case P2P_GO_DISC_REQ:
1779		p2p_process_go_disc_req(p2p, da, sa, data + 1, len - 1, freq);
1780		break;
1781	default:
1782		p2p_dbg(p2p, "Received P2P Action - unknown type %u", data[0]);
1783		break;
1784	}
1785}
1786
1787
1788static void p2p_go_neg_start(void *eloop_ctx, void *timeout_ctx)
1789{
1790	struct p2p_data *p2p = eloop_ctx;
1791	if (p2p->go_neg_peer == NULL)
1792		return;
1793	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1794	p2p->go_neg_peer->status = P2P_SC_SUCCESS;
1795	p2p_connect_send(p2p, p2p->go_neg_peer);
1796}
1797
1798
1799static void p2p_invite_start(void *eloop_ctx, void *timeout_ctx)
1800{
1801	struct p2p_data *p2p = eloop_ctx;
1802	if (p2p->invite_peer == NULL)
1803		return;
1804	p2p->cfg->stop_listen(p2p->cfg->cb_ctx);
1805	p2p_invite_send(p2p, p2p->invite_peer, p2p->invite_go_dev_addr);
1806}
1807
1808
1809static void p2p_add_dev_from_probe_req(struct p2p_data *p2p, const u8 *addr,
1810				       const u8 *ie, size_t ie_len)
1811{
1812	struct p2p_message msg;
1813	struct p2p_device *dev;
1814
1815	os_memset(&msg, 0, sizeof(msg));
1816	if (p2p_parse_ies(ie, ie_len, &msg) < 0 || msg.p2p_attributes == NULL)
1817	{
1818		p2p_parse_free(&msg);
1819		return; /* not a P2P probe */
1820	}
1821
1822	if (msg.ssid == NULL || msg.ssid[1] != P2P_WILDCARD_SSID_LEN ||
1823	    os_memcmp(msg.ssid + 2, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN)
1824	    != 0) {
1825		/* The Probe Request is not part of P2P Device Discovery. It is
1826		 * not known whether the source address of the frame is the P2P
1827		 * Device Address or P2P Interface Address. Do not add a new
1828		 * peer entry based on this frames.
1829		 */
1830		p2p_parse_free(&msg);
1831		return;
1832	}
1833
1834	dev = p2p_get_device(p2p, addr);
1835	if (dev) {
1836		if (dev->country[0] == 0 && msg.listen_channel)
1837			os_memcpy(dev->country, msg.listen_channel, 3);
1838		os_get_reltime(&dev->last_seen);
1839		p2p_parse_free(&msg);
1840		return; /* already known */
1841	}
1842
1843	dev = p2p_create_device(p2p, addr);
1844	if (dev == NULL) {
1845		p2p_parse_free(&msg);
1846		return;
1847	}
1848
1849	os_get_reltime(&dev->last_seen);
1850	dev->flags |= P2P_DEV_PROBE_REQ_ONLY;
1851
1852	if (msg.listen_channel) {
1853		os_memcpy(dev->country, msg.listen_channel, 3);
1854		dev->listen_freq = p2p_channel_to_freq(msg.listen_channel[3],
1855						       msg.listen_channel[4]);
1856	}
1857
1858	p2p_copy_wps_info(p2p, dev, 1, &msg);
1859
1860	if (msg.wfd_subelems) {
1861		wpabuf_free(dev->info.wfd_subelems);
1862		dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
1863	}
1864
1865	p2p_parse_free(&msg);
1866
1867	p2p_dbg(p2p, "Created device entry based on Probe Req: " MACSTR
1868		" dev_capab=0x%x group_capab=0x%x name='%s' listen_freq=%d",
1869		MAC2STR(dev->info.p2p_device_addr), dev->info.dev_capab,
1870		dev->info.group_capab, dev->info.device_name,
1871		dev->listen_freq);
1872}
1873
1874
1875struct p2p_device * p2p_add_dev_from_go_neg_req(struct p2p_data *p2p,
1876						const u8 *addr,
1877						struct p2p_message *msg)
1878{
1879	struct p2p_device *dev;
1880
1881	dev = p2p_get_device(p2p, addr);
1882	if (dev) {
1883		os_get_reltime(&dev->last_seen);
1884		return dev; /* already known */
1885	}
1886
1887	dev = p2p_create_device(p2p, addr);
1888	if (dev == NULL)
1889		return NULL;
1890
1891	p2p_add_dev_info(p2p, addr, dev, msg);
1892
1893	return dev;
1894}
1895
1896
1897static int dev_type_match(const u8 *dev_type, const u8 *req_dev_type)
1898{
1899	if (os_memcmp(dev_type, req_dev_type, WPS_DEV_TYPE_LEN) == 0)
1900		return 1;
1901	if (os_memcmp(dev_type, req_dev_type, 2) == 0 &&
1902	    WPA_GET_BE32(&req_dev_type[2]) == 0 &&
1903	    WPA_GET_BE16(&req_dev_type[6]) == 0)
1904		return 1; /* Category match with wildcard OUI/sub-category */
1905	return 0;
1906}
1907
1908
1909int dev_type_list_match(const u8 *dev_type, const u8 *req_dev_type[],
1910			size_t num_req_dev_type)
1911{
1912	size_t i;
1913	for (i = 0; i < num_req_dev_type; i++) {
1914		if (dev_type_match(dev_type, req_dev_type[i]))
1915			return 1;
1916	}
1917	return 0;
1918}
1919
1920
1921/**
1922 * p2p_match_dev_type - Match local device type with requested type
1923 * @p2p: P2P module context from p2p_init()
1924 * @wps: WPS TLVs from Probe Request frame (concatenated WPS IEs)
1925 * Returns: 1 on match, 0 on mismatch
1926 *
1927 * This function can be used to match the Requested Device Type attribute in
1928 * WPS IE with the local device types for deciding whether to reply to a Probe
1929 * Request frame.
1930 */
1931int p2p_match_dev_type(struct p2p_data *p2p, struct wpabuf *wps)
1932{
1933	struct wps_parse_attr attr;
1934	size_t i;
1935
1936	if (wps_parse_msg(wps, &attr))
1937		return 1; /* assume no Requested Device Type attributes */
1938
1939	if (attr.num_req_dev_type == 0)
1940		return 1; /* no Requested Device Type attributes -> match */
1941
1942	if (dev_type_list_match(p2p->cfg->pri_dev_type, attr.req_dev_type,
1943				attr.num_req_dev_type))
1944		return 1; /* Own Primary Device Type matches */
1945
1946	for (i = 0; i < p2p->cfg->num_sec_dev_types; i++)
1947		if (dev_type_list_match(p2p->cfg->sec_dev_type[i],
1948					attr.req_dev_type,
1949					attr.num_req_dev_type))
1950		return 1; /* Own Secondary Device Type matches */
1951
1952	/* No matching device type found */
1953	return 0;
1954}
1955
1956
1957struct wpabuf * p2p_build_probe_resp_ies(struct p2p_data *p2p)
1958{
1959	struct wpabuf *buf;
1960	u8 *len;
1961	int pw_id = -1;
1962	size_t extra = 0;
1963
1964#ifdef CONFIG_WIFI_DISPLAY
1965	if (p2p->wfd_ie_probe_resp)
1966		extra = wpabuf_len(p2p->wfd_ie_probe_resp);
1967#endif /* CONFIG_WIFI_DISPLAY */
1968
1969	buf = wpabuf_alloc(1000 + extra);
1970	if (buf == NULL)
1971		return NULL;
1972
1973	if (p2p->go_neg_peer) {
1974		/* Advertise immediate availability of WPS credential */
1975		pw_id = p2p_wps_method_pw_id(p2p->go_neg_peer->wps_method);
1976	}
1977
1978	if (p2p_build_wps_ie(p2p, buf, pw_id, 1) < 0) {
1979		p2p_dbg(p2p, "Failed to build WPS IE for Probe Response");
1980		wpabuf_free(buf);
1981		return NULL;
1982	}
1983
1984#ifdef CONFIG_WIFI_DISPLAY
1985	if (p2p->wfd_ie_probe_resp)
1986		wpabuf_put_buf(buf, p2p->wfd_ie_probe_resp);
1987#endif /* CONFIG_WIFI_DISPLAY */
1988
1989	/* P2P IE */
1990	len = p2p_buf_add_ie_hdr(buf);
1991	p2p_buf_add_capability(buf, p2p->dev_capab &
1992			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
1993	if (p2p->ext_listen_interval)
1994		p2p_buf_add_ext_listen_timing(buf, p2p->ext_listen_period,
1995					      p2p->ext_listen_interval);
1996	p2p_buf_add_device_info(buf, p2p, NULL);
1997	p2p_buf_update_ie_hdr(buf, len);
1998
1999	return buf;
2000}
2001
2002
2003static enum p2p_probe_req_status
2004p2p_reply_probe(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
2005		const u8 *bssid, const u8 *ie, size_t ie_len)
2006{
2007	struct ieee802_11_elems elems;
2008	struct wpabuf *buf;
2009	struct ieee80211_mgmt *resp;
2010	struct p2p_message msg;
2011	struct wpabuf *ies;
2012
2013	if (!p2p->in_listen || !p2p->drv_in_listen) {
2014		/* not in Listen state - ignore Probe Request */
2015		return P2P_PREQ_NOT_LISTEN;
2016	}
2017
2018	if (ieee802_11_parse_elems((u8 *) ie, ie_len, &elems, 0) ==
2019	    ParseFailed) {
2020		/* Ignore invalid Probe Request frames */
2021		return P2P_PREQ_MALFORMED;
2022	}
2023
2024	if (elems.p2p == NULL) {
2025		/* not a P2P probe - ignore it */
2026		return P2P_PREQ_NOT_P2P;
2027	}
2028
2029	if (dst && !is_broadcast_ether_addr(dst) &&
2030	    os_memcmp(dst, p2p->cfg->dev_addr, ETH_ALEN) != 0) {
2031		/* Not sent to the broadcast address or our P2P Device Address
2032		 */
2033		return P2P_PREQ_NOT_PROCESSED;
2034	}
2035
2036	if (bssid && !is_broadcast_ether_addr(bssid)) {
2037		/* Not sent to the Wildcard BSSID */
2038		return P2P_PREQ_NOT_PROCESSED;
2039	}
2040
2041	if (elems.ssid == NULL || elems.ssid_len != P2P_WILDCARD_SSID_LEN ||
2042	    os_memcmp(elems.ssid, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN) !=
2043	    0) {
2044		/* not using P2P Wildcard SSID - ignore */
2045		return P2P_PREQ_NOT_PROCESSED;
2046	}
2047
2048	if (supp_rates_11b_only(&elems)) {
2049		/* Indicates support for 11b rates only */
2050		return P2P_PREQ_NOT_P2P;
2051	}
2052
2053	os_memset(&msg, 0, sizeof(msg));
2054	if (p2p_parse_ies(ie, ie_len, &msg) < 0) {
2055		/* Could not parse P2P attributes */
2056		return P2P_PREQ_NOT_P2P;
2057	}
2058
2059	if (msg.device_id &&
2060	    os_memcmp(msg.device_id, p2p->cfg->dev_addr, ETH_ALEN) != 0) {
2061		/* Device ID did not match */
2062		p2p_parse_free(&msg);
2063		return P2P_PREQ_NOT_PROCESSED;
2064	}
2065
2066	/* Check Requested Device Type match */
2067	if (msg.wps_attributes &&
2068	    !p2p_match_dev_type(p2p, msg.wps_attributes)) {
2069		/* No match with Requested Device Type */
2070		p2p_parse_free(&msg);
2071		return P2P_PREQ_NOT_PROCESSED;
2072	}
2073	p2p_parse_free(&msg);
2074
2075	if (!p2p->cfg->send_probe_resp) {
2076		/* Response generated elsewhere */
2077		return P2P_PREQ_NOT_PROCESSED;
2078	}
2079
2080	p2p_dbg(p2p, "Reply to P2P Probe Request in Listen state");
2081
2082	/*
2083	 * We do not really have a specific BSS that this frame is advertising,
2084	 * so build a frame that has some information in valid format. This is
2085	 * really only used for discovery purposes, not to learn exact BSS
2086	 * parameters.
2087	 */
2088	ies = p2p_build_probe_resp_ies(p2p);
2089	if (ies == NULL)
2090		return P2P_PREQ_NOT_PROCESSED;
2091
2092	buf = wpabuf_alloc(200 + wpabuf_len(ies));
2093	if (buf == NULL) {
2094		wpabuf_free(ies);
2095		return P2P_PREQ_NOT_PROCESSED;
2096	}
2097
2098	resp = NULL;
2099	resp = wpabuf_put(buf, resp->u.probe_resp.variable - (u8 *) resp);
2100
2101	resp->frame_control = host_to_le16((WLAN_FC_TYPE_MGMT << 2) |
2102					   (WLAN_FC_STYPE_PROBE_RESP << 4));
2103	os_memcpy(resp->da, addr, ETH_ALEN);
2104	os_memcpy(resp->sa, p2p->cfg->dev_addr, ETH_ALEN);
2105	os_memcpy(resp->bssid, p2p->cfg->dev_addr, ETH_ALEN);
2106	resp->u.probe_resp.beacon_int = host_to_le16(100);
2107	/* hardware or low-level driver will setup seq_ctrl and timestamp */
2108	resp->u.probe_resp.capab_info =
2109		host_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE |
2110			     WLAN_CAPABILITY_PRIVACY |
2111			     WLAN_CAPABILITY_SHORT_SLOT_TIME);
2112
2113	wpabuf_put_u8(buf, WLAN_EID_SSID);
2114	wpabuf_put_u8(buf, P2P_WILDCARD_SSID_LEN);
2115	wpabuf_put_data(buf, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
2116
2117	wpabuf_put_u8(buf, WLAN_EID_SUPP_RATES);
2118	wpabuf_put_u8(buf, 8);
2119	wpabuf_put_u8(buf, (60 / 5) | 0x80);
2120	wpabuf_put_u8(buf, 90 / 5);
2121	wpabuf_put_u8(buf, (120 / 5) | 0x80);
2122	wpabuf_put_u8(buf, 180 / 5);
2123	wpabuf_put_u8(buf, (240 / 5) | 0x80);
2124	wpabuf_put_u8(buf, 360 / 5);
2125	wpabuf_put_u8(buf, 480 / 5);
2126	wpabuf_put_u8(buf, 540 / 5);
2127
2128	wpabuf_put_u8(buf, WLAN_EID_DS_PARAMS);
2129	wpabuf_put_u8(buf, 1);
2130	wpabuf_put_u8(buf, p2p->cfg->channel);
2131
2132	wpabuf_put_buf(buf, ies);
2133	wpabuf_free(ies);
2134
2135	p2p->cfg->send_probe_resp(p2p->cfg->cb_ctx, buf);
2136
2137	wpabuf_free(buf);
2138
2139	return P2P_PREQ_NOT_PROCESSED;
2140}
2141
2142
2143enum p2p_probe_req_status
2144p2p_probe_req_rx(struct p2p_data *p2p, const u8 *addr, const u8 *dst,
2145		 const u8 *bssid, const u8 *ie, size_t ie_len)
2146{
2147	enum p2p_probe_req_status res;
2148
2149	p2p_add_dev_from_probe_req(p2p, addr, ie, ie_len);
2150
2151	res = p2p_reply_probe(p2p, addr, dst, bssid, ie, ie_len);
2152
2153	if ((p2p->state == P2P_CONNECT || p2p->state == P2P_CONNECT_LISTEN) &&
2154	    p2p->go_neg_peer &&
2155	    os_memcmp(addr, p2p->go_neg_peer->info.p2p_device_addr, ETH_ALEN)
2156	    == 0 &&
2157	    !(p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
2158		/* Received a Probe Request from GO Negotiation peer */
2159		p2p_dbg(p2p, "Found GO Negotiation peer - try to start GO negotiation from timeout");
2160		eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
2161		eloop_register_timeout(0, 0, p2p_go_neg_start, p2p, NULL);
2162		return P2P_PREQ_PROCESSED;
2163	}
2164
2165	if ((p2p->state == P2P_INVITE || p2p->state == P2P_INVITE_LISTEN) &&
2166	    p2p->invite_peer &&
2167	    os_memcmp(addr, p2p->invite_peer->info.p2p_device_addr, ETH_ALEN)
2168	    == 0) {
2169		/* Received a Probe Request from Invite peer */
2170		p2p_dbg(p2p, "Found Invite peer - try to start Invite from timeout");
2171		eloop_register_timeout(0, 0, p2p_invite_start, p2p, NULL);
2172		return P2P_PREQ_PROCESSED;
2173	}
2174
2175	return res;
2176}
2177
2178
2179static int p2p_assoc_req_ie_wlan_ap(struct p2p_data *p2p, const u8 *bssid,
2180				    u8 *buf, size_t len, struct wpabuf *p2p_ie)
2181{
2182	struct wpabuf *tmp;
2183	u8 *lpos;
2184	size_t tmplen;
2185	int res;
2186	u8 group_capab;
2187
2188	if (p2p_ie == NULL)
2189		return 0; /* WLAN AP is not a P2P manager */
2190
2191	/*
2192	 * (Re)Association Request - P2P IE
2193	 * P2P Capability attribute (shall be present)
2194	 * P2P Interface attribute (present if concurrent device and
2195	 *	P2P Management is enabled)
2196	 */
2197	tmp = wpabuf_alloc(200);
2198	if (tmp == NULL)
2199		return -1;
2200
2201	lpos = p2p_buf_add_ie_hdr(tmp);
2202	group_capab = 0;
2203	if (p2p->num_groups > 0) {
2204		group_capab |= P2P_GROUP_CAPAB_GROUP_OWNER;
2205		if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
2206		    (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED) &&
2207		    p2p->cross_connect)
2208			group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
2209	}
2210	p2p_buf_add_capability(tmp, p2p->dev_capab, group_capab);
2211	if ((p2p->dev_capab & P2P_DEV_CAPAB_CONCURRENT_OPER) &&
2212	    (p2p->dev_capab & P2P_DEV_CAPAB_INFRA_MANAGED))
2213		p2p_buf_add_p2p_interface(tmp, p2p);
2214	p2p_buf_update_ie_hdr(tmp, lpos);
2215
2216	tmplen = wpabuf_len(tmp);
2217	if (tmplen > len)
2218		res = -1;
2219	else {
2220		os_memcpy(buf, wpabuf_head(tmp), tmplen);
2221		res = tmplen;
2222	}
2223	wpabuf_free(tmp);
2224
2225	return res;
2226}
2227
2228
2229int p2p_assoc_req_ie(struct p2p_data *p2p, const u8 *bssid, u8 *buf,
2230		     size_t len, int p2p_group, struct wpabuf *p2p_ie)
2231{
2232	struct wpabuf *tmp;
2233	u8 *lpos;
2234	struct p2p_device *peer;
2235	size_t tmplen;
2236	int res;
2237	size_t extra = 0;
2238
2239	if (!p2p_group)
2240		return p2p_assoc_req_ie_wlan_ap(p2p, bssid, buf, len, p2p_ie);
2241
2242#ifdef CONFIG_WIFI_DISPLAY
2243	if (p2p->wfd_ie_assoc_req)
2244		extra = wpabuf_len(p2p->wfd_ie_assoc_req);
2245#endif /* CONFIG_WIFI_DISPLAY */
2246
2247	/*
2248	 * (Re)Association Request - P2P IE
2249	 * P2P Capability attribute (shall be present)
2250	 * Extended Listen Timing (may be present)
2251	 * P2P Device Info attribute (shall be present)
2252	 */
2253	tmp = wpabuf_alloc(200 + extra);
2254	if (tmp == NULL)
2255		return -1;
2256
2257#ifdef CONFIG_WIFI_DISPLAY
2258	if (p2p->wfd_ie_assoc_req)
2259		wpabuf_put_buf(tmp, p2p->wfd_ie_assoc_req);
2260#endif /* CONFIG_WIFI_DISPLAY */
2261
2262	peer = bssid ? p2p_get_device(p2p, bssid) : NULL;
2263
2264	lpos = p2p_buf_add_ie_hdr(tmp);
2265	p2p_buf_add_capability(tmp, p2p->dev_capab, 0);
2266	if (p2p->ext_listen_interval)
2267		p2p_buf_add_ext_listen_timing(tmp, p2p->ext_listen_period,
2268					      p2p->ext_listen_interval);
2269	p2p_buf_add_device_info(tmp, p2p, peer);
2270	p2p_buf_update_ie_hdr(tmp, lpos);
2271
2272	tmplen = wpabuf_len(tmp);
2273	if (tmplen > len)
2274		res = -1;
2275	else {
2276		os_memcpy(buf, wpabuf_head(tmp), tmplen);
2277		res = tmplen;
2278	}
2279	wpabuf_free(tmp);
2280
2281	return res;
2282}
2283
2284
2285int p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf, char *end)
2286{
2287	struct wpabuf *p2p_ie;
2288	int ret;
2289
2290	p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len, P2P_IE_VENDOR_TYPE);
2291	if (p2p_ie == NULL)
2292		return 0;
2293
2294	ret = p2p_attr_text(p2p_ie, buf, end);
2295	wpabuf_free(p2p_ie);
2296	return ret;
2297}
2298
2299
2300int p2p_parse_dev_addr_in_p2p_ie(struct wpabuf *p2p_ie, u8 *dev_addr)
2301{
2302	struct p2p_message msg;
2303
2304	os_memset(&msg, 0, sizeof(msg));
2305	if (p2p_parse_p2p_ie(p2p_ie, &msg))
2306		return -1;
2307
2308	if (msg.p2p_device_addr) {
2309		os_memcpy(dev_addr, msg.p2p_device_addr, ETH_ALEN);
2310		return 0;
2311	} else if (msg.device_id) {
2312		os_memcpy(dev_addr, msg.device_id, ETH_ALEN);
2313		return 0;
2314	}
2315	return -1;
2316}
2317
2318
2319int p2p_parse_dev_addr(const u8 *ies, size_t ies_len, u8 *dev_addr)
2320{
2321	struct wpabuf *p2p_ie;
2322	int ret;
2323
2324	p2p_ie = ieee802_11_vendor_ie_concat(ies, ies_len,
2325					     P2P_IE_VENDOR_TYPE);
2326	if (p2p_ie == NULL)
2327		return -1;
2328	ret = p2p_parse_dev_addr_in_p2p_ie(p2p_ie, dev_addr);
2329	wpabuf_free(p2p_ie);
2330	return ret;
2331}
2332
2333
2334static void p2p_clear_go_neg(struct p2p_data *p2p)
2335{
2336	p2p->go_neg_peer = NULL;
2337	p2p_clear_timeout(p2p);
2338	p2p_set_state(p2p, P2P_IDLE);
2339}
2340
2341
2342void p2p_wps_success_cb(struct p2p_data *p2p, const u8 *mac_addr)
2343{
2344	if (p2p->go_neg_peer == NULL) {
2345		p2p_dbg(p2p, "No pending Group Formation - ignore WPS registration success notification");
2346		return; /* No pending Group Formation */
2347	}
2348
2349	if (os_memcmp(mac_addr, p2p->go_neg_peer->intended_addr, ETH_ALEN) !=
2350	    0) {
2351		p2p_dbg(p2p, "Ignore WPS registration success notification for "
2352			MACSTR " (GO Negotiation peer " MACSTR ")",
2353			MAC2STR(mac_addr),
2354			MAC2STR(p2p->go_neg_peer->intended_addr));
2355		return; /* Ignore unexpected peer address */
2356	}
2357
2358	p2p_dbg(p2p, "Group Formation completed successfully with " MACSTR,
2359		MAC2STR(mac_addr));
2360
2361	p2p_clear_go_neg(p2p);
2362}
2363
2364
2365void p2p_group_formation_failed(struct p2p_data *p2p)
2366{
2367	if (p2p->go_neg_peer == NULL) {
2368		p2p_dbg(p2p, "No pending Group Formation - ignore group formation failure notification");
2369		return; /* No pending Group Formation */
2370	}
2371
2372	p2p_dbg(p2p, "Group Formation failed with " MACSTR,
2373		MAC2STR(p2p->go_neg_peer->intended_addr));
2374
2375	p2p_clear_go_neg(p2p);
2376}
2377
2378
2379struct p2p_data * p2p_init(const struct p2p_config *cfg)
2380{
2381	struct p2p_data *p2p;
2382
2383	if (cfg->max_peers < 1)
2384		return NULL;
2385
2386	p2p = os_zalloc(sizeof(*p2p) + sizeof(*cfg));
2387	if (p2p == NULL)
2388		return NULL;
2389	p2p->cfg = (struct p2p_config *) (p2p + 1);
2390	os_memcpy(p2p->cfg, cfg, sizeof(*cfg));
2391	if (cfg->dev_name)
2392		p2p->cfg->dev_name = os_strdup(cfg->dev_name);
2393	if (cfg->manufacturer)
2394		p2p->cfg->manufacturer = os_strdup(cfg->manufacturer);
2395	if (cfg->model_name)
2396		p2p->cfg->model_name = os_strdup(cfg->model_name);
2397	if (cfg->model_number)
2398		p2p->cfg->model_number = os_strdup(cfg->model_number);
2399	if (cfg->serial_number)
2400		p2p->cfg->serial_number = os_strdup(cfg->serial_number);
2401	if (cfg->pref_chan) {
2402		p2p->cfg->pref_chan = os_malloc(cfg->num_pref_chan *
2403						sizeof(struct p2p_channel));
2404		if (p2p->cfg->pref_chan) {
2405			os_memcpy(p2p->cfg->pref_chan, cfg->pref_chan,
2406				  cfg->num_pref_chan *
2407				  sizeof(struct p2p_channel));
2408		} else
2409			p2p->cfg->num_pref_chan = 0;
2410	}
2411
2412#ifdef ANDROID_P2P
2413	/* 100ms listen time is too less to receive the response frames in some scenarios
2414	 * increasing min listen time to 200ms.
2415	 */
2416	p2p->min_disc_int = 2;
2417	/* SD_FAIR_POLICY: Initializing the SD current serviced pointer to NULL */
2418	p2p->sd_dev_list = NULL;
2419#else
2420	p2p->min_disc_int = 1;
2421#endif
2422	p2p->max_disc_int = 3;
2423	p2p->max_disc_tu = -1;
2424
2425	os_get_random(&p2p->next_tie_breaker, 1);
2426	p2p->next_tie_breaker &= 0x01;
2427	if (cfg->sd_request)
2428		p2p->dev_capab |= P2P_DEV_CAPAB_SERVICE_DISCOVERY;
2429	p2p->dev_capab |= P2P_DEV_CAPAB_INVITATION_PROCEDURE;
2430	if (cfg->concurrent_operations)
2431		p2p->dev_capab |= P2P_DEV_CAPAB_CONCURRENT_OPER;
2432	p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
2433
2434	dl_list_init(&p2p->devices);
2435
2436	eloop_register_timeout(P2P_PEER_EXPIRATION_INTERVAL, 0,
2437			       p2p_expiration_timeout, p2p, NULL);
2438
2439	p2p->go_timeout = 100;
2440	p2p->client_timeout = 20;
2441
2442	p2p_dbg(p2p, "initialized");
2443	p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
2444	p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
2445
2446	return p2p;
2447}
2448
2449
2450void p2p_deinit(struct p2p_data *p2p)
2451{
2452#ifdef CONFIG_WIFI_DISPLAY
2453	wpabuf_free(p2p->wfd_ie_beacon);
2454	wpabuf_free(p2p->wfd_ie_probe_req);
2455	wpabuf_free(p2p->wfd_ie_probe_resp);
2456	wpabuf_free(p2p->wfd_ie_assoc_req);
2457	wpabuf_free(p2p->wfd_ie_invitation);
2458	wpabuf_free(p2p->wfd_ie_prov_disc_req);
2459	wpabuf_free(p2p->wfd_ie_prov_disc_resp);
2460	wpabuf_free(p2p->wfd_ie_go_neg);
2461	wpabuf_free(p2p->wfd_dev_info);
2462	wpabuf_free(p2p->wfd_assoc_bssid);
2463	wpabuf_free(p2p->wfd_coupled_sink_info);
2464#endif /* CONFIG_WIFI_DISPLAY */
2465
2466	eloop_cancel_timeout(p2p_expiration_timeout, p2p, NULL);
2467	eloop_cancel_timeout(p2p_ext_listen_timeout, p2p, NULL);
2468	eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
2469	eloop_cancel_timeout(p2p_go_neg_start, p2p, NULL);
2470	p2p_flush(p2p);
2471	p2p_free_req_dev_types(p2p);
2472	os_free(p2p->cfg->dev_name);
2473	os_free(p2p->cfg->manufacturer);
2474	os_free(p2p->cfg->model_name);
2475	os_free(p2p->cfg->model_number);
2476	os_free(p2p->cfg->serial_number);
2477	os_free(p2p->cfg->pref_chan);
2478	os_free(p2p->groups);
2479	wpabuf_free(p2p->sd_resp);
2480	os_free(p2p->after_scan_tx);
2481	p2p_remove_wps_vendor_extensions(p2p);
2482	os_free(p2p->no_go_freq.range);
2483	os_free(p2p);
2484}
2485
2486
2487void p2p_flush(struct p2p_data *p2p)
2488{
2489	struct p2p_device *dev, *prev;
2490	p2p_stop_find(p2p);
2491	dl_list_for_each_safe(dev, prev, &p2p->devices, struct p2p_device,
2492			      list) {
2493		dl_list_del(&dev->list);
2494		p2p_device_free(p2p, dev);
2495	}
2496#ifdef ANDROID_P2P
2497	/* SD_FAIR_POLICY: Initializing the SD current serviced pointer to NULL */
2498	p2p->sd_dev_list = NULL;
2499#endif
2500	p2p_free_sd_queries(p2p);
2501	os_free(p2p->after_scan_tx);
2502	p2p->after_scan_tx = NULL;
2503}
2504
2505
2506int p2p_unauthorize(struct p2p_data *p2p, const u8 *addr)
2507{
2508	struct p2p_device *dev;
2509
2510	dev = p2p_get_device(p2p, addr);
2511	if (dev == NULL)
2512		return -1;
2513
2514	p2p_dbg(p2p, "Unauthorizing " MACSTR, MAC2STR(addr));
2515
2516	if (p2p->go_neg_peer == dev)
2517		p2p->go_neg_peer = NULL;
2518
2519	dev->wps_method = WPS_NOT_READY;
2520	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
2521	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
2522
2523	/* Check if after_scan_tx is for this peer. If so free it */
2524	if (p2p->after_scan_tx &&
2525	    os_memcmp(addr, p2p->after_scan_tx->dst, ETH_ALEN) == 0) {
2526		os_free(p2p->after_scan_tx);
2527		p2p->after_scan_tx = NULL;
2528	}
2529
2530	return 0;
2531}
2532
2533
2534int p2p_set_dev_name(struct p2p_data *p2p, const char *dev_name)
2535{
2536	os_free(p2p->cfg->dev_name);
2537	if (dev_name) {
2538		p2p->cfg->dev_name = os_strdup(dev_name);
2539		if (p2p->cfg->dev_name == NULL)
2540			return -1;
2541	} else
2542		p2p->cfg->dev_name = NULL;
2543	return 0;
2544}
2545
2546
2547int p2p_set_manufacturer(struct p2p_data *p2p, const char *manufacturer)
2548{
2549	os_free(p2p->cfg->manufacturer);
2550	p2p->cfg->manufacturer = NULL;
2551	if (manufacturer) {
2552		p2p->cfg->manufacturer = os_strdup(manufacturer);
2553		if (p2p->cfg->manufacturer == NULL)
2554			return -1;
2555	}
2556
2557	return 0;
2558}
2559
2560
2561int p2p_set_model_name(struct p2p_data *p2p, const char *model_name)
2562{
2563	os_free(p2p->cfg->model_name);
2564	p2p->cfg->model_name = NULL;
2565	if (model_name) {
2566		p2p->cfg->model_name = os_strdup(model_name);
2567		if (p2p->cfg->model_name == NULL)
2568			return -1;
2569	}
2570
2571	return 0;
2572}
2573
2574
2575int p2p_set_model_number(struct p2p_data *p2p, const char *model_number)
2576{
2577	os_free(p2p->cfg->model_number);
2578	p2p->cfg->model_number = NULL;
2579	if (model_number) {
2580		p2p->cfg->model_number = os_strdup(model_number);
2581		if (p2p->cfg->model_number == NULL)
2582			return -1;
2583	}
2584
2585	return 0;
2586}
2587
2588
2589int p2p_set_serial_number(struct p2p_data *p2p, const char *serial_number)
2590{
2591	os_free(p2p->cfg->serial_number);
2592	p2p->cfg->serial_number = NULL;
2593	if (serial_number) {
2594		p2p->cfg->serial_number = os_strdup(serial_number);
2595		if (p2p->cfg->serial_number == NULL)
2596			return -1;
2597	}
2598
2599	return 0;
2600}
2601
2602
2603void p2p_set_config_methods(struct p2p_data *p2p, u16 config_methods)
2604{
2605	p2p->cfg->config_methods = config_methods;
2606}
2607
2608
2609void p2p_set_uuid(struct p2p_data *p2p, const u8 *uuid)
2610{
2611	os_memcpy(p2p->cfg->uuid, uuid, 16);
2612}
2613
2614
2615int p2p_set_pri_dev_type(struct p2p_data *p2p, const u8 *pri_dev_type)
2616{
2617	os_memcpy(p2p->cfg->pri_dev_type, pri_dev_type, 8);
2618	return 0;
2619}
2620
2621
2622int p2p_set_sec_dev_types(struct p2p_data *p2p, const u8 dev_types[][8],
2623			  size_t num_dev_types)
2624{
2625	if (num_dev_types > P2P_SEC_DEVICE_TYPES)
2626		num_dev_types = P2P_SEC_DEVICE_TYPES;
2627	p2p->cfg->num_sec_dev_types = num_dev_types;
2628	os_memcpy(p2p->cfg->sec_dev_type, dev_types, num_dev_types * 8);
2629	return 0;
2630}
2631
2632
2633void p2p_remove_wps_vendor_extensions(struct p2p_data *p2p)
2634{
2635	int i;
2636
2637	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
2638		wpabuf_free(p2p->wps_vendor_ext[i]);
2639		p2p->wps_vendor_ext[i] = NULL;
2640	}
2641}
2642
2643
2644int p2p_add_wps_vendor_extension(struct p2p_data *p2p,
2645				 const struct wpabuf *vendor_ext)
2646{
2647	int i;
2648
2649	if (vendor_ext == NULL)
2650		return -1;
2651
2652	for (i = 0; i < P2P_MAX_WPS_VENDOR_EXT; i++) {
2653		if (p2p->wps_vendor_ext[i] == NULL)
2654			break;
2655	}
2656	if (i >= P2P_MAX_WPS_VENDOR_EXT)
2657		return -1;
2658
2659	p2p->wps_vendor_ext[i] = wpabuf_dup(vendor_ext);
2660	if (p2p->wps_vendor_ext[i] == NULL)
2661		return -1;
2662
2663	return 0;
2664}
2665
2666
2667int p2p_set_country(struct p2p_data *p2p, const char *country)
2668{
2669	os_memcpy(p2p->cfg->country, country, 3);
2670	return 0;
2671}
2672
2673
2674void p2p_continue_find(struct p2p_data *p2p)
2675{
2676	struct p2p_device *dev;
2677#ifdef ANDROID_P2P
2678	int skip=1;
2679#endif
2680	p2p_set_state(p2p, P2P_SEARCH);
2681	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
2682#ifdef ANDROID_P2P
2683		/* SD_FAIR_POLICY: We need to give chance to all devices in the device list
2684		 * There may be a scenario, where a particular peer device have
2685		 * not registered any query response. When we send a SD request to such device,
2686		 * no response will be received. And if we continue to get probe responses from that device,
2687		 * and if that device happens to be on top in our device list,
2688		 * we will always continue to send SD requests always to that peer only.
2689		 * We will not be able to send SD requests to other devices in that case.
2690		 * This implementation keeps track of last serviced peer device.
2691		 * And then takes the next one from the device list, in the next iteration.
2692		 */
2693		if (p2p->sd_dev_list && p2p->sd_dev_list != &p2p->devices) {
2694			if(skip) {
2695				if ((&dev->list == p2p->sd_dev_list) ) {
2696					skip = 0;
2697					if (dev->list.next == &p2p->devices)
2698						p2p->sd_dev_list = NULL;
2699				}
2700				continue;
2701			}
2702		}
2703		p2p->sd_dev_list = &dev->list;
2704		wpa_printf(MSG_DEBUG, "P2P: ### Servicing %p dev->flags 0x%x SD schedule %s devaddr " MACSTR,
2705			p2p->sd_dev_list, dev->flags, dev->flags & P2P_DEV_SD_SCHEDULE ? "TRUE": "FALSE",
2706			MAC2STR(dev->info.p2p_device_addr));
2707#endif
2708		if (dev->flags & P2P_DEV_SD_SCHEDULE) {
2709			if (p2p_start_sd(p2p, dev) == 0)
2710				return;
2711			else
2712				break;
2713		} else if (dev->req_config_methods &&
2714			   !(dev->flags & P2P_DEV_PD_FOR_JOIN)) {
2715			p2p_dbg(p2p, "Send pending Provision Discovery Request to "
2716				MACSTR " (config methods 0x%x)",
2717				MAC2STR(dev->info.p2p_device_addr),
2718				dev->req_config_methods);
2719			if (p2p_send_prov_disc_req(p2p, dev, 0, 0) == 0)
2720				return;
2721		}
2722	}
2723
2724	p2p_listen_in_find(p2p, 1);
2725}
2726
2727
2728static void p2p_sd_cb(struct p2p_data *p2p, int success)
2729{
2730	p2p_dbg(p2p, "Service Discovery Query TX callback: success=%d",
2731		success);
2732	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
2733
2734	if (!success) {
2735		if (p2p->sd_peer) {
2736			p2p->sd_peer->flags &= ~P2P_DEV_SD_SCHEDULE;
2737			p2p->sd_peer = NULL;
2738		}
2739		p2p_continue_find(p2p);
2740		return;
2741	}
2742
2743	if (p2p->sd_peer == NULL) {
2744		p2p_dbg(p2p, "No SD peer entry known");
2745		p2p_continue_find(p2p);
2746		return;
2747	}
2748
2749	/* Wait for response from the peer */
2750	p2p_set_state(p2p, P2P_SD_DURING_FIND);
2751	p2p_set_timeout(p2p, 0, 200000);
2752}
2753
2754
2755/**
2756 * p2p_retry_pd - Retry any pending provision disc requests in IDLE state
2757 * @p2p: P2P module context from p2p_init()
2758 */
2759static void p2p_retry_pd(struct p2p_data *p2p)
2760{
2761	struct p2p_device *dev;
2762
2763	if (p2p->state != P2P_IDLE)
2764		return;
2765
2766	/*
2767	 * Retry the prov disc req attempt only for the peer that the user had
2768	 * requested.
2769	 */
2770
2771	dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
2772		if (os_memcmp(p2p->pending_pd_devaddr,
2773			      dev->info.p2p_device_addr, ETH_ALEN) != 0)
2774			continue;
2775		if (!dev->req_config_methods)
2776			continue;
2777
2778		p2p_dbg(p2p, "Send pending Provision Discovery Request to "
2779			MACSTR " (config methods 0x%x)",
2780			MAC2STR(dev->info.p2p_device_addr),
2781			dev->req_config_methods);
2782		p2p_send_prov_disc_req(p2p, dev,
2783				       dev->flags & P2P_DEV_PD_FOR_JOIN,
2784				       p2p->pd_force_freq);
2785		return;
2786	}
2787}
2788
2789
2790static void p2p_prov_disc_cb(struct p2p_data *p2p, int success)
2791{
2792	p2p_dbg(p2p, "Provision Discovery Request TX callback: success=%d",
2793		success);
2794
2795	/*
2796	 * Postpone resetting the pending action state till after we actually
2797	 * time out. This allows us to take some action like notifying any
2798	 * interested parties about no response to the request.
2799	 *
2800	 * When the timer (below) goes off we check in IDLE, SEARCH, or
2801	 * LISTEN_ONLY state, which are the only allowed states to issue a PD
2802	 * requests in, if this was still pending and then raise notification.
2803	 */
2804
2805	if (!success) {
2806		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
2807
2808		if (p2p->user_initiated_pd &&
2809		    (p2p->state == P2P_SEARCH || p2p->state == P2P_LISTEN_ONLY))
2810		{
2811			/* Retry request from timeout to avoid busy loops */
2812			p2p->pending_action_state = P2P_PENDING_PD;
2813			p2p_set_timeout(p2p, 0, 50000);
2814		} else if (p2p->state != P2P_IDLE)
2815			p2p_continue_find(p2p);
2816		else if (p2p->user_initiated_pd) {
2817			p2p->pending_action_state = P2P_PENDING_PD;
2818			p2p_set_timeout(p2p, 0, 300000);
2819		}
2820		return;
2821	}
2822
2823	/*
2824	 * This postponing, of resetting pending_action_state, needs to be
2825	 * done only for user initiated PD requests and not internal ones.
2826	 */
2827	if (p2p->user_initiated_pd)
2828		p2p->pending_action_state = P2P_PENDING_PD;
2829	else
2830		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
2831
2832	/* Wait for response from the peer */
2833	if (p2p->state == P2P_SEARCH)
2834		p2p_set_state(p2p, P2P_PD_DURING_FIND);
2835	p2p_set_timeout(p2p, 0, 200000);
2836}
2837
2838
2839int p2p_scan_res_handler(struct p2p_data *p2p, const u8 *bssid, int freq,
2840			 struct os_reltime *rx_time, int level, const u8 *ies,
2841			 size_t ies_len)
2842{
2843	if (os_reltime_before(rx_time, &p2p->find_start)) {
2844		/*
2845		 * The driver may have cached (e.g., in cfg80211 BSS table) the
2846		 * scan results for relatively long time. To avoid reporting
2847		 * stale information, update P2P peers only based on results
2848		 * that have based on frames received after the last p2p_find
2849		 * operation was started.
2850		 */
2851		p2p_dbg(p2p, "Ignore old scan result for " MACSTR
2852			" (rx_time=%u.%06u)",
2853			MAC2STR(bssid), (unsigned int) rx_time->sec,
2854			(unsigned int) rx_time->usec);
2855		return 0;
2856	}
2857
2858	p2p_add_device(p2p, bssid, freq, rx_time, level, ies, ies_len, 1);
2859
2860	return 0;
2861}
2862
2863
2864void p2p_scan_res_handled(struct p2p_data *p2p)
2865{
2866	if (!p2p->p2p_scan_running) {
2867		p2p_dbg(p2p, "p2p_scan was not running, but scan results received");
2868	}
2869	p2p->p2p_scan_running = 0;
2870	eloop_cancel_timeout(p2p_scan_timeout, p2p, NULL);
2871
2872	if (p2p_run_after_scan(p2p))
2873		return;
2874	if (p2p->state == P2P_SEARCH)
2875		p2p_continue_find(p2p);
2876}
2877
2878
2879void p2p_scan_ie(struct p2p_data *p2p, struct wpabuf *ies, const u8 *dev_id)
2880{
2881	u8 *len;
2882
2883#ifdef CONFIG_WIFI_DISPLAY
2884	if (p2p->wfd_ie_probe_req)
2885		wpabuf_put_buf(ies, p2p->wfd_ie_probe_req);
2886#endif /* CONFIG_WIFI_DISPLAY */
2887
2888	len = p2p_buf_add_ie_hdr(ies);
2889	p2p_buf_add_capability(ies, p2p->dev_capab &
2890			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY, 0);
2891	if (dev_id)
2892		p2p_buf_add_device_id(ies, dev_id);
2893	if (p2p->cfg->reg_class && p2p->cfg->channel)
2894		p2p_buf_add_listen_channel(ies, p2p->cfg->country,
2895					   p2p->cfg->reg_class,
2896					   p2p->cfg->channel);
2897	if (p2p->ext_listen_interval)
2898		p2p_buf_add_ext_listen_timing(ies, p2p->ext_listen_period,
2899					      p2p->ext_listen_interval);
2900	/* TODO: p2p_buf_add_operating_channel() if GO */
2901	p2p_buf_update_ie_hdr(ies, len);
2902}
2903
2904
2905size_t p2p_scan_ie_buf_len(struct p2p_data *p2p)
2906{
2907	size_t len = 100;
2908
2909#ifdef CONFIG_WIFI_DISPLAY
2910	if (p2p && p2p->wfd_ie_probe_req)
2911		len += wpabuf_len(p2p->wfd_ie_probe_req);
2912#endif /* CONFIG_WIFI_DISPLAY */
2913
2914	return len;
2915}
2916
2917
2918int p2p_ie_text(struct wpabuf *p2p_ie, char *buf, char *end)
2919{
2920	return p2p_attr_text(p2p_ie, buf, end);
2921}
2922
2923
2924static void p2p_go_neg_req_cb(struct p2p_data *p2p, int success)
2925{
2926	struct p2p_device *dev = p2p->go_neg_peer;
2927	int timeout;
2928
2929	p2p_dbg(p2p, "GO Negotiation Request TX callback: success=%d", success);
2930
2931	if (dev == NULL) {
2932		p2p_dbg(p2p, "No pending GO Negotiation");
2933		return;
2934	}
2935
2936	if (success) {
2937		if (dev->flags & P2P_DEV_USER_REJECTED) {
2938			p2p_set_state(p2p, P2P_IDLE);
2939			return;
2940		}
2941	} else if (dev->go_neg_req_sent) {
2942		/* Cancel the increment from p2p_connect_send() on failure */
2943		dev->go_neg_req_sent--;
2944	}
2945
2946	if (!success &&
2947	    (dev->info.dev_capab & P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY) &&
2948	    !is_zero_ether_addr(dev->member_in_go_dev)) {
2949		p2p_dbg(p2p, "Peer " MACSTR " did not acknowledge request - try to use device discoverability through its GO",
2950			MAC2STR(dev->info.p2p_device_addr));
2951		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
2952		p2p_send_dev_disc_req(p2p, dev);
2953		return;
2954	}
2955
2956	/*
2957	 * Use P2P find, if needed, to find the other device from its listen
2958	 * channel.
2959	 */
2960	p2p_set_state(p2p, P2P_CONNECT);
2961	timeout = success ? 500000 : 100000;
2962	if (!success && p2p->go_neg_peer &&
2963	    (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE)) {
2964		unsigned int r;
2965		/*
2966		 * Peer is expected to wait our response and we will skip the
2967		 * listen phase. Add some randomness to the wait time here to
2968		 * make it less likely to hit cases where we could end up in
2969		 * sync with peer not listening.
2970		 */
2971		os_get_random((u8 *) &r, sizeof(r));
2972		timeout += r % 100000;
2973	}
2974	p2p_set_timeout(p2p, 0, timeout);
2975}
2976
2977
2978static void p2p_go_neg_resp_cb(struct p2p_data *p2p, int success)
2979{
2980	p2p_dbg(p2p, "GO Negotiation Response TX callback: success=%d",
2981		success);
2982	if (!p2p->go_neg_peer && p2p->state == P2P_PROVISIONING) {
2983		p2p_dbg(p2p, "Ignore TX callback event - GO Negotiation is not running anymore");
2984		return;
2985	}
2986	p2p_set_state(p2p, P2P_CONNECT);
2987	p2p_set_timeout(p2p, 0, 500000);
2988}
2989
2990
2991static void p2p_go_neg_resp_failure_cb(struct p2p_data *p2p, int success,
2992				       const u8 *addr)
2993{
2994	p2p_dbg(p2p, "GO Negotiation Response (failure) TX callback: success=%d", success);
2995	if (p2p->go_neg_peer && p2p->go_neg_peer->status != P2P_SC_SUCCESS) {
2996		p2p_go_neg_failed(p2p, p2p->go_neg_peer,
2997				  p2p->go_neg_peer->status);
2998	} else if (success) {
2999		struct p2p_device *dev;
3000		dev = p2p_get_device(p2p, addr);
3001		if (dev &&
3002		    dev->status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE)
3003			dev->flags |= P2P_DEV_PEER_WAITING_RESPONSE;
3004	}
3005}
3006
3007
3008static void p2p_go_neg_conf_cb(struct p2p_data *p2p,
3009			       enum p2p_send_action_result result)
3010{
3011	struct p2p_device *dev;
3012
3013	p2p_dbg(p2p, "GO Negotiation Confirm TX callback: result=%d", result);
3014	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3015	if (result == P2P_SEND_ACTION_FAILED) {
3016		p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
3017		return;
3018	}
3019	if (result == P2P_SEND_ACTION_NO_ACK) {
3020		/*
3021		 * It looks like the TX status for GO Negotiation Confirm is
3022		 * often showing failure even when the peer has actually
3023		 * received the frame. Since the peer may change channels
3024		 * immediately after having received the frame, we may not see
3025		 * an Ack for retries, so just dropping a single frame may
3026		 * trigger this. To allow the group formation to succeed if the
3027		 * peer did indeed receive the frame, continue regardless of
3028		 * the TX status.
3029		 */
3030		p2p_dbg(p2p, "Assume GO Negotiation Confirm TX was actually received by the peer even though Ack was not reported");
3031	}
3032
3033	dev = p2p->go_neg_peer;
3034	if (dev == NULL)
3035		return;
3036
3037	p2p_go_complete(p2p, dev);
3038}
3039
3040
3041void p2p_send_action_cb(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
3042			const u8 *src, const u8 *bssid,
3043			enum p2p_send_action_result result)
3044{
3045	enum p2p_pending_action_state state;
3046	int success;
3047
3048	p2p_dbg(p2p, "Action frame TX callback (state=%d freq=%u dst=" MACSTR
3049		" src=" MACSTR " bssid=" MACSTR " result=%d",
3050		p2p->pending_action_state, freq, MAC2STR(dst), MAC2STR(src),
3051		MAC2STR(bssid), result);
3052	success = result == P2P_SEND_ACTION_SUCCESS;
3053	state = p2p->pending_action_state;
3054	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3055	switch (state) {
3056	case P2P_NO_PENDING_ACTION:
3057		if (p2p->after_scan_tx_in_progress) {
3058			p2p->after_scan_tx_in_progress = 0;
3059			if (p2p->start_after_scan != P2P_AFTER_SCAN_NOTHING &&
3060			    p2p_run_after_scan(p2p))
3061				break;
3062			if (p2p->state == P2P_SEARCH) {
3063				p2p_dbg(p2p, "Continue find after after_scan_tx completion");
3064				p2p_continue_find(p2p);
3065			}
3066		}
3067		break;
3068	case P2P_PENDING_GO_NEG_REQUEST:
3069		p2p_go_neg_req_cb(p2p, success);
3070		break;
3071	case P2P_PENDING_GO_NEG_RESPONSE:
3072		p2p_go_neg_resp_cb(p2p, success);
3073		break;
3074	case P2P_PENDING_GO_NEG_RESPONSE_FAILURE:
3075		p2p_go_neg_resp_failure_cb(p2p, success, dst);
3076		break;
3077	case P2P_PENDING_GO_NEG_CONFIRM:
3078		p2p_go_neg_conf_cb(p2p, result);
3079		break;
3080	case P2P_PENDING_SD:
3081		p2p_sd_cb(p2p, success);
3082		break;
3083	case P2P_PENDING_PD:
3084		p2p_prov_disc_cb(p2p, success);
3085		break;
3086	case P2P_PENDING_INVITATION_REQUEST:
3087		p2p_invitation_req_cb(p2p, success);
3088		break;
3089	case P2P_PENDING_INVITATION_RESPONSE:
3090		p2p_invitation_resp_cb(p2p, success);
3091		break;
3092	case P2P_PENDING_DEV_DISC_REQUEST:
3093		p2p_dev_disc_req_cb(p2p, success);
3094		break;
3095	case P2P_PENDING_DEV_DISC_RESPONSE:
3096		p2p_dev_disc_resp_cb(p2p, success);
3097		break;
3098	case P2P_PENDING_GO_DISC_REQ:
3099		p2p_go_disc_req_cb(p2p, success);
3100		break;
3101	}
3102
3103	p2p->after_scan_tx_in_progress = 0;
3104}
3105
3106
3107void p2p_listen_cb(struct p2p_data *p2p, unsigned int freq,
3108		   unsigned int duration)
3109{
3110	if (freq == p2p->pending_client_disc_freq) {
3111		p2p_dbg(p2p, "Client discoverability remain-awake completed");
3112		p2p->pending_client_disc_freq = 0;
3113		return;
3114	}
3115
3116	if (freq != p2p->pending_listen_freq) {
3117		p2p_dbg(p2p, "Unexpected listen callback for freq=%u duration=%u (pending_listen_freq=%u)",
3118			freq, duration, p2p->pending_listen_freq);
3119		return;
3120	}
3121
3122	p2p_dbg(p2p, "Starting Listen timeout(%u,%u) on freq=%u based on callback",
3123		p2p->pending_listen_sec, p2p->pending_listen_usec,
3124		p2p->pending_listen_freq);
3125	p2p->in_listen = 1;
3126	p2p->drv_in_listen = freq;
3127	if (p2p->pending_listen_sec || p2p->pending_listen_usec) {
3128		/*
3129		 * Add 20 msec extra wait to avoid race condition with driver
3130		 * remain-on-channel end event, i.e., give driver more time to
3131		 * complete the operation before our timeout expires.
3132		 */
3133		p2p_set_timeout(p2p, p2p->pending_listen_sec,
3134				p2p->pending_listen_usec + 20000);
3135	}
3136
3137	p2p->pending_listen_freq = 0;
3138}
3139
3140
3141int p2p_listen_end(struct p2p_data *p2p, unsigned int freq)
3142{
3143	p2p_dbg(p2p, "Driver ended Listen state (freq=%u)", freq);
3144	p2p->drv_in_listen = 0;
3145	if (p2p->in_listen)
3146		return 0; /* Internal timeout will trigger the next step */
3147
3148	if (p2p->state == P2P_CONNECT_LISTEN && p2p->go_neg_peer) {
3149		if (p2p->go_neg_peer->connect_reqs >= 120) {
3150			p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
3151			p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
3152			return 0;
3153		}
3154
3155		p2p_set_state(p2p, P2P_CONNECT);
3156		p2p_connect_send(p2p, p2p->go_neg_peer);
3157		return 1;
3158	} else if (p2p->state == P2P_SEARCH) {
3159		if (p2p->p2p_scan_running) {
3160			 /*
3161			  * Search is already in progress. This can happen if
3162			  * an Action frame RX is reported immediately after
3163			  * the end of a remain-on-channel operation and the
3164			  * response frame to that is sent using an offchannel
3165			  * operation while in p2p_find. Avoid an attempt to
3166			  * restart a scan here.
3167			  */
3168			p2p_dbg(p2p, "p2p_scan already in progress - do not try to start a new one");
3169			return 1;
3170		}
3171		if (p2p->pending_listen_freq) {
3172			/*
3173			 * Better wait a bit if the driver is unable to start
3174			 * offchannel operation for some reason. p2p_search()
3175			 * will be started from internal timeout.
3176			 */
3177			p2p_dbg(p2p, "Listen operation did not seem to start - delay search phase to avoid busy loop");
3178			p2p_set_timeout(p2p, 0, 100000);
3179			return 1;
3180		}
3181		if (p2p->search_delay) {
3182			p2p_dbg(p2p, "Delay search operation by %u ms",
3183				p2p->search_delay);
3184			p2p_set_timeout(p2p, p2p->search_delay / 1000,
3185					(p2p->search_delay % 1000) * 1000);
3186			return 1;
3187		}
3188		p2p_search(p2p);
3189		return 1;
3190	}
3191
3192	return 0;
3193}
3194
3195
3196static void p2p_timeout_connect(struct p2p_data *p2p)
3197{
3198	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3199	if (p2p->go_neg_peer &&
3200	    (p2p->go_neg_peer->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
3201		p2p_dbg(p2p, "Wait for GO Negotiation Confirm timed out - assume GO Negotiation failed");
3202		p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
3203		return;
3204	}
3205	if (p2p->go_neg_peer &&
3206	    (p2p->go_neg_peer->flags & P2P_DEV_PEER_WAITING_RESPONSE) &&
3207	    p2p->go_neg_peer->connect_reqs < 120) {
3208		p2p_dbg(p2p, "Peer expected to wait our response - skip listen");
3209		p2p_connect_send(p2p, p2p->go_neg_peer);
3210		return;
3211	}
3212
3213	p2p_set_state(p2p, P2P_CONNECT_LISTEN);
3214	p2p_listen_in_find(p2p, 0);
3215}
3216
3217
3218static void p2p_timeout_connect_listen(struct p2p_data *p2p)
3219{
3220	if (p2p->go_neg_peer) {
3221		if (p2p->drv_in_listen) {
3222			p2p_dbg(p2p, "Driver is still in Listen state; wait for it to complete");
3223			return;
3224		}
3225
3226		if (p2p->go_neg_peer->connect_reqs >= 120) {
3227			p2p_dbg(p2p, "Timeout on sending GO Negotiation Request without getting response");
3228			p2p_go_neg_failed(p2p, p2p->go_neg_peer, -1);
3229			return;
3230		}
3231
3232		p2p_set_state(p2p, P2P_CONNECT);
3233		p2p_connect_send(p2p, p2p->go_neg_peer);
3234	} else
3235		p2p_set_state(p2p, P2P_IDLE);
3236}
3237
3238
3239static void p2p_timeout_wait_peer_connect(struct p2p_data *p2p)
3240{
3241	/*
3242	 * TODO: could remain constantly in Listen state for some time if there
3243	 * are no other concurrent uses for the radio. For now, go to listen
3244	 * state once per second to give other uses a chance to use the radio.
3245	 */
3246	p2p_set_state(p2p, P2P_WAIT_PEER_IDLE);
3247	p2p_set_timeout(p2p, 0, 500000);
3248}
3249
3250
3251static void p2p_timeout_wait_peer_idle(struct p2p_data *p2p)
3252{
3253	struct p2p_device *dev = p2p->go_neg_peer;
3254
3255	if (dev == NULL) {
3256		p2p_dbg(p2p, "Unknown GO Neg peer - stop GO Neg wait");
3257		return;
3258	}
3259
3260	dev->wait_count++;
3261	if (dev->wait_count >= 120) {
3262		p2p_dbg(p2p, "Timeout on waiting peer to become ready for GO Negotiation");
3263		p2p_go_neg_failed(p2p, dev, -1);
3264		return;
3265	}
3266
3267	p2p_dbg(p2p, "Go to Listen state while waiting for the peer to become ready for GO Negotiation");
3268	p2p_set_state(p2p, P2P_WAIT_PEER_CONNECT);
3269	p2p_listen_in_find(p2p, 0);
3270}
3271
3272
3273static void p2p_timeout_sd_during_find(struct p2p_data *p2p)
3274{
3275	p2p_dbg(p2p, "Service Discovery Query timeout");
3276	if (p2p->sd_peer) {
3277		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3278		p2p->sd_peer->flags &= ~P2P_DEV_SD_SCHEDULE;
3279		p2p->sd_peer = NULL;
3280	}
3281	p2p_continue_find(p2p);
3282}
3283
3284
3285static void p2p_timeout_prov_disc_during_find(struct p2p_data *p2p)
3286{
3287	p2p_dbg(p2p, "Provision Discovery Request timeout");
3288	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3289	p2p_continue_find(p2p);
3290}
3291
3292
3293static void p2p_timeout_prov_disc_req(struct p2p_data *p2p)
3294{
3295	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3296
3297	/*
3298	 * For user initiated PD requests that we have not gotten any responses
3299	 * for while in IDLE state, we retry them a couple of times before
3300	 * giving up.
3301	 */
3302	if (!p2p->user_initiated_pd)
3303		return;
3304
3305	p2p_dbg(p2p, "User initiated Provision Discovery Request timeout");
3306
3307	if (p2p->pd_retries) {
3308		p2p->pd_retries--;
3309		p2p_retry_pd(p2p);
3310	} else {
3311		struct p2p_device *dev;
3312		int for_join = 0;
3313
3314		dl_list_for_each(dev, &p2p->devices, struct p2p_device, list) {
3315			if (os_memcmp(p2p->pending_pd_devaddr,
3316				      dev->info.p2p_device_addr, ETH_ALEN) != 0)
3317				continue;
3318			if (dev->req_config_methods &&
3319			    (dev->flags & P2P_DEV_PD_FOR_JOIN))
3320				for_join = 1;
3321		}
3322
3323		if (p2p->cfg->prov_disc_fail)
3324			p2p->cfg->prov_disc_fail(p2p->cfg->cb_ctx,
3325						 p2p->pending_pd_devaddr,
3326						 for_join ?
3327						 P2P_PROV_DISC_TIMEOUT_JOIN :
3328						 P2P_PROV_DISC_TIMEOUT);
3329		p2p_reset_pending_pd(p2p);
3330	}
3331}
3332
3333
3334static void p2p_timeout_invite(struct p2p_data *p2p)
3335{
3336	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
3337	p2p_set_state(p2p, P2P_INVITE_LISTEN);
3338	if (p2p->inv_role == P2P_INVITE_ROLE_ACTIVE_GO) {
3339		/*
3340		 * Better remain on operating channel instead of listen channel
3341		 * when running a group.
3342		 */
3343		p2p_dbg(p2p, "Inviting in active GO role - wait on operating channel");
3344		p2p_set_timeout(p2p, 0, 100000);
3345		return;
3346	}
3347	p2p_listen_in_find(p2p, 0);
3348}
3349
3350
3351static void p2p_timeout_invite_listen(struct p2p_data *p2p)
3352{
3353	if (p2p->invite_peer && p2p->invite_peer->invitation_reqs < 100) {
3354		p2p_set_state(p2p, P2P_INVITE);
3355		p2p_invite_send(p2p, p2p->invite_peer,
3356				p2p->invite_go_dev_addr);
3357	} else {
3358		if (p2p->invite_peer) {
3359			p2p_dbg(p2p, "Invitation Request retry limit reached");
3360			if (p2p->cfg->invitation_result)
3361				p2p->cfg->invitation_result(
3362					p2p->cfg->cb_ctx, -1, NULL, NULL,
3363					p2p->invite_peer->info.p2p_device_addr,
3364					0);
3365		}
3366		p2p_set_state(p2p, P2P_IDLE);
3367	}
3368}
3369
3370
3371static void p2p_state_timeout(void *eloop_ctx, void *timeout_ctx)
3372{
3373	struct p2p_data *p2p = eloop_ctx;
3374
3375	p2p_dbg(p2p, "Timeout (state=%s)", p2p_state_txt(p2p->state));
3376
3377	p2p->in_listen = 0;
3378
3379	switch (p2p->state) {
3380	case P2P_IDLE:
3381		/* Check if we timed out waiting for PD req */
3382		if (p2p->pending_action_state == P2P_PENDING_PD)
3383			p2p_timeout_prov_disc_req(p2p);
3384		break;
3385	case P2P_SEARCH:
3386		/* Check if we timed out waiting for PD req */
3387		if (p2p->pending_action_state == P2P_PENDING_PD)
3388			p2p_timeout_prov_disc_req(p2p);
3389		if (p2p->search_delay && !p2p->in_search_delay) {
3390			p2p_dbg(p2p, "Delay search operation by %u ms",
3391				p2p->search_delay);
3392			p2p->in_search_delay = 1;
3393			p2p_set_timeout(p2p, p2p->search_delay / 1000,
3394					(p2p->search_delay % 1000) * 1000);
3395			break;
3396		}
3397		p2p->in_search_delay = 0;
3398		p2p_search(p2p);
3399		break;
3400	case P2P_CONNECT:
3401		p2p_timeout_connect(p2p);
3402		break;
3403	case P2P_CONNECT_LISTEN:
3404		p2p_timeout_connect_listen(p2p);
3405		break;
3406	case P2P_GO_NEG:
3407		break;
3408	case P2P_LISTEN_ONLY:
3409		/* Check if we timed out waiting for PD req */
3410		if (p2p->pending_action_state == P2P_PENDING_PD)
3411			p2p_timeout_prov_disc_req(p2p);
3412
3413		if (p2p->ext_listen_only) {
3414			p2p_dbg(p2p, "Extended Listen Timing - Listen State completed");
3415			p2p->ext_listen_only = 0;
3416			p2p_set_state(p2p, P2P_IDLE);
3417		}
3418		break;
3419	case P2P_WAIT_PEER_CONNECT:
3420		p2p_timeout_wait_peer_connect(p2p);
3421		break;
3422	case P2P_WAIT_PEER_IDLE:
3423		p2p_timeout_wait_peer_idle(p2p);
3424		break;
3425	case P2P_SD_DURING_FIND:
3426		p2p_timeout_sd_during_find(p2p);
3427		break;
3428	case P2P_PROVISIONING:
3429		break;
3430	case P2P_PD_DURING_FIND:
3431		p2p_timeout_prov_disc_during_find(p2p);
3432		break;
3433	case P2P_INVITE:
3434		p2p_timeout_invite(p2p);
3435		break;
3436	case P2P_INVITE_LISTEN:
3437		p2p_timeout_invite_listen(p2p);
3438		break;
3439	}
3440}
3441
3442
3443int p2p_reject(struct p2p_data *p2p, const u8 *peer_addr)
3444{
3445	struct p2p_device *dev;
3446
3447	dev = p2p_get_device(p2p, peer_addr);
3448	p2p_dbg(p2p, "Local request to reject connection attempts by peer "
3449		MACSTR, MAC2STR(peer_addr));
3450	if (dev == NULL) {
3451		p2p_dbg(p2p, "Peer " MACSTR " unknown", MAC2STR(peer_addr));
3452		return -1;
3453	}
3454	dev->status = P2P_SC_FAIL_REJECTED_BY_USER;
3455	dev->flags |= P2P_DEV_USER_REJECTED;
3456	return 0;
3457}
3458
3459
3460const char * p2p_wps_method_text(enum p2p_wps_method method)
3461{
3462	switch (method) {
3463	case WPS_NOT_READY:
3464		return "not-ready";
3465	case WPS_PIN_DISPLAY:
3466		return "Display";
3467	case WPS_PIN_KEYPAD:
3468		return "Keypad";
3469	case WPS_PBC:
3470		return "PBC";
3471	}
3472
3473	return "??";
3474}
3475
3476
3477static const char * p2p_go_state_text(enum p2p_go_state go_state)
3478{
3479	switch (go_state) {
3480	case UNKNOWN_GO:
3481		return "unknown";
3482	case LOCAL_GO:
3483		return "local";
3484	case  REMOTE_GO:
3485		return "remote";
3486	}
3487
3488	return "??";
3489}
3490
3491
3492const struct p2p_peer_info * p2p_get_peer_info(struct p2p_data *p2p,
3493					       const u8 *addr, int next)
3494{
3495	struct p2p_device *dev;
3496
3497	if (addr)
3498		dev = p2p_get_device(p2p, addr);
3499	else
3500		dev = dl_list_first(&p2p->devices, struct p2p_device, list);
3501
3502	if (dev && next) {
3503		dev = dl_list_first(&dev->list, struct p2p_device, list);
3504		if (&dev->list == &p2p->devices)
3505			dev = NULL;
3506	}
3507
3508	if (dev == NULL)
3509		return NULL;
3510
3511	return &dev->info;
3512}
3513
3514
3515int p2p_get_peer_info_txt(const struct p2p_peer_info *info,
3516			  char *buf, size_t buflen)
3517{
3518	struct p2p_device *dev;
3519	int res;
3520	char *pos, *end;
3521	struct os_reltime now;
3522
3523	if (info == NULL)
3524		return -1;
3525
3526	dev = (struct p2p_device *) (((u8 *) info) -
3527				     offsetof(struct p2p_device, info));
3528
3529	pos = buf;
3530	end = buf + buflen;
3531
3532	os_get_reltime(&now);
3533	res = os_snprintf(pos, end - pos,
3534			  "age=%d\n"
3535			  "listen_freq=%d\n"
3536			  "wps_method=%s\n"
3537			  "interface_addr=" MACSTR "\n"
3538			  "member_in_go_dev=" MACSTR "\n"
3539			  "member_in_go_iface=" MACSTR "\n"
3540			  "go_neg_req_sent=%d\n"
3541			  "go_state=%s\n"
3542			  "dialog_token=%u\n"
3543			  "intended_addr=" MACSTR "\n"
3544			  "country=%c%c\n"
3545			  "oper_freq=%d\n"
3546			  "req_config_methods=0x%x\n"
3547			  "flags=%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n"
3548			  "status=%d\n"
3549			  "wait_count=%u\n"
3550			  "invitation_reqs=%u\n",
3551			  (int) (now.sec - dev->last_seen.sec),
3552			  dev->listen_freq,
3553			  p2p_wps_method_text(dev->wps_method),
3554			  MAC2STR(dev->interface_addr),
3555			  MAC2STR(dev->member_in_go_dev),
3556			  MAC2STR(dev->member_in_go_iface),
3557			  dev->go_neg_req_sent,
3558			  p2p_go_state_text(dev->go_state),
3559			  dev->dialog_token,
3560			  MAC2STR(dev->intended_addr),
3561			  dev->country[0] ? dev->country[0] : '_',
3562			  dev->country[1] ? dev->country[1] : '_',
3563			  dev->oper_freq,
3564			  dev->req_config_methods,
3565			  dev->flags & P2P_DEV_PROBE_REQ_ONLY ?
3566			  "[PROBE_REQ_ONLY]" : "",
3567			  dev->flags & P2P_DEV_REPORTED ? "[REPORTED]" : "",
3568			  dev->flags & P2P_DEV_NOT_YET_READY ?
3569			  "[NOT_YET_READY]" : "",
3570			  dev->flags & P2P_DEV_SD_INFO ? "[SD_INFO]" : "",
3571			  dev->flags & P2P_DEV_SD_SCHEDULE ? "[SD_SCHEDULE]" :
3572			  "",
3573			  dev->flags & P2P_DEV_PD_PEER_DISPLAY ?
3574			  "[PD_PEER_DISPLAY]" : "",
3575			  dev->flags & P2P_DEV_PD_PEER_KEYPAD ?
3576			  "[PD_PEER_KEYPAD]" : "",
3577			  dev->flags & P2P_DEV_USER_REJECTED ?
3578			  "[USER_REJECTED]" : "",
3579			  dev->flags & P2P_DEV_PEER_WAITING_RESPONSE ?
3580			  "[PEER_WAITING_RESPONSE]" : "",
3581			  dev->flags & P2P_DEV_PREFER_PERSISTENT_GROUP ?
3582			  "[PREFER_PERSISTENT_GROUP]" : "",
3583			  dev->flags & P2P_DEV_WAIT_GO_NEG_RESPONSE ?
3584			  "[WAIT_GO_NEG_RESPONSE]" : "",
3585			  dev->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM ?
3586			  "[WAIT_GO_NEG_CONFIRM]" : "",
3587			  dev->flags & P2P_DEV_GROUP_CLIENT_ONLY ?
3588			  "[GROUP_CLIENT_ONLY]" : "",
3589			  dev->flags & P2P_DEV_FORCE_FREQ ?
3590			  "[FORCE_FREQ]" : "",
3591			  dev->flags & P2P_DEV_PD_FOR_JOIN ?
3592			  "[PD_FOR_JOIN]" : "",
3593			  dev->status,
3594			  dev->wait_count,
3595			  dev->invitation_reqs);
3596	if (res < 0 || res >= end - pos)
3597		return pos - buf;
3598	pos += res;
3599
3600	if (dev->ext_listen_period) {
3601		res = os_snprintf(pos, end - pos,
3602				  "ext_listen_period=%u\n"
3603				  "ext_listen_interval=%u\n",
3604				  dev->ext_listen_period,
3605				  dev->ext_listen_interval);
3606		if (res < 0 || res >= end - pos)
3607			return pos - buf;
3608		pos += res;
3609	}
3610
3611	if (dev->oper_ssid_len) {
3612		res = os_snprintf(pos, end - pos,
3613				  "oper_ssid=%s\n",
3614				  wpa_ssid_txt(dev->oper_ssid,
3615					       dev->oper_ssid_len));
3616		if (res < 0 || res >= end - pos)
3617			return pos - buf;
3618		pos += res;
3619	}
3620
3621#ifdef CONFIG_WIFI_DISPLAY
3622	if (dev->info.wfd_subelems) {
3623		res = os_snprintf(pos, end - pos, "wfd_subelems=");
3624		if (res < 0 || res >= end - pos)
3625			return pos - buf;
3626		pos += res;
3627
3628		pos += wpa_snprintf_hex(pos, end - pos,
3629					wpabuf_head(dev->info.wfd_subelems),
3630					wpabuf_len(dev->info.wfd_subelems));
3631
3632		res = os_snprintf(pos, end - pos, "\n");
3633		if (res < 0 || res >= end - pos)
3634			return pos - buf;
3635		pos += res;
3636	}
3637#endif /* CONFIG_WIFI_DISPLAY */
3638
3639	return pos - buf;
3640}
3641
3642
3643int p2p_peer_known(struct p2p_data *p2p, const u8 *addr)
3644{
3645	return p2p_get_device(p2p, addr) != NULL;
3646}
3647
3648
3649void p2p_set_client_discoverability(struct p2p_data *p2p, int enabled)
3650{
3651	if (enabled) {
3652		p2p_dbg(p2p, "Client discoverability enabled");
3653		p2p->dev_capab |= P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
3654	} else {
3655		p2p_dbg(p2p, "Client discoverability disabled");
3656		p2p->dev_capab &= ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY;
3657	}
3658}
3659
3660
3661static struct wpabuf * p2p_build_presence_req(u32 duration1, u32 interval1,
3662					      u32 duration2, u32 interval2)
3663{
3664	struct wpabuf *req;
3665	struct p2p_noa_desc desc1, desc2, *ptr1 = NULL, *ptr2 = NULL;
3666	u8 *len;
3667
3668	req = wpabuf_alloc(100);
3669	if (req == NULL)
3670		return NULL;
3671
3672	if (duration1 || interval1) {
3673		os_memset(&desc1, 0, sizeof(desc1));
3674		desc1.count_type = 1;
3675		desc1.duration = duration1;
3676		desc1.interval = interval1;
3677		ptr1 = &desc1;
3678
3679		if (duration2 || interval2) {
3680			os_memset(&desc2, 0, sizeof(desc2));
3681			desc2.count_type = 2;
3682			desc2.duration = duration2;
3683			desc2.interval = interval2;
3684			ptr2 = &desc2;
3685		}
3686	}
3687
3688	p2p_buf_add_action_hdr(req, P2P_PRESENCE_REQ, 1);
3689	len = p2p_buf_add_ie_hdr(req);
3690	p2p_buf_add_noa(req, 0, 0, 0, ptr1, ptr2);
3691	p2p_buf_update_ie_hdr(req, len);
3692
3693	return req;
3694}
3695
3696
3697int p2p_presence_req(struct p2p_data *p2p, const u8 *go_interface_addr,
3698		     const u8 *own_interface_addr, unsigned int freq,
3699		     u32 duration1, u32 interval1, u32 duration2,
3700		     u32 interval2)
3701{
3702	struct wpabuf *req;
3703
3704	p2p_dbg(p2p, "Send Presence Request to GO " MACSTR
3705		" (own interface " MACSTR ") freq=%u dur1=%u int1=%u "
3706		"dur2=%u int2=%u",
3707		MAC2STR(go_interface_addr), MAC2STR(own_interface_addr),
3708		freq, duration1, interval1, duration2, interval2);
3709
3710	req = p2p_build_presence_req(duration1, interval1, duration2,
3711				     interval2);
3712	if (req == NULL)
3713		return -1;
3714
3715	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3716	if (p2p_send_action(p2p, freq, go_interface_addr, own_interface_addr,
3717			    go_interface_addr,
3718			    wpabuf_head(req), wpabuf_len(req), 200) < 0) {
3719		p2p_dbg(p2p, "Failed to send Action frame");
3720	}
3721	wpabuf_free(req);
3722
3723	return 0;
3724}
3725
3726
3727static struct wpabuf * p2p_build_presence_resp(u8 status, const u8 *noa,
3728					       size_t noa_len, u8 dialog_token)
3729{
3730	struct wpabuf *resp;
3731	u8 *len;
3732
3733	resp = wpabuf_alloc(100 + noa_len);
3734	if (resp == NULL)
3735		return NULL;
3736
3737	p2p_buf_add_action_hdr(resp, P2P_PRESENCE_RESP, dialog_token);
3738	len = p2p_buf_add_ie_hdr(resp);
3739	p2p_buf_add_status(resp, status);
3740	if (noa) {
3741		wpabuf_put_u8(resp, P2P_ATTR_NOTICE_OF_ABSENCE);
3742		wpabuf_put_le16(resp, noa_len);
3743		wpabuf_put_data(resp, noa, noa_len);
3744	} else
3745		p2p_buf_add_noa(resp, 0, 0, 0, NULL, NULL);
3746	p2p_buf_update_ie_hdr(resp, len);
3747
3748	return resp;
3749}
3750
3751
3752static void p2p_process_presence_req(struct p2p_data *p2p, const u8 *da,
3753				     const u8 *sa, const u8 *data, size_t len,
3754				     int rx_freq)
3755{
3756	struct p2p_message msg;
3757	u8 status;
3758	struct wpabuf *resp;
3759	size_t g;
3760	struct p2p_group *group = NULL;
3761	int parsed = 0;
3762	u8 noa[50];
3763	int noa_len;
3764
3765	p2p_dbg(p2p, "Received P2P Action - P2P Presence Request");
3766
3767	for (g = 0; g < p2p->num_groups; g++) {
3768		if (os_memcmp(da, p2p_group_get_interface_addr(p2p->groups[g]),
3769			      ETH_ALEN) == 0) {
3770			group = p2p->groups[g];
3771			break;
3772		}
3773	}
3774	if (group == NULL) {
3775		p2p_dbg(p2p, "Ignore P2P Presence Request for unknown group "
3776			MACSTR, MAC2STR(da));
3777		return;
3778	}
3779
3780	if (p2p_parse(data, len, &msg) < 0) {
3781		p2p_dbg(p2p, "Failed to parse P2P Presence Request");
3782		status = P2P_SC_FAIL_INVALID_PARAMS;
3783		goto fail;
3784	}
3785	parsed = 1;
3786
3787	if (msg.noa == NULL) {
3788		p2p_dbg(p2p, "No NoA attribute in P2P Presence Request");
3789		status = P2P_SC_FAIL_INVALID_PARAMS;
3790		goto fail;
3791	}
3792
3793	status = p2p_group_presence_req(group, sa, msg.noa, msg.noa_len);
3794
3795fail:
3796	if (p2p->cfg->get_noa)
3797		noa_len = p2p->cfg->get_noa(p2p->cfg->cb_ctx, da, noa,
3798					    sizeof(noa));
3799	else
3800		noa_len = -1;
3801	resp = p2p_build_presence_resp(status, noa_len > 0 ? noa : NULL,
3802				       noa_len > 0 ? noa_len : 0,
3803				       msg.dialog_token);
3804	if (parsed)
3805		p2p_parse_free(&msg);
3806	if (resp == NULL)
3807		return;
3808
3809	p2p->pending_action_state = P2P_NO_PENDING_ACTION;
3810	if (p2p_send_action(p2p, rx_freq, sa, da, da,
3811			    wpabuf_head(resp), wpabuf_len(resp), 200) < 0) {
3812		p2p_dbg(p2p, "Failed to send Action frame");
3813	}
3814	wpabuf_free(resp);
3815}
3816
3817
3818static void p2p_process_presence_resp(struct p2p_data *p2p, const u8 *da,
3819				      const u8 *sa, const u8 *data, size_t len)
3820{
3821	struct p2p_message msg;
3822
3823	p2p_dbg(p2p, "Received P2P Action - P2P Presence Response");
3824
3825	if (p2p_parse(data, len, &msg) < 0) {
3826		p2p_dbg(p2p, "Failed to parse P2P Presence Response");
3827		return;
3828	}
3829
3830	if (msg.status == NULL || msg.noa == NULL) {
3831		p2p_dbg(p2p, "No Status or NoA attribute in P2P Presence Response");
3832		p2p_parse_free(&msg);
3833		return;
3834	}
3835
3836	if (p2p->cfg->presence_resp) {
3837		p2p->cfg->presence_resp(p2p->cfg->cb_ctx, sa, *msg.status,
3838					msg.noa, msg.noa_len);
3839	}
3840
3841	if (*msg.status) {
3842		p2p_dbg(p2p, "P2P Presence Request was rejected: status %u",
3843			*msg.status);
3844		p2p_parse_free(&msg);
3845		return;
3846	}
3847
3848	p2p_dbg(p2p, "P2P Presence Request was accepted");
3849	wpa_hexdump(MSG_DEBUG, "P2P: P2P Presence Response - NoA",
3850		    msg.noa, msg.noa_len);
3851	/* TODO: process NoA */
3852	p2p_parse_free(&msg);
3853}
3854
3855
3856static void p2p_ext_listen_timeout(void *eloop_ctx, void *timeout_ctx)
3857{
3858	struct p2p_data *p2p = eloop_ctx;
3859
3860	if (p2p->ext_listen_interval) {
3861		/* Schedule next extended listen timeout */
3862		eloop_register_timeout(p2p->ext_listen_interval_sec,
3863				       p2p->ext_listen_interval_usec,
3864				       p2p_ext_listen_timeout, p2p, NULL);
3865	}
3866
3867	if (p2p->state == P2P_LISTEN_ONLY && p2p->ext_listen_only) {
3868		/*
3869		 * This should not really happen, but it looks like the Listen
3870		 * command may fail is something else (e.g., a scan) was
3871		 * running at an inconvenient time. As a workaround, allow new
3872		 * Extended Listen operation to be started.
3873		 */
3874		p2p_dbg(p2p, "Previous Extended Listen operation had not been completed - try again");
3875		p2p->ext_listen_only = 0;
3876		p2p_set_state(p2p, P2P_IDLE);
3877	}
3878
3879	if (p2p->state != P2P_IDLE) {
3880		p2p_dbg(p2p, "Skip Extended Listen timeout in active state (%s)", p2p_state_txt(p2p->state));
3881		return;
3882	}
3883
3884	p2p_dbg(p2p, "Extended Listen timeout");
3885	p2p->ext_listen_only = 1;
3886	if (p2p_listen(p2p, p2p->ext_listen_period) < 0) {
3887		p2p_dbg(p2p, "Failed to start Listen state for Extended Listen Timing");
3888		p2p->ext_listen_only = 0;
3889	}
3890}
3891
3892
3893int p2p_ext_listen(struct p2p_data *p2p, unsigned int period,
3894		   unsigned int interval)
3895{
3896	if (period > 65535 || interval > 65535 || period > interval ||
3897	    (period == 0 && interval > 0) || (period > 0 && interval == 0)) {
3898		p2p_dbg(p2p, "Invalid Extended Listen Timing request: period=%u interval=%u",
3899			period, interval);
3900		return -1;
3901	}
3902
3903	eloop_cancel_timeout(p2p_ext_listen_timeout, p2p, NULL);
3904
3905	if (interval == 0) {
3906		p2p_dbg(p2p, "Disabling Extended Listen Timing");
3907		p2p->ext_listen_period = 0;
3908		p2p->ext_listen_interval = 0;
3909		return 0;
3910	}
3911
3912	p2p_dbg(p2p, "Enabling Extended Listen Timing: period %u msec, interval %u msec",
3913		period, interval);
3914	p2p->ext_listen_period = period;
3915	p2p->ext_listen_interval = interval;
3916	p2p->ext_listen_interval_sec = interval / 1000;
3917	p2p->ext_listen_interval_usec = (interval % 1000) * 1000;
3918
3919	eloop_register_timeout(p2p->ext_listen_interval_sec,
3920			       p2p->ext_listen_interval_usec,
3921			       p2p_ext_listen_timeout, p2p, NULL);
3922
3923	return 0;
3924}
3925
3926
3927void p2p_deauth_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
3928		      const u8 *ie, size_t ie_len)
3929{
3930	struct p2p_message msg;
3931
3932	if (bssid == NULL || ie == NULL)
3933		return;
3934
3935	os_memset(&msg, 0, sizeof(msg));
3936	if (p2p_parse_ies(ie, ie_len, &msg))
3937		return;
3938	if (msg.minor_reason_code == NULL)
3939		return;
3940
3941	p2p_dbg(p2p, "Deauthentication notification BSSID " MACSTR
3942		" reason_code=%u minor_reason_code=%u",
3943		MAC2STR(bssid), reason_code, *msg.minor_reason_code);
3944
3945	p2p_parse_free(&msg);
3946}
3947
3948
3949void p2p_disassoc_notif(struct p2p_data *p2p, const u8 *bssid, u16 reason_code,
3950			const u8 *ie, size_t ie_len)
3951{
3952	struct p2p_message msg;
3953
3954	if (bssid == NULL || ie == NULL)
3955		return;
3956
3957	os_memset(&msg, 0, sizeof(msg));
3958	if (p2p_parse_ies(ie, ie_len, &msg))
3959		return;
3960	if (msg.minor_reason_code == NULL)
3961		return;
3962
3963	p2p_dbg(p2p, "Disassociation notification BSSID " MACSTR
3964		" reason_code=%u minor_reason_code=%u",
3965		MAC2STR(bssid), reason_code, *msg.minor_reason_code);
3966
3967	p2p_parse_free(&msg);
3968}
3969
3970
3971void p2p_set_managed_oper(struct p2p_data *p2p, int enabled)
3972{
3973	if (enabled) {
3974		p2p_dbg(p2p, "Managed P2P Device operations enabled");
3975		p2p->dev_capab |= P2P_DEV_CAPAB_INFRA_MANAGED;
3976	} else {
3977		p2p_dbg(p2p, "Managed P2P Device operations disabled");
3978		p2p->dev_capab &= ~P2P_DEV_CAPAB_INFRA_MANAGED;
3979	}
3980}
3981
3982
3983int p2p_set_listen_channel(struct p2p_data *p2p, u8 reg_class, u8 channel)
3984{
3985	if (p2p_channel_to_freq(reg_class, channel) < 0)
3986		return -1;
3987
3988	p2p_dbg(p2p, "Set Listen channel: reg_class %u channel %u",
3989		reg_class, channel);
3990	p2p->cfg->reg_class = reg_class;
3991	p2p->cfg->channel = channel;
3992
3993	return 0;
3994}
3995
3996
3997int p2p_set_ssid_postfix(struct p2p_data *p2p, const u8 *postfix, size_t len)
3998{
3999	p2p_dbg(p2p, "New SSID postfix: %s", wpa_ssid_txt(postfix, len));
4000	if (postfix == NULL) {
4001		p2p->cfg->ssid_postfix_len = 0;
4002		return 0;
4003	}
4004	if (len > sizeof(p2p->cfg->ssid_postfix))
4005		return -1;
4006	os_memcpy(p2p->cfg->ssid_postfix, postfix, len);
4007	p2p->cfg->ssid_postfix_len = len;
4008	return 0;
4009}
4010
4011
4012int p2p_set_oper_channel(struct p2p_data *p2p, u8 op_reg_class, u8 op_channel,
4013			 int cfg_op_channel)
4014{
4015	if (p2p_channel_to_freq(op_reg_class, op_channel) < 0)
4016		return -1;
4017
4018	p2p_dbg(p2p, "Set Operating channel: reg_class %u channel %u",
4019		op_reg_class, op_channel);
4020	p2p->cfg->op_reg_class = op_reg_class;
4021	p2p->cfg->op_channel = op_channel;
4022	p2p->cfg->cfg_op_channel = cfg_op_channel;
4023	return 0;
4024}
4025
4026
4027int p2p_set_pref_chan(struct p2p_data *p2p, unsigned int num_pref_chan,
4028		      const struct p2p_channel *pref_chan)
4029{
4030	struct p2p_channel *n;
4031
4032	if (pref_chan) {
4033		n = os_malloc(num_pref_chan * sizeof(struct p2p_channel));
4034		if (n == NULL)
4035			return -1;
4036		os_memcpy(n, pref_chan,
4037			  num_pref_chan * sizeof(struct p2p_channel));
4038	} else
4039		n = NULL;
4040
4041	os_free(p2p->cfg->pref_chan);
4042	p2p->cfg->pref_chan = n;
4043	p2p->cfg->num_pref_chan = num_pref_chan;
4044
4045	return 0;
4046}
4047
4048
4049int p2p_set_no_go_freq(struct p2p_data *p2p,
4050		       const struct wpa_freq_range_list *list)
4051{
4052	struct wpa_freq_range *tmp;
4053
4054	if (list == NULL || list->num == 0) {
4055		os_free(p2p->no_go_freq.range);
4056		p2p->no_go_freq.range = NULL;
4057		p2p->no_go_freq.num = 0;
4058		return 0;
4059	}
4060
4061	tmp = os_calloc(list->num, sizeof(struct wpa_freq_range));
4062	if (tmp == NULL)
4063		return -1;
4064	os_memcpy(tmp, list->range, list->num * sizeof(struct wpa_freq_range));
4065	os_free(p2p->no_go_freq.range);
4066	p2p->no_go_freq.range = tmp;
4067	p2p->no_go_freq.num = list->num;
4068	p2p_dbg(p2p, "Updated no GO chan list");
4069
4070	return 0;
4071}
4072
4073
4074int p2p_get_interface_addr(struct p2p_data *p2p, const u8 *dev_addr,
4075			   u8 *iface_addr)
4076{
4077	struct p2p_device *dev = p2p_get_device(p2p, dev_addr);
4078	if (dev == NULL || is_zero_ether_addr(dev->interface_addr))
4079		return -1;
4080	os_memcpy(iface_addr, dev->interface_addr, ETH_ALEN);
4081	return 0;
4082}
4083
4084
4085int p2p_get_dev_addr(struct p2p_data *p2p, const u8 *iface_addr,
4086			   u8 *dev_addr)
4087{
4088	struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
4089	if (dev == NULL)
4090		return -1;
4091	os_memcpy(dev_addr, dev->info.p2p_device_addr, ETH_ALEN);
4092	return 0;
4093}
4094
4095
4096void p2p_set_peer_filter(struct p2p_data *p2p, const u8 *addr)
4097{
4098	os_memcpy(p2p->peer_filter, addr, ETH_ALEN);
4099	if (is_zero_ether_addr(p2p->peer_filter))
4100		p2p_dbg(p2p, "Disable peer filter");
4101	else
4102		p2p_dbg(p2p, "Enable peer filter for " MACSTR,
4103			MAC2STR(p2p->peer_filter));
4104}
4105
4106
4107void p2p_set_cross_connect(struct p2p_data *p2p, int enabled)
4108{
4109	p2p_dbg(p2p, "Cross connection %s", enabled ? "enabled" : "disabled");
4110	if (p2p->cross_connect == enabled)
4111		return;
4112	p2p->cross_connect = enabled;
4113	/* TODO: may need to tear down any action group where we are GO(?) */
4114}
4115
4116
4117int p2p_get_oper_freq(struct p2p_data *p2p, const u8 *iface_addr)
4118{
4119	struct p2p_device *dev = p2p_get_device_interface(p2p, iface_addr);
4120	if (dev == NULL)
4121		return -1;
4122	if (dev->oper_freq <= 0)
4123		return -1;
4124	return dev->oper_freq;
4125}
4126
4127
4128void p2p_set_intra_bss_dist(struct p2p_data *p2p, int enabled)
4129{
4130	p2p_dbg(p2p, "Intra BSS distribution %s",
4131		enabled ? "enabled" : "disabled");
4132	p2p->cfg->p2p_intra_bss = enabled;
4133}
4134
4135
4136void p2p_update_channel_list(struct p2p_data *p2p,
4137			     const struct p2p_channels *chan,
4138			     const struct p2p_channels *cli_chan)
4139{
4140	p2p_dbg(p2p, "Update channel list");
4141	os_memcpy(&p2p->cfg->channels, chan, sizeof(struct p2p_channels));
4142	p2p_channels_dump(p2p, "channels", &p2p->cfg->channels);
4143	os_memcpy(&p2p->cfg->cli_channels, cli_chan,
4144		  sizeof(struct p2p_channels));
4145	p2p_channels_dump(p2p, "cli_channels", &p2p->cfg->cli_channels);
4146}
4147
4148
4149int p2p_send_action(struct p2p_data *p2p, unsigned int freq, const u8 *dst,
4150		    const u8 *src, const u8 *bssid, const u8 *buf,
4151		    size_t len, unsigned int wait_time)
4152{
4153	if (p2p->p2p_scan_running) {
4154		p2p_dbg(p2p, "Delay Action frame TX until p2p_scan completes");
4155		if (p2p->after_scan_tx) {
4156			p2p_dbg(p2p, "Dropped previous pending Action frame TX");
4157			os_free(p2p->after_scan_tx);
4158		}
4159		p2p->after_scan_tx = os_malloc(sizeof(*p2p->after_scan_tx) +
4160					       len);
4161		if (p2p->after_scan_tx == NULL)
4162			return -1;
4163		p2p->after_scan_tx->freq = freq;
4164		os_memcpy(p2p->after_scan_tx->dst, dst, ETH_ALEN);
4165		os_memcpy(p2p->after_scan_tx->src, src, ETH_ALEN);
4166		os_memcpy(p2p->after_scan_tx->bssid, bssid, ETH_ALEN);
4167		p2p->after_scan_tx->len = len;
4168		p2p->after_scan_tx->wait_time = wait_time;
4169		os_memcpy(p2p->after_scan_tx + 1, buf, len);
4170		return 0;
4171	}
4172
4173	return p2p->cfg->send_action(p2p->cfg->cb_ctx, freq, dst, src, bssid,
4174				     buf, len, wait_time);
4175}
4176
4177
4178void p2p_set_best_channels(struct p2p_data *p2p, int freq_24, int freq_5,
4179			   int freq_overall)
4180{
4181	p2p_dbg(p2p, "Best channel: 2.4 GHz: %d,  5 GHz: %d,  overall: %d",
4182		freq_24, freq_5, freq_overall);
4183	p2p->best_freq_24 = freq_24;
4184	p2p->best_freq_5 = freq_5;
4185	p2p->best_freq_overall = freq_overall;
4186}
4187
4188
4189void p2p_set_own_freq_preference(struct p2p_data *p2p, int freq)
4190{
4191	p2p_dbg(p2p, "Own frequency preference: %d MHz", freq);
4192	p2p->own_freq_preference = freq;
4193}
4194
4195
4196const u8 * p2p_get_go_neg_peer(struct p2p_data *p2p)
4197{
4198	if (p2p == NULL || p2p->go_neg_peer == NULL)
4199		return NULL;
4200	return p2p->go_neg_peer->info.p2p_device_addr;
4201}
4202
4203
4204const struct p2p_peer_info *
4205p2p_get_peer_found(struct p2p_data *p2p, const u8 *addr, int next)
4206{
4207	struct p2p_device *dev;
4208
4209	if (addr) {
4210		dev = p2p_get_device(p2p, addr);
4211		if (!dev)
4212			return NULL;
4213
4214		if (!next) {
4215			if (dev->flags & P2P_DEV_PROBE_REQ_ONLY)
4216				return NULL;
4217
4218			return &dev->info;
4219		} else {
4220			do {
4221				dev = dl_list_first(&dev->list,
4222						    struct p2p_device,
4223						    list);
4224				if (&dev->list == &p2p->devices)
4225					return NULL;
4226			} while (dev->flags & P2P_DEV_PROBE_REQ_ONLY);
4227		}
4228	} else {
4229		dev = dl_list_first(&p2p->devices, struct p2p_device, list);
4230		if (!dev)
4231			return NULL;
4232		while (dev->flags & P2P_DEV_PROBE_REQ_ONLY) {
4233			dev = dl_list_first(&dev->list,
4234					    struct p2p_device,
4235					    list);
4236			if (&dev->list == &p2p->devices)
4237				return NULL;
4238		}
4239	}
4240
4241	return &dev->info;
4242}
4243
4244
4245int p2p_in_progress(struct p2p_data *p2p)
4246{
4247	if (p2p == NULL)
4248		return 0;
4249	if (p2p->state == P2P_SEARCH)
4250		return 2;
4251	return p2p->state != P2P_IDLE && p2p->state != P2P_PROVISIONING;
4252}
4253
4254
4255void p2p_set_config_timeout(struct p2p_data *p2p, u8 go_timeout,
4256			    u8 client_timeout)
4257{
4258	if (p2p) {
4259		p2p->go_timeout = go_timeout;
4260		p2p->client_timeout = client_timeout;
4261	}
4262}
4263
4264
4265#ifdef CONFIG_WIFI_DISPLAY
4266
4267static void p2p_update_wfd_ie_groups(struct p2p_data *p2p)
4268{
4269	size_t g;
4270	struct p2p_group *group;
4271
4272	for (g = 0; g < p2p->num_groups; g++) {
4273		group = p2p->groups[g];
4274		p2p_group_force_beacon_update_ies(group);
4275	}
4276}
4277
4278
4279int p2p_set_wfd_ie_beacon(struct p2p_data *p2p, struct wpabuf *ie)
4280{
4281	wpabuf_free(p2p->wfd_ie_beacon);
4282	p2p->wfd_ie_beacon = ie;
4283	p2p_update_wfd_ie_groups(p2p);
4284	return 0;
4285}
4286
4287
4288int p2p_set_wfd_ie_probe_req(struct p2p_data *p2p, struct wpabuf *ie)
4289{
4290	wpabuf_free(p2p->wfd_ie_probe_req);
4291	p2p->wfd_ie_probe_req = ie;
4292	return 0;
4293}
4294
4295
4296int p2p_set_wfd_ie_probe_resp(struct p2p_data *p2p, struct wpabuf *ie)
4297{
4298	wpabuf_free(p2p->wfd_ie_probe_resp);
4299	p2p->wfd_ie_probe_resp = ie;
4300	p2p_update_wfd_ie_groups(p2p);
4301	return 0;
4302}
4303
4304
4305int p2p_set_wfd_ie_assoc_req(struct p2p_data *p2p, struct wpabuf *ie)
4306{
4307	wpabuf_free(p2p->wfd_ie_assoc_req);
4308	p2p->wfd_ie_assoc_req = ie;
4309	return 0;
4310}
4311
4312
4313int p2p_set_wfd_ie_invitation(struct p2p_data *p2p, struct wpabuf *ie)
4314{
4315	wpabuf_free(p2p->wfd_ie_invitation);
4316	p2p->wfd_ie_invitation = ie;
4317	return 0;
4318}
4319
4320
4321int p2p_set_wfd_ie_prov_disc_req(struct p2p_data *p2p, struct wpabuf *ie)
4322{
4323	wpabuf_free(p2p->wfd_ie_prov_disc_req);
4324	p2p->wfd_ie_prov_disc_req = ie;
4325	return 0;
4326}
4327
4328
4329int p2p_set_wfd_ie_prov_disc_resp(struct p2p_data *p2p, struct wpabuf *ie)
4330{
4331	wpabuf_free(p2p->wfd_ie_prov_disc_resp);
4332	p2p->wfd_ie_prov_disc_resp = ie;
4333	return 0;
4334}
4335
4336
4337int p2p_set_wfd_ie_go_neg(struct p2p_data *p2p, struct wpabuf *ie)
4338{
4339	wpabuf_free(p2p->wfd_ie_go_neg);
4340	p2p->wfd_ie_go_neg = ie;
4341	return 0;
4342}
4343
4344
4345int p2p_set_wfd_dev_info(struct p2p_data *p2p, const struct wpabuf *elem)
4346{
4347	wpabuf_free(p2p->wfd_dev_info);
4348	if (elem) {
4349		p2p->wfd_dev_info = wpabuf_dup(elem);
4350		if (p2p->wfd_dev_info == NULL)
4351			return -1;
4352	} else
4353		p2p->wfd_dev_info = NULL;
4354
4355	return 0;
4356}
4357
4358
4359int p2p_set_wfd_assoc_bssid(struct p2p_data *p2p, const struct wpabuf *elem)
4360{
4361	wpabuf_free(p2p->wfd_assoc_bssid);
4362	if (elem) {
4363		p2p->wfd_assoc_bssid = wpabuf_dup(elem);
4364		if (p2p->wfd_assoc_bssid == NULL)
4365			return -1;
4366	} else
4367		p2p->wfd_assoc_bssid = NULL;
4368
4369	return 0;
4370}
4371
4372
4373int p2p_set_wfd_coupled_sink_info(struct p2p_data *p2p,
4374				  const struct wpabuf *elem)
4375{
4376	wpabuf_free(p2p->wfd_coupled_sink_info);
4377	if (elem) {
4378		p2p->wfd_coupled_sink_info = wpabuf_dup(elem);
4379		if (p2p->wfd_coupled_sink_info == NULL)
4380			return -1;
4381	} else
4382		p2p->wfd_coupled_sink_info = NULL;
4383
4384	return 0;
4385}
4386
4387#endif /* CONFIG_WIFI_DISPLAY */
4388
4389
4390int p2p_set_disc_int(struct p2p_data *p2p, int min_disc_int, int max_disc_int,
4391		     int max_disc_tu)
4392{
4393	if (min_disc_int > max_disc_int || min_disc_int < 0 || max_disc_int < 0)
4394		return -1;
4395
4396	p2p->min_disc_int = min_disc_int;
4397	p2p->max_disc_int = max_disc_int;
4398	p2p->max_disc_tu = max_disc_tu;
4399	p2p_dbg(p2p, "Set discoverable interval: min=%d max=%d max_tu=%d",
4400		min_disc_int, max_disc_int, max_disc_tu);
4401
4402	return 0;
4403}
4404
4405
4406void p2p_dbg(struct p2p_data *p2p, const char *fmt, ...)
4407{
4408	va_list ap;
4409	char buf[500];
4410
4411	if (!p2p->cfg->debug_print)
4412		return;
4413
4414	va_start(ap, fmt);
4415	vsnprintf(buf, sizeof(buf), fmt, ap);
4416	buf[sizeof(buf) - 1] = '\0';
4417	va_end(ap);
4418	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_DEBUG, buf);
4419}
4420
4421
4422void p2p_info(struct p2p_data *p2p, const char *fmt, ...)
4423{
4424	va_list ap;
4425	char buf[500];
4426
4427	if (!p2p->cfg->debug_print)
4428		return;
4429
4430	va_start(ap, fmt);
4431	vsnprintf(buf, sizeof(buf), fmt, ap);
4432	buf[sizeof(buf) - 1] = '\0';
4433	va_end(ap);
4434	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_INFO, buf);
4435}
4436
4437
4438void p2p_err(struct p2p_data *p2p, const char *fmt, ...)
4439{
4440	va_list ap;
4441	char buf[500];
4442
4443	if (!p2p->cfg->debug_print)
4444		return;
4445
4446	va_start(ap, fmt);
4447	vsnprintf(buf, sizeof(buf), fmt, ap);
4448	buf[sizeof(buf) - 1] = '\0';
4449	va_end(ap);
4450	p2p->cfg->debug_print(p2p->cfg->cb_ctx, MSG_ERROR, buf);
4451}
4452