]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/wpa/src/p2p/p2p_go_neg.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / wpa / src / p2p / p2p_go_neg.c
1 /*
2  * Wi-Fi Direct - P2P Group Owner Negotiation
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 "common/ieee802_11_defs.h"
13 #include "wps/wps_defs.h"
14 #include "p2p_i.h"
15 #include "p2p.h"
16
17
18 static int p2p_go_det(u8 own_intent, u8 peer_value)
19 {
20         u8 peer_intent = peer_value >> 1;
21         if (own_intent == peer_intent) {
22                 if (own_intent == P2P_MAX_GO_INTENT)
23                         return -1; /* both devices want to become GO */
24
25                 /* Use tie breaker bit to determine GO */
26                 return (peer_value & 0x01) ? 0 : 1;
27         }
28
29         return own_intent > peer_intent;
30 }
31
32
33 int p2p_peer_channels_check(struct p2p_data *p2p, struct p2p_channels *own,
34                             struct p2p_device *dev,
35                             const u8 *channel_list, size_t channel_list_len)
36 {
37         const u8 *pos, *end;
38         struct p2p_channels *ch;
39         size_t channels;
40         struct p2p_channels intersection;
41
42         ch = &dev->channels;
43         os_memset(ch, 0, sizeof(*ch));
44         pos = channel_list;
45         end = channel_list + channel_list_len;
46
47         if (end - pos < 3)
48                 return -1;
49         os_memcpy(dev->country, pos, 3);
50         wpa_hexdump_ascii(MSG_DEBUG, "P2P: Peer country", pos, 3);
51         if (pos[2] != 0x04 && os_memcmp(pos, p2p->cfg->country, 2) != 0) {
52                 wpa_msg(p2p->cfg->msg_ctx, MSG_INFO,
53                         "P2P: Mismatching country (ours=%c%c peer's=%c%c)",
54                         p2p->cfg->country[0], p2p->cfg->country[1],
55                         pos[0], pos[1]);
56                 return -1;
57         }
58         pos += 3;
59
60         while (pos + 2 < end) {
61                 struct p2p_reg_class *cl = &ch->reg_class[ch->reg_classes];
62                 cl->reg_class = *pos++;
63                 if (pos + 1 + pos[0] > end) {
64                         wpa_msg(p2p->cfg->msg_ctx, MSG_INFO,
65                                 "P2P: Invalid peer Channel List");
66                         return -1;
67                 }
68                 channels = *pos++;
69                 cl->channels = channels > P2P_MAX_REG_CLASS_CHANNELS ?
70                         P2P_MAX_REG_CLASS_CHANNELS : channels;
71                 os_memcpy(cl->channel, pos, cl->channels);
72                 pos += channels;
73                 ch->reg_classes++;
74                 if (ch->reg_classes == P2P_MAX_REG_CLASSES)
75                         break;
76         }
77
78         p2p_channels_intersect(own, &dev->channels, &intersection);
79         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Own reg_classes %d "
80                 "peer reg_classes %d intersection reg_classes %d",
81                 (int) own->reg_classes,
82                 (int) dev->channels.reg_classes,
83                 (int) intersection.reg_classes);
84         if (intersection.reg_classes == 0) {
85                 wpa_msg(p2p->cfg->msg_ctx, MSG_INFO,
86                         "P2P: No common channels found");
87                 return -1;
88         }
89         return 0;
90 }
91
92
93 static int p2p_peer_channels(struct p2p_data *p2p, struct p2p_device *dev,
94                              const u8 *channel_list, size_t channel_list_len)
95 {
96         return p2p_peer_channels_check(p2p, &p2p->channels, dev,
97                                        channel_list, channel_list_len);
98 }
99
100
101 u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method)
102 {
103         switch (wps_method) {
104         case WPS_PIN_DISPLAY:
105                 return DEV_PW_REGISTRAR_SPECIFIED;
106         case WPS_PIN_KEYPAD:
107                 return DEV_PW_USER_SPECIFIED;
108         case WPS_PBC:
109                 return DEV_PW_PUSHBUTTON;
110         default:
111                 return DEV_PW_DEFAULT;
112         }
113 }
114
115
116 static const char * p2p_wps_method_str(enum p2p_wps_method wps_method)
117 {
118         switch (wps_method) {
119         case WPS_PIN_DISPLAY:
120                 return "Display";
121         case WPS_PIN_KEYPAD:
122                 return "Keypad";
123         case WPS_PBC:
124                 return "PBC";
125         default:
126                 return "??";
127         }
128 }
129
130
131 static struct wpabuf * p2p_build_go_neg_req(struct p2p_data *p2p,
132                                             struct p2p_device *peer)
133 {
134         struct wpabuf *buf;
135         u8 *len;
136         u8 group_capab;
137         size_t extra = 0;
138
139 #ifdef CONFIG_WIFI_DISPLAY
140         if (p2p->wfd_ie_go_neg)
141                 extra = wpabuf_len(p2p->wfd_ie_go_neg);
142 #endif /* CONFIG_WIFI_DISPLAY */
143
144         buf = wpabuf_alloc(1000 + extra);
145         if (buf == NULL)
146                 return NULL;
147
148         peer->dialog_token++;
149         if (peer->dialog_token == 0)
150                 peer->dialog_token = 1;
151         p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_REQ, peer->dialog_token);
152
153         len = p2p_buf_add_ie_hdr(buf);
154         group_capab = 0;
155         if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
156                 group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
157                 if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
158                         group_capab |= P2P_GROUP_CAPAB_PERSISTENT_RECONN;
159         }
160         if (p2p->cross_connect)
161                 group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
162         if (p2p->cfg->p2p_intra_bss)
163                 group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
164         p2p_buf_add_capability(buf, p2p->dev_capab &
165                                ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
166                                group_capab);
167         p2p_buf_add_go_intent(buf, (p2p->go_intent << 1) |
168                               p2p->next_tie_breaker);
169         p2p->next_tie_breaker = !p2p->next_tie_breaker;
170         p2p_buf_add_config_timeout(buf, p2p->go_timeout, p2p->client_timeout);
171         p2p_buf_add_listen_channel(buf, p2p->cfg->country, p2p->cfg->reg_class,
172                                    p2p->cfg->channel);
173         if (p2p->ext_listen_interval)
174                 p2p_buf_add_ext_listen_timing(buf, p2p->ext_listen_period,
175                                               p2p->ext_listen_interval);
176         p2p_buf_add_intended_addr(buf, p2p->intended_addr);
177         p2p_buf_add_channel_list(buf, p2p->cfg->country, &p2p->channels);
178         p2p_buf_add_device_info(buf, p2p, peer);
179         p2p_buf_add_operating_channel(buf, p2p->cfg->country,
180                                       p2p->op_reg_class, p2p->op_channel);
181         p2p_buf_update_ie_hdr(buf, len);
182
183         /* WPS IE with Device Password ID attribute */
184         p2p_build_wps_ie(p2p, buf, p2p_wps_method_pw_id(peer->wps_method), 0);
185
186 #ifdef CONFIG_WIFI_DISPLAY
187         if (p2p->wfd_ie_go_neg)
188                 wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
189 #endif /* CONFIG_WIFI_DISPLAY */
190
191         return buf;
192 }
193
194
195 int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev)
196 {
197         struct wpabuf *req;
198         int freq;
199
200         if (dev->flags & P2P_DEV_PD_BEFORE_GO_NEG) {
201                 u16 config_method;
202                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
203                         "P2P: Use PD-before-GO-Neg workaround for " MACSTR,
204                         MAC2STR(dev->info.p2p_device_addr));
205                 if (dev->wps_method == WPS_PIN_DISPLAY)
206                         config_method = WPS_CONFIG_KEYPAD;
207                 else if (dev->wps_method == WPS_PIN_KEYPAD)
208                         config_method = WPS_CONFIG_DISPLAY;
209                 else if (dev->wps_method == WPS_PBC)
210                         config_method = WPS_CONFIG_PUSHBUTTON;
211                 else
212                         return -1;
213                 return p2p_prov_disc_req(p2p, dev->info.p2p_device_addr,
214                                          config_method, 0, 0, 1);
215         }
216
217         freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
218         if (freq <= 0) {
219                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
220                         "P2P: No Listen/Operating frequency known for the "
221                         "peer " MACSTR " to send GO Negotiation Request",
222                         MAC2STR(dev->info.p2p_device_addr));
223                 return -1;
224         }
225
226         req = p2p_build_go_neg_req(p2p, dev);
227         if (req == NULL)
228                 return -1;
229         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
230                 "P2P: Sending GO Negotiation Request");
231         p2p_set_state(p2p, P2P_CONNECT);
232         p2p->pending_action_state = P2P_PENDING_GO_NEG_REQUEST;
233         p2p->go_neg_peer = dev;
234         dev->flags |= P2P_DEV_WAIT_GO_NEG_RESPONSE;
235         dev->connect_reqs++;
236         if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr,
237                             p2p->cfg->dev_addr, dev->info.p2p_device_addr,
238                             wpabuf_head(req), wpabuf_len(req), 200) < 0) {
239                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
240                         "P2P: Failed to send Action frame");
241                 /* Use P2P find to recover and retry */
242                 p2p_set_timeout(p2p, 0, 0);
243         } else
244                 dev->go_neg_req_sent++;
245
246         wpabuf_free(req);
247
248         return 0;
249 }
250
251
252 static struct wpabuf * p2p_build_go_neg_resp(struct p2p_data *p2p,
253                                              struct p2p_device *peer,
254                                              u8 dialog_token, u8 status,
255                                              u8 tie_breaker)
256 {
257         struct wpabuf *buf;
258         u8 *len;
259         u8 group_capab;
260         size_t extra = 0;
261
262         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
263                 "P2P: Building GO Negotiation Response");
264
265 #ifdef CONFIG_WIFI_DISPLAY
266         if (p2p->wfd_ie_go_neg)
267                 extra = wpabuf_len(p2p->wfd_ie_go_neg);
268 #endif /* CONFIG_WIFI_DISPLAY */
269
270         buf = wpabuf_alloc(1000 + extra);
271         if (buf == NULL)
272                 return NULL;
273
274         p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_RESP, dialog_token);
275
276         len = p2p_buf_add_ie_hdr(buf);
277         p2p_buf_add_status(buf, status);
278         group_capab = 0;
279         if (peer && peer->go_state == LOCAL_GO) {
280                 if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
281                         group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
282                         if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
283                                 group_capab |=
284                                         P2P_GROUP_CAPAB_PERSISTENT_RECONN;
285                 }
286                 if (p2p->cross_connect)
287                         group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
288                 if (p2p->cfg->p2p_intra_bss)
289                         group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
290         }
291         p2p_buf_add_capability(buf, p2p->dev_capab &
292                                ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
293                                group_capab);
294         p2p_buf_add_go_intent(buf, (p2p->go_intent << 1) | tie_breaker);
295         p2p_buf_add_config_timeout(buf, p2p->go_timeout, p2p->client_timeout);
296         if (peer && peer->go_state == REMOTE_GO) {
297                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Omit Operating "
298                         "Channel attribute");
299         } else {
300                 p2p_buf_add_operating_channel(buf, p2p->cfg->country,
301                                               p2p->op_reg_class,
302                                               p2p->op_channel);
303         }
304         p2p_buf_add_intended_addr(buf, p2p->intended_addr);
305         if (status || peer == NULL) {
306                 p2p_buf_add_channel_list(buf, p2p->cfg->country,
307                                          &p2p->channels);
308         } else if (peer->go_state == REMOTE_GO) {
309                 p2p_buf_add_channel_list(buf, p2p->cfg->country,
310                                          &p2p->channels);
311         } else {
312                 struct p2p_channels res;
313                 p2p_channels_intersect(&p2p->channels, &peer->channels,
314                                        &res);
315                 p2p_buf_add_channel_list(buf, p2p->cfg->country, &res);
316         }
317         p2p_buf_add_device_info(buf, p2p, peer);
318         if (peer && peer->go_state == LOCAL_GO) {
319                 p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, p2p->ssid,
320                                      p2p->ssid_len);
321         }
322         p2p_buf_update_ie_hdr(buf, len);
323
324         /* WPS IE with Device Password ID attribute */
325         p2p_build_wps_ie(p2p, buf,
326                          p2p_wps_method_pw_id(peer ? peer->wps_method :
327                                               WPS_NOT_READY), 0);
328
329 #ifdef CONFIG_WIFI_DISPLAY
330         if (p2p->wfd_ie_go_neg)
331                 wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
332 #endif /* CONFIG_WIFI_DISPLAY */
333
334
335         return buf;
336 }
337
338
339 /**
340  * p2p_reselect_channel - Re-select operating channel based on peer information
341  * @p2p: P2P module context from p2p_init()
342  * @intersection: Support channel list intersection from local and peer
343  *
344  * This function is used to re-select the best channel after having received
345  * information from the peer to allow supported channel lists to be intersected.
346  * This can be used to improve initial channel selection done in
347  * p2p_prepare_channel() prior to the start of GO Negotiation. In addition, this
348  * can be used for Invitation case.
349  */
350 void p2p_reselect_channel(struct p2p_data *p2p,
351                           struct p2p_channels *intersection)
352 {
353         struct p2p_reg_class *cl;
354         int freq;
355         u8 op_reg_class, op_channel;
356         unsigned int i;
357
358         /* First, try to pick the best channel from another band */
359         freq = p2p_channel_to_freq(p2p->cfg->country, p2p->op_reg_class,
360                                    p2p->op_channel);
361         if (freq >= 2400 && freq < 2500 && p2p->best_freq_5 > 0 &&
362             p2p_freq_to_channel(p2p->cfg->country, p2p->best_freq_5,
363                                 &op_reg_class, &op_channel) == 0 &&
364             p2p_channels_includes(intersection, op_reg_class, op_channel)) {
365                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Pick best 5 GHz "
366                         "channel (reg_class %u channel %u) from intersection",
367                         op_reg_class, op_channel);
368                 p2p->op_reg_class = op_reg_class;
369                 p2p->op_channel = op_channel;
370                 return;
371         }
372
373         if (freq >= 4900 && freq < 6000 && p2p->best_freq_24 > 0 &&
374             p2p_freq_to_channel(p2p->cfg->country, p2p->best_freq_24,
375                                 &op_reg_class, &op_channel) == 0 &&
376             p2p_channels_includes(intersection, op_reg_class, op_channel)) {
377                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Pick best 2.4 GHz "
378                         "channel (reg_class %u channel %u) from intersection",
379                         op_reg_class, op_channel);
380                 p2p->op_reg_class = op_reg_class;
381                 p2p->op_channel = op_channel;
382                 return;
383         }
384
385         /* Select channel with highest preference if the peer supports it */
386         for (i = 0; p2p->cfg->pref_chan && i < p2p->cfg->num_pref_chan; i++) {
387                 if (p2p_channels_includes(intersection,
388                                           p2p->cfg->pref_chan[i].op_class,
389                                           p2p->cfg->pref_chan[i].chan)) {
390                         p2p->op_reg_class = p2p->cfg->pref_chan[i].op_class;
391                         p2p->op_channel = p2p->cfg->pref_chan[i].chan;
392                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Pick "
393                                 "highest preferred chnnel (op_class %u "
394                                 "channel %u) from intersection",
395                                 p2p->op_reg_class, p2p->op_channel);
396                         return;
397                 }
398         }
399
400         /* Try a channel where we might be able to use HT40 */
401         for (i = 0; i < intersection->reg_classes; i++) {
402                 struct p2p_reg_class *c = &intersection->reg_class[i];
403                 if (c->reg_class == 116 || c->reg_class == 117 ||
404                     c->reg_class == 126 || c->reg_class == 127) {
405                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
406                                 "P2P: Pick possible HT40 channel (reg_class "
407                                 "%u channel %u) from intersection",
408                                 c->reg_class, c->channel[0]);
409                         p2p->op_reg_class = c->reg_class;
410                         p2p->op_channel = c->channel[0];
411                         return;
412                 }
413         }
414
415         /*
416          * Try to see if the original channel is in the intersection. If
417          * so, no need to change anything, as it already contains some
418          * randomness.
419          */
420         if (p2p_channels_includes(intersection, p2p->op_reg_class,
421                                   p2p->op_channel)) {
422                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
423                         "P2P: Using original operating class and channel "
424                         "(op_class %u channel %u) from intersection",
425                         p2p->op_reg_class, p2p->op_channel);
426                 return;
427         }
428
429         /*
430          * Fall back to whatever is included in the channel intersection since
431          * no better options seems to be available.
432          */
433         cl = &intersection->reg_class[0];
434         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Pick another channel "
435                 "(reg_class %u channel %u) from intersection",
436                 cl->reg_class, cl->channel[0]);
437         p2p->op_reg_class = cl->reg_class;
438         p2p->op_channel = cl->channel[0];
439 }
440
441
442 static int p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev,
443                                  u8 *status)
444 {
445         struct p2p_channels intersection;
446         size_t i;
447
448         p2p_channels_intersect(&p2p->channels, &dev->channels, &intersection);
449         if (intersection.reg_classes == 0 ||
450             intersection.reg_class[0].channels == 0) {
451                 *status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
452                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
453                         "P2P: No common channels found");
454                 return -1;
455         }
456
457         for (i = 0; i < intersection.reg_classes; i++) {
458                 struct p2p_reg_class *c;
459                 c = &intersection.reg_class[i];
460                 wpa_printf(MSG_DEBUG, "P2P: reg_class %u", c->reg_class);
461                 wpa_hexdump(MSG_DEBUG, "P2P: channels",
462                             c->channel, c->channels);
463         }
464
465         if (!p2p_channels_includes(&intersection, p2p->op_reg_class,
466                                    p2p->op_channel)) {
467                 if (dev->flags & P2P_DEV_FORCE_FREQ) {
468                         *status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
469                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Peer does "
470                                 "not support the forced channel");
471                         return -1;
472                 }
473
474                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Selected operating "
475                         "channel (op_class %u channel %u) not acceptable to "
476                         "the peer", p2p->op_reg_class, p2p->op_channel);
477                 p2p_reselect_channel(p2p, &intersection);
478         } else if (!(dev->flags & P2P_DEV_FORCE_FREQ) &&
479                    !p2p->cfg->cfg_op_channel) {
480                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Try to optimize "
481                         "channel selection with peer information received; "
482                         "previously selected op_class %u channel %u",
483                         p2p->op_reg_class, p2p->op_channel);
484                 p2p_reselect_channel(p2p, &intersection);
485         }
486
487         if (!p2p->ssid_set) {
488                 p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len);
489                 p2p->ssid_set = 1;
490         }
491
492         return 0;
493 }
494
495
496 void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa,
497                             const u8 *data, size_t len, int rx_freq)
498 {
499         struct p2p_device *dev = NULL;
500         struct wpabuf *resp;
501         struct p2p_message msg;
502         u8 status = P2P_SC_FAIL_INVALID_PARAMS;
503         int tie_breaker = 0;
504         int freq;
505
506         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
507                 "P2P: Received GO Negotiation Request from " MACSTR
508                 "(freq=%d)", MAC2STR(sa), rx_freq);
509
510         if (p2p_parse(data, len, &msg))
511                 return;
512
513         if (!msg.capability) {
514                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
515                         "P2P: Mandatory Capability attribute missing from GO "
516                         "Negotiation Request");
517 #ifdef CONFIG_P2P_STRICT
518                 goto fail;
519 #endif /* CONFIG_P2P_STRICT */
520         }
521
522         if (msg.go_intent)
523                 tie_breaker = *msg.go_intent & 0x01;
524         else {
525                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
526                         "P2P: Mandatory GO Intent attribute missing from GO "
527                         "Negotiation Request");
528 #ifdef CONFIG_P2P_STRICT
529                 goto fail;
530 #endif /* CONFIG_P2P_STRICT */
531         }
532
533         if (!msg.config_timeout) {
534                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
535                         "P2P: Mandatory Configuration Timeout attribute "
536                         "missing from GO Negotiation Request");
537 #ifdef CONFIG_P2P_STRICT
538                 goto fail;
539 #endif /* CONFIG_P2P_STRICT */
540         }
541
542         if (!msg.listen_channel) {
543                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
544                         "P2P: No Listen Channel attribute received");
545                 goto fail;
546         }
547         if (!msg.operating_channel) {
548                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
549                         "P2P: No Operating Channel attribute received");
550                 goto fail;
551         }
552         if (!msg.channel_list) {
553                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
554                         "P2P: No Channel List attribute received");
555                 goto fail;
556         }
557         if (!msg.intended_addr) {
558                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
559                         "P2P: No Intended P2P Interface Address attribute "
560                         "received");
561                 goto fail;
562         }
563         if (!msg.p2p_device_info) {
564                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
565                         "P2P: No P2P Device Info attribute received");
566                 goto fail;
567         }
568
569         if (os_memcmp(msg.p2p_device_addr, sa, ETH_ALEN) != 0) {
570                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
571                         "P2P: Unexpected GO Negotiation Request SA=" MACSTR
572                         " != dev_addr=" MACSTR,
573                         MAC2STR(sa), MAC2STR(msg.p2p_device_addr));
574                 goto fail;
575         }
576
577         dev = p2p_get_device(p2p, sa);
578
579         if (msg.status && *msg.status) {
580                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
581                         "P2P: Unexpected Status attribute (%d) in GO "
582                         "Negotiation Request", *msg.status);
583                 goto fail;
584         }
585
586         if (dev == NULL)
587                 dev = p2p_add_dev_from_go_neg_req(p2p, sa, &msg);
588         else if (dev->flags & P2P_DEV_PROBE_REQ_ONLY)
589                 p2p_add_dev_info(p2p, sa, dev, &msg);
590         if (dev && dev->flags & P2P_DEV_USER_REJECTED) {
591                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
592                         "P2P: User has rejected this peer");
593                 status = P2P_SC_FAIL_REJECTED_BY_USER;
594         } else if (dev == NULL || dev->wps_method == WPS_NOT_READY) {
595                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
596                         "P2P: Not ready for GO negotiation with " MACSTR,
597                         MAC2STR(sa));
598                 status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
599                 if (dev)
600                         dev->flags |= P2P_DEV_PEER_WAITING_RESPONSE;
601                 p2p->cfg->go_neg_req_rx(p2p->cfg->cb_ctx, sa,
602                                         msg.dev_password_id);
603         } else if (p2p->go_neg_peer && p2p->go_neg_peer != dev) {
604                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
605                         "P2P: Already in Group Formation with another peer");
606                 status = P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
607         } else {
608                 int go;
609
610                 if (!p2p->go_neg_peer) {
611                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Starting "
612                                 "GO Negotiation with previously authorized "
613                                 "peer");
614                         if (!(dev->flags & P2P_DEV_FORCE_FREQ)) {
615                                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
616                                         "P2P: Use default channel settings");
617                                 p2p->op_reg_class = p2p->cfg->op_reg_class;
618                                 p2p->op_channel = p2p->cfg->op_channel;
619                                 os_memcpy(&p2p->channels, &p2p->cfg->channels,
620                                           sizeof(struct p2p_channels));
621                         } else {
622                                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
623                                         "P2P: Use previously configured "
624                                         "forced channel settings");
625                         }
626                 }
627
628                 dev->flags &= ~P2P_DEV_NOT_YET_READY;
629
630                 if (!msg.go_intent) {
631                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
632                                 "P2P: No GO Intent attribute received");
633                         goto fail;
634                 }
635                 if ((*msg.go_intent >> 1) > P2P_MAX_GO_INTENT) {
636                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
637                                 "P2P: Invalid GO Intent value (%u) received",
638                                 *msg.go_intent >> 1);
639                         goto fail;
640                 }
641
642                 if (dev->go_neg_req_sent &&
643                     os_memcmp(sa, p2p->cfg->dev_addr, ETH_ALEN) > 0) {
644                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
645                                 "P2P: Do not reply since peer has higher "
646                                 "address and GO Neg Request already sent");
647                         p2p_parse_free(&msg);
648                         return;
649                 }
650
651                 go = p2p_go_det(p2p->go_intent, *msg.go_intent);
652                 if (go < 0) {
653                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
654                                 "P2P: Incompatible GO Intent");
655                         status = P2P_SC_FAIL_BOTH_GO_INTENT_15;
656                         goto fail;
657                 }
658
659                 if (p2p_peer_channels(p2p, dev, msg.channel_list,
660                                       msg.channel_list_len) < 0) {
661                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
662                                 "P2P: No common channels found");
663                         status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
664                         goto fail;
665                 }
666
667                 switch (msg.dev_password_id) {
668                 case DEV_PW_REGISTRAR_SPECIFIED:
669                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
670                                 "P2P: PIN from peer Display");
671                         if (dev->wps_method != WPS_PIN_KEYPAD) {
672                                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
673                                         "P2P: We have wps_method=%s -> "
674                                         "incompatible",
675                                         p2p_wps_method_str(dev->wps_method));
676                                 status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
677                                 goto fail;
678                         }
679                         break;
680                 case DEV_PW_USER_SPECIFIED:
681                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
682                                 "P2P: Peer entered PIN on Keypad");
683                         if (dev->wps_method != WPS_PIN_DISPLAY) {
684                                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
685                                         "P2P: We have wps_method=%s -> "
686                                         "incompatible",
687                                         p2p_wps_method_str(dev->wps_method));
688                                 status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
689                                 goto fail;
690                         }
691                         break;
692                 case DEV_PW_PUSHBUTTON:
693                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
694                                 "P2P: Peer using pushbutton");
695                         if (dev->wps_method != WPS_PBC) {
696                                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
697                                         "P2P: We have wps_method=%s -> "
698                                         "incompatible",
699                                         p2p_wps_method_str(dev->wps_method));
700                                 status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
701                                 goto fail;
702                         }
703                         break;
704                 default:
705                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
706                                 "P2P: Unsupported Device Password ID %d",
707                                 msg.dev_password_id);
708                         status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
709                         goto fail;
710                 }
711
712                 if (go && p2p_go_select_channel(p2p, dev, &status) < 0)
713                         goto fail;
714
715                 dev->go_state = go ? LOCAL_GO : REMOTE_GO;
716                 dev->oper_freq = p2p_channel_to_freq((const char *)
717                                                      msg.operating_channel,
718                                                      msg.operating_channel[3],
719                                                      msg.operating_channel[4]);
720                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Peer operating "
721                         "channel preference: %d MHz", dev->oper_freq);
722
723                 if (msg.config_timeout) {
724                         dev->go_timeout = msg.config_timeout[0];
725                         dev->client_timeout = msg.config_timeout[1];
726                 }
727
728                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
729                         "P2P: GO Negotiation with " MACSTR, MAC2STR(sa));
730                 if (p2p->state != P2P_IDLE)
731                         p2p_stop_find_for_freq(p2p, rx_freq);
732                 p2p_set_state(p2p, P2P_GO_NEG);
733                 p2p_clear_timeout(p2p);
734                 dev->dialog_token = msg.dialog_token;
735                 os_memcpy(dev->intended_addr, msg.intended_addr, ETH_ALEN);
736                 p2p->go_neg_peer = dev;
737                 status = P2P_SC_SUCCESS;
738         }
739
740 fail:
741         if (dev)
742                 dev->status = status;
743         resp = p2p_build_go_neg_resp(p2p, dev, msg.dialog_token, status,
744                                      !tie_breaker);
745         p2p_parse_free(&msg);
746         if (resp == NULL)
747                 return;
748         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
749                 "P2P: Sending GO Negotiation Response");
750         if (rx_freq > 0)
751                 freq = rx_freq;
752         else
753                 freq = p2p_channel_to_freq(p2p->cfg->country,
754                                            p2p->cfg->reg_class,
755                                            p2p->cfg->channel);
756         if (freq < 0) {
757                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
758                         "P2P: Unknown regulatory class/channel");
759                 wpabuf_free(resp);
760                 return;
761         }
762         if (status == P2P_SC_SUCCESS) {
763                 p2p->pending_action_state = P2P_PENDING_GO_NEG_RESPONSE;
764                 dev->flags |= P2P_DEV_WAIT_GO_NEG_CONFIRM;
765                 if (os_memcmp(sa, p2p->cfg->dev_addr, ETH_ALEN) < 0) {
766                         /*
767                          * Peer has smaller address, so the GO Negotiation
768                          * Response from us is expected to complete
769                          * negotiation. Ignore a GO Negotiation Response from
770                          * the peer if it happens to be received after this
771                          * point due to a race condition in GO Negotiation
772                          * Request transmission and processing.
773                          */
774                         dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
775                 }
776         } else
777                 p2p->pending_action_state =
778                         P2P_PENDING_GO_NEG_RESPONSE_FAILURE;
779         if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr,
780                             p2p->cfg->dev_addr,
781                             wpabuf_head(resp), wpabuf_len(resp), 250) < 0) {
782                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
783                         "P2P: Failed to send Action frame");
784         }
785
786         wpabuf_free(resp);
787 }
788
789
790 static struct wpabuf * p2p_build_go_neg_conf(struct p2p_data *p2p,
791                                              struct p2p_device *peer,
792                                              u8 dialog_token, u8 status,
793                                              const u8 *resp_chan, int go)
794 {
795         struct wpabuf *buf;
796         u8 *len;
797         struct p2p_channels res;
798         u8 group_capab;
799         size_t extra = 0;
800
801         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
802                 "P2P: Building GO Negotiation Confirm");
803
804 #ifdef CONFIG_WIFI_DISPLAY
805         if (p2p->wfd_ie_go_neg)
806                 extra = wpabuf_len(p2p->wfd_ie_go_neg);
807 #endif /* CONFIG_WIFI_DISPLAY */
808
809         buf = wpabuf_alloc(1000 + extra);
810         if (buf == NULL)
811                 return NULL;
812
813         p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_CONF, dialog_token);
814
815         len = p2p_buf_add_ie_hdr(buf);
816         p2p_buf_add_status(buf, status);
817         group_capab = 0;
818         if (peer->go_state == LOCAL_GO) {
819                 if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
820                         group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
821                         if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
822                                 group_capab |=
823                                         P2P_GROUP_CAPAB_PERSISTENT_RECONN;
824                 }
825                 if (p2p->cross_connect)
826                         group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
827                 if (p2p->cfg->p2p_intra_bss)
828                         group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
829         }
830         p2p_buf_add_capability(buf, p2p->dev_capab &
831                                ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
832                                group_capab);
833         if (go || resp_chan == NULL)
834                 p2p_buf_add_operating_channel(buf, p2p->cfg->country,
835                                               p2p->op_reg_class,
836                                               p2p->op_channel);
837         else
838                 p2p_buf_add_operating_channel(buf, (const char *) resp_chan,
839                                               resp_chan[3], resp_chan[4]);
840         p2p_channels_intersect(&p2p->channels, &peer->channels, &res);
841         p2p_buf_add_channel_list(buf, p2p->cfg->country, &res);
842         if (go) {
843                 p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, p2p->ssid,
844                                      p2p->ssid_len);
845         }
846         p2p_buf_update_ie_hdr(buf, len);
847
848 #ifdef CONFIG_WIFI_DISPLAY
849         if (p2p->wfd_ie_go_neg)
850                 wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
851 #endif /* CONFIG_WIFI_DISPLAY */
852
853         return buf;
854 }
855
856
857 void p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa,
858                              const u8 *data, size_t len, int rx_freq)
859 {
860         struct p2p_device *dev;
861         struct wpabuf *conf;
862         int go = -1;
863         struct p2p_message msg;
864         u8 status = P2P_SC_SUCCESS;
865         int freq;
866
867         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
868                 "P2P: Received GO Negotiation Response from " MACSTR
869                 " (freq=%d)", MAC2STR(sa), rx_freq);
870         dev = p2p_get_device(p2p, sa);
871         if (dev == NULL || dev->wps_method == WPS_NOT_READY ||
872             dev != p2p->go_neg_peer) {
873                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
874                         "P2P: Not ready for GO negotiation with " MACSTR,
875                         MAC2STR(sa));
876                 return;
877         }
878
879         if (p2p_parse(data, len, &msg))
880                 return;
881
882         if (!(dev->flags & P2P_DEV_WAIT_GO_NEG_RESPONSE)) {
883                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
884                         "P2P: Was not expecting GO Negotiation Response - "
885                         "ignore");
886                 p2p_parse_free(&msg);
887                 return;
888         }
889         dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
890
891         if (msg.dialog_token != dev->dialog_token) {
892                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
893                         "P2P: Unexpected Dialog Token %u (expected %u)",
894                         msg.dialog_token, dev->dialog_token);
895                 p2p_parse_free(&msg);
896                 return;
897         }
898
899         if (!msg.status) {
900                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
901                         "P2P: No Status attribute received");
902                 status = P2P_SC_FAIL_INVALID_PARAMS;
903                 goto fail;
904         }
905         if (*msg.status) {
906                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
907                         "P2P: GO Negotiation rejected: status %d",
908                         *msg.status);
909                 dev->go_neg_req_sent = 0;
910                 if (*msg.status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
911                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
912                                 "P2P: Wait for the peer to become ready for "
913                                 "GO Negotiation");
914                         dev->flags |= P2P_DEV_NOT_YET_READY;
915                         dev->wait_count = 0;
916                         p2p_set_state(p2p, P2P_WAIT_PEER_IDLE);
917                         p2p_set_timeout(p2p, 0, 0);
918                 } else {
919                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
920                                 "P2P: Stop GO Negotiation attempt");
921                         p2p_go_neg_failed(p2p, dev, *msg.status);
922                 }
923                 p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
924                 p2p_parse_free(&msg);
925                 return;
926         }
927
928         if (!msg.capability) {
929                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
930                         "P2P: Mandatory Capability attribute missing from GO "
931                         "Negotiation Response");
932 #ifdef CONFIG_P2P_STRICT
933                 status = P2P_SC_FAIL_INVALID_PARAMS;
934                 goto fail;
935 #endif /* CONFIG_P2P_STRICT */
936         }
937
938         if (!msg.p2p_device_info) {
939                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
940                         "P2P: Mandatory P2P Device Info attribute missing "
941                         "from GO Negotiation Response");
942 #ifdef CONFIG_P2P_STRICT
943                 status = P2P_SC_FAIL_INVALID_PARAMS;
944                 goto fail;
945 #endif /* CONFIG_P2P_STRICT */
946         }
947
948         if (!msg.intended_addr) {
949                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
950                         "P2P: No Intended P2P Interface Address attribute "
951                         "received");
952                 status = P2P_SC_FAIL_INVALID_PARAMS;
953                 goto fail;
954         }
955
956         if (!msg.go_intent) {
957                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
958                         "P2P: No GO Intent attribute received");
959                 status = P2P_SC_FAIL_INVALID_PARAMS;
960                 goto fail;
961         }
962         if ((*msg.go_intent >> 1) > P2P_MAX_GO_INTENT) {
963                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
964                         "P2P: Invalid GO Intent value (%u) received",
965                         *msg.go_intent >> 1);
966                 status = P2P_SC_FAIL_INVALID_PARAMS;
967                 goto fail;
968         }
969
970         go = p2p_go_det(p2p->go_intent, *msg.go_intent);
971         if (go < 0) {
972                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
973                         "P2P: Incompatible GO Intent");
974                 status = P2P_SC_FAIL_INCOMPATIBLE_PARAMS;
975                 goto fail;
976         }
977
978         if (!go && msg.group_id) {
979                 /* Store SSID for Provisioning step */
980                 p2p->ssid_len = msg.group_id_len - ETH_ALEN;
981                 os_memcpy(p2p->ssid, msg.group_id + ETH_ALEN, p2p->ssid_len);
982         } else if (!go) {
983                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
984                         "P2P: Mandatory P2P Group ID attribute missing from "
985                         "GO Negotiation Response");
986                 p2p->ssid_len = 0;
987 #ifdef CONFIG_P2P_STRICT
988                 status = P2P_SC_FAIL_INVALID_PARAMS;
989                 goto fail;
990 #endif /* CONFIG_P2P_STRICT */
991         }
992
993         if (!msg.config_timeout) {
994                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
995                         "P2P: Mandatory Configuration Timeout attribute "
996                         "missing from GO Negotiation Response");
997 #ifdef CONFIG_P2P_STRICT
998                 status = P2P_SC_FAIL_INVALID_PARAMS;
999                 goto fail;
1000 #endif /* CONFIG_P2P_STRICT */
1001         } else {
1002                 dev->go_timeout = msg.config_timeout[0];
1003                 dev->client_timeout = msg.config_timeout[1];
1004         }
1005
1006         if (!msg.operating_channel && !go) {
1007                 /*
1008                  * Note: P2P Client may omit Operating Channel attribute to
1009                  * indicate it does not have a preference.
1010                  */
1011                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1012                         "P2P: No Operating Channel attribute received");
1013                 status = P2P_SC_FAIL_INVALID_PARAMS;
1014                 goto fail;
1015         }
1016         if (!msg.channel_list) {
1017                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1018                         "P2P: No Channel List attribute received");
1019                 status = P2P_SC_FAIL_INVALID_PARAMS;
1020                 goto fail;
1021         }
1022
1023         if (p2p_peer_channels(p2p, dev, msg.channel_list,
1024                               msg.channel_list_len) < 0) {
1025                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1026                         "P2P: No common channels found");
1027                 status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
1028                 goto fail;
1029         }
1030
1031         if (msg.operating_channel) {
1032                 dev->oper_freq = p2p_channel_to_freq((const char *)
1033                                                      msg.operating_channel,
1034                                                      msg.operating_channel[3],
1035                                                      msg.operating_channel[4]);
1036                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Peer operating "
1037                         "channel preference: %d MHz", dev->oper_freq);
1038         } else
1039                 dev->oper_freq = 0;
1040
1041         switch (msg.dev_password_id) {
1042         case DEV_PW_REGISTRAR_SPECIFIED:
1043                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1044                         "P2P: PIN from peer Display");
1045                 if (dev->wps_method != WPS_PIN_KEYPAD) {
1046                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1047                                 "P2P: We have wps_method=%s -> "
1048                                 "incompatible",
1049                                 p2p_wps_method_str(dev->wps_method));
1050                         status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1051                         goto fail;
1052                 }
1053                 break;
1054         case DEV_PW_USER_SPECIFIED:
1055                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1056                         "P2P: Peer entered PIN on Keypad");
1057                 if (dev->wps_method != WPS_PIN_DISPLAY) {
1058                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1059                                 "P2P: We have wps_method=%s -> "
1060                                 "incompatible",
1061                                 p2p_wps_method_str(dev->wps_method));
1062                         status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1063                         goto fail;
1064                 }
1065                 break;
1066         case DEV_PW_PUSHBUTTON:
1067                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1068                         "P2P: Peer using pushbutton");
1069                 if (dev->wps_method != WPS_PBC) {
1070                         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1071                                 "P2P: We have wps_method=%s -> "
1072                                 "incompatible",
1073                                 p2p_wps_method_str(dev->wps_method));
1074                         status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1075                         goto fail;
1076                 }
1077                 break;
1078         default:
1079                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1080                         "P2P: Unsupported Device Password ID %d",
1081                         msg.dev_password_id);
1082                 status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1083                 goto fail;
1084         }
1085
1086         if (go && p2p_go_select_channel(p2p, dev, &status) < 0)
1087                 goto fail;
1088
1089         p2p_set_state(p2p, P2P_GO_NEG);
1090         p2p_clear_timeout(p2p);
1091
1092         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1093                 "P2P: GO Negotiation with " MACSTR, MAC2STR(sa));
1094         os_memcpy(dev->intended_addr, msg.intended_addr, ETH_ALEN);
1095
1096 fail:
1097         conf = p2p_build_go_neg_conf(p2p, dev, msg.dialog_token, status,
1098                                      msg.operating_channel, go);
1099         p2p_parse_free(&msg);
1100         if (conf == NULL)
1101                 return;
1102         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1103                 "P2P: Sending GO Negotiation Confirm");
1104         if (status == P2P_SC_SUCCESS) {
1105                 p2p->pending_action_state = P2P_PENDING_GO_NEG_CONFIRM;
1106                 dev->go_state = go ? LOCAL_GO : REMOTE_GO;
1107         } else
1108                 p2p->pending_action_state = P2P_NO_PENDING_ACTION;
1109         if (rx_freq > 0)
1110                 freq = rx_freq;
1111         else
1112                 freq = dev->listen_freq;
1113         if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr, sa,
1114                             wpabuf_head(conf), wpabuf_len(conf), 0) < 0) {
1115                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1116                         "P2P: Failed to send Action frame");
1117                 p2p_go_neg_failed(p2p, dev, -1);
1118         }
1119         wpabuf_free(conf);
1120 }
1121
1122
1123 void p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa,
1124                              const u8 *data, size_t len)
1125 {
1126         struct p2p_device *dev;
1127         struct p2p_message msg;
1128
1129         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1130                 "P2P: Received GO Negotiation Confirm from " MACSTR,
1131                 MAC2STR(sa));
1132         dev = p2p_get_device(p2p, sa);
1133         if (dev == NULL || dev->wps_method == WPS_NOT_READY ||
1134             dev != p2p->go_neg_peer) {
1135                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1136                         "P2P: Not ready for GO negotiation with " MACSTR,
1137                         MAC2STR(sa));
1138                 return;
1139         }
1140
1141         if (p2p->pending_action_state == P2P_PENDING_GO_NEG_RESPONSE) {
1142                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: Stopped waiting "
1143                         "for TX status on GO Negotiation Response since we "
1144                         "already received Confirmation");
1145                 p2p->pending_action_state = P2P_NO_PENDING_ACTION;
1146         }
1147
1148         if (p2p_parse(data, len, &msg))
1149                 return;
1150
1151         if (!(dev->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
1152                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1153                         "P2P: Was not expecting GO Negotiation Confirm - "
1154                         "ignore");
1155                 return;
1156         }
1157         dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
1158
1159         if (msg.dialog_token != dev->dialog_token) {
1160                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1161                         "P2P: Unexpected Dialog Token %u (expected %u)",
1162                         msg.dialog_token, dev->dialog_token);
1163                 p2p_parse_free(&msg);
1164                 return;
1165         }
1166
1167         if (!msg.status) {
1168                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1169                         "P2P: No Status attribute received");
1170                 p2p_parse_free(&msg);
1171                 return;
1172         }
1173         if (*msg.status) {
1174                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1175                         "P2P: GO Negotiation rejected: status %d",
1176                         *msg.status);
1177                 p2p_parse_free(&msg);
1178                 return;
1179         }
1180
1181         if (dev->go_state == REMOTE_GO && msg.group_id) {
1182                 /* Store SSID for Provisioning step */
1183                 p2p->ssid_len = msg.group_id_len - ETH_ALEN;
1184                 os_memcpy(p2p->ssid, msg.group_id + ETH_ALEN, p2p->ssid_len);
1185         } else if (dev->go_state == REMOTE_GO) {
1186                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1187                         "P2P: Mandatory P2P Group ID attribute missing from "
1188                         "GO Negotiation Confirmation");
1189                 p2p->ssid_len = 0;
1190 #ifdef CONFIG_P2P_STRICT
1191                 p2p_parse_free(&msg);
1192                 return;
1193 #endif /* CONFIG_P2P_STRICT */
1194         }
1195
1196         if (!msg.operating_channel) {
1197                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1198                         "P2P: Mandatory Operating Channel attribute missing "
1199                         "from GO Negotiation Confirmation");
1200 #ifdef CONFIG_P2P_STRICT
1201                 p2p_parse_free(&msg);
1202                 return;
1203 #endif /* CONFIG_P2P_STRICT */
1204         }
1205
1206         if (!msg.channel_list) {
1207                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1208                         "P2P: Mandatory Operating Channel attribute missing "
1209                         "from GO Negotiation Confirmation");
1210 #ifdef CONFIG_P2P_STRICT
1211                 p2p_parse_free(&msg);
1212                 return;
1213 #endif /* CONFIG_P2P_STRICT */
1214         }
1215
1216         p2p_parse_free(&msg);
1217
1218         if (dev->go_state == UNKNOWN_GO) {
1219                 /*
1220                  * This should not happen since GO negotiation has already
1221                  * been completed.
1222                  */
1223                 wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG,
1224                         "P2P: Unexpected GO Neg state - do not know which end "
1225                         "becomes GO");
1226                 return;
1227         }
1228
1229         /*
1230          * The peer could have missed our ctrl::ack frame for GO Negotiation
1231          * Confirm and continue retransmitting the frame. To reduce the
1232          * likelihood of the peer not getting successful TX status for the
1233          * GO Negotiation Confirm frame, wait a short time here before starting
1234          * the group so that we will remain on the current channel to
1235          * acknowledge any possible retransmission from the peer.
1236          */
1237         wpa_msg(p2p->cfg->msg_ctx, MSG_DEBUG, "P2P: 20 ms wait on current "
1238                 "channel before starting group");
1239         os_sleep(0, 20000);
1240
1241         p2p_go_complete(p2p, dev);
1242 }