]> git.puffer.fish Git - mirror/frr.git/commit
pimd : packet processing optimization on rp change 9970/head
authorMobashshera Rasool <mrasool@vmware.com>
Fri, 5 Nov 2021 07:11:57 +0000 (00:11 -0700)
committerMobashshera Rasool <mrasool@vmware.com>
Fri, 19 Nov 2021 05:46:07 +0000 (21:46 -0800)
commit62596d9a1f8bf58759192dbf59bf801c4bf56aea
tree217ce06a7dc53dfdb76f9dcd508992aef64d4fc6
parent3c522938091a074b0ad85460d56e393cd39cc2e9
pimd : packet processing optimization on rp change

Problem Statement:
==================
on rp_change, PIM processes all the upstream in a loop and for selected
upstreams PIM has to send join/prune based on the RPF changed.
join and prune packets are not getting aggregated in a single packet.

Root Cause Analysis:
====================
on pim_rp_change pim_upstream_update() gets called for selected upstreams.
This API calculates to whom it has to send join and to whom it has to
send prune via API pim_zebra_upstream_rpf_changed(). This API peprares
the upstream_switch_list list per interface and inserts the group and
sources.
Now PIM is still in the pim_upstream_update() API context, i.e PIM
is still processing the same upstream. In the last there is a
call to pim_zebra_update_all_interfaces() which processes the
upstream_switch_list list, sends the packets out and clears the list.

Fix:
====
Don't process the upstream_switch_list in the upstream context.
process all the upstreams prepare the upstream_switch_list and then
process in one go. This will club all the S,G entries.
It also saves list cleanup with respect to memory allocation and
deallocation multiple times.

Signed-off-by: Vishal Dhingra <rac.vishaldhingra@gmail.com>
Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
pimd/pim_bsm.c
pimd/pim_rp.c