tools/mesh-cfgclient: Prevent storing duplicate models
authorInga Stotland <inga.stotland@gmail.com>
Thu, 16 Mar 2023 21:33:11 +0000 (14:33 -0700)
committerAyush Garg <ayush.garg@samsung.com>
Fri, 5 Jan 2024 10:41:34 +0000 (16:11 +0530)
This fixes the situation when subsequent requests to get a node
composition result in appending element's model list with duplicate models.
This adds a check for a presence of a model on an element when attempting
to add a new model ID to a model list on this element.

tools/mesh/mesh-db.c
tools/mesh/remote.c

index 10fbd40..76ef880 100644 (file)
@@ -1966,28 +1966,35 @@ bool mesh_db_node_set_composition(uint16_t unicast, uint8_t *data, uint16_t len)
 
                while (len >= 2 && m--) {
                        mod_id = l_get_le16(data);
+                       data += 2;
+                       len -= 2;
+
+                       jobj = get_model(unicast, unicast + i, mod_id, false);
+                       if (jobj)
+                               continue;
 
                        jobj = init_model(mod_id);
                        if (!jobj)
                                goto fail;
 
                        json_object_array_add(jmods, jobj);
-                       data += 2;
-                       len -= 2;
                }
 
                while (len >= 4 && v--) {
                        mod_id = l_get_le16(data + 2);
                        mod_id = l_get_le16(data) << 16 | mod_id;
+                       data += 4;
+                       len -= 4;
+
+                       jobj = get_model(unicast, unicast + i, mod_id, true);
+                       if (jobj)
+                               continue;
 
                        jobj = init_vendor_model(mod_id);
                        if (!jobj)
                                goto fail;
 
                        json_object_array_add(jmods, jobj);
-
-                       data += 4;
-                       len -= 4;
                }
 
                i++;
index cee711d..b917ae9 100644 (file)
@@ -54,6 +54,11 @@ struct rejected_addr {
 static struct l_queue *nodes;
 static struct l_queue *reject_list;
 
+static bool match_mod_id(const void *a, const void *b)
+{
+       return a == b;
+}
+
 static int compare_mod_id(const void *a, const void *b, void *user_data)
 {
        uint32_t id1 = L_PTR_TO_UINT(a);
@@ -227,6 +232,10 @@ bool remote_set_model(uint16_t unicast, uint8_t ele_idx, uint32_t mod_id,
        if (!vendor)
                mod_id = VENDOR_ID_MASK | mod_id;
 
+       if (l_queue_find(rmt->els[ele_idx], match_mod_id,
+                                                       L_UINT_TO_PTR(mod_id)))
+               return true;
+
        l_queue_insert(rmt->els[ele_idx], L_UINT_TO_PTR(mod_id),
                                                        compare_mod_id, NULL);