]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
P2P2: Bootstrapping through wpas_p2p_prov_disc()
authorVinay Gannevaram <quic_vganneva@quicinc.com>
Wed, 22 Jan 2025 10:04:15 +0000 (15:34 +0530)
committerJouni Malinen <j@w1.fi>
Fri, 24 Jan 2025 21:12:51 +0000 (23:12 +0200)
Upper layer component can use separate calls for bootstrapping and
pairing. Add support for bootstrapping through wpas_p2p_prov_disc() and
pairing through wpas_p2p_connect() by skipping bootstrapping with input
parameter pd equals to 0.

Signed-off-by: Vinay Gannevaram <quic_vganneva@quicinc.com>
src/p2p/p2p.c
src/p2p/p2p.h
src/p2p/p2p_go_neg.c
src/p2p/p2p_pd.c
wpa_supplicant/ctrl_iface.c
wpa_supplicant/dbus/dbus_new_handlers_p2p.c
wpa_supplicant/p2p_supplicant.c
wpa_supplicant/p2p_supplicant.h

index 767b1543a483412b28fc013c14515e35e34008e9..a579cfe2a062db8381be30a5148fdf9fbade13f6 100644 (file)
@@ -6620,6 +6620,9 @@ int p2p_initiate_pasn_auth(struct p2p_data *p2p, const u8 *addr, int freq)
                return -1;
        }
 
+       if (freq == 0)
+               freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
+
        dev->role = P2P_ROLE_PAIRING_INITIATOR;
        p2p_pasn_initialize(p2p, dev, addr, freq, false, true);
        pasn = dev->pasn;
index bcf317ba6817bb63daa43da688cd3161928e35ab..801c660cc4c6154bcb2c6fef50cd673d6d25327e 100644 (file)
@@ -1658,6 +1658,17 @@ int p2p_authorize(struct p2p_data *p2p, const u8 *peer_addr,
  */
 int p2p_reject(struct p2p_data *p2p, const u8 *peer_addr);
 
+/**
+ * p2p_set_req_bootstrap_method - Send Provision Discovery Request to initiate
+ *      bootstrapping
+ * @p2p: P2P module context from p2p_init()
+ * @peer_addr: MAC address of the peer P2P client
+ * @boostrap: Bootstrapping method
+ * Returns: 0 on success, -1 on failure
+ */
+int p2p_set_req_bootstrap_method(struct p2p_data *p2p, const u8 *peer_addr,
+                                u16 bootstrap);
+
 /**
  * p2p_prov_disc_req - Send Provision Discovery Request
  * @p2p: P2P module context from p2p_init()
index ac6bbf75fcd82cec58c442083957830a137e32a4..4b787a576622c4b3dc24c7e571bece72409fca29 100644 (file)
@@ -260,6 +260,8 @@ int p2p_connect_send(struct p2p_data *p2p, struct p2p_device *dev)
                        return -1;
                return p2p_prov_disc_req(p2p, dev->info.p2p_device_addr,
                                         NULL, config_method, 0, 0, 1);
+       } else if (dev->p2p2) {
+               return 0;
        }
 
        freq = dev->listen_freq > 0 ? dev->listen_freq : dev->oper_freq;
index a55e7e68822aea8f746eec9ecbd18ff7fc4d1943..8e0a7e49e03f9486b9b2b78ed0315f4c1aec6575 100644 (file)
@@ -780,9 +780,6 @@ static void p2p_process_prov_disc_bootstrap_req(struct p2p_data *p2p,
 
                if (!dev->req_bootstrap_method) {
                        status = P2P_SC_COMEBACK;
-                       if (p2p->cfg->bootstrap_req_rx)
-                               p2p->cfg->bootstrap_req_rx(p2p->cfg->cb_ctx,
-                                                          sa, bootstrap);
                        goto out;
                }
        } else {
@@ -2117,6 +2114,24 @@ int p2p_send_prov_disc_req(struct p2p_data *p2p, struct p2p_device *dev,
 }
 
 
+int p2p_set_req_bootstrap_method(struct p2p_data *p2p, const u8 *peer_addr,
+                                u16 bootstrap)
+{
+       struct p2p_device *dev;
+
+       dev = p2p_get_device(p2p, peer_addr);
+       if (!dev) {
+               p2p_dbg(p2p, "Bootstrap request for peer " MACSTR
+                       " not yet known", MAC2STR(peer_addr));
+               return -1;
+       }
+
+       dev->p2p2 = 1;
+       dev->req_bootstrap_method = bootstrap;
+       return 0;
+}
+
+
 int p2p_prov_disc_req(struct p2p_data *p2p, const u8 *peer_addr,
                      struct p2ps_provision *p2ps_prov,
                      u16 config_methods, int join, int force_freq,
index eda2ecd5e125027c38611f1af9134d9af31bc90c..0a8faa518786cc3f0276599462da8f6bc0c392fd 100644 (file)
@@ -6322,7 +6322,7 @@ static int p2p_ctrl_asp_provision_resp(struct wpa_supplicant *wpa_s, char *cmd)
                return -1;
        }
 
-       return wpas_p2p_prov_disc(wpa_s, addr, NULL, WPAS_P2P_PD_FOR_ASP,
+       return wpas_p2p_prov_disc(wpa_s, addr, NULL, 0, WPAS_P2P_PD_FOR_ASP,
                                  p2ps_prov);
 }
 
@@ -6351,7 +6351,7 @@ static int p2p_ctrl_asp_provision(struct wpa_supplicant *wpa_s, char *cmd)
 
        p2ps_prov->pd_seeker = 1;
 
-       return wpas_p2p_prov_disc(wpa_s, addr, NULL, WPAS_P2P_PD_FOR_ASP,
+       return wpas_p2p_prov_disc(wpa_s, addr, NULL, 0, WPAS_P2P_PD_FOR_ASP,
                                  p2ps_prov);
 }
 
@@ -6531,7 +6531,6 @@ static int p2p_ctrl_connect(struct wpa_supplicant *wpa_s, char *cmd,
        if (pos2) {
                pos2 += 13;
                bootstrap = atoi(pos2);
-               pd = true;
        }
 
        while ((token = str_token(pos, " ", &context))) {
@@ -6590,10 +6589,11 @@ static int p2p_ctrl_listen(struct wpa_supplicant *wpa_s, char *cmd)
 static int p2p_ctrl_prov_disc(struct wpa_supplicant *wpa_s, char *cmd)
 {
        u8 addr[ETH_ALEN];
-       char *pos;
+       char *pos, *pos2;
        enum wpas_p2p_prov_disc_use use = WPAS_P2P_PD_FOR_GO_NEG;
+       u16 bootstrap = 0;
 
-       /* <addr> <config method> [join|auto] */
+       /* <addr> <config method> [join|auto] [bstrapmethod=<value>] */
 
        if (hwaddr_aton(cmd, addr))
                return -1;
@@ -6608,7 +6608,13 @@ static int p2p_ctrl_prov_disc(struct wpa_supplicant *wpa_s, char *cmd)
        else if (os_strstr(pos, " auto") != NULL)
                use = WPAS_P2P_PD_AUTO;
 
-       return wpas_p2p_prov_disc(wpa_s, addr, pos, use, NULL);
+       pos2 = os_strstr(pos, "bstrapmethod=");
+       if (pos2) {
+               pos2 += 13;
+               bootstrap = atoi(pos2);
+       }
+
+       return wpas_p2p_prov_disc(wpa_s, addr, pos, bootstrap, use, NULL);
 }
 
 
index ce49bce0bdb8d6aee96777a2ed8ba53f17ff46e1..fc59947ee5464ff2fdb6d2630a7e0f23bbc1a4ee 100644 (file)
@@ -929,7 +929,7 @@ DBusMessage * wpas_dbus_handler_p2p_prov_disc_req(DBusMessage *message,
        if (!wpa_s)
                return wpas_dbus_error_no_p2p_mgmt_iface(message);
 
-       if (wpas_p2p_prov_disc(wpa_s, peer_addr, config_method,
+       if (wpas_p2p_prov_disc(wpa_s, peer_addr, config_method, 0,
                               WPAS_P2P_PD_FOR_GO_NEG, NULL) < 0)
                return wpas_dbus_error_unknown_error(message,
                                "Failed to send provision discovery request");
index 0f8ea11f4a64c7c5fcb70b1368d136cbd3db7209..e084a886fcaed27d3a0043448945ea35517ca687 100644 (file)
@@ -5371,19 +5371,27 @@ static void wpas_p2p_send_bootstrap_comeback(void *eloop_ctx, void *timeout_ctx)
        struct wpa_supplicant *wpa_s = eloop_ctx;
 
        wpa_printf(MSG_DEBUG, "P2P2: Send bootstrapping comeback PD Request");
-       wpas_p2p_connect(wpa_s, wpa_s->p2p_bootstrap_dev_addr, wpa_s->p2p_pin,
-                        wpa_s->p2p_wps_method, wpa_s->p2p_persistent_group, 0,
-                        0, 0, wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
-                        wpa_s->p2p_go_vht_center_freq2,
-                        wpa_s->p2p_persistent_id,
-                        wpa_s->p2p_pd_before_go_neg,
-                        wpa_s->p2p_go_ht40,
-                        wpa_s->p2p_go_vht,
-                        wpa_s->p2p_go_max_oper_chwidth,
-                        wpa_s->p2p_go_he,
-                        wpa_s->p2p_go_edmg,
-                        NULL, 0, is_p2p_allow_6ghz(wpa_s->global->p2p),
-                        wpa_s->p2p2, wpa_s->p2p_bootstrap, NULL, false);
+
+       if (wpa_s->p2p_pd_before_go_neg) {
+               wpas_p2p_connect(wpa_s, wpa_s->p2p_bootstrap_dev_addr,
+                                wpa_s->p2p_pin, wpa_s->p2p_wps_method,
+                                wpa_s->p2p_persistent_group, 0, 0, 0,
+                                wpa_s->p2p_go_intent, wpa_s->p2p_connect_freq,
+                                wpa_s->p2p_go_vht_center_freq2,
+                                wpa_s->p2p_persistent_id, 1,
+                                wpa_s->p2p_go_ht40,
+                                wpa_s->p2p_go_vht,
+                                wpa_s->p2p_go_max_oper_chwidth,
+                                wpa_s->p2p_go_he,
+                                wpa_s->p2p_go_edmg,
+                                NULL, 0, is_p2p_allow_6ghz(wpa_s->global->p2p),
+                                wpa_s->p2p2, wpa_s->p2p_bootstrap, NULL,
+                                false);
+       } else {
+               p2p_prov_disc_req(wpa_s->global->p2p,
+                                 wpa_s->p2p_bootstrap_dev_addr, NULL,
+                                 0, 0, 0, 1);
+       }
 }
 
 
@@ -5433,7 +5441,8 @@ static void wpas_bootstrap_completed(void *ctx, const u8 *addr,
                       MAC2STR(addr), status);
 
 #ifdef CONFIG_PASN
-       wpas_p2p_initiate_pasn_auth(wpa_s, addr, freq);
+       if (wpa_s->p2p_pd_before_go_neg)
+               wpas_p2p_initiate_pasn_auth(wpa_s, addr, freq);
 #endif /* CONFIG_PASN */
 }
 
@@ -7066,6 +7075,12 @@ int wpas_p2p_connect(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                        wpas_p2p_remove_pending_group_interface(wpa_s);
                return -1;
        }
+
+#ifdef CONFIG_PASN
+       if (wpa_s->p2p2 && !wpa_s->p2p_pd_before_go_neg)
+               wpas_p2p_initiate_pasn_auth(wpa_s, peer_addr, force_freq);
+#endif /* CONFIG_PASN */
+
        return ret;
 }
 
@@ -8355,7 +8370,7 @@ int wpas_p2p_wps_eapol_cb(struct wpa_supplicant *wpa_s)
 
 
 int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
-                      const char *config_method,
+                      const char *config_method, u16 bootstrap,
                       enum wpas_p2p_prov_disc_use use,
                       struct p2ps_provision *p2ps_prov)
 {
@@ -8377,6 +8392,12 @@ int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
                           p2ps_prov->status, p2ps_prov->info);
 
                config_methods = 0;
+       } else if (bootstrap) {
+               wpa_s->p2p2 = true;
+               config_methods = 0;
+               wpa_s->p2p_bootstrap = bootstrap;
+               p2p_set_req_bootstrap_method(wpa_s->global->p2p, peer_addr,
+                                            bootstrap);
        } else if (os_strncmp(config_method, "display", 7) == 0)
                config_methods = WPS_CONFIG_DISPLAY;
        else if (os_strncmp(config_method, "keypad", 6) == 0)
index 5011724501b6a27c573131ef65e37d4af06fc633..1fef8bb82bb3c546e161290d7af832bae1c5bb22 100644 (file)
@@ -67,7 +67,7 @@ enum wpas_p2p_prov_disc_use {
        WPAS_P2P_PD_FOR_ASP
 };
 int wpas_p2p_prov_disc(struct wpa_supplicant *wpa_s, const u8 *peer_addr,
-                      const char *config_method,
+                      const char *config_method, u16 bootstrap,
                       enum wpas_p2p_prov_disc_use use,
                       struct p2ps_provision *p2ps_prov);
 void wpas_send_action_tx_status(struct wpa_supplicant *wpa_s, const u8 *dst,