diff options
author | Sarita Patra <saritap@vmware.com> | 2023-07-31 13:30:26 +0200 |
---|---|---|
committer | Sarita Patra <saritap@vmware.com> | 2023-07-31 14:48:35 +0200 |
commit | 8b36ee47d377ace232d7d45bee694a6c9b4376c5 (patch) | |
tree | 656c031207efdf459ed81df888f123689bb63f9a /pimd/pim_upstream.c | |
parent | Merge pull request #14109 from taspelund/noreset_update_src (diff) | |
download | frr-8b36ee47d377ace232d7d45bee694a6c9b4376c5.tar.xz frr-8b36ee47d377ace232d7d45bee694a6c9b4376c5.zip |
pimd, pim6d: Don't set SRC_STREAM flag on LHR
Setup:
------
R1( LHR) ---------R2( RP) ----------R3( FHR)
Problem:
-------
- Send IGMP/MLD join and traffic.
LHR: (S,G) mroute is created with reference count = 2
and set the flag SRC_STREAM.
(Code flow: pim_mroute_msg_wholepkt -> pim_upstream_add,
pim_upstream_sg_running_proc -> pim_upstream_ref)
- Send IGMP/MLD prune.
LHR: removes (*,G) entry and it tries to remove childen (S,G) entries.
But (S,G) is having reference count = 2. So after prune,
(S,G) entry reference count becomes 1 and will be present
until KAT expires.
Fix:
---
Don't set SRC_STREAM flag for LHR.
In LHR, (S,G) should be maintained, until (*,G) is present.
When prune receives delete (*,G) and children (S,G).
When traffic stops, delete (S,G) after KAT expires.
Issue: #13893
Signed-off-by: Sarita Patra <saritap@vmware.com>
Diffstat (limited to 'pimd/pim_upstream.c')
-rw-r--r-- | pimd/pim_upstream.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/pimd/pim_upstream.c b/pimd/pim_upstream.c index 406f772ff..a8d087bf4 100644 --- a/pimd/pim_upstream.c +++ b/pimd/pim_upstream.c @@ -1965,6 +1965,7 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up) struct channel_oil *c_oil = up->channel_oil; struct interface *ifp = up->rpf.source_nexthop.interface; struct pim_interface *pim_ifp; + struct pim_instance *pim = up->channel_oil->pim; /* "iif == RPF_interface(S)" check is not easy to do as the info * we get from the kernel/ASIC is really a "lookup/key hit". @@ -1984,8 +1985,9 @@ static bool pim_upstream_kat_start_ok(struct pim_upstream *up) } if ((up->join_state == PIM_UPSTREAM_JOINED) - && !pim_upstream_empty_inherited_olist(up)) { - return true; + && !pim_upstream_empty_inherited_olist(up)) { + if (I_am_RP(pim, up->sg.grp)) + return true; } return false; |