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