From: Sarita Patra Date: Fri, 22 Feb 2019 14:37:06 +0000 (-0800) Subject: pimd: clear rp_info source_nexthop when RP becomes not reachable X-Git-Tag: 7.1_pulled~159^2~5 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=640b8d93abcddc6634ed778a9e669639a53b9b0b;p=mirror%2Ffrr.git pimd: clear rp_info source_nexthop when RP becomes not reachable When route to RP gets modified, FRR receives a notification from zebra, and call the function pim_update_rp_nh() to compute the new nexthop and will update the source_nexthop information of rp_info. This is not working for the case when RP becomes not reachable. Fix: When FRR receives a notification from zebra saying RP becomes not reachable, then delete the source_nexthop informatio of rp_info. Signed-off-by: Sarita Patra --- diff --git a/pimd/pim_nht.c b/pimd/pim_nht.c index 8c24bcdaed..8777566595 100644 --- a/pimd/pim_nht.c +++ b/pimd/pim_nht.c @@ -39,6 +39,7 @@ #include "pim_jp_agg.h" #include "pim_zebra.h" #include "pim_zlookup.h" +#include "pim_rp.h" /** * pim_sendmsg_zebra_rnh -- Format and send a nexthop register/Unregister @@ -207,6 +208,17 @@ void pim_delete_tracked_nexthop(struct pim_instance *pim, struct prefix *addr, } } +void pim_rp_nexthop_del(struct rp_info *rp_info) +{ + rp_info->rp.source_nexthop.interface = NULL; + rp_info->rp.source_nexthop.mrib_nexthop_addr.u.prefix4.s_addr = + PIM_NET_INADDR_ANY; + rp_info->rp.source_nexthop.mrib_metric_preference = + router->infinite_assert_metric.metric_preference; + rp_info->rp.source_nexthop.mrib_route_metric = + router->infinite_assert_metric.route_metric; +} + /* Update RP nexthop info based on Nexthop update received from Zebra.*/ static void pim_update_rp_nh(struct pim_instance *pim, struct pim_nexthop_cache *pnc) @@ -220,9 +232,11 @@ static void pim_update_rp_nh(struct pim_instance *pim, continue; // Compute PIM RPF using cached nexthop - pim_ecmp_nexthop_search(pim, pnc, &rp_info->rp.source_nexthop, - &rp_info->rp.rpf_addr, &rp_info->group, - 1); + if (!pim_ecmp_nexthop_search(pim, pnc, + &rp_info->rp.source_nexthop, + &rp_info->rp.rpf_addr, &rp_info->group, + 1)) + pim_rp_nexthop_del(rp_info); } } diff --git a/pimd/pim_nht.h b/pimd/pim_nht.h index 796fbf9731..6eff7bbc89 100644 --- a/pimd/pim_nht.h +++ b/pimd/pim_nht.h @@ -68,4 +68,5 @@ void pim_sendmsg_zebra_rnh(struct pim_instance *pim, struct zclient *zclient, void pim_resolve_upstream_nh(struct pim_instance *pim, struct prefix *nht_p); int pim_ecmp_fib_lookup_if_vif_index(struct pim_instance *pim, struct prefix *src, struct prefix *grp); +void pim_rp_nexthop_del(struct rp_info *rp_info); #endif