diff mbox

dbus: add SignalPoll() method to report current signal properties

Message ID 1408392036.25041.3.camel@dcbw.local
State Superseded
Headers show

Commit Message

Dan Williams Aug. 18, 2014, 8 p.m. UTC
Analagous to the control interface's SIGNAL_POLL request.

Signed-hostap: Dan Williams <dcbw@redhat.com>
---
Example:

$ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1 /fi/w1/wpa_supplicant1/Interfaces/1 fi.w1.wpa_supplicant1.Interface.SignalPoll
method return sender=:1.268 -> dest=:1.273 reply_serial=2
   variant       array [
         dict entry(
            string "rssi"
            variant                int32 -47
         )
         dict entry(
            string "linkspeed"
            variant                int32 54
         )
         dict entry(
            string "noise"
            variant                int32 9999
         )
         dict entry(
            string "frequency"
            variant                uint32 2462
         )
         dict entry(
            string "width"
            variant                string "20 MHz (no HT)"
         )
         dict entry(
            string "avg-rssi"
            variant                int32 -42
         )
      ]

 wpa_supplicant/ctrl_iface.c             | 24 +---------
 wpa_supplicant/dbus/dbus_new.c          |  7 +++
 wpa_supplicant/dbus/dbus_new_handlers.c | 81 +++++++++++++++++++++++++++++++++
 wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
 wpa_supplicant/wpas_glue.c              | 21 +++++++++
 wpa_supplicant/wpas_glue.h              |  3 ++
 6 files changed, 116 insertions(+), 23 deletions(-)

Comments

a.brooks2@marathon-targets.com Aug. 24, 2014, 11:36 p.m. UTC | #1
Tested: seems to work.  The only thing that's weird is that the "noise" 
seems to always be 9999 (doesn't bother me, I don't use it).

On 2014-08-19 06:00, Dan Williams wrote:
> Analagous to the control interface's SIGNAL_POLL request.
> 
> Signed-hostap: Dan Williams <dcbw@redhat.com>
> ---
> Example:
> 
> $ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1
> /fi/w1/wpa_supplicant1/Interfaces/1
> fi.w1.wpa_supplicant1.Interface.SignalPoll
> method return sender=:1.268 -> dest=:1.273 reply_serial=2
>    variant       array [
>          dict entry(
>             string "rssi"
>             variant                int32 -47
>          )
>          dict entry(
>             string "linkspeed"
>             variant                int32 54
>          )
>          dict entry(
>             string "noise"
>             variant                int32 9999
>          )
>          dict entry(
>             string "frequency"
>             variant                uint32 2462
>          )
>          dict entry(
>             string "width"
>             variant                string "20 MHz (no HT)"
>          )
>          dict entry(
>             string "avg-rssi"
>             variant                int32 -42
>          )
>       ]
> 
>  wpa_supplicant/ctrl_iface.c             | 24 +---------
>  wpa_supplicant/dbus/dbus_new.c          |  7 +++
>  wpa_supplicant/dbus/dbus_new_handlers.c | 81 
> +++++++++++++++++++++++++++++++++
>  wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
>  wpa_supplicant/wpas_glue.c              | 21 +++++++++
>  wpa_supplicant/wpas_glue.h              |  3 ++
>  6 files changed, 116 insertions(+), 23 deletions(-)
> 
> diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
> index 9970597..fe31805 100644
> --- a/wpa_supplicant/ctrl_iface.c
> +++ b/wpa_supplicant/ctrl_iface.c
> @@ -37,14 +37,15 @@
>  #include "scan.h"
>  #include "ctrl_iface.h"
>  #include "interworking.h"
>  #include "blacklist.h"
>  #include "autoscan.h"
>  #include "wnm_sta.h"
>  #include "offchannel.h"
> +#include "wpas_glue.h"
> 
>  static int wpa_supplicant_global_iface_list(struct wpa_global *global,
>  					    char *buf, int len);
>  static int wpa_supplicant_global_iface_interfaces(struct wpa_global 
> *global,
>  						  char *buf, int len);
>  static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
>  					char *val);
> @@ -5448,37 +5449,14 @@ static int
> wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
>  		   query_reason);
> 
>  	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
>  }
> 
>  #endif /* CONFIG_WNM */
> 
> -
> -/* Get string representation of channel width */
> -static const char * channel_width_name(enum chan_width width)
> -{
> -	switch (width) {
> -	case CHAN_WIDTH_20_NOHT:
> -		return "20 MHz (no HT)";
> -	case CHAN_WIDTH_20:
> -		return "20 MHz";
> -	case CHAN_WIDTH_40:
> -		return "40 MHz";
> -	case CHAN_WIDTH_80:
> -		return "80 MHz";
> -	case CHAN_WIDTH_80P80:
> -		return "80+80 MHz";
> -	case CHAN_WIDTH_160:
> -		return "160 MHz";
> -	default:
> -		return "unknown";
> -	}
> -}
> -
> -
>  static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, 
> char *buf,
>  				      size_t buflen)
>  {
>  	struct wpa_signal_info si;
>  	int ret;
>  	char *pos, *end;
> 
> diff --git a/wpa_supplicant/dbus/dbus_new.c 
> b/wpa_supplicant/dbus/dbus_new.c
> index aab2225..7cee614 100644
> --- a/wpa_supplicant/dbus/dbus_new.c
> +++ b/wpa_supplicant/dbus/dbus_new.c
> @@ -2433,14 +2433,21 @@ static const struct wpa_dbus_method_desc
> wpas_dbus_interface_methods[] = {
>  	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
>  	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
>  	  {
>  		  { "args", "a{sv}", ARG_IN },
>  		  END_ARGS
>  	  }
>  	},
> +	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
> +	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
> +	  {
> +		  { "args", "a{sv}", ARG_OUT },
> +		  END_ARGS
> +	  }
> +	},
>  	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
>  	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
>  	  {
>  		  END_ARGS
>  	  }
>  	},
>  	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c
> b/wpa_supplicant/dbus/dbus_new_handlers.c
> index bd38d65..a9c65cc 100644
> --- a/wpa_supplicant/dbus/dbus_new_handlers.c
> +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
> @@ -23,14 +23,15 @@
>  #include "../scan.h"
>  #include "../autoscan.h"
>  #include "dbus_new_helpers.h"
>  #include "dbus_new.h"
>  #include "dbus_new_handlers.h"
>  #include "dbus_dict_helpers.h"
>  #include "dbus_common_i.h"
> +#include "../wpas_glue.h"
> 
>  static const char *debug_strings[] = {
>  	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
>  };
> 
> 
>  /**
> @@ -1386,14 +1387,94 @@ out:
>  	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
>  		os_free((u8 *) params.ssids[i].ssid);
>  	os_free((u8 *) params.extra_ies);
>  	os_free(params.freqs);
>  	return reply;
>  }
> 
> +/**
> + * wpas_dbus_handler_signal_poll - Request immediate signal properties
> + * @message: Pointer to incoming dbus message
> + * @wpa_s: wpa_supplicant structure for a network interface
> + * Returns: NULL indicating success or DBus error message on failure
> + *
> + * Handler function for "SignalPoll" method call of a network device. 
> Requests
> + * that wpa_supplicant read signal properties like RSSI, noise, and 
> link
> + * speed and return them.
> + */
> +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> +					    struct wpa_supplicant *wpa_s)
> +{
> +	struct wpa_signal_info si;
> +	DBusMessage *reply = NULL;
> +	DBusMessageIter iter, iter_dict, variant_iter;
> +	int ret;
> +
> +	ret = wpa_drv_signal_poll(wpa_s, &si);
> +	if (ret) {
> +		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
> +					      "Failed to read signal");
> +	}
> +
> +	reply = dbus_message_new_method_return(message);
> +	if (reply == NULL)
> +		goto nomem;
> +
> +	dbus_message_iter_init_append(reply, &iter);
> +
> +	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
> +					      "a{sv}", &variant_iter))
> +		goto nomem;
> +	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
> +		goto nomem;
> +
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", 
> si.current_signal))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
> +					si.current_txrate / 1000))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", 
> si.current_noise))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 
> si.frequency))
> +		goto nomem;
> +
> +	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
> +		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
> +					channel_width_name(si.chanwidth)))
> +			goto nomem;
> +	}
> +
> +	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
> +						si.center_frq1))
> +			goto nomem;
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
> +						si.center_frq2))
> +			goto nomem;
> +	}
> +
> +	if (si.avg_signal) {
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
> +						si.avg_signal))
> +			goto nomem;
> +	}
> +
> +	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
> +		goto nomem;
> +	if (!dbus_message_iter_close_container(&iter, &variant_iter))
> +		goto nomem;
> +
> +	return reply;
> +
> +nomem:
> +	if (reply)
> +		dbus_message_unref(reply);
> +	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
> +	return reply;
> +}
> 
>  /*
>   * wpas_dbus_handler_disconnect - Terminate the current connection
>   * @message: Pointer to incoming dbus message
>   * @wpa_s: wpa_supplicant structure for a network interface
>   * Returns: NotConnected DBus error message if already not connected
>   * or NULL otherwise.
> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h
> b/wpa_supplicant/dbus/dbus_new_handlers.h
> index 461970d..f00eb88 100644
> --- a/wpa_supplicant/dbus/dbus_new_handlers.h
> +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
> @@ -83,14 +83,17 @@ dbus_bool_t
> wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
>  dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter 
> *iter,
>  						 DBusError *error,
>  						 void *user_data);
> 
>  DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
>  				     struct wpa_supplicant *wpa_s);
> 
> +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> +					    struct wpa_supplicant *wpa_s);
> +
>  DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
>  					   struct wpa_supplicant *wpa_s);
> 
>  dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
>  				   struct wpa_ssid *ssid,
>  				   DBusMessageIter *iter,
>  				   DBusError *error);
> diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
> index 350b122..b77e5d3 100644
> --- a/wpa_supplicant/wpas_glue.c
> +++ b/wpa_supplicant/wpas_glue.c
> @@ -966,7 +966,28 @@ void wpa_supplicant_rsn_supp_set_config(struct
> wpa_supplicant *wpa_s,
>  				wpabuf_free(p2p);
>  			}
>  		}
>  #endif /* CONFIG_P2P */
>  	}
>  	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
>  }
> +
> +/* Get string representation of channel width */
> +const char * channel_width_name(enum chan_width width)
> +{
> +	switch (width) {
> +	case CHAN_WIDTH_20_NOHT:
> +		return "20 MHz (no HT)";
> +	case CHAN_WIDTH_20:
> +		return "20 MHz";
> +	case CHAN_WIDTH_40:
> +		return "40 MHz";
> +	case CHAN_WIDTH_80:
> +		return "80 MHz";
> +	case CHAN_WIDTH_80P80:
> +		return "80+80 MHz";
> +	case CHAN_WIDTH_160:
> +		return "160 MHz";
> +	default:
> +		return "unknown";
> +	}
> +}
> diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
> index 9808c22..8dd99ff 100644
> --- a/wpa_supplicant/wpas_glue.h
> +++ b/wpa_supplicant/wpas_glue.h
> @@ -6,20 +6,23 @@
>   * See README for more details.
>   */
> 
>  #ifndef WPAS_GLUE_H
>  #define WPAS_GLUE_H
> 
>  enum wpa_ctrl_req_type;
> +enum chan_width;
> 
>  int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
>  int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
>  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
>  					struct wpa_ssid *ssid);
> 
>  const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type 
> field,
>  					       const char *default_txt,
>  					       const char **txt);
> 
>  enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char 
> *field);
> 
> +const char * channel_width_name(enum chan_width width);
> +
>  #endif /* WPAS_GLUE_H */
Dan Williams Aug. 27, 2014, 1:39 p.m. UTC | #2
On Mon, 2014-08-25 at 09:36 +1000, a.brooks2@marathon-targets.com wrote:
> Tested: seems to work.  The only thing that's weird is that the "noise" 
> seems to always be 9999 (doesn't bother me, I don't use it).

Not all kernel drivers support reporting the noise, so it may well be
9999 for some hardware.  Which wifi hardware do you have, and what
kernel version?

Dan

> On 2014-08-19 06:00, Dan Williams wrote:
> > Analagous to the control interface's SIGNAL_POLL request.
> > 
> > Signed-hostap: Dan Williams <dcbw@redhat.com>
> > ---
> > Example:
> > 
> > $ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1
> > /fi/w1/wpa_supplicant1/Interfaces/1
> > fi.w1.wpa_supplicant1.Interface.SignalPoll
> > method return sender=:1.268 -> dest=:1.273 reply_serial=2
> >    variant       array [
> >          dict entry(
> >             string "rssi"
> >             variant                int32 -47
> >          )
> >          dict entry(
> >             string "linkspeed"
> >             variant                int32 54
> >          )
> >          dict entry(
> >             string "noise"
> >             variant                int32 9999
> >          )
> >          dict entry(
> >             string "frequency"
> >             variant                uint32 2462
> >          )
> >          dict entry(
> >             string "width"
> >             variant                string "20 MHz (no HT)"
> >          )
> >          dict entry(
> >             string "avg-rssi"
> >             variant                int32 -42
> >          )
> >       ]
> > 
> >  wpa_supplicant/ctrl_iface.c             | 24 +---------
> >  wpa_supplicant/dbus/dbus_new.c          |  7 +++
> >  wpa_supplicant/dbus/dbus_new_handlers.c | 81 
> > +++++++++++++++++++++++++++++++++
> >  wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
> >  wpa_supplicant/wpas_glue.c              | 21 +++++++++
> >  wpa_supplicant/wpas_glue.h              |  3 ++
> >  6 files changed, 116 insertions(+), 23 deletions(-)
> > 
> > diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
> > index 9970597..fe31805 100644
> > --- a/wpa_supplicant/ctrl_iface.c
> > +++ b/wpa_supplicant/ctrl_iface.c
> > @@ -37,14 +37,15 @@
> >  #include "scan.h"
> >  #include "ctrl_iface.h"
> >  #include "interworking.h"
> >  #include "blacklist.h"
> >  #include "autoscan.h"
> >  #include "wnm_sta.h"
> >  #include "offchannel.h"
> > +#include "wpas_glue.h"
> > 
> >  static int wpa_supplicant_global_iface_list(struct wpa_global *global,
> >  					    char *buf, int len);
> >  static int wpa_supplicant_global_iface_interfaces(struct wpa_global 
> > *global,
> >  						  char *buf, int len);
> >  static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
> >  					char *val);
> > @@ -5448,37 +5449,14 @@ static int
> > wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
> >  		   query_reason);
> > 
> >  	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
> >  }
> > 
> >  #endif /* CONFIG_WNM */
> > 
> > -
> > -/* Get string representation of channel width */
> > -static const char * channel_width_name(enum chan_width width)
> > -{
> > -	switch (width) {
> > -	case CHAN_WIDTH_20_NOHT:
> > -		return "20 MHz (no HT)";
> > -	case CHAN_WIDTH_20:
> > -		return "20 MHz";
> > -	case CHAN_WIDTH_40:
> > -		return "40 MHz";
> > -	case CHAN_WIDTH_80:
> > -		return "80 MHz";
> > -	case CHAN_WIDTH_80P80:
> > -		return "80+80 MHz";
> > -	case CHAN_WIDTH_160:
> > -		return "160 MHz";
> > -	default:
> > -		return "unknown";
> > -	}
> > -}
> > -
> > -
> >  static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, 
> > char *buf,
> >  				      size_t buflen)
> >  {
> >  	struct wpa_signal_info si;
> >  	int ret;
> >  	char *pos, *end;
> > 
> > diff --git a/wpa_supplicant/dbus/dbus_new.c 
> > b/wpa_supplicant/dbus/dbus_new.c
> > index aab2225..7cee614 100644
> > --- a/wpa_supplicant/dbus/dbus_new.c
> > +++ b/wpa_supplicant/dbus/dbus_new.c
> > @@ -2433,14 +2433,21 @@ static const struct wpa_dbus_method_desc
> > wpas_dbus_interface_methods[] = {
> >  	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
> >  	  {
> >  		  { "args", "a{sv}", ARG_IN },
> >  		  END_ARGS
> >  	  }
> >  	},
> > +	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
> > +	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
> > +	  {
> > +		  { "args", "a{sv}", ARG_OUT },
> > +		  END_ARGS
> > +	  }
> > +	},
> >  	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
> >  	  {
> >  		  END_ARGS
> >  	  }
> >  	},
> >  	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c
> > b/wpa_supplicant/dbus/dbus_new_handlers.c
> > index bd38d65..a9c65cc 100644
> > --- a/wpa_supplicant/dbus/dbus_new_handlers.c
> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
> > @@ -23,14 +23,15 @@
> >  #include "../scan.h"
> >  #include "../autoscan.h"
> >  #include "dbus_new_helpers.h"
> >  #include "dbus_new.h"
> >  #include "dbus_new_handlers.h"
> >  #include "dbus_dict_helpers.h"
> >  #include "dbus_common_i.h"
> > +#include "../wpas_glue.h"
> > 
> >  static const char *debug_strings[] = {
> >  	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
> >  };
> > 
> > 
> >  /**
> > @@ -1386,14 +1387,94 @@ out:
> >  	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
> >  		os_free((u8 *) params.ssids[i].ssid);
> >  	os_free((u8 *) params.extra_ies);
> >  	os_free(params.freqs);
> >  	return reply;
> >  }
> > 
> > +/**
> > + * wpas_dbus_handler_signal_poll - Request immediate signal properties
> > + * @message: Pointer to incoming dbus message
> > + * @wpa_s: wpa_supplicant structure for a network interface
> > + * Returns: NULL indicating success or DBus error message on failure
> > + *
> > + * Handler function for "SignalPoll" method call of a network device. 
> > Requests
> > + * that wpa_supplicant read signal properties like RSSI, noise, and 
> > link
> > + * speed and return them.
> > + */
> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> > +					    struct wpa_supplicant *wpa_s)
> > +{
> > +	struct wpa_signal_info si;
> > +	DBusMessage *reply = NULL;
> > +	DBusMessageIter iter, iter_dict, variant_iter;
> > +	int ret;
> > +
> > +	ret = wpa_drv_signal_poll(wpa_s, &si);
> > +	if (ret) {
> > +		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
> > +					      "Failed to read signal");
> > +	}
> > +
> > +	reply = dbus_message_new_method_return(message);
> > +	if (reply == NULL)
> > +		goto nomem;
> > +
> > +	dbus_message_iter_init_append(reply, &iter);
> > +
> > +	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
> > +					      "a{sv}", &variant_iter))
> > +		goto nomem;
> > +	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
> > +		goto nomem;
> > +
> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", 
> > si.current_signal))
> > +		goto nomem;
> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
> > +					si.current_txrate / 1000))
> > +		goto nomem;
> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", 
> > si.current_noise))
> > +		goto nomem;
> > +	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", 
> > si.frequency))
> > +		goto nomem;
> > +
> > +	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
> > +		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
> > +					channel_width_name(si.chanwidth)))
> > +			goto nomem;
> > +	}
> > +
> > +	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
> > +						si.center_frq1))
> > +			goto nomem;
> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
> > +						si.center_frq2))
> > +			goto nomem;
> > +	}
> > +
> > +	if (si.avg_signal) {
> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
> > +						si.avg_signal))
> > +			goto nomem;
> > +	}
> > +
> > +	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
> > +		goto nomem;
> > +	if (!dbus_message_iter_close_container(&iter, &variant_iter))
> > +		goto nomem;
> > +
> > +	return reply;
> > +
> > +nomem:
> > +	if (reply)
> > +		dbus_message_unref(reply);
> > +	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
> > +	return reply;
> > +}
> > 
> >  /*
> >   * wpas_dbus_handler_disconnect - Terminate the current connection
> >   * @message: Pointer to incoming dbus message
> >   * @wpa_s: wpa_supplicant structure for a network interface
> >   * Returns: NotConnected DBus error message if already not connected
> >   * or NULL otherwise.
> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h
> > b/wpa_supplicant/dbus/dbus_new_handlers.h
> > index 461970d..f00eb88 100644
> > --- a/wpa_supplicant/dbus/dbus_new_handlers.h
> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
> > @@ -83,14 +83,17 @@ dbus_bool_t
> > wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
> >  dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter 
> > *iter,
> >  						 DBusError *error,
> >  						 void *user_data);
> > 
> >  DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
> >  				     struct wpa_supplicant *wpa_s);
> > 
> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> > +					    struct wpa_supplicant *wpa_s);
> > +
> >  DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
> >  					   struct wpa_supplicant *wpa_s);
> > 
> >  dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
> >  				   struct wpa_ssid *ssid,
> >  				   DBusMessageIter *iter,
> >  				   DBusError *error);
> > diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
> > index 350b122..b77e5d3 100644
> > --- a/wpa_supplicant/wpas_glue.c
> > +++ b/wpa_supplicant/wpas_glue.c
> > @@ -966,7 +966,28 @@ void wpa_supplicant_rsn_supp_set_config(struct
> > wpa_supplicant *wpa_s,
> >  				wpabuf_free(p2p);
> >  			}
> >  		}
> >  #endif /* CONFIG_P2P */
> >  	}
> >  	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
> >  }
> > +
> > +/* Get string representation of channel width */
> > +const char * channel_width_name(enum chan_width width)
> > +{
> > +	switch (width) {
> > +	case CHAN_WIDTH_20_NOHT:
> > +		return "20 MHz (no HT)";
> > +	case CHAN_WIDTH_20:
> > +		return "20 MHz";
> > +	case CHAN_WIDTH_40:
> > +		return "40 MHz";
> > +	case CHAN_WIDTH_80:
> > +		return "80 MHz";
> > +	case CHAN_WIDTH_80P80:
> > +		return "80+80 MHz";
> > +	case CHAN_WIDTH_160:
> > +		return "160 MHz";
> > +	default:
> > +		return "unknown";
> > +	}
> > +}
> > diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
> > index 9808c22..8dd99ff 100644
> > --- a/wpa_supplicant/wpas_glue.h
> > +++ b/wpa_supplicant/wpas_glue.h
> > @@ -6,20 +6,23 @@
> >   * See README for more details.
> >   */
> > 
> >  #ifndef WPAS_GLUE_H
> >  #define WPAS_GLUE_H
> > 
> >  enum wpa_ctrl_req_type;
> > +enum chan_width;
> > 
> >  int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
> >  int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
> >  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
> >  					struct wpa_ssid *ssid);
> > 
> >  const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type 
> > field,
> >  					       const char *default_txt,
> >  					       const char **txt);
> > 
> >  enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char 
> > *field);
> > 
> > +const char * channel_width_name(enum chan_width width);
> > +
> >  #endif /* WPAS_GLUE_H */
> _______________________________________________
> HostAP mailing list
> HostAP@lists.shmoo.com
> http://lists.shmoo.com/mailman/listinfo/hostap
a.brooks2@marathon-targets.com Aug. 28, 2014, 11:45 a.m. UTC | #3
On 2014-08-27 23:39, Dan Williams wrote:
> On Mon, 2014-08-25 at 09:36 +1000, a.brooks2@marathon-targets.com 
> wrote:
>> Tested: seems to work.  The only thing that's weird is that the 
>> "noise"
>> seems to always be 9999 (doesn't bother me, I don't use it).
> 
> Not all kernel drivers support reporting the noise, so it may well be
> 9999 for some hardware.  Which wifi hardware do you have, and what
> kernel version?

Network controller: Intel Corporation Centrino Advanced-N 6235 (rev 24)
[iwlwifi driver]

Kernel: 3.14-1-amd64 #1 SMP Debian 3.14.7-1 (2014-06-16) x86_64 
GNU/Linux


> 
> Dan
> 
>> On 2014-08-19 06:00, Dan Williams wrote:
>> > Analagous to the control interface's SIGNAL_POLL request.
>> >
>> > Signed-hostap: Dan Williams <dcbw@redhat.com>
>> > ---
>> > Example:
>> >
>> > $ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1
>> > /fi/w1/wpa_supplicant1/Interfaces/1
>> > fi.w1.wpa_supplicant1.Interface.SignalPoll
>> > method return sender=:1.268 -> dest=:1.273 reply_serial=2
>> >    variant       array [
>> >          dict entry(
>> >             string "rssi"
>> >             variant                int32 -47
>> >          )
>> >          dict entry(
>> >             string "linkspeed"
>> >             variant                int32 54
>> >          )
>> >          dict entry(
>> >             string "noise"
>> >             variant                int32 9999
>> >          )
>> >          dict entry(
>> >             string "frequency"
>> >             variant                uint32 2462
>> >          )
>> >          dict entry(
>> >             string "width"
>> >             variant                string "20 MHz (no HT)"
>> >          )
>> >          dict entry(
>> >             string "avg-rssi"
>> >             variant                int32 -42
>> >          )
>> >       ]
>> >
>> >  wpa_supplicant/ctrl_iface.c             | 24 +---------
>> >  wpa_supplicant/dbus/dbus_new.c          |  7 +++
>> >  wpa_supplicant/dbus/dbus_new_handlers.c | 81
>> > +++++++++++++++++++++++++++++++++
>> >  wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
>> >  wpa_supplicant/wpas_glue.c              | 21 +++++++++
>> >  wpa_supplicant/wpas_glue.h              |  3 ++
>> >  6 files changed, 116 insertions(+), 23 deletions(-)
>> >
>> > diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
>> > index 9970597..fe31805 100644
>> > --- a/wpa_supplicant/ctrl_iface.c
>> > +++ b/wpa_supplicant/ctrl_iface.c
>> > @@ -37,14 +37,15 @@
>> >  #include "scan.h"
>> >  #include "ctrl_iface.h"
>> >  #include "interworking.h"
>> >  #include "blacklist.h"
>> >  #include "autoscan.h"
>> >  #include "wnm_sta.h"
>> >  #include "offchannel.h"
>> > +#include "wpas_glue.h"
>> >
>> >  static int wpa_supplicant_global_iface_list(struct wpa_global *global,
>> >  					    char *buf, int len);
>> >  static int wpa_supplicant_global_iface_interfaces(struct wpa_global
>> > *global,
>> >  						  char *buf, int len);
>> >  static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
>> >  					char *val);
>> > @@ -5448,37 +5449,14 @@ static int
>> > wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
>> >  		   query_reason);
>> >
>> >  	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
>> >  }
>> >
>> >  #endif /* CONFIG_WNM */
>> >
>> > -
>> > -/* Get string representation of channel width */
>> > -static const char * channel_width_name(enum chan_width width)
>> > -{
>> > -	switch (width) {
>> > -	case CHAN_WIDTH_20_NOHT:
>> > -		return "20 MHz (no HT)";
>> > -	case CHAN_WIDTH_20:
>> > -		return "20 MHz";
>> > -	case CHAN_WIDTH_40:
>> > -		return "40 MHz";
>> > -	case CHAN_WIDTH_80:
>> > -		return "80 MHz";
>> > -	case CHAN_WIDTH_80P80:
>> > -		return "80+80 MHz";
>> > -	case CHAN_WIDTH_160:
>> > -		return "160 MHz";
>> > -	default:
>> > -		return "unknown";
>> > -	}
>> > -}
>> > -
>> > -
>> >  static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s,
>> > char *buf,
>> >  				      size_t buflen)
>> >  {
>> >  	struct wpa_signal_info si;
>> >  	int ret;
>> >  	char *pos, *end;
>> >
>> > diff --git a/wpa_supplicant/dbus/dbus_new.c
>> > b/wpa_supplicant/dbus/dbus_new.c
>> > index aab2225..7cee614 100644
>> > --- a/wpa_supplicant/dbus/dbus_new.c
>> > +++ b/wpa_supplicant/dbus/dbus_new.c
>> > @@ -2433,14 +2433,21 @@ static const struct wpa_dbus_method_desc
>> > wpas_dbus_interface_methods[] = {
>> >  	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
>> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
>> >  	  {
>> >  		  { "args", "a{sv}", ARG_IN },
>> >  		  END_ARGS
>> >  	  }
>> >  	},
>> > +	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
>> > +	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
>> > +	  {
>> > +		  { "args", "a{sv}", ARG_OUT },
>> > +		  END_ARGS
>> > +	  }
>> > +	},
>> >  	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
>> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
>> >  	  {
>> >  		  END_ARGS
>> >  	  }
>> >  	},
>> >  	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
>> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c
>> > b/wpa_supplicant/dbus/dbus_new_handlers.c
>> > index bd38d65..a9c65cc 100644
>> > --- a/wpa_supplicant/dbus/dbus_new_handlers.c
>> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
>> > @@ -23,14 +23,15 @@
>> >  #include "../scan.h"
>> >  #include "../autoscan.h"
>> >  #include "dbus_new_helpers.h"
>> >  #include "dbus_new.h"
>> >  #include "dbus_new_handlers.h"
>> >  #include "dbus_dict_helpers.h"
>> >  #include "dbus_common_i.h"
>> > +#include "../wpas_glue.h"
>> >
>> >  static const char *debug_strings[] = {
>> >  	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
>> >  };
>> >
>> >
>> >  /**
>> > @@ -1386,14 +1387,94 @@ out:
>> >  	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
>> >  		os_free((u8 *) params.ssids[i].ssid);
>> >  	os_free((u8 *) params.extra_ies);
>> >  	os_free(params.freqs);
>> >  	return reply;
>> >  }
>> >
>> > +/**
>> > + * wpas_dbus_handler_signal_poll - Request immediate signal properties
>> > + * @message: Pointer to incoming dbus message
>> > + * @wpa_s: wpa_supplicant structure for a network interface
>> > + * Returns: NULL indicating success or DBus error message on failure
>> > + *
>> > + * Handler function for "SignalPoll" method call of a network device.
>> > Requests
>> > + * that wpa_supplicant read signal properties like RSSI, noise, and
>> > link
>> > + * speed and return them.
>> > + */
>> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
>> > +					    struct wpa_supplicant *wpa_s)
>> > +{
>> > +	struct wpa_signal_info si;
>> > +	DBusMessage *reply = NULL;
>> > +	DBusMessageIter iter, iter_dict, variant_iter;
>> > +	int ret;
>> > +
>> > +	ret = wpa_drv_signal_poll(wpa_s, &si);
>> > +	if (ret) {
>> > +		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
>> > +					      "Failed to read signal");
>> > +	}
>> > +
>> > +	reply = dbus_message_new_method_return(message);
>> > +	if (reply == NULL)
>> > +		goto nomem;
>> > +
>> > +	dbus_message_iter_init_append(reply, &iter);
>> > +
>> > +	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
>> > +					      "a{sv}", &variant_iter))
>> > +		goto nomem;
>> > +	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
>> > +		goto nomem;
>> > +
>> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi",
>> > si.current_signal))
>> > +		goto nomem;
>> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
>> > +					si.current_txrate / 1000))
>> > +		goto nomem;
>> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise",
>> > si.current_noise))
>> > +		goto nomem;
>> > +	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
>> > si.frequency))
>> > +		goto nomem;
>> > +
>> > +	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
>> > +		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
>> > +					channel_width_name(si.chanwidth)))
>> > +			goto nomem;
>> > +	}
>> > +
>> > +	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
>> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
>> > +						si.center_frq1))
>> > +			goto nomem;
>> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
>> > +						si.center_frq2))
>> > +			goto nomem;
>> > +	}
>> > +
>> > +	if (si.avg_signal) {
>> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
>> > +						si.avg_signal))
>> > +			goto nomem;
>> > +	}
>> > +
>> > +	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
>> > +		goto nomem;
>> > +	if (!dbus_message_iter_close_container(&iter, &variant_iter))
>> > +		goto nomem;
>> > +
>> > +	return reply;
>> > +
>> > +nomem:
>> > +	if (reply)
>> > +		dbus_message_unref(reply);
>> > +	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
>> > +	return reply;
>> > +}
>> >
>> >  /*
>> >   * wpas_dbus_handler_disconnect - Terminate the current connection
>> >   * @message: Pointer to incoming dbus message
>> >   * @wpa_s: wpa_supplicant structure for a network interface
>> >   * Returns: NotConnected DBus error message if already not connected
>> >   * or NULL otherwise.
>> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h
>> > b/wpa_supplicant/dbus/dbus_new_handlers.h
>> > index 461970d..f00eb88 100644
>> > --- a/wpa_supplicant/dbus/dbus_new_handlers.h
>> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
>> > @@ -83,14 +83,17 @@ dbus_bool_t
>> > wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
>> >  dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter
>> > *iter,
>> >  						 DBusError *error,
>> >  						 void *user_data);
>> >
>> >  DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
>> >  				     struct wpa_supplicant *wpa_s);
>> >
>> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
>> > +					    struct wpa_supplicant *wpa_s);
>> > +
>> >  DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
>> >  					   struct wpa_supplicant *wpa_s);
>> >
>> >  dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
>> >  				   struct wpa_ssid *ssid,
>> >  				   DBusMessageIter *iter,
>> >  				   DBusError *error);
>> > diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
>> > index 350b122..b77e5d3 100644
>> > --- a/wpa_supplicant/wpas_glue.c
>> > +++ b/wpa_supplicant/wpas_glue.c
>> > @@ -966,7 +966,28 @@ void wpa_supplicant_rsn_supp_set_config(struct
>> > wpa_supplicant *wpa_s,
>> >  				wpabuf_free(p2p);
>> >  			}
>> >  		}
>> >  #endif /* CONFIG_P2P */
>> >  	}
>> >  	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
>> >  }
>> > +
>> > +/* Get string representation of channel width */
>> > +const char * channel_width_name(enum chan_width width)
>> > +{
>> > +	switch (width) {
>> > +	case CHAN_WIDTH_20_NOHT:
>> > +		return "20 MHz (no HT)";
>> > +	case CHAN_WIDTH_20:
>> > +		return "20 MHz";
>> > +	case CHAN_WIDTH_40:
>> > +		return "40 MHz";
>> > +	case CHAN_WIDTH_80:
>> > +		return "80 MHz";
>> > +	case CHAN_WIDTH_80P80:
>> > +		return "80+80 MHz";
>> > +	case CHAN_WIDTH_160:
>> > +		return "160 MHz";
>> > +	default:
>> > +		return "unknown";
>> > +	}
>> > +}
>> > diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
>> > index 9808c22..8dd99ff 100644
>> > --- a/wpa_supplicant/wpas_glue.h
>> > +++ b/wpa_supplicant/wpas_glue.h
>> > @@ -6,20 +6,23 @@
>> >   * See README for more details.
>> >   */
>> >
>> >  #ifndef WPAS_GLUE_H
>> >  #define WPAS_GLUE_H
>> >
>> >  enum wpa_ctrl_req_type;
>> > +enum chan_width;
>> >
>> >  int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
>> >  int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
>> >  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
>> >  					struct wpa_ssid *ssid);
>> >
>> >  const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type
>> > field,
>> >  					       const char *default_txt,
>> >  					       const char **txt);
>> >
>> >  enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char
>> > *field);
>> >
>> > +const char * channel_width_name(enum chan_width width);
>> > +
>> >  #endif /* WPAS_GLUE_H */
>> _______________________________________________
>> HostAP mailing list
>> HostAP@lists.shmoo.com
>> http://lists.shmoo.com/mailman/listinfo/hostap
Dan Williams Aug. 28, 2014, 3:28 p.m. UTC | #4
On Thu, 2014-08-28 at 21:45 +1000, a.brooks2@marathon-targets.com wrote:
> On 2014-08-27 23:39, Dan Williams wrote:
> > On Mon, 2014-08-25 at 09:36 +1000, a.brooks2@marathon-targets.com 
> > wrote:
> >> Tested: seems to work.  The only thing that's weird is that the 
> >> "noise"
> >> seems to always be 9999 (doesn't bother me, I don't use it).
> > 
> > Not all kernel drivers support reporting the noise, so it may well be
> > 9999 for some hardware.  Which wifi hardware do you have, and what
> > kernel version?
> 
> Network controller: Intel Corporation Centrino Advanced-N 6235 (rev 24)
> [iwlwifi driver]
> 
> Kernel: 3.14-1-amd64 #1 SMP Debian 3.14.7-1 (2014-06-16) x86_64 
> GNU/Linux

The noise apparently comes in from nl80211 only if the driver sets the
SURVEY_INFO_NOISE_DBM flag for the NL80211_CMD_GET_SURVEY request.  And
the only drivers that set this flag are ath10k, ath5k, ath9k, carl9170,
b43, b43legacy, libertas_tf, mwl8k, p54, and wl1251.  As you can see,
Intel is not on that list.  So no noise for you (or me!) :)

Dan

> 
> > 
> > Dan
> > 
> >> On 2014-08-19 06:00, Dan Williams wrote:
> >> > Analagous to the control interface's SIGNAL_POLL request.
> >> >
> >> > Signed-hostap: Dan Williams <dcbw@redhat.com>
> >> > ---
> >> > Example:
> >> >
> >> > $ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1
> >> > /fi/w1/wpa_supplicant1/Interfaces/1
> >> > fi.w1.wpa_supplicant1.Interface.SignalPoll
> >> > method return sender=:1.268 -> dest=:1.273 reply_serial=2
> >> >    variant       array [
> >> >          dict entry(
> >> >             string "rssi"
> >> >             variant                int32 -47
> >> >          )
> >> >          dict entry(
> >> >             string "linkspeed"
> >> >             variant                int32 54
> >> >          )
> >> >          dict entry(
> >> >             string "noise"
> >> >             variant                int32 9999
> >> >          )
> >> >          dict entry(
> >> >             string "frequency"
> >> >             variant                uint32 2462
> >> >          )
> >> >          dict entry(
> >> >             string "width"
> >> >             variant                string "20 MHz (no HT)"
> >> >          )
> >> >          dict entry(
> >> >             string "avg-rssi"
> >> >             variant                int32 -42
> >> >          )
> >> >       ]
> >> >
> >> >  wpa_supplicant/ctrl_iface.c             | 24 +---------
> >> >  wpa_supplicant/dbus/dbus_new.c          |  7 +++
> >> >  wpa_supplicant/dbus/dbus_new_handlers.c | 81
> >> > +++++++++++++++++++++++++++++++++
> >> >  wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
> >> >  wpa_supplicant/wpas_glue.c              | 21 +++++++++
> >> >  wpa_supplicant/wpas_glue.h              |  3 ++
> >> >  6 files changed, 116 insertions(+), 23 deletions(-)
> >> >
> >> > diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
> >> > index 9970597..fe31805 100644
> >> > --- a/wpa_supplicant/ctrl_iface.c
> >> > +++ b/wpa_supplicant/ctrl_iface.c
> >> > @@ -37,14 +37,15 @@
> >> >  #include "scan.h"
> >> >  #include "ctrl_iface.h"
> >> >  #include "interworking.h"
> >> >  #include "blacklist.h"
> >> >  #include "autoscan.h"
> >> >  #include "wnm_sta.h"
> >> >  #include "offchannel.h"
> >> > +#include "wpas_glue.h"
> >> >
> >> >  static int wpa_supplicant_global_iface_list(struct wpa_global *global,
> >> >  					    char *buf, int len);
> >> >  static int wpa_supplicant_global_iface_interfaces(struct wpa_global
> >> > *global,
> >> >  						  char *buf, int len);
> >> >  static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
> >> >  					char *val);
> >> > @@ -5448,37 +5449,14 @@ static int
> >> > wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
> >> >  		   query_reason);
> >> >
> >> >  	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
> >> >  }
> >> >
> >> >  #endif /* CONFIG_WNM */
> >> >
> >> > -
> >> > -/* Get string representation of channel width */
> >> > -static const char * channel_width_name(enum chan_width width)
> >> > -{
> >> > -	switch (width) {
> >> > -	case CHAN_WIDTH_20_NOHT:
> >> > -		return "20 MHz (no HT)";
> >> > -	case CHAN_WIDTH_20:
> >> > -		return "20 MHz";
> >> > -	case CHAN_WIDTH_40:
> >> > -		return "40 MHz";
> >> > -	case CHAN_WIDTH_80:
> >> > -		return "80 MHz";
> >> > -	case CHAN_WIDTH_80P80:
> >> > -		return "80+80 MHz";
> >> > -	case CHAN_WIDTH_160:
> >> > -		return "160 MHz";
> >> > -	default:
> >> > -		return "unknown";
> >> > -	}
> >> > -}
> >> > -
> >> > -
> >> >  static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s,
> >> > char *buf,
> >> >  				      size_t buflen)
> >> >  {
> >> >  	struct wpa_signal_info si;
> >> >  	int ret;
> >> >  	char *pos, *end;
> >> >
> >> > diff --git a/wpa_supplicant/dbus/dbus_new.c
> >> > b/wpa_supplicant/dbus/dbus_new.c
> >> > index aab2225..7cee614 100644
> >> > --- a/wpa_supplicant/dbus/dbus_new.c
> >> > +++ b/wpa_supplicant/dbus/dbus_new.c
> >> > @@ -2433,14 +2433,21 @@ static const struct wpa_dbus_method_desc
> >> > wpas_dbus_interface_methods[] = {
> >> >  	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
> >> >  	  {
> >> >  		  { "args", "a{sv}", ARG_IN },
> >> >  		  END_ARGS
> >> >  	  }
> >> >  	},
> >> > +	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >> > +	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
> >> > +	  {
> >> > +		  { "args", "a{sv}", ARG_OUT },
> >> > +		  END_ARGS
> >> > +	  }
> >> > +	},
> >> >  	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >> >  	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
> >> >  	  {
> >> >  		  END_ARGS
> >> >  	  }
> >> >  	},
> >> >  	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
> >> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c
> >> > b/wpa_supplicant/dbus/dbus_new_handlers.c
> >> > index bd38d65..a9c65cc 100644
> >> > --- a/wpa_supplicant/dbus/dbus_new_handlers.c
> >> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
> >> > @@ -23,14 +23,15 @@
> >> >  #include "../scan.h"
> >> >  #include "../autoscan.h"
> >> >  #include "dbus_new_helpers.h"
> >> >  #include "dbus_new.h"
> >> >  #include "dbus_new_handlers.h"
> >> >  #include "dbus_dict_helpers.h"
> >> >  #include "dbus_common_i.h"
> >> > +#include "../wpas_glue.h"
> >> >
> >> >  static const char *debug_strings[] = {
> >> >  	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
> >> >  };
> >> >
> >> >
> >> >  /**
> >> > @@ -1386,14 +1387,94 @@ out:
> >> >  	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
> >> >  		os_free((u8 *) params.ssids[i].ssid);
> >> >  	os_free((u8 *) params.extra_ies);
> >> >  	os_free(params.freqs);
> >> >  	return reply;
> >> >  }
> >> >
> >> > +/**
> >> > + * wpas_dbus_handler_signal_poll - Request immediate signal properties
> >> > + * @message: Pointer to incoming dbus message
> >> > + * @wpa_s: wpa_supplicant structure for a network interface
> >> > + * Returns: NULL indicating success or DBus error message on failure
> >> > + *
> >> > + * Handler function for "SignalPoll" method call of a network device.
> >> > Requests
> >> > + * that wpa_supplicant read signal properties like RSSI, noise, and
> >> > link
> >> > + * speed and return them.
> >> > + */
> >> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> >> > +					    struct wpa_supplicant *wpa_s)
> >> > +{
> >> > +	struct wpa_signal_info si;
> >> > +	DBusMessage *reply = NULL;
> >> > +	DBusMessageIter iter, iter_dict, variant_iter;
> >> > +	int ret;
> >> > +
> >> > +	ret = wpa_drv_signal_poll(wpa_s, &si);
> >> > +	if (ret) {
> >> > +		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
> >> > +					      "Failed to read signal");
> >> > +	}
> >> > +
> >> > +	reply = dbus_message_new_method_return(message);
> >> > +	if (reply == NULL)
> >> > +		goto nomem;
> >> > +
> >> > +	dbus_message_iter_init_append(reply, &iter);
> >> > +
> >> > +	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
> >> > +					      "a{sv}", &variant_iter))
> >> > +		goto nomem;
> >> > +	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
> >> > +		goto nomem;
> >> > +
> >> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi",
> >> > si.current_signal))
> >> > +		goto nomem;
> >> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
> >> > +					si.current_txrate / 1000))
> >> > +		goto nomem;
> >> > +	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise",
> >> > si.current_noise))
> >> > +		goto nomem;
> >> > +	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency",
> >> > si.frequency))
> >> > +		goto nomem;
> >> > +
> >> > +	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
> >> > +		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
> >> > +					channel_width_name(si.chanwidth)))
> >> > +			goto nomem;
> >> > +	}
> >> > +
> >> > +	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
> >> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
> >> > +						si.center_frq1))
> >> > +			goto nomem;
> >> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
> >> > +						si.center_frq2))
> >> > +			goto nomem;
> >> > +	}
> >> > +
> >> > +	if (si.avg_signal) {
> >> > +		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
> >> > +						si.avg_signal))
> >> > +			goto nomem;
> >> > +	}
> >> > +
> >> > +	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
> >> > +		goto nomem;
> >> > +	if (!dbus_message_iter_close_container(&iter, &variant_iter))
> >> > +		goto nomem;
> >> > +
> >> > +	return reply;
> >> > +
> >> > +nomem:
> >> > +	if (reply)
> >> > +		dbus_message_unref(reply);
> >> > +	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
> >> > +	return reply;
> >> > +}
> >> >
> >> >  /*
> >> >   * wpas_dbus_handler_disconnect - Terminate the current connection
> >> >   * @message: Pointer to incoming dbus message
> >> >   * @wpa_s: wpa_supplicant structure for a network interface
> >> >   * Returns: NotConnected DBus error message if already not connected
> >> >   * or NULL otherwise.
> >> > diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h
> >> > b/wpa_supplicant/dbus/dbus_new_handlers.h
> >> > index 461970d..f00eb88 100644
> >> > --- a/wpa_supplicant/dbus/dbus_new_handlers.h
> >> > +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
> >> > @@ -83,14 +83,17 @@ dbus_bool_t
> >> > wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
> >> >  dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter
> >> > *iter,
> >> >  						 DBusError *error,
> >> >  						 void *user_data);
> >> >
> >> >  DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
> >> >  				     struct wpa_supplicant *wpa_s);
> >> >
> >> > +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> >> > +					    struct wpa_supplicant *wpa_s);
> >> > +
> >> >  DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
> >> >  					   struct wpa_supplicant *wpa_s);
> >> >
> >> >  dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
> >> >  				   struct wpa_ssid *ssid,
> >> >  				   DBusMessageIter *iter,
> >> >  				   DBusError *error);
> >> > diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
> >> > index 350b122..b77e5d3 100644
> >> > --- a/wpa_supplicant/wpas_glue.c
> >> > +++ b/wpa_supplicant/wpas_glue.c
> >> > @@ -966,7 +966,28 @@ void wpa_supplicant_rsn_supp_set_config(struct
> >> > wpa_supplicant *wpa_s,
> >> >  				wpabuf_free(p2p);
> >> >  			}
> >> >  		}
> >> >  #endif /* CONFIG_P2P */
> >> >  	}
> >> >  	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
> >> >  }
> >> > +
> >> > +/* Get string representation of channel width */
> >> > +const char * channel_width_name(enum chan_width width)
> >> > +{
> >> > +	switch (width) {
> >> > +	case CHAN_WIDTH_20_NOHT:
> >> > +		return "20 MHz (no HT)";
> >> > +	case CHAN_WIDTH_20:
> >> > +		return "20 MHz";
> >> > +	case CHAN_WIDTH_40:
> >> > +		return "40 MHz";
> >> > +	case CHAN_WIDTH_80:
> >> > +		return "80 MHz";
> >> > +	case CHAN_WIDTH_80P80:
> >> > +		return "80+80 MHz";
> >> > +	case CHAN_WIDTH_160:
> >> > +		return "160 MHz";
> >> > +	default:
> >> > +		return "unknown";
> >> > +	}
> >> > +}
> >> > diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
> >> > index 9808c22..8dd99ff 100644
> >> > --- a/wpa_supplicant/wpas_glue.h
> >> > +++ b/wpa_supplicant/wpas_glue.h
> >> > @@ -6,20 +6,23 @@
> >> >   * See README for more details.
> >> >   */
> >> >
> >> >  #ifndef WPAS_GLUE_H
> >> >  #define WPAS_GLUE_H
> >> >
> >> >  enum wpa_ctrl_req_type;
> >> > +enum chan_width;
> >> >
> >> >  int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
> >> >  int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
> >> >  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
> >> >  					struct wpa_ssid *ssid);
> >> >
> >> >  const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type
> >> > field,
> >> >  					       const char *default_txt,
> >> >  					       const char **txt);
> >> >
> >> >  enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char
> >> > *field);
> >> >
> >> > +const char * channel_width_name(enum chan_width width);
> >> > +
> >> >  #endif /* WPAS_GLUE_H */
> >> _______________________________________________
> >> HostAP mailing list
> >> HostAP@lists.shmoo.com
> >> http://lists.shmoo.com/mailman/listinfo/hostap
Dan Williams Sept. 8, 2014, 4:58 p.m. UTC | #5
Jouni, any comments on this one?  It appears good to go, based on
testing by Tomasz and me.

Dan

On Mon, 2014-08-18 at 15:00 -0500, Dan Williams wrote:
> Analagous to the control interface's SIGNAL_POLL request.
> 
> Signed-hostap: Dan Williams <dcbw@redhat.com>
> ---
> Example:
> 
> $ sudo dbus-send --system --print-reply --dest=fi.w1.wpa_supplicant1 /fi/w1/wpa_supplicant1/Interfaces/1 fi.w1.wpa_supplicant1.Interface.SignalPoll
> method return sender=:1.268 -> dest=:1.273 reply_serial=2
>    variant       array [
>          dict entry(
>             string "rssi"
>             variant                int32 -47
>          )
>          dict entry(
>             string "linkspeed"
>             variant                int32 54
>          )
>          dict entry(
>             string "noise"
>             variant                int32 9999
>          )
>          dict entry(
>             string "frequency"
>             variant                uint32 2462
>          )
>          dict entry(
>             string "width"
>             variant                string "20 MHz (no HT)"
>          )
>          dict entry(
>             string "avg-rssi"
>             variant                int32 -42
>          )
>       ]
> 
>  wpa_supplicant/ctrl_iface.c             | 24 +---------
>  wpa_supplicant/dbus/dbus_new.c          |  7 +++
>  wpa_supplicant/dbus/dbus_new_handlers.c | 81 +++++++++++++++++++++++++++++++++
>  wpa_supplicant/dbus/dbus_new_handlers.h |  3 ++
>  wpa_supplicant/wpas_glue.c              | 21 +++++++++
>  wpa_supplicant/wpas_glue.h              |  3 ++
>  6 files changed, 116 insertions(+), 23 deletions(-)
> 
> diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
> index 9970597..fe31805 100644
> --- a/wpa_supplicant/ctrl_iface.c
> +++ b/wpa_supplicant/ctrl_iface.c
> @@ -37,14 +37,15 @@
>  #include "scan.h"
>  #include "ctrl_iface.h"
>  #include "interworking.h"
>  #include "blacklist.h"
>  #include "autoscan.h"
>  #include "wnm_sta.h"
>  #include "offchannel.h"
> +#include "wpas_glue.h"
>  
>  static int wpa_supplicant_global_iface_list(struct wpa_global *global,
>  					    char *buf, int len);
>  static int wpa_supplicant_global_iface_interfaces(struct wpa_global *global,
>  						  char *buf, int len);
>  static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
>  					char *val);
> @@ -5448,37 +5449,14 @@ static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
>  		   query_reason);
>  
>  	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
>  }
>  
>  #endif /* CONFIG_WNM */
>  
> -
> -/* Get string representation of channel width */
> -static const char * channel_width_name(enum chan_width width)
> -{
> -	switch (width) {
> -	case CHAN_WIDTH_20_NOHT:
> -		return "20 MHz (no HT)";
> -	case CHAN_WIDTH_20:
> -		return "20 MHz";
> -	case CHAN_WIDTH_40:
> -		return "40 MHz";
> -	case CHAN_WIDTH_80:
> -		return "80 MHz";
> -	case CHAN_WIDTH_80P80:
> -		return "80+80 MHz";
> -	case CHAN_WIDTH_160:
> -		return "160 MHz";
> -	default:
> -		return "unknown";
> -	}
> -}
> -
> -
>  static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf,
>  				      size_t buflen)
>  {
>  	struct wpa_signal_info si;
>  	int ret;
>  	char *pos, *end;
>  
> diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
> index aab2225..7cee614 100644
> --- a/wpa_supplicant/dbus/dbus_new.c
> +++ b/wpa_supplicant/dbus/dbus_new.c
> @@ -2433,14 +2433,21 @@ static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
>  	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
>  	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
>  	  {
>  		  { "args", "a{sv}", ARG_IN },
>  		  END_ARGS
>  	  }
>  	},
> +	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
> +	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
> +	  {
> +		  { "args", "a{sv}", ARG_OUT },
> +		  END_ARGS
> +	  }
> +	},
>  	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
>  	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
>  	  {
>  		  END_ARGS
>  	  }
>  	},
>  	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
> index bd38d65..a9c65cc 100644
> --- a/wpa_supplicant/dbus/dbus_new_handlers.c
> +++ b/wpa_supplicant/dbus/dbus_new_handlers.c
> @@ -23,14 +23,15 @@
>  #include "../scan.h"
>  #include "../autoscan.h"
>  #include "dbus_new_helpers.h"
>  #include "dbus_new.h"
>  #include "dbus_new_handlers.h"
>  #include "dbus_dict_helpers.h"
>  #include "dbus_common_i.h"
> +#include "../wpas_glue.h"
>  
>  static const char *debug_strings[] = {
>  	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
>  };
>  
> 
>  /**
> @@ -1386,14 +1387,94 @@ out:
>  	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
>  		os_free((u8 *) params.ssids[i].ssid);
>  	os_free((u8 *) params.extra_ies);
>  	os_free(params.freqs);
>  	return reply;
>  }
>  
> +/**
> + * wpas_dbus_handler_signal_poll - Request immediate signal properties
> + * @message: Pointer to incoming dbus message
> + * @wpa_s: wpa_supplicant structure for a network interface
> + * Returns: NULL indicating success or DBus error message on failure
> + *
> + * Handler function for "SignalPoll" method call of a network device. Requests
> + * that wpa_supplicant read signal properties like RSSI, noise, and link
> + * speed and return them.
> + */
> +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> +					    struct wpa_supplicant *wpa_s)
> +{
> +	struct wpa_signal_info si;
> +	DBusMessage *reply = NULL;
> +	DBusMessageIter iter, iter_dict, variant_iter;
> +	int ret;
> +
> +	ret = wpa_drv_signal_poll(wpa_s, &si);
> +	if (ret) {
> +		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
> +					      "Failed to read signal");
> +	}
> +
> +	reply = dbus_message_new_method_return(message);
> +	if (reply == NULL)
> +		goto nomem;
> +
> +	dbus_message_iter_init_append(reply, &iter);
> +
> +	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
> +					      "a{sv}", &variant_iter))
> +		goto nomem;
> +	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
> +		goto nomem;
> +
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", si.current_signal))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
> +					si.current_txrate / 1000))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", si.current_noise))
> +		goto nomem;
> +	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", si.frequency))
> +		goto nomem;
> +
> +	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
> +		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
> +					channel_width_name(si.chanwidth)))
> +			goto nomem;
> +	}
> +
> +	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
> +						si.center_frq1))
> +			goto nomem;
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
> +						si.center_frq2))
> +			goto nomem;
> +	}
> +
> +	if (si.avg_signal) {
> +		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
> +						si.avg_signal))
> +			goto nomem;
> +	}
> +
> +	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
> +		goto nomem;
> +	if (!dbus_message_iter_close_container(&iter, &variant_iter))
> +		goto nomem;
> +
> +	return reply;
> +
> +nomem:
> +	if (reply)
> +		dbus_message_unref(reply);
> +	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
> +	return reply;
> +}
>  
>  /*
>   * wpas_dbus_handler_disconnect - Terminate the current connection
>   * @message: Pointer to incoming dbus message
>   * @wpa_s: wpa_supplicant structure for a network interface
>   * Returns: NotConnected DBus error message if already not connected
>   * or NULL otherwise.
> diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h b/wpa_supplicant/dbus/dbus_new_handlers.h
> index 461970d..f00eb88 100644
> --- a/wpa_supplicant/dbus/dbus_new_handlers.h
> +++ b/wpa_supplicant/dbus/dbus_new_handlers.h
> @@ -83,14 +83,17 @@ dbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
>  dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
>  						 DBusError *error,
>  						 void *user_data);
>  
>  DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
>  				     struct wpa_supplicant *wpa_s);
>  
> +DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
> +					    struct wpa_supplicant *wpa_s);
> +
>  DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
>  					   struct wpa_supplicant *wpa_s);
>  
>  dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
>  				   struct wpa_ssid *ssid,
>  				   DBusMessageIter *iter,
>  				   DBusError *error);
> diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
> index 350b122..b77e5d3 100644
> --- a/wpa_supplicant/wpas_glue.c
> +++ b/wpa_supplicant/wpas_glue.c
> @@ -966,7 +966,28 @@ void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
>  				wpabuf_free(p2p);
>  			}
>  		}
>  #endif /* CONFIG_P2P */
>  	}
>  	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
>  }
> +
> +/* Get string representation of channel width */
> +const char * channel_width_name(enum chan_width width)
> +{
> +	switch (width) {
> +	case CHAN_WIDTH_20_NOHT:
> +		return "20 MHz (no HT)";
> +	case CHAN_WIDTH_20:
> +		return "20 MHz";
> +	case CHAN_WIDTH_40:
> +		return "40 MHz";
> +	case CHAN_WIDTH_80:
> +		return "80 MHz";
> +	case CHAN_WIDTH_80P80:
> +		return "80+80 MHz";
> +	case CHAN_WIDTH_160:
> +		return "160 MHz";
> +	default:
> +		return "unknown";
> +	}
> +}
> diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
> index 9808c22..8dd99ff 100644
> --- a/wpa_supplicant/wpas_glue.h
> +++ b/wpa_supplicant/wpas_glue.h
> @@ -6,20 +6,23 @@
>   * See README for more details.
>   */
>  
>  #ifndef WPAS_GLUE_H
>  #define WPAS_GLUE_H
>  
>  enum wpa_ctrl_req_type;
> +enum chan_width;
>  
>  int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
>  int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
>  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
>  					struct wpa_ssid *ssid);
>  
>  const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type field,
>  					       const char *default_txt,
>  					       const char **txt);
>  
>  enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char *field);
>  
> +const char * channel_width_name(enum chan_width width);
> +
>  #endif /* WPAS_GLUE_H */
diff mbox

Patch

diff --git a/wpa_supplicant/ctrl_iface.c b/wpa_supplicant/ctrl_iface.c
index 9970597..fe31805 100644
--- a/wpa_supplicant/ctrl_iface.c
+++ b/wpa_supplicant/ctrl_iface.c
@@ -37,14 +37,15 @@ 
 #include "scan.h"
 #include "ctrl_iface.h"
 #include "interworking.h"
 #include "blacklist.h"
 #include "autoscan.h"
 #include "wnm_sta.h"
 #include "offchannel.h"
+#include "wpas_glue.h"
 
 static int wpa_supplicant_global_iface_list(struct wpa_global *global,
 					    char *buf, int len);
 static int wpa_supplicant_global_iface_interfaces(struct wpa_global *global,
 						  char *buf, int len);
 static int * freq_range_to_channel_list(struct wpa_supplicant *wpa_s,
 					char *val);
@@ -5448,37 +5449,14 @@  static int wpas_ctrl_iface_wnm_bss_query(struct wpa_supplicant *wpa_s, char *cmd
 		   query_reason);
 
 	return wnm_send_bss_transition_mgmt_query(wpa_s, query_reason);
 }
 
 #endif /* CONFIG_WNM */
 
-
-/* Get string representation of channel width */
-static const char * channel_width_name(enum chan_width width)
-{
-	switch (width) {
-	case CHAN_WIDTH_20_NOHT:
-		return "20 MHz (no HT)";
-	case CHAN_WIDTH_20:
-		return "20 MHz";
-	case CHAN_WIDTH_40:
-		return "40 MHz";
-	case CHAN_WIDTH_80:
-		return "80 MHz";
-	case CHAN_WIDTH_80P80:
-		return "80+80 MHz";
-	case CHAN_WIDTH_160:
-		return "160 MHz";
-	default:
-		return "unknown";
-	}
-}
-
-
 static int wpa_supplicant_signal_poll(struct wpa_supplicant *wpa_s, char *buf,
 				      size_t buflen)
 {
 	struct wpa_signal_info si;
 	int ret;
 	char *pos, *end;
 
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index aab2225..7cee614 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -2433,14 +2433,21 @@  static const struct wpa_dbus_method_desc wpas_dbus_interface_methods[] = {
 	{ "Scan", WPAS_DBUS_NEW_IFACE_INTERFACE,
 	  (WPADBusMethodHandler) &wpas_dbus_handler_scan,
 	  {
 		  { "args", "a{sv}", ARG_IN },
 		  END_ARGS
 	  }
 	},
+	{ "SignalPoll", WPAS_DBUS_NEW_IFACE_INTERFACE,
+	  (WPADBusMethodHandler) &wpas_dbus_handler_signal_poll,
+	  {
+		  { "args", "a{sv}", ARG_OUT },
+		  END_ARGS
+	  }
+	},
 	{ "Disconnect", WPAS_DBUS_NEW_IFACE_INTERFACE,
 	  (WPADBusMethodHandler) &wpas_dbus_handler_disconnect,
 	  {
 		  END_ARGS
 	  }
 	},
 	{ "AddNetwork", WPAS_DBUS_NEW_IFACE_INTERFACE,
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.c b/wpa_supplicant/dbus/dbus_new_handlers.c
index bd38d65..a9c65cc 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.c
+++ b/wpa_supplicant/dbus/dbus_new_handlers.c
@@ -23,14 +23,15 @@ 
 #include "../scan.h"
 #include "../autoscan.h"
 #include "dbus_new_helpers.h"
 #include "dbus_new.h"
 #include "dbus_new_handlers.h"
 #include "dbus_dict_helpers.h"
 #include "dbus_common_i.h"
+#include "../wpas_glue.h"
 
 static const char *debug_strings[] = {
 	"excessive", "msgdump", "debug", "info", "warning", "error", NULL
 };
 
 
 /**
@@ -1386,14 +1387,94 @@  out:
 	for (i = 0; i < WPAS_MAX_SCAN_SSIDS; i++)
 		os_free((u8 *) params.ssids[i].ssid);
 	os_free((u8 *) params.extra_ies);
 	os_free(params.freqs);
 	return reply;
 }
 
+/**
+ * wpas_dbus_handler_signal_poll - Request immediate signal properties
+ * @message: Pointer to incoming dbus message
+ * @wpa_s: wpa_supplicant structure for a network interface
+ * Returns: NULL indicating success or DBus error message on failure
+ *
+ * Handler function for "SignalPoll" method call of a network device. Requests
+ * that wpa_supplicant read signal properties like RSSI, noise, and link
+ * speed and return them.
+ */
+DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
+					    struct wpa_supplicant *wpa_s)
+{
+	struct wpa_signal_info si;
+	DBusMessage *reply = NULL;
+	DBusMessageIter iter, iter_dict, variant_iter;
+	int ret;
+
+	ret = wpa_drv_signal_poll(wpa_s, &si);
+	if (ret) {
+		return dbus_message_new_error(message, DBUS_ERROR_FAILED,
+					      "Failed to read signal");
+	}
+
+	reply = dbus_message_new_method_return(message);
+	if (reply == NULL)
+		goto nomem;
+
+	dbus_message_iter_init_append(reply, &iter);
+
+	if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_VARIANT,
+					      "a{sv}", &variant_iter))
+		goto nomem;
+	if (!wpa_dbus_dict_open_write(&variant_iter, &iter_dict))
+		goto nomem;
+
+	if (!wpa_dbus_dict_append_int32(&iter_dict, "rssi", si.current_signal))
+		goto nomem;
+	if (!wpa_dbus_dict_append_int32(&iter_dict, "linkspeed",
+					si.current_txrate / 1000))
+		goto nomem;
+	if (!wpa_dbus_dict_append_int32(&iter_dict, "noise", si.current_noise))
+		goto nomem;
+	if (!wpa_dbus_dict_append_uint32(&iter_dict, "frequency", si.frequency))
+		goto nomem;
+
+	if (si.chanwidth != CHAN_WIDTH_UNKNOWN) {
+		if (!wpa_dbus_dict_append_string(&iter_dict, "width",
+					channel_width_name(si.chanwidth)))
+			goto nomem;
+	}
+
+	if (si.center_frq1 > 0 && si.center_frq2 > 0) {
+		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq1",
+						si.center_frq1))
+			goto nomem;
+		if (!wpa_dbus_dict_append_int32(&iter_dict, "center-frq2",
+						si.center_frq2))
+			goto nomem;
+	}
+
+	if (si.avg_signal) {
+		if (!wpa_dbus_dict_append_int32(&iter_dict, "avg-rssi",
+						si.avg_signal))
+			goto nomem;
+	}
+
+	if (!wpa_dbus_dict_close_write(&variant_iter, &iter_dict))
+		goto nomem;
+	if (!dbus_message_iter_close_container(&iter, &variant_iter))
+		goto nomem;
+
+	return reply;
+
+nomem:
+	if (reply)
+		dbus_message_unref(reply);
+	reply = dbus_message_new_error(message, DBUS_ERROR_NO_MEMORY, NULL);
+	return reply;
+}
 
 /*
  * wpas_dbus_handler_disconnect - Terminate the current connection
  * @message: Pointer to incoming dbus message
  * @wpa_s: wpa_supplicant structure for a network interface
  * Returns: NotConnected DBus error message if already not connected
  * or NULL otherwise.
diff --git a/wpa_supplicant/dbus/dbus_new_handlers.h b/wpa_supplicant/dbus/dbus_new_handlers.h
index 461970d..f00eb88 100644
--- a/wpa_supplicant/dbus/dbus_new_handlers.h
+++ b/wpa_supplicant/dbus/dbus_new_handlers.h
@@ -83,14 +83,17 @@  dbus_bool_t wpas_dbus_getter_eap_methods(DBusMessageIter *iter,
 dbus_bool_t wpas_dbus_getter_global_capabilities(DBusMessageIter *iter,
 						 DBusError *error,
 						 void *user_data);
 
 DBusMessage * wpas_dbus_handler_scan(DBusMessage *message,
 				     struct wpa_supplicant *wpa_s);
 
+DBusMessage * wpas_dbus_handler_signal_poll(DBusMessage *message,
+					    struct wpa_supplicant *wpa_s);
+
 DBusMessage * wpas_dbus_handler_disconnect(DBusMessage *message,
 					   struct wpa_supplicant *wpa_s);
 
 dbus_bool_t set_network_properties(struct wpa_supplicant *wpa_s,
 				   struct wpa_ssid *ssid,
 				   DBusMessageIter *iter,
 				   DBusError *error);
diff --git a/wpa_supplicant/wpas_glue.c b/wpa_supplicant/wpas_glue.c
index 350b122..b77e5d3 100644
--- a/wpa_supplicant/wpas_glue.c
+++ b/wpa_supplicant/wpas_glue.c
@@ -966,7 +966,28 @@  void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
 				wpabuf_free(p2p);
 			}
 		}
 #endif /* CONFIG_P2P */
 	}
 	wpa_sm_set_config(wpa_s->wpa, ssid ? &conf : NULL);
 }
+
+/* Get string representation of channel width */
+const char * channel_width_name(enum chan_width width)
+{
+	switch (width) {
+	case CHAN_WIDTH_20_NOHT:
+		return "20 MHz (no HT)";
+	case CHAN_WIDTH_20:
+		return "20 MHz";
+	case CHAN_WIDTH_40:
+		return "40 MHz";
+	case CHAN_WIDTH_80:
+		return "80 MHz";
+	case CHAN_WIDTH_80P80:
+		return "80+80 MHz";
+	case CHAN_WIDTH_160:
+		return "160 MHz";
+	default:
+		return "unknown";
+	}
+}
diff --git a/wpa_supplicant/wpas_glue.h b/wpa_supplicant/wpas_glue.h
index 9808c22..8dd99ff 100644
--- a/wpa_supplicant/wpas_glue.h
+++ b/wpa_supplicant/wpas_glue.h
@@ -6,20 +6,23 @@ 
  * See README for more details.
  */
 
 #ifndef WPAS_GLUE_H
 #define WPAS_GLUE_H
 
 enum wpa_ctrl_req_type;
+enum chan_width;
 
 int wpa_supplicant_init_eapol(struct wpa_supplicant *wpa_s);
 int wpa_supplicant_init_wpa(struct wpa_supplicant *wpa_s);
 void wpa_supplicant_rsn_supp_set_config(struct wpa_supplicant *wpa_s,
 					struct wpa_ssid *ssid);
 
 const char * wpa_supplicant_ctrl_req_to_string(enum wpa_ctrl_req_type field,
 					       const char *default_txt,
 					       const char **txt);
 
 enum wpa_ctrl_req_type wpa_supplicant_ctrl_req_from_string(const char *field);
 
+const char * channel_width_name(enum chan_width width);
+
 #endif /* WPAS_GLUE_H */