This is similar to the control interface event MESH-PEER-DISCONNECTED Signed-off-by: Saurav Babu <saurav.babu@xxxxxxxxxxx> --- doc/dbus.doxygen | 9 +++++++++ wpa_supplicant/dbus/dbus_new.c | 39 +++++++++++++++++++++++++++++++++++++++ wpa_supplicant/dbus/dbus_new.h | 8 ++++++++ wpa_supplicant/mesh_mpm.c | 3 +++ wpa_supplicant/notify.c | 11 +++++++++++ wpa_supplicant/notify.h | 2 ++ 6 files changed, 72 insertions(+) diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen index 6f2eeaf..f9244a5 100644 --- a/doc/dbus.doxygen +++ b/doc/dbus.doxygen @@ -2287,6 +2287,15 @@ Interface for performing Mesh operations. <dd>A dictionary containing information of connected Mesh Peer.</dd> </dl> </li> + <li> + <h3>MeshPeerDisconnected ( a{sv} : args )</h3> + <p></p> + <h4>Arguments</h4> + <dl> + <dt>a{sv} : args</dt> + <dd>A dictionary containing information of disconnected Mesh Peer.</dd> + </dl> + </li> </ul> */ diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c index c91d945..7b8af9d 100644 --- a/wpa_supplicant/dbus/dbus_new.c +++ b/wpa_supplicant/dbus/dbus_new.c @@ -887,6 +887,39 @@ void wpas_dbus_signal_mesh_peer_connected(struct wpa_supplicant *wpa_s, dbus_connection_send(iface->con, msg, NULL); dbus_message_unref(msg); } + +void wpas_dbus_signal_mesh_peer_disconnected(struct wpa_supplicant *wpa_s, + const u8 *peer_addr, int reason) +{ + struct wpas_dbus_priv *iface; + DBusMessage *msg; + DBusMessageIter iter, dict_iter; + + 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_MESH, + "MeshPeerDisconnected"); + if (msg == NULL) + return; + + dbus_message_iter_init_append(msg, &iter); + dbus_message_iter_init_append(msg, &iter); + if (!wpa_dbus_dict_open_write(&iter, &dict_iter) || + !wpa_dbus_dict_append_byte_array(&dict_iter, "PeerAddress", + (const char *) peer_addr, + ETH_ALEN) || + !wpa_dbus_dict_append_int32(&dict_iter, "DisconnectReason", reason) || + !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); +} #endif /* CONFIG_MESH */ void wpas_dbus_signal_certification(struct wpa_supplicant *wpa_s, @@ -3737,6 +3770,12 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = { END_ARGS } }, + { "MeshPeerDisconnected", WPAS_DBUS_NEW_IFACE_MESH, + { + { "args", "a{sv}", ARG_OUT }, + END_ARGS + } + }, #endif /* CONFIG_MESH */ { NULL, NULL, { END_ARGS } } }; diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h index 39705fd..cf5cd90 100644 --- a/wpa_supplicant/dbus/dbus_new.h +++ b/wpa_supplicant/dbus/dbus_new.h @@ -247,6 +247,8 @@ void wpas_dbus_signal_mesh_group_removed(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int reason); 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); #else /* CONFIG_CTRL_IFACE_DBUS_NEW */ @@ -580,6 +582,12 @@ void wpas_dbus_signal_mesh_peer_connected(struct wpa_supplicant *wpa_s, { } +static inline +void wpas_dbus_signal_mesh_peer_disconnected(struct wpa_supplicant *wpa_s, + const u8 *peer_addr, int reason) +{ +} + #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */ #endif /* CTRL_IFACE_DBUS_H_NEW */ diff --git a/wpa_supplicant/mesh_mpm.c b/wpa_supplicant/mesh_mpm.c index 6106b07..cf7107e 100644 --- a/wpa_supplicant/mesh_mpm.c +++ b/wpa_supplicant/mesh_mpm.c @@ -1013,6 +1013,9 @@ static void mesh_mpm_fsm(struct wpa_supplicant *wpa_s, struct sta_info *sta, wpa_msg(wpa_s, MSG_INFO, MESH_PEER_DISCONNECTED MACSTR, MAC2STR(sta->addr)); + /* Send DBUS event */ + wpas_notify_mesh_peer_disconnected(wpa_s, sta->addr, reason); + hapd->num_plinks--; mesh_mpm_send_plink_action(wpa_s, sta, diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c index 7772c27..683a036 100644 --- a/wpa_supplicant/notify.c +++ b/wpa_supplicant/notify.c @@ -883,3 +883,14 @@ void wpas_notify_mesh_peer_connected(struct wpa_supplicant *wpa_s, wpas_dbus_signal_mesh_peer_connected(wpa_s, peer_addr); #endif /* CONFIG_MESH */ } + +void wpas_notify_mesh_peer_disconnected(struct wpa_supplicant *wpa_s, + const u8 *peer_addr, int reason_code) +{ + if (wpa_s->p2p_mgmt) + return; + +#ifdef CONFIG_MESH + wpas_dbus_signal_mesh_peer_disconnected(wpa_s, peer_addr, reason_code); +#endif /* CONFIG_MESH */ +} diff --git a/wpa_supplicant/notify.h b/wpa_supplicant/notify.h index 3d2d8b4..81fa24a 100644 --- a/wpa_supplicant/notify.h +++ b/wpa_supplicant/notify.h @@ -147,5 +147,7 @@ void wpas_notify_mesh_group_removed(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid, int reason_code); 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); #endif /* NOTIFY_H */ -- 1.9.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap