]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: clear rp_info source_nexthop when RP becomes not reachable
authorSarita Patra <saritap@vmware.com>
Fri, 22 Feb 2019 14:37:06 +0000 (06:37 -0800)
committerSarita Patra <saritap@vmware.com>
Mon, 25 Feb 2019 05:30:22 +0000 (21:30 -0800)
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 <saritap@vmware.com>
pimd/pim_nht.c
pimd/pim_nht.h

index 8c24bcdaed361ebbb8e7359be572c58dc4ed088d..87775665955dd5f5885e7d9a0f9bdd59d2ce149c 100644 (file)
@@ -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);
        }
 }
 
index 796fbf9731943f2ca58278527ba516341455d630..6eff7bbc891a33caf75528c2c434400fc72910cb 100644 (file)
@@ -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