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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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);




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux