tools/mesh-cfgclient: Save subnet key refresh phase 78/229678/1
authorInga Stotland <inga.stotland@intel.com>
Sun, 29 Mar 2020 20:56:14 +0000 (13:56 -0700)
committerAnupam Roy <anupam.r@samsung.com>
Wed, 1 Apr 2020 21:03:54 +0000 (02:33 +0530)
This records Key Refresh phase of a subnet either as a consequence
of successful execution of subnet-update or subnet-set-phase commands.

Change-Id: I71ad1078a915986dd788f695cdd8e25db3e29d92
Signed-off-by: Anupam Roy <anupam.r@samsung.com>
tools/mesh-cfgclient.c
tools/mesh/keys.c
tools/mesh/keys.h
tools/mesh/mesh-db.c
tools/mesh/mesh-db.h

index 0b1176e..b8dbd6a 100644 (file)
@@ -959,14 +959,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)
@@ -1025,6 +1036,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;
        }
 
@@ -1034,6 +1046,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);
index 77b32da..e7b065b 100644 (file)
@@ -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;
index 71c3bb3..e05e579 100644 (file)
@@ -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);
index 6d744a7..3b2fbc7 100644 (file)
@@ -116,6 +116,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;
@@ -418,8 +432,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)
@@ -450,8 +463,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)
@@ -490,8 +502,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)
@@ -552,6 +563,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);
 
@@ -564,6 +576,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);
@@ -625,15 +642,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;
@@ -647,6 +662,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)
@@ -655,8 +694,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)
index 80dc4ed..1f9e4e3 100644 (file)
@@ -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);