Message ID | 20200812190317.102140-1-inga.stotland@intel.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [BlueZ,1/2] mesh: Fix model ID prior to calling mesh config functions | expand |
Applied Patchset On Wed, 2020-08-12 at 12:03 -0700, Inga Stotland wrote: > Model IDs for SIG defined models need to be stripped off SIG_VENDOR > value used for internal housekeeping prior to calling functions > that save new model state in node configuration. > > Also, remove duplicate statements for model lookup in node config. > --- > mesh/mesh-config-json.c | 7 +------ > mesh/model.c | 12 ++++++++---- > 2 files changed, 9 insertions(+), 10 deletions(-) > > diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c > index a40f92c01..086d618b1 100644 > --- a/mesh/mesh-config-json.c > +++ b/mesh/mesh-config-json.c > @@ -169,11 +169,6 @@ static json_object *get_element_model(json_object *jnode, int ele_idx, > size_t len; > char buf[9]; > > - if (!vendor) > - snprintf(buf, 5, "%4.4x", (uint16_t)mod_id); > - else > - snprintf(buf, 9, "%8.8x", mod_id); > - > if (!json_object_object_get_ex(jnode, "elements", &jelements)) > return NULL; > > @@ -189,7 +184,7 @@ static json_object *get_element_model(json_object *jnode, int ele_idx, > return NULL; > > if (!vendor) { > - snprintf(buf, 5, "%4.4x", mod_id); > + snprintf(buf, 5, "%4.4x", (uint16_t)mod_id); > len = 4; > } else { > snprintf(buf, 9, "%8.8x", mod_id); > diff --git a/mesh/model.c b/mesh/model.c > index 23afb93a8..136edb194 100644 > --- a/mesh/model.c > +++ b/mesh/model.c > @@ -628,6 +628,7 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, > uint16_t app_idx, bool unbind) > { > struct mesh_model *mod; > + bool vendor; > int ele_idx = node_get_element_idx(node, addr); > > if (ele_idx < 0) > @@ -651,11 +652,15 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, > if (unbind ^ has_binding(mod->bindings, app_idx)) > return MESH_STATUS_SUCCESS; > > + vendor = IS_VENDOR(id); > + id = vendor ? id : MODEL_ID(id); > + > if (unbind) { > model_unbind_idx(node, ele_idx, mod, app_idx); > + > if (!mesh_config_model_binding_del(node_config_get(node), > - addr, IS_VENDOR(id), > - id, app_idx)) > + addr, vendor, id, > + app_idx)) > return MESH_STATUS_STORAGE_FAIL; > > l_debug("Unbind key %4.4x to model %8.8x", app_idx, mod->id); > @@ -666,13 +671,12 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, > return MESH_STATUS_INSUFF_RESOURCES; > > if (!mesh_config_model_binding_add(node_config_get(node), addr, > - IS_VENDOR(id), id, app_idx)) > + vendor, id, app_idx)) > return MESH_STATUS_STORAGE_FAIL; > > model_bind_idx(node, ele_idx, mod, app_idx); > > return MESH_STATUS_SUCCESS; > - > } > > static struct mesh_virtual *add_virtual(const uint8_t *v)
diff --git a/mesh/mesh-config-json.c b/mesh/mesh-config-json.c index a40f92c01..086d618b1 100644 --- a/mesh/mesh-config-json.c +++ b/mesh/mesh-config-json.c @@ -169,11 +169,6 @@ static json_object *get_element_model(json_object *jnode, int ele_idx, size_t len; char buf[9]; - if (!vendor) - snprintf(buf, 5, "%4.4x", (uint16_t)mod_id); - else - snprintf(buf, 9, "%8.8x", mod_id); - if (!json_object_object_get_ex(jnode, "elements", &jelements)) return NULL; @@ -189,7 +184,7 @@ static json_object *get_element_model(json_object *jnode, int ele_idx, return NULL; if (!vendor) { - snprintf(buf, 5, "%4.4x", mod_id); + snprintf(buf, 5, "%4.4x", (uint16_t)mod_id); len = 4; } else { snprintf(buf, 9, "%8.8x", mod_id); diff --git a/mesh/model.c b/mesh/model.c index 23afb93a8..136edb194 100644 --- a/mesh/model.c +++ b/mesh/model.c @@ -628,6 +628,7 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, uint16_t app_idx, bool unbind) { struct mesh_model *mod; + bool vendor; int ele_idx = node_get_element_idx(node, addr); if (ele_idx < 0) @@ -651,11 +652,15 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, if (unbind ^ has_binding(mod->bindings, app_idx)) return MESH_STATUS_SUCCESS; + vendor = IS_VENDOR(id); + id = vendor ? id : MODEL_ID(id); + if (unbind) { model_unbind_idx(node, ele_idx, mod, app_idx); + if (!mesh_config_model_binding_del(node_config_get(node), - addr, IS_VENDOR(id), - id, app_idx)) + addr, vendor, id, + app_idx)) return MESH_STATUS_STORAGE_FAIL; l_debug("Unbind key %4.4x to model %8.8x", app_idx, mod->id); @@ -666,13 +671,12 @@ static int update_binding(struct mesh_node *node, uint16_t addr, uint32_t id, return MESH_STATUS_INSUFF_RESOURCES; if (!mesh_config_model_binding_add(node_config_get(node), addr, - IS_VENDOR(id), id, app_idx)) + vendor, id, app_idx)) return MESH_STATUS_STORAGE_FAIL; model_bind_idx(node, ele_idx, mod, app_idx); return MESH_STATUS_SUCCESS; - } static struct mesh_virtual *add_virtual(const uint8_t *v)