]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: zapi nexthop sort fixes 6962/head
authorMark Stapp <mjs@voltanet.io>
Thu, 20 Aug 2020 18:50:38 +0000 (14:50 -0400)
committerMark Stapp <mjs@voltanet.io>
Thu, 20 Aug 2020 18:50:38 +0000 (14:50 -0400)
The sorting for zapi nexthops in zapi routes needs to match
the sorting of nexthops done in zebra. Ensure all zapi_nexthop
attributes are included in the sort.

Signed-off-by: Mark Stapp <mjs@voltanet.io>
lib/zclient.c
lib/zclient.h

index 808aa18bbeb8f08ed3938e06db91303487123380..6b5f3e349a31a0b881d7939599c6f2596c88024a 100644 (file)
@@ -871,6 +871,37 @@ static int zapi_nexthop_cmp_no_labels(const struct zapi_nexthop *next1,
                break;
        }
 
+       if (next1->srte_color < next2->srte_color)
+               return -1;
+       if (next1->srte_color > next2->srte_color)
+               return 1;
+
+       if (CHECK_FLAG(next1->flags, NEXTHOP_FLAG_HAS_BACKUP) ||
+           CHECK_FLAG(next2->flags, NEXTHOP_FLAG_HAS_BACKUP)) {
+
+               if (!CHECK_FLAG(next1->flags, NEXTHOP_FLAG_HAS_BACKUP) &&
+                   CHECK_FLAG(next2->flags, NEXTHOP_FLAG_HAS_BACKUP))
+                       return -1;
+
+               if (CHECK_FLAG(next1->flags, NEXTHOP_FLAG_HAS_BACKUP) &&
+                   !CHECK_FLAG(next2->flags, NEXTHOP_FLAG_HAS_BACKUP))
+                       return 1;
+
+               if (next1->backup_num > 0 || next2->backup_num > 0) {
+
+                       if (next1->backup_num < next2->backup_num)
+                               return -1;
+
+                       if (next1->backup_num > next2->backup_num)
+                               return 1;
+
+                       ret = memcmp(next1->backup_idx,
+                                    next2->backup_idx, next1->backup_num);
+                       if (ret != 0)
+                               return ret;
+               }
+       }
+
        return 0;
 }
 
index dab384d5ec247bb4044e7a420228328f983ffd55..c6a67790a11e505c735c80ff9d78c564be6cf439 100644 (file)
@@ -391,6 +391,11 @@ struct zmsghdr {
 } __attribute__((packed));
 #define ZAPI_HEADER_CMD_LOCATION offsetof(struct zmsghdr, command)
 
+/*
+ * ZAPI nexthop. Note that these are sorted when associated with ZAPI routes,
+ * and that sorting must be aligned with the sorting of nexthops in
+ * lib/nexthop.c. Any new fields must be accounted for in zapi_nexthop_cmp().
+ */
 struct zapi_nexthop {
        enum nexthop_types_t type;
        vrf_id_t vrf_id;