diff options
author | Chirag Shah <chirag@cumulusnetworks.com> | 2017-04-27 20:01:32 +0200 |
---|---|---|
committer | Chirag Shah <chirag@cumulusnetworks.com> | 2017-05-07 02:38:18 +0200 |
commit | 815c33c92f10c112dba83f4ed46a6eaaa55edbb4 (patch) | |
tree | 8ae71bb5959d41ca12a445e0b01477699e8fb221 /pimd/pim_oil.c | |
parent | Merge pull request #462 from donaldsharp/poll_3.0 (diff) | |
download | frr-815c33c92f10c112dba83f4ed46a6eaaa55edbb4.tar.xz frr-815c33c92f10c112dba83f4ed46a6eaaa55edbb4.zip |
pimd: fix channel_oil and upstream RPF in sync
During PIM Neighbor change/UP event, pim_scan_oil api
scans all channel oil to see any rpf impacted. Instead of
passing current upstream's RPF it passes current RPF as 0 and
does query to rib for nexhtop (without ECMP/Rebalance). This creates
inconsist RPF between Upstream and Channel oil.
In Channel Oil keep backward pointer to upstream DB and fetch up's
RPF and passed to channel_oil scan.
Decrement channel_oil ref_count in upstream_del when decrementing
up ref_count and it is not the last.
Created ECMP based FIB lookup API.
Testing Done:
Performed following testing on tester setup:
5 x LHR, 4 x MSDP Spines, 6 Sources each sending to 1023 groups from one of the spines.
Total send rate 8Mpps.
Test that caused problems was to reboot every device at the same time.
After fix performed 5 iterations of reboot devices and show no sign of the problem.
Signed-off-by: Chirag Shah <chirag@cumulusnetworks.com>
Diffstat (limited to 'pimd/pim_oil.c')
-rw-r--r-- | pimd/pim_oil.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/pimd/pim_oil.c b/pimd/pim_oil.c index 2d4aa3feb..7f5f3970a 100644 --- a/pimd/pim_oil.c +++ b/pimd/pim_oil.c @@ -164,6 +164,7 @@ struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg, } c_oil->oil.mfcc_parent = input_vif_index; ++c_oil->oil_ref_count; + c_oil->up = pim_upstream_find(sg); //channel might be present prior to upstream return c_oil; } @@ -188,6 +189,7 @@ struct channel_oil *pim_channel_oil_add(struct prefix_sg *sg, c_oil->oil.mfcc_parent = input_vif_index; c_oil->oil_ref_count = 1; c_oil->installed = 0; + c_oil->up = pim_upstream_find(sg); listnode_add_sort(pim_channel_oil_list, c_oil); @@ -204,6 +206,7 @@ void pim_channel_oil_del(struct channel_oil *c_oil) * into pim_channel_oil_free() because the later is * called by list_delete_all_node() */ + c_oil->up = NULL; listnode_delete(pim_channel_oil_list, c_oil); hash_release (pim_channel_oil_hash, c_oil); |