[PATCH] wpa_supplicant: Emit signal when the station connect or disconnect the AP

Dan Williams dcbw at redhat.com
Wed May 22 11:16:25 EDT 2013


On Wed, 2013-05-22 at 12:33 +0800, Chengyi Zhao wrote:
> From: Chengyi Zhao <chengyix.zhao at gmail.com>
> 
> Signed-off-by: Chengyi Zhao <chengyix.zhao at 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);
>  }
>  
> 




More information about the HostAP mailing list