Message ID | 20210104034837.640081-1-mike@mnmoran.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [BlueZ,v2] mesh: Update AppKeys on transition to Phase 0 | expand |
This is automated email and please do not reply to this email! Dear submitter, Thank you for submitting the patches to the linux bluetooth mailing list. This is a CI test results with your patch series: PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=408415 ---Test result--- ############################## Test: CheckPatch - PASS ############################## Test: CheckGitLint - PASS ############################## Test: CheckBuild - PASS ############################## Test: MakeCheck - PASS --- Regards, Linux Bluetooth
Applied, Thanks On Sun, 2021-01-03 at 22:48 -0500, Michael N. Moran wrote: > At the end of the mesh Key Refresh procedure when a subnet > transitions to Phase 0, local AppKeys that were updated were > not updating until the bluetooth-meshd daemon was restarted. > > This patch iterates the AppKeys at the end of mesh Key Refresh > when the subnet transitions to Phase 0, setting the new state > of each updated AppKey. > > ********* v2 ************ > > This version incorporates recommendations from Brian Gix > creating a public function appkey_finalize(); and adding > new APP_AID_INVALID constant to replace the use of 0xFF > as an indication that the new_key_aid field is invalid. > > > --- > mesh/appkey.c | 33 +++++++++++++++++++++++++++++++-- > mesh/appkey.h | 1 + > mesh/mesh-defs.h | 1 + > mesh/net.c | 2 ++ > 4 files changed, 35 insertions(+), 2 deletions(-) > > diff --git a/mesh/appkey.c b/mesh/appkey.c > index 549f5a80d..5088a1812 100644 > --- a/mesh/appkey.c > +++ b/mesh/appkey.c > @@ -50,11 +50,40 @@ static bool match_bound_key(const void *a, const void *b) > 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; > } > > @@ -146,7 +175,7 @@ const uint8_t *appkey_get_key(struct mesh_net *net, uint16_t app_idx, > 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; > diff --git a/mesh/appkey.h b/mesh/appkey.h > index 3bb70445b..6688d87fb 100644 > --- a/mesh/appkey.h > +++ b/mesh/appkey.h > @@ -16,6 +16,7 @@ struct mesh_app_key; > 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, > diff --git a/mesh/mesh-defs.h b/mesh/mesh-defs.h > index 43bdf5aab..25ce0126c 100644 > --- a/mesh/mesh-defs.h > +++ b/mesh/mesh-defs.h > @@ -100,6 +100,7 @@ > > #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 > diff --git a/mesh/net.c b/mesh/net.c > index b24cdba77..9624cd058 100644 > --- a/mesh/net.c > +++ b/mesh/net.c > @@ -2600,6 +2600,8 @@ static int key_refresh_finish(struct mesh_net *net, uint16_t idx) > > 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;
diff --git a/mesh/appkey.c b/mesh/appkey.c index 549f5a80d..5088a1812 100644 --- a/mesh/appkey.c +++ b/mesh/appkey.c @@ -50,11 +50,40 @@ static bool match_bound_key(const void *a, const void *b) 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; } @@ -146,7 +175,7 @@ const uint8_t *appkey_get_key(struct mesh_net *net, uint16_t app_idx, 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; diff --git a/mesh/appkey.h b/mesh/appkey.h index 3bb70445b..6688d87fb 100644 --- a/mesh/appkey.h +++ b/mesh/appkey.h @@ -16,6 +16,7 @@ struct mesh_app_key; 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, diff --git a/mesh/mesh-defs.h b/mesh/mesh-defs.h index 43bdf5aab..25ce0126c 100644 --- a/mesh/mesh-defs.h +++ b/mesh/mesh-defs.h @@ -100,6 +100,7 @@ #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 diff --git a/mesh/net.c b/mesh/net.c index b24cdba77..9624cd058 100644 --- a/mesh/net.c +++ b/mesh/net.c @@ -2600,6 +2600,8 @@ static int key_refresh_finish(struct mesh_net *net, uint16_t idx) 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;