mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-24 15:25:49 +00:00
![]() 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> |
||
---|---|---|
.. | ||
.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 --