]> git.puffer.fish Git - mirror/frr.git/commitdiff
zebra: determine src when using nexthop objects
authorStephen Worley <sworley@cumulusnetworks.com>
Tue, 24 Mar 2020 21:32:21 +0000 (17:32 -0400)
committerStephen Worley <sworley@cumulusnetworks.com>
Thu, 26 Mar 2020 14:37:51 +0000 (10:37 -0400)
Determine src based on nexthop data even when we are using
kernel nexthop objects.

Before, we were entirely skipping this step and just sending the
nexthop ID, ignoring src determination.

Signed-off-by: Stephen Worley <sworley@cumulusnetworks.com>
zebra/rt_netlink.c

index c1aa5c9d3a12d9892557dee3911d1ae7e2ccf5c1..c8271b2dfd8c091565f09dd31c4a806244c5fa3f 100644 (file)
@@ -1665,13 +1665,30 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx)
        }
 
        if (kernel_nexthops_supported()) {
+               /* Kernel supports nexthop objects */
                if (IS_ZEBRA_DEBUG_KERNEL)
                        zlog_debug(
                                "netlink_route_multipath(): %pFX nhg_id is %u",
                                p, dplane_ctx_get_nhe_id(ctx));
-               /* Kernel supports nexthop objects */
                addattr32(&req.n, sizeof(req), RTA_NH_ID,
                          dplane_ctx_get_nhe_id(ctx));
+
+               /* Have to determine src still */
+               for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), nexthop)) {
+                       if (setsrc)
+                               break;
+
+                       setsrc = nexthop_set_src(nexthop, family, &src);
+               }
+
+               if (setsrc) {
+                       if (family == AF_INET)
+                               addattr_l(&req.n, sizeof(req), RTA_PREFSRC,
+                                         &src.ipv4, bytelen);
+                       else if (family == AF_INET6)
+                               addattr_l(&req.n, sizeof(req), RTA_PREFSRC,
+                                         &src.ipv6, bytelen);
+               }
                goto skip;
        }