diff options
author | Russ White <russ@riw.us> | 2018-12-13 16:41:26 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-13 16:41:26 +0100 |
commit | f4aaa039075548760cd5e619c5d241dc3bbae22c (patch) | |
tree | 194b49e32aa86aee8b57b421081643be49605fab | |
parent | Merge pull request #3466 from donaldsharp/fib_only (diff) | |
parent | zebra: Allow zebra to only mark up to multipath_num nexthops as ACTIVE (diff) | |
download | frr-f4aaa039075548760cd5e619c5d241dc3bbae22c.tar.xz frr-f4aaa039075548760cd5e619c5d241dc3bbae22c.zip |
Merge pull request #3477 from donaldsharp/multipath_respect
zebra: Allow zebra to only mark up to multipath_num nexthops as ACTIVE
-rw-r--r-- | zebra/rt_netlink.c | 16 | ||||
-rw-r--r-- | zebra/zebra_rib.c | 13 |
2 files changed, 14 insertions, 15 deletions
diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index cb9ef8e36..8ce963b37 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -1584,7 +1584,7 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx) } /* Singlepath case. */ - if (nexthop_num == 1 || multipath_num == 1) { + if (nexthop_num == 1) { nexthop_num = 0; for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), nexthop)) { /* @@ -1676,9 +1676,6 @@ static int netlink_route_multipath(int cmd, struct zebra_dplane_ctx *ctx) nexthop_num = 0; for (ALL_NEXTHOPS_PTR(dplane_ctx_get_ng(ctx), nexthop)) { - if (nexthop_num >= multipath_num) - break; - if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_RECURSIVE)) { /* This only works for IPv4 now */ @@ -1876,12 +1873,6 @@ enum zebra_dplane_result kernel_route_update(struct zebra_dplane_ctx *ctx) if (CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE)) { SET_FLAG(nexthop->flags, NEXTHOP_FLAG_FIB); - - /* If we're only allowed a single nh, don't - * continue. - */ - if (multipath_num == 1) - break; } } } @@ -2698,7 +2689,7 @@ int netlink_mpls_multipath(int cmd, zebra_lsp_t *lsp) /* Fill nexthops (paths) based on single-path or multipath. The paths * chosen depend on the operation. */ - if (nexthop_num == 1 || multipath_num == 1) { + if (nexthop_num == 1) { routedesc = "single-path"; _netlink_mpls_debug(cmd, lsp->ile.in_label, routedesc); @@ -2745,9 +2736,6 @@ int netlink_mpls_multipath(int cmd, zebra_lsp_t *lsp) if (!nexthop) continue; - if (nexthop_num >= multipath_num) - break; - if ((cmd == RTM_NEWROUTE && (CHECK_FLAG(nhlfe->flags, NHLFE_FLAG_SELECTED) && CHECK_FLAG(nexthop->flags, diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c index c7ad2508f..d628b801a 100644 --- a/zebra/zebra_rib.c +++ b/zebra/zebra_rib.c @@ -971,7 +971,18 @@ static int nexthop_active_update(struct route_node *rn, struct route_entry *re, prev_src = nexthop->rmap_src; prev_active = CHECK_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE); prev_index = nexthop->ifindex; - if ((new_active = nexthop_active_check(rn, re, nexthop, set))) + /* + * We need to respect the multipath_num here + * as that what we should be able to install from + * a multipath perpsective should not be a data plane + * decision point. + */ + new_active = nexthop_active_check(rn, re, nexthop, set); + if (new_active && re->nexthop_active_num >= multipath_num) { + UNSET_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE); + new_active = 0; + } + if (new_active) re->nexthop_active_num++; /* Don't allow src setting on IPv6 addr for now */ if (prev_active != new_active || prev_index != nexthop->ifindex |