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;
*/
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()
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;
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 {
}
+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,
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);
}
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);
}
if (pos2) {
pos2 += 13;
bootstrap = atoi(pos2);
- pd = true;
}
while ((token = str_token(pos, " ", &context))) {
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;
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);
}
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");
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);
+ }
}
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 */
}
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;
}
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)
{
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)
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,