From d8bfd8dc9a899f841967257a6b5f30910fdc17c8 Mon Sep 17 00:00:00 2001 From: Stephen Worley Date: Tue, 24 Mar 2020 17:32:21 -0400 Subject: [PATCH] zebra: determine src when using nexthop objects 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 --- zebra/rt_netlink.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index c1aa5c9d3a..c8271b2dfd 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -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; } -- 2.39.5