Linux bluetooth development
 help / color / mirror / Atom feed
From: "Gix, Brian" <brian.gix@intel.com>
To: "linux-bluetooth@vger.kernel.org"
	<linux-bluetooth@vger.kernel.org>,
	"Stotland, Inga" <inga.stotland@intel.com>
Subject: Re: [PATCH BlueZ 2/4] mesh: Update UnprovisionedScan, AddNode & ScanResult
Date: Fri, 27 Mar 2020 21:17:13 +0000	[thread overview]
Message-ID: <23a1089f89c125779b4b3a73607d8ad8d38e1aef.camel@intel.com> (raw)
In-Reply-To: <20200327184257.15042-3-inga.stotland@intel.com>

Hi Inga,
On Fri, 2020-03-27 at 11:42 -0700, Inga Stotland wrote:
> The following methods are modified to allow for future development:
> 
> Interface org.bluez.mesh.Management1:
> 
> Old: void UnprovisionedScan(uint16 seconds)
> New: void UnprovisionedScan(dict options)
> 
>     The options parameter is a dictionary with the following keys defined:
>     uint16 Seconds
>                 Specifies number of seconds for scanning to be active.
>                 If set to 0 or if this key is not present, then the
>                 scanning will continue until UnprovisionedScanCancel()
>                 or AddNode() methods are called.
>     other keys TBD
> 
> Old: void AddNode(array{byte}[16] uuid)
> New: void AddNode(array{byte}[16] uuid, dict options)
> 
>     The options parameter is currently an empty dictionary
> 
> Interface org.bluez.mesh.Provisioner1
> 
> Old: void ScanResult(int16 rssi, array{byte} data)
> New: void ScanResult(int16 rssi, array{byte} data, dict options)
> 
>     The options parameter is currently an empty dictionary
> ---
>  mesh/manager.c | 39 ++++++++++++++++++++++++++++++---------
>  1 file changed, 30 insertions(+), 9 deletions(-)
> 
> diff --git a/mesh/manager.c b/mesh/manager.c
> index 0909c7e16..8e948e47d 100644
> --- a/mesh/manager.c
> +++ b/mesh/manager.c
> @@ -217,21 +217,22 @@ static struct l_dbus_message *add_node_call(struct l_dbus *dbus,
>  						void *user_data)
>  {
>  	struct mesh_node *node = user_data;
> -	struct l_dbus_message_iter iter_uuid;
> +	struct l_dbus_message_iter iter_uuid, options;
>  	struct l_dbus_message *reply;
>  	uint8_t *uuid;
> -	uint32_t n;
> +	uint32_t n = 22;
>  
>  	l_debug("AddNode request");
>  
> -	if (!l_dbus_message_get_arguments(msg, "ay", &iter_uuid))
> +	if (!l_dbus_message_get_arguments(msg, "aya{sv}", &iter_uuid, &options))
>  		return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
>  
>  	if (!l_dbus_message_iter_get_fixed_array(&iter_uuid, &uuid, &n)
> -								|| n != 16)
> +	    || n != 16) {
> +		l_debug("n = %u", n);
>  		return dbus_error(msg, MESH_ERROR_INVALID_ARGS,
>  							"Bad device UUID");
> -
> +	}
>  	/* Allow AddNode to cancel Scanning if from the same node */
>  	if (scan_node) {
>  		if (scan_node != node)
> @@ -361,6 +362,9 @@ static void prov_beacon_recv(void *user_data, struct mesh_io_recv_info *info,
>  	builder = l_dbus_message_builder_new(msg);
>  	l_dbus_message_builder_append_basic(builder, 'n', &rssi);
>  	dbus_append_byte_array(builder, data + 2, len -2);
> +	l_dbus_message_builder_enter_array(builder, "{sv}");
> +	/* TODO: populate with options when defined */
> +	l_dbus_message_builder_leave_array(builder);
>  	l_dbus_message_builder_finalize(builder);
>  	l_dbus_message_builder_destroy(builder);
>  
> @@ -372,17 +376,34 @@ static struct l_dbus_message *start_scan_call(struct l_dbus *dbus,
>  						void *user_data)
>  {
>  	struct mesh_node *node = user_data;
> -	uint16_t duration;
> +	uint16_t duration = 0;
>  	struct mesh_io *io;
>  	struct mesh_net *net;
> +	const char *key;
> +	struct l_dbus_message_iter options, var;
>  	const char *sender = l_dbus_message_get_sender(msg);
>  
>  	if (strcmp(sender, node_get_owner(node)))
>  		return dbus_error(msg, MESH_ERROR_NOT_AUTHORIZED, NULL);
>  
> -	if (!l_dbus_message_get_arguments(msg, "q", &duration))
> +	if (!l_dbus_message_get_arguments(msg, "a{sv}", &options))
>  		return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL);
>  
> +	while (l_dbus_message_iter_next_entry(&options, &key, &var)) {
> +		bool failed = true;
> +
> +		if (!strcmp(key, "Seconds")) {
> +			if (l_dbus_message_iter_get_variant(&var, "q",
> +							    &duration)) {
> +				failed = false;
> +			}
> +		}

I think failing in this in this way is not truely "Forward Compatible". If a key that is *not* Seconds is found
in the dictionary, this will always return an error.  I think it would be better if the key is ignored.

The only "fail" case should be if a key has a known valid, but has an incorrect type (not "q" in the case of
Seconds), or if the key is supported, but the value is outside the acceptable range (is there an acceptable
range for this)?

We agreed, I think, that the *non* existance of Seconds means "Unlimited".

> +
> +		if (failed)
> +			return dbus_error(msg, MESH_ERROR_INVALID_ARGS,
> +							"Invalid options");
> +	}
> +
>  	if (scan_node && scan_node != node)
>  		return dbus_error(msg, MESH_ERROR_BUSY, NULL);
>  
> @@ -752,13 +773,13 @@ static struct l_dbus_message *set_key_phase_call(struct l_dbus *dbus,
>  static void setup_management_interface(struct l_dbus_interface *iface)
>  {
>  	l_dbus_interface_method(iface, "AddNode", 0, add_node_call, "",
> -								"ay", "uuid");
> +						"aya{sv}", "uuid", "options");
>  	l_dbus_interface_method(iface, "ImportRemoteNode", 0, import_node_call,
>  				"", "qyay", "primary", "count", "dev_key");
>  	l_dbus_interface_method(iface, "DeleteRemoteNode", 0, delete_node_call,
>  						"", "qy", "primary", "count");
>  	l_dbus_interface_method(iface, "UnprovisionedScan", 0, start_scan_call,
> -							"", "q", "seconds");
> +							"", "a{sv}", "options");
>  	l_dbus_interface_method(iface, "UnprovisionedScanCancel", 0,
>  						cancel_scan_call, "", "");
>  	l_dbus_interface_method(iface, "CreateSubnet", 0, create_subnet_call,

  reply	other threads:[~2020-03-27 21:17 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-03-27 18:42 [PATCH BlueZ 0/4] API changes for forward compatibility Inga Stotland
2020-03-27 18:42 ` [PATCH BlueZ 1/4] doc/mesh-api: Forward compatibility modifications Inga Stotland
2020-03-27 18:42 ` [PATCH BlueZ 2/4] mesh: Update UnprovisionedScan, AddNode & ScanResult Inga Stotland
2020-03-27 21:17   ` Gix, Brian [this message]
2020-03-27 22:22     ` Stotland, Inga
2020-03-27 18:42 ` [PATCH BlueZ 3/4] test/test-mesh: Update to match modified APIs Inga Stotland
2020-03-27 18:42 ` [PATCH BlueZ 4/4] tools/mesh-cfgclient: " Inga Stotland
2020-03-30 22:07 ` [PATCH BlueZ 0/4] API changes for forward compatibility Gix, Brian

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=23a1089f89c125779b4b3a73607d8ad8d38e1aef.camel@intel.com \
    --to=brian.gix@intel.com \
    --cc=inga.stotland@intel.com \
    --cc=linux-bluetooth@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox