diff options
author | Donald Sharp <sharpd@cumulusnetwroks.com> | 2016-07-12 21:25:11 +0200 |
---|---|---|
committer | Donald Sharp <sharpd@cumulusnetwroks.com> | 2016-07-12 21:25:11 +0200 |
commit | 60cd0356857757bd096cfb0607903ff090990ba9 (patch) | |
tree | 61eecbbbbd90aa4ab90663313bd0be8e7e66ffc1 /pimd | |
parent | pimd: Track if the mroute is installed or not (diff) | |
download | frr-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.c | 25 |
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; } |