From dcf58aec8d3d2598f84e2789da16db16b8fa2bf3 Mon Sep 17 00:00:00 2001 From: "Lo,Chin-Ran" Date: Mon, 15 Jul 2024 14:01:11 +0800 Subject: [PATCH] dbus: Signals for NAN USD 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 --- doc/dbus.doxygen | 45 ++++ wpa_supplicant/dbus/dbus_new.c | 290 ++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new.h | 62 +++++ wpa_supplicant/dbus/dbus_new_introspect.c | 2 +- wpa_supplicant/notify.c | 18 ++ 5 files changed, 416 insertions(+), 1 deletion(-) diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen index ae1e6f8cc1..05e36b2b3b 100644 --- a/doc/dbus.doxygen +++ b/doc/dbus.doxygen @@ -1385,6 +1385,51 @@ fi.w1.wpa_supplicant1.CreateInterface.
Determine if the request was successful. If so fields are available in BSS.
+ +
  • +

    NANDiscoveryResult ( a{sv} : args )

    +

    The DiscoveryResult event in the NAN Discovery Engine to indicate the result of an NANSubscribe.

    +
    +
    a{sv} : args
    +
    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"
    +
    +
  • +
  • +

    NANReplied ( a{sv} : args )

    +

    The Replied event in the NAN Discovery Engine.

    +
    +
    a{sv} : args
    +
    A dictionary with pairs of field names and their values. Possible dictionary keys are: "publish_id", "subscribe_id", "peer_addr", "srv_proto_type", "ssi"
    +
    +
  • +
  • +

    NANReceive ( a{sv} : args )

    +

    The Receive event in the NAN Discovery Engine.

    +
    +
    a{sv} : nanrx
    +
    A dictionary with pairs of field names and their values. Possible dictionary keys are: "id", "peer_id", "peer_addr", "ssi"
    +
    +
  • +
  • +

    NANPublishTerminated ( u : publish_id, s : reason )

    +

    The PublishTerminated event in the NAN Discovery Engine.

    +
    +
    u : publish_id
    +
    The terminated publish_id
    +
    s : reason
    +
    The reason of termination
    +
    +
  • +
  • +

    NANSubscribeTerminated ( u : subscribe_id, s : reason )

    +

    The SubscribeTerminated event in the NAN Discovery Engine.

    +
    +
    u : subscribe_id
    +
    The terminated subscribe_id
    +
    s : reason
    +
    The reason of termination
    +
    +
  • diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c index 5ad5bcd74e..8b5e289e0f 100644 --- a/wpa_supplicant/dbus/dbus_new.c +++ b/wpa_supplicant/dbus/dbus_new.c @@ -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 */ diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h index 1db5fe8ae7..4daf71be52 100644 --- a/wpa_supplicant/dbus/dbus_new.h +++ b/wpa_supplicant/dbus/dbus_new.h @@ -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 */ diff --git a/wpa_supplicant/dbus/dbus_new_introspect.c b/wpa_supplicant/dbus/dbus_new_introspect.c index a8c0d28398..608a80bbc1 100644 --- a/wpa_supplicant/dbus/dbus_new_introspect.c +++ b/wpa_supplicant/dbus/dbus_new_introspect.c @@ -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); diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 8c1a817f9f..22b75d46ba 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -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 */ -- 2.47.2