LCOV - code coverage report
Current view: top level - wpa_supplicant - p2p_supplicant.c (source / functions) Hit Total Coverage
Test: wpa_supplicant/hostapd combined for hwsim test run 1475438200 Lines: 3817 4722 80.8 %
Date: 2016-10-02 Functions: 210 222 94.6 %

          Line data    Source code
       1             : /*
       2             :  * wpa_supplicant - P2P
       3             :  * Copyright (c) 2009-2010, Atheros Communications
       4             :  * Copyright (c) 2010-2014, Jouni Malinen <j@w1.fi>
       5             :  *
       6             :  * This software may be distributed under the terms of the BSD license.
       7             :  * See README for more details.
       8             :  */
       9             : 
      10             : #include "includes.h"
      11             : 
      12             : #include "common.h"
      13             : #include "eloop.h"
      14             : #include "common/ieee802_11_common.h"
      15             : #include "common/ieee802_11_defs.h"
      16             : #include "common/wpa_ctrl.h"
      17             : #include "wps/wps_i.h"
      18             : #include "p2p/p2p.h"
      19             : #include "ap/hostapd.h"
      20             : #include "ap/ap_config.h"
      21             : #include "ap/sta_info.h"
      22             : #include "ap/ap_drv_ops.h"
      23             : #include "ap/wps_hostapd.h"
      24             : #include "ap/p2p_hostapd.h"
      25             : #include "ap/dfs.h"
      26             : #include "eapol_supp/eapol_supp_sm.h"
      27             : #include "rsn_supp/wpa.h"
      28             : #include "wpa_supplicant_i.h"
      29             : #include "driver_i.h"
      30             : #include "ap.h"
      31             : #include "config_ssid.h"
      32             : #include "config.h"
      33             : #include "notify.h"
      34             : #include "scan.h"
      35             : #include "bss.h"
      36             : #include "offchannel.h"
      37             : #include "wps_supplicant.h"
      38             : #include "p2p_supplicant.h"
      39             : #include "wifi_display.h"
      40             : 
      41             : 
      42             : /*
      43             :  * How many times to try to scan to find the GO before giving up on join
      44             :  * request.
      45             :  */
      46             : #define P2P_MAX_JOIN_SCAN_ATTEMPTS 10
      47             : 
      48             : #define P2P_AUTO_PD_SCAN_ATTEMPTS 5
      49             : 
      50             : /**
      51             :  * Defines time interval in seconds when a GO needs to evacuate a frequency that
      52             :  * it is currently using, but is no longer valid for P2P use cases.
      53             :  */
      54             : #define P2P_GO_FREQ_CHANGE_TIME 5
      55             : 
      56             : /**
      57             :  * Defines CSA parameters which are used when GO evacuates the no longer valid
      58             :  * channel (and if the driver supports channel switch).
      59             :  */
      60             : #define P2P_GO_CSA_COUNT 7
      61             : #define P2P_GO_CSA_BLOCK_TX 0
      62             : 
      63             : #ifndef P2P_MAX_CLIENT_IDLE
      64             : /*
      65             :  * How many seconds to try to reconnect to the GO when connection in P2P client
      66             :  * role has been lost.
      67             :  */
      68             : #define P2P_MAX_CLIENT_IDLE 10
      69             : #endif /* P2P_MAX_CLIENT_IDLE */
      70             : 
      71             : #ifndef P2P_MAX_INITIAL_CONN_WAIT
      72             : /*
      73             :  * How many seconds to wait for initial 4-way handshake to get completed after
      74             :  * WPS provisioning step or after the re-invocation of a persistent group on a
      75             :  * P2P Client.
      76             :  */
      77             : #define P2P_MAX_INITIAL_CONN_WAIT 10
      78             : #endif /* P2P_MAX_INITIAL_CONN_WAIT */
      79             : 
      80             : #ifndef P2P_MAX_INITIAL_CONN_WAIT_GO
      81             : /*
      82             :  * How many seconds to wait for initial 4-way handshake to get completed after
      83             :  * WPS provisioning step on the GO. This controls the extra time the P2P
      84             :  * operation is considered to be in progress (e.g., to delay other scans) after
      85             :  * WPS provisioning has been completed on the GO during group formation.
      86             :  */
      87             : #define P2P_MAX_INITIAL_CONN_WAIT_GO 10
      88             : #endif /* P2P_MAX_INITIAL_CONN_WAIT_GO */
      89             : 
      90             : #ifndef P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE
      91             : /*
      92             :  * How many seconds to wait for initial 4-way handshake to get completed after
      93             :  * re-invocation of a persistent group on the GO when the client is expected
      94             :  * to connect automatically (no user interaction).
      95             :  */
      96             : #define P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE 15
      97             : #endif /* P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE */
      98             : 
      99             : #define P2P_MGMT_DEVICE_PREFIX          "p2p-dev-"
     100             : 
     101             : /*
     102             :  * How many seconds to wait to re-attempt to move GOs, in case previous attempt
     103             :  * was not possible.
     104             :  */
     105             : #define P2P_RECONSIDER_GO_MOVE_DELAY 30
     106             : 
     107             : enum p2p_group_removal_reason {
     108             :         P2P_GROUP_REMOVAL_UNKNOWN,
     109             :         P2P_GROUP_REMOVAL_SILENT,
     110             :         P2P_GROUP_REMOVAL_FORMATION_FAILED,
     111             :         P2P_GROUP_REMOVAL_REQUESTED,
     112             :         P2P_GROUP_REMOVAL_IDLE_TIMEOUT,
     113             :         P2P_GROUP_REMOVAL_UNAVAILABLE,
     114             :         P2P_GROUP_REMOVAL_GO_ENDING_SESSION,
     115             :         P2P_GROUP_REMOVAL_PSK_FAILURE,
     116             :         P2P_GROUP_REMOVAL_FREQ_CONFLICT,
     117             :         P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL
     118             : };
     119             : 
     120             : 
     121             : static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx);
     122             : static struct wpa_supplicant *
     123             : wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
     124             :                          int go);
     125             : static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq,
     126             :                                const u8 *ssid, size_t ssid_len);
     127             : static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq,
     128             :                                 int *force_freq, int *pref_freq, int go,
     129             :                                 unsigned int *pref_freq_list,
     130             :                                 unsigned int *num_pref_freq);
     131             : static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq,
     132             :                                    const u8 *ssid, size_t ssid_len);
     133             : static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx);
     134             : static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
     135             :                          const u8 *dev_addr, enum p2p_wps_method wps_method,
     136             :                          int auto_join, int freq,
     137             :                          const u8 *ssid, size_t ssid_len);
     138             : static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s);
     139             : static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s);
     140             : static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx);
     141             : static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s);
     142             : static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
     143             :                                              void *timeout_ctx);
     144             : static void wpas_p2p_group_freq_conflict(void *eloop_ctx, void *timeout_ctx);
     145             : static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
     146             :                                        int group_added);
     147             : static void wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s);
     148             : static void wpas_stop_listen(void *ctx);
     149             : static void wpas_p2p_psk_failure_removal(void *eloop_ctx, void *timeout_ctx);
     150             : static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s);
     151             : static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s,
     152             :                                         enum wpa_driver_if_type type);
     153             : static void wpas_p2p_group_formation_failed(struct wpa_supplicant *wpa_s,
     154             :                                             int already_deleted);
     155             : static void wpas_p2p_optimize_listen_channel(struct wpa_supplicant *wpa_s,
     156             :                                              struct wpa_used_freq_data *freqs,
     157             :                                              unsigned int num);
     158             : static void wpas_p2p_move_go(void *eloop_ctx, void *timeout_ctx);
     159             : static int wpas_p2p_go_is_peer_freq(struct wpa_supplicant *wpa_s, int freq);
     160             : static void
     161             : wpas_p2p_consider_moving_gos(struct wpa_supplicant *wpa_s,
     162             :                              struct wpa_used_freq_data *freqs, unsigned int num,
     163             :                              enum wpas_p2p_channel_update_trig trig);
     164             : static void wpas_p2p_reconsider_moving_go(void *eloop_ctx, void *timeout_ctx);
     165             : 
     166             : 
     167             : /*
     168             :  * Get the number of concurrent channels that the HW can operate, but that are
     169             :  * currently not in use by any of the wpa_supplicant interfaces.
     170             :  */
     171         869 : static int wpas_p2p_num_unused_channels(struct wpa_supplicant *wpa_s)
     172             : {
     173             :         int *freqs;
     174             :         int num, unused;
     175             : 
     176         869 :         freqs = os_calloc(wpa_s->num_multichan_concurrent, sizeof(int));
     177         869 :         if (!freqs)
     178           0 :                 return -1;
     179             : 
     180         869 :         num = get_shared_radio_freqs(wpa_s, freqs,
     181             :                                      wpa_s->num_multichan_concurrent);
     182         869 :         os_free(freqs);
     183             : 
     184         869 :         unused = wpa_s->num_multichan_concurrent - num;
     185         869 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: num_unused_channels: %d", unused);
     186         869 :         return unused;
     187             : }
     188             : 
     189             : 
     190             : /*
     191             :  * Get the frequencies that are currently in use by one or more of the virtual
     192             :  * interfaces, and that are also valid for P2P operation.
     193             :  */
     194             : static unsigned int
     195         565 : wpas_p2p_valid_oper_freqs(struct wpa_supplicant *wpa_s,
     196             :                           struct wpa_used_freq_data *p2p_freqs,
     197             :                           unsigned int len)
     198             : {
     199             :         struct wpa_used_freq_data *freqs;
     200             :         unsigned int num, i, j;
     201             : 
     202         565 :         freqs = os_calloc(wpa_s->num_multichan_concurrent,
     203             :                           sizeof(struct wpa_used_freq_data));
     204         565 :         if (!freqs)
     205           0 :                 return 0;
     206             : 
     207         565 :         num = get_shared_radio_freqs_data(wpa_s, freqs,
     208             :                                           wpa_s->num_multichan_concurrent);
     209             : 
     210         565 :         os_memset(p2p_freqs, 0, sizeof(struct wpa_used_freq_data) * len);
     211             : 
     212         618 :         for (i = 0, j = 0; i < num && j < len; i++) {
     213          53 :                 if (p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq))
     214          51 :                         p2p_freqs[j++] = freqs[i];
     215             :         }
     216             : 
     217         565 :         os_free(freqs);
     218             : 
     219         565 :         dump_freq_data(wpa_s, "valid for P2P", p2p_freqs, j);
     220             : 
     221         565 :         return j;
     222             : }
     223             : 
     224             : 
     225         507 : static void wpas_p2p_set_own_freq_preference(struct wpa_supplicant *wpa_s,
     226             :                                              int freq)
     227             : {
     228         507 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
     229         507 :                 return;
     230             : 
     231             :         /* Use the wpa_s used to control the P2P Device operation */
     232         507 :         wpa_s = wpa_s->global->p2p_init_wpa_s;
     233             : 
     234         507 :         if (wpa_s->conf->p2p_ignore_shared_freq &&
     235           0 :             freq > 0 && wpa_s->num_multichan_concurrent > 1 &&
     236           0 :             wpas_p2p_num_unused_channels(wpa_s) > 0) {
     237           0 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore own channel preference %d MHz due to p2p_ignore_shared_freq=1 configuration",
     238             :                            freq);
     239           0 :                 freq = 0;
     240             :         }
     241         507 :         p2p_set_own_freq_preference(wpa_s->global->p2p, freq);
     242             : }
     243             : 
     244             : 
     245        1010 : static void wpas_p2p_scan_res_handler(struct wpa_supplicant *wpa_s,
     246             :                                       struct wpa_scan_results *scan_res)
     247             : {
     248             :         size_t i;
     249             : 
     250        1010 :         if (wpa_s->p2p_scan_work) {
     251         912 :                 struct wpa_radio_work *work = wpa_s->p2p_scan_work;
     252         912 :                 wpa_s->p2p_scan_work = NULL;
     253         912 :                 radio_work_done(work);
     254             :         }
     255             : 
     256        1010 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
     257        1010 :                 return;
     258             : 
     259        1010 :         wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS)",
     260        1010 :                    (int) scan_res->num);
     261             : 
     262        2936 :         for (i = 0; i < scan_res->num; i++) {
     263        1926 :                 struct wpa_scan_res *bss = scan_res->res[i];
     264             :                 struct os_reltime time_tmp_age, entry_ts;
     265             :                 const u8 *ies;
     266             :                 size_t ies_len;
     267             : 
     268        1926 :                 time_tmp_age.sec = bss->age / 1000;
     269        1926 :                 time_tmp_age.usec = (bss->age % 1000) * 1000;
     270        1926 :                 os_reltime_sub(&scan_res->fetch_time, &time_tmp_age, &entry_ts);
     271             : 
     272        1926 :                 ies = (const u8 *) (bss + 1);
     273        1926 :                 ies_len = bss->ie_len;
     274        2726 :                 if (bss->beacon_ie_len > 0 &&
     275        1218 :                     !wpa_scan_get_vendor_ie(bss, P2P_IE_VENDOR_TYPE) &&
     276         418 :                     wpa_scan_get_vendor_ie_beacon(bss, P2P_IE_VENDOR_TYPE)) {
     277          66 :                         wpa_printf(MSG_DEBUG, "P2P: Use P2P IE(s) from Beacon frame since no P2P IE(s) in Probe Response frames received for "
     278          66 :                                    MACSTR, MAC2STR(bss->bssid));
     279          11 :                         ies = ies + ies_len;
     280          11 :                         ies_len = bss->beacon_ie_len;
     281             :                 }
     282             : 
     283             : 
     284        1926 :                 if (p2p_scan_res_handler(wpa_s->global->p2p, bss->bssid,
     285             :                                          bss->freq, &entry_ts, bss->level,
     286             :                                          ies, ies_len) > 0)
     287           0 :                         break;
     288             :         }
     289             : 
     290        1010 :         p2p_scan_res_handled(wpa_s->global->p2p);
     291             : }
     292             : 
     293             : 
     294         940 : static void wpas_p2p_trigger_scan_cb(struct wpa_radio_work *work, int deinit)
     295             : {
     296         940 :         struct wpa_supplicant *wpa_s = work->wpa_s;
     297         940 :         struct wpa_driver_scan_params *params = work->ctx;
     298             :         int ret;
     299             : 
     300         940 :         if (deinit) {
     301           8 :                 if (!work->started) {
     302           3 :                         wpa_scan_free_params(params);
     303           3 :                         return;
     304             :                 }
     305             : 
     306           5 :                 wpa_s->p2p_scan_work = NULL;
     307           5 :                 return;
     308             :         }
     309             : 
     310         932 :         ret = wpa_drv_scan(wpa_s, params);
     311         932 :         wpa_scan_free_params(params);
     312         932 :         work->ctx = NULL;
     313         932 :         if (ret) {
     314           0 :                 radio_work_done(work);
     315           0 :                 p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret);
     316           0 :                 return;
     317             :         }
     318             : 
     319         932 :         p2p_notify_scan_trigger_status(wpa_s->global->p2p, ret);
     320         932 :         os_get_reltime(&wpa_s->scan_trigger_time);
     321         932 :         wpa_s->scan_res_handler = wpas_p2p_scan_res_handler;
     322         932 :         wpa_s->own_scan_requested = 1;
     323         932 :         wpa_s->p2p_scan_work = work;
     324             : }
     325             : 
     326             : 
     327        3600 : static int wpas_p2p_search_social_channel(struct wpa_supplicant *wpa_s,
     328             :                                           int freq)
     329             : {
     330        3600 :         if (wpa_s->global->p2p_24ghz_social_channels &&
     331        2700 :             (freq == 2412 || freq == 2437 || freq == 2462)) {
     332             :                 /*
     333             :                  * Search all social channels regardless of whether these have
     334             :                  * been disabled for P2P operating channel use to avoid missing
     335             :                  * peers.
     336             :                  */
     337        2700 :                 return 1;
     338             :         }
     339         900 :         return p2p_supported_freq(wpa_s->global->p2p, freq);
     340             : }
     341             : 
     342             : 
     343         947 : static int wpas_p2p_scan(void *ctx, enum p2p_scan_type type, int freq,
     344             :                          unsigned int num_req_dev_types,
     345             :                          const u8 *req_dev_types, const u8 *dev_id, u16 pw_id)
     346             : {
     347         947 :         struct wpa_supplicant *wpa_s = ctx;
     348         947 :         struct wpa_driver_scan_params *params = NULL;
     349             :         struct wpabuf *wps_ie, *ies;
     350         947 :         unsigned int num_channels = 0;
     351         947 :         int social_channels_freq[] = { 2412, 2437, 2462, 60480 };
     352             :         size_t ielen;
     353             :         u8 *n, i;
     354             :         unsigned int bands;
     355             : 
     356         947 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
     357           0 :                 return -1;
     358             : 
     359         947 :         if (wpa_s->p2p_scan_work) {
     360          12 :                 wpa_dbg(wpa_s, MSG_INFO, "P2P: Reject scan trigger since one is already pending");
     361          12 :                 return -1;
     362             :         }
     363             : 
     364         935 :         params = os_zalloc(sizeof(*params));
     365         935 :         if (params == NULL)
     366           0 :                 return -1;
     367             : 
     368             :         /* P2P Wildcard SSID */
     369         935 :         params->num_ssids = 1;
     370         935 :         n = os_malloc(P2P_WILDCARD_SSID_LEN);
     371         935 :         if (n == NULL)
     372           0 :                 goto fail;
     373         935 :         os_memcpy(n, P2P_WILDCARD_SSID, P2P_WILDCARD_SSID_LEN);
     374         935 :         params->ssids[0].ssid = n;
     375         935 :         params->ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
     376             : 
     377         935 :         wpa_s->wps->dev.p2p = 1;
     378         935 :         wps_ie = wps_build_probe_req_ie(pw_id, &wpa_s->wps->dev,
     379         935 :                                         wpa_s->wps->uuid, WPS_REQ_ENROLLEE,
     380             :                                         num_req_dev_types, req_dev_types);
     381         935 :         if (wps_ie == NULL)
     382           0 :                 goto fail;
     383             : 
     384         935 :         switch (type) {
     385             :         case P2P_SCAN_SOCIAL:
     386         898 :                 params->freqs = os_calloc(ARRAY_SIZE(social_channels_freq) + 1,
     387             :                                           sizeof(int));
     388         898 :                 if (params->freqs == NULL)
     389           0 :                         goto fail;
     390        4490 :                 for (i = 0; i < ARRAY_SIZE(social_channels_freq); i++) {
     391        3592 :                         if (wpas_p2p_search_social_channel(
     392             :                                     wpa_s, social_channels_freq[i]))
     393        5388 :                                 params->freqs[num_channels++] =
     394        2694 :                                         social_channels_freq[i];
     395             :                 }
     396         898 :                 params->freqs[num_channels++] = 0;
     397         898 :                 break;
     398             :         case P2P_SCAN_FULL:
     399          19 :                 break;
     400             :         case P2P_SCAN_SPECIFIC:
     401          16 :                 params->freqs = os_calloc(2, sizeof(int));
     402          16 :                 if (params->freqs == NULL)
     403           0 :                         goto fail;
     404          16 :                 params->freqs[0] = freq;
     405          16 :                 params->freqs[1] = 0;
     406          16 :                 break;
     407             :         case P2P_SCAN_SOCIAL_PLUS_ONE:
     408           2 :                 params->freqs = os_calloc(ARRAY_SIZE(social_channels_freq) + 2,
     409             :                                           sizeof(int));
     410           2 :                 if (params->freqs == NULL)
     411           0 :                         goto fail;
     412          10 :                 for (i = 0; i < ARRAY_SIZE(social_channels_freq); i++) {
     413           8 :                         if (wpas_p2p_search_social_channel(
     414             :                                     wpa_s, social_channels_freq[i]))
     415          12 :                                 params->freqs[num_channels++] =
     416           6 :                                         social_channels_freq[i];
     417             :                 }
     418           2 :                 if (p2p_supported_freq(wpa_s->global->p2p, freq))
     419           2 :                         params->freqs[num_channels++] = freq;
     420           2 :                 params->freqs[num_channels++] = 0;
     421           2 :                 break;
     422             :         }
     423             : 
     424         935 :         ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
     425         935 :         ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
     426         935 :         if (ies == NULL) {
     427           0 :                 wpabuf_free(wps_ie);
     428           0 :                 goto fail;
     429             :         }
     430         935 :         wpabuf_put_buf(ies, wps_ie);
     431         935 :         wpabuf_free(wps_ie);
     432             : 
     433         935 :         bands = wpas_get_bands(wpa_s, params->freqs);
     434         935 :         p2p_scan_ie(wpa_s->global->p2p, ies, dev_id, bands);
     435             : 
     436         935 :         params->p2p_probe = 1;
     437         935 :         n = os_malloc(wpabuf_len(ies));
     438         935 :         if (n == NULL) {
     439           0 :                 wpabuf_free(ies);
     440           0 :                 goto fail;
     441             :         }
     442         935 :         os_memcpy(n, wpabuf_head(ies), wpabuf_len(ies));
     443         935 :         params->extra_ies = n;
     444         935 :         params->extra_ies_len = wpabuf_len(ies);
     445         935 :         wpabuf_free(ies);
     446             : 
     447         935 :         radio_remove_works(wpa_s, "p2p-scan", 0);
     448         935 :         if (radio_add_work(wpa_s, 0, "p2p-scan", 0, wpas_p2p_trigger_scan_cb,
     449             :                            params) < 0)
     450           0 :                 goto fail;
     451         935 :         return 0;
     452             : 
     453             : fail:
     454           0 :         wpa_scan_free_params(params);
     455           0 :         return -1;
     456             : }
     457             : 
     458             : 
     459         180 : static enum wpa_driver_if_type wpas_p2p_if_type(int p2p_group_interface)
     460             : {
     461         180 :         switch (p2p_group_interface) {
     462             :         case P2P_GROUP_INTERFACE_PENDING:
     463           0 :                 return WPA_IF_P2P_GROUP;
     464             :         case P2P_GROUP_INTERFACE_GO:
     465         130 :                 return WPA_IF_P2P_GO;
     466             :         case P2P_GROUP_INTERFACE_CLIENT:
     467          50 :                 return WPA_IF_P2P_CLIENT;
     468             :         }
     469             : 
     470           0 :         return WPA_IF_P2P_GROUP;
     471             : }
     472             : 
     473             : 
     474         157 : static struct wpa_supplicant * wpas_get_p2p_group(struct wpa_supplicant *wpa_s,
     475             :                                                   const u8 *ssid,
     476             :                                                   size_t ssid_len, int *go)
     477             : {
     478             :         struct wpa_ssid *s;
     479             : 
     480         315 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
     481         325 :                 for (s = wpa_s->conf->ssid; s; s = s->next) {
     482         178 :                         if (s->disabled != 0 || !s->p2p_group ||
     483          22 :                             s->ssid_len != ssid_len ||
     484          11 :                             os_memcmp(ssid, s->ssid, ssid_len) != 0)
     485         156 :                                 continue;
     486          18 :                         if (s->mode == WPAS_MODE_P2P_GO &&
     487           7 :                             s != wpa_s->current_ssid)
     488           0 :                                 continue;
     489          11 :                         if (go)
     490          11 :                                 *go = s->mode == WPAS_MODE_P2P_GO;
     491          11 :                         return wpa_s;
     492             :                 }
     493             :         }
     494             : 
     495         146 :         return NULL;
     496             : }
     497             : 
     498             : 
     499           1 : static void run_wpas_p2p_disconnect(void *eloop_ctx, void *timeout_ctx)
     500             : {
     501           1 :         struct wpa_supplicant *wpa_s = eloop_ctx;
     502           1 :         wpa_printf(MSG_DEBUG,
     503             :                    "P2P: Complete previously requested removal of %s",
     504           1 :                    wpa_s->ifname);
     505           1 :         wpas_p2p_disconnect(wpa_s);
     506           1 : }
     507             : 
     508             : 
     509         513 : static int wpas_p2p_disconnect_safely(struct wpa_supplicant *wpa_s,
     510             :                                       struct wpa_supplicant *calling_wpa_s)
     511             : {
     512         866 :         if (calling_wpa_s == wpa_s && wpa_s &&
     513         353 :             wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
     514             :                 /*
     515             :                  * The calling wpa_s instance is going to be removed. Do that
     516             :                  * from an eloop callback to keep the instance available until
     517             :                  * the caller has returned. This my be needed, e.g., to provide
     518             :                  * control interface responses on the per-interface socket.
     519             :                  */
     520           1 :                 if (eloop_register_timeout(0, 0, run_wpas_p2p_disconnect,
     521             :                                            wpa_s, NULL) < 0)
     522           0 :                         return -1;
     523           1 :                 return 0;
     524             :         }
     525             : 
     526         512 :         return wpas_p2p_disconnect(wpa_s);
     527             : }
     528             : 
     529             : 
     530             : /* Determine total number of clients in active groups where we are the GO */
     531           0 : static unsigned int p2p_group_go_member_count(struct wpa_supplicant *wpa_s)
     532             : {
     533           0 :         unsigned int count = 0;
     534             :         struct wpa_ssid *s;
     535             : 
     536           0 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
     537           0 :                 for (s = wpa_s->conf->ssid; s; s = s->next) {
     538           0 :                         wpa_printf(MSG_DEBUG,
     539             :                                    "P2P: sup:%p ssid:%p disabled:%d p2p:%d mode:%d",
     540             :                                    wpa_s, s, s->disabled, s->p2p_group,
     541           0 :                                    s->mode);
     542           0 :                         if (!s->disabled && s->p2p_group &&
     543           0 :                             s->mode == WPAS_MODE_P2P_GO) {
     544           0 :                                 count += p2p_get_group_num_members(
     545             :                                         wpa_s->p2p_group);
     546             :                         }
     547             :                 }
     548             :         }
     549             : 
     550           0 :         return count;
     551             : }
     552             : 
     553             : 
     554         399 : static unsigned int p2p_is_active_persistent_group(struct wpa_supplicant *wpa_s)
     555             : {
     556        1236 :         return !wpa_s->p2p_mgmt && wpa_s->current_ssid &&
     557         106 :                 !wpa_s->current_ssid->disabled &&
     558         471 :                 wpa_s->current_ssid->p2p_group &&
     559          19 :                 wpa_s->current_ssid->p2p_persistent_group;
     560             : }
     561             : 
     562             : 
     563         287 : static unsigned int p2p_is_active_persistent_go(struct wpa_supplicant *wpa_s)
     564             : {
     565         301 :         return p2p_is_active_persistent_group(wpa_s) &&
     566          14 :                 wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO;
     567             : }
     568             : 
     569             : 
     570             : /* Find an interface for a P2P group where we are the GO */
     571             : static struct wpa_supplicant *
     572         263 : wpas_p2p_get_go_group(struct wpa_supplicant *wpa_s)
     573             : {
     574         263 :         struct wpa_supplicant *save = NULL;
     575             : 
     576         263 :         if (!wpa_s)
     577           0 :                 return NULL;
     578             : 
     579         550 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
     580         287 :                 if (!p2p_is_active_persistent_go(wpa_s))
     581         273 :                         continue;
     582             : 
     583             :                 /* Prefer a group with connected clients */
     584          14 :                 if (p2p_get_group_num_members(wpa_s->p2p_group))
     585           0 :                         return wpa_s;
     586          14 :                 save = wpa_s;
     587             :         }
     588             : 
     589             :         /* No group with connected clients, so pick the one without (if any) */
     590         263 :         return save;
     591             : }
     592             : 
     593             : 
     594         112 : static unsigned int p2p_is_active_persistent_cli(struct wpa_supplicant *wpa_s)
     595             : {
     596         117 :         return p2p_is_active_persistent_group(wpa_s) &&
     597           5 :                 wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
     598             : }
     599             : 
     600             : 
     601             : /* Find an interface for a P2P group where we are the P2P Client */
     602             : static struct wpa_supplicant *
     603         103 : wpas_p2p_get_cli_group(struct wpa_supplicant *wpa_s)
     604             : {
     605         215 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
     606         112 :                 if (p2p_is_active_persistent_cli(wpa_s))
     607           0 :                         return wpa_s;
     608             :         }
     609             : 
     610         103 :         return NULL;
     611             : }
     612             : 
     613             : 
     614             : /* Find a persistent group where we are the GO */
     615             : static struct wpa_ssid *
     616         318 : wpas_p2p_get_persistent_go(struct wpa_supplicant *wpa_s)
     617             : {
     618             :         struct wpa_ssid *s;
     619             : 
     620         362 :         for (s = wpa_s->conf->ssid; s; s = s->next) {
     621          64 :                 if (s->disabled == 2 && s->mode == WPAS_MODE_P2P_GO)
     622          20 :                         return s;
     623             :         }
     624             : 
     625         298 :         return NULL;
     626             : }
     627             : 
     628             : 
     629         103 : static u8 p2ps_group_capability(void *ctx, u8 incoming, u8 role,
     630             :                                 unsigned int *force_freq,
     631             :                                 unsigned int *pref_freq)
     632             : {
     633         103 :         struct wpa_supplicant *wpa_s = ctx;
     634             :         struct wpa_ssid *s;
     635         103 :         u8 conncap = P2PS_SETUP_NONE;
     636         103 :         unsigned int owned_members = 0;
     637             :         struct wpa_supplicant *go_wpa_s, *cli_wpa_s;
     638             :         struct wpa_ssid *persistent_go;
     639             :         int p2p_no_group_iface;
     640             :         unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS], size;
     641             : 
     642         103 :         wpa_printf(MSG_DEBUG, "P2P: Conncap - in:%d role:%d", incoming, role);
     643             : 
     644         103 :         if (force_freq)
     645         103 :                 *force_freq = 0;
     646         103 :         if (pref_freq)
     647         103 :                 *pref_freq = 0;
     648             : 
     649         103 :         size = P2P_MAX_PREF_CHANNELS;
     650         206 :         if (force_freq && pref_freq &&
     651         103 :             !wpas_p2p_setup_freqs(wpa_s, 0, (int *) force_freq,
     652             :                                   (int *) pref_freq, 0, pref_freq_list, &size))
     653         206 :                 wpas_p2p_set_own_freq_preference(wpa_s,
     654         118 :                                                  *force_freq ? *force_freq :
     655          88 :                                                  *pref_freq);
     656             : 
     657             :         /*
     658             :          * For non-concurrent capable devices:
     659             :          * If persistent_go, then no new.
     660             :          * If GO, then no client.
     661             :          * If client, then no GO.
     662             :          */
     663         103 :         go_wpa_s = wpas_p2p_get_go_group(wpa_s);
     664         103 :         if (go_wpa_s)
     665           5 :                 owned_members = p2p_get_group_num_members(go_wpa_s->p2p_group);
     666         103 :         persistent_go = wpas_p2p_get_persistent_go(wpa_s);
     667         103 :         p2p_no_group_iface = !wpas_p2p_create_iface(wpa_s);
     668         103 :         cli_wpa_s = wpas_p2p_get_cli_group(wpa_s);
     669             : 
     670         103 :         wpa_printf(MSG_DEBUG,
     671             :                    "P2P: GO(iface)=%p members=%u CLI(iface)=%p persistent(ssid)=%p",
     672             :                    go_wpa_s, owned_members, cli_wpa_s, persistent_go);
     673             : 
     674             :         /* If not concurrent, restrict our choices */
     675         103 :         if (p2p_no_group_iface) {
     676          67 :                 wpa_printf(MSG_DEBUG, "P2P: p2p_no_group_iface");
     677             : 
     678          67 :                 if (cli_wpa_s)
     679           0 :                         return P2PS_SETUP_NONE;
     680             : 
     681          67 :                 if (go_wpa_s) {
     682           0 :                         if (role == P2PS_SETUP_CLIENT ||
     683           0 :                             incoming == P2PS_SETUP_GROUP_OWNER ||
     684           0 :                             p2p_client_limit_reached(go_wpa_s->p2p_group))
     685           0 :                                 return P2PS_SETUP_NONE;
     686             : 
     687           0 :                         return P2PS_SETUP_GROUP_OWNER;
     688             :                 }
     689             : 
     690          67 :                 if (persistent_go) {
     691           2 :                         if (role == P2PS_SETUP_NONE || role == P2PS_SETUP_NEW) {
     692           0 :                                 if (!incoming)
     693           0 :                                         return P2PS_SETUP_GROUP_OWNER |
     694             :                                                 P2PS_SETUP_CLIENT;
     695           0 :                                 if (incoming == P2PS_SETUP_NEW) {
     696             :                                         u8 r;
     697             : 
     698           0 :                                         if (os_get_random(&r, sizeof(r)) < 0 ||
     699           0 :                                             (r & 1))
     700           0 :                                                 return P2PS_SETUP_CLIENT;
     701           0 :                                         return P2PS_SETUP_GROUP_OWNER;
     702             :                                 }
     703             :                         }
     704             :                 }
     705             :         }
     706             : 
     707             :         /* If a required role has been specified, handle it here */
     708         103 :         if (role && role != P2PS_SETUP_NEW) {
     709          29 :                 switch (incoming) {
     710             :                 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_NEW:
     711             :                 case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT:
     712             :                         /*
     713             :                          * Peer has an active GO, so if the role allows it and
     714             :                          * we do not have any active roles, become client.
     715             :                          */
     716           0 :                         if ((role & P2PS_SETUP_CLIENT) && !go_wpa_s &&
     717             :                             !cli_wpa_s)
     718           0 :                                 return P2PS_SETUP_CLIENT;
     719             : 
     720             :                         /* fall through */
     721             : 
     722             :                 case P2PS_SETUP_NONE:
     723             :                 case P2PS_SETUP_NEW:
     724          27 :                         conncap = role;
     725          27 :                         goto grp_owner;
     726             : 
     727             :                 case P2PS_SETUP_GROUP_OWNER:
     728             :                         /*
     729             :                          * Must be a complimentary role - cannot be a client to
     730             :                          * more than one peer.
     731             :                          */
     732           1 :                         if (incoming == role || cli_wpa_s)
     733           0 :                                 return P2PS_SETUP_NONE;
     734             : 
     735           1 :                         return P2PS_SETUP_CLIENT;
     736             : 
     737             :                 case P2PS_SETUP_CLIENT:
     738             :                         /* Must be a complimentary role */
     739           1 :                         if (incoming != role) {
     740           1 :                                 conncap = P2PS_SETUP_GROUP_OWNER;
     741           1 :                                 goto grp_owner;
     742             :                         }
     743             : 
     744             :                 default:
     745           0 :                         return P2PS_SETUP_NONE;
     746             :                 }
     747             :         }
     748             : 
     749             :         /*
     750             :          * For now, we only will support ownership of one group, and being a
     751             :          * client of one group. Therefore, if we have either an existing GO
     752             :          * group, or an existing client group, we will not do a new GO
     753             :          * negotiation, but rather try to re-use the existing groups.
     754             :          */
     755          74 :         switch (incoming) {
     756             :         case P2PS_SETUP_NONE:
     757             :         case P2PS_SETUP_NEW:
     758          74 :                 if (cli_wpa_s)
     759           0 :                         conncap = P2PS_SETUP_GROUP_OWNER;
     760          74 :                 else if (!owned_members)
     761          74 :                         conncap = P2PS_SETUP_NEW;
     762           0 :                 else if (incoming == P2PS_SETUP_NONE)
     763           0 :                         conncap = P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT;
     764             :                 else
     765           0 :                         conncap = P2PS_SETUP_CLIENT;
     766          74 :                 break;
     767             : 
     768             :         case P2PS_SETUP_CLIENT:
     769           0 :                 conncap = P2PS_SETUP_GROUP_OWNER;
     770           0 :                 break;
     771             : 
     772             :         case P2PS_SETUP_GROUP_OWNER:
     773           0 :                 if (!cli_wpa_s)
     774           0 :                         conncap = P2PS_SETUP_CLIENT;
     775           0 :                 break;
     776             : 
     777             :         case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_NEW:
     778             :         case P2PS_SETUP_GROUP_OWNER | P2PS_SETUP_CLIENT:
     779           0 :                 if (cli_wpa_s)
     780           0 :                         conncap = P2PS_SETUP_GROUP_OWNER;
     781             :                 else {
     782             :                         u8 r;
     783             : 
     784           0 :                         if (os_get_random(&r, sizeof(r)) < 0 ||
     785           0 :                             (r & 1))
     786           0 :                                 conncap = P2PS_SETUP_CLIENT;
     787             :                         else
     788           0 :                                 conncap = P2PS_SETUP_GROUP_OWNER;
     789             :                 }
     790           0 :                 break;
     791             : 
     792             :         default:
     793           0 :                 return P2PS_SETUP_NONE;
     794             :         }
     795             : 
     796             : grp_owner:
     797         102 :         if ((conncap & P2PS_SETUP_GROUP_OWNER) ||
     798          51 :             (!incoming && (conncap & P2PS_SETUP_NEW))) {
     799          60 :                 if (go_wpa_s && p2p_client_limit_reached(go_wpa_s->p2p_group))
     800           0 :                         conncap &= ~P2PS_SETUP_GROUP_OWNER;
     801             : 
     802          60 :                 s = wpas_p2p_get_persistent_go(wpa_s);
     803          60 :                 if (!s && !go_wpa_s && p2p_no_group_iface) {
     804          39 :                         p2p_set_intended_addr(wpa_s->global->p2p,
     805          38 :                                               wpa_s->p2p_mgmt ?
     806           1 :                                               wpa_s->parent->own_addr :
     807             :                                               wpa_s->own_addr);
     808          22 :                 } else if (!s && !go_wpa_s) {
     809          15 :                         if (wpas_p2p_add_group_interface(wpa_s,
     810             :                                                          WPA_IF_P2P_GO) < 0) {
     811           0 :                                 wpa_printf(MSG_ERROR,
     812             :                                            "P2P: Failed to allocate a new interface for the group");
     813           0 :                                 return P2PS_SETUP_NONE;
     814             :                         }
     815          15 :                         wpa_s->global->pending_group_iface_for_p2ps = 1;
     816          15 :                         p2p_set_intended_addr(wpa_s->global->p2p,
     817          15 :                                               wpa_s->pending_interface_addr);
     818             :                 }
     819             :         }
     820             : 
     821         102 :         return conncap;
     822             : }
     823             : 
     824             : 
     825         700 : static int wpas_p2p_group_delete(struct wpa_supplicant *wpa_s,
     826             :                                  enum p2p_group_removal_reason removal_reason)
     827             : {
     828             :         struct wpa_ssid *ssid;
     829             :         char *gtype;
     830             :         const char *reason;
     831             : 
     832         700 :         ssid = wpa_s->current_ssid;
     833         700 :         if (ssid == NULL) {
     834             :                 /*
     835             :                  * The current SSID was not known, but there may still be a
     836             :                  * pending P2P group interface waiting for provisioning or a
     837             :                  * P2P group that is trying to reconnect.
     838             :                  */
     839          24 :                 ssid = wpa_s->conf->ssid;
     840          51 :                 while (ssid) {
     841          14 :                         if (ssid->p2p_group && ssid->disabled != 2)
     842          11 :                                 break;
     843           3 :                         ssid = ssid->next;
     844             :                 }
     845          37 :                 if (ssid == NULL &&
     846          13 :                         wpa_s->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)
     847             :                 {
     848          13 :                         wpa_printf(MSG_ERROR, "P2P: P2P group interface "
     849             :                                    "not found");
     850          13 :                         return -1;
     851             :                 }
     852             :         }
     853         687 :         if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO)
     854         130 :                 gtype = "GO";
     855         557 :         else if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT ||
     856         507 :                  (ssid && ssid->mode == WPAS_MODE_INFRA)) {
     857         289 :                 wpa_s->reassociate = 0;
     858         289 :                 wpa_s->disconnected = 1;
     859         289 :                 gtype = "client";
     860             :         } else
     861         268 :                 gtype = "GO";
     862             : 
     863         687 :         if (removal_reason != P2P_GROUP_REMOVAL_SILENT && ssid)
     864         686 :                 wpas_notify_p2p_group_removed(wpa_s, ssid, gtype);
     865             : 
     866         687 :         if (os_strcmp(gtype, "client") == 0) {
     867         289 :                 wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
     868         289 :                 if (eloop_is_timeout_registered(wpas_p2p_psk_failure_removal,
     869             :                                                 wpa_s, NULL)) {
     870           0 :                         wpa_printf(MSG_DEBUG,
     871             :                                    "P2P: PSK failure removal was scheduled, so use PSK failure as reason for group removal");
     872           0 :                         removal_reason = P2P_GROUP_REMOVAL_PSK_FAILURE;
     873           0 :                         eloop_cancel_timeout(wpas_p2p_psk_failure_removal,
     874             :                                              wpa_s, NULL);
     875             :                 }
     876             :         }
     877             : 
     878         687 :         if (wpa_s->cross_connect_in_use) {
     879           1 :                 wpa_s->cross_connect_in_use = 0;
     880           1 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
     881             :                                P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
     882           1 :                                wpa_s->ifname, wpa_s->cross_connect_uplink);
     883             :         }
     884         687 :         switch (removal_reason) {
     885             :         case P2P_GROUP_REMOVAL_REQUESTED:
     886         507 :                 reason = " reason=REQUESTED";
     887         507 :                 break;
     888             :         case P2P_GROUP_REMOVAL_FORMATION_FAILED:
     889          19 :                 reason = " reason=FORMATION_FAILED";
     890          19 :                 break;
     891             :         case P2P_GROUP_REMOVAL_IDLE_TIMEOUT:
     892           2 :                 reason = " reason=IDLE";
     893           2 :                 break;
     894             :         case P2P_GROUP_REMOVAL_UNAVAILABLE:
     895           6 :                 reason = " reason=UNAVAILABLE";
     896           6 :                 break;
     897             :         case P2P_GROUP_REMOVAL_GO_ENDING_SESSION:
     898         151 :                 reason = " reason=GO_ENDING_SESSION";
     899         151 :                 break;
     900             :         case P2P_GROUP_REMOVAL_PSK_FAILURE:
     901           1 :                 reason = " reason=PSK_FAILURE";
     902           1 :                 break;
     903             :         case P2P_GROUP_REMOVAL_FREQ_CONFLICT:
     904           0 :                 reason = " reason=FREQ_CONFLICT";
     905           0 :                 break;
     906             :         default:
     907           1 :                 reason = "";
     908           1 :                 break;
     909             :         }
     910         687 :         if (removal_reason != P2P_GROUP_REMOVAL_SILENT) {
     911         686 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
     912             :                                P2P_EVENT_GROUP_REMOVED "%s %s%s",
     913         686 :                                wpa_s->ifname, gtype, reason);
     914             :         }
     915             : 
     916         687 :         if (eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL) > 0)
     917           0 :                 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group freq_conflict timeout");
     918         687 :         if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
     919         274 :                 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
     920         687 :         if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
     921         687 :                                  wpa_s->p2pdev, NULL) > 0) {
     922          11 :                 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group formation "
     923             :                            "timeout");
     924          11 :                 wpa_s->p2p_in_provisioning = 0;
     925          11 :                 wpas_p2p_group_formation_failed(wpa_s, 1);
     926             :         }
     927             : 
     928         687 :         wpa_s->p2p_in_invitation = 0;
     929         687 :         eloop_cancel_timeout(wpas_p2p_move_go, wpa_s, NULL);
     930         687 :         eloop_cancel_timeout(wpas_p2p_reconsider_moving_go, wpa_s, NULL);
     931             : 
     932             :         /*
     933             :          * Make sure wait for the first client does not remain active after the
     934             :          * group has been removed.
     935             :          */
     936         687 :         wpa_s->global->p2p_go_wait_client.sec = 0;
     937             : 
     938         687 :         if (wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE) {
     939             :                 struct wpa_global *global;
     940             :                 char *ifname;
     941             :                 enum wpa_driver_if_type type;
     942         180 :                 wpa_printf(MSG_DEBUG, "P2P: Remove group interface %s",
     943         180 :                         wpa_s->ifname);
     944         180 :                 global = wpa_s->global;
     945         180 :                 ifname = os_strdup(wpa_s->ifname);
     946         180 :                 type = wpas_p2p_if_type(wpa_s->p2p_group_interface);
     947         180 :                 eloop_cancel_timeout(run_wpas_p2p_disconnect, wpa_s, NULL);
     948         180 :                 wpa_supplicant_remove_iface(wpa_s->global, wpa_s, 0);
     949         180 :                 wpa_s = global->ifaces;
     950         180 :                 if (wpa_s && ifname)
     951         178 :                         wpa_drv_if_remove(wpa_s, type, ifname);
     952         180 :                 os_free(ifname);
     953         180 :                 return 1;
     954             :         }
     955             : 
     956             :         /*
     957             :          * The primary interface was used for P2P group operations, so
     958             :          * need to reset its p2pdev.
     959             :          */
     960         507 :         wpa_s->p2pdev = wpa_s->parent;
     961             : 
     962         507 :         if (!wpa_s->p2p_go_group_formation_completed) {
     963          66 :                 wpa_s->global->p2p_group_formation = NULL;
     964          66 :                 wpa_s->p2p_in_provisioning = 0;
     965             :         }
     966             : 
     967         507 :         wpa_s->show_group_started = 0;
     968         507 :         os_free(wpa_s->go_params);
     969         507 :         wpa_s->go_params = NULL;
     970             : 
     971         507 :         os_free(wpa_s->p2p_group_common_freqs);
     972         507 :         wpa_s->p2p_group_common_freqs = NULL;
     973         507 :         wpa_s->p2p_group_common_freqs_num = 0;
     974             : 
     975         507 :         wpa_s->waiting_presence_resp = 0;
     976             : 
     977         507 :         wpa_printf(MSG_DEBUG, "P2P: Remove temporary group network");
     978         507 :         if (ssid && (ssid->p2p_group ||
     979           0 :                      ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION ||
     980         507 :                      (ssid->key_mgmt & WPA_KEY_MGMT_WPS))) {
     981         507 :                 int id = ssid->id;
     982         507 :                 if (ssid == wpa_s->current_ssid) {
     983         268 :                         wpa_sm_set_config(wpa_s->wpa, NULL);
     984         268 :                         eapol_sm_notify_config(wpa_s->eapol, NULL, NULL);
     985         268 :                         wpa_s->current_ssid = NULL;
     986             :                 }
     987             :                 /*
     988             :                  * Networks objects created during any P2P activities are not
     989             :                  * exposed out as they might/will confuse certain non-P2P aware
     990             :                  * applications since these network objects won't behave like
     991             :                  * regular ones.
     992             :                  *
     993             :                  * Likewise, we don't send out network removed signals for such
     994             :                  * network objects.
     995             :                  */
     996         507 :                 wpa_config_remove_network(wpa_s->conf, id);
     997         507 :                 wpa_supplicant_clear_status(wpa_s);
     998         507 :                 wpa_supplicant_cancel_sched_scan(wpa_s);
     999             :         } else {
    1000           0 :                 wpa_printf(MSG_DEBUG, "P2P: Temporary group network not "
    1001             :                            "found");
    1002             :         }
    1003         507 :         if (wpa_s->ap_iface)
    1004         268 :                 wpa_supplicant_ap_deinit(wpa_s);
    1005             :         else
    1006         239 :                 wpa_drv_deinit_p2p_cli(wpa_s);
    1007             : 
    1008         507 :         os_memset(wpa_s->go_dev_addr, 0, ETH_ALEN);
    1009             : 
    1010         507 :         return 0;
    1011             : }
    1012             : 
    1013             : 
    1014         742 : static int wpas_p2p_persistent_group(struct wpa_supplicant *wpa_s,
    1015             :                                      u8 *go_dev_addr,
    1016             :                                      const u8 *ssid, size_t ssid_len)
    1017             : {
    1018             :         struct wpa_bss *bss;
    1019             :         const u8 *bssid;
    1020             :         struct wpabuf *p2p;
    1021             :         u8 group_capab;
    1022             :         const u8 *addr;
    1023             : 
    1024         742 :         if (wpa_s->go_params)
    1025         696 :                 bssid = wpa_s->go_params->peer_interface_addr;
    1026             :         else
    1027          46 :                 bssid = wpa_s->bssid;
    1028             : 
    1029         742 :         bss = wpa_bss_get(wpa_s, bssid, ssid, ssid_len);
    1030         756 :         if (bss == NULL && wpa_s->go_params &&
    1031          14 :             !is_zero_ether_addr(wpa_s->go_params->peer_device_addr))
    1032          14 :                 bss = wpa_bss_get_p2p_dev_addr(
    1033          14 :                         wpa_s, wpa_s->go_params->peer_device_addr);
    1034         742 :         if (bss == NULL) {
    1035             :                 u8 iface_addr[ETH_ALEN];
    1036           0 :                 if (p2p_get_interface_addr(wpa_s->global->p2p, bssid,
    1037             :                                            iface_addr) == 0)
    1038           0 :                         bss = wpa_bss_get(wpa_s, iface_addr, ssid, ssid_len);
    1039             :         }
    1040         742 :         if (bss == NULL) {
    1041           0 :                 wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
    1042             :                            "group is persistent - BSS " MACSTR " not found",
    1043           0 :                            MAC2STR(bssid));
    1044           0 :                 return 0;
    1045             :         }
    1046             : 
    1047         742 :         p2p = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
    1048         742 :         if (p2p == NULL)
    1049           3 :                 p2p = wpa_bss_get_vendor_ie_multi_beacon(bss,
    1050             :                                                          P2P_IE_VENDOR_TYPE);
    1051         742 :         if (p2p == NULL) {
    1052           0 :                 wpa_printf(MSG_DEBUG, "P2P: Could not figure out whether "
    1053             :                            "group is persistent - BSS " MACSTR
    1054           0 :                            " did not include P2P IE", MAC2STR(bssid));
    1055           0 :                 wpa_hexdump(MSG_DEBUG, "P2P: Probe Response IEs",
    1056             :                             (u8 *) (bss + 1), bss->ie_len);
    1057           0 :                 wpa_hexdump(MSG_DEBUG, "P2P: Beacon IEs",
    1058           0 :                             ((u8 *) bss + 1) + bss->ie_len,
    1059             :                             bss->beacon_ie_len);
    1060           0 :                 return 0;
    1061             :         }
    1062             : 
    1063         742 :         group_capab = p2p_get_group_capab(p2p);
    1064         742 :         addr = p2p_get_go_dev_addr(p2p);
    1065         742 :         wpa_printf(MSG_DEBUG, "P2P: Checking whether group is persistent: "
    1066             :                    "group_capab=0x%x", group_capab);
    1067         742 :         if (addr) {
    1068         742 :                 os_memcpy(go_dev_addr, addr, ETH_ALEN);
    1069        4452 :                 wpa_printf(MSG_DEBUG, "P2P: GO Device Address " MACSTR,
    1070        4452 :                            MAC2STR(addr));
    1071             :         } else
    1072           0 :                 os_memset(go_dev_addr, 0, ETH_ALEN);
    1073         742 :         wpabuf_free(p2p);
    1074             : 
    1075        8904 :         wpa_printf(MSG_DEBUG, "P2P: BSS " MACSTR " group_capab=0x%x "
    1076             :                    "go_dev_addr=" MACSTR,
    1077        8904 :                    MAC2STR(bssid), group_capab, MAC2STR(go_dev_addr));
    1078             : 
    1079         742 :         return !!(group_capab & P2P_GROUP_CAPAB_PERSISTENT_GROUP);
    1080             : }
    1081             : 
    1082             : 
    1083         330 : static int wpas_p2p_store_persistent_group(struct wpa_supplicant *wpa_s,
    1084             :                                            struct wpa_ssid *ssid,
    1085             :                                            const u8 *go_dev_addr)
    1086             : {
    1087             :         struct wpa_ssid *s;
    1088         330 :         int changed = 0;
    1089             : 
    1090        1980 :         wpa_printf(MSG_DEBUG, "P2P: Storing credentials for a persistent "
    1091        1980 :                    "group (GO Dev Addr " MACSTR ")", MAC2STR(go_dev_addr));
    1092         528 :         for (s = wpa_s->conf->ssid; s; s = s->next) {
    1093         549 :                 if (s->disabled == 2 &&
    1094         352 :                     os_memcmp(go_dev_addr, s->bssid, ETH_ALEN) == 0 &&
    1095         350 :                     s->ssid_len == ssid->ssid_len &&
    1096         175 :                     os_memcmp(ssid->ssid, s->ssid, ssid->ssid_len) == 0)
    1097         174 :                         break;
    1098             :         }
    1099             : 
    1100         330 :         if (s) {
    1101         174 :                 wpa_printf(MSG_DEBUG, "P2P: Update existing persistent group "
    1102             :                            "entry");
    1103         174 :                 if (ssid->passphrase && !s->passphrase)
    1104           0 :                         changed = 1;
    1105         223 :                 else if (ssid->passphrase && s->passphrase &&
    1106          49 :                          os_strcmp(ssid->passphrase, s->passphrase) != 0)
    1107           0 :                         changed = 1;
    1108             :         } else {
    1109         156 :                 wpa_printf(MSG_DEBUG, "P2P: Create a new persistent group "
    1110             :                            "entry");
    1111         156 :                 changed = 1;
    1112         156 :                 s = wpa_config_add_network(wpa_s->conf);
    1113         156 :                 if (s == NULL)
    1114           0 :                         return -1;
    1115             : 
    1116             :                 /*
    1117             :                  * Instead of network_added we emit persistent_group_added
    1118             :                  * notification. Also to keep the defense checks in
    1119             :                  * persistent_group obj registration method, we set the
    1120             :                  * relevant flags in s to designate it as a persistent group.
    1121             :                  */
    1122         156 :                 s->p2p_group = 1;
    1123         156 :                 s->p2p_persistent_group = 1;
    1124         156 :                 wpas_notify_persistent_group_added(wpa_s, s);
    1125         156 :                 wpa_config_set_network_defaults(s);
    1126             :         }
    1127             : 
    1128         330 :         s->p2p_group = 1;
    1129         330 :         s->p2p_persistent_group = 1;
    1130         330 :         s->disabled = 2;
    1131         330 :         s->bssid_set = 1;
    1132         330 :         os_memcpy(s->bssid, go_dev_addr, ETH_ALEN);
    1133         330 :         s->mode = ssid->mode;
    1134         330 :         s->auth_alg = WPA_AUTH_ALG_OPEN;
    1135         330 :         s->key_mgmt = WPA_KEY_MGMT_PSK;
    1136         330 :         s->proto = WPA_PROTO_RSN;
    1137         330 :         s->pbss = ssid->pbss;
    1138         330 :         s->pairwise_cipher = ssid->pbss ? WPA_CIPHER_GCMP : WPA_CIPHER_CCMP;
    1139         330 :         s->export_keys = 1;
    1140         330 :         if (ssid->passphrase) {
    1141         127 :                 os_free(s->passphrase);
    1142         127 :                 s->passphrase = os_strdup(ssid->passphrase);
    1143             :         }
    1144         330 :         if (ssid->psk_set) {
    1145         330 :                 s->psk_set = 1;
    1146         330 :                 os_memcpy(s->psk, ssid->psk, 32);
    1147             :         }
    1148         330 :         if (s->passphrase && !s->psk_set)
    1149           0 :                 wpa_config_update_psk(s);
    1150         330 :         if (s->ssid == NULL || s->ssid_len < ssid->ssid_len) {
    1151         156 :                 os_free(s->ssid);
    1152         156 :                 s->ssid = os_malloc(ssid->ssid_len);
    1153             :         }
    1154         330 :         if (s->ssid) {
    1155         330 :                 s->ssid_len = ssid->ssid_len;
    1156         330 :                 os_memcpy(s->ssid, ssid->ssid, s->ssid_len);
    1157             :         }
    1158         330 :         if (ssid->mode == WPAS_MODE_P2P_GO && wpa_s->global->add_psk) {
    1159           2 :                 dl_list_add(&s->psk_list, &wpa_s->global->add_psk->list);
    1160           2 :                 wpa_s->global->add_psk = NULL;
    1161           2 :                 changed = 1;
    1162             :         }
    1163             : 
    1164         330 :         if (changed && wpa_s->conf->update_config &&
    1165           0 :             wpa_config_write(wpa_s->confname, wpa_s->conf)) {
    1166           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    1167             :         }
    1168             : 
    1169         330 :         return s->id;
    1170             : }
    1171             : 
    1172             : 
    1173         277 : static void wpas_p2p_add_persistent_group_client(struct wpa_supplicant *wpa_s,
    1174             :                                                  const u8 *addr)
    1175             : {
    1176             :         struct wpa_ssid *ssid, *s;
    1177             :         u8 *n;
    1178             :         size_t i;
    1179         277 :         int found = 0;
    1180         277 :         struct wpa_supplicant *p2p_wpa_s = wpa_s->global->p2p_init_wpa_s;
    1181             : 
    1182         277 :         ssid = wpa_s->current_ssid;
    1183         554 :         if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
    1184         277 :             !ssid->p2p_persistent_group)
    1185         153 :                 return;
    1186             : 
    1187         188 :         for (s = p2p_wpa_s->conf->ssid; s; s = s->next) {
    1188         188 :                 if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO)
    1189          63 :                         continue;
    1190             : 
    1191         250 :                 if (s->ssid_len == ssid->ssid_len &&
    1192         125 :                     os_memcmp(s->ssid, ssid->ssid, s->ssid_len) == 0)
    1193         124 :                         break;
    1194             :         }
    1195             : 
    1196         124 :         if (s == NULL)
    1197           0 :                 return;
    1198             : 
    1199         260 :         for (i = 0; s->p2p_client_list && i < s->num_p2p_clients; i++) {
    1200          52 :                 if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN, addr,
    1201             :                               ETH_ALEN) != 0)
    1202           6 :                         continue;
    1203             : 
    1204          46 :                 if (i == s->num_p2p_clients - 1)
    1205          42 :                         return; /* already the most recent entry */
    1206             : 
    1207             :                 /* move the entry to mark it most recent */
    1208           4 :                 os_memmove(s->p2p_client_list + i * 2 * ETH_ALEN,
    1209             :                            s->p2p_client_list + (i + 1) * 2 * ETH_ALEN,
    1210             :                            (s->num_p2p_clients - i - 1) * 2 * ETH_ALEN);
    1211           4 :                 os_memcpy(s->p2p_client_list +
    1212             :                           (s->num_p2p_clients - 1) * 2 * ETH_ALEN, addr,
    1213             :                           ETH_ALEN);
    1214           4 :                 os_memset(s->p2p_client_list +
    1215             :                           (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN,
    1216             :                           0xff, ETH_ALEN);
    1217           4 :                 found = 1;
    1218           4 :                 break;
    1219             :         }
    1220             : 
    1221          82 :         if (!found && s->num_p2p_clients < P2P_MAX_STORED_CLIENTS) {
    1222          78 :                 n = os_realloc_array(s->p2p_client_list,
    1223          78 :                                      s->num_p2p_clients + 1, 2 * ETH_ALEN);
    1224          78 :                 if (n == NULL)
    1225           0 :                         return;
    1226          78 :                 os_memcpy(n + s->num_p2p_clients * 2 * ETH_ALEN, addr,
    1227             :                           ETH_ALEN);
    1228          78 :                 os_memset(n + s->num_p2p_clients * 2 * ETH_ALEN + ETH_ALEN,
    1229             :                           0xff, ETH_ALEN);
    1230          78 :                 s->p2p_client_list = n;
    1231          78 :                 s->num_p2p_clients++;
    1232           4 :         } else if (!found && s->p2p_client_list) {
    1233             :                 /* Not enough room for an additional entry - drop the oldest
    1234             :                  * entry */
    1235           0 :                 os_memmove(s->p2p_client_list,
    1236             :                            s->p2p_client_list + 2 * ETH_ALEN,
    1237             :                            (s->num_p2p_clients - 1) * 2 * ETH_ALEN);
    1238           0 :                 os_memcpy(s->p2p_client_list +
    1239             :                           (s->num_p2p_clients - 1) * 2 * ETH_ALEN,
    1240             :                           addr, ETH_ALEN);
    1241           0 :                 os_memset(s->p2p_client_list +
    1242             :                           (s->num_p2p_clients - 1) * 2 * ETH_ALEN + ETH_ALEN,
    1243             :                           0xff, ETH_ALEN);
    1244             :         }
    1245             : 
    1246          82 :         if (p2p_wpa_s->conf->update_config &&
    1247           0 :             wpa_config_write(p2p_wpa_s->confname, p2p_wpa_s->conf))
    1248           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    1249             : }
    1250             : 
    1251             : 
    1252         667 : static void wpas_p2p_group_started(struct wpa_supplicant *wpa_s,
    1253             :                                    int go, struct wpa_ssid *ssid, int freq,
    1254             :                                    const u8 *psk, const char *passphrase,
    1255             :                                    const u8 *go_dev_addr, int persistent,
    1256             :                                    const char *extra)
    1257             : {
    1258             :         const char *ssid_txt;
    1259             :         char psk_txt[65];
    1260             : 
    1261         667 :         if (psk)
    1262         275 :                 wpa_snprintf_hex(psk_txt, sizeof(psk_txt), psk, 32);
    1263             :         else
    1264         392 :                 psk_txt[0] = '\0';
    1265             : 
    1266         667 :         if (ssid)
    1267         667 :                 ssid_txt = wpa_ssid_txt(ssid->ssid, ssid->ssid_len);
    1268             :         else
    1269           0 :                 ssid_txt = "";
    1270             : 
    1271         667 :         if (passphrase && passphrase[0] == '\0')
    1272           0 :                 passphrase = NULL;
    1273             : 
    1274             :         /*
    1275             :          * Include PSK/passphrase only in the control interface message and
    1276             :          * leave it out from the debug log entry.
    1277             :          */
    1278        5336 :         wpa_msg_global_ctrl(wpa_s->p2pdev, MSG_INFO,
    1279             :                             P2P_EVENT_GROUP_STARTED
    1280             :                             "%s %s ssid=\"%s\" freq=%d%s%s%s%s%s go_dev_addr="
    1281             :                             MACSTR "%s%s",
    1282         667 :                             wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq,
    1283             :                             psk ? " psk=" : "", psk_txt,
    1284             :                             passphrase ? " passphrase=\"" : "",
    1285             :                             passphrase ? passphrase : "",
    1286             :                             passphrase ? "\"" : "",
    1287        4002 :                             MAC2STR(go_dev_addr),
    1288             :                             persistent ? " [PERSISTENT]" : "", extra);
    1289        5336 :         wpa_printf(MSG_INFO, P2P_EVENT_GROUP_STARTED
    1290             :                    "%s %s ssid=\"%s\" freq=%d go_dev_addr=" MACSTR "%s%s",
    1291         667 :                    wpa_s->ifname, go ? "GO" : "client", ssid_txt, freq,
    1292        4002 :                    MAC2STR(go_dev_addr), persistent ? " [PERSISTENT]" : "",
    1293             :                    extra);
    1294         667 : }
    1295             : 
    1296             : 
    1297         402 : static void wpas_group_formation_completed(struct wpa_supplicant *wpa_s,
    1298             :                                            int success, int already_deleted)
    1299             : {
    1300             :         struct wpa_ssid *ssid;
    1301             :         int client;
    1302             :         int persistent;
    1303             :         u8 go_dev_addr[ETH_ALEN];
    1304             : 
    1305             :         /*
    1306             :          * This callback is likely called for the main interface. Update wpa_s
    1307             :          * to use the group interface if a new interface was created for the
    1308             :          * group.
    1309             :          */
    1310         402 :         if (wpa_s->global->p2p_group_formation)
    1311         400 :                 wpa_s = wpa_s->global->p2p_group_formation;
    1312         402 :         if (wpa_s->p2p_go_group_formation_completed) {
    1313           6 :                 wpa_s->global->p2p_group_formation = NULL;
    1314           6 :                 wpa_s->p2p_in_provisioning = 0;
    1315             :         }
    1316         402 :         wpa_s->p2p_in_invitation = 0;
    1317         402 :         wpa_s->group_formation_reported = 1;
    1318             : 
    1319         402 :         if (!success) {
    1320          30 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    1321             :                                P2P_EVENT_GROUP_FORMATION_FAILURE);
    1322          30 :                 wpas_notify_p2p_group_formation_failure(wpa_s, "");
    1323          30 :                 if (already_deleted)
    1324          41 :                         return;
    1325          19 :                 wpas_p2p_group_delete(wpa_s,
    1326             :                                       P2P_GROUP_REMOVAL_FORMATION_FAILED);
    1327          19 :                 return;
    1328             :         }
    1329             : 
    1330         372 :         wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    1331             :                        P2P_EVENT_GROUP_FORMATION_SUCCESS);
    1332             : 
    1333         372 :         ssid = wpa_s->current_ssid;
    1334         372 :         if (ssid && ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
    1335         139 :                 ssid->mode = WPAS_MODE_P2P_GO;
    1336         139 :                 p2p_group_notif_formation_done(wpa_s->p2p_group);
    1337         139 :                 wpa_supplicant_ap_mac_addr_filter(wpa_s, NULL);
    1338             :         }
    1339             : 
    1340         372 :         persistent = 0;
    1341         372 :         if (ssid) {
    1342         372 :                 client = ssid->mode == WPAS_MODE_INFRA;
    1343         372 :                 if (ssid->mode == WPAS_MODE_P2P_GO) {
    1344         139 :                         persistent = ssid->p2p_persistent_group;
    1345         139 :                         os_memcpy(go_dev_addr, wpa_s->global->p2p_dev_addr,
    1346             :                                   ETH_ALEN);
    1347             :                 } else
    1348         466 :                         persistent = wpas_p2p_persistent_group(wpa_s,
    1349             :                                                                go_dev_addr,
    1350         233 :                                                                ssid->ssid,
    1351             :                                                                ssid->ssid_len);
    1352             :         } else {
    1353           0 :                 client = wpa_s->p2p_group_interface ==
    1354             :                         P2P_GROUP_INTERFACE_CLIENT;
    1355           0 :                 os_memset(go_dev_addr, 0, ETH_ALEN);
    1356             :         }
    1357             : 
    1358         372 :         wpa_s->show_group_started = 0;
    1359         372 :         if (client) {
    1360             :                 /*
    1361             :                  * Indicate event only after successfully completed 4-way
    1362             :                  * handshake, i.e., when the interface is ready for data
    1363             :                  * packets.
    1364             :                  */
    1365         233 :                 wpa_s->show_group_started = 1;
    1366             :         } else {
    1367         139 :                 wpas_p2p_group_started(wpa_s, 1, ssid,
    1368             :                                        ssid ? ssid->frequency : 0,
    1369         139 :                                        ssid && ssid->passphrase == NULL &&
    1370           0 :                                        ssid->psk_set ? ssid->psk : NULL,
    1371             :                                        ssid ? ssid->passphrase : NULL,
    1372             :                                        go_dev_addr, persistent, "");
    1373         139 :                 wpas_p2p_cross_connect_setup(wpa_s);
    1374         139 :                 wpas_p2p_set_group_idle_timeout(wpa_s);
    1375             :         }
    1376             : 
    1377         372 :         if (persistent)
    1378         129 :                 wpas_p2p_store_persistent_group(wpa_s->p2pdev,
    1379             :                                                 ssid, go_dev_addr);
    1380             :         else {
    1381         243 :                 os_free(wpa_s->global->add_psk);
    1382         243 :                 wpa_s->global->add_psk = NULL;
    1383             :         }
    1384             : 
    1385         372 :         if (!client) {
    1386         139 :                 wpas_notify_p2p_group_started(wpa_s, ssid, persistent, 0);
    1387         139 :                 os_get_reltime(&wpa_s->global->p2p_go_wait_client);
    1388             :         }
    1389             : }
    1390             : 
    1391             : 
    1392             : struct send_action_work {
    1393             :         unsigned int freq;
    1394             :         u8 dst[ETH_ALEN];
    1395             :         u8 src[ETH_ALEN];
    1396             :         u8 bssid[ETH_ALEN];
    1397             :         size_t len;
    1398             :         unsigned int wait_time;
    1399             :         u8 buf[0];
    1400             : };
    1401             : 
    1402             : 
    1403         202 : static void wpas_p2p_free_send_action_work(struct wpa_supplicant *wpa_s)
    1404             : {
    1405         202 :         struct send_action_work *awork = wpa_s->p2p_send_action_work->ctx;
    1406             : 
    1407        3838 :         wpa_printf(MSG_DEBUG,
    1408             :                    "P2P: Free Action frame radio work @%p (freq=%u dst="
    1409             :                    MACSTR " src=" MACSTR " bssid=" MACSTR " wait_time=%u)",
    1410             :                    wpa_s->p2p_send_action_work, awork->freq,
    1411        2424 :                    MAC2STR(awork->dst), MAC2STR(awork->src),
    1412        1212 :                    MAC2STR(awork->bssid), awork->wait_time);
    1413         404 :         wpa_hexdump(MSG_DEBUG, "P2P: Freeing pending Action frame",
    1414         202 :                     awork->buf, awork->len);
    1415         202 :         os_free(awork);
    1416         202 :         wpa_s->p2p_send_action_work->ctx = NULL;
    1417         202 :         radio_work_done(wpa_s->p2p_send_action_work);
    1418         202 :         wpa_s->p2p_send_action_work = NULL;
    1419         202 : }
    1420             : 
    1421             : 
    1422         199 : static void wpas_p2p_send_action_work_timeout(void *eloop_ctx,
    1423             :                                               void *timeout_ctx)
    1424             : {
    1425         199 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    1426             : 
    1427         199 :         if (!wpa_s->p2p_send_action_work)
    1428         199 :                 return;
    1429             : 
    1430         199 :         wpa_printf(MSG_DEBUG, "P2P: Send Action frame radio work timed out");
    1431         199 :         wpas_p2p_free_send_action_work(wpa_s);
    1432             : }
    1433             : 
    1434             : 
    1435        1555 : static void wpas_p2p_action_tx_clear(struct wpa_supplicant *wpa_s)
    1436             : {
    1437        1555 :         if (wpa_s->p2p_send_action_work) {
    1438             :                 struct send_action_work *awork;
    1439             : 
    1440        1125 :                 awork = wpa_s->p2p_send_action_work->ctx;
    1441        1125 :                 wpa_printf(MSG_DEBUG,
    1442             :                            "P2P: Clear Action TX work @%p (wait_time=%u)",
    1443             :                            wpa_s->p2p_send_action_work, awork->wait_time);
    1444        1125 :                 if (awork->wait_time == 0) {
    1445           0 :                         wpas_p2p_free_send_action_work(wpa_s);
    1446             :                 } else {
    1447             :                         /*
    1448             :                          * In theory, this should not be needed, but number of
    1449             :                          * places in the P2P code is still using non-zero wait
    1450             :                          * time for the last Action frame in the sequence and
    1451             :                          * some of these do not call send_action_done().
    1452             :                          */
    1453        1125 :                         eloop_cancel_timeout(wpas_p2p_send_action_work_timeout,
    1454             :                                              wpa_s, NULL);
    1455        1125 :                         eloop_register_timeout(
    1456        1125 :                                 0, awork->wait_time * 1000,
    1457             :                                 wpas_p2p_send_action_work_timeout,
    1458             :                                 wpa_s, NULL);
    1459             :                 }
    1460             :         }
    1461        1555 : }
    1462             : 
    1463             : 
    1464        1555 : static void wpas_p2p_send_action_tx_status(struct wpa_supplicant *wpa_s,
    1465             :                                            unsigned int freq,
    1466             :                                            const u8 *dst, const u8 *src,
    1467             :                                            const u8 *bssid,
    1468             :                                            const u8 *data, size_t data_len,
    1469             :                                            enum offchannel_send_action_result
    1470             :                                            result)
    1471             : {
    1472        1555 :         enum p2p_send_action_result res = P2P_SEND_ACTION_SUCCESS;
    1473             : 
    1474        1555 :         wpas_p2p_action_tx_clear(wpa_s);
    1475             : 
    1476        1555 :         if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled)
    1477           0 :                 return;
    1478             : 
    1479        1555 :         switch (result) {
    1480             :         case OFFCHANNEL_SEND_ACTION_SUCCESS:
    1481        1262 :                 res = P2P_SEND_ACTION_SUCCESS;
    1482        1262 :                 break;
    1483             :         case OFFCHANNEL_SEND_ACTION_NO_ACK:
    1484         293 :                 res = P2P_SEND_ACTION_NO_ACK;
    1485         293 :                 break;
    1486             :         case OFFCHANNEL_SEND_ACTION_FAILED:
    1487           0 :                 res = P2P_SEND_ACTION_FAILED;
    1488           0 :                 break;
    1489             :         }
    1490             : 
    1491        1555 :         p2p_send_action_cb(wpa_s->global->p2p, freq, dst, src, bssid, res);
    1492             : 
    1493        1848 :         if (result != OFFCHANNEL_SEND_ACTION_SUCCESS &&
    1494         294 :             wpa_s->pending_pd_before_join &&
    1495           1 :             (os_memcmp(dst, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
    1496           1 :              os_memcmp(dst, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0) &&
    1497             :             wpa_s->p2p_fallback_to_go_neg) {
    1498           1 :                 wpa_s->pending_pd_before_join = 0;
    1499           1 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No ACK for PD Req "
    1500             :                         "during p2p_connect-auto");
    1501           1 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    1502             :                                P2P_EVENT_FALLBACK_TO_GO_NEG
    1503             :                                "reason=no-ACK-to-PD-Req");
    1504           1 :                 wpas_p2p_fallback_to_go_neg(wpa_s, 0);
    1505           1 :                 return;
    1506             :         }
    1507             : }
    1508             : 
    1509             : 
    1510         972 : static void wpas_send_action_cb(struct wpa_radio_work *work, int deinit)
    1511             : {
    1512         972 :         struct wpa_supplicant *wpa_s = work->wpa_s;
    1513         972 :         struct send_action_work *awork = work->ctx;
    1514             : 
    1515         972 :         if (deinit) {
    1516          11 :                 if (work->started) {
    1517          11 :                         eloop_cancel_timeout(wpas_p2p_send_action_work_timeout,
    1518             :                                              wpa_s, NULL);
    1519          11 :                         wpa_s->p2p_send_action_work = NULL;
    1520          11 :                         offchannel_send_action_done(wpa_s);
    1521             :                 }
    1522          11 :                 os_free(awork);
    1523          11 :                 return;
    1524             :         }
    1525             : 
    1526        1922 :         if (offchannel_send_action(wpa_s, awork->freq, awork->dst, awork->src,
    1527         961 :                                    awork->bssid, awork->buf, awork->len,
    1528             :                                    awork->wait_time,
    1529             :                                    wpas_p2p_send_action_tx_status, 1) < 0) {
    1530           0 :                 os_free(awork);
    1531           0 :                 radio_work_done(work);
    1532           0 :                 return;
    1533             :         }
    1534         961 :         wpa_s->p2p_send_action_work = work;
    1535             : }
    1536             : 
    1537             : 
    1538         963 : static int wpas_send_action_work(struct wpa_supplicant *wpa_s,
    1539             :                                  unsigned int freq, const u8 *dst,
    1540             :                                  const u8 *src, const u8 *bssid, const u8 *buf,
    1541             :                                  size_t len, unsigned int wait_time)
    1542             : {
    1543             :         struct send_action_work *awork;
    1544             : 
    1545         963 :         if (wpa_s->p2p_send_action_work) {
    1546           2 :                 wpa_printf(MSG_DEBUG, "P2P: Cannot schedule new p2p-send-action work since one is already pending");
    1547           2 :                 return -1;
    1548             :         }
    1549             : 
    1550         961 :         awork = os_zalloc(sizeof(*awork) + len);
    1551         961 :         if (awork == NULL)
    1552           0 :                 return -1;
    1553             : 
    1554         961 :         awork->freq = freq;
    1555         961 :         os_memcpy(awork->dst, dst, ETH_ALEN);
    1556         961 :         os_memcpy(awork->src, src, ETH_ALEN);
    1557         961 :         os_memcpy(awork->bssid, bssid, ETH_ALEN);
    1558         961 :         awork->len = len;
    1559         961 :         awork->wait_time = wait_time;
    1560         961 :         os_memcpy(awork->buf, buf, len);
    1561             : 
    1562         961 :         if (radio_add_work(wpa_s, freq, "p2p-send-action", 0,
    1563             :                            wpas_send_action_cb, awork) < 0) {
    1564           0 :                 os_free(awork);
    1565           0 :                 return -1;
    1566             :         }
    1567             : 
    1568         961 :         return 0;
    1569             : }
    1570             : 
    1571             : 
    1572        1576 : static int wpas_send_action(void *ctx, unsigned int freq, const u8 *dst,
    1573             :                             const u8 *src, const u8 *bssid, const u8 *buf,
    1574             :                             size_t len, unsigned int wait_time)
    1575             : {
    1576        1576 :         struct wpa_supplicant *wpa_s = ctx;
    1577        1576 :         int listen_freq = -1, send_freq = -1;
    1578             : 
    1579        1576 :         if (wpa_s->p2p_listen_work)
    1580         441 :                 listen_freq = wpa_s->p2p_listen_work->freq;
    1581        1576 :         if (wpa_s->p2p_send_action_work)
    1582         175 :                 send_freq = wpa_s->p2p_send_action_work->freq;
    1583        1576 :         if (listen_freq != (int) freq && send_freq != (int) freq) {
    1584         963 :                 wpa_printf(MSG_DEBUG, "P2P: Schedule new radio work for Action frame TX (listen_freq=%d send_freq=%d)",
    1585             :                            listen_freq, send_freq);
    1586         963 :                 return wpas_send_action_work(wpa_s, freq, dst, src, bssid, buf,
    1587             :                                              len, wait_time);
    1588             :         }
    1589             : 
    1590         613 :         wpa_printf(MSG_DEBUG, "P2P: Use ongoing radio work for Action frame TX");
    1591         613 :         return offchannel_send_action(wpa_s, freq, dst, src, bssid, buf, len,
    1592             :                                       wait_time,
    1593             :                                       wpas_p2p_send_action_tx_status, 1);
    1594             : }
    1595             : 
    1596             : 
    1597        1081 : static void wpas_send_action_done(void *ctx)
    1598             : {
    1599        1081 :         struct wpa_supplicant *wpa_s = ctx;
    1600             : 
    1601        1081 :         if (wpa_s->p2p_send_action_work) {
    1602         748 :                 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout,
    1603             :                                      wpa_s, NULL);
    1604         748 :                 os_free(wpa_s->p2p_send_action_work->ctx);
    1605         748 :                 radio_work_done(wpa_s->p2p_send_action_work);
    1606         748 :                 wpa_s->p2p_send_action_work = NULL;
    1607             :         }
    1608             : 
    1609        1081 :         offchannel_send_action_done(wpa_s);
    1610        1081 : }
    1611             : 
    1612             : 
    1613         642 : static int wpas_copy_go_neg_results(struct wpa_supplicant *wpa_s,
    1614             :                                     struct p2p_go_neg_results *params)
    1615             : {
    1616         642 :         if (wpa_s->go_params == NULL) {
    1617         642 :                 wpa_s->go_params = os_malloc(sizeof(*params));
    1618         642 :                 if (wpa_s->go_params == NULL)
    1619           0 :                         return -1;
    1620             :         }
    1621         642 :         os_memcpy(wpa_s->go_params, params, sizeof(*params));
    1622         642 :         return 0;
    1623             : }
    1624             : 
    1625             : 
    1626         244 : static void wpas_start_wps_enrollee(struct wpa_supplicant *wpa_s,
    1627             :                                     struct p2p_go_neg_results *res)
    1628             : {
    1629         244 :         wpa_s->group_formation_reported = 0;
    1630        2928 :         wpa_printf(MSG_DEBUG, "P2P: Start WPS Enrollee for peer " MACSTR
    1631             :                    " dev_addr " MACSTR " wps_method %d",
    1632        1464 :                    MAC2STR(res->peer_interface_addr),
    1633        1464 :                    MAC2STR(res->peer_device_addr), res->wps_method);
    1634         488 :         wpa_hexdump_ascii(MSG_DEBUG, "P2P: Start WPS Enrollee for SSID",
    1635         244 :                           res->ssid, res->ssid_len);
    1636         244 :         wpa_supplicant_ap_deinit(wpa_s);
    1637         244 :         wpas_copy_go_neg_results(wpa_s, res);
    1638         244 :         if (res->wps_method == WPS_PBC) {
    1639          29 :                 wpas_wps_start_pbc(wpa_s, res->peer_interface_addr, 1);
    1640             : #ifdef CONFIG_WPS_NFC
    1641         215 :         } else if (res->wps_method == WPS_NFC) {
    1642          58 :                 wpas_wps_start_nfc(wpa_s, res->peer_device_addr,
    1643          17 :                                    res->peer_interface_addr,
    1644          17 :                                    wpa_s->p2pdev->p2p_oob_dev_pw,
    1645          17 :                                    wpa_s->p2pdev->p2p_oob_dev_pw_id, 1,
    1646          17 :                                    wpa_s->p2pdev->p2p_oob_dev_pw_id ==
    1647             :                                    DEV_PW_NFC_CONNECTION_HANDOVER ?
    1648           7 :                                    wpa_s->p2pdev->p2p_peer_oob_pubkey_hash :
    1649             :                                    NULL,
    1650             :                                    NULL, 0, 0);
    1651             : #endif /* CONFIG_WPS_NFC */
    1652             :         } else {
    1653         198 :                 u16 dev_pw_id = DEV_PW_DEFAULT;
    1654         198 :                 if (wpa_s->p2p_wps_method == WPS_P2PS)
    1655          25 :                         dev_pw_id = DEV_PW_P2PS_DEFAULT;
    1656         198 :                 if (wpa_s->p2p_wps_method == WPS_PIN_KEYPAD)
    1657          91 :                         dev_pw_id = DEV_PW_REGISTRAR_SPECIFIED;
    1658         396 :                 wpas_wps_start_pin(wpa_s, res->peer_interface_addr,
    1659         198 :                                    wpa_s->p2p_pin, 1, dev_pw_id);
    1660             :         }
    1661         244 : }
    1662             : 
    1663             : 
    1664          77 : static void wpas_p2p_add_psk_list(struct wpa_supplicant *wpa_s,
    1665             :                                   struct wpa_ssid *ssid)
    1666             : {
    1667             :         struct wpa_ssid *persistent;
    1668             :         struct psk_list_entry *psk;
    1669             :         struct hostapd_data *hapd;
    1670             : 
    1671          77 :         if (!wpa_s->ap_iface)
    1672           0 :                 return;
    1673             : 
    1674          77 :         persistent = wpas_p2p_get_persistent(wpa_s->p2pdev, NULL, ssid->ssid,
    1675             :                                              ssid->ssid_len);
    1676          77 :         if (persistent == NULL)
    1677           0 :                 return;
    1678             : 
    1679          77 :         hapd = wpa_s->ap_iface->bss[0];
    1680             : 
    1681          79 :         dl_list_for_each(psk, &persistent->psk_list, struct psk_list_entry,
    1682             :                          list) {
    1683             :                 struct hostapd_wpa_psk *hpsk;
    1684             : 
    1685           2 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add persistent group PSK entry for "
    1686             :                         MACSTR " psk=%d",
    1687             :                         MAC2STR(psk->addr), psk->p2p);
    1688           2 :                 hpsk = os_zalloc(sizeof(*hpsk));
    1689           2 :                 if (hpsk == NULL)
    1690           0 :                         break;
    1691           2 :                 os_memcpy(hpsk->psk, psk->psk, PMK_LEN);
    1692           2 :                 if (psk->p2p)
    1693           2 :                         os_memcpy(hpsk->p2p_dev_addr, psk->addr, ETH_ALEN);
    1694             :                 else
    1695           0 :                         os_memcpy(hpsk->addr, psk->addr, ETH_ALEN);
    1696           2 :                 hpsk->next = hapd->conf->ssid.wpa_psk;
    1697           2 :                 hapd->conf->ssid.wpa_psk = hpsk;
    1698             :         }
    1699             : }
    1700             : 
    1701             : 
    1702       17031 : static void p2p_go_dump_common_freqs(struct wpa_supplicant *wpa_s)
    1703             : {
    1704             :         unsigned int i;
    1705             : 
    1706       17031 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Common group frequencies (len=%u):",
    1707             :                 wpa_s->p2p_group_common_freqs_num);
    1708             : 
    1709      195788 :         for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++)
    1710      178757 :                 wpa_dbg(wpa_s, MSG_DEBUG, "freq[%u]: %d",
    1711             :                         i, wpa_s->p2p_group_common_freqs[i]);
    1712       17031 : }
    1713             : 
    1714             : 
    1715         398 : static void p2p_go_save_group_common_freqs(struct wpa_supplicant *wpa_s,
    1716             :                                            struct p2p_go_neg_results *params)
    1717             : {
    1718         398 :         unsigned int i, len = int_array_len(wpa_s->go_params->freq_list);
    1719             : 
    1720         398 :         wpa_s->p2p_group_common_freqs_num = 0;
    1721         398 :         os_free(wpa_s->p2p_group_common_freqs);
    1722         398 :         wpa_s->p2p_group_common_freqs = os_calloc(len, sizeof(int));
    1723         398 :         if (!wpa_s->p2p_group_common_freqs)
    1724         398 :                 return;
    1725             : 
    1726        1936 :         for (i = 0; i < len; i++) {
    1727        1538 :                 if (!wpa_s->go_params->freq_list[i])
    1728           0 :                         break;
    1729        3076 :                 wpa_s->p2p_group_common_freqs[i] =
    1730        1538 :                         wpa_s->go_params->freq_list[i];
    1731             :         }
    1732         398 :         wpa_s->p2p_group_common_freqs_num = i;
    1733             : }
    1734             : 
    1735             : 
    1736           0 : static void p2p_config_write(struct wpa_supplicant *wpa_s)
    1737             : {
    1738             : #ifndef CONFIG_NO_CONFIG_WRITE
    1739           0 :         if (wpa_s->p2pdev->conf->update_config &&
    1740           0 :             wpa_config_write(wpa_s->p2pdev->confname, wpa_s->p2pdev->conf))
    1741           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    1742             : #endif /* CONFIG_NO_CONFIG_WRITE */
    1743           0 : }
    1744             : 
    1745             : 
    1746         398 : static void p2p_go_configured(void *ctx, void *data)
    1747             : {
    1748         398 :         struct wpa_supplicant *wpa_s = ctx;
    1749         398 :         struct p2p_go_neg_results *params = data;
    1750             :         struct wpa_ssid *ssid;
    1751             : 
    1752         398 :         wpa_s->ap_configured_cb = NULL;
    1753         398 :         wpa_s->ap_configured_cb_ctx = NULL;
    1754         398 :         wpa_s->ap_configured_cb_data = NULL;
    1755         398 :         if (!wpa_s->go_params) {
    1756           0 :                 wpa_printf(MSG_ERROR,
    1757             :                            "P2P: p2p_go_configured() called with wpa_s->go_params == NULL");
    1758           0 :                 return;
    1759             :         }
    1760             : 
    1761         398 :         p2p_go_save_group_common_freqs(wpa_s, params);
    1762         398 :         p2p_go_dump_common_freqs(wpa_s);
    1763             : 
    1764         398 :         ssid = wpa_s->current_ssid;
    1765         398 :         if (ssid && ssid->mode == WPAS_MODE_P2P_GO) {
    1766         253 :                 wpa_printf(MSG_DEBUG, "P2P: Group setup without provisioning");
    1767         253 :                 if (wpa_s->global->p2p_group_formation == wpa_s)
    1768         106 :                         wpa_s->global->p2p_group_formation = NULL;
    1769         506 :                 wpas_p2p_group_started(wpa_s, 1, ssid, ssid->frequency,
    1770         253 :                                        params->passphrase[0] == '\0' ?
    1771             :                                        params->psk : NULL,
    1772         253 :                                        params->passphrase,
    1773         253 :                                        wpa_s->global->p2p_dev_addr,
    1774             :                                        params->persistent_group, "");
    1775         253 :                 wpa_s->group_formation_reported = 1;
    1776             : 
    1777         253 :                 if (wpa_s->p2pdev->p2ps_method_config_any) {
    1778          11 :                         if (is_zero_ether_addr(wpa_s->p2pdev->p2ps_join_addr)) {
    1779           9 :                                 wpa_dbg(wpa_s, MSG_DEBUG,
    1780             :                                         "P2PS: Setting default PIN for ANY");
    1781           9 :                                 wpa_supplicant_ap_wps_pin(wpa_s, NULL,
    1782             :                                                           "12345670", NULL, 0,
    1783             :                                                           0);
    1784             :                         } else {
    1785           2 :                                 wpa_dbg(wpa_s, MSG_DEBUG,
    1786             :                                         "P2PS: Setting default PIN for " MACSTR,
    1787             :                                         MAC2STR(wpa_s->p2pdev->p2ps_join_addr));
    1788           2 :                                 wpa_supplicant_ap_wps_pin(
    1789           2 :                                         wpa_s, wpa_s->p2pdev->p2ps_join_addr,
    1790             :                                         "12345670", NULL, 0, 0);
    1791             :                         }
    1792          11 :                         wpa_s->p2pdev->p2ps_method_config_any = 0;
    1793             :                 }
    1794             : 
    1795         253 :                 os_get_reltime(&wpa_s->global->p2p_go_wait_client);
    1796         253 :                 if (params->persistent_group) {
    1797          77 :                         wpas_p2p_store_persistent_group(
    1798             :                                 wpa_s->p2pdev, ssid,
    1799          77 :                                 wpa_s->global->p2p_dev_addr);
    1800          77 :                         wpas_p2p_add_psk_list(wpa_s, ssid);
    1801             :                 }
    1802             : 
    1803         253 :                 wpas_notify_p2p_group_started(wpa_s, ssid,
    1804             :                                               params->persistent_group, 0);
    1805         253 :                 wpas_p2p_cross_connect_setup(wpa_s);
    1806         253 :                 wpas_p2p_set_group_idle_timeout(wpa_s);
    1807             : 
    1808         253 :                 if (wpa_s->p2p_first_connection_timeout) {
    1809          41 :                         wpa_dbg(wpa_s, MSG_DEBUG,
    1810             :                                 "P2P: Start group formation timeout of %d seconds until first data connection on GO",
    1811             :                                 wpa_s->p2p_first_connection_timeout);
    1812          41 :                         wpa_s->p2p_go_group_formation_completed = 0;
    1813          41 :                         wpa_s->global->p2p_group_formation = wpa_s;
    1814          41 :                         eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    1815          41 :                                              wpa_s->p2pdev, NULL);
    1816          41 :                         eloop_register_timeout(
    1817          41 :                                 wpa_s->p2p_first_connection_timeout, 0,
    1818             :                                 wpas_p2p_group_formation_timeout,
    1819          41 :                                 wpa_s->p2pdev, NULL);
    1820             :                 }
    1821             : 
    1822         253 :                 return;
    1823             :         }
    1824             : 
    1825         145 :         wpa_printf(MSG_DEBUG, "P2P: Setting up WPS for GO provisioning");
    1826         145 :         if (wpa_supplicant_ap_mac_addr_filter(wpa_s,
    1827         145 :                                               params->peer_interface_addr)) {
    1828           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to setup MAC address "
    1829             :                            "filtering");
    1830           0 :                 return;
    1831             :         }
    1832         145 :         if (params->wps_method == WPS_PBC) {
    1833          24 :                 wpa_supplicant_ap_wps_pbc(wpa_s, params->peer_interface_addr,
    1834          24 :                                           params->peer_device_addr);
    1835             : #ifdef CONFIG_WPS_NFC
    1836         121 :         } else if (params->wps_method == WPS_NFC) {
    1837           9 :                 if (wpa_s->p2pdev->p2p_oob_dev_pw_id !=
    1838           4 :                     DEV_PW_NFC_CONNECTION_HANDOVER &&
    1839           4 :                     !wpa_s->p2pdev->p2p_oob_dev_pw) {
    1840           0 :                         wpa_printf(MSG_DEBUG, "P2P: No NFC Dev Pw known");
    1841           0 :                         return;
    1842             :                 }
    1843          25 :                 wpas_ap_wps_add_nfc_pw(
    1844           9 :                         wpa_s, wpa_s->p2pdev->p2p_oob_dev_pw_id,
    1845           9 :                         wpa_s->p2pdev->p2p_oob_dev_pw,
    1846           9 :                         wpa_s->p2pdev->p2p_peer_oob_pk_hash_known ?
    1847           7 :                         wpa_s->p2pdev->p2p_peer_oob_pubkey_hash : NULL);
    1848             : #endif /* CONFIG_WPS_NFC */
    1849         112 :         } else if (wpa_s->p2p_pin[0])
    1850         112 :                 wpa_supplicant_ap_wps_pin(wpa_s, params->peer_interface_addr,
    1851         112 :                                           wpa_s->p2p_pin, NULL, 0, 0);
    1852         145 :         os_free(wpa_s->go_params);
    1853         145 :         wpa_s->go_params = NULL;
    1854             : }
    1855             : 
    1856             : 
    1857         398 : static void wpas_start_wps_go(struct wpa_supplicant *wpa_s,
    1858             :                               struct p2p_go_neg_results *params,
    1859             :                               int group_formation)
    1860             : {
    1861             :         struct wpa_ssid *ssid;
    1862             : 
    1863         398 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Starting GO");
    1864         398 :         if (wpas_copy_go_neg_results(wpa_s, params) < 0) {
    1865           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not copy GO Negotiation "
    1866             :                         "results");
    1867           0 :                 return;
    1868             :         }
    1869             : 
    1870         398 :         ssid = wpa_config_add_network(wpa_s->conf);
    1871         398 :         if (ssid == NULL) {
    1872           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not add network for GO");
    1873           0 :                 return;
    1874             :         }
    1875             : 
    1876         398 :         wpa_s->show_group_started = 0;
    1877         398 :         wpa_s->p2p_go_group_formation_completed = 0;
    1878         398 :         wpa_s->group_formation_reported = 0;
    1879         398 :         os_memset(wpa_s->go_dev_addr, 0, ETH_ALEN);
    1880             : 
    1881         398 :         wpa_config_set_network_defaults(ssid);
    1882         398 :         ssid->temporary = 1;
    1883         398 :         ssid->p2p_group = 1;
    1884         398 :         ssid->p2p_persistent_group = !!params->persistent_group;
    1885         398 :         ssid->mode = group_formation ? WPAS_MODE_P2P_GROUP_FORMATION :
    1886             :                 WPAS_MODE_P2P_GO;
    1887         398 :         ssid->frequency = params->freq;
    1888         398 :         ssid->ht40 = params->ht40;
    1889         398 :         ssid->vht = params->vht;
    1890         398 :         ssid->max_oper_chwidth = params->max_oper_chwidth;
    1891         398 :         ssid->vht_center_freq2 = params->vht_center_freq2;
    1892         398 :         ssid->ssid = os_zalloc(params->ssid_len + 1);
    1893         398 :         if (ssid->ssid) {
    1894         398 :                 os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
    1895         398 :                 ssid->ssid_len = params->ssid_len;
    1896             :         }
    1897         398 :         ssid->auth_alg = WPA_AUTH_ALG_OPEN;
    1898         398 :         ssid->key_mgmt = WPA_KEY_MGMT_PSK;
    1899         398 :         ssid->proto = WPA_PROTO_RSN;
    1900         398 :         ssid->pairwise_cipher = WPA_CIPHER_CCMP;
    1901         398 :         ssid->group_cipher = WPA_CIPHER_CCMP;
    1902         398 :         if (params->freq > 56160) {
    1903             :                 /*
    1904             :                  * Enable GCMP instead of CCMP as pairwise_cipher and
    1905             :                  * group_cipher in 60 GHz.
    1906             :                  */
    1907           0 :                 ssid->pairwise_cipher = WPA_CIPHER_GCMP;
    1908           0 :                 ssid->group_cipher = WPA_CIPHER_GCMP;
    1909             :                 /* P2P GO in 60 GHz is always a PCP (PBSS) */
    1910           0 :                 ssid->pbss = 1;
    1911             :         }
    1912         398 :         if (os_strlen(params->passphrase) > 0) {
    1913         398 :                 ssid->passphrase = os_strdup(params->passphrase);
    1914         398 :                 if (ssid->passphrase == NULL) {
    1915           0 :                         wpa_msg_global(wpa_s, MSG_ERROR,
    1916             :                                        "P2P: Failed to copy passphrase for GO");
    1917           0 :                         wpa_config_remove_network(wpa_s->conf, ssid->id);
    1918           0 :                         return;
    1919             :                 }
    1920             :         } else
    1921           0 :                 ssid->passphrase = NULL;
    1922         398 :         ssid->psk_set = params->psk_set;
    1923         398 :         if (ssid->psk_set)
    1924          50 :                 os_memcpy(ssid->psk, params->psk, sizeof(ssid->psk));
    1925         348 :         else if (ssid->passphrase)
    1926         348 :                 wpa_config_update_psk(ssid);
    1927         398 :         ssid->ap_max_inactivity = wpa_s->p2pdev->conf->p2p_go_max_inactivity;
    1928             : 
    1929         398 :         wpa_s->ap_configured_cb = p2p_go_configured;
    1930         398 :         wpa_s->ap_configured_cb_ctx = wpa_s;
    1931         398 :         wpa_s->ap_configured_cb_data = wpa_s->go_params;
    1932         398 :         wpa_s->scan_req = NORMAL_SCAN_REQ;
    1933         398 :         wpa_s->connect_without_scan = ssid;
    1934         398 :         wpa_s->reassociate = 1;
    1935         398 :         wpa_s->disconnected = 0;
    1936         398 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Request scan (that will be skipped) to "
    1937             :                 "start GO)");
    1938         398 :         wpa_supplicant_req_scan(wpa_s, 0, 0);
    1939             : }
    1940             : 
    1941             : 
    1942         196 : static void wpas_p2p_clone_config(struct wpa_supplicant *dst,
    1943             :                                   const struct wpa_supplicant *src)
    1944             : {
    1945             :         struct wpa_config *d;
    1946             :         const struct wpa_config *s;
    1947             : 
    1948         196 :         d = dst->conf;
    1949         196 :         s = src->conf;
    1950             : 
    1951             : #define C(n)                            \
    1952             : do {                                    \
    1953             :         if (s->n && !d->n)              \
    1954             :                 d->n = os_strdup(s->n); \
    1955             : } while (0)
    1956             : 
    1957         196 :         C(device_name);
    1958         196 :         C(manufacturer);
    1959         196 :         C(model_name);
    1960         196 :         C(model_number);
    1961         196 :         C(serial_number);
    1962         196 :         C(config_methods);
    1963             : #undef C
    1964             : 
    1965         196 :         os_memcpy(d->device_type, s->device_type, WPS_DEV_TYPE_LEN);
    1966         196 :         os_memcpy(d->sec_device_type, s->sec_device_type,
    1967             :                   sizeof(d->sec_device_type));
    1968         196 :         d->num_sec_device_types = s->num_sec_device_types;
    1969             : 
    1970         196 :         d->p2p_group_idle = s->p2p_group_idle;
    1971         196 :         d->p2p_go_freq_change_policy = s->p2p_go_freq_change_policy;
    1972         196 :         d->p2p_intra_bss = s->p2p_intra_bss;
    1973         196 :         d->persistent_reconnect = s->persistent_reconnect;
    1974         196 :         d->max_num_sta = s->max_num_sta;
    1975         196 :         d->pbc_in_m1 = s->pbc_in_m1;
    1976         196 :         d->ignore_old_scan_res = s->ignore_old_scan_res;
    1977         196 :         d->beacon_int = s->beacon_int;
    1978         196 :         d->dtim_period = s->dtim_period;
    1979         196 :         d->p2p_go_ctwindow = s->p2p_go_ctwindow;
    1980         196 :         d->disassoc_low_ack = s->disassoc_low_ack;
    1981         196 :         d->disable_scan_offload = s->disable_scan_offload;
    1982         196 :         d->passive_scan = s->passive_scan;
    1983             : 
    1984         259 :         if (s->wps_nfc_dh_privkey && s->wps_nfc_dh_pubkey &&
    1985          63 :             !d->wps_nfc_pw_from_config) {
    1986          63 :                 wpabuf_free(d->wps_nfc_dh_privkey);
    1987          63 :                 wpabuf_free(d->wps_nfc_dh_pubkey);
    1988          63 :                 d->wps_nfc_dh_privkey = wpabuf_dup(s->wps_nfc_dh_privkey);
    1989          63 :                 d->wps_nfc_dh_pubkey = wpabuf_dup(s->wps_nfc_dh_pubkey);
    1990             :         }
    1991         196 :         d->p2p_cli_probe = s->p2p_cli_probe;
    1992         196 : }
    1993             : 
    1994             : 
    1995         189 : static void wpas_p2p_get_group_ifname(struct wpa_supplicant *wpa_s,
    1996             :                                       char *ifname, size_t len)
    1997             : {
    1998         189 :         char *ifname_ptr = wpa_s->ifname;
    1999             : 
    2000         189 :         if (os_strncmp(wpa_s->ifname, P2P_MGMT_DEVICE_PREFIX,
    2001             :                        os_strlen(P2P_MGMT_DEVICE_PREFIX)) == 0) {
    2002          20 :                 ifname_ptr = os_strrchr(wpa_s->ifname, '-') + 1;
    2003             :         }
    2004             : 
    2005         189 :         os_snprintf(ifname, len, "p2p-%s-%d", ifname_ptr, wpa_s->p2p_group_idx);
    2006         189 :         if (os_strlen(ifname) >= IFNAMSIZ &&
    2007           0 :             os_strlen(wpa_s->ifname) < IFNAMSIZ) {
    2008             :                 int res;
    2009             : 
    2010             :                 /* Try to avoid going over the IFNAMSIZ length limit */
    2011           0 :                 res = os_snprintf(ifname, len, "p2p-%d", wpa_s->p2p_group_idx);
    2012           0 :                 if (os_snprintf_error(len, res) && len)
    2013           0 :                         ifname[len - 1] = '\0';
    2014             :         }
    2015         189 : }
    2016             : 
    2017             : 
    2018         210 : static int wpas_p2p_add_group_interface(struct wpa_supplicant *wpa_s,
    2019             :                                         enum wpa_driver_if_type type)
    2020             : {
    2021             :         char ifname[120], force_ifname[120];
    2022             : 
    2023         210 :         if (wpa_s->pending_interface_name[0]) {
    2024          21 :                 wpa_printf(MSG_DEBUG, "P2P: Pending virtual interface exists "
    2025             :                            "- skip creation of a new one");
    2026          21 :                 if (is_zero_ether_addr(wpa_s->pending_interface_addr)) {
    2027           0 :                         wpa_printf(MSG_DEBUG, "P2P: Pending virtual address "
    2028             :                                    "unknown?! ifname='%s'",
    2029           0 :                                    wpa_s->pending_interface_name);
    2030           0 :                         return -1;
    2031             :                 }
    2032          21 :                 return 0;
    2033             :         }
    2034             : 
    2035         189 :         wpas_p2p_get_group_ifname(wpa_s, ifname, sizeof(ifname));
    2036         189 :         force_ifname[0] = '\0';
    2037             : 
    2038         189 :         wpa_printf(MSG_DEBUG, "P2P: Create a new interface %s for the group",
    2039             :                    ifname);
    2040         189 :         wpa_s->p2p_group_idx++;
    2041             : 
    2042         189 :         wpa_s->pending_interface_type = type;
    2043         189 :         if (wpa_drv_if_add(wpa_s, type, ifname, NULL, NULL, force_ifname,
    2044         189 :                            wpa_s->pending_interface_addr, NULL) < 0) {
    2045           1 :                 wpa_printf(MSG_ERROR, "P2P: Failed to create new group "
    2046             :                            "interface");
    2047           1 :                 return -1;
    2048             :         }
    2049             : 
    2050         188 :         if (force_ifname[0]) {
    2051           0 :                 wpa_printf(MSG_DEBUG, "P2P: Driver forced interface name %s",
    2052             :                            force_ifname);
    2053           0 :                 os_strlcpy(wpa_s->pending_interface_name, force_ifname,
    2054             :                            sizeof(wpa_s->pending_interface_name));
    2055             :         } else
    2056         188 :                 os_strlcpy(wpa_s->pending_interface_name, ifname,
    2057             :                            sizeof(wpa_s->pending_interface_name));
    2058        1316 :         wpa_printf(MSG_DEBUG, "P2P: Created pending virtual interface %s addr "
    2059         188 :                    MACSTR, wpa_s->pending_interface_name,
    2060        1128 :                    MAC2STR(wpa_s->pending_interface_addr));
    2061             : 
    2062         188 :         return 0;
    2063             : }
    2064             : 
    2065             : 
    2066       19419 : static void wpas_p2p_remove_pending_group_interface(
    2067             :         struct wpa_supplicant *wpa_s)
    2068             : {
    2069       19425 :         if (!wpa_s->pending_interface_name[0] ||
    2070           6 :             is_zero_ether_addr(wpa_s->pending_interface_addr))
    2071       38832 :                 return; /* No pending virtual interface */
    2072             : 
    2073           6 :         wpa_printf(MSG_DEBUG, "P2P: Removing pending group interface %s",
    2074           6 :                    wpa_s->pending_interface_name);
    2075           6 :         wpa_drv_if_remove(wpa_s, wpa_s->pending_interface_type,
    2076           6 :                           wpa_s->pending_interface_name);
    2077           6 :         os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
    2078           6 :         wpa_s->pending_interface_name[0] = '\0';
    2079           6 :         wpa_s->global->pending_group_iface_for_p2ps = 0;
    2080             : }
    2081             : 
    2082             : 
    2083             : static struct wpa_supplicant *
    2084         182 : wpas_p2p_init_group_interface(struct wpa_supplicant *wpa_s, int go)
    2085             : {
    2086             :         struct wpa_interface iface;
    2087             :         struct wpa_supplicant *group_wpa_s;
    2088             : 
    2089         182 :         if (!wpa_s->pending_interface_name[0]) {
    2090           0 :                 wpa_printf(MSG_ERROR, "P2P: No pending group interface");
    2091           0 :                 if (!wpas_p2p_create_iface(wpa_s))
    2092           0 :                         return NULL;
    2093             :                 /*
    2094             :                  * Something has forced us to remove the pending interface; try
    2095             :                  * to create a new one and hope for the best that we will get
    2096             :                  * the same local address.
    2097             :                  */
    2098           0 :                 if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
    2099             :                                                  WPA_IF_P2P_CLIENT) < 0)
    2100           0 :                         return NULL;
    2101             :         }
    2102             : 
    2103         182 :         os_memset(&iface, 0, sizeof(iface));
    2104         182 :         iface.ifname = wpa_s->pending_interface_name;
    2105         182 :         iface.driver = wpa_s->driver->name;
    2106         182 :         if (wpa_s->conf->ctrl_interface == NULL &&
    2107           0 :             wpa_s->parent != wpa_s &&
    2108           0 :             wpa_s->p2p_mgmt &&
    2109           0 :             (wpa_s->drv_flags & WPA_DRIVER_FLAGS_DEDICATED_P2P_DEVICE))
    2110           0 :                 iface.ctrl_interface = wpa_s->parent->conf->ctrl_interface;
    2111             :         else
    2112         182 :                 iface.ctrl_interface = wpa_s->conf->ctrl_interface;
    2113         182 :         iface.driver_param = wpa_s->conf->driver_param;
    2114         182 :         group_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
    2115         182 :         if (group_wpa_s == NULL) {
    2116           0 :                 wpa_printf(MSG_ERROR, "P2P: Failed to create new "
    2117             :                            "wpa_supplicant interface");
    2118           0 :                 return NULL;
    2119             :         }
    2120         182 :         wpa_s->pending_interface_name[0] = '\0';
    2121         182 :         group_wpa_s->p2p_group_interface = go ? P2P_GROUP_INTERFACE_GO :
    2122             :                 P2P_GROUP_INTERFACE_CLIENT;
    2123         182 :         wpa_s->global->p2p_group_formation = group_wpa_s;
    2124         182 :         wpa_s->global->pending_group_iface_for_p2ps = 0;
    2125             : 
    2126         182 :         wpas_p2p_clone_config(group_wpa_s, wpa_s);
    2127             : 
    2128         182 :         return group_wpa_s;
    2129             : }
    2130             : 
    2131             : 
    2132          10 : static void wpas_p2p_group_formation_timeout(void *eloop_ctx,
    2133             :                                              void *timeout_ctx)
    2134             : {
    2135          10 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    2136          10 :         wpa_printf(MSG_DEBUG, "P2P: Group Formation timed out");
    2137          10 :         wpas_p2p_group_formation_failed(wpa_s, 0);
    2138          10 : }
    2139             : 
    2140             : 
    2141          26 : static void wpas_p2p_group_formation_failed(struct wpa_supplicant *wpa_s,
    2142             :                                             int already_deleted)
    2143             : {
    2144          26 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    2145          26 :                              wpa_s->p2pdev, NULL);
    2146          26 :         if (wpa_s->global->p2p)
    2147          26 :                 p2p_group_formation_failed(wpa_s->global->p2p);
    2148          26 :         wpas_group_formation_completed(wpa_s, 0, already_deleted);
    2149          26 : }
    2150             : 
    2151             : 
    2152           7 : static void wpas_p2p_grpform_fail_after_wps(struct wpa_supplicant *wpa_s)
    2153             : {
    2154           7 :         wpa_printf(MSG_DEBUG, "P2P: Reject group formation due to WPS provisioning failure");
    2155           7 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    2156           7 :                              wpa_s->p2pdev, NULL);
    2157           7 :         eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout,
    2158           7 :                                wpa_s->p2pdev, NULL);
    2159           7 :         wpa_s->global->p2p_fail_on_wps_complete = 0;
    2160           7 : }
    2161             : 
    2162             : 
    2163           0 : void wpas_p2p_ap_setup_failed(struct wpa_supplicant *wpa_s)
    2164             : {
    2165           0 :         if (wpa_s->global->p2p_group_formation != wpa_s)
    2166           0 :                 return;
    2167             :         /* Speed up group formation timeout since this cannot succeed */
    2168           0 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    2169           0 :                              wpa_s->p2pdev, NULL);
    2170           0 :         eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout,
    2171           0 :                                wpa_s->p2pdev, NULL);
    2172             : }
    2173             : 
    2174             : 
    2175         312 : static void wpas_go_neg_completed(void *ctx, struct p2p_go_neg_results *res)
    2176             : {
    2177         312 :         struct wpa_supplicant *wpa_s = ctx;
    2178             :         struct wpa_supplicant *group_wpa_s;
    2179             : 
    2180         312 :         if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
    2181         144 :                 wpa_drv_cancel_remain_on_channel(wpa_s);
    2182         144 :                 wpa_s->off_channel_freq = 0;
    2183         144 :                 wpa_s->roc_waiting_drv_freq = 0;
    2184             :         }
    2185             : 
    2186         312 :         if (res->status) {
    2187          22 :                 wpa_msg_global(wpa_s, MSG_INFO,
    2188             :                                P2P_EVENT_GO_NEG_FAILURE "status=%d",
    2189             :                                res->status);
    2190          22 :                 wpas_notify_p2p_go_neg_completed(wpa_s, res);
    2191          22 :                 wpas_p2p_remove_pending_group_interface(wpa_s);
    2192          22 :                 return;
    2193             :         }
    2194             : 
    2195         290 :         if (!res->role_go) {
    2196             :                 /* Inform driver of the operating channel of GO. */
    2197         145 :                 wpa_drv_set_prob_oper_freq(wpa_s, res->freq);
    2198             :         }
    2199             : 
    2200         290 :         if (wpa_s->p2p_go_ht40)
    2201          17 :                 res->ht40 = 1;
    2202         290 :         if (wpa_s->p2p_go_vht)
    2203          17 :                 res->vht = 1;
    2204         290 :         res->max_oper_chwidth = wpa_s->p2p_go_max_oper_chwidth;
    2205         290 :         res->vht_center_freq2 = wpa_s->p2p_go_vht_center_freq2;
    2206             : 
    2207        4060 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_SUCCESS "role=%s "
    2208             :                        "freq=%d ht40=%d peer_dev=" MACSTR " peer_iface=" MACSTR
    2209             :                        " wps_method=%s",
    2210         290 :                        res->role_go ? "GO" : "client", res->freq, res->ht40,
    2211        1740 :                        MAC2STR(res->peer_device_addr),
    2212        1740 :                        MAC2STR(res->peer_interface_addr),
    2213             :                        p2p_wps_method_text(res->wps_method));
    2214         290 :         wpas_notify_p2p_go_neg_completed(wpa_s, res);
    2215             : 
    2216         290 :         if (res->role_go && wpa_s->p2p_persistent_id >= 0) {
    2217             :                 struct wpa_ssid *ssid;
    2218           1 :                 ssid = wpa_config_get_network(wpa_s->conf,
    2219             :                                               wpa_s->p2p_persistent_id);
    2220           2 :                 if (ssid && ssid->disabled == 2 &&
    2221           2 :                     ssid->mode == WPAS_MODE_P2P_GO && ssid->passphrase) {
    2222           1 :                         size_t len = os_strlen(ssid->passphrase);
    2223           1 :                         wpa_printf(MSG_DEBUG, "P2P: Override passphrase based "
    2224             :                                    "on requested persistent group");
    2225           1 :                         os_memcpy(res->passphrase, ssid->passphrase, len);
    2226           1 :                         res->passphrase[len] = '\0';
    2227             :                 }
    2228             :         }
    2229             : 
    2230         290 :         if (wpa_s->create_p2p_iface) {
    2231          49 :                 group_wpa_s =
    2232          49 :                         wpas_p2p_init_group_interface(wpa_s, res->role_go);
    2233          49 :                 if (group_wpa_s == NULL) {
    2234           0 :                         wpas_p2p_remove_pending_group_interface(wpa_s);
    2235           0 :                         eloop_cancel_timeout(wpas_p2p_long_listen_timeout,
    2236             :                                              wpa_s, NULL);
    2237           0 :                         wpas_p2p_group_formation_failed(wpa_s, 1);
    2238           0 :                         return;
    2239             :                 }
    2240          49 :                 os_memset(wpa_s->pending_interface_addr, 0, ETH_ALEN);
    2241          49 :                 wpa_s->pending_interface_name[0] = '\0';
    2242             :         } else {
    2243         241 :                 group_wpa_s = wpa_s->parent;
    2244         241 :                 wpa_s->global->p2p_group_formation = group_wpa_s;
    2245         241 :                 if (group_wpa_s != wpa_s)
    2246           7 :                         wpas_p2p_clone_config(group_wpa_s, wpa_s);
    2247             :         }
    2248             : 
    2249         290 :         group_wpa_s->p2p_in_provisioning = 1;
    2250         290 :         group_wpa_s->p2pdev = wpa_s;
    2251         290 :         if (group_wpa_s != wpa_s) {
    2252          56 :                 os_memcpy(group_wpa_s->p2p_pin, wpa_s->p2p_pin,
    2253             :                           sizeof(group_wpa_s->p2p_pin));
    2254          56 :                 group_wpa_s->p2p_wps_method = wpa_s->p2p_wps_method;
    2255             :         }
    2256         290 :         if (res->role_go) {
    2257         145 :                 wpas_start_wps_go(group_wpa_s, res, 1);
    2258             :         } else {
    2259         145 :                 os_get_reltime(&group_wpa_s->scan_min_time);
    2260         145 :                 wpas_start_wps_enrollee(group_wpa_s, res);
    2261             :         }
    2262             : 
    2263         290 :         wpa_s->p2p_long_listen = 0;
    2264         290 :         eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
    2265             : 
    2266         290 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
    2267         290 :         eloop_register_timeout(15 + res->peer_config_timeout / 100,
    2268         290 :                                (res->peer_config_timeout % 100) * 10000,
    2269             :                                wpas_p2p_group_formation_timeout, wpa_s, NULL);
    2270             : }
    2271             : 
    2272             : 
    2273          41 : static void wpas_go_neg_req_rx(void *ctx, const u8 *src, u16 dev_passwd_id,
    2274             :                                u8 go_intent)
    2275             : {
    2276          41 :         struct wpa_supplicant *wpa_s = ctx;
    2277         287 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_GO_NEG_REQUEST MACSTR
    2278         246 :                        " dev_passwd_id=%u go_intent=%u", MAC2STR(src),
    2279             :                        dev_passwd_id, go_intent);
    2280             : 
    2281          41 :         wpas_notify_p2p_go_neg_req(wpa_s, src, dev_passwd_id, go_intent);
    2282          41 : }
    2283             : 
    2284             : 
    2285         725 : static void wpas_dev_found(void *ctx, const u8 *addr,
    2286             :                            const struct p2p_peer_info *info,
    2287             :                            int new_device)
    2288             : {
    2289             : #ifndef CONFIG_NO_STDOUT_DEBUG
    2290         725 :         struct wpa_supplicant *wpa_s = ctx;
    2291             :         char devtype[WPS_DEV_TYPE_BUFSIZE];
    2292         725 :         char *wfd_dev_info_hex = NULL;
    2293             : 
    2294             : #ifdef CONFIG_WIFI_DISPLAY
    2295         725 :         wfd_dev_info_hex = wifi_display_subelem_hex(info->wfd_subelems,
    2296             :                                                     WFD_SUBELEM_DEVICE_INFO);
    2297             : #endif /* CONFIG_WIFI_DISPLAY */
    2298             : 
    2299         725 :         if (info->p2ps_instance) {
    2300             :                 char str[256];
    2301          54 :                 const u8 *buf = wpabuf_head(info->p2ps_instance);
    2302          54 :                 size_t len = wpabuf_len(info->p2ps_instance);
    2303             : 
    2304         166 :                 while (len) {
    2305             :                         u32 id;
    2306             :                         u16 methods;
    2307             :                         u8 str_len;
    2308             : 
    2309          58 :                         if (len < 4 + 2 + 1)
    2310           0 :                                 break;
    2311          58 :                         id = WPA_GET_LE32(buf);
    2312          58 :                         buf += sizeof(u32);
    2313          58 :                         methods = WPA_GET_BE16(buf);
    2314          58 :                         buf += sizeof(u16);
    2315          58 :                         str_len = *buf++;
    2316          58 :                         if (str_len > len - 4 - 2 - 1)
    2317           0 :                                 break;
    2318          58 :                         os_memcpy(str, buf, str_len);
    2319          58 :                         str[str_len] = '\0';
    2320          58 :                         buf += str_len;
    2321          58 :                         len -= str_len + sizeof(u32) + sizeof(u16) + sizeof(u8);
    2322             : 
    2323         928 :                         wpa_msg_global(wpa_s, MSG_INFO,
    2324             :                                        P2P_EVENT_DEVICE_FOUND MACSTR
    2325             :                                        " p2p_dev_addr=" MACSTR
    2326             :                                        " pri_dev_type=%s name='%s'"
    2327             :                                        " config_methods=0x%x"
    2328             :                                        " dev_capab=0x%x"
    2329             :                                        " group_capab=0x%x"
    2330             :                                        " adv_id=%x asp_svc=%s%s",
    2331         348 :                                        MAC2STR(addr),
    2332         348 :                                        MAC2STR(info->p2p_device_addr),
    2333             :                                        wps_dev_type_bin2str(
    2334          58 :                                                info->pri_dev_type,
    2335             :                                                devtype, sizeof(devtype)),
    2336          58 :                                        info->device_name, methods,
    2337         116 :                                        info->dev_capab, info->group_capab,
    2338             :                                        id, str,
    2339          58 :                                        info->vendor_elems ?
    2340             :                                        " vendor_elems=1" : "");
    2341             :                 }
    2342          54 :                 goto done;
    2343             :         }
    2344             : 
    2345       11407 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_FOUND MACSTR
    2346             :                        " p2p_dev_addr=" MACSTR
    2347             :                        " pri_dev_type=%s name='%s' config_methods=0x%x "
    2348             :                        "dev_capab=0x%x group_capab=0x%x%s%s%s new=%d",
    2349        8052 :                        MAC2STR(addr), MAC2STR(info->p2p_device_addr),
    2350         671 :                        wps_dev_type_bin2str(info->pri_dev_type, devtype,
    2351             :                                             sizeof(devtype)),
    2352        1342 :                        info->device_name, info->config_methods,
    2353        1342 :                        info->dev_capab, info->group_capab,
    2354             :                        wfd_dev_info_hex ? " wfd_dev_info=0x" : "",
    2355             :                        wfd_dev_info_hex ? wfd_dev_info_hex : "",
    2356         671 :                        info->vendor_elems ? " vendor_elems=1" : "",
    2357             :                        new_device);
    2358             : 
    2359             : done:
    2360         725 :         os_free(wfd_dev_info_hex);
    2361             : #endif /* CONFIG_NO_STDOUT_DEBUG */
    2362             : 
    2363         725 :         wpas_notify_p2p_device_found(ctx, info->p2p_device_addr, new_device);
    2364         725 : }
    2365             : 
    2366             : 
    2367         696 : static void wpas_dev_lost(void *ctx, const u8 *dev_addr)
    2368             : {
    2369         696 :         struct wpa_supplicant *wpa_s = ctx;
    2370             : 
    2371        4176 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_DEVICE_LOST
    2372        4176 :                        "p2p_dev_addr=" MACSTR, MAC2STR(dev_addr));
    2373             : 
    2374         696 :         wpas_notify_p2p_device_lost(wpa_s, dev_addr);
    2375         696 : }
    2376             : 
    2377             : 
    2378         476 : static void wpas_find_stopped(void *ctx)
    2379             : {
    2380         476 :         struct wpa_supplicant *wpa_s = ctx;
    2381             : 
    2382         476 :         if (wpa_s->p2p_scan_work && wpas_abort_ongoing_scan(wpa_s) < 0)
    2383           3 :                 wpa_printf(MSG_DEBUG, "P2P: Abort ongoing scan failed");
    2384             : 
    2385         476 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_FIND_STOPPED);
    2386         476 :         wpas_notify_p2p_find_stopped(wpa_s);
    2387         476 : }
    2388             : 
    2389             : 
    2390             : struct wpas_p2p_listen_work {
    2391             :         unsigned int freq;
    2392             :         unsigned int duration;
    2393             :         struct wpabuf *probe_resp_ie;
    2394             : };
    2395             : 
    2396             : 
    2397        2060 : static void wpas_p2p_listen_work_free(struct wpas_p2p_listen_work *lwork)
    2398             : {
    2399        2060 :         if (lwork == NULL)
    2400        2060 :                 return;
    2401        2060 :         wpabuf_free(lwork->probe_resp_ie);
    2402        2060 :         os_free(lwork);
    2403             : }
    2404             : 
    2405             : 
    2406       35857 : static void wpas_p2p_listen_work_done(struct wpa_supplicant *wpa_s)
    2407             : {
    2408             :         struct wpas_p2p_listen_work *lwork;
    2409             : 
    2410       35857 :         if (!wpa_s->p2p_listen_work)
    2411       69655 :                 return;
    2412             : 
    2413        2059 :         lwork = wpa_s->p2p_listen_work->ctx;
    2414        2059 :         wpas_p2p_listen_work_free(lwork);
    2415        2059 :         radio_work_done(wpa_s->p2p_listen_work);
    2416        2059 :         wpa_s->p2p_listen_work = NULL;
    2417             : }
    2418             : 
    2419             : 
    2420        2060 : static void wpas_start_listen_cb(struct wpa_radio_work *work, int deinit)
    2421             : {
    2422        2060 :         struct wpa_supplicant *wpa_s = work->wpa_s;
    2423        2060 :         struct wpas_p2p_listen_work *lwork = work->ctx;
    2424             :         unsigned int duration;
    2425             : 
    2426        2060 :         if (deinit) {
    2427           1 :                 if (work->started) {
    2428           0 :                         wpa_s->p2p_listen_work = NULL;
    2429           0 :                         wpas_stop_listen(wpa_s);
    2430             :                 }
    2431           1 :                 wpas_p2p_listen_work_free(lwork);
    2432           1 :                 return;
    2433             :         }
    2434             : 
    2435        2059 :         wpa_s->p2p_listen_work = work;
    2436             : 
    2437        2059 :         wpa_drv_set_ap_wps_ie(wpa_s, NULL, lwork->probe_resp_ie, NULL);
    2438             : 
    2439        2059 :         if (wpa_drv_probe_req_report(wpa_s, 1) < 0) {
    2440           2 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver to "
    2441             :                            "report received Probe Request frames");
    2442           2 :                 wpas_p2p_listen_work_done(wpa_s);
    2443           2 :                 return;
    2444             :         }
    2445             : 
    2446        2057 :         wpa_s->pending_listen_freq = lwork->freq;
    2447        2057 :         wpa_s->pending_listen_duration = lwork->duration;
    2448             : 
    2449        2057 :         duration = lwork->duration;
    2450             : #ifdef CONFIG_TESTING_OPTIONS
    2451        2057 :         if (wpa_s->extra_roc_dur) {
    2452           8 :                 wpa_printf(MSG_DEBUG, "TESTING: Increase ROC duration %u -> %u",
    2453           8 :                            duration, duration + wpa_s->extra_roc_dur);
    2454           8 :                 duration += wpa_s->extra_roc_dur;
    2455             :         }
    2456             : #endif /* CONFIG_TESTING_OPTIONS */
    2457             : 
    2458        2057 :         if (wpa_drv_remain_on_channel(wpa_s, lwork->freq, duration) < 0) {
    2459           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to request the driver "
    2460             :                            "to remain on channel (%u MHz) for Listen "
    2461             :                            "state", lwork->freq);
    2462           0 :                 wpas_p2p_listen_work_done(wpa_s);
    2463           0 :                 wpa_s->pending_listen_freq = 0;
    2464           0 :                 return;
    2465             :         }
    2466        2057 :         wpa_s->off_channel_freq = 0;
    2467        2057 :         wpa_s->roc_waiting_drv_freq = lwork->freq;
    2468             : }
    2469             : 
    2470             : 
    2471        2409 : static int wpas_start_listen(void *ctx, unsigned int freq,
    2472             :                              unsigned int duration,
    2473             :                              const struct wpabuf *probe_resp_ie)
    2474             : {
    2475        2409 :         struct wpa_supplicant *wpa_s = ctx;
    2476             :         struct wpas_p2p_listen_work *lwork;
    2477             : 
    2478        2409 :         if (wpa_s->p2p_listen_work) {
    2479         349 :                 wpa_printf(MSG_DEBUG, "P2P: Reject start_listen since p2p_listen_work already exists");
    2480         349 :                 return -1;
    2481             :         }
    2482             : 
    2483        2060 :         lwork = os_zalloc(sizeof(*lwork));
    2484        2060 :         if (lwork == NULL)
    2485           0 :                 return -1;
    2486        2060 :         lwork->freq = freq;
    2487        2060 :         lwork->duration = duration;
    2488        2060 :         if (probe_resp_ie) {
    2489        2060 :                 lwork->probe_resp_ie = wpabuf_dup(probe_resp_ie);
    2490        2060 :                 if (lwork->probe_resp_ie == NULL) {
    2491           0 :                         wpas_p2p_listen_work_free(lwork);
    2492           0 :                         return -1;
    2493             :                 }
    2494             :         }
    2495             : 
    2496        2060 :         if (radio_add_work(wpa_s, freq, "p2p-listen", 0, wpas_start_listen_cb,
    2497             :                            lwork) < 0) {
    2498           0 :                 wpas_p2p_listen_work_free(lwork);
    2499           0 :                 return -1;
    2500             :         }
    2501             : 
    2502        2060 :         return 0;
    2503             : }
    2504             : 
    2505             : 
    2506       33193 : static void wpas_stop_listen(void *ctx)
    2507             : {
    2508       33193 :         struct wpa_supplicant *wpa_s = ctx;
    2509       33193 :         if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
    2510         903 :                 wpa_drv_cancel_remain_on_channel(wpa_s);
    2511         903 :                 wpa_s->off_channel_freq = 0;
    2512         903 :                 wpa_s->roc_waiting_drv_freq = 0;
    2513             :         }
    2514       33193 :         wpa_drv_set_ap_wps_ie(wpa_s, NULL, NULL, NULL);
    2515             : 
    2516             :         /*
    2517             :          * Don't cancel Probe Request RX reporting for a connected P2P Client
    2518             :          * handling Probe Request frames.
    2519             :          */
    2520       33193 :         if (!wpa_s->p2p_cli_probe)
    2521       33193 :                 wpa_drv_probe_req_report(wpa_s, 0);
    2522             : 
    2523       33193 :         wpas_p2p_listen_work_done(wpa_s);
    2524       33193 : }
    2525             : 
    2526             : 
    2527         763 : static int wpas_send_probe_resp(void *ctx, const struct wpabuf *buf,
    2528             :                                 unsigned int freq)
    2529             : {
    2530         763 :         struct wpa_supplicant *wpa_s = ctx;
    2531         763 :         return wpa_drv_send_mlme(wpa_s, wpabuf_head(buf), wpabuf_len(buf), 1,
    2532             :                                  freq);
    2533             : }
    2534             : 
    2535             : 
    2536          90 : static void wpas_prov_disc_local_display(struct wpa_supplicant *wpa_s,
    2537             :                                          const u8 *peer, const char *params,
    2538             :                                          unsigned int generated_pin)
    2539             : {
    2540         540 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_SHOW_PIN MACSTR
    2541         540 :                        " %08d%s", MAC2STR(peer), generated_pin, params);
    2542          90 : }
    2543             : 
    2544             : 
    2545          24 : static void wpas_prov_disc_local_keypad(struct wpa_supplicant *wpa_s,
    2546             :                                         const u8 *peer, const char *params)
    2547             : {
    2548         144 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_ENTER_PIN MACSTR
    2549         144 :                        "%s", MAC2STR(peer), params);
    2550          24 : }
    2551             : 
    2552             : 
    2553         105 : static void wpas_prov_disc_req(void *ctx, const u8 *peer, u16 config_methods,
    2554             :                                const u8 *dev_addr, const u8 *pri_dev_type,
    2555             :                                const char *dev_name, u16 supp_config_methods,
    2556             :                                u8 dev_capab, u8 group_capab, const u8 *group_id,
    2557             :                                size_t group_id_len)
    2558             : {
    2559         105 :         struct wpa_supplicant *wpa_s = ctx;
    2560             :         char devtype[WPS_DEV_TYPE_BUFSIZE];
    2561             :         char params[300];
    2562             :         u8 empty_dev_type[8];
    2563         105 :         unsigned int generated_pin = 0;
    2564         105 :         struct wpa_supplicant *group = NULL;
    2565             :         int res;
    2566             : 
    2567         105 :         if (group_id) {
    2568         109 :                 for (group = wpa_s->global->ifaces; group; group = group->next)
    2569             :                 {
    2570          92 :                         struct wpa_ssid *s = group->current_ssid;
    2571         166 :                         if (s != NULL &&
    2572         148 :                             s->mode == WPAS_MODE_P2P_GO &&
    2573         148 :                             group_id_len - ETH_ALEN == s->ssid_len &&
    2574          74 :                             os_memcmp(group_id + ETH_ALEN, s->ssid,
    2575             :                                       s->ssid_len) == 0)
    2576          74 :                                 break;
    2577             :                 }
    2578             :         }
    2579             : 
    2580         105 :         if (pri_dev_type == NULL) {
    2581           0 :                 os_memset(empty_dev_type, 0, sizeof(empty_dev_type));
    2582           0 :                 pri_dev_type = empty_dev_type;
    2583             :         }
    2584         735 :         res = os_snprintf(params, sizeof(params), " p2p_dev_addr=" MACSTR
    2585             :                           " pri_dev_type=%s name='%s' config_methods=0x%x "
    2586             :                           "dev_capab=0x%x group_capab=0x%x%s%s",
    2587         630 :                           MAC2STR(dev_addr),
    2588             :                           wps_dev_type_bin2str(pri_dev_type, devtype,
    2589             :                                                sizeof(devtype)),
    2590             :                           dev_name, supp_config_methods, dev_capab, group_capab,
    2591             :                           group ? " group=" : "",
    2592             :                           group ? group->ifname : "");
    2593         105 :         if (os_snprintf_error(sizeof(params), res))
    2594           0 :                 wpa_printf(MSG_DEBUG, "P2P: PD Request event truncated");
    2595         105 :         params[sizeof(params) - 1] = '\0';
    2596             : 
    2597         105 :         if (config_methods & WPS_CONFIG_DISPLAY) {
    2598          87 :                 if (wps_generate_pin(&generated_pin) < 0) {
    2599           0 :                         wpa_printf(MSG_DEBUG, "P2P: Could not generate PIN");
    2600           0 :                         wpas_notify_p2p_provision_discovery(
    2601             :                                 wpa_s, peer, 0 /* response */,
    2602             :                                 P2P_PROV_DISC_INFO_UNAVAILABLE, 0, 0);
    2603         105 :                         return;
    2604             :                 }
    2605          87 :                 wpas_prov_disc_local_display(wpa_s, peer, params,
    2606             :                                              generated_pin);
    2607          18 :         } else if (config_methods & WPS_CONFIG_KEYPAD)
    2608           9 :                 wpas_prov_disc_local_keypad(wpa_s, peer, params);
    2609           9 :         else if (config_methods & WPS_CONFIG_PUSHBUTTON)
    2610          54 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_REQ
    2611          54 :                                MACSTR "%s", MAC2STR(peer), params);
    2612             : 
    2613         105 :         wpas_notify_p2p_provision_discovery(wpa_s, peer, 1 /* request */,
    2614             :                                             P2P_PROV_DISC_SUCCESS,
    2615             :                                             config_methods, generated_pin);
    2616             : }
    2617             : 
    2618             : 
    2619          94 : static void wpas_prov_disc_resp(void *ctx, const u8 *peer, u16 config_methods)
    2620             : {
    2621          94 :         struct wpa_supplicant *wpa_s = ctx;
    2622          94 :         unsigned int generated_pin = 0;
    2623             :         char params[20];
    2624             : 
    2625         167 :         if (wpa_s->pending_pd_before_join &&
    2626          73 :             (os_memcmp(peer, wpa_s->pending_join_dev_addr, ETH_ALEN) == 0 ||
    2627           0 :              os_memcmp(peer, wpa_s->pending_join_iface_addr, ETH_ALEN) == 0)) {
    2628          73 :                 wpa_s->pending_pd_before_join = 0;
    2629          73 :                 wpa_printf(MSG_DEBUG, "P2P: Starting pending "
    2630             :                            "join-existing-group operation");
    2631          73 :                 wpas_p2p_join_start(wpa_s, 0, NULL, 0);
    2632          73 :                 return;
    2633             :         }
    2634             : 
    2635          41 :         if (wpa_s->pending_pd_use == AUTO_PD_JOIN ||
    2636          22 :             wpa_s->pending_pd_use == AUTO_PD_GO_NEG) {
    2637             :                 int res;
    2638             : 
    2639           2 :                 res = os_snprintf(params, sizeof(params), " peer_go=%d",
    2640           2 :                                   wpa_s->pending_pd_use == AUTO_PD_JOIN);
    2641           2 :                 if (os_snprintf_error(sizeof(params), res))
    2642           0 :                         params[sizeof(params) - 1] = '\0';
    2643             :         } else
    2644          19 :                 params[0] = '\0';
    2645             : 
    2646          21 :         if (config_methods & WPS_CONFIG_DISPLAY)
    2647          15 :                 wpas_prov_disc_local_keypad(wpa_s, peer, params);
    2648           6 :         else if (config_methods & WPS_CONFIG_KEYPAD) {
    2649           3 :                 if (wps_generate_pin(&generated_pin) < 0) {
    2650           0 :                         wpa_printf(MSG_DEBUG, "P2P: Could not generate PIN");
    2651           0 :                         wpas_notify_p2p_provision_discovery(
    2652             :                                 wpa_s, peer, 0 /* response */,
    2653             :                                 P2P_PROV_DISC_INFO_UNAVAILABLE, 0, 0);
    2654           0 :                         return;
    2655             :                 }
    2656           3 :                 wpas_prov_disc_local_display(wpa_s, peer, params,
    2657             :                                              generated_pin);
    2658           3 :         } else if (config_methods & WPS_CONFIG_PUSHBUTTON)
    2659          12 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_PBC_RESP
    2660          12 :                                MACSTR "%s", MAC2STR(peer), params);
    2661             : 
    2662          21 :         wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
    2663             :                                             P2P_PROV_DISC_SUCCESS,
    2664             :                                             config_methods, generated_pin);
    2665             : }
    2666             : 
    2667             : 
    2668          14 : static void wpas_prov_disc_fail(void *ctx, const u8 *peer,
    2669             :                                 enum p2p_prov_disc_status status,
    2670             :                                 u32 adv_id, const u8 *adv_mac,
    2671             :                                 const char *deferred_session_resp)
    2672             : {
    2673          14 :         struct wpa_supplicant *wpa_s = ctx;
    2674             : 
    2675          14 :         if (wpa_s->p2p_fallback_to_go_neg) {
    2676           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: PD for p2p_connect-auto "
    2677             :                         "failed - fall back to GO Negotiation");
    2678           0 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    2679             :                                P2P_EVENT_FALLBACK_TO_GO_NEG
    2680             :                                "reason=PD-failed");
    2681           0 :                 wpas_p2p_fallback_to_go_neg(wpa_s, 0);
    2682           0 :                 return;
    2683             :         }
    2684             : 
    2685          14 :         if (status == P2P_PROV_DISC_TIMEOUT_JOIN) {
    2686           0 :                 wpa_s->pending_pd_before_join = 0;
    2687           0 :                 wpa_printf(MSG_DEBUG, "P2P: Starting pending "
    2688             :                            "join-existing-group operation (no ACK for PD "
    2689             :                            "Req attempts)");
    2690           0 :                 wpas_p2p_join_start(wpa_s, 0, NULL, 0);
    2691           0 :                 return;
    2692             :         }
    2693             : 
    2694          14 :         if (adv_id && adv_mac && deferred_session_resp) {
    2695           0 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
    2696             :                                " p2p_dev_addr=" MACSTR " status=%d adv_id=%x"
    2697             :                                " deferred_session_resp='%s'",
    2698           0 :                                MAC2STR(peer), status, adv_id,
    2699             :                                deferred_session_resp);
    2700          14 :         } else if (adv_id && adv_mac) {
    2701          72 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
    2702             :                                " p2p_dev_addr=" MACSTR " status=%d adv_id=%x",
    2703          72 :                                MAC2STR(peer), status, adv_id);
    2704             :         } else {
    2705          12 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_PROV_DISC_FAILURE
    2706             :                                " p2p_dev_addr=" MACSTR " status=%d",
    2707          12 :                                MAC2STR(peer), status);
    2708             :         }
    2709             : 
    2710          14 :         wpas_notify_p2p_provision_discovery(wpa_s, peer, 0 /* response */,
    2711             :                                             status, 0, 0);
    2712             : }
    2713             : 
    2714             : 
    2715         393 : static int freq_included(struct wpa_supplicant *wpa_s,
    2716             :                          const struct p2p_channels *channels,
    2717             :                          unsigned int freq)
    2718             : {
    2719         786 :         if ((channels == NULL || p2p_channels_includes_freq(channels, freq)) &&
    2720         393 :             wpas_p2p_go_is_peer_freq(wpa_s, freq))
    2721         393 :                 return 1;
    2722           0 :         return 0;
    2723             : }
    2724             : 
    2725             : 
    2726        8118 : static void wpas_p2p_go_update_common_freqs(struct wpa_supplicant *wpa_s)
    2727             : {
    2728        8118 :         unsigned int num = P2P_MAX_CHANNELS;
    2729             :         int *common_freqs;
    2730             :         int ret;
    2731             : 
    2732        8118 :         p2p_go_dump_common_freqs(wpa_s);
    2733        8118 :         common_freqs = os_calloc(num, sizeof(int));
    2734        8118 :         if (!common_freqs)
    2735           0 :                 return;
    2736             : 
    2737        8118 :         ret = p2p_group_get_common_freqs(wpa_s->p2p_group, common_freqs, &num);
    2738        8118 :         if (ret < 0) {
    2739           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    2740             :                         "P2P: Failed to get group common freqs");
    2741           0 :                 os_free(common_freqs);
    2742           0 :                 return;
    2743             :         }
    2744             : 
    2745        8118 :         os_free(wpa_s->p2p_group_common_freqs);
    2746        8118 :         wpa_s->p2p_group_common_freqs = common_freqs;
    2747        8118 :         wpa_s->p2p_group_common_freqs_num = num;
    2748        8118 :         p2p_go_dump_common_freqs(wpa_s);
    2749             : }
    2750             : 
    2751             : 
    2752             : /*
    2753             :  * Check if the given frequency is one of the possible operating frequencies
    2754             :  * set after the completion of the GO Negotiation.
    2755             :  */
    2756         397 : static int wpas_p2p_go_is_peer_freq(struct wpa_supplicant *wpa_s, int freq)
    2757             : {
    2758             :         unsigned int i;
    2759             : 
    2760         397 :         p2p_go_dump_common_freqs(wpa_s);
    2761             : 
    2762             :         /* assume no restrictions */
    2763         397 :         if (!wpa_s->p2p_group_common_freqs_num)
    2764         382 :                 return 1;
    2765             : 
    2766         123 :         for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
    2767         121 :                 if (wpa_s->p2p_group_common_freqs[i] == freq)
    2768          13 :                         return 1;
    2769             :         }
    2770           2 :         return 0;
    2771             : }
    2772             : 
    2773             : 
    2774           0 : static int wpas_sta_check_ecsa(struct hostapd_data *hapd,
    2775             :                                struct sta_info *sta, void *ctx)
    2776             : {
    2777           0 :         int *ecsa_support = ctx;
    2778             : 
    2779           0 :         *ecsa_support &= sta->ecsa_supported;
    2780             : 
    2781           0 :         return 0;
    2782             : }
    2783             : 
    2784             : 
    2785             : /* Check if all the peers support eCSA */
    2786           0 : static int wpas_p2p_go_clients_support_ecsa(struct wpa_supplicant *wpa_s)
    2787             : {
    2788           0 :         int ecsa_support = 1;
    2789             : 
    2790           0 :         ap_for_each_sta(wpa_s->ap_iface->bss[0], wpas_sta_check_ecsa,
    2791             :                         &ecsa_support);
    2792             : 
    2793           0 :         return ecsa_support;
    2794             : }
    2795             : 
    2796             : 
    2797             : /**
    2798             :  * Pick the best frequency to use from all the currently used frequencies.
    2799             :  */
    2800         530 : static int wpas_p2p_pick_best_used_freq(struct wpa_supplicant *wpa_s,
    2801             :                                         struct wpa_used_freq_data *freqs,
    2802             :                                         unsigned int num)
    2803             : {
    2804             :         unsigned int i, c;
    2805             : 
    2806             :         /* find a candidate freq that is supported by P2P */
    2807         537 :         for (c = 0; c < num; c++)
    2808          53 :                 if (p2p_supported_freq(wpa_s->global->p2p, freqs[c].freq))
    2809          46 :                         break;
    2810             : 
    2811         530 :         if (c == num)
    2812         484 :                 return 0;
    2813             : 
    2814             :         /* once we have a candidate, try to find a 'better' one */
    2815          46 :         for (i = c + 1; i < num; i++) {
    2816           4 :                 if (!p2p_supported_freq(wpa_s->global->p2p, freqs[i].freq))
    2817           0 :                         continue;
    2818             : 
    2819             :                 /*
    2820             :                  * 1. Infrastructure station interfaces have higher preference.
    2821             :                  * 2. P2P Clients have higher preference.
    2822             :                  * 3. All others.
    2823             :                  */
    2824           4 :                 if (freqs[i].flags & WPA_FREQ_USED_BY_INFRA_STATION) {
    2825           4 :                         c = i;
    2826           4 :                         break;
    2827             :                 }
    2828             : 
    2829           0 :                 if ((freqs[i].flags & WPA_FREQ_USED_BY_P2P_CLIENT))
    2830           0 :                         c = i;
    2831             :         }
    2832          46 :         return freqs[c].freq;
    2833             : }
    2834             : 
    2835             : 
    2836          74 : static u8 wpas_invitation_process(void *ctx, const u8 *sa, const u8 *bssid,
    2837             :                                   const u8 *go_dev_addr, const u8 *ssid,
    2838             :                                   size_t ssid_len, int *go, u8 *group_bssid,
    2839             :                                   int *force_freq, int persistent_group,
    2840             :                                   const struct p2p_channels *channels,
    2841             :                                   int dev_pw_id)
    2842             : {
    2843          74 :         struct wpa_supplicant *wpa_s = ctx;
    2844             :         struct wpa_ssid *s;
    2845             :         struct wpa_used_freq_data *freqs;
    2846             :         struct wpa_supplicant *grp;
    2847             :         int best_freq;
    2848             : 
    2849          74 :         if (!persistent_group) {
    2850         140 :                 wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
    2851             :                            " to join an active group (SSID: %s)",
    2852         120 :                            MAC2STR(sa), wpa_ssid_txt(ssid, ssid_len));
    2853          23 :                 if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
    2854           3 :                     (os_memcmp(go_dev_addr, wpa_s->p2p_auth_invite, ETH_ALEN)
    2855           0 :                      == 0 ||
    2856           0 :                      os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0)) {
    2857           3 :                         wpa_printf(MSG_DEBUG, "P2P: Accept previously "
    2858             :                                    "authorized invitation");
    2859           3 :                         goto accept_inv;
    2860             :                 }
    2861             : 
    2862             : #ifdef CONFIG_WPS_NFC
    2863          21 :                 if (dev_pw_id >= 0 && wpa_s->p2p_nfc_tag_enabled &&
    2864           4 :                     dev_pw_id == wpa_s->p2p_oob_dev_pw_id) {
    2865           4 :                         wpa_printf(MSG_DEBUG, "P2P: Accept invitation based on local enabled NFC Tag");
    2866           4 :                         wpa_s->p2p_wps_method = WPS_NFC;
    2867           4 :                         wpa_s->pending_join_wps_method = WPS_NFC;
    2868           4 :                         os_memcpy(wpa_s->pending_join_dev_addr,
    2869             :                                   go_dev_addr, ETH_ALEN);
    2870           4 :                         os_memcpy(wpa_s->pending_join_iface_addr,
    2871             :                                   bssid, ETH_ALEN);
    2872           4 :                         goto accept_inv;
    2873             :                 }
    2874             : #endif /* CONFIG_WPS_NFC */
    2875             : 
    2876             :                 /*
    2877             :                  * Do not accept the invitation automatically; notify user and
    2878             :                  * request approval.
    2879             :                  */
    2880          13 :                 return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
    2881             :         }
    2882             : 
    2883          54 :         grp = wpas_get_p2p_group(wpa_s, ssid, ssid_len, go);
    2884          54 :         if (grp) {
    2885           6 :                 wpa_printf(MSG_DEBUG, "P2P: Accept invitation to already "
    2886             :                            "running persistent group");
    2887           6 :                 if (*go)
    2888           4 :                         os_memcpy(group_bssid, grp->own_addr, ETH_ALEN);
    2889           6 :                 goto accept_inv;
    2890             :         }
    2891             : 
    2892          65 :         if (!is_zero_ether_addr(wpa_s->p2p_auth_invite) &&
    2893          17 :             os_memcmp(sa, wpa_s->p2p_auth_invite, ETH_ALEN) == 0) {
    2894          17 :                 wpa_printf(MSG_DEBUG, "P2P: Accept previously initiated "
    2895             :                            "invitation to re-invoke a persistent group");
    2896          17 :                 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
    2897          31 :         } else if (!wpa_s->conf->persistent_reconnect)
    2898           4 :                 return P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE;
    2899             : 
    2900          45 :         for (s = wpa_s->conf->ssid; s; s = s->next) {
    2901          81 :                 if (s->disabled == 2 &&
    2902          80 :                     os_memcmp(s->bssid, go_dev_addr, ETH_ALEN) == 0 &&
    2903          80 :                     s->ssid_len == ssid_len &&
    2904          40 :                     os_memcmp(ssid, s->ssid, ssid_len) == 0)
    2905          40 :                         break;
    2906             :         }
    2907             : 
    2908          44 :         if (!s) {
    2909          24 :                 wpa_printf(MSG_DEBUG, "P2P: Invitation from " MACSTR
    2910             :                            " requested reinvocation of an unknown group",
    2911          24 :                            MAC2STR(sa));
    2912           4 :                 return P2P_SC_FAIL_UNKNOWN_GROUP;
    2913             :         }
    2914             : 
    2915          40 :         if (s->mode == WPAS_MODE_P2P_GO && !wpas_p2p_create_iface(wpa_s)) {
    2916          16 :                 *go = 1;
    2917          16 :                 if (wpa_s->wpa_state >= WPA_AUTHENTICATING) {
    2918           0 :                         wpa_printf(MSG_DEBUG, "P2P: The only available "
    2919             :                                    "interface is already in use - reject "
    2920             :                                    "invitation");
    2921           0 :                         return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
    2922             :                 }
    2923          32 :                 if (wpa_s->p2p_mgmt)
    2924           1 :                         os_memcpy(group_bssid, wpa_s->parent->own_addr,
    2925             :                                   ETH_ALEN);
    2926             :                 else
    2927          15 :                         os_memcpy(group_bssid, wpa_s->own_addr, ETH_ALEN);
    2928          24 :         } else if (s->mode == WPAS_MODE_P2P_GO) {
    2929           4 :                 *go = 1;
    2930           4 :                 if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO) < 0)
    2931             :                 {
    2932           0 :                         wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
    2933             :                                    "interface address for the group");
    2934           0 :                         return P2P_SC_FAIL_UNABLE_TO_ACCOMMODATE;
    2935             :                 }
    2936           4 :                 os_memcpy(group_bssid, wpa_s->pending_interface_addr,
    2937             :                           ETH_ALEN);
    2938             :         }
    2939             : 
    2940             : accept_inv:
    2941          53 :         wpas_p2p_set_own_freq_preference(wpa_s, 0);
    2942             : 
    2943          53 :         best_freq = 0;
    2944          53 :         freqs = os_calloc(wpa_s->num_multichan_concurrent,
    2945             :                           sizeof(struct wpa_used_freq_data));
    2946          53 :         if (freqs) {
    2947          53 :                 int num_channels = wpa_s->num_multichan_concurrent;
    2948          53 :                 int num = wpas_p2p_valid_oper_freqs(wpa_s, freqs, num_channels);
    2949          53 :                 best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
    2950          53 :                 os_free(freqs);
    2951             :         }
    2952             : 
    2953             :         /* Get one of the frequencies currently in use */
    2954          53 :         if (best_freq > 0) {
    2955           6 :                 wpa_printf(MSG_DEBUG, "P2P: Trying to prefer a channel already used by one of the interfaces");
    2956           6 :                 wpas_p2p_set_own_freq_preference(wpa_s, best_freq);
    2957             : 
    2958           6 :                 if (wpa_s->num_multichan_concurrent < 2 ||
    2959           0 :                     wpas_p2p_num_unused_channels(wpa_s) < 1) {
    2960           6 :                         wpa_printf(MSG_DEBUG, "P2P: No extra channels available - trying to force channel to match a channel already used by one of the interfaces");
    2961           6 :                         *force_freq = best_freq;
    2962             :                 }
    2963             :         }
    2964             : 
    2965          53 :         if (*force_freq > 0 && wpa_s->num_multichan_concurrent > 1 &&
    2966           0 :             wpas_p2p_num_unused_channels(wpa_s) > 0) {
    2967           0 :                 if (*go == 0) {
    2968             :                         /* We are the client */
    2969           0 :                         wpa_printf(MSG_DEBUG, "P2P: Peer was found to be "
    2970             :                                    "running a GO but we are capable of MCC, "
    2971             :                                    "figure out the best channel to use");
    2972           0 :                         *force_freq = 0;
    2973           0 :                 } else if (!freq_included(wpa_s, channels, *force_freq)) {
    2974             :                         /* We are the GO, and *force_freq is not in the
    2975             :                          * intersection */
    2976           0 :                         wpa_printf(MSG_DEBUG, "P2P: Forced GO freq %d MHz not "
    2977             :                                    "in intersection but we are capable of MCC, "
    2978             :                                    "figure out the best channel to use",
    2979             :                                    *force_freq);
    2980           0 :                         *force_freq = 0;
    2981             :                 }
    2982             :         }
    2983             : 
    2984          53 :         return P2P_SC_SUCCESS;
    2985             : }
    2986             : 
    2987             : 
    2988          80 : static void wpas_invitation_received(void *ctx, const u8 *sa, const u8 *bssid,
    2989             :                                      const u8 *ssid, size_t ssid_len,
    2990             :                                      const u8 *go_dev_addr, u8 status,
    2991             :                                      int op_freq)
    2992             : {
    2993          80 :         struct wpa_supplicant *wpa_s = ctx;
    2994             :         struct wpa_ssid *s;
    2995             : 
    2996          81 :         for (s = wpa_s->conf->ssid; s; s = s->next) {
    2997         101 :                 if (s->disabled == 2 &&
    2998         100 :                     s->ssid_len == ssid_len &&
    2999          50 :                     os_memcmp(ssid, s->ssid, ssid_len) == 0)
    3000          50 :                         break;
    3001             :         }
    3002             : 
    3003          80 :         if (status == P2P_SC_SUCCESS) {
    3004         357 :                 wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
    3005             :                            " was accepted; op_freq=%d MHz, SSID=%s",
    3006         306 :                            MAC2STR(sa), op_freq, wpa_ssid_txt(ssid, ssid_len));
    3007          51 :                 if (s) {
    3008          44 :                         int go = s->mode == WPAS_MODE_P2P_GO;
    3009          44 :                         if (go) {
    3010         154 :                                 wpa_msg_global(wpa_s, MSG_INFO,
    3011             :                                                P2P_EVENT_INVITATION_ACCEPTED
    3012             :                                                "sa=" MACSTR
    3013             :                                                " persistent=%d freq=%d",
    3014         132 :                                                MAC2STR(sa), s->id, op_freq);
    3015             :                         } else {
    3016         154 :                                 wpa_msg_global(wpa_s, MSG_INFO,
    3017             :                                                P2P_EVENT_INVITATION_ACCEPTED
    3018             :                                                "sa=" MACSTR
    3019             :                                                " persistent=%d",
    3020         132 :                                                MAC2STR(sa), s->id);
    3021             :                         }
    3022          44 :                         wpas_p2p_group_add_persistent(
    3023             :                                 wpa_s, s, go, 0, op_freq, 0, 0, 0, 0, NULL,
    3024             :                                 go ? P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0,
    3025             :                                 1);
    3026           7 :                 } else if (bssid) {
    3027           7 :                         wpa_s->user_initiated_pd = 0;
    3028         126 :                         wpa_msg_global(wpa_s, MSG_INFO,
    3029             :                                        P2P_EVENT_INVITATION_ACCEPTED
    3030             :                                        "sa=" MACSTR " go_dev_addr=" MACSTR
    3031             :                                        " bssid=" MACSTR " unknown-network",
    3032          84 :                                        MAC2STR(sa), MAC2STR(go_dev_addr),
    3033          42 :                                        MAC2STR(bssid));
    3034           7 :                         wpas_p2p_join(wpa_s, bssid, go_dev_addr,
    3035           7 :                                       wpa_s->p2p_wps_method, 0, op_freq,
    3036             :                                       ssid, ssid_len);
    3037             :                 }
    3038          51 :                 return;
    3039             :         }
    3040             : 
    3041          29 :         if (status != P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
    3042          70 :                 wpa_printf(MSG_DEBUG, "P2P: Invitation from peer " MACSTR
    3043          60 :                            " was rejected (status %u)", MAC2STR(sa), status);
    3044          10 :                 return;
    3045             :         }
    3046             : 
    3047          19 :         if (!s) {
    3048          15 :                 if (bssid) {
    3049         252 :                         wpa_msg_global(wpa_s, MSG_INFO,
    3050             :                                        P2P_EVENT_INVITATION_RECEIVED
    3051             :                                        "sa=" MACSTR " go_dev_addr=" MACSTR
    3052             :                                        " bssid=" MACSTR " unknown-network",
    3053         168 :                                        MAC2STR(sa), MAC2STR(go_dev_addr),
    3054          84 :                                        MAC2STR(bssid));
    3055             :                 } else {
    3056          12 :                         wpa_msg_global(wpa_s, MSG_INFO,
    3057             :                                        P2P_EVENT_INVITATION_RECEIVED
    3058             :                                        "sa=" MACSTR " go_dev_addr=" MACSTR
    3059             :                                        " unknown-network",
    3060          12 :                                        MAC2STR(sa), MAC2STR(go_dev_addr));
    3061             :                 }
    3062          15 :                 wpas_notify_p2p_invitation_received(wpa_s, sa, go_dev_addr,
    3063             :                                                     bssid, 0, op_freq);
    3064          15 :                 return;
    3065             :         }
    3066             : 
    3067           4 :         if (s->mode == WPAS_MODE_P2P_GO && op_freq) {
    3068          14 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
    3069             :                                "sa=" MACSTR " persistent=%d freq=%d",
    3070          12 :                                MAC2STR(sa), s->id, op_freq);
    3071             :         } else {
    3072          14 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RECEIVED
    3073             :                                "sa=" MACSTR " persistent=%d",
    3074          12 :                                MAC2STR(sa), s->id);
    3075             :         }
    3076           4 :         wpas_notify_p2p_invitation_received(wpa_s, sa, go_dev_addr, bssid,
    3077             :                                             s->id, op_freq);
    3078             : }
    3079             : 
    3080             : 
    3081           8 : static void wpas_remove_persistent_peer(struct wpa_supplicant *wpa_s,
    3082             :                                         struct wpa_ssid *ssid,
    3083             :                                         const u8 *peer, int inv)
    3084             : {
    3085             :         size_t i;
    3086           8 :         struct wpa_supplicant *p2p_wpa_s = wpa_s->global->p2p_init_wpa_s;
    3087             : 
    3088           8 :         if (ssid == NULL)
    3089           0 :                 return;
    3090             : 
    3091           9 :         for (i = 0; ssid->p2p_client_list && i < ssid->num_p2p_clients; i++) {
    3092           7 :                 if (os_memcmp(ssid->p2p_client_list + i * 2 * ETH_ALEN, peer,
    3093             :                               ETH_ALEN) == 0)
    3094           6 :                         break;
    3095             :         }
    3096           8 :         if (i >= ssid->num_p2p_clients || !ssid->p2p_client_list) {
    3097           4 :                 if (ssid->mode != WPAS_MODE_P2P_GO &&
    3098           2 :                     os_memcmp(ssid->bssid, peer, ETH_ALEN) == 0) {
    3099           2 :                         wpa_printf(MSG_DEBUG, "P2P: Remove persistent group %d "
    3100             :                                    "due to invitation result", ssid->id);
    3101           2 :                         wpas_notify_network_removed(wpa_s, ssid);
    3102           2 :                         wpa_config_remove_network(wpa_s->conf, ssid->id);
    3103           2 :                         return;
    3104             :                 }
    3105           0 :                 return; /* Peer not found in client list */
    3106             :         }
    3107             : 
    3108          42 :         wpa_printf(MSG_DEBUG, "P2P: Remove peer " MACSTR " from persistent "
    3109             :                    "group %d client list%s",
    3110          36 :                    MAC2STR(peer), ssid->id,
    3111             :                    inv ? " due to invitation result" : "");
    3112           6 :         os_memmove(ssid->p2p_client_list + i * 2 * ETH_ALEN,
    3113             :                    ssid->p2p_client_list + (i + 1) * 2 * ETH_ALEN,
    3114             :                    (ssid->num_p2p_clients - i - 1) * 2 * ETH_ALEN);
    3115           6 :         ssid->num_p2p_clients--;
    3116           6 :         if (p2p_wpa_s->conf->update_config &&
    3117           0 :             wpa_config_write(p2p_wpa_s->confname, p2p_wpa_s->conf))
    3118           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    3119             : }
    3120             : 
    3121             : 
    3122           0 : static void wpas_remove_persistent_client(struct wpa_supplicant *wpa_s,
    3123             :                                           const u8 *peer)
    3124             : {
    3125             :         struct wpa_ssid *ssid;
    3126             : 
    3127           0 :         wpa_s = wpa_s->global->p2p_invite_group;
    3128           0 :         if (wpa_s == NULL)
    3129           0 :                 return; /* No known invitation group */
    3130           0 :         ssid = wpa_s->current_ssid;
    3131           0 :         if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GO ||
    3132           0 :             !ssid->p2p_persistent_group)
    3133           0 :                 return; /* Not operating as a GO in persistent group */
    3134           0 :         ssid = wpas_p2p_get_persistent(wpa_s->p2pdev, peer,
    3135           0 :                                        ssid->ssid, ssid->ssid_len);
    3136           0 :         wpas_remove_persistent_peer(wpa_s, ssid, peer, 1);
    3137             : }
    3138             : 
    3139             : 
    3140          64 : static void wpas_invitation_result(void *ctx, int status, const u8 *bssid,
    3141             :                                    const struct p2p_channels *channels,
    3142             :                                    const u8 *peer, int neg_freq,
    3143             :                                    int peer_oper_freq)
    3144             : {
    3145          64 :         struct wpa_supplicant *wpa_s = ctx;
    3146             :         struct wpa_ssid *ssid;
    3147             :         int freq;
    3148             : 
    3149          64 :         if (bssid) {
    3150         120 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
    3151             :                                "status=%d " MACSTR,
    3152         120 :                                status, MAC2STR(bssid));
    3153             :         } else {
    3154          44 :                 wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_INVITATION_RESULT
    3155             :                                "status=%d ", status);
    3156             :         }
    3157          64 :         wpas_notify_p2p_invitation_result(wpa_s, status, bssid);
    3158             : 
    3159         384 :         wpa_printf(MSG_DEBUG, "P2P: Invitation result - status=%d peer=" MACSTR,
    3160         384 :                    status, MAC2STR(peer));
    3161          64 :         if (wpa_s->pending_invite_ssid_id == -1) {
    3162          13 :                 struct wpa_supplicant *group_if =
    3163          13 :                         wpa_s->global->p2p_invite_group;
    3164             : 
    3165          13 :                 if (status == P2P_SC_FAIL_UNKNOWN_GROUP)
    3166           0 :                         wpas_remove_persistent_client(wpa_s, peer);
    3167             : 
    3168             :                 /*
    3169             :                  * Invitation to an active group. If this is successful and we
    3170             :                  * are the GO, set the client wait to postpone some concurrent
    3171             :                  * operations and to allow provisioning and connection to happen
    3172             :                  * more quickly.
    3173             :                  */
    3174          13 :                 if (status == P2P_SC_SUCCESS &&
    3175          14 :                     group_if && group_if->current_ssid &&
    3176           7 :                     group_if->current_ssid->mode == WPAS_MODE_P2P_GO) {
    3177           7 :                         os_get_reltime(&wpa_s->global->p2p_go_wait_client);
    3178             : #ifdef CONFIG_TESTING_OPTIONS
    3179           7 :                         if (group_if->p2p_go_csa_on_inv) {
    3180           1 :                                 wpa_printf(MSG_DEBUG,
    3181             :                                            "Testing: force P2P GO CSA after invitation");
    3182           1 :                                 eloop_cancel_timeout(
    3183             :                                         wpas_p2p_reconsider_moving_go,
    3184             :                                         wpa_s, NULL);
    3185           1 :                                 eloop_register_timeout(
    3186             :                                         0, 50000,
    3187             :                                         wpas_p2p_reconsider_moving_go,
    3188             :                                         wpa_s, NULL);
    3189             :                         }
    3190             : #endif /* CONFIG_TESTING_OPTIONS */
    3191             :                 }
    3192          13 :                 return;
    3193             :         }
    3194             : 
    3195          51 :         if (status == P2P_SC_FAIL_INFO_CURRENTLY_UNAVAILABLE) {
    3196           3 :                 wpa_printf(MSG_DEBUG, "P2P: Waiting for peer to start another "
    3197             :                            "invitation exchange to indicate readiness for "
    3198             :                            "re-invocation");
    3199             :         }
    3200             : 
    3201          51 :         if (status != P2P_SC_SUCCESS) {
    3202           9 :                 if (status == P2P_SC_FAIL_UNKNOWN_GROUP) {
    3203           4 :                         ssid = wpa_config_get_network(
    3204             :                                 wpa_s->conf, wpa_s->pending_invite_ssid_id);
    3205           4 :                         wpas_remove_persistent_peer(wpa_s, ssid, peer, 1);
    3206             :                 }
    3207           9 :                 wpas_p2p_remove_pending_group_interface(wpa_s);
    3208           9 :                 return;
    3209             :         }
    3210             : 
    3211          42 :         ssid = wpa_config_get_network(wpa_s->conf,
    3212             :                                       wpa_s->pending_invite_ssid_id);
    3213          42 :         if (ssid == NULL) {
    3214           0 :                 wpa_printf(MSG_ERROR, "P2P: Could not find persistent group "
    3215             :                            "data matching with invitation");
    3216           0 :                 return;
    3217             :         }
    3218             : 
    3219             :         /*
    3220             :          * The peer could have missed our ctrl::ack frame for Invitation
    3221             :          * Response and continue retransmitting the frame. To reduce the
    3222             :          * likelihood of the peer not getting successful TX status for the
    3223             :          * Invitation Response frame, wait a short time here before starting
    3224             :          * the persistent group so that we will remain on the current channel to
    3225             :          * acknowledge any possible retransmission from the peer.
    3226             :          */
    3227          42 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: 50 ms wait on current channel before "
    3228             :                 "starting persistent group");
    3229          42 :         os_sleep(0, 50000);
    3230             : 
    3231          64 :         if (neg_freq > 0 && ssid->mode == WPAS_MODE_P2P_GO &&
    3232          22 :             freq_included(wpa_s, channels, neg_freq))
    3233          22 :                 freq = neg_freq;
    3234          40 :         else if (peer_oper_freq > 0 && ssid->mode != WPAS_MODE_P2P_GO &&
    3235          20 :                  freq_included(wpa_s, channels, peer_oper_freq))
    3236          20 :                 freq = peer_oper_freq;
    3237             :         else
    3238           0 :                 freq = 0;
    3239             : 
    3240          84 :         wpa_printf(MSG_DEBUG, "P2P: Persistent group invitation success - op_freq=%d MHz SSID=%s",
    3241          42 :                    freq, wpa_ssid_txt(ssid->ssid, ssid->ssid_len));
    3242         252 :         wpas_p2p_group_add_persistent(wpa_s, ssid,
    3243          42 :                                       ssid->mode == WPAS_MODE_P2P_GO,
    3244             :                                       wpa_s->p2p_persistent_go_freq,
    3245             :                                       freq,
    3246          42 :                                       wpa_s->p2p_go_vht_center_freq2,
    3247          84 :                                       wpa_s->p2p_go_ht40, wpa_s->p2p_go_vht,
    3248          42 :                                       wpa_s->p2p_go_max_oper_chwidth,
    3249             :                                       channels,
    3250          42 :                                       ssid->mode == WPAS_MODE_P2P_GO ?
    3251             :                                       P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
    3252             :                                       0, 1);
    3253             : }
    3254             : 
    3255             : 
    3256     7016942 : static int wpas_p2p_disallowed_freq(struct wpa_global *global,
    3257             :                                     unsigned int freq)
    3258             : {
    3259     7016942 :         if (freq_range_list_includes(&global->p2p_go_avoid_freq, freq))
    3260         716 :                 return 1;
    3261     7016226 :         return freq_range_list_includes(&global->p2p_disallow_freq, freq);
    3262             : }
    3263             : 
    3264             : 
    3265        2014 : static void wpas_p2p_add_chan(struct p2p_reg_class *reg, u8 chan)
    3266             : {
    3267        2014 :         reg->channel[reg->channels] = chan;
    3268        2014 :         reg->channels++;
    3269        2014 : }
    3270             : 
    3271             : 
    3272         106 : static int wpas_p2p_default_channels(struct wpa_supplicant *wpa_s,
    3273             :                                      struct p2p_channels *chan,
    3274             :                                      struct p2p_channels *cli_chan)
    3275             : {
    3276         106 :         int i, cla = 0;
    3277             : 
    3278         106 :         wpa_s->global->p2p_24ghz_social_channels = 1;
    3279             : 
    3280         106 :         os_memset(cli_chan, 0, sizeof(*cli_chan));
    3281             : 
    3282         106 :         wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for 2.4 GHz "
    3283             :                    "band");
    3284             : 
    3285             :         /* Operating class 81 - 2.4 GHz band channels 1..13 */
    3286         106 :         chan->reg_class[cla].reg_class = 81;
    3287         106 :         chan->reg_class[cla].channels = 0;
    3288        1272 :         for (i = 0; i < 11; i++) {
    3289        1166 :                 if (!wpas_p2p_disallowed_freq(wpa_s->global, 2412 + i * 5))
    3290        1166 :                         wpas_p2p_add_chan(&chan->reg_class[cla], i + 1);
    3291             :         }
    3292         106 :         if (chan->reg_class[cla].channels)
    3293         106 :                 cla++;
    3294             : 
    3295         106 :         wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for lower 5 GHz "
    3296             :                    "band");
    3297             : 
    3298             :         /* Operating class 115 - 5 GHz, channels 36-48 */
    3299         106 :         chan->reg_class[cla].reg_class = 115;
    3300         106 :         chan->reg_class[cla].channels = 0;
    3301         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 36 * 5))
    3302         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 36);
    3303         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 40 * 5))
    3304         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 40);
    3305         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 44 * 5))
    3306         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 44);
    3307         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 48 * 5))
    3308         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 48);
    3309         106 :         if (chan->reg_class[cla].channels)
    3310         106 :                 cla++;
    3311             : 
    3312         106 :         wpa_printf(MSG_DEBUG, "P2P: Enable operating classes for higher 5 GHz "
    3313             :                    "band");
    3314             : 
    3315             :         /* Operating class 124 - 5 GHz, channels 149,153,157,161 */
    3316         106 :         chan->reg_class[cla].reg_class = 124;
    3317         106 :         chan->reg_class[cla].channels = 0;
    3318         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 149 * 5))
    3319         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 149);
    3320         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 153 * 5))
    3321         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 153);
    3322         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 156 * 5))
    3323         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 157);
    3324         106 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, 5000 + 161 * 5))
    3325         106 :                 wpas_p2p_add_chan(&chan->reg_class[cla], 161);
    3326         106 :         if (chan->reg_class[cla].channels)
    3327         106 :                 cla++;
    3328             : 
    3329         106 :         chan->reg_classes = cla;
    3330         106 :         return 0;
    3331             : }
    3332             : 
    3333             : 
    3334             : enum chan_allowed {
    3335             :         NOT_ALLOWED, NO_IR, ALLOWED
    3336             : };
    3337             : 
    3338     7014599 : static int has_channel(struct wpa_global *global,
    3339             :                        struct hostapd_hw_modes *mode, u8 chan, int *flags)
    3340             : {
    3341             :         int i;
    3342             :         unsigned int freq;
    3343             : 
    3344    14029198 :         freq = (mode->mode == HOSTAPD_MODE_IEEE80211A ? 5000 : 2407) +
    3345     7014599 :                 chan * 5;
    3346     7014599 :         if (wpas_p2p_disallowed_freq(global, freq))
    3347        6602 :                 return NOT_ALLOWED;
    3348             : 
    3349    97494226 :         for (i = 0; i < mode->num_channels; i++) {
    3350    95912470 :                 if (mode->channels[i].chan == chan) {
    3351     5426241 :                         if (flags)
    3352     5034127 :                                 *flags = mode->channels[i].flag;
    3353     5426241 :                         if (mode->channels[i].flag &
    3354             :                             (HOSTAPD_CHAN_DISABLED |
    3355             :                              HOSTAPD_CHAN_RADAR))
    3356     1551572 :                                 return NOT_ALLOWED;
    3357     3874669 :                         if (mode->channels[i].flag & HOSTAPD_CHAN_NO_IR)
    3358     3048705 :                                 return NO_IR;
    3359      825964 :                         return ALLOWED;
    3360             :                 }
    3361             :         }
    3362             : 
    3363     1581756 :         return NOT_ALLOWED;
    3364             : }
    3365             : 
    3366             : 
    3367     1583474 : static int wpas_p2p_get_center_80mhz(struct wpa_supplicant *wpa_s,
    3368             :                                      struct hostapd_hw_modes *mode,
    3369             :                                      u8 channel)
    3370             : {
    3371     1583474 :         u8 center_channels[] = { 42, 58, 106, 122, 138, 155 };
    3372             :         size_t i;
    3373             : 
    3374     1583474 :         if (mode->mode != HOSTAPD_MODE_IEEE80211A)
    3375           0 :                 return 0;
    3376             : 
    3377     6977131 :         for (i = 0; i < ARRAY_SIZE(center_channels); i++)
    3378             :                 /*
    3379             :                  * In 80 MHz, the bandwidth "spans" 12 channels (e.g., 36-48),
    3380             :                  * so the center channel is 6 channels away from the start/end.
    3381             :                  */
    3382    11430629 :                 if (channel >= center_channels[i] - 6 &&
    3383     4898845 :                     channel <= center_channels[i] + 6)
    3384     1138127 :                         return center_channels[i];
    3385             : 
    3386      445347 :         return 0;
    3387             : }
    3388             : 
    3389             : 
    3390     1583465 : static enum chan_allowed wpas_p2p_verify_80mhz(struct wpa_supplicant *wpa_s,
    3391             :                                                struct hostapd_hw_modes *mode,
    3392             :                                                u8 channel, u8 bw)
    3393             : {
    3394             :         u8 center_chan;
    3395             :         int i, flags;
    3396     1583465 :         enum chan_allowed res, ret = ALLOWED;
    3397             : 
    3398     1583465 :         center_chan = wpas_p2p_get_center_80mhz(wpa_s, mode, channel);
    3399     1583465 :         if (!center_chan)
    3400      445347 :                 return NOT_ALLOWED;
    3401     1138118 :         if (center_chan >= 58 && center_chan <= 138)
    3402      791728 :                 return NOT_ALLOWED; /* Do not allow DFS channels for P2P */
    3403             : 
    3404             :         /* check all the channels are available */
    3405     1720266 :         for (i = 0; i < 4; i++) {
    3406     1376797 :                 int adj_chan = center_chan - 6 + i * 4;
    3407             : 
    3408     1376797 :                 res = has_channel(wpa_s->global, mode, adj_chan, &flags);
    3409     1376797 :                 if (res == NOT_ALLOWED)
    3410        2921 :                         return NOT_ALLOWED;
    3411     1373876 :                 if (res == NO_IR)
    3412     1255352 :                         ret = NO_IR;
    3413             : 
    3414     1373876 :                 if (i == 0 && !(flags & HOSTAPD_CHAN_VHT_10_70))
    3415           0 :                         return NOT_ALLOWED;
    3416     1373876 :                 if (i == 1 && !(flags & HOSTAPD_CHAN_VHT_30_50))
    3417           0 :                         return NOT_ALLOWED;
    3418     1373876 :                 if (i == 2 && !(flags & HOSTAPD_CHAN_VHT_50_30))
    3419           0 :                         return NOT_ALLOWED;
    3420     1373876 :                 if (i == 3 && !(flags & HOSTAPD_CHAN_VHT_70_10))
    3421           0 :                         return NOT_ALLOWED;
    3422             :         }
    3423             : 
    3424      343469 :         return ret;
    3425             : }
    3426             : 
    3427             : 
    3428      247416 : static int wpas_p2p_get_center_160mhz(struct wpa_supplicant *wpa_s,
    3429             :                                      struct hostapd_hw_modes *mode,
    3430             :                                      u8 channel)
    3431             : {
    3432      247416 :         u8 center_channels[] = { 50, 114 };
    3433             :         unsigned int i;
    3434             : 
    3435      247416 :         if (mode->mode != HOSTAPD_MODE_IEEE80211A)
    3436           0 :                 return 0;
    3437             : 
    3438      593797 :         for (i = 0; i < ARRAY_SIZE(center_channels); i++)
    3439             :                 /*
    3440             :                  * In 160 MHz, the bandwidth "spans" 28 channels (e.g., 36-64),
    3441             :                  * so the center channel is 14 channels away from the start/end.
    3442             :                  */
    3443      742247 :                 if (channel >= center_channels[i] - 14 &&
    3444      296899 :                     channel <= center_channels[i] + 14)
    3445       98967 :                         return center_channels[i];
    3446             : 
    3447      148449 :         return 0;
    3448             : }
    3449             : 
    3450             : 
    3451      247416 : static enum chan_allowed wpas_p2p_verify_160mhz(struct wpa_supplicant *wpa_s,
    3452             :                                                struct hostapd_hw_modes *mode,
    3453             :                                                u8 channel, u8 bw)
    3454             : {
    3455             :         u8 center_chan;
    3456             :         int i, flags;
    3457      247416 :         enum chan_allowed res, ret = ALLOWED;
    3458             : 
    3459      247416 :         center_chan = wpas_p2p_get_center_160mhz(wpa_s, mode, channel);
    3460      247416 :         if (!center_chan)
    3461      148449 :                 return NOT_ALLOWED;
    3462             :         /* VHT 160 MHz uses DFS channels in most countries. */
    3463             : 
    3464             :         /* Check all the channels are available */
    3465       99503 :         for (i = 0; i < 8; i++) {
    3466       99436 :                 int adj_chan = center_chan - 14 + i * 4;
    3467             : 
    3468       99436 :                 res = has_channel(wpa_s->global, mode, adj_chan, &flags);
    3469       99436 :                 if (res == NOT_ALLOWED)
    3470       49505 :                         return NOT_ALLOWED;
    3471             : 
    3472       49931 :                 if (res == NO_IR)
    3473       44807 :                         ret = NO_IR;
    3474             : 
    3475       49931 :                 if (i == 0 && !(flags & HOSTAPD_CHAN_VHT_10_150))
    3476       49395 :                         return NOT_ALLOWED;
    3477         536 :                 if (i == 1 && !(flags & HOSTAPD_CHAN_VHT_30_130))
    3478           0 :                         return NOT_ALLOWED;
    3479         536 :                 if (i == 2 && !(flags & HOSTAPD_CHAN_VHT_50_110))
    3480           0 :                         return NOT_ALLOWED;
    3481         536 :                 if (i == 3 && !(flags & HOSTAPD_CHAN_VHT_70_90))
    3482           0 :                         return NOT_ALLOWED;
    3483         536 :                 if (i == 4 && !(flags & HOSTAPD_CHAN_VHT_90_70))
    3484           0 :                         return NOT_ALLOWED;
    3485         536 :                 if (i == 5 && !(flags & HOSTAPD_CHAN_VHT_110_50))
    3486           0 :                         return NOT_ALLOWED;
    3487         536 :                 if (i == 6 && !(flags & HOSTAPD_CHAN_VHT_130_30))
    3488           0 :                         return NOT_ALLOWED;
    3489         536 :                 if (i == 7 && !(flags & HOSTAPD_CHAN_VHT_150_10))
    3490           0 :                         return NOT_ALLOWED;
    3491             :         }
    3492             : 
    3493          67 :         return ret;
    3494             : }
    3495             : 
    3496             : 
    3497     5146252 : static enum chan_allowed wpas_p2p_verify_channel(struct wpa_supplicant *wpa_s,
    3498             :                                                  struct hostapd_hw_modes *mode,
    3499             :                                                  u8 channel, u8 bw)
    3500             : {
    3501     5146252 :         int flag = 0;
    3502             :         enum chan_allowed res, res2;
    3503             : 
    3504     5146252 :         res2 = res = has_channel(wpa_s->global, mode, channel, &flag);
    3505     5146252 :         if (bw == BW40MINUS) {
    3506      197932 :                 if (!(flag & HOSTAPD_CHAN_HT40MINUS))
    3507        1880 :                         return NOT_ALLOWED;
    3508      196052 :                 res2 = has_channel(wpa_s->global, mode, channel - 4, NULL);
    3509     4948320 :         } else if (bw == BW40PLUS) {
    3510      197942 :                 if (!(flag & HOSTAPD_CHAN_HT40PLUS))
    3511        1880 :                         return NOT_ALLOWED;
    3512      196062 :                 res2 = has_channel(wpa_s->global, mode, channel + 4, NULL);
    3513     4750378 :         } else if (bw == BW80) {
    3514     1583465 :                 res2 = wpas_p2p_verify_80mhz(wpa_s, mode, channel, bw);
    3515     3166913 :         } else if (bw == BW160) {
    3516      247416 :                 res2 = wpas_p2p_verify_160mhz(wpa_s, mode, channel, bw);
    3517             :         }
    3518             : 
    3519     5142492 :         if (res == NOT_ALLOWED || res2 == NOT_ALLOWED)
    3520     3084466 :                 return NOT_ALLOWED;
    3521     2058026 :         if (res == NO_IR || res2 == NO_IR)
    3522     1389934 :                 return NO_IR;
    3523      668092 :         return res;
    3524             : }
    3525             : 
    3526             : 
    3527       49589 : static int wpas_p2p_setup_channels(struct wpa_supplicant *wpa_s,
    3528             :                                    struct p2p_channels *chan,
    3529             :                                    struct p2p_channels *cli_chan)
    3530             : {
    3531             :         struct hostapd_hw_modes *mode;
    3532             :         int cla, op, cli_cla;
    3533             : 
    3534       49589 :         if (wpa_s->hw.modes == NULL) {
    3535         106 :                 wpa_printf(MSG_DEBUG, "P2P: Driver did not support fetching "
    3536             :                            "of all supported channels; assume dualband "
    3537             :                            "support");
    3538         106 :                 return wpas_p2p_default_channels(wpa_s, chan, cli_chan);
    3539             :         }
    3540             : 
    3541       49483 :         cla = cli_cla = 0;
    3542             : 
    3543     1088626 :         for (op = 0; global_op_class[op].op_class; op++) {
    3544     1039143 :                 const struct oper_class_map *o = &global_op_class[op];
    3545             :                 u8 ch;
    3546     1039143 :                 struct p2p_reg_class *reg = NULL, *cli_reg = NULL;
    3547             : 
    3548     1039143 :                 if (o->p2p == NO_P2P_SUPP)
    3549      445347 :                         continue;
    3550             : 
    3551      593796 :                 mode = get_mode(wpa_s->hw.modes, wpa_s->hw.num_modes, o->mode);
    3552      593796 :                 if (mode == NULL)
    3553       49483 :                         continue;
    3554      544313 :                 if (mode->mode == HOSTAPD_MODE_IEEE80211G)
    3555       49483 :                         wpa_s->global->p2p_24ghz_social_channels = 1;
    3556     5690545 :                 for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
    3557             :                         enum chan_allowed res;
    3558     5146232 :                         res = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
    3559     5146232 :                         if (res == ALLOWED) {
    3560      668073 :                                 if (reg == NULL) {
    3561       87453 :                                         wpa_printf(MSG_DEBUG, "P2P: Add operating class %u",
    3562       87453 :                                                    o->op_class);
    3563       87453 :                                         reg = &chan->reg_class[cla];
    3564       87453 :                                         cla++;
    3565       87453 :                                         reg->reg_class = o->op_class;
    3566             :                                 }
    3567      668073 :                                 reg->channel[reg->channels] = ch;
    3568      668073 :                                 reg->channels++;
    3569     5868093 :                         } else if (res == NO_IR &&
    3570     1389934 :                                    wpa_s->conf->p2p_add_cli_chan) {
    3571        3410 :                                 if (cli_reg == NULL) {
    3572        1100 :                                         wpa_printf(MSG_DEBUG, "P2P: Add operating class %u (client only)",
    3573        1100 :                                                    o->op_class);
    3574        1100 :                                         cli_reg = &cli_chan->reg_class[cli_cla];
    3575        1100 :                                         cli_cla++;
    3576        1100 :                                         cli_reg->reg_class = o->op_class;
    3577             :                                 }
    3578        3410 :                                 cli_reg->channel[cli_reg->channels] = ch;
    3579        3410 :                                 cli_reg->channels++;
    3580             :                         }
    3581             :                 }
    3582      544313 :                 if (reg) {
    3583      174906 :                         wpa_hexdump(MSG_DEBUG, "P2P: Channels",
    3584       87453 :                                     reg->channel, reg->channels);
    3585             :                 }
    3586      544313 :                 if (cli_reg) {
    3587        2200 :                         wpa_hexdump(MSG_DEBUG, "P2P: Channels (client only)",
    3588        1100 :                                     cli_reg->channel, cli_reg->channels);
    3589             :                 }
    3590             :         }
    3591             : 
    3592       49483 :         chan->reg_classes = cla;
    3593       49483 :         cli_chan->reg_classes = cli_cla;
    3594             : 
    3595       49483 :         return 0;
    3596             : }
    3597             : 
    3598             : 
    3599          12 : int wpas_p2p_get_ht40_mode(struct wpa_supplicant *wpa_s,
    3600             :                            struct hostapd_hw_modes *mode, u8 channel)
    3601             : {
    3602             :         int op;
    3603             :         enum chan_allowed ret;
    3604             : 
    3605         124 :         for (op = 0; global_op_class[op].op_class; op++) {
    3606         122 :                 const struct oper_class_map *o = &global_op_class[op];
    3607             :                 u8 ch;
    3608             : 
    3609         122 :                 if (o->p2p == NO_P2P_SUPP)
    3610          60 :                         continue;
    3611             : 
    3612         476 :                 for (ch = o->min_chan; ch <= o->max_chan; ch += o->inc) {
    3613         684 :                         if (o->mode != HOSTAPD_MODE_IEEE80211A ||
    3614         498 :                             (o->bw != BW40PLUS && o->bw != BW40MINUS) ||
    3615             :                             ch != channel)
    3616         414 :                                 continue;
    3617          10 :                         ret = wpas_p2p_verify_channel(wpa_s, mode, ch, o->bw);
    3618          10 :                         if (ret == ALLOWED)
    3619          10 :                                 return (o->bw == BW40MINUS) ? -1 : 1;
    3620             :                 }
    3621             :         }
    3622           2 :         return 0;
    3623             : }
    3624             : 
    3625             : 
    3626           9 : int wpas_p2p_get_vht80_center(struct wpa_supplicant *wpa_s,
    3627             :                               struct hostapd_hw_modes *mode, u8 channel)
    3628             : {
    3629           9 :         if (!wpas_p2p_verify_channel(wpa_s, mode, channel, BW80))
    3630           0 :                 return 0;
    3631             : 
    3632           9 :         return wpas_p2p_get_center_80mhz(wpa_s, mode, channel);
    3633             : }
    3634             : 
    3635             : 
    3636           1 : int wpas_p2p_get_vht160_center(struct wpa_supplicant *wpa_s,
    3637             :                                struct hostapd_hw_modes *mode, u8 channel)
    3638             : {
    3639           1 :         if (!wpas_p2p_verify_channel(wpa_s, mode, channel, BW160))
    3640           1 :                 return 0;
    3641           0 :         return wpas_p2p_get_center_160mhz(wpa_s, mode, channel);
    3642             : }
    3643             : 
    3644             : 
    3645          10 : static int wpas_get_noa(void *ctx, const u8 *interface_addr, u8 *buf,
    3646             :                         size_t buf_len)
    3647             : {
    3648          10 :         struct wpa_supplicant *wpa_s = ctx;
    3649             : 
    3650          10 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    3651          10 :                 if (os_memcmp(wpa_s->own_addr, interface_addr, ETH_ALEN) == 0)
    3652          10 :                         break;
    3653             :         }
    3654          10 :         if (wpa_s == NULL)
    3655           0 :                 return -1;
    3656             : 
    3657          10 :         return wpa_drv_get_noa(wpa_s, buf, buf_len);
    3658             : }
    3659             : 
    3660             : 
    3661         600 : struct wpa_supplicant * wpas_get_p2p_go_iface(struct wpa_supplicant *wpa_s,
    3662             :                                               const u8 *ssid, size_t ssid_len)
    3663             : {
    3664         600 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    3665         600 :                 struct wpa_ssid *s = wpa_s->current_ssid;
    3666         600 :                 if (s == NULL)
    3667           0 :                         continue;
    3668         600 :                 if (s->mode != WPAS_MODE_P2P_GO &&
    3669           0 :                     s->mode != WPAS_MODE_AP &&
    3670           0 :                     s->mode != WPAS_MODE_P2P_GROUP_FORMATION)
    3671           0 :                         continue;
    3672        1200 :                 if (s->ssid_len != ssid_len ||
    3673         600 :                     os_memcmp(ssid, s->ssid, ssid_len) != 0)
    3674           0 :                         continue;
    3675         600 :                 return wpa_s;
    3676             :         }
    3677             : 
    3678           0 :         return NULL;
    3679             : 
    3680             : }
    3681             : 
    3682             : 
    3683        1647 : struct wpa_supplicant * wpas_get_p2p_client_iface(struct wpa_supplicant *wpa_s,
    3684             :                                                   const u8 *peer_dev_addr)
    3685             : {
    3686        3139 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    3687        1733 :                 struct wpa_ssid *ssid = wpa_s->current_ssid;
    3688        1733 :                 if (ssid && (ssid->mode != WPAS_MODE_INFRA || !ssid->p2p_group))
    3689         821 :                         continue;
    3690         912 :                 if (os_memcmp(wpa_s->go_dev_addr, peer_dev_addr, ETH_ALEN) == 0)
    3691         241 :                         return wpa_s;
    3692             :         }
    3693             : 
    3694        1406 :         return NULL;
    3695             : }
    3696             : 
    3697             : 
    3698           2 : static int wpas_go_connected(void *ctx, const u8 *dev_addr)
    3699             : {
    3700           2 :         struct wpa_supplicant *wpa_s = ctx;
    3701             : 
    3702           2 :         return wpas_get_p2p_client_iface(wpa_s, dev_addr) != NULL;
    3703             : }
    3704             : 
    3705             : 
    3706         406 : static int wpas_is_concurrent_session_active(void *ctx)
    3707             : {
    3708         406 :         struct wpa_supplicant *wpa_s = ctx;
    3709             :         struct wpa_supplicant *ifs;
    3710             : 
    3711         812 :         for (ifs = wpa_s->global->ifaces; ifs; ifs = ifs->next) {
    3712         406 :                 if (ifs == wpa_s)
    3713         406 :                         continue;
    3714           0 :                 if (ifs->wpa_state > WPA_ASSOCIATED)
    3715           0 :                         return 1;
    3716             :         }
    3717         406 :         return 0;
    3718             : }
    3719             : 
    3720             : 
    3721      331101 : static void wpas_p2p_debug_print(void *ctx, int level, const char *msg)
    3722             : {
    3723      331101 :         struct wpa_supplicant *wpa_s = ctx;
    3724      331101 :         wpa_msg_global(wpa_s, level, "P2P: %s", msg);
    3725      331101 : }
    3726             : 
    3727             : 
    3728          27 : int wpas_p2p_add_p2pdev_interface(struct wpa_supplicant *wpa_s,
    3729             :                                   const char *conf_p2p_dev)
    3730             : {
    3731             :         struct wpa_interface iface;
    3732             :         struct wpa_supplicant *p2pdev_wpa_s;
    3733             :         char ifname[100];
    3734             :         char force_name[100];
    3735             :         int ret;
    3736             : 
    3737          27 :         ret = os_snprintf(ifname, sizeof(ifname), P2P_MGMT_DEVICE_PREFIX "%s",
    3738          27 :                           wpa_s->ifname);
    3739          27 :         if (os_snprintf_error(sizeof(ifname), ret))
    3740           0 :                 return -1;
    3741          27 :         force_name[0] = '\0';
    3742          27 :         wpa_s->pending_interface_type = WPA_IF_P2P_DEVICE;
    3743          27 :         ret = wpa_drv_if_add(wpa_s, WPA_IF_P2P_DEVICE, ifname, NULL, NULL,
    3744          27 :                              force_name, wpa_s->pending_interface_addr, NULL);
    3745          27 :         if (ret < 0) {
    3746           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to create P2P Device interface");
    3747           0 :                 return ret;
    3748             :         }
    3749          27 :         os_strlcpy(wpa_s->pending_interface_name, ifname,
    3750             :                    sizeof(wpa_s->pending_interface_name));
    3751             : 
    3752          27 :         os_memset(&iface, 0, sizeof(iface));
    3753          27 :         iface.p2p_mgmt = 1;
    3754          27 :         iface.ifname = wpa_s->pending_interface_name;
    3755          27 :         iface.driver = wpa_s->driver->name;
    3756          27 :         iface.driver_param = wpa_s->conf->driver_param;
    3757             : 
    3758             :         /*
    3759             :          * If a P2P Device configuration file was given, use it as the interface
    3760             :          * configuration file (instead of using parent's configuration file.
    3761             :          */
    3762          27 :         if (conf_p2p_dev) {
    3763           0 :                 iface.confname = conf_p2p_dev;
    3764           0 :                 iface.ctrl_interface = NULL;
    3765             :         } else {
    3766          27 :                 iface.confname = wpa_s->confname;
    3767          27 :                 iface.ctrl_interface = wpa_s->conf->ctrl_interface;
    3768             :         }
    3769             : 
    3770          27 :         p2pdev_wpa_s = wpa_supplicant_add_iface(wpa_s->global, &iface, wpa_s);
    3771          27 :         if (!p2pdev_wpa_s) {
    3772           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to add P2P Device interface");
    3773           0 :                 return -1;
    3774             :         }
    3775             : 
    3776          27 :         p2pdev_wpa_s->p2pdev = p2pdev_wpa_s;
    3777          27 :         wpa_s->pending_interface_name[0] = '\0';
    3778          27 :         return 0;
    3779             : }
    3780             : 
    3781             : 
    3782           5 : static void wpas_presence_resp(void *ctx, const u8 *src, u8 status,
    3783             :                                const u8 *noa, size_t noa_len)
    3784             : {
    3785           5 :         struct wpa_supplicant *wpa_s, *intf = ctx;
    3786             :         char hex[100];
    3787             : 
    3788           5 :         for (wpa_s = intf->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    3789           5 :                 if (wpa_s->waiting_presence_resp)
    3790           5 :                         break;
    3791             :         }
    3792           5 :         if (!wpa_s) {
    3793           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No group interface was waiting for presence response");
    3794           5 :                 return;
    3795             :         }
    3796           5 :         wpa_s->waiting_presence_resp = 0;
    3797             : 
    3798           5 :         wpa_snprintf_hex(hex, sizeof(hex), noa, noa_len);
    3799          35 :         wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_PRESENCE_RESPONSE "src=" MACSTR
    3800          30 :                 " status=%u noa=%s", MAC2STR(src), status, hex);
    3801             : }
    3802             : 
    3803             : 
    3804          71 : static int wpas_get_persistent_group(void *ctx, const u8 *addr, const u8 *ssid,
    3805             :                                      size_t ssid_len, u8 *go_dev_addr,
    3806             :                                      u8 *ret_ssid, size_t *ret_ssid_len,
    3807             :                                      u8 *intended_iface_addr)
    3808             : {
    3809          71 :         struct wpa_supplicant *wpa_s = ctx;
    3810             :         struct wpa_ssid *s;
    3811             : 
    3812          71 :         s = wpas_p2p_get_persistent(wpa_s, addr, ssid, ssid_len);
    3813          71 :         if (s) {
    3814           4 :                 os_memcpy(ret_ssid, s->ssid, s->ssid_len);
    3815           4 :                 *ret_ssid_len = s->ssid_len;
    3816           4 :                 os_memcpy(go_dev_addr, s->bssid, ETH_ALEN);
    3817             : 
    3818           4 :                 if (s->mode != WPAS_MODE_P2P_GO) {
    3819           2 :                         os_memset(intended_iface_addr, 0, ETH_ALEN);
    3820           2 :                 } else if (wpas_p2p_create_iface(wpa_s)) {
    3821           0 :                         if (wpas_p2p_add_group_interface(wpa_s, WPA_IF_P2P_GO))
    3822           0 :                                 return 0;
    3823             : 
    3824           0 :                         os_memcpy(intended_iface_addr,
    3825             :                                   wpa_s->pending_interface_addr, ETH_ALEN);
    3826             :                 } else {
    3827           2 :                         os_memcpy(intended_iface_addr, wpa_s->own_addr,
    3828             :                                   ETH_ALEN);
    3829             :                 }
    3830           4 :                 return 1;
    3831             :         }
    3832             : 
    3833          67 :         return 0;
    3834             : }
    3835             : 
    3836             : 
    3837          75 : static int wpas_get_go_info(void *ctx, u8 *intended_addr,
    3838             :                             u8 *ssid, size_t *ssid_len, int *group_iface,
    3839             :                             unsigned int *freq)
    3840             : {
    3841          75 :         struct wpa_supplicant *wpa_s = ctx;
    3842             :         struct wpa_supplicant *go;
    3843             :         struct wpa_ssid *s;
    3844             : 
    3845             :         /*
    3846             :          * group_iface will be set to 1 only if a dedicated interface for P2P
    3847             :          * role is required. First, we try to reuse an active GO. However,
    3848             :          * if it is not present, we will try to reactivate an existing
    3849             :          * persistent group and set group_iface to 1, so the caller will know
    3850             :          * that the pending interface should be used.
    3851             :          */
    3852          75 :         *group_iface = 0;
    3853             : 
    3854          75 :         if (freq)
    3855          75 :                 *freq = 0;
    3856             : 
    3857          75 :         go = wpas_p2p_get_go_group(wpa_s);
    3858          75 :         if (!go) {
    3859          70 :                 s = wpas_p2p_get_persistent_go(wpa_s);
    3860          70 :                 *group_iface = wpas_p2p_create_iface(wpa_s);
    3861          70 :                 if (s)
    3862           0 :                         os_memcpy(intended_addr, s->bssid, ETH_ALEN);
    3863             :                 else
    3864          70 :                         return 0;
    3865             :         } else {
    3866           5 :                 s = go->current_ssid;
    3867           5 :                 os_memcpy(intended_addr, go->own_addr, ETH_ALEN);
    3868           5 :                 if (freq)
    3869           5 :                         *freq = go->assoc_freq;
    3870             :         }
    3871             : 
    3872           5 :         os_memcpy(ssid, s->ssid, s->ssid_len);
    3873           5 :         *ssid_len = s->ssid_len;
    3874             : 
    3875           5 :         return 1;
    3876             : }
    3877             : 
    3878             : 
    3879         152 : static int wpas_remove_stale_groups(void *ctx, const u8 *peer, const u8 *go,
    3880             :                                     const u8 *ssid, size_t ssid_len)
    3881             : {
    3882         152 :         struct wpa_supplicant *wpa_s = ctx;
    3883             :         struct wpa_ssid *s;
    3884         152 :         int save_config = 0;
    3885             :         size_t i;
    3886             : 
    3887             :         /* Start with our first choice of Persistent Groups */
    3888         304 :         while ((s = wpas_p2p_get_persistent(wpa_s, peer, NULL, 0))) {
    3889           4 :                 if (go && ssid && ssid_len &&
    3890           4 :                     s->ssid_len == ssid_len &&
    3891           4 :                     os_memcmp(go, s->bssid, ETH_ALEN) == 0 &&
    3892           2 :                     os_memcmp(ssid, s->ssid, ssid_len) == 0)
    3893           2 :                         break;
    3894             : 
    3895             :                 /* Remove stale persistent group */
    3896           0 :                 if (s->mode != WPAS_MODE_P2P_GO || s->num_p2p_clients <= 1) {
    3897           0 :                         wpa_config_remove_network(wpa_s->conf, s->id);
    3898           0 :                         save_config = 1;
    3899           0 :                         continue;
    3900             :                 }
    3901             : 
    3902           0 :                 for (i = 0; i < s->num_p2p_clients; i++) {
    3903           0 :                         if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN,
    3904             :                                       peer, ETH_ALEN) != 0)
    3905           0 :                                 continue;
    3906             : 
    3907           0 :                         os_memmove(s->p2p_client_list + i * 2 * ETH_ALEN,
    3908             :                                    s->p2p_client_list + (i + 1) * 2 * ETH_ALEN,
    3909             :                                    (s->num_p2p_clients - i - 1) * 2 * ETH_ALEN);
    3910           0 :                         break;
    3911             :                 }
    3912           0 :                 s->num_p2p_clients--;
    3913           0 :                 save_config = 1;
    3914             :         }
    3915             : 
    3916         152 :         if (save_config)
    3917           0 :                 p2p_config_write(wpa_s);
    3918             : 
    3919             :         /* Return TRUE if valid SSID remains */
    3920         152 :         return s != NULL;
    3921             : }
    3922             : 
    3923             : 
    3924          92 : static void wpas_p2ps_get_feat_cap_str(char *buf, size_t buf_len,
    3925             :                                        const u8 *feat_cap, size_t feat_cap_len)
    3926             : {
    3927             :         static const char pref[] = " feature_cap=";
    3928             :         int ret;
    3929             : 
    3930          92 :         buf[0] = '\0';
    3931             : 
    3932             :         /*
    3933             :          * We expect a feature capability to contain at least one byte to be
    3934             :          * reported. The string buffer provided by the caller function is
    3935             :          * expected to be big enough to contain all bytes of the attribute for
    3936             :          * known specifications. This function truncates the reported bytes if
    3937             :          * the feature capability data exceeds the string buffer size.
    3938             :          */
    3939          92 :         if (!feat_cap || !feat_cap_len || buf_len < sizeof(pref) + 2)
    3940          94 :                 return;
    3941             : 
    3942          90 :         os_memcpy(buf, pref, sizeof(pref));
    3943          90 :         ret = wpa_snprintf_hex(&buf[sizeof(pref) - 1],
    3944             :                                buf_len - sizeof(pref) + 1,
    3945             :                                feat_cap, feat_cap_len);
    3946             : 
    3947          90 :         if (ret != (2 * (int) feat_cap_len))
    3948           0 :                 wpa_printf(MSG_WARNING, "P2PS feature_cap bytes truncated");
    3949             : }
    3950             : 
    3951             : 
    3952          92 : static void wpas_p2ps_prov_complete(void *ctx, u8 status, const u8 *dev,
    3953             :                                     const u8 *adv_mac, const u8 *ses_mac,
    3954             :                                     const u8 *grp_mac, u32 adv_id, u32 ses_id,
    3955             :                                     u8 conncap, int passwd_id,
    3956             :                                     const u8 *persist_ssid,
    3957             :                                     size_t persist_ssid_size, int response_done,
    3958             :                                     int prov_start, const char *session_info,
    3959             :                                     const u8 *feat_cap, size_t feat_cap_len,
    3960             :                                     unsigned int freq,
    3961             :                                     const u8 *group_ssid, size_t group_ssid_len)
    3962             : {
    3963          92 :         struct wpa_supplicant *wpa_s = ctx;
    3964             :         u8 mac[ETH_ALEN];
    3965          92 :         struct wpa_ssid *persistent_go, *stale, *s = NULL;
    3966          92 :         int save_config = 0;
    3967             :         struct wpa_supplicant *go_wpa_s;
    3968             :         char feat_cap_str[256];
    3969             : 
    3970          92 :         if (!dev)
    3971          39 :                 return;
    3972             : 
    3973          92 :         os_memset(mac, 0, ETH_ALEN);
    3974          92 :         if (!adv_mac)
    3975           0 :                 adv_mac = mac;
    3976          92 :         if (!ses_mac)
    3977           0 :                 ses_mac = mac;
    3978          92 :         if (!grp_mac)
    3979          33 :                 grp_mac = mac;
    3980             : 
    3981          92 :         wpas_p2ps_get_feat_cap_str(feat_cap_str, sizeof(feat_cap_str),
    3982             :                                    feat_cap, feat_cap_len);
    3983             : 
    3984          92 :         if (prov_start) {
    3985          12 :                 if (session_info == NULL) {
    3986         216 :                         wpa_msg_global(wpa_s, MSG_INFO,
    3987             :                                        P2P_EVENT_P2PS_PROVISION_START MACSTR
    3988             :                                        " adv_id=%x conncap=%x"
    3989             :                                        " adv_mac=" MACSTR
    3990             :                                        " session=%x mac=" MACSTR
    3991             :                                        " dev_passwd_id=%d%s",
    3992          72 :                                        MAC2STR(dev), adv_id, conncap,
    3993          72 :                                        MAC2STR(adv_mac),
    3994          72 :                                        ses_id, MAC2STR(ses_mac),
    3995             :                                        passwd_id, feat_cap_str);
    3996             :                 } else {
    3997           0 :                         wpa_msg_global(wpa_s, MSG_INFO,
    3998             :                                        P2P_EVENT_P2PS_PROVISION_START MACSTR
    3999             :                                        " adv_id=%x conncap=%x"
    4000             :                                        " adv_mac=" MACSTR
    4001             :                                        " session=%x mac=" MACSTR
    4002             :                                        " dev_passwd_id=%d info='%s'%s",
    4003           0 :                                        MAC2STR(dev), adv_id, conncap,
    4004           0 :                                        MAC2STR(adv_mac),
    4005           0 :                                        ses_id, MAC2STR(ses_mac),
    4006             :                                        passwd_id, session_info, feat_cap_str);
    4007             :                 }
    4008          12 :                 return;
    4009             :         }
    4010             : 
    4011          80 :         go_wpa_s = wpas_p2p_get_go_group(wpa_s);
    4012          80 :         persistent_go = wpas_p2p_get_persistent_go(wpa_s);
    4013             : 
    4014          80 :         if (status && status != P2P_SC_SUCCESS_DEFERRED) {
    4015           2 :                 if (go_wpa_s && !p2p_group_go_member_count(wpa_s))
    4016           0 :                         wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname);
    4017             : 
    4018           2 :                 if (persistent_go && !persistent_go->num_p2p_clients) {
    4019             :                         /* remove empty persistent GO */
    4020           0 :                         wpa_config_remove_network(wpa_s->conf,
    4021             :                                                   persistent_go->id);
    4022             :                 }
    4023             : 
    4024          36 :                 wpa_msg_global(wpa_s, MSG_INFO,
    4025             :                                P2P_EVENT_P2PS_PROVISION_DONE MACSTR
    4026             :                                " status=%d"
    4027             :                                " adv_id=%x adv_mac=" MACSTR
    4028             :                                " session=%x mac=" MACSTR "%s",
    4029          12 :                                MAC2STR(dev), status,
    4030          12 :                                adv_id, MAC2STR(adv_mac),
    4031          12 :                                ses_id, MAC2STR(ses_mac), feat_cap_str);
    4032           2 :                 return;
    4033             :         }
    4034             : 
    4035             :         /* Clean up stale persistent groups with this device */
    4036          78 :         if (persist_ssid && persist_ssid_size)
    4037           4 :                 s = wpas_p2p_get_persistent(wpa_s, dev, persist_ssid,
    4038             :                                             persist_ssid_size);
    4039             : 
    4040          80 :         if (persist_ssid && s && s->mode != WPAS_MODE_P2P_GO &&
    4041           2 :             is_zero_ether_addr(grp_mac)) {
    4042           0 :                 wpa_dbg(wpa_s, MSG_ERROR,
    4043             :                         "P2P: Peer device is a GO in a persistent group, but it did not provide the intended MAC address");
    4044           0 :                 return;
    4045             :         }
    4046             : 
    4047             :         for (;;) {
    4048          78 :                 stale = wpas_p2p_get_persistent(wpa_s, dev, NULL, 0);
    4049          78 :                 if (!stale)
    4050          74 :                         break;
    4051             : 
    4052           8 :                 if (s && s->ssid_len == stale->ssid_len &&
    4053           8 :                     os_memcmp(stale->bssid, s->bssid, ETH_ALEN) == 0 &&
    4054           4 :                     os_memcmp(stale->ssid, s->ssid, s->ssid_len) == 0)
    4055           4 :                         break;
    4056             : 
    4057             :                 /* Remove stale persistent group */
    4058           0 :                 if (stale->mode != WPAS_MODE_P2P_GO ||
    4059           0 :                     stale->num_p2p_clients <= 1) {
    4060           0 :                         wpa_config_remove_network(wpa_s->conf, stale->id);
    4061             :                 } else {
    4062             :                         size_t i;
    4063             : 
    4064           0 :                         for (i = 0; i < stale->num_p2p_clients; i++) {
    4065           0 :                                 if (os_memcmp(stale->p2p_client_list +
    4066             :                                               i * ETH_ALEN,
    4067             :                                               dev, ETH_ALEN) == 0) {
    4068           0 :                                         os_memmove(stale->p2p_client_list +
    4069             :                                                    i * ETH_ALEN,
    4070             :                                                    stale->p2p_client_list +
    4071             :                                                    (i + 1) * ETH_ALEN,
    4072             :                                                    (stale->num_p2p_clients -
    4073             :                                                     i - 1) * ETH_ALEN);
    4074           0 :                                         break;
    4075             :                                 }
    4076             :                         }
    4077           0 :                         stale->num_p2p_clients--;
    4078             :                 }
    4079           0 :                 save_config = 1;
    4080           0 :         }
    4081             : 
    4082          78 :         if (save_config)
    4083           0 :                 p2p_config_write(wpa_s);
    4084             : 
    4085          78 :         if (s) {
    4086           4 :                 if (go_wpa_s && !p2p_group_go_member_count(wpa_s))
    4087           0 :                         wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname);
    4088             : 
    4089           4 :                 if (persistent_go && s != persistent_go &&
    4090           0 :                     !persistent_go->num_p2p_clients) {
    4091             :                         /* remove empty persistent GO */
    4092           0 :                         wpa_config_remove_network(wpa_s->conf,
    4093             :                                                   persistent_go->id);
    4094             :                         /* Save config */
    4095             :                 }
    4096             : 
    4097          76 :                 wpa_msg_global(wpa_s, MSG_INFO,
    4098             :                                P2P_EVENT_P2PS_PROVISION_DONE MACSTR
    4099             :                                " status=%d"
    4100             :                                " adv_id=%x adv_mac=" MACSTR
    4101             :                                " session=%x mac=" MACSTR
    4102             :                                " persist=%d%s",
    4103          24 :                                MAC2STR(dev), status,
    4104          24 :                                adv_id, MAC2STR(adv_mac),
    4105          24 :                                ses_id, MAC2STR(ses_mac), s->id, feat_cap_str);
    4106           4 :                 return;
    4107             :         }
    4108             : 
    4109          74 :         if (conncap == P2PS_SETUP_GROUP_OWNER) {
    4110             :                 /*
    4111             :                  * We need to copy the interface name. Simply saving a
    4112             :                  * pointer isn't enough, since if we use pending_interface_name
    4113             :                  * it will be overwritten when the group is added.
    4114             :                  */
    4115             :                 char go_ifname[100];
    4116             : 
    4117          21 :                 go_ifname[0] = '\0';
    4118          21 :                 if (!go_wpa_s) {
    4119          17 :                         wpa_s->global->pending_p2ps_group = 1;
    4120          17 :                         wpa_s->global->pending_p2ps_group_freq = freq;
    4121             : 
    4122          17 :                         if (!wpas_p2p_create_iface(wpa_s))
    4123          11 :                                 os_memcpy(go_ifname, wpa_s->ifname,
    4124             :                                           sizeof(go_ifname));
    4125           6 :                         else if (wpa_s->pending_interface_name[0])
    4126           6 :                                 os_memcpy(go_ifname,
    4127             :                                           wpa_s->pending_interface_name,
    4128             :                                           sizeof(go_ifname));
    4129             : 
    4130          17 :                         if (!go_ifname[0]) {
    4131           0 :                                 wpas_p2ps_prov_complete(
    4132             :                                         wpa_s, P2P_SC_FAIL_UNKNOWN_GROUP,
    4133             :                                         dev, adv_mac, ses_mac,
    4134             :                                         grp_mac, adv_id, ses_id, 0, 0,
    4135             :                                         NULL, 0, 0, 0, NULL, NULL, 0, 0,
    4136             :                                         NULL, 0);
    4137           0 :                                 return;
    4138             :                         }
    4139             : 
    4140             :                         /* If PD Resp complete, start up the GO */
    4141          17 :                         if (response_done && persistent_go) {
    4142           0 :                                 wpas_p2p_group_add_persistent(
    4143             :                                         wpa_s, persistent_go,
    4144             :                                         0, 0, freq, 0, 0, 0, 0, NULL,
    4145           0 :                                         persistent_go->mode ==
    4146             :                                         WPAS_MODE_P2P_GO ?
    4147             :                                         P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE :
    4148             :                                         0, 0);
    4149          17 :                         } else if (response_done) {
    4150          12 :                                 wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0);
    4151             :                         }
    4152             : 
    4153          17 :                         if (passwd_id == DEV_PW_P2PS_DEFAULT) {
    4154          11 :                                 os_memcpy(wpa_s->p2ps_join_addr, grp_mac,
    4155             :                                           ETH_ALEN);
    4156          11 :                                 wpa_s->p2ps_method_config_any = 1;
    4157             :                         }
    4158           4 :                 } else if (passwd_id == DEV_PW_P2PS_DEFAULT) {
    4159           4 :                         os_memcpy(go_ifname, go_wpa_s->ifname,
    4160             :                                   sizeof(go_ifname));
    4161             : 
    4162           4 :                         if (is_zero_ether_addr(grp_mac)) {
    4163           3 :                                 wpa_dbg(go_wpa_s, MSG_DEBUG,
    4164             :                                         "P2P: Setting PIN-1 for ANY");
    4165           3 :                                 wpa_supplicant_ap_wps_pin(go_wpa_s, NULL,
    4166             :                                                           "12345670", NULL, 0,
    4167             :                                                           0);
    4168             :                         } else {
    4169           1 :                                 wpa_dbg(go_wpa_s, MSG_DEBUG,
    4170             :                                         "P2P: Setting PIN-1 for " MACSTR,
    4171             :                                         MAC2STR(grp_mac));
    4172           1 :                                 wpa_supplicant_ap_wps_pin(go_wpa_s, grp_mac,
    4173             :                                                           "12345670", NULL, 0,
    4174             :                                                           0);
    4175             :                         }
    4176             : 
    4177           4 :                         os_memcpy(wpa_s->p2ps_join_addr, grp_mac, ETH_ALEN);
    4178           4 :                         wpa_s->p2ps_method_config_any = 1;
    4179             :                 }
    4180             : 
    4181         378 :                 wpa_msg_global(wpa_s, MSG_INFO,
    4182             :                                P2P_EVENT_P2PS_PROVISION_DONE MACSTR
    4183             :                                " status=%d conncap=%x"
    4184             :                                " adv_id=%x adv_mac=" MACSTR
    4185             :                                " session=%x mac=" MACSTR
    4186             :                                " dev_passwd_id=%d go=%s%s",
    4187         126 :                                MAC2STR(dev), status, conncap,
    4188         126 :                                adv_id, MAC2STR(adv_mac),
    4189         126 :                                ses_id, MAC2STR(ses_mac),
    4190             :                                passwd_id, go_ifname, feat_cap_str);
    4191          21 :                 return;
    4192             :         }
    4193             : 
    4194          53 :         if (go_wpa_s && !p2p_group_go_member_count(wpa_s))
    4195           0 :                 wpas_p2p_group_remove(wpa_s, go_wpa_s->ifname);
    4196             : 
    4197          53 :         if (persistent_go && !persistent_go->num_p2p_clients) {
    4198             :                 /* remove empty persistent GO */
    4199           0 :                 wpa_config_remove_network(wpa_s->conf, persistent_go->id);
    4200             :         }
    4201             : 
    4202          53 :         if (conncap == P2PS_SETUP_CLIENT) {
    4203             :                 char ssid_hex[32 * 2 + 1];
    4204             : 
    4205          21 :                 if (group_ssid)
    4206          21 :                         wpa_snprintf_hex(ssid_hex, sizeof(ssid_hex),
    4207             :                                          group_ssid, group_ssid_len);
    4208             :                 else
    4209           0 :                         ssid_hex[0] = '\0';
    4210         525 :                 wpa_msg_global(wpa_s, MSG_INFO,
    4211             :                                P2P_EVENT_P2PS_PROVISION_DONE MACSTR
    4212             :                                " status=%d conncap=%x"
    4213             :                                " adv_id=%x adv_mac=" MACSTR
    4214             :                                " session=%x mac=" MACSTR
    4215             :                                " dev_passwd_id=%d join=" MACSTR "%s%s%s",
    4216         126 :                                MAC2STR(dev), status, conncap,
    4217         126 :                                adv_id, MAC2STR(adv_mac),
    4218         126 :                                ses_id, MAC2STR(ses_mac),
    4219         126 :                                passwd_id, MAC2STR(grp_mac), feat_cap_str,
    4220             :                                group_ssid ? " group_ssid=" : "", ssid_hex);
    4221             :         } else {
    4222         576 :                 wpa_msg_global(wpa_s, MSG_INFO,
    4223             :                                P2P_EVENT_P2PS_PROVISION_DONE MACSTR
    4224             :                                " status=%d conncap=%x"
    4225             :                                " adv_id=%x adv_mac=" MACSTR
    4226             :                                " session=%x mac=" MACSTR
    4227             :                                " dev_passwd_id=%d%s",
    4228         192 :                                MAC2STR(dev), status, conncap,
    4229         192 :                                adv_id, MAC2STR(adv_mac),
    4230         192 :                                ses_id, MAC2STR(ses_mac),
    4231             :                                passwd_id, feat_cap_str);
    4232             :         }
    4233             : }
    4234             : 
    4235             : 
    4236         156 : static int _wpas_p2p_in_progress(void *ctx)
    4237             : {
    4238         156 :         struct wpa_supplicant *wpa_s = ctx;
    4239         156 :         return wpas_p2p_in_progress(wpa_s);
    4240             : }
    4241             : 
    4242             : 
    4243         140 : static int wpas_prov_disc_resp_cb(void *ctx)
    4244             : {
    4245         140 :         struct wpa_supplicant *wpa_s = ctx;
    4246             :         struct wpa_ssid *persistent_go;
    4247             :         unsigned int freq;
    4248             : 
    4249         140 :         if (!wpa_s->global->pending_p2ps_group)
    4250         135 :                 return 0;
    4251             : 
    4252           5 :         freq = wpa_s->global->pending_p2ps_group_freq;
    4253           5 :         wpa_s->global->pending_p2ps_group_freq = 0;
    4254           5 :         wpa_s->global->pending_p2ps_group = 0;
    4255             : 
    4256           5 :         if (wpas_p2p_get_go_group(wpa_s))
    4257           0 :                 return 0;
    4258           5 :         persistent_go = wpas_p2p_get_persistent_go(wpa_s);
    4259             : 
    4260           5 :         if (persistent_go) {
    4261           0 :                 wpas_p2p_group_add_persistent(
    4262             :                         wpa_s, persistent_go, 0, 0, 0, 0, 0, 0, 0, NULL,
    4263           0 :                         persistent_go->mode == WPAS_MODE_P2P_GO ?
    4264             :                         P2P_MAX_INITIAL_CONN_WAIT_GO_REINVOKE : 0, 0);
    4265             :         } else {
    4266           5 :                 wpas_p2p_group_add(wpa_s, 1, freq, 0, 0, 0, 0);
    4267             :         }
    4268             : 
    4269           5 :         return 1;
    4270             : }
    4271             : 
    4272             : 
    4273         325 : static int wpas_p2p_get_pref_freq_list(void *ctx, int go,
    4274             :                                        unsigned int *len,
    4275             :                                        unsigned int *freq_list)
    4276             : {
    4277         325 :         struct wpa_supplicant *wpa_s = ctx;
    4278             : 
    4279         325 :         return wpa_drv_get_pref_freq_list(wpa_s, go ? WPA_IF_P2P_GO :
    4280             :                                           WPA_IF_P2P_CLIENT, len, freq_list);
    4281             : }
    4282             : 
    4283             : 
    4284             : /**
    4285             :  * wpas_p2p_init - Initialize P2P module for %wpa_supplicant
    4286             :  * @global: Pointer to global data from wpa_supplicant_init()
    4287             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    4288             :  * Returns: 0 on success, -1 on failure
    4289             :  */
    4290         648 : int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
    4291             : {
    4292             :         struct p2p_config p2p;
    4293             :         int i;
    4294             : 
    4295         648 :         if (wpa_s->conf->p2p_disabled)
    4296           0 :                 return 0;
    4297             : 
    4298         648 :         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
    4299          47 :                 return 0;
    4300             : 
    4301         601 :         if (global->p2p)
    4302         312 :                 return 0;
    4303             : 
    4304         289 :         os_memset(&p2p, 0, sizeof(p2p));
    4305         289 :         p2p.cb_ctx = wpa_s;
    4306         289 :         p2p.debug_print = wpas_p2p_debug_print;
    4307         289 :         p2p.p2p_scan = wpas_p2p_scan;
    4308         289 :         p2p.send_action = wpas_send_action;
    4309         289 :         p2p.send_action_done = wpas_send_action_done;
    4310         289 :         p2p.go_neg_completed = wpas_go_neg_completed;
    4311         289 :         p2p.go_neg_req_rx = wpas_go_neg_req_rx;
    4312         289 :         p2p.dev_found = wpas_dev_found;
    4313         289 :         p2p.dev_lost = wpas_dev_lost;
    4314         289 :         p2p.find_stopped = wpas_find_stopped;
    4315         289 :         p2p.start_listen = wpas_start_listen;
    4316         289 :         p2p.stop_listen = wpas_stop_listen;
    4317         289 :         p2p.send_probe_resp = wpas_send_probe_resp;
    4318         289 :         p2p.sd_request = wpas_sd_request;
    4319         289 :         p2p.sd_response = wpas_sd_response;
    4320         289 :         p2p.prov_disc_req = wpas_prov_disc_req;
    4321         289 :         p2p.prov_disc_resp = wpas_prov_disc_resp;
    4322         289 :         p2p.prov_disc_fail = wpas_prov_disc_fail;
    4323         289 :         p2p.invitation_process = wpas_invitation_process;
    4324         289 :         p2p.invitation_received = wpas_invitation_received;
    4325         289 :         p2p.invitation_result = wpas_invitation_result;
    4326         289 :         p2p.get_noa = wpas_get_noa;
    4327         289 :         p2p.go_connected = wpas_go_connected;
    4328         289 :         p2p.presence_resp = wpas_presence_resp;
    4329         289 :         p2p.is_concurrent_session_active = wpas_is_concurrent_session_active;
    4330         289 :         p2p.is_p2p_in_progress = _wpas_p2p_in_progress;
    4331         289 :         p2p.get_persistent_group = wpas_get_persistent_group;
    4332         289 :         p2p.get_go_info = wpas_get_go_info;
    4333         289 :         p2p.remove_stale_groups = wpas_remove_stale_groups;
    4334         289 :         p2p.p2ps_prov_complete = wpas_p2ps_prov_complete;
    4335         289 :         p2p.prov_disc_resp_cb = wpas_prov_disc_resp_cb;
    4336         289 :         p2p.p2ps_group_capability = p2ps_group_capability;
    4337         289 :         p2p.get_pref_freq_list = wpas_p2p_get_pref_freq_list;
    4338             : 
    4339         289 :         os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
    4340         289 :         os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
    4341         289 :         p2p.dev_name = wpa_s->conf->device_name;
    4342         289 :         p2p.manufacturer = wpa_s->conf->manufacturer;
    4343         289 :         p2p.model_name = wpa_s->conf->model_name;
    4344         289 :         p2p.model_number = wpa_s->conf->model_number;
    4345         289 :         p2p.serial_number = wpa_s->conf->serial_number;
    4346         289 :         if (wpa_s->wps) {
    4347         289 :                 os_memcpy(p2p.uuid, wpa_s->wps->uuid, 16);
    4348         289 :                 p2p.config_methods = wpa_s->wps->config_methods;
    4349             :         }
    4350             : 
    4351         289 :         if (wpas_p2p_setup_channels(wpa_s, &p2p.channels, &p2p.cli_channels)) {
    4352           0 :                 wpa_printf(MSG_ERROR,
    4353             :                            "P2P: Failed to configure supported channel list");
    4354           0 :                 return -1;
    4355             :         }
    4356             : 
    4357         289 :         if (wpa_s->conf->p2p_listen_reg_class &&
    4358           0 :             wpa_s->conf->p2p_listen_channel) {
    4359           0 :                 p2p.reg_class = wpa_s->conf->p2p_listen_reg_class;
    4360           0 :                 p2p.channel = wpa_s->conf->p2p_listen_channel;
    4361           0 :                 p2p.channel_forced = 1;
    4362             :         } else {
    4363             :                 /*
    4364             :                  * Pick one of the social channels randomly as the listen
    4365             :                  * channel.
    4366             :                  */
    4367         289 :                 if (p2p_config_get_random_social(&p2p, &p2p.reg_class,
    4368             :                                                  &p2p.channel) != 0) {
    4369           0 :                         wpa_printf(MSG_INFO,
    4370             :                                    "P2P: No social channels supported by the driver - do not enable P2P");
    4371           0 :                         return 0;
    4372             :                 }
    4373         289 :                 p2p.channel_forced = 0;
    4374             :         }
    4375         578 :         wpa_printf(MSG_DEBUG, "P2P: Own listen channel: %d:%d",
    4376         578 :                    p2p.reg_class, p2p.channel);
    4377             : 
    4378         289 :         if (wpa_s->conf->p2p_oper_reg_class &&
    4379           0 :             wpa_s->conf->p2p_oper_channel) {
    4380           0 :                 p2p.op_reg_class = wpa_s->conf->p2p_oper_reg_class;
    4381           0 :                 p2p.op_channel = wpa_s->conf->p2p_oper_channel;
    4382           0 :                 p2p.cfg_op_channel = 1;
    4383           0 :                 wpa_printf(MSG_DEBUG, "P2P: Configured operating channel: "
    4384           0 :                            "%d:%d", p2p.op_reg_class, p2p.op_channel);
    4385             : 
    4386             :         } else {
    4387             :                 /*
    4388             :                  * Use random operation channel from 2.4 GHz band social
    4389             :                  * channels (1, 6, 11) or band 60 GHz social channel (2) if no
    4390             :                  * other preference is indicated.
    4391             :                  */
    4392         289 :                 if (p2p_config_get_random_social(&p2p, &p2p.op_reg_class,
    4393             :                                                  &p2p.op_channel) != 0) {
    4394           0 :                         wpa_printf(MSG_ERROR,
    4395             :                                    "P2P: Failed to select random social channel as operation channel");
    4396           0 :                         return -1;
    4397             :                 }
    4398         289 :                 p2p.cfg_op_channel = 0;
    4399         578 :                 wpa_printf(MSG_DEBUG, "P2P: Random operating channel: "
    4400         578 :                            "%d:%d", p2p.op_reg_class, p2p.op_channel);
    4401             :         }
    4402             : 
    4403         289 :         if (wpa_s->conf->p2p_pref_chan && wpa_s->conf->num_p2p_pref_chan) {
    4404           0 :                 p2p.pref_chan = wpa_s->conf->p2p_pref_chan;
    4405           0 :                 p2p.num_pref_chan = wpa_s->conf->num_p2p_pref_chan;
    4406             :         }
    4407             : 
    4408         289 :         if (wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
    4409           0 :                 os_memcpy(p2p.country, wpa_s->conf->country, 2);
    4410           0 :                 p2p.country[2] = 0x04;
    4411             :         } else
    4412         289 :                 os_memcpy(p2p.country, "XX\x04", 3);
    4413             : 
    4414         289 :         os_memcpy(p2p.pri_dev_type, wpa_s->conf->device_type,
    4415             :                   WPS_DEV_TYPE_LEN);
    4416             : 
    4417         289 :         p2p.num_sec_dev_types = wpa_s->conf->num_sec_device_types;
    4418         289 :         os_memcpy(p2p.sec_dev_type, wpa_s->conf->sec_device_type,
    4419             :                   p2p.num_sec_dev_types * WPS_DEV_TYPE_LEN);
    4420             : 
    4421         289 :         p2p.concurrent_operations = !!(wpa_s->drv_flags &
    4422             :                                        WPA_DRIVER_FLAGS_P2P_CONCURRENT);
    4423             : 
    4424         289 :         p2p.max_peers = 100;
    4425             : 
    4426         289 :         if (wpa_s->conf->p2p_ssid_postfix) {
    4427           0 :                 p2p.ssid_postfix_len =
    4428           0 :                         os_strlen(wpa_s->conf->p2p_ssid_postfix);
    4429           0 :                 if (p2p.ssid_postfix_len > sizeof(p2p.ssid_postfix))
    4430           0 :                         p2p.ssid_postfix_len = sizeof(p2p.ssid_postfix);
    4431           0 :                 os_memcpy(p2p.ssid_postfix, wpa_s->conf->p2p_ssid_postfix,
    4432             :                           p2p.ssid_postfix_len);
    4433             :         }
    4434             : 
    4435         289 :         p2p.p2p_intra_bss = wpa_s->conf->p2p_intra_bss;
    4436             : 
    4437         289 :         p2p.max_listen = wpa_s->max_remain_on_chan;
    4438             : 
    4439         289 :         if (wpa_s->conf->p2p_passphrase_len >= 8 &&
    4440           0 :             wpa_s->conf->p2p_passphrase_len <= 63)
    4441           0 :                 p2p.passphrase_len = wpa_s->conf->p2p_passphrase_len;
    4442             :         else
    4443         289 :                 p2p.passphrase_len = 8;
    4444             : 
    4445         289 :         global->p2p = p2p_init(&p2p);
    4446         289 :         if (global->p2p == NULL)
    4447           0 :                 return -1;
    4448         289 :         global->p2p_init_wpa_s = wpa_s;
    4449             : 
    4450        3179 :         for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
    4451        2890 :                 if (wpa_s->conf->wps_vendor_ext[i] == NULL)
    4452        2890 :                         continue;
    4453           0 :                 p2p_add_wps_vendor_extension(
    4454           0 :                         global->p2p, wpa_s->conf->wps_vendor_ext[i]);
    4455             :         }
    4456             : 
    4457         289 :         p2p_set_no_go_freq(global->p2p, &wpa_s->conf->p2p_no_go_freq);
    4458             : 
    4459         289 :         return 0;
    4460             : }
    4461             : 
    4462             : 
    4463             : /**
    4464             :  * wpas_p2p_deinit - Deinitialize per-interface P2P data
    4465             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    4466             :  *
    4467             :  * This function deinitialize per-interface P2P data.
    4468             :  */
    4469         733 : void wpas_p2p_deinit(struct wpa_supplicant *wpa_s)
    4470             : {
    4471         733 :         if (wpa_s->driver && wpa_s->drv_priv)
    4472         711 :                 wpa_drv_probe_req_report(wpa_s, 0);
    4473             : 
    4474         733 :         if (wpa_s->go_params) {
    4475             :                 /* Clear any stored provisioning info */
    4476         155 :                 p2p_clear_provisioning_info(
    4477         155 :                         wpa_s->global->p2p,
    4478         155 :                         wpa_s->go_params->peer_device_addr);
    4479             :         }
    4480             : 
    4481         733 :         os_free(wpa_s->go_params);
    4482         733 :         wpa_s->go_params = NULL;
    4483         733 :         eloop_cancel_timeout(wpas_p2p_psk_failure_removal, wpa_s, NULL);
    4484         733 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
    4485         733 :         eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    4486         733 :         wpa_s->p2p_long_listen = 0;
    4487         733 :         eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
    4488         733 :         eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
    4489         733 :         wpas_p2p_remove_pending_group_interface(wpa_s);
    4490         733 :         eloop_cancel_timeout(wpas_p2p_group_freq_conflict, wpa_s, NULL);
    4491         733 :         wpas_p2p_listen_work_done(wpa_s);
    4492         733 :         if (wpa_s->p2p_send_action_work) {
    4493           0 :                 os_free(wpa_s->p2p_send_action_work->ctx);
    4494           0 :                 radio_work_done(wpa_s->p2p_send_action_work);
    4495           0 :                 wpa_s->p2p_send_action_work = NULL;
    4496             :         }
    4497         733 :         eloop_cancel_timeout(wpas_p2p_send_action_work_timeout, wpa_s, NULL);
    4498             : 
    4499         733 :         wpabuf_free(wpa_s->p2p_oob_dev_pw);
    4500         733 :         wpa_s->p2p_oob_dev_pw = NULL;
    4501             : 
    4502         733 :         os_free(wpa_s->p2p_group_common_freqs);
    4503         733 :         wpa_s->p2p_group_common_freqs = NULL;
    4504         733 :         wpa_s->p2p_group_common_freqs_num = 0;
    4505             : 
    4506             :         /* TODO: remove group interface from the driver if this wpa_s instance
    4507             :          * is on top of a P2P group interface */
    4508         733 : }
    4509             : 
    4510             : 
    4511             : /**
    4512             :  * wpas_p2p_deinit_global - Deinitialize global P2P module
    4513             :  * @global: Pointer to global data from wpa_supplicant_init()
    4514             :  *
    4515             :  * This function deinitializes the global (per device) P2P module.
    4516             :  */
    4517         289 : static void wpas_p2p_deinit_global(struct wpa_global *global)
    4518             : {
    4519             :         struct wpa_supplicant *wpa_s, *tmp;
    4520             : 
    4521         289 :         wpa_s = global->ifaces;
    4522             : 
    4523         289 :         wpas_p2p_service_flush(global->p2p_init_wpa_s);
    4524             : 
    4525             :         /* Remove remaining P2P group interfaces */
    4526         578 :         while (wpa_s && wpa_s->p2p_group_interface != NOT_P2P_GROUP_INTERFACE)
    4527           0 :                 wpa_s = wpa_s->next;
    4528         578 :         while (wpa_s) {
    4529         152 :                 tmp = global->ifaces;
    4530         456 :                 while (tmp &&
    4531           0 :                        (tmp == wpa_s ||
    4532           0 :                         tmp->p2p_group_interface == NOT_P2P_GROUP_INTERFACE)) {
    4533         152 :                         tmp = tmp->next;
    4534             :                 }
    4535         152 :                 if (tmp == NULL)
    4536         152 :                         break;
    4537             :                 /* Disconnect from the P2P group and deinit the interface */
    4538           0 :                 wpas_p2p_disconnect(tmp);
    4539             :         }
    4540             : 
    4541             :         /*
    4542             :          * Deinit GO data on any possibly remaining interface (if main
    4543             :          * interface is used as GO).
    4544             :          */
    4545         441 :         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    4546         152 :                 if (wpa_s->ap_iface)
    4547           0 :                         wpas_p2p_group_deinit(wpa_s);
    4548             :         }
    4549             : 
    4550         289 :         p2p_deinit(global->p2p);
    4551         289 :         global->p2p = NULL;
    4552         289 :         global->p2p_init_wpa_s = NULL;
    4553         289 : }
    4554             : 
    4555             : 
    4556         991 : static int wpas_p2p_create_iface(struct wpa_supplicant *wpa_s)
    4557             : {
    4558         991 :         if (wpa_s->conf->p2p_no_group_iface)
    4559         735 :                 return 0; /* separate interface disabled per configuration */
    4560         256 :         if (wpa_s->drv_flags &
    4561             :             (WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE |
    4562             :              WPA_DRIVER_FLAGS_P2P_MGMT_AND_NON_P2P))
    4563         256 :                 return 1; /* P2P group requires a new interface in every case
    4564             :                            */
    4565           0 :         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CONCURRENT))
    4566           0 :                 return 0; /* driver does not support concurrent operations */
    4567           0 :         if (wpa_s->global->ifaces->next)
    4568           0 :                 return 1; /* more that one interface already in use */
    4569           0 :         if (wpa_s->wpa_state >= WPA_AUTHENTICATING)
    4570           0 :                 return 1; /* this interface is already in use */
    4571           0 :         return 0;
    4572             : }
    4573             : 
    4574             : 
    4575         210 : static int wpas_p2p_start_go_neg(struct wpa_supplicant *wpa_s,
    4576             :                                  const u8 *peer_addr,
    4577             :                                  enum p2p_wps_method wps_method,
    4578             :                                  int go_intent, const u8 *own_interface_addr,
    4579             :                                  unsigned int force_freq, int persistent_group,
    4580             :                                  struct wpa_ssid *ssid, unsigned int pref_freq)
    4581             : {
    4582         210 :         if (persistent_group && wpa_s->conf->persistent_reconnect)
    4583          25 :                 persistent_group = 2;
    4584             : 
    4585             :         /*
    4586             :          * Increase GO config timeout if HT40 is used since it takes some time
    4587             :          * to scan channels for coex purposes before the BSS can be started.
    4588             :          */
    4589         210 :         p2p_set_config_timeout(wpa_s->global->p2p,
    4590         210 :                                wpa_s->p2p_go_ht40 ? 255 : 100, 20);
    4591             : 
    4592         429 :         return p2p_connect(wpa_s->global->p2p, peer_addr, wps_method,
    4593             :                            go_intent, own_interface_addr, force_freq,
    4594             :                            persistent_group, ssid ? ssid->ssid : NULL,
    4595             :                            ssid ? ssid->ssid_len : 0,
    4596         210 :                            wpa_s->p2p_pd_before_go_neg, pref_freq,
    4597           9 :                            wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id :
    4598             :                            0);
    4599             : }
    4600             : 
    4601             : 
    4602         125 : static int wpas_p2p_auth_go_neg(struct wpa_supplicant *wpa_s,
    4603             :                                 const u8 *peer_addr,
    4604             :                                 enum p2p_wps_method wps_method,
    4605             :                                 int go_intent, const u8 *own_interface_addr,
    4606             :                                 unsigned int force_freq, int persistent_group,
    4607             :                                 struct wpa_ssid *ssid, unsigned int pref_freq)
    4608             : {
    4609         125 :         if (persistent_group && wpa_s->conf->persistent_reconnect)
    4610          33 :                 persistent_group = 2;
    4611             : 
    4612         130 :         return p2p_authorize(wpa_s->global->p2p, peer_addr, wps_method,
    4613             :                              go_intent, own_interface_addr, force_freq,
    4614             :                              persistent_group, ssid ? ssid->ssid : NULL,
    4615             :                              ssid ? ssid->ssid_len : 0, pref_freq,
    4616           5 :                              wps_method == WPS_NFC ? wpa_s->p2p_oob_dev_pw_id :
    4617             :                              0);
    4618             : }
    4619             : 
    4620             : 
    4621           0 : static void wpas_p2p_check_join_scan_limit(struct wpa_supplicant *wpa_s)
    4622             : {
    4623           0 :         wpa_s->p2p_join_scan_count++;
    4624           0 :         wpa_printf(MSG_DEBUG, "P2P: Join scan attempt %d",
    4625             :                    wpa_s->p2p_join_scan_count);
    4626           0 :         if (wpa_s->p2p_join_scan_count > P2P_MAX_JOIN_SCAN_ATTEMPTS) {
    4627           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to find GO " MACSTR
    4628             :                            " for join operationg - stop join attempt",
    4629           0 :                            MAC2STR(wpa_s->pending_join_iface_addr));
    4630           0 :                 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    4631           0 :                 if (wpa_s->p2p_auto_pd) {
    4632           0 :                         wpa_s->p2p_auto_pd = 0;
    4633           0 :                         wpa_msg_global(wpa_s, MSG_INFO,
    4634             :                                        P2P_EVENT_PROV_DISC_FAILURE
    4635             :                                        " p2p_dev_addr=" MACSTR " status=N/A",
    4636           0 :                                        MAC2STR(wpa_s->pending_join_dev_addr));
    4637           0 :                         return;
    4638             :                 }
    4639           0 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    4640             :                                P2P_EVENT_GROUP_FORMATION_FAILURE);
    4641           0 :                 wpas_notify_p2p_group_formation_failure(wpa_s, "");
    4642             :         }
    4643             : }
    4644             : 
    4645             : 
    4646          96 : static int wpas_check_freq_conflict(struct wpa_supplicant *wpa_s, int freq)
    4647             : {
    4648             :         int res;
    4649             :         unsigned int num, i;
    4650             :         struct wpa_used_freq_data *freqs;
    4651             : 
    4652          96 :         if (wpas_p2p_num_unused_channels(wpa_s) > 0) {
    4653             :                 /* Multiple channels are supported and not all are in use */
    4654          92 :                 return 0;
    4655             :         }
    4656             : 
    4657           4 :         freqs = os_calloc(wpa_s->num_multichan_concurrent,
    4658             :                           sizeof(struct wpa_used_freq_data));
    4659           4 :         if (!freqs)
    4660           0 :                 return 1;
    4661             : 
    4662           4 :         num = wpas_p2p_valid_oper_freqs(wpa_s, freqs,
    4663             :                                         wpa_s->num_multichan_concurrent);
    4664             : 
    4665           4 :         for (i = 0; i < num; i++) {
    4666           4 :                 if (freqs[i].freq == freq) {
    4667           4 :                         wpa_printf(MSG_DEBUG, "P2P: Frequency %d MHz in use by another virtual interface and can be used",
    4668             :                                    freq);
    4669           4 :                         res = 0;
    4670           4 :                         goto exit_free;
    4671             :                 }
    4672             :         }
    4673             : 
    4674           0 :         wpa_printf(MSG_DEBUG, "P2P: No valid operating frequencies");
    4675           0 :         res = 1;
    4676             : 
    4677             : exit_free:
    4678           4 :         os_free(freqs);
    4679           4 :         return res;
    4680             : }
    4681             : 
    4682             : 
    4683           7 : static int wpas_p2p_peer_go(struct wpa_supplicant *wpa_s,
    4684             :                             const u8 *peer_dev_addr)
    4685             : {
    4686             :         struct wpa_bss *bss;
    4687             :         int updated;
    4688             : 
    4689           7 :         bss = wpa_bss_get_p2p_dev_addr(wpa_s, peer_dev_addr);
    4690           7 :         if (bss == NULL)
    4691           3 :                 return -1;
    4692           4 :         if (bss->last_update_idx < wpa_s->bss_update_idx) {
    4693           0 :                 wpa_printf(MSG_DEBUG, "P2P: Peer BSS entry not updated in the "
    4694             :                            "last scan");
    4695           0 :                 return 0;
    4696             :         }
    4697             : 
    4698           4 :         updated = os_reltime_before(&wpa_s->p2p_auto_started,
    4699             :                                     &bss->last_update);
    4700           4 :         wpa_printf(MSG_DEBUG, "P2P: Current BSS entry for peer updated at "
    4701             :                    "%ld.%06ld (%supdated in last scan)",
    4702             :                    bss->last_update.sec, bss->last_update.usec,
    4703             :                    updated ? "": "not ");
    4704             : 
    4705           4 :         return updated;
    4706             : }
    4707             : 
    4708             : 
    4709          99 : static void wpas_p2p_scan_res_join(struct wpa_supplicant *wpa_s,
    4710             :                                    struct wpa_scan_results *scan_res)
    4711             : {
    4712          99 :         struct wpa_bss *bss = NULL;
    4713             :         int freq;
    4714             :         u8 iface_addr[ETH_ALEN];
    4715             : 
    4716          99 :         eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    4717             : 
    4718          99 :         if (wpa_s->global->p2p_disabled)
    4719          77 :                 return;
    4720             : 
    4721         198 :         wpa_printf(MSG_DEBUG, "P2P: Scan results received (%d BSS) for %sjoin",
    4722          99 :                    scan_res ? (int) scan_res->num : -1,
    4723          99 :                    wpa_s->p2p_auto_join ? "auto_" : "");
    4724             : 
    4725          99 :         if (scan_res)
    4726          99 :                 wpas_p2p_scan_res_handler(wpa_s, scan_res);
    4727             : 
    4728          99 :         if (wpa_s->p2p_auto_pd) {
    4729           2 :                 int join = wpas_p2p_peer_go(wpa_s,
    4730           2 :                                             wpa_s->pending_join_dev_addr);
    4731           2 :                 if (join == 0 &&
    4732           0 :                     wpa_s->auto_pd_scan_retry < P2P_AUTO_PD_SCAN_ATTEMPTS) {
    4733           0 :                         wpa_s->auto_pd_scan_retry++;
    4734           0 :                         bss = wpa_bss_get_bssid_latest(
    4735           0 :                                 wpa_s, wpa_s->pending_join_dev_addr);
    4736           0 :                         if (bss) {
    4737           0 :                                 freq = bss->freq;
    4738           0 :                                 wpa_printf(MSG_DEBUG, "P2P: Scan retry %d for "
    4739             :                                            "the peer " MACSTR " at %d MHz",
    4740             :                                            wpa_s->auto_pd_scan_retry,
    4741           0 :                                            MAC2STR(wpa_s->
    4742             :                                                    pending_join_dev_addr),
    4743             :                                            freq);
    4744           0 :                                 wpas_p2p_join_scan_req(wpa_s, freq, NULL, 0);
    4745           0 :                                 return;
    4746             :                         }
    4747             :                 }
    4748             : 
    4749           2 :                 if (join < 0)
    4750           1 :                         join = 0;
    4751             : 
    4752           2 :                 wpa_s->p2p_auto_pd = 0;
    4753           2 :                 wpa_s->pending_pd_use = join ? AUTO_PD_JOIN : AUTO_PD_GO_NEG;
    4754          12 :                 wpa_printf(MSG_DEBUG, "P2P: Auto PD with " MACSTR " join=%d",
    4755          12 :                            MAC2STR(wpa_s->pending_join_dev_addr), join);
    4756           6 :                 if (p2p_prov_disc_req(wpa_s->global->p2p,
    4757           2 :                                       wpa_s->pending_join_dev_addr, NULL,
    4758           2 :                                       wpa_s->pending_pd_config_methods, join,
    4759           2 :                                       0, wpa_s->user_initiated_pd) < 0) {
    4760           0 :                         wpa_s->p2p_auto_pd = 0;
    4761           0 :                         wpa_msg_global(wpa_s, MSG_INFO,
    4762             :                                        P2P_EVENT_PROV_DISC_FAILURE
    4763             :                                        " p2p_dev_addr=" MACSTR " status=N/A",
    4764           0 :                                        MAC2STR(wpa_s->pending_join_dev_addr));
    4765             :                 }
    4766           2 :                 return;
    4767             :         }
    4768             : 
    4769          97 :         if (wpa_s->p2p_auto_join) {
    4770           4 :                 int join = wpas_p2p_peer_go(wpa_s,
    4771           4 :                                             wpa_s->pending_join_dev_addr);
    4772           4 :                 if (join < 0) {
    4773           1 :                         wpa_printf(MSG_DEBUG, "P2P: Peer was not found to be "
    4774             :                                    "running a GO -> use GO Negotiation");
    4775           1 :                         wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    4776             :                                        P2P_EVENT_FALLBACK_TO_GO_NEG
    4777             :                                        "reason=peer-not-running-GO");
    4778           7 :                         wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr,
    4779           2 :                                          wpa_s->p2p_pin, wpa_s->p2p_wps_method,
    4780           1 :                                          wpa_s->p2p_persistent_group, 0, 0, 0,
    4781             :                                          wpa_s->p2p_go_intent,
    4782             :                                          wpa_s->p2p_connect_freq,
    4783             :                                          wpa_s->p2p_go_vht_center_freq2,
    4784             :                                          wpa_s->p2p_persistent_id,
    4785           1 :                                          wpa_s->p2p_pd_before_go_neg,
    4786           1 :                                          wpa_s->p2p_go_ht40,
    4787           1 :                                          wpa_s->p2p_go_vht,
    4788             :                                          wpa_s->p2p_go_max_oper_chwidth,
    4789             :                                          NULL, 0);
    4790           1 :                         return;
    4791             :                 }
    4792             : 
    4793           3 :                 wpa_printf(MSG_DEBUG, "P2P: Peer was found running GO%s -> "
    4794             :                            "try to join the group", join ? "" :
    4795             :                            " in older scan");
    4796           3 :                 if (!join) {
    4797           2 :                         wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    4798             :                                        P2P_EVENT_FALLBACK_TO_GO_NEG_ENABLED);
    4799           2 :                         wpa_s->p2p_fallback_to_go_neg = 1;
    4800             :                 }
    4801             :         }
    4802             : 
    4803          96 :         freq = p2p_get_oper_freq(wpa_s->global->p2p,
    4804          96 :                                  wpa_s->pending_join_iface_addr);
    4805         185 :         if (freq < 0 &&
    4806          89 :             p2p_get_interface_addr(wpa_s->global->p2p,
    4807          89 :                                    wpa_s->pending_join_dev_addr,
    4808          23 :                                    iface_addr) == 0 &&
    4809          23 :             os_memcmp(iface_addr, wpa_s->pending_join_dev_addr, ETH_ALEN) != 0
    4810          18 :             && !wpa_bss_get_bssid(wpa_s, wpa_s->pending_join_iface_addr)) {
    4811          12 :                 wpa_printf(MSG_DEBUG, "P2P: Overwrite pending interface "
    4812             :                            "address for join from " MACSTR " to " MACSTR
    4813             :                            " based on newly discovered P2P peer entry",
    4814           6 :                            MAC2STR(wpa_s->pending_join_iface_addr),
    4815           6 :                            MAC2STR(iface_addr));
    4816           1 :                 os_memcpy(wpa_s->pending_join_iface_addr, iface_addr,
    4817             :                           ETH_ALEN);
    4818             : 
    4819           1 :                 freq = p2p_get_oper_freq(wpa_s->global->p2p,
    4820           1 :                                          wpa_s->pending_join_iface_addr);
    4821             :         }
    4822          96 :         if (freq >= 0) {
    4823           7 :                 wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
    4824             :                            "from P2P peer table: %d MHz", freq);
    4825             :         }
    4826          96 :         if (wpa_s->p2p_join_ssid_len) {
    4827         200 :                 wpa_printf(MSG_DEBUG, "P2P: Trying to find target GO BSS entry based on BSSID "
    4828             :                            MACSTR " and SSID %s",
    4829         150 :                            MAC2STR(wpa_s->pending_join_iface_addr),
    4830          25 :                            wpa_ssid_txt(wpa_s->p2p_join_ssid,
    4831             :                                         wpa_s->p2p_join_ssid_len));
    4832          50 :                 bss = wpa_bss_get(wpa_s, wpa_s->pending_join_iface_addr,
    4833          25 :                                   wpa_s->p2p_join_ssid,
    4834             :                                   wpa_s->p2p_join_ssid_len);
    4835          71 :         } else if (!bss) {
    4836         426 :                 wpa_printf(MSG_DEBUG, "P2P: Trying to find target GO BSS entry based on BSSID "
    4837         426 :                            MACSTR, MAC2STR(wpa_s->pending_join_iface_addr));
    4838          71 :                 bss = wpa_bss_get_bssid_latest(wpa_s,
    4839          71 :                                                wpa_s->pending_join_iface_addr);
    4840             :         }
    4841          96 :         if (bss) {
    4842             :                 u8 dev_addr[ETH_ALEN];
    4843             : 
    4844          96 :                 freq = bss->freq;
    4845         192 :                 wpa_printf(MSG_DEBUG, "P2P: Target GO operating frequency "
    4846             :                            "from BSS table: %d MHz (SSID %s)", freq,
    4847          96 :                            wpa_ssid_txt(bss->ssid, bss->ssid_len));
    4848          96 :                 if (p2p_parse_dev_addr((const u8 *) (bss + 1), bss->ie_len,
    4849          95 :                                        dev_addr) == 0 &&
    4850          95 :                     os_memcmp(wpa_s->pending_join_dev_addr,
    4851          73 :                               wpa_s->pending_join_iface_addr, ETH_ALEN) == 0 &&
    4852          73 :                     os_memcmp(dev_addr, wpa_s->pending_join_dev_addr,
    4853             :                               ETH_ALEN) != 0) {
    4854          24 :                         wpa_printf(MSG_DEBUG,
    4855             :                                    "P2P: Update target GO device address based on BSS entry: " MACSTR " (was " MACSTR ")",
    4856          12 :                                    MAC2STR(dev_addr),
    4857          12 :                                    MAC2STR(wpa_s->pending_join_dev_addr));
    4858           2 :                         os_memcpy(wpa_s->pending_join_dev_addr, dev_addr,
    4859             :                                   ETH_ALEN);
    4860             :                 }
    4861             :         }
    4862          96 :         if (freq > 0) {
    4863             :                 u16 method;
    4864             : 
    4865          96 :                 if (wpas_check_freq_conflict(wpa_s, freq) > 0) {
    4866           0 :                         wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    4867             :                                        P2P_EVENT_GROUP_FORMATION_FAILURE
    4868             :                                        "reason=FREQ_CONFLICT");
    4869           0 :                         wpas_notify_p2p_group_formation_failure(
    4870             :                                 wpa_s, "FREQ_CONFLICT");
    4871           0 :                         return;
    4872             :                 }
    4873             : 
    4874         576 :                 wpa_printf(MSG_DEBUG, "P2P: Send Provision Discovery Request "
    4875             :                            "prior to joining an existing group (GO " MACSTR
    4876             :                            " freq=%u MHz)",
    4877         576 :                            MAC2STR(wpa_s->pending_join_dev_addr), freq);
    4878          96 :                 wpa_s->pending_pd_before_join = 1;
    4879             : 
    4880          96 :                 switch (wpa_s->pending_join_wps_method) {
    4881             :                 case WPS_PIN_DISPLAY:
    4882           3 :                         method = WPS_CONFIG_KEYPAD;
    4883           3 :                         break;
    4884             :                 case WPS_PIN_KEYPAD:
    4885          68 :                         method = WPS_CONFIG_DISPLAY;
    4886          68 :                         break;
    4887             :                 case WPS_PBC:
    4888           6 :                         method = WPS_CONFIG_PUSHBUTTON;
    4889           6 :                         break;
    4890             :                 case WPS_P2PS:
    4891          15 :                         method = WPS_CONFIG_P2PS;
    4892          15 :                         break;
    4893             :                 default:
    4894           4 :                         method = 0;
    4895           4 :                         break;
    4896             :                 }
    4897             : 
    4898          96 :                 if ((p2p_get_provisioning_info(wpa_s->global->p2p,
    4899          96 :                                                wpa_s->pending_join_dev_addr) ==
    4900             :                      method)) {
    4901             :                         /*
    4902             :                          * We have already performed provision discovery for
    4903             :                          * joining the group. Proceed directly to join
    4904             :                          * operation without duplicated provision discovery. */
    4905         132 :                         wpa_printf(MSG_DEBUG, "P2P: Provision discovery "
    4906             :                                    "with " MACSTR " already done - proceed to "
    4907             :                                    "join",
    4908         132 :                                    MAC2STR(wpa_s->pending_join_dev_addr));
    4909          22 :                         wpa_s->pending_pd_before_join = 0;
    4910          22 :                         goto start;
    4911             :                 }
    4912             : 
    4913         148 :                 if (p2p_prov_disc_req(wpa_s->global->p2p,
    4914          74 :                                       wpa_s->pending_join_dev_addr,
    4915             :                                       NULL, method, 1,
    4916          74 :                                       freq, wpa_s->user_initiated_pd) < 0) {
    4917           0 :                         wpa_printf(MSG_DEBUG, "P2P: Failed to send Provision "
    4918             :                                    "Discovery Request before joining an "
    4919             :                                    "existing group");
    4920           0 :                         wpa_s->pending_pd_before_join = 0;
    4921           0 :                         goto start;
    4922             :                 }
    4923          74 :                 return;
    4924             :         }
    4925             : 
    4926           0 :         wpa_printf(MSG_DEBUG, "P2P: Failed to find BSS/GO - try again later");
    4927           0 :         eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    4928           0 :         eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
    4929           0 :         wpas_p2p_check_join_scan_limit(wpa_s);
    4930           0 :         return;
    4931             : 
    4932             : start:
    4933             :         /* Start join operation immediately */
    4934          22 :         wpas_p2p_join_start(wpa_s, 0, wpa_s->p2p_join_ssid,
    4935             :                             wpa_s->p2p_join_ssid_len);
    4936             : }
    4937             : 
    4938             : 
    4939          99 : static void wpas_p2p_join_scan_req(struct wpa_supplicant *wpa_s, int freq,
    4940             :                                    const u8 *ssid, size_t ssid_len)
    4941             : {
    4942             :         int ret;
    4943             :         struct wpa_driver_scan_params params;
    4944             :         struct wpabuf *wps_ie, *ies;
    4945             :         size_t ielen;
    4946          99 :         int freqs[2] = { 0, 0 };
    4947             :         unsigned int bands;
    4948             : 
    4949          99 :         os_memset(&params, 0, sizeof(params));
    4950             : 
    4951             :         /* P2P Wildcard SSID */
    4952          99 :         params.num_ssids = 1;
    4953          99 :         if (ssid && ssid_len) {
    4954          25 :                 params.ssids[0].ssid = ssid;
    4955          25 :                 params.ssids[0].ssid_len = ssid_len;
    4956          25 :                 os_memcpy(wpa_s->p2p_join_ssid, ssid, ssid_len);
    4957          25 :                 wpa_s->p2p_join_ssid_len = ssid_len;
    4958             :         } else {
    4959          74 :                 params.ssids[0].ssid = (u8 *) P2P_WILDCARD_SSID;
    4960          74 :                 params.ssids[0].ssid_len = P2P_WILDCARD_SSID_LEN;
    4961          74 :                 wpa_s->p2p_join_ssid_len = 0;
    4962             :         }
    4963             : 
    4964          99 :         wpa_s->wps->dev.p2p = 1;
    4965          99 :         wps_ie = wps_build_probe_req_ie(DEV_PW_DEFAULT, &wpa_s->wps->dev,
    4966          99 :                                         wpa_s->wps->uuid, WPS_REQ_ENROLLEE, 0,
    4967             :                                         NULL);
    4968          99 :         if (wps_ie == NULL) {
    4969           0 :                 wpas_p2p_scan_res_join(wpa_s, NULL);
    4970           0 :                 return;
    4971             :         }
    4972             : 
    4973          99 :         if (!freq) {
    4974             :                 int oper_freq;
    4975             :                 /*
    4976             :                  * If freq is not provided, check the operating freq of the GO
    4977             :                  * and use a single channel scan on if possible.
    4978             :                  */
    4979          35 :                 oper_freq = p2p_get_oper_freq(wpa_s->global->p2p,
    4980          35 :                                               wpa_s->pending_join_iface_addr);
    4981          35 :                 if (oper_freq > 0)
    4982           6 :                         freq = oper_freq;
    4983             :         }
    4984          99 :         if (freq > 0) {
    4985          70 :                 freqs[0] = freq;
    4986          70 :                 params.freqs = freqs;
    4987             :         }
    4988             : 
    4989          99 :         ielen = p2p_scan_ie_buf_len(wpa_s->global->p2p);
    4990          99 :         ies = wpabuf_alloc(wpabuf_len(wps_ie) + ielen);
    4991          99 :         if (ies == NULL) {
    4992           0 :                 wpabuf_free(wps_ie);
    4993           0 :                 wpas_p2p_scan_res_join(wpa_s, NULL);
    4994           0 :                 return;
    4995             :         }
    4996          99 :         wpabuf_put_buf(ies, wps_ie);
    4997          99 :         wpabuf_free(wps_ie);
    4998             : 
    4999          99 :         bands = wpas_get_bands(wpa_s, freqs);
    5000          99 :         p2p_scan_ie(wpa_s->global->p2p, ies, NULL, bands);
    5001             : 
    5002          99 :         params.p2p_probe = 1;
    5003          99 :         params.extra_ies = wpabuf_head(ies);
    5004          99 :         params.extra_ies_len = wpabuf_len(ies);
    5005             : 
    5006             :         /*
    5007             :          * Run a scan to update BSS table and start Provision Discovery once
    5008             :          * the new scan results become available.
    5009             :          */
    5010          99 :         ret = wpa_drv_scan(wpa_s, &params);
    5011          99 :         if (!ret) {
    5012          99 :                 os_get_reltime(&wpa_s->scan_trigger_time);
    5013          99 :                 wpa_s->scan_res_handler = wpas_p2p_scan_res_join;
    5014          99 :                 wpa_s->own_scan_requested = 1;
    5015             :         }
    5016             : 
    5017          99 :         wpabuf_free(ies);
    5018             : 
    5019          99 :         if (ret) {
    5020           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to start scan for join - "
    5021             :                            "try again later");
    5022           0 :                 eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    5023           0 :                 eloop_register_timeout(1, 0, wpas_p2p_join_scan, wpa_s, NULL);
    5024           0 :                 wpas_p2p_check_join_scan_limit(wpa_s);
    5025             :         }
    5026             : }
    5027             : 
    5028             : 
    5029           2 : static void wpas_p2p_join_scan(void *eloop_ctx, void *timeout_ctx)
    5030             : {
    5031           2 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    5032           2 :         wpas_p2p_join_scan_req(wpa_s, 0, NULL, 0);
    5033           2 : }
    5034             : 
    5035             : 
    5036          97 : static int wpas_p2p_join(struct wpa_supplicant *wpa_s, const u8 *iface_addr,
    5037             :                          const u8 *dev_addr, enum p2p_wps_method wps_method,
    5038             :                          int auto_join, int op_freq,
    5039             :                          const u8 *ssid, size_t ssid_len)
    5040             : {
    5041        1261 :         wpa_printf(MSG_DEBUG, "P2P: Request to join existing group (iface "
    5042             :                    MACSTR " dev " MACSTR " op_freq=%d)%s",
    5043        1164 :                    MAC2STR(iface_addr), MAC2STR(dev_addr), op_freq,
    5044             :                    auto_join ? " (auto_join)" : "");
    5045          97 :         if (ssid && ssid_len) {
    5046          25 :                 wpa_printf(MSG_DEBUG, "P2P: Group SSID specified: %s",
    5047             :                            wpa_ssid_txt(ssid, ssid_len));
    5048             :         }
    5049             : 
    5050          97 :         wpa_s->p2p_auto_pd = 0;
    5051          97 :         wpa_s->p2p_auto_join = !!auto_join;
    5052          97 :         os_memcpy(wpa_s->pending_join_iface_addr, iface_addr, ETH_ALEN);
    5053          97 :         os_memcpy(wpa_s->pending_join_dev_addr, dev_addr, ETH_ALEN);
    5054          97 :         wpa_s->pending_join_wps_method = wps_method;
    5055             : 
    5056             :         /* Make sure we are not running find during connection establishment */
    5057          97 :         wpas_p2p_stop_find(wpa_s);
    5058             : 
    5059          97 :         wpa_s->p2p_join_scan_count = 0;
    5060          97 :         wpas_p2p_join_scan_req(wpa_s, op_freq, ssid, ssid_len);
    5061          97 :         return 0;
    5062             : }
    5063             : 
    5064             : 
    5065          99 : static int wpas_p2p_join_start(struct wpa_supplicant *wpa_s, int freq,
    5066             :                                const u8 *ssid, size_t ssid_len)
    5067             : {
    5068             :         struct wpa_supplicant *group;
    5069             :         struct p2p_go_neg_results res;
    5070             :         struct wpa_bss *bss;
    5071             : 
    5072          99 :         group = wpas_p2p_get_group_iface(wpa_s, 0, 0);
    5073          99 :         if (group == NULL)
    5074           0 :                 return -1;
    5075          99 :         if (group != wpa_s) {
    5076          25 :                 os_memcpy(group->p2p_pin, wpa_s->p2p_pin,
    5077             :                           sizeof(group->p2p_pin));
    5078          25 :                 group->p2p_wps_method = wpa_s->p2p_wps_method;
    5079             :         } else {
    5080             :                 /*
    5081             :                  * Need to mark the current interface for p2p_group_formation
    5082             :                  * when a separate group interface is not used. This is needed
    5083             :                  * to allow p2p_cancel stop a pending p2p_connect-join.
    5084             :                  * wpas_p2p_init_group_interface() addresses this for the case
    5085             :                  * where a separate group interface is used.
    5086             :                  */
    5087          74 :                 wpa_s->global->p2p_group_formation = wpa_s;
    5088             :         }
    5089             : 
    5090          99 :         group->p2p_in_provisioning = 1;
    5091          99 :         group->p2p_fallback_to_go_neg = wpa_s->p2p_fallback_to_go_neg;
    5092             : 
    5093          99 :         os_memset(&res, 0, sizeof(res));
    5094          99 :         os_memcpy(res.peer_device_addr, wpa_s->pending_join_dev_addr, ETH_ALEN);
    5095          99 :         os_memcpy(res.peer_interface_addr, wpa_s->pending_join_iface_addr,
    5096             :                   ETH_ALEN);
    5097          99 :         res.wps_method = wpa_s->pending_join_wps_method;
    5098          99 :         if (freq && ssid && ssid_len) {
    5099           4 :                 res.freq = freq;
    5100           4 :                 res.ssid_len = ssid_len;
    5101           4 :                 os_memcpy(res.ssid, ssid, ssid_len);
    5102             :         } else {
    5103          95 :                 if (ssid && ssid_len) {
    5104          22 :                         bss = wpa_bss_get(wpa_s, wpa_s->pending_join_iface_addr,
    5105             :                                           ssid, ssid_len);
    5106             :                 } else {
    5107          73 :                         bss = wpa_bss_get_bssid_latest(
    5108          73 :                                 wpa_s, wpa_s->pending_join_iface_addr);
    5109             :                 }
    5110          95 :                 if (bss) {
    5111          95 :                         res.freq = bss->freq;
    5112          95 :                         res.ssid_len = bss->ssid_len;
    5113          95 :                         os_memcpy(res.ssid, bss->ssid, bss->ssid_len);
    5114         190 :                         wpa_printf(MSG_DEBUG, "P2P: Join target GO operating frequency from BSS table: %d MHz (SSID %s)",
    5115             :                                    bss->freq,
    5116          95 :                                    wpa_ssid_txt(bss->ssid, bss->ssid_len));
    5117           0 :                 } else if (ssid && ssid_len) {
    5118           0 :                         res.ssid_len = ssid_len;
    5119           0 :                         os_memcpy(res.ssid, ssid, ssid_len);
    5120           0 :                         wpa_printf(MSG_DEBUG, "P2P: Join target GO (SSID %s)",
    5121             :                                    wpa_ssid_txt(ssid, ssid_len));
    5122             :                 }
    5123             :         }
    5124             : 
    5125          99 :         if (wpa_s->off_channel_freq || wpa_s->roc_waiting_drv_freq) {
    5126           0 :                 wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel prior to "
    5127             :                            "starting client");
    5128           0 :                 wpa_drv_cancel_remain_on_channel(wpa_s);
    5129           0 :                 wpa_s->off_channel_freq = 0;
    5130           0 :                 wpa_s->roc_waiting_drv_freq = 0;
    5131             :         }
    5132          99 :         wpas_start_wps_enrollee(group, &res);
    5133             : 
    5134             :         /*
    5135             :          * Allow a longer timeout for join-a-running-group than normal 15
    5136             :          * second group formation timeout since the GO may not have authorized
    5137             :          * our connection yet.
    5138             :          */
    5139          99 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s, NULL);
    5140          99 :         eloop_register_timeout(60, 0, wpas_p2p_group_formation_timeout,
    5141             :                                wpa_s, NULL);
    5142             : 
    5143          99 :         return 0;
    5144             : }
    5145             : 
    5146             : 
    5147         508 : static int wpas_p2p_setup_freqs(struct wpa_supplicant *wpa_s, int freq,
    5148             :                                 int *force_freq, int *pref_freq, int go,
    5149             :                                 unsigned int *pref_freq_list,
    5150             :                                 unsigned int *num_pref_freq)
    5151             : {
    5152             :         struct wpa_used_freq_data *freqs;
    5153             :         int res, best_freq, num_unused;
    5154         508 :         unsigned int freq_in_use = 0, num, i, max_pref_freq;
    5155             : 
    5156         508 :         max_pref_freq = *num_pref_freq;
    5157         508 :         *num_pref_freq = 0;
    5158             : 
    5159         508 :         freqs = os_calloc(wpa_s->num_multichan_concurrent,
    5160             :                           sizeof(struct wpa_used_freq_data));
    5161         508 :         if (!freqs)
    5162           0 :                 return -1;
    5163             : 
    5164         508 :         num = wpas_p2p_valid_oper_freqs(wpa_s, freqs,
    5165             :                                         wpa_s->num_multichan_concurrent);
    5166             : 
    5167             :         /*
    5168             :          * It is possible that the total number of used frequencies is bigger
    5169             :          * than the number of frequencies used for P2P, so get the system wide
    5170             :          * number of unused frequencies.
    5171             :          */
    5172         508 :         num_unused = wpas_p2p_num_unused_channels(wpa_s);
    5173             : 
    5174         508 :         wpa_printf(MSG_DEBUG,
    5175             :                    "P2P: Setup freqs: freq=%d num_MCC=%d shared_freqs=%u num_unused=%d",
    5176             :                    freq, wpa_s->num_multichan_concurrent, num, num_unused);
    5177             : 
    5178         508 :         if (freq > 0) {
    5179             :                 int ret;
    5180          54 :                 if (go)
    5181          22 :                         ret = p2p_supported_freq(wpa_s->global->p2p, freq);
    5182             :                 else
    5183          32 :                         ret = p2p_supported_freq_cli(wpa_s->global->p2p, freq);
    5184          54 :                 if (!ret) {
    5185           3 :                         if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) &&
    5186           0 :                             ieee80211_is_dfs(freq)) {
    5187             :                                 /*
    5188             :                                  * If freq is a DFS channel and DFS is offloaded
    5189             :                                  * to the driver, allow P2P GO to use it.
    5190             :                                  */
    5191           0 :                                 wpa_printf(MSG_DEBUG,
    5192             :                                            "P2P: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to the driver",
    5193             :                                            freq);
    5194             :                         } else {
    5195           3 :                                 wpa_printf(MSG_DEBUG,
    5196             :                                            "P2P: The forced channel (%u MHz) is not supported for P2P uses",
    5197             :                                            freq);
    5198           3 :                                 res = -3;
    5199           3 :                                 goto exit_free;
    5200             :                         }
    5201             :                 }
    5202             : 
    5203          68 :                 for (i = 0; i < num; i++) {
    5204          17 :                         if (freqs[i].freq == freq)
    5205          14 :                                 freq_in_use = 1;
    5206             :                 }
    5207             : 
    5208          51 :                 if (num_unused <= 0 && !freq_in_use) {
    5209           0 :                         wpa_printf(MSG_DEBUG, "P2P: Cannot start P2P group on %u MHz as there are no available channels",
    5210             :                                    freq);
    5211           0 :                         res = -2;
    5212           0 :                         goto exit_free;
    5213             :                 }
    5214          51 :                 wpa_printf(MSG_DEBUG, "P2P: Trying to force us to use the "
    5215             :                            "requested channel (%u MHz)", freq);
    5216          51 :                 *force_freq = freq;
    5217          51 :                 goto exit_ok;
    5218             :         }
    5219             : 
    5220         454 :         best_freq = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
    5221             : 
    5222         454 :         if (!wpa_s->conf->num_p2p_pref_chan && *pref_freq == 0) {
    5223             :                 enum wpa_driver_if_type iface_type;
    5224             : 
    5225         449 :                 if (go)
    5226         121 :                         iface_type = WPA_IF_P2P_GO;
    5227             :                 else
    5228         328 :                         iface_type = WPA_IF_P2P_CLIENT;
    5229             : 
    5230         449 :                 wpa_printf(MSG_DEBUG, "P2P: best_freq=%d, go=%d",
    5231             :                            best_freq, go);
    5232             : 
    5233         449 :                 res = wpa_drv_get_pref_freq_list(wpa_s, iface_type,
    5234             :                                                  &max_pref_freq,
    5235             :                                                  pref_freq_list);
    5236         449 :                 if (!res && max_pref_freq > 0) {
    5237           0 :                         *num_pref_freq = max_pref_freq;
    5238           0 :                         i = 0;
    5239           0 :                         while (wpas_p2p_disallowed_freq(wpa_s->global,
    5240           0 :                                                         pref_freq_list[i]) &&
    5241           0 :                                i < *num_pref_freq) {
    5242           0 :                                 wpa_printf(MSG_DEBUG,
    5243             :                                            "P2P: preferred_freq_list[%d]=%d is disallowed",
    5244           0 :                                            i, pref_freq_list[i]);
    5245           0 :                                 i++;
    5246             :                         }
    5247           0 :                         if (i != *num_pref_freq) {
    5248           0 :                                 best_freq = pref_freq_list[i];
    5249           0 :                                 wpa_printf(MSG_DEBUG,
    5250             :                                            "P2P: Using preferred_freq_list[%d]=%d",
    5251             :                                            i, best_freq);
    5252             :                         } else {
    5253           0 :                                 wpa_printf(MSG_DEBUG,
    5254             :                                            "P2P: All driver preferred frequencies are disallowed for P2P use");
    5255           0 :                                 *num_pref_freq = 0;
    5256             :                         }
    5257             :                 } else {
    5258         449 :                         wpa_printf(MSG_DEBUG,
    5259             :                                    "P2P: No preferred frequency list available");
    5260             :                 }
    5261             :         }
    5262             : 
    5263             :         /* We have a candidate frequency to use */
    5264         454 :         if (best_freq > 0) {
    5265          24 :                 if (*pref_freq == 0 && num_unused > 0) {
    5266           1 :                         wpa_printf(MSG_DEBUG, "P2P: Try to prefer a frequency (%u MHz) we are already using",
    5267             :                                    best_freq);
    5268           1 :                         *pref_freq = best_freq;
    5269             :                 } else {
    5270          23 :                         wpa_printf(MSG_DEBUG, "P2P: Try to force us to use frequency (%u MHz) which is already in use",
    5271             :                                    best_freq);
    5272          23 :                         *force_freq = best_freq;
    5273             :                 }
    5274         430 :         } else if (num_unused > 0) {
    5275         430 :                 wpa_printf(MSG_DEBUG,
    5276             :                            "P2P: Current operating channels are not available for P2P. Try to use another channel");
    5277         430 :                 *force_freq = 0;
    5278             :         } else {
    5279           0 :                 wpa_printf(MSG_DEBUG,
    5280             :                            "P2P: All channels are in use and none of them are P2P enabled. Cannot start P2P group");
    5281           0 :                 res = -2;
    5282           0 :                 goto exit_free;
    5283             :         }
    5284             : 
    5285             : exit_ok:
    5286         505 :         res = 0;
    5287             : exit_free:
    5288         508 :         os_free(freqs);
    5289         508 :         return res;
    5290             : }
    5291             : 
    5292             : 
    5293             : /**
    5294             :  * wpas_p2p_connect - Request P2P Group Formation to be started
    5295             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    5296             :  * @peer_addr: Address of the peer P2P Device
    5297             :  * @pin: PIN to use during provisioning or %NULL to indicate PBC mode
    5298             :  * @persistent_group: Whether to create a persistent group
    5299             :  * @auto_join: Whether to select join vs. GO Negotiation automatically
    5300             :  * @join: Whether to join an existing group (as a client) instead of starting
    5301             :  *      Group Owner negotiation; @peer_addr is BSSID in that case
    5302             :  * @auth: Whether to only authorize the connection instead of doing that and
    5303             :  *      initiating Group Owner negotiation
    5304             :  * @go_intent: GO Intent or -1 to use default
    5305             :  * @freq: Frequency for the group or 0 for auto-selection
    5306             :  * @freq2: Center frequency of segment 1 for the GO operating in VHT 80P80 mode
    5307             :  * @persistent_id: Persistent group credentials to use for forcing GO
    5308             :  *      parameters or -1 to generate new values (SSID/passphrase)
    5309             :  * @pd: Whether to send Provision Discovery prior to GO Negotiation as an
    5310             :  *      interoperability workaround when initiating group formation
    5311             :  * @ht40: Start GO with 40 MHz channel width
    5312             :  * @vht:  Start GO with VHT support
    5313             :  * @vht_chwidth: Channel width supported by GO operating with VHT support
    5314             :  *      (VHT_CHANWIDTH_*).
    5315             :  * @group_ssid: Specific Group SSID for join or %NULL if not set
    5316             :  * @group_ssid_len: Length of @group_ssid in octets
    5317             :  * Returns: 0 or new PIN (if pin was %NULL) on success, -1 on unspecified
    5318             :  *      failure, -2 on failure due to channel not currently available,
    5319             :  *      -3 if forced channel is not supported
    5320             :  */
    5321         431 : int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
    5322             :                      const char *pin, enum p2p_wps_method wps_method,
    5323             :                      int persistent_group, int auto_join, int join, int auth,
    5324             :                      int go_intent, int freq, unsigned int vht_center_freq2,
    5325             :                      int persistent_id, int pd, int ht40, int vht,
    5326             :                      unsigned int vht_chwidth, const u8 *group_ssid,
    5327             :                      size_t group_ssid_len)
    5328             : {
    5329         431 :         int force_freq = 0, pref_freq = 0;
    5330         431 :         int ret = 0, res;
    5331             :         enum wpa_driver_if_type iftype;
    5332             :         const u8 *if_addr;
    5333         431 :         struct wpa_ssid *ssid = NULL;
    5334             :         unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS], size;
    5335             : 
    5336         431 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    5337           0 :                 return -1;
    5338             : 
    5339         431 :         if (persistent_id >= 0) {
    5340           1 :                 ssid = wpa_config_get_network(wpa_s->conf, persistent_id);
    5341           2 :                 if (ssid == NULL || ssid->disabled != 2 ||
    5342           1 :                     ssid->mode != WPAS_MODE_P2P_GO)
    5343           0 :                         return -1;
    5344             :         }
    5345             : 
    5346         431 :         os_free(wpa_s->global->add_psk);
    5347         431 :         wpa_s->global->add_psk = NULL;
    5348             : 
    5349         431 :         wpa_s->global->p2p_fail_on_wps_complete = 0;
    5350         431 :         wpa_s->global->pending_p2ps_group = 0;
    5351         431 :         wpa_s->global->pending_p2ps_group_freq = 0;
    5352         431 :         wpa_s->p2ps_method_config_any = 0;
    5353             : 
    5354         431 :         if (go_intent < 0)
    5355         244 :                 go_intent = wpa_s->conf->p2p_go_intent;
    5356             : 
    5357         431 :         if (!auth)
    5358         303 :                 wpa_s->p2p_long_listen = 0;
    5359             : 
    5360         431 :         wpa_s->p2p_wps_method = wps_method;
    5361         431 :         wpa_s->p2p_persistent_group = !!persistent_group;
    5362         431 :         wpa_s->p2p_persistent_id = persistent_id;
    5363         431 :         wpa_s->p2p_go_intent = go_intent;
    5364         431 :         wpa_s->p2p_connect_freq = freq;
    5365         431 :         wpa_s->p2p_fallback_to_go_neg = 0;
    5366         431 :         wpa_s->p2p_pd_before_go_neg = !!pd;
    5367         431 :         wpa_s->p2p_go_ht40 = !!ht40;
    5368         431 :         wpa_s->p2p_go_vht = !!vht;
    5369         431 :         wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
    5370         431 :         wpa_s->p2p_go_max_oper_chwidth = vht_chwidth;
    5371             : 
    5372         431 :         if (pin)
    5373         299 :                 os_strlcpy(wpa_s->p2p_pin, pin, sizeof(wpa_s->p2p_pin));
    5374         132 :         else if (wps_method == WPS_PIN_DISPLAY) {
    5375           4 :                 if (wps_generate_pin((unsigned int *) &ret) < 0)
    5376           0 :                         return -1;
    5377           4 :                 res = os_snprintf(wpa_s->p2p_pin, sizeof(wpa_s->p2p_pin),
    5378             :                                   "%08d", ret);
    5379           4 :                 if (os_snprintf_error(sizeof(wpa_s->p2p_pin), res))
    5380           0 :                         wpa_s->p2p_pin[sizeof(wpa_s->p2p_pin) - 1] = '\0';
    5381           4 :                 wpa_printf(MSG_DEBUG, "P2P: Randomly generated PIN: %s",
    5382           4 :                            wpa_s->p2p_pin);
    5383         128 :         } else if (wps_method == WPS_P2PS) {
    5384             :                 /* Force the P2Ps default PIN to be used */
    5385          35 :                 os_strlcpy(wpa_s->p2p_pin, "12345670", sizeof(wpa_s->p2p_pin));
    5386             :         } else
    5387          93 :                 wpa_s->p2p_pin[0] = '\0';
    5388             : 
    5389         431 :         if (join || auto_join) {
    5390             :                 u8 iface_addr[ETH_ALEN], dev_addr[ETH_ALEN];
    5391          93 :                 if (auth) {
    5392          18 :                         wpa_printf(MSG_DEBUG, "P2P: Authorize invitation to "
    5393             :                                    "connect a running group from " MACSTR,
    5394          18 :                                    MAC2STR(peer_addr));
    5395           3 :                         os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
    5396           3 :                         return ret;
    5397             :                 }
    5398          90 :                 os_memcpy(dev_addr, peer_addr, ETH_ALEN);
    5399          90 :                 if (p2p_get_interface_addr(wpa_s->global->p2p, peer_addr,
    5400             :                                            iface_addr) < 0) {
    5401          72 :                         os_memcpy(iface_addr, peer_addr, ETH_ALEN);
    5402          72 :                         p2p_get_dev_addr(wpa_s->global->p2p, peer_addr,
    5403             :                                          dev_addr);
    5404             :                 }
    5405          90 :                 if (auto_join) {
    5406           4 :                         os_get_reltime(&wpa_s->p2p_auto_started);
    5407           4 :                         wpa_printf(MSG_DEBUG, "P2P: Auto join started at "
    5408             :                                    "%ld.%06ld",
    5409             :                                    wpa_s->p2p_auto_started.sec,
    5410             :                                    wpa_s->p2p_auto_started.usec);
    5411             :                 }
    5412          90 :                 wpa_s->user_initiated_pd = 1;
    5413          90 :                 if (wpas_p2p_join(wpa_s, iface_addr, dev_addr, wps_method,
    5414             :                                   auto_join, freq,
    5415             :                                   group_ssid, group_ssid_len) < 0)
    5416           0 :                         return -1;
    5417          90 :                 return ret;
    5418             :         }
    5419             : 
    5420         338 :         size = P2P_MAX_PREF_CHANNELS;
    5421         338 :         res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
    5422             :                                    go_intent == 15, pref_freq_list, &size);
    5423         338 :         if (res)
    5424           3 :                 return res;
    5425         335 :         wpas_p2p_set_own_freq_preference(wpa_s,
    5426         335 :                                          force_freq ? force_freq : pref_freq);
    5427             : 
    5428         335 :         p2p_set_own_pref_freq_list(wpa_s->global->p2p, pref_freq_list, size);
    5429             : 
    5430         335 :         wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
    5431             : 
    5432         335 :         if (wpa_s->create_p2p_iface) {
    5433             :                 /* Prepare to add a new interface for the group */
    5434          50 :                 iftype = WPA_IF_P2P_GROUP;
    5435          50 :                 if (go_intent == 15)
    5436          16 :                         iftype = WPA_IF_P2P_GO;
    5437          50 :                 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
    5438           0 :                         wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
    5439             :                                    "interface for the group");
    5440           0 :                         return -1;
    5441             :                 }
    5442             : 
    5443          50 :                 if_addr = wpa_s->pending_interface_addr;
    5444             :         } else {
    5445         285 :                 if (wpa_s->p2p_mgmt)
    5446           7 :                         if_addr = wpa_s->parent->own_addr;
    5447             :                 else
    5448         278 :                         if_addr = wpa_s->own_addr;
    5449         285 :                 os_memset(wpa_s->go_dev_addr, 0, ETH_ALEN);
    5450             :         }
    5451             : 
    5452         335 :         if (auth) {
    5453         125 :                 if (wpas_p2p_auth_go_neg(wpa_s, peer_addr, wps_method,
    5454             :                                          go_intent, if_addr,
    5455             :                                          force_freq, persistent_group, ssid,
    5456             :                                          pref_freq) < 0)
    5457           0 :                         return -1;
    5458         125 :                 return ret;
    5459             :         }
    5460             : 
    5461         210 :         if (wpas_p2p_start_go_neg(wpa_s, peer_addr, wps_method,
    5462             :                                   go_intent, if_addr, force_freq,
    5463             :                                   persistent_group, ssid, pref_freq) < 0) {
    5464           1 :                 if (wpa_s->create_p2p_iface)
    5465           0 :                         wpas_p2p_remove_pending_group_interface(wpa_s);
    5466           1 :                 return -1;
    5467             :         }
    5468         209 :         return ret;
    5469             : }
    5470             : 
    5471             : 
    5472             : /**
    5473             :  * wpas_p2p_remain_on_channel_cb - Indication of remain-on-channel start
    5474             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    5475             :  * @freq: Frequency of the channel in MHz
    5476             :  * @duration: Duration of the stay on the channel in milliseconds
    5477             :  *
    5478             :  * This callback is called when the driver indicates that it has started the
    5479             :  * requested remain-on-channel duration.
    5480             :  */
    5481        2035 : void wpas_p2p_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
    5482             :                                    unsigned int freq, unsigned int duration)
    5483             : {
    5484        2035 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    5485        2035 :                 return;
    5486        2035 :         wpa_printf(MSG_DEBUG, "P2P: remain-on-channel callback (off_channel_freq=%u pending_listen_freq=%d roc_waiting_drv_freq=%d freq=%u duration=%u)",
    5487             :                    wpa_s->off_channel_freq, wpa_s->pending_listen_freq,
    5488             :                    wpa_s->roc_waiting_drv_freq, freq, duration);
    5489        4070 :         if (wpa_s->off_channel_freq &&
    5490        2035 :             wpa_s->off_channel_freq == wpa_s->pending_listen_freq) {
    5491        2033 :                 p2p_listen_cb(wpa_s->global->p2p, wpa_s->pending_listen_freq,
    5492             :                               wpa_s->pending_listen_duration);
    5493        2033 :                 wpa_s->pending_listen_freq = 0;
    5494             :         } else {
    5495           2 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore remain-on-channel callback (off_channel_freq=%u pending_listen_freq=%d freq=%u duration=%u)",
    5496             :                            wpa_s->off_channel_freq, wpa_s->pending_listen_freq,
    5497             :                            freq, duration);
    5498             :         }
    5499             : }
    5500             : 
    5501             : 
    5502         926 : int wpas_p2p_listen_start(struct wpa_supplicant *wpa_s, unsigned int timeout)
    5503             : {
    5504             :         /* Limit maximum Listen state time based on driver limitation. */
    5505         926 :         if (timeout > wpa_s->max_remain_on_chan)
    5506         919 :                 timeout = wpa_s->max_remain_on_chan;
    5507             : 
    5508         926 :         return p2p_listen(wpa_s->global->p2p, timeout);
    5509             : }
    5510             : 
    5511             : 
    5512             : /**
    5513             :  * wpas_p2p_cancel_remain_on_channel_cb - Remain-on-channel timeout
    5514             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    5515             :  * @freq: Frequency of the channel in MHz
    5516             :  *
    5517             :  * This callback is called when the driver indicates that a remain-on-channel
    5518             :  * operation has been completed, i.e., the duration on the requested channel
    5519             :  * has timed out.
    5520             :  */
    5521        1929 : void wpas_p2p_cancel_remain_on_channel_cb(struct wpa_supplicant *wpa_s,
    5522             :                                           unsigned int freq)
    5523             : {
    5524        1929 :         wpa_printf(MSG_DEBUG, "P2P: Cancel remain-on-channel callback "
    5525             :                    "(p2p_long_listen=%d ms pending_action_tx=%p)",
    5526             :                    wpa_s->p2p_long_listen, offchannel_pending_action_tx(wpa_s));
    5527        1929 :         wpas_p2p_listen_work_done(wpa_s);
    5528        1929 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    5529           0 :                 return;
    5530        1929 :         if (wpa_s->p2p_long_listen > 0)
    5531          37 :                 wpa_s->p2p_long_listen -= wpa_s->max_remain_on_chan;
    5532        1929 :         if (p2p_listen_end(wpa_s->global->p2p, freq) > 0)
    5533           7 :                 return; /* P2P module started a new operation */
    5534        1922 :         if (offchannel_pending_action_tx(wpa_s))
    5535         158 :                 return;
    5536        1764 :         if (wpa_s->p2p_long_listen > 0) {
    5537          35 :                 wpa_printf(MSG_DEBUG, "P2P: Continuing long Listen state");
    5538          35 :                 wpas_p2p_listen_start(wpa_s, wpa_s->p2p_long_listen);
    5539             :         } else {
    5540             :                 /*
    5541             :                  * When listen duration is over, stop listen & update p2p_state
    5542             :                  * to IDLE.
    5543             :                  */
    5544        1729 :                 p2p_stop_listen(wpa_s->global->p2p);
    5545             :         }
    5546             : }
    5547             : 
    5548             : 
    5549             : /**
    5550             :  * wpas_p2p_group_remove - Remove a P2P group
    5551             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    5552             :  * @ifname: Network interface name of the group interface or "*" to remove all
    5553             :  *      groups
    5554             :  * Returns: 0 on success, -1 on failure
    5555             :  *
    5556             :  * This function is used to remove a P2P group. This can be used to disconnect
    5557             :  * from a group in which the local end is a P2P Client or to end a P2P Group in
    5558             :  * case the local end is the Group Owner. If a virtual network interface was
    5559             :  * created for this group, that interface will be removed. Otherwise, only the
    5560             :  * configured P2P group network will be removed from the interface.
    5561             :  */
    5562        7005 : int wpas_p2p_group_remove(struct wpa_supplicant *wpa_s, const char *ifname)
    5563             : {
    5564        7005 :         struct wpa_global *global = wpa_s->global;
    5565        7005 :         struct wpa_supplicant *calling_wpa_s = wpa_s;
    5566             : 
    5567        7005 :         if (os_strcmp(ifname, "*") == 0) {
    5568             :                 struct wpa_supplicant *prev;
    5569        6581 :                 wpa_s = global->ifaces;
    5570       19498 :                 while (wpa_s) {
    5571        6336 :                         prev = wpa_s;
    5572        6336 :                         wpa_s = wpa_s->next;
    5573        6336 :                         if (prev->p2p_group_interface !=
    5574        6327 :                             NOT_P2P_GROUP_INTERFACE ||
    5575        7371 :                             (prev->current_ssid &&
    5576        1044 :                              prev->current_ssid->p2p_group))
    5577          89 :                                 wpas_p2p_disconnect_safely(prev, calling_wpa_s);
    5578             :                 }
    5579        6581 :                 return 0;
    5580             :         }
    5581             : 
    5582         440 :         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    5583         433 :                 if (os_strcmp(wpa_s->ifname, ifname) == 0)
    5584         417 :                         break;
    5585             :         }
    5586             : 
    5587         424 :         return wpas_p2p_disconnect_safely(wpa_s, calling_wpa_s);
    5588             : }
    5589             : 
    5590             : 
    5591         255 : static int wpas_p2p_select_go_freq(struct wpa_supplicant *wpa_s, int freq)
    5592             : {
    5593             :         unsigned int r;
    5594             : 
    5595         255 :         if (!wpa_s->conf->num_p2p_pref_chan && !freq) {
    5596          45 :                 unsigned int i, size = P2P_MAX_PREF_CHANNELS;
    5597             :                 unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS];
    5598             :                 int res;
    5599             : 
    5600          45 :                 res = wpa_drv_get_pref_freq_list(wpa_s, WPA_IF_P2P_GO,
    5601             :                                                  &size, pref_freq_list);
    5602          45 :                 if (!res && size > 0) {
    5603           0 :                         i = 0;
    5604           0 :                         while (wpas_p2p_disallowed_freq(wpa_s->global,
    5605           0 :                                                         pref_freq_list[i]) &&
    5606           0 :                                i < size) {
    5607           0 :                                 wpa_printf(MSG_DEBUG,
    5608             :                                            "P2P: preferred_freq_list[%d]=%d is disallowed",
    5609             :                                            i, pref_freq_list[i]);
    5610           0 :                                 i++;
    5611             :                         }
    5612           0 :                         if (i != size) {
    5613           0 :                                 freq = pref_freq_list[i];
    5614           0 :                                 wpa_printf(MSG_DEBUG,
    5615             :                                            "P2P: Using preferred_freq_list[%d]=%d",
    5616             :                                            i, freq);
    5617             :                         } else {
    5618           0 :                                 wpa_printf(MSG_DEBUG,
    5619             :                                            "P2P: All driver preferred frequencies are disallowed for P2P use");
    5620             :                         }
    5621             :                 } else {
    5622          45 :                         wpa_printf(MSG_DEBUG,
    5623             :                                    "P2P: No preferred frequency list available");
    5624             :                 }
    5625             :         }
    5626             : 
    5627         255 :         if (freq == 2) {
    5628           1 :                 wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 2.4 GHz "
    5629             :                            "band");
    5630           1 :                 if (wpa_s->best_24_freq > 0 &&
    5631           0 :                     p2p_supported_freq_go(wpa_s->global->p2p,
    5632           0 :                                           wpa_s->best_24_freq)) {
    5633           0 :                         freq = wpa_s->best_24_freq;
    5634           0 :                         wpa_printf(MSG_DEBUG, "P2P: Use best 2.4 GHz band "
    5635             :                                    "channel: %d MHz", freq);
    5636             :                 } else {
    5637           1 :                         if (os_get_random((u8 *) &r, sizeof(r)) < 0)
    5638           0 :                                 return -1;
    5639           1 :                         freq = 2412 + (r % 3) * 25;
    5640           1 :                         wpa_printf(MSG_DEBUG, "P2P: Use random 2.4 GHz band "
    5641             :                                    "channel: %d MHz", freq);
    5642             :                 }
    5643             :         }
    5644             : 
    5645         255 :         if (freq == 5) {
    5646           2 :                 wpa_printf(MSG_DEBUG, "P2P: Request to start GO on 5 GHz "
    5647             :                            "band");
    5648           2 :                 if (wpa_s->best_5_freq > 0 &&
    5649           0 :                     p2p_supported_freq_go(wpa_s->global->p2p,
    5650           0 :                                        wpa_s->best_5_freq)) {
    5651           0 :                         freq = wpa_s->best_5_freq;
    5652           0 :                         wpa_printf(MSG_DEBUG, "P2P: Use best 5 GHz band "
    5653             :                                    "channel: %d MHz", freq);
    5654             :                 } else {
    5655           2 :                         if (os_get_random((u8 *) &r, sizeof(r)) < 0)
    5656           0 :                                 return -1;
    5657           2 :                         freq = 5180 + (r % 4) * 20;
    5658           2 :                         if (!p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
    5659           0 :                                 wpa_printf(MSG_DEBUG, "P2P: Could not select "
    5660             :                                            "5 GHz channel for P2P group");
    5661           0 :                                 return -1;
    5662             :                         }
    5663           2 :                         wpa_printf(MSG_DEBUG, "P2P: Use random 5 GHz band "
    5664             :                                    "channel: %d MHz", freq);
    5665             :                 }
    5666             :         }
    5667             : 
    5668         255 :         if (freq > 0 && !p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
    5669           1 :                 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) &&
    5670           0 :                     ieee80211_is_dfs(freq)) {
    5671             :                         /*
    5672             :                          * If freq is a DFS channel and DFS is offloaded to the
    5673             :                          * driver, allow P2P GO to use it.
    5674             :                          */
    5675           0 :                         wpa_printf(MSG_DEBUG, "P2P: "
    5676             :                                    "%s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded",
    5677             :                                    __func__, freq);
    5678           0 :                         return freq;
    5679             :                 }
    5680           1 :                 wpa_printf(MSG_DEBUG, "P2P: The forced channel for GO "
    5681             :                            "(%u MHz) is not supported for P2P uses",
    5682             :                            freq);
    5683           1 :                 return -1;
    5684             :         }
    5685             : 
    5686         254 :         return freq;
    5687             : }
    5688             : 
    5689             : 
    5690         315 : static int wpas_p2p_supported_freq_go(struct wpa_supplicant *wpa_s,
    5691             :                                       const struct p2p_channels *channels,
    5692             :                                       int freq)
    5693             : {
    5694         586 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, freq) &&
    5695         534 :             p2p_supported_freq_go(wpa_s->global->p2p, freq) &&
    5696         263 :             freq_included(wpa_s, channels, freq))
    5697         263 :                 return 1;
    5698          52 :         return 0;
    5699             : }
    5700             : 
    5701             : 
    5702          44 : static void wpas_p2p_select_go_freq_no_pref(struct wpa_supplicant *wpa_s,
    5703             :                                             struct p2p_go_neg_results *params,
    5704             :                                             const struct p2p_channels *channels)
    5705             : {
    5706             :         unsigned int i, r;
    5707             : 
    5708             :         /* first try some random selection of the social channels */
    5709          44 :         if (os_get_random((u8 *) &r, sizeof(r)) < 0)
    5710           0 :                 return;
    5711             : 
    5712          66 :         for (i = 0; i < 3; i++) {
    5713          59 :                 params->freq = 2412 + ((r + i) % 3) * 25;
    5714          59 :                 if (wpas_p2p_supported_freq_go(wpa_s, channels, params->freq))
    5715          37 :                         goto out;
    5716             :         }
    5717             : 
    5718             :         /* try all other channels in operating class 81 */
    5719          34 :         for (i = 0; i < 11; i++) {
    5720          32 :                 params->freq = 2412 + i * 5;
    5721             : 
    5722             :                 /* skip social channels; covered in the previous loop */
    5723          57 :                 if (params->freq == 2412 ||
    5724          48 :                     params->freq == 2437 ||
    5725          23 :                     params->freq == 2462)
    5726          11 :                         continue;
    5727             : 
    5728          21 :                 if (wpas_p2p_supported_freq_go(wpa_s, channels, params->freq))
    5729           5 :                         goto out;
    5730             :         }
    5731             : 
    5732             :         /* try all channels in operating class 115 */
    5733           2 :         for (i = 0; i < 4; i++) {
    5734           2 :                 params->freq = 5180 + i * 20;
    5735           4 :                 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
    5736           4 :                     freq_included(wpa_s, channels, params->freq) &&
    5737           2 :                     p2p_supported_freq(wpa_s->global->p2p, params->freq))
    5738           2 :                         goto out;
    5739             :         }
    5740             : 
    5741             :         /* try all channels in operating class 124 */
    5742           0 :         for (i = 0; i < 4; i++) {
    5743           0 :                 params->freq = 5745 + i * 20;
    5744           0 :                 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
    5745           0 :                     freq_included(wpa_s, channels, params->freq) &&
    5746           0 :                     p2p_supported_freq(wpa_s->global->p2p, params->freq))
    5747           0 :                         goto out;
    5748             :         }
    5749             : 
    5750             :         /* try social channel class 180 channel 2 */
    5751           0 :         params->freq = 58320 + 1 * 2160;
    5752           0 :         if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
    5753           0 :             freq_included(wpa_s, channels, params->freq) &&
    5754           0 :             p2p_supported_freq(wpa_s->global->p2p, params->freq))
    5755           0 :                 goto out;
    5756             : 
    5757             :         /* try all channels in reg. class 180 */
    5758           0 :         for (i = 0; i < 4; i++) {
    5759           0 :                 params->freq = 58320 + i * 2160;
    5760           0 :                 if (!wpas_p2p_disallowed_freq(wpa_s->global, params->freq) &&
    5761           0 :                     freq_included(wpa_s, channels, params->freq) &&
    5762           0 :                     p2p_supported_freq(wpa_s->global->p2p, params->freq))
    5763           0 :                         goto out;
    5764             :         }
    5765             : 
    5766           0 :         params->freq = 0;
    5767           0 :         wpa_printf(MSG_DEBUG, "P2P: No 2.4, 5, or 60 GHz channel allowed");
    5768           0 :         return;
    5769             : out:
    5770          44 :         wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz (no preference known)",
    5771             :                    params->freq);
    5772             : }
    5773             : 
    5774             : 
    5775         265 : static int wpas_p2p_init_go_params(struct wpa_supplicant *wpa_s,
    5776             :                                    struct p2p_go_neg_results *params,
    5777             :                                    int freq, int vht_center_freq2, int ht40,
    5778             :                                    int vht, int max_oper_chwidth,
    5779             :                                    const struct p2p_channels *channels)
    5780             : {
    5781             :         struct wpa_used_freq_data *freqs;
    5782             :         unsigned int cand;
    5783             :         unsigned int num, i;
    5784         265 :         int ignore_no_freqs = 0;
    5785         265 :         int unused_channels = wpas_p2p_num_unused_channels(wpa_s) > 0;
    5786             : 
    5787         265 :         os_memset(params, 0, sizeof(*params));
    5788         265 :         params->role_go = 1;
    5789         265 :         params->ht40 = ht40;
    5790         265 :         params->vht = vht;
    5791         265 :         params->max_oper_chwidth = max_oper_chwidth;
    5792         265 :         params->vht_center_freq2 = vht_center_freq2;
    5793             : 
    5794         265 :         freqs = os_calloc(wpa_s->num_multichan_concurrent,
    5795             :                           sizeof(struct wpa_used_freq_data));
    5796         265 :         if (!freqs)
    5797           0 :                 return -1;
    5798             : 
    5799         265 :         num = get_shared_radio_freqs_data(wpa_s, freqs,
    5800             :                                           wpa_s->num_multichan_concurrent);
    5801             : 
    5802         293 :         if (wpa_s->current_ssid &&
    5803          34 :             wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO &&
    5804           6 :             wpa_s->wpa_state == WPA_COMPLETED) {
    5805           6 :                 wpa_printf(MSG_DEBUG, "P2P: %s called for an active GO",
    5806             :                            __func__);
    5807             : 
    5808             :                 /*
    5809             :                  * If the frequency selection is done for an active P2P GO that
    5810             :                  * is not sharing a frequency, allow to select a new frequency
    5811             :                  * even if there are no unused frequencies as we are about to
    5812             :                  * move the P2P GO so its frequency can be re-used.
    5813             :                  */
    5814           6 :                 for (i = 0; i < num; i++) {
    5815          12 :                         if (freqs[i].freq == wpa_s->current_ssid->frequency &&
    5816           6 :                             freqs[i].flags == 0) {
    5817           6 :                                 ignore_no_freqs = 1;
    5818           6 :                                 break;
    5819             :                         }
    5820             :                 }
    5821             :         }
    5822             : 
    5823             :         /* try using the forced freq */
    5824         265 :         if (freq) {
    5825         200 :                 if (!wpas_p2p_supported_freq_go(wpa_s, channels, freq)) {
    5826           0 :                         wpa_printf(MSG_DEBUG,
    5827             :                                    "P2P: Forced GO freq %d MHz not accepted",
    5828             :                                    freq);
    5829           0 :                         goto fail;
    5830             :                 }
    5831             : 
    5832         205 :                 for (i = 0; i < num; i++) {
    5833          73 :                         if (freqs[i].freq == freq) {
    5834          68 :                                 wpa_printf(MSG_DEBUG,
    5835             :                                            "P2P: forced freq (%d MHz) is also shared",
    5836             :                                            freq);
    5837          68 :                                 params->freq = freq;
    5838          68 :                                 goto success;
    5839             :                         }
    5840             :                 }
    5841             : 
    5842         132 :                 if (!ignore_no_freqs && !unused_channels) {
    5843           0 :                         wpa_printf(MSG_DEBUG,
    5844             :                                    "P2P: Cannot force GO on freq (%d MHz) as all the channels are in use",
    5845             :                                    freq);
    5846           0 :                         goto fail;
    5847             :                 }
    5848             : 
    5849         132 :                 wpa_printf(MSG_DEBUG,
    5850             :                            "P2P: force GO freq (%d MHz) on a free channel",
    5851             :                            freq);
    5852         132 :                 params->freq = freq;
    5853         132 :                 goto success;
    5854             :         }
    5855             : 
    5856             :         /* consider using one of the shared frequencies */
    5857          88 :         if (num &&
    5858          23 :             (!wpa_s->conf->p2p_ignore_shared_freq || !unused_channels)) {
    5859          23 :                 cand = wpas_p2p_pick_best_used_freq(wpa_s, freqs, num);
    5860          23 :                 if (wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
    5861          16 :                         wpa_printf(MSG_DEBUG,
    5862             :                                    "P2P: Use shared freq (%d MHz) for GO",
    5863             :                                    cand);
    5864          16 :                         params->freq = cand;
    5865          16 :                         goto success;
    5866             :                 }
    5867             : 
    5868             :                 /* try using one of the shared freqs */
    5869          14 :                 for (i = 0; i < num; i++) {
    5870           7 :                         if (wpas_p2p_supported_freq_go(wpa_s, channels,
    5871           7 :                                                        freqs[i].freq)) {
    5872           0 :                                 wpa_printf(MSG_DEBUG,
    5873             :                                            "P2P: Use shared freq (%d MHz) for GO",
    5874           0 :                                            freqs[i].freq);
    5875           0 :                                 params->freq = freqs[i].freq;
    5876           0 :                                 goto success;
    5877             :                         }
    5878             :                 }
    5879             :         }
    5880             : 
    5881          49 :         if (!ignore_no_freqs && !unused_channels) {
    5882           0 :                 wpa_printf(MSG_DEBUG,
    5883             :                            "P2P: Cannot force GO on any of the channels we are already using");
    5884           0 :                 goto fail;
    5885             :         }
    5886             : 
    5887             :         /* try using the setting from the configuration file */
    5888          49 :         if (wpa_s->conf->p2p_oper_reg_class == 81 &&
    5889           0 :             wpa_s->conf->p2p_oper_channel >= 1 &&
    5890           0 :             wpa_s->conf->p2p_oper_channel <= 11 &&
    5891           0 :             wpas_p2p_supported_freq_go(
    5892             :                     wpa_s, channels,
    5893           0 :                     2407 + 5 * wpa_s->conf->p2p_oper_channel)) {
    5894           0 :                 params->freq = 2407 + 5 * wpa_s->conf->p2p_oper_channel;
    5895           0 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
    5896             :                            "frequency %d MHz", params->freq);
    5897           0 :                 goto success;
    5898             :         }
    5899             : 
    5900          98 :         if ((wpa_s->conf->p2p_oper_reg_class == 115 ||
    5901          98 :              wpa_s->conf->p2p_oper_reg_class == 116 ||
    5902          98 :              wpa_s->conf->p2p_oper_reg_class == 117 ||
    5903          98 :              wpa_s->conf->p2p_oper_reg_class == 124 ||
    5904          98 :              wpa_s->conf->p2p_oper_reg_class == 125 ||
    5905          98 :              wpa_s->conf->p2p_oper_reg_class == 126 ||
    5906          49 :              wpa_s->conf->p2p_oper_reg_class == 127) &&
    5907           0 :             wpas_p2p_supported_freq_go(wpa_s, channels,
    5908             :                                        5000 +
    5909           0 :                                        5 * wpa_s->conf->p2p_oper_channel)) {
    5910           0 :                 params->freq = 5000 + 5 * wpa_s->conf->p2p_oper_channel;
    5911           0 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on configured "
    5912             :                            "frequency %d MHz", params->freq);
    5913           0 :                 goto success;
    5914             :         }
    5915             : 
    5916             :         /* Try using best channels */
    5917          88 :         if (wpa_s->conf->p2p_oper_channel == 0 &&
    5918          39 :             wpa_s->best_overall_freq > 0 &&
    5919           0 :             wpas_p2p_supported_freq_go(wpa_s, channels,
    5920             :                                        wpa_s->best_overall_freq)) {
    5921           0 :                 params->freq = wpa_s->best_overall_freq;
    5922           0 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best overall "
    5923             :                            "channel %d MHz", params->freq);
    5924           0 :                 goto success;
    5925             :         }
    5926             : 
    5927          88 :         if (wpa_s->conf->p2p_oper_channel == 0 &&
    5928          39 :             wpa_s->best_24_freq > 0 &&
    5929           0 :             wpas_p2p_supported_freq_go(wpa_s, channels,
    5930             :                                        wpa_s->best_24_freq)) {
    5931           0 :                 params->freq = wpa_s->best_24_freq;
    5932           0 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 2.4 GHz "
    5933             :                            "channel %d MHz", params->freq);
    5934           0 :                 goto success;
    5935             :         }
    5936             : 
    5937          88 :         if (wpa_s->conf->p2p_oper_channel == 0 &&
    5938          39 :             wpa_s->best_5_freq > 0 &&
    5939           0 :             wpas_p2p_supported_freq_go(wpa_s, channels,
    5940             :                                        wpa_s->best_5_freq)) {
    5941           0 :                 params->freq = wpa_s->best_5_freq;
    5942           0 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq based on best 5 GHz "
    5943             :                            "channel %d MHz", params->freq);
    5944           0 :                 goto success;
    5945             :         }
    5946             : 
    5947             :         /* try using preferred channels */
    5948          49 :         cand = p2p_get_pref_freq(wpa_s->global->p2p, channels);
    5949          49 :         if (cand && wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
    5950           2 :                 params->freq = cand;
    5951           2 :                 wpa_printf(MSG_DEBUG, "P2P: Set GO freq %d MHz from preferred "
    5952             :                            "channels", params->freq);
    5953           2 :                 goto success;
    5954             :         }
    5955             : 
    5956             :         /* Try using one of the group common freqs */
    5957          47 :         if (wpa_s->p2p_group_common_freqs) {
    5958           3 :                 for (i = 0; i < wpa_s->p2p_group_common_freqs_num; i++) {
    5959           3 :                         cand = wpa_s->p2p_group_common_freqs[i];
    5960           3 :                         if (wpas_p2p_supported_freq_go(wpa_s, channels, cand)) {
    5961           3 :                                 params->freq = cand;
    5962           3 :                                 wpa_printf(MSG_DEBUG,
    5963             :                                            "P2P: Use freq %d MHz common with the peer",
    5964             :                                            params->freq);
    5965           3 :                                 goto success;
    5966             :                         }
    5967             :                 }
    5968             :         }
    5969             : 
    5970             :         /* no preference, select some channel */
    5971          44 :         wpas_p2p_select_go_freq_no_pref(wpa_s, params, channels);
    5972             : 
    5973          44 :         if (params->freq == 0) {
    5974           0 :                 wpa_printf(MSG_DEBUG, "P2P: did not find a freq for GO use");
    5975           0 :                 goto fail;
    5976             :         }
    5977             : 
    5978             : success:
    5979         265 :         os_free(freqs);
    5980         265 :         return 0;
    5981             : fail:
    5982           0 :         os_free(freqs);
    5983           0 :         return -1;
    5984             : }
    5985             : 
    5986             : 
    5987             : static struct wpa_supplicant *
    5988         401 : wpas_p2p_get_group_iface(struct wpa_supplicant *wpa_s, int addr_allocated,
    5989             :                          int go)
    5990             : {
    5991             :         struct wpa_supplicant *group_wpa_s;
    5992             : 
    5993         401 :         if (!wpas_p2p_create_iface(wpa_s)) {
    5994         267 :                 if (wpa_s->p2p_mgmt) {
    5995             :                         /*
    5996             :                          * We may be called on the p2p_dev interface which
    5997             :                          * cannot be used for group operations, so always use
    5998             :                          * the primary interface.
    5999             :                          */
    6000           7 :                         wpa_s->parent->p2pdev = wpa_s;
    6001           7 :                         wpa_s = wpa_s->parent;
    6002             :                 }
    6003         267 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    6004             :                         "P2P: Use primary interface for group operations");
    6005         267 :                 wpa_s->p2p_first_connection_timeout = 0;
    6006         267 :                 if (wpa_s != wpa_s->p2pdev)
    6007           7 :                         wpas_p2p_clone_config(wpa_s, wpa_s->p2pdev);
    6008         267 :                 return wpa_s;
    6009             :         }
    6010             : 
    6011         134 :         if (wpas_p2p_add_group_interface(wpa_s, go ? WPA_IF_P2P_GO :
    6012             :                                          WPA_IF_P2P_CLIENT) < 0) {
    6013           1 :                 wpa_msg_global(wpa_s, MSG_ERROR,
    6014             :                                "P2P: Failed to add group interface");
    6015           1 :                 return NULL;
    6016             :         }
    6017         133 :         group_wpa_s = wpas_p2p_init_group_interface(wpa_s, go);
    6018         133 :         if (group_wpa_s == NULL) {
    6019           0 :                 wpa_msg_global(wpa_s, MSG_ERROR,
    6020             :                                "P2P: Failed to initialize group interface");
    6021           0 :                 wpas_p2p_remove_pending_group_interface(wpa_s);
    6022           0 :                 return NULL;
    6023             :         }
    6024             : 
    6025         133 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use separate group interface %s",
    6026             :                 group_wpa_s->ifname);
    6027         133 :         group_wpa_s->p2p_first_connection_timeout = 0;
    6028         133 :         return group_wpa_s;
    6029             : }
    6030             : 
    6031             : 
    6032             : /**
    6033             :  * wpas_p2p_group_add - Add a new P2P group with local end as Group Owner
    6034             :  * @wpa_s: Pointer to wpa_supplicant data from wpa_supplicant_add_iface()
    6035             :  * @persistent_group: Whether to create a persistent group
    6036             :  * @freq: Frequency for the group or 0 to indicate no hardcoding
    6037             :  * @vht_center_freq2: segment_1 center frequency for GO operating in VHT 80P80
    6038             :  * @ht40: Start GO with 40 MHz channel width
    6039             :  * @vht:  Start GO with VHT support
    6040             :  * @vht_chwidth: channel bandwidth for GO operating with VHT support
    6041             :  * Returns: 0 on success, -1 on failure
    6042             :  *
    6043             :  * This function creates a new P2P group with the local end as the Group Owner,
    6044             :  * i.e., without using Group Owner Negotiation.
    6045             :  */
    6046         205 : int wpas_p2p_group_add(struct wpa_supplicant *wpa_s, int persistent_group,
    6047             :                        int freq, int vht_center_freq2, int ht40, int vht,
    6048             :                        int max_oper_chwidth)
    6049             : {
    6050             :         struct p2p_go_neg_results params;
    6051             : 
    6052         205 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6053           0 :                 return -1;
    6054             : 
    6055         205 :         os_free(wpa_s->global->add_psk);
    6056         205 :         wpa_s->global->add_psk = NULL;
    6057             : 
    6058             :         /* Make sure we are not running find during connection establishment */
    6059         205 :         wpa_printf(MSG_DEBUG, "P2P: Stop any on-going P2P FIND");
    6060         205 :         wpas_p2p_stop_find_oper(wpa_s);
    6061             : 
    6062         205 :         freq = wpas_p2p_select_go_freq(wpa_s, freq);
    6063         205 :         if (freq < 0)
    6064           1 :                 return -1;
    6065             : 
    6066         204 :         if (wpas_p2p_init_go_params(wpa_s, &params, freq, vht_center_freq2,
    6067             :                                     ht40, vht, max_oper_chwidth, NULL))
    6068           0 :                 return -1;
    6069         408 :         if (params.freq &&
    6070         204 :             !p2p_supported_freq_go(wpa_s->global->p2p, params.freq)) {
    6071           0 :                 if ((wpa_s->drv_flags & WPA_DRIVER_FLAGS_DFS_OFFLOAD) &&
    6072           0 :                     ieee80211_is_dfs(params.freq)) {
    6073             :                         /*
    6074             :                          * If freq is a DFS channel and DFS is offloaded to the
    6075             :                          * driver, allow P2P GO to use it.
    6076             :                          */
    6077           0 :                         wpa_printf(MSG_DEBUG,
    6078             :                                    "P2P: %s: The forced channel for GO (%u MHz) is DFS, and DFS is offloaded to driver",
    6079             :                                 __func__, params.freq);
    6080             :                 } else {
    6081           0 :                         wpa_printf(MSG_DEBUG,
    6082             :                                    "P2P: The selected channel for GO (%u MHz) is not supported for P2P uses",
    6083             :                                    params.freq);
    6084           0 :                         return -1;
    6085             :                 }
    6086             :         }
    6087         204 :         p2p_go_params(wpa_s->global->p2p, &params);
    6088         204 :         params.persistent_group = persistent_group;
    6089             : 
    6090         204 :         wpa_s = wpas_p2p_get_group_iface(wpa_s, 0, 1);
    6091         204 :         if (wpa_s == NULL)
    6092           1 :                 return -1;
    6093         203 :         wpas_start_wps_go(wpa_s, &params, 0);
    6094             : 
    6095         203 :         return 0;
    6096             : }
    6097             : 
    6098             : 
    6099          48 : static int wpas_start_p2p_client(struct wpa_supplicant *wpa_s,
    6100             :                                  struct wpa_ssid *params, int addr_allocated,
    6101             :                                  int freq, int force_scan)
    6102             : {
    6103             :         struct wpa_ssid *ssid;
    6104             : 
    6105          48 :         wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 0);
    6106          48 :         if (wpa_s == NULL)
    6107           0 :                 return -1;
    6108          48 :         if (force_scan)
    6109          40 :                 os_get_reltime(&wpa_s->scan_min_time);
    6110          48 :         wpa_s->p2p_last_4way_hs_fail = NULL;
    6111             : 
    6112          48 :         wpa_supplicant_ap_deinit(wpa_s);
    6113             : 
    6114          48 :         ssid = wpa_config_add_network(wpa_s->conf);
    6115          48 :         if (ssid == NULL)
    6116           0 :                 return -1;
    6117          48 :         os_memset(wpa_s->go_dev_addr, 0, ETH_ALEN);
    6118          48 :         wpa_config_set_network_defaults(ssid);
    6119          48 :         ssid->temporary = 1;
    6120          48 :         ssid->proto = WPA_PROTO_RSN;
    6121          48 :         ssid->pbss = params->pbss;
    6122          48 :         ssid->pairwise_cipher = params->pbss ? WPA_CIPHER_GCMP :
    6123             :                 WPA_CIPHER_CCMP;
    6124          48 :         ssid->group_cipher = params->pbss ? WPA_CIPHER_GCMP : WPA_CIPHER_CCMP;
    6125          48 :         ssid->key_mgmt = WPA_KEY_MGMT_PSK;
    6126          48 :         ssid->ssid = os_malloc(params->ssid_len);
    6127          48 :         if (ssid->ssid == NULL) {
    6128           0 :                 wpa_config_remove_network(wpa_s->conf, ssid->id);
    6129           0 :                 return -1;
    6130             :         }
    6131          48 :         os_memcpy(ssid->ssid, params->ssid, params->ssid_len);
    6132          48 :         ssid->ssid_len = params->ssid_len;
    6133          48 :         ssid->p2p_group = 1;
    6134          48 :         ssid->export_keys = 1;
    6135          48 :         if (params->psk_set) {
    6136          48 :                 os_memcpy(ssid->psk, params->psk, 32);
    6137          48 :                 ssid->psk_set = 1;
    6138             :         }
    6139          48 :         if (params->passphrase)
    6140           0 :                 ssid->passphrase = os_strdup(params->passphrase);
    6141             : 
    6142          48 :         wpa_s->show_group_started = 1;
    6143          48 :         wpa_s->p2p_in_invitation = 1;
    6144          48 :         wpa_s->p2p_invite_go_freq = freq;
    6145          48 :         wpa_s->p2p_go_group_formation_completed = 0;
    6146          48 :         wpa_s->global->p2p_group_formation = wpa_s;
    6147             : 
    6148          48 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->p2pdev,
    6149             :                              NULL);
    6150          48 :         eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0,
    6151             :                                wpas_p2p_group_formation_timeout,
    6152          48 :                                wpa_s->p2pdev, NULL);
    6153          48 :         wpa_supplicant_select_network(wpa_s, ssid);
    6154             : 
    6155          48 :         return 0;
    6156             : }
    6157             : 
    6158             : 
    6159         103 : int wpas_p2p_group_add_persistent(struct wpa_supplicant *wpa_s,
    6160             :                                   struct wpa_ssid *ssid, int addr_allocated,
    6161             :                                   int force_freq, int neg_freq,
    6162             :                                   int vht_center_freq2, int ht40,
    6163             :                                   int vht, int max_oper_chwidth,
    6164             :                                   const struct p2p_channels *channels,
    6165             :                                   int connection_timeout, int force_scan)
    6166             : {
    6167             :         struct p2p_go_neg_results params;
    6168         103 :         int go = 0, freq;
    6169             : 
    6170         103 :         if (ssid->disabled != 2 || ssid->ssid == NULL)
    6171           0 :                 return -1;
    6172             : 
    6173         108 :         if (wpas_get_p2p_group(wpa_s, ssid->ssid, ssid->ssid_len, &go) &&
    6174           5 :             go == (ssid->mode == WPAS_MODE_P2P_GO)) {
    6175           5 :                 wpa_printf(MSG_DEBUG, "P2P: Requested persistent group is "
    6176             :                            "already running");
    6177           7 :                 if (go == 0 &&
    6178           2 :                     eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    6179           2 :                                          wpa_s->p2pdev, NULL)) {
    6180             :                         /*
    6181             :                          * This can happen if Invitation Response frame was lost
    6182             :                          * and the peer (GO of a persistent group) tries to
    6183             :                          * invite us again. Reschedule the timeout to avoid
    6184             :                          * terminating the wait for the connection too early
    6185             :                          * since we now know that the peer is still trying to
    6186             :                          * invite us instead of having already started the GO.
    6187             :                          */
    6188           2 :                         wpa_printf(MSG_DEBUG,
    6189             :                                    "P2P: Reschedule group formation timeout since peer is still trying to invite us");
    6190           2 :                         eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0,
    6191             :                                                wpas_p2p_group_formation_timeout,
    6192           2 :                                                wpa_s->p2pdev, NULL);
    6193             :                 }
    6194           5 :                 return 0;
    6195             :         }
    6196             : 
    6197          98 :         os_free(wpa_s->global->add_psk);
    6198          98 :         wpa_s->global->add_psk = NULL;
    6199             : 
    6200             :         /* Make sure we are not running find during connection establishment */
    6201          98 :         wpas_p2p_stop_find_oper(wpa_s);
    6202             : 
    6203          98 :         wpa_s->p2p_fallback_to_go_neg = 0;
    6204             : 
    6205          98 :         if (ssid->mode == WPAS_MODE_P2P_GO) {
    6206          50 :                 if (force_freq > 0) {
    6207          11 :                         freq = wpas_p2p_select_go_freq(wpa_s, force_freq);
    6208          11 :                         if (freq < 0)
    6209           0 :                                 return -1;
    6210             :                 } else {
    6211          39 :                         freq = wpas_p2p_select_go_freq(wpa_s, neg_freq);
    6212          39 :                         if (freq < 0 ||
    6213          38 :                             (freq > 0 && !freq_included(wpa_s, channels, freq)))
    6214           0 :                                 freq = 0;
    6215             :                 }
    6216          48 :         } else if (ssid->mode == WPAS_MODE_INFRA) {
    6217          48 :                 freq = neg_freq;
    6218          48 :                 if (freq <= 0 || !freq_included(wpa_s, channels, freq)) {
    6219             :                         struct os_reltime now;
    6220           8 :                         struct wpa_bss *bss =
    6221           8 :                                 wpa_bss_get_p2p_dev_addr(wpa_s, ssid->bssid);
    6222             : 
    6223           8 :                         os_get_reltime(&now);
    6224          16 :                         if (bss &&
    6225          16 :                             !os_reltime_expired(&now, &bss->last_update, 5) &&
    6226           8 :                             freq_included(wpa_s, channels, bss->freq))
    6227           8 :                                 freq = bss->freq;
    6228             :                         else
    6229           0 :                                 freq = 0;
    6230             :                 }
    6231             : 
    6232          48 :                 return wpas_start_p2p_client(wpa_s, ssid, addr_allocated, freq,
    6233             :                                              force_scan);
    6234             :         } else {
    6235           0 :                 return -1;
    6236             :         }
    6237             : 
    6238          50 :         if (wpas_p2p_init_go_params(wpa_s, &params, freq, vht_center_freq2,
    6239             :                                     ht40, vht, max_oper_chwidth, channels))
    6240           0 :                 return -1;
    6241             : 
    6242          50 :         params.role_go = 1;
    6243          50 :         params.psk_set = ssid->psk_set;
    6244          50 :         if (params.psk_set)
    6245          50 :                 os_memcpy(params.psk, ssid->psk, sizeof(params.psk));
    6246          50 :         if (ssid->passphrase) {
    6247          50 :                 if (os_strlen(ssid->passphrase) >= sizeof(params.passphrase)) {
    6248           0 :                         wpa_printf(MSG_ERROR, "P2P: Invalid passphrase in "
    6249             :                                    "persistent group");
    6250           0 :                         return -1;
    6251             :                 }
    6252          50 :                 os_strlcpy(params.passphrase, ssid->passphrase,
    6253             :                            sizeof(params.passphrase));
    6254             :         }
    6255          50 :         os_memcpy(params.ssid, ssid->ssid, ssid->ssid_len);
    6256          50 :         params.ssid_len = ssid->ssid_len;
    6257          50 :         params.persistent_group = 1;
    6258             : 
    6259          50 :         wpa_s = wpas_p2p_get_group_iface(wpa_s, addr_allocated, 1);
    6260          50 :         if (wpa_s == NULL)
    6261           0 :                 return -1;
    6262             : 
    6263          50 :         p2p_channels_to_freqs(channels, params.freq_list, P2P_MAX_CHANNELS);
    6264             : 
    6265          50 :         wpa_s->p2p_first_connection_timeout = connection_timeout;
    6266          50 :         wpas_start_wps_go(wpa_s, &params, 0);
    6267             : 
    6268          50 :         return 0;
    6269             : }
    6270             : 
    6271             : 
    6272        1659 : static void wpas_p2p_ie_update(void *ctx, struct wpabuf *beacon_ies,
    6273             :                                struct wpabuf *proberesp_ies)
    6274             : {
    6275        1659 :         struct wpa_supplicant *wpa_s = ctx;
    6276        1659 :         if (wpa_s->ap_iface) {
    6277        1659 :                 struct hostapd_data *hapd = wpa_s->ap_iface->bss[0];
    6278        1659 :                 if (!(hapd->conf->p2p & P2P_GROUP_OWNER)) {
    6279           0 :                         wpabuf_free(beacon_ies);
    6280           0 :                         wpabuf_free(proberesp_ies);
    6281        1659 :                         return;
    6282             :                 }
    6283        1659 :                 if (beacon_ies) {
    6284         804 :                         wpabuf_free(hapd->p2p_beacon_ie);
    6285         804 :                         hapd->p2p_beacon_ie = beacon_ies;
    6286             :                 }
    6287        1659 :                 wpabuf_free(hapd->p2p_probe_resp_ie);
    6288        1659 :                 hapd->p2p_probe_resp_ie = proberesp_ies;
    6289             :         } else {
    6290           0 :                 wpabuf_free(beacon_ies);
    6291           0 :                 wpabuf_free(proberesp_ies);
    6292             :         }
    6293        1659 :         wpa_supplicant_ap_update_beacon(wpa_s);
    6294             : }
    6295             : 
    6296             : 
    6297        1181 : static void wpas_p2p_idle_update(void *ctx, int idle)
    6298             : {
    6299        1181 :         struct wpa_supplicant *wpa_s = ctx;
    6300        1181 :         if (!wpa_s->ap_iface)
    6301           0 :                 return;
    6302        1181 :         wpa_printf(MSG_DEBUG, "P2P: GO - group %sidle", idle ? "" : "not ");
    6303        1181 :         if (idle) {
    6304         694 :                 if (wpa_s->global->p2p_fail_on_wps_complete &&
    6305           3 :                     wpa_s->p2p_in_provisioning) {
    6306           3 :                         wpas_p2p_grpform_fail_after_wps(wpa_s);
    6307           3 :                         return;
    6308             :                 }
    6309         688 :                 wpas_p2p_set_group_idle_timeout(wpa_s);
    6310             :         } else
    6311         490 :                 eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL);
    6312             : }
    6313             : 
    6314             : 
    6315         438 : struct p2p_group * wpas_p2p_group_init(struct wpa_supplicant *wpa_s,
    6316             :                                        struct wpa_ssid *ssid)
    6317             : {
    6318             :         struct p2p_group *group;
    6319             :         struct p2p_group_config *cfg;
    6320             : 
    6321         875 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL ||
    6322         437 :             !ssid->p2p_group)
    6323          35 :                 return NULL;
    6324             : 
    6325         403 :         cfg = os_zalloc(sizeof(*cfg));
    6326         403 :         if (cfg == NULL)
    6327           0 :                 return NULL;
    6328             : 
    6329         403 :         if (ssid->p2p_persistent_group && wpa_s->conf->persistent_reconnect)
    6330          89 :                 cfg->persistent_group = 2;
    6331         314 :         else if (ssid->p2p_persistent_group)
    6332          38 :                 cfg->persistent_group = 1;
    6333         403 :         os_memcpy(cfg->interface_addr, wpa_s->own_addr, ETH_ALEN);
    6334         403 :         if (wpa_s->max_stations &&
    6335           0 :             wpa_s->max_stations < wpa_s->conf->max_num_sta)
    6336           0 :                 cfg->max_clients = wpa_s->max_stations;
    6337             :         else
    6338         403 :                 cfg->max_clients = wpa_s->conf->max_num_sta;
    6339         403 :         os_memcpy(cfg->ssid, ssid->ssid, ssid->ssid_len);
    6340         403 :         cfg->ssid_len = ssid->ssid_len;
    6341         403 :         cfg->freq = ssid->frequency;
    6342         403 :         cfg->cb_ctx = wpa_s;
    6343         403 :         cfg->ie_update = wpas_p2p_ie_update;
    6344         403 :         cfg->idle_update = wpas_p2p_idle_update;
    6345         806 :         cfg->ip_addr_alloc = WPA_GET_BE32(wpa_s->p2pdev->conf->ip_addr_start)
    6346         403 :                 != 0;
    6347             : 
    6348         403 :         group = p2p_group_init(wpa_s->global->p2p, cfg);
    6349         403 :         if (group == NULL)
    6350           0 :                 os_free(cfg);
    6351         403 :         if (ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION)
    6352         258 :                 p2p_group_notif_formation_done(group);
    6353         403 :         wpa_s->p2p_group = group;
    6354         403 :         return group;
    6355             : }
    6356             : 
    6357             : 
    6358         569 : void wpas_p2p_wps_success(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
    6359             :                           int registrar)
    6360             : {
    6361         569 :         struct wpa_ssid *ssid = wpa_s->current_ssid;
    6362             : 
    6363         569 :         if (!wpa_s->p2p_in_provisioning) {
    6364         199 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore WPS success event - P2P "
    6365             :                            "provisioning not in progress");
    6366         768 :                 return;
    6367             :         }
    6368             : 
    6369         370 :         if (ssid && ssid->mode == WPAS_MODE_INFRA) {
    6370             :                 u8 go_dev_addr[ETH_ALEN];
    6371         233 :                 os_memcpy(go_dev_addr, wpa_s->bssid, ETH_ALEN);
    6372         233 :                 wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
    6373             :                                           ssid->ssid_len);
    6374             :                 /* Clear any stored provisioning info */
    6375         233 :                 p2p_clear_provisioning_info(wpa_s->global->p2p, go_dev_addr);
    6376             :         }
    6377             : 
    6378         370 :         eloop_cancel_timeout(wpas_p2p_group_formation_timeout, wpa_s->p2pdev,
    6379             :                              NULL);
    6380         370 :         wpa_s->p2p_go_group_formation_completed = 1;
    6381         370 :         if (ssid && ssid->mode == WPAS_MODE_INFRA) {
    6382             :                 /*
    6383             :                  * Use a separate timeout for initial data connection to
    6384             :                  * complete to allow the group to be removed automatically if
    6385             :                  * something goes wrong in this step before the P2P group idle
    6386             :                  * timeout mechanism is taken into use.
    6387             :                  */
    6388         233 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    6389             :                         "P2P: Re-start group formation timeout (%d seconds) as client for initial connection",
    6390             :                         P2P_MAX_INITIAL_CONN_WAIT);
    6391         233 :                 eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT, 0,
    6392             :                                        wpas_p2p_group_formation_timeout,
    6393         233 :                                        wpa_s->p2pdev, NULL);
    6394             :                 /* Complete group formation on successful data connection. */
    6395         233 :                 wpa_s->p2p_go_group_formation_completed = 0;
    6396         137 :         } else if (ssid) {
    6397             :                 /*
    6398             :                  * Use a separate timeout for initial data connection to
    6399             :                  * complete to allow the group to be removed automatically if
    6400             :                  * the client does not complete data connection successfully.
    6401             :                  */
    6402         137 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    6403             :                         "P2P: Re-start group formation timeout (%d seconds) as GO for initial connection",
    6404             :                         P2P_MAX_INITIAL_CONN_WAIT_GO);
    6405         137 :                 eloop_register_timeout(P2P_MAX_INITIAL_CONN_WAIT_GO, 0,
    6406             :                                        wpas_p2p_group_formation_timeout,
    6407         137 :                                        wpa_s->p2pdev, NULL);
    6408             :                 /*
    6409             :                  * Complete group formation on first successful data connection
    6410             :                  */
    6411         137 :                 wpa_s->p2p_go_group_formation_completed = 0;
    6412             :         }
    6413         370 :         if (wpa_s->global->p2p)
    6414         370 :                 p2p_wps_success_cb(wpa_s->global->p2p, peer_addr);
    6415         370 :         wpas_group_formation_completed(wpa_s, 1, 0);
    6416             : }
    6417             : 
    6418             : 
    6419         103 : void wpas_p2p_wps_failed(struct wpa_supplicant *wpa_s,
    6420             :                          struct wps_event_fail *fail)
    6421             : {
    6422         103 :         if (!wpa_s->p2p_in_provisioning) {
    6423          96 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore WPS fail event - P2P "
    6424             :                            "provisioning not in progress");
    6425         199 :                 return;
    6426             :         }
    6427             : 
    6428           7 :         if (wpa_s->go_params) {
    6429           4 :                 p2p_clear_provisioning_info(
    6430           4 :                         wpa_s->global->p2p,
    6431           4 :                         wpa_s->go_params->peer_device_addr);
    6432             :         }
    6433             : 
    6434           7 :         wpas_notify_p2p_wps_failed(wpa_s, fail);
    6435             : 
    6436           7 :         if (wpa_s == wpa_s->global->p2p_group_formation) {
    6437             :                 /*
    6438             :                  * Allow some time for the failed WPS negotiation exchange to
    6439             :                  * complete, but remove the group since group formation cannot
    6440             :                  * succeed after provisioning failure.
    6441             :                  */
    6442           7 :                 wpa_printf(MSG_DEBUG, "P2P: WPS step failed during group formation - reject connection from timeout");
    6443           7 :                 wpa_s->global->p2p_fail_on_wps_complete = 1;
    6444           7 :                 eloop_deplete_timeout(0, 50000,
    6445             :                                       wpas_p2p_group_formation_timeout,
    6446           7 :                                       wpa_s->p2pdev, NULL);
    6447             :         }
    6448             : }
    6449             : 
    6450             : 
    6451        3392 : int wpas_p2p_wps_eapol_cb(struct wpa_supplicant *wpa_s)
    6452             : {
    6453        3396 :         if (!wpa_s->global->p2p_fail_on_wps_complete ||
    6454           4 :             !wpa_s->p2p_in_provisioning)
    6455        3388 :                 return 0;
    6456             : 
    6457           4 :         wpas_p2p_grpform_fail_after_wps(wpa_s);
    6458             : 
    6459           4 :         return 1;
    6460             : }
    6461             : 
    6462             : 
    6463          75 : int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
    6464             :                        const char *config_method,
    6465             :                        enum wpas_p2p_prov_disc_use use,
    6466             :                        struct p2ps_provision *p2ps_prov)
    6467             : {
    6468             :         u16 config_methods;
    6469             : 
    6470          75 :         wpa_s->global->pending_p2ps_group = 0;
    6471          75 :         wpa_s->global->pending_p2ps_group_freq = 0;
    6472          75 :         wpa_s->p2p_fallback_to_go_neg = 0;
    6473          75 :         wpa_s->pending_pd_use = NORMAL_PD;
    6474          75 :         if (p2ps_prov && use == WPAS_P2P_PD_FOR_ASP) {
    6475         104 :                 p2ps_prov->conncap = p2ps_group_capability(
    6476          52 :                         wpa_s, P2PS_SETUP_NONE, p2ps_prov->role,
    6477             :                         &p2ps_prov->force_freq, &p2ps_prov->pref_freq);
    6478             : 
    6479         156 :                 wpa_printf(MSG_DEBUG,
    6480             :                            "P2P: %s conncap: %d - ASP parsed: %x %x %d %s",
    6481          52 :                            __func__, p2ps_prov->conncap,
    6482          52 :                            p2ps_prov->adv_id, p2ps_prov->conncap,
    6483          52 :                            p2ps_prov->status, p2ps_prov->info);
    6484             : 
    6485          52 :                 config_methods = 0;
    6486          23 :         } else if (os_strncmp(config_method, "display", 7) == 0)
    6487          15 :                 config_methods = WPS_CONFIG_DISPLAY;
    6488           8 :         else if (os_strncmp(config_method, "keypad", 6) == 0)
    6489           2 :                 config_methods = WPS_CONFIG_KEYPAD;
    6490           8 :         else if (os_strncmp(config_method, "pbc", 3) == 0 ||
    6491           2 :                  os_strncmp(config_method, "pushbutton", 10) == 0)
    6492           5 :                 config_methods = WPS_CONFIG_PUSHBUTTON;
    6493             :         else {
    6494           1 :                 wpa_printf(MSG_DEBUG, "P2P: Unknown config method");
    6495           1 :                 os_free(p2ps_prov);
    6496           1 :                 return -1;
    6497             :         }
    6498             : 
    6499          74 :         if (use == WPAS_P2P_PD_AUTO) {
    6500           2 :                 os_memcpy(wpa_s->pending_join_dev_addr, peer_addr, ETH_ALEN);
    6501           2 :                 wpa_s->pending_pd_config_methods = config_methods;
    6502           2 :                 wpa_s->p2p_auto_pd = 1;
    6503           2 :                 wpa_s->p2p_auto_join = 0;
    6504           2 :                 wpa_s->pending_pd_before_join = 0;
    6505           2 :                 wpa_s->auto_pd_scan_retry = 0;
    6506           2 :                 wpas_p2p_stop_find(wpa_s);
    6507           2 :                 wpa_s->p2p_join_scan_count = 0;
    6508           2 :                 os_get_reltime(&wpa_s->p2p_auto_started);
    6509           2 :                 wpa_printf(MSG_DEBUG, "P2P: Auto PD started at %ld.%06ld",
    6510             :                            wpa_s->p2p_auto_started.sec,
    6511             :                            wpa_s->p2p_auto_started.usec);
    6512           2 :                 wpas_p2p_join_scan(wpa_s, NULL);
    6513           2 :                 return 0;
    6514             :         }
    6515             : 
    6516          72 :         if (wpa_s->global->p2p == NULL || wpa_s->global->p2p_disabled) {
    6517           0 :                 os_free(p2ps_prov);
    6518           0 :                 return -1;
    6519             :         }
    6520             : 
    6521          72 :         return p2p_prov_disc_req(wpa_s->global->p2p, peer_addr, p2ps_prov,
    6522             :                                  config_methods, use == WPAS_P2P_PD_FOR_JOIN,
    6523             :                                  0, 1);
    6524             : }
    6525             : 
    6526             : 
    6527        2342 : int wpas_p2p_scan_result_text(const u8 *ies, size_t ies_len, char *buf,
    6528             :                               char *end)
    6529             : {
    6530        2342 :         return p2p_scan_result_text(ies, ies_len, buf, end);
    6531             : }
    6532             : 
    6533             : 
    6534       20043 : static void wpas_p2p_clear_pending_action_tx(struct wpa_supplicant *wpa_s)
    6535             : {
    6536       20043 :         if (!offchannel_pending_action_tx(wpa_s))
    6537       40080 :                 return;
    6538             : 
    6539           6 :         if (wpa_s->p2p_send_action_work) {
    6540           3 :                 wpas_p2p_free_send_action_work(wpa_s);
    6541           3 :                 eloop_cancel_timeout(wpas_p2p_send_action_work_timeout,
    6542             :                                      wpa_s, NULL);
    6543           3 :                 offchannel_send_action_done(wpa_s);
    6544             :         }
    6545             : 
    6546           6 :         wpa_printf(MSG_DEBUG, "P2P: Drop pending Action TX due to new "
    6547             :                    "operation request");
    6548           6 :         offchannel_clear_pending_action_tx(wpa_s);
    6549             : }
    6550             : 
    6551             : 
    6552         494 : int wpas_p2p_find(struct wpa_supplicant *wpa_s, unsigned int timeout,
    6553             :                   enum p2p_discovery_type type,
    6554             :                   unsigned int num_req_dev_types, const u8 *req_dev_types,
    6555             :                   const u8 *dev_id, unsigned int search_delay,
    6556             :                   u8 seek_cnt, const char **seek_string, int freq)
    6557             : {
    6558         494 :         wpas_p2p_clear_pending_action_tx(wpa_s);
    6559         494 :         wpa_s->p2p_long_listen = 0;
    6560             : 
    6561         988 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL ||
    6562         494 :             wpa_s->p2p_in_provisioning)
    6563           0 :                 return -1;
    6564             : 
    6565         494 :         wpa_supplicant_cancel_sched_scan(wpa_s);
    6566             : 
    6567         494 :         return p2p_find(wpa_s->global->p2p, timeout, type,
    6568             :                         num_req_dev_types, req_dev_types, dev_id,
    6569             :                         search_delay, seek_cnt, seek_string, freq);
    6570             : }
    6571             : 
    6572             : 
    6573          18 : static void wpas_p2p_scan_res_ignore_search(struct wpa_supplicant *wpa_s,
    6574             :                                             struct wpa_scan_results *scan_res)
    6575             : {
    6576          18 :         wpa_printf(MSG_DEBUG, "P2P: Ignore scan results");
    6577             : 
    6578          18 :         if (wpa_s->p2p_scan_work) {
    6579          15 :                 struct wpa_radio_work *work = wpa_s->p2p_scan_work;
    6580          15 :                 wpa_s->p2p_scan_work = NULL;
    6581          15 :                 radio_work_done(work);
    6582             :         }
    6583             : 
    6584          18 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6585          18 :                 return;
    6586             : 
    6587             :         /*
    6588             :          * Indicate that results have been processed so that the P2P module can
    6589             :          * continue pending tasks.
    6590             :          */
    6591          18 :         p2p_scan_res_handled(wpa_s->global->p2p);
    6592             : }
    6593             : 
    6594             : 
    6595       19014 : static void wpas_p2p_stop_find_oper(struct wpa_supplicant *wpa_s)
    6596             : {
    6597       19014 :         wpas_p2p_clear_pending_action_tx(wpa_s);
    6598       19014 :         wpa_s->p2p_long_listen = 0;
    6599       19014 :         eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
    6600       19014 :         eloop_cancel_timeout(wpas_p2p_join_scan, wpa_s, NULL);
    6601             : 
    6602       19014 :         if (wpa_s->global->p2p)
    6603       19014 :                 p2p_stop_find(wpa_s->global->p2p);
    6604             : 
    6605       19014 :         if (wpa_s->scan_res_handler == wpas_p2p_scan_res_handler) {
    6606          19 :                 wpa_printf(MSG_DEBUG,
    6607             :                            "P2P: Do not consider the scan results after stop_find");
    6608          19 :                 wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore_search;
    6609             :         }
    6610       19014 : }
    6611             : 
    6612             : 
    6613       18654 : void wpas_p2p_stop_find(struct wpa_supplicant *wpa_s)
    6614             : {
    6615       18654 :         wpas_p2p_stop_find_oper(wpa_s);
    6616       18654 :         if (!wpa_s->global->pending_group_iface_for_p2ps)
    6617       18652 :                 wpas_p2p_remove_pending_group_interface(wpa_s);
    6618       18654 : }
    6619             : 
    6620             : 
    6621           0 : static void wpas_p2p_long_listen_timeout(void *eloop_ctx, void *timeout_ctx)
    6622             : {
    6623           0 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    6624           0 :         wpa_s->p2p_long_listen = 0;
    6625           0 : }
    6626             : 
    6627             : 
    6628         536 : int wpas_p2p_listen(struct wpa_supplicant *wpa_s, unsigned int timeout)
    6629             : {
    6630             :         int res;
    6631             : 
    6632         536 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6633           1 :                 return -1;
    6634             : 
    6635         535 :         if (wpa_s->p2p_lo_started) {
    6636           0 :                 wpa_printf(MSG_DEBUG,
    6637             :                         "P2P: Cannot start P2P listen, it is offloaded");
    6638           0 :                 return -1;
    6639             :         }
    6640             : 
    6641         535 :         wpa_supplicant_cancel_sched_scan(wpa_s);
    6642         535 :         wpas_p2p_clear_pending_action_tx(wpa_s);
    6643             : 
    6644         535 :         if (timeout == 0) {
    6645             :                 /*
    6646             :                  * This is a request for unlimited Listen state. However, at
    6647             :                  * least for now, this is mapped to a Listen state for one
    6648             :                  * hour.
    6649             :                  */
    6650         523 :                 timeout = 3600;
    6651             :         }
    6652         535 :         eloop_cancel_timeout(wpas_p2p_long_listen_timeout, wpa_s, NULL);
    6653         535 :         wpa_s->p2p_long_listen = 0;
    6654             : 
    6655             :         /*
    6656             :          * Stop previous find/listen operation to avoid trying to request a new
    6657             :          * remain-on-channel operation while the driver is still running the
    6658             :          * previous one.
    6659             :          */
    6660         535 :         if (wpa_s->global->p2p)
    6661         535 :                 p2p_stop_find(wpa_s->global->p2p);
    6662             : 
    6663         535 :         res = wpas_p2p_listen_start(wpa_s, timeout * 1000);
    6664         535 :         if (res == 0 && timeout * 1000 > wpa_s->max_remain_on_chan) {
    6665         533 :                 wpa_s->p2p_long_listen = timeout * 1000;
    6666         533 :                 eloop_register_timeout(timeout, 0,
    6667             :                                        wpas_p2p_long_listen_timeout,
    6668             :                                        wpa_s, NULL);
    6669             :         }
    6670             : 
    6671         535 :         return res;
    6672             : }
    6673             : 
    6674             : 
    6675        4938 : int wpas_p2p_assoc_req_ie(struct wpa_supplicant *wpa_s, struct wpa_bss *bss,
    6676             :                           u8 *buf, size_t len, int p2p_group)
    6677             : {
    6678             :         struct wpabuf *p2p_ie;
    6679             :         int ret;
    6680             : 
    6681        4938 :         if (wpa_s->global->p2p_disabled)
    6682           6 :                 return -1;
    6683             :         /*
    6684             :          * Advertize mandatory cross connection capability even on
    6685             :          * p2p_disabled=1 interface when associating with a P2P Manager WLAN AP.
    6686             :          */
    6687        4932 :         if (wpa_s->conf->p2p_disabled && p2p_group)
    6688           0 :                 return -1;
    6689        4932 :         if (wpa_s->global->p2p == NULL)
    6690           0 :                 return -1;
    6691        4932 :         if (bss == NULL)
    6692          33 :                 return -1;
    6693             : 
    6694        4899 :         p2p_ie = wpa_bss_get_vendor_ie_multi(bss, P2P_IE_VENDOR_TYPE);
    6695        4899 :         ret = p2p_assoc_req_ie(wpa_s->global->p2p, bss->bssid, buf, len,
    6696             :                                p2p_group, p2p_ie);
    6697        4899 :         wpabuf_free(p2p_ie);
    6698             : 
    6699        4899 :         return ret;
    6700             : }
    6701             : 
    6702             : 
    6703        1404 : int wpas_p2p_probe_req_rx(struct wpa_supplicant *wpa_s, const u8 *addr,
    6704             :                           const u8 *dst, const u8 *bssid,
    6705             :                           const u8 *ie, size_t ie_len,
    6706             :                           unsigned int rx_freq, int ssi_signal)
    6707             : {
    6708        1404 :         if (wpa_s->global->p2p_disabled)
    6709           1 :                 return 0;
    6710        1403 :         if (wpa_s->global->p2p == NULL)
    6711           0 :                 return 0;
    6712             : 
    6713        1403 :         switch (p2p_probe_req_rx(wpa_s->global->p2p, addr, dst, bssid,
    6714             :                                  ie, ie_len, rx_freq, wpa_s->p2p_lo_started)) {
    6715             :         case P2P_PREQ_NOT_P2P:
    6716          13 :                 wpas_notify_preq(wpa_s, addr, dst, bssid, ie, ie_len,
    6717             :                                  ssi_signal);
    6718             :                 /* fall through */
    6719             :         case P2P_PREQ_MALFORMED:
    6720             :         case P2P_PREQ_NOT_LISTEN:
    6721             :         case P2P_PREQ_NOT_PROCESSED:
    6722             :         default: /* make gcc happy */
    6723         640 :                 return 0;
    6724             :         case P2P_PREQ_PROCESSED:
    6725         763 :                 return 1;
    6726             :         }
    6727             : }
    6728             : 
    6729             : 
    6730        1685 : void wpas_p2p_rx_action(struct wpa_supplicant *wpa_s, const u8 *da,
    6731             :                         const u8 *sa, const u8 *bssid,
    6732             :                         u8 category, const u8 *data, size_t len, int freq)
    6733             : {
    6734        1685 :         if (wpa_s->global->p2p_disabled)
    6735           0 :                 return;
    6736        1685 :         if (wpa_s->global->p2p == NULL)
    6737           0 :                 return;
    6738             : 
    6739        1685 :         p2p_rx_action(wpa_s->global->p2p, da, sa, bssid, category, data, len,
    6740             :                       freq);
    6741             : }
    6742             : 
    6743             : 
    6744        4544 : void wpas_p2p_scan_ie(struct wpa_supplicant *wpa_s, struct wpabuf *ies)
    6745             : {
    6746             :         unsigned int bands;
    6747             : 
    6748        4544 :         if (wpa_s->global->p2p_disabled)
    6749           2 :                 return;
    6750        4542 :         if (wpa_s->global->p2p == NULL)
    6751           0 :                 return;
    6752             : 
    6753        4542 :         bands = wpas_get_bands(wpa_s, NULL);
    6754        4542 :         p2p_scan_ie(wpa_s->global->p2p, ies, NULL, bands);
    6755             : }
    6756             : 
    6757             : 
    6758         442 : static void wpas_p2p_group_deinit(struct wpa_supplicant *wpa_s)
    6759             : {
    6760         442 :         p2p_group_deinit(wpa_s->p2p_group);
    6761         442 :         wpa_s->p2p_group = NULL;
    6762             : 
    6763         442 :         wpa_s->ap_configured_cb = NULL;
    6764         442 :         wpa_s->ap_configured_cb_ctx = NULL;
    6765         442 :         wpa_s->ap_configured_cb_data = NULL;
    6766         442 :         wpa_s->connect_without_scan = NULL;
    6767         442 : }
    6768             : 
    6769             : 
    6770           5 : int wpas_p2p_reject(struct wpa_supplicant *wpa_s, const u8 *addr)
    6771             : {
    6772           5 :         wpa_s->p2p_long_listen = 0;
    6773             : 
    6774           5 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6775           0 :                 return -1;
    6776             : 
    6777           5 :         return p2p_reject(wpa_s->global->p2p, addr);
    6778             : }
    6779             : 
    6780             : 
    6781             : /* Invite to reinvoke a persistent group */
    6782          57 : int wpas_p2p_invite(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
    6783             :                     struct wpa_ssid *ssid, const u8 *go_dev_addr, int freq,
    6784             :                     int vht_center_freq2, int ht40, int vht, int max_chwidth,
    6785             :                     int pref_freq)
    6786             : {
    6787             :         enum p2p_invite_role role;
    6788          57 :         u8 *bssid = NULL;
    6789          57 :         int force_freq = 0;
    6790             :         int res;
    6791          57 :         int no_pref_freq_given = pref_freq == 0;
    6792             :         unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS], size;
    6793             : 
    6794          57 :         wpa_s->global->p2p_invite_group = NULL;
    6795          57 :         if (peer_addr)
    6796          57 :                 os_memcpy(wpa_s->p2p_auth_invite, peer_addr, ETH_ALEN);
    6797             :         else
    6798           0 :                 os_memset(wpa_s->p2p_auth_invite, 0, ETH_ALEN);
    6799             : 
    6800          57 :         wpa_s->p2p_persistent_go_freq = freq;
    6801          57 :         wpa_s->p2p_go_ht40 = !!ht40;
    6802          57 :         wpa_s->p2p_go_vht = !!vht;
    6803          57 :         wpa_s->p2p_go_max_oper_chwidth = max_chwidth;
    6804          57 :         wpa_s->p2p_go_vht_center_freq2 = vht_center_freq2;
    6805          57 :         if (ssid->mode == WPAS_MODE_P2P_GO) {
    6806          31 :                 role = P2P_INVITE_ROLE_GO;
    6807          31 :                 if (peer_addr == NULL) {
    6808           0 :                         wpa_printf(MSG_DEBUG, "P2P: Missing peer "
    6809             :                                    "address in invitation command");
    6810           0 :                         return -1;
    6811             :                 }
    6812          31 :                 if (wpas_p2p_create_iface(wpa_s)) {
    6813           3 :                         if (wpas_p2p_add_group_interface(wpa_s,
    6814             :                                                          WPA_IF_P2P_GO) < 0) {
    6815           0 :                                 wpa_printf(MSG_ERROR, "P2P: Failed to "
    6816             :                                            "allocate a new interface for the "
    6817             :                                            "group");
    6818           0 :                                 return -1;
    6819             :                         }
    6820           3 :                         bssid = wpa_s->pending_interface_addr;
    6821          28 :                 } else if (wpa_s->p2p_mgmt)
    6822           1 :                         bssid = wpa_s->parent->own_addr;
    6823             :                 else
    6824          27 :                         bssid = wpa_s->own_addr;
    6825             :         } else {
    6826          26 :                 role = P2P_INVITE_ROLE_CLIENT;
    6827          26 :                 peer_addr = ssid->bssid;
    6828             :         }
    6829          57 :         wpa_s->pending_invite_ssid_id = ssid->id;
    6830             : 
    6831          57 :         size = P2P_MAX_PREF_CHANNELS;
    6832          57 :         res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
    6833             :                                    role == P2P_INVITE_ROLE_GO,
    6834             :                                    pref_freq_list, &size);
    6835          57 :         if (res)
    6836           0 :                 return res;
    6837             : 
    6838          57 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6839           0 :                 return -1;
    6840             : 
    6841          57 :         p2p_set_own_pref_freq_list(wpa_s->global->p2p, pref_freq_list, size);
    6842             : 
    6843          57 :         if (wpa_s->parent->conf->p2p_ignore_shared_freq &&
    6844           0 :             no_pref_freq_given && pref_freq > 0 &&
    6845           0 :             wpa_s->num_multichan_concurrent > 1 &&
    6846           0 :             wpas_p2p_num_unused_channels(wpa_s) > 0) {
    6847           0 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore own channel preference %d MHz for invitation due to p2p_ignore_shared_freq=1 configuration",
    6848             :                            pref_freq);
    6849           0 :                 pref_freq = 0;
    6850             :         }
    6851             : 
    6852             :         /*
    6853             :          * Stop any find/listen operations before invitation and possibly
    6854             :          * connection establishment.
    6855             :          */
    6856          57 :         wpas_p2p_stop_find_oper(wpa_s);
    6857             : 
    6858         114 :         return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
    6859          57 :                           ssid->ssid, ssid->ssid_len, force_freq, go_dev_addr,
    6860             :                           1, pref_freq, -1);
    6861             : }
    6862             : 
    6863             : 
    6864             : /* Invite to join an active group */
    6865          10 : int wpas_p2p_invite_group(struct wpa_supplicant *wpa_s, const char *ifname,
    6866             :                           const u8 *peer_addr, const u8 *go_dev_addr)
    6867             : {
    6868          10 :         struct wpa_global *global = wpa_s->global;
    6869             :         enum p2p_invite_role role;
    6870          10 :         u8 *bssid = NULL;
    6871             :         struct wpa_ssid *ssid;
    6872             :         int persistent;
    6873          10 :         int freq = 0, force_freq = 0, pref_freq = 0;
    6874             :         int res;
    6875             :         unsigned int pref_freq_list[P2P_MAX_PREF_CHANNELS], size;
    6876             : 
    6877          10 :         wpa_s->p2p_persistent_go_freq = 0;
    6878          10 :         wpa_s->p2p_go_ht40 = 0;
    6879          10 :         wpa_s->p2p_go_vht = 0;
    6880          10 :         wpa_s->p2p_go_vht_center_freq2 = 0;
    6881          10 :         wpa_s->p2p_go_max_oper_chwidth = 0;
    6882             : 
    6883          10 :         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    6884          10 :                 if (os_strcmp(wpa_s->ifname, ifname) == 0)
    6885          10 :                         break;
    6886             :         }
    6887          10 :         if (wpa_s == NULL) {
    6888           0 :                 wpa_printf(MSG_DEBUG, "P2P: Interface '%s' not found", ifname);
    6889           0 :                 return -1;
    6890             :         }
    6891             : 
    6892          10 :         ssid = wpa_s->current_ssid;
    6893          10 :         if (ssid == NULL) {
    6894           0 :                 wpa_printf(MSG_DEBUG, "P2P: No current SSID to use for "
    6895             :                            "invitation");
    6896           0 :                 return -1;
    6897             :         }
    6898             : 
    6899          10 :         wpa_s->global->p2p_invite_group = wpa_s;
    6900          12 :         persistent = ssid->p2p_persistent_group &&
    6901           4 :                 wpas_p2p_get_persistent(wpa_s->p2pdev, peer_addr,
    6902           2 :                                         ssid->ssid, ssid->ssid_len);
    6903             : 
    6904          10 :         if (ssid->mode == WPAS_MODE_P2P_GO) {
    6905           7 :                 role = P2P_INVITE_ROLE_ACTIVE_GO;
    6906           7 :                 bssid = wpa_s->own_addr;
    6907           7 :                 if (go_dev_addr == NULL)
    6908           7 :                         go_dev_addr = wpa_s->global->p2p_dev_addr;
    6909           7 :                 freq = ssid->frequency;
    6910             :         } else {
    6911           3 :                 role = P2P_INVITE_ROLE_CLIENT;
    6912           3 :                 if (wpa_s->wpa_state < WPA_ASSOCIATED) {
    6913           0 :                         wpa_printf(MSG_DEBUG, "P2P: Not associated - cannot "
    6914             :                                    "invite to current group");
    6915           0 :                         return -1;
    6916             :                 }
    6917           3 :                 bssid = wpa_s->bssid;
    6918           6 :                 if (go_dev_addr == NULL &&
    6919           3 :                     !is_zero_ether_addr(wpa_s->go_dev_addr))
    6920           3 :                         go_dev_addr = wpa_s->go_dev_addr;
    6921           3 :                 freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
    6922           0 :                         (int) wpa_s->assoc_freq;
    6923             :         }
    6924          10 :         wpa_s->p2pdev->pending_invite_ssid_id = -1;
    6925             : 
    6926          10 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    6927           0 :                 return -1;
    6928             : 
    6929          10 :         size = P2P_MAX_PREF_CHANNELS;
    6930          10 :         res = wpas_p2p_setup_freqs(wpa_s, freq, &force_freq, &pref_freq,
    6931             :                                    role == P2P_INVITE_ROLE_ACTIVE_GO,
    6932             :                                    pref_freq_list, &size);
    6933          10 :         if (res)
    6934           0 :                 return res;
    6935          10 :         wpas_p2p_set_own_freq_preference(wpa_s, force_freq);
    6936             : 
    6937          20 :         return p2p_invite(wpa_s->global->p2p, peer_addr, role, bssid,
    6938          10 :                           ssid->ssid, ssid->ssid_len, force_freq,
    6939             :                           go_dev_addr, persistent, pref_freq, -1);
    6940             : }
    6941             : 
    6942             : 
    6943        3654 : void wpas_p2p_completed(struct wpa_supplicant *wpa_s)
    6944             : {
    6945        3654 :         struct wpa_ssid *ssid = wpa_s->current_ssid;
    6946             :         u8 go_dev_addr[ETH_ALEN];
    6947             :         int persistent;
    6948             :         int freq;
    6949             :         u8 ip[3 * 4];
    6950             :         char ip_addr[100];
    6951             : 
    6952        3654 :         if (ssid == NULL || ssid->mode != WPAS_MODE_P2P_GROUP_FORMATION) {
    6953        3509 :                 eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    6954        3509 :                                      wpa_s->p2pdev, NULL);
    6955             :         }
    6956             : 
    6957        3654 :         if (!wpa_s->show_group_started || !ssid)
    6958        7033 :                 return;
    6959             : 
    6960         275 :         wpa_s->show_group_started = 0;
    6961         550 :         if (!wpa_s->p2p_go_group_formation_completed &&
    6962         275 :             wpa_s->global->p2p_group_formation == wpa_s) {
    6963         273 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    6964             :                         "P2P: Marking group formation completed on client on data connection");
    6965         273 :                 wpa_s->p2p_go_group_formation_completed = 1;
    6966         273 :                 wpa_s->global->p2p_group_formation = NULL;
    6967         273 :                 wpa_s->p2p_in_provisioning = 0;
    6968         273 :                 wpa_s->p2p_in_invitation = 0;
    6969             :         }
    6970             : 
    6971         275 :         os_memset(go_dev_addr, 0, ETH_ALEN);
    6972         275 :         if (ssid->bssid_set)
    6973         225 :                 os_memcpy(go_dev_addr, ssid->bssid, ETH_ALEN);
    6974         275 :         persistent = wpas_p2p_persistent_group(wpa_s, go_dev_addr, ssid->ssid,
    6975             :                                                ssid->ssid_len);
    6976         275 :         os_memcpy(wpa_s->go_dev_addr, go_dev_addr, ETH_ALEN);
    6977             : 
    6978         275 :         if (wpa_s->global->p2p_group_formation == wpa_s)
    6979           0 :                 wpa_s->global->p2p_group_formation = NULL;
    6980             : 
    6981         275 :         freq = wpa_s->current_bss ? wpa_s->current_bss->freq :
    6982           0 :                 (int) wpa_s->assoc_freq;
    6983             : 
    6984         275 :         ip_addr[0] = '\0';
    6985         275 :         if (wpa_sm_get_p2p_ip_addr(wpa_s->wpa, ip) == 0) {
    6986             :                 int res;
    6987             : 
    6988        1224 :                 res = os_snprintf(ip_addr, sizeof(ip_addr),
    6989             :                                   " ip_addr=%u.%u.%u.%u "
    6990             :                                   "ip_mask=%u.%u.%u.%u go_ip_addr=%u.%u.%u.%u",
    6991         408 :                                   ip[0], ip[1], ip[2], ip[3],
    6992         408 :                                   ip[4], ip[5], ip[6], ip[7],
    6993         408 :                                   ip[8], ip[9], ip[10], ip[11]);
    6994         102 :                 if (os_snprintf_error(sizeof(ip_addr), res))
    6995           0 :                         ip_addr[0] = '\0';
    6996             :         }
    6997             : 
    6998         550 :         wpas_p2p_group_started(wpa_s, 0, ssid, freq,
    6999         550 :                                ssid->passphrase == NULL && ssid->psk_set ?
    7000             :                                ssid->psk : NULL,
    7001         275 :                                ssid->passphrase, go_dev_addr, persistent,
    7002             :                                ip_addr);
    7003             : 
    7004         275 :         if (persistent)
    7005         124 :                 wpas_p2p_store_persistent_group(wpa_s->p2pdev,
    7006             :                                                 ssid, go_dev_addr);
    7007             : 
    7008         275 :         wpas_notify_p2p_group_started(wpa_s, ssid, persistent, 1);
    7009             : }
    7010             : 
    7011             : 
    7012           6 : int wpas_p2p_presence_req(struct wpa_supplicant *wpa_s, u32 duration1,
    7013             :                           u32 interval1, u32 duration2, u32 interval2)
    7014             : {
    7015             :         int ret;
    7016             : 
    7017           6 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7018           1 :                 return -1;
    7019             : 
    7020          10 :         if (wpa_s->wpa_state < WPA_ASSOCIATED ||
    7021          10 :             wpa_s->current_ssid == NULL ||
    7022           5 :             wpa_s->current_ssid->mode != WPAS_MODE_INFRA)
    7023           0 :                 return -1;
    7024             : 
    7025          10 :         ret = p2p_presence_req(wpa_s->global->p2p, wpa_s->bssid,
    7026           5 :                                wpa_s->own_addr, wpa_s->assoc_freq,
    7027             :                                duration1, interval1, duration2, interval2);
    7028           5 :         if (ret == 0)
    7029           5 :                 wpa_s->waiting_presence_resp = 1;
    7030             : 
    7031           5 :         return ret;
    7032             : }
    7033             : 
    7034             : 
    7035          37 : int wpas_p2p_ext_listen(struct wpa_supplicant *wpa_s, unsigned int period,
    7036             :                         unsigned int interval)
    7037             : {
    7038          37 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7039           1 :                 return -1;
    7040             : 
    7041          36 :         return p2p_ext_listen(wpa_s->global->p2p, period, interval);
    7042             : }
    7043             : 
    7044             : 
    7045           0 : static int wpas_p2p_is_client(struct wpa_supplicant *wpa_s)
    7046             : {
    7047           0 :         if (wpa_s->current_ssid == NULL) {
    7048             :                 /*
    7049             :                  * current_ssid can be cleared when P2P client interface gets
    7050             :                  * disconnected, so assume this interface was used as P2P
    7051             :                  * client.
    7052             :                  */
    7053           0 :                 return 1;
    7054             :         }
    7055           0 :         return wpa_s->current_ssid->p2p_group &&
    7056           0 :                 wpa_s->current_ssid->mode == WPAS_MODE_INFRA;
    7057             : }
    7058             : 
    7059             : 
    7060           2 : static void wpas_p2p_group_idle_timeout(void *eloop_ctx, void *timeout_ctx)
    7061             : {
    7062           2 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    7063             : 
    7064           2 :         if (wpa_s->conf->p2p_group_idle == 0 && !wpas_p2p_is_client(wpa_s)) {
    7065           0 :                 wpa_printf(MSG_DEBUG, "P2P: Ignore group idle timeout - "
    7066             :                            "disabled");
    7067           2 :                 return;
    7068             :         }
    7069             : 
    7070           2 :         wpa_printf(MSG_DEBUG, "P2P: Group idle timeout reached - terminate "
    7071             :                    "group");
    7072           2 :         wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_IDLE_TIMEOUT);
    7073             : }
    7074             : 
    7075             : 
    7076        6179 : static void wpas_p2p_set_group_idle_timeout(struct wpa_supplicant *wpa_s)
    7077             : {
    7078             :         int timeout;
    7079             : 
    7080        6179 :         if (eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
    7081           0 :                 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
    7082             : 
    7083        6179 :         if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
    7084        4979 :                 return;
    7085             : 
    7086        1200 :         timeout = wpa_s->conf->p2p_group_idle;
    7087        1200 :         if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA &&
    7088           2 :             (timeout == 0 || timeout > P2P_MAX_CLIENT_IDLE))
    7089         521 :             timeout = P2P_MAX_CLIENT_IDLE;
    7090             : 
    7091        1200 :         if (timeout == 0)
    7092         670 :                 return;
    7093             : 
    7094         530 :         if (timeout < 0) {
    7095           0 :                 if (wpa_s->current_ssid->mode == WPAS_MODE_INFRA)
    7096           0 :                         timeout = 0; /* special client mode no-timeout */
    7097             :                 else
    7098           0 :                         return;
    7099             :         }
    7100             : 
    7101         530 :         if (wpa_s->p2p_in_provisioning) {
    7102             :                 /*
    7103             :                  * Use the normal group formation timeout during the
    7104             :                  * provisioning phase to avoid terminating this process too
    7105             :                  * early due to group idle timeout.
    7106             :                  */
    7107         246 :                 wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
    7108             :                            "during provisioning");
    7109         246 :                 return;
    7110             :         }
    7111             : 
    7112         284 :         if (wpa_s->show_group_started) {
    7113             :                 /*
    7114             :                  * Use the normal group formation timeout between the end of
    7115             :                  * the provisioning phase and completion of 4-way handshake to
    7116             :                  * avoid terminating this process too early due to group idle
    7117             :                  * timeout.
    7118             :                  */
    7119           4 :                 wpa_printf(MSG_DEBUG, "P2P: Do not use P2P group idle timeout "
    7120             :                            "while waiting for initial 4-way handshake to "
    7121             :                            "complete");
    7122           4 :                 return;
    7123             :         }
    7124             : 
    7125         280 :         wpa_printf(MSG_DEBUG, "P2P: Set P2P group idle timeout to %u seconds",
    7126             :                    timeout);
    7127         280 :         eloop_register_timeout(timeout, 0, wpas_p2p_group_idle_timeout,
    7128             :                                wpa_s, NULL);
    7129             : }
    7130             : 
    7131             : 
    7132             : /* Returns 1 if the interface was removed */
    7133        4945 : int wpas_p2p_deauth_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
    7134             :                           u16 reason_code, const u8 *ie, size_t ie_len,
    7135             :                           int locally_generated)
    7136             : {
    7137        4945 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7138          15 :                 return 0;
    7139             : 
    7140        4930 :         if (!locally_generated)
    7141         524 :                 p2p_deauth_notif(wpa_s->global->p2p, bssid, reason_code, ie,
    7142             :                                  ie_len);
    7143             : 
    7144        5146 :         if (reason_code == WLAN_REASON_DEAUTH_LEAVING && !locally_generated &&
    7145         379 :             wpa_s->current_ssid &&
    7146         314 :             wpa_s->current_ssid->p2p_group &&
    7147         151 :             wpa_s->current_ssid->mode == WPAS_MODE_INFRA) {
    7148         151 :                 wpa_printf(MSG_DEBUG, "P2P: GO indicated that the P2P Group "
    7149             :                            "session is ending");
    7150         151 :                 if (wpas_p2p_group_delete(wpa_s,
    7151             :                                           P2P_GROUP_REMOVAL_GO_ENDING_SESSION)
    7152             :                     > 0)
    7153          22 :                         return 1;
    7154             :         }
    7155             : 
    7156        4908 :         return 0;
    7157             : }
    7158             : 
    7159             : 
    7160           9 : void wpas_p2p_disassoc_notif(struct wpa_supplicant *wpa_s, const u8 *bssid,
    7161             :                              u16 reason_code, const u8 *ie, size_t ie_len,
    7162             :                              int locally_generated)
    7163             : {
    7164           9 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7165           9 :                 return;
    7166             : 
    7167           9 :         if (!locally_generated)
    7168           8 :                 p2p_disassoc_notif(wpa_s->global->p2p, bssid, reason_code, ie,
    7169             :                                    ie_len);
    7170             : }
    7171             : 
    7172             : 
    7173        7124 : void wpas_p2p_update_config(struct wpa_supplicant *wpa_s)
    7174             : {
    7175        7124 :         struct p2p_data *p2p = wpa_s->global->p2p;
    7176             : 
    7177        7124 :         if (p2p == NULL)
    7178           0 :                 return;
    7179             : 
    7180        7124 :         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE))
    7181           0 :                 return;
    7182             : 
    7183        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_NAME)
    7184          31 :                 p2p_set_dev_name(p2p, wpa_s->conf->device_name);
    7185             : 
    7186        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_DEVICE_TYPE)
    7187           3 :                 p2p_set_pri_dev_type(p2p, wpa_s->conf->device_type);
    7188             : 
    7189       14248 :         if (wpa_s->wps &&
    7190        7124 :             (wpa_s->conf->changed_parameters & CFG_CHANGED_CONFIG_METHODS))
    7191          11 :                 p2p_set_config_methods(p2p, wpa_s->wps->config_methods);
    7192             : 
    7193        7124 :         if (wpa_s->wps && (wpa_s->conf->changed_parameters & CFG_CHANGED_UUID))
    7194           3 :                 p2p_set_uuid(p2p, wpa_s->wps->uuid);
    7195             : 
    7196        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_WPS_STRING) {
    7197          16 :                 p2p_set_manufacturer(p2p, wpa_s->conf->manufacturer);
    7198          16 :                 p2p_set_model_name(p2p, wpa_s->conf->model_name);
    7199          16 :                 p2p_set_model_number(p2p, wpa_s->conf->model_number);
    7200          16 :                 p2p_set_serial_number(p2p, wpa_s->conf->serial_number);
    7201             :         }
    7202             : 
    7203        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_SEC_DEVICE_TYPE)
    7204          22 :                 p2p_set_sec_dev_types(p2p,
    7205          11 :                                       (void *) wpa_s->conf->sec_device_type,
    7206          11 :                                       wpa_s->conf->num_sec_device_types);
    7207             : 
    7208        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_VENDOR_EXTENSION) {
    7209             :                 int i;
    7210           4 :                 p2p_remove_wps_vendor_extensions(p2p);
    7211          44 :                 for (i = 0; i < MAX_WPS_VENDOR_EXT; i++) {
    7212          40 :                         if (wpa_s->conf->wps_vendor_ext[i] == NULL)
    7213          39 :                                 continue;
    7214           1 :                         p2p_add_wps_vendor_extension(
    7215           1 :                                 p2p, wpa_s->conf->wps_vendor_ext[i]);
    7216             :                 }
    7217             :         }
    7218             : 
    7219        7132 :         if ((wpa_s->conf->changed_parameters & CFG_CHANGED_COUNTRY) &&
    7220          15 :             wpa_s->conf->country[0] && wpa_s->conf->country[1]) {
    7221             :                 char country[3];
    7222           7 :                 country[0] = wpa_s->conf->country[0];
    7223           7 :                 country[1] = wpa_s->conf->country[1];
    7224           7 :                 country[2] = 0x04;
    7225           7 :                 p2p_set_country(p2p, country);
    7226             :         }
    7227             : 
    7228        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_SSID_POSTFIX) {
    7229           5 :                 p2p_set_ssid_postfix(p2p, (u8 *) wpa_s->conf->p2p_ssid_postfix,
    7230           3 :                                      wpa_s->conf->p2p_ssid_postfix ?
    7231           2 :                                      os_strlen(wpa_s->conf->p2p_ssid_postfix) :
    7232             :                                      0);
    7233             :         }
    7234             : 
    7235        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_INTRA_BSS)
    7236           2 :                 p2p_set_intra_bss_dist(p2p, wpa_s->conf->p2p_intra_bss);
    7237             : 
    7238        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_LISTEN_CHANNEL) {
    7239             :                 u8 reg_class, channel;
    7240             :                 int ret;
    7241             :                 unsigned int r;
    7242             :                 u8 channel_forced;
    7243             : 
    7244          18 :                 if (wpa_s->conf->p2p_listen_reg_class &&
    7245           8 :                     wpa_s->conf->p2p_listen_channel) {
    7246           6 :                         reg_class = wpa_s->conf->p2p_listen_reg_class;
    7247           6 :                         channel = wpa_s->conf->p2p_listen_channel;
    7248           6 :                         channel_forced = 1;
    7249             :                 } else {
    7250           4 :                         reg_class = 81;
    7251             :                         /*
    7252             :                          * Pick one of the social channels randomly as the
    7253             :                          * listen channel.
    7254             :                          */
    7255           4 :                         if (os_get_random((u8 *) &r, sizeof(r)) < 0)
    7256           0 :                                 channel = 1;
    7257             :                         else
    7258           4 :                                 channel = 1 + (r % 3) * 5;
    7259           4 :                         channel_forced = 0;
    7260             :                 }
    7261          10 :                 ret = p2p_set_listen_channel(p2p, reg_class, channel,
    7262             :                                              channel_forced);
    7263          10 :                 if (ret)
    7264           0 :                         wpa_printf(MSG_ERROR, "P2P: Own listen channel update "
    7265             :                                    "failed: %d", ret);
    7266             :         }
    7267        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_OPER_CHANNEL) {
    7268             :                 u8 op_reg_class, op_channel, cfg_op_channel;
    7269           8 :                 int ret = 0;
    7270             :                 unsigned int r;
    7271          10 :                 if (wpa_s->conf->p2p_oper_reg_class &&
    7272           2 :                     wpa_s->conf->p2p_oper_channel) {
    7273           1 :                         op_reg_class = wpa_s->conf->p2p_oper_reg_class;
    7274           1 :                         op_channel = wpa_s->conf->p2p_oper_channel;
    7275           1 :                         cfg_op_channel = 1;
    7276             :                 } else {
    7277           7 :                         op_reg_class = 81;
    7278             :                         /*
    7279             :                          * Use random operation channel from (1, 6, 11)
    7280             :                          *if no other preference is indicated.
    7281             :                          */
    7282           7 :                         if (os_get_random((u8 *) &r, sizeof(r)) < 0)
    7283           0 :                                 op_channel = 1;
    7284             :                         else
    7285           7 :                                 op_channel = 1 + (r % 3) * 5;
    7286           7 :                         cfg_op_channel = 0;
    7287             :                 }
    7288           8 :                 ret = p2p_set_oper_channel(p2p, op_reg_class, op_channel,
    7289             :                                            cfg_op_channel);
    7290           8 :                 if (ret)
    7291           0 :                         wpa_printf(MSG_ERROR, "P2P: Own oper channel update "
    7292             :                                    "failed: %d", ret);
    7293             :         }
    7294             : 
    7295        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PREF_CHAN) {
    7296          20 :                 if (p2p_set_pref_chan(p2p, wpa_s->conf->num_p2p_pref_chan,
    7297          20 :                                       wpa_s->conf->p2p_pref_chan) < 0) {
    7298           0 :                         wpa_printf(MSG_ERROR, "P2P: Preferred channel list "
    7299             :                                    "update failed");
    7300             :                 }
    7301             : 
    7302          20 :                 if (p2p_set_no_go_freq(p2p, &wpa_s->conf->p2p_no_go_freq) < 0) {
    7303           0 :                         wpa_printf(MSG_ERROR, "P2P: No GO channel list "
    7304             :                                    "update failed");
    7305             :                 }
    7306             :         }
    7307             : 
    7308        7124 :         if (wpa_s->conf->changed_parameters & CFG_CHANGED_P2P_PASSPHRASE_LEN)
    7309           3 :                 p2p_set_passphrase_len(p2p, wpa_s->conf->p2p_passphrase_len);
    7310             : }
    7311             : 
    7312             : 
    7313           2 : int wpas_p2p_set_noa(struct wpa_supplicant *wpa_s, u8 count, int start,
    7314             :                      int duration)
    7315             : {
    7316           2 :         if (!wpa_s->ap_iface)
    7317           2 :                 return -1;
    7318           0 :         return hostapd_p2p_set_noa(wpa_s->ap_iface->bss[0], count, start,
    7319             :                                    duration);
    7320             : }
    7321             : 
    7322             : 
    7323           6 : int wpas_p2p_set_cross_connect(struct wpa_supplicant *wpa_s, int enabled)
    7324             : {
    7325           6 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7326           0 :                 return -1;
    7327             : 
    7328           6 :         wpa_s->global->cross_connection = enabled;
    7329           6 :         p2p_set_cross_connect(wpa_s->global->p2p, enabled);
    7330             : 
    7331           6 :         if (!enabled) {
    7332             :                 struct wpa_supplicant *iface;
    7333             : 
    7334           9 :                 for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
    7335             :                 {
    7336           5 :                         if (iface->cross_connect_enabled == 0)
    7337           4 :                                 continue;
    7338             : 
    7339           1 :                         iface->cross_connect_enabled = 0;
    7340           1 :                         iface->cross_connect_in_use = 0;
    7341           1 :                         wpa_msg_global(iface->p2pdev, MSG_INFO,
    7342             :                                        P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
    7343           1 :                                        iface->ifname,
    7344           1 :                                        iface->cross_connect_uplink);
    7345             :                 }
    7346             :         }
    7347             : 
    7348           6 :         return 0;
    7349             : }
    7350             : 
    7351             : 
    7352        3133 : static void wpas_p2p_enable_cross_connect(struct wpa_supplicant *uplink)
    7353             : {
    7354             :         struct wpa_supplicant *iface;
    7355             : 
    7356        3133 :         if (!uplink->global->cross_connection)
    7357        6265 :                 return;
    7358             : 
    7359           2 :         for (iface = uplink->global->ifaces; iface; iface = iface->next) {
    7360           1 :                 if (!iface->cross_connect_enabled)
    7361           1 :                         continue;
    7362           0 :                 if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
    7363             :                     0)
    7364           0 :                         continue;
    7365           0 :                 if (iface->ap_iface == NULL)
    7366           0 :                         continue;
    7367           0 :                 if (iface->cross_connect_in_use)
    7368           0 :                         continue;
    7369             : 
    7370           0 :                 iface->cross_connect_in_use = 1;
    7371           0 :                 wpa_msg_global(iface->p2pdev, MSG_INFO,
    7372             :                                P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
    7373           0 :                                iface->ifname, iface->cross_connect_uplink);
    7374             :         }
    7375             : }
    7376             : 
    7377             : 
    7378        6233 : static void wpas_p2p_disable_cross_connect(struct wpa_supplicant *uplink)
    7379             : {
    7380             :         struct wpa_supplicant *iface;
    7381             : 
    7382       16938 :         for (iface = uplink->global->ifaces; iface; iface = iface->next) {
    7383       10705 :                 if (!iface->cross_connect_enabled)
    7384       10705 :                         continue;
    7385           0 :                 if (os_strcmp(uplink->ifname, iface->cross_connect_uplink) !=
    7386             :                     0)
    7387           0 :                         continue;
    7388           0 :                 if (!iface->cross_connect_in_use)
    7389           0 :                         continue;
    7390             : 
    7391           0 :                 wpa_msg_global(iface->p2pdev, MSG_INFO,
    7392             :                                P2P_EVENT_CROSS_CONNECT_DISABLE "%s %s",
    7393           0 :                                iface->ifname, iface->cross_connect_uplink);
    7394           0 :                 iface->cross_connect_in_use = 0;
    7395             :         }
    7396        6233 : }
    7397             : 
    7398             : 
    7399        3766 : void wpas_p2p_notif_connected(struct wpa_supplicant *wpa_s)
    7400             : {
    7401        7099 :         if (wpa_s->ap_iface || wpa_s->current_ssid == NULL ||
    7402        6467 :             wpa_s->current_ssid->mode != WPAS_MODE_INFRA ||
    7403        3134 :             wpa_s->cross_connect_disallowed)
    7404         633 :                 wpas_p2p_disable_cross_connect(wpa_s);
    7405             :         else
    7406        3133 :                 wpas_p2p_enable_cross_connect(wpa_s);
    7407        7099 :         if (!wpa_s->ap_iface &&
    7408        3333 :             eloop_cancel_timeout(wpas_p2p_group_idle_timeout, wpa_s, NULL) > 0)
    7409           2 :                 wpa_printf(MSG_DEBUG, "P2P: Cancelled P2P group idle timeout");
    7410        3766 : }
    7411             : 
    7412             : 
    7413        5600 : void wpas_p2p_notif_disconnected(struct wpa_supplicant *wpa_s)
    7414             : {
    7415        5600 :         wpas_p2p_disable_cross_connect(wpa_s);
    7416       10699 :         if (!wpa_s->ap_iface &&
    7417        5099 :             !eloop_is_timeout_registered(wpas_p2p_group_idle_timeout,
    7418             :                                          wpa_s, NULL))
    7419        5099 :                 wpas_p2p_set_group_idle_timeout(wpa_s);
    7420        5600 : }
    7421             : 
    7422             : 
    7423         392 : static void wpas_p2p_cross_connect_setup(struct wpa_supplicant *wpa_s)
    7424             : {
    7425             :         struct wpa_supplicant *iface;
    7426             : 
    7427         392 :         if (!wpa_s->global->cross_connection)
    7428         782 :                 return;
    7429             : 
    7430           4 :         for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
    7431           4 :                 if (iface == wpa_s)
    7432           2 :                         continue;
    7433           2 :                 if (iface->drv_flags &
    7434             :                     WPA_DRIVER_FLAGS_P2P_DEDICATED_INTERFACE)
    7435           0 :                         continue;
    7436           4 :                 if ((iface->drv_flags & WPA_DRIVER_FLAGS_P2P_CAPABLE) &&
    7437           2 :                     iface != wpa_s->parent)
    7438           0 :                         continue;
    7439             : 
    7440           2 :                 wpa_s->cross_connect_enabled = 1;
    7441           2 :                 os_strlcpy(wpa_s->cross_connect_uplink, iface->ifname,
    7442             :                            sizeof(wpa_s->cross_connect_uplink));
    7443           2 :                 wpa_printf(MSG_DEBUG, "P2P: Enable cross connection from "
    7444             :                            "%s to %s whenever uplink is available",
    7445           2 :                            wpa_s->ifname, wpa_s->cross_connect_uplink);
    7446             : 
    7447           4 :                 if (iface->ap_iface || iface->current_ssid == NULL ||
    7448           4 :                     iface->current_ssid->mode != WPAS_MODE_INFRA ||
    7449           4 :                     iface->cross_connect_disallowed ||
    7450           2 :                     iface->wpa_state != WPA_COMPLETED)
    7451             :                         break;
    7452             : 
    7453           2 :                 wpa_s->cross_connect_in_use = 1;
    7454           2 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    7455             :                                P2P_EVENT_CROSS_CONNECT_ENABLE "%s %s",
    7456           2 :                                wpa_s->ifname, wpa_s->cross_connect_uplink);
    7457           2 :                 break;
    7458             :         }
    7459             : }
    7460             : 
    7461             : 
    7462           7 : int wpas_p2p_notif_pbc_overlap(struct wpa_supplicant *wpa_s)
    7463             : {
    7464          13 :         if (wpa_s->p2p_group_interface != P2P_GROUP_INTERFACE_CLIENT &&
    7465           6 :             !wpa_s->p2p_in_provisioning)
    7466           4 :                 return 0; /* not P2P client operation */
    7467             : 
    7468           3 :         wpa_printf(MSG_DEBUG, "P2P: Terminate connection due to WPS PBC "
    7469             :                    "session overlap");
    7470           3 :         if (wpa_s != wpa_s->p2pdev)
    7471           1 :                 wpa_msg_ctrl(wpa_s->p2pdev, MSG_INFO, WPS_EVENT_OVERLAP);
    7472           3 :         wpas_p2p_group_formation_failed(wpa_s, 0);
    7473           3 :         return 1;
    7474             : }
    7475             : 
    7476             : 
    7477           7 : void wpas_p2p_pbc_overlap_cb(void *eloop_ctx, void *timeout_ctx)
    7478             : {
    7479           7 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    7480           7 :         wpas_p2p_notif_pbc_overlap(wpa_s);
    7481           7 : }
    7482             : 
    7483             : 
    7484       49542 : void wpas_p2p_update_channel_list(struct wpa_supplicant *wpa_s,
    7485             :                                   enum wpas_p2p_channel_update_trig trig)
    7486             : {
    7487             :         struct p2p_channels chan, cli_chan;
    7488       49542 :         struct wpa_used_freq_data *freqs = NULL;
    7489       49542 :         unsigned int num = wpa_s->num_multichan_concurrent;
    7490             : 
    7491       49542 :         if (wpa_s->global == NULL || wpa_s->global->p2p == NULL)
    7492         480 :                 return;
    7493             : 
    7494       49304 :         freqs = os_calloc(num, sizeof(struct wpa_used_freq_data));
    7495       49304 :         if (!freqs)
    7496           4 :                 return;
    7497             : 
    7498       49300 :         num = get_shared_radio_freqs_data(wpa_s, freqs, num);
    7499             : 
    7500       49300 :         os_memset(&chan, 0, sizeof(chan));
    7501       49300 :         os_memset(&cli_chan, 0, sizeof(cli_chan));
    7502       49300 :         if (wpas_p2p_setup_channels(wpa_s, &chan, &cli_chan)) {
    7503           0 :                 wpa_printf(MSG_ERROR, "P2P: Failed to update supported "
    7504             :                            "channel list");
    7505           0 :                 return;
    7506             :         }
    7507             : 
    7508       49300 :         p2p_update_channel_list(wpa_s->global->p2p, &chan, &cli_chan);
    7509             : 
    7510       49300 :         wpas_p2p_optimize_listen_channel(wpa_s, freqs, num);
    7511             : 
    7512             :         /*
    7513             :          * The used frequencies map changed, so it is possible that a GO is
    7514             :          * using a channel that is no longer valid for P2P use. It is also
    7515             :          * possible that due to policy consideration, it would be preferable to
    7516             :          * move it to a frequency already used by other station interfaces.
    7517             :          */
    7518       49300 :         wpas_p2p_consider_moving_gos(wpa_s, freqs, num, trig);
    7519             : 
    7520       49300 :         os_free(freqs);
    7521             : }
    7522             : 
    7523             : 
    7524           0 : static void wpas_p2p_scan_res_ignore(struct wpa_supplicant *wpa_s,
    7525             :                                      struct wpa_scan_results *scan_res)
    7526             : {
    7527           0 :         wpa_printf(MSG_DEBUG, "P2P: Ignore scan results");
    7528           0 : }
    7529             : 
    7530             : 
    7531        6076 : int wpas_p2p_cancel(struct wpa_supplicant *wpa_s)
    7532             : {
    7533        6076 :         struct wpa_global *global = wpa_s->global;
    7534        6076 :         int found = 0;
    7535             :         const u8 *peer;
    7536             : 
    7537        6076 :         if (global->p2p == NULL)
    7538           0 :                 return -1;
    7539             : 
    7540        6076 :         wpa_printf(MSG_DEBUG, "P2P: Request to cancel group formation");
    7541             : 
    7542        6078 :         if (wpa_s->pending_interface_name[0] &&
    7543           2 :             !is_zero_ether_addr(wpa_s->pending_interface_addr))
    7544           2 :                 found = 1;
    7545             : 
    7546        6076 :         peer = p2p_get_go_neg_peer(global->p2p);
    7547        6076 :         if (peer) {
    7548          54 :                 wpa_printf(MSG_DEBUG, "P2P: Unauthorize pending GO Neg peer "
    7549          54 :                            MACSTR, MAC2STR(peer));
    7550           9 :                 p2p_unauthorize(global->p2p, peer);
    7551           9 :                 found = 1;
    7552             :         }
    7553             : 
    7554        6076 :         if (wpa_s->scan_res_handler == wpas_p2p_scan_res_join) {
    7555           0 :                 wpa_printf(MSG_DEBUG, "P2P: Stop pending scan for join");
    7556           0 :                 wpa_s->scan_res_handler = wpas_p2p_scan_res_ignore;
    7557           0 :                 found = 1;
    7558             :         }
    7559             : 
    7560        6076 :         if (wpa_s->pending_pd_before_join) {
    7561           0 :                 wpa_printf(MSG_DEBUG, "P2P: Stop pending PD before join");
    7562           0 :                 wpa_s->pending_pd_before_join = 0;
    7563           0 :                 found = 1;
    7564             :         }
    7565             : 
    7566        6076 :         wpas_p2p_stop_find(wpa_s);
    7567             : 
    7568       12150 :         for (wpa_s = global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    7569        6086 :                 if (wpa_s == global->p2p_group_formation &&
    7570           8 :                     (wpa_s->p2p_in_provisioning ||
    7571           2 :                      wpa_s->parent->pending_interface_type ==
    7572             :                      WPA_IF_P2P_CLIENT)) {
    7573           4 :                         wpa_printf(MSG_DEBUG, "P2P: Interface %s in group "
    7574             :                                    "formation found - cancelling",
    7575           4 :                                    wpa_s->ifname);
    7576           4 :                         found = 1;
    7577           4 :                         eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    7578           4 :                                              wpa_s->p2pdev, NULL);
    7579           4 :                         if (wpa_s->p2p_in_provisioning) {
    7580           4 :                                 wpas_group_formation_completed(wpa_s, 0, 0);
    7581           4 :                                 break;
    7582             :                         }
    7583           0 :                         wpas_p2p_group_delete(wpa_s,
    7584             :                                               P2P_GROUP_REMOVAL_REQUESTED);
    7585           0 :                         break;
    7586        6076 :                 } else if (wpa_s->p2p_in_invitation) {
    7587           2 :                         wpa_printf(MSG_DEBUG, "P2P: Interface %s in invitation found - cancelling",
    7588           2 :                                    wpa_s->ifname);
    7589           2 :                         found = 1;
    7590           2 :                         wpas_p2p_group_formation_failed(wpa_s, 0);
    7591           2 :                         break;
    7592             :                 }
    7593             :         }
    7594             : 
    7595        6076 :         if (!found) {
    7596        6062 :                 wpa_printf(MSG_DEBUG, "P2P: No ongoing group formation found");
    7597        6062 :                 return -1;
    7598             :         }
    7599             : 
    7600          14 :         return 0;
    7601             : }
    7602             : 
    7603             : 
    7604           6 : void wpas_p2p_interface_unavailable(struct wpa_supplicant *wpa_s)
    7605             : {
    7606           6 :         if (wpa_s->current_ssid == NULL || !wpa_s->current_ssid->p2p_group)
    7607           6 :                 return;
    7608             : 
    7609           6 :         wpa_printf(MSG_DEBUG, "P2P: Remove group due to driver resource not "
    7610             :                    "being available anymore");
    7611           6 :         wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_UNAVAILABLE);
    7612             : }
    7613             : 
    7614             : 
    7615           0 : void wpas_p2p_update_best_channels(struct wpa_supplicant *wpa_s,
    7616             :                                    int freq_24, int freq_5, int freq_overall)
    7617             : {
    7618           0 :         struct p2p_data *p2p = wpa_s->global->p2p;
    7619           0 :         if (p2p == NULL)
    7620           0 :                 return;
    7621           0 :         p2p_set_best_channels(p2p, freq_24, freq_5, freq_overall);
    7622             : }
    7623             : 
    7624             : 
    7625           3 : int wpas_p2p_unauthorize(struct wpa_supplicant *wpa_s, const char *addr)
    7626             : {
    7627             :         u8 peer[ETH_ALEN];
    7628           3 :         struct p2p_data *p2p = wpa_s->global->p2p;
    7629             : 
    7630           3 :         if (p2p == NULL)
    7631           0 :                 return -1;
    7632             : 
    7633           3 :         if (hwaddr_aton(addr, peer))
    7634           1 :                 return -1;
    7635             : 
    7636           2 :         return p2p_unauthorize(p2p, peer);
    7637             : }
    7638             : 
    7639             : 
    7640             : /**
    7641             :  * wpas_p2p_disconnect - Disconnect from a P2P Group
    7642             :  * @wpa_s: Pointer to wpa_supplicant data
    7643             :  * Returns: 0 on success, -1 on failure
    7644             :  *
    7645             :  * This can be used to disconnect from a group in which the local end is a P2P
    7646             :  * Client or to end a P2P Group in case the local end is the Group Owner. If a
    7647             :  * virtual network interface was created for this group, that interface will be
    7648             :  * removed. Otherwise, only the configured P2P group network will be removed
    7649             :  * from the interface.
    7650             :  */
    7651         527 : int wpas_p2p_disconnect(struct wpa_supplicant *wpa_s)
    7652             : {
    7653             : 
    7654         527 :         if (wpa_s == NULL)
    7655           7 :                 return -1;
    7656             : 
    7657        1040 :         return wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_REQUESTED) < 0 ?
    7658         520 :                 -1 : 0;
    7659             : }
    7660             : 
    7661             : 
    7662       13431 : int wpas_p2p_in_progress(struct wpa_supplicant *wpa_s)
    7663             : {
    7664             :         int ret;
    7665             : 
    7666       13431 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    7667          20 :                 return 0;
    7668             : 
    7669       13411 :         ret = p2p_in_progress(wpa_s->global->p2p);
    7670       13411 :         if (ret == 0) {
    7671             :                 /*
    7672             :                  * Check whether there is an ongoing WPS provisioning step (or
    7673             :                  * other parts of group formation) on another interface since
    7674             :                  * p2p_in_progress() does not report this to avoid issues for
    7675             :                  * scans during such provisioning step.
    7676             :                  */
    7677       16293 :                 if (wpa_s->global->p2p_group_formation &&
    7678        2884 :                     wpa_s->global->p2p_group_formation != wpa_s) {
    7679        2094 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Another interface (%s) "
    7680             :                                 "in group formation",
    7681             :                                 wpa_s->global->p2p_group_formation->ifname);
    7682        2094 :                         ret = 1;
    7683             :                 }
    7684             :         }
    7685             : 
    7686       13411 :         if (!ret && wpa_s->global->p2p_go_wait_client.sec) {
    7687             :                 struct os_reltime now;
    7688        4185 :                 os_get_reltime(&now);
    7689        4185 :                 if (os_reltime_expired(&now, &wpa_s->global->p2p_go_wait_client,
    7690             :                                        P2P_MAX_INITIAL_CONN_WAIT_GO)) {
    7691             :                         /* Wait for the first client has expired */
    7692           1 :                         wpa_s->global->p2p_go_wait_client.sec = 0;
    7693             :                 } else {
    7694        4184 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Waiting for initial client connection during group formation");
    7695        4184 :                         ret = 1;
    7696             :                 }
    7697             :         }
    7698             : 
    7699       13411 :         return ret;
    7700             : }
    7701             : 
    7702             : 
    7703        5385 : void wpas_p2p_network_removed(struct wpa_supplicant *wpa_s,
    7704             :                               struct wpa_ssid *ssid)
    7705             : {
    7706        5391 :         if (wpa_s->p2p_in_provisioning && ssid->p2p_group &&
    7707           6 :             eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    7708           6 :                                  wpa_s->p2pdev, NULL) > 0) {
    7709             :                 /**
    7710             :                  * Remove the network by scheduling the group formation
    7711             :                  * timeout to happen immediately. The teardown code
    7712             :                  * needs to be scheduled to run asynch later so that we
    7713             :                  * don't delete data from under ourselves unexpectedly.
    7714             :                  * Calling wpas_p2p_group_formation_timeout directly
    7715             :                  * causes a series of crashes in WPS failure scenarios.
    7716             :                  */
    7717           0 :                 wpa_printf(MSG_DEBUG, "P2P: Canceled group formation due to "
    7718             :                            "P2P group network getting removed");
    7719           0 :                 eloop_register_timeout(0, 0, wpas_p2p_group_formation_timeout,
    7720           0 :                                        wpa_s->p2pdev, NULL);
    7721             :         }
    7722        5385 : }
    7723             : 
    7724             : 
    7725        1119 : struct wpa_ssid * wpas_p2p_get_persistent(struct wpa_supplicant *wpa_s,
    7726             :                                           const u8 *addr, const u8 *ssid,
    7727             :                                           size_t ssid_len)
    7728             : {
    7729             :         struct wpa_ssid *s;
    7730             :         size_t i;
    7731             : 
    7732        1309 :         for (s = wpa_s->conf->ssid; s; s = s->next) {
    7733         412 :                 if (s->disabled != 2)
    7734         162 :                         continue;
    7735         338 :                 if (ssid &&
    7736         176 :                     (ssid_len != s->ssid_len ||
    7737          88 :                      os_memcmp(ssid, s->ssid, ssid_len) != 0))
    7738           0 :                         continue;
    7739         250 :                 if (addr == NULL) {
    7740          79 :                         if (s->mode == WPAS_MODE_P2P_GO)
    7741          79 :                                 return s;
    7742           0 :                         continue;
    7743             :                 }
    7744         171 :                 if (os_memcmp(s->bssid, addr, ETH_ALEN) == 0)
    7745          70 :                         return s; /* peer is GO in the persistent group */
    7746         101 :                 if (s->mode != WPAS_MODE_P2P_GO || s->p2p_client_list == NULL)
    7747          18 :                         continue;
    7748          89 :                 for (i = 0; i < s->num_p2p_clients; i++) {
    7749          79 :                         if (os_memcmp(s->p2p_client_list + i * 2 * ETH_ALEN,
    7750             :                                       addr, ETH_ALEN) == 0)
    7751          73 :                                 return s; /* peer is P2P client in persistent
    7752             :                                            * group */
    7753             :                 }
    7754             :         }
    7755             : 
    7756         897 :         return NULL;
    7757             : }
    7758             : 
    7759             : 
    7760         314 : void wpas_p2p_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
    7761             :                                        const u8 *addr)
    7762             : {
    7763         314 :         if (eloop_cancel_timeout(wpas_p2p_group_formation_timeout,
    7764         314 :                                  wpa_s->p2pdev, NULL) > 0) {
    7765             :                 /*
    7766             :                  * This can happen if WPS provisioning step is not terminated
    7767             :                  * cleanly (e.g., P2P Client does not send WSC_Done). Since the
    7768             :                  * peer was able to connect, there is no need to time out group
    7769             :                  * formation after this, though. In addition, this is used with
    7770             :                  * the initial connection wait on the GO as a separate formation
    7771             :                  * timeout and as such, expected to be hit after the initial WPS
    7772             :                  * provisioning step.
    7773             :                  */
    7774         173 :                 wpa_printf(MSG_DEBUG, "P2P: Canceled P2P group formation timeout on data connection");
    7775             : 
    7776         346 :                 if (!wpa_s->p2p_go_group_formation_completed &&
    7777         173 :                     !wpa_s->group_formation_reported) {
    7778             :                         /*
    7779             :                          * GO has not yet notified group formation success since
    7780             :                          * the WPS step was not completed cleanly. Do that
    7781             :                          * notification now since the P2P Client was able to
    7782             :                          * connect and as such, must have received the
    7783             :                          * credential from the WPS step.
    7784             :                          */
    7785           2 :                         if (wpa_s->global->p2p)
    7786           2 :                                 p2p_wps_success_cb(wpa_s->global->p2p, addr);
    7787           2 :                         wpas_group_formation_completed(wpa_s, 1, 0);
    7788             :                 }
    7789             :         }
    7790         314 :         if (!wpa_s->p2p_go_group_formation_completed) {
    7791         266 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Marking group formation completed on GO on first data connection");
    7792         266 :                 wpa_s->p2p_go_group_formation_completed = 1;
    7793         266 :                 wpa_s->global->p2p_group_formation = NULL;
    7794         266 :                 wpa_s->p2p_in_provisioning = 0;
    7795         266 :                 wpa_s->p2p_in_invitation = 0;
    7796             :         }
    7797         314 :         wpa_s->global->p2p_go_wait_client.sec = 0;
    7798         314 :         if (addr == NULL)
    7799         351 :                 return;
    7800         277 :         wpas_p2p_add_persistent_group_client(wpa_s, addr);
    7801             : }
    7802             : 
    7803             : 
    7804           2 : static int wpas_p2p_fallback_to_go_neg(struct wpa_supplicant *wpa_s,
    7805             :                                        int group_added)
    7806             : {
    7807           2 :         struct wpa_supplicant *group = wpa_s;
    7808           2 :         int ret = 0;
    7809             : 
    7810           2 :         if (wpa_s->global->p2p_group_formation)
    7811           1 :                 group = wpa_s->global->p2p_group_formation;
    7812           2 :         wpa_s = wpa_s->global->p2p_init_wpa_s;
    7813           2 :         offchannel_send_action_done(wpa_s);
    7814           2 :         if (group_added)
    7815           1 :                 ret = wpas_p2p_group_delete(group, P2P_GROUP_REMOVAL_SILENT);
    7816           2 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Fall back to GO Negotiation");
    7817          12 :         wpas_p2p_connect(wpa_s, wpa_s->pending_join_dev_addr, wpa_s->p2p_pin,
    7818           4 :                          wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
    7819             :                          0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
    7820             :                          wpa_s->p2p_go_vht_center_freq2,
    7821             :                          wpa_s->p2p_persistent_id,
    7822           2 :                          wpa_s->p2p_pd_before_go_neg,
    7823           2 :                          wpa_s->p2p_go_ht40,
    7824           2 :                          wpa_s->p2p_go_vht,
    7825             :                          wpa_s->p2p_go_max_oper_chwidth, NULL, 0);
    7826           2 :         return ret;
    7827             : }
    7828             : 
    7829             : 
    7830         962 : int wpas_p2p_scan_no_go_seen(struct wpa_supplicant *wpa_s)
    7831             : {
    7832             :         int res;
    7833             : 
    7834         967 :         if (!wpa_s->p2p_fallback_to_go_neg ||
    7835           5 :             wpa_s->p2p_in_provisioning <= 5)
    7836         961 :                 return 0;
    7837             : 
    7838           1 :         if (wpas_p2p_peer_go(wpa_s, wpa_s->pending_join_dev_addr) > 0)
    7839           0 :                 return 0; /* peer operating as a GO */
    7840             : 
    7841           1 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: GO not found for p2p_connect-auto - "
    7842             :                 "fallback to GO Negotiation");
    7843           1 :         wpa_msg_global(wpa_s->p2pdev, MSG_INFO, P2P_EVENT_FALLBACK_TO_GO_NEG
    7844             :                        "reason=GO-not-found");
    7845           1 :         res = wpas_p2p_fallback_to_go_neg(wpa_s, 1);
    7846             : 
    7847           1 :         return res == 1 ? 2 : 1;
    7848             : }
    7849             : 
    7850             : 
    7851         483 : unsigned int wpas_p2p_search_delay(struct wpa_supplicant *wpa_s)
    7852             : {
    7853             :         struct wpa_supplicant *ifs;
    7854             : 
    7855         483 :         if (wpa_s->wpa_state > WPA_SCANNING) {
    7856          20 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search delay due to "
    7857             :                         "concurrent operation",
    7858             :                         wpa_s->conf->p2p_search_delay);
    7859          20 :                 return wpa_s->conf->p2p_search_delay;
    7860             :         }
    7861             : 
    7862         943 :         dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
    7863             :                          radio_list) {
    7864         484 :                 if (ifs != wpa_s && ifs->wpa_state > WPA_SCANNING) {
    7865           4 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Use %u ms search "
    7866             :                                 "delay due to concurrent operation on "
    7867             :                                 "interface %s",
    7868             :                                 wpa_s->conf->p2p_search_delay,
    7869             :                                 ifs->ifname);
    7870           4 :                         return wpa_s->conf->p2p_search_delay;
    7871             :                 }
    7872             :         }
    7873             : 
    7874         459 :         return 0;
    7875             : }
    7876             : 
    7877             : 
    7878           7 : static int wpas_p2p_remove_psk_entry(struct wpa_supplicant *wpa_s,
    7879             :                                      struct wpa_ssid *s, const u8 *addr,
    7880             :                                      int iface_addr)
    7881             : {
    7882             :         struct psk_list_entry *psk, *tmp;
    7883           7 :         int changed = 0;
    7884             : 
    7885          14 :         dl_list_for_each_safe(psk, tmp, &s->psk_list, struct psk_list_entry,
    7886             :                               list) {
    7887           7 :                 if ((iface_addr && !psk->p2p &&
    7888           7 :                      os_memcmp(addr, psk->addr, ETH_ALEN) == 0) ||
    7889          10 :                     (!iface_addr && psk->p2p &&
    7890           5 :                      os_memcmp(addr, psk->addr, ETH_ALEN) == 0)) {
    7891           3 :                         wpa_dbg(wpa_s, MSG_DEBUG,
    7892             :                                 "P2P: Remove persistent group PSK list entry for "
    7893             :                                 MACSTR " p2p=%u",
    7894             :                                 MAC2STR(psk->addr), psk->p2p);
    7895           3 :                         dl_list_del(&psk->list);
    7896           3 :                         os_free(psk);
    7897           3 :                         changed++;
    7898             :                 }
    7899             :         }
    7900             : 
    7901           7 :         return changed;
    7902             : }
    7903             : 
    7904             : 
    7905           8 : void wpas_p2p_new_psk_cb(struct wpa_supplicant *wpa_s, const u8 *mac_addr,
    7906             :                          const u8 *p2p_dev_addr,
    7907             :                          const u8 *psk, size_t psk_len)
    7908             : {
    7909           8 :         struct wpa_ssid *ssid = wpa_s->current_ssid;
    7910             :         struct wpa_ssid *persistent;
    7911             :         struct psk_list_entry *p, *last;
    7912             : 
    7913           8 :         if (psk_len != sizeof(p->psk))
    7914           0 :                 return;
    7915             : 
    7916           8 :         if (p2p_dev_addr) {
    7917           8 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR
    7918             :                         " p2p_dev_addr=" MACSTR,
    7919             :                         MAC2STR(mac_addr), MAC2STR(p2p_dev_addr));
    7920           8 :                 if (is_zero_ether_addr(p2p_dev_addr))
    7921           1 :                         p2p_dev_addr = NULL;
    7922             :         } else {
    7923           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New PSK for addr=" MACSTR,
    7924             :                         MAC2STR(mac_addr));
    7925             :         }
    7926             : 
    7927           8 :         if (ssid->mode == WPAS_MODE_P2P_GROUP_FORMATION) {
    7928           4 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: new_psk_cb during group formation");
    7929             :                 /* To be added to persistent group once created */
    7930           4 :                 if (wpa_s->global->add_psk == NULL) {
    7931           4 :                         wpa_s->global->add_psk = os_zalloc(sizeof(*p));
    7932           4 :                         if (wpa_s->global->add_psk == NULL)
    7933           0 :                                 return;
    7934             :                 }
    7935           4 :                 p = wpa_s->global->add_psk;
    7936           4 :                 if (p2p_dev_addr) {
    7937           4 :                         p->p2p = 1;
    7938           4 :                         os_memcpy(p->addr, p2p_dev_addr, ETH_ALEN);
    7939             :                 } else {
    7940           0 :                         p->p2p = 0;
    7941           0 :                         os_memcpy(p->addr, mac_addr, ETH_ALEN);
    7942             :                 }
    7943           4 :                 os_memcpy(p->psk, psk, psk_len);
    7944           4 :                 return;
    7945             :         }
    7946             : 
    7947           4 :         if (ssid->mode != WPAS_MODE_P2P_GO || !ssid->p2p_persistent_group) {
    7948           2 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Ignore new_psk_cb on not-persistent GO");
    7949           2 :                 return;
    7950             :         }
    7951             : 
    7952           2 :         persistent = wpas_p2p_get_persistent(wpa_s->p2pdev, NULL, ssid->ssid,
    7953             :                                              ssid->ssid_len);
    7954           2 :         if (!persistent) {
    7955           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not find persistent group information to store the new PSK");
    7956           0 :                 return;
    7957             :         }
    7958             : 
    7959           2 :         p = os_zalloc(sizeof(*p));
    7960           2 :         if (p == NULL)
    7961           0 :                 return;
    7962           2 :         if (p2p_dev_addr) {
    7963           2 :                 p->p2p = 1;
    7964           2 :                 os_memcpy(p->addr, p2p_dev_addr, ETH_ALEN);
    7965             :         } else {
    7966           0 :                 p->p2p = 0;
    7967           0 :                 os_memcpy(p->addr, mac_addr, ETH_ALEN);
    7968             :         }
    7969           2 :         os_memcpy(p->psk, psk, psk_len);
    7970             : 
    7971           2 :         if (dl_list_len(&persistent->psk_list) > P2P_MAX_STORED_CLIENTS &&
    7972           0 :             (last = dl_list_last(&persistent->psk_list,
    7973             :                                  struct psk_list_entry, list))) {
    7974           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove oldest PSK entry for "
    7975             :                         MACSTR " (p2p=%u) to make room for a new one",
    7976             :                         MAC2STR(last->addr), last->p2p);
    7977           0 :                 dl_list_del(&last->list);
    7978           0 :                 os_free(last);
    7979             :         }
    7980             : 
    7981           2 :         wpas_p2p_remove_psk_entry(wpa_s->p2pdev, persistent,
    7982             :                                   p2p_dev_addr ? p2p_dev_addr : mac_addr,
    7983             :                                   p2p_dev_addr == NULL);
    7984           2 :         if (p2p_dev_addr) {
    7985           2 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for p2p_dev_addr="
    7986             :                         MACSTR, MAC2STR(p2p_dev_addr));
    7987             :         } else {
    7988           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Add new PSK for addr=" MACSTR,
    7989             :                         MAC2STR(mac_addr));
    7990             :         }
    7991           2 :         dl_list_add(&persistent->psk_list, &p->list);
    7992             : 
    7993           2 :         if (wpa_s->p2pdev->conf->update_config &&
    7994           0 :             wpa_config_write(wpa_s->p2pdev->confname, wpa_s->p2pdev->conf))
    7995           0 :                 wpa_printf(MSG_DEBUG, "P2P: Failed to update configuration");
    7996             : }
    7997             : 
    7998             : 
    7999           5 : static void wpas_p2p_remove_psk(struct wpa_supplicant *wpa_s,
    8000             :                                 struct wpa_ssid *s, const u8 *addr,
    8001             :                                 int iface_addr)
    8002             : {
    8003             :         int res;
    8004             : 
    8005           5 :         res = wpas_p2p_remove_psk_entry(wpa_s, s, addr, iface_addr);
    8006           5 :         if (res > 0 && wpa_s->conf->update_config &&
    8007           0 :             wpa_config_write(wpa_s->confname, wpa_s->conf))
    8008           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8009             :                         "P2P: Failed to update configuration");
    8010           5 : }
    8011             : 
    8012             : 
    8013           7 : static void wpas_p2p_remove_client_go(struct wpa_supplicant *wpa_s,
    8014             :                                       const u8 *peer, int iface_addr)
    8015             : {
    8016             :         struct hostapd_data *hapd;
    8017             :         struct hostapd_wpa_psk *psk, *prev, *rem;
    8018             :         struct sta_info *sta;
    8019             : 
    8020          14 :         if (wpa_s->ap_iface == NULL || wpa_s->current_ssid == NULL ||
    8021           7 :             wpa_s->current_ssid->mode != WPAS_MODE_P2P_GO)
    8022           7 :                 return;
    8023             : 
    8024             :         /* Remove per-station PSK entry */
    8025           7 :         hapd = wpa_s->ap_iface->bss[0];
    8026           7 :         prev = NULL;
    8027           7 :         psk = hapd->conf->ssid.wpa_psk;
    8028          27 :         while (psk) {
    8029          13 :                 if ((iface_addr && os_memcmp(peer, psk->addr, ETH_ALEN) == 0) ||
    8030           9 :                     (!iface_addr &&
    8031           9 :                      os_memcmp(peer, psk->p2p_dev_addr, ETH_ALEN) == 0)) {
    8032           3 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove operating group PSK entry for "
    8033             :                                 MACSTR " iface_addr=%d",
    8034             :                                 MAC2STR(peer), iface_addr);
    8035           3 :                         if (prev)
    8036           1 :                                 prev->next = psk->next;
    8037             :                         else
    8038           2 :                                 hapd->conf->ssid.wpa_psk = psk->next;
    8039           3 :                         rem = psk;
    8040           3 :                         psk = psk->next;
    8041           3 :                         os_free(rem);
    8042             :                 } else {
    8043          10 :                         prev = psk;
    8044          10 :                         psk = psk->next;
    8045             :                 }
    8046             :         }
    8047             : 
    8048             :         /* Disconnect from group */
    8049           7 :         if (iface_addr)
    8050           2 :                 sta = ap_get_sta(hapd, peer);
    8051             :         else
    8052           5 :                 sta = ap_get_sta_p2p(hapd, peer);
    8053           7 :         if (sta) {
    8054           7 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disconnect peer " MACSTR
    8055             :                         " (iface_addr=%d) from group",
    8056             :                         MAC2STR(peer), iface_addr);
    8057           7 :                 hostapd_drv_sta_deauth(hapd, sta->addr,
    8058             :                                        WLAN_REASON_DEAUTH_LEAVING);
    8059           7 :                 ap_sta_deauthenticate(hapd, sta, WLAN_REASON_DEAUTH_LEAVING);
    8060             :         }
    8061             : }
    8062             : 
    8063             : 
    8064           7 : void wpas_p2p_remove_client(struct wpa_supplicant *wpa_s, const u8 *peer,
    8065             :                             int iface_addr)
    8066             : {
    8067             :         struct wpa_ssid *s;
    8068             :         struct wpa_supplicant *w;
    8069           7 :         struct wpa_supplicant *p2p_wpa_s = wpa_s->global->p2p_init_wpa_s;
    8070             : 
    8071           7 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Remove client " MACSTR, MAC2STR(peer));
    8072             : 
    8073             :         /* Remove from any persistent group */
    8074          19 :         for (s = p2p_wpa_s->conf->ssid; s; s = s->next) {
    8075          12 :                 if (s->disabled != 2 || s->mode != WPAS_MODE_P2P_GO)
    8076           7 :                         continue;
    8077           5 :                 if (!iface_addr)
    8078           4 :                         wpas_remove_persistent_peer(p2p_wpa_s, s, peer, 0);
    8079           5 :                 wpas_p2p_remove_psk(p2p_wpa_s, s, peer, iface_addr);
    8080             :         }
    8081             : 
    8082             :         /* Remove from any operating group */
    8083          14 :         for (w = wpa_s->global->ifaces; w; w = w->next)
    8084           7 :                 wpas_p2p_remove_client_go(w, peer, iface_addr);
    8085           7 : }
    8086             : 
    8087             : 
    8088           1 : static void wpas_p2p_psk_failure_removal(void *eloop_ctx, void *timeout_ctx)
    8089             : {
    8090           1 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    8091           1 :         wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_PSK_FAILURE);
    8092           1 : }
    8093             : 
    8094             : 
    8095           0 : static void wpas_p2p_group_freq_conflict(void *eloop_ctx, void *timeout_ctx)
    8096             : {
    8097           0 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    8098             : 
    8099           0 :         wpa_printf(MSG_DEBUG, "P2P: Frequency conflict - terminate group");
    8100           0 :         wpas_p2p_group_delete(wpa_s, P2P_GROUP_REMOVAL_FREQ_CONFLICT);
    8101           0 : }
    8102             : 
    8103             : 
    8104          10 : int wpas_p2p_handle_frequency_conflicts(struct wpa_supplicant *wpa_s, int freq,
    8105             :                                         struct wpa_ssid *ssid)
    8106             : {
    8107             :         struct wpa_supplicant *iface;
    8108             : 
    8109          40 :         for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
    8110          20 :                 if (!iface->current_ssid ||
    8111          20 :                     iface->current_ssid->frequency == freq ||
    8112          20 :                     (iface->p2p_group_interface == NOT_P2P_GROUP_INTERFACE &&
    8113          10 :                      !iface->current_ssid->p2p_group))
    8114          10 :                         continue;
    8115             : 
    8116             :                 /* Remove the connection with least priority */
    8117           0 :                 if (!wpas_is_p2p_prioritized(iface)) {
    8118             :                         /* STA connection has priority over existing
    8119             :                          * P2P connection, so remove the interface. */
    8120           0 :                         wpa_printf(MSG_DEBUG, "P2P: Removing P2P connection due to single channel concurrent mode frequency conflict");
    8121           0 :                         eloop_register_timeout(0, 0,
    8122             :                                                wpas_p2p_group_freq_conflict,
    8123             :                                                iface, NULL);
    8124             :                         /* If connection in progress is P2P connection, do not
    8125             :                          * proceed for the connection. */
    8126           0 :                         if (wpa_s == iface)
    8127           0 :                                 return -1;
    8128             :                         else
    8129           0 :                                 return 0;
    8130             :                 } else {
    8131             :                         /* P2P connection has priority, disable the STA network
    8132             :                          */
    8133           0 :                         wpa_supplicant_disable_network(wpa_s->global->ifaces,
    8134             :                                                        ssid);
    8135           0 :                         wpa_msg(wpa_s->global->ifaces, MSG_INFO,
    8136             :                                 WPA_EVENT_FREQ_CONFLICT " id=%d", ssid->id);
    8137           0 :                         os_memset(wpa_s->global->ifaces->pending_bssid, 0,
    8138             :                                   ETH_ALEN);
    8139             :                         /* If P2P connection is in progress, continue
    8140             :                          * connecting...*/
    8141           0 :                         if (wpa_s == iface)
    8142           0 :                                 return 0;
    8143             :                         else
    8144           0 :                                 return -1;
    8145             :                 }
    8146             :         }
    8147             : 
    8148          10 :         return 0;
    8149             : }
    8150             : 
    8151             : 
    8152          17 : int wpas_p2p_4way_hs_failed(struct wpa_supplicant *wpa_s)
    8153             : {
    8154          17 :         struct wpa_ssid *ssid = wpa_s->current_ssid;
    8155             : 
    8156          17 :         if (ssid == NULL || !ssid->p2p_group)
    8157          12 :                 return 0;
    8158             : 
    8159           6 :         if (wpa_s->p2p_last_4way_hs_fail &&
    8160           1 :             wpa_s->p2p_last_4way_hs_fail == ssid) {
    8161             :                 u8 go_dev_addr[ETH_ALEN];
    8162             :                 struct wpa_ssid *persistent;
    8163             : 
    8164           2 :                 if (wpas_p2p_persistent_group(wpa_s, go_dev_addr,
    8165           1 :                                               ssid->ssid,
    8166             :                                               ssid->ssid_len) <= 0) {
    8167           0 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Could not determine whether 4-way handshake failures were for a persistent group");
    8168           0 :                         goto disconnect;
    8169             :                 }
    8170             : 
    8171           1 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Two 4-way handshake failures for a P2P group - go_dev_addr="
    8172             :                         MACSTR, MAC2STR(go_dev_addr));
    8173           2 :                 persistent = wpas_p2p_get_persistent(wpa_s->p2pdev, go_dev_addr,
    8174           1 :                                                      ssid->ssid,
    8175             :                                                      ssid->ssid_len);
    8176           1 :                 if (persistent == NULL || persistent->mode != WPAS_MODE_INFRA) {
    8177           0 :                         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No matching persistent group stored");
    8178           0 :                         goto disconnect;
    8179             :                 }
    8180           1 :                 wpa_msg_global(wpa_s->p2pdev, MSG_INFO,
    8181             :                                P2P_EVENT_PERSISTENT_PSK_FAIL "%d",
    8182             :                                persistent->id);
    8183             :         disconnect:
    8184           1 :                 wpa_s->p2p_last_4way_hs_fail = NULL;
    8185             :                 /*
    8186             :                  * Remove the group from a timeout to avoid issues with caller
    8187             :                  * continuing to use the interface if this is on a P2P group
    8188             :                  * interface.
    8189             :                  */
    8190           1 :                 eloop_register_timeout(0, 0, wpas_p2p_psk_failure_removal,
    8191             :                                        wpa_s, NULL);
    8192           1 :                 return 1;
    8193             :         }
    8194             : 
    8195           4 :         wpa_s->p2p_last_4way_hs_fail = ssid;
    8196           4 :         return 0;
    8197             : }
    8198             : 
    8199             : 
    8200             : #ifdef CONFIG_WPS_NFC
    8201             : 
    8202          41 : static struct wpabuf * wpas_p2p_nfc_handover(int ndef, struct wpabuf *wsc,
    8203             :                                              struct wpabuf *p2p)
    8204             : {
    8205             :         struct wpabuf *ret;
    8206             :         size_t wsc_len;
    8207             : 
    8208          41 :         if (p2p == NULL) {
    8209           0 :                 wpabuf_free(wsc);
    8210           0 :                 wpa_printf(MSG_DEBUG, "P2P: No p2p buffer for handover");
    8211           0 :                 return NULL;
    8212             :         }
    8213             : 
    8214          41 :         wsc_len = wsc ? wpabuf_len(wsc) : 0;
    8215          41 :         ret = wpabuf_alloc(2 + wsc_len + 2 + wpabuf_len(p2p));
    8216          41 :         if (ret == NULL) {
    8217           1 :                 wpabuf_free(wsc);
    8218           1 :                 wpabuf_free(p2p);
    8219           1 :                 return NULL;
    8220             :         }
    8221             : 
    8222          40 :         wpabuf_put_be16(ret, wsc_len);
    8223          40 :         if (wsc)
    8224          33 :                 wpabuf_put_buf(ret, wsc);
    8225          40 :         wpabuf_put_be16(ret, wpabuf_len(p2p));
    8226          40 :         wpabuf_put_buf(ret, p2p);
    8227             : 
    8228          40 :         wpabuf_free(wsc);
    8229          40 :         wpabuf_free(p2p);
    8230          40 :         wpa_hexdump_buf(MSG_DEBUG,
    8231             :                         "P2P: Generated NFC connection handover message", ret);
    8232             : 
    8233          40 :         if (ndef && ret) {
    8234             :                 struct wpabuf *tmp;
    8235          37 :                 tmp = ndef_build_p2p(ret);
    8236          37 :                 wpabuf_free(ret);
    8237          37 :                 if (tmp == NULL) {
    8238           1 :                         wpa_printf(MSG_DEBUG, "P2P: Failed to NDEF encapsulate handover request");
    8239           1 :                         return NULL;
    8240             :                 }
    8241          36 :                 ret = tmp;
    8242             :         }
    8243             : 
    8244          39 :         return ret;
    8245             : }
    8246             : 
    8247             : 
    8248          66 : static int wpas_p2p_cli_freq(struct wpa_supplicant *wpa_s,
    8249             :                              struct wpa_ssid **ssid, u8 *go_dev_addr)
    8250             : {
    8251             :         struct wpa_supplicant *iface;
    8252             : 
    8253          66 :         if (go_dev_addr)
    8254          41 :                 os_memset(go_dev_addr, 0, ETH_ALEN);
    8255          66 :         if (ssid)
    8256          41 :                 *ssid = NULL;
    8257         264 :         for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
    8258          81 :                 if (iface->wpa_state < WPA_ASSOCIATING ||
    8259          39 :                     iface->current_ssid == NULL || iface->assoc_freq == 0 ||
    8260          26 :                     !iface->current_ssid->p2p_group ||
    8261          13 :                     iface->current_ssid->mode != WPAS_MODE_INFRA)
    8262          66 :                         continue;
    8263           2 :                 if (ssid)
    8264           1 :                         *ssid = iface->current_ssid;
    8265           2 :                 if (go_dev_addr)
    8266           1 :                         os_memcpy(go_dev_addr, iface->go_dev_addr, ETH_ALEN);
    8267           2 :                 return iface->assoc_freq;
    8268             :         }
    8269          64 :         return 0;
    8270             : }
    8271             : 
    8272             : 
    8273          16 : struct wpabuf * wpas_p2p_nfc_handover_req(struct wpa_supplicant *wpa_s,
    8274             :                                           int ndef)
    8275             : {
    8276             :         struct wpabuf *wsc, *p2p;
    8277             :         struct wpa_ssid *ssid;
    8278             :         u8 go_dev_addr[ETH_ALEN];
    8279          16 :         int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr);
    8280             : 
    8281          16 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL) {
    8282           0 :                 wpa_printf(MSG_DEBUG, "P2P: P2P disabled - cannot build handover request");
    8283           0 :                 return NULL;
    8284             :         }
    8285             : 
    8286          20 :         if (wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
    8287           4 :             wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
    8288           4 :                            &wpa_s->conf->wps_nfc_dh_privkey) < 0) {
    8289           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: No DH key available for handover request");
    8290           0 :                 return NULL;
    8291             :         }
    8292             : 
    8293          16 :         if (cli_freq == 0) {
    8294          30 :                 wsc = wps_build_nfc_handover_req_p2p(
    8295          30 :                         wpa_s->parent->wps, wpa_s->conf->wps_nfc_dh_pubkey);
    8296             :         } else
    8297           1 :                 wsc = NULL;
    8298          34 :         p2p = p2p_build_nfc_handover_req(wpa_s->global->p2p, cli_freq,
    8299          17 :                                          go_dev_addr, ssid ? ssid->ssid : NULL,
    8300          17 :                                          ssid ? ssid->ssid_len : 0);
    8301             : 
    8302          16 :         return wpas_p2p_nfc_handover(ndef, wsc, p2p);
    8303             : }
    8304             : 
    8305             : 
    8306          25 : struct wpabuf * wpas_p2p_nfc_handover_sel(struct wpa_supplicant *wpa_s,
    8307             :                                           int ndef, int tag)
    8308             : {
    8309             :         struct wpabuf *wsc, *p2p;
    8310             :         struct wpa_ssid *ssid;
    8311             :         u8 go_dev_addr[ETH_ALEN];
    8312          25 :         int cli_freq = wpas_p2p_cli_freq(wpa_s, &ssid, go_dev_addr);
    8313             : 
    8314          25 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    8315           0 :                 return NULL;
    8316             : 
    8317          29 :         if (!tag && wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
    8318           4 :             wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
    8319           4 :                            &wpa_s->conf->wps_nfc_dh_privkey) < 0)
    8320           0 :                 return NULL;
    8321             : 
    8322          25 :         if (cli_freq == 0) {
    8323         101 :                 wsc = wps_build_nfc_handover_sel_p2p(
    8324          25 :                         wpa_s->parent->wps,
    8325          13 :                         tag ? wpa_s->conf->wps_nfc_dev_pw_id :
    8326             :                         DEV_PW_NFC_CONNECTION_HANDOVER,
    8327          25 :                         wpa_s->conf->wps_nfc_dh_pubkey,
    8328          13 :                         tag ? wpa_s->conf->wps_nfc_dev_pw : NULL);
    8329             :         } else
    8330           0 :                 wsc = NULL;
    8331          50 :         p2p = p2p_build_nfc_handover_sel(wpa_s->global->p2p, cli_freq,
    8332          25 :                                          go_dev_addr, ssid ? ssid->ssid : NULL,
    8333          25 :                                          ssid ? ssid->ssid_len : 0);
    8334             : 
    8335          25 :         return wpas_p2p_nfc_handover(ndef, wsc, p2p);
    8336             : }
    8337             : 
    8338             : 
    8339           4 : static int wpas_p2p_nfc_join_group(struct wpa_supplicant *wpa_s,
    8340             :                                    struct p2p_nfc_params *params)
    8341             : {
    8342           4 :         wpa_printf(MSG_DEBUG, "P2P: Initiate join-group based on NFC "
    8343             :                    "connection handover (freq=%d)",
    8344             :                    params->go_freq);
    8345             : 
    8346           4 :         if (params->go_freq && params->go_ssid_len) {
    8347           4 :                 wpa_s->p2p_wps_method = WPS_NFC;
    8348           4 :                 wpa_s->pending_join_wps_method = WPS_NFC;
    8349           4 :                 os_memset(wpa_s->pending_join_iface_addr, 0, ETH_ALEN);
    8350           4 :                 os_memcpy(wpa_s->pending_join_dev_addr, params->go_dev_addr,
    8351             :                           ETH_ALEN);
    8352           8 :                 return wpas_p2p_join_start(wpa_s, params->go_freq,
    8353           4 :                                            params->go_ssid,
    8354             :                                            params->go_ssid_len);
    8355             :         }
    8356             : 
    8357           0 :         return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
    8358           0 :                                 WPS_NFC, 0, 0, 1, 0, wpa_s->conf->p2p_go_intent,
    8359             :                                 params->go_freq, wpa_s->p2p_go_vht_center_freq2,
    8360             :                                 -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
    8361           0 :                                 params->go_ssid_len ? params->go_ssid : NULL,
    8362             :                                 params->go_ssid_len);
    8363             : }
    8364             : 
    8365             : 
    8366           6 : static int wpas_p2p_nfc_auth_join(struct wpa_supplicant *wpa_s,
    8367             :                                   struct p2p_nfc_params *params, int tag)
    8368             : {
    8369             :         int res, persistent;
    8370             :         struct wpa_ssid *ssid;
    8371             : 
    8372           6 :         wpa_printf(MSG_DEBUG, "P2P: Authorize join-group based on NFC "
    8373             :                    "connection handover");
    8374           6 :         for (wpa_s = wpa_s->global->ifaces; wpa_s; wpa_s = wpa_s->next) {
    8375           6 :                 ssid = wpa_s->current_ssid;
    8376           6 :                 if (ssid == NULL)
    8377           0 :                         continue;
    8378           6 :                 if (ssid->mode != WPAS_MODE_P2P_GO)
    8379           0 :                         continue;
    8380           6 :                 if (wpa_s->ap_iface == NULL)
    8381           0 :                         continue;
    8382           6 :                 break;
    8383             :         }
    8384           6 :         if (wpa_s == NULL) {
    8385           0 :                 wpa_printf(MSG_DEBUG, "P2P: Could not find GO interface");
    8386           0 :                 return -1;
    8387             :         }
    8388             : 
    8389           6 :         if (wpa_s->p2pdev->p2p_oob_dev_pw_id !=
    8390           4 :             DEV_PW_NFC_CONNECTION_HANDOVER &&
    8391           4 :             !wpa_s->p2pdev->p2p_oob_dev_pw) {
    8392           0 :                 wpa_printf(MSG_DEBUG, "P2P: No NFC Dev Pw known");
    8393           0 :                 return -1;
    8394             :         }
    8395          18 :         res = wpas_ap_wps_add_nfc_pw(
    8396           6 :                 wpa_s, wpa_s->p2pdev->p2p_oob_dev_pw_id,
    8397           6 :                 wpa_s->p2pdev->p2p_oob_dev_pw,
    8398           6 :                 wpa_s->p2pdev->p2p_peer_oob_pk_hash_known ?
    8399           6 :                 wpa_s->p2pdev->p2p_peer_oob_pubkey_hash : NULL);
    8400           6 :         if (res)
    8401           0 :                 return res;
    8402             : 
    8403           6 :         if (!tag) {
    8404           2 :                 wpa_printf(MSG_DEBUG, "P2P: Negotiated handover - wait for peer to join without invitation");
    8405           2 :                 return 0;
    8406             :         }
    8407             : 
    8408           8 :         if (!params->peer ||
    8409           4 :             !(params->peer->dev_capab & P2P_DEV_CAPAB_INVITATION_PROCEDURE))
    8410           0 :                 return 0;
    8411             : 
    8412          24 :         wpa_printf(MSG_DEBUG, "P2P: Static handover - invite peer " MACSTR
    8413          24 :                    " to join", MAC2STR(params->peer->p2p_device_addr));
    8414             : 
    8415           4 :         wpa_s->global->p2p_invite_group = wpa_s;
    8416           4 :         persistent = ssid->p2p_persistent_group &&
    8417           0 :                 wpas_p2p_get_persistent(wpa_s->p2pdev,
    8418           0 :                                         params->peer->p2p_device_addr,
    8419           0 :                                         ssid->ssid, ssid->ssid_len);
    8420           4 :         wpa_s->p2pdev->pending_invite_ssid_id = -1;
    8421             : 
    8422          12 :         return p2p_invite(wpa_s->global->p2p, params->peer->p2p_device_addr,
    8423           4 :                           P2P_INVITE_ROLE_ACTIVE_GO, wpa_s->own_addr,
    8424           8 :                           ssid->ssid, ssid->ssid_len, ssid->frequency,
    8425           4 :                           wpa_s->global->p2p_dev_addr, persistent, 0,
    8426           4 :                           wpa_s->p2pdev->p2p_oob_dev_pw_id);
    8427             : }
    8428             : 
    8429             : 
    8430           9 : static int wpas_p2p_nfc_init_go_neg(struct wpa_supplicant *wpa_s,
    8431             :                                     struct p2p_nfc_params *params,
    8432             :                                     int forced_freq)
    8433             : {
    8434           9 :         wpa_printf(MSG_DEBUG, "P2P: Initiate GO Negotiation based on NFC "
    8435             :                    "connection handover");
    8436          18 :         return wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
    8437           9 :                                 WPS_NFC, 0, 0, 0, 0, wpa_s->conf->p2p_go_intent,
    8438             :                                 forced_freq, wpa_s->p2p_go_vht_center_freq2,
    8439             :                                 -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
    8440             :                                 NULL, 0);
    8441             : }
    8442             : 
    8443             : 
    8444           5 : static int wpas_p2p_nfc_resp_go_neg(struct wpa_supplicant *wpa_s,
    8445             :                                     struct p2p_nfc_params *params,
    8446             :                                     int forced_freq)
    8447             : {
    8448             :         int res;
    8449             : 
    8450           5 :         wpa_printf(MSG_DEBUG, "P2P: Authorize GO Negotiation based on NFC "
    8451             :                    "connection handover");
    8452          10 :         res = wpas_p2p_connect(wpa_s, params->peer->p2p_device_addr, NULL,
    8453           5 :                                WPS_NFC, 0, 0, 0, 1, wpa_s->conf->p2p_go_intent,
    8454             :                                forced_freq, wpa_s->p2p_go_vht_center_freq2,
    8455             :                                -1, 0, 1, 1, wpa_s->p2p_go_max_oper_chwidth,
    8456             :                                NULL, 0);
    8457           5 :         if (res)
    8458           0 :                 return res;
    8459             : 
    8460           5 :         res = wpas_p2p_listen(wpa_s, 60);
    8461           5 :         if (res) {
    8462           0 :                 p2p_unauthorize(wpa_s->global->p2p,
    8463           0 :                                 params->peer->p2p_device_addr);
    8464             :         }
    8465             : 
    8466           5 :         return res;
    8467             : }
    8468             : 
    8469             : 
    8470          31 : static int wpas_p2p_nfc_connection_handover(struct wpa_supplicant *wpa_s,
    8471             :                                             const struct wpabuf *data,
    8472             :                                             int sel, int tag, int forced_freq)
    8473             : {
    8474             :         const u8 *pos, *end;
    8475             :         u16 len, id;
    8476             :         struct p2p_nfc_params params;
    8477             :         int res;
    8478             : 
    8479          31 :         os_memset(&params, 0, sizeof(params));
    8480          31 :         params.sel = sel;
    8481             : 
    8482          31 :         wpa_hexdump_buf(MSG_DEBUG, "P2P: Received NFC tag payload", data);
    8483             : 
    8484          31 :         pos = wpabuf_head(data);
    8485          31 :         end = pos + wpabuf_len(data);
    8486             : 
    8487          31 :         if (end - pos < 2) {
    8488           0 :                 wpa_printf(MSG_DEBUG, "P2P: Not enough data for Length of WSC "
    8489             :                            "attributes");
    8490           0 :                 return -1;
    8491             :         }
    8492          31 :         len = WPA_GET_BE16(pos);
    8493          31 :         pos += 2;
    8494          31 :         if (len > end - pos) {
    8495           0 :                 wpa_printf(MSG_DEBUG, "P2P: Not enough data for WSC "
    8496             :                            "attributes");
    8497           0 :                 return -1;
    8498             :         }
    8499          31 :         params.wsc_attr = pos;
    8500          31 :         params.wsc_len = len;
    8501          31 :         pos += len;
    8502             : 
    8503          31 :         if (end - pos < 2) {
    8504           0 :                 wpa_printf(MSG_DEBUG, "P2P: Not enough data for Length of P2P "
    8505             :                            "attributes");
    8506           0 :                 return -1;
    8507             :         }
    8508          31 :         len = WPA_GET_BE16(pos);
    8509          31 :         pos += 2;
    8510          31 :         if (len > end - pos) {
    8511           0 :                 wpa_printf(MSG_DEBUG, "P2P: Not enough data for P2P "
    8512             :                            "attributes");
    8513           0 :                 return -1;
    8514             :         }
    8515          31 :         params.p2p_attr = pos;
    8516          31 :         params.p2p_len = len;
    8517          31 :         pos += len;
    8518             : 
    8519          62 :         wpa_hexdump(MSG_DEBUG, "P2P: WSC attributes",
    8520          31 :                     params.wsc_attr, params.wsc_len);
    8521          62 :         wpa_hexdump(MSG_DEBUG, "P2P: P2P attributes",
    8522          31 :                     params.p2p_attr, params.p2p_len);
    8523          31 :         if (pos < end) {
    8524           0 :                 wpa_hexdump(MSG_DEBUG,
    8525             :                             "P2P: Ignored extra data after P2P attributes",
    8526           0 :                             pos, end - pos);
    8527             :         }
    8528             : 
    8529          31 :         res = p2p_process_nfc_connection_handover(wpa_s->global->p2p, &params);
    8530          31 :         if (res)
    8531           3 :                 return res;
    8532             : 
    8533          28 :         if (params.next_step == NO_ACTION)
    8534           0 :                 return 0;
    8535             : 
    8536          28 :         if (params.next_step == BOTH_GO) {
    8537          12 :                 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_BOTH_GO "peer=" MACSTR,
    8538          12 :                         MAC2STR(params.peer->p2p_device_addr));
    8539           2 :                 return 0;
    8540             :         }
    8541             : 
    8542          26 :         if (params.next_step == PEER_CLIENT) {
    8543           1 :                 if (!is_zero_ether_addr(params.go_dev_addr)) {
    8544          13 :                         wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT
    8545             :                                 "peer=" MACSTR " freq=%d go_dev_addr=" MACSTR
    8546             :                                 " ssid=\"%s\"",
    8547           6 :                                 MAC2STR(params.peer->p2p_device_addr),
    8548             :                                 params.go_freq,
    8549           6 :                                 MAC2STR(params.go_dev_addr),
    8550             :                                 wpa_ssid_txt(params.go_ssid,
    8551             :                                              params.go_ssid_len));
    8552             :                 } else {
    8553           0 :                         wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_PEER_CLIENT
    8554             :                                 "peer=" MACSTR " freq=%d",
    8555           0 :                                 MAC2STR(params.peer->p2p_device_addr),
    8556             :                                 params.go_freq);
    8557             :                 }
    8558           1 :                 return 0;
    8559             :         }
    8560             : 
    8561          25 :         if (wpas_p2p_cli_freq(wpa_s, NULL, NULL)) {
    8562           6 :                 wpa_msg(wpa_s, MSG_INFO, P2P_EVENT_NFC_WHILE_CLIENT "peer="
    8563           6 :                         MACSTR, MAC2STR(params.peer->p2p_device_addr));
    8564           1 :                 return 0;
    8565             :         }
    8566             : 
    8567          24 :         wpabuf_free(wpa_s->p2p_oob_dev_pw);
    8568          24 :         wpa_s->p2p_oob_dev_pw = NULL;
    8569             : 
    8570          24 :         if (params.oob_dev_pw_len < WPS_OOB_PUBKEY_HASH_LEN + 2) {
    8571           0 :                 wpa_printf(MSG_DEBUG, "P2P: No peer OOB Dev Pw "
    8572             :                            "received");
    8573           0 :                 return -1;
    8574             :         }
    8575             : 
    8576          24 :         id = WPA_GET_BE16(params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN);
    8577          24 :         wpa_printf(MSG_DEBUG, "P2P: Peer OOB Dev Pw %u", id);
    8578          24 :         wpa_hexdump(MSG_DEBUG, "P2P: Peer OOB Public Key hash",
    8579             :                     params.oob_dev_pw, WPS_OOB_PUBKEY_HASH_LEN);
    8580          24 :         os_memcpy(wpa_s->p2p_peer_oob_pubkey_hash,
    8581             :                   params.oob_dev_pw, WPS_OOB_PUBKEY_HASH_LEN);
    8582          24 :         wpa_s->p2p_peer_oob_pk_hash_known = 1;
    8583             : 
    8584          24 :         if (tag) {
    8585          10 :                 if (id < 0x10) {
    8586           0 :                         wpa_printf(MSG_DEBUG, "P2P: Static handover - invalid "
    8587             :                                    "peer OOB Device Password Id %u", id);
    8588           0 :                         return -1;
    8589             :                 }
    8590          10 :                 wpa_printf(MSG_DEBUG, "P2P: Static handover - use peer OOB "
    8591             :                            "Device Password Id %u", id);
    8592          10 :                 wpa_hexdump_key(MSG_DEBUG, "P2P: Peer OOB Device Password",
    8593             :                                 params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN + 2,
    8594          10 :                                 params.oob_dev_pw_len -
    8595             :                                 WPS_OOB_PUBKEY_HASH_LEN - 2);
    8596          10 :                 wpa_s->p2p_oob_dev_pw_id = id;
    8597          10 :                 wpa_s->p2p_oob_dev_pw = wpabuf_alloc_copy(
    8598             :                         params.oob_dev_pw + WPS_OOB_PUBKEY_HASH_LEN + 2,
    8599          10 :                         params.oob_dev_pw_len -
    8600             :                         WPS_OOB_PUBKEY_HASH_LEN - 2);
    8601          10 :                 if (wpa_s->p2p_oob_dev_pw == NULL)
    8602           0 :                         return -1;
    8603             : 
    8604          13 :                 if (wpa_s->conf->wps_nfc_dh_pubkey == NULL &&
    8605           3 :                     wps_nfc_gen_dh(&wpa_s->conf->wps_nfc_dh_pubkey,
    8606           3 :                                    &wpa_s->conf->wps_nfc_dh_privkey) < 0)
    8607           0 :                         return -1;
    8608             :         } else {
    8609          14 :                 wpa_printf(MSG_DEBUG, "P2P: Using abbreviated WPS handshake "
    8610             :                            "without Device Password");
    8611          14 :                 wpa_s->p2p_oob_dev_pw_id = DEV_PW_NFC_CONNECTION_HANDOVER;
    8612             :         }
    8613             : 
    8614          24 :         switch (params.next_step) {
    8615             :         case NO_ACTION:
    8616             :         case BOTH_GO:
    8617             :         case PEER_CLIENT:
    8618             :                 /* already covered above */
    8619           0 :                 return 0;
    8620             :         case JOIN_GROUP:
    8621           4 :                 return wpas_p2p_nfc_join_group(wpa_s, &params);
    8622             :         case AUTH_JOIN:
    8623           6 :                 return wpas_p2p_nfc_auth_join(wpa_s, &params, tag);
    8624             :         case INIT_GO_NEG:
    8625           9 :                 return wpas_p2p_nfc_init_go_neg(wpa_s, &params, forced_freq);
    8626             :         case RESP_GO_NEG:
    8627             :                 /* TODO: use own OOB Dev Pw */
    8628           5 :                 return wpas_p2p_nfc_resp_go_neg(wpa_s, &params, forced_freq);
    8629             :         }
    8630             : 
    8631           0 :         return -1;
    8632             : }
    8633             : 
    8634             : 
    8635          13 : int wpas_p2p_nfc_tag_process(struct wpa_supplicant *wpa_s,
    8636             :                              const struct wpabuf *data, int forced_freq)
    8637             : {
    8638          13 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    8639           0 :                 return -1;
    8640             : 
    8641          13 :         return wpas_p2p_nfc_connection_handover(wpa_s, data, 1, 1, forced_freq);
    8642             : }
    8643             : 
    8644             : 
    8645          18 : int wpas_p2p_nfc_report_handover(struct wpa_supplicant *wpa_s, int init,
    8646             :                                  const struct wpabuf *req,
    8647             :                                  const struct wpabuf *sel, int forced_freq)
    8648             : {
    8649             :         struct wpabuf *tmp;
    8650             :         int ret;
    8651             : 
    8652          18 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    8653           0 :                 return -1;
    8654             : 
    8655          18 :         wpa_printf(MSG_DEBUG, "NFC: P2P connection handover reported");
    8656             : 
    8657          18 :         wpa_hexdump_ascii(MSG_DEBUG, "NFC: Req",
    8658             :                           wpabuf_head(req), wpabuf_len(req));
    8659          18 :         wpa_hexdump_ascii(MSG_DEBUG, "NFC: Sel",
    8660             :                           wpabuf_head(sel), wpabuf_len(sel));
    8661          18 :         if (forced_freq)
    8662           0 :                 wpa_printf(MSG_DEBUG, "NFC: Forced freq %d", forced_freq);
    8663          18 :         tmp = ndef_parse_p2p(init ? sel : req);
    8664          18 :         if (tmp == NULL) {
    8665           0 :                 wpa_printf(MSG_DEBUG, "P2P: Could not parse NDEF");
    8666           0 :                 return -1;
    8667             :         }
    8668             : 
    8669          18 :         ret = wpas_p2p_nfc_connection_handover(wpa_s, tmp, init, 0,
    8670             :                                                forced_freq);
    8671          18 :         wpabuf_free(tmp);
    8672             : 
    8673          18 :         return ret;
    8674             : }
    8675             : 
    8676             : 
    8677          15 : int wpas_p2p_nfc_tag_enabled(struct wpa_supplicant *wpa_s, int enabled)
    8678             : {
    8679             :         const u8 *if_addr;
    8680          15 :         int go_intent = wpa_s->conf->p2p_go_intent;
    8681             :         struct wpa_supplicant *iface;
    8682             : 
    8683          15 :         if (wpa_s->global->p2p == NULL)
    8684           0 :                 return -1;
    8685             : 
    8686          15 :         if (!enabled) {
    8687           3 :                 wpa_printf(MSG_DEBUG, "P2P: Disable use of own NFC Tag");
    8688           6 :                 for (iface = wpa_s->global->ifaces; iface; iface = iface->next)
    8689             :                 {
    8690           3 :                         if (!iface->ap_iface)
    8691           3 :                                 continue;
    8692           0 :                         hostapd_wps_nfc_token_disable(iface->ap_iface->bss[0]);
    8693             :                 }
    8694           3 :                 p2p_set_authorized_oob_dev_pw_id(wpa_s->global->p2p, 0,
    8695             :                                                  0, NULL);
    8696           3 :                 if (wpa_s->p2p_nfc_tag_enabled)
    8697           3 :                         wpas_p2p_remove_pending_group_interface(wpa_s);
    8698           3 :                 wpa_s->p2p_nfc_tag_enabled = 0;
    8699           3 :                 return 0;
    8700             :         }
    8701             : 
    8702          12 :         if (wpa_s->global->p2p_disabled)
    8703           0 :                 return -1;
    8704             : 
    8705          24 :         if (wpa_s->conf->wps_nfc_dh_pubkey == NULL ||
    8706          24 :             wpa_s->conf->wps_nfc_dh_privkey == NULL ||
    8707          24 :             wpa_s->conf->wps_nfc_dev_pw == NULL ||
    8708          12 :             wpa_s->conf->wps_nfc_dev_pw_id < 0x10) {
    8709           0 :                 wpa_printf(MSG_DEBUG, "P2P: NFC password token not configured "
    8710             :                            "to allow static handover cases");
    8711           0 :                 return -1;
    8712             :         }
    8713             : 
    8714          12 :         wpa_printf(MSG_DEBUG, "P2P: Enable use of own NFC Tag");
    8715             : 
    8716          12 :         wpa_s->p2p_oob_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id;
    8717          12 :         wpabuf_free(wpa_s->p2p_oob_dev_pw);
    8718          12 :         wpa_s->p2p_oob_dev_pw = wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw);
    8719          12 :         if (wpa_s->p2p_oob_dev_pw == NULL)
    8720           0 :                 return -1;
    8721          12 :         wpa_s->p2p_peer_oob_pk_hash_known = 0;
    8722             : 
    8723          24 :         if (wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_GO ||
    8724          12 :             wpa_s->p2p_group_interface == P2P_GROUP_INTERFACE_CLIENT) {
    8725             :                 /*
    8726             :                  * P2P Group Interface present and the command came on group
    8727             :                  * interface, so enable the token for the current interface.
    8728             :                  */
    8729           0 :                 wpa_s->create_p2p_iface = 0;
    8730             :         } else {
    8731          12 :                 wpa_s->create_p2p_iface = wpas_p2p_create_iface(wpa_s);
    8732             :         }
    8733             : 
    8734          12 :         if (wpa_s->create_p2p_iface) {
    8735             :                 enum wpa_driver_if_type iftype;
    8736             :                 /* Prepare to add a new interface for the group */
    8737           4 :                 iftype = WPA_IF_P2P_GROUP;
    8738           4 :                 if (go_intent == 15)
    8739           0 :                         iftype = WPA_IF_P2P_GO;
    8740           4 :                 if (wpas_p2p_add_group_interface(wpa_s, iftype) < 0) {
    8741           0 :                         wpa_printf(MSG_ERROR, "P2P: Failed to allocate a new "
    8742             :                                    "interface for the group");
    8743           0 :                         return -1;
    8744             :                 }
    8745             : 
    8746           4 :                 if_addr = wpa_s->pending_interface_addr;
    8747           8 :         } else if (wpa_s->p2p_mgmt)
    8748           1 :                 if_addr = wpa_s->parent->own_addr;
    8749             :         else
    8750           7 :                 if_addr = wpa_s->own_addr;
    8751             : 
    8752          12 :         wpa_s->p2p_nfc_tag_enabled = enabled;
    8753             : 
    8754          26 :         for (iface = wpa_s->global->ifaces; iface; iface = iface->next) {
    8755             :                 struct hostapd_data *hapd;
    8756          14 :                 if (iface->ap_iface == NULL)
    8757          13 :                         continue;
    8758           1 :                 hapd = iface->ap_iface->bss[0];
    8759           1 :                 wpabuf_free(hapd->conf->wps_nfc_dh_pubkey);
    8760           2 :                 hapd->conf->wps_nfc_dh_pubkey =
    8761           1 :                         wpabuf_dup(wpa_s->conf->wps_nfc_dh_pubkey);
    8762           1 :                 wpabuf_free(hapd->conf->wps_nfc_dh_privkey);
    8763           2 :                 hapd->conf->wps_nfc_dh_privkey =
    8764           1 :                         wpabuf_dup(wpa_s->conf->wps_nfc_dh_privkey);
    8765           1 :                 wpabuf_free(hapd->conf->wps_nfc_dev_pw);
    8766           2 :                 hapd->conf->wps_nfc_dev_pw =
    8767           1 :                         wpabuf_dup(wpa_s->conf->wps_nfc_dev_pw);
    8768           1 :                 hapd->conf->wps_nfc_dev_pw_id = wpa_s->conf->wps_nfc_dev_pw_id;
    8769             : 
    8770           1 :                 if (hostapd_wps_nfc_token_enable(iface->ap_iface->bss[0]) < 0) {
    8771           0 :                         wpa_dbg(iface, MSG_DEBUG,
    8772             :                                 "P2P: Failed to enable NFC Tag for GO");
    8773             :                 }
    8774             :         }
    8775          24 :         p2p_set_authorized_oob_dev_pw_id(
    8776          24 :                 wpa_s->global->p2p, wpa_s->conf->wps_nfc_dev_pw_id, go_intent,
    8777             :                 if_addr);
    8778             : 
    8779          12 :         return 0;
    8780             : }
    8781             : 
    8782             : #endif /* CONFIG_WPS_NFC */
    8783             : 
    8784             : 
    8785       49300 : static void wpas_p2p_optimize_listen_channel(struct wpa_supplicant *wpa_s,
    8786             :                                              struct wpa_used_freq_data *freqs,
    8787             :                                              unsigned int num)
    8788             : {
    8789             :         u8 curr_chan, cand, chan;
    8790             :         unsigned int i;
    8791             : 
    8792             :         /*
    8793             :          * If possible, optimize the Listen channel to be a channel that is
    8794             :          * already used by one of the other interfaces.
    8795             :          */
    8796       49300 :         if (!wpa_s->conf->p2p_optimize_listen_chan)
    8797       98580 :                 return;
    8798             : 
    8799          17 :         if (!wpa_s->current_ssid || wpa_s->wpa_state != WPA_COMPLETED)
    8800          14 :                 return;
    8801             : 
    8802           3 :         curr_chan = p2p_get_listen_channel(wpa_s->global->p2p);
    8803           5 :         for (i = 0, cand = 0; i < num; i++) {
    8804           3 :                 ieee80211_freq_to_chan(freqs[i].freq, &chan);
    8805           3 :                 if (curr_chan == chan) {
    8806           1 :                         cand = 0;
    8807           1 :                         break;
    8808             :                 }
    8809             : 
    8810           2 :                 if (chan == 1 || chan == 6 || chan == 11)
    8811           2 :                         cand = chan;
    8812             :         }
    8813             : 
    8814           3 :         if (cand) {
    8815           2 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8816             :                         "P2P: Update Listen channel to %u based on operating channel",
    8817             :                         cand);
    8818           2 :                 p2p_set_listen_channel(wpa_s->global->p2p, 81, cand, 0);
    8819             :         }
    8820             : }
    8821             : 
    8822             : 
    8823           6 : static int wpas_p2p_move_go_csa(struct wpa_supplicant *wpa_s)
    8824             : {
    8825             :         struct hostapd_config *conf;
    8826             :         struct p2p_go_neg_results params;
    8827             :         struct csa_settings csa_settings;
    8828           6 :         struct wpa_ssid *current_ssid = wpa_s->current_ssid;
    8829           6 :         int old_freq = current_ssid->frequency;
    8830             :         int ret;
    8831             : 
    8832           6 :         if (!(wpa_s->drv_flags & WPA_DRIVER_FLAGS_AP_CSA)) {
    8833           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "CSA is not enabled");
    8834           0 :                 return -1;
    8835             :         }
    8836             : 
    8837             :         /*
    8838             :          * TODO: This function may not always work correctly. For example,
    8839             :          * when we have a running GO and a BSS on a DFS channel.
    8840             :          */
    8841           6 :         if (wpas_p2p_init_go_params(wpa_s, &params, 0, 0, 0, 0, 0, NULL)) {
    8842           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8843             :                         "P2P CSA: Failed to select new frequency for GO");
    8844           0 :                 return -1;
    8845             :         }
    8846             : 
    8847           6 :         if (current_ssid->frequency == params.freq) {
    8848           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8849             :                         "P2P CSA: Selected same frequency - not moving GO");
    8850           0 :                 return 0;
    8851             :         }
    8852             : 
    8853           6 :         conf = hostapd_config_defaults();
    8854           6 :         if (!conf) {
    8855           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8856             :                         "P2P CSA: Failed to allocate default config");
    8857           0 :                 return -1;
    8858             :         }
    8859             : 
    8860           6 :         current_ssid->frequency = params.freq;
    8861           6 :         if (wpa_supplicant_conf_ap_ht(wpa_s, current_ssid, conf)) {
    8862           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8863             :                         "P2P CSA: Failed to create new GO config");
    8864           0 :                 ret = -1;
    8865           0 :                 goto out;
    8866             :         }
    8867             : 
    8868           6 :         if (conf->hw_mode != wpa_s->ap_iface->current_mode->mode) {
    8869           2 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    8870             :                         "P2P CSA: CSA to a different band is not supported");
    8871           2 :                 ret = -1;
    8872           2 :                 goto out;
    8873             :         }
    8874             : 
    8875           4 :         os_memset(&csa_settings, 0, sizeof(csa_settings));
    8876           4 :         csa_settings.cs_count = P2P_GO_CSA_COUNT;
    8877           4 :         csa_settings.block_tx = P2P_GO_CSA_BLOCK_TX;
    8878           4 :         csa_settings.freq_params.freq = params.freq;
    8879           4 :         csa_settings.freq_params.sec_channel_offset = conf->secondary_channel;
    8880           4 :         csa_settings.freq_params.ht_enabled = conf->ieee80211n;
    8881           4 :         csa_settings.freq_params.bandwidth = conf->secondary_channel ? 40 : 20;
    8882             : 
    8883           4 :         if (conf->ieee80211ac) {
    8884           0 :                 int freq1 = 0, freq2 = 0;
    8885             :                 u8 chan, opclass;
    8886             : 
    8887           0 :                 if (ieee80211_freq_to_channel_ext(params.freq,
    8888             :                                                   conf->secondary_channel,
    8889           0 :                                                   conf->vht_oper_chwidth,
    8890             :                                                   &opclass, &chan) ==
    8891             :                     NUM_HOSTAPD_MODES) {
    8892           0 :                         wpa_printf(MSG_ERROR, "P2P CSA: Bad freq");
    8893           0 :                         ret = -1;
    8894           0 :                         goto out;
    8895             :                 }
    8896             : 
    8897           0 :                 if (conf->vht_oper_centr_freq_seg0_idx)
    8898           0 :                         freq1 = ieee80211_chan_to_freq(
    8899             :                                 NULL, opclass,
    8900           0 :                                 conf->vht_oper_centr_freq_seg0_idx);
    8901             : 
    8902           0 :                 if (conf->vht_oper_centr_freq_seg1_idx)
    8903           0 :                         freq2 = ieee80211_chan_to_freq(
    8904             :                                 NULL, opclass,
    8905           0 :                                 conf->vht_oper_centr_freq_seg1_idx);
    8906             : 
    8907           0 :                 if (freq1 < 0 || freq2 < 0) {
    8908           0 :                         wpa_dbg(wpa_s, MSG_DEBUG,
    8909             :                                 "P2P CSA: Selected invalid VHT center freqs");
    8910           0 :                         ret = -1;
    8911           0 :                         goto out;
    8912             :                 }
    8913             : 
    8914           0 :                 csa_settings.freq_params.vht_enabled = conf->ieee80211ac;
    8915           0 :                 csa_settings.freq_params.center_freq1 = freq1;
    8916           0 :                 csa_settings.freq_params.center_freq2 = freq2;
    8917             : 
    8918           0 :                 switch (conf->vht_oper_chwidth) {
    8919             :                 case VHT_CHANWIDTH_80MHZ:
    8920             :                 case VHT_CHANWIDTH_80P80MHZ:
    8921           0 :                         csa_settings.freq_params.bandwidth = 80;
    8922           0 :                         break;
    8923             :                 case VHT_CHANWIDTH_160MHZ:
    8924           0 :                         csa_settings.freq_params.bandwidth = 160;
    8925           0 :                         break;
    8926             :                 }
    8927             :         }
    8928             : 
    8929           4 :         ret = ap_switch_channel(wpa_s, &csa_settings);
    8930             : out:
    8931           6 :         current_ssid->frequency = old_freq;
    8932           6 :         hostapd_config_free(conf);
    8933           6 :         return ret;
    8934             : }
    8935             : 
    8936             : 
    8937           5 : static void wpas_p2p_move_go_no_csa(struct wpa_supplicant *wpa_s)
    8938             : {
    8939             :         struct p2p_go_neg_results params;
    8940           5 :         struct wpa_ssid *current_ssid = wpa_s->current_ssid;
    8941             : 
    8942           5 :         wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_REMOVE_AND_REFORM_GROUP);
    8943             : 
    8944           5 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Move GO from freq=%d MHz",
    8945             :                 current_ssid->frequency);
    8946             : 
    8947             :         /* Stop the AP functionality */
    8948             :         /* TODO: Should do this in a way that does not indicated to possible
    8949             :          * P2P Clients in the group that the group is terminated. */
    8950           5 :         wpa_supplicant_ap_deinit(wpa_s);
    8951             : 
    8952             :         /* Reselect the GO frequency */
    8953           5 :         if (wpas_p2p_init_go_params(wpa_s, &params, 0, 0, 0, 0, 0, NULL)) {
    8954           0 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Failed to reselect freq");
    8955           0 :                 wpas_p2p_group_delete(wpa_s,
    8956             :                                       P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL);
    8957           0 :                 return;
    8958             :         }
    8959           5 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: New freq selected for the GO (%u MHz)",
    8960             :                 params.freq);
    8961             : 
    8962          10 :         if (params.freq &&
    8963           5 :             !p2p_supported_freq_go(wpa_s->global->p2p, params.freq)) {
    8964           0 :                 wpa_printf(MSG_DEBUG,
    8965             :                            "P2P: Selected freq (%u MHz) is not valid for P2P",
    8966             :                            params.freq);
    8967           0 :                 wpas_p2p_group_delete(wpa_s,
    8968             :                                       P2P_GROUP_REMOVAL_GO_LEAVE_CHANNEL);
    8969           0 :                 return;
    8970             :         }
    8971             : 
    8972             :         /* Update the frequency */
    8973           5 :         current_ssid->frequency = params.freq;
    8974           5 :         wpa_s->connect_without_scan = current_ssid;
    8975           5 :         wpa_s->reassociate = 1;
    8976           5 :         wpa_s->disconnected = 0;
    8977           5 :         wpa_supplicant_req_scan(wpa_s, 0, 0);
    8978             : }
    8979             : 
    8980             : 
    8981           6 : static void wpas_p2p_move_go(void *eloop_ctx, void *timeout_ctx)
    8982             : {
    8983           6 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    8984             : 
    8985           6 :         if (!wpa_s->ap_iface || !wpa_s->current_ssid)
    8986           0 :                 return;
    8987             : 
    8988           6 :         wpas_p2p_go_update_common_freqs(wpa_s);
    8989             : 
    8990             :         /* Do not move GO in the middle of a CSA */
    8991           6 :         if (hostapd_csa_in_progress(wpa_s->ap_iface)) {
    8992           0 :                 wpa_printf(MSG_DEBUG,
    8993             :                            "P2P: CSA is in progress - not moving GO");
    8994           0 :                 return;
    8995             :         }
    8996             : 
    8997             :         /*
    8998             :          * First, try a channel switch flow. If it is not supported or fails,
    8999             :          * take down the GO and bring it up again.
    9000             :          */
    9001           6 :         if (wpas_p2p_move_go_csa(wpa_s) < 0)
    9002           5 :                 wpas_p2p_move_go_no_csa(wpa_s);
    9003             : }
    9004             : 
    9005             : 
    9006           1 : static void wpas_p2p_reconsider_moving_go(void *eloop_ctx, void *timeout_ctx)
    9007             : {
    9008           1 :         struct wpa_supplicant *wpa_s = eloop_ctx;
    9009           1 :         struct wpa_used_freq_data *freqs = NULL;
    9010           1 :         unsigned int num = wpa_s->num_multichan_concurrent;
    9011             : 
    9012           1 :         freqs = os_calloc(num, sizeof(struct wpa_used_freq_data));
    9013           1 :         if (!freqs)
    9014           1 :                 return;
    9015             : 
    9016           1 :         num = get_shared_radio_freqs_data(wpa_s, freqs, num);
    9017             : 
    9018             :         /* Previous attempt to move a GO was not possible -- try again. */
    9019           1 :         wpas_p2p_consider_moving_gos(wpa_s, freqs, num,
    9020             :                                      WPAS_P2P_CHANNEL_UPDATE_ANY);
    9021             : 
    9022           1 :         os_free(freqs);
    9023             : }
    9024             : 
    9025             : 
    9026             : /*
    9027             :  * Consider moving a GO from its currently used frequency:
    9028             :  * 1. It is possible that due to regulatory consideration the frequency
    9029             :  *    can no longer be used and there is a need to evacuate the GO.
    9030             :  * 2. It is possible that due to MCC considerations, it would be preferable
    9031             :  *    to move the GO to a channel that is currently used by some other
    9032             :  *    station interface.
    9033             :  *
    9034             :  * In case a frequency that became invalid is once again valid, cancel a
    9035             :  * previously initiated GO frequency change.
    9036             :  */
    9037        8112 : static void wpas_p2p_consider_moving_one_go(struct wpa_supplicant *wpa_s,
    9038             :                                             struct wpa_used_freq_data *freqs,
    9039             :                                             unsigned int num)
    9040             : {
    9041        8112 :         unsigned int i, invalid_freq = 0, policy_move = 0, flags = 0;
    9042             :         unsigned int timeout;
    9043             :         int freq;
    9044             : 
    9045        8112 :         wpas_p2p_go_update_common_freqs(wpa_s);
    9046             : 
    9047        8112 :         freq = wpa_s->current_ssid->frequency;
    9048       16236 :         for (i = 0, invalid_freq = 0; i < num; i++) {
    9049        8124 :                 if (freqs[i].freq == freq) {
    9050        8112 :                         flags = freqs[i].flags;
    9051             : 
    9052             :                         /* The channel is invalid, must change it */
    9053        8112 :                         if (!p2p_supported_freq_go(wpa_s->global->p2p, freq)) {
    9054          12 :                                 wpa_dbg(wpa_s, MSG_DEBUG,
    9055             :                                         "P2P: Freq=%d MHz no longer valid for GO",
    9056             :                                         freq);
    9057          12 :                                 invalid_freq = 1;
    9058             :                         }
    9059          12 :                 } else if (freqs[i].flags == 0) {
    9060             :                         /* Freq is not used by any other station interface */
    9061           0 :                         continue;
    9062          12 :                 } else if (!p2p_supported_freq(wpa_s->global->p2p,
    9063          12 :                                                freqs[i].freq)) {
    9064             :                         /* Freq is not valid for P2P use cases */
    9065           0 :                         continue;
    9066          12 :                 } else if (wpa_s->conf->p2p_go_freq_change_policy ==
    9067             :                            P2P_GO_FREQ_MOVE_SCM) {
    9068           5 :                         policy_move = 1;
    9069           7 :                 } else if (wpa_s->conf->p2p_go_freq_change_policy ==
    9070           4 :                            P2P_GO_FREQ_MOVE_SCM_PEER_SUPPORTS &&
    9071           4 :                            wpas_p2p_go_is_peer_freq(wpa_s, freqs[i].freq)) {
    9072           2 :                         policy_move = 1;
    9073           5 :                 } else if ((wpa_s->conf->p2p_go_freq_change_policy ==
    9074           0 :                             P2P_GO_FREQ_MOVE_SCM_ECSA) &&
    9075           0 :                            wpas_p2p_go_is_peer_freq(wpa_s, freqs[i].freq)) {
    9076           0 :                         if (!p2p_get_group_num_members(wpa_s->p2p_group)) {
    9077           0 :                                 policy_move = 1;
    9078           0 :                         } else if ((wpa_s->drv_flags &
    9079           0 :                                     WPA_DRIVER_FLAGS_AP_CSA) &&
    9080           0 :                                    wpas_p2p_go_clients_support_ecsa(wpa_s)) {
    9081             :                                 u8 chan;
    9082             : 
    9083             :                                 /*
    9084             :                                  * We do not support CSA between bands, so move
    9085             :                                  * GO only within the same band.
    9086             :                                  */
    9087           0 :                                 if (wpa_s->ap_iface->current_mode->mode ==
    9088           0 :                                     ieee80211_freq_to_chan(freqs[i].freq,
    9089             :                                                            &chan))
    9090           0 :                                         policy_move = 1;
    9091             :                         }
    9092             :                 }
    9093             :         }
    9094             : 
    9095        8112 :         wpa_dbg(wpa_s, MSG_DEBUG,
    9096             :                 "P2P: GO move: invalid_freq=%u, policy_move=%u, flags=0x%X",
    9097             :                 invalid_freq, policy_move, flags);
    9098             : 
    9099             :         /*
    9100             :          * The channel is valid, or we are going to have a policy move, so
    9101             :          * cancel timeout.
    9102             :          */
    9103        8112 :         if (!invalid_freq || policy_move) {
    9104        8100 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9105             :                         "P2P: Cancel a GO move from freq=%d MHz", freq);
    9106        8100 :                 eloop_cancel_timeout(wpas_p2p_move_go, wpa_s, NULL);
    9107             : 
    9108        8100 :                 if (wpas_p2p_in_progress(wpa_s)) {
    9109        6075 :                         wpa_dbg(wpa_s, MSG_DEBUG,
    9110             :                                 "P2P: GO move: policy CS is not allowed - setting timeout to re-consider GO move");
    9111        6075 :                         eloop_cancel_timeout(wpas_p2p_reconsider_moving_go,
    9112             :                                              wpa_s, NULL);
    9113        6075 :                         eloop_register_timeout(P2P_RECONSIDER_GO_MOVE_DELAY, 0,
    9114             :                                                wpas_p2p_reconsider_moving_go,
    9115             :                                                wpa_s, NULL);
    9116        6075 :                         return;
    9117             :                 }
    9118             :         }
    9119             : 
    9120        2037 :         if (!invalid_freq && (!policy_move || flags != 0)) {
    9121        2019 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9122             :                         "P2P: Not initiating a GO frequency change");
    9123        2019 :                 return;
    9124             :         }
    9125             : 
    9126             :         /*
    9127             :          * Do not consider moving GO if it is in the middle of a CSA. When the
    9128             :          * CSA is finished this flow should be retriggered.
    9129             :          */
    9130          18 :         if (hostapd_csa_in_progress(wpa_s->ap_iface)) {
    9131           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9132             :                         "P2P: Not initiating a GO frequency change - CSA is in progress");
    9133           0 :                 return;
    9134             :         }
    9135             : 
    9136          18 :         if (invalid_freq && !wpas_p2p_disallowed_freq(wpa_s->global, freq))
    9137          11 :                 timeout = P2P_GO_FREQ_CHANGE_TIME;
    9138             :         else
    9139           7 :                 timeout = 0;
    9140             : 
    9141          18 :         wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Move GO from freq=%d MHz in %d secs",
    9142             :                 freq, timeout);
    9143          18 :         eloop_cancel_timeout(wpas_p2p_move_go, wpa_s, NULL);
    9144          18 :         eloop_register_timeout(timeout, 0, wpas_p2p_move_go, wpa_s, NULL);
    9145             : }
    9146             : 
    9147             : 
    9148       49301 : static void wpas_p2p_consider_moving_gos(struct wpa_supplicant *wpa_s,
    9149             :                                          struct wpa_used_freq_data *freqs,
    9150             :                                          unsigned int num,
    9151             :                                          enum wpas_p2p_channel_update_trig trig)
    9152             : {
    9153             :         struct wpa_supplicant *ifs;
    9154             : 
    9155       49301 :         eloop_cancel_timeout(wpas_p2p_reconsider_moving_go, ELOOP_ALL_CTX,
    9156             :                              NULL);
    9157             : 
    9158             :         /*
    9159             :          * Travers all the radio interfaces, and for each GO interface, check
    9160             :          * if there is a need to move the GO from the frequency it is using,
    9161             :          * or in case the frequency is valid again, cancel the evacuation flow.
    9162             :          */
    9163      108612 :         dl_list_for_each(ifs, &wpa_s->radio->ifaces, struct wpa_supplicant,
    9164             :                          radio_list) {
    9165       97268 :                 if (ifs->current_ssid == NULL ||
    9166       37957 :                     ifs->current_ssid->mode != WPAS_MODE_P2P_GO)
    9167       50894 :                         continue;
    9168             : 
    9169             :                 /*
    9170             :                  * The GO was just started or completed channel switch, no need
    9171             :                  * to move it.
    9172             :                  */
    9173        8417 :                 if (wpa_s == ifs &&
    9174         273 :                     (trig == WPAS_P2P_CHANNEL_UPDATE_STATE_CHANGE ||
    9175             :                      trig == WPAS_P2P_CHANNEL_UPDATE_CS)) {
    9176         305 :                         wpa_dbg(wpa_s, MSG_DEBUG,
    9177             :                                 "P2P: GO move - schedule re-consideration");
    9178         305 :                         eloop_register_timeout(P2P_RECONSIDER_GO_MOVE_DELAY, 0,
    9179             :                                                wpas_p2p_reconsider_moving_go,
    9180             :                                                wpa_s, NULL);
    9181         305 :                         continue;
    9182             :                 }
    9183             : 
    9184        8112 :                 wpas_p2p_consider_moving_one_go(ifs, freqs, num);
    9185             :         }
    9186       49301 : }
    9187             : 
    9188             : 
    9189       35380 : void wpas_p2p_indicate_state_change(struct wpa_supplicant *wpa_s)
    9190             : {
    9191       35380 :         if (wpa_s->global->p2p_disabled || wpa_s->global->p2p == NULL)
    9192       35872 :                 return;
    9193             : 
    9194       34888 :         wpas_p2p_update_channel_list(wpa_s,
    9195             :                                      WPAS_P2P_CHANNEL_UPDATE_STATE_CHANGE);
    9196             : }
    9197             : 
    9198             : 
    9199         733 : void wpas_p2p_deinit_iface(struct wpa_supplicant *wpa_s)
    9200             : {
    9201         733 :         if (wpa_s == wpa_s->global->p2p_init_wpa_s && wpa_s->global->p2p) {
    9202         289 :                 wpa_dbg(wpa_s, MSG_DEBUG, "P2P: Disable P2P since removing "
    9203             :                         "the management interface is being removed");
    9204         289 :                 wpas_p2p_deinit_global(wpa_s->global);
    9205             :         }
    9206         733 : }
    9207             : 
    9208             : 
    9209         442 : void wpas_p2p_ap_deinit(struct wpa_supplicant *wpa_s)
    9210             : {
    9211         442 :         if (wpa_s->ap_iface->bss)
    9212         438 :                 wpa_s->ap_iface->bss[0]->p2p_group = NULL;
    9213         442 :         wpas_p2p_group_deinit(wpa_s);
    9214         442 : }
    9215             : 
    9216             : 
    9217           1 : int wpas_p2p_lo_start(struct wpa_supplicant *wpa_s, unsigned int freq,
    9218             :                       unsigned int period, unsigned int interval,
    9219             :                       unsigned int count)
    9220             : {
    9221           1 :         struct p2p_data *p2p = wpa_s->global->p2p;
    9222             :         u8 *device_types;
    9223             :         size_t dev_types_len;
    9224             :         struct wpabuf *buf;
    9225             :         int ret;
    9226             : 
    9227           1 :         if (wpa_s->p2p_lo_started) {
    9228           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9229             :                         "P2P Listen offload is already started");
    9230           0 :                 return 0;
    9231             :         }
    9232             : 
    9233           2 :         if (wpa_s->global->p2p == NULL ||
    9234           1 :             !(wpa_s->drv_flags & WPA_DRIVER_FLAGS_P2P_LISTEN_OFFLOAD)) {
    9235           1 :                 wpa_printf(MSG_DEBUG, "P2P: Listen offload not supported");
    9236           1 :                 return -1;
    9237             :         }
    9238             : 
    9239           0 :         if (!p2p_supported_freq(wpa_s->global->p2p, freq)) {
    9240           0 :                 wpa_printf(MSG_ERROR, "P2P: Input channel not supported: %u",
    9241             :                            freq);
    9242           0 :                 return -1;
    9243             :         }
    9244             : 
    9245             :         /* Get device type */
    9246           0 :         dev_types_len = (wpa_s->conf->num_sec_device_types + 1) *
    9247             :                 WPS_DEV_TYPE_LEN;
    9248           0 :         device_types = os_malloc(dev_types_len);
    9249           0 :         if (!device_types)
    9250           0 :                 return -1;
    9251           0 :         os_memcpy(device_types, wpa_s->conf->device_type, WPS_DEV_TYPE_LEN);
    9252           0 :         os_memcpy(&device_types[WPS_DEV_TYPE_LEN], wpa_s->conf->sec_device_type,
    9253             :                   wpa_s->conf->num_sec_device_types * WPS_DEV_TYPE_LEN);
    9254             : 
    9255             :         /* Get Probe Response IE(s) */
    9256           0 :         buf = p2p_build_probe_resp_template(p2p, freq);
    9257           0 :         if (!buf) {
    9258           0 :                 os_free(device_types);
    9259           0 :                 return -1;
    9260             :         }
    9261             : 
    9262           0 :         ret = wpa_drv_p2p_lo_start(wpa_s, freq, period, interval, count,
    9263             :                                    device_types, dev_types_len,
    9264           0 :                                    wpabuf_mhead_u8(buf), wpabuf_len(buf));
    9265           0 :         if (ret < 0)
    9266           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9267             :                         "P2P: Failed to start P2P listen offload");
    9268             : 
    9269           0 :         os_free(device_types);
    9270           0 :         wpabuf_free(buf);
    9271             : 
    9272           0 :         if (ret == 0) {
    9273           0 :                 wpa_s->p2p_lo_started = 1;
    9274             : 
    9275             :                 /* Stop current P2P listen if any */
    9276           0 :                 wpas_stop_listen(wpa_s);
    9277             :         }
    9278             : 
    9279           0 :         return ret;
    9280             : }
    9281             : 
    9282             : 
    9283           2 : int wpas_p2p_lo_stop(struct wpa_supplicant *wpa_s)
    9284             : {
    9285             :         int ret;
    9286             : 
    9287           2 :         if (!wpa_s->p2p_lo_started)
    9288           2 :                 return 0;
    9289             : 
    9290           0 :         ret = wpa_drv_p2p_lo_stop(wpa_s);
    9291           0 :         if (ret < 0)
    9292           0 :                 wpa_dbg(wpa_s, MSG_DEBUG,
    9293             :                         "P2P: Failed to stop P2P listen offload");
    9294             : 
    9295           0 :         wpa_s->p2p_lo_started = 0;
    9296           0 :         return ret;
    9297             : }

Generated by: LCOV version 1.10