return key->net_idx == idx;
}
+static void finalize_key(void *a, void *b)
+{
+ struct mesh_app_key *key = a;
+ uint16_t net_idx = L_PTR_TO_UINT(b);
+
+ if (key->net_idx != net_idx)
+ return;
+
+ if (key->new_key_aid == APP_AID_INVALID)
+ return;
+
+ key->key_aid = key->new_key_aid;
+
+ key->new_key_aid = APP_AID_INVALID;
+
+ memcpy(key->key, key->new_key, 16);
+}
+
+void appkey_finalize(struct mesh_net *net, uint16_t net_idx)
+{
+ struct l_queue *app_keys;
+
+ app_keys = mesh_net_get_app_keys(net);
+ if (!app_keys)
+ return;
+
+ l_queue_foreach(app_keys, finalize_key, L_UINT_TO_PTR(net_idx));
+}
+
static struct mesh_app_key *app_key_new(void)
{
struct mesh_app_key *key = l_new(struct mesh_app_key, 1);
- key->new_key_aid = 0xFF;
+ key->new_key_aid = APP_AID_INVALID;
return key;
}
return app_key->key;
}
- if (app_key->new_key_aid == NET_NID_INVALID)
+ if (app_key->new_key_aid == APP_AID_INVALID)
return NULL;
*key_aid = app_key->new_key_aid;
bool appkey_key_init(struct mesh_net *net, uint16_t net_idx, uint16_t app_idx,
uint8_t *key_value, uint8_t *new_key_value);
void appkey_key_free(void *data);
+void appkey_finalize(struct mesh_net *net, uint16_t net_idx);
const uint8_t *appkey_get_key(struct mesh_net *net, uint16_t app_idx,
uint8_t *key_id);
int appkey_get_key_idx(struct mesh_app_key *app_key,
#define NET_IDX_MAX 0x0fff
#define APP_IDX_MAX 0x0fff
+#define APP_AID_INVALID 0xff
#define APP_IDX_MASK 0x0fff
#define APP_IDX_DEV_REMOTE 0x6fff
l_queue_foreach(net->friends, frnd_kr_phase3, net);
+ appkey_finalize(net, idx);
+
if (!mesh_config_net_key_set_phase(node_config_get(net->node), idx,
KEY_REFRESH_PHASE_NONE))
return MESH_STATUS_STORAGE_FAIL;