linux-bluetooth.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH BlueZ] mesh: Store node state variables prior to response
       [not found] <20190321205518.7881-1-brian.gix@intel.com>
@ 2019-03-21 20:55 ` Brian Gix
  0 siblings, 0 replies; only message in thread
From: Brian Gix @ 2019-03-21 20:55 UTC (permalink / raw)
  To: linux-bluetooth; +Cc: inga.stotland, brian.gix

Remotely set node state variables need to be saved to the file system
or other NVM prior to returning success status.
---
 mesh/node.c    |  4 +--
 mesh/storage.c | 99 ++++++++++++++++++++++++++++++++++++++++++++--------------
 mesh/storage.h |  9 +++---
 3 files changed, 83 insertions(+), 29 deletions(-)

diff --git a/mesh/node.c b/mesh/node.c
index 761a67af4..af8eb6bb8 100644
--- a/mesh/node.c
+++ b/mesh/node.c
@@ -497,7 +497,7 @@ bool node_default_ttl_set(struct mesh_node *node, uint8_t ttl)
 	if (!node)
 		return false;
 
-	res = storage_set_ttl(node->jconfig, ttl);
+	res = storage_set_ttl(node, ttl);
 
 	if (res) {
 		node->ttl = ttl;
@@ -621,7 +621,7 @@ bool node_relay_mode_set(struct mesh_node *node, bool enable, uint8_t cnt,
 	if (!node || node->relay.mode == MESH_MODE_UNSUPPORTED)
 		return false;
 
-	res = storage_set_relay(node->jconfig, enable, cnt, interval);
+	res = storage_set_relay(node, enable, cnt, interval);
 
 	if (res) {
 		node->relay.mode = enable ? MESH_MODE_ENABLED :
diff --git a/mesh/storage.c b/mesh/storage.c
index e84c2c933..f04e3ec89 100644
--- a/mesh/storage.c
+++ b/mesh/storage.c
@@ -224,27 +224,51 @@ done:
 	return result;
 }
 
-bool storage_set_ttl(json_object *jnode, uint8_t ttl)
+bool storage_set_ttl(struct mesh_node *node, uint8_t ttl)
 {
-	return mesh_db_write_int(jnode, "defaultTTL", ttl);
+	json_object *jnode = node_jconfig_get(node);
+
+	if (!mesh_db_write_int(jnode, "defaultTTL", ttl))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
-bool storage_set_relay(json_object *jnode, bool enable,
+bool storage_set_relay(struct mesh_node *node, bool enable,
 				uint8_t count, uint8_t interval)
 {
-	return mesh_db_write_relay_mode(jnode, enable, count, interval);
+	json_object *jnode = node_jconfig_get(node);
+
+	if (!mesh_db_write_relay_mode(jnode, enable, count, interval))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
-bool storage_set_transmit_params(json_object *jnode, uint8_t count,
+bool storage_set_transmit_params(struct mesh_node *node, uint8_t count,
 							uint8_t interval)
 {
-	return mesh_db_write_net_transmit(jnode, count, interval);
+	json_object *jnode = node_jconfig_get(node);
+
+	if (!mesh_db_write_net_transmit(jnode, count, interval))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
-bool storage_set_mode(json_object *jnode, uint8_t mode,
+bool storage_set_mode(struct mesh_node *node, uint8_t mode,
 						const char *mode_name)
 {
-	return mesh_db_write_mode(jnode, mode_name, mode);
+	json_object *jnode = node_jconfig_get(node);
+
+	if (!mesh_db_write_mode(jnode, mode_name, mode))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
 bool storage_model_bind(struct mesh_node *node, uint16_t addr, uint32_t mod_id,
@@ -252,7 +276,7 @@ bool storage_model_bind(struct mesh_node *node, uint16_t addr, uint32_t mod_id,
 {
 	json_object *jnode;
 	int ele_idx;
-	bool is_vendor = (mod_id > 0xffff);
+	bool stored, is_vendor = (mod_id > 0xffff);
 
 	ele_idx = node_get_element_idx(node, addr);
 	if (ele_idx < 0)
@@ -261,11 +285,16 @@ bool storage_model_bind(struct mesh_node *node, uint16_t addr, uint32_t mod_id,
 	jnode = node_jconfig_get(node);
 
 	if (unbind)
-		return mesh_db_model_binding_del(jnode, ele_idx, is_vendor,
+		stored = mesh_db_model_binding_del(jnode, ele_idx, is_vendor,
 							mod_id, app_idx);
 	else
-		return mesh_db_model_binding_add(jnode, ele_idx, is_vendor,
+		stored = mesh_db_model_binding_add(jnode, ele_idx, is_vendor,
 							mod_id, app_idx);
+
+	if (stored)
+		storage_save_config(node, true, NULL, NULL);
+
+	return stored;
 }
 
 bool storage_app_key_add(struct mesh_net *net, uint16_t net_idx,
@@ -273,15 +302,21 @@ bool storage_app_key_add(struct mesh_net *net, uint16_t net_idx,
 {
 	json_object *jnode;
 	struct mesh_node *node = mesh_net_node_get(net);
+	bool stored;
 
 	jnode = node_jconfig_get(node);
 	if (!jnode)
 		return false;
 
 	if (update)
-		return mesh_db_app_key_update(jnode, app_idx, key);
+		stored = mesh_db_app_key_update(jnode, app_idx, key);
+	else
+		stored = mesh_db_app_key_add(jnode, net_idx, app_idx, key);
+
+	if (stored)
+		storage_save_config(node, true, NULL, NULL);
 
-	return mesh_db_app_key_add(jnode, net_idx, app_idx, key);
+	return stored;
 }
 
 bool storage_app_key_del(struct mesh_net *net, uint16_t net_idx,
@@ -294,8 +329,11 @@ bool storage_app_key_del(struct mesh_net *net, uint16_t net_idx,
 	if (!jnode)
 		return false;
 
-	return mesh_db_app_key_del(jnode, net_idx, app_idx);
+	if (!mesh_db_app_key_del(jnode, net_idx, app_idx))
+		return false;
 
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
 bool storage_net_key_add(struct mesh_net *net, uint16_t net_idx,
@@ -303,11 +341,17 @@ bool storage_net_key_add(struct mesh_net *net, uint16_t net_idx,
 {
 	struct mesh_node *node = mesh_net_node_get(net);
 	json_object *jnode = node_jconfig_get(node);
+	bool stored;
 
 	if (!update)
-		return mesh_db_net_key_add(jnode, net_idx, key);
+		stored = mesh_db_net_key_add(jnode, net_idx, key);
 	else
-		return mesh_db_net_key_update(jnode, net_idx, key);
+		stored = mesh_db_net_key_update(jnode, net_idx, key);
+
+	if (stored)
+		storage_save_config(node, true, NULL, NULL);
+
+	return stored;
 }
 
 bool storage_net_key_del(struct mesh_net *net, uint16_t net_idx)
@@ -315,7 +359,11 @@ bool storage_net_key_del(struct mesh_net *net, uint16_t net_idx)
 	struct mesh_node *node = mesh_net_node_get(net);
 	json_object *jnode = node_jconfig_get(node);
 
-	return mesh_db_net_key_del(jnode, net_idx);
+	if (!mesh_db_net_key_del(jnode, net_idx))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
 bool storage_set_iv_index(struct mesh_net *net, uint32_t iv_index,
@@ -324,7 +372,11 @@ bool storage_set_iv_index(struct mesh_net *net, uint32_t iv_index,
 	struct mesh_node *node = mesh_net_node_get(net);
 	json_object *jnode = node_jconfig_get(node);
 
-	return mesh_db_write_iv_index(jnode, iv_index, update);
+	if (!mesh_db_write_iv_index(jnode, iv_index, update))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
 bool storage_set_key_refresh_phase(struct mesh_net *net, uint16_t net_idx,
@@ -333,21 +385,22 @@ bool storage_set_key_refresh_phase(struct mesh_net *net, uint16_t net_idx,
 	struct mesh_node *node = mesh_net_node_get(net);
 	json_object *jnode = node_jconfig_get(node);
 
-	return mesh_db_net_key_set_phase(jnode, net_idx, phase);
+	if (!mesh_db_net_key_set_phase(jnode, net_idx, phase))
+		return false;
+
+	storage_save_config(node, true, NULL, NULL);
+	return true;
 }
 
 bool storage_write_sequence_number(struct mesh_net *net, uint32_t seq)
 {
 	struct mesh_node *node = mesh_net_node_get(net);
 	json_object *jnode = node_jconfig_get(node);
-	bool result;
 
-	result = mesh_db_write_int(jnode, "sequenceNumber", seq);
-	if (!result)
+	if (!mesh_db_write_int(jnode, "sequenceNumber", seq))
 		return false;
 
 	storage_save_config(node, false, NULL, NULL);
-
 	return true;
 }
 
diff --git a/mesh/storage.h b/mesh/storage.h
index 8b14c8e8e..d71d11b8e 100644
--- a/mesh/storage.h
+++ b/mesh/storage.h
@@ -28,12 +28,13 @@ void storage_save_config(struct mesh_node *node, bool no_wait,
 bool storage_model_bind(struct mesh_node *node, uint16_t addr, uint32_t id,
 						uint16_t app_idx, bool unbind);
 
-bool storage_set_ttl(json_object *jnode, uint8_t ttl);
-bool storage_set_relay(json_object *jnode, bool enable, uint8_t count,
+bool storage_set_ttl(struct mesh_node *node, uint8_t ttl);
+bool storage_set_relay(struct mesh_node *node, bool enable, uint8_t count,
 							uint8_t interval);
-bool storage_set_transmit_params(json_object *jnode, uint8_t count,
+bool storage_set_transmit_params(struct mesh_node *node, uint8_t count,
 							uint8_t interval);
-bool storage_set_mode(json_object *jnode, uint8_t mode, const char *mode_name);
+bool storage_set_mode(struct mesh_node *node, uint8_t mode,
+						const char *mode_name);
 bool storage_net_key_add(struct mesh_net *net, uint16_t net_idx,
 					const uint8_t key[16], bool update);
 bool storage_net_key_del(struct mesh_net *net, uint16_t net_idx);
-- 
2.14.5


^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2019-03-21 21:00 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20190321205518.7881-1-brian.gix@intel.com>
2019-03-21 20:55 ` [PATCH BlueZ] mesh: Store node state variables prior to response Brian Gix

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).