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) -- 2.26.2