All of lore.kernel.org
 help / color / mirror / Atom feed
From: Inga Stotland <inga.stotland@intel.com>
To: linux-bluetooth@vger.kernel.org
Cc: brian.gix@intel.com, Inga Stotland <inga.stotland@intel.com>
Subject: [PATCH BlueZ 01/20] tools/mesh-cfgclient: Save provisioner info
Date: Wed, 22 Sep 2021 20:25:44 -0700	[thread overview]
Message-ID: <20210923032603.50536-2-inga.stotland@intel.com> (raw)
In-Reply-To: <20210923032603.50536-1-inga.stotland@intel.com>

This adds "provisioners" property to the config database.
The property includes the provisioner's name, UUID of the provisioner
device (corresponds to the local node), allocated unicast, group and
scene ranges.
The current implementation limitations:
- only one provisioner in the mesh network is supported,
- the unicast range is assumed to be contiguous,
- the group range is assumed to be contiguous,
- no support for scenes (empty array).
---
 tools/mesh-cfgclient.c |   5 +-
 tools/mesh/mesh-db.c   | 110 ++++++++++++++++++++++++++++++++++++-----
 tools/mesh/mesh-db.h   |   1 -
 3 files changed, 103 insertions(+), 13 deletions(-)

diff --git a/tools/mesh-cfgclient.c b/tools/mesh-cfgclient.c
index 70553c95c..62dcecb2f 100644
--- a/tools/mesh-cfgclient.c
+++ b/tools/mesh-cfgclient.c
@@ -1823,13 +1823,16 @@ static struct l_dbus_message *join_complete(struct l_dbus *dbus,
 		return l_dbus_message_new_error(message, dbus_err_fail, NULL);
 	}
 
-	mesh_db_set_addr_range(low_addr, high_addr);
 	keys_add_net_key(PRIMARY_NET_IDX);
 	mesh_db_net_key_add(PRIMARY_NET_IDX);
 
 	remote_add_node(app.uuid, 0x0001, 1, PRIMARY_NET_IDX);
 	mesh_db_add_node(app.uuid, 0x0001, 1, PRIMARY_NET_IDX);
 
+	mesh_db_add_provisioner("BlueZ mesh-cfgclient", app.uuid,
+					low_addr, high_addr,
+					GROUP_ADDRESS_LOW, GROUP_ADDRESS_HIGH);
+
 	l_idle_oneshot(attach_node, NULL, NULL);
 
 	return l_dbus_message_new_method_return(message);
diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
index 034d7be2b..50fbc18cb 100644
--- a/tools/mesh/mesh-db.c
+++ b/tools/mesh/mesh-db.c
@@ -245,7 +245,7 @@ static json_object *get_node_by_uuid(json_object *jcfg, uint8_t uuid[16])
 		const char *str;
 
 		jentry = json_object_array_get_idx(jarray, i);
-		if (!json_object_object_get_ex(jentry, "uuid", &jval))
+		if (!json_object_object_get_ex(jentry, "UUID", &jval))
 			return NULL;
 
 		str = json_object_get_string(jval);
@@ -429,7 +429,7 @@ static void load_remotes(json_object *jcfg)
 		if (!jnode)
 			continue;
 
-		if (!json_object_object_get_ex(jnode, "uuid", &jval))
+		if (!json_object_object_get_ex(jnode, "UUID", &jval))
 			continue;
 
 		str = json_object_get_string(jval);
@@ -931,7 +931,7 @@ bool mesh_db_add_node(uint8_t uuid[16], uint8_t num_els, uint16_t unicast,
 	if (!jnode)
 		return false;
 
-	if (!add_u8_16(jnode, "uuid", uuid))
+	if (!add_u8_16(jnode, "UUID", uuid))
 		goto fail;
 
 	jelements = init_elements(num_els);
@@ -1188,14 +1188,32 @@ bool mesh_db_get_token(uint8_t token[8])
 
 bool mesh_db_get_addr_range(uint16_t *low, uint16_t *high)
 {
-	json_object *jlow, *jhigh;
+	json_object *jprov, *jarray, *jobj, *jlow, *jhigh;
 	const char *str;
 
 	if (!cfg || !cfg->jcfg)
 		return false;
 
-	if (!json_object_object_get_ex(cfg->jcfg, "low", &jlow) ||
-			!json_object_object_get_ex(cfg->jcfg, "high", &jhigh))
+	jarray = json_object_object_get(cfg->jcfg, "provisioniers");
+
+	if (!jarray || json_object_get_type(jarray) != json_type_array)
+		return false;
+
+	/* Assumption: only one provisioner in the system */
+	jprov = json_object_array_get_idx(jarray, 0);
+	if (!jprov)
+		return false;
+
+	if (!json_object_object_get_ex(jprov, "allocatedUnicastRange", &jarray))
+		return false;
+
+	/* Assumption: only one contiguous range is specified */
+	jobj = json_object_array_get_idx(jarray, 0);
+	if (!jobj)
+		return false;
+
+	if (!json_object_object_get_ex(jobj, "lowAddress", &jlow) ||
+			!json_object_object_get_ex(jobj, "highAddress", &jhigh))
 		return false;
 
 	str = json_object_get_string(jlow);
@@ -1209,18 +1227,82 @@ bool mesh_db_get_addr_range(uint16_t *low, uint16_t *high)
 	return true;
 }
 
-bool mesh_db_set_addr_range(uint16_t low, uint16_t high)
+/*
+ * This is a simplistic implementation onf allocated range, where
+ * the range is one contiguous chunk of the address space.
+ */
+static bool add_range(json_object *jobj, const char *keyword, uint16_t low,
+								uint16_t high)
 {
+	json_object *jarray, *jrange;
+
+	jrange = json_object_new_object();
+
+	if (!write_uint16_hex(jrange, "lowAddress", low))
+		goto fail;
+
+	if (!write_uint16_hex(jrange, "highAddress", high))
+		goto fail;
+
+	jarray = json_object_new_array();
+	if (!jarray)
+		goto fail;
+
+	json_object_array_add(jarray, jrange);
+	json_object_object_add(jobj, keyword, jarray);
+
+	return true;
+
+fail:
+	json_object_put(jrange);
+
+	return false;
+}
+
+bool mesh_db_add_provisioner(const char *name, uint8_t uuid[16],
+				uint16_t unicast_low, uint16_t unicast_high,
+					uint16_t group_low, uint16_t group_high)
+{
+	json_object *jprovs, *jprov, *jscenes;
+
 	if (!cfg || !cfg->jcfg)
 		return false;
 
-	if (!write_uint16_hex(cfg->jcfg, "low", low))
+	if (!json_object_object_get_ex(cfg->jcfg, "provisioners", &jprovs))
 		return false;
 
-	if (!write_uint16_hex(cfg->jcfg, "high", high))
+	if (!jprovs || json_object_get_type(jprovs) != json_type_array)
 		return false;
 
+	jprov = json_object_new_object();
+
+	if (!add_string(jprov, "provisionerName", name))
+		goto fail;
+
+	if (!add_u8_16(jprov, "UUID", uuid))
+		goto fail;
+
+	if (!add_range(jprov, "allocatedUnicastRange", unicast_low,
+								unicast_high))
+		goto fail;
+
+	if (!add_range(jprov, "allocatedGroupRange", group_low, group_high))
+		goto fail;
+
+	/* Scenes are not supported. Just add an empty array */
+	jscenes = json_object_new_array();
+	if (!jscenes)
+		goto fail;
+
+	json_object_object_add(jprov, "allocatedSceneRange", jscenes);
+
+	json_object_array_add(jprovs, jprov);
+
 	return save_config();
+
+fail:
+	json_object_put(jprov);
+	return false;
 }
 
 uint32_t mesh_db_get_iv_index(void)
@@ -1408,10 +1490,10 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],
 
 	l_uuid_v4(uuid);
 
-	if (!add_u8_16(jcfg, "uuid", uuid))
+	if (!add_u8_16(jcfg, "meshUUID", uuid))
 		goto fail;
 
-	if (mesh_name && !add_string(jcfg, "name", mesh_name))
+	if (mesh_name && !add_string(jcfg, "meshName", mesh_name))
 		goto fail;
 
 	jarray = json_object_new_array();
@@ -1420,6 +1502,12 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],
 
 	json_object_object_add(jcfg, "nodes", jarray);
 
+	jarray = json_object_new_array();
+	if (!jarray)
+		goto fail;
+
+	json_object_object_add(jcfg, "provisioners", jarray);
+
 	jarray = json_object_new_array();
 	if (!jarray)
 		goto fail;
diff --git a/tools/mesh/mesh-db.h b/tools/mesh/mesh-db.h
index 22518c618..efd579553 100644
--- a/tools/mesh/mesh-db.h
+++ b/tools/mesh/mesh-db.h
@@ -24,7 +24,6 @@ bool mesh_db_net_key_del(uint16_t idx);
 bool mesh_db_net_key_phase_set(uint16_t net_idx, uint8_t phase);
 bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx);
 bool mesh_db_app_key_del(uint16_t app_idx);
-bool mesh_db_set_addr_range(uint16_t low, uint16_t high);
 bool mesh_db_get_addr_range(uint16_t *low, uint16_t *high);
 
 bool mesh_db_add_node(uint8_t uuid[16], uint8_t num_els, uint16_t unicast,
-- 
2.31.1


  reply	other threads:[~2021-09-23  3:27 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-23  3:25 [PATCH BlueZ 00/20] Mesh Configuration Database Inga Stotland
2021-09-23  3:25 ` Inga Stotland [this message]
2021-09-23  4:00   ` bluez.test.bot
2021-09-23  4:14     ` Tedd Ho-Jeong An
2021-09-23 16:52   ` bluez.test.bot
2021-09-23  3:25 ` [PATCH BlueZ 02/20] tools/mesh-cfgclient: Add timestamp to config database Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 03/20] tools/mesh-cfgclient: Update stored NetKey and AppKey Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 04/20] tools/mesh-cfgclient: Keep track of updated keys Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 05/20] tools/mesh: Add new info to stored remote nodes Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 06/20] tools/mesh-cfgclient: Overwrite config values when adding new ones Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 07/20] tools/mesh-cfgclient: Store remote node's model bindings Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 08/20] tools/mesh-cfgclient: Store remote node's model subs Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 09/20] tools/mesh-cfgclient: Disallow model commands w/o composition Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 10/20] tools/mesh-cfgclient: Store remote's model publication info Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 11/20] tools/mesh-cfgclient: Check the result of config save Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 12/20] tools/mesh-cfgclient: Rename mesh-db APIs for consistency Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 13/20] tools/mesh-cfgclient: Save remote node feature setting Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 14/20] tools/mesh-cfgclient: Store remote's heartbeat sub/pub Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 15/20] tools/mesh-cfgclient: Add group parent address for DB compliance Inga Stotland
2021-09-23  3:25 ` [PATCH BlueZ 16/20] doc/mesh-api: Add ExportKeys call Inga Stotland
2021-09-23  3:26 ` [PATCH BlueZ 17/20] mesh: Implement ExportKeys() method Inga Stotland
2021-09-23  3:26 ` [PATCH BlueZ 18/20] tools/mesh-cfgclient: Store UUIDs in standard format Inga Stotland
2021-09-23  3:26 ` [PATCH BlueZ 19/20] tools/mesh-cfgclient: Excluded addresses property Inga Stotland
2021-09-23  3:26 ` [PATCH BlueZ 20/20] tools/mesh-cfgclient: Export configuration database Inga Stotland
2021-09-27 20:27 ` [PATCH BlueZ 00/20] Mesh Configuration Database 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=20210923032603.50536-2-inga.stotland@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.