Patchwork wpa_supplicant: Emit signal when the station connect or disconnect the AP

login
register
mail settings
Submitter Chengyi Zhao
Date May 22, 2013, 4:33 a.m.
Message ID <1369197229-6458-1-git-send-email-chengyix.zhao@gmail.com>
Download mbox | patch
Permalink /patch/245504/
State Superseded
Headers show

Comments

Chengyi Zhao - May 22, 2013, 4:33 a.m.
From: Chengyi Zhao <chengyix.zhao@gmail.com>

Signed-off-by: Chengyi Zhao <chengyix.zhao@gmail.com>
---
 wpa_supplicant/dbus/dbus_new.c |   78 ++++++++++++++++++++++++++++++++++++++++
 wpa_supplicant/dbus/dbus_new.h |   16 +++++++++
 wpa_supplicant/notify.c        |    4 +++
 3 files changed, 98 insertions(+)
Dan Williams - May 22, 2013, 3:16 p.m.
On Wed, 2013-05-22 at 12:33 +0800, Chengyi Zhao wrote:
> From: Chengyi Zhao <chengyix.zhao@gmail.com>
> 
> Signed-off-by: Chengyi Zhao <chengyix.zhao@gmail.com>
> ---
>  wpa_supplicant/dbus/dbus_new.c |   78 ++++++++++++++++++++++++++++++++++++++++
>  wpa_supplicant/dbus/dbus_new.h |   16 +++++++++
>  wpa_supplicant/notify.c        |    4 +++
>  3 files changed, 98 insertions(+)

At some point there should probably be a property for
"AuthorizedStations" which is a string list containing the MAC addresses
of all authorized stations.  Otherwise a client connecting to the
supplicant after it has authorized a station has no idea that station is
authorized, because it never heard the StaConnected signal.

Also, shouldn't the signals really be "StaAuthorized" and
"StaDeauthorized" instead of Connected?  Same for the functions.  We
might want to use "connected" for something else in the future.

Dan

> diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
> index e9bd51f..51299f3 100644
> --- a/wpa_supplicant/dbus/dbus_new.c
> +++ b/wpa_supplicant/dbus/dbus_new.c
> @@ -868,6 +868,72 @@ nomem:
>  	dbus_message_unref(msg);
>  }
>  
> +/**
> + * wpas_dbus_signal_sta - Send a station related event signal
> + * @wpa_s: %wpa_supplicant network interface data
> + * @sta: station address
> + * @sig_name: signal name - StaConnected or StaDisconnected
> + *
> + * Notify listeners about event related with station
> + */
> +static void wpas_dbus_signal_sta(struct wpa_supplicant *wpa_s,
> +				 const u8 *sta, const char *sig_name)
> +{
> +	struct wpas_dbus_priv *iface;
> +	DBusMessage *msg;
> +	char sta_mac[WPAS_DBUS_OBJECT_PATH_MAX];
> +	char *dev_mac;
> +
> +	os_snprintf(sta_mac, WPAS_DBUS_OBJECT_PATH_MAX, MACSTR, MAC2STR(sta));
> +	dev_mac = sta_mac;
> +
> +	iface = wpa_s->global->dbus;
> +
> +	/* Do nothing if the control interface is not turned on */
> +	if (iface == NULL)
> +		return;
> +
> +	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
> +				      WPAS_DBUS_NEW_IFACE_INTERFACE, sig_name);
> +	if (msg == NULL)
> +		return;
> +
> +	if (dbus_message_append_args(msg, DBUS_TYPE_STRING, &dev_mac,
> +				     DBUS_TYPE_INVALID))
> +		dbus_connection_send(iface->con, msg, NULL);
> +	else
> +		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
> +	dbus_message_unref(msg);
> +
> +	wpa_printf(MSG_DEBUG, "dbus: station mac address '%s' '%s'",
> +		   sta_mac, sig_name);
> +}
> +
> +/**
> + * wpas_dbus_signal_sta_connected - Send a station connected signal
> + * @wpa_s: %wpa_supplicant network interface data
> + * @sta: station address
> + *
> + * Notify listeners about connecting a new station
> + */
> +void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
> +				 const u8 *sta)
> +{
> +	wpas_dbus_signal_sta(wpa_s, sta, "StaConnected");
> +}
> +
> +/**
> + * wpas_dbus_signal_blob_removed - Send a station disconnected signal
> + * @wpa_s: %wpa_supplicant network interface data
> + * @sta: station address
> + *
> + * Notify listeners about disconnecting station
> + */
> +void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
> +				   const u8 *sta)
> +{
> +	wpas_dbus_signal_sta(wpa_s, sta, "StaDisconnected");
> +}
>  
>  #ifdef CONFIG_P2P
>  
> @@ -3017,6 +3083,18 @@ static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
>  		  END_ARGS
>  	  }
>  	},
> +	{ "StaConnected", WPAS_DBUS_NEW_IFACE_INTERFACE,
> +	  {
> +		  { "name", "s", ARG_OUT },
> +		  END_ARGS
> +	  }
> +	},
> +	{ "StaDisconnected", WPAS_DBUS_NEW_IFACE_INTERFACE,
> +	  {
> +		  { "name", "s", ARG_OUT },
> +		  END_ARGS
> +	  }
> +	},
>  	{ NULL, NULL, { END_ARGS } }
>  };
>  
> diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h
> index 363a7e5..6fd4730 100644
> --- a/wpa_supplicant/dbus/dbus_new.h
> +++ b/wpa_supplicant/dbus/dbus_new.h
> @@ -222,6 +222,10 @@ void wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
>  			   const u8 *ie, size_t ie_len, u32 ssi_signal);
>  void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s,
>  				 const char *status, const char *parameter);
> +void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
> +				const u8 *sta);
> +void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
> +				const u8 *sta);
>  
>  #else /* CONFIG_CTRL_IFACE_DBUS_NEW */
>  
> @@ -493,6 +497,18 @@ static inline void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s,
>  {
>  }
>  
> +static inline
> +void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
> +				const u8 *sta)
> +{
> +}
> +
> +static inline
> +void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
> +				const u8 *sta)
> +{
> +}
> +
>  #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
>  
>  #endif /* CTRL_IFACE_DBUS_H_NEW */
> diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
> index ca6f7e7..8815f9b 100644
> --- a/wpa_supplicant/notify.c
> +++ b/wpa_supplicant/notify.c
> @@ -547,6 +547,8 @@ static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
>  	 */
>  	wpas_dbus_signal_p2p_peer_joined(wpa_s, sta);
>  #endif /* CONFIG_P2P */
> +
> +	wpas_dbus_signal_sta_connected(wpa_s, sta);
>  }
>  
> 
> @@ -566,6 +568,8 @@ static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
>  	 */
>  	wpas_dbus_signal_p2p_peer_disconnected(wpa_s, sta);
>  #endif /* CONFIG_P2P */
> +
> +	wpas_dbus_signal_sta_disconnected(wpa_s, sta);
>  }
>  
>

Patch

diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index e9bd51f..51299f3 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -868,6 +868,72 @@  nomem:
 	dbus_message_unref(msg);
 }
 
+/**
+ * wpas_dbus_signal_sta - Send a station related event signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @sta: station address
+ * @sig_name: signal name - StaConnected or StaDisconnected
+ *
+ * Notify listeners about event related with station
+ */
+static void wpas_dbus_signal_sta(struct wpa_supplicant *wpa_s,
+				 const u8 *sta, const char *sig_name)
+{
+	struct wpas_dbus_priv *iface;
+	DBusMessage *msg;
+	char sta_mac[WPAS_DBUS_OBJECT_PATH_MAX];
+	char *dev_mac;
+
+	os_snprintf(sta_mac, WPAS_DBUS_OBJECT_PATH_MAX, MACSTR, MAC2STR(sta));
+	dev_mac = sta_mac;
+
+	iface = wpa_s->global->dbus;
+
+	/* Do nothing if the control interface is not turned on */
+	if (iface == NULL)
+		return;
+
+	msg = dbus_message_new_signal(wpa_s->dbus_new_path,
+				      WPAS_DBUS_NEW_IFACE_INTERFACE, sig_name);
+	if (msg == NULL)
+		return;
+
+	if (dbus_message_append_args(msg, DBUS_TYPE_STRING, &dev_mac,
+				     DBUS_TYPE_INVALID))
+		dbus_connection_send(iface->con, msg, NULL);
+	else
+		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
+	dbus_message_unref(msg);
+
+	wpa_printf(MSG_DEBUG, "dbus: station mac address '%s' '%s'",
+		   sta_mac, sig_name);
+}
+
+/**
+ * wpas_dbus_signal_sta_connected - Send a station connected signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @sta: station address
+ *
+ * Notify listeners about connecting a new station
+ */
+void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
+				 const u8 *sta)
+{
+	wpas_dbus_signal_sta(wpa_s, sta, "StaConnected");
+}
+
+/**
+ * wpas_dbus_signal_blob_removed - Send a station disconnected signal
+ * @wpa_s: %wpa_supplicant network interface data
+ * @sta: station address
+ *
+ * Notify listeners about disconnecting station
+ */
+void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
+				   const u8 *sta)
+{
+	wpas_dbus_signal_sta(wpa_s, sta, "StaDisconnected");
+}
 
 #ifdef CONFIG_P2P
 
@@ -3017,6 +3083,18 @@  static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
 		  END_ARGS
 	  }
 	},
+	{ "StaConnected", WPAS_DBUS_NEW_IFACE_INTERFACE,
+	  {
+		  { "name", "s", ARG_OUT },
+		  END_ARGS
+	  }
+	},
+	{ "StaDisconnected", WPAS_DBUS_NEW_IFACE_INTERFACE,
+	  {
+		  { "name", "s", ARG_OUT },
+		  END_ARGS
+	  }
+	},
 	{ NULL, NULL, { END_ARGS } }
 };
 
diff --git a/wpa_supplicant/dbus/dbus_new.h b/wpa_supplicant/dbus/dbus_new.h
index 363a7e5..6fd4730 100644
--- a/wpa_supplicant/dbus/dbus_new.h
+++ b/wpa_supplicant/dbus/dbus_new.h
@@ -222,6 +222,10 @@  void wpas_dbus_signal_preq(struct wpa_supplicant *wpa_s,
 			   const u8 *ie, size_t ie_len, u32 ssi_signal);
 void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s,
 				 const char *status, const char *parameter);
+void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
+				const u8 *sta);
+void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
+				const u8 *sta);
 
 #else /* CONFIG_CTRL_IFACE_DBUS_NEW */
 
@@ -493,6 +497,18 @@  static inline void wpas_dbus_signal_eap_status(struct wpa_supplicant *wpa_s,
 {
 }
 
+static inline
+void wpas_dbus_signal_sta_connected(struct wpa_supplicant *wpa_s,
+				const u8 *sta)
+{
+}
+
+static inline
+void wpas_dbus_signal_sta_disconnected(struct wpa_supplicant *wpa_s,
+				const u8 *sta)
+{
+}
+
 #endif /* CONFIG_CTRL_IFACE_DBUS_NEW */
 
 #endif /* CTRL_IFACE_DBUS_H_NEW */
diff --git a/wpa_supplicant/notify.c b/wpa_supplicant/notify.c
index ca6f7e7..8815f9b 100644
--- a/wpa_supplicant/notify.c
+++ b/wpa_supplicant/notify.c
@@ -547,6 +547,8 @@  static void wpas_notify_ap_sta_authorized(struct wpa_supplicant *wpa_s,
 	 */
 	wpas_dbus_signal_p2p_peer_joined(wpa_s, sta);
 #endif /* CONFIG_P2P */
+
+	wpas_dbus_signal_sta_connected(wpa_s, sta);
 }
 
 
@@ -566,6 +568,8 @@  static void wpas_notify_ap_sta_deauthorized(struct wpa_supplicant *wpa_s,
 	 */
 	wpas_dbus_signal_p2p_peer_disconnected(wpa_s, sta);
 #endif /* CONFIG_P2P */
+
+	wpas_dbus_signal_sta_disconnected(wpa_s, sta);
 }