@@ -304,6 +304,10 @@ extern "C" {
#define P2P_EVENT_P2PS_PROVISION_START "P2PS-PROV-START "
#define P2P_EVENT_P2PS_PROVISION_DONE "P2PS-PROV-DONE "
+#define P2P_EVENT_BOOTSTRAP_REQUEST "P2P-BOOTSTRAP-REQUEST "
+#define P2P_EVENT_BOOTSTRAP_SUCCESS "P2P-BOOTSTRAP-SUCCESS "
+#define P2P_EVENT_BOOTSTRAP_FAILURE "P2P-BOOTSTRAP-FAILURE "
+
#define INTERWORKING_AP "INTERWORKING-AP "
#define INTERWORKING_EXCLUDED "INTERWORKING-BLACKLISTED "
#define INTERWORKING_NO_MATCH "INTERWORKING-NO-MATCH "
@@ -1225,6 +1225,31 @@ struct p2p_config {
*/
void (*register_bootstrap_comeback)(void *ctx, const u8 *addr,
u16 comeback_after);
+
+ /**
+ * bootstrap_req_rx - Indicate bootstrap request from a p2p peer
+ * @ctx: Callback context from cb_ctx
+ * @addr: p2p device address from which bootstrap request received
+ * @bootstrap_method: bootstrapping method request by peer device
+ *
+ * This function can be used to notify that bootstrap request is
+ * received from the p2p peer.
+ */
+ void (*bootstrap_req_rx)(void *ctx, const u8 *addr,
+ u16 bootstrap_method);
+
+ /**
+ * bootstrap_completed - Indicate bootstrapping completed with p2p peer
+ * @ctx: Callback context from cb_ctx
+ * @addr: p2p device address with which bootstrapping is completed
+ * @status: status of bootstrapping handshake
+ * @freq: freq in which bootstrapping is done
+ *
+ * This function can be used to notify the status of bootstrapping
+ * handshake.
+ */
+ void (*bootstrap_completed)(void *ctx, const u8 *addr, int status,
+ int freq);
};
@@ -752,6 +752,9 @@ 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 {
@@ -775,6 +778,9 @@ static void p2p_process_prov_disc_bootstrap_req(struct p2p_data *p2p,
dev->bootstrap_params->comeback_after =
p2p->cfg->comeback_after;
status = P2P_SC_COMEBACK;
+ if (p2p->cfg->bootstrap_req_rx)
+ p2p->cfg->bootstrap_req_rx(p2p->cfg->cb_ctx,
+ sa, bootstrap);
goto out;
}
}
@@ -1672,6 +1678,10 @@ static void p2p_process_prov_disc_bootstrap_resp(struct p2p_data *p2p,
p2p->cfg->send_action_done(p2p->cfg->cb_ctx);
if (dev->flags & P2P_DEV_PD_BEFORE_GO_NEG)
dev->flags &= ~P2P_DEV_PD_BEFORE_GO_NEG;
+
+ if (p2p->cfg->bootstrap_completed)
+ p2p->cfg->bootstrap_completed(p2p->cfg->cb_ctx, sa, status,
+ rx_freq);
}
@@ -2332,6 +2332,113 @@ void wpas_dbus_signal_p2p_invitation_received(struct wpa_supplicant *wpa_s,
}
+/**
+ * wpas_dbus_signal_p2p_bootstrap_req - Signal P2P Bootstrap Request RX
+ * @wpa_s: %wpa_supplicant network interface data
+ * @src: Source address of the message triggering this notification
+ * @bootstrap_method: Peer's Bootstrap method
+ *
+ * Sends signal to notify that a peer P2P Device is requesting bootstrapping
+ * negotiation with us.
+ */
+void wpas_dbus_signal_p2p_bootstrap_req(struct wpa_supplicant *wpa_s,
+ const u8 *src, u16 bootstrap_method)
+{
+ DBusMessage *msg;
+ DBusMessageIter iter;
+ struct wpas_dbus_priv *iface;
+ char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
+
+ iface = wpa_s->global->dbus;
+
+ /* Do nothing if the control interface is not turned on */
+ if (!iface)
+ return;
+
+ if (wpa_s->p2p_mgmt)
+ wpa_s = wpa_s->parent;
+ if (!wpa_s->dbus_new_path)
+ return;
+
+ os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
+ "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
+ wpa_s->dbus_new_path, MAC2STR(src));
+ path = peer_obj_path;
+
+ msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+ WPAS_DBUS_NEW_IFACE_P2PDEVICE,
+ "BootstrappingRequest");
+ if (!msg)
+ return;
+
+ dbus_message_iter_init_append(msg, &iter);
+
+ if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+ &path) ||
+ !dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT16,
+ &bootstrap_method))
+ wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+ else
+ dbus_connection_send(iface->con, msg, NULL);
+
+ dbus_message_unref(msg);
+}
+
+
+/**
+ * wpas_dbus_signal_p2p_bootstrap_completed - Signal P2P Bootstrap completed
+ * event
+ * @wpa_s: %wpa_supplicant network interface data
+ * @src: Source address of the peer with which bootstrapping is done
+ * @status: status of Bootstrapping handshake
+ *
+ * Sends signal to notify that a peer P2P Device is requesting bootstrapping
+ * negotiation with us.
+ */
+void wpas_dbus_signal_p2p_bootstrap_completed(struct wpa_supplicant *wpa_s,
+ const u8 *src, int status)
+{
+ DBusMessage *msg;
+ DBusMessageIter iter;
+ struct wpas_dbus_priv *iface;
+ char peer_obj_path[WPAS_DBUS_OBJECT_PATH_MAX], *path;
+
+ iface = wpa_s->global->dbus;
+
+ /* Do nothing if the control interface is not turned on */
+ if (!iface)
+ return;
+
+ if (wpa_s->p2p_mgmt)
+ wpa_s = wpa_s->parent;
+ if (!wpa_s->dbus_new_path)
+ return;
+
+ os_snprintf(peer_obj_path, WPAS_DBUS_OBJECT_PATH_MAX,
+ "%s/" WPAS_DBUS_NEW_P2P_PEERS_PART "/" COMPACT_MACSTR,
+ wpa_s->dbus_new_path, MAC2STR(src));
+ path = peer_obj_path;
+
+ msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+ WPAS_DBUS_NEW_IFACE_P2PDEVICE,
+ "BootstrappingCompleted");
+ if (!msg)
+ return;
+
+ dbus_message_iter_init_append(msg, &iter);
+
+ if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
+ &path) ||
+ !dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
+ &status))
+ wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+ else
+ dbus_connection_send(iface->con, msg, NULL);
+
+ dbus_message_unref(msg);
+}
+
+
#endif /* CONFIG_P2P */
@@ -264,6 +264,10 @@ void wpas_dbus_signal_p2p_invitation_received(struct wpa_supplicant *wpa_s,
const u8 *sa, const u8 *dev_addr,
const u8 *bssid, int id,
int op_freq);
+void wpas_dbus_signal_p2p_bootstrap_req(struct wpa_supplicant *wpa_s,
+ const u8 *src, u16 bootstrap_method);
+void wpas_dbus_signal_p2p_bootstrap_completed(struct wpa_supplicant *wpa_s,
+ const u8 *src, int status);
void wpas_dbus_signal_mesh_group_started(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid);
void wpas_dbus_signal_mesh_group_removed(struct wpa_supplicant *wpa_s,
@@ -616,6 +620,18 @@ void wpas_dbus_signal_p2p_invitation_received(struct wpa_supplicant *wpa_s,
}
static inline
+void wpas_dbus_signal_p2p_bootstrap_req(struct wpa_supplicant *wpa_s,
+ const u8 *src, u16 bootstrap_method)
+{
+}
+
+static inline
+void wpas_dbus_signal_p2p_bootstrap_completed(struct wpa_supplicant *wpa_s,
+ const u8 *src, int status)
+{
+}
+
+static inline
void wpas_dbus_signal_mesh_group_started(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid)
{
@@ -782,6 +782,18 @@ void wpas_notify_p2p_invitation_received(struct wpa_supplicant *wpa_s,
id, op_freq);
}
+void wpas_notify_p2p_bootstrap_req(struct wpa_supplicant *wpa_s,
+ const u8 *src, u16 bootstrap_method)
+{
+ wpas_dbus_signal_p2p_bootstrap_req(wpa_s, src, bootstrap_method);
+}
+
+void wpas_notify_p2p_bootstrap_completed(struct wpa_supplicant *wpa_s,
+ const u8 *src, int status)
+{
+ wpas_dbus_signal_p2p_bootstrap_completed(wpa_s, src, status);
+}
+
#endif /* CONFIG_P2P */
@@ -153,6 +153,10 @@ void wpas_notify_network_type_changed(struct wpa_supplicant *wpa_s,
void wpas_notify_p2p_invitation_received(struct wpa_supplicant *wpa_s,
const u8 *sa, const u8 *go_dev_addr,
const u8 *bssid, int id, int op_freq);
+void wpas_notify_p2p_bootstrap_req(struct wpa_supplicant *wpa_s,
+ const u8 *src, u16 bootstrap_method);
+void wpas_notify_p2p_bootstrap_completed(struct wpa_supplicant *wpa_s,
+ const u8 *src, int status);
void wpas_notify_mesh_group_started(struct wpa_supplicant *wpa_s,
struct wpa_ssid *ssid);
void wpas_notify_mesh_group_removed(struct wpa_supplicant *wpa_s,
@@ -4855,6 +4855,40 @@ static void wpas_p2p_register_bootstrap_comeback(void *ctx, const u8 *addr,
wpa_s, NULL);
}
+
+static void wpas_bootstrap_req_rx(void *ctx, const u8 *addr,
+ u16 bootstrap_method)
+{
+ struct wpa_supplicant *wpa_s = ctx;
+
+ wpa_msg_global(wpa_s, MSG_INFO, P2P_EVENT_BOOTSTRAP_REQUEST MACSTR
+ " bootstrap_method=%u", MAC2STR(addr), bootstrap_method);
+
+ wpas_notify_p2p_bootstrap_req(wpa_s, addr, bootstrap_method);
+}
+
+static void wpas_bootstrap_completed(void *ctx, const u8 *addr, int status,
+ int freq)
+{
+ struct wpa_supplicant *wpa_s = ctx;
+
+ wpas_notify_p2p_bootstrap_completed(wpa_s, addr, status);
+
+ if (status) {
+ wpa_msg_global(wpa_s, MSG_INFO,
+ P2P_EVENT_BOOTSTRAP_FAILURE MACSTR "status=%d",
+ MAC2STR(addr), status);
+ } else {
+ wpa_msg_global(wpa_s, MSG_INFO,
+ P2P_EVENT_BOOTSTRAP_SUCCESS MACSTR "status=%d",
+ MAC2STR(addr), status);
+ }
+
+ if (status)
+ return;
+}
+
+
int wpas_p2p_mac_setup(struct wpa_supplicant *wpa_s)
{
u8 addr[ETH_ALEN] = {0};
@@ -4975,6 +5009,8 @@ int wpas_p2p_init(struct wpa_global *global, struct wpa_supplicant *wpa_s)
p2p.get_pref_freq_list = wpas_p2p_get_pref_freq_list;
p2p.p2p_6ghz_disable = wpa_s->conf->p2p_6ghz_disable;
p2p.register_bootstrap_comeback = wpas_p2p_register_bootstrap_comeback;
+ p2p.bootstrap_req_rx = wpas_bootstrap_req_rx;
+ p2p.bootstrap_completed = wpas_bootstrap_completed;
os_memcpy(wpa_s->global->p2p_dev_addr, wpa_s->own_addr, ETH_ALEN);
os_memcpy(p2p.dev_addr, wpa_s->global->p2p_dev_addr, ETH_ALEN);
Add support to notify p2p2 bootstrapping request and completed events to the user. Signed-off-by: Shivani Baranwal <quic_shivbara@quicinc.com> --- src/common/wpa_ctrl.h | 4 ++ src/p2p/p2p.h | 25 ++++++++++ src/p2p/p2p_pd.c | 10 ++++ wpa_supplicant/dbus/dbus_new.c | 107 ++++++++++++++++++++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new.h | 16 ++++++ wpa_supplicant/notify.c | 12 +++++ wpa_supplicant/notify.h | 4 ++ wpa_supplicant/p2p_supplicant.c | 36 ++++++++++++++ 8 files changed, 214 insertions(+)