diff options
author | Sarita Patra <saritap@vmware.com> | 2022-12-14 18:24:57 +0100 |
---|---|---|
committer | Sarita Patra <saritap@vmware.com> | 2022-12-15 13:02:23 +0100 |
commit | 50b8574d5449b80b760666c789ce84d839feedd0 (patch) | |
tree | 2e19428d3ac3cd91ed49688eef135c884bccb13a /pimd | |
parent | Merge pull request #12499 from opensourcerouting/ospf-vertex-leak (diff) | |
download | frr-50b8574d5449b80b760666c789ce84d839feedd0.tar.xz frr-50b8574d5449b80b760666c789ce84d839feedd0.zip |
pimd: Handling SGRPT prune received
Topology:
========
Receiver----R1----(ens192)R2(ens224)----R3----R4----Source
--------------------------
R1=LHR
R2=RP
R4=FHR
Problem:
=======
1. Direct connected link between R1 and R3 is down initially.
2. So traffic flow path is R4<->R3<->R2<->R1<->Receiver.
3. Mroutes are properly created on all the nodes.
4. Up the direct connected link between R1 and R3.
5. Traffic flows in both the paths.
R4<->R3<->R2<->R1<->Receiver
R4<->R3<->R1<->Receiver
6. Duplicate traffic received at the receiver.
Root Cause:
==========
Initially when the direct connected link between R1 and R3 is
down, traffic flows via RP(R2). So in RP (S,G) installed with
IIF as ens224 and OIF as ens192 (reference = 2) with mask
PIM_OIF_FLAG_PROTO_STAR and PIM_OIF_FLAG_PROTO_PIM.
Now when the direct link between R1 and R3 is Up, LHR(R1) sends
SGRPT prune. After prune received, RP(R2) will remove OIF ens224
with mask PIM_OIF_FLAG_PROTO_STAR.
Since OIF ens224 is still present with mask PIM_OIF_FLAG_PROTO_PIM,
RP(R2) will not send prune towards R3.
So traffic continues to flow in the path R4<->R3<->R2<->R1<->Receiver.
Fix:
====
When SGRpt prune received, remove OIF irrespective of the OIF is
installed with mask "PIM_OIF_FLAG_PROTO_STAR" or "PIM_OIF_FLAG_PROTO_PIM".
Once OIF is removed, RP sends prune towards R3.
Issue: #11347
Signed-off-by: Sarita Patra <saritap@vmware.com>
Diffstat (limited to 'pimd')
-rw-r--r-- | pimd/pim_ifchannel.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/pimd/pim_ifchannel.c b/pimd/pim_ifchannel.c index 3310009c0..082862709 100644 --- a/pimd/pim_ifchannel.c +++ b/pimd/pim_ifchannel.c @@ -711,6 +711,8 @@ static void on_ifjoin_prune_pending_timer(struct thread *t) pim_channel_del_oif( ch->upstream->channel_oil, ifp, PIM_OIF_FLAG_PROTO_STAR, __func__); + pim_channel_del_oif(ch->upstream->channel_oil, ifp, + PIM_OIF_FLAG_PROTO_PIM, __func__); if (!ch->upstream->channel_oil->installed) pim_upstream_mroute_add( ch->upstream->channel_oil, |