[v2,2/3] dbus: Enabled dpp functions

Message ID 20181204074000.19749-2-jeonghwan.yoon@lge.com
State Changes Requested
Headers show
Series
  • [v2,1/3] dbus: Enabled dpp functions
Related show

Commit Message

Jeonghwan Yoon Dec. 4, 2018, 7:39 a.m.
Added dbus signals to report general dpp process.

Signed-off-by: Jeonghwan Yoon <jeonghwan.yoon@lge.com>
---
 doc/dbus.doxygen                |  65 +++++++++++++++
 wpa_supplicant/dbus/dbus_new.c  | 139 ++++++++++++++++++++++++++++++++
 wpa_supplicant/dbus/dbus_new.h  |  33 +++++++-
 wpa_supplicant/dpp_supplicant.c |  18 +++++
 wpa_supplicant/notify.c         |  24 +++++-
 wpa_supplicant/notify.h         |  10 ++-
 6 files changed, 284 insertions(+), 5 deletions(-)

Comments

Jouni Malinen Jan. 6, 2019, 3:25 p.m. | #1
On Tue, Dec 04, 2018 at 04:39:59PM +0900, Jeonghwan Yoon wrote:

> diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
> @@ -2108,6 +2108,145 @@ void wpas_dbus_signal_p2p_invitation_received(struct wpa_supplicant *wpa_s,

> +#ifdef CONFIG_DPP
> +void wpas_dbus_signal_dpp_tx(struct wpa_supplicant *wpa_s,
> +						  const u8 *dst, unsigned int freq, int type)

Please intent the second line to start "const" at the same position as
"struct" on the first line.

> +	if (iface == NULL || !wpa_s->dbus_new_path)
> +		return;

!iface is the preferred way of handling check against NULL pointers.

> diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
> @@ -106,6 +106,7 @@ int wpas_dpp_qr_code(struct wpa_supplicant *wpa_s, const char *cmd)

> +		wpas_notify_dpp_tx(wpa_s, auth->peer_mac_addr, auth->curr_freq, DPP_PA_AUTHENTICATION_RESP);

Split long lines to be <= 80 characters (with string constants being an
exception).

> @@ -1065,6 +1068,7 @@ static void wpas_dpp_rx_auth_req(struct wpa_supplicant *wpa_s, const u8 *src,
>  	if (!r_bootstrap || r_bootstrap_len != SHA256_MAC_LEN) {
>  		wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
>  			"Missing or invalid required Responder Bootstrapping Key Hash attribute");
> +		wpas_notify_dpp_failed(wpa_s, "Missing or invalid required Responder Bootstrapping Key Hash attribute");
>  		return;
>  	}

This looks inconvenient duplication of strings. Maybe move wpa_msg()
call to wpas_notify_dpp_failed() to cover this type of cases?

What is the use case for these messages over D-Bus? Many of these are
for conformance testing purposes and not necessarily that useful for
real world applications.. Not that I'm necessarily against this, but it
would be good to understand that lot of the DPP code includes
conformance testing functionality that may not really make much sense to
expose over D-Bus.

> diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h

> -
> +#ifdef CONFIG_DPP
> +void wpas_notify_dpp_tx(struct wpa_supplicant *wpa_s, const u8 *dst,
> +		unsigned int freq, int type);
> +void wpas_notify_dpp_tx_status(struct wpa_supplicant *wpa_s, const u8 *dst,
> +		unsigned int freq, const char *res);
> +void wpas_notify_dpp_rx(struct wpa_supplicant *wpa_s, const u8 *src,
> +		unsigned int freq, int type);
> +void wpas_notify_dpp_failed(struct wpa_supplicant *wpa_s, const char *res);
> +#endif /* CONFIG_DPP */
>  #endif /* NOTIFY_H */

No #ifdef CONFIG_DPP around function prototypes in header files.

Patch

diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen
index 1f754e3f2..610b44cda 100644
--- a/doc/dbus.doxygen
+++ b/doc/dbus.doxygen
@@ -1426,6 +1426,71 @@  Interface for performing DPP (Device Provisioning Protocol) Device operations.
   </li>
 
 </ul>
+
+\subsection dbus_dppdevice_signals Signals
+
+<ul>
+  <li>
+    <h3>DppTx ( s : dst mac, u : frequency, i : type )</h3>
+    <p> Transmission of the dpp action frame was successful.</p>
+    <h4>Arguments</h4>
+    <dl>
+      <dt>s : dst mac</dt>
+      <dd>destination mac address.</dd>
+    </dl>
+    <dl>
+      <dt>u : frequency</dt>
+      <dd>operating frequency.</dd>
+    </dl>
+    <dl>
+      <dt>i : type</dt>
+      <dd>type number of the transmitted public frame</dd>
+    </dl>
+  </li>
+  <li>
+    <h3>DppTxStatus ( s : dst mac, u : frequency, s : status )</h3>
+    <p> Transmission of the dpp action frame was successful.</p>
+    <h4>Arguments</h4>
+    <dl>
+      <dt>s : dst mac</dt>
+      <dd>destination mac address.</dd>
+    </dl>
+    <dl>
+      <dt>u : frequency</dt>
+      <dd>operating frequency.</dd>
+    </dl>
+    <dl>
+      <dt>s : result</dt>
+      <dd>transmission status : "SUCCESS", "no-ACK", "FAILED"</dd>
+    </dl>
+  </li>
+  <li>
+    <h3>DppRx ( s : src mac, u : frequency, i : type )</h3>
+    <p> Received the dpp action frame.</p>
+    <h4>Arguments</h4>
+    <dl>
+      <dt>s : src mac</dt>
+      <dd>source mac address.</dd>
+    </dl>
+    <dl>
+      <dt>u : frequency</dt>
+      <dd>operating frequency.</dd>
+    </dl>
+    <dl>
+      <dt>i : type</dt>
+      <dd>type number of the transmitted public frame</dd>
+    </dl>
+  </li>
+    <h3>DppFailed ( s : message )</h3>
+    <p> Failed in dpp process.</p>
+    <h4>Arguments</h4>
+    <dl>
+      <dt>s : message</dt>
+      <dd>reason of failed.</dd>
+    </dl>
+  </li>
+</ul>
+
 \section dbus_p2pdevice fi.w1.wpa_supplicant1.Interface.P2PDevice
 
 Interface for performing P2P (Wi-Fi Peer-to-Peer) P2P Device operations.
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index d9edf7379..361fba9de 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -2108,6 +2108,145 @@  void wpas_dbus_signal_p2p_invitation_received(struct wpa_supplicant *wpa_s,
 
 #endif /* CONFIG_P2P */
 
+#ifdef CONFIG_DPP
+void wpas_dbus_signal_dpp_tx(struct wpa_supplicant *wpa_s,
+						  const u8 *dst, unsigned int freq, int type)
+{
+	DBusMessage *msg;
+	DBusMessageIter iter;
+	struct wpas_dbus_priv *iface;
+	char mac_dst[WPAS_DBUS_OBJECT_PATH_MAX], *mac_dst_p;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	os_snprintf(mac_dst, WPAS_DBUS_OBJECT_PATH_MAX, MACSTR, MAC2STR(dst));
+	mac_dst_p = mac_dst;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+			WPAS_DBUS_NEW_IFACE_DPPDEVICE,
+			"DppTx");
+
+	if (msg == NULL)
+		return;
+
+	dbus_message_iter_init_append(msg, &iter);
+	if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
+				&mac_dst_p) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &freq) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32, &type))
+		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+	else
+		dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_dpp_tx_status(struct wpa_supplicant *wpa_s,
+						  const u8 *dst, unsigned int freq, const char *res)
+{
+	DBusMessage *msg;
+	DBusMessageIter iter;
+	struct wpas_dbus_priv *iface;
+	char mac_dst[WPAS_DBUS_OBJECT_PATH_MAX], *mac_dst_p;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	os_snprintf(mac_dst, WPAS_DBUS_OBJECT_PATH_MAX, MACSTR, MAC2STR(dst));
+	mac_dst_p = mac_dst;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+								  WPAS_DBUS_NEW_IFACE_DPPDEVICE,
+								  "DppTxStatus");
+	if (msg == NULL)
+		return;
+
+	dbus_message_iter_init_append(msg, &iter);
+
+	if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
+				&mac_dst_p) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32,
+				&freq) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
+				&res))
+        wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+	else
+		dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_dpp_rx(struct wpa_supplicant *wpa_s,
+						  const u8 *src, unsigned int freq, int type)
+{
+	DBusMessage *msg;
+	DBusMessageIter iter;
+	struct wpas_dbus_priv *iface;
+	char mac_src[WPAS_DBUS_OBJECT_PATH_MAX], *mac_src_p;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	os_snprintf(mac_src, WPAS_DBUS_OBJECT_PATH_MAX, MACSTR, MAC2STR(src));
+	mac_src_p = mac_src;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+								  WPAS_DBUS_NEW_IFACE_DPPDEVICE,
+								  "DppRx");
+	if (msg == NULL)
+		return;
+
+	dbus_message_iter_init_append(msg, &iter);
+
+	if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING,
+				&mac_src_p) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32,
+				&freq) ||
+		!dbus_message_iter_append_basic(&iter, DBUS_TYPE_INT32,
+				&type))
+		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+	else
+		dbus_connection_send(iface->con, msg, NULL);
+
+	dbus_message_unref(msg);
+}
+
+void wpas_dbus_signal_dpp_failed(struct wpa_supplicant *wpa_s, const char *res)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL || !wpa_s->dbus_new_path)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+				 WPAS_DBUS_NEW_IFACE_DPPDEVICE, "DppFailed");
+	if (msg == NULL)
+		return;
+
+	if (dbus_message_append_args(msg, DBUS_TYPE_STRING, &res,
+								 DBUS_TYPE_INVALID)){
+		dbus_connection_send(iface->con, msg, NULL);
+	}else{
+		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+	}
+
+	dbus_message_unref(msg);
+}
+#endif /* CONFIG_DPP */
 
 /**
  * wpas_dbus_signal_prop_changed - Signals change of property
diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h
index 054afad85..e1962546e 100644
--- a/wpa_supplicant/dbus/dbus_new.h
+++ b/wpa_supplicant/dbus/dbus_new.h
@@ -253,7 +253,15 @@  void wpas_dbus_signal_mesh_peer_connected(struct wpa_supplicant *wpa_s,
 					  const u8 *peer_addr);
 void wpas_dbus_signal_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
 					     const u8 *peer_addr, int reason);
-
+#ifdef CONFIG_DPP
+void wpas_dbus_signal_dpp_tx(struct wpa_supplicant *wpa_s,
+		const u8 *dst, unsigned int freq, int type);
+void wpas_dbus_signal_dpp_tx_status(struct wpa_supplicant *wpa_s,
+		const u8 *dst, unsigned int freq, const char *res);
+void wpas_dbus_signal_dpp_rx(struct wpa_supplicant *wpa_s,
+		const u8 *src, unsigned int freq, int type);
+void wpas_dbus_signal_dpp_failed(struct wpa_supplicant *wpa_s, const char *res);
+#endif /* CONFIG_DPP */
 #else /* CONFIG_CTRL_IFACE_DBUS_NEW */
 
 static inline int wpas_dbus_register_interface(struct wpa_supplicant *wpa_s)
@@ -592,7 +600,26 @@  void wpas_dbus_signal_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
 					     const u8 *peer_addr, int reason)
 {
 }
-
+#ifdef CONFIG_DPP
+static inline
+void wpas_dbus_signal_dpp_tx(struct wpa_supplicant *wpa_s,
+		const u8 *dst, unsigned int freq, int type)
+{
+}
+static inline
+void wpas_dbus_signal_dpp_tx_status(struct wpa_supplicant *wpa_s,
+		const u8 *dst, unsigned int freq, const char *res)
+{
+}
+static inline
+void wpas_dbus_signal_dpp_rx(struct wpa_supplicant *wpa_s,
+		const u8 *src, unsigned int freq, int type)
+{
+}
+static inline
+void wpas_dbus_signal_dpp_failed(struct wpa_supplicant *wpa_s, const char *res)
+{
+}
+#endif /* CONFIG_DPP */
 #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
-
 #endif /* CTRL_IFACE_DBUS_H_NEW */
diff --git a/wpa_supplicant/dpp_supplicant.c b/wpa_supplicant/dpp_supplicant.c
index 7bc46610a..621ea3ef7 100644
--- a/wpa_supplicant/dpp_supplicant.c
+++ b/wpa_supplicant/dpp_supplicant.c
@@ -106,6 +106,7 @@  int wpas_dpp_qr_code(struct wpa_supplicant *wpa_s, const char *cmd)
 			" freq=%u type=%d",
 			MAC2STR(auth->peer_mac_addr), auth->curr_freq,
 			DPP_PA_AUTHENTICATION_RESP);
+		wpas_notify_dpp_tx(wpa_s, auth->peer_mac_addr, auth->curr_freq, DPP_PA_AUTHENTICATION_RESP);
 		offchannel_send_action(wpa_s, auth->curr_freq,
 				       auth->peer_mac_addr, wpa_s->own_addr,
 				       broadcast,
@@ -321,6 +322,7 @@  static void wpas_dpp_auth_resp_retry_timeout(void *eloop_ctx, void *timeout_ctx)
 		" freq=%u type=%d",
 		MAC2STR(auth->peer_mac_addr), auth->curr_freq,
 		DPP_PA_AUTHENTICATION_RESP);
+	wpas_notify_dpp_tx(wpa_s, auth->peer_mac_addr, auth->curr_freq, DPP_PA_AUTHENTICATION_RESP);
 	offchannel_send_action(wpa_s, auth->curr_freq, auth->peer_mac_addr,
 			       wpa_s->own_addr, broadcast,
 			       wpabuf_head(auth->resp_msg),
@@ -786,6 +788,7 @@  static int wpas_dpp_auth_init_next(struct wpa_supplicant *wpa_s)
 	}
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(dst), freq, DPP_PA_AUTHENTICATION_REQ);
+	wpas_notify_dpp_tx(wpa_s, dst, freq, DPP_PA_AUTHENTICATION_REQ);
 	auth->auth_req_ack = 0;
 	os_get_reltime(&wpa_s->dpp_last_init);
 	return offchannel_send_action(wpa_s, freq, dst,
@@ -1065,6 +1068,7 @@  static void wpas_dpp_rx_auth_req(struct wpa_supplicant *wpa_s, const u8 *src,
 	if (!r_bootstrap || r_bootstrap_len != SHA256_MAC_LEN) {
 		wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
 			"Missing or invalid required Responder Bootstrapping Key Hash attribute");
+		wpas_notify_dpp_failed(wpa_s, "Missing or invalid required Responder Bootstrapping Key Hash attribute");
 		return;
 	}
 	wpa_hexdump(MSG_MSGDUMP, "DPP: Responder Bootstrapping Key Hash",
@@ -1075,6 +1079,7 @@  static void wpas_dpp_rx_auth_req(struct wpa_supplicant *wpa_s, const u8 *src,
 	if (!i_bootstrap || i_bootstrap_len != SHA256_MAC_LEN) {
 		wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
 			"Missing or invalid required Initiator Bootstrapping Key Hash attribute");
+		wpas_notify_dpp_failed(wpa_s, "Missing or invalid required Responder Bootstrapping Key Hash attribute");
 		return;
 	}
 	wpa_hexdump(MSG_MSGDUMP, "DPP: Initiator Bootstrapping Key Hash",
@@ -1107,12 +1112,14 @@  static void wpas_dpp_rx_auth_req(struct wpa_supplicant *wpa_s, const u8 *src,
 	if (!own_bi) {
 		wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
 			"No matching own bootstrapping key found - ignore message");
+		wpas_notify_dpp_failed(wpa_s, "No matching own bootstrapping key found - ignore message");
 		return;
 	}
 
 	if (wpa_s->dpp_auth) {
 		wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_FAIL
 			"Already in DPP authentication exchange - ignore new one");
+		wpas_notify_dpp_failed(wpa_s,"Already in DPP authentication exchange - ignore new one");
 		return;
 	}
 
@@ -1145,6 +1152,7 @@  static void wpas_dpp_rx_auth_req(struct wpa_supplicant *wpa_s, const u8 *src,
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), wpa_s->dpp_auth->curr_freq,
 		DPP_PA_AUTHENTICATION_RESP);
+	wpas_notify_dpp_tx(wpa_s, src, freq, DPP_PA_AUTHENTICATION_RESP);
 	offchannel_send_action(wpa_s, wpa_s->dpp_auth->curr_freq,
 			       src, wpa_s->own_addr, broadcast,
 			       wpabuf_head(wpa_s->dpp_auth->resp_msg),
@@ -1515,6 +1523,7 @@  static void wpas_dpp_rx_auth_resp(struct wpa_supplicant *wpa_s, const u8 *src,
 
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), auth->curr_freq, DPP_PA_AUTHENTICATION_CONF);
+	wpas_notify_dpp_tx(wpa_s, src, auth->curr_freq, DPP_PA_AUTHENTICATION_CONF);
 	offchannel_send_action(wpa_s, auth->curr_freq,
 			       src, wpa_s->own_addr, broadcast,
 			       wpabuf_head(msg), wpabuf_len(msg),
@@ -1546,6 +1555,7 @@  static void wpas_dpp_rx_auth_conf(struct wpa_supplicant *wpa_s, const u8 *src,
 
 	if (dpp_auth_conf_rx(auth, hdr, buf, len) < 0) {
 		wpa_printf(MSG_DEBUG, "DPP: Authentication failed");
+		wpas_notify_dpp_failed(wpa_s, "Authentication failed");
 		return;
 	}
 
@@ -1759,6 +1769,7 @@  static void wpas_dpp_pkex_retry_timeout(void *eloop_ctx, void *timeout_ctx)
 		   pkex->exch_req_tries);
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(broadcast), pkex->freq, DPP_PA_PKEX_EXCHANGE_REQ);
+	wpas_notify_dpp_tx(wpa_s, broadcast, pkex->freq, DPP_PA_PKEX_EXCHANGE_REQ);
 	offchannel_send_action(wpa_s, pkex->freq, broadcast,
 			       wpa_s->own_addr, broadcast,
 			       wpabuf_head(pkex->exchange_req),
@@ -1786,6 +1797,7 @@  wpas_dpp_tx_pkex_status(struct wpa_supplicant *wpa_s,
 		   freq, MAC2STR(dst), res_txt);
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX_STATUS "dst=" MACSTR
 		" freq=%u result=%s", MAC2STR(dst), freq, res_txt);
+	wpas_notify_dpp_tx_status(wpa_s, dst, freq, res_txt);
 
 	if (!pkex) {
 		wpa_printf(MSG_DEBUG,
@@ -1858,6 +1870,7 @@  wpas_dpp_rx_pkex_exchange_req(struct wpa_supplicant *wpa_s, const u8 *src,
 		wait_time = 2000;
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), freq, DPP_PA_PKEX_EXCHANGE_RESP);
+	wpas_notify_dpp_tx(wpa_s, src, freq, DPP_PA_PKEX_EXCHANGE_RESP);
 	offchannel_send_action(wpa_s, freq, src, wpa_s->own_addr,
 			       broadcast,
 			       wpabuf_head(msg), wpabuf_len(msg),
@@ -1901,6 +1914,7 @@  wpas_dpp_rx_pkex_exchange_resp(struct wpa_supplicant *wpa_s, const u8 *src,
 		wait_time = 2000;
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), freq, DPP_PA_PKEX_COMMIT_REVEAL_REQ);
+	wpas_notify_dpp_tx(wpa_s, src, freq, DPP_PA_PKEX_COMMIT_REVEAL_REQ);
 	offchannel_send_action(wpa_s, freq, src, wpa_s->own_addr,
 			       broadcast,
 			       wpabuf_head(msg), wpabuf_len(msg),
@@ -1976,6 +1990,7 @@  wpas_dpp_rx_pkex_commit_reveal_req(struct wpa_supplicant *wpa_s, const u8 *src,
 		wait_time = 2000;
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), freq, DPP_PA_PKEX_COMMIT_REVEAL_RESP);
+	wpas_notify_dpp_tx(wpa_s, src, freq, DPP_PA_PKEX_COMMIT_REVEAL_RESP);
 	offchannel_send_action(wpa_s, freq, src, wpa_s->own_addr,
 			       broadcast,
 			       wpabuf_head(msg), wpabuf_len(msg),
@@ -2068,6 +2083,7 @@  void wpas_dpp_rx_action(struct wpa_supplicant *wpa_s, const u8 *src,
 	}
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_RX "src=" MACSTR " freq=%u type=%d",
 		MAC2STR(src), freq, type);
+	wpas_notify_dpp_rx(wpa_s, src, freq, type);
 
 	switch (type) {
 	case DPP_PA_AUTHENTICATION_REQ:
@@ -2420,6 +2436,7 @@  skip_connector:
 		wait_time = 2000;
 	wpa_msg(wpa_s, MSG_INFO, DPP_EVENT_TX "dst=" MACSTR " freq=%u type=%d",
 		MAC2STR(bss->bssid), bss->freq, DPP_PA_PEER_DISCOVERY_REQ);
+	wpas_notify_dpp_tx(wpa_s, bss->bssid, bss->freq, DPP_PA_PEER_DISCOVERY_REQ);
 	offchannel_send_action(wpa_s, bss->freq, bss->bssid, wpa_s->own_addr,
 			       broadcast,
 			       wpabuf_head(msg), wpabuf_len(msg),
@@ -2503,6 +2520,7 @@  int wpas_dpp_pkex_add(struct wpa_supplicant *wpa_s, const char *cmd)
 			" freq=%u type=%d",
 			MAC2STR(broadcast), pkex->freq,
 			DPP_PA_PKEX_EXCHANGE_REQ);
+		wpas_notify_dpp_tx(wpa_s, broadcast, pkex->freq, DPP_PA_PKEX_EXCHANGE_REQ);
 		offchannel_send_action(wpa_s, pkex->freq, broadcast,
 				       wpa_s->own_addr, broadcast,
 				       wpabuf_head(msg), wpabuf_len(msg),
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index 83df04f39..82d75baf2 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -900,5 +900,27 @@  void wpas_notify_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
 
 	wpas_dbus_signal_mesh_peer_disconnected(wpa_s, peer_addr, reason_code);
 }
-
 #endif /* CONFIG_MESH */
+#ifdef CONFIG_DPP
+void wpas_notify_dpp_tx(struct wpa_supplicant *wpa_s, const u8 *dst,
+		unsigned int freq, int type)
+{
+	wpas_dbus_signal_dpp_tx(wpa_s, dst, freq, type);
+}
+
+void wpas_notify_dpp_tx_status(struct wpa_supplicant *wpa_s, const u8 *dst,
+		unsigned int freq, const char *res)
+{
+	wpas_dbus_signal_dpp_tx_status(wpa_s, dst, freq, res);
+}
+
+void wpas_notify_dpp_rx(struct wpa_supplicant *wpa_s, const u8 *dst,
+		unsigned int freq, int type)
+{
+	wpas_dbus_signal_dpp_rx(wpa_s, dst, freq, type);
+}
+void wpas_notify_dpp_failed(struct wpa_supplicant *wpa_s, const char *res)
+{
+	wpas_dbus_signal_dpp_failed(wpa_s, res);
+}
+#endif /* CONFIG_DPP */
diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h
index 3ca933c76..7f0dfb587 100644
--- a/wpa_supplicant/notify.h
+++ b/wpa_supplicant/notify.h
@@ -151,5 +151,13 @@  void wpas_notify_mesh_peer_connected(struct wpa_supplicant *wpa_s,
 				     const u8 *peer_addr);
 void wpas_notify_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
 					const u8 *peer_addr, int reason_code);
-
+#ifdef CONFIG_DPP
+void wpas_notify_dpp_tx(struct wpa_supplicant *wpa_s, const u8 *dst,
+		unsigned int freq, int type);
+void wpas_notify_dpp_tx_status(struct wpa_supplicant *wpa_s, const u8 *dst,
+		unsigned int freq, const char *res);
+void wpas_notify_dpp_rx(struct wpa_supplicant *wpa_s, const u8 *src,
+		unsigned int freq, int type);
+void wpas_notify_dpp_failed(struct wpa_supplicant *wpa_s, const char *res);
+#endif /* CONFIG_DPP */
 #endif /* NOTIFY_H */