From 1eb6c3eae6a3040fdd1f4f88881ca0d0f4669324 Mon Sep 17 00:00:00 2001 From: Chirag Shah Date: Tue, 2 Apr 2019 18:47:46 -0700 Subject: [PATCH] *: do not register nexthop 0.0.0.0 to nht Avoid tracking 0.0.0.0/32 nexthop with RIB. When routes are aggregated, the originate of the route becomes self. Do not track nexthop self (0.0.0.0) with rib. Ticket: CM-24248 Testing Done: Before fix- tor-11# show ip nht vrf all VRF blue: 0.0.0.0 unresolved Client list: bgp(fd 16) VRF default: VRF green: VRF magenta: 0.0.0.0 unresolved Client list: bgp(fd 16) After fix- tor-11# show ip nht vrf all VRF blue: VRF default: VRF green: VRF magenta: Signed-off-by: Chirag Shah --- bgpd/bgp_nht.c | 4 +++- lib/prefix.h | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 2b4ad22b93..6e85abc8df 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -243,8 +243,10 @@ int bgp_find_or_add_nexthop(struct bgp *bgp_route, struct bgp *bgp_nexthop, if (bgp_route->inst_type == BGP_INSTANCE_TYPE_VIEW) { SET_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED); SET_FLAG(bnc->flags, BGP_NEXTHOP_VALID); - } else if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED)) + } else if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED) && + !is_default_host_route(&bnc->node->p)) register_zebra_rnh(bnc, is_bgp_static_route); + if (pi && pi->nexthop != bnc) { /* Unlink from existing nexthop cache, if any. This will also * free diff --git a/lib/prefix.h b/lib/prefix.h index ae931288c0..a1c2086b8d 100644 --- a/lib/prefix.h +++ b/lib/prefix.h @@ -511,6 +511,19 @@ static inline int is_host_route(struct prefix *p) return 0; } +static inline int is_default_host_route(struct prefix *p) +{ + if (p->family == AF_INET) { + return (p->u.prefix4.s_addr == INADDR_ANY && + p->prefixlen == IPV4_MAX_BITLEN); + } else if (p->family == AF_INET6) { + return ((!memcmp(&p->u.prefix6, &in6addr_any, + sizeof(struct in6_addr))) && + p->prefixlen == IPV6_MAX_BITLEN); + } + return 0; +} + #ifdef __cplusplus } #endif -- 2.39.5