]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
dbus: Add MeshPeerDisconnected signal
authorSaurav Babu <saurav.babu@samsung.com>
Tue, 18 Jul 2017 07:07:55 +0000 (12:37 +0530)
committerJouni Malinen <j@w1.fi>
Sat, 9 Sep 2017 22:39:37 +0000 (01:39 +0300)
This is similar to the control interface event MESH-PEER-DISCONNECTED.

Signed-off-by: Saurav Babu <saurav.babu@samsung.com>
doc/dbus.doxygen
wpa_supplicant/dbus/dbus_new.c
wpa_supplicant/dbus/dbus_new.h
wpa_supplicant/mesh_mpm.c
wpa_supplicant/notify.c
wpa_supplicant/notify.h

index bfdb5a7e3c718561b4c5bed1815b43ccaff91b77..7f96a935b8f7ea76b7bcef6781927ec92e2fea3d 100644 (file)
@@ -2288,6 +2288,15 @@ Interface for performing mesh operations.
       <dd>A dictionary containing information of the 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 the disconnected mesh peer.</dd>
+    </dl>
+  </li>
 </ul>
 
 */
index 6c494c13268d343622cd94202f9905a0b46c6007..e4cf2adbeba5f1fcad621229c91113627aae8674 100644 (file)
@@ -894,6 +894,40 @@ void wpas_dbus_signal_mesh_peer_connected(struct wpa_supplicant *wpa_s,
        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 || !wpa_s->dbus_new_path)
+               return;
+
+       msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+                                     WPAS_DBUS_NEW_IFACE_MESH,
+                                     "MeshPeerDisconnected");
+       if (!msg)
+               return;
+
+       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 */
 
 
@@ -3745,6 +3779,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 } }
 };
index 979630617ea939b0476d6497745cd7aa6e006353..e68acb7a1c030a26e56613fd52ffc92d586690c1 100644 (file)
@@ -248,6 +248,8 @@ void wpas_dbus_signal_mesh_group_removed(struct wpa_supplicant *wpa_s,
                                         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 */
 
@@ -582,6 +584,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 */
index 2047fb8ec63f2cc7479248408a646373c86387c6..bc3cc5ef95e2c44ab11c050b5ec6528a6543f07a 100644 (file)
@@ -1013,6 +1013,10 @@ 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 D-Bus event */
+                       wpas_notify_mesh_peer_disconnected(wpa_s, sta->addr,
+                                                          reason);
+
                        hapd->num_plinks--;
 
                        mesh_mpm_send_plink_action(wpa_s, sta,
index 5ed414e5361756a9db6abf87fe9889e400cba40d..3e67a77f2060c2e150a4cb6f38a8b7519623e50c 100644 (file)
@@ -885,4 +885,14 @@ void wpas_notify_mesh_peer_connected(struct wpa_supplicant *wpa_s,
        wpas_dbus_signal_mesh_peer_connected(wpa_s, peer_addr);
 }
 
+
+void wpas_notify_mesh_peer_disconnected(struct wpa_supplicant *wpa_s,
+                                       const u8 *peer_addr, int reason_code)
+{
+       if (wpa_s->p2p_mgmt)
+               return;
+
+       wpas_dbus_signal_mesh_peer_disconnected(wpa_s, peer_addr, reason_code);
+}
+
 #endif /* CONFIG_MESH */
index 6c953b617af191b9ac75453bd9d91f3e79e1ffa8..0c113cab541c9a94b977aa312a371d6f353cb6a7 100644 (file)
@@ -148,5 +148,7 @@ void wpas_notify_mesh_group_removed(struct wpa_supplicant *wpa_s,
                                    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 */