@@ -1499,7 +1499,9 @@ int lwm2m_engine_add_path_to_list(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm
1499
1499
new_entry -> path = * path ;
1500
1500
if (!sys_slist_is_empty (lwm2m_path_list )) {
1501
1501
1502
- /* Keep list Ordered by Object ID/ Object instance/ resource ID */
1502
+ /* Keep list Ordered by Object ID / Object instance / resource ID /
1503
+ * Resource Instance ID
1504
+ */
1503
1505
SYS_SLIST_FOR_EACH_CONTAINER (lwm2m_path_list , entry , node ) {
1504
1506
if (entry -> path .level == LWM2M_PATH_LEVEL_NONE ||
1505
1507
lwm2m_obj_path_equal (& entry -> path , & new_entry -> path )) {
@@ -1508,39 +1510,63 @@ int lwm2m_engine_add_path_to_list(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm
1508
1510
return 0 ;
1509
1511
}
1510
1512
1511
- if (entry -> path .obj_id > path -> obj_id ) {
1512
- /* New entry have smaller Object ID */
1513
- add_before_current = true;
1514
- } else if (entry -> path .obj_id == path -> obj_id &&
1515
- entry -> path .level > path -> level ) {
1516
- add_before_current = true;
1517
- } else if (entry -> path .obj_id == path -> obj_id &&
1518
- entry -> path .level == path -> level ) {
1519
- if (path -> level >= LWM2M_PATH_LEVEL_OBJECT_INST &&
1520
- entry -> path .obj_inst_id > path -> obj_inst_id ) {
1521
- /*
1522
- * New have same Object ID
1523
- * but smaller Object Instance ID
1524
- */
1525
- add_before_current = true;
1526
- } else if (path -> level >= LWM2M_PATH_LEVEL_RESOURCE &&
1527
- entry -> path .obj_inst_id == path -> obj_inst_id &&
1528
- entry -> path .res_id > path -> res_id ) {
1529
- /*
1530
- * Object ID and Object Instance id same
1531
- * but Resource ID is smaller
1532
- */
1533
- add_before_current = true;
1534
- } else if (path -> level >= LWM2M_PATH_LEVEL_RESOURCE_INST &&
1535
- entry -> path .obj_inst_id == path -> obj_inst_id &&
1536
- entry -> path .res_id == path -> res_id &&
1537
- entry -> path .res_inst_id > path -> res_inst_id ) {
1538
- /*
1539
- * Object ID, Object Instance id & Resource ID same
1540
- * but Resource instance ID is smaller
1541
- */
1542
- add_before_current = true;
1543
- }
1513
+ /*
1514
+ * algorithm assumes that list is already properly sorted and that
1515
+ * there are no duplicates. general idea:
1516
+ * - if at any level up to new entry's path level, IDs below the level
1517
+ * match and the ID of the new entry at that level is smaller,
1518
+ * insert before.
1519
+ * - if all IDs of the new entry match the existing entry, insert before.
1520
+ * Because of sorting and no duplicates, the existing entry must have
1521
+ * higher path level and come after the new entry.
1522
+ */
1523
+ switch (new_entry -> path .level ) {
1524
+ case LWM2M_PATH_LEVEL_OBJECT :
1525
+ add_before_current = new_entry -> path .obj_id <= entry -> path .obj_id ;
1526
+ break ;
1527
+
1528
+ case LWM2M_PATH_LEVEL_OBJECT_INST :
1529
+ add_before_current =
1530
+ (new_entry -> path .obj_id < entry -> path .obj_id ) ||
1531
+
1532
+ (entry -> path .level >= LWM2M_PATH_LEVEL_OBJECT_INST &&
1533
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1534
+ new_entry -> path .obj_inst_id <= entry -> path .obj_inst_id );
1535
+ break ;
1536
+
1537
+ case LWM2M_PATH_LEVEL_RESOURCE :
1538
+ add_before_current =
1539
+ (new_entry -> path .obj_id < entry -> path .obj_id ) ||
1540
+
1541
+ (entry -> path .level >= LWM2M_PATH_LEVEL_OBJECT_INST &&
1542
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1543
+ new_entry -> path .obj_inst_id < entry -> path .obj_inst_id ) ||
1544
+
1545
+ (entry -> path .level >= LWM2M_PATH_LEVEL_RESOURCE &&
1546
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1547
+ entry -> path .obj_inst_id == new_entry -> path .obj_inst_id &&
1548
+ new_entry -> path .res_id <= entry -> path .res_id );
1549
+ break ;
1550
+
1551
+ case LWM2M_PATH_LEVEL_RESOURCE_INST :
1552
+ add_before_current =
1553
+ (new_entry -> path .obj_id < entry -> path .obj_id ) ||
1554
+
1555
+ (entry -> path .level >= LWM2M_PATH_LEVEL_OBJECT_INST &&
1556
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1557
+ new_entry -> path .obj_inst_id < entry -> path .obj_inst_id ) ||
1558
+
1559
+ (entry -> path .level >= LWM2M_PATH_LEVEL_RESOURCE &&
1560
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1561
+ entry -> path .obj_inst_id == new_entry -> path .obj_inst_id &&
1562
+ new_entry -> path .res_id < entry -> path .res_id ) ||
1563
+
1564
+ (entry -> path .level >= LWM2M_PATH_LEVEL_RESOURCE_INST &&
1565
+ entry -> path .obj_id == new_entry -> path .obj_id &&
1566
+ entry -> path .obj_inst_id == new_entry -> path .obj_inst_id &&
1567
+ entry -> path .res_id == new_entry -> path .res_id &&
1568
+ new_entry -> path .res_inst_id <= entry -> path .res_inst_id );
1569
+ break ;
1544
1570
}
1545
1571
1546
1572
if (add_before_current ) {
0 commit comments