From: Vinay Gannevaram Date: Wed, 22 Jan 2025 10:04:15 +0000 (+0530) Subject: P2P2: Bootstrapping through wpas_p2p_prov_disc() X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6799809eec5d710b3a861228edf05b3502e2d7bf;p=thirdparty%2Fhostap.git P2P2: Bootstrapping through wpas_p2p_prov_disc() 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 --- diff --git a/src/p2p/p2p.c b/src/p2p/p2p.c index 767b1543a..a579cfe2a 100644 --- a/src/p2p/p2p.c +++ b/src/p2p/p2p.c @@ -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; diff --git a/src/p2p/p2p.h b/src/p2p/p2p.h index bcf317ba6..801c660cc 100644 --- a/src/p2p/p2p.h +++ b/src/p2p/p2p.h @@ -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() diff --git a/src/p2p/p2p_go_neg.c b/src/p2p/p2p_go_neg.c index ac6bbf75f..4b787a576 100644 --- a/src/p2p/p2p_go_neg.c +++ b/src/p2p/p2p_go_neg.c @@ -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; diff --git a/src/p2p/p2p_pd.c b/src/p2p/p2p_pd.c index a55e7e688..8e0a7e49e 100644 --- a/src/p2p/p2p_pd.c +++ b/src/p2p/p2p_pd.c @@ -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, diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c index eda2ecd5e..0a8faa518 100644 --- a/wpa_supplicant/ctrl_iface.c +++ b/wpa_supplicant/ctrl_iface.c @@ -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; - /* [join|auto] */ + /* [join|auto] [bstrapmethod=] */ 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); } diff --git a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c index ce49bce0b..fc59947ee 100644 --- a/wpa_supplicant/dbus/dbus_new_handlers_p2p.c +++ b/wpa_supplicant/dbus/dbus_new_handlers_p2p.c @@ -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"); diff --git a/wpa_supplicant/p2p_supplicant.c b/wpa_supplicant/p2p_supplicant.c index 0f8ea11f4..e084a886f 100644 --- a/wpa_supplicant/p2p_supplicant.c +++ b/wpa_supplicant/p2p_supplicant.c @@ -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) diff --git a/wpa_supplicant/p2p_supplicant.h b/wpa_supplicant/p2p_supplicant.h index 501172450..1fef8bb82 100644 --- a/wpa_supplicant/p2p_supplicant.h +++ b/wpa_supplicant/p2p_supplicant.h @@ -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,