Home | History | Annotate | Download | only in wpa_supplicant
      1 /*
      2  * wpa_supplicant - P2P
      3  * Copyright (c) 2009-2010, Atheros Communications
      4  *
      5  * This software may be distributed under the terms of the BSD license.
      6  * See README for more details.
      7  */
      8 
      9 #include "includes.h"
     10 
     11 #include "common.h"
     12 #include "eloop.h"
     13 #include "common/ieee802_11_common.h"
     14 #include "common/ieee802_11_defs.h"
     15 #include "common/wpa_ctrl.h"
     16 #include "wps/wps_i.h"
     17 #include "p2p/p2p.h"
     18 #include "ap/hostapd.h"
     19 #include "ap/ap_config.h"
     20 #include "ap/p2p_hostapd.h"
     21 #include "eapol_supp/eapol_supp_sm.h"
     22 #include "rsn_supp/wpa.h"
     23 #include "wpa_supplicant_i.h"
     24 #include "driver_i.h"
     25 #include "ap.h"
     26 #include "config_ssid.h"
     27 #include "config.h"
     28 #include "notify.h"
     29 #include "scan.h"
     30 #include "bss.h"
     31 #include "offchannel.h"
     32 #include "wps_supplicant.h"
     33 #include "p2p_supplicant.h"
     34 
     35 
     36 /*
     37  * How many times to try to scan to find the GO before giving up on join
     38  * request.
     39  */
     40 #define P2P_MAX_JOIN_SCAN_ATTEMPTS 10
     41 
     42 #define P2P_AUTO_PD_SCAN_ATTEMPTS 5
     43 
     44 #ifndef P2P_MAX_CLIENT_IDLE
     45 /*
     46  * How many seconds to try to reconnect to the GO when connection in P2P client
     47  * role has been lost.
     48  */
     49 #ifdef ANDROID_P2P
     50 #define P2P_MAX_CLIENT_IDLE 20
     51 #else
     52 #define P2P_MAX_CLIENT_IDLE 10
     53 #endif /* ANDROID_P2P */
     54 #endif /* P2P_MAX_CLIENT_IDLE */
     55 
     56 #ifndef P2P_MAX_INITIAL_CONN_WAIT
     57 /*
     58  * How many seconds to wait for initial 4-way handshake to get completed after
     59  * WPS provisioning step.
     60  */
     61 #define P2P_MAX_INITIAL_CONN_WAIT 10
     62 #endif /* P2P_MAX_INITIAL_CONN_WAIT */
     63 
     64 #ifndef P2P_CONCURRENT_SEARCH_DELAY
     65 #define P2P_CONCURRENT_SEARCH_DELAY 500
     66 #endif /* P2P_CONCURRENT_SEARCH_DELAY */
     67 
     68 enum p2p_group_removal_reason {
     69 	P2P_GROUP_REMOVAL_UNKNOWN,
     70 	P2P_GROUP_REMOVAL_SILENT,
     71 	P2P_GROUP_REMOVAL_FORMATION_FAILED,
     72 	P2P_GROUP_REMOVAL_REQUESTED,
     73 	P2P_GROUP_REMOVAL_IDLE_TIMEOUT,
     74 	P2P_GROUP_REMOVAL_UNAVAILABLE,
     75 	P2P_GROUP_REMOVAL_GO_ENDING_SESSION,
     76 #ifdef ANDROID_P2P
     77 	P2P_GROUP_REMOVAL_FREQ_CONFLICT
     78 #endif
     79 };
     80 
     81 
     82 static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
     83 static struct wpa_supplicant *
     84 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
     85 			 int go);
     86 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s);
     87 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq);
     88 static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx);
     89 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
     90 			 const u8 *dev_addr, enum p2p_wps_method wps_method,
     91 			 int auto_join);
     92 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s);
     93 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
     94 static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx);
     95 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
     96 static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
     97 					     void *timeout_ctx);
     98 static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
     99 					int group_added);
    100 static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s);
    101 
    102 
    103 static void wpas_p2p_set_own_freq_preference(struct wpa_supplicant *wpa_s,
    104 					     int freq)
    105 {
    106 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    107 		return;
    108 	if (freq > 0 &&
    109 	    (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) &&
    110 	    wpa_s->parent->conf->p2p_ignore_shared_freq)
    111 		freq = 0;
    112 	p2p_set_own_freq_preference(wpa_s->global->p2p, freq);
    113 }
    114 
    115 
    116 static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
    117 				      struct wpa_scan_results *scan_res)
    118 {
    119 	size_t i;
    120 
    121 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    122 		return;
    123 
    124 	wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS)",
    125 		   (int) scan_res->num);
    126 
    127 	for (i = 0; i < scan_res->num; i++) {
    128 		struct wpa_scan_res *bss = scan_res->res[i];
    129 		struct os_time time_tmp_age, entry_ts;
    130 		time_tmp_age.sec = bss->age / 1000;
    131 		time_tmp_age.usec = (bss->age % 1000) * 1000;
    132 		os_time_sub(&scan_res->fetch_time, &time_tmp_age, &entry_ts);
    133 		if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
    134 					 bss->freq, &entry_ts, bss->level,
    135 					 (const u8 *) (bss + 1),
    136 					 bss->ie_len) > 0)
    137 			break;
    138 	}
    139 
    140 	p2p_scan_res_handled(wpa_s->global->p2p);
    141 }
    142 
    143 
    144 static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
    145 			 unsigned int num_req_dev_types,
    146 			 const u8 *req_dev_types, const u8 *dev_id, u16 pw_id)
    147 {
    148 	struct wpa_supplicant *wpa_s = ctx;
    149 	struct wpa_supplicant *ifs;
    150 	struct wpa_driver_scan_params params;
    151 	int ret;
    152 	struct wpabuf *wps_ie, *ies;
    153 	int social_channels[] = { 2412, 2437, 2462, 0, 0 };
    154 	size_t ielen;
    155 
    156 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    157 		return -1;
    158 
    159 	for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
    160 		if (ifs->sta_scan_pending &&
    161 		    (wpas_scan_scheduled(ifs) || ifs->scanning) &&
    162 		    wpas_p2p_in_progress(wpa_s) == 2) {
    163 			wpa_printf(MSG_DEBUG, "Delaying P2P scan to allow "
    164 				   "pending station mode scan to be "
    165 				   "completed on interface %s", ifs->ifname);
    166 			wpa_s->global->p2p_cb_on_scan_complete = 1;
    167 			wpa_supplicant_req_scan(ifs, 0, 0);
    168 			return 1;
    169 		}
    170 	}
    171 
    172 	os_memset(&params, 0, sizeof(params));
    173 
    174 	/* P2P Wildcard SSID */
    175 	params.num_ssids = 1;
    176 	params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
    177 	params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
    178 
    179 	wpa_s->wps->dev.p2p = 1;
    180 	wps_ie = wps_build_probe_req_ie(pw_id, &wpa_s->wps->dev,
    181 					wpa_s->wps->uuid, WPS_REQ_ENROLLEE,
    182 					num_req_dev_types, req_dev_types);
    183 	if (wps_ie == NULL)
    184 		return -1;
    185 
    186 	ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
    187 	ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
    188 	if (ies == NULL) {
    189 		wpabuf_free(wps_ie);
    190 		return -1;
    191 	}
    192 	wpabuf_put_buf(ies, wps_ie);
    193 	wpabuf_free(wps_ie);
    194 
    195 	p2p_scan_ie(wpa_s->global->p2p, ies, dev_id);
    196 
    197 	params.p2p_probe = 1;
    198 	params.extra_ies = wpabuf_head(ies);
    199 	params.extra_ies_len = wpabuf_len(ies);
    200 
    201 	switch (type) {
    202 	case P2P_SCAN_SOCIAL:
    203 		params.freqs = social_channels;
    204 		break;
    205 	case P2P_SCAN_FULL:
    206 		break;
    207 	case P2P_SCAN_SPECIFIC:
    208 		social_channels[0] = freq;
    209 		social_channels[1] = 0;
    210 		params.freqs = social_channels;
    211 		break;
    212 	case P2P_SCAN_SOCIAL_PLUS_ONE:
    213 		social_channels[3] = freq;
    214 		params.freqs = social_channels;
    215 		break;
    216 	}
    217 
    218 	ret = wpa_drv_scan(wpa_s, &params);
    219 
    220 	wpabuf_free(ies);
    221 
    222 	if (ret) {
    223 		for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
    224 			if (ifs->scanning ||
    225 			    ifs->scan_res_handler == wpas_p2p_scan_res_handler) {
    226 				wpa_s->global->p2p_cb_on_scan_complete = 1;
    227 				ret = 1;
    228 				break;
    229 			}
    230 		}
    231 	} else {
    232 		os_get_time(&wpa_s->scan_trigger_time);
    233 		wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
    234 	}
    235 
    236 	return ret;
    237 }
    238 
    239 
    240 static enum wpa_driver_if_type wpas_p2p_if_type(int p2p_group_interface)
    241 {
    242 	switch (p2p_group_interface) {
    243 	case P2P_GROUP_INTERFACE_PENDING:
    244 		return WPA_IF_P2P_GROUP;
    245 	case P2P_GROUP_INTERFACE_GO:
    246 		return WPA_IF_P2P_GO;
    247 	case P2P_GROUP_INTERFACE_CLIENT:
    248 		return WPA_IF_P2P_CLIENT;
    249 	}
    250 
    251 	return WPA_IF_P2P_GROUP;
    252 }
    253 
    254 
    255 static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s,
    256 						  const u8 *ssid,
    257 						  size_t ssid_len, int *go)
    258 {
    259 	struct wpa_ssid *s;
    260 
    261 	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    262 		for (s = wpa_s->conf->ssid; s; s = s->next) {
    263 			if (s->disabled != 0 || !s->p2p_group ||
    264 			    s->ssid_len != ssid_len ||
    265 			    os_memcmp(ssid, s->ssid, ssid_len) != 0)
    266 				continue;
    267 			if (s->mode == WPAS_MODE_P2P_GO &&
    268 			    s != wpa_s->current_ssid)
    269 				continue;
    270 			if (go)
    271 				*go = s->mode == WPAS_MODE_P2P_GO;
    272 			return wpa_s;
    273 		}
    274 	}
    275 
    276 	return NULL;
    277 }
    278 
    279 
    280 static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s,
    281 				 enum p2p_group_removal_reason removal_reason)
    282 {
    283 	struct wpa_ssid *ssid;
    284 	char *gtype;
    285 	const char *reason;
    286 
    287 	ssid = wpa_s->current_ssid;
    288 	if (ssid == NULL) {
    289 		/*
    290 		 * The current SSID was not known, but there may still be a
    291 		 * pending P2P group interface waiting for provisioning or a
    292 		 * P2P group that is trying to reconnect.
    293 		 */
    294 		ssid = wpa_s->conf->ssid;
    295 		while (ssid) {
    296 			if (ssid->p2p_group && ssid->disabled != 2)
    297 				break;
    298 			ssid = ssid->next;
    299 		}
    300 		if (ssid == NULL &&
    301 			wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)
    302 		{
    303 			wpa_printf(MSG_ERROR, "P2P: P2P group interface "
    304 				   "not found");
    305 			return -1;
    306 		}
    307 	}
    308 	if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO)
    309 		gtype = "GO";
    310 	else if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT ||
    311 		 (ssid && ssid->mode == WPAS_MODE_INFRA)) {
    312 		wpa_s->reassociate = 0;
    313 		wpa_s->disconnected = 1;
    314 		wpa_supplicant_deauthenticate(wpa_s,
    315 					      WLAN_REASON_DEAUTH_LEAVING);
    316 		gtype = "client";
    317 	} else
    318 		gtype = "GO";
    319 	if (wpa_s->cross_connect_in_use) {
    320 		wpa_s->cross_connect_in_use = 0;
    321 		wpa_msg(wpa_s->parent, MSG_INFO,
    322 			P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
    323 			wpa_s->ifname, wpa_s->cross_connect_uplink);
    324 	}
    325 	switch (removal_reason) {
    326 	case P2P_GROUP_REMOVAL_REQUESTED:
    327 		reason = " reason=REQUESTED";
    328 		break;
    329 	case P2P_GROUP_REMOVAL_FORMATION_FAILED:
    330 		reason = " reason=FORMATION_FAILED";
    331 		break;
    332 	case P2P_GROUP_REMOVAL_IDLE_TIMEOUT:
    333 		reason = " reason=IDLE";
    334 		break;
    335 	case P2P_GROUP_REMOVAL_UNAVAILABLE:
    336 		reason = " reason=UNAVAILABLE";
    337 		break;
    338 	case P2P_GROUP_REMOVAL_GO_ENDING_SESSION:
    339 		reason = " reason=GO_ENDING_SESSION";
    340 		break;
    341 #ifdef ANDROID_P2P
    342 	case P2P_GROUP_REMOVAL_FREQ_CONFLICT:
    343 		reason = " reason=FREQ_CONFLICT";
    344 		break;
    345 #endif
    346 	default:
    347 		reason = "";
    348 		break;
    349 	}
    350 	if (removal_reason != P2P_GROUP_REMOVAL_SILENT) {
    351 		wpa_msg(wpa_s->parent, MSG_INFO,
    352 			P2P_EVENT_GROUP_REMOVED "%s %s%s",
    353 			wpa_s->ifname, gtype, reason);
    354 	}
    355 
    356 	if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
    357 		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
    358 	if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    359 				 wpa_s->parent, NULL) > 0) {
    360 		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group formation "
    361 			   "timeout");
    362 		wpa_s->p2p_in_provisioning = 0;
    363 	}
    364 
    365 	if (removal_reason != P2P_GROUP_REMOVAL_SILENT && ssid)
    366 		wpas_notify_p2p_group_removed(wpa_s, ssid, gtype);
    367 
    368 	if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
    369 		struct wpa_global *global;
    370 		char *ifname;
    371 		enum wpa_driver_if_type type;
    372 		wpa_printf(MSG_DEBUG, "P2P: Remove group interface %s",
    373 			wpa_s->ifname);
    374 		global = wpa_s->global;
    375 		ifname = os_strdup(wpa_s->ifname);
    376 		type = wpas_p2p_if_type(wpa_s->p2p_group_interface);
    377 		wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0);
    378 		wpa_s = global->ifaces;
    379 		if (wpa_s && ifname)
    380 			wpa_drv_if_remove(wpa_s, type, ifname);
    381 		os_free(ifname);
    382 		return 1;
    383 	}
    384 
    385 	wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network");
    386 	if (ssid && (ssid->p2p_group ||
    387 		     ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION ||
    388 		     (ssid->key_mgmt & WPA_KEY_MGMT_WPS))) {
    389 		int id = ssid->id;
    390 		if (ssid == wpa_s->current_ssid) {
    391 			wpa_sm_set_config(wpa_s->wpa, NULL);
    392 			eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
    393 			wpa_s->current_ssid = NULL;
    394 		}
    395 		/*
    396 		 * Networks objects created during any P2P activities are not
    397 		 * exposed out as they might/will confuse certain non-P2P aware
    398 		 * applications since these network objects won't behave like
    399 		 * regular ones.
    400 		 *
    401 		 * Likewise, we don't send out network removed signals for such
    402 		 * network objects.
    403 		 */
    404 		wpa_config_remove_network(wpa_s->conf, id);
    405 		wpa_supplicant_clear_status(wpa_s);
    406 		wpa_supplicant_cancel_sched_scan(wpa_s);
    407 		wpa_s->sta_scan_pending = 0;
    408 	} else {
    409 		wpa_printf(MSG_DEBUG, "P2P: Temporary group network not "
    410 			   "found");
    411 	}
    412 	if (wpa_s->ap_iface)
    413 		wpa_supplicant_ap_deinit(wpa_s);
    414 	else
    415 		wpa_drv_deinit_p2p_cli(wpa_s);
    416 
    417 	return 0;
    418 }
    419 
    420 
    421 static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s,
    422 				     u8 *go_dev_addr,
    423 				     const u8 *ssid, size_t ssid_len)
    424 {
    425 	struct wpa_bss *bss;
    426 	const u8 *bssid;
    427 	struct wpabuf *p2p;
    428 	u8 group_capab;
    429 	const u8 *addr;
    430 
    431 	if (wpa_s->go_params)
    432 		bssid = wpa_s->go_params->peer_interface_addr;
    433 	else
    434 		bssid = wpa_s->bssid;
    435 
    436 	bss = wpa_bss_get(wpa_s, bssid, ssid, ssid_len);
    437 	if (bss == NULL) {
    438 		u8 iface_addr[ETH_ALEN];
    439 		if (p2p_get_interface_addr(wpa_s->global->p2p, bssid,
    440 					   iface_addr) == 0)
    441 			bss = wpa_bss_get(wpa_s, iface_addr, ssid, ssid_len);
    442 	}
    443 	if (bss == NULL) {
    444 		wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
    445 			   "group is persistent - BSS " MACSTR " not found",
    446 			   MAC2STR(bssid));
    447 		return 0;
    448 	}
    449 
    450 	p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
    451 	if (p2p == NULL) {
    452 		wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
    453 			   "group is persistent - BSS " MACSTR
    454 			   " did not include P2P IE", MAC2STR(bssid));
    455 		wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs",
    456 			    (u8 *) (bss + 1), bss->ie_len);
    457 		wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs",
    458 			    ((u8 *) bss + 1) + bss->ie_len,
    459 			    bss->beacon_ie_len);
    460 		return 0;
    461 	}
    462 
    463 	group_capab = p2p_get_group_capab(p2p);
    464 	addr = p2p_get_go_dev_addr(p2p);
    465 	wpa_printf(MSG_DEBUG, "P2P: Checking whether group is persistent: "
    466 		   "group_capab=0x%x", group_capab);
    467 	if (addr) {
    468 		os_memcpy(go_dev_addr, addr, ETH_ALEN);
    469 		wpa_printf(MSG_DEBUG, "P2P: GO Device Address " MACSTR,
    470 			   MAC2STR(addr));
    471 	} else
    472 		os_memset(go_dev_addr, 0, ETH_ALEN);
    473 	wpabuf_free(p2p);
    474 
    475 	wpa_printf(MSG_DEBUG, "P2P: BSS " MACSTR " group_capab=0x%x "
    476 		   "go_dev_addr=" MACSTR,
    477 		   MAC2STR(bssid), group_capab, MAC2STR(go_dev_addr));
    478 
    479 	return group_capab & P2P_GROUP_CAPAB_PERSISTENT_GROUP;
    480 }
    481 
    482 
    483 static int wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
    484 					   struct wpa_ssid *ssid,
    485 					   const u8 *go_dev_addr)
    486 {
    487 	struct wpa_ssid *s;
    488 	int changed = 0;
    489 
    490 	wpa_printf(MSG_DEBUG, "P2P: Storing credentials for a persistent "
    491 		   "group (GO Dev Addr " MACSTR ")", MAC2STR(go_dev_addr));
    492 	for (s = wpa_s->conf->ssid; s; s = s->next) {
    493 		if (s->disabled == 2 &&
    494 		    os_memcmp(go_dev_addr, s->bssid, ETH_ALEN) == 0 &&
    495 		    s->ssid_len == ssid->ssid_len &&
    496 		    os_memcmp(ssid->ssid, s->ssid, ssid->ssid_len) == 0)
    497 			break;
    498 	}
    499 
    500 	if (s) {
    501 		wpa_printf(MSG_DEBUG, "P2P: Update existing persistent group "
    502 			   "entry");
    503 		if (ssid->passphrase && !s->passphrase)
    504 			changed = 1;
    505 		else if (ssid->passphrase && s->passphrase &&
    506 			 os_strcmp(ssid->passphrase, s->passphrase) != 0)
    507 			changed = 1;
    508 	} else {
    509 		wpa_printf(MSG_DEBUG, "P2P: Create a new persistent group "
    510 			   "entry");
    511 		changed = 1;
    512 		s = wpa_config_add_network(wpa_s->conf);
    513 		if (s == NULL)
    514 			return -1;
    515 
    516 		/*
    517 		 * Instead of network_added we emit persistent_group_added
    518 		 * notification. Also to keep the defense checks in
    519 		 * persistent_group obj registration method, we set the
    520 		 * relevant flags in s to designate it as a persistent group.
    521 		 */
    522 		s->p2p_group = 1;
    523 		s->p2p_persistent_group = 1;
    524 		wpas_notify_persistent_group_added(wpa_s, s);
    525 		wpa_config_set_network_defaults(s);
    526 	}
    527 
    528 	s->p2p_group = 1;
    529 	s->p2p_persistent_group = 1;
    530 	s->disabled = 2;
    531 	s->bssid_set = 1;
    532 	os_memcpy(s->bssid, go_dev_addr, ETH_ALEN);
    533 	s->mode = ssid->mode;
    534 	s->auth_alg = WPA_AUTH_ALG_OPEN;
    535 	s->key_mgmt = WPA_KEY_MGMT_PSK;
    536 	s->proto = WPA_PROTO_RSN;
    537 	s->pairwise_cipher = WPA_CIPHER_CCMP;
    538 	s->export_keys = 1;
    539 	if (ssid->passphrase) {
    540 		os_free(s->passphrase);
    541 		s->passphrase = os_strdup(ssid->passphrase);
    542 	}
    543 	if (ssid->psk_set) {
    544 		s->psk_set = 1;
    545 		os_memcpy(s->psk, ssid->psk, 32);
    546 	}
    547 	if (s->passphrase && !s->psk_set)
    548 		wpa_config_update_psk(s);
    549 	if (s->ssid == NULL || s->ssid_len < ssid->ssid_len) {
    550 		os_free(s->ssid);
    551 		s->ssid = os_malloc(ssid->ssid_len);
    552 	}
    553 	if (s->ssid) {
    554 		s->ssid_len = ssid->ssid_len;
    555 		os_memcpy(s->ssid, ssid->ssid, s->ssid_len);
    556 	}
    557 
    558 #ifndef CONFIG_NO_CONFIG_WRITE
    559 	if (changed && wpa_s->conf->update_config &&
    560 	    wpa_config_write(wpa_s->confname, wpa_s->conf)) {
    561 		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    562 	}
    563 #endif /* CONFIG_NO_CONFIG_WRITE */
    564 
    565 	return s->id;
    566 }
    567 
    568 
    569 static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
    570 						 const u8 *addr)
    571 {
    572 	struct wpa_ssid *ssid, *s;
    573 	u8 *n;
    574 	size_t i;
    575 	int found = 0;
    576 
    577 	ssid = wpa_s->current_ssid;
    578 	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
    579 	    !ssid->p2p_persistent_group)
    580 		return;
    581 
    582 	for (s = wpa_s->parent->conf->ssid; s; s = s->next) {
    583 		if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO)
    584 			continue;
    585 
    586 		if (s->ssid_len == ssid->ssid_len &&
    587 		    os_memcmp(s->ssid, ssid->ssid, s->ssid_len) == 0)
    588 			break;
    589 	}
    590 
    591 	if (s == NULL)
    592 		return;
    593 
    594 	for (i = 0; s->p2p_client_list && i < s->num_p2p_clients; i++) {
    595 		if (os_memcmp(s->p2p_client_list + i * ETH_ALEN, addr,
    596 			      ETH_ALEN) != 0)
    597 			continue;
    598 
    599 		if (i == s->num_p2p_clients - 1)
    600 			return; /* already the most recent entry */
    601 
    602 		/* move the entry to mark it most recent */
    603 		os_memmove(s->p2p_client_list + i * ETH_ALEN,
    604 			   s->p2p_client_list + (i + 1) * ETH_ALEN,
    605 			   (s->num_p2p_clients - i - 1) * ETH_ALEN);
    606 		os_memcpy(s->p2p_client_list +
    607 			  (s->num_p2p_clients - 1) * ETH_ALEN, addr, ETH_ALEN);
    608 		found = 1;
    609 		break;
    610 	}
    611 
    612 	if (!found && s->num_p2p_clients < P2P_MAX_STORED_CLIENTS) {
    613 		n = os_realloc_array(s->p2p_client_list,
    614 				     s->num_p2p_clients + 1, ETH_ALEN);
    615 		if (n == NULL)
    616 			return;
    617 		os_memcpy(n + s->num_p2p_clients * ETH_ALEN, addr, ETH_ALEN);
    618 		s->p2p_client_list = n;
    619 		s->num_p2p_clients++;
    620 	} else if (!found) {
    621 		/* Not enough room for an additional entry - drop the oldest
    622 		 * entry */
    623 		os_memmove(s->p2p_client_list,
    624 			   s->p2p_client_list + ETH_ALEN,
    625 			   (s->num_p2p_clients - 1) * ETH_ALEN);
    626 		os_memcpy(s->p2p_client_list +
    627 			  (s->num_p2p_clients - 1) * ETH_ALEN,
    628 			  addr, ETH_ALEN);
    629 	}
    630 
    631 #ifndef CONFIG_NO_CONFIG_WRITE
    632 	if (wpa_s->parent->conf->update_config &&
    633 	    wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
    634 		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    635 #endif /* CONFIG_NO_CONFIG_WRITE */
    636 }
    637 
    638 
    639 static void wpas_group_formation_completed(struct wpa_supplicant *wpa_s,
    640 					   int success)
    641 {
    642 	struct wpa_ssid *ssid;
    643 	const char *ssid_txt;
    644 	int client;
    645 	int persistent;
    646 	u8 go_dev_addr[ETH_ALEN];
    647 	int network_id = -1;
    648 
    649 	/*
    650 	 * This callback is likely called for the main interface. Update wpa_s
    651 	 * to use the group interface if a new interface was created for the
    652 	 * group.
    653 	 */
    654 	if (wpa_s->global->p2p_group_formation)
    655 		wpa_s = wpa_s->global->p2p_group_formation;
    656 	wpa_s->global->p2p_group_formation = NULL;
    657 	wpa_s->p2p_in_provisioning = 0;
    658 
    659 	if (!success) {
    660 		wpa_msg(wpa_s->parent, MSG_INFO,
    661 			P2P_EVENT_GROUP_FORMATION_FAILURE);
    662 		wpas_p2p_group_delete(wpa_s,
    663 				      P2P_GROUP_REMOVAL_FORMATION_FAILED);
    664 		return;
    665 	}
    666 
    667 	wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_FORMATION_SUCCESS);
    668 
    669 	ssid = wpa_s->current_ssid;
    670 	if (ssid && ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
    671 		ssid->mode = WPAS_MODE_P2P_GO;
    672 		p2p_group_notif_formation_done(wpa_s->p2p_group);
    673 		wpa_supplicant_ap_mac_addr_filter(wpa_s, NULL);
    674 	}
    675 
    676 	persistent = 0;
    677 	if (ssid) {
    678 		ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len);
    679 		client = ssid->mode == WPAS_MODE_INFRA;
    680 		if (ssid->mode == WPAS_MODE_P2P_GO) {
    681 			persistent = ssid->p2p_persistent_group;
    682 			os_memcpy(go_dev_addr, wpa_s->global->p2p_dev_addr,
    683 				  ETH_ALEN);
    684 		} else
    685 			persistent = wpas_p2p_persistent_group(wpa_s,
    686 							       go_dev_addr,
    687 							       ssid->ssid,
    688 							       ssid->ssid_len);
    689 	} else {
    690 		ssid_txt = "";
    691 		client = wpa_s->p2p_group_interface ==
    692 			P2P_GROUP_INTERFACE_CLIENT;
    693 		os_memset(go_dev_addr, 0, ETH_ALEN);
    694 	}
    695 
    696 	wpa_s->show_group_started = 0;
    697 	if (client) {
    698 		/*
    699 		 * Indicate event only after successfully completed 4-way
    700 		 * handshake, i.e., when the interface is ready for data
    701 		 * packets.
    702 		 */
    703 		wpa_s->show_group_started = 1;
    704 #ifdef ANDROID_P2P
    705 		/* For client Second phase of Group formation (4-way handshake) can be still pending
    706 		 * So we need to restore wpa_s->global->p2p_group_formation */
    707 		wpa_printf(MSG_INFO, "Restoring back wpa_s->global->p2p_group_formation to wpa_s %p\n", wpa_s);
    708 		wpa_s->global->p2p_group_formation = wpa_s;
    709 #endif
    710 
    711 	} else if (ssid && ssid->passphrase == NULL && ssid->psk_set) {
    712 		char psk[65];
    713 		wpa_snprintf_hex(psk, sizeof(psk), ssid->psk, 32);
    714 		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
    715 			"%s GO ssid=\"%s\" freq=%d psk=%s go_dev_addr=" MACSTR
    716 			"%s",
    717 			wpa_s->ifname, ssid_txt, ssid->frequency, psk,
    718 			MAC2STR(go_dev_addr),
    719 			persistent ? " [PERSISTENT]" : "");
    720 		wpas_p2p_cross_connect_setup(wpa_s);
    721 		wpas_p2p_set_group_idle_timeout(wpa_s);
    722 	} else {
    723 		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
    724 			"%s GO ssid=\"%s\" freq=%d passphrase=\"%s\" "
    725 			"go_dev_addr=" MACSTR "%s",
    726 			wpa_s->ifname, ssid_txt, ssid ? ssid->frequency : 0,
    727 			ssid && ssid->passphrase ? ssid->passphrase : "",
    728 			MAC2STR(go_dev_addr),
    729 			persistent ? " [PERSISTENT]" : "");
    730 		wpas_p2p_cross_connect_setup(wpa_s);
    731 		wpas_p2p_set_group_idle_timeout(wpa_s);
    732 	}
    733 
    734 	if (persistent)
    735 		network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
    736 							     ssid, go_dev_addr);
    737 	if (network_id < 0 && ssid)
    738 		network_id = ssid->id;
    739 	if (!client)
    740 		wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
    741 }
    742 
    743 
    744 static void wpas_p2p_send_action_tx_status(struct wpa_supplicant *wpa_s,
    745 					   unsigned int freq,
    746 					   const u8 *dst, const u8 *src,
    747 					   const u8 *bssid,
    748 					   const u8 *data, size_t data_len,
    749 					   enum offchannel_send_action_result
    750 					   result)
    751 {
    752 	enum p2p_send_action_result res = P2P_SEND_ACTION_SUCCESS;
    753 
    754 	if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
    755 		return;
    756 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
    757 		return;
    758 
    759 	switch (result) {
    760 	case OFFCHANNEL_SEND_ACTION_SUCCESS:
    761 		res = P2P_SEND_ACTION_SUCCESS;
    762 		break;
    763 	case OFFCHANNEL_SEND_ACTION_NO_ACK:
    764 		res = P2P_SEND_ACTION_NO_ACK;
    765 		break;
    766 	case OFFCHANNEL_SEND_ACTION_FAILED:
    767 		res = P2P_SEND_ACTION_FAILED;
    768 		break;
    769 	}
    770 
    771 	p2p_send_action_cb(wpa_s->global->p2p, freq, dst, src, bssid, res);
    772 
    773 	if (result != OFFCHANNEL_SEND_ACTION_SUCCESS &&
    774 	    wpa_s->pending_pd_before_join &&
    775 	    (os_memcmp(dst, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
    776 	     os_memcmp(dst, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0) &&
    777 	    wpa_s->p2p_fallback_to_go_neg) {
    778 		wpa_s->pending_pd_before_join = 0;
    779 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No ACK for PD Req "
    780 			"during p2p_connect-auto");
    781 		wpas_p2p_fallback_to_go_neg(wpa_s, 0);
    782 		return;
    783 	}
    784 }
    785 
    786 
    787 static int wpas_send_action(void *ctx, unsigned int freq, const u8 *dst,
    788 			    const u8 *src, const u8 *bssid, const u8 *buf,
    789 			    size_t len, unsigned int wait_time)
    790 {
    791 	struct wpa_supplicant *wpa_s = ctx;
    792 	return offchannel_send_action(wpa_s, freq, dst, src, bssid, buf, len,
    793 				      wait_time,
    794 				      wpas_p2p_send_action_tx_status, 1);
    795 }
    796 
    797 
    798 static void wpas_send_action_done(void *ctx)
    799 {
    800 	struct wpa_supplicant *wpa_s = ctx;
    801 	offchannel_send_action_done(wpa_s);
    802 }
    803 
    804 
    805 static int wpas_copy_go_neg_results(struct wpa_supplicant *wpa_s,
    806 				    struct p2p_go_neg_results *params)
    807 {
    808 	if (wpa_s->go_params == NULL) {
    809 		wpa_s->go_params = os_malloc(sizeof(*params));
    810 		if (wpa_s->go_params == NULL)
    811 			return -1;
    812 	}
    813 	os_memcpy(wpa_s->go_params, params, sizeof(*params));
    814 	return 0;
    815 }
    816 
    817 
    818 static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s,
    819 				    struct p2p_go_neg_results *res)
    820 {
    821 	wpa_printf(MSG_DEBUG, "P2P: Start WPS Enrollee for peer " MACSTR,
    822 		   MAC2STR(res->peer_interface_addr));
    823 	wpa_hexdump_ascii(MSG_DEBUG, "P2P: Start WPS Enrollee for SSID",
    824 			  res->ssid, res->ssid_len);
    825 	wpa_supplicant_ap_deinit(wpa_s);
    826 	wpas_copy_go_neg_results(wpa_s, res);
    827 	if (res->wps_method == WPS_PBC)
    828 		wpas_wps_start_pbc(wpa_s, res->peer_interface_addr, 1);
    829 	else {
    830 		u16 dev_pw_id = DEV_PW_DEFAULT;
    831 		if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
    832 			dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED;
    833 		wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
    834 				   wpa_s->p2p_pin, 1, dev_pw_id);
    835 	}
    836 }
    837 
    838 
    839 static void p2p_go_configured(void *ctx, void *data)
    840 {
    841 	struct wpa_supplicant *wpa_s = ctx;
    842 	struct p2p_go_neg_results *params = data;
    843 	struct wpa_ssid *ssid;
    844 	int network_id = -1;
    845 
    846 	ssid = wpa_s->current_ssid;
    847 	if (ssid && ssid->mode == WPAS_MODE_P2P_GO) {
    848 		wpa_printf(MSG_DEBUG, "P2P: Group setup without provisioning");
    849 		if (wpa_s->global->p2p_group_formation == wpa_s)
    850 			wpa_s->global->p2p_group_formation = NULL;
    851 		if (os_strlen(params->passphrase) > 0) {
    852 			wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
    853 				"%s GO ssid=\"%s\" freq=%d passphrase=\"%s\" "
    854 				"go_dev_addr=" MACSTR "%s", wpa_s->ifname,
    855 				wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
    856 				ssid->frequency, params->passphrase,
    857 				MAC2STR(wpa_s->global->p2p_dev_addr),
    858 				params->persistent_group ? " [PERSISTENT]" :
    859 				"");
    860 		} else {
    861 			char psk[65];
    862 			wpa_snprintf_hex(psk, sizeof(psk), params->psk,
    863 					 sizeof(params->psk));
    864 			wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
    865 				"%s GO ssid=\"%s\" freq=%d psk=%s "
    866 				"go_dev_addr=" MACSTR "%s", wpa_s->ifname,
    867 				wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
    868 				ssid->frequency, psk,
    869 				MAC2STR(wpa_s->global->p2p_dev_addr),
    870 				params->persistent_group ? " [PERSISTENT]" :
    871 				"");
    872 		}
    873 
    874 		if (params->persistent_group)
    875 			network_id = wpas_p2p_store_persistent_group(
    876 				wpa_s->parent, ssid,
    877 				wpa_s->global->p2p_dev_addr);
    878 		if (network_id < 0)
    879 			network_id = ssid->id;
    880 		wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 0);
    881 		wpas_p2p_cross_connect_setup(wpa_s);
    882 		wpas_p2p_set_group_idle_timeout(wpa_s);
    883 		return;
    884 	}
    885 
    886 	wpa_printf(MSG_DEBUG, "P2P: Setting up WPS for GO provisioning");
    887 	if (wpa_supplicant_ap_mac_addr_filter(wpa_s,
    888 					      params->peer_interface_addr)) {
    889 		wpa_printf(MSG_DEBUG, "P2P: Failed to setup MAC address "
    890 			   "filtering");
    891 		return;
    892 	}
    893 	if (params->wps_method == WPS_PBC)
    894 		wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,
    895 					  params->peer_device_addr);
    896 	else if (wpa_s->p2p_pin[0])
    897 		wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,
    898 					  wpa_s->p2p_pin, NULL, 0, 0);
    899 	os_free(wpa_s->go_params);
    900 	wpa_s->go_params = NULL;
    901 }
    902 
    903 
    904 static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
    905 			      struct p2p_go_neg_results *params,
    906 			      int group_formation)
    907 {
    908 	struct wpa_ssid *ssid;
    909 
    910 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Starting GO");
    911 	if (wpas_copy_go_neg_results(wpa_s, params) < 0) {
    912 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not copy GO Negotiation "
    913 			"results");
    914 		return;
    915 	}
    916 
    917 	ssid = wpa_config_add_network(wpa_s->conf);
    918 	if (ssid == NULL) {
    919 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not add network for GO");
    920 		return;
    921 	}
    922 
    923 	wpa_s->show_group_started = 0;
    924 
    925 	wpa_config_set_network_defaults(ssid);
    926 	ssid->temporary = 1;
    927 	ssid->p2p_group = 1;
    928 	ssid->p2p_persistent_group = params->persistent_group;
    929 	ssid->mode = group_formation ? WPAS_MODE_P2P_GROUP_FORMATION :
    930 		WPAS_MODE_P2P_GO;
    931 	ssid->frequency = params->freq;
    932 	ssid->ht40 = params->ht40;
    933 	ssid->ssid = os_zalloc(params->ssid_len + 1);
    934 	if (ssid->ssid) {
    935 		os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
    936 		ssid->ssid_len = params->ssid_len;
    937 	}
    938 	ssid->auth_alg = WPA_AUTH_ALG_OPEN;
    939 	ssid->key_mgmt = WPA_KEY_MGMT_PSK;
    940 	ssid->proto = WPA_PROTO_RSN;
    941 	ssid->pairwise_cipher = WPA_CIPHER_CCMP;
    942 	if (os_strlen(params->passphrase) > 0) {
    943 		ssid->passphrase = os_strdup(params->passphrase);
    944 		if (ssid->passphrase == NULL) {
    945 			wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to copy "
    946 				"passphrase for GO");
    947 			wpa_config_remove_network(wpa_s->conf, ssid->id);
    948 			return;
    949 		}
    950 	} else
    951 		ssid->passphrase = NULL;
    952 	ssid->psk_set = params->psk_set;
    953 	if (ssid->psk_set)
    954 		os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk));
    955 	else if (ssid->passphrase)
    956 		wpa_config_update_psk(ssid);
    957 	ssid->ap_max_inactivity = wpa_s->parent->conf->p2p_go_max_inactivity;
    958 
    959 	wpa_s->ap_configured_cb = p2p_go_configured;
    960 	wpa_s->ap_configured_cb_ctx = wpa_s;
    961 	wpa_s->ap_configured_cb_data = wpa_s->go_params;
    962 	wpa_s->connect_without_scan = ssid;
    963 	wpa_s->reassociate = 1;
    964 	wpa_s->disconnected = 0;
    965 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Request scan (that will be skipped) to "
    966 		"start GO)");
    967 	wpa_supplicant_req_scan(wpa_s, 0, 0);
    968 }
    969 
    970 
    971 static void wpas_p2p_clone_config(struct wpa_supplicant *dst,
    972 				  const struct wpa_supplicant *src)
    973 {
    974 	struct wpa_config *d;
    975 	const struct wpa_config *s;
    976 
    977 	d = dst->conf;
    978 	s = src->conf;
    979 
    980 #define C(n) if (s->n) d->n = os_strdup(s->n)
    981 	C(device_name);
    982 	C(manufacturer);
    983 	C(model_name);
    984 	C(model_number);
    985 	C(serial_number);
    986 	C(config_methods);
    987 #undef C
    988 
    989 	os_memcpy(d->device_type, s->device_type, WPS_DEV_TYPE_LEN);
    990 	os_memcpy(d->sec_device_type, s->sec_device_type,
    991 		  sizeof(d->sec_device_type));
    992 	d->num_sec_device_types = s->num_sec_device_types;
    993 
    994 	d->p2p_group_idle = s->p2p_group_idle;
    995 	d->p2p_intra_bss = s->p2p_intra_bss;
    996 	d->persistent_reconnect = s->persistent_reconnect;
    997 	d->max_num_sta = s->max_num_sta;
    998 	d->pbc_in_m1 = s->pbc_in_m1;
    999 	d->ignore_old_scan_res = s->ignore_old_scan_res;
   1000 }
   1001 
   1002 
   1003 static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s,
   1004 					enum wpa_driver_if_type type)
   1005 {
   1006 	char ifname[120], force_ifname[120];
   1007 
   1008 	if (wpa_s->pending_interface_name[0]) {
   1009 		wpa_printf(MSG_DEBUG, "P2P: Pending virtual interface exists "
   1010 			   "- skip creation of a new one");
   1011 		if (is_zero_ether_addr(wpa_s->pending_interface_addr)) {
   1012 			wpa_printf(MSG_DEBUG, "P2P: Pending virtual address "
   1013 				   "unknown?! ifname='%s'",
   1014 				   wpa_s->pending_interface_name);
   1015 			return -1;
   1016 		}
   1017 		return 0;
   1018 	}
   1019 
   1020 	os_snprintf(ifname, sizeof(ifname), "p2p-%s-%d", wpa_s->ifname,
   1021 		    wpa_s->p2p_group_idx);
   1022 	if (os_strlen(ifname) >= IFNAMSIZ &&
   1023 	    os_strlen(wpa_s->ifname) < IFNAMSIZ) {
   1024 		/* Try to avoid going over the IFNAMSIZ length limit */
   1025 		os_snprintf(ifname, sizeof(ifname), "p2p-%d",
   1026 			    wpa_s->p2p_group_idx);
   1027 	}
   1028 	force_ifname[0] = '\0';
   1029 
   1030 	wpa_printf(MSG_DEBUG, "P2P: Create a new interface %s for the group",
   1031 		   ifname);
   1032 	wpa_s->p2p_group_idx++;
   1033 
   1034 	wpa_s->pending_interface_type = type;
   1035 	if (wpa_drv_if_add(wpa_s, type, ifname, NULL, NULL, force_ifname,
   1036 			   wpa_s->pending_interface_addr, NULL) < 0) {
   1037 		wpa_printf(MSG_ERROR, "P2P: Failed to create new group "
   1038 			   "interface");
   1039 		return -1;
   1040 	}
   1041 
   1042 	if (force_ifname[0]) {
   1043 		wpa_printf(MSG_DEBUG, "P2P: Driver forced interface name %s",
   1044 			   force_ifname);
   1045 		os_strlcpy(wpa_s->pending_interface_name, force_ifname,
   1046 			   sizeof(wpa_s->pending_interface_name));
   1047 	} else
   1048 		os_strlcpy(wpa_s->pending_interface_name, ifname,
   1049 			   sizeof(wpa_s->pending_interface_name));
   1050 	wpa_printf(MSG_DEBUG, "P2P: Created pending virtual interface %s addr "
   1051 		   MACSTR, wpa_s->pending_interface_name,
   1052 		   MAC2STR(wpa_s->pending_interface_addr));
   1053 
   1054 	return 0;
   1055 }
   1056 
   1057 
   1058 static void wpas_p2p_remove_pending_group_interface(
   1059 	struct wpa_supplicant *wpa_s)
   1060 {
   1061 	if (!wpa_s->pending_interface_name[0] ||
   1062 	    is_zero_ether_addr(wpa_s->pending_interface_addr))
   1063 		return; /* No pending virtual interface */
   1064 
   1065 	wpa_printf(MSG_DEBUG, "P2P: Removing pending group interface %s",
   1066 		   wpa_s->pending_interface_name);
   1067 	wpa_drv_if_remove(wpa_s, wpa_s->pending_interface_type,
   1068 			  wpa_s->pending_interface_name);
   1069 	os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
   1070 	wpa_s->pending_interface_name[0] = '\0';
   1071 }
   1072 
   1073 
   1074 static struct wpa_supplicant *
   1075 wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go)
   1076 {
   1077 	struct wpa_interface iface;
   1078 	struct wpa_supplicant *group_wpa_s;
   1079 
   1080 	if (!wpa_s->pending_interface_name[0]) {
   1081 		wpa_printf(MSG_ERROR, "P2P: No pending group interface");
   1082 		if (!wpas_p2p_create_iface(wpa_s))
   1083 			return NULL;
   1084 		/*
   1085 		 * Something has forced us to remove the pending interface; try
   1086 		 * to create a new one and hope for the best that we will get
   1087 		 * the same local address.
   1088 		 */
   1089 		if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
   1090 						 WPA_IF_P2P_CLIENT) < 0)
   1091 			return NULL;
   1092 	}
   1093 
   1094 	os_memset(&iface, 0, sizeof(iface));
   1095 	iface.ifname = wpa_s->pending_interface_name;
   1096 	iface.driver = wpa_s->driver->name;
   1097 	iface.ctrl_interface = wpa_s->conf->ctrl_interface;
   1098 	iface.driver_param = wpa_s->conf->driver_param;
   1099 	group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface);
   1100 	if (group_wpa_s == NULL) {
   1101 		wpa_printf(MSG_ERROR, "P2P: Failed to create new "
   1102 			   "wpa_supplicant interface");
   1103 		return NULL;
   1104 	}
   1105 	wpa_s->pending_interface_name[0] = '\0';
   1106 	group_wpa_s->parent = wpa_s;
   1107 	group_wpa_s->p2p_group_interface = go ? P2P_GROUP_INTERFACE_GO :
   1108 		P2P_GROUP_INTERFACE_CLIENT;
   1109 	wpa_s->global->p2p_group_formation = group_wpa_s;
   1110 
   1111 	wpas_p2p_clone_config(group_wpa_s, wpa_s);
   1112 
   1113 	return group_wpa_s;
   1114 }
   1115 
   1116 
   1117 static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
   1118 					     void *timeout_ctx)
   1119 {
   1120 	struct wpa_supplicant *wpa_s = eloop_ctx;
   1121 	wpa_printf(MSG_DEBUG, "P2P: Group Formation timed out");
   1122 	if (wpa_s->global->p2p)
   1123 		p2p_group_formation_failed(wpa_s->global->p2p);
   1124 	else if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   1125 		wpa_drv_p2p_group_formation_failed(wpa_s);
   1126 	wpas_group_formation_completed(wpa_s, 0);
   1127 }
   1128 
   1129 
   1130 void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
   1131 {
   1132 	struct wpa_supplicant *wpa_s = ctx;
   1133 
   1134 	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
   1135 		wpa_drv_cancel_remain_on_channel(wpa_s);
   1136 		wpa_s->off_channel_freq = 0;
   1137 		wpa_s->roc_waiting_drv_freq = 0;
   1138 	}
   1139 
   1140 	if (res->status) {
   1141 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_FAILURE "status=%d",
   1142 			res->status);
   1143 		wpas_notify_p2p_go_neg_completed(wpa_s, res);
   1144 		wpas_p2p_remove_pending_group_interface(wpa_s);
   1145 		return;
   1146 	}
   1147 
   1148 	if (wpa_s->p2p_go_ht40)
   1149 		res->ht40 = 1;
   1150 
   1151 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS);
   1152 	wpas_notify_p2p_go_neg_completed(wpa_s, res);
   1153 
   1154 	if (res->role_go && wpa_s->p2p_persistent_id >= 0) {
   1155 		struct wpa_ssid *ssid;
   1156 		ssid = wpa_config_get_network(wpa_s->conf,
   1157 					      wpa_s->p2p_persistent_id);
   1158 		if (ssid && ssid->disabled == 2 &&
   1159 		    ssid->mode == WPAS_MODE_P2P_GO && ssid->passphrase) {
   1160 			size_t len = os_strlen(ssid->passphrase);
   1161 			wpa_printf(MSG_DEBUG, "P2P: Override passphrase based "
   1162 				   "on requested persistent group");
   1163 			os_memcpy(res->passphrase, ssid->passphrase, len);
   1164 			res->passphrase[len] = '\0';
   1165 		}
   1166 	}
   1167 
   1168 	if (wpa_s->create_p2p_iface) {
   1169 		struct wpa_supplicant *group_wpa_s =
   1170 			wpas_p2p_init_group_interface(wpa_s, res->role_go);
   1171 		if (group_wpa_s == NULL) {
   1172 			wpas_p2p_remove_pending_group_interface(wpa_s);
   1173 			return;
   1174 		}
   1175 		if (group_wpa_s != wpa_s) {
   1176 			os_memcpy(group_wpa_s->p2p_pin, wpa_s->p2p_pin,
   1177 				  sizeof(group_wpa_s->p2p_pin));
   1178 			group_wpa_s->p2p_wps_method = wpa_s->p2p_wps_method;
   1179 		}
   1180 		os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
   1181 		wpa_s->pending_interface_name[0] = '\0';
   1182 		group_wpa_s->p2p_in_provisioning = 1;
   1183 
   1184 		if (res->role_go)
   1185 			wpas_start_wps_go(group_wpa_s, res, 1);
   1186 		else
   1187 			wpas_start_wps_enrollee(group_wpa_s, res);
   1188 	} else {
   1189 		wpa_s->p2p_in_provisioning = 1;
   1190 		wpa_s->global->p2p_group_formation = wpa_s;
   1191 
   1192 		if (res->role_go)
   1193 			wpas_start_wps_go(wpa_s, res, 1);
   1194 		else
   1195 			wpas_start_wps_enrollee(ctx, res);
   1196 	}
   1197 
   1198 	wpa_s->p2p_long_listen = 0;
   1199 	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
   1200 
   1201 	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
   1202 	eloop_register_timeout(15 + res->peer_config_timeout / 100,
   1203 			       (res->peer_config_timeout % 100) * 10000,
   1204 			       wpas_p2p_group_formation_timeout, wpa_s, NULL);
   1205 }
   1206 
   1207 
   1208 void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id)
   1209 {
   1210 	struct wpa_supplicant *wpa_s = ctx;
   1211 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR
   1212 		" dev_passwd_id=%u", MAC2STR(src), dev_passwd_id);
   1213 
   1214 	wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id);
   1215 }
   1216 
   1217 
   1218 void wpas_dev_found(void *ctx, const u8 *addr,
   1219 		    const struct p2p_peer_info *info,
   1220 		    int new_device)
   1221 {
   1222 #ifndef CONFIG_NO_STDOUT_DEBUG
   1223 	struct wpa_supplicant *wpa_s = ctx;
   1224 	char devtype[WPS_DEV_TYPE_BUFSIZE];
   1225 #define WFD_DEV_INFO_SIZE 9
   1226 	char wfd_dev_info_hex[2 * WFD_DEV_INFO_SIZE + 1];
   1227 	os_memset(wfd_dev_info_hex, 0, sizeof(wfd_dev_info_hex));
   1228 #ifdef CONFIG_WIFI_DISPLAY
   1229 	if (info->wfd_subelems) {
   1230 		wpa_snprintf_hex(wfd_dev_info_hex, sizeof(wfd_dev_info_hex),
   1231 					wpabuf_head(info->wfd_subelems),
   1232 					WFD_DEV_INFO_SIZE);
   1233 	}
   1234 #endif /* CONFIG_WIFI_DISPLAY */
   1235 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_FOUND MACSTR
   1236 		" p2p_dev_addr=" MACSTR
   1237 		" pri_dev_type=%s name='%s' config_methods=0x%x "
   1238 		"dev_capab=0x%x group_capab=0x%x%s%s",
   1239 		MAC2STR(addr), MAC2STR(info->p2p_device_addr),
   1240 		wps_dev_type_bin2str(info->pri_dev_type, devtype,
   1241 				     sizeof(devtype)),
   1242 		info->device_name, info->config_methods,
   1243 		info->dev_capab, info->group_capab,
   1244 		wfd_dev_info_hex[0] ? " wfd_dev_info=0x" : "", wfd_dev_info_hex);
   1245 #endif /* CONFIG_NO_STDOUT_DEBUG */
   1246 
   1247 	wpas_notify_p2p_device_found(ctx, info->p2p_device_addr, new_device);
   1248 }
   1249 
   1250 
   1251 static void wpas_dev_lost(void *ctx, const u8 *dev_addr)
   1252 {
   1253 	struct wpa_supplicant *wpa_s = ctx;
   1254 
   1255 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_LOST
   1256 		"p2p_dev_addr=" MACSTR, MAC2STR(dev_addr));
   1257 
   1258 	wpas_notify_p2p_device_lost(wpa_s, dev_addr);
   1259 }
   1260 
   1261 
   1262 static int wpas_start_listen(void *ctx, unsigned int freq,
   1263 			     unsigned int duration,
   1264 			     const struct wpabuf *probe_resp_ie)
   1265 {
   1266 	struct wpa_supplicant *wpa_s = ctx;
   1267 
   1268 	wpa_drv_set_ap_wps_ie(wpa_s, NULL, probe_resp_ie, NULL);
   1269 
   1270 	if (wpa_drv_probe_req_report(wpa_s, 1) < 0) {
   1271 		wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver to "
   1272 			   "report received Probe Request frames");
   1273 		return -1;
   1274 	}
   1275 
   1276 	wpa_s->pending_listen_freq = freq;
   1277 	wpa_s->pending_listen_duration = duration;
   1278 
   1279 	if (wpa_drv_remain_on_channel(wpa_s, freq, duration) < 0) {
   1280 		wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver "
   1281 			   "to remain on channel (%u MHz) for Listen "
   1282 			   "state", freq);
   1283 		wpa_s->pending_listen_freq = 0;
   1284 		return -1;
   1285 	}
   1286 	wpa_s->off_channel_freq = 0;
   1287 	wpa_s->roc_waiting_drv_freq = freq;
   1288 
   1289 	return 0;
   1290 }
   1291 
   1292 
   1293 static void wpas_stop_listen(void *ctx)
   1294 {
   1295 	struct wpa_supplicant *wpa_s = ctx;
   1296 	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
   1297 		wpa_drv_cancel_remain_on_channel(wpa_s);
   1298 		wpa_s->off_channel_freq = 0;
   1299 		wpa_s->roc_waiting_drv_freq = 0;
   1300 	}
   1301 	wpa_drv_set_ap_wps_ie(wpa_s, NULL, NULL, NULL);
   1302 	wpa_drv_probe_req_report(wpa_s, 0);
   1303 }
   1304 
   1305 
   1306 static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf)
   1307 {
   1308 	struct wpa_supplicant *wpa_s = ctx;
   1309 	return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1);
   1310 }
   1311 
   1312 
   1313 /*
   1314  * DNS Header section is used only to calculate compression pointers, so the
   1315  * contents of this data does not matter, but the length needs to be reserved
   1316  * in the virtual packet.
   1317  */
   1318 #define DNS_HEADER_LEN 12
   1319 
   1320 /*
   1321  * 27-octet in-memory packet from P2P specification containing two implied
   1322  * queries for _tcp.lcoal. PTR IN and _udp.local. PTR IN
   1323  */
   1324 #define P2P_SD_IN_MEMORY_LEN 27
   1325 
   1326 static int p2p_sd_dns_uncompress_label(char **upos, char *uend, u8 *start,
   1327 				       u8 **spos, const u8 *end)
   1328 {
   1329 	while (*spos < end) {
   1330 		u8 val = ((*spos)[0] & 0xc0) >> 6;
   1331 		int len;
   1332 
   1333 		if (val == 1 || val == 2) {
   1334 			/* These are reserved values in RFC 1035 */
   1335 			wpa_printf(MSG_DEBUG, "P2P: Invalid domain name "
   1336 				   "sequence starting with 0x%x", val);
   1337 			return -1;
   1338 		}
   1339 
   1340 		if (val == 3) {
   1341 			u16 offset;
   1342 			u8 *spos_tmp;
   1343 
   1344 			/* Offset */
   1345 			if (*spos + 2 > end) {
   1346 				wpa_printf(MSG_DEBUG, "P2P: No room for full "
   1347 					   "DNS offset field");
   1348 				return -1;
   1349 			}
   1350 
   1351 			offset = (((*spos)[0] & 0x3f) << 8) | (*spos)[1];
   1352 			if (offset >= *spos - start) {
   1353 				wpa_printf(MSG_DEBUG, "P2P: Invalid DNS "
   1354 					   "pointer offset %u", offset);
   1355 				return -1;
   1356 			}
   1357 
   1358 			(*spos) += 2;
   1359 			spos_tmp = start + offset;
   1360 			return p2p_sd_dns_uncompress_label(upos, uend, start,
   1361 							   &spos_tmp,
   1362 							   *spos - 2);
   1363 		}
   1364 
   1365 		/* Label */
   1366 		len = (*spos)[0] & 0x3f;
   1367 		if (len == 0)
   1368 			return 0;
   1369 
   1370 		(*spos)++;
   1371 		if (*spos + len > end) {
   1372 			wpa_printf(MSG_DEBUG, "P2P: Invalid domain name "
   1373 				   "sequence - no room for label with length "
   1374 				   "%u", len);
   1375 			return -1;
   1376 		}
   1377 
   1378 		if (*upos + len + 2 > uend)
   1379 			return -2;
   1380 
   1381 		os_memcpy(*upos, *spos, len);
   1382 		*spos += len;
   1383 		*upos += len;
   1384 		(*upos)[0] = '.';
   1385 		(*upos)++;
   1386 		(*upos)[0] = '\0';
   1387 	}
   1388 
   1389 	return 0;
   1390 }
   1391 
   1392 
   1393 /* Uncompress domain names per RFC 1035 using the P2P SD in-memory packet.
   1394  * Returns -1 on parsing error (invalid input sequence), -2 if output buffer is
   1395  * not large enough */
   1396 static int p2p_sd_dns_uncompress(char *buf, size_t buf_len, const u8 *msg,
   1397 				 size_t msg_len, size_t offset)
   1398 {
   1399 	/* 27-octet in-memory packet from P2P specification */
   1400 	const char *prefix = "\x04_tcp\x05local\x00\x00\x0C\x00\x01"
   1401 		"\x04_udp\xC0\x11\x00\x0C\x00\x01";
   1402 	u8 *tmp, *end, *spos;
   1403 	char *upos, *uend;
   1404 	int ret = 0;
   1405 
   1406 	if (buf_len < 2)
   1407 		return -1;
   1408 	if (offset > msg_len)
   1409 		return -1;
   1410 
   1411 	tmp = os_malloc(DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN + msg_len);
   1412 	if (tmp == NULL)
   1413 		return -1;
   1414 	spos = tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN;
   1415 	end = spos + msg_len;
   1416 	spos += offset;
   1417 
   1418 	os_memset(tmp, 0, DNS_HEADER_LEN);
   1419 	os_memcpy(tmp + DNS_HEADER_LEN, prefix, P2P_SD_IN_MEMORY_LEN);
   1420 	os_memcpy(tmp + DNS_HEADER_LEN + P2P_SD_IN_MEMORY_LEN, msg, msg_len);
   1421 
   1422 	upos = buf;
   1423 	uend = buf + buf_len;
   1424 
   1425 	ret = p2p_sd_dns_uncompress_label(&upos, uend, tmp, &spos, end);
   1426 	if (ret) {
   1427 		os_free(tmp);
   1428 		return ret;
   1429 	}
   1430 
   1431 	if (upos == buf) {
   1432 		upos[0] = '.';
   1433 		upos[1] = '\0';
   1434 	} else if (upos[-1] == '.')
   1435 		upos[-1] = '\0';
   1436 
   1437 	os_free(tmp);
   1438 	return 0;
   1439 }
   1440 
   1441 
   1442 static struct p2p_srv_bonjour *
   1443 wpas_p2p_service_get_bonjour(struct wpa_supplicant *wpa_s,
   1444 			     const struct wpabuf *query)
   1445 {
   1446 	struct p2p_srv_bonjour *bsrv;
   1447 	size_t len;
   1448 
   1449 	len = wpabuf_len(query);
   1450 	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
   1451 			 struct p2p_srv_bonjour, list) {
   1452 		if (len == wpabuf_len(bsrv->query) &&
   1453 		    os_memcmp(wpabuf_head(query), wpabuf_head(bsrv->query),
   1454 			      len) == 0)
   1455 			return bsrv;
   1456 	}
   1457 	return NULL;
   1458 }
   1459 
   1460 
   1461 static struct p2p_srv_upnp *
   1462 wpas_p2p_service_get_upnp(struct wpa_supplicant *wpa_s, u8 version,
   1463 			  const char *service)
   1464 {
   1465 	struct p2p_srv_upnp *usrv;
   1466 
   1467 	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
   1468 			 struct p2p_srv_upnp, list) {
   1469 		if (version == usrv->version &&
   1470 		    os_strcmp(service, usrv->service) == 0)
   1471 			return usrv;
   1472 	}
   1473 	return NULL;
   1474 }
   1475 
   1476 
   1477 static void wpas_sd_add_proto_not_avail(struct wpabuf *resp, u8 srv_proto,
   1478 					u8 srv_trans_id)
   1479 {
   1480 	u8 *len_pos;
   1481 
   1482 	if (wpabuf_tailroom(resp) < 5)
   1483 		return;
   1484 
   1485 	/* Length (to be filled) */
   1486 	len_pos = wpabuf_put(resp, 2);
   1487 	wpabuf_put_u8(resp, srv_proto);
   1488 	wpabuf_put_u8(resp, srv_trans_id);
   1489 	/* Status Code */
   1490 	wpabuf_put_u8(resp, P2P_SD_PROTO_NOT_AVAILABLE);
   1491 	/* Response Data: empty */
   1492 	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
   1493 }
   1494 
   1495 
   1496 static void wpas_sd_all_bonjour(struct wpa_supplicant *wpa_s,
   1497 				struct wpabuf *resp, u8 srv_trans_id)
   1498 {
   1499 	struct p2p_srv_bonjour *bsrv;
   1500 	u8 *len_pos;
   1501 
   1502 	wpa_printf(MSG_DEBUG, "P2P: SD Request for all Bonjour services");
   1503 
   1504 	if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
   1505 		wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available");
   1506 		return;
   1507 	}
   1508 
   1509 	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
   1510 			 struct p2p_srv_bonjour, list) {
   1511 		if (wpabuf_tailroom(resp) <
   1512 		    5 + wpabuf_len(bsrv->query) + wpabuf_len(bsrv->resp))
   1513 			return;
   1514 		/* Length (to be filled) */
   1515 		len_pos = wpabuf_put(resp, 2);
   1516 		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
   1517 		wpabuf_put_u8(resp, srv_trans_id);
   1518 		/* Status Code */
   1519 		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
   1520 		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service",
   1521 				  wpabuf_head(bsrv->resp),
   1522 				  wpabuf_len(bsrv->resp));
   1523 		/* Response Data */
   1524 		wpabuf_put_buf(resp, bsrv->query); /* Key */
   1525 		wpabuf_put_buf(resp, bsrv->resp); /* Value */
   1526 		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
   1527 			     2);
   1528 	}
   1529 }
   1530 
   1531 
   1532 static int match_bonjour_query(struct p2p_srv_bonjour *bsrv, const u8 *query,
   1533 			       size_t query_len)
   1534 {
   1535 	char str_rx[256], str_srv[256];
   1536 
   1537 	if (query_len < 3 || wpabuf_len(bsrv->query) < 3)
   1538 		return 0; /* Too short to include DNS Type and Version */
   1539 	if (os_memcmp(query + query_len - 3,
   1540 		      wpabuf_head_u8(bsrv->query) + wpabuf_len(bsrv->query) - 3,
   1541 		      3) != 0)
   1542 		return 0; /* Mismatch in DNS Type or Version */
   1543 	if (query_len == wpabuf_len(bsrv->query) &&
   1544 	    os_memcmp(query, wpabuf_head(bsrv->query), query_len - 3) == 0)
   1545 		return 1; /* Binary match */
   1546 
   1547 	if (p2p_sd_dns_uncompress(str_rx, sizeof(str_rx), query, query_len - 3,
   1548 				  0))
   1549 		return 0; /* Failed to uncompress query */
   1550 	if (p2p_sd_dns_uncompress(str_srv, sizeof(str_srv),
   1551 				  wpabuf_head(bsrv->query),
   1552 				  wpabuf_len(bsrv->query) - 3, 0))
   1553 		return 0; /* Failed to uncompress service */
   1554 
   1555 	return os_strcmp(str_rx, str_srv) == 0;
   1556 }
   1557 
   1558 
   1559 static void wpas_sd_req_bonjour(struct wpa_supplicant *wpa_s,
   1560 				struct wpabuf *resp, u8 srv_trans_id,
   1561 				const u8 *query, size_t query_len)
   1562 {
   1563 	struct p2p_srv_bonjour *bsrv;
   1564 	u8 *len_pos;
   1565 	int matches = 0;
   1566 
   1567 	wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for Bonjour",
   1568 			  query, query_len);
   1569 	if (dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
   1570 		wpa_printf(MSG_DEBUG, "P2P: Bonjour protocol not available");
   1571 		wpas_sd_add_proto_not_avail(resp, P2P_SERV_BONJOUR,
   1572 					    srv_trans_id);
   1573 		return;
   1574 	}
   1575 
   1576 	if (query_len == 0) {
   1577 		wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
   1578 		return;
   1579 	}
   1580 
   1581 	dl_list_for_each(bsrv, &wpa_s->global->p2p_srv_bonjour,
   1582 			 struct p2p_srv_bonjour, list) {
   1583 		if (!match_bonjour_query(bsrv, query, query_len))
   1584 			continue;
   1585 
   1586 		if (wpabuf_tailroom(resp) <
   1587 		    5 + query_len + wpabuf_len(bsrv->resp))
   1588 			return;
   1589 
   1590 		matches++;
   1591 
   1592 		/* Length (to be filled) */
   1593 		len_pos = wpabuf_put(resp, 2);
   1594 		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
   1595 		wpabuf_put_u8(resp, srv_trans_id);
   1596 
   1597 		/* Status Code */
   1598 		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
   1599 		wpa_hexdump_ascii(MSG_DEBUG, "P2P: Matching Bonjour service",
   1600 				  wpabuf_head(bsrv->resp),
   1601 				  wpabuf_len(bsrv->resp));
   1602 
   1603 		/* Response Data */
   1604 		wpabuf_put_data(resp, query, query_len); /* Key */
   1605 		wpabuf_put_buf(resp, bsrv->resp); /* Value */
   1606 
   1607 		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
   1608 	}
   1609 
   1610 	if (matches == 0) {
   1611 		wpa_printf(MSG_DEBUG, "P2P: Requested Bonjour service not "
   1612 			   "available");
   1613 		if (wpabuf_tailroom(resp) < 5)
   1614 			return;
   1615 
   1616 		/* Length (to be filled) */
   1617 		len_pos = wpabuf_put(resp, 2);
   1618 		wpabuf_put_u8(resp, P2P_SERV_BONJOUR);
   1619 		wpabuf_put_u8(resp, srv_trans_id);
   1620 
   1621 		/* Status Code */
   1622 		wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
   1623 		/* Response Data: empty */
   1624 		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
   1625 			     2);
   1626 	}
   1627 }
   1628 
   1629 
   1630 static void wpas_sd_all_upnp(struct wpa_supplicant *wpa_s,
   1631 			     struct wpabuf *resp, u8 srv_trans_id)
   1632 {
   1633 	struct p2p_srv_upnp *usrv;
   1634 	u8 *len_pos;
   1635 
   1636 	wpa_printf(MSG_DEBUG, "P2P: SD Request for all UPnP services");
   1637 
   1638 	if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
   1639 		wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available");
   1640 		return;
   1641 	}
   1642 
   1643 	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
   1644 			 struct p2p_srv_upnp, list) {
   1645 		if (wpabuf_tailroom(resp) < 5 + 1 + os_strlen(usrv->service))
   1646 			return;
   1647 
   1648 		/* Length (to be filled) */
   1649 		len_pos = wpabuf_put(resp, 2);
   1650 		wpabuf_put_u8(resp, P2P_SERV_UPNP);
   1651 		wpabuf_put_u8(resp, srv_trans_id);
   1652 
   1653 		/* Status Code */
   1654 		wpabuf_put_u8(resp, P2P_SD_SUCCESS);
   1655 		/* Response Data */
   1656 		wpabuf_put_u8(resp, usrv->version);
   1657 		wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s",
   1658 			   usrv->service);
   1659 		wpabuf_put_str(resp, usrv->service);
   1660 		WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos -
   1661 			     2);
   1662 	}
   1663 }
   1664 
   1665 
   1666 static void wpas_sd_req_upnp(struct wpa_supplicant *wpa_s,
   1667 			     struct wpabuf *resp, u8 srv_trans_id,
   1668 			     const u8 *query, size_t query_len)
   1669 {
   1670 	struct p2p_srv_upnp *usrv;
   1671 	u8 *len_pos;
   1672 	u8 version;
   1673 	char *str;
   1674 	int count = 0;
   1675 
   1676 	wpa_hexdump_ascii(MSG_DEBUG, "P2P: SD Request for UPnP",
   1677 			  query, query_len);
   1678 
   1679 	if (dl_list_empty(&wpa_s->global->p2p_srv_upnp)) {
   1680 		wpa_printf(MSG_DEBUG, "P2P: UPnP protocol not available");
   1681 		wpas_sd_add_proto_not_avail(resp, P2P_SERV_UPNP,
   1682 					    srv_trans_id);
   1683 		return;
   1684 	}
   1685 
   1686 	if (query_len == 0) {
   1687 		wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
   1688 		return;
   1689 	}
   1690 
   1691 	if (wpabuf_tailroom(resp) < 5)
   1692 		return;
   1693 
   1694 	/* Length (to be filled) */
   1695 	len_pos = wpabuf_put(resp, 2);
   1696 	wpabuf_put_u8(resp, P2P_SERV_UPNP);
   1697 	wpabuf_put_u8(resp, srv_trans_id);
   1698 
   1699 	version = query[0];
   1700 	str = os_malloc(query_len);
   1701 	if (str == NULL)
   1702 		return;
   1703 	os_memcpy(str, query + 1, query_len - 1);
   1704 	str[query_len - 1] = '\0';
   1705 
   1706 	dl_list_for_each(usrv, &wpa_s->global->p2p_srv_upnp,
   1707 			 struct p2p_srv_upnp, list) {
   1708 		if (version != usrv->version)
   1709 			continue;
   1710 
   1711 		if (os_strcmp(str, "ssdp:all") != 0 &&
   1712 		    os_strstr(usrv->service, str) == NULL)
   1713 			continue;
   1714 
   1715 		if (wpabuf_tailroom(resp) < 2)
   1716 			break;
   1717 		if (count == 0) {
   1718 			/* Status Code */
   1719 			wpabuf_put_u8(resp, P2P_SD_SUCCESS);
   1720 			/* Response Data */
   1721 			wpabuf_put_u8(resp, version);
   1722 		} else
   1723 			wpabuf_put_u8(resp, ',');
   1724 
   1725 		count++;
   1726 
   1727 		wpa_printf(MSG_DEBUG, "P2P: Matching UPnP Service: %s",
   1728 			   usrv->service);
   1729 		if (wpabuf_tailroom(resp) < os_strlen(usrv->service))
   1730 			break;
   1731 		wpabuf_put_str(resp, usrv->service);
   1732 	}
   1733 	os_free(str);
   1734 
   1735 	if (count == 0) {
   1736 		wpa_printf(MSG_DEBUG, "P2P: Requested UPnP service not "
   1737 			   "available");
   1738 		/* Status Code */
   1739 		wpabuf_put_u8(resp, P2P_SD_REQUESTED_INFO_NOT_AVAILABLE);
   1740 		/* Response Data: empty */
   1741 	}
   1742 
   1743 	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
   1744 }
   1745 
   1746 
   1747 #ifdef CONFIG_WIFI_DISPLAY
   1748 static void wpas_sd_req_wfd(struct wpa_supplicant *wpa_s,
   1749 			    struct wpabuf *resp, u8 srv_trans_id,
   1750 			    const u8 *query, size_t query_len)
   1751 {
   1752 	const u8 *pos;
   1753 	u8 role;
   1754 	u8 *len_pos;
   1755 
   1756 	wpa_hexdump(MSG_DEBUG, "P2P: SD Request for WFD", query, query_len);
   1757 
   1758 	if (!wpa_s->global->wifi_display) {
   1759 		wpa_printf(MSG_DEBUG, "P2P: WFD protocol not available");
   1760 		wpas_sd_add_proto_not_avail(resp, P2P_SERV_WIFI_DISPLAY,
   1761 					    srv_trans_id);
   1762 		return;
   1763 	}
   1764 
   1765 	if (query_len < 1) {
   1766 		wpa_printf(MSG_DEBUG, "P2P: Missing WFD Requested Device "
   1767 			   "Role");
   1768 		return;
   1769 	}
   1770 
   1771 	if (wpabuf_tailroom(resp) < 5)
   1772 		return;
   1773 
   1774 	pos = query;
   1775 	role = *pos++;
   1776 	wpa_printf(MSG_DEBUG, "P2P: WSD for device role 0x%x", role);
   1777 
   1778 	/* TODO: role specific handling */
   1779 
   1780 	/* Length (to be filled) */
   1781 	len_pos = wpabuf_put(resp, 2);
   1782 	wpabuf_put_u8(resp, P2P_SERV_WIFI_DISPLAY);
   1783 	wpabuf_put_u8(resp, srv_trans_id);
   1784 	wpabuf_put_u8(resp, P2P_SD_SUCCESS); /* Status Code */
   1785 
   1786 	while (pos < query + query_len) {
   1787 		if (*pos < MAX_WFD_SUBELEMS &&
   1788 		    wpa_s->global->wfd_subelem[*pos] &&
   1789 		    wpabuf_tailroom(resp) >=
   1790 		    wpabuf_len(wpa_s->global->wfd_subelem[*pos])) {
   1791 			wpa_printf(MSG_DEBUG, "P2P: Add WSD response "
   1792 				   "subelement %u", *pos);
   1793 			wpabuf_put_buf(resp, wpa_s->global->wfd_subelem[*pos]);
   1794 		}
   1795 		pos++;
   1796 	}
   1797 
   1798 	WPA_PUT_LE16(len_pos, (u8 *) wpabuf_put(resp, 0) - len_pos - 2);
   1799 }
   1800 #endif /* CONFIG_WIFI_DISPLAY */
   1801 
   1802 
   1803 void wpas_sd_request(void *ctx, int freq, const u8 *sa, u8 dialog_token,
   1804 		     u16 update_indic, const u8 *tlvs, size_t tlvs_len)
   1805 {
   1806 	struct wpa_supplicant *wpa_s = ctx;
   1807 	const u8 *pos = tlvs;
   1808 	const u8 *end = tlvs + tlvs_len;
   1809 	const u8 *tlv_end;
   1810 	u16 slen;
   1811 	struct wpabuf *resp;
   1812 	u8 srv_proto, srv_trans_id;
   1813 	size_t buf_len;
   1814 	char *buf;
   1815 
   1816 	wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Request TLVs",
   1817 		    tlvs, tlvs_len);
   1818 	buf_len = 2 * tlvs_len + 1;
   1819 	buf = os_malloc(buf_len);
   1820 	if (buf) {
   1821 		wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
   1822 		wpa_msg_ctrl(wpa_s, MSG_INFO, P2P_EVENT_SERV_DISC_REQ "%d "
   1823 			     MACSTR " %u %u %s",
   1824 			     freq, MAC2STR(sa), dialog_token, update_indic,
   1825 			     buf);
   1826 		os_free(buf);
   1827 	}
   1828 
   1829 	if (wpa_s->p2p_sd_over_ctrl_iface) {
   1830 		wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
   1831 					   update_indic, tlvs, tlvs_len);
   1832 		return; /* to be processed by an external program */
   1833 	}
   1834 
   1835 	resp = wpabuf_alloc(10000);
   1836 	if (resp == NULL)
   1837 		return;
   1838 
   1839 	while (pos + 1 < end) {
   1840 		wpa_printf(MSG_DEBUG, "P2P: Service Request TLV");
   1841 		slen = WPA_GET_LE16(pos);
   1842 		pos += 2;
   1843 		if (pos + slen > end || slen < 2) {
   1844 			wpa_printf(MSG_DEBUG, "P2P: Unexpected Query Data "
   1845 				   "length");
   1846 			wpabuf_free(resp);
   1847 			return;
   1848 		}
   1849 		tlv_end = pos + slen;
   1850 
   1851 		srv_proto = *pos++;
   1852 		wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u",
   1853 			   srv_proto);
   1854 		srv_trans_id = *pos++;
   1855 		wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u",
   1856 			   srv_trans_id);
   1857 
   1858 		wpa_hexdump(MSG_MSGDUMP, "P2P: Query Data",
   1859 			    pos, tlv_end - pos);
   1860 
   1861 
   1862 		if (wpa_s->force_long_sd) {
   1863 			wpa_printf(MSG_DEBUG, "P2P: SD test - force long "
   1864 				   "response");
   1865 			wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
   1866 			wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
   1867 			goto done;
   1868 		}
   1869 
   1870 		switch (srv_proto) {
   1871 		case P2P_SERV_ALL_SERVICES:
   1872 			wpa_printf(MSG_DEBUG, "P2P: Service Discovery Request "
   1873 				   "for all services");
   1874 			if (dl_list_empty(&wpa_s->global->p2p_srv_upnp) &&
   1875 			    dl_list_empty(&wpa_s->global->p2p_srv_bonjour)) {
   1876 				wpa_printf(MSG_DEBUG, "P2P: No service "
   1877 					   "discovery protocols available");
   1878 				wpas_sd_add_proto_not_avail(
   1879 					resp, P2P_SERV_ALL_SERVICES,
   1880 					srv_trans_id);
   1881 				break;
   1882 			}
   1883 			wpas_sd_all_bonjour(wpa_s, resp, srv_trans_id);
   1884 			wpas_sd_all_upnp(wpa_s, resp, srv_trans_id);
   1885 			break;
   1886 		case P2P_SERV_BONJOUR:
   1887 			wpas_sd_req_bonjour(wpa_s, resp, srv_trans_id,
   1888 					    pos, tlv_end - pos);
   1889 			break;
   1890 		case P2P_SERV_UPNP:
   1891 			wpas_sd_req_upnp(wpa_s, resp, srv_trans_id,
   1892 					 pos, tlv_end - pos);
   1893 			break;
   1894 #ifdef CONFIG_WIFI_DISPLAY
   1895 		case P2P_SERV_WIFI_DISPLAY:
   1896 			wpas_sd_req_wfd(wpa_s, resp, srv_trans_id,
   1897 					pos, tlv_end - pos);
   1898 			break;
   1899 #endif /* CONFIG_WIFI_DISPLAY */
   1900 		default:
   1901 			wpa_printf(MSG_DEBUG, "P2P: Unavailable service "
   1902 				   "protocol %u", srv_proto);
   1903 			wpas_sd_add_proto_not_avail(resp, srv_proto,
   1904 						    srv_trans_id);
   1905 			break;
   1906 		}
   1907 
   1908 		pos = tlv_end;
   1909 	}
   1910 
   1911 done:
   1912 	wpas_notify_p2p_sd_request(wpa_s, freq, sa, dialog_token,
   1913 				   update_indic, tlvs, tlvs_len);
   1914 
   1915 	wpas_p2p_sd_response(wpa_s, freq, sa, dialog_token, resp);
   1916 
   1917 	wpabuf_free(resp);
   1918 }
   1919 
   1920 
   1921 void wpas_sd_response(void *ctx, const u8 *sa, u16 update_indic,
   1922 		      const u8 *tlvs, size_t tlvs_len)
   1923 {
   1924 	struct wpa_supplicant *wpa_s = ctx;
   1925 	const u8 *pos = tlvs;
   1926 	const u8 *end = tlvs + tlvs_len;
   1927 	const u8 *tlv_end;
   1928 	u16 slen;
   1929 	size_t buf_len;
   1930 	char *buf;
   1931 
   1932 	wpa_hexdump(MSG_MSGDUMP, "P2P: Service Discovery Response TLVs",
   1933 		    tlvs, tlvs_len);
   1934 	if (tlvs_len > 1500) {
   1935 		/* TODO: better way for handling this */
   1936 		wpa_msg_ctrl(wpa_s, MSG_INFO,
   1937 			     P2P_EVENT_SERV_DISC_RESP MACSTR
   1938 			     " %u <long response: %u bytes>",
   1939 			     MAC2STR(sa), update_indic,
   1940 			     (unsigned int) tlvs_len);
   1941 	} else {
   1942 		buf_len = 2 * tlvs_len + 1;
   1943 		buf = os_malloc(buf_len);
   1944 		if (buf) {
   1945 			wpa_snprintf_hex(buf, buf_len, tlvs, tlvs_len);
   1946 			wpa_msg_ctrl(wpa_s, MSG_INFO,
   1947 				     P2P_EVENT_SERV_DISC_RESP MACSTR " %u %s",
   1948 				     MAC2STR(sa), update_indic, buf);
   1949 			os_free(buf);
   1950 		}
   1951 	}
   1952 
   1953 	while (pos < end) {
   1954 		u8 srv_proto, srv_trans_id, status;
   1955 
   1956 		wpa_printf(MSG_DEBUG, "P2P: Service Response TLV");
   1957 		slen = WPA_GET_LE16(pos);
   1958 		pos += 2;
   1959 		if (pos + slen > end || slen < 3) {
   1960 			wpa_printf(MSG_DEBUG, "P2P: Unexpected Response Data "
   1961 				   "length");
   1962 			return;
   1963 		}
   1964 		tlv_end = pos + slen;
   1965 
   1966 		srv_proto = *pos++;
   1967 		wpa_printf(MSG_DEBUG, "P2P: Service Protocol Type %u",
   1968 			   srv_proto);
   1969 		srv_trans_id = *pos++;
   1970 		wpa_printf(MSG_DEBUG, "P2P: Service Transaction ID %u",
   1971 			   srv_trans_id);
   1972 		status = *pos++;
   1973 		wpa_printf(MSG_DEBUG, "P2P: Status Code ID %u",
   1974 			   status);
   1975 
   1976 		wpa_hexdump(MSG_MSGDUMP, "P2P: Response Data",
   1977 			    pos, tlv_end - pos);
   1978 
   1979 		pos = tlv_end;
   1980 	}
   1981 
   1982 	wpas_notify_p2p_sd_response(wpa_s, sa, update_indic, tlvs, tlvs_len);
   1983 }
   1984 
   1985 
   1986 u64 wpas_p2p_sd_request(struct wpa_supplicant *wpa_s, const u8 *dst,
   1987 			const struct wpabuf *tlvs)
   1988 {
   1989 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   1990 		return wpa_drv_p2p_sd_request(wpa_s, dst, tlvs);
   1991 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   1992 		return 0;
   1993 	return (uintptr_t) p2p_sd_request(wpa_s->global->p2p, dst, tlvs);
   1994 }
   1995 
   1996 
   1997 u64 wpas_p2p_sd_request_upnp(struct wpa_supplicant *wpa_s, const u8 *dst,
   1998 			     u8 version, const char *query)
   1999 {
   2000 	struct wpabuf *tlvs;
   2001 	u64 ret;
   2002 
   2003 	tlvs = wpabuf_alloc(2 + 1 + 1 + 1 + os_strlen(query));
   2004 	if (tlvs == NULL)
   2005 		return 0;
   2006 	wpabuf_put_le16(tlvs, 1 + 1 + 1 + os_strlen(query));
   2007 	wpabuf_put_u8(tlvs, P2P_SERV_UPNP); /* Service Protocol Type */
   2008 	wpabuf_put_u8(tlvs, 1); /* Service Transaction ID */
   2009 	wpabuf_put_u8(tlvs, version);
   2010 	wpabuf_put_str(tlvs, query);
   2011 	ret = wpas_p2p_sd_request(wpa_s, dst, tlvs);
   2012 	wpabuf_free(tlvs);
   2013 	return ret;
   2014 }
   2015 
   2016 
   2017 #ifdef CONFIG_WIFI_DISPLAY
   2018 
   2019 static u64 wpas_p2p_sd_request_wfd(struct wpa_supplicant *wpa_s, const u8 *dst,
   2020 				   const struct wpabuf *tlvs)
   2021 {
   2022 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   2023 		return 0;
   2024 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   2025 		return 0;
   2026 	return (uintptr_t) p2p_sd_request_wfd(wpa_s->global->p2p, dst, tlvs);
   2027 }
   2028 
   2029 
   2030 #define MAX_WFD_SD_SUBELEMS 20
   2031 
   2032 static void wfd_add_sd_req_role(struct wpabuf *tlvs, u8 id, u8 role,
   2033 				const char *subelems)
   2034 {
   2035 	u8 *len;
   2036 	const char *pos;
   2037 	int val;
   2038 	int count = 0;
   2039 
   2040 	len = wpabuf_put(tlvs, 2);
   2041 	wpabuf_put_u8(tlvs, P2P_SERV_WIFI_DISPLAY); /* Service Protocol Type */
   2042 	wpabuf_put_u8(tlvs, id); /* Service Transaction ID */
   2043 
   2044 	wpabuf_put_u8(tlvs, role);
   2045 
   2046 	pos = subelems;
   2047 	while (*pos) {
   2048 		val = atoi(pos);
   2049 		if (val >= 0 && val < 256) {
   2050 			wpabuf_put_u8(tlvs, val);
   2051 			count++;
   2052 			if (count == MAX_WFD_SD_SUBELEMS)
   2053 				break;
   2054 		}
   2055 		pos = os_strchr(pos + 1, ',');
   2056 		if (pos == NULL)
   2057 			break;
   2058 		pos++;
   2059 	}
   2060 
   2061 	WPA_PUT_LE16(len, (u8 *) wpabuf_put(tlvs, 0) - len - 2);
   2062 }
   2063 
   2064 
   2065 u64 wpas_p2p_sd_request_wifi_display(struct wpa_supplicant *wpa_s,
   2066 				     const u8 *dst, const char *role)
   2067 {
   2068 	struct wpabuf *tlvs;
   2069 	u64 ret;
   2070 	const char *subelems;
   2071 	u8 id = 1;
   2072 
   2073 	subelems = os_strchr(role, ' ');
   2074 	if (subelems == NULL)
   2075 		return 0;
   2076 	subelems++;
   2077 
   2078 	tlvs = wpabuf_alloc(4 * (2 + 1 + 1 + 1 + MAX_WFD_SD_SUBELEMS));
   2079 	if (tlvs == NULL)
   2080 		return 0;
   2081 
   2082 	if (os_strstr(role, "[source]"))
   2083 		wfd_add_sd_req_role(tlvs, id++, 0x00, subelems);
   2084 	if (os_strstr(role, "[pri-sink]"))
   2085 		wfd_add_sd_req_role(tlvs, id++, 0x01, subelems);
   2086 	if (os_strstr(role, "[sec-sink]"))
   2087 		wfd_add_sd_req_role(tlvs, id++, 0x02, subelems);
   2088 	if (os_strstr(role, "[source+sink]"))
   2089 		wfd_add_sd_req_role(tlvs, id++, 0x03, subelems);
   2090 
   2091 	ret = wpas_p2p_sd_request_wfd(wpa_s, dst, tlvs);
   2092 	wpabuf_free(tlvs);
   2093 	return ret;
   2094 }
   2095 
   2096 #endif /* CONFIG_WIFI_DISPLAY */
   2097 
   2098 
   2099 int wpas_p2p_sd_cancel_request(struct wpa_supplicant *wpa_s, u64 req)
   2100 {
   2101 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   2102 		return wpa_drv_p2p_sd_cancel_request(wpa_s, req);
   2103 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   2104 		return -1;
   2105 	return p2p_sd_cancel_request(wpa_s->global->p2p,
   2106 				     (void *) (uintptr_t) req);
   2107 }
   2108 
   2109 
   2110 void wpas_p2p_sd_response(struct wpa_supplicant *wpa_s, int freq,
   2111 			  const u8 *dst, u8 dialog_token,
   2112 			  const struct wpabuf *resp_tlvs)
   2113 {
   2114 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   2115 		wpa_drv_p2p_sd_response(wpa_s, freq, dst, dialog_token,
   2116 					resp_tlvs);
   2117 		return;
   2118 	}
   2119 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   2120 		return;
   2121 	p2p_sd_response(wpa_s->global->p2p, freq, dst, dialog_token,
   2122 			resp_tlvs);
   2123 }
   2124 
   2125 #ifdef ANDROID_P2P
   2126 void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s, int action)
   2127 #else
   2128 void wpas_p2p_sd_service_update(struct wpa_supplicant *wpa_s)
   2129 #endif
   2130 {
   2131 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   2132 		wpa_drv_p2p_service_update(wpa_s);
   2133 		return;
   2134 	}
   2135 	if (wpa_s->global->p2p)
   2136 #ifdef ANDROID_P2P
   2137 		p2p_sd_service_update(wpa_s->global->p2p, action);
   2138 #else
   2139 		p2p_sd_service_update(wpa_s->global->p2p);
   2140 #endif
   2141 }
   2142 
   2143 
   2144 static void wpas_p2p_srv_bonjour_free(struct p2p_srv_bonjour *bsrv)
   2145 {
   2146 	dl_list_del(&bsrv->list);
   2147 	wpabuf_free(bsrv->query);
   2148 	wpabuf_free(bsrv->resp);
   2149 	os_free(bsrv);
   2150 }
   2151 
   2152 
   2153 static void wpas_p2p_srv_upnp_free(struct p2p_srv_upnp *usrv)
   2154 {
   2155 	dl_list_del(&usrv->list);
   2156 	os_free(usrv->service);
   2157 	os_free(usrv);
   2158 }
   2159 
   2160 
   2161 void wpas_p2p_service_flush(struct wpa_supplicant *wpa_s)
   2162 {
   2163 	struct p2p_srv_bonjour *bsrv, *bn;
   2164 	struct p2p_srv_upnp *usrv, *un;
   2165 
   2166 	dl_list_for_each_safe(bsrv, bn, &wpa_s->global->p2p_srv_bonjour,
   2167 			      struct p2p_srv_bonjour, list)
   2168 		wpas_p2p_srv_bonjour_free(bsrv);
   2169 
   2170 	dl_list_for_each_safe(usrv, un, &wpa_s->global->p2p_srv_upnp,
   2171 			      struct p2p_srv_upnp, list)
   2172 		wpas_p2p_srv_upnp_free(usrv);
   2173 
   2174 #ifdef ANDROID_P2P
   2175 	wpas_p2p_sd_service_update(wpa_s, SRV_FLUSH);
   2176 #else
   2177 	wpas_p2p_sd_service_update(wpa_s);
   2178 #endif
   2179 }
   2180 
   2181 
   2182 int wpas_p2p_service_add_bonjour(struct wpa_supplicant *wpa_s,
   2183 				 struct wpabuf *query, struct wpabuf *resp)
   2184 {
   2185 	struct p2p_srv_bonjour *bsrv;
   2186 
   2187 	bsrv = os_zalloc(sizeof(*bsrv));
   2188 	if (bsrv == NULL)
   2189 		return -1;
   2190 	bsrv->query = query;
   2191 	bsrv->resp = resp;
   2192 	dl_list_add(&wpa_s->global->p2p_srv_bonjour, &bsrv->list);
   2193 
   2194 #ifdef ANDROID_P2P
   2195 	wpas_p2p_sd_service_update(wpa_s, SRV_ADD);
   2196 #else
   2197 	wpas_p2p_sd_service_update(wpa_s);
   2198 #endif
   2199 	return 0;
   2200 }
   2201 
   2202 
   2203 int wpas_p2p_service_del_bonjour(struct wpa_supplicant *wpa_s,
   2204 				 const struct wpabuf *query)
   2205 {
   2206 	struct p2p_srv_bonjour *bsrv;
   2207 
   2208 	bsrv = wpas_p2p_service_get_bonjour(wpa_s, query);
   2209 	if (bsrv == NULL)
   2210 		return -1;
   2211 	wpas_p2p_srv_bonjour_free(bsrv);
   2212 #ifdef ANDROID_P2P
   2213 	wpas_p2p_sd_service_update(wpa_s, SRV_DEL);
   2214 #else
   2215 	wpas_p2p_sd_service_update(wpa_s);
   2216 #endif
   2217 	return 0;
   2218 }
   2219 
   2220 
   2221 int wpas_p2p_service_add_upnp(struct wpa_supplicant *wpa_s, u8 version,
   2222 			      const char *service)
   2223 {
   2224 	struct p2p_srv_upnp *usrv;
   2225 
   2226 	if (wpas_p2p_service_get_upnp(wpa_s, version, service))
   2227 		return 0; /* Already listed */
   2228 	usrv = os_zalloc(sizeof(*usrv));
   2229 	if (usrv == NULL)
   2230 		return -1;
   2231 	usrv->version = version;
   2232 	usrv->service = os_strdup(service);
   2233 	if (usrv->service == NULL) {
   2234 		os_free(usrv);
   2235 		return -1;
   2236 	}
   2237 	dl_list_add(&wpa_s->global->p2p_srv_upnp, &usrv->list);
   2238 
   2239 #ifdef ANDROID_P2P
   2240 	wpas_p2p_sd_service_update(wpa_s, SRV_ADD);
   2241 #else
   2242 	wpas_p2p_sd_service_update(wpa_s);
   2243 #endif
   2244 	return 0;
   2245 }
   2246 
   2247 
   2248 int wpas_p2p_service_del_upnp(struct wpa_supplicant *wpa_s, u8 version,
   2249 			      const char *service)
   2250 {
   2251 	struct p2p_srv_upnp *usrv;
   2252 
   2253 	usrv = wpas_p2p_service_get_upnp(wpa_s, version, service);
   2254 	if (usrv == NULL)
   2255 		return -1;
   2256 	wpas_p2p_srv_upnp_free(usrv);
   2257 #ifdef ANDROID_P2P
   2258 	wpas_p2p_sd_service_update(wpa_s, SRV_DEL);
   2259 #else
   2260 	wpas_p2p_sd_service_update(wpa_s);
   2261 #endif
   2262 	return 0;
   2263 }
   2264 
   2265 
   2266 static void wpas_prov_disc_local_display(struct wpa_supplicant *wpa_s,
   2267 					 const u8 *peer, const char *params,
   2268 					 unsigned int generated_pin)
   2269 {
   2270 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_SHOW_PIN MACSTR " %08d%s",
   2271 		MAC2STR(peer), generated_pin, params);
   2272 }
   2273 
   2274 
   2275 static void wpas_prov_disc_local_keypad(struct wpa_supplicant *wpa_s,
   2276 					const u8 *peer, const char *params)
   2277 {
   2278 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_ENTER_PIN MACSTR "%s",
   2279 		MAC2STR(peer), params);
   2280 }
   2281 
   2282 
   2283 void wpas_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods,
   2284 			const u8 *dev_addr, const u8 *pri_dev_type,
   2285 			const char *dev_name, u16 supp_config_methods,
   2286 			u8 dev_capab, u8 group_capab, const u8 *group_id,
   2287 			size_t group_id_len)
   2288 {
   2289 	struct wpa_supplicant *wpa_s = ctx;
   2290 	char devtype[WPS_DEV_TYPE_BUFSIZE];
   2291 	char params[300];
   2292 	u8 empty_dev_type[8];
   2293 	unsigned int generated_pin = 0;
   2294 	struct wpa_supplicant *group = NULL;
   2295 
   2296 	if (group_id) {
   2297 		for (group = wpa_s->global->ifaces; group; group = group->next)
   2298 		{
   2299 			struct wpa_ssid *s = group->current_ssid;
   2300 			if (s != NULL &&
   2301 			    s->mode == WPAS_MODE_P2P_GO &&
   2302 			    group_id_len - ETH_ALEN == s->ssid_len &&
   2303 			    os_memcmp(group_id + ETH_ALEN, s->ssid,
   2304 				      s->ssid_len) == 0)
   2305 				break;
   2306 		}
   2307 	}
   2308 
   2309 	if (pri_dev_type == NULL) {
   2310 		os_memset(empty_dev_type, 0, sizeof(empty_dev_type));
   2311 		pri_dev_type = empty_dev_type;
   2312 	}
   2313 	os_snprintf(params, sizeof(params), " p2p_dev_addr=" MACSTR
   2314 		    " pri_dev_type=%s name='%s' config_methods=0x%x "
   2315 		    "dev_capab=0x%x group_capab=0x%x%s%s",
   2316 		    MAC2STR(dev_addr),
   2317 		    wps_dev_type_bin2str(pri_dev_type, devtype,
   2318 					 sizeof(devtype)),
   2319 		    dev_name, supp_config_methods, dev_capab, group_capab,
   2320 		    group ? " group=" : "",
   2321 		    group ? group->ifname : "");
   2322 	params[sizeof(params) - 1] = '\0';
   2323 
   2324 	if (config_methods & WPS_CONFIG_DISPLAY) {
   2325 		generated_pin = wps_generate_pin();
   2326 		wpas_prov_disc_local_display(wpa_s, peer, params,
   2327 					     generated_pin);
   2328 	} else if (config_methods & WPS_CONFIG_KEYPAD)
   2329 		wpas_prov_disc_local_keypad(wpa_s, peer, params);
   2330 	else if (config_methods & WPS_CONFIG_PUSHBUTTON)
   2331 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_REQ MACSTR
   2332 			"%s", MAC2STR(peer), params);
   2333 
   2334 	wpas_notify_p2p_provision_discovery(wpa_s, peer, 1 /* request */,
   2335 					    P2P_PROV_DISC_SUCCESS,
   2336 					    config_methods, generated_pin);
   2337 }
   2338 
   2339 
   2340 void wpas_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods)
   2341 {
   2342 	struct wpa_supplicant *wpa_s = ctx;
   2343 	unsigned int generated_pin = 0;
   2344 	char params[20];
   2345 
   2346 	if (wpa_s->pending_pd_before_join &&
   2347 	    (os_memcmp(peer, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
   2348 	     os_memcmp(peer, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0)) {
   2349 		wpa_s->pending_pd_before_join = 0;
   2350 		wpa_printf(MSG_DEBUG, "P2P: Starting pending "
   2351 			   "join-existing-group operation");
   2352 		wpas_p2p_join_start(wpa_s);
   2353 		return;
   2354 	}
   2355 
   2356 	if (wpa_s->pending_pd_use == AUTO_PD_JOIN ||
   2357 	    wpa_s->pending_pd_use == AUTO_PD_GO_NEG)
   2358 		os_snprintf(params, sizeof(params), " peer_go=%d",
   2359 			    wpa_s->pending_pd_use == AUTO_PD_JOIN);
   2360 	else
   2361 		params[0] = '\0';
   2362 
   2363 	if (config_methods & WPS_CONFIG_DISPLAY)
   2364 		wpas_prov_disc_local_keypad(wpa_s, peer, params);
   2365 	else if (config_methods & WPS_CONFIG_KEYPAD) {
   2366 		generated_pin = wps_generate_pin();
   2367 		wpas_prov_disc_local_display(wpa_s, peer, params,
   2368 					     generated_pin);
   2369 	} else if (config_methods & WPS_CONFIG_PUSHBUTTON)
   2370 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_RESP MACSTR
   2371 			"%s", MAC2STR(peer), params);
   2372 
   2373 	wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
   2374 					    P2P_PROV_DISC_SUCCESS,
   2375 					    config_methods, generated_pin);
   2376 }
   2377 
   2378 
   2379 static void wpas_prov_disc_fail(void *ctx, const u8 *peer,
   2380 				enum p2p_prov_disc_status status)
   2381 {
   2382 	struct wpa_supplicant *wpa_s = ctx;
   2383 
   2384 	if (wpa_s->p2p_fallback_to_go_neg) {
   2385 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: PD for p2p_connect-auto "
   2386 			"failed - fall back to GO Negotiation");
   2387 		wpas_p2p_fallback_to_go_neg(wpa_s, 0);
   2388 		return;
   2389 	}
   2390 
   2391 	if (status == P2P_PROV_DISC_TIMEOUT_JOIN) {
   2392 		wpa_s->pending_pd_before_join = 0;
   2393 		wpa_printf(MSG_DEBUG, "P2P: Starting pending "
   2394 			   "join-existing-group operation (no ACK for PD "
   2395 			   "Req attempts)");
   2396 		wpas_p2p_join_start(wpa_s);
   2397 		return;
   2398 	}
   2399 
   2400 	wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
   2401 		" p2p_dev_addr=" MACSTR " status=%d",
   2402 		MAC2STR(peer), status);
   2403 
   2404 	wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
   2405 					    status, 0, 0);
   2406 }
   2407 
   2408 
   2409 static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid,
   2410 				  const u8 *go_dev_addr, const u8 *ssid,
   2411 				  size_t ssid_len, int *go, u8 *group_bssid,
   2412 				  int *force_freq, int persistent_group)
   2413 {
   2414 	struct wpa_supplicant *wpa_s = ctx;
   2415 	struct wpa_ssid *s;
   2416 	u8 cur_bssid[ETH_ALEN];
   2417 	int res;
   2418 	struct wpa_supplicant *grp;
   2419 
   2420 	if (!persistent_group) {
   2421 		wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
   2422 			   " to join an active group", MAC2STR(sa));
   2423 		if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
   2424 		    (os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN)
   2425 		     == 0 ||
   2426 		     os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0)) {
   2427 			wpa_printf(MSG_DEBUG, "P2P: Accept previously "
   2428 				   "authorized invitation");
   2429 			goto accept_inv;
   2430 		}
   2431 		/*
   2432 		 * Do not accept the invitation automatically; notify user and
   2433 		 * request approval.
   2434 		 */
   2435 		return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
   2436 	}
   2437 
   2438 	grp = wpas_get_p2p_group(wpa_s, ssid, ssid_len, go);
   2439 	if (grp) {
   2440 		wpa_printf(MSG_DEBUG, "P2P: Accept invitation to already "
   2441 			   "running persistent group");
   2442 		if (*go)
   2443 			os_memcpy(group_bssid, grp->own_addr, ETH_ALEN);
   2444 		goto accept_inv;
   2445 	}
   2446 
   2447 	if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
   2448 	    os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0) {
   2449 		wpa_printf(MSG_DEBUG, "P2P: Accept previously initiated "
   2450 			   "invitation to re-invoke a persistent group");
   2451 	} else if (!wpa_s->conf->persistent_reconnect)
   2452 		return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
   2453 
   2454 	for (s = wpa_s->conf->ssid; s; s = s->next) {
   2455 		if (s->disabled == 2 &&
   2456 		    os_memcmp(s->bssid, go_dev_addr, ETH_ALEN) == 0 &&
   2457 		    s->ssid_len == ssid_len &&
   2458 		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
   2459 			break;
   2460 	}
   2461 
   2462 	if (!s) {
   2463 		wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
   2464 			   " requested reinvocation of an unknown group",
   2465 			   MAC2STR(sa));
   2466 		return P2P_SC_FAIL_UNKNOWN_GROUP;
   2467 	}
   2468 
   2469 	if (s->mode == WPAS_MODE_P2P_GO && !wpas_p2p_create_iface(wpa_s)) {
   2470 		*go = 1;
   2471 		if (wpa_s->wpa_state >= WPA_AUTHENTICATING) {
   2472 			wpa_printf(MSG_DEBUG, "P2P: The only available "
   2473 				   "interface is already in use - reject "
   2474 				   "invitation");
   2475 			return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
   2476 		}
   2477 		os_memcpy(group_bssid, wpa_s->own_addr, ETH_ALEN);
   2478 	} else if (s->mode == WPAS_MODE_P2P_GO) {
   2479 		*go = 1;
   2480 		if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO) < 0)
   2481 		{
   2482 			wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
   2483 				   "interface address for the group");
   2484 			return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
   2485 		}
   2486 		os_memcpy(group_bssid, wpa_s->pending_interface_addr,
   2487 			  ETH_ALEN);
   2488 	}
   2489 
   2490 accept_inv:
   2491 	wpas_p2p_set_own_freq_preference(wpa_s, 0);
   2492 
   2493 	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, cur_bssid) == 0 &&
   2494 	    wpa_s->assoc_freq) {
   2495 		wpa_printf(MSG_DEBUG, "P2P: Trying to force channel to match "
   2496 			   "the channel we are already using");
   2497 		*force_freq = wpa_s->assoc_freq;
   2498 		wpas_p2p_set_own_freq_preference(wpa_s, wpa_s->assoc_freq);
   2499 	}
   2500 
   2501 	res = wpa_drv_shared_freq(wpa_s);
   2502 	if (res > 0) {
   2503 		wpa_printf(MSG_DEBUG, "P2P: Trying to force channel to match "
   2504 			   "with the channel we are already using on a "
   2505 			   "shared interface");
   2506 		*force_freq = res;
   2507 		wpas_p2p_set_own_freq_preference(wpa_s, res);
   2508 	}
   2509 
   2510 	return P2P_SC_SUCCESS;
   2511 }
   2512 
   2513 
   2514 static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
   2515 				     const u8 *ssid, size_t ssid_len,
   2516 				     const u8 *go_dev_addr, u8 status,
   2517 				     int op_freq)
   2518 {
   2519 	struct wpa_supplicant *wpa_s = ctx;
   2520 	struct wpa_ssid *s;
   2521 
   2522 	for (s = wpa_s->conf->ssid; s; s = s->next) {
   2523 		if (s->disabled == 2 &&
   2524 		    s->ssid_len == ssid_len &&
   2525 		    os_memcmp(ssid, s->ssid, ssid_len) == 0)
   2526 			break;
   2527 	}
   2528 
   2529 	if (status == P2P_SC_SUCCESS) {
   2530 		wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
   2531 			   " was accepted; op_freq=%d MHz",
   2532 			   MAC2STR(sa), op_freq);
   2533 		if (s) {
   2534 			int go = s->mode == WPAS_MODE_P2P_GO;
   2535 			wpas_p2p_group_add_persistent(
   2536 				wpa_s, s, go, go ? op_freq : 0, 0, NULL);
   2537 		} else if (bssid) {
   2538 			wpa_s->user_initiated_pd = 0;
   2539 			wpas_p2p_join(wpa_s, bssid, go_dev_addr,
   2540 				      wpa_s->p2p_wps_method, 0);
   2541 		}
   2542 		return;
   2543 	}
   2544 
   2545 	if (status != P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
   2546 		wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
   2547 			   " was rejected (status %u)", MAC2STR(sa), status);
   2548 		return;
   2549 	}
   2550 
   2551 	if (!s) {
   2552 		if (bssid) {
   2553 			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
   2554 				"sa=" MACSTR " go_dev_addr=" MACSTR
   2555 				" bssid=" MACSTR " unknown-network",
   2556 				MAC2STR(sa), MAC2STR(go_dev_addr),
   2557 				MAC2STR(bssid));
   2558 		} else {
   2559 			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
   2560 				"sa=" MACSTR " go_dev_addr=" MACSTR
   2561 				" unknown-network",
   2562 				MAC2STR(sa), MAC2STR(go_dev_addr));
   2563 		}
   2564 		return;
   2565 	}
   2566 
   2567 	if (s->mode == WPAS_MODE_P2P_GO && op_freq) {
   2568 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED "sa="
   2569 			MACSTR " persistent=%d freq=%d",
   2570 			MAC2STR(sa), s->id, op_freq);
   2571 	} else {
   2572 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED "sa="
   2573 			MACSTR " persistent=%d", MAC2STR(sa), s->id);
   2574 	}
   2575 }
   2576 
   2577 
   2578 static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
   2579 					struct wpa_ssid *ssid,
   2580 					const u8 *peer)
   2581 {
   2582 	size_t i;
   2583 
   2584 	if (ssid == NULL)
   2585 		return;
   2586 
   2587 	for (i = 0; ssid->p2p_client_list && i < ssid->num_p2p_clients; i++) {
   2588 		if (os_memcmp(ssid->p2p_client_list + i * ETH_ALEN, peer,
   2589 			      ETH_ALEN) == 0)
   2590 			break;
   2591 	}
   2592 	if (i >= ssid->num_p2p_clients) {
   2593 		if (ssid->mode != WPAS_MODE_P2P_GO &&
   2594 		    os_memcmp(ssid->bssid, peer, ETH_ALEN) == 0) {
   2595 			wpa_printf(MSG_DEBUG, "P2P: Remove persistent group %d "
   2596 				   "due to invitation result", ssid->id);
   2597 			wpas_notify_network_removed(wpa_s, ssid);
   2598 			wpa_config_remove_network(wpa_s->conf, ssid->id);
   2599 			return;
   2600 		}
   2601 		return; /* Peer not found in client list */
   2602 	}
   2603 
   2604 	wpa_printf(MSG_DEBUG, "P2P: Remove peer " MACSTR " from persistent "
   2605 		   "group %d client list due to invitation result",
   2606 		   MAC2STR(peer), ssid->id);
   2607 	os_memmove(ssid->p2p_client_list + i * ETH_ALEN,
   2608 		   ssid->p2p_client_list + (i + 1) * ETH_ALEN,
   2609 		   (ssid->num_p2p_clients - i - 1) * ETH_ALEN);
   2610 	ssid->num_p2p_clients--;
   2611 #ifndef CONFIG_NO_CONFIG_WRITE
   2612 	if (wpa_s->parent->conf->update_config &&
   2613 	    wpa_config_write(wpa_s->parent->confname, wpa_s->parent->conf))
   2614 		wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
   2615 #endif /* CONFIG_NO_CONFIG_WRITE */
   2616 }
   2617 
   2618 
   2619 static void wpas_remove_persistent_client(struct wpa_supplicant *wpa_s,
   2620 					  const u8 *peer)
   2621 {
   2622 	struct wpa_ssid *ssid;
   2623 
   2624 	wpa_s = wpa_s->global->p2p_invite_group;
   2625 	if (wpa_s == NULL)
   2626 		return; /* No known invitation group */
   2627 	ssid = wpa_s->current_ssid;
   2628 	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
   2629 	    !ssid->p2p_persistent_group)
   2630 		return; /* Not operating as a GO in persistent group */
   2631 	ssid = wpas_p2p_get_persistent(wpa_s->parent, peer,
   2632 				       ssid->ssid, ssid->ssid_len);
   2633 	wpas_remove_persistent_peer(wpa_s, ssid, peer);
   2634 }
   2635 
   2636 
   2637 static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
   2638 				   const struct p2p_channels *channels,
   2639 				   const u8 *peer)
   2640 {
   2641 	struct wpa_supplicant *wpa_s = ctx;
   2642 	struct wpa_ssid *ssid;
   2643 
   2644 	if (bssid) {
   2645 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
   2646 			"status=%d " MACSTR,
   2647 			status, MAC2STR(bssid));
   2648 	} else {
   2649 		wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
   2650 			"status=%d ", status);
   2651 	}
   2652 	wpas_notify_p2p_invitation_result(wpa_s, status, bssid);
   2653 
   2654 	wpa_printf(MSG_DEBUG, "P2P: Invitation result - status=%d peer=" MACSTR,
   2655 		   status, MAC2STR(peer));
   2656 	if (wpa_s->pending_invite_ssid_id == -1) {
   2657 		if (status == P2P_SC_FAIL_UNKNOWN_GROUP)
   2658 			wpas_remove_persistent_client(wpa_s, peer);
   2659 		return; /* Invitation to active group */
   2660 	}
   2661 
   2662 	if (status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
   2663 		wpa_printf(MSG_DEBUG, "P2P: Waiting for peer to start another "
   2664 			   "invitation exchange to indicate readiness for "
   2665 			   "re-invocation");
   2666 	}
   2667 
   2668 	if (status != P2P_SC_SUCCESS) {
   2669 		if (status == P2P_SC_FAIL_UNKNOWN_GROUP) {
   2670 			ssid = wpa_config_get_network(
   2671 				wpa_s->conf, wpa_s->pending_invite_ssid_id);
   2672 			wpas_remove_persistent_peer(wpa_s, ssid, peer);
   2673 		}
   2674 		wpas_p2p_remove_pending_group_interface(wpa_s);
   2675 		return;
   2676 	}
   2677 
   2678 	ssid = wpa_config_get_network(wpa_s->conf,
   2679 				      wpa_s->pending_invite_ssid_id);
   2680 	if (ssid == NULL) {
   2681 		wpa_printf(MSG_ERROR, "P2P: Could not find persistent group "
   2682 			   "data matching with invitation");
   2683 		return;
   2684 	}
   2685 
   2686 	/*
   2687 	 * The peer could have missed our ctrl::ack frame for Invitation
   2688 	 * Response and continue retransmitting the frame. To reduce the
   2689 	 * likelihood of the peer not getting successful TX status for the
   2690 	 * Invitation Response frame, wait a short time here before starting
   2691 	 * the persistent group so that we will remain on the current channel to
   2692 	 * acknowledge any possible retransmission from the peer.
   2693 	 */
   2694 #ifndef ANDROID_P2P
   2695 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before "
   2696 		"starting persistent group");
   2697 	os_sleep(0, 50000);
   2698 #else
   2699 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 100 ms wait on current channel before "
   2700 		"starting persistent group");
   2701 	os_sleep(0, 100000);
   2702 #endif
   2703 
   2704 	wpas_p2p_group_add_persistent(wpa_s, ssid,
   2705 				      ssid->mode == WPAS_MODE_P2P_GO,
   2706 				      wpa_s->p2p_persistent_go_freq,
   2707 				      wpa_s->p2p_go_ht40, channels);
   2708 }
   2709 
   2710 
   2711 static int wpas_p2p_disallowed_freq(struct wpa_global *global,
   2712 				    unsigned int freq)
   2713 {
   2714 	unsigned int i;
   2715 
   2716 	if (global->p2p_disallow_freq == NULL)
   2717 		return 0;
   2718 
   2719 	for (i = 0; i < global->num_p2p_disallow_freq; i++) {
   2720 		if (freq >= global->p2p_disallow_freq[i].min &&
   2721 		    freq <= global->p2p_disallow_freq[i].max)
   2722 			return 1;
   2723 	}
   2724 
   2725 	return 0;
   2726 }
   2727 
   2728 
   2729 static void wpas_p2p_add_chan(struct p2p_reg_class *reg, u8 chan)
   2730 {
   2731 	reg->channel[reg->channels] = chan;
   2732 	reg->channels++;
   2733 }
   2734 
   2735 
   2736 static int wpas_p2p_default_channels(struct wpa_supplicant *wpa_s,
   2737 				     struct p2p_channels *chan)
   2738 {
   2739 	int i, cla = 0;
   2740 
   2741 	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for 2.4 GHz "
   2742 		   "band");
   2743 
   2744 	/* Operating class 81 - 2.4 GHz band channels 1..13 */
   2745 	chan->reg_class[cla].reg_class = 81;
   2746 	chan->reg_class[cla].channels = 0;
   2747 	for (i = 0; i < 11; i++) {
   2748 		if (!wpas_p2p_disallowed_freq(wpa_s->global, 2412 + i * 5))
   2749 			wpas_p2p_add_chan(&chan->reg_class[cla], i + 1);
   2750 	}
   2751 	if (chan->reg_class[cla].channels)
   2752 		cla++;
   2753 
   2754 	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for lower 5 GHz "
   2755 		   "band");
   2756 
   2757 	/* Operating class 115 - 5 GHz, channels 36-48 */
   2758 	chan->reg_class[cla].reg_class = 115;
   2759 	chan->reg_class[cla].channels = 0;
   2760 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 36 * 5))
   2761 		wpas_p2p_add_chan(&chan->reg_class[cla], 36);
   2762 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 40 * 5))
   2763 		wpas_p2p_add_chan(&chan->reg_class[cla], 40);
   2764 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 44 * 5))
   2765 		wpas_p2p_add_chan(&chan->reg_class[cla], 44);
   2766 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 48 * 5))
   2767 		wpas_p2p_add_chan(&chan->reg_class[cla], 48);
   2768 	if (chan->reg_class[cla].channels)
   2769 		cla++;
   2770 
   2771 	wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for higher 5 GHz "
   2772 		   "band");
   2773 
   2774 	/* Operating class 124 - 5 GHz, channels 149,153,157,161 */
   2775 	chan->reg_class[cla].reg_class = 124;
   2776 	chan->reg_class[cla].channels = 0;
   2777 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 149 * 5))
   2778 		wpas_p2p_add_chan(&chan->reg_class[cla], 149);
   2779 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 153 * 5))
   2780 		wpas_p2p_add_chan(&chan->reg_class[cla], 153);
   2781 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 156 * 5))
   2782 		wpas_p2p_add_chan(&chan->reg_class[cla], 157);
   2783 	if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 161 * 5))
   2784 		wpas_p2p_add_chan(&chan->reg_class[cla], 161);
   2785 	if (chan->reg_class[cla].channels)
   2786 		cla++;
   2787 
   2788 	chan->reg_classes = cla;
   2789 	return 0;
   2790 }
   2791 
   2792 
   2793 static struct hostapd_hw_modes * get_mode(struct hostapd_hw_modes *modes,
   2794 					  u16 num_modes,
   2795 					  enum hostapd_hw_mode mode)
   2796 {
   2797 	u16 i;
   2798 
   2799 	for (i = 0; i < num_modes; i++) {
   2800 		if (modes[i].mode == mode)
   2801 			return &modes[i];
   2802 	}
   2803 
   2804 	return NULL;
   2805 }
   2806 
   2807 
   2808 static int has_channel(struct wpa_global *global,
   2809 		       struct hostapd_hw_modes *mode, u8 chan, int *flags)
   2810 {
   2811 	int i;
   2812 	unsigned int freq;
   2813 
   2814 	freq = (mode->mode == HOSTAPD_MODE_IEEE80211A ? 5000 : 2407) +
   2815 		chan * 5;
   2816 	if (wpas_p2p_disallowed_freq(global, freq))
   2817 		return 0;
   2818 
   2819 	for (i = 0; i < mode->num_channels; i++) {
   2820 		if (mode->channels[i].chan == chan) {
   2821 			if (flags)
   2822 				*flags = mode->channels[i].flag;
   2823 			return !(mode->channels[i].flag &
   2824 				 (HOSTAPD_CHAN_DISABLED |
   2825 				  HOSTAPD_CHAN_PASSIVE_SCAN |
   2826 				  HOSTAPD_CHAN_NO_IBSS |
   2827 				  HOSTAPD_CHAN_RADAR));
   2828 		}
   2829 	}
   2830 
   2831 	return 0;
   2832 }
   2833 
   2834 
   2835 struct p2p_oper_class_map {
   2836 	enum hostapd_hw_mode mode;
   2837 	u8 op_class;
   2838 	u8 min_chan;
   2839 	u8 max_chan;
   2840 	u8 inc;
   2841 	enum { BW20, BW40PLUS, BW40MINUS } bw;
   2842 };
   2843 
   2844 static struct p2p_oper_class_map op_class[] = {
   2845 	{ HOSTAPD_MODE_IEEE80211G, 81, 1, 13, 1, BW20 },
   2846 #if 0 /* Do not enable HT40 on 2 GHz for now */
   2847 	{ HOSTAPD_MODE_IEEE80211G, 83, 1, 9, 1, BW40PLUS },
   2848 	{ HOSTAPD_MODE_IEEE80211G, 84, 5, 13, 1, BW40MINUS },
   2849 #endif
   2850 	{ HOSTAPD_MODE_IEEE80211A, 115, 36, 48, 4, BW20 },
   2851 	{ HOSTAPD_MODE_IEEE80211A, 124, 149, 161, 4, BW20 },
   2852 	{ HOSTAPD_MODE_IEEE80211A, 116, 36, 44, 8, BW40PLUS },
   2853 	{ HOSTAPD_MODE_IEEE80211A, 117, 40, 48, 8, BW40MINUS },
   2854 	{ HOSTAPD_MODE_IEEE80211A, 126, 149, 157, 8, BW40PLUS },
   2855 	{ HOSTAPD_MODE_IEEE80211A, 127, 153, 161, 8, BW40MINUS },
   2856 	{ -1, 0, 0, 0, 0, BW20 }
   2857 };
   2858 
   2859 
   2860 static int wpas_p2p_verify_channel(struct wpa_supplicant *wpa_s,
   2861 				   struct hostapd_hw_modes *mode,
   2862 				   u8 channel, u8 bw)
   2863 {
   2864 	int flag;
   2865 
   2866 	if (!has_channel(wpa_s->global, mode, channel, &flag))
   2867 		return -1;
   2868 	if (bw == BW40MINUS &&
   2869 	    (!(flag & HOSTAPD_CHAN_HT40MINUS) ||
   2870 	     !has_channel(wpa_s->global, mode, channel - 4, NULL)))
   2871 		return 0;
   2872 	if (bw == BW40PLUS &&
   2873 	    (!(flag & HOSTAPD_CHAN_HT40PLUS) ||
   2874 	     !has_channel(wpa_s->global, mode, channel + 4, NULL)))
   2875 		return 0;
   2876 	return 1;
   2877 }
   2878 
   2879 
   2880 static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s,
   2881 				   struct p2p_channels *chan)
   2882 {
   2883 	struct hostapd_hw_modes *mode;
   2884 	int cla, op;
   2885 
   2886 	if (wpa_s->hw.modes == NULL) {
   2887 		wpa_printf(MSG_DEBUG, "P2P: Driver did not support fetching "
   2888 			   "of all supported channels; assume dualband "
   2889 			   "support");
   2890 		return wpas_p2p_default_channels(wpa_s, chan);
   2891 	}
   2892 
   2893 	cla = 0;
   2894 
   2895 	for (op = 0; op_class[op].op_class; op++) {
   2896 		struct p2p_oper_class_map *o = &op_class[op];
   2897 		u8 ch;
   2898 		struct p2p_reg_class *reg = NULL;
   2899 
   2900 		mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode);
   2901 		if (mode == NULL)
   2902 			continue;
   2903 		for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
   2904 			if (wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw) < 1)
   2905 				continue;
   2906 			if (reg == NULL) {
   2907 				wpa_printf(MSG_DEBUG, "P2P: Add operating "
   2908 					   "class %u", o->op_class);
   2909 				reg = &chan->reg_class[cla];
   2910 				cla++;
   2911 				reg->reg_class = o->op_class;
   2912 			}
   2913 			reg->channel[reg->channels] = ch;
   2914 			reg->channels++;
   2915 		}
   2916 		if (reg) {
   2917 			wpa_hexdump(MSG_DEBUG, "P2P: Channels",
   2918 				    reg->channel, reg->channels);
   2919 		}
   2920 	}
   2921 
   2922 	chan->reg_classes = cla;
   2923 
   2924 	return 0;
   2925 }
   2926 
   2927 
   2928 int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
   2929 			   struct hostapd_hw_modes *mode, u8 channel)
   2930 {
   2931 	int op, ret;
   2932 
   2933 	for (op = 0; op_class[op].op_class; op++) {
   2934 		struct p2p_oper_class_map *o = &op_class[op];
   2935 		u8 ch;
   2936 
   2937 		for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
   2938 			if (o->mode != HOSTAPD_MODE_IEEE80211A ||
   2939 			    o->bw == BW20 || ch != channel)
   2940 				continue;
   2941 			ret = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
   2942 			if (ret < 0)
   2943 				continue;
   2944 			else if (ret > 0)
   2945 				return (o->bw == BW40MINUS) ? -1 : 1;
   2946 			else
   2947 				return 0;
   2948 		}
   2949 	}
   2950 	return 0;
   2951 }
   2952 
   2953 
   2954 static int wpas_get_noa(void *ctx, const u8 *interface_addr, u8 *buf,
   2955 			size_t buf_len)
   2956 {
   2957 	struct wpa_supplicant *wpa_s = ctx;
   2958 
   2959 	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   2960 		if (os_memcmp(wpa_s->own_addr, interface_addr, ETH_ALEN) == 0)
   2961 			break;
   2962 	}
   2963 	if (wpa_s == NULL)
   2964 		return -1;
   2965 
   2966 	return wpa_drv_get_noa(wpa_s, buf, buf_len);
   2967 }
   2968 
   2969 
   2970 static int wpas_go_connected(void *ctx, const u8 *dev_addr)
   2971 {
   2972 	struct wpa_supplicant *wpa_s = ctx;
   2973 
   2974 	for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   2975 		struct wpa_ssid *ssid = wpa_s->current_ssid;
   2976 		if (ssid == NULL)
   2977 			continue;
   2978 		if (ssid->mode != WPAS_MODE_INFRA)
   2979 			continue;
   2980 		if (wpa_s->wpa_state != WPA_COMPLETED &&
   2981 		    wpa_s->wpa_state != WPA_GROUP_HANDSHAKE)
   2982 			continue;
   2983 		if (os_memcmp(wpa_s->go_dev_addr, dev_addr, ETH_ALEN) == 0)
   2984 			return 1;
   2985 	}
   2986 
   2987 	return 0;
   2988 }
   2989 
   2990 
   2991 /**
   2992  * wpas_p2p_init - Initialize P2P module for %wpa_supplicant
   2993  * @global: Pointer to global data from wpa_supplicant_init()
   2994  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   2995  * Returns: 0 on success, -1 on failure
   2996  */
   2997 int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
   2998 {
   2999 	struct p2p_config p2p;
   3000 	unsigned int r;
   3001 	int i;
   3002 
   3003 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
   3004 		return 0;
   3005 
   3006 	if (global->p2p)
   3007 		return 0;
   3008 
   3009 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   3010 		struct p2p_params params;
   3011 
   3012 		wpa_printf(MSG_DEBUG, "P2P: Use driver-based P2P management");
   3013 		os_memset(&params, 0, sizeof(params));
   3014 		params.dev_name = wpa_s->conf->device_name;
   3015 		os_memcpy(params.pri_dev_type, wpa_s->conf->device_type,
   3016 			  WPS_DEV_TYPE_LEN);
   3017 		params.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
   3018 		os_memcpy(params.sec_dev_type,
   3019 			  wpa_s->conf->sec_device_type,
   3020 			  params.num_sec_dev_types * WPS_DEV_TYPE_LEN);
   3021 
   3022 		if (wpa_drv_p2p_set_params(wpa_s, &params) < 0)
   3023 			return -1;
   3024 
   3025 		return 0;
   3026 	}
   3027 
   3028 	os_memset(&p2p, 0, sizeof(p2p));
   3029 	p2p.msg_ctx = wpa_s;
   3030 	p2p.cb_ctx = wpa_s;
   3031 	p2p.p2p_scan = wpas_p2p_scan;
   3032 	p2p.send_action = wpas_send_action;
   3033 	p2p.send_action_done = wpas_send_action_done;
   3034 	p2p.go_neg_completed = wpas_go_neg_completed;
   3035 	p2p.go_neg_req_rx = wpas_go_neg_req_rx;
   3036 	p2p.dev_found = wpas_dev_found;
   3037 	p2p.dev_lost = wpas_dev_lost;
   3038 	p2p.start_listen = wpas_start_listen;
   3039 	p2p.stop_listen = wpas_stop_listen;
   3040 	p2p.send_probe_resp = wpas_send_probe_resp;
   3041 	p2p.sd_request = wpas_sd_request;
   3042 	p2p.sd_response = wpas_sd_response;
   3043 	p2p.prov_disc_req = wpas_prov_disc_req;
   3044 	p2p.prov_disc_resp = wpas_prov_disc_resp;
   3045 	p2p.prov_disc_fail = wpas_prov_disc_fail;
   3046 	p2p.invitation_process = wpas_invitation_process;
   3047 	p2p.invitation_received = wpas_invitation_received;
   3048 	p2p.invitation_result = wpas_invitation_result;
   3049 	p2p.get_noa = wpas_get_noa;
   3050 	p2p.go_connected = wpas_go_connected;
   3051 
   3052 	os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
   3053 	os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
   3054 	p2p.dev_name = wpa_s->conf->device_name;
   3055 	p2p.manufacturer = wpa_s->conf->manufacturer;
   3056 	p2p.model_name = wpa_s->conf->model_name;
   3057 	p2p.model_number = wpa_s->conf->model_number;
   3058 	p2p.serial_number = wpa_s->conf->serial_number;
   3059 	if (wpa_s->wps) {
   3060 		os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);
   3061 		p2p.config_methods = wpa_s->wps->config_methods;
   3062 	}
   3063 
   3064 	if (wpa_s->conf->p2p_listen_reg_class &&
   3065 	    wpa_s->conf->p2p_listen_channel) {
   3066 		p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;
   3067 		p2p.channel = wpa_s->conf->p2p_listen_channel;
   3068 	} else {
   3069 		p2p.reg_class = 81;
   3070 		/*
   3071 		 * Pick one of the social channels randomly as the listen
   3072 		 * channel.
   3073 		 */
   3074 		os_get_random((u8 *) &r, sizeof(r));
   3075 		p2p.channel = 1 + (r % 3) * 5;
   3076 	}
   3077 	wpa_printf(MSG_DEBUG, "P2P: Own listen channel: %d", p2p.channel);
   3078 
   3079 	if (wpa_s->conf->p2p_oper_reg_class &&
   3080 	    wpa_s->conf->p2p_oper_channel) {
   3081 		p2p.op_reg_class = wpa_s->conf->p2p_oper_reg_class;
   3082 		p2p.op_channel = wpa_s->conf->p2p_oper_channel;
   3083 		p2p.cfg_op_channel = 1;
   3084 		wpa_printf(MSG_DEBUG, "P2P: Configured operating channel: "
   3085 			   "%d:%d", p2p.op_reg_class, p2p.op_channel);
   3086 
   3087 	} else {
   3088 		p2p.op_reg_class = 81;
   3089 		/*
   3090 		 * Use random operation channel from (1, 6, 11) if no other
   3091 		 * preference is indicated.
   3092 		 */
   3093 		os_get_random((u8 *) &r, sizeof(r));
   3094 		p2p.op_channel = 1 + (r % 3) * 5;
   3095 		p2p.cfg_op_channel = 0;
   3096 		wpa_printf(MSG_DEBUG, "P2P: Random operating channel: "
   3097 			   "%d:%d", p2p.op_reg_class, p2p.op_channel);
   3098 	}
   3099 	if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
   3100 		os_memcpy(p2p.country, wpa_s->conf->country, 2);
   3101 		p2p.country[2] = 0x04;
   3102 	} else
   3103 		os_memcpy(p2p.country, "XX\x04", 3);
   3104 
   3105 	if (wpas_p2p_setup_channels(wpa_s, &p2p.channels)) {
   3106 		wpa_printf(MSG_ERROR, "P2P: Failed to configure supported "
   3107 			   "channel list");
   3108 		return -1;
   3109 	}
   3110 
   3111 	os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,
   3112 		  WPS_DEV_TYPE_LEN);
   3113 
   3114 	p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
   3115 	os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,
   3116 		  p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN);
   3117 
   3118 	p2p.concurrent_operations = !!(wpa_s->drv_flags &
   3119 				       WPA_DRIVER_FLAGS_P2P_CONCURRENT);
   3120 
   3121 	p2p.max_peers = 100;
   3122 
   3123 	if (wpa_s->conf->p2p_ssid_postfix) {
   3124 		p2p.ssid_postfix_len =
   3125 			os_strlen(wpa_s->conf->p2p_ssid_postfix);
   3126 		if (p2p.ssid_postfix_len > sizeof(p2p.ssid_postfix))
   3127 			p2p.ssid_postfix_len = sizeof(p2p.ssid_postfix);
   3128 		os_memcpy(p2p.ssid_postfix, wpa_s->conf->p2p_ssid_postfix,
   3129 			  p2p.ssid_postfix_len);
   3130 	}
   3131 
   3132 	p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;
   3133 
   3134 	p2p.max_listen = wpa_s->max_remain_on_chan;
   3135 
   3136 #ifdef ANDROID_P2P
   3137 	if(wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
   3138 		p2p.p2p_concurrency = P2P_MULTI_CHANNEL_CONCURRENT;
   3139 		wpa_printf(MSG_DEBUG, "P2P: Multi channel concurrency support");
   3140 	} else {
   3141 	// Add support for WPA_DRIVER_FLAGS_P2P_CONCURRENT
   3142 		p2p.p2p_concurrency = P2P_SINGLE_CHANNEL_CONCURRENT;
   3143 		wpa_printf(MSG_DEBUG, "P2P: Single channel concurrency support");
   3144 	}
   3145 #endif
   3146 
   3147 	global->p2p = p2p_init(&p2p);
   3148 	if (global->p2p == NULL)
   3149 		return -1;
   3150 	global->p2p_init_wpa_s = wpa_s;
   3151 
   3152 	for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
   3153 		if (wpa_s->conf->wps_vendor_ext[i] == NULL)
   3154 			continue;
   3155 		p2p_add_wps_vendor_extension(
   3156 			global->p2p, wpa_s->conf->wps_vendor_ext[i]);
   3157 	}
   3158 
   3159 	return 0;
   3160 }
   3161 
   3162 
   3163 /**
   3164  * wpas_p2p_deinit - Deinitialize per-interface P2P data
   3165  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   3166  *
   3167  * This function deinitialize per-interface P2P data.
   3168  */
   3169 void wpas_p2p_deinit(struct wpa_supplicant *wpa_s)
   3170 {
   3171 	if (wpa_s->driver && wpa_s->drv_priv)
   3172 		wpa_drv_probe_req_report(wpa_s, 0);
   3173 
   3174 	if (wpa_s->go_params) {
   3175 		/* Clear any stored provisioning info */
   3176 		p2p_clear_provisioning_info(
   3177 			wpa_s->global->p2p,
   3178 			wpa_s->go_params->peer_device_addr);
   3179 	}
   3180 
   3181 	os_free(wpa_s->go_params);
   3182 	wpa_s->go_params = NULL;
   3183 	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
   3184 	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   3185 	wpa_s->p2p_long_listen = 0;
   3186 	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
   3187 	eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
   3188 	wpas_p2p_remove_pending_group_interface(wpa_s);
   3189 
   3190 	/* TODO: remove group interface from the driver if this wpa_s instance
   3191 	 * is on top of a P2P group interface */
   3192 }
   3193 
   3194 
   3195 /**
   3196  * wpas_p2p_deinit_global - Deinitialize global P2P module
   3197  * @global: Pointer to global data from wpa_supplicant_init()
   3198  *
   3199  * This function deinitializes the global (per device) P2P module.
   3200  */
   3201 void wpas_p2p_deinit_global(struct wpa_global *global)
   3202 {
   3203 	struct wpa_supplicant *wpa_s, *tmp;
   3204 
   3205 	wpa_s = global->ifaces;
   3206 	if (wpa_s)
   3207 		wpas_p2p_service_flush(wpa_s);
   3208 
   3209 	if (global->p2p == NULL)
   3210 		return;
   3211 
   3212 	/* Remove remaining P2P group interfaces */
   3213 	while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
   3214 		wpa_s = wpa_s->next;
   3215 	while (wpa_s) {
   3216 		tmp = global->ifaces;
   3217 		while (tmp &&
   3218 		       (tmp == wpa_s ||
   3219 			tmp->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)) {
   3220 			tmp = tmp->next;
   3221 		}
   3222 		if (tmp == NULL)
   3223 			break;
   3224 		/* Disconnect from the P2P group and deinit the interface */
   3225 		wpas_p2p_disconnect(tmp);
   3226 	}
   3227 
   3228 	/*
   3229 	 * Deinit GO data on any possibly remaining interface (if main
   3230 	 * interface is used as GO).
   3231 	 */
   3232 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   3233 		if (wpa_s->ap_iface)
   3234 			wpas_p2p_group_deinit(wpa_s);
   3235 	}
   3236 
   3237 	p2p_deinit(global->p2p);
   3238 	global->p2p = NULL;
   3239 	global->p2p_init_wpa_s = NULL;
   3240 }
   3241 
   3242 
   3243 static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s)
   3244 {
   3245 	if (wpa_s->conf->p2p_no_group_iface)
   3246 		return 0; /* separate interface disabled per configuration */
   3247 	if (wpa_s->drv_flags &
   3248 	    (WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE |
   3249 	     WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P))
   3250 		return 1; /* P2P group requires a new interface in every case
   3251 			   */
   3252 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CONCURRENT))
   3253 		return 0; /* driver does not support concurrent operations */
   3254 	if (wpa_s->global->ifaces->next)
   3255 		return 1; /* more that one interface already in use */
   3256 	if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
   3257 		return 1; /* this interface is already in use */
   3258 	return 0;
   3259 }
   3260 
   3261 
   3262 static int wpas_p2p_start_go_neg(struct wpa_supplicant *wpa_s,
   3263 				 const u8 *peer_addr,
   3264 				 enum p2p_wps_method wps_method,
   3265 				 int go_intent, const u8 *own_interface_addr,
   3266 				 unsigned int force_freq, int persistent_group,
   3267 				 struct wpa_ssid *ssid, unsigned int pref_freq)
   3268 {
   3269 	if (persistent_group && wpa_s->conf->persistent_reconnect)
   3270 		persistent_group = 2;
   3271 
   3272 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   3273 		return wpa_drv_p2p_connect(wpa_s, peer_addr, wps_method,
   3274 					   go_intent, own_interface_addr,
   3275 					   force_freq, persistent_group);
   3276 	}
   3277 
   3278 	/*
   3279 	 * Increase GO config timeout if HT40 is used since it takes some time
   3280 	 * to scan channels for coex purposes before the BSS can be started.
   3281 	 */
   3282 	p2p_set_config_timeout(wpa_s->global->p2p,
   3283 			       wpa_s->p2p_go_ht40 ? 255 : 100, 20);
   3284 
   3285 	return p2p_connect(wpa_s->global->p2p, peer_addr, wps_method,
   3286 			   go_intent, own_interface_addr, force_freq,
   3287 			   persistent_group, ssid ? ssid->ssid : NULL,
   3288 			   ssid ? ssid->ssid_len : 0,
   3289 			   wpa_s->p2p_pd_before_go_neg, pref_freq);
   3290 }
   3291 
   3292 
   3293 static int wpas_p2p_auth_go_neg(struct wpa_supplicant *wpa_s,
   3294 				const u8 *peer_addr,
   3295 				enum p2p_wps_method wps_method,
   3296 				int go_intent, const u8 *own_interface_addr,
   3297 				unsigned int force_freq, int persistent_group,
   3298 				struct wpa_ssid *ssid, unsigned int pref_freq)
   3299 {
   3300 	if (persistent_group && wpa_s->conf->persistent_reconnect)
   3301 		persistent_group = 2;
   3302 
   3303 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   3304 		return -1;
   3305 
   3306 	return p2p_authorize(wpa_s->global->p2p, peer_addr, wps_method,
   3307 			     go_intent, own_interface_addr, force_freq,
   3308 			     persistent_group, ssid ? ssid->ssid : NULL,
   3309 			     ssid ? ssid->ssid_len : 0, pref_freq);
   3310 }
   3311 
   3312 
   3313 static void wpas_p2p_check_join_scan_limit(struct wpa_supplicant *wpa_s)
   3314 {
   3315 	wpa_s->p2p_join_scan_count++;
   3316 	wpa_printf(MSG_DEBUG, "P2P: Join scan attempt %d",
   3317 		   wpa_s->p2p_join_scan_count);
   3318 	if (wpa_s->p2p_join_scan_count > P2P_MAX_JOIN_SCAN_ATTEMPTS) {
   3319 		wpa_printf(MSG_DEBUG, "P2P: Failed to find GO " MACSTR
   3320 			   " for join operationg - stop join attempt",
   3321 			   MAC2STR(wpa_s->pending_join_iface_addr));
   3322 		eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   3323 		if (wpa_s->p2p_auto_pd) {
   3324 			wpa_s->p2p_auto_pd = 0;
   3325 			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
   3326 				" p2p_dev_addr=" MACSTR " status=N/A",
   3327 				MAC2STR(wpa_s->pending_join_dev_addr));
   3328 			return;
   3329 		}
   3330 		wpa_msg(wpa_s->parent, MSG_INFO,
   3331 			P2P_EVENT_GROUP_FORMATION_FAILURE);
   3332 	}
   3333 }
   3334 
   3335 
   3336 static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq)
   3337 {
   3338 	struct wpa_supplicant *iface;
   3339 	int shared_freq;
   3340 	u8 bssid[ETH_ALEN];
   3341 
   3342 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)
   3343 		return 0;
   3344 
   3345 	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
   3346 		if (!wpas_p2p_create_iface(wpa_s) && iface == wpa_s)
   3347 			continue;
   3348 		if (iface->current_ssid == NULL || iface->assoc_freq == 0)
   3349 			continue;
   3350 		if (iface->current_ssid->mode == WPAS_MODE_AP ||
   3351 		    iface->current_ssid->mode == WPAS_MODE_P2P_GO)
   3352 			shared_freq = iface->current_ssid->frequency;
   3353 		else if (wpa_drv_get_bssid(iface, bssid) == 0)
   3354 			shared_freq = iface->assoc_freq;
   3355 		else
   3356 			shared_freq = 0;
   3357 
   3358 		if (shared_freq && freq != shared_freq) {
   3359 			wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - %s "
   3360 				   "connected on %d MHz - new connection on "
   3361 				   "%d MHz", iface->ifname, shared_freq, freq);
   3362 			return 1;
   3363 		}
   3364 	}
   3365 
   3366 	shared_freq = wpa_drv_shared_freq(wpa_s);
   3367 	if (shared_freq > 0 && shared_freq != freq) {
   3368 		wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - shared "
   3369 			   "virtual interface connected on %d MHz - new "
   3370 			   "connection on %d MHz", shared_freq, freq);
   3371 		return 1;
   3372 	}
   3373 
   3374 	return 0;
   3375 }
   3376 
   3377 
   3378 static int wpas_p2p_peer_go(struct wpa_supplicant *wpa_s,
   3379 			    const u8 *peer_dev_addr)
   3380 {
   3381 	struct wpa_bss *bss;
   3382 	int updated;
   3383 
   3384 	bss = wpa_bss_get_p2p_dev_addr(wpa_s, peer_dev_addr);
   3385 	if (bss == NULL)
   3386 		return -1;
   3387 	if (bss->last_update_idx < wpa_s->bss_update_idx) {
   3388 		wpa_printf(MSG_DEBUG, "P2P: Peer BSS entry not updated in the "
   3389 			   "last scan");
   3390 		return 0;
   3391 	}
   3392 
   3393 	updated = os_time_before(&wpa_s->p2p_auto_started, &bss->last_update);
   3394 	wpa_printf(MSG_DEBUG, "P2P: Current BSS entry for peer updated at "
   3395 		   "%ld.%06ld (%supdated in last scan)",
   3396 		   bss->last_update.sec, bss->last_update.usec,
   3397 		   updated ? "": "not ");
   3398 
   3399 	return updated;
   3400 }
   3401 
   3402 
   3403 static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
   3404 				   struct wpa_scan_results *scan_res)
   3405 {
   3406 	struct wpa_bss *bss;
   3407 	int freq;
   3408 	u8 iface_addr[ETH_ALEN];
   3409 
   3410 	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   3411 
   3412 	if (wpa_s->global->p2p_disabled)
   3413 		return;
   3414 
   3415 	wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS) for %sjoin",
   3416 		   scan_res ? (int) scan_res->num : -1,
   3417 		   wpa_s->p2p_auto_join ? "auto_" : "");
   3418 
   3419 	if (scan_res)
   3420 		wpas_p2p_scan_res_handler(wpa_s, scan_res);
   3421 
   3422 	if (wpa_s->p2p_auto_pd) {
   3423 		int join = wpas_p2p_peer_go(wpa_s,
   3424 					    wpa_s->pending_join_dev_addr);
   3425 		if (join == 0 &&
   3426 		    wpa_s->auto_pd_scan_retry < P2P_AUTO_PD_SCAN_ATTEMPTS) {
   3427 			wpa_s->auto_pd_scan_retry++;
   3428 			bss = wpa_bss_get_bssid_latest(
   3429 				wpa_s, wpa_s->pending_join_dev_addr);
   3430 			if (bss) {
   3431 				freq = bss->freq;
   3432 				wpa_printf(MSG_DEBUG, "P2P: Scan retry %d for "
   3433 					   "the peer " MACSTR " at %d MHz",
   3434 					   wpa_s->auto_pd_scan_retry,
   3435 					   MAC2STR(wpa_s->
   3436 						   pending_join_dev_addr),
   3437 					   freq);
   3438 				wpas_p2p_join_scan_req(wpa_s, freq);
   3439 				return;
   3440 			}
   3441 		}
   3442 
   3443 		if (join < 0)
   3444 			join = 0;
   3445 
   3446 		wpa_s->p2p_auto_pd = 0;
   3447 		wpa_s->pending_pd_use = join ? AUTO_PD_JOIN : AUTO_PD_GO_NEG;
   3448 		wpa_printf(MSG_DEBUG, "P2P: Auto PD with " MACSTR " join=%d",
   3449 			   MAC2STR(wpa_s->pending_join_dev_addr), join);
   3450 		if (p2p_prov_disc_req(wpa_s->global->p2p,
   3451 				      wpa_s->pending_join_dev_addr,
   3452 				      wpa_s->pending_pd_config_methods, join,
   3453 				      0, wpa_s->user_initiated_pd) < 0) {
   3454 			wpa_s->p2p_auto_pd = 0;
   3455 			wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
   3456 				" p2p_dev_addr=" MACSTR " status=N/A",
   3457 				MAC2STR(wpa_s->pending_join_dev_addr));
   3458 		}
   3459 		return;
   3460 	}
   3461 
   3462 	if (wpa_s->p2p_auto_join) {
   3463 		int join = wpas_p2p_peer_go(wpa_s,
   3464 					    wpa_s->pending_join_dev_addr);
   3465 		if (join < 0) {
   3466 			wpa_printf(MSG_DEBUG, "P2P: Peer was not found to be "
   3467 				   "running a GO -> use GO Negotiation");
   3468 			wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr,
   3469 					 wpa_s->p2p_pin, wpa_s->p2p_wps_method,
   3470 					 wpa_s->p2p_persistent_group, 0, 0, 0,
   3471 					 wpa_s->p2p_go_intent,
   3472 					 wpa_s->p2p_connect_freq,
   3473 					 wpa_s->p2p_persistent_id,
   3474 					 wpa_s->p2p_pd_before_go_neg,
   3475 					 wpa_s->p2p_go_ht40);
   3476 			return;
   3477 		}
   3478 
   3479 		wpa_printf(MSG_DEBUG, "P2P: Peer was found running GO%s -> "
   3480 			   "try to join the group", join ? "" :
   3481 			   " in older scan");
   3482 		if (!join)
   3483 			wpa_s->p2p_fallback_to_go_neg = 1;
   3484 	}
   3485 
   3486 	freq = p2p_get_oper_freq(wpa_s->global->p2p,
   3487 				 wpa_s->pending_join_iface_addr);
   3488 	if (freq < 0 &&
   3489 	    p2p_get_interface_addr(wpa_s->global->p2p,
   3490 				   wpa_s->pending_join_dev_addr,
   3491 				   iface_addr) == 0 &&
   3492 	    os_memcmp(iface_addr, wpa_s->pending_join_dev_addr, ETH_ALEN) != 0)
   3493 	{
   3494 		wpa_printf(MSG_DEBUG, "P2P: Overwrite pending interface "
   3495 			   "address for join from " MACSTR " to " MACSTR
   3496 			   " based on newly discovered P2P peer entry",
   3497 			   MAC2STR(wpa_s->pending_join_iface_addr),
   3498 			   MAC2STR(iface_addr));
   3499 		os_memcpy(wpa_s->pending_join_iface_addr, iface_addr,
   3500 			  ETH_ALEN);
   3501 
   3502 		freq = p2p_get_oper_freq(wpa_s->global->p2p,
   3503 					 wpa_s->pending_join_iface_addr);
   3504 	}
   3505 	if (freq >= 0) {
   3506 		wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
   3507 			   "from P2P peer table: %d MHz", freq);
   3508 	}
   3509 	bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->pending_join_iface_addr);
   3510 	if (bss) {
   3511 		freq = bss->freq;
   3512 		wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
   3513 			   "from BSS table: %d MHz", freq);
   3514 	}
   3515 	if (freq > 0) {
   3516 		u16 method;
   3517 
   3518 		if (wpas_check_freq_conflict(wpa_s, freq) > 0) {
   3519 			wpa_msg(wpa_s->parent, MSG_INFO,
   3520 				P2P_EVENT_GROUP_FORMATION_FAILURE
   3521 				"reason=FREQ_CONFLICT");
   3522 			return;
   3523 		}
   3524 
   3525 		wpa_printf(MSG_DEBUG, "P2P: Send Provision Discovery Request "
   3526 			   "prior to joining an existing group (GO " MACSTR
   3527 			   " freq=%u MHz)",
   3528 			   MAC2STR(wpa_s->pending_join_dev_addr), freq);
   3529 		wpa_s->pending_pd_before_join = 1;
   3530 
   3531 		switch (wpa_s->pending_join_wps_method) {
   3532 		case WPS_PIN_DISPLAY:
   3533 			method = WPS_CONFIG_KEYPAD;
   3534 			break;
   3535 		case WPS_PIN_KEYPAD:
   3536 			method = WPS_CONFIG_DISPLAY;
   3537 			break;
   3538 		case WPS_PBC:
   3539 			method = WPS_CONFIG_PUSHBUTTON;
   3540 			break;
   3541 		default:
   3542 			method = 0;
   3543 			break;
   3544 		}
   3545 
   3546 		if ((p2p_get_provisioning_info(wpa_s->global->p2p,
   3547 					       wpa_s->pending_join_dev_addr) ==
   3548 		     method)) {
   3549 			/*
   3550 			 * We have already performed provision discovery for
   3551 			 * joining the group. Proceed directly to join
   3552 			 * operation without duplicated provision discovery. */
   3553 			wpa_printf(MSG_DEBUG, "P2P: Provision discovery "
   3554 				   "with " MACSTR " already done - proceed to "
   3555 				   "join",
   3556 				   MAC2STR(wpa_s->pending_join_dev_addr));
   3557 			wpa_s->pending_pd_before_join = 0;
   3558 			goto start;
   3559 		}
   3560 
   3561 		if (p2p_prov_disc_req(wpa_s->global->p2p,
   3562 				      wpa_s->pending_join_dev_addr, method, 1,
   3563 				      freq, wpa_s->user_initiated_pd) < 0) {
   3564 			wpa_printf(MSG_DEBUG, "P2P: Failed to send Provision "
   3565 				   "Discovery Request before joining an "
   3566 				   "existing group");
   3567 			wpa_s->pending_pd_before_join = 0;
   3568 			goto start;
   3569 		}
   3570 		return;
   3571 	}
   3572 
   3573 	wpa_printf(MSG_DEBUG, "P2P: Failed to find BSS/GO - try again later");
   3574 	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   3575 	eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
   3576 	wpas_p2p_check_join_scan_limit(wpa_s);
   3577 	return;
   3578 
   3579 start:
   3580 	/* Start join operation immediately */
   3581 	wpas_p2p_join_start(wpa_s);
   3582 }
   3583 
   3584 
   3585 static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq)
   3586 {
   3587 	int ret;
   3588 	struct wpa_driver_scan_params params;
   3589 	struct wpabuf *wps_ie, *ies;
   3590 	size_t ielen;
   3591 	int freqs[2] = { 0, 0 };
   3592 #ifdef ANDROID_P2P
   3593 	int oper_freq;
   3594 
   3595 	/* If freq is not provided, check the operating freq of the GO and do a
   3596 	 * a directed scan to save time
   3597 	 */
   3598 	if(!freq) {
   3599 		freq = (oper_freq = p2p_get_oper_freq(wpa_s->global->p2p,
   3600 			 wpa_s->pending_join_iface_addr) == -1) ? 0 : oper_freq;
   3601 	}
   3602 #endif
   3603 	os_memset(&params, 0, sizeof(params));
   3604 
   3605 	/* P2P Wildcard SSID */
   3606 	params.num_ssids = 1;
   3607 	params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
   3608 	params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
   3609 
   3610 	wpa_s->wps->dev.p2p = 1;
   3611 	wps_ie = wps_build_probe_req_ie(DEV_PW_DEFAULT, &wpa_s->wps->dev,
   3612 					wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 0,
   3613 					NULL);
   3614 	if (wps_ie == NULL) {
   3615 		wpas_p2p_scan_res_join(wpa_s, NULL);
   3616 		return;
   3617 	}
   3618 
   3619 	ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
   3620 	ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
   3621 	if (ies == NULL) {
   3622 		wpabuf_free(wps_ie);
   3623 		wpas_p2p_scan_res_join(wpa_s, NULL);
   3624 		return;
   3625 	}
   3626 	wpabuf_put_buf(ies, wps_ie);
   3627 	wpabuf_free(wps_ie);
   3628 
   3629 	p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
   3630 
   3631 	params.p2p_probe = 1;
   3632 	params.extra_ies = wpabuf_head(ies);
   3633 	params.extra_ies_len = wpabuf_len(ies);
   3634 	if (freq > 0) {
   3635 		freqs[0] = freq;
   3636 		params.freqs = freqs;
   3637 	}
   3638 
   3639 	/*
   3640 	 * Run a scan to update BSS table and start Provision Discovery once
   3641 	 * the new scan results become available.
   3642 	 */
   3643 	ret = wpa_drv_scan(wpa_s, &params);
   3644 	if (!ret) {
   3645 		os_get_time(&wpa_s->scan_trigger_time);
   3646 		wpa_s->scan_res_handler = wpas_p2p_scan_res_join;
   3647 	}
   3648 
   3649 	wpabuf_free(ies);
   3650 
   3651 	if (ret) {
   3652 		wpa_printf(MSG_DEBUG, "P2P: Failed to start scan for join - "
   3653 			   "try again later");
   3654 		eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   3655 		eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
   3656 		wpas_p2p_check_join_scan_limit(wpa_s);
   3657 	}
   3658 }
   3659 
   3660 
   3661 static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx)
   3662 {
   3663 	struct wpa_supplicant *wpa_s = eloop_ctx;
   3664 	wpas_p2p_join_scan_req(wpa_s, 0);
   3665 }
   3666 
   3667 
   3668 static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
   3669 			 const u8 *dev_addr, enum p2p_wps_method wps_method,
   3670 			 int auto_join)
   3671 {
   3672 	wpa_printf(MSG_DEBUG, "P2P: Request to join existing group (iface "
   3673 		   MACSTR " dev " MACSTR ")%s",
   3674 		   MAC2STR(iface_addr), MAC2STR(dev_addr),
   3675 		   auto_join ? " (auto_join)" : "");
   3676 
   3677 	wpa_s->p2p_auto_pd = 0;
   3678 	wpa_s->p2p_auto_join = !!auto_join;
   3679 	os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, ETH_ALEN);
   3680 	os_memcpy(wpa_s->pending_join_dev_addr, dev_addr, ETH_ALEN);
   3681 	wpa_s->pending_join_wps_method = wps_method;
   3682 
   3683 	/* Make sure we are not running find during connection establishment */
   3684 	wpas_p2p_stop_find(wpa_s);
   3685 
   3686 	wpa_s->p2p_join_scan_count = 0;
   3687 	wpas_p2p_join_scan(wpa_s, NULL);
   3688 	return 0;
   3689 }
   3690 
   3691 
   3692 static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s)
   3693 {
   3694 	struct wpa_supplicant *group;
   3695 	struct p2p_go_neg_results res;
   3696 	struct wpa_bss *bss;
   3697 
   3698 	group = wpas_p2p_get_group_iface(wpa_s, 0, 0);
   3699 	if (group == NULL)
   3700 		return -1;
   3701 	if (group != wpa_s) {
   3702 		os_memcpy(group->p2p_pin, wpa_s->p2p_pin,
   3703 			  sizeof(group->p2p_pin));
   3704 		group->p2p_wps_method = wpa_s->p2p_wps_method;
   3705 	} else {
   3706 		/*
   3707 		 * Need to mark the current interface for p2p_group_formation
   3708 		 * when a separate group interface is not used. This is needed
   3709 		 * to allow p2p_cancel stop a pending p2p_connect-join.
   3710 		 * wpas_p2p_init_group_interface() addresses this for the case
   3711 		 * where a separate group interface is used.
   3712 		 */
   3713 		wpa_s->global->p2p_group_formation = wpa_s;
   3714 	}
   3715 
   3716 	group->p2p_in_provisioning = 1;
   3717 	group->p2p_fallback_to_go_neg = wpa_s->p2p_fallback_to_go_neg;
   3718 
   3719 	os_memset(&res, 0, sizeof(res));
   3720 	os_memcpy(res.peer_interface_addr, wpa_s->pending_join_iface_addr,
   3721 		  ETH_ALEN);
   3722 	res.wps_method = wpa_s->pending_join_wps_method;
   3723 	bss = wpa_bss_get_bssid_latest(wpa_s, wpa_s->pending_join_iface_addr);
   3724 	if (bss) {
   3725 		res.freq = bss->freq;
   3726 		res.ssid_len = bss->ssid_len;
   3727 		os_memcpy(res.ssid, bss->ssid, bss->ssid_len);
   3728 	}
   3729 
   3730 	if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
   3731 		wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel prior to "
   3732 			   "starting client");
   3733 		wpa_drv_cancel_remain_on_channel(wpa_s);
   3734 		wpa_s->off_channel_freq = 0;
   3735 		wpa_s->roc_waiting_drv_freq = 0;
   3736 	}
   3737 	wpas_start_wps_enrollee(group, &res);
   3738 
   3739 	/*
   3740 	 * Allow a longer timeout for join-a-running-group than normal 15
   3741 	 * second group formation timeout since the GO may not have authorized
   3742 	 * our connection yet.
   3743 	 */
   3744 	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
   3745 	eloop_register_timeout(60, 0, wpas_p2p_group_formation_timeout,
   3746 			       wpa_s, NULL);
   3747 
   3748 	return 0;
   3749 }
   3750 
   3751 
   3752 static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq,
   3753 				int *force_freq, int *pref_freq,
   3754 				int *oper_freq)
   3755 {
   3756 	if (freq > 0) {
   3757 		if (!p2p_supported_freq(wpa_s->global->p2p, freq)) {
   3758 			wpa_printf(MSG_DEBUG, "P2P: The forced channel "
   3759 				   "(%u MHz) is not supported for P2P uses",
   3760 				   freq);
   3761 			return -3;
   3762 		}
   3763 
   3764 		if (*oper_freq > 0 && freq != *oper_freq &&
   3765 		    !(wpa_s->drv_flags &
   3766 		      WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
   3767 			wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group "
   3768 				   "on %u MHz while connected on another "
   3769 				   "channel (%u MHz)", freq, *oper_freq);
   3770 			return -2;
   3771 		}
   3772 		wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the "
   3773 			   "requested channel (%u MHz)", freq);
   3774 		*force_freq = freq;
   3775 	} else if (*oper_freq > 0 &&
   3776 		   !p2p_supported_freq(wpa_s->global->p2p, *oper_freq)) {
   3777 		if (!(wpa_s->drv_flags &
   3778 		      WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
   3779 			wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group "
   3780 				   "while connected on non-P2P supported "
   3781 				   "channel (%u MHz)", *oper_freq);
   3782 			return -2;
   3783 		}
   3784 		wpa_printf(MSG_DEBUG, "P2P: Current operating channel "
   3785 			   "(%u MHz) not available for P2P - try to use "
   3786 			   "another channel", *oper_freq);
   3787 		*force_freq = 0;
   3788 	} else if (*oper_freq > 0 && *pref_freq == 0 &&
   3789 		   (wpa_s->drv_flags &
   3790 		    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
   3791 		wpa_printf(MSG_DEBUG, "P2P: Trying to prefer the channel we "
   3792 			   "are already using (%u MHz) on another interface",
   3793 			   *oper_freq);
   3794 		*pref_freq = *oper_freq;
   3795 	} else if (*oper_freq > 0) {
   3796 		wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the "
   3797 			   "channel we are already using (%u MHz) on another "
   3798 			   "interface", *oper_freq);
   3799 		*force_freq = *oper_freq;
   3800 	}
   3801 
   3802 	return 0;
   3803 }
   3804 
   3805 
   3806 /**
   3807  * wpas_p2p_connect - Request P2P Group Formation to be started
   3808  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   3809  * @peer_addr: Address of the peer P2P Device
   3810  * @pin: PIN to use during provisioning or %NULL to indicate PBC mode
   3811  * @persistent_group: Whether to create a persistent group
   3812  * @auto_join: Whether to select join vs. GO Negotiation automatically
   3813  * @join: Whether to join an existing group (as a client) instead of starting
   3814  *	Group Owner negotiation; @peer_addr is BSSID in that case
   3815  * @auth: Whether to only authorize the connection instead of doing that and
   3816  *	initiating Group Owner negotiation
   3817  * @go_intent: GO Intent or -1 to use default
   3818  * @freq: Frequency for the group or 0 for auto-selection
   3819  * @persistent_id: Persistent group credentials to use for forcing GO
   3820  *	parameters or -1 to generate new values (SSID/passphrase)
   3821  * @pd: Whether to send Provision Discovery prior to GO Negotiation as an
   3822  *	interoperability workaround when initiating group formation
   3823  * @ht40: Start GO with 40 MHz channel width
   3824  * Returns: 0 or new PIN (if pin was %NULL) on success, -1 on unspecified
   3825  *	failure, -2 on failure due to channel not currently available,
   3826  *	-3 if forced channel is not supported
   3827  */
   3828 int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
   3829 		     const char *pin, enum p2p_wps_method wps_method,
   3830 		     int persistent_group, int auto_join, int join, int auth,
   3831 		     int go_intent, int freq, int persistent_id, int pd,
   3832 		     int ht40)
   3833 {
   3834 	int force_freq = 0, pref_freq = 0, oper_freq = 0;
   3835 	u8 bssid[ETH_ALEN];
   3836 	int ret = 0, res;
   3837 	enum wpa_driver_if_type iftype;
   3838 	const u8 *if_addr;
   3839 	struct wpa_ssid *ssid = NULL;
   3840 
   3841 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   3842 		return -1;
   3843 
   3844 	if (persistent_id >= 0) {
   3845 		ssid = wpa_config_get_network(wpa_s->conf, persistent_id);
   3846 		if (ssid == NULL || ssid->disabled != 2 ||
   3847 		    ssid->mode != WPAS_MODE_P2P_GO)
   3848 			return -1;
   3849 	}
   3850 
   3851 	if (go_intent < 0)
   3852 		go_intent = wpa_s->conf->p2p_go_intent;
   3853 
   3854 	if (!auth)
   3855 		wpa_s->p2p_long_listen = 0;
   3856 
   3857 	wpa_s->p2p_wps_method = wps_method;
   3858 	wpa_s->p2p_persistent_group = !!persistent_group;
   3859 	wpa_s->p2p_persistent_id = persistent_id;
   3860 	wpa_s->p2p_go_intent = go_intent;
   3861 	wpa_s->p2p_connect_freq = freq;
   3862 	wpa_s->p2p_fallback_to_go_neg = 0;
   3863 	wpa_s->p2p_pd_before_go_neg = !!pd;
   3864 	wpa_s->p2p_go_ht40 = !!ht40;
   3865 
   3866 	if (pin)
   3867 		os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
   3868 	else if (wps_method == WPS_PIN_DISPLAY) {
   3869 		ret = wps_generate_pin();
   3870 		os_snprintf(wpa_s->p2p_pin, sizeof(wpa_s->p2p_pin), "%08d",
   3871 			    ret);
   3872 		wpa_printf(MSG_DEBUG, "P2P: Randomly generated PIN: %s",
   3873 			   wpa_s->p2p_pin);
   3874 	} else
   3875 		wpa_s->p2p_pin[0] = '\0';
   3876 
   3877 	if (join || auto_join) {
   3878 		u8 iface_addr[ETH_ALEN], dev_addr[ETH_ALEN];
   3879 		if (auth) {
   3880 			wpa_printf(MSG_DEBUG, "P2P: Authorize invitation to "
   3881 				   "connect a running group from " MACSTR,
   3882 				   MAC2STR(peer_addr));
   3883 			os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
   3884 			return ret;
   3885 		}
   3886 		os_memcpy(dev_addr, peer_addr, ETH_ALEN);
   3887 		if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr,
   3888 					   iface_addr) < 0) {
   3889 			os_memcpy(iface_addr, peer_addr, ETH_ALEN);
   3890 			p2p_get_dev_addr(wpa_s->global->p2p, peer_addr,
   3891 					 dev_addr);
   3892 		}
   3893 		if (auto_join) {
   3894 			os_get_time(&wpa_s->p2p_auto_started);
   3895 			wpa_printf(MSG_DEBUG, "P2P: Auto join started at "
   3896 				   "%ld.%06ld",
   3897 				   wpa_s->p2p_auto_started.sec,
   3898 				   wpa_s->p2p_auto_started.usec);
   3899 		}
   3900 		wpa_s->user_initiated_pd = 1;
   3901 		if (wpas_p2p_join(wpa_s, iface_addr, dev_addr, wps_method,
   3902 				  auto_join) < 0)
   3903 			return -1;
   3904 		return ret;
   3905 	}
   3906 
   3907 	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid) == 0 &&
   3908 	    wpa_s->assoc_freq) {
   3909 		oper_freq = wpa_s->assoc_freq;
   3910 	} else {
   3911 		oper_freq = wpa_drv_shared_freq(wpa_s);
   3912 		if (oper_freq < 0)
   3913 			oper_freq = 0;
   3914 	}
   3915 
   3916 	res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
   3917 				   &oper_freq);
   3918 	if (res)
   3919 		return res;
   3920 	wpas_p2p_set_own_freq_preference(wpa_s, oper_freq);
   3921 
   3922 	wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
   3923 
   3924 	if (wpa_s->create_p2p_iface) {
   3925 		/* Prepare to add a new interface for the group */
   3926 		iftype = WPA_IF_P2P_GROUP;
   3927 		if (go_intent == 15)
   3928 			iftype = WPA_IF_P2P_GO;
   3929 		if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
   3930 			wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
   3931 				   "interface for the group");
   3932 			return -1;
   3933 		}
   3934 
   3935 		if_addr = wpa_s->pending_interface_addr;
   3936 	} else
   3937 		if_addr = wpa_s->own_addr;
   3938 
   3939 	if (auth) {
   3940 		if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method,
   3941 					 go_intent, if_addr,
   3942 					 force_freq, persistent_group, ssid,
   3943 					 pref_freq) < 0)
   3944 			return -1;
   3945 		return ret;
   3946 	}
   3947 
   3948 	if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method,
   3949 				  go_intent, if_addr, force_freq,
   3950 				  persistent_group, ssid, pref_freq) < 0) {
   3951 		if (wpa_s->create_p2p_iface)
   3952 			wpas_p2p_remove_pending_group_interface(wpa_s);
   3953 		return -1;
   3954 	}
   3955 	return ret;
   3956 }
   3957 
   3958 
   3959 /**
   3960  * wpas_p2p_remain_on_channel_cb - Indication of remain-on-channel start
   3961  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   3962  * @freq: Frequency of the channel in MHz
   3963  * @duration: Duration of the stay on the channel in milliseconds
   3964  *
   3965  * This callback is called when the driver indicates that it has started the
   3966  * requested remain-on-channel duration.
   3967  */
   3968 void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
   3969 				   unsigned int freq, unsigned int duration)
   3970 {
   3971 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   3972 		return;
   3973 	if (wpa_s->off_channel_freq == wpa_s->pending_listen_freq) {
   3974 		p2p_listen_cb(wpa_s->global->p2p, wpa_s->pending_listen_freq,
   3975 			      wpa_s->pending_listen_duration);
   3976 		wpa_s->pending_listen_freq = 0;
   3977 	}
   3978 }
   3979 
   3980 
   3981 static int wpas_p2p_listen_start(struct wpa_supplicant *wpa_s,
   3982 				 unsigned int timeout)
   3983 {
   3984 	/* Limit maximum Listen state time based on driver limitation. */
   3985 	if (timeout > wpa_s->max_remain_on_chan)
   3986 		timeout = wpa_s->max_remain_on_chan;
   3987 
   3988 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   3989 		return wpa_drv_p2p_listen(wpa_s, timeout);
   3990 
   3991 	return p2p_listen(wpa_s->global->p2p, timeout);
   3992 }
   3993 
   3994 
   3995 /**
   3996  * wpas_p2p_cancel_remain_on_channel_cb - Remain-on-channel timeout
   3997  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   3998  * @freq: Frequency of the channel in MHz
   3999  *
   4000  * This callback is called when the driver indicates that a remain-on-channel
   4001  * operation has been completed, i.e., the duration on the requested channel
   4002  * has timed out.
   4003  */
   4004 void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
   4005 					  unsigned int freq)
   4006 {
   4007 	wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel callback "
   4008 		   "(p2p_long_listen=%d ms pending_action_tx=%p)",
   4009 		   wpa_s->p2p_long_listen, offchannel_pending_action_tx(wpa_s));
   4010 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4011 		return;
   4012 	if (p2p_listen_end(wpa_s->global->p2p, freq) > 0)
   4013 		return; /* P2P module started a new operation */
   4014 	if (offchannel_pending_action_tx(wpa_s))
   4015 		return;
   4016 	if (wpa_s->p2p_long_listen > 0)
   4017 		wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
   4018 	if (wpa_s->p2p_long_listen > 0) {
   4019 		wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
   4020 		wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
   4021 	}
   4022 }
   4023 
   4024 
   4025 /**
   4026  * wpas_p2p_group_remove - Remove a P2P group
   4027  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   4028  * @ifname: Network interface name of the group interface or "*" to remove all
   4029  *	groups
   4030  * Returns: 0 on success, -1 on failure
   4031  *
   4032  * This function is used to remove a P2P group. This can be used to disconnect
   4033  * from a group in which the local end is a P2P Client or to end a P2P Group in
   4034  * case the local end is the Group Owner. If a virtual network interface was
   4035  * created for this group, that interface will be removed. Otherwise, only the
   4036  * configured P2P group network will be removed from the interface.
   4037  */
   4038 int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
   4039 {
   4040 	struct wpa_global *global = wpa_s->global;
   4041 
   4042 	if (os_strcmp(ifname, "*") == 0) {
   4043 		struct wpa_supplicant *prev;
   4044 		wpa_s = global->ifaces;
   4045 		while (wpa_s) {
   4046 			prev = wpa_s;
   4047 			wpa_s = wpa_s->next;
   4048 			wpas_p2p_disconnect(prev);
   4049 		}
   4050 		return 0;
   4051 	}
   4052 
   4053 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   4054 		if (os_strcmp(wpa_s->ifname, ifname) == 0)
   4055 			break;
   4056 	}
   4057 
   4058 	return wpas_p2p_disconnect(wpa_s);
   4059 }
   4060 
   4061 
   4062 static int freq_included(const struct p2p_channels *channels, unsigned int freq)
   4063 {
   4064 	if (channels == NULL)
   4065 		return 1; /* Assume no restrictions */
   4066 	return p2p_channels_includes_freq(channels, freq);
   4067 }
   4068 
   4069 
   4070 static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
   4071 				   struct p2p_go_neg_results *params,
   4072 				   int freq, int ht40,
   4073 				   const struct p2p_channels *channels)
   4074 {
   4075 	u8 bssid[ETH_ALEN];
   4076 	int res;
   4077 
   4078 	os_memset(params, 0, sizeof(*params));
   4079 	params->role_go = 1;
   4080 	params->ht40 = ht40;
   4081 	if (freq) {
   4082 		if (!freq_included(channels, freq)) {
   4083 			wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not "
   4084 				   "accepted", freq);
   4085 			return -1;
   4086 		}
   4087 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on forced "
   4088 			   "frequency %d MHz", freq);
   4089 		params->freq = freq;
   4090 	} else if (wpa_s->conf->p2p_oper_reg_class == 81 &&
   4091 		   wpa_s->conf->p2p_oper_channel >= 1 &&
   4092 		   wpa_s->conf->p2p_oper_channel <= 11 &&
   4093 		   freq_included(channels,
   4094 				 2407 + 5 * wpa_s->conf->p2p_oper_channel)) {
   4095 		params->freq = 2407 + 5 * wpa_s->conf->p2p_oper_channel;
   4096 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
   4097 			   "frequency %d MHz", params->freq);
   4098 	} else if ((wpa_s->conf->p2p_oper_reg_class == 115 ||
   4099 		    wpa_s->conf->p2p_oper_reg_class == 116 ||
   4100 		    wpa_s->conf->p2p_oper_reg_class == 117 ||
   4101 		    wpa_s->conf->p2p_oper_reg_class == 124 ||
   4102 		    wpa_s->conf->p2p_oper_reg_class == 126 ||
   4103 		    wpa_s->conf->p2p_oper_reg_class == 127) &&
   4104 		   freq_included(channels,
   4105 				 5000 + 5 * wpa_s->conf->p2p_oper_channel)) {
   4106 		params->freq = 5000 + 5 * wpa_s->conf->p2p_oper_channel;
   4107 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
   4108 			   "frequency %d MHz", params->freq);
   4109 	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
   4110 		   wpa_s->best_overall_freq > 0 &&
   4111 		   p2p_supported_freq(wpa_s->global->p2p,
   4112 				      wpa_s->best_overall_freq) &&
   4113 		   freq_included(channels, wpa_s->best_overall_freq)) {
   4114 		params->freq = wpa_s->best_overall_freq;
   4115 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best overall "
   4116 			   "channel %d MHz", params->freq);
   4117 	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
   4118 		   wpa_s->best_24_freq > 0 &&
   4119 		   p2p_supported_freq(wpa_s->global->p2p,
   4120 				      wpa_s->best_24_freq) &&
   4121 		   freq_included(channels, wpa_s->best_24_freq)) {
   4122 		params->freq = wpa_s->best_24_freq;
   4123 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 2.4 GHz "
   4124 			   "channel %d MHz", params->freq);
   4125 	} else if (wpa_s->conf->p2p_oper_channel == 0 &&
   4126 		   wpa_s->best_5_freq > 0 &&
   4127 		   p2p_supported_freq(wpa_s->global->p2p,
   4128 				      wpa_s->best_5_freq) &&
   4129 		   freq_included(channels, wpa_s->best_5_freq)) {
   4130 		params->freq = wpa_s->best_5_freq;
   4131 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 5 GHz "
   4132 			   "channel %d MHz", params->freq);
   4133 	} else {
   4134 		int chan;
   4135 		for (chan = 0; chan < 11; chan++) {
   4136 			params->freq = 2412 + chan * 5;
   4137 			if (!wpas_p2p_disallowed_freq(wpa_s->global,
   4138 						      params->freq) &&
   4139 			    freq_included(channels, params->freq))
   4140 				break;
   4141 		}
   4142 		if (chan == 11) {
   4143 			wpa_printf(MSG_DEBUG, "P2P: No 2.4 GHz channel "
   4144 				   "allowed");
   4145 			return -1;
   4146 		}
   4147 		wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz (no preference "
   4148 			   "known)", params->freq);
   4149 	}
   4150 
   4151 	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid) == 0 &&
   4152 	    wpa_s->assoc_freq && !freq) {
   4153 		if (!p2p_supported_freq(wpa_s->global->p2p, wpa_s->assoc_freq)
   4154 		    || !freq_included(channels, wpa_s->assoc_freq)) {
   4155 			if (wpa_s->drv_flags &
   4156 			    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
   4157 				wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on "
   4158 					   "the channel we are already using "
   4159 					   "(%u MHz) - allow multi-channel "
   4160 					   "concurrency", wpa_s->assoc_freq);
   4161 			} else {
   4162 				wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on "
   4163 					   "the channel we are already using "
   4164 					   "(%u MHz)", wpa_s->assoc_freq);
   4165 				return -1;
   4166 			}
   4167 		} else {
   4168 			wpa_printf(MSG_DEBUG, "P2P: Force GO on the channel we "
   4169 				   "are already using (%u MHz)",
   4170 				   wpa_s->assoc_freq);
   4171 			params->freq = wpa_s->assoc_freq;
   4172 		}
   4173 	}
   4174 
   4175 	res = wpa_drv_shared_freq(wpa_s);
   4176 	if (res > 0 && !freq &&
   4177 	    (!p2p_supported_freq(wpa_s->global->p2p, res) ||
   4178 	     !freq_included(channels, res))) {
   4179 		if (wpa_s->drv_flags &
   4180 		    WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT) {
   4181 			wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on the "
   4182 				   "channel we are already using on a shared "
   4183 				   "interface (%u MHz) - allow multi-channel "
   4184 				   "concurrency", res);
   4185 		} else {
   4186 			wpa_printf(MSG_DEBUG, "P2P: Cannot force GO on the "
   4187 				   "channel we are already using on a shared "
   4188 				   "interface (%u MHz)", res);
   4189 			return -1;
   4190 		}
   4191 	} else if (res > 0 && !freq) {
   4192 		wpa_printf(MSG_DEBUG, "P2P: Force GO on the channel we are "
   4193 			   "already using on a shared interface");
   4194 		params->freq = res;
   4195 		if (!freq_included(channels, params->freq)) {
   4196 			wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not "
   4197 				   "accepted", params->freq);
   4198 			return -1;
   4199 		}
   4200 	} else if (res > 0 && freq != res &&
   4201 		   !(wpa_s->drv_flags &
   4202 		     WPA_DRIVER_FLAGS_MULTI_CHANNEL_CONCURRENT)) {
   4203 		wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group on %u MHz "
   4204 			   "while connected on another channel (%u MHz)",
   4205 			   freq, res);
   4206 		return -1;
   4207 	}
   4208 
   4209 	return 0;
   4210 }
   4211 
   4212 
   4213 static struct wpa_supplicant *
   4214 wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
   4215 			 int go)
   4216 {
   4217 	struct wpa_supplicant *group_wpa_s;
   4218 
   4219 	if (!wpas_p2p_create_iface(wpa_s)) {
   4220 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use same interface for group "
   4221 			"operations");
   4222 		return wpa_s;
   4223 	}
   4224 
   4225 	if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
   4226 					 WPA_IF_P2P_CLIENT) < 0) {
   4227 		wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to add group interface");
   4228 		return NULL;
   4229 	}
   4230 	group_wpa_s = wpas_p2p_init_group_interface(wpa_s, go);
   4231 	if (group_wpa_s == NULL) {
   4232 		wpa_msg(wpa_s, MSG_ERROR, "P2P: Failed to initialize group "
   4233 			"interface");
   4234 		wpas_p2p_remove_pending_group_interface(wpa_s);
   4235 		return NULL;
   4236 	}
   4237 
   4238 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use separate group interface %s",
   4239 		group_wpa_s->ifname);
   4240 	return group_wpa_s;
   4241 }
   4242 
   4243 
   4244 /**
   4245  * wpas_p2p_group_add - Add a new P2P group with local end as Group Owner
   4246  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
   4247  * @persistent_group: Whether to create a persistent group
   4248  * @freq: Frequency for the group or 0 to indicate no hardcoding
   4249  * Returns: 0 on success, -1 on failure
   4250  *
   4251  * This function creates a new P2P group with the local end as the Group Owner,
   4252  * i.e., without using Group Owner Negotiation.
   4253  */
   4254 int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
   4255 		       int freq, int ht40)
   4256 {
   4257 	struct p2p_go_neg_results params;
   4258 	unsigned int r;
   4259 
   4260 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4261 		return -1;
   4262 
   4263 	/* Make sure we are not running find during connection establishment */
   4264 	wpa_printf(MSG_DEBUG, "P2P: Stop any on-going P2P FIND");
   4265 	wpas_p2p_stop_find_oper(wpa_s);
   4266 
   4267 	if (freq == 2) {
   4268 		wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 2.4 GHz "
   4269 			   "band");
   4270 		if (wpa_s->best_24_freq > 0 &&
   4271 		    p2p_supported_freq(wpa_s->global->p2p,
   4272 				       wpa_s->best_24_freq)) {
   4273 			freq = wpa_s->best_24_freq;
   4274 			wpa_printf(MSG_DEBUG, "P2P: Use best 2.4 GHz band "
   4275 				   "channel: %d MHz", freq);
   4276 		} else {
   4277 			os_get_random((u8 *) &r, sizeof(r));
   4278 			freq = 2412 + (r % 3) * 25;
   4279 			wpa_printf(MSG_DEBUG, "P2P: Use random 2.4 GHz band "
   4280 				   "channel: %d MHz", freq);
   4281 		}
   4282 	}
   4283 
   4284 	if (freq == 5) {
   4285 		wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 5 GHz "
   4286 			   "band");
   4287 		if (wpa_s->best_5_freq > 0 &&
   4288 		    p2p_supported_freq(wpa_s->global->p2p,
   4289 				       wpa_s->best_5_freq)) {
   4290 			freq = wpa_s->best_5_freq;
   4291 			wpa_printf(MSG_DEBUG, "P2P: Use best 5 GHz band "
   4292 				   "channel: %d MHz", freq);
   4293 		} else {
   4294 			os_get_random((u8 *) &r, sizeof(r));
   4295 			freq = 5180 + (r % 4) * 20;
   4296 			if (!p2p_supported_freq(wpa_s->global->p2p, freq)) {
   4297 				wpa_printf(MSG_DEBUG, "P2P: Could not select "
   4298 					   "5 GHz channel for P2P group");
   4299 				return -1;
   4300 			}
   4301 			wpa_printf(MSG_DEBUG, "P2P: Use random 5 GHz band "
   4302 				   "channel: %d MHz", freq);
   4303 		}
   4304 	}
   4305 
   4306 	if (freq > 0 && !p2p_supported_freq(wpa_s->global->p2p, freq)) {
   4307 		wpa_printf(MSG_DEBUG, "P2P: The forced channel for GO "
   4308 			   "(%u MHz) is not supported for P2P uses",
   4309 			   freq);
   4310 		return -1;
   4311 	}
   4312 
   4313 	if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, NULL))
   4314 		return -1;
   4315 	if (params.freq &&
   4316 	    !p2p_supported_freq(wpa_s->global->p2p, params.freq)) {
   4317 		wpa_printf(MSG_DEBUG, "P2P: The selected channel for GO "
   4318 			   "(%u MHz) is not supported for P2P uses",
   4319 			   params.freq);
   4320 		return -1;
   4321 	}
   4322 	p2p_go_params(wpa_s->global->p2p, &params);
   4323 	params.persistent_group = persistent_group;
   4324 
   4325 	wpa_s = wpas_p2p_get_group_iface(wpa_s, 0, 1);
   4326 	if (wpa_s == NULL)
   4327 		return -1;
   4328 	wpas_start_wps_go(wpa_s, &params, 0);
   4329 
   4330 	return 0;
   4331 }
   4332 
   4333 
   4334 static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
   4335 				 struct wpa_ssid *params, int addr_allocated)
   4336 {
   4337 	struct wpa_ssid *ssid;
   4338 
   4339 	wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0);
   4340 	if (wpa_s == NULL)
   4341 		return -1;
   4342 
   4343 	wpa_supplicant_ap_deinit(wpa_s);
   4344 
   4345 	ssid = wpa_config_add_network(wpa_s->conf);
   4346 	if (ssid == NULL)
   4347 		return -1;
   4348 	wpa_config_set_network_defaults(ssid);
   4349 	ssid->temporary = 1;
   4350 	ssid->proto = WPA_PROTO_RSN;
   4351 	ssid->pairwise_cipher = WPA_CIPHER_CCMP;
   4352 	ssid->group_cipher = WPA_CIPHER_CCMP;
   4353 	ssid->key_mgmt = WPA_KEY_MGMT_PSK;
   4354 	ssid->ssid = os_malloc(params->ssid_len);
   4355 	if (ssid->ssid == NULL) {
   4356 		wpa_config_remove_network(wpa_s->conf, ssid->id);
   4357 		return -1;
   4358 	}
   4359 	os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
   4360 	ssid->ssid_len = params->ssid_len;
   4361 	ssid->p2p_group = 1;
   4362 	ssid->export_keys = 1;
   4363 	if (params->psk_set) {
   4364 		os_memcpy(ssid->psk, params->psk, 32);
   4365 		ssid->psk_set = 1;
   4366 	}
   4367 	if (params->passphrase)
   4368 		ssid->passphrase = os_strdup(params->passphrase);
   4369 
   4370 	wpa_supplicant_select_network(wpa_s, ssid);
   4371 
   4372 	wpa_s->show_group_started = 1;
   4373 
   4374 	return 0;
   4375 }
   4376 
   4377 
   4378 int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
   4379 				  struct wpa_ssid *ssid, int addr_allocated,
   4380 				  int freq, int ht40,
   4381 				  const struct p2p_channels *channels)
   4382 {
   4383 	struct p2p_go_neg_results params;
   4384 	int go = 0;
   4385 
   4386 	if (ssid->disabled != 2 || ssid->ssid == NULL)
   4387 		return -1;
   4388 
   4389 	if (wpas_get_p2p_group(wpa_s, ssid->ssid, ssid->ssid_len, &go) &&
   4390 	    go == (ssid->mode == WPAS_MODE_P2P_GO)) {
   4391 		wpa_printf(MSG_DEBUG, "P2P: Requested persistent group is "
   4392 			   "already running");
   4393 		return 0;
   4394 	}
   4395 
   4396 	/* Make sure we are not running find during connection establishment */
   4397 	wpas_p2p_stop_find_oper(wpa_s);
   4398 
   4399 	wpa_s->p2p_fallback_to_go_neg = 0;
   4400 
   4401 	if (ssid->mode == WPAS_MODE_INFRA)
   4402 		return wpas_start_p2p_client(wpa_s, ssid, addr_allocated);
   4403 
   4404 	if (ssid->mode != WPAS_MODE_P2P_GO)
   4405 		return -1;
   4406 
   4407 	if (wpas_p2p_init_go_params(wpa_s, &params, freq, ht40, channels))
   4408 		return -1;
   4409 
   4410 	params.role_go = 1;
   4411 	params.psk_set = ssid->psk_set;
   4412 	if (params.psk_set)
   4413 		os_memcpy(params.psk, ssid->psk, sizeof(params.psk));
   4414 	if (ssid->passphrase) {
   4415 		if (os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
   4416 			wpa_printf(MSG_ERROR, "P2P: Invalid passphrase in "
   4417 				   "persistent group");
   4418 			return -1;
   4419 		}
   4420 		os_strlcpy(params.passphrase, ssid->passphrase,
   4421 			   sizeof(params.passphrase));
   4422 	}
   4423 	os_memcpy(params.ssid, ssid->ssid, ssid->ssid_len);
   4424 	params.ssid_len = ssid->ssid_len;
   4425 	params.persistent_group = 1;
   4426 
   4427 	wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1);
   4428 	if (wpa_s == NULL)
   4429 		return -1;
   4430 
   4431 	wpas_start_wps_go(wpa_s, &params, 0);
   4432 
   4433 	return 0;
   4434 }
   4435 
   4436 
   4437 static void wpas_p2p_ie_update(void *ctx, struct wpabuf *beacon_ies,
   4438 			       struct wpabuf *proberesp_ies)
   4439 {
   4440 	struct wpa_supplicant *wpa_s = ctx;
   4441 	if (wpa_s->ap_iface) {
   4442 		struct hostapd_data *hapd = wpa_s->ap_iface->bss[0];
   4443 		if (!(hapd->conf->p2p & P2P_GROUP_OWNER)) {
   4444 			wpabuf_free(beacon_ies);
   4445 			wpabuf_free(proberesp_ies);
   4446 			return;
   4447 		}
   4448 		if (beacon_ies) {
   4449 			wpabuf_free(hapd->p2p_beacon_ie);
   4450 			hapd->p2p_beacon_ie = beacon_ies;
   4451 		}
   4452 		wpabuf_free(hapd->p2p_probe_resp_ie);
   4453 		hapd->p2p_probe_resp_ie = proberesp_ies;
   4454 	} else {
   4455 		wpabuf_free(beacon_ies);
   4456 		wpabuf_free(proberesp_ies);
   4457 	}
   4458 	wpa_supplicant_ap_update_beacon(wpa_s);
   4459 }
   4460 
   4461 
   4462 static void wpas_p2p_idle_update(void *ctx, int idle)
   4463 {
   4464 	struct wpa_supplicant *wpa_s = ctx;
   4465 	if (!wpa_s->ap_iface)
   4466 		return;
   4467 	wpa_printf(MSG_DEBUG, "P2P: GO - group %sidle", idle ? "" : "not ");
   4468 	if (idle)
   4469 		wpas_p2p_set_group_idle_timeout(wpa_s);
   4470 	else
   4471 		eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
   4472 }
   4473 
   4474 
   4475 struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
   4476 				       struct wpa_ssid *ssid)
   4477 {
   4478 	struct p2p_group *group;
   4479 	struct p2p_group_config *cfg;
   4480 
   4481 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4482 		return NULL;
   4483 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4484 		return NULL;
   4485 
   4486 	cfg = os_zalloc(sizeof(*cfg));
   4487 	if (cfg == NULL)
   4488 		return NULL;
   4489 
   4490 	if (ssid->p2p_persistent_group && wpa_s->conf->persistent_reconnect)
   4491 		cfg->persistent_group = 2;
   4492 	else if (ssid->p2p_persistent_group)
   4493 		cfg->persistent_group = 1;
   4494 	os_memcpy(cfg->interface_addr, wpa_s->own_addr, ETH_ALEN);
   4495 	if (wpa_s->max_stations &&
   4496 	    wpa_s->max_stations < wpa_s->conf->max_num_sta)
   4497 		cfg->max_clients = wpa_s->max_stations;
   4498 	else
   4499 		cfg->max_clients = wpa_s->conf->max_num_sta;
   4500 	os_memcpy(cfg->ssid, ssid->ssid, ssid->ssid_len);
   4501 	cfg->ssid_len = ssid->ssid_len;
   4502 	cfg->cb_ctx = wpa_s;
   4503 	cfg->ie_update = wpas_p2p_ie_update;
   4504 	cfg->idle_update = wpas_p2p_idle_update;
   4505 
   4506 	group = p2p_group_init(wpa_s->global->p2p, cfg);
   4507 	if (group == NULL)
   4508 		os_free(cfg);
   4509 	if (ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION)
   4510 		p2p_group_notif_formation_done(group);
   4511 	wpa_s->p2p_group = group;
   4512 	return group;
   4513 }
   4514 
   4515 
   4516 void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
   4517 			  int registrar)
   4518 {
   4519 	struct wpa_ssid *ssid = wpa_s->current_ssid;
   4520 
   4521 	if (!wpa_s->p2p_in_provisioning) {
   4522 		wpa_printf(MSG_DEBUG, "P2P: Ignore WPS success event - P2P "
   4523 			   "provisioning not in progress");
   4524 		return;
   4525 	}
   4526 
   4527 	if (ssid && ssid->mode == WPAS_MODE_INFRA) {
   4528 		u8 go_dev_addr[ETH_ALEN];
   4529 		os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN);
   4530 		wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
   4531 					  ssid->ssid_len);
   4532 		/* Clear any stored provisioning info */
   4533 		p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr);
   4534 	}
   4535 
   4536 	eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->parent,
   4537 			     NULL);
   4538 	if (ssid && ssid->mode == WPAS_MODE_INFRA) {
   4539 		/*
   4540 		 * Use a separate timeout for initial data connection to
   4541 		 * complete to allow the group to be removed automatically if
   4542 		 * something goes wrong in this step before the P2P group idle
   4543 		 * timeout mechanism is taken into use.
   4544 		 */
   4545 		eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0,
   4546 				       wpas_p2p_group_formation_timeout,
   4547 				       wpa_s->parent, NULL);
   4548 	}
   4549 	if (wpa_s->global->p2p)
   4550 		p2p_wps_success_cb(wpa_s->global->p2p, peer_addr);
   4551 	else if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4552 		wpa_drv_wps_success_cb(wpa_s, peer_addr);
   4553 	wpas_group_formation_completed(wpa_s, 1);
   4554 }
   4555 
   4556 
   4557 void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s,
   4558 			 struct wps_event_fail *fail)
   4559 {
   4560 	if (!wpa_s->p2p_in_provisioning) {
   4561 		wpa_printf(MSG_DEBUG, "P2P: Ignore WPS fail event - P2P "
   4562 			   "provisioning not in progress");
   4563 		return;
   4564 	}
   4565 
   4566 	if (wpa_s->go_params) {
   4567 		p2p_clear_provisioning_info(
   4568 			wpa_s->global->p2p,
   4569 			wpa_s->go_params->peer_device_addr);
   4570 	}
   4571 
   4572 	wpas_notify_p2p_wps_failed(wpa_s, fail);
   4573 }
   4574 
   4575 
   4576 int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
   4577 		       const char *config_method,
   4578 		       enum wpas_p2p_prov_disc_use use)
   4579 {
   4580 	u16 config_methods;
   4581 
   4582 	wpa_s->p2p_fallback_to_go_neg = 0;
   4583 	wpa_s->pending_pd_use = NORMAL_PD;
   4584 	if (os_strncmp(config_method, "display", 7) == 0)
   4585 		config_methods = WPS_CONFIG_DISPLAY;
   4586 	else if (os_strncmp(config_method, "keypad", 6) == 0)
   4587 		config_methods = WPS_CONFIG_KEYPAD;
   4588 	else if (os_strncmp(config_method, "pbc", 3) == 0 ||
   4589 		 os_strncmp(config_method, "pushbutton", 10) == 0)
   4590 		config_methods = WPS_CONFIG_PUSHBUTTON;
   4591 	else {
   4592 		wpa_printf(MSG_DEBUG, "P2P: Unknown config method");
   4593 		return -1;
   4594 	}
   4595 
   4596 	if (use == WPAS_P2P_PD_AUTO) {
   4597 		os_memcpy(wpa_s->pending_join_dev_addr, peer_addr, ETH_ALEN);
   4598 		wpa_s->pending_pd_config_methods = config_methods;
   4599 		wpa_s->p2p_auto_pd = 1;
   4600 		wpa_s->p2p_auto_join = 0;
   4601 		wpa_s->pending_pd_before_join = 0;
   4602 		wpa_s->auto_pd_scan_retry = 0;
   4603 		wpas_p2p_stop_find(wpa_s);
   4604 		wpa_s->p2p_join_scan_count = 0;
   4605 		os_get_time(&wpa_s->p2p_auto_started);
   4606 		wpa_printf(MSG_DEBUG, "P2P: Auto PD started at %ld.%06ld",
   4607 			   wpa_s->p2p_auto_started.sec,
   4608 			   wpa_s->p2p_auto_started.usec);
   4609 		wpas_p2p_join_scan(wpa_s, NULL);
   4610 		return 0;
   4611 	}
   4612 
   4613 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   4614 		return wpa_drv_p2p_prov_disc_req(wpa_s, peer_addr,
   4615 						 config_methods,
   4616 						 use == WPAS_P2P_PD_FOR_JOIN);
   4617 	}
   4618 
   4619 	if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
   4620 		return -1;
   4621 
   4622 	return p2p_prov_disc_req(wpa_s->global->p2p, peer_addr,
   4623 				 config_methods, use == WPAS_P2P_PD_FOR_JOIN,
   4624 				 0, 1);
   4625 }
   4626 
   4627 
   4628 int wpas_p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf,
   4629 			      char *end)
   4630 {
   4631 	return p2p_scan_result_text(ies, ies_len, buf, end);
   4632 }
   4633 
   4634 
   4635 static void wpas_p2p_clear_pending_action_tx(struct wpa_supplicant *wpa_s)
   4636 {
   4637 	if (!offchannel_pending_action_tx(wpa_s))
   4638 		return;
   4639 
   4640 	wpa_printf(MSG_DEBUG, "P2P: Drop pending Action TX due to new "
   4641 		   "operation request");
   4642 	offchannel_clear_pending_action_tx(wpa_s);
   4643 }
   4644 
   4645 
   4646 int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout,
   4647 		  enum p2p_discovery_type type,
   4648 		  unsigned int num_req_dev_types, const u8 *req_dev_types,
   4649 		  const u8 *dev_id, unsigned int search_delay)
   4650 {
   4651 	wpas_p2p_clear_pending_action_tx(wpa_s);
   4652 	wpa_s->p2p_long_listen = 0;
   4653 
   4654 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4655 		return wpa_drv_p2p_find(wpa_s, timeout, type);
   4656 
   4657 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL ||
   4658 	    wpa_s->p2p_in_provisioning)
   4659 		return -1;
   4660 
   4661 	wpa_supplicant_cancel_sched_scan(wpa_s);
   4662 
   4663 	return p2p_find(wpa_s->global->p2p, timeout, type,
   4664 			num_req_dev_types, req_dev_types, dev_id,
   4665 			search_delay);
   4666 }
   4667 
   4668 
   4669 static int wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s)
   4670 {
   4671 	wpas_p2p_clear_pending_action_tx(wpa_s);
   4672 	wpa_s->p2p_long_listen = 0;
   4673 	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
   4674 	eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
   4675 	wpa_s->global->p2p_cb_on_scan_complete = 0;
   4676 
   4677 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT) {
   4678 		wpa_drv_p2p_stop_find(wpa_s);
   4679 		return 1;
   4680 	}
   4681 
   4682 	if (wpa_s->global->p2p)
   4683 		p2p_stop_find(wpa_s->global->p2p);
   4684 
   4685 	return 0;
   4686 }
   4687 
   4688 
   4689 void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s)
   4690 {
   4691 	if (wpas_p2p_stop_find_oper(wpa_s) > 0)
   4692 		return;
   4693 	wpas_p2p_remove_pending_group_interface(wpa_s);
   4694 }
   4695 
   4696 
   4697 static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx)
   4698 {
   4699 	struct wpa_supplicant *wpa_s = eloop_ctx;
   4700 	wpa_s->p2p_long_listen = 0;
   4701 }
   4702 
   4703 
   4704 int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout)
   4705 {
   4706 	int res;
   4707 
   4708 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4709 		return -1;
   4710 
   4711 	wpa_supplicant_cancel_sched_scan(wpa_s);
   4712 	wpas_p2p_clear_pending_action_tx(wpa_s);
   4713 
   4714 	if (timeout == 0) {
   4715 		/*
   4716 		 * This is a request for unlimited Listen state. However, at
   4717 		 * least for now, this is mapped to a Listen state for one
   4718 		 * hour.
   4719 		 */
   4720 		timeout = 3600;
   4721 	}
   4722 	eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
   4723 	wpa_s->p2p_long_listen = 0;
   4724 
   4725 	/*
   4726 	 * Stop previous find/listen operation to avoid trying to request a new
   4727 	 * remain-on-channel operation while the driver is still running the
   4728 	 * previous one.
   4729 	 */
   4730 	if (wpa_s->global->p2p)
   4731 		p2p_stop_find(wpa_s->global->p2p);
   4732 
   4733 	res = wpas_p2p_listen_start(wpa_s, timeout * 1000);
   4734 	if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) {
   4735 		wpa_s->p2p_long_listen = timeout * 1000;
   4736 		eloop_register_timeout(timeout, 0,
   4737 				       wpas_p2p_long_listen_timeout,
   4738 				       wpa_s, NULL);
   4739 	}
   4740 
   4741 	return res;
   4742 }
   4743 
   4744 
   4745 int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
   4746 			  u8 *buf, size_t len, int p2p_group)
   4747 {
   4748 	struct wpabuf *p2p_ie;
   4749 	int ret;
   4750 
   4751 	if (wpa_s->global->p2p_disabled)
   4752 		return -1;
   4753 	if (wpa_s->global->p2p == NULL)
   4754 		return -1;
   4755 	if (bss == NULL)
   4756 		return -1;
   4757 
   4758 	p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
   4759 	ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len,
   4760 			       p2p_group, p2p_ie);
   4761 	wpabuf_free(p2p_ie);
   4762 
   4763 	return ret;
   4764 }
   4765 
   4766 
   4767 int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
   4768 			  const u8 *dst, const u8 *bssid,
   4769 			  const u8 *ie, size_t ie_len, int ssi_signal)
   4770 {
   4771 	if (wpa_s->global->p2p_disabled)
   4772 		return 0;
   4773 	if (wpa_s->global->p2p == NULL)
   4774 		return 0;
   4775 
   4776 	switch (p2p_probe_req_rx(wpa_s->global->p2p, addr, dst, bssid,
   4777 				 ie, ie_len)) {
   4778 	case P2P_PREQ_NOT_P2P:
   4779 		wpas_notify_preq(wpa_s, addr, dst, bssid, ie, ie_len,
   4780 				 ssi_signal);
   4781 		/* fall through */
   4782 	case P2P_PREQ_MALFORMED:
   4783 	case P2P_PREQ_NOT_LISTEN:
   4784 	case P2P_PREQ_NOT_PROCESSED:
   4785 	default: /* make gcc happy */
   4786 		return 0;
   4787 	case P2P_PREQ_PROCESSED:
   4788 		return 1;
   4789 	}
   4790 }
   4791 
   4792 
   4793 void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
   4794 			const u8 *sa, const u8 *bssid,
   4795 			u8 category, const u8 *data, size_t len, int freq)
   4796 {
   4797 	if (wpa_s->global->p2p_disabled)
   4798 		return;
   4799 	if (wpa_s->global->p2p == NULL)
   4800 		return;
   4801 
   4802 	p2p_rx_action(wpa_s->global->p2p, da, sa, bssid, category, data, len,
   4803 		      freq);
   4804 }
   4805 
   4806 
   4807 void wpas_p2p_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ies)
   4808 {
   4809 	if (wpa_s->global->p2p_disabled)
   4810 		return;
   4811 	if (wpa_s->global->p2p == NULL)
   4812 		return;
   4813 
   4814 	p2p_scan_ie(wpa_s->global->p2p, ies, NULL);
   4815 }
   4816 
   4817 
   4818 void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s)
   4819 {
   4820 	p2p_group_deinit(wpa_s->p2p_group);
   4821 	wpa_s->p2p_group = NULL;
   4822 
   4823 	wpa_s->ap_configured_cb = NULL;
   4824 	wpa_s->ap_configured_cb_ctx = NULL;
   4825 	wpa_s->ap_configured_cb_data = NULL;
   4826 	wpa_s->connect_without_scan = NULL;
   4827 }
   4828 
   4829 
   4830 int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
   4831 {
   4832 	wpa_s->p2p_long_listen = 0;
   4833 
   4834 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4835 		return wpa_drv_p2p_reject(wpa_s, addr);
   4836 
   4837 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4838 		return -1;
   4839 
   4840 	return p2p_reject(wpa_s->global->p2p, addr);
   4841 }
   4842 
   4843 
   4844 /* Invite to reinvoke a persistent group */
   4845 int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
   4846 		    struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
   4847 		    int ht40, int pref_freq)
   4848 {
   4849 	enum p2p_invite_role role;
   4850 	u8 *bssid = NULL, bssid_buf[ETH_ALEN];
   4851 	int force_freq = 0, oper_freq = 0;
   4852 	int res;
   4853 
   4854 	wpa_s->global->p2p_invite_group = NULL;
   4855 	if (peer_addr)
   4856 		os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
   4857 	else
   4858 		os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
   4859 
   4860 	wpa_s->p2p_persistent_go_freq = freq;
   4861 	wpa_s->p2p_go_ht40 = !!ht40;
   4862 	if (ssid->mode == WPAS_MODE_P2P_GO) {
   4863 		role = P2P_INVITE_ROLE_GO;
   4864 		if (peer_addr == NULL) {
   4865 			wpa_printf(MSG_DEBUG, "P2P: Missing peer "
   4866 				   "address in invitation command");
   4867 			return -1;
   4868 		}
   4869 		if (wpas_p2p_create_iface(wpa_s)) {
   4870 			if (wpas_p2p_add_group_interface(wpa_s,
   4871 							 WPA_IF_P2P_GO) < 0) {
   4872 				wpa_printf(MSG_ERROR, "P2P: Failed to "
   4873 					   "allocate a new interface for the "
   4874 					   "group");
   4875 				return -1;
   4876 			}
   4877 			bssid = wpa_s->pending_interface_addr;
   4878 		} else
   4879 			bssid = wpa_s->own_addr;
   4880 	} else {
   4881 		role = P2P_INVITE_ROLE_CLIENT;
   4882 		peer_addr = ssid->bssid;
   4883 	}
   4884 	wpa_s->pending_invite_ssid_id = ssid->id;
   4885 
   4886 	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid_buf) == 0 &&
   4887 	    wpa_s->assoc_freq) {
   4888 		oper_freq = wpa_s->assoc_freq;
   4889 		if (bssid == NULL)
   4890 			bssid = bssid_buf;
   4891 	} else {
   4892 		oper_freq = wpa_drv_shared_freq(wpa_s);
   4893 		if (oper_freq < 0)
   4894 			oper_freq = 0;
   4895 	}
   4896 
   4897 	res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
   4898 				   &oper_freq);
   4899 	if (res)
   4900 		return res;
   4901 
   4902 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4903 		return wpa_drv_p2p_invite(wpa_s, peer_addr, role, bssid,
   4904 					  ssid->ssid, ssid->ssid_len,
   4905 					  go_dev_addr, 1);
   4906 
   4907 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4908 		return -1;
   4909 
   4910 	return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
   4911 			  ssid->ssid, ssid->ssid_len, force_freq, go_dev_addr,
   4912 			  1, pref_freq);
   4913 }
   4914 
   4915 
   4916 /* Invite to join an active group */
   4917 int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
   4918 			  const u8 *peer_addr, const u8 *go_dev_addr)
   4919 {
   4920 	struct wpa_global *global = wpa_s->global;
   4921 	enum p2p_invite_role role;
   4922 	u8 *bssid = NULL, bssid_buf[ETH_ALEN];
   4923 	struct wpa_ssid *ssid;
   4924 	int persistent;
   4925 	int force_freq = 0, oper_freq = 0, pref_freq = 0;
   4926 	int res;
   4927 
   4928 	wpa_s->p2p_persistent_go_freq = 0;
   4929 	wpa_s->p2p_go_ht40 = 0;
   4930 
   4931 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   4932 		if (os_strcmp(wpa_s->ifname, ifname) == 0)
   4933 			break;
   4934 	}
   4935 	if (wpa_s == NULL) {
   4936 		wpa_printf(MSG_DEBUG, "P2P: Interface '%s' not found", ifname);
   4937 		return -1;
   4938 	}
   4939 
   4940 	ssid = wpa_s->current_ssid;
   4941 	if (ssid == NULL) {
   4942 		wpa_printf(MSG_DEBUG, "P2P: No current SSID to use for "
   4943 			   "invitation");
   4944 		return -1;
   4945 	}
   4946 
   4947 	wpa_s->global->p2p_invite_group = wpa_s;
   4948 	persistent = ssid->p2p_persistent_group &&
   4949 		wpas_p2p_get_persistent(wpa_s->parent, peer_addr,
   4950 					ssid->ssid, ssid->ssid_len);
   4951 
   4952 	if (ssid->mode == WPAS_MODE_P2P_GO) {
   4953 		role = P2P_INVITE_ROLE_ACTIVE_GO;
   4954 		bssid = wpa_s->own_addr;
   4955 		if (go_dev_addr == NULL)
   4956 			go_dev_addr = wpa_s->global->p2p_dev_addr;
   4957 	} else {
   4958 		role = P2P_INVITE_ROLE_CLIENT;
   4959 		if (wpa_s->wpa_state < WPA_ASSOCIATED) {
   4960 			wpa_printf(MSG_DEBUG, "P2P: Not associated - cannot "
   4961 				   "invite to current group");
   4962 			return -1;
   4963 		}
   4964 		bssid = wpa_s->bssid;
   4965 		if (go_dev_addr == NULL &&
   4966 		    !is_zero_ether_addr(wpa_s->go_dev_addr))
   4967 			go_dev_addr = wpa_s->go_dev_addr;
   4968 	}
   4969 	wpa_s->parent->pending_invite_ssid_id = -1;
   4970 
   4971 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   4972 		return wpa_drv_p2p_invite(wpa_s, peer_addr, role, bssid,
   4973 					  ssid->ssid, ssid->ssid_len,
   4974 					  go_dev_addr, persistent);
   4975 
   4976 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   4977 		return -1;
   4978 
   4979 	if (wpa_s->current_ssid && wpa_drv_get_bssid(wpa_s, bssid_buf) == 0 &&
   4980 	    wpa_s->assoc_freq) {
   4981 		oper_freq = wpa_s->assoc_freq;
   4982 		if (bssid == NULL)
   4983 			bssid = bssid_buf;
   4984 	} else {
   4985 		oper_freq = wpa_drv_shared_freq(wpa_s);
   4986 		if (oper_freq < 0)
   4987 			oper_freq = 0;
   4988 	}
   4989 
   4990 	res = wpas_p2p_setup_freqs(wpa_s, 0, &force_freq, &pref_freq,
   4991 				   &oper_freq);
   4992 	if (res)
   4993 		return res;
   4994 	wpas_p2p_set_own_freq_preference(wpa_s, oper_freq);
   4995 
   4996 	return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
   4997 			  ssid->ssid, ssid->ssid_len, force_freq,
   4998 			  go_dev_addr, persistent, pref_freq);
   4999 }
   5000 
   5001 
   5002 void wpas_p2p_completed(struct wpa_supplicant *wpa_s)
   5003 {
   5004 	struct wpa_ssid *ssid = wpa_s->current_ssid;
   5005 	const char *ssid_txt;
   5006 	u8 go_dev_addr[ETH_ALEN];
   5007 	int network_id = -1;
   5008 	int persistent;
   5009 	int freq;
   5010 
   5011 	if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION) {
   5012 		eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
   5013 				     wpa_s->parent, NULL);
   5014 	}
   5015 
   5016 	if (!wpa_s->show_group_started || !ssid)
   5017 		goto done;
   5018 
   5019 	wpa_s->show_group_started = 0;
   5020 
   5021 	ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len);
   5022 	os_memset(go_dev_addr, 0, ETH_ALEN);
   5023 	if (ssid->bssid_set)
   5024 		os_memcpy(go_dev_addr, ssid->bssid, ETH_ALEN);
   5025 	persistent = wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
   5026 					       ssid->ssid_len);
   5027 	os_memcpy(wpa_s->go_dev_addr, go_dev_addr, ETH_ALEN);
   5028 
   5029 	if (wpa_s->global->p2p_group_formation == wpa_s)
   5030 		wpa_s->global->p2p_group_formation = NULL;
   5031 
   5032 	freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
   5033 		(int) wpa_s->assoc_freq;
   5034 	if (ssid->passphrase == NULL && ssid->psk_set) {
   5035 		char psk[65];
   5036 		wpa_snprintf_hex(psk, sizeof(psk), ssid->psk, 32);
   5037 		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
   5038 			"%s client ssid=\"%s\" freq=%d psk=%s go_dev_addr="
   5039 			MACSTR "%s",
   5040 			wpa_s->ifname, ssid_txt, freq, psk,
   5041 			MAC2STR(go_dev_addr),
   5042 			persistent ? " [PERSISTENT]" : "");
   5043 	} else {
   5044 		wpa_msg(wpa_s->parent, MSG_INFO, P2P_EVENT_GROUP_STARTED
   5045 			"%s client ssid=\"%s\" freq=%d passphrase=\"%s\" "
   5046 			"go_dev_addr=" MACSTR "%s",
   5047 			wpa_s->ifname, ssid_txt, freq,
   5048 			ssid->passphrase ? ssid->passphrase : "",
   5049 			MAC2STR(go_dev_addr),
   5050 			persistent ? " [PERSISTENT]" : "");
   5051 	}
   5052 
   5053 	if (persistent)
   5054 		network_id = wpas_p2p_store_persistent_group(wpa_s->parent,
   5055 							     ssid, go_dev_addr);
   5056 	if (network_id < 0)
   5057 		network_id = ssid->id;
   5058 	wpas_notify_p2p_group_started(wpa_s, ssid, network_id, 1);
   5059 
   5060 done:
   5061 	wpas_p2p_continue_after_scan(wpa_s);
   5062 }
   5063 
   5064 
   5065 int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
   5066 			  u32 interval1, u32 duration2, u32 interval2)
   5067 {
   5068 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   5069 		return -1;
   5070 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5071 		return -1;
   5072 
   5073 	if (wpa_s->wpa_state < WPA_ASSOCIATED ||
   5074 	    wpa_s->current_ssid == NULL ||
   5075 	    wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
   5076 		return -1;
   5077 
   5078 	return p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
   5079 				wpa_s->own_addr, wpa_s->assoc_freq,
   5080 				duration1, interval1, duration2, interval2);
   5081 }
   5082 
   5083 
   5084 int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
   5085 			unsigned int interval)
   5086 {
   5087 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   5088 		return -1;
   5089 
   5090 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5091 		return -1;
   5092 
   5093 	return p2p_ext_listen(wpa_s->global->p2p, period, interval);
   5094 }
   5095 
   5096 
   5097 static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
   5098 {
   5099 	if (wpa_s->current_ssid == NULL) {
   5100 		/*
   5101 		 * current_ssid can be cleared when P2P client interface gets
   5102 		 * disconnected, so assume this interface was used as P2P
   5103 		 * client.
   5104 		 */
   5105 		return 1;
   5106 	}
   5107 	return wpa_s->current_ssid->p2p_group &&
   5108 		wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
   5109 }
   5110 
   5111 
   5112 static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx)
   5113 {
   5114 	struct wpa_supplicant *wpa_s = eloop_ctx;
   5115 
   5116 	if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) {
   5117 		wpa_printf(MSG_DEBUG, "P2P: Ignore group idle timeout - "
   5118 			   "disabled");
   5119 		return;
   5120 	}
   5121 
   5122 	wpa_printf(MSG_DEBUG, "P2P: Group idle timeout reached - terminate "
   5123 		   "group");
   5124 	wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_IDLE_TIMEOUT);
   5125 }
   5126 
   5127 
   5128 static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s)
   5129 {
   5130 	int timeout;
   5131 
   5132 	if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
   5133 		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
   5134 
   5135 	if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
   5136 		return;
   5137 
   5138 	timeout = wpa_s->conf->p2p_group_idle;
   5139 	if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
   5140 	    (timeout == 0 || timeout > P2P_MAX_CLIENT_IDLE))
   5141 	    timeout = P2P_MAX_CLIENT_IDLE;
   5142 
   5143 	if (timeout == 0)
   5144 		return;
   5145 
   5146 	if (timeout < 0) {
   5147 		if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA)
   5148 			timeout = 0; /* special client mode no-timeout */
   5149 		else
   5150 			return;
   5151 	}
   5152 
   5153 	if (wpa_s->p2p_in_provisioning) {
   5154 		/*
   5155 		 * Use the normal group formation timeout during the
   5156 		 * provisioning phase to avoid terminating this process too
   5157 		 * early due to group idle timeout.
   5158 		 */
   5159 		wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
   5160 			   "during provisioning");
   5161 		return;
   5162 	}
   5163 #ifndef ANDROID_P2P
   5164 	if (wpa_s->show_group_started) {
   5165 		/*
   5166 		 * Use the normal group formation timeout between the end of
   5167 		 * the provisioning phase and completion of 4-way handshake to
   5168 		 * avoid terminating this process too early due to group idle
   5169 		 * timeout.
   5170 		 */
   5171 		wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
   5172 			   "while waiting for initial 4-way handshake to "
   5173 			   "complete");
   5174 		return;
   5175 	}
   5176 #endif
   5177 
   5178 	wpa_printf(MSG_DEBUG, "P2P: Set P2P group idle timeout to %u seconds",
   5179 		   timeout);
   5180 	eloop_register_timeout(timeout, 0, wpas_p2p_group_idle_timeout,
   5181 			       wpa_s, NULL);
   5182 }
   5183 
   5184 
   5185 /* Returns 1 if the interface was removed */
   5186 int wpas_p2p_deauth_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
   5187 			  u16 reason_code, const u8 *ie, size_t ie_len,
   5188 			  int locally_generated)
   5189 {
   5190 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5191 		return 0;
   5192 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   5193 		return 0;
   5194 
   5195 	if (!locally_generated)
   5196 		p2p_deauth_notif(wpa_s->global->p2p, bssid, reason_code, ie,
   5197 				 ie_len);
   5198 
   5199 	if (reason_code == WLAN_REASON_DEAUTH_LEAVING && !locally_generated &&
   5200 	    wpa_s->current_ssid &&
   5201 	    wpa_s->current_ssid->p2p_group &&
   5202 	    wpa_s->current_ssid->mode == WPAS_MODE_INFRA) {
   5203 		wpa_printf(MSG_DEBUG, "P2P: GO indicated that the P2P Group "
   5204 			   "session is ending");
   5205 		if (wpas_p2p_group_delete(wpa_s,
   5206 					  P2P_GROUP_REMOVAL_GO_ENDING_SESSION)
   5207 		    > 0)
   5208 			return 1;
   5209 	}
   5210 
   5211 	return 0;
   5212 }
   5213 
   5214 
   5215 void wpas_p2p_disassoc_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
   5216 			     u16 reason_code, const u8 *ie, size_t ie_len,
   5217 			     int locally_generated)
   5218 {
   5219 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5220 		return;
   5221 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   5222 		return;
   5223 
   5224 	if (!locally_generated)
   5225 		p2p_disassoc_notif(wpa_s->global->p2p, bssid, reason_code, ie,
   5226 				   ie_len);
   5227 }
   5228 
   5229 
   5230 void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
   5231 {
   5232 	struct p2p_data *p2p = wpa_s->global->p2p;
   5233 
   5234 	if (p2p == NULL)
   5235 		return;
   5236 
   5237 	if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
   5238 		return;
   5239 
   5240 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME)
   5241 		p2p_set_dev_name(p2p, wpa_s->conf->device_name);
   5242 
   5243 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE)
   5244 		p2p_set_pri_dev_type(p2p, wpa_s->conf->device_type);
   5245 
   5246 	if (wpa_s->wps &&
   5247 	    (wpa_s->conf->changed_parameters & CFG_CHANGED_CONFIG_METHODS))
   5248 		p2p_set_config_methods(p2p, wpa_s->wps->config_methods);
   5249 
   5250 	if (wpa_s->wps && (wpa_s->conf->changed_parameters & CFG_CHANGED_UUID))
   5251 		p2p_set_uuid(p2p, wpa_s->wps->uuid);
   5252 
   5253 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_WPS_STRING) {
   5254 		p2p_set_manufacturer(p2p, wpa_s->conf->manufacturer);
   5255 		p2p_set_model_name(p2p, wpa_s->conf->model_name);
   5256 		p2p_set_model_number(p2p, wpa_s->conf->model_number);
   5257 		p2p_set_serial_number(p2p, wpa_s->conf->serial_number);
   5258 	}
   5259 
   5260 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_SEC_DEVICE_TYPE)
   5261 		p2p_set_sec_dev_types(p2p,
   5262 				      (void *) wpa_s->conf->sec_device_type,
   5263 				      wpa_s->conf->num_sec_device_types);
   5264 
   5265 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_VENDOR_EXTENSION) {
   5266 		int i;
   5267 		p2p_remove_wps_vendor_extensions(p2p);
   5268 		for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
   5269 			if (wpa_s->conf->wps_vendor_ext[i] == NULL)
   5270 				continue;
   5271 			p2p_add_wps_vendor_extension(
   5272 				p2p, wpa_s->conf->wps_vendor_ext[i]);
   5273 		}
   5274 	}
   5275 
   5276 	if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
   5277 	    wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
   5278 		char country[3];
   5279 		country[0] = wpa_s->conf->country[0];
   5280 		country[1] = wpa_s->conf->country[1];
   5281 		country[2] = 0x04;
   5282 		p2p_set_country(p2p, country);
   5283 	}
   5284 
   5285 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_SSID_POSTFIX) {
   5286 		p2p_set_ssid_postfix(p2p, (u8 *) wpa_s->conf->p2p_ssid_postfix,
   5287 				     wpa_s->conf->p2p_ssid_postfix ?
   5288 				     os_strlen(wpa_s->conf->p2p_ssid_postfix) :
   5289 				     0);
   5290 	}
   5291 
   5292 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_INTRA_BSS)
   5293 		p2p_set_intra_bss_dist(p2p, wpa_s->conf->p2p_intra_bss);
   5294 
   5295 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_LISTEN_CHANNEL) {
   5296 		u8 reg_class, channel;
   5297 		int ret;
   5298 		unsigned int r;
   5299 		if (wpa_s->conf->p2p_listen_reg_class &&
   5300 		    wpa_s->conf->p2p_listen_channel) {
   5301 			reg_class = wpa_s->conf->p2p_listen_reg_class;
   5302 			channel = wpa_s->conf->p2p_listen_channel;
   5303 		} else {
   5304 			reg_class = 81;
   5305 			/*
   5306 			 * Pick one of the social channels randomly as the
   5307 			 * listen channel.
   5308 			 */
   5309 			os_get_random((u8 *) &r, sizeof(r));
   5310 			channel = 1 + (r % 3) * 5;
   5311 		}
   5312 		ret = p2p_set_listen_channel(p2p, reg_class, channel);
   5313 		if (ret)
   5314 			wpa_printf(MSG_ERROR, "P2P: Own listen channel update "
   5315 				   "failed: %d", ret);
   5316 	}
   5317 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_OPER_CHANNEL) {
   5318 		u8 op_reg_class, op_channel, cfg_op_channel;
   5319 		int ret = 0;
   5320 		unsigned int r;
   5321 		if (wpa_s->conf->p2p_oper_reg_class &&
   5322 		    wpa_s->conf->p2p_oper_channel) {
   5323 			op_reg_class = wpa_s->conf->p2p_oper_reg_class;
   5324 			op_channel = wpa_s->conf->p2p_oper_channel;
   5325 			cfg_op_channel = 1;
   5326 		} else {
   5327 			op_reg_class = 81;
   5328 			/*
   5329 			 * Use random operation channel from (1, 6, 11)
   5330 			 *if no other preference is indicated.
   5331 			 */
   5332 			os_get_random((u8 *) &r, sizeof(r));
   5333 			op_channel = 1 + (r % 3) * 5;
   5334 			cfg_op_channel = 0;
   5335 		}
   5336 		ret = p2p_set_oper_channel(p2p, op_reg_class, op_channel,
   5337 					   cfg_op_channel);
   5338 		if (ret)
   5339 			wpa_printf(MSG_ERROR, "P2P: Own oper channel update "
   5340 				   "failed: %d", ret);
   5341 	}
   5342 
   5343 	if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PREF_CHAN) {
   5344 		if (p2p_set_pref_chan(p2p, wpa_s->conf->num_p2p_pref_chan,
   5345 				      wpa_s->conf->p2p_pref_chan) < 0) {
   5346 			wpa_printf(MSG_ERROR, "P2P: Preferred channel list "
   5347 				   "update failed");
   5348 		}
   5349 	}
   5350 }
   5351 
   5352 
   5353 int wpas_p2p_set_noa(struct wpa_supplicant *wpa_s, u8 count, int start,
   5354 		     int duration)
   5355 {
   5356 	if (!wpa_s->ap_iface)
   5357 		return -1;
   5358 	return hostapd_p2p_set_noa(wpa_s->ap_iface->bss[0], count, start,
   5359 				   duration);
   5360 }
   5361 
   5362 
   5363 int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled)
   5364 {
   5365 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5366 		return -1;
   5367 	if (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT)
   5368 		return -1;
   5369 
   5370 	wpa_s->global->cross_connection = enabled;
   5371 	p2p_set_cross_connect(wpa_s->global->p2p, enabled);
   5372 
   5373 	if (!enabled) {
   5374 		struct wpa_supplicant *iface;
   5375 
   5376 		for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
   5377 		{
   5378 			if (iface->cross_connect_enabled == 0)
   5379 				continue;
   5380 
   5381 			iface->cross_connect_enabled = 0;
   5382 			iface->cross_connect_in_use = 0;
   5383 			wpa_msg(iface->parent, MSG_INFO,
   5384 				P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
   5385 				iface->ifname, iface->cross_connect_uplink);
   5386 		}
   5387 	}
   5388 
   5389 	return 0;
   5390 }
   5391 
   5392 
   5393 static void wpas_p2p_enable_cross_connect(struct wpa_supplicant *uplink)
   5394 {
   5395 	struct wpa_supplicant *iface;
   5396 
   5397 	if (!uplink->global->cross_connection)
   5398 		return;
   5399 
   5400 	for (iface = uplink->global->ifaces; iface; iface = iface->next) {
   5401 		if (!iface->cross_connect_enabled)
   5402 			continue;
   5403 		if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
   5404 		    0)
   5405 			continue;
   5406 		if (iface->ap_iface == NULL)
   5407 			continue;
   5408 		if (iface->cross_connect_in_use)
   5409 			continue;
   5410 
   5411 		iface->cross_connect_in_use = 1;
   5412 		wpa_msg(iface->parent, MSG_INFO,
   5413 			P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
   5414 			iface->ifname, iface->cross_connect_uplink);
   5415 	}
   5416 }
   5417 
   5418 
   5419 static void wpas_p2p_disable_cross_connect(struct wpa_supplicant *uplink)
   5420 {
   5421 	struct wpa_supplicant *iface;
   5422 
   5423 	for (iface = uplink->global->ifaces; iface; iface = iface->next) {
   5424 		if (!iface->cross_connect_enabled)
   5425 			continue;
   5426 		if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
   5427 		    0)
   5428 			continue;
   5429 		if (!iface->cross_connect_in_use)
   5430 			continue;
   5431 
   5432 		wpa_msg(iface->parent, MSG_INFO,
   5433 			P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
   5434 			iface->ifname, iface->cross_connect_uplink);
   5435 		iface->cross_connect_in_use = 0;
   5436 	}
   5437 }
   5438 
   5439 
   5440 void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s)
   5441 {
   5442 	if (wpa_s->ap_iface || wpa_s->current_ssid == NULL ||
   5443 	    wpa_s->current_ssid->mode != WPAS_MODE_INFRA ||
   5444 	    wpa_s->cross_connect_disallowed)
   5445 		wpas_p2p_disable_cross_connect(wpa_s);
   5446 	else
   5447 		wpas_p2p_enable_cross_connect(wpa_s);
   5448 	if (!wpa_s->ap_iface &&
   5449 	    eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
   5450 		wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
   5451 }
   5452 
   5453 
   5454 void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s)
   5455 {
   5456 	wpas_p2p_disable_cross_connect(wpa_s);
   5457 	if (!wpa_s->ap_iface &&
   5458 	    !eloop_is_timeout_registered(wpas_p2p_group_idle_timeout,
   5459 					 wpa_s, NULL))
   5460 		wpas_p2p_set_group_idle_timeout(wpa_s);
   5461 }
   5462 
   5463 
   5464 static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s)
   5465 {
   5466 	struct wpa_supplicant *iface;
   5467 
   5468 	if (!wpa_s->global->cross_connection)
   5469 		return;
   5470 
   5471 	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
   5472 		if (iface == wpa_s)
   5473 			continue;
   5474 		if (iface->drv_flags &
   5475 		    WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)
   5476 			continue;
   5477 		if (iface->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE)
   5478 			continue;
   5479 
   5480 		wpa_s->cross_connect_enabled = 1;
   5481 		os_strlcpy(wpa_s->cross_connect_uplink, iface->ifname,
   5482 			   sizeof(wpa_s->cross_connect_uplink));
   5483 		wpa_printf(MSG_DEBUG, "P2P: Enable cross connection from "
   5484 			   "%s to %s whenever uplink is available",
   5485 			   wpa_s->ifname, wpa_s->cross_connect_uplink);
   5486 
   5487 		if (iface->ap_iface || iface->current_ssid == NULL ||
   5488 		    iface->current_ssid->mode != WPAS_MODE_INFRA ||
   5489 		    iface->cross_connect_disallowed ||
   5490 		    iface->wpa_state != WPA_COMPLETED)
   5491 			break;
   5492 
   5493 		wpa_s->cross_connect_in_use = 1;
   5494 		wpa_msg(wpa_s->parent, MSG_INFO,
   5495 			P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
   5496 			wpa_s->ifname, wpa_s->cross_connect_uplink);
   5497 		break;
   5498 	}
   5499 }
   5500 
   5501 
   5502 int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s)
   5503 {
   5504 	if (wpa_s->p2p_group_interface != P2P_GROUP_INTERFACE_CLIENT &&
   5505 	    !wpa_s->p2p_in_provisioning)
   5506 		return 0; /* not P2P client operation */
   5507 
   5508 	wpa_printf(MSG_DEBUG, "P2P: Terminate connection due to WPS PBC "
   5509 		   "session overlap");
   5510 	if (wpa_s != wpa_s->parent)
   5511 		wpa_msg_ctrl(wpa_s->parent, MSG_INFO, WPS_EVENT_OVERLAP);
   5512 
   5513 	if (wpa_s->global->p2p)
   5514 		p2p_group_formation_failed(wpa_s->global->p2p);
   5515 
   5516 	eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
   5517 			     wpa_s->parent, NULL);
   5518 
   5519 	wpas_group_formation_completed(wpa_s, 0);
   5520 	return 1;
   5521 }
   5522 
   5523 
   5524 void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s)
   5525 {
   5526 	struct p2p_channels chan;
   5527 
   5528 	if (wpa_s->global == NULL || wpa_s->global->p2p == NULL)
   5529 		return;
   5530 
   5531 	os_memset(&chan, 0, sizeof(chan));
   5532 	if (wpas_p2p_setup_channels(wpa_s, &chan)) {
   5533 		wpa_printf(MSG_ERROR, "P2P: Failed to update supported "
   5534 			   "channel list");
   5535 		return;
   5536 	}
   5537 
   5538 	p2p_update_channel_list(wpa_s->global->p2p, &chan);
   5539 }
   5540 
   5541 
   5542 static void wpas_p2p_scan_res_ignore(struct wpa_supplicant *wpa_s,
   5543 				     struct wpa_scan_results *scan_res)
   5544 {
   5545 	wpa_printf(MSG_DEBUG, "P2P: Ignore scan results");
   5546 }
   5547 
   5548 
   5549 int wpas_p2p_cancel(struct wpa_supplicant *wpa_s)
   5550 {
   5551 	struct wpa_global *global = wpa_s->global;
   5552 	int found = 0;
   5553 	const u8 *peer;
   5554 
   5555 	if (global->p2p == NULL)
   5556 		return -1;
   5557 
   5558 	wpa_printf(MSG_DEBUG, "P2P: Request to cancel group formation");
   5559 
   5560 	if (wpa_s->pending_interface_name[0] &&
   5561 	    !is_zero_ether_addr(wpa_s->pending_interface_addr))
   5562 		found = 1;
   5563 
   5564 	peer = p2p_get_go_neg_peer(global->p2p);
   5565 	if (peer) {
   5566 		wpa_printf(MSG_DEBUG, "P2P: Unauthorize pending GO Neg peer "
   5567 			   MACSTR, MAC2STR(peer));
   5568 		p2p_unauthorize(global->p2p, peer);
   5569 		found = 1;
   5570 	}
   5571 
   5572 	if (wpa_s->scan_res_handler == wpas_p2p_scan_res_join) {
   5573 		wpa_printf(MSG_DEBUG, "P2P: Stop pending scan for join");
   5574 		wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore;
   5575 		found = 1;
   5576 	}
   5577 
   5578 	if (wpa_s->pending_pd_before_join) {
   5579 		wpa_printf(MSG_DEBUG, "P2P: Stop pending PD before join");
   5580 		wpa_s->pending_pd_before_join = 0;
   5581 		found = 1;
   5582 	}
   5583 
   5584 	wpas_p2p_stop_find(wpa_s);
   5585 
   5586 	for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
   5587 		if (wpa_s == global->p2p_group_formation &&
   5588 		    (wpa_s->p2p_in_provisioning ||
   5589 		     wpa_s->parent->pending_interface_type ==
   5590 		     WPA_IF_P2P_CLIENT)) {
   5591 			wpa_printf(MSG_DEBUG, "P2P: Interface %s in group "
   5592 				   "formation found - cancelling",
   5593 				   wpa_s->ifname);
   5594 			found = 1;
   5595 			eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
   5596 					     wpa_s->parent, NULL);
   5597 			if (wpa_s->p2p_in_provisioning) {
   5598 				wpas_group_formation_completed(wpa_s, 0);
   5599 				break;
   5600 			}
   5601 			wpas_p2p_group_delete(wpa_s,
   5602 					      P2P_GROUP_REMOVAL_REQUESTED);
   5603 			break;
   5604 		}
   5605 	}
   5606 
   5607 	if (!found) {
   5608 		wpa_printf(MSG_DEBUG, "P2P: No ongoing group formation found");
   5609 		return -1;
   5610 	}
   5611 
   5612 	return 0;
   5613 }
   5614 
   5615 
   5616 void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s)
   5617 {
   5618 	if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
   5619 		return;
   5620 
   5621 	wpa_printf(MSG_DEBUG, "P2P: Remove group due to driver resource not "
   5622 		   "being available anymore");
   5623 	wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_UNAVAILABLE);
   5624 }
   5625 
   5626 
   5627 void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s,
   5628 				   int freq_24, int freq_5, int freq_overall)
   5629 {
   5630 	struct p2p_data *p2p = wpa_s->global->p2p;
   5631 	if (p2p == NULL || (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT))
   5632 		return;
   5633 	p2p_set_best_channels(p2p, freq_24, freq_5, freq_overall);
   5634 }
   5635 
   5636 
   5637 int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr)
   5638 {
   5639 	u8 peer[ETH_ALEN];
   5640 	struct p2p_data *p2p = wpa_s->global->p2p;
   5641 
   5642 	if (p2p == NULL || (wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_MGMT))
   5643 		return -1;
   5644 
   5645 	if (hwaddr_aton(addr, peer))
   5646 		return -1;
   5647 
   5648 	return p2p_unauthorize(p2p, peer);
   5649 }
   5650 
   5651 
   5652 /**
   5653  * wpas_p2p_disconnect - Disconnect from a P2P Group
   5654  * @wpa_s: Pointer to wpa_supplicant data
   5655  * Returns: 0 on success, -1 on failure
   5656  *
   5657  * This can be used to disconnect from a group in which the local end is a P2P
   5658  * Client or to end a P2P Group in case the local end is the Group Owner. If a
   5659  * virtual network interface was created for this group, that interface will be
   5660  * removed. Otherwise, only the configured P2P group network will be removed
   5661  * from the interface.
   5662  */
   5663 int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s)
   5664 {
   5665 
   5666 	if (wpa_s == NULL)
   5667 		return -1;
   5668 
   5669 	return wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_REQUESTED) < 0 ?
   5670 		-1 : 0;
   5671 }
   5672 
   5673 
   5674 int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s)
   5675 {
   5676 	int ret;
   5677 
   5678 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5679 		return 0;
   5680 
   5681 	ret = p2p_in_progress(wpa_s->global->p2p);
   5682 	if (ret == 0) {
   5683 		/*
   5684 		 * Check whether there is an ongoing WPS provisioning step (or
   5685 		 * other parts of group formation) on another interface since
   5686 		 * p2p_in_progress() does not report this to avoid issues for
   5687 		 * scans during such provisioning step.
   5688 		 */
   5689 		if (wpa_s->global->p2p_group_formation &&
   5690 		    wpa_s->global->p2p_group_formation != wpa_s) {
   5691 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Another interface (%s) "
   5692 				"in group formation",
   5693 				wpa_s->global->p2p_group_formation->ifname);
   5694 			ret = 1;
   5695 		}
   5696 	}
   5697 
   5698 	return ret;
   5699 }
   5700 
   5701 
   5702 void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
   5703 			      struct wpa_ssid *ssid)
   5704 {
   5705 	if (wpa_s->p2p_in_provisioning && ssid->p2p_group &&
   5706 	    eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
   5707 				 wpa_s->parent, NULL) > 0) {
   5708 		/**
   5709 		 * Remove the network by scheduling the group formation
   5710 		 * timeout to happen immediately. The teardown code
   5711 		 * needs to be scheduled to run asynch later so that we
   5712 		 * don't delete data from under ourselves unexpectedly.
   5713 		 * Calling wpas_p2p_group_formation_timeout directly
   5714 		 * causes a series of crashes in WPS failure scenarios.
   5715 		 */
   5716 		wpa_printf(MSG_DEBUG, "P2P: Canceled group formation due to "
   5717 			   "P2P group network getting removed");
   5718 		eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout,
   5719 				       wpa_s->parent, NULL);
   5720 	}
   5721 }
   5722 
   5723 
   5724 struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
   5725 					  const u8 *addr, const u8 *ssid,
   5726 					  size_t ssid_len)
   5727 {
   5728 	struct wpa_ssid *s;
   5729 	size_t i;
   5730 
   5731 	for (s = wpa_s->conf->ssid; s; s = s->next) {
   5732 		if (s->disabled != 2)
   5733 			continue;
   5734 		if (ssid &&
   5735 		    (ssid_len != s->ssid_len ||
   5736 		     os_memcmp(ssid, s->ssid, ssid_len) != 0))
   5737 			continue;
   5738 		if (os_memcmp(s->bssid, addr, ETH_ALEN) == 0)
   5739 			return s; /* peer is GO in the persistent group */
   5740 		if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL)
   5741 			continue;
   5742 		for (i = 0; i < s->num_p2p_clients; i++) {
   5743 			if (os_memcmp(s->p2p_client_list + i * ETH_ALEN,
   5744 				      addr, ETH_ALEN) == 0)
   5745 				return s; /* peer is P2P client in persistent
   5746 					   * group */
   5747 		}
   5748 	}
   5749 
   5750 	return NULL;
   5751 }
   5752 
   5753 
   5754 void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
   5755 				       const u8 *addr)
   5756 {
   5757 	if (addr == NULL)
   5758 		return;
   5759 	wpas_p2p_add_persistent_group_client(wpa_s, addr);
   5760 }
   5761 
   5762 
   5763 static void wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
   5764 					int group_added)
   5765 {
   5766 	struct wpa_supplicant *group = wpa_s;
   5767 	if (wpa_s->global->p2p_group_formation)
   5768 		group = wpa_s->global->p2p_group_formation;
   5769 	wpa_s = wpa_s->parent;
   5770 	offchannel_send_action_done(wpa_s);
   5771 	if (group_added)
   5772 		wpas_p2p_group_delete(group, P2P_GROUP_REMOVAL_SILENT);
   5773 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Fall back to GO Negotiation");
   5774 	wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, wpa_s->p2p_pin,
   5775 			 wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
   5776 			 0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
   5777 			 wpa_s->p2p_persistent_id,
   5778 			 wpa_s->p2p_pd_before_go_neg,
   5779 			 wpa_s->p2p_go_ht40);
   5780 }
   5781 
   5782 
   5783 int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s)
   5784 {
   5785 	if (!wpa_s->p2p_fallback_to_go_neg ||
   5786 	    wpa_s->p2p_in_provisioning <= 5)
   5787 		return 0;
   5788 
   5789 	if (wpas_p2p_peer_go(wpa_s, wpa_s->pending_join_dev_addr) > 0)
   5790 		return 0; /* peer operating as a GO */
   5791 
   5792 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: GO not found for p2p_connect-auto - "
   5793 		"fallback to GO Negotiation");
   5794 	wpas_p2p_fallback_to_go_neg(wpa_s, 1);
   5795 
   5796 	return 1;
   5797 }
   5798 
   5799 
   5800 unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s)
   5801 {
   5802 	const char *rn, *rn2;
   5803 	struct wpa_supplicant *ifs;
   5804 
   5805 	if (wpa_s->wpa_state > WPA_SCANNING) {
   5806 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to "
   5807 			"concurrent operation",
   5808 			P2P_CONCURRENT_SEARCH_DELAY);
   5809 		return P2P_CONCURRENT_SEARCH_DELAY;
   5810 	}
   5811 
   5812 	if (!wpa_s->driver->get_radio_name)
   5813 		return 0;
   5814 	rn = wpa_s->driver->get_radio_name(wpa_s->drv_priv);
   5815 	if (rn == NULL || rn[0] == '\0')
   5816 		return 0;
   5817 
   5818 	for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
   5819 		if (ifs == wpa_s || !ifs->driver->get_radio_name)
   5820 			continue;
   5821 
   5822 		rn2 = ifs->driver->get_radio_name(ifs->drv_priv);
   5823 		if (!rn2 || os_strcmp(rn, rn2) != 0)
   5824 			continue;
   5825 		if (ifs->wpa_state > WPA_SCANNING) {
   5826 			wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search "
   5827 				"delay due to concurrent operation on "
   5828 				"interface %s",
   5829 				P2P_CONCURRENT_SEARCH_DELAY, ifs->ifname);
   5830 			return P2P_CONCURRENT_SEARCH_DELAY;
   5831 		}
   5832 	}
   5833 
   5834 	return 0;
   5835 }
   5836 
   5837 
   5838 void wpas_p2p_continue_after_scan(struct wpa_supplicant *wpa_s)
   5839 {
   5840 	wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Station mode scan operation not "
   5841 		"pending anymore (sta_scan_pending=%d "
   5842 		"p2p_cb_on_scan_complete=%d)", wpa_s->sta_scan_pending,
   5843 		wpa_s->global->p2p_cb_on_scan_complete);
   5844 	wpa_s->sta_scan_pending = 0;
   5845 
   5846 	if (!wpa_s->global->p2p_cb_on_scan_complete)
   5847 		return;
   5848 	wpa_s->global->p2p_cb_on_scan_complete = 0;
   5849 
   5850 	if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
   5851 		return;
   5852 
   5853 	if (p2p_other_scan_completed(wpa_s->global->p2p) == 1) {
   5854 		wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Pending P2P operation "
   5855 			"continued after successful connection");
   5856 		p2p_increase_search_delay(wpa_s->global->p2p,
   5857 					  wpas_p2p_search_delay(wpa_s));
   5858 	}
   5859 }
   5860 
   5861 #ifdef ANDROID_P2P
   5862 int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq,
   5863 	struct wpa_ssid *ssid)
   5864 {
   5865 	struct wpa_supplicant *iface = NULL;
   5866 	struct p2p_data *p2p = wpa_s->global->p2p;
   5867 
   5868 	for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
   5869 		if ((iface->current_ssid) &&
   5870 		    (iface->current_ssid->frequency != freq) &&
   5871 		    ((iface->p2p_group_interface) ||
   5872 		     (iface->current_ssid->p2p_group))) {
   5873 
   5874 			if ((iface->p2p_group_interface == P2P_GROUP_INTERFACE_GO)  ||
   5875 			    (iface->current_ssid->mode == WPAS_MODE_P2P_GO)) {
   5876 				/* Try to see whether we can move the GO. If it
   5877 				 * is not possible, remove the GO interface
   5878 				 */
   5879 				if (wpa_drv_switch_channel(iface, freq) == 0) {
   5880 					wpa_printf(MSG_ERROR, "P2P: GO Moved to freq(%d)", freq);
   5881 					iface->current_ssid->frequency = freq;
   5882 					continue;
   5883 				}
   5884 			}
   5885 
   5886 			/* If GO cannot be moved or if the conflicting interface is a
   5887 			 * P2P Client, remove the interface depending up on the connection
   5888 			 * priority */
   5889 			if(!wpas_is_p2p_prioritized(iface)) {
   5890 				/* STA connection has priority over existing
   5891 				 * P2P connection. So remove the interface */
   5892 				wpa_printf(MSG_DEBUG, "P2P: Removing P2P connection due to Single channel"
   5893 						"concurrent mode frequency conflict");
   5894 				wpas_p2p_group_delete(iface, P2P_GROUP_REMOVAL_FREQ_CONFLICT);
   5895 				/* If connection in progress is p2p connection, do not proceed for the connection */
   5896 				if (wpa_s == iface)
   5897 					return -1;
   5898 				else
   5899 					/* If connection in progress is STA connection, proceed for the connection */
   5900 					return 0;
   5901 			} else {
   5902 				/* P2p connection has priority, disable the STA network*/
   5903 				wpa_supplicant_disable_network(wpa_s->global->ifaces, ssid);
   5904 				wpa_msg(wpa_s->global->ifaces, MSG_INFO, WPA_EVENT_FREQ_CONFLICT
   5905 					" id=%d", ssid->id);
   5906 				os_memset(wpa_s->global->ifaces->pending_bssid, 0, ETH_ALEN);
   5907 				if (wpa_s == iface) {
   5908 					/* p2p connection is in progress, continue connecting...*/
   5909 					return 0;
   5910 				}
   5911 				else {
   5912 					/* STA connection is in progress, do not allow to continue */
   5913 					return -1;
   5914 				}
   5915 			}
   5916 		}
   5917 	}
   5918 	return 0;
   5919 }
   5920 #endif
   5921