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 <chin-ran.lo@nxp.com>
This commit is contained in:
Lo,Chin-Ran 2024-07-15 14:01:11 +08:00 committed by Jouni Malinen
parent d2408e3032
commit dcf58aec8d
5 changed files with 416 additions and 1 deletions

View 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>

View 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 */

View 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 */

View 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);

View 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 */