From: Donald Sharp Date: Mon, 27 Jun 2016 19:06:46 +0000 (-0400) Subject: pimd: Refactor pim_scan_oil X-Git-Tag: frr-2.0-rc1~496^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=8a67a996bc0e8d3ff0792e1c0b53313170545700;p=matthieu%2Ffrr.git pimd: Refactor pim_scan_oil Allow the workings of pim_scan_oil to be called on a per channel basis. Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_zebra.c b/pimd/pim_zebra.c index e947ff87c5..5918a5192d 100644 --- a/pimd/pim_zebra.c +++ b/pimd/pim_zebra.c @@ -383,19 +383,14 @@ static void scan_upstream_rpf_cache() } -void pim_scan_oil() +void +pim_scan_individual_oil (struct channel_oil *c_oil) { - struct listnode *node; - struct listnode *nextnode; - struct channel_oil *c_oil; + int old_vif_index; + int input_iface_vif_index = fib_lookup_if_vif_index(c_oil->oil.mfcc_origin); - qpim_scan_oil_last = pim_time_monotonic_sec(); - ++qpim_scan_oil_events; - - for (ALL_LIST_ELEMENTS(qpim_channel_oil_list, node, nextnode, c_oil)) { - int old_vif_index; - int input_iface_vif_index = fib_lookup_if_vif_index(c_oil->oil.mfcc_origin); - if (input_iface_vif_index < 1) { + if (input_iface_vif_index < 1) + { char source_str[100]; char group_str[100]; pim_inet4_dump("", c_oil->oil.mfcc_origin, source_str, sizeof(source_str)); @@ -403,15 +398,17 @@ void pim_scan_oil() zlog_warn("%s %s: could not find input interface for (S,G)=(%s,%s)", __FILE__, __PRETTY_FUNCTION__, source_str, group_str); - continue; + return; } - if (input_iface_vif_index == c_oil->oil.mfcc_parent) { + if (input_iface_vif_index == c_oil->oil.mfcc_parent) + { /* RPF unchanged */ - continue; + return; } - if (PIM_DEBUG_ZEBRA) { + if (PIM_DEBUG_ZEBRA) + { struct interface *old_iif = pim_if_find_by_vif_index(c_oil->oil.mfcc_parent); struct interface *new_iif = pim_if_find_by_vif_index(input_iface_vif_index); char source_str[100]; @@ -425,8 +422,9 @@ void pim_scan_oil() new_iif ? new_iif->name : "", input_iface_vif_index); } - /* new iif loops to existing oif ? */ - if (c_oil->oil.mfcc_ttls[input_iface_vif_index]) { + /* new iif loops to existing oif ? */ + if (c_oil->oil.mfcc_ttls[input_iface_vif_index]) + { struct interface *new_iif = pim_if_find_by_vif_index(input_iface_vif_index); if (PIM_DEBUG_ZEBRA) { @@ -447,8 +445,10 @@ void pim_scan_oil() old_vif_index = c_oil->oil.mfcc_parent; c_oil->oil.mfcc_parent = input_iface_vif_index; + zlog_debug ("FF"); /* update kernel multicast forwarding cache (MFC) */ - if (pim_mroute_add(&c_oil->oil)) { + if (pim_mroute_add(&c_oil->oil)) + { /* just log warning */ struct interface *old_iif = pim_if_find_by_vif_index(old_vif_index); struct interface *new_iif = pim_if_find_by_vif_index(input_iface_vif_index); @@ -457,14 +457,24 @@ void pim_scan_oil() pim_inet4_dump("", c_oil->oil.mfcc_origin, source_str, sizeof(source_str)); pim_inet4_dump("", c_oil->oil.mfcc_mcastgrp, group_str, sizeof(group_str)); zlog_warn("%s %s: (S,G)=(%s,%s) failure updating input interface from %s vif_index=%d to %s vif_index=%d", - __FILE__, __PRETTY_FUNCTION__, - source_str, group_str, - old_iif ? old_iif->name : "", c_oil->oil.mfcc_parent, - new_iif ? new_iif->name : "", input_iface_vif_index); - continue; + __FILE__, __PRETTY_FUNCTION__, + source_str, group_str, + old_iif ? old_iif->name : "", c_oil->oil.mfcc_parent, + new_iif ? new_iif->name : "", input_iface_vif_index); } +} + +void pim_scan_oil() +{ + struct listnode *node; + struct listnode *nextnode; + struct channel_oil *c_oil; + + qpim_scan_oil_last = pim_time_monotonic_sec(); + ++qpim_scan_oil_events; - } /* for (qpim_channel_oil_list) */ + for (ALL_LIST_ELEMENTS(qpim_channel_oil_list, node, nextnode, c_oil)) + pim_scan_individual_oil (c_oil); } static int on_rpf_cache_refresh(struct thread *t) diff --git a/pimd/pim_zebra.h b/pimd/pim_zebra.h index d624c86661..8e8f09551a 100644 --- a/pimd/pim_zebra.h +++ b/pimd/pim_zebra.h @@ -28,6 +28,7 @@ void pim_zebra_init(char *zebra_sock_path); +void pim_scan_individual_oil (struct channel_oil *c_oil); void pim_scan_oil(void); void igmp_anysource_forward_start(struct igmp_group *group);