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