diff mbox series

[BlueZ,1/2] tools/mesh-cfgclient: Save subnet key refresh phase

Message ID 20200329205615.22090-1-inga.stotland@intel.com (mailing list archive)
State Accepted
Delegated to: Brian Gix
Headers show
Series [BlueZ,1/2] tools/mesh-cfgclient: Save subnet key refresh phase | expand

Commit Message

Stotland, Inga March 29, 2020, 8:56 p.m. UTC
This records Key Refresh phase of a subnet either as a consequence
of successful execution of subnet-update or subnet-set-phase commands.
---
 tools/mesh-cfgclient.c | 16 ++++++++++-
 tools/mesh/keys.c      | 24 ++++++++++++++--
 tools/mesh/keys.h      |  1 +
 tools/mesh/mesh-db.c   | 64 +++++++++++++++++++++++++++++++++---------
 tools/mesh/mesh-db.h   |  1 +
 5 files changed, 90 insertions(+), 16 deletions(-)

Comments

Brian Gix April 1, 2020, 7:12 p.m. UTC | #1
Patchset applied
On Sun, 2020-03-29 at 13:56 -0700, Inga Stotland wrote:
> This records Key Refresh phase of a subnet either as a consequence
> of successful execution of subnet-update or subnet-set-phase commands.
> ---
>  tools/mesh-cfgclient.c | 16 ++++++++++-
>  tools/mesh/keys.c      | 24 ++++++++++++++--
>  tools/mesh/keys.h      |  1 +
>  tools/mesh/mesh-db.c   | 64 +++++++++++++++++++++++++++++++++---------
>  tools/mesh/mesh-db.h   |  1 +
>  5 files changed, 90 insertions(+), 16 deletions(-)
> 
> diff --git a/tools/mesh-cfgclient.c b/tools/mesh-cfgclient.c
> index d1c673182..a1dbf3fa7 100644
> --- a/tools/mesh-cfgclient.c
> +++ b/tools/mesh-cfgclient.c
> @@ -950,14 +950,25 @@ fail:
>  static void subnet_set_phase_reply(struct l_dbus_proxy *proxy,
>  				struct l_dbus_message *msg, void *user_data)
>  {
> +	struct generic_request *req = user_data;
> +	uint16_t net_idx;
> +	uint8_t phase;
> +
>  	if (l_dbus_message_is_error(msg)) {
>  		const char *name;
>  
>  		l_dbus_message_get_error(msg, &name, NULL);
>  		l_error("Failed to set subnet phase: %s", name);
> +		return;
>  	}
>  
> -	/* TODO: Set key phase in configuration */
> +	net_idx = (uint16_t) req->arg1;
> +	phase = (uint8_t) req->arg2;
> +
> +	if (phase == KEY_REFRESH_PHASE_THREE)
> +		phase = KEY_REFRESH_PHASE_NONE;
> +
> +	keys_set_net_key_phase(net_idx, phase);
>  }
>  
>  static void subnet_set_phase_setup(struct l_dbus_message *msg, void *user_data)
> @@ -1016,6 +1027,7 @@ static void mgr_key_reply(struct l_dbus_proxy *proxy,
>  
>  		l_dbus_message_get_error(msg, &name, NULL);
>  		l_error("Method %s returned error: %s", method, name);
> +		bt_shell_printf("Method %s returned error: %s\n", method, name);
>  		return;
>  	}
>  
> @@ -1025,6 +1037,8 @@ static void mgr_key_reply(struct l_dbus_proxy *proxy,
>  	} else if (!strcmp("DeleteSubnet", method)) {
>  		keys_del_net_key(idx);
>  		mesh_db_net_key_del(idx);
> +	} else if (!strcmp("UpdateSubnet", method)) {
> +		keys_set_net_key_phase(idx, KEY_REFRESH_PHASE_ONE);
>  	} else if (!strcmp("DeleteAppKey", method)) {
>  		keys_del_app_key(idx);
>  		mesh_db_app_key_del(idx);
> diff --git a/tools/mesh/keys.c b/tools/mesh/keys.c
> index 77b32da63..e7b065beb 100644
> --- a/tools/mesh/keys.c
> +++ b/tools/mesh/keys.c
> @@ -31,8 +31,9 @@
>  #include "tools/mesh/keys.h"
>  
>  struct net_key {
> -	uint16_t idx;
>  	struct l_queue *app_keys;
> +	uint16_t idx;
> +	uint8_t phase;
>  };
>  
>  static struct l_queue *net_keys;
> @@ -78,6 +79,7 @@ void keys_add_net_key(uint16_t net_idx)
>  
>  	key = l_new(struct net_key, 1);
>  	key->idx = net_idx;
> +	key->phase = KEY_REFRESH_PHASE_NONE;
>  
>  	l_queue_push_tail(net_keys, key);
>  }
> @@ -97,6 +99,23 @@ void keys_del_net_key(uint16_t idx)
>  	l_free(key);
>  }
>  
> +void keys_set_net_key_phase(uint16_t net_idx, uint8_t phase)
> +{
> +	struct net_key *key;
> +
> +	if (!net_keys)
> +		return;
> +
> +	key = l_queue_find(net_keys, net_idx_match, L_UINT_TO_PTR(net_idx));
> +	if (!key)
> +		return;
> +
> +	key->phase = phase;
> +
> +	if (!mesh_db_net_key_phase_set(net_idx, phase))
> +		bt_shell_printf("Failed to save updated KR phase\n");
> +}
> +
>  void keys_add_app_key(uint16_t net_idx, uint16_t app_idx)
>  {
>  	struct net_key *key;
> @@ -166,7 +185,8 @@ static void print_netkey(void *net_key, void *user_data)
>  {
>  	struct net_key *key = net_key;
>  
> -	bt_shell_printf(COLOR_YELLOW "NetKey: 0x%3.3x\n" COLOR_OFF, key->idx);
> +	bt_shell_printf(COLOR_YELLOW "NetKey: 0x%3.3x, phase: %u\n" COLOR_OFF,
> +							key->idx, key->phase);
>  
>  	if (!key->app_keys || l_queue_isempty(key->app_keys))
>  		return;
> diff --git a/tools/mesh/keys.h b/tools/mesh/keys.h
> index 71c3bb390..e05e57997 100644
> --- a/tools/mesh/keys.h
> +++ b/tools/mesh/keys.h
> @@ -20,6 +20,7 @@
>  
>  void keys_add_net_key(uint16_t net_idx);
>  void keys_del_net_key(uint16_t net_idx);
> +void keys_set_net_key_phase(uint16_t net_idx, uint8_t phase);
>  void keys_add_app_key(uint16_t net_idx, uint16_t app_idx);
>  void keys_del_app_key(uint16_t app_idx);
>  uint16_t keys_get_bound_key(uint16_t app_idx);
> diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
> index e938ee733..05e96e554 100644
> --- a/tools/mesh/mesh-db.c
> +++ b/tools/mesh/mesh-db.c
> @@ -114,6 +114,20 @@ static json_object *get_key_object(json_object *jarray, uint16_t idx)
>  	return NULL;
>  }
>  
> +static bool get_int(json_object *jobj, const char *keyword, int *value)
> +{
> +	json_object *jvalue;
> +
> +	if (!json_object_object_get_ex(jobj, keyword, &jvalue))
> +		return false;
> +
> +	*value = json_object_get_int(jvalue);
> +	if (errno == EINVAL)
> +		return false;
> +
> +	return true;
> +}
> +
>  static bool write_int(json_object *jobj, const char *keyword, int val)
>  {
>  	json_object *jval;
> @@ -416,8 +430,7 @@ static bool add_node_key(json_object *jobj, const char *desc, uint16_t idx)
>  	json_object_object_add(jkey, "index", jval);
>  	json_object_array_add(jarray, jkey);
>  
> -	return mesh_config_save((struct mesh_config *) cfg, true,
> -								NULL, NULL);
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
>  }
>  
>  bool mesh_db_node_net_key_add(uint16_t unicast, uint16_t idx)
> @@ -448,8 +461,7 @@ bool mesh_db_node_ttl_set(uint16_t unicast, uint8_t ttl)
>  	if (!write_int(jnode, "defaultTTL", ttl))
>  		return false;
>  
> -	return mesh_config_save((struct mesh_config *) cfg, true,
> -								NULL, NULL);
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
>  }
>  
>  static void jarray_key_del(json_object *jarray, int16_t idx)
> @@ -488,8 +500,7 @@ static bool delete_key(json_object *jobj, const char *desc, uint16_t idx)
>  
>  	jarray_key_del(jarray, idx);
>  
> -	return mesh_config_save((struct mesh_config *) cfg, true,
> -								NULL, NULL);
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
>  }
>  
>  bool mesh_db_node_net_key_del(uint16_t unicast, uint16_t net_idx)
> @@ -550,6 +561,7 @@ static bool load_keys(json_object *jobj)
>  
>  	for (i = 0; i < key_cnt; ++i) {
>  		const char *str;
> +		int phase;
>  
>  		jentry = json_object_array_get_idx(jarray, i);
>  
> @@ -562,6 +574,11 @@ static bool load_keys(json_object *jobj)
>  			return false;
>  
>  		keys_add_net_key(net_idx);
> +
> +		if (!get_int(jentry, "phase", &phase))
> +			return false;
> +
> +		keys_set_net_key_phase(net_idx, (uint8_t) phase);
>  	}
>  
>  	json_object_object_get_ex(jobj, "appKeys", &jarray);
> @@ -623,15 +640,13 @@ bool mesh_db_net_key_add(uint16_t net_idx)
>  
>  	json_object_object_add(jkey, "index", jval);
>  
> -	jval = json_object_new_int(KEY_REFRESH_PHASE_NONE);
> -	if (!jval)
> +	if (!write_int(jkey, "phase", KEY_REFRESH_PHASE_NONE))
>  		goto fail;
>  
> -	json_object_object_add(jkey, "phase", jval);
>  	json_object_array_add(jarray, jkey);
>  
> -	return mesh_config_save((struct mesh_config *) cfg, true,
> -								NULL, NULL);
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
> +
>  fail:
>  	json_object_put(jkey);
>  	return false;
> @@ -645,6 +660,30 @@ bool mesh_db_net_key_del(uint16_t net_idx)
>  	return delete_key(cfg->jcfg, "netKeys", net_idx);
>  }
>  
> +bool mesh_db_net_key_phase_set(uint16_t net_idx, uint8_t phase)
> +{
> +	json_object *jval, *jarray, *jkey;
> +
> +	if (!cfg || !cfg->jcfg)
> +		return false;
> +
> +	json_object_object_get_ex(cfg->jcfg, "netKeys", &jarray);
> +	if (!jarray || json_object_get_type(jarray) != json_type_array)
> +		return false;
> +
> +	jkey = get_key_object(jarray, net_idx);
> +	if (!jkey)
> +		return false;
> +
> +	jval = json_object_new_int(phase);
> +	if (!jval)
> +		return false;
> +
> +	json_object_object_add(jkey, "phase", jval);
> +
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
> +}
> +
>  bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
>  {
>  	if (!cfg || !cfg->jcfg)
> @@ -653,8 +692,7 @@ bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
>  	if (!add_app_key(cfg->jcfg, net_idx, app_idx))
>  		return false;
>  
> -	return mesh_config_save((struct mesh_config *) cfg, true,
> -								NULL, NULL);
> +	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
>  }
>  
>  bool mesh_db_app_key_del(uint16_t app_idx)
> diff --git a/tools/mesh/mesh-db.h b/tools/mesh/mesh-db.h
> index 80dc4ed53..1f9e4e3d3 100644
> --- a/tools/mesh/mesh-db.h
> +++ b/tools/mesh/mesh-db.h
> @@ -29,6 +29,7 @@ bool mesh_db_get_token(uint8_t token[8]);
>  
>  bool mesh_db_net_key_add(uint16_t idx);
>  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);
diff mbox series

Patch

diff --git a/tools/mesh-cfgclient.c b/tools/mesh-cfgclient.c
index d1c673182..a1dbf3fa7 100644
--- a/tools/mesh-cfgclient.c
+++ b/tools/mesh-cfgclient.c
@@ -950,14 +950,25 @@  fail:
 static void subnet_set_phase_reply(struct l_dbus_proxy *proxy,
 				struct l_dbus_message *msg, void *user_data)
 {
+	struct generic_request *req = user_data;
+	uint16_t net_idx;
+	uint8_t phase;
+
 	if (l_dbus_message_is_error(msg)) {
 		const char *name;
 
 		l_dbus_message_get_error(msg, &name, NULL);
 		l_error("Failed to set subnet phase: %s", name);
+		return;
 	}
 
-	/* TODO: Set key phase in configuration */
+	net_idx = (uint16_t) req->arg1;
+	phase = (uint8_t) req->arg2;
+
+	if (phase == KEY_REFRESH_PHASE_THREE)
+		phase = KEY_REFRESH_PHASE_NONE;
+
+	keys_set_net_key_phase(net_idx, phase);
 }
 
 static void subnet_set_phase_setup(struct l_dbus_message *msg, void *user_data)
@@ -1016,6 +1027,7 @@  static void mgr_key_reply(struct l_dbus_proxy *proxy,
 
 		l_dbus_message_get_error(msg, &name, NULL);
 		l_error("Method %s returned error: %s", method, name);
+		bt_shell_printf("Method %s returned error: %s\n", method, name);
 		return;
 	}
 
@@ -1025,6 +1037,8 @@  static void mgr_key_reply(struct l_dbus_proxy *proxy,
 	} else if (!strcmp("DeleteSubnet", method)) {
 		keys_del_net_key(idx);
 		mesh_db_net_key_del(idx);
+	} else if (!strcmp("UpdateSubnet", method)) {
+		keys_set_net_key_phase(idx, KEY_REFRESH_PHASE_ONE);
 	} else if (!strcmp("DeleteAppKey", method)) {
 		keys_del_app_key(idx);
 		mesh_db_app_key_del(idx);
diff --git a/tools/mesh/keys.c b/tools/mesh/keys.c
index 77b32da63..e7b065beb 100644
--- a/tools/mesh/keys.c
+++ b/tools/mesh/keys.c
@@ -31,8 +31,9 @@ 
 #include "tools/mesh/keys.h"
 
 struct net_key {
-	uint16_t idx;
 	struct l_queue *app_keys;
+	uint16_t idx;
+	uint8_t phase;
 };
 
 static struct l_queue *net_keys;
@@ -78,6 +79,7 @@  void keys_add_net_key(uint16_t net_idx)
 
 	key = l_new(struct net_key, 1);
 	key->idx = net_idx;
+	key->phase = KEY_REFRESH_PHASE_NONE;
 
 	l_queue_push_tail(net_keys, key);
 }
@@ -97,6 +99,23 @@  void keys_del_net_key(uint16_t idx)
 	l_free(key);
 }
 
+void keys_set_net_key_phase(uint16_t net_idx, uint8_t phase)
+{
+	struct net_key *key;
+
+	if (!net_keys)
+		return;
+
+	key = l_queue_find(net_keys, net_idx_match, L_UINT_TO_PTR(net_idx));
+	if (!key)
+		return;
+
+	key->phase = phase;
+
+	if (!mesh_db_net_key_phase_set(net_idx, phase))
+		bt_shell_printf("Failed to save updated KR phase\n");
+}
+
 void keys_add_app_key(uint16_t net_idx, uint16_t app_idx)
 {
 	struct net_key *key;
@@ -166,7 +185,8 @@  static void print_netkey(void *net_key, void *user_data)
 {
 	struct net_key *key = net_key;
 
-	bt_shell_printf(COLOR_YELLOW "NetKey: 0x%3.3x\n" COLOR_OFF, key->idx);
+	bt_shell_printf(COLOR_YELLOW "NetKey: 0x%3.3x, phase: %u\n" COLOR_OFF,
+							key->idx, key->phase);
 
 	if (!key->app_keys || l_queue_isempty(key->app_keys))
 		return;
diff --git a/tools/mesh/keys.h b/tools/mesh/keys.h
index 71c3bb390..e05e57997 100644
--- a/tools/mesh/keys.h
+++ b/tools/mesh/keys.h
@@ -20,6 +20,7 @@ 
 
 void keys_add_net_key(uint16_t net_idx);
 void keys_del_net_key(uint16_t net_idx);
+void keys_set_net_key_phase(uint16_t net_idx, uint8_t phase);
 void keys_add_app_key(uint16_t net_idx, uint16_t app_idx);
 void keys_del_app_key(uint16_t app_idx);
 uint16_t keys_get_bound_key(uint16_t app_idx);
diff --git a/tools/mesh/mesh-db.c b/tools/mesh/mesh-db.c
index e938ee733..05e96e554 100644
--- a/tools/mesh/mesh-db.c
+++ b/tools/mesh/mesh-db.c
@@ -114,6 +114,20 @@  static json_object *get_key_object(json_object *jarray, uint16_t idx)
 	return NULL;
 }
 
+static bool get_int(json_object *jobj, const char *keyword, int *value)
+{
+	json_object *jvalue;
+
+	if (!json_object_object_get_ex(jobj, keyword, &jvalue))
+		return false;
+
+	*value = json_object_get_int(jvalue);
+	if (errno == EINVAL)
+		return false;
+
+	return true;
+}
+
 static bool write_int(json_object *jobj, const char *keyword, int val)
 {
 	json_object *jval;
@@ -416,8 +430,7 @@  static bool add_node_key(json_object *jobj, const char *desc, uint16_t idx)
 	json_object_object_add(jkey, "index", jval);
 	json_object_array_add(jarray, jkey);
 
-	return mesh_config_save((struct mesh_config *) cfg, true,
-								NULL, NULL);
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
 }
 
 bool mesh_db_node_net_key_add(uint16_t unicast, uint16_t idx)
@@ -448,8 +461,7 @@  bool mesh_db_node_ttl_set(uint16_t unicast, uint8_t ttl)
 	if (!write_int(jnode, "defaultTTL", ttl))
 		return false;
 
-	return mesh_config_save((struct mesh_config *) cfg, true,
-								NULL, NULL);
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
 }
 
 static void jarray_key_del(json_object *jarray, int16_t idx)
@@ -488,8 +500,7 @@  static bool delete_key(json_object *jobj, const char *desc, uint16_t idx)
 
 	jarray_key_del(jarray, idx);
 
-	return mesh_config_save((struct mesh_config *) cfg, true,
-								NULL, NULL);
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
 }
 
 bool mesh_db_node_net_key_del(uint16_t unicast, uint16_t net_idx)
@@ -550,6 +561,7 @@  static bool load_keys(json_object *jobj)
 
 	for (i = 0; i < key_cnt; ++i) {
 		const char *str;
+		int phase;
 
 		jentry = json_object_array_get_idx(jarray, i);
 
@@ -562,6 +574,11 @@  static bool load_keys(json_object *jobj)
 			return false;
 
 		keys_add_net_key(net_idx);
+
+		if (!get_int(jentry, "phase", &phase))
+			return false;
+
+		keys_set_net_key_phase(net_idx, (uint8_t) phase);
 	}
 
 	json_object_object_get_ex(jobj, "appKeys", &jarray);
@@ -623,15 +640,13 @@  bool mesh_db_net_key_add(uint16_t net_idx)
 
 	json_object_object_add(jkey, "index", jval);
 
-	jval = json_object_new_int(KEY_REFRESH_PHASE_NONE);
-	if (!jval)
+	if (!write_int(jkey, "phase", KEY_REFRESH_PHASE_NONE))
 		goto fail;
 
-	json_object_object_add(jkey, "phase", jval);
 	json_object_array_add(jarray, jkey);
 
-	return mesh_config_save((struct mesh_config *) cfg, true,
-								NULL, NULL);
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+
 fail:
 	json_object_put(jkey);
 	return false;
@@ -645,6 +660,30 @@  bool mesh_db_net_key_del(uint16_t net_idx)
 	return delete_key(cfg->jcfg, "netKeys", net_idx);
 }
 
+bool mesh_db_net_key_phase_set(uint16_t net_idx, uint8_t phase)
+{
+	json_object *jval, *jarray, *jkey;
+
+	if (!cfg || !cfg->jcfg)
+		return false;
+
+	json_object_object_get_ex(cfg->jcfg, "netKeys", &jarray);
+	if (!jarray || json_object_get_type(jarray) != json_type_array)
+		return false;
+
+	jkey = get_key_object(jarray, net_idx);
+	if (!jkey)
+		return false;
+
+	jval = json_object_new_int(phase);
+	if (!jval)
+		return false;
+
+	json_object_object_add(jkey, "phase", jval);
+
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
+}
+
 bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
 {
 	if (!cfg || !cfg->jcfg)
@@ -653,8 +692,7 @@  bool mesh_db_app_key_add(uint16_t net_idx, uint16_t app_idx)
 	if (!add_app_key(cfg->jcfg, net_idx, app_idx))
 		return false;
 
-	return mesh_config_save((struct mesh_config *) cfg, true,
-								NULL, NULL);
+	return mesh_config_save((struct mesh_config *) cfg, true, NULL, NULL);
 }
 
 bool mesh_db_app_key_del(uint16_t app_idx)
diff --git a/tools/mesh/mesh-db.h b/tools/mesh/mesh-db.h
index 80dc4ed53..1f9e4e3d3 100644
--- a/tools/mesh/mesh-db.h
+++ b/tools/mesh/mesh-db.h
@@ -29,6 +29,7 @@  bool mesh_db_get_token(uint8_t token[8]);
 
 bool mesh_db_net_key_add(uint16_t idx);
 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);