From 22a29185cae41939309622fc5c719d2827e78669 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Fri, 12 Jun 2015 07:59:09 -0700 Subject: [PATCH] The nexthop reveived for a prefix in a BGP update is cached in the nexthop cache in BGP and registered for resolution with the nexthop tracking (NHT) component. If the prefix were to be received from the same peer with a different nexthop, the prior nexthop needs to be processed for cleanup and unregistered and removed from the cache, if appropriate. That is handled with this patch. Signed-off-by: Vivek Venkataraman Reviewed-by: Dinesh G Dutt Reviewed-by: Donald Sharp --- bgpd/bgp_nht.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/bgpd/bgp_nht.c b/bgpd/bgp_nht.c index 397b379faf..ab4effcb1e 100644 --- a/bgpd/bgp_nht.c +++ b/bgpd/bgp_nht.c @@ -206,8 +206,14 @@ bgp_find_or_add_nexthop (struct bgp *bgp, afi_t afi, struct bgp_info *ri, if (!CHECK_FLAG(bnc->flags, BGP_NEXTHOP_REGISTERED)) register_zebra_rnh(bnc, is_bgp_static_route); - if (ri) + if (ri && ri->nexthop != bnc) { + /* Unlink from existing nexthop cache, if any. This will also free + * the nexthop cache entry, if appropriate. + */ + bgp_unlink_nexthop (ri); + + /* Link to new nexthop cache. */ path_nh_map(ri, bnc, 1); if (CHECK_FLAG(bnc->flags, BGP_NEXTHOP_VALID) && bnc->metric) -- 2.39.5