mirror of
				https://git.proxmox.com/git/mirror_frr
				synced 2025-10-31 13:03:19 +00:00 
			
		
		
		
	|  10f40e969f In the scenario on an intermediate router where a *,G join has
been received and a S,G stream is being sent through that router
on the *,G stream, there exists a situation when the *,G in has been pruned
but the stream is still being received on on incoming interface towards
the RP for the *,G.   In this situation PIM will see the S,G stream
initially as a NOCACHE from the dataplane, PIM will then do a RPF
for the S and notice that it is supposed to be coming in on adifferent
interface.  In this case PIM the original PIM code would create
a blackhole mroute towards the RPF of the *,G( the interface the
stream is being received on ).  The original reason for this is that
if there is a scenario where this particular S1,G stream is sending
at basically line rate, and there also happens to be a different
S2,G stream that is sending at a very low rate.  With certain
dataplanes there is no way to really rate limit the S1 -vs- S2
stream and the S1 stream completely overwhelms the S2 stream
for sending up to the control plane for proper pim handling.
The problem then becomes that FRR never properly responds
to the situation where the *,G is rereceived and the S,G
stream switches back over to the SPT for itself and FRR ends
up with a dead mroute that stops everything from working properly.
This code change, installs the blackhole mroute with the RPF
towards the RP for the G and then resets the RPF to the correct
RPF for the Stream but does not modify the mroute.  When the
*,G is rereceived and we attempt to transition to the S,G stream
this now works.
As a note:  Both David L and myself do not necessarily believe
we fully understand the problem yet.  What this does do is fix
all the inconsistent CI issues we are seeing in the topotests
at this time.  Internally I am seeing other test failures
in PIM that I don't fully understand and we suspect that
there are other problems in the state machine.  We plan to
revisit this problem as we are able to debug the issue better.
In the meantime both David and Myself agree that this gets
the CI working again and Streams end up in the right state.
Signed-off-by: Donald Sharp <sharpd@nvidia.com>
(cherry picked from commit  | ||
|---|---|---|
| .. | ||
| .gitignore | ||
| AUTHORS | ||
| CAVEATS | ||
| COMMANDS | ||
| DEBUG | ||
| LINUX_KERNEL_MROUTE_MFC | ||
| Makefile | ||
| mtracebis_netlink.c | ||
| mtracebis_netlink.h | ||
| mtracebis_routeget.c | ||
| mtracebis_routeget.h | ||
| mtracebis.c | ||
| pim6_cmd.c | ||
| pim6_cmd.h | ||
| pim6_main.c | ||
| pim6_mld_protocol.h | ||
| pim6_mld.c | ||
| pim6_mld.h | ||
| pim_addr.c | ||
| pim_addr.h | ||
| pim_assert.c | ||
| pim_assert.h | ||
| pim_bfd.c | ||
| pim_bfd.h | ||
| pim_bsm.c | ||
| pim_bsm.h | ||
| pim_cmd_common.c | ||
| pim_cmd_common.h | ||
| pim_cmd.c | ||
| pim_cmd.h | ||
| pim_errors.c | ||
| pim_errors.h | ||
| pim_hello.c | ||
| pim_hello.h | ||
| pim_iface.c | ||
| pim_iface.h | ||
| pim_ifchannel.c | ||
| pim_ifchannel.h | ||
| pim_igmp_join.h | ||
| pim_igmp_mtrace.c | ||
| pim_igmp_mtrace.h | ||
| pim_igmp_stats.c | ||
| pim_igmp_stats.h | ||
| pim_igmp.c | ||
| pim_igmp.h | ||
| pim_igmpv2.c | ||
| pim_igmpv2.h | ||
| pim_igmpv3.c | ||
| pim_igmpv3.h | ||
| pim_instance.c | ||
| pim_instance.h | ||
| pim_int.c | ||
| pim_int.h | ||
| pim_join.c | ||
| pim_join.h | ||
| pim_jp_agg.c | ||
| pim_jp_agg.h | ||
| pim_macro.c | ||
| pim_macro.h | ||
| pim_main.c | ||
| pim_memory.c | ||
| pim_memory.h | ||
| pim_mlag.c | ||
| pim_mlag.h | ||
| pim_mroute.c | ||
| pim_mroute.h | ||
| pim_msdp_packet.c | ||
| pim_msdp_packet.h | ||
| pim_msdp_socket.c | ||
| pim_msdp_socket.h | ||
| pim_msdp.c | ||
| pim_msdp.h | ||
| pim_msg.c | ||
| pim_msg.h | ||
| pim_nb_config.c | ||
| pim_nb.c | ||
| pim_nb.h | ||
| pim_neighbor.c | ||
| pim_neighbor.h | ||
| pim_nht.c | ||
| pim_nht.h | ||
| pim_oil.c | ||
| pim_oil.h | ||
| pim_pim.c | ||
| pim_pim.h | ||
| pim_register.c | ||
| pim_register.h | ||
| pim_routemap.c | ||
| pim_rp.c | ||
| pim_rp.h | ||
| pim_rpf.c | ||
| pim_rpf.h | ||
| pim_signals.c | ||
| pim_signals.h | ||
| pim_sock.c | ||
| pim_sock.h | ||
| pim_ssm.c | ||
| pim_ssm.h | ||
| pim_ssmpingd.c | ||
| pim_ssmpingd.h | ||
| pim_static.c | ||
| pim_static.h | ||
| pim_str.h | ||
| pim_tib.c | ||
| pim_tib.h | ||
| pim_time.c | ||
| pim_time.h | ||
| pim_tlv.c | ||
| pim_tlv.h | ||
| pim_upstream.c | ||
| pim_upstream.h | ||
| pim_util.c | ||
| pim_util.h | ||
| pim_vty.c | ||
| pim_vty.h | ||
| pim_vxlan_instance.h | ||
| pim_vxlan.c | ||
| pim_vxlan.h | ||
| pim_zebra.c | ||
| pim_zebra.h | ||
| pim_zlookup.c | ||
| pim_zlookup.h | ||
| pim_zpthread.c | ||
| pimd.c | ||
| pimd.h | ||
| README | ||
| subdir.am | ||
| test_igmpv3_join.c | ||
| TODO | ||
| TROUBLESHOOTING | ||
INTRODUCTION
        qpimd aims to implement a PIM (Protocol Independent Multicast)
	daemon for the FRR Routing Suite.
	qpimd implements PIM-SM (Sparse Mode) of RFC 4601.
        Additionally MSDP has been implemented.
	In order to deliver end-to-end multicast routing control
	plane, qpimd includes the router-side of IGMPv[2|3] (RFC 3376).
LICENSE
        qpimd - pimd for FRR
        Copyright (C) 2008 Everton da Silva Marques
        qpimd is free software; you can redistribute it and/or modify
        it under the terms of the GNU General Public License as
        published by the Free Software Foundation; either version 2,
        or (at your option) any later version.
        qpimd is distributed in the hope that it will be useful, but
        WITHOUT ANY WARRANTY; without even the implied warranty of
        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        GNU General Public License for more details.
        You should have received a copy of the GNU General Public
        License along with qpimd; see the file COPYING.  If not, write
        to the Free Software Foundation, Inc., 59 Temple Place - Suite
        330, Boston, MA 02111-1307, USA.
HOME SITE
        qpimd lives at:
        https://github.com/frrouting/frr
PLATFORMS
	qpimd has been tested with Debian Jessie.
REQUIREMENTS
	qpimd requires FRR (2.0 or higher)
CONFIGURATION COMMANDS
	See available commands in the file pimd/COMMANDS.
KNOWN CAVEATS
	See list of known caveats in the file pimd/CAVEATS.
SUPPORT
	Please post comments, questions, patches, bug reports at the
	support site:
        https://frrouting.org/frr
RELATED WORK
	igmprt:	An IGMPv3-router implementation
	- http://www.loria.fr/~lahmadi/igmpv3-router.html
	USC pimd: PIMv2-SM daemon
	- http://netweb.usc.edu/pim/pimd (URL broken in 2008-12-23)
	- http://packages.debian.org/source/sid/pimd (from Debian)
	troglobit pimd: This is the original USC pimd from
	http://netweb.usc.edu/pim/. In January 16, 2010 it was revived
	with the intention to collect patches floating around in
	Debian, Gentoo, Lintrack and other distribution repositories
	and to provide a central point of collaboration.
	- http://github.com/troglobit/pimd
	zpimd: zpimd is not dependent of zebra or any other routing daemon
	- ftp://robur.slu.se/pub/Routing/Zebra
	- http://sunsite2.icm.edu.pl/pub/unix/routing/zpimd
	mrd6: an IPv6 Multicast Router for Linux systems
	- http://fivebits.net/proj/mrd6/
	MBGP: Implementation of RFC 2858 for Quagga
	- git://git.coplanar.net/~balajig/quagga
	- http://www.gossamer-threads.com/lists/quagga/dev/18000
REFERENCES
	IANA Protocol Independent Multicast (PIM) Parameters
	http://www.iana.org/assignments/pim-parameters/pim-parameters.txt
	Address Family Numbers
	http://www.iana.org/assignments/address-family-numbers
                              -- END --