@@ -1499,7 +1499,9 @@ int lwm2m_engine_add_path_to_list(sys_slist_t *lwm2m_path_list, sys_slist_t *lwm
14991499 new_entry -> path = * path ;
15001500 if (!sys_slist_is_empty (lwm2m_path_list )) {
15011501
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+ */
15031505 SYS_SLIST_FOR_EACH_CONTAINER (lwm2m_path_list , entry , node ) {
15041506 if (entry -> path .level == LWM2M_PATH_LEVEL_NONE ||
15051507 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
15081510 return 0 ;
15091511 }
15101512
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 ;
15441570 }
15451571
15461572 if (add_before_current ) {
0 commit comments