summaryrefslogtreecommitdiffstats
path: root/pimd
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetwroks.com>2016-07-12 21:25:11 +0200
committerDonald Sharp <sharpd@cumulusnetwroks.com>2016-07-12 21:25:11 +0200
commit60cd0356857757bd096cfb0607903ff090990ba9 (patch)
tree61eecbbbbd90aa4ab90663313bd0be8e7e66ffc1 /pimd
parentpimd: Track if the mroute is installed or not (diff)
downloadfrr-60cd0356857757bd096cfb0607903ff090990ba9.tar.xz
frr-60cd0356857757bd096cfb0607903ff090990ba9.zip
pimd: multicast route not removed from kernel when the if goes down
When a multicast route's rpf changes( for whatever reason ) (*,G) routes were never updating properly. This is because we were attempting to fing the path to the *, instead of the RP. Modify the code to check if we are attempting to find a * route and use the RP instead. Ticket: CM-11736 Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
Diffstat (limited to 'pimd')
-rw-r--r--pimd/pim_zebra.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c
index 47515bcbc..efab00e22 100644
--- a/pimd/pim_zebra.c
+++ b/pimd/pim_zebra.c
@@ -387,18 +387,27 @@ static void scan_upstream_rpf_cache()
void
pim_scan_individual_oil (struct channel_oil *c_oil)
{
+ struct in_addr vif_source;
+ int input_iface_vif_index;
int old_vif_index;
- int input_iface_vif_index = fib_lookup_if_vif_index(c_oil->oil.mfcc_origin);
+ if (!pim_rp_set_upstream_addr (&vif_source, c_oil->oil.mfcc_origin))
+ return;
+
+ input_iface_vif_index = fib_lookup_if_vif_index (vif_source);
if (input_iface_vif_index < 1)
{
- char source_str[100];
- char group_str[100];
- pim_inet4_dump("<source?>", c_oil->oil.mfcc_origin, source_str, sizeof(source_str));
- pim_inet4_dump("<group?>", c_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
- zlog_warn("%s %s: could not find input interface for (S,G)=(%s,%s)",
- __FILE__, __PRETTY_FUNCTION__,
- source_str, group_str);
+ if (PIM_DEBUG_ZEBRA)
+ {
+ char source_str[100];
+ char group_str[100];
+ pim_inet4_dump("<source?>", c_oil->oil.mfcc_origin, source_str, sizeof(source_str));
+ pim_inet4_dump("<group?>", c_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str));
+ zlog_debug("%s %s: could not find input interface(%d) for (S,G)=(%s,%s)",
+ __FILE__, __PRETTY_FUNCTION__, c_oil->oil.mfcc_parent,
+ source_str, group_str);
+ }
+ pim_mroute_del (c_oil);
return;
}