diff mbox

[PATCHv2] Dbus: Sending peer device information in DeviceFound event.

Message ID 1466140060-17199-1-git-send-email-n.chaprana@samsung.com
State Changes Requested
Headers show

Commit Message

Nishant Chaprana June 17, 2016, 5:07 a.m. UTC
This sends appends peer device information in DeviceFound event.
Now the signature of DeviceFound will be changed to "oa{sv}" from "o".
This change is required because in case there are large number of peers
in the range of own device, then applications which have registered
DeviceFound event will call GetAll for peer properties and Supplicant
will get busy processing large number of found peers and GetAll from Applicaitons.

This is similar to CTRL interface P2P-DEVICE-FOUND event which contains peer
information in it. This will enable all applications to extract peer information
from event itself and it would not be required to make extra dbus call for peer property
which would be creating extra load over supplicant as well on applicaiton.

Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
---
 doc/dbus.doxygen               | 12 +++++++++++-
 wpa_supplicant/dbus/dbus_new.c | 15 ++++++++++-----
 2 files changed, 21 insertions(+), 6 deletions(-)

Comments

Dan Williams June 17, 2016, 4:11 p.m. UTC | #1
On Fri, 2016-06-17 at 10:37 +0530, Nishant Chaprana wrote:
> This sends appends peer device information in DeviceFound event.
> Now the signature of DeviceFound will be changed to "oa{sv}" from
> "o".
> This change is required because in case there are large number of
> peers
> in the range of own device, then applications which have registered
> DeviceFound event will call GetAll for peer properties and Supplicant
> will get busy processing large number of found peers and GetAll from
> Applicaitons.

Like I said before, changing the signature of the DeviceFound D-Bus
signal is an API break and that's not good.  D-Bus method and signal
signatures are like C/C++ function signatures: changing them will break
things that listen for hte signal or call the method, just like a
binary link error.

You probably want to leave the existing signal alone, and create a
completely new signal with the signature that you want (eg, oa{sv}).
 Maybe "DeviceFoundEx" or "DeviceFoundProperties" or something like
that.

Dan

> This is similar to CTRL interface P2P-DEVICE-FOUND event which
> contains peer
> information in it. This will enable all applications to extract peer
> information
> from event itself and it would not be required to make extra dbus
> call for peer property
> which would be creating extra load over supplicant as well on
> applicaiton.
> 
> Signed-off-by: Nishant Chaprana <n.chaprana@samsung.com>
> ---
>  doc/dbus.doxygen               | 12 +++++++++++-
>  wpa_supplicant/dbus/dbus_new.c | 15 ++++++++++-----
>  2 files changed, 21 insertions(+), 6 deletions(-)
> 
> diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen
> index 28ee371..71bd038 100644
> --- a/doc/dbus.doxygen
> +++ b/doc/dbus.doxygen
> @@ -1628,7 +1628,17 @@ Interface for performing P2P (Wi-Fi Peer-to-
> Peer) P2P Device operations.
>  
>  <ul>
>    <li>
> -    <h3>DeviceFound ( o : path )</h3>
> +	<h3>DeviceFound ( o : path, a{sv} : properties )</h3>
> +	<p>A new peer device has been found.</p>
> +	<h4>Arguments</h4>
> +	<dl>
> +	  <dt>o : path</dt>
> +	  <dd>A D-Bus path to an object representing the found peer
> device.</dd>
> +	</dl>
> +	<dl>
> +	  <dt>a{sv} : properties</dt>
> +	  <dd>A dictionary containing properties of found peer
> device.</dd>
> +	</dl>
>    </li>
>  
>    <li>
> diff --git a/wpa_supplicant/dbus/dbus_new.c
> b/wpa_supplicant/dbus/dbus_new.c
> index 0263b2c..87df427 100644
> --- a/wpa_supplicant/dbus/dbus_new.c
> +++ b/wpa_supplicant/dbus/dbus_new.c
> @@ -3349,6 +3349,7 @@ static const struct wpa_dbus_signal_desc
> wpas_dbus_interface_signals[] = {
>  	{ "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
>  	  {
>  		  { "path", "o", ARG_OUT },
> +		  { "properties", "a{sv}", ARG_OUT },
>  		  END_ARGS
>  	  }
>  	},
> @@ -3800,12 +3801,13 @@ static const struct wpa_dbus_signal_desc
> wpas_dbus_p2p_peer_signals[] = {
>   *	In case of peer objects, it would be emitted by either
>   *	the "interface object" or by "peer objects"
>   * @sig_name: signal name - DeviceFound
> + * @properties: determines if add second argument with object
> properties
>   *
> - * Notify listeners about event related with newly found p2p peer
> device
> + * Notify listeners about event related with p2p peer device
>   */
>  static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
>  				  const u8 *dev_addr, const char
> *interface,
> -				  const char *sig_name)
> +				  const char *sig_name, int
> properties)
>  {
>  	struct wpas_dbus_priv *iface;
>  	DBusMessage *msg;
> @@ -3833,7 +3835,10 @@ static void wpas_dbus_signal_peer(struct
> wpa_supplicant *wpa_s,
>  	dbus_message_iter_init_append(msg, &iter);
>  	path = peer_obj_path;
>  	if (!dbus_message_iter_append_basic(&iter,
> DBUS_TYPE_OBJECT_PATH,
> -					    &path))
> +					    &path) ||
> +	    (properties && !wpa_dbus_get_object_properties(
> +		     iface, peer_obj_path,
> WPAS_DBUS_NEW_IFACE_P2P_PEER,
> +		     &iter)))
>  		wpa_printf(MSG_ERROR, "dbus: Failed to construct
> signal");
>  	else
>  		dbus_connection_send(iface->con, msg, NULL);
> @@ -3854,7 +3859,7 @@ void wpas_dbus_signal_peer_device_found(struct
> wpa_supplicant *wpa_s,
>  {
>  	wpas_dbus_signal_peer(wpa_s, dev_addr,
>  			      WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> -			      "DeviceFound");
> +			      "DeviceFound", TRUE);
>  }
>  
>  /**
> @@ -3869,7 +3874,7 @@ void wpas_dbus_signal_peer_device_lost(struct
> wpa_supplicant *wpa_s,
>  {
>  	wpas_dbus_signal_peer(wpa_s, dev_addr,
>  			      WPAS_DBUS_NEW_IFACE_P2PDEVICE,
> -			      "DeviceLost");
> +			      "DeviceLost", FALSE);
>  }
>  
>  /**
diff mbox

Patch

diff --git a/doc/dbus.doxygen b/doc/dbus.doxygen
index 28ee371..71bd038 100644
--- a/doc/dbus.doxygen
+++ b/doc/dbus.doxygen
@@ -1628,7 +1628,17 @@  Interface for performing P2P (Wi-Fi Peer-to-Peer) P2P Device operations.
 
 <ul>
   <li>
-    <h3>DeviceFound ( o : path )</h3>
+	<h3>DeviceFound ( o : path, a{sv} : properties )</h3>
+	<p>A new peer device has been found.</p>
+	<h4>Arguments</h4>
+	<dl>
+	  <dt>o : path</dt>
+	  <dd>A D-Bus path to an object representing the found peer device.</dd>
+	</dl>
+	<dl>
+	  <dt>a{sv} : properties</dt>
+	  <dd>A dictionary containing properties of found peer device.</dd>
+	</dl>
   </li>
 
   <li>
diff --git a/wpa_supplicant/dbus/dbus_new.c b/wpa_supplicant/dbus/dbus_new.c
index 0263b2c..87df427 100644
--- a/wpa_supplicant/dbus/dbus_new.c
+++ b/wpa_supplicant/dbus/dbus_new.c
@@ -3349,6 +3349,7 @@  static const struct wpa_dbus_signal_desc wpas_dbus_interface_signals[] = {
 	{ "DeviceFound", WPAS_DBUS_NEW_IFACE_P2PDEVICE,
 	  {
 		  { "path", "o", ARG_OUT },
+		  { "properties", "a{sv}", ARG_OUT },
 		  END_ARGS
 	  }
 	},
@@ -3800,12 +3801,13 @@  static const struct wpa_dbus_signal_desc wpas_dbus_p2p_peer_signals[] = {
  *	In case of peer objects, it would be emitted by either
  *	the "interface object" or by "peer objects"
  * @sig_name: signal name - DeviceFound
+ * @properties: determines if add second argument with object properties
  *
- * Notify listeners about event related with newly found p2p peer device
+ * Notify listeners about event related with p2p peer device
  */
 static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
 				  const u8 *dev_addr, const char *interface,
-				  const char *sig_name)
+				  const char *sig_name, int properties)
 {
 	struct wpas_dbus_priv *iface;
 	DBusMessage *msg;
@@ -3833,7 +3835,10 @@  static void wpas_dbus_signal_peer(struct wpa_supplicant *wpa_s,
 	dbus_message_iter_init_append(msg, &iter);
 	path = peer_obj_path;
 	if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_OBJECT_PATH,
-					    &path))
+					    &path) ||
+	    (properties && !wpa_dbus_get_object_properties(
+		     iface, peer_obj_path, WPAS_DBUS_NEW_IFACE_P2P_PEER,
+		     &iter)))
 		wpa_printf(MSG_ERROR, "dbus: Failed to construct signal");
 	else
 		dbus_connection_send(iface->con, msg, NULL);
@@ -3854,7 +3859,7 @@  void wpas_dbus_signal_peer_device_found(struct wpa_supplicant *wpa_s,
 {
 	wpas_dbus_signal_peer(wpa_s, dev_addr,
 			      WPAS_DBUS_NEW_IFACE_P2PDEVICE,
-			      "DeviceFound");
+			      "DeviceFound", TRUE);
 }
 
 /**
@@ -3869,7 +3874,7 @@  void wpas_dbus_signal_peer_device_lost(struct wpa_supplicant *wpa_s,
 {
 	wpas_dbus_signal_peer(wpa_s, dev_addr,
 			      WPAS_DBUS_NEW_IFACE_P2PDEVICE,
-			      "DeviceLost");
+			      "DeviceLost", FALSE);
 }
 
 /**