Home | History | Annotate | Download | only in p2p
      1 /*
      2  * Wi-Fi Direct - P2P Invitation procedure
      3  * Copyright (c) 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 "p2p_i.h"
     14 #include "p2p.h"
     15 
     16 
     17 static struct wpabuf * p2p_build_invitation_req(struct p2p_data *p2p,
     18 						struct p2p_device *peer,
     19 						const u8 *go_dev_addr)
     20 {
     21 	struct wpabuf *buf;
     22 	u8 *len;
     23 	const u8 *dev_addr;
     24 	size_t extra = 0;
     25 
     26 #ifdef CONFIG_WIFI_DISPLAY
     27 	struct wpabuf *wfd_ie = p2p->wfd_ie_invitation;
     28 	if (wfd_ie && p2p->inv_role == P2P_INVITE_ROLE_ACTIVE_GO) {
     29 		size_t i;
     30 		for (i = 0; i < p2p->num_groups; i++) {
     31 			struct p2p_group *g = p2p->groups[i];
     32 			struct wpabuf *ie;
     33 			if (os_memcmp(p2p_group_get_interface_addr(g),
     34 				      p2p->inv_bssid, ETH_ALEN) != 0)
     35 				continue;
     36 			ie = p2p_group_get_wfd_ie(g);
     37 			if (ie) {
     38 				wfd_ie = ie;
     39 				break;
     40 			}
     41 		}
     42 	}
     43 	if (wfd_ie)
     44 		extra = wpabuf_len(wfd_ie);
     45 #endif /* CONFIG_WIFI_DISPLAY */
     46 
     47 	buf = wpabuf_alloc(1000 + extra);
     48 	if (buf == NULL)
     49 		return NULL;
     50 
     51 	peer->dialog_token++;
     52 	if (peer->dialog_token == 0)
     53 		peer->dialog_token = 1;
     54 	p2p_buf_add_public_action_hdr(buf, P2P_INVITATION_REQ,
     55 				      peer->dialog_token);
     56 
     57 	len = p2p_buf_add_ie_hdr(buf);
     58 	if (p2p->inv_role == P2P_INVITE_ROLE_ACTIVE_GO || !p2p->inv_persistent)
     59 		p2p_buf_add_config_timeout(buf, 0, 0);
     60 	else
     61 		p2p_buf_add_config_timeout(buf, p2p->go_timeout,
     62 					   p2p->client_timeout);
     63 	p2p_buf_add_invitation_flags(buf, p2p->inv_persistent ?
     64 				     P2P_INVITATION_FLAGS_TYPE : 0);
     65 	if (p2p->inv_role != P2P_INVITE_ROLE_CLIENT ||
     66 	    !(peer->flags & P2P_DEV_NO_PREF_CHAN))
     67 		p2p_buf_add_operating_channel(buf, p2p->cfg->country,
     68 					      p2p->op_reg_class,
     69 					      p2p->op_channel);
     70 	if (p2p->inv_bssid_set)
     71 		p2p_buf_add_group_bssid(buf, p2p->inv_bssid);
     72 	p2p_buf_add_channel_list(buf, p2p->cfg->country, &p2p->channels);
     73 	if (go_dev_addr)
     74 		dev_addr = go_dev_addr;
     75 	else if (p2p->inv_role == P2P_INVITE_ROLE_CLIENT)
     76 		dev_addr = peer->info.p2p_device_addr;
     77 	else
     78 		dev_addr = p2p->cfg->dev_addr;
     79 	p2p_buf_add_group_id(buf, dev_addr, p2p->inv_ssid, p2p->inv_ssid_len);
     80 	p2p_buf_add_device_info(buf, p2p, peer);
     81 	p2p_buf_update_ie_hdr(buf, len);
     82 
     83 #ifdef CONFIG_WIFI_DISPLAY
     84 	if (wfd_ie)
     85 		wpabuf_put_buf(buf, wfd_ie);
     86 #endif /* CONFIG_WIFI_DISPLAY */
     87 
     88 	return buf;
     89 }
     90 
     91 
     92 static struct wpabuf * p2p_build_invitation_resp(struct p2p_data *p2p,
     93 						 struct p2p_device *peer,
     94 						 u8 dialog_token, u8 status,
     95 						 const u8 *group_bssid,
     96 						 u8 reg_class, u8 channel,
     97 						 struct p2p_channels *channels)
     98 {
     99 	struct wpabuf *buf;
    100 	u8 *len;
    101 	size_t extra = 0;
    102 
    103 #ifdef CONFIG_WIFI_DISPLAY
    104 	struct wpabuf *wfd_ie = p2p->wfd_ie_invitation;
    105 	if (wfd_ie && group_bssid) {
    106 		size_t i;
    107 		for (i = 0; i < p2p->num_groups; i++) {
    108 			struct p2p_group *g = p2p->groups[i];
    109 			struct wpabuf *ie;
    110 			if (os_memcmp(p2p_group_get_interface_addr(g),
    111 				      group_bssid, ETH_ALEN) != 0)
    112 				continue;
    113 			ie = p2p_group_get_wfd_ie(g);
    114 			if (ie) {
    115 				wfd_ie = ie;
    116 				break;
    117 			}
    118 		}
    119 	}
    120 	if (wfd_ie)
    121 		extra = wpabuf_len(wfd_ie);
    122 #endif /* CONFIG_WIFI_DISPLAY */
    123 
    124 	buf = wpabuf_alloc(1000 + extra);
    125 	if (buf == NULL)
    126 		return NULL;
    127 
    128 	p2p_buf_add_public_action_hdr(buf, P2P_INVITATION_RESP,
    129 				      dialog_token);
    130 
    131 	len = p2p_buf_add_ie_hdr(buf);
    132 	p2p_buf_add_status(buf, status);
    133 	p2p_buf_add_config_timeout(buf, 0, 0); /* FIX */
    134 	if (reg_class && channel)
    135 		p2p_buf_add_operating_channel(buf, p2p->cfg->country,
    136 					      reg_class, channel);
    137 	if (group_bssid)
    138 		p2p_buf_add_group_bssid(buf, group_bssid);
    139 	if (channels)
    140 		p2p_buf_add_channel_list(buf, p2p->cfg->country, channels);
    141 	p2p_buf_update_ie_hdr(buf, len);
    142 
    143 #ifdef CONFIG_WIFI_DISPLAY
    144 	if (wfd_ie)
    145 		wpabuf_put_buf(buf, wfd_ie);
    146 #endif /* CONFIG_WIFI_DISPLAY */
    147 
    148 	return buf;
    149 }
    150 
    151 
    152 void p2p_process_invitation_req(struct p2p_data *p2p, const u8 *sa,
    153 				const u8 *data, size_t len, int rx_freq)
    154 {
    155 	struct p2p_device *dev;
    156 	struct p2p_message msg;
    157 	struct wpabuf *resp = NULL;
    158 	u8 status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
    159 	int freq;
    160 	int go = 0;
    161 	u8 group_bssid[ETH_ALEN], *bssid;
    162 	int op_freq = 0;
    163 	u8 reg_class = 0, channel = 0;
    164 	struct p2p_channels intersection, *channels = NULL;
    165 	int persistent;
    166 
    167 	os_memset(group_bssid, 0, sizeof(group_bssid));
    168 
    169 	p2p_dbg(p2p, "Received Invitation Request from " MACSTR " (freq=%d)",
    170 		MAC2STR(sa), rx_freq);
    171 
    172 	if (p2p_parse(data, len, &msg))
    173 		return;
    174 
    175 	dev = p2p_get_device(p2p, sa);
    176 	if (dev == NULL || (dev->flags & P2P_DEV_PROBE_REQ_ONLY)) {
    177 		p2p_dbg(p2p, "Invitation Request from unknown peer " MACSTR,
    178 			MAC2STR(sa));
    179 
    180 		if (p2p_add_device(p2p, sa, rx_freq, NULL, 0, data + 1, len - 1,
    181 				   0)) {
    182 			p2p_dbg(p2p, "Invitation Request add device failed "
    183 				MACSTR, MAC2STR(sa));
    184 			status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
    185 			goto fail;
    186 		}
    187 
    188 		dev = p2p_get_device(p2p, sa);
    189 		if (dev == NULL) {
    190 			p2p_dbg(p2p, "Reject Invitation Request from unknown peer "
    191 				MACSTR, MAC2STR(sa));
    192 			status = P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
    193 			goto fail;
    194 		}
    195 	}
    196 
    197 	if (!msg.group_id || !msg.channel_list) {
    198 		p2p_dbg(p2p, "Mandatory attribute missing in Invitation Request from "
    199 			MACSTR, MAC2STR(sa));
    200 		status = P2P_SC_FAIL_INVALID_PARAMS;
    201 		goto fail;
    202 	}
    203 
    204 	if (msg.invitation_flags)
    205 		persistent = *msg.invitation_flags & P2P_INVITATION_FLAGS_TYPE;
    206 	else {
    207 		/* Invitation Flags is a mandatory attribute starting from P2P
    208 		 * spec 1.06. As a backwards compatibility mechanism, assume
    209 		 * the request was for a persistent group if the attribute is
    210 		 * missing.
    211 		 */
    212 		p2p_dbg(p2p, "Mandatory Invitation Flags attribute missing from Invitation Request");
    213 		persistent = 1;
    214 	}
    215 
    216 	if (p2p_peer_channels_check(p2p, &p2p->cfg->channels, dev,
    217 				    msg.channel_list, msg.channel_list_len) <
    218 	    0) {
    219 		p2p_dbg(p2p, "No common channels found");
    220 		status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
    221 		goto fail;
    222 	}
    223 
    224 	p2p_channels_intersect(&p2p->cfg->channels, &dev->channels,
    225 			       &intersection);
    226 
    227 	if (p2p->cfg->invitation_process) {
    228 		status = p2p->cfg->invitation_process(
    229 			p2p->cfg->cb_ctx, sa, msg.group_bssid, msg.group_id,
    230 			msg.group_id + ETH_ALEN, msg.group_id_len - ETH_ALEN,
    231 			&go, group_bssid, &op_freq, persistent, &intersection);
    232 	}
    233 
    234 	if (op_freq) {
    235 		p2p_dbg(p2p, "Invitation processing forced frequency %d MHz",
    236 			op_freq);
    237 		if (p2p_freq_to_channel(op_freq, &reg_class, &channel) < 0) {
    238 			p2p_dbg(p2p, "Unknown forced freq %d MHz from invitation_process()",
    239 				op_freq);
    240 			status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
    241 			goto fail;
    242 		}
    243 
    244 		if (!p2p_channels_includes(&intersection, reg_class, channel))
    245 		{
    246 			p2p_dbg(p2p, "forced freq %d MHz not in the supported channels interaction",
    247 				op_freq);
    248 			status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
    249 			goto fail;
    250 		}
    251 
    252 		if (status == P2P_SC_SUCCESS)
    253 			channels = &intersection;
    254 	} else {
    255 		p2p_dbg(p2p, "No forced channel from invitation processing - figure out best one to use");
    256 
    257 		/* Default to own configuration as a starting point */
    258 		p2p->op_reg_class = p2p->cfg->op_reg_class;
    259 		p2p->op_channel = p2p->cfg->op_channel;
    260 		p2p_dbg(p2p, "Own default op_class %d channel %d",
    261 			p2p->op_reg_class, p2p->op_channel);
    262 
    263 		/* Use peer preference if specified and compatible */
    264 		if (msg.operating_channel) {
    265 			int req_freq;
    266 			req_freq = p2p_channel_to_freq(
    267 				msg.operating_channel[3],
    268 				msg.operating_channel[4]);
    269 			p2p_dbg(p2p, "Peer operating channel preference: %d MHz",
    270 				req_freq);
    271 			if (req_freq > 0 &&
    272 			    p2p_channels_includes(&intersection,
    273 						  msg.operating_channel[3],
    274 						  msg.operating_channel[4])) {
    275 				p2p->op_reg_class = msg.operating_channel[3];
    276 				p2p->op_channel = msg.operating_channel[4];
    277 				p2p_dbg(p2p, "Use peer preference op_class %d channel %d",
    278 					p2p->op_reg_class, p2p->op_channel);
    279 			} else {
    280 				p2p_dbg(p2p, "Cannot use peer channel preference");
    281 			}
    282 		}
    283 
    284 		if (!p2p_channels_includes(&intersection, p2p->op_reg_class,
    285 					   p2p->op_channel)) {
    286 			p2p_dbg(p2p, "Initially selected channel (op_class %d channel %d) not in channel intersection - try to reselect",
    287 				p2p->op_reg_class, p2p->op_channel);
    288 			p2p_reselect_channel(p2p, &intersection);
    289 			p2p_dbg(p2p, "Re-selection result: op_class %d channel %d",
    290 				p2p->op_reg_class, p2p->op_channel);
    291 			if (!p2p_channels_includes(&intersection,
    292 						   p2p->op_reg_class,
    293 						   p2p->op_channel)) {
    294 				p2p_dbg(p2p, "Peer does not support selected operating channel (reg_class=%u channel=%u)",
    295 					p2p->op_reg_class, p2p->op_channel);
    296 				status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
    297 				goto fail;
    298 			}
    299 		} else if (!(dev->flags & P2P_DEV_FORCE_FREQ) &&
    300 			   !p2p->cfg->cfg_op_channel) {
    301 			p2p_dbg(p2p, "Try to reselect channel selection with peer information received; previously selected op_class %u channel %u",
    302 				p2p->op_reg_class, p2p->op_channel);
    303 			p2p_reselect_channel(p2p, &intersection);
    304 		}
    305 
    306 		op_freq = p2p_channel_to_freq(p2p->op_reg_class,
    307 					      p2p->op_channel);
    308 		if (op_freq < 0) {
    309 			p2p_dbg(p2p, "Unknown operational channel (country=%c%c reg_class=%u channel=%u)",
    310 				p2p->cfg->country[0], p2p->cfg->country[1],
    311 				p2p->op_reg_class, p2p->op_channel);
    312 			status = P2P_SC_FAIL_NO_COMMON_CHANNELS;
    313 			goto fail;
    314 		}
    315 		p2p_dbg(p2p, "Selected operating channel - %d MHz", op_freq);
    316 
    317 		if (status == P2P_SC_SUCCESS) {
    318 			reg_class = p2p->op_reg_class;
    319 			channel = p2p->op_channel;
    320 			channels = &intersection;
    321 		}
    322 	}
    323 
    324 fail:
    325 	if (go && status == P2P_SC_SUCCESS && !is_zero_ether_addr(group_bssid))
    326 		bssid = group_bssid;
    327 	else
    328 		bssid = NULL;
    329 	resp = p2p_build_invitation_resp(p2p, dev, msg.dialog_token, status,
    330 					 bssid, reg_class, channel, channels);
    331 
    332 	if (resp == NULL)
    333 		goto out;
    334 
    335 	if (rx_freq > 0)
    336 		freq = rx_freq;
    337 	else
    338 		freq = p2p_channel_to_freq(p2p->cfg->reg_class,
    339 					   p2p->cfg->channel);
    340 	if (freq < 0) {
    341 		p2p_dbg(p2p, "Unknown regulatory class/channel");
    342 		goto out;
    343 	}
    344 
    345 	/*
    346 	 * Store copy of invitation data to be used when processing TX status
    347 	 * callback for the Acton frame.
    348 	 */
    349 	os_memcpy(p2p->inv_sa, sa, ETH_ALEN);
    350 	if (msg.group_bssid) {
    351 		os_memcpy(p2p->inv_group_bssid, msg.group_bssid, ETH_ALEN);
    352 		p2p->inv_group_bssid_ptr = p2p->inv_group_bssid;
    353 	} else
    354 		p2p->inv_group_bssid_ptr = NULL;
    355 	if (msg.group_id_len - ETH_ALEN <= 32) {
    356 		os_memcpy(p2p->inv_ssid, msg.group_id + ETH_ALEN,
    357 			  msg.group_id_len - ETH_ALEN);
    358 		p2p->inv_ssid_len = msg.group_id_len - ETH_ALEN;
    359 	}
    360 	os_memcpy(p2p->inv_go_dev_addr, msg.group_id, ETH_ALEN);
    361 	p2p->inv_status = status;
    362 	p2p->inv_op_freq = op_freq;
    363 
    364 	p2p->pending_action_state = P2P_PENDING_INVITATION_RESPONSE;
    365 	if (p2p_send_action(p2p, freq, sa, p2p->cfg->dev_addr,
    366 			    p2p->cfg->dev_addr,
    367 			    wpabuf_head(resp), wpabuf_len(resp), 200) < 0) {
    368 		p2p_dbg(p2p, "Failed to send Action frame");
    369 	}
    370 
    371 out:
    372 	wpabuf_free(resp);
    373 	p2p_parse_free(&msg);
    374 }
    375 
    376 
    377 void p2p_process_invitation_resp(struct p2p_data *p2p, const u8 *sa,
    378 				 const u8 *data, size_t len)
    379 {
    380 	struct p2p_device *dev;
    381 	struct p2p_message msg;
    382 	struct p2p_channels intersection, *channels = NULL;
    383 
    384 	p2p_dbg(p2p, "Received Invitation Response from " MACSTR,
    385 		MAC2STR(sa));
    386 
    387 	dev = p2p_get_device(p2p, sa);
    388 	if (dev == NULL) {
    389 		p2p_dbg(p2p, "Ignore Invitation Response from unknown peer "
    390 			MACSTR, MAC2STR(sa));
    391 		return;
    392 	}
    393 
    394 	if (dev != p2p->invite_peer) {
    395 		p2p_dbg(p2p, "Ignore unexpected Invitation Response from peer "
    396 			MACSTR, MAC2STR(sa));
    397 		return;
    398 	}
    399 
    400 	if (p2p_parse(data, len, &msg))
    401 		return;
    402 
    403 	if (!msg.status) {
    404 		p2p_dbg(p2p, "Mandatory Status attribute missing in Invitation Response from "
    405 			MACSTR, MAC2STR(sa));
    406 		p2p_parse_free(&msg);
    407 		return;
    408 	}
    409 
    410 	if (!msg.channel_list) {
    411 		p2p_dbg(p2p, "Mandatory Channel List attribute missing in Invitation Response from "
    412 			MACSTR, MAC2STR(sa));
    413 #ifdef CONFIG_P2P_STRICT
    414 		p2p_parse_free(&msg);
    415 		return;
    416 #endif /* CONFIG_P2P_STRICT */
    417 		/* Try to survive without peer channel list */
    418 		channels = &p2p->channels;
    419 	} else if (p2p_peer_channels_check(p2p, &p2p->channels, dev,
    420 					   msg.channel_list,
    421 					   msg.channel_list_len) < 0) {
    422 		p2p_dbg(p2p, "No common channels found");
    423 		p2p_parse_free(&msg);
    424 		return;
    425 	} else {
    426 		p2p_channels_intersect(&p2p->channels, &dev->channels,
    427 				       &intersection);
    428 		channels = &intersection;
    429 	}
    430 
    431 	if (p2p->cfg->invitation_result)
    432 		p2p->cfg->invitation_result(p2p->cfg->cb_ctx, *msg.status,
    433 					    msg.group_bssid, channels, sa);
    434 
    435 	p2p_parse_free(&msg);
    436 
    437 	p2p_clear_timeout(p2p);
    438 	p2p_set_state(p2p, P2P_IDLE);
    439 	p2p->invite_peer = NULL;
    440 }
    441 
    442 
    443 int p2p_invite_send(struct p2p_data *p2p, struct p2p_device *dev,
    444 		    const u8 *go_dev_addr)
    445 {
    446 	struct wpabuf *req;
    447 	int freq;
    448 
    449 	freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
    450 	if (freq <= 0) {
    451 		p2p_dbg(p2p, "No Listen/Operating frequency known for the peer "
    452 			MACSTR " to send Invitation Request",
    453 			MAC2STR(dev->info.p2p_device_addr));
    454 		return -1;
    455 	}
    456 
    457 	req = p2p_build_invitation_req(p2p, dev, go_dev_addr);
    458 	if (req == NULL)
    459 		return -1;
    460 	if (p2p->state != P2P_IDLE)
    461 		p2p_stop_listen_for_freq(p2p, freq);
    462 	p2p_dbg(p2p, "Sending Invitation Request");
    463 	p2p_set_state(p2p, P2P_INVITE);
    464 	p2p->pending_action_state = P2P_PENDING_INVITATION_REQUEST;
    465 	p2p->invite_peer = dev;
    466 	dev->invitation_reqs++;
    467 	if (p2p_send_action(p2p, freq, dev->info.p2p_device_addr,
    468 			    p2p->cfg->dev_addr, dev->info.p2p_device_addr,
    469 			    wpabuf_head(req), wpabuf_len(req), 200) < 0) {
    470 		p2p_dbg(p2p, "Failed to send Action frame");
    471 		/* Use P2P find to recover and retry */
    472 		p2p_set_timeout(p2p, 0, 0);
    473 	}
    474 
    475 	wpabuf_free(req);
    476 
    477 	return 0;
    478 }
    479 
    480 
    481 void p2p_invitation_req_cb(struct p2p_data *p2p, int success)
    482 {
    483 	p2p_dbg(p2p, "Invitation Request TX callback: success=%d", success);
    484 
    485 	if (p2p->invite_peer == NULL) {
    486 		p2p_dbg(p2p, "No pending Invite");
    487 		return;
    488 	}
    489 
    490 	/*
    491 	 * Use P2P find, if needed, to find the other device from its listen
    492 	 * channel.
    493 	 */
    494 	p2p_set_state(p2p, P2P_INVITE);
    495 	p2p_set_timeout(p2p, 0, success ? 350000 : 100000);
    496 }
    497 
    498 
    499 void p2p_invitation_resp_cb(struct p2p_data *p2p, int success)
    500 {
    501 	p2p_dbg(p2p, "Invitation Response TX callback: success=%d", success);
    502 	p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
    503 
    504 	if (!success)
    505 		p2p_dbg(p2p, "Assume Invitation Response was actually received by the peer even though Ack was not reported");
    506 
    507 	if (p2p->cfg->invitation_received) {
    508 		p2p->cfg->invitation_received(p2p->cfg->cb_ctx,
    509 					      p2p->inv_sa,
    510 					      p2p->inv_group_bssid_ptr,
    511 					      p2p->inv_ssid, p2p->inv_ssid_len,
    512 					      p2p->inv_go_dev_addr,
    513 					      p2p->inv_status,
    514 					      p2p->inv_op_freq);
    515 	}
    516 }
    517 
    518 
    519 int p2p_invite(struct p2p_data *p2p, const u8 *peer, enum p2p_invite_role role,
    520 	       const u8 *bssid, const u8 *ssid, size_t ssid_len,
    521 	       unsigned int force_freq, const u8 *go_dev_addr,
    522 	       int persistent_group, unsigned int pref_freq)
    523 {
    524 	struct p2p_device *dev;
    525 
    526 	p2p_dbg(p2p, "Request to invite peer " MACSTR " role=%d persistent=%d "
    527 		"force_freq=%u",
    528 		MAC2STR(peer), role, persistent_group, force_freq);
    529 	if (bssid)
    530 		p2p_dbg(p2p, "Invitation for BSSID " MACSTR, MAC2STR(bssid));
    531 	if (go_dev_addr) {
    532 		p2p_dbg(p2p, "Invitation for GO Device Address " MACSTR,
    533 			MAC2STR(go_dev_addr));
    534 		os_memcpy(p2p->invite_go_dev_addr_buf, go_dev_addr, ETH_ALEN);
    535 		p2p->invite_go_dev_addr = p2p->invite_go_dev_addr_buf;
    536 	} else
    537 		p2p->invite_go_dev_addr = NULL;
    538 	wpa_hexdump_ascii(MSG_DEBUG, "Invitation for SSID",
    539 			  ssid, ssid_len);
    540 
    541 	dev = p2p_get_device(p2p, peer);
    542 	if (dev == NULL || (dev->listen_freq <= 0 && dev->oper_freq <= 0)) {
    543 		p2p_dbg(p2p, "Cannot invite unknown P2P Device " MACSTR,
    544 			MAC2STR(peer));
    545 		return -1;
    546 	}
    547 
    548 	if (p2p_prepare_channel(p2p, dev, force_freq, pref_freq) < 0)
    549 		return -1;
    550 
    551 	if (persistent_group && role == P2P_INVITE_ROLE_CLIENT && !force_freq &&
    552 	    !pref_freq)
    553 		dev->flags |= P2P_DEV_NO_PREF_CHAN;
    554 	else
    555 		dev->flags &= ~P2P_DEV_NO_PREF_CHAN;
    556 
    557 	if (dev->flags & P2P_DEV_GROUP_CLIENT_ONLY) {
    558 		if (!(dev->info.dev_capab &
    559 		      P2P_DEV_CAPAB_CLIENT_DISCOVERABILITY)) {
    560 			p2p_dbg(p2p, "Cannot invite a P2P Device " MACSTR
    561 				" that is in a group and is not discoverable",
    562 				MAC2STR(peer));
    563 		}
    564 		/* TODO: use device discoverability request through GO */
    565 	}
    566 
    567 	dev->invitation_reqs = 0;
    568 
    569 	if (p2p->state != P2P_IDLE)
    570 		p2p_stop_find(p2p);
    571 
    572 	p2p->inv_role = role;
    573 	p2p->inv_bssid_set = bssid != NULL;
    574 	if (bssid)
    575 		os_memcpy(p2p->inv_bssid, bssid, ETH_ALEN);
    576 	os_memcpy(p2p->inv_ssid, ssid, ssid_len);
    577 	p2p->inv_ssid_len = ssid_len;
    578 	p2p->inv_persistent = persistent_group;
    579 	return p2p_invite_send(p2p, dev, go_dev_addr);
    580 }
    581