@@ -144,6 +144,7 @@ static const char *range_opt;
static const char *net_idx_opt;
static const char *config_opt;
+static uint32_t iv_index;
static uint16_t low_addr;
static uint16_t high_addr;
static uint16_t prov_net_idx;
@@ -664,6 +665,7 @@ static void attach_node_reply(struct l_dbus_proxy *proxy,
{
struct meshcfg_node *node = user_data;
struct l_dbus_message_iter iter_cfg;
+ uint32_t ivi;
if (l_dbus_message_is_error(msg)) {
const char *name;
@@ -693,6 +695,12 @@ static void attach_node_reply(struct l_dbus_proxy *proxy,
/* Inititalize config client model */
client_init();
+ if (l_dbus_proxy_get_property(local->proxy, "IvIndex", "u", &ivi) &&
+ ivi != iv_index) {
+ iv_index = ivi;
+ mesh_db_set_iv_index(ivi);
+ }
+
return;
fail:
@@ -1792,6 +1800,33 @@ static struct l_dbus_message *join_complete(struct l_dbus *dbus,
return l_dbus_message_new_method_return(message);
}
+static void property_changed(struct l_dbus_proxy *proxy, const char *name,
+ struct l_dbus_message *msg, void *user_data)
+{
+ const char *interface = l_dbus_proxy_get_interface(proxy);
+ const char *path = l_dbus_proxy_get_path(proxy);
+
+ if (strcmp(path, local->path))
+ return;
+
+ bt_shell_printf("Property changed: %s %s %s\n", name, path, interface);
+
+ if (!strcmp(interface, "org.bluez.mesh.Node1")) {
+
+ if (!strcmp(name, "IvIndex")) {
+ uint32_t ivi;
+
+ if (!l_dbus_message_get_arguments(msg, "u", &ivi))
+ return;
+
+ bt_shell_printf("New IV Index: %u\n", ivi);
+
+ iv_index = ivi;
+ mesh_db_set_iv_index(ivi);
+ }
+ }
+}
+
static void setup_app_iface(struct l_dbus_interface *iface)
{
l_dbus_interface_property(iface, "CompanyID", 0, "q", cid_getter,
@@ -1974,6 +2009,8 @@ static bool read_mesh_config(void)
high_addr = range_h;
}
+ iv_index = mesh_db_get_iv_index();
+
return true;
}
@@ -2040,7 +2077,7 @@ int main(int argc, char *argv[])
l_dbus_client_set_disconnect_handler(client, client_disconnected, NULL,
NULL);
l_dbus_client_set_proxy_handlers(client, proxy_added, proxy_removed,
- NULL, NULL, NULL);
+ property_changed, NULL, NULL);
l_dbus_client_set_ready_handler(client, client_ready, NULL, NULL);
node_proxies = l_queue_new();
@@ -1232,6 +1232,29 @@ bool mesh_db_set_addr_range(uint16_t low, uint16_t high)
return save_config();
}
+uint32_t mesh_db_get_iv_index(void)
+{
+ int ivi;
+
+ if (!cfg || !cfg->jcfg)
+ return 0;
+
+ if (!get_int(cfg->jcfg, "ivIndex", &ivi))
+ return 0;
+
+ return (uint32_t) ivi;
+}
+
+bool mesh_db_set_iv_index(uint32_t ivi)
+{
+ if (!cfg || !cfg->jcfg)
+ return false;
+
+ write_int(cfg->jcfg, "ivIndex", ivi);
+
+ return save_config();
+}
+
bool mesh_db_create(const char *fname, const uint8_t token[8],
const char *mesh_name)
{
@@ -1282,6 +1305,8 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],
json_object_object_add(jcfg, "appKeys", jarray);
+ write_int(jcfg, "ivIndex", 0);
+
if (!save_config())
goto fail;
@@ -26,7 +26,8 @@ bool mesh_db_create(const char *fname, const uint8_t token[8],
bool mesh_db_load(const char *fname);
bool mesh_db_get_token(uint8_t token[8]);
-
+bool mesh_db_set_iv_index(uint32_t ivi);
+uint32_t mesh_db_get_iv_index(void);
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);