p2p_go_neg.c revision 351611
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 "utils/eloop.h"
13#include "common/ieee802_11_defs.h"
14#include "common/wpa_ctrl.h"
15#include "wps/wps_defs.h"
16#include "p2p_i.h"
17#include "p2p.h"
18
19
20static int p2p_go_det(u8 own_intent, u8 peer_value)
21{
22	u8 peer_intent = peer_value >> 1;
23	if (own_intent == peer_intent) {
24		if (own_intent == P2P_MAX_GO_INTENT)
25			return -1; /* both devices want to become GO */
26
27		/* Use tie breaker bit to determine GO */
28		return (peer_value & 0x01) ? 0 : 1;
29	}
30
31	return own_intent > peer_intent;
32}
33
34
35int p2p_peer_channels_check(struct p2p_data *p2p, struct p2p_channels *own,
36			    struct p2p_device *dev,
37			    const u8 *channel_list, size_t channel_list_len)
38{
39	const u8 *pos, *end;
40	struct p2p_channels *ch;
41	u8 channels;
42	struct p2p_channels intersection;
43
44	ch = &dev->channels;
45	os_memset(ch, 0, sizeof(*ch));
46	pos = channel_list;
47	end = channel_list + channel_list_len;
48
49	if (end - pos < 3)
50		return -1;
51	os_memcpy(dev->country, pos, 3);
52	wpa_hexdump_ascii(MSG_DEBUG, "P2P: Peer country", pos, 3);
53	if (pos[2] != 0x04 && os_memcmp(pos, p2p->cfg->country, 2) != 0) {
54		p2p_info(p2p, "Mismatching country (ours=%c%c peer's=%c%c)",
55			p2p->cfg->country[0], p2p->cfg->country[1],
56			pos[0], pos[1]);
57		return -1;
58	}
59	pos += 3;
60
61	while (end - pos > 2) {
62		struct p2p_reg_class *cl = &ch->reg_class[ch->reg_classes];
63		cl->reg_class = *pos++;
64		channels = *pos++;
65		if (channels > end - pos) {
66			p2p_info(p2p, "Invalid peer Channel List");
67			return -1;
68		}
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	p2p_dbg(p2p, "Own reg_classes %d peer reg_classes %d intersection reg_classes %d",
80		(int) own->reg_classes,
81		(int) dev->channels.reg_classes,
82		(int) intersection.reg_classes);
83	if (intersection.reg_classes == 0) {
84		p2p_info(p2p, "No common channels found");
85		return -1;
86	}
87	return 0;
88}
89
90
91static int p2p_peer_channels(struct p2p_data *p2p, struct p2p_device *dev,
92			     const u8 *channel_list, size_t channel_list_len)
93{
94	return p2p_peer_channels_check(p2p, &p2p->channels, dev,
95				       channel_list, channel_list_len);
96}
97
98
99u16 p2p_wps_method_pw_id(enum p2p_wps_method wps_method)
100{
101	switch (wps_method) {
102	case WPS_PIN_DISPLAY:
103		return DEV_PW_REGISTRAR_SPECIFIED;
104	case WPS_PIN_KEYPAD:
105		return DEV_PW_USER_SPECIFIED;
106	case WPS_PBC:
107		return DEV_PW_PUSHBUTTON;
108	case WPS_NFC:
109		return DEV_PW_NFC_CONNECTION_HANDOVER;
110	case WPS_P2PS:
111		return DEV_PW_P2PS_DEFAULT;
112	default:
113		return DEV_PW_DEFAULT;
114	}
115}
116
117
118static const char * p2p_wps_method_str(enum p2p_wps_method wps_method)
119{
120	switch (wps_method) {
121	case WPS_PIN_DISPLAY:
122		return "Display";
123	case WPS_PIN_KEYPAD:
124		return "Keypad";
125	case WPS_PBC:
126		return "PBC";
127	case WPS_NFC:
128		return "NFC";
129	case WPS_P2PS:
130		return "P2PS";
131	default:
132		return "??";
133	}
134}
135
136
137static struct wpabuf * p2p_build_go_neg_req(struct p2p_data *p2p,
138					    struct p2p_device *peer)
139{
140	struct wpabuf *buf;
141	u8 *len;
142	u8 group_capab;
143	size_t extra = 0;
144	u16 pw_id;
145
146#ifdef CONFIG_WIFI_DISPLAY
147	if (p2p->wfd_ie_go_neg)
148		extra = wpabuf_len(p2p->wfd_ie_go_neg);
149#endif /* CONFIG_WIFI_DISPLAY */
150
151	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_REQ])
152		extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_REQ]);
153
154	buf = wpabuf_alloc(1000 + extra);
155	if (buf == NULL)
156		return NULL;
157
158	p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_REQ, peer->dialog_token);
159
160	len = p2p_buf_add_ie_hdr(buf);
161	group_capab = 0;
162	if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
163		group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
164		if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
165			group_capab |= P2P_GROUP_CAPAB_PERSISTENT_RECONN;
166	}
167	if (p2p->cross_connect)
168		group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
169	if (p2p->cfg->p2p_intra_bss)
170		group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
171	p2p_buf_add_capability(buf, p2p->dev_capab &
172			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
173			       group_capab);
174	p2p_buf_add_go_intent(buf, (p2p->go_intent << 1) | peer->tie_breaker);
175	p2p_buf_add_config_timeout(buf, p2p->go_timeout, p2p->client_timeout);
176	p2p_buf_add_listen_channel(buf, p2p->cfg->country, p2p->cfg->reg_class,
177				   p2p->cfg->channel);
178	if (p2p->ext_listen_interval)
179		p2p_buf_add_ext_listen_timing(buf, p2p->ext_listen_period,
180					      p2p->ext_listen_interval);
181	p2p_buf_add_intended_addr(buf, p2p->intended_addr);
182	p2p_buf_add_channel_list(buf, p2p->cfg->country, &p2p->channels);
183	p2p_buf_add_device_info(buf, p2p, peer);
184	p2p_buf_add_operating_channel(buf, p2p->cfg->country,
185				      p2p->op_reg_class, p2p->op_channel);
186	p2p_buf_update_ie_hdr(buf, len);
187
188	p2p_buf_add_pref_channel_list(buf, p2p->pref_freq_list,
189				      p2p->num_pref_freq);
190
191	/* WPS IE with Device Password ID attribute */
192	pw_id = p2p_wps_method_pw_id(peer->wps_method);
193	if (peer->oob_pw_id)
194		pw_id = peer->oob_pw_id;
195	if (p2p_build_wps_ie(p2p, buf, pw_id, 0) < 0) {
196		p2p_dbg(p2p, "Failed to build WPS IE for GO Negotiation Request");
197		wpabuf_free(buf);
198		return NULL;
199	}
200
201#ifdef CONFIG_WIFI_DISPLAY
202	if (p2p->wfd_ie_go_neg)
203		wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
204#endif /* CONFIG_WIFI_DISPLAY */
205
206	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_REQ])
207		wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_REQ]);
208
209	return buf;
210}
211
212
213int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev)
214{
215	struct wpabuf *req;
216	int freq;
217
218	if (dev->flags & P2P_DEV_PD_BEFORE_GO_NEG) {
219		u16 config_method;
220		p2p_dbg(p2p, "Use PD-before-GO-Neg workaround for " MACSTR,
221			MAC2STR(dev->info.p2p_device_addr));
222		if (dev->wps_method == WPS_PIN_DISPLAY)
223			config_method = WPS_CONFIG_KEYPAD;
224		else if (dev->wps_method == WPS_PIN_KEYPAD)
225			config_method = WPS_CONFIG_DISPLAY;
226		else if (dev->wps_method == WPS_PBC)
227			config_method = WPS_CONFIG_PUSHBUTTON;
228		else if (dev->wps_method == WPS_P2PS)
229			config_method = WPS_CONFIG_P2PS;
230		else
231			return -1;
232		return p2p_prov_disc_req(p2p, dev->info.p2p_device_addr,
233					 NULL, config_method, 0, 0, 1);
234	}
235
236	freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
237	if (dev->oob_go_neg_freq > 0)
238		freq = dev->oob_go_neg_freq;
239	if (freq <= 0) {
240		p2p_dbg(p2p, "No Listen/Operating frequency known for the peer "
241			MACSTR " to send GO Negotiation Request",
242			MAC2STR(dev->info.p2p_device_addr));
243		return -1;
244	}
245
246	req = p2p_build_go_neg_req(p2p, dev);
247	if (req == NULL)
248		return -1;
249	p2p_dbg(p2p, "Sending GO Negotiation Request");
250	p2p_set_state(p2p, P2P_CONNECT);
251	p2p->pending_action_state = P2P_PENDING_GO_NEG_REQUEST;
252	p2p->go_neg_peer = dev;
253	eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
254	dev->flags |= P2P_DEV_WAIT_GO_NEG_RESPONSE;
255	dev->connect_reqs++;
256	if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr,
257			    p2p->cfg->dev_addr, dev->info.p2p_device_addr,
258			    wpabuf_head(req), wpabuf_len(req), 500) < 0) {
259		p2p_dbg(p2p, "Failed to send Action frame");
260		/* Use P2P find to recover and retry */
261		p2p_set_timeout(p2p, 0, 0);
262	} else
263		dev->go_neg_req_sent++;
264
265	wpabuf_free(req);
266
267	return 0;
268}
269
270
271static struct wpabuf * p2p_build_go_neg_resp(struct p2p_data *p2p,
272					     struct p2p_device *peer,
273					     u8 dialog_token, u8 status,
274					     u8 tie_breaker)
275{
276	struct wpabuf *buf;
277	u8 *len;
278	u8 group_capab;
279	size_t extra = 0;
280	u16 pw_id;
281
282	p2p_dbg(p2p, "Building GO Negotiation Response");
283
284#ifdef CONFIG_WIFI_DISPLAY
285	if (p2p->wfd_ie_go_neg)
286		extra = wpabuf_len(p2p->wfd_ie_go_neg);
287#endif /* CONFIG_WIFI_DISPLAY */
288
289	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_RESP])
290		extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_RESP]);
291
292	buf = wpabuf_alloc(1000 + extra);
293	if (buf == NULL)
294		return NULL;
295
296	p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_RESP, dialog_token);
297
298	len = p2p_buf_add_ie_hdr(buf);
299	p2p_buf_add_status(buf, status);
300	group_capab = 0;
301	if (peer && peer->go_state == LOCAL_GO) {
302		if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
303			group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
304			if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
305				group_capab |=
306					P2P_GROUP_CAPAB_PERSISTENT_RECONN;
307		}
308		if (p2p->cross_connect)
309			group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
310		if (p2p->cfg->p2p_intra_bss)
311			group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
312	}
313	p2p_buf_add_capability(buf, p2p->dev_capab &
314			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
315			       group_capab);
316	p2p_buf_add_go_intent(buf, (p2p->go_intent << 1) | tie_breaker);
317	p2p_buf_add_config_timeout(buf, p2p->go_timeout, p2p->client_timeout);
318	if (p2p->override_pref_op_class) {
319		p2p_dbg(p2p, "Override operating channel preference");
320		p2p_buf_add_operating_channel(buf, p2p->cfg->country,
321					      p2p->override_pref_op_class,
322					      p2p->override_pref_channel);
323	} else if (peer && peer->go_state == REMOTE_GO && !p2p->num_pref_freq) {
324		p2p_dbg(p2p, "Omit Operating Channel attribute");
325	} else {
326		p2p_buf_add_operating_channel(buf, p2p->cfg->country,
327					      p2p->op_reg_class,
328					      p2p->op_channel);
329	}
330	p2p_buf_add_intended_addr(buf, p2p->intended_addr);
331	if (status || peer == NULL) {
332		p2p_buf_add_channel_list(buf, p2p->cfg->country,
333					 &p2p->channels);
334	} else if (peer->go_state == REMOTE_GO) {
335		p2p_buf_add_channel_list(buf, p2p->cfg->country,
336					 &p2p->channels);
337	} else {
338		struct p2p_channels res;
339		p2p_channels_intersect(&p2p->channels, &peer->channels,
340				       &res);
341		p2p_buf_add_channel_list(buf, p2p->cfg->country, &res);
342	}
343	p2p_buf_add_device_info(buf, p2p, peer);
344	if (peer && peer->go_state == LOCAL_GO) {
345		p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, p2p->ssid,
346				     p2p->ssid_len);
347	}
348	p2p_buf_update_ie_hdr(buf, len);
349
350	/* WPS IE with Device Password ID attribute */
351	pw_id = p2p_wps_method_pw_id(peer ? peer->wps_method : WPS_NOT_READY);
352	if (peer && peer->oob_pw_id)
353		pw_id = peer->oob_pw_id;
354	if (p2p_build_wps_ie(p2p, buf, pw_id, 0) < 0) {
355		p2p_dbg(p2p, "Failed to build WPS IE for GO Negotiation Response");
356		wpabuf_free(buf);
357		return NULL;
358	}
359
360#ifdef CONFIG_WIFI_DISPLAY
361	if (p2p->wfd_ie_go_neg)
362		wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
363#endif /* CONFIG_WIFI_DISPLAY */
364
365	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_RESP])
366		wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_RESP]);
367
368	return buf;
369}
370
371
372/**
373 * p2p_reselect_channel - Re-select operating channel based on peer information
374 * @p2p: P2P module context from p2p_init()
375 * @intersection: Support channel list intersection from local and peer
376 *
377 * This function is used to re-select the best channel after having received
378 * information from the peer to allow supported channel lists to be intersected.
379 * This can be used to improve initial channel selection done in
380 * p2p_prepare_channel() prior to the start of GO Negotiation. In addition, this
381 * can be used for Invitation case.
382 */
383void p2p_reselect_channel(struct p2p_data *p2p,
384			  struct p2p_channels *intersection)
385{
386	struct p2p_reg_class *cl;
387	int freq;
388	u8 op_reg_class, op_channel;
389	unsigned int i;
390	const int op_classes_5ghz[] = { 124, 125, 115, 0 };
391	const int op_classes_ht40[] = { 126, 127, 116, 117, 0 };
392	const int op_classes_vht[] = { 128, 129, 130, 0 };
393
394	if (p2p->own_freq_preference > 0 &&
395	    p2p_freq_to_channel(p2p->own_freq_preference,
396				&op_reg_class, &op_channel) == 0 &&
397	    p2p_channels_includes(intersection, op_reg_class, op_channel)) {
398		p2p_dbg(p2p, "Pick own channel preference (reg_class %u channel %u) from intersection",
399			op_reg_class, op_channel);
400		p2p->op_reg_class = op_reg_class;
401		p2p->op_channel = op_channel;
402		return;
403	}
404
405	if (p2p->best_freq_overall > 0 &&
406	    p2p_freq_to_channel(p2p->best_freq_overall,
407				&op_reg_class, &op_channel) == 0 &&
408	    p2p_channels_includes(intersection, op_reg_class, op_channel)) {
409		p2p_dbg(p2p, "Pick best overall channel (reg_class %u channel %u) from intersection",
410			op_reg_class, op_channel);
411		p2p->op_reg_class = op_reg_class;
412		p2p->op_channel = op_channel;
413		return;
414	}
415
416	/* First, try to pick the best channel from another band */
417	freq = p2p_channel_to_freq(p2p->op_reg_class, p2p->op_channel);
418	if (freq >= 2400 && freq < 2500 && p2p->best_freq_5 > 0 &&
419	    !p2p_channels_includes(intersection, p2p->op_reg_class,
420				   p2p->op_channel) &&
421	    p2p_freq_to_channel(p2p->best_freq_5,
422				&op_reg_class, &op_channel) == 0 &&
423	    p2p_channels_includes(intersection, op_reg_class, op_channel)) {
424		p2p_dbg(p2p, "Pick best 5 GHz channel (reg_class %u channel %u) from intersection",
425			op_reg_class, op_channel);
426		p2p->op_reg_class = op_reg_class;
427		p2p->op_channel = op_channel;
428		return;
429	}
430
431	if (freq >= 4900 && freq < 6000 && p2p->best_freq_24 > 0 &&
432	    !p2p_channels_includes(intersection, p2p->op_reg_class,
433				   p2p->op_channel) &&
434	    p2p_freq_to_channel(p2p->best_freq_24,
435				&op_reg_class, &op_channel) == 0 &&
436	    p2p_channels_includes(intersection, op_reg_class, op_channel)) {
437		p2p_dbg(p2p, "Pick best 2.4 GHz channel (reg_class %u channel %u) from intersection",
438			op_reg_class, op_channel);
439		p2p->op_reg_class = op_reg_class;
440		p2p->op_channel = op_channel;
441		return;
442	}
443
444	/* Select channel with highest preference if the peer supports it */
445	for (i = 0; p2p->cfg->pref_chan && i < p2p->cfg->num_pref_chan; i++) {
446		if (p2p_channels_includes(intersection,
447					  p2p->cfg->pref_chan[i].op_class,
448					  p2p->cfg->pref_chan[i].chan)) {
449			p2p->op_reg_class = p2p->cfg->pref_chan[i].op_class;
450			p2p->op_channel = p2p->cfg->pref_chan[i].chan;
451			p2p_dbg(p2p, "Pick highest preferred channel (op_class %u channel %u) from intersection",
452				p2p->op_reg_class, p2p->op_channel);
453			return;
454		}
455	}
456
457	/* Try a channel where we might be able to use VHT */
458	if (p2p_channel_select(intersection, op_classes_vht,
459			       &p2p->op_reg_class, &p2p->op_channel) == 0) {
460		p2p_dbg(p2p, "Pick possible VHT channel (op_class %u channel %u) from intersection",
461			p2p->op_reg_class, p2p->op_channel);
462		return;
463	}
464
465	/* Try a channel where we might be able to use HT40 */
466	if (p2p_channel_select(intersection, op_classes_ht40,
467			       &p2p->op_reg_class, &p2p->op_channel) == 0) {
468		p2p_dbg(p2p, "Pick possible HT40 channel (op_class %u channel %u) from intersection",
469			p2p->op_reg_class, p2p->op_channel);
470		return;
471	}
472
473	/* Prefer a 5 GHz channel */
474	if (p2p_channel_select(intersection, op_classes_5ghz,
475			       &p2p->op_reg_class, &p2p->op_channel) == 0) {
476		p2p_dbg(p2p, "Pick possible 5 GHz channel (op_class %u channel %u) from intersection",
477			p2p->op_reg_class, p2p->op_channel);
478		return;
479	}
480
481	/*
482	 * Try to see if the original channel is in the intersection. If
483	 * so, no need to change anything, as it already contains some
484	 * randomness.
485	 */
486	if (p2p_channels_includes(intersection, p2p->op_reg_class,
487				  p2p->op_channel)) {
488		p2p_dbg(p2p, "Using original operating class and channel (op_class %u channel %u) from intersection",
489			p2p->op_reg_class, p2p->op_channel);
490		return;
491	}
492
493	/*
494	 * Fall back to whatever is included in the channel intersection since
495	 * no better options seems to be available.
496	 */
497	cl = &intersection->reg_class[0];
498	p2p_dbg(p2p, "Pick another channel (reg_class %u channel %u) from intersection",
499		cl->reg_class, cl->channel[0]);
500	p2p->op_reg_class = cl->reg_class;
501	p2p->op_channel = cl->channel[0];
502}
503
504
505int p2p_go_select_channel(struct p2p_data *p2p, struct p2p_device *dev,
506			  u8 *status)
507{
508	struct p2p_channels tmp, intersection;
509
510	p2p_channels_dump(p2p, "own channels", &p2p->channels);
511	p2p_channels_dump(p2p, "peer channels", &dev->channels);
512	p2p_channels_intersect(&p2p->channels, &dev->channels, &tmp);
513	p2p_channels_dump(p2p, "intersection", &tmp);
514	p2p_channels_remove_freqs(&tmp, &p2p->no_go_freq);
515	p2p_channels_dump(p2p, "intersection after no-GO removal", &tmp);
516	p2p_channels_intersect(&tmp, &p2p->cfg->channels, &intersection);
517	p2p_channels_dump(p2p, "intersection with local channel list",
518			  &intersection);
519	if (intersection.reg_classes == 0 ||
520	    intersection.reg_class[0].channels == 0) {
521		*status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
522		p2p_dbg(p2p, "No common channels found");
523		return -1;
524	}
525
526	if (!p2p_channels_includes(&intersection, p2p->op_reg_class,
527				   p2p->op_channel)) {
528		if (dev->flags & P2P_DEV_FORCE_FREQ) {
529			*status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
530			p2p_dbg(p2p, "Peer does not support the forced channel");
531			return -1;
532		}
533
534		p2p_dbg(p2p, "Selected operating channel (op_class %u channel %u) not acceptable to the peer",
535			p2p->op_reg_class, p2p->op_channel);
536		p2p_reselect_channel(p2p, &intersection);
537	} else if (!(dev->flags & P2P_DEV_FORCE_FREQ) &&
538		   !p2p->cfg->cfg_op_channel) {
539		p2p_dbg(p2p, "Try to optimize channel selection with peer information received; previously selected op_class %u channel %u",
540			p2p->op_reg_class, p2p->op_channel);
541		p2p_reselect_channel(p2p, &intersection);
542	}
543
544	if (!p2p->ssid_set) {
545		p2p_build_ssid(p2p, p2p->ssid, &p2p->ssid_len);
546		p2p->ssid_set = 1;
547	}
548
549	return 0;
550}
551
552
553static void p2p_check_pref_chan_no_recv(struct p2p_data *p2p, int go,
554					struct p2p_device *dev,
555					struct p2p_message *msg,
556					unsigned freq_list[], unsigned int size)
557{
558	u8 op_class, op_channel;
559	unsigned int oper_freq = 0, i, j;
560	int found = 0;
561
562	p2p_dbg(p2p,
563		"Peer didn't provide a preferred frequency list, see if any of our preferred channels are supported by peer device");
564
565	/*
566	 * Search for a common channel in our preferred frequency list which is
567	 * also supported by the peer device.
568	 */
569	for (i = 0; i < size && !found; i++) {
570		/* Make sure that the common frequency is supported by peer. */
571		oper_freq = freq_list[i];
572		if (p2p_freq_to_channel(oper_freq, &op_class,
573					&op_channel) < 0)
574			continue; /* cannot happen due to earlier check */
575		for (j = 0; j < msg->channel_list_len; j++) {
576
577			if (op_channel != msg->channel_list[j])
578				continue;
579
580			p2p->op_reg_class = op_class;
581			p2p->op_channel = op_channel;
582			os_memcpy(&p2p->channels, &p2p->cfg->channels,
583				  sizeof(struct p2p_channels));
584			found = 1;
585			break;
586		}
587	}
588
589	if (found) {
590		p2p_dbg(p2p,
591			"Freq %d MHz is a preferred channel and is also supported by peer, use it as the operating channel",
592			oper_freq);
593	} else {
594		p2p_dbg(p2p,
595			"None of our preferred channels are supported by peer!");
596	}
597}
598
599
600static void p2p_check_pref_chan_recv(struct p2p_data *p2p, int go,
601				     struct p2p_device *dev,
602				     struct p2p_message *msg,
603				     unsigned freq_list[], unsigned int size)
604{
605	u8 op_class, op_channel;
606	unsigned int oper_freq = 0, i, j;
607	int found = 0;
608
609	/*
610	 * Peer device supports a Preferred Frequency List.
611	 * Search for a common channel in the preferred frequency lists
612	 * of both peer and local devices.
613	 */
614	for (i = 0; i < size && !found; i++) {
615		for (j = 2; j < (msg->pref_freq_list_len / 2); j++) {
616			oper_freq = p2p_channel_to_freq(
617				msg->pref_freq_list[2 * j],
618				msg->pref_freq_list[2 * j + 1]);
619			if (freq_list[i] != oper_freq)
620				continue;
621			if (p2p_freq_to_channel(oper_freq, &op_class,
622						&op_channel) < 0)
623				continue; /* cannot happen */
624			p2p->op_reg_class = op_class;
625			p2p->op_channel = op_channel;
626			os_memcpy(&p2p->channels, &p2p->cfg->channels,
627				  sizeof(struct p2p_channels));
628			found = 1;
629			break;
630		}
631	}
632
633	if (found) {
634		p2p_dbg(p2p,
635			"Freq %d MHz is a common preferred channel for both peer and local, use it as operating channel",
636			oper_freq);
637	} else {
638		p2p_dbg(p2p, "No common preferred channels found!");
639	}
640}
641
642
643void p2p_check_pref_chan(struct p2p_data *p2p, int go,
644			 struct p2p_device *dev, struct p2p_message *msg)
645{
646	unsigned int freq_list[P2P_MAX_PREF_CHANNELS], size;
647	unsigned int i;
648	u8 op_class, op_channel;
649	char txt[100], *pos, *end;
650	int res;
651
652	/*
653	 * Use the preferred channel list from the driver only if there is no
654	 * forced_freq, e.g., P2P_CONNECT freq=..., and no preferred operating
655	 * channel hardcoded in the configuration file.
656	 */
657	if (!p2p->cfg->get_pref_freq_list || p2p->cfg->num_pref_chan ||
658	    (dev->flags & P2P_DEV_FORCE_FREQ) || p2p->cfg->cfg_op_channel)
659		return;
660
661	/* Obtain our preferred frequency list from driver based on P2P role. */
662	size = P2P_MAX_PREF_CHANNELS;
663	if (p2p->cfg->get_pref_freq_list(p2p->cfg->cb_ctx, go, &size,
664					 freq_list))
665		return;
666	/* Filter out frequencies that are not acceptable for P2P use */
667	i = 0;
668	while (i < size) {
669		if (p2p_freq_to_channel(freq_list[i], &op_class,
670					&op_channel) < 0 ||
671		    (!p2p_channels_includes(&p2p->cfg->channels,
672					    op_class, op_channel) &&
673		     (go || !p2p_channels_includes(&p2p->cfg->cli_channels,
674						   op_class, op_channel)))) {
675			p2p_dbg(p2p,
676				"Ignore local driver frequency preference %u MHz since it is not acceptable for P2P use (go=%d)",
677				freq_list[i], go);
678			if (size - i - 1 > 0)
679				os_memmove(&freq_list[i], &freq_list[i + 1],
680					   (size - i - 1) *
681					   sizeof(unsigned int));
682			size--;
683			continue;
684		}
685
686		/* Preferred frequency is acceptable for P2P use */
687		i++;
688	}
689
690	pos = txt;
691	end = pos + sizeof(txt);
692	for (i = 0; i < size; i++) {
693		res = os_snprintf(pos, end - pos, " %u", freq_list[i]);
694		if (os_snprintf_error(end - pos, res))
695			break;
696		pos += res;
697	}
698	*pos = '\0';
699	p2p_dbg(p2p, "Local driver frequency preference (size=%u):%s",
700		size, txt);
701
702	/*
703	 * Check if peer's preference of operating channel is in
704	 * our preferred channel list.
705	 */
706	for (i = 0; i < size; i++) {
707		if (freq_list[i] == (unsigned int) dev->oper_freq)
708			break;
709	}
710	if (i != size &&
711	    p2p_freq_to_channel(freq_list[i], &op_class, &op_channel) == 0) {
712		/* Peer operating channel preference matches our preference */
713		p2p->op_reg_class = op_class;
714		p2p->op_channel = op_channel;
715		os_memcpy(&p2p->channels, &p2p->cfg->channels,
716			  sizeof(struct p2p_channels));
717		return;
718	}
719
720	p2p_dbg(p2p,
721		"Peer operating channel preference: %d MHz is not in our preferred channel list",
722		dev->oper_freq);
723
724	/*
725	  Check if peer's preferred channel list is
726	  * _not_ included in the GO Negotiation Request or Invitation Request.
727	  */
728	if (msg->pref_freq_list_len == 0)
729		p2p_check_pref_chan_no_recv(p2p, go, dev, msg, freq_list, size);
730	else
731		p2p_check_pref_chan_recv(p2p, go, dev, msg, freq_list, size);
732}
733
734
735void p2p_process_go_neg_req(struct p2p_data *p2p, const u8 *sa,
736			    const u8 *data, size_t len, int rx_freq)
737{
738	struct p2p_device *dev = NULL;
739	struct wpabuf *resp;
740	struct p2p_message msg;
741	u8 status = P2P_SC_FAIL_INVALID_PARAMS;
742	int tie_breaker = 0;
743	int freq;
744
745	p2p_dbg(p2p, "Received GO Negotiation Request from " MACSTR "(freq=%d)",
746		MAC2STR(sa), rx_freq);
747
748	if (p2p_parse(data, len, &msg))
749		return;
750
751	if (!msg.capability) {
752		p2p_dbg(p2p, "Mandatory Capability attribute missing from GO Negotiation Request");
753#ifdef CONFIG_P2P_STRICT
754		goto fail;
755#endif /* CONFIG_P2P_STRICT */
756	}
757
758	if (msg.go_intent)
759		tie_breaker = *msg.go_intent & 0x01;
760	else {
761		p2p_dbg(p2p, "Mandatory GO Intent attribute missing from GO Negotiation Request");
762#ifdef CONFIG_P2P_STRICT
763		goto fail;
764#endif /* CONFIG_P2P_STRICT */
765	}
766
767	if (!msg.config_timeout) {
768		p2p_dbg(p2p, "Mandatory Configuration Timeout attribute missing from GO Negotiation Request");
769#ifdef CONFIG_P2P_STRICT
770		goto fail;
771#endif /* CONFIG_P2P_STRICT */
772	}
773
774	if (!msg.listen_channel) {
775		p2p_dbg(p2p, "No Listen Channel attribute received");
776		goto fail;
777	}
778	if (!msg.operating_channel) {
779		p2p_dbg(p2p, "No Operating Channel attribute received");
780		goto fail;
781	}
782	if (!msg.channel_list) {
783		p2p_dbg(p2p, "No Channel List attribute received");
784		goto fail;
785	}
786	if (!msg.intended_addr) {
787		p2p_dbg(p2p, "No Intended P2P Interface Address attribute received");
788		goto fail;
789	}
790	if (!msg.p2p_device_info) {
791		p2p_dbg(p2p, "No P2P Device Info attribute received");
792		goto fail;
793	}
794
795	if (os_memcmp(msg.p2p_device_addr, sa, ETH_ALEN) != 0) {
796		p2p_dbg(p2p, "Unexpected GO Negotiation Request SA=" MACSTR
797			" != dev_addr=" MACSTR,
798			MAC2STR(sa), MAC2STR(msg.p2p_device_addr));
799		goto fail;
800	}
801
802	dev = p2p_get_device(p2p, sa);
803
804	if (msg.status && *msg.status) {
805		p2p_dbg(p2p, "Unexpected Status attribute (%d) in GO Negotiation Request",
806			*msg.status);
807		if (dev && p2p->go_neg_peer == dev &&
808		    *msg.status == P2P_SC_FAIL_REJECTED_BY_USER) {
809			/*
810			 * This mechanism for using Status attribute in GO
811			 * Negotiation Request is not compliant with the P2P
812			 * specification, but some deployed devices use it to
813			 * indicate rejection of GO Negotiation in a case where
814			 * they have sent out GO Negotiation Response with
815			 * status 1. The P2P specification explicitly disallows
816			 * this. To avoid unnecessary interoperability issues
817			 * and extra frames, mark the pending negotiation as
818			 * failed and do not reply to this GO Negotiation
819			 * Request frame.
820			 */
821			p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
822			p2p_go_neg_failed(p2p, *msg.status);
823			p2p_parse_free(&msg);
824			return;
825		}
826		goto fail;
827	}
828
829	if (dev == NULL)
830		dev = p2p_add_dev_from_go_neg_req(p2p, sa, &msg);
831	else if ((dev->flags & P2P_DEV_PROBE_REQ_ONLY) ||
832		  !(dev->flags & P2P_DEV_REPORTED))
833		p2p_add_dev_info(p2p, sa, dev, &msg);
834	else if (!dev->listen_freq && !dev->oper_freq) {
835		/*
836		 * This may happen if the peer entry was added based on PD
837		 * Request and no Probe Request/Response frame has been received
838		 * from this peer (or that information has timed out).
839		 */
840		p2p_dbg(p2p, "Update peer " MACSTR
841			" based on GO Neg Req since listen/oper freq not known",
842			MAC2STR(dev->info.p2p_device_addr));
843		p2p_add_dev_info(p2p, sa, dev, &msg);
844	}
845
846	if (p2p->go_neg_peer && p2p->go_neg_peer == dev)
847		eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
848
849	if (dev && dev->flags & P2P_DEV_USER_REJECTED) {
850		p2p_dbg(p2p, "User has rejected this peer");
851		status = P2P_SC_FAIL_REJECTED_BY_USER;
852	} else if (dev == NULL ||
853		   (dev->wps_method == WPS_NOT_READY &&
854		    (p2p->authorized_oob_dev_pw_id == 0 ||
855		     p2p->authorized_oob_dev_pw_id !=
856		     msg.dev_password_id))) {
857		p2p_dbg(p2p, "Not ready for GO negotiation with " MACSTR,
858			MAC2STR(sa));
859		status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
860		p2p->cfg->go_neg_req_rx(p2p->cfg->cb_ctx, sa,
861					msg.dev_password_id,
862					msg.go_intent ? (*msg.go_intent >> 1) :
863					0);
864	} else if (p2p->go_neg_peer && p2p->go_neg_peer != dev) {
865		p2p_dbg(p2p, "Already in Group Formation with another peer");
866		status = P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
867	} else {
868		int go;
869
870		if (!p2p->go_neg_peer) {
871			p2p_dbg(p2p, "Starting GO Negotiation with previously authorized peer");
872			if (!(dev->flags & P2P_DEV_FORCE_FREQ)) {
873				p2p_dbg(p2p, "Use default channel settings");
874				p2p->op_reg_class = p2p->cfg->op_reg_class;
875				p2p->op_channel = p2p->cfg->op_channel;
876				os_memcpy(&p2p->channels, &p2p->cfg->channels,
877					  sizeof(struct p2p_channels));
878			} else {
879				p2p_dbg(p2p, "Use previously configured forced channel settings");
880			}
881		}
882
883		dev->flags &= ~P2P_DEV_NOT_YET_READY;
884
885		if (!msg.go_intent) {
886			p2p_dbg(p2p, "No GO Intent attribute received");
887			goto fail;
888		}
889		if ((*msg.go_intent >> 1) > P2P_MAX_GO_INTENT) {
890			p2p_dbg(p2p, "Invalid GO Intent value (%u) received",
891				*msg.go_intent >> 1);
892			goto fail;
893		}
894
895		if (dev->go_neg_req_sent &&
896		    os_memcmp(sa, p2p->cfg->dev_addr, ETH_ALEN) > 0) {
897			p2p_dbg(p2p, "Do not reply since peer has higher address and GO Neg Request already sent");
898			p2p_parse_free(&msg);
899			return;
900		}
901
902		if (dev->go_neg_req_sent &&
903		    (dev->flags & P2P_DEV_PEER_WAITING_RESPONSE)) {
904			p2p_dbg(p2p,
905				"Do not reply since peer is waiting for us to start a new GO Negotiation and GO Neg Request already sent");
906			p2p_parse_free(&msg);
907			return;
908		}
909
910		go = p2p_go_det(p2p->go_intent, *msg.go_intent);
911		if (go < 0) {
912			p2p_dbg(p2p, "Incompatible GO Intent");
913			status = P2P_SC_FAIL_BOTH_GO_INTENT_15;
914			goto fail;
915		}
916
917		if (p2p_peer_channels(p2p, dev, msg.channel_list,
918				      msg.channel_list_len) < 0) {
919			p2p_dbg(p2p, "No common channels found");
920			status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
921			goto fail;
922		}
923
924		switch (msg.dev_password_id) {
925		case DEV_PW_REGISTRAR_SPECIFIED:
926			p2p_dbg(p2p, "PIN from peer Display");
927			if (dev->wps_method != WPS_PIN_KEYPAD) {
928				p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
929					p2p_wps_method_str(dev->wps_method));
930				status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
931				goto fail;
932			}
933			break;
934		case DEV_PW_USER_SPECIFIED:
935			p2p_dbg(p2p, "Peer entered PIN on Keypad");
936			if (dev->wps_method != WPS_PIN_DISPLAY) {
937				p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
938					p2p_wps_method_str(dev->wps_method));
939				status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
940				goto fail;
941			}
942			break;
943		case DEV_PW_PUSHBUTTON:
944			p2p_dbg(p2p, "Peer using pushbutton");
945			if (dev->wps_method != WPS_PBC) {
946				p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
947					p2p_wps_method_str(dev->wps_method));
948				status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
949				goto fail;
950			}
951			break;
952		case DEV_PW_P2PS_DEFAULT:
953			p2p_dbg(p2p, "Peer using P2PS pin");
954			if (dev->wps_method != WPS_P2PS) {
955				p2p_dbg(p2p,
956					"We have wps_method=%s -> incompatible",
957					p2p_wps_method_str(dev->wps_method));
958				status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
959				goto fail;
960			}
961			break;
962		default:
963			if (msg.dev_password_id &&
964			    msg.dev_password_id == dev->oob_pw_id) {
965				p2p_dbg(p2p, "Peer using NFC");
966				if (dev->wps_method != WPS_NFC) {
967					p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
968						p2p_wps_method_str(
969							dev->wps_method));
970					status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
971					goto fail;
972				}
973				break;
974			}
975#ifdef CONFIG_WPS_NFC
976			if (p2p->authorized_oob_dev_pw_id &&
977			    msg.dev_password_id ==
978			    p2p->authorized_oob_dev_pw_id) {
979				p2p_dbg(p2p, "Using static handover with our device password from NFC Tag");
980				dev->wps_method = WPS_NFC;
981				dev->oob_pw_id = p2p->authorized_oob_dev_pw_id;
982				break;
983			}
984#endif /* CONFIG_WPS_NFC */
985			p2p_dbg(p2p, "Unsupported Device Password ID %d",
986				msg.dev_password_id);
987			status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
988			goto fail;
989		}
990
991		if (go && p2p_go_select_channel(p2p, dev, &status) < 0)
992			goto fail;
993
994		dev->go_state = go ? LOCAL_GO : REMOTE_GO;
995		dev->oper_freq = p2p_channel_to_freq(msg.operating_channel[3],
996						     msg.operating_channel[4]);
997		p2p_dbg(p2p, "Peer operating channel preference: %d MHz",
998			dev->oper_freq);
999
1000		/*
1001		 * Use the driver preferred frequency list extension if
1002		 * supported.
1003		 */
1004		p2p_check_pref_chan(p2p, go, dev, &msg);
1005
1006		if (msg.config_timeout) {
1007			dev->go_timeout = msg.config_timeout[0];
1008			dev->client_timeout = msg.config_timeout[1];
1009		}
1010
1011		p2p_dbg(p2p, "GO Negotiation with " MACSTR, MAC2STR(sa));
1012		if (p2p->state != P2P_IDLE)
1013			p2p_stop_find_for_freq(p2p, rx_freq);
1014		p2p_set_state(p2p, P2P_GO_NEG);
1015		p2p_clear_timeout(p2p);
1016		dev->dialog_token = msg.dialog_token;
1017		os_memcpy(dev->intended_addr, msg.intended_addr, ETH_ALEN);
1018		p2p->go_neg_peer = dev;
1019		eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p, NULL);
1020		status = P2P_SC_SUCCESS;
1021	}
1022
1023fail:
1024	if (dev)
1025		dev->status = status;
1026	resp = p2p_build_go_neg_resp(p2p, dev, msg.dialog_token, status,
1027				     !tie_breaker);
1028	p2p_parse_free(&msg);
1029	if (resp == NULL)
1030		return;
1031	p2p_dbg(p2p, "Sending GO Negotiation Response");
1032	if (rx_freq > 0)
1033		freq = rx_freq;
1034	else
1035		freq = p2p_channel_to_freq(p2p->cfg->reg_class,
1036					   p2p->cfg->channel);
1037	if (freq < 0) {
1038		p2p_dbg(p2p, "Unknown regulatory class/channel");
1039		wpabuf_free(resp);
1040		return;
1041	}
1042	if (status == P2P_SC_SUCCESS) {
1043		p2p->pending_action_state = P2P_PENDING_GO_NEG_RESPONSE;
1044		dev->flags |= P2P_DEV_WAIT_GO_NEG_CONFIRM;
1045		if (os_memcmp(sa, p2p->cfg->dev_addr, ETH_ALEN) < 0) {
1046			/*
1047			 * Peer has smaller address, so the GO Negotiation
1048			 * Response from us is expected to complete
1049			 * negotiation. Ignore a GO Negotiation Response from
1050			 * the peer if it happens to be received after this
1051			 * point due to a race condition in GO Negotiation
1052			 * Request transmission and processing.
1053			 */
1054			dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
1055		}
1056	} else
1057		p2p->pending_action_state =
1058			P2P_PENDING_GO_NEG_RESPONSE_FAILURE;
1059	if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr,
1060			    p2p->cfg->dev_addr,
1061			    wpabuf_head(resp), wpabuf_len(resp), 100) < 0) {
1062		p2p_dbg(p2p, "Failed to send Action frame");
1063	}
1064
1065	wpabuf_free(resp);
1066}
1067
1068
1069static struct wpabuf * p2p_build_go_neg_conf(struct p2p_data *p2p,
1070					     struct p2p_device *peer,
1071					     u8 dialog_token, u8 status,
1072					     const u8 *resp_chan, int go)
1073{
1074	struct wpabuf *buf;
1075	u8 *len;
1076	struct p2p_channels res;
1077	u8 group_capab;
1078	size_t extra = 0;
1079
1080	p2p_dbg(p2p, "Building GO Negotiation Confirm");
1081
1082#ifdef CONFIG_WIFI_DISPLAY
1083	if (p2p->wfd_ie_go_neg)
1084		extra = wpabuf_len(p2p->wfd_ie_go_neg);
1085#endif /* CONFIG_WIFI_DISPLAY */
1086
1087	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_CONF])
1088		extra += wpabuf_len(p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_CONF]);
1089
1090	buf = wpabuf_alloc(1000 + extra);
1091	if (buf == NULL)
1092		return NULL;
1093
1094	p2p_buf_add_public_action_hdr(buf, P2P_GO_NEG_CONF, dialog_token);
1095
1096	len = p2p_buf_add_ie_hdr(buf);
1097	p2p_buf_add_status(buf, status);
1098	group_capab = 0;
1099	if (peer->go_state == LOCAL_GO) {
1100		if (peer->flags & P2P_DEV_PREFER_PERSISTENT_GROUP) {
1101			group_capab |= P2P_GROUP_CAPAB_PERSISTENT_GROUP;
1102			if (peer->flags & P2P_DEV_PREFER_PERSISTENT_RECONN)
1103				group_capab |=
1104					P2P_GROUP_CAPAB_PERSISTENT_RECONN;
1105		}
1106		if (p2p->cross_connect)
1107			group_capab |= P2P_GROUP_CAPAB_CROSS_CONN;
1108		if (p2p->cfg->p2p_intra_bss)
1109			group_capab |= P2P_GROUP_CAPAB_INTRA_BSS_DIST;
1110	}
1111	p2p_buf_add_capability(buf, p2p->dev_capab &
1112			       ~P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY,
1113			       group_capab);
1114	if (go || resp_chan == NULL)
1115		p2p_buf_add_operating_channel(buf, p2p->cfg->country,
1116					      p2p->op_reg_class,
1117					      p2p->op_channel);
1118	else
1119		p2p_buf_add_operating_channel(buf, (const char *) resp_chan,
1120					      resp_chan[3], resp_chan[4]);
1121	p2p_channels_intersect(&p2p->channels, &peer->channels, &res);
1122	p2p_buf_add_channel_list(buf, p2p->cfg->country, &res);
1123	if (go) {
1124		p2p_buf_add_group_id(buf, p2p->cfg->dev_addr, p2p->ssid,
1125				     p2p->ssid_len);
1126	}
1127	p2p_buf_update_ie_hdr(buf, len);
1128
1129#ifdef CONFIG_WIFI_DISPLAY
1130	if (p2p->wfd_ie_go_neg)
1131		wpabuf_put_buf(buf, p2p->wfd_ie_go_neg);
1132#endif /* CONFIG_WIFI_DISPLAY */
1133
1134	if (p2p->vendor_elem && p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_CONF])
1135		wpabuf_put_buf(buf, p2p->vendor_elem[VENDOR_ELEM_P2P_GO_NEG_CONF]);
1136
1137	return buf;
1138}
1139
1140
1141void p2p_process_go_neg_resp(struct p2p_data *p2p, const u8 *sa,
1142			     const u8 *data, size_t len, int rx_freq)
1143{
1144	struct p2p_device *dev;
1145	int go = -1;
1146	struct p2p_message msg;
1147	u8 status = P2P_SC_SUCCESS;
1148	int freq;
1149
1150	p2p_dbg(p2p, "Received GO Negotiation Response from " MACSTR
1151		" (freq=%d)", MAC2STR(sa), rx_freq);
1152	dev = p2p_get_device(p2p, sa);
1153	if (dev == NULL || dev->wps_method == WPS_NOT_READY ||
1154	    dev != p2p->go_neg_peer) {
1155		p2p_dbg(p2p, "Not ready for GO negotiation with " MACSTR,
1156			MAC2STR(sa));
1157		return;
1158	}
1159
1160	if (p2p_parse(data, len, &msg))
1161		return;
1162
1163	if (!(dev->flags & P2P_DEV_WAIT_GO_NEG_RESPONSE)) {
1164		p2p_dbg(p2p, "Was not expecting GO Negotiation Response - ignore");
1165		p2p_parse_free(&msg);
1166		return;
1167	}
1168	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_RESPONSE;
1169
1170	if (msg.dialog_token != dev->dialog_token) {
1171		p2p_dbg(p2p, "Unexpected Dialog Token %u (expected %u)",
1172			msg.dialog_token, dev->dialog_token);
1173		p2p_parse_free(&msg);
1174		return;
1175	}
1176
1177	if (!msg.status) {
1178		p2p_dbg(p2p, "No Status attribute received");
1179		status = P2P_SC_FAIL_INVALID_PARAMS;
1180		goto fail;
1181	}
1182	if (*msg.status) {
1183		p2p_dbg(p2p, "GO Negotiation rejected: status %d", *msg.status);
1184		dev->go_neg_req_sent = 0;
1185		if (*msg.status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
1186			p2p_dbg(p2p, "Wait for the peer to become ready for GO Negotiation");
1187			dev->flags |= P2P_DEV_NOT_YET_READY;
1188			eloop_cancel_timeout(p2p_go_neg_wait_timeout, p2p,
1189					     NULL);
1190			eloop_register_timeout(120, 0, p2p_go_neg_wait_timeout,
1191					       p2p, NULL);
1192			if (p2p->state == P2P_CONNECT_LISTEN)
1193				p2p_set_state(p2p, P2P_WAIT_PEER_CONNECT);
1194			else
1195				p2p_set_state(p2p, P2P_WAIT_PEER_IDLE);
1196			p2p_set_timeout(p2p, 0, 0);
1197		} else {
1198			p2p_dbg(p2p, "Stop GO Negotiation attempt");
1199			p2p_go_neg_failed(p2p, *msg.status);
1200		}
1201		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
1202		p2p_parse_free(&msg);
1203		return;
1204	}
1205
1206	if (!msg.capability) {
1207		p2p_dbg(p2p, "Mandatory Capability attribute missing from GO Negotiation Response");
1208#ifdef CONFIG_P2P_STRICT
1209		status = P2P_SC_FAIL_INVALID_PARAMS;
1210		goto fail;
1211#endif /* CONFIG_P2P_STRICT */
1212	}
1213
1214	if (!msg.p2p_device_info) {
1215		p2p_dbg(p2p, "Mandatory P2P Device Info attribute missing from GO Negotiation Response");
1216#ifdef CONFIG_P2P_STRICT
1217		status = P2P_SC_FAIL_INVALID_PARAMS;
1218		goto fail;
1219#endif /* CONFIG_P2P_STRICT */
1220	}
1221
1222	if (!msg.intended_addr) {
1223		p2p_dbg(p2p, "No Intended P2P Interface Address attribute received");
1224		status = P2P_SC_FAIL_INVALID_PARAMS;
1225		goto fail;
1226	}
1227
1228	if (!msg.go_intent) {
1229		p2p_dbg(p2p, "No GO Intent attribute received");
1230		status = P2P_SC_FAIL_INVALID_PARAMS;
1231		goto fail;
1232	}
1233	if ((*msg.go_intent >> 1) > P2P_MAX_GO_INTENT) {
1234		p2p_dbg(p2p, "Invalid GO Intent value (%u) received",
1235			*msg.go_intent >> 1);
1236		status = P2P_SC_FAIL_INVALID_PARAMS;
1237		goto fail;
1238	}
1239
1240	go = p2p_go_det(p2p->go_intent, *msg.go_intent);
1241	if (go < 0) {
1242		p2p_dbg(p2p, "Incompatible GO Intent");
1243		status = P2P_SC_FAIL_INCOMPATIBLE_PARAMS;
1244		goto fail;
1245	}
1246
1247	if (!go && msg.group_id) {
1248		/* Store SSID for Provisioning step */
1249		p2p->ssid_len = msg.group_id_len - ETH_ALEN;
1250		os_memcpy(p2p->ssid, msg.group_id + ETH_ALEN, p2p->ssid_len);
1251	} else if (!go) {
1252		p2p_dbg(p2p, "Mandatory P2P Group ID attribute missing from GO Negotiation Response");
1253		p2p->ssid_len = 0;
1254		status = P2P_SC_FAIL_INVALID_PARAMS;
1255		goto fail;
1256	}
1257
1258	if (!msg.config_timeout) {
1259		p2p_dbg(p2p, "Mandatory Configuration Timeout attribute missing from GO Negotiation Response");
1260#ifdef CONFIG_P2P_STRICT
1261		status = P2P_SC_FAIL_INVALID_PARAMS;
1262		goto fail;
1263#endif /* CONFIG_P2P_STRICT */
1264	} else {
1265		dev->go_timeout = msg.config_timeout[0];
1266		dev->client_timeout = msg.config_timeout[1];
1267	}
1268
1269	if (msg.wfd_subelems) {
1270		wpabuf_free(dev->info.wfd_subelems);
1271		dev->info.wfd_subelems = wpabuf_dup(msg.wfd_subelems);
1272	}
1273
1274	if (!msg.operating_channel && !go) {
1275		/*
1276		 * Note: P2P Client may omit Operating Channel attribute to
1277		 * indicate it does not have a preference.
1278		 */
1279		p2p_dbg(p2p, "No Operating Channel attribute received");
1280		status = P2P_SC_FAIL_INVALID_PARAMS;
1281		goto fail;
1282	}
1283	if (!msg.channel_list) {
1284		p2p_dbg(p2p, "No Channel List attribute received");
1285		status = P2P_SC_FAIL_INVALID_PARAMS;
1286		goto fail;
1287	}
1288
1289	if (p2p_peer_channels(p2p, dev, msg.channel_list,
1290			      msg.channel_list_len) < 0) {
1291		p2p_dbg(p2p, "No common channels found");
1292		status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
1293		goto fail;
1294	}
1295
1296	if (msg.operating_channel) {
1297		dev->oper_freq = p2p_channel_to_freq(msg.operating_channel[3],
1298						     msg.operating_channel[4]);
1299		p2p_dbg(p2p, "Peer operating channel preference: %d MHz",
1300			dev->oper_freq);
1301	} else
1302		dev->oper_freq = 0;
1303
1304	switch (msg.dev_password_id) {
1305	case DEV_PW_REGISTRAR_SPECIFIED:
1306		p2p_dbg(p2p, "PIN from peer Display");
1307		if (dev->wps_method != WPS_PIN_KEYPAD) {
1308			p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
1309				p2p_wps_method_str(dev->wps_method));
1310			status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1311			goto fail;
1312		}
1313		break;
1314	case DEV_PW_USER_SPECIFIED:
1315		p2p_dbg(p2p, "Peer entered PIN on Keypad");
1316		if (dev->wps_method != WPS_PIN_DISPLAY) {
1317			p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
1318				p2p_wps_method_str(dev->wps_method));
1319			status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1320			goto fail;
1321		}
1322		break;
1323	case DEV_PW_PUSHBUTTON:
1324		p2p_dbg(p2p, "Peer using pushbutton");
1325		if (dev->wps_method != WPS_PBC) {
1326			p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
1327				p2p_wps_method_str(dev->wps_method));
1328			status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1329			goto fail;
1330		}
1331		break;
1332	case DEV_PW_P2PS_DEFAULT:
1333		p2p_dbg(p2p, "P2P: Peer using P2PS default pin");
1334		if (dev->wps_method != WPS_P2PS) {
1335			p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
1336				p2p_wps_method_str(dev->wps_method));
1337			status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1338			goto fail;
1339		}
1340		break;
1341	default:
1342		if (msg.dev_password_id &&
1343		    msg.dev_password_id == dev->oob_pw_id) {
1344			p2p_dbg(p2p, "Peer using NFC");
1345			if (dev->wps_method != WPS_NFC) {
1346				p2p_dbg(p2p, "We have wps_method=%s -> incompatible",
1347					p2p_wps_method_str(dev->wps_method));
1348				status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1349				goto fail;
1350			}
1351			break;
1352		}
1353		p2p_dbg(p2p, "Unsupported Device Password ID %d",
1354			msg.dev_password_id);
1355		status = P2P_SC_FAIL_INCOMPATIBLE_PROV_METHOD;
1356		goto fail;
1357	}
1358
1359	if (go && p2p_go_select_channel(p2p, dev, &status) < 0)
1360		goto fail;
1361
1362	/*
1363	 * Use the driver preferred frequency list extension if local device is
1364	 * GO.
1365	 */
1366	if (go)
1367		p2p_check_pref_chan(p2p, go, dev, &msg);
1368
1369	p2p_set_state(p2p, P2P_GO_NEG);
1370	p2p_clear_timeout(p2p);
1371
1372	p2p_dbg(p2p, "GO Negotiation with " MACSTR, MAC2STR(sa));
1373	os_memcpy(dev->intended_addr, msg.intended_addr, ETH_ALEN);
1374
1375fail:
1376	/* Store GO Negotiation Confirmation to allow retransmission */
1377	wpabuf_free(dev->go_neg_conf);
1378	dev->go_neg_conf = p2p_build_go_neg_conf(p2p, dev, msg.dialog_token,
1379						 status, msg.operating_channel,
1380						 go);
1381	p2p_parse_free(&msg);
1382	if (dev->go_neg_conf == NULL)
1383		return;
1384	p2p_dbg(p2p, "Sending GO Negotiation Confirm");
1385	if (status == P2P_SC_SUCCESS) {
1386		p2p->pending_action_state = P2P_PENDING_GO_NEG_CONFIRM;
1387		dev->go_state = go ? LOCAL_GO : REMOTE_GO;
1388	} else
1389		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
1390	if (rx_freq > 0)
1391		freq = rx_freq;
1392	else
1393		freq = dev->listen_freq;
1394
1395	dev->go_neg_conf_freq = freq;
1396	dev->go_neg_conf_sent = 0;
1397
1398	if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr, sa,
1399			    wpabuf_head(dev->go_neg_conf),
1400			    wpabuf_len(dev->go_neg_conf), 50) < 0) {
1401		p2p_dbg(p2p, "Failed to send Action frame");
1402		p2p_go_neg_failed(p2p, -1);
1403		p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
1404	} else
1405		dev->go_neg_conf_sent++;
1406	if (status != P2P_SC_SUCCESS) {
1407		p2p_dbg(p2p, "GO Negotiation failed");
1408		p2p_go_neg_failed(p2p, status);
1409	}
1410}
1411
1412
1413void p2p_process_go_neg_conf(struct p2p_data *p2p, const u8 *sa,
1414			     const u8 *data, size_t len)
1415{
1416	struct p2p_device *dev;
1417	struct p2p_message msg;
1418
1419	p2p_dbg(p2p, "Received GO Negotiation Confirm from " MACSTR,
1420		MAC2STR(sa));
1421	dev = p2p_get_device(p2p, sa);
1422	if (dev == NULL || dev->wps_method == WPS_NOT_READY ||
1423	    dev != p2p->go_neg_peer) {
1424		p2p_dbg(p2p, "Not ready for GO negotiation with " MACSTR,
1425			MAC2STR(sa));
1426		return;
1427	}
1428
1429	if (p2p->pending_action_state == P2P_PENDING_GO_NEG_RESPONSE) {
1430		p2p_dbg(p2p, "Stopped waiting for TX status on GO Negotiation Response since we already received Confirmation");
1431		p2p->pending_action_state = P2P_NO_PENDING_ACTION;
1432	}
1433
1434	if (p2p_parse(data, len, &msg))
1435		return;
1436
1437	if (!(dev->flags & P2P_DEV_WAIT_GO_NEG_CONFIRM)) {
1438		p2p_dbg(p2p, "Was not expecting GO Negotiation Confirm - ignore");
1439		p2p_parse_free(&msg);
1440		return;
1441	}
1442	dev->flags &= ~P2P_DEV_WAIT_GO_NEG_CONFIRM;
1443	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
1444
1445	if (msg.dialog_token != dev->dialog_token) {
1446		p2p_dbg(p2p, "Unexpected Dialog Token %u (expected %u)",
1447			msg.dialog_token, dev->dialog_token);
1448		p2p_parse_free(&msg);
1449		return;
1450	}
1451
1452	if (!msg.status) {
1453		p2p_dbg(p2p, "No Status attribute received");
1454		p2p_parse_free(&msg);
1455		return;
1456	}
1457	if (*msg.status) {
1458		p2p_dbg(p2p, "GO Negotiation rejected: status %d", *msg.status);
1459		p2p_go_neg_failed(p2p, *msg.status);
1460		p2p_parse_free(&msg);
1461		return;
1462	}
1463
1464	if (dev->go_state == REMOTE_GO && msg.group_id) {
1465		/* Store SSID for Provisioning step */
1466		p2p->ssid_len = msg.group_id_len - ETH_ALEN;
1467		os_memcpy(p2p->ssid, msg.group_id + ETH_ALEN, p2p->ssid_len);
1468	} else if (dev->go_state == REMOTE_GO) {
1469		p2p_dbg(p2p, "Mandatory P2P Group ID attribute missing from GO Negotiation Confirmation");
1470		p2p->ssid_len = 0;
1471		p2p_go_neg_failed(p2p, P2P_SC_FAIL_INVALID_PARAMS);
1472		p2p_parse_free(&msg);
1473		return;
1474	}
1475
1476	if (!msg.operating_channel) {
1477		p2p_dbg(p2p, "Mandatory Operating Channel attribute missing from GO Negotiation Confirmation");
1478#ifdef CONFIG_P2P_STRICT
1479		p2p_parse_free(&msg);
1480		return;
1481#endif /* CONFIG_P2P_STRICT */
1482	} else if (dev->go_state == REMOTE_GO) {
1483		int oper_freq = p2p_channel_to_freq(msg.operating_channel[3],
1484						    msg.operating_channel[4]);
1485		if (oper_freq != dev->oper_freq) {
1486			p2p_dbg(p2p, "Updated peer (GO) operating channel preference from %d MHz to %d MHz",
1487				dev->oper_freq, oper_freq);
1488			dev->oper_freq = oper_freq;
1489		}
1490	}
1491
1492	if (!msg.channel_list) {
1493		p2p_dbg(p2p, "Mandatory Operating Channel attribute missing from GO Negotiation Confirmation");
1494#ifdef CONFIG_P2P_STRICT
1495		p2p_parse_free(&msg);
1496		return;
1497#endif /* CONFIG_P2P_STRICT */
1498	}
1499
1500	p2p_parse_free(&msg);
1501
1502	if (dev->go_state == UNKNOWN_GO) {
1503		/*
1504		 * This should not happen since GO negotiation has already
1505		 * been completed.
1506		 */
1507		p2p_dbg(p2p, "Unexpected GO Neg state - do not know which end becomes GO");
1508		return;
1509	}
1510
1511	/*
1512	 * The peer could have missed our ctrl::ack frame for GO Negotiation
1513	 * Confirm and continue retransmitting the frame. To reduce the
1514	 * likelihood of the peer not getting successful TX status for the
1515	 * GO Negotiation Confirm frame, wait a short time here before starting
1516	 * the group so that we will remain on the current channel to
1517	 * acknowledge any possible retransmission from the peer.
1518	 */
1519	p2p_dbg(p2p, "20 ms wait on current channel before starting group");
1520	os_sleep(0, 20000);
1521
1522	p2p_go_complete(p2p, dev);
1523}
1524