diff options
author | Inga Stotland <inga.stotland@intel.com> | 2020-03-27 11:42:55 -0700 |
---|---|---|
committer | Brian Gix <brian.gix@intel.com> | 2020-03-30 15:03:56 -0700 |
commit | 4100dede01cff6151fb30687ceef8705e143b6dc (patch) | |
tree | 032923bf5c376d457139202490b6a30387d2ed63 /mesh/manager.c | |
parent | 5ab72c772f91666e6d497f4df87928c9184e9eff (diff) | |
download | bluez-4100dede01cff6151fb30687ceef8705e143b6dc.tar.gz |
mesh: Update UnprovisionedScan, AddNode & ScanResult
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
Diffstat (limited to 'mesh/manager.c')
-rw-r--r-- | mesh/manager.c | 39 |
1 files 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; + } + } + + 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, |