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

Hi Brian,

On Fri, 2020-03-27 at 21:17 +0000, Gix, Brian wrote:
> 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)?
> 

"Forward compatible" means that further keys shall be documented in
mesh-api.txt and then correctly processed by the daemon.
I would prefer to fail on unrecognized keywords.

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

Either 0 or absense of 'Seconds' keyword mean continuous scan.

> 
> > +
> > +		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 22:22 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
2020-03-27 22:22     ` Stotland, Inga [this message]
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=dbfc69b52043d8ecdd695f58f83f2ed312390df6.camel@intel.com \
    --to=inga.stotland@intel.com \
    --cc=brian.gix@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