]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Signals for NAN USD
authorLo,Chin-Ran <chin-ran.lo@nxp.com>
Mon, 15 Jul 2024 06:01:11 +0000 (14:01 +0800)
committerJouni Malinen <j@w1.fi>
Sun, 15 Sep 2024 08:59:54 +0000 (11:59 +0300)
USD had a control interface events defined for it. Extend this by
providing similar USD signals through the dbus control interface.

Signed-off-by: Lo,Chin-Ran <chin-ran.lo@nxp.com>
doc/dbus.doxygen
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new.h
wpa_supplicant/dbus/dbus_new_introspect.c
wpa_supplicant/notify.c

index ae1e6f8cc1088886bc8d477f290d9b96c062f0ab..05e36b2b3b8575146f2135266d475fe400c43505 100644 (file)
@@ -1385,6 +1385,51 @@ fi.w1.wpa_supplicant1.CreateInterface.
          <dd>Determine if the request was successful. If so fields are available in BSS.</dd>
        </dl>
       </li>
+
+      <li>
+       <h3>NANDiscoveryResult ( a{sv} : args )</h3>
+       <p>The DiscoveryResult event in the NAN Discovery Engine to indicate the result of an NANSubscribe.</p>
+       <dl>
+         <dt>a{sv} : args</dt>
+         <dd>A dictionary with pairs of field names and their values. Possible dictionary keys are: "subscribe_id", "publish_id", "peer_addr", "fsd", "fsd_gas", "srv_proto_type", "ssi"</dd>
+       </dl>
+      </li>
+      <li>
+       <h3>NANReplied ( a{sv} : args )</h3>
+       <p>The Replied event in the NAN Discovery Engine.</p>
+       <dl>
+         <dt>a{sv} : args</dt>
+         <dd>A dictionary with pairs of field names and their values. Possible dictionary keys are: "publish_id", "subscribe_id", "peer_addr", "srv_proto_type", "ssi"</dd>
+       </dl>
+      </li>
+      <li>
+       <h3>NANReceive ( a{sv} : args )</h3>
+       <p>The Receive event in the NAN Discovery Engine.</p>
+       <dl>
+         <dt>a{sv} : nanrx</dt>
+         <dd>A dictionary with pairs of field names and their values. Possible dictionary keys are: "id", "peer_id", "peer_addr", "ssi"</dd>
+       </dl>
+      </li>
+      <li>
+       <h3>NANPublishTerminated ( u : publish_id, s : reason )</h3>
+       <p>The PublishTerminated event in the NAN Discovery Engine.</p>
+       <dl>
+         <dt>u : publish_id</dt>
+         <dd>The terminated publish_id</dd>
+         <dt>s : reason</dt>
+         <dd>The reason of termination</dd>
+       </dl>
+      </li>
+      <li>
+       <h3>NANSubscribeTerminated ( u : subscribe_id, s : reason )</h3>
+       <p>The SubscribeTerminated event in the NAN Discovery Engine.</p>
+       <dl>
+         <dt>u : subscribe_id</dt>
+         <dd>The terminated subscribe_id</dd>
+         <dt>s : reason</dt>
+         <dd>The reason of termination</dd>
+       </dl>
+      </li>
     </ul>
 
 
index 5ad5bcd74e7dca167138086f14395a3d402e84e8..8b5e289e0ffc00ee00671631a4fd77e156e90fab 100644 (file)
@@ -4384,6 +4384,40 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
          }
        },
 #endif /* CONFIG_HS20 */
+#ifdef CONFIG_NAN_USD
+       { "NANDiscoveryResult", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         {
+                 { "args", "a{sv}", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { "NANReplied", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         {
+                 { "args", "a{sv}", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { "NANReceive", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         {
+                 { "args", "a{sv}", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { "NANPublishTerminated", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         {
+                 { "publish_id", "u", ARG_OUT },
+                 { "reason", "s", ARG_OUT },
+                 END_ARGS
+         }
+       },
+       { "NANSubscribeTerminated", WPAS_DBUS_NEW_IFACE_INTERFACE,
+         {
+                 { "subscribe_id", "u", ARG_OUT },
+                 { "reason", "s", ARG_OUT },
+                 END_ARGS
+         }
+       },
+#endif /* CONFIG_NAN_USD */
        { NULL, NULL, { END_ARGS } }
 };
 
@@ -5253,3 +5287,259 @@ void wpas_dbus_signal_hs20_t_c_acceptance(struct wpa_supplicant *wpa_s,
        dbus_message_unref(msg);
 }
 #endif /* CONFIG_HS20 */
+
+
+#ifdef CONFIG_NAN_USD
+
+/**
+ * wpas_dbus_signal_nan_discovery_result - Send NANDiscoveryResult signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @srv_proto_type: Service Protocol Type
+ * @subscribe_id: Subscribe ID of the session
+ * @peer_publish_id: Publish ID of the sender
+ * @peer_addr: MAC address of the peer device
+ * @ssi: Service specific information payload
+ * @ssi_len: Length of the SSI field
+ *
+ * This is used to indicate the NAN DE DiscoveryResult event.
+ */
+void wpas_dbus_signal_nan_discovery_result(struct wpa_supplicant *wpa_s,
+                                          enum nan_service_protocol_type
+                                          srv_proto_type,
+                                          int subscribe_id,
+                                          int peer_publish_id,
+                                          const u8 *peer_addr,
+                                          bool fsd, bool fsd_gas,
+                                          const u8 *ssi, size_t ssi_len)
+{
+       struct wpas_dbus_priv *iface;
+       DBusMessage *msg;
+       DBusMessageIter iter, dict_iter;
+       char addr_str[20];
+
+       iface = wpa_s->global->dbus;
+       /* Do nothing if the interface is not turned on */
+       if (!iface || !wpa_s->dbus_new_path)
+               return;
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_INTERFACE,
+                                     "NANDiscoveryResult");
+       if (!msg)
+               return;
+
+       snprintf(addr_str, sizeof(addr_str), MACSTR, MAC2STR(peer_addr));
+
+       dbus_message_iter_init_append(msg, &iter);
+
+       if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "subscribe_id",
+                                        subscribe_id) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "publish_id",
+                                        peer_publish_id) ||
+           !wpa_dbus_dict_append_string(&dict_iter, "peer_addr", addr_str) ||
+           !wpa_dbus_dict_append_bool(&dict_iter, "fsd", fsd) ||
+           !wpa_dbus_dict_append_bool(&dict_iter, "fsd_gas", fsd_gas) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "srv_proto_type",
+                                        srv_proto_type) ||
+           (ssi &&
+            !wpa_dbus_dict_append_byte_array(&dict_iter,
+                                             "ssi",
+                                             (const char *) ssi,
+                                             ssi_len)) ||
+           !wpa_dbus_dict_close_write(&iter, &dict_iter))
+               wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+       else
+               dbus_connection_send(iface->con, msg, NULL);
+       dbus_message_unref(msg);
+}
+
+
+/**
+ * wpas_dbus_signal_nan_replied - Send NANReplied signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @srv_proto_type: Service Protocol Type
+ * @publish_id: Publish id of the session
+ * @peer_subscribe_id: Subscribe id of the sender
+ * @peer_addr: MAC address of the peer device
+ * @ssi: Service specific information payload
+ * @ssi_len: Length of the SSI field
+ *
+ * This is used to indicate the NAN DE Replied event.
+ */
+void wpas_dbus_signal_nan_replied(struct wpa_supplicant *wpa_s,
+                                 enum nan_service_protocol_type srv_proto_type,
+                                 int publish_id,
+                                 int peer_subscribe_id,
+                                 const u8 *peer_addr,
+                                 const u8 *ssi, size_t ssi_len)
+{
+       struct wpas_dbus_priv *iface;
+       DBusMessage *msg;
+       DBusMessageIter iter, dict_iter;
+       char addr_str[20];
+
+       iface = wpa_s->global->dbus;
+       /* Do nothing if the interface is not turned on */
+       if (!iface || !wpa_s->dbus_new_path)
+               return;
+
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_INTERFACE,
+                                     "NANReplied");
+       if (!msg)
+               return;
+
+       snprintf(addr_str, sizeof(addr_str), MACSTR, MAC2STR(peer_addr));
+
+       dbus_message_iter_init_append(msg, &iter);
+
+       if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "publish_id",
+                                        publish_id) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "subscribe_id",
+                                        peer_subscribe_id) ||
+           !wpa_dbus_dict_append_string(&dict_iter, "peer_addr", addr_str) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "srv_proto_type",
+                                        srv_proto_type) ||
+           (ssi &&
+            !wpa_dbus_dict_append_byte_array(&dict_iter, "ssi",
+                                             (const char *) ssi,
+                                             ssi_len)) ||
+           !wpa_dbus_dict_close_write(&iter, &dict_iter))
+               wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+       else
+               dbus_connection_send(iface->con, msg, NULL);
+       dbus_message_unref(msg);
+}
+
+
+/**
+ * wpas_dbus_signal_nan_receive - Send NANReceive signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @id: The original publish_id or subscribe_id
+ * @peer_id: Peer instance identifier
+ * @peer_addr: Address of the sender
+ * @ssi: Service specific information payload
+ * @ssi_len: Length of the SSI
+ *
+ * This is used to indicate the NAN DE Receive event to notify reception of a
+ * follow-up frame.
+ */
+void wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s,
+                                 int id, int peer_id, const u8 *peer_addr,
+                                 const u8 *ssi, size_t ssi_len)
+{
+       struct wpas_dbus_priv *iface;
+       DBusMessage *msg;
+       DBusMessageIter iter, dict_iter;
+       char addr_str[20];
+
+       iface = wpa_s->global->dbus;
+       /* Do nothing if the interface is not turned on */
+       if (!iface || !wpa_s->dbus_new_path)
+               return;
+
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_INTERFACE,
+                                     "NANReceive");
+       if (!msg)
+               return;
+
+       snprintf(addr_str, sizeof(addr_str), MACSTR, MAC2STR(peer_addr));
+
+       dbus_message_iter_init_append(msg, &iter);
+
+       if (!wpa_dbus_dict_open_write(&iter, &dict_iter) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "id", id) ||
+           !wpa_dbus_dict_append_uint32(&dict_iter, "peer_id", peer_id) ||
+           !wpa_dbus_dict_append_string(&dict_iter, "peer_addr", addr_str) ||
+           (ssi &&
+            !wpa_dbus_dict_append_byte_array(&dict_iter, "ssi",
+                                             (const char *) ssi,
+                                             ssi_len)) ||
+           !wpa_dbus_dict_close_write(&iter, &dict_iter))
+               wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+       else
+               dbus_connection_send(iface->con, msg, NULL);
+       dbus_message_unref(msg);
+}
+
+
+/**
+ * wpas_dbus_signal_nan_publish_terminated - Send NANPublishTerminated signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @publish_id: The publish_id of the session
+ * @reason: The reason of the termination
+ *
+ * This is used to indicate the NAN DE PublishTerminated event to notify when
+ * the session has expired.
+ */
+void wpas_dbus_signal_nan_publish_terminated(struct wpa_supplicant *wpa_s,
+                                            int publish_id,
+                                            const char *reason)
+{
+       struct wpas_dbus_priv *iface;
+       DBusMessage *msg;
+       dbus_uint32_t pub_id = publish_id;
+
+       iface = wpa_s->global->dbus;
+       /* Do nothing if the interface is not turned on */
+       if (!iface || !wpa_s->dbus_new_path)
+               return;
+
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_INTERFACE,
+                                     "NANPublishTerminated");
+       if (!msg)
+               return;
+
+       if (!dbus_message_append_args(msg, DBUS_TYPE_UINT32, &pub_id,
+                                     DBUS_TYPE_INVALID) ||
+           !dbus_message_append_args(msg, DBUS_TYPE_STRING, &reason,
+                                     DBUS_TYPE_INVALID))
+               wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+       else
+               dbus_connection_send(iface->con, msg, NULL);
+       dbus_message_unref(msg);
+}
+
+
+/**
+ * wpas_dbus_signal_nan_subscribe_terminated - Send NANSubscribeTerminated signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @subscribe_id: The subscribe_id of the session
+ * @reason: The reason of the termination
+ *
+ * This is used to indicate the NAN DE SubscribeTerminated event to notify when
+ * the session has expired.
+ */
+void wpas_dbus_signal_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
+                                              int subscribe_id,
+                                              const char *reason)
+{
+       struct wpas_dbus_priv *iface;
+       DBusMessage *msg;
+       dbus_uint32_t sub_id = subscribe_id;
+
+       iface = wpa_s->global->dbus;
+       /* Do nothing if the interface is not turned on */
+       if (!iface || !wpa_s->dbus_new_path)
+               return;
+
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_INTERFACE,
+                                     "NANSubscribeTerminated");
+       if (!msg)
+               return;
+
+       if (!dbus_message_append_args(msg, DBUS_TYPE_UINT32, &sub_id,
+                                     DBUS_TYPE_INVALID) ||
+           !dbus_message_append_args(msg, DBUS_TYPE_STRING, &reason,
+                                     DBUS_TYPE_INVALID))
+               wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+       else
+               dbus_connection_send(iface->con, msg, NULL);
+       dbus_message_unref(msg);
+}
+
+#endif /* CONFIG_NAN_USD */
index 1db5fe8ae7839001938157e76f1cd32fd7340904..4daf71be526f346b8815c01c889c59e98a57a98d 100644 (file)
@@ -21,6 +21,7 @@ struct wpa_bss;
 struct wps_event_m2d;
 struct wps_event_fail;
 struct wps_credential;
+enum nan_service_protocol_type;
 
 enum wpas_dbus_prop {
        WPAS_DBUS_PROP_AP_SCAN,
@@ -285,6 +286,28 @@ void wpas_dbus_signal_anqp_query_done(struct wpa_supplicant *wpa_s,
                                      const u8 *dst, const char *result);
 void wpas_dbus_signal_hs20_t_c_acceptance(struct wpa_supplicant *wpa_s,
                                          const char *url);
+void wpas_dbus_signal_nan_discovery_result(struct wpa_supplicant *wpa_s,
+                                          enum nan_service_protocol_type
+                                          srv_proto_type,
+                                          int subscribe_id,
+                                          int peer_publish_id,
+                                          const u8 *peer_addr,
+                                          bool fsd, bool fsd_gas,
+                                          const u8 *ssi, size_t ssi_len);
+void wpas_dbus_signal_nan_replied(struct wpa_supplicant *wpa_s,
+                                 enum nan_service_protocol_type srv_proto_type,
+                                 int publish_id, int peer_subscribe_id,
+                                 const u8 *peer_addr,
+                                 const u8 *ssi, size_t ssi_len);
+void wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s, int id,
+                                 int peer_id, const u8 *peer_addr,
+                                 const u8 *ssi, size_t ssi_len);
+void wpas_dbus_signal_nan_publish_terminated(struct wpa_supplicant *wpa_s,
+                                            int publish_id,
+                                            const char *reason);
+void wpas_dbus_signal_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
+                                              int subscribe_id,
+                                              const char *reason);
 
 #else /* CONFIG_CTRL_IFACE_DBUS_NEW */
 
@@ -668,6 +691,45 @@ void wpas_dbus_signal_hs20_t_c_acceptance(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline void
+wpas_dbus_signal_nan_discovery_result(struct wpa_supplicant *wpa_s,
+                                     enum nan_service_protocol_type
+                                     srv_proto_type,
+                                     int subscribe_id,
+                                     int peer_publish_id, const u8 *peer_addr,
+                                     bool fsd, bool fsd_gas,
+                                     const u8 *ssi, size_t ssi_len)
+{
+}
+
+static inline void
+wpas_dbus_signal_nan_replied(struct wpa_supplicant *wpa_s,
+                            enum nan_service_protocol_type srv_proto_type,
+                            int publish_id, int peer_subscribe_id,
+                            const u8 *peer_addr, const u8 *ssi, size_t ssi_len)
+{
+}
+
+
+static inline void
+wpas_dbus_signal_nan_receive(struct wpa_supplicant *wpa_s,
+                            int id, int peer_id, const u8 *peer_addr,
+                            const u8 *ssi, size_t ssi_len)
+{
+}
+
+static inline void
+wpas_dbus_signal_nan_publish_terminated(struct wpa_supplicant *wpa_s,
+                                       int publish_id, const char *reason)
+{
+}
+
+static inline void
+wpas_dbus_signal_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
+                                         int subscribe_id, const char *reason)
+{
+}
+
 #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
 
 #endif /* CTRL_IFACE_DBUS_H_NEW */
index a8c0d28398d4624c01a60878b4de5722745d2129..608a80bbc168635cf6fbda2612eba8ec5f8f60a9 100644 (file)
@@ -38,7 +38,7 @@ static struct interfaces * add_interface(struct dl_list *list,
        if (!iface)
                return NULL;
        iface->dbus_interface = os_strdup(dbus_interface);
-       iface->xml = wpabuf_alloc(16000);
+       iface->xml = wpabuf_alloc(17000);
        if (iface->dbus_interface == NULL || iface->xml == NULL) {
                os_free(iface->dbus_interface);
                wpabuf_free(iface->xml);
index 8c1a817f9f899b447ac82c272c1e20fb2fc891eb..22b75d46baa0e30b49b524e7bccefffbdf1e157a 100644 (file)
@@ -1094,6 +1094,11 @@ void wpas_notify_nan_discovery_result(struct wpa_supplicant *wpa_s,
                subscribe_id, peer_publish_id, MAC2STR(peer_addr),
                fsd, fsd_gas, srv_proto_type, ssi_hex);
        os_free(ssi_hex);
+
+       wpas_dbus_signal_nan_discovery_result(wpa_s, srv_proto_type,
+                                             subscribe_id, peer_publish_id,
+                                             peer_addr, fsd, fsd_gas,
+                                             ssi, ssi_len);
 }
 
 
@@ -1116,6 +1121,10 @@ void wpas_notify_nan_replied(struct wpa_supplicant *wpa_s,
                publish_id, MAC2STR(peer_addr), peer_subscribe_id,
                srv_proto_type, ssi_hex);
        os_free(ssi_hex);
+
+       wpas_dbus_signal_nan_replied(wpa_s, srv_proto_type, publish_id,
+                                    peer_subscribe_id, peer_addr,
+                                    ssi, ssi_len);
 }
 
 
@@ -1134,6 +1143,9 @@ void wpas_notify_nan_receive(struct wpa_supplicant *wpa_s, int id,
                "id=%d peer_instance_id=%d address=" MACSTR " ssi=%s",
                id, peer_instance_id, MAC2STR(peer_addr), ssi_hex);
        os_free(ssi_hex);
+
+       wpas_dbus_signal_nan_receive(wpa_s, id, peer_instance_id, peer_addr,
+                                    ssi, ssi_len);
 }
 
 
@@ -1159,6 +1171,9 @@ void wpas_notify_nan_publish_terminated(struct wpa_supplicant *wpa_s,
        wpa_msg(wpa_s, MSG_INFO, NAN_PUBLISH_TERMINATED
                "publish_id=%d reason=%s",
                publish_id, nan_reason_txt(reason));
+
+       wpas_dbus_signal_nan_publish_terminated(wpa_s, publish_id,
+                                               nan_reason_txt(reason));
 }
 
 
@@ -1169,6 +1184,9 @@ void wpas_notify_nan_subscribe_terminated(struct wpa_supplicant *wpa_s,
        wpa_msg(wpa_s, MSG_INFO, NAN_SUBSCRIBE_TERMINATED
                "subscribe_id=%d reason=%s",
                subscribe_id, nan_reason_txt(reason));
+
+       wpas_dbus_signal_nan_subscribe_terminated(wpa_s, subscribe_id,
+                                                 nan_reason_txt(reason));
 }
 
 #endif /* CONFIG_NAN_USD */