]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: adapt nexthop_cmp to handle multiple segs SIDs
authorDmytro Shytyi <dmytro.shytyi@6wind.com>
Thu, 27 Jul 2023 09:40:22 +0000 (11:40 +0200)
committerDmytro Shytyi <dmytro.shytyi@6wind.com>
Wed, 20 Sep 2023 13:07:15 +0000 (15:07 +0200)
Extend nexthop_cmp function to process multiple segs
SIDs.

Signed-off-by: Dmytro Shytyi <dmytro.shytyi@6wind.com>
lib/nexthop.c

index e19c1d6800357cc978a00481709160c32deb5e98..8df57e36a2011399cb73ebe8a6bc932d87dfe9a9 100644 (file)
@@ -56,6 +56,7 @@ static int _nexthop_srv6_cmp(const struct nexthop *nh1,
                             const struct nexthop *nh2)
 {
        int ret = 0;
+       int i = 0;
 
        if (!nh1->nh_srv6 && !nh2->nh_srv6)
                return 0;
@@ -78,9 +79,26 @@ static int _nexthop_srv6_cmp(const struct nexthop *nh1,
        if (ret != 0)
                return ret;
 
-       ret = memcmp(&nh1->nh_srv6->seg6_segs,
-                    &nh2->nh_srv6->seg6_segs,
-                    sizeof(struct in6_addr));
+       if (!nh1->nh_srv6->seg6_segs && !nh2->nh_srv6->seg6_segs)
+               return 0;
+
+       if (!nh1->nh_srv6->seg6_segs && nh2->nh_srv6->seg6_segs)
+               return -1;
+
+       if (nh1->nh_srv6->seg6_segs && !nh2->nh_srv6->seg6_segs)
+               return 1;
+
+       if (nh1->nh_srv6->seg6_segs->num_segs !=
+           nh2->nh_srv6->seg6_segs->num_segs)
+               return -1;
+
+       for (i = 0; i < nh1->nh_srv6->seg6_segs->num_segs; i++) {
+               ret = memcmp(&nh1->nh_srv6->seg6_segs->seg[i],
+                            &nh2->nh_srv6->seg6_segs->seg[i],
+                            sizeof(struct in6_addr));
+               if (ret != 0)
+                       break;
+       }
 
        return ret;
 }