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