]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/nexthop_group.c
Merge pull request #5452 from mjstapp/fix_notify_nhg
[mirror_frr.git] / lib / nexthop_group.c
index e1c1b1ca844a187c5633e1e937b0b7cceb629821..6d64c1ca1194442a3066092c70f925389dd96f67 100644 (file)
@@ -42,6 +42,7 @@ struct nexthop_hold {
        union sockunion *addr;
        char *intf;
        char *labels;
+       uint32_t weight;
 };
 
 struct nexthop_group_hooks {
@@ -571,8 +572,8 @@ DEFUN_NOSH(no_nexthop_group, no_nexthop_group_cmd, "no nexthop-group NHGNAME",
 static void nexthop_group_save_nhop(struct nexthop_group_cmd *nhgc,
                                    const char *nhvrf_name,
                                    const union sockunion *addr,
-                                   const char *intf,
-                                   const char *labels)
+                                   const char *intf, const char *labels,
+                                   const uint32_t weight)
 {
        struct nexthop_hold *nh;
 
@@ -587,23 +588,26 @@ static void nexthop_group_save_nhop(struct nexthop_group_cmd *nhgc,
        if (labels)
                nh->labels = XSTRDUP(MTYPE_TMP, labels);
 
+       nh->weight = weight;
+
        listnode_add_sort(nhgc->nhg_list, nh);
 }
 
 static void nexthop_group_unsave_nhop(struct nexthop_group_cmd *nhgc,
                                      const char *nhvrf_name,
                                      const union sockunion *addr,
-                                     const char *intf,
-                                     const char *labels)
+                                     const char *intf, const char *labels,
+                                     const uint32_t weight)
 {
        struct nexthop_hold *nh;
        struct listnode *node;
 
        for (ALL_LIST_ELEMENTS_RO(nhgc->nhg_list, node, nh)) {
-               if (nhgc_cmp_helper(nhvrf_name, nh->nhvrf_name) == 0 &&
-                   nhgc_addr_cmp_helper(addr, nh->addr) == 0 &&
-                   nhgc_cmp_helper(intf, nh->intf) == 0 &&
-                   nhgc_cmp_helper(labels, nh->labels) == 0)
+               if (nhgc_cmp_helper(nhvrf_name, nh->nhvrf_name) == 0
+                   && nhgc_addr_cmp_helper(addr, nh->addr) == 0
+                   && nhgc_cmp_helper(intf, nh->intf) == 0
+                   && nhgc_cmp_helper(labels, nh->labels) == 0
+                   && weight == nh->weight)
                        break;
        }
 
@@ -626,8 +630,8 @@ static void nexthop_group_unsave_nhop(struct nexthop_group_cmd *nhgc,
 static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
                                        const union sockunion *addr,
                                        const char *intf, const char *name,
-                                       const char *labels,
-                                       int *lbl_ret)
+                                       const char *labels, int *lbl_ret,
+                                       uint32_t weight)
 {
        int ret = 0;
        struct vrf *vrf;
@@ -684,6 +688,8 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
                                           num, larray);
        }
 
+       nhop->weight = weight;
+
        return true;
 }
 
@@ -693,11 +699,9 @@ static bool nexthop_group_parse_nexthop(struct nexthop *nhop,
 static bool nexthop_group_parse_nhh(struct nexthop *nhop,
                                    const struct nexthop_hold *nhh)
 {
-       return (nexthop_group_parse_nexthop(nhop, nhh->addr,
-                                           nhh->intf,
-                                           nhh->nhvrf_name,
-                                           nhh->labels,
-                                           NULL));
+       return (nexthop_group_parse_nexthop(nhop, nhh->addr, nhh->intf,
+                                           nhh->nhvrf_name, nhh->labels, NULL,
+                                           nhh->weight));
 }
 
 DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
@@ -709,6 +713,7 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
        [{ \
           nexthop-vrf NAME$vrf_name \
           |label WORD \
+           |weight (1-255) \
        }]",
       NO_STR
       "Specify one of the nexthops in this ECMP group\n"
@@ -719,7 +724,9 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
       "If the nexthop is in a different vrf tell us\n"
       "The nexthop-vrf Name\n"
       "Specify label(s) for this nexthop\n"
-      "One or more labels in the range (16-1048575) separated by '/'\n")
+      "One or more labels in the range (16-1048575) separated by '/'\n"
+      "Weight to be used by the nexthop for purposes of ECMP\n"
+      "Weight value to be used\n")
 {
        VTY_DECLVAR_CONTEXT(nexthop_group_cmd, nhgc);
        struct nexthop nhop;
@@ -727,8 +734,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
        int lbl_ret = 0;
        bool legal;
 
-       legal = nexthop_group_parse_nexthop(&nhop, addr, intf, vrf_name,
-                                           label, &lbl_ret);
+       legal = nexthop_group_parse_nexthop(&nhop, addr, intf, vrf_name, label,
+                                           &lbl_ret, weight);
 
        if (nhop.type == NEXTHOP_TYPE_IPV6
            && IN6_IS_ADDR_LINKLOCAL(&nhop.gate.ipv6)) {
@@ -761,7 +768,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
        nh = nexthop_exists(&nhgc->nhg, &nhop);
 
        if (no) {
-               nexthop_group_unsave_nhop(nhgc, vrf_name, addr, intf, label);
+               nexthop_group_unsave_nhop(nhgc, vrf_name, addr, intf, label,
+                                         weight);
                if (nh) {
                        _nexthop_del(&nhgc->nhg, nh);
 
@@ -779,7 +787,8 @@ DEFPY(ecmp_nexthops, ecmp_nexthops_cmd,
                        _nexthop_add(&nhgc->nhg.nexthop, nh);
                }
 
-               nexthop_group_save_nhop(nhgc, vrf_name, addr, intf, label);
+               nexthop_group_save_nhop(nhgc, vrf_name, addr, intf, label,
+                                       weight);
 
                if (legal && nhg_hooks.add_nexthop)
                        nhg_hooks.add_nexthop(nhgc, nh);
@@ -839,6 +848,9 @@ void nexthop_group_write_nexthop(struct vty *vty, struct nexthop *nh)
                vty_out(vty, " label %s", buf);
        }
 
+       if (nh->weight)
+               vty_out(vty, " weight %u", nh->weight);
+
        vty_out(vty, "\n");
 }
 
@@ -861,6 +873,9 @@ static void nexthop_group_write_nexthop_internal(struct vty *vty,
        if (nh->labels)
                vty_out(vty, " label %s", nh->labels);
 
+       if (nh->weight)
+               vty_out(vty, " weight %u", nh->weight);
+
        vty_out(vty, "\n");
 }