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