PIM

PIM – Protocol Independent Multicast

pimd supports pim-sm as well as igmp v2 and v3. pim is vrf aware and can work within the context of vrf’s in order to do S,G mrouting. Additionally PIM can be used in the EVPN underlay network for optimizing forwarding of overlay BUM traffic.

Note

On Linux for PIM-SM operation you must have kernel version 4.19 or greater. To use PIM for EVPN BUM forwarding, kernels 5.0 or greater are required. OpenBSD has no multicast support and FreeBSD, and NetBSD only have support for SSM.

Starting and Stopping pimd

Configuration for the daemon should be saved in the FRR integrated configuration file located in /etc/frr/frr.conf, see Integrated Config File for more information on system configuration.

Prior versions of FRR supported reading and writing per-daemon config files; however, with the introduction of the centralized management daemon mgmtd this could no longer be supported.

In order to allow for an orderly transition from per-daemon config files to the integrated config file, FRR daemons will continue to try and read their specific per-daemon configuration file as before. Additionally the config can still be loaded directly using the -f or --config-file CLI options; however, these files will not be updated when the configuration is written (e.g., with the write mem command).

Warning

Per-daemon files will no longer be updated when the user issues a write memory command. Therefore these per-daemon config files should only be used as a mechanism for transitioning to the integrated config, and then removed.

If starting daemons by hand then please note, pimd requires zebra for proper operation. Additionally pimd depends on routing properly setup and working in the network that it is working on.

# zebra -d
# pimd -d

Please note that zebra must be invoked before pimd.

To stop pimd please use:

kill `cat /var/run/frr/pimd.pid`

Certain signals have special meanings to pimd.

Signal

Meaning

SIGUSR1

Rotate the pimd logfile

SIGINT SIGTERM

pimd sweeps all installed PIM mroutes then terminates gracefully.

pimd invocation options. Common options that can be specified (Common Invocation Options).

PIM Routers

router pim [vrf NAME]

Configure global PIM protocol

rp A.B.C.D A.B.C.D/M

In order to use pim, it is necessary to configure a RP for join messages to be sent to. Currently the only methodology to do this is via static rp commands. All routers in the pim network must agree on these values. The first ip address is the RP’s address and the second value is the matching prefix of group ranges covered. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

no autorp discovery

In order to use pim, it is necessary to configure a RP for join messages to be sent to. FRR supports learning RP information dynamically via the AutoRP protocol and performs discovery by default. This command will disable the AutoRP discovery protocol. All routers in the pim network must agree on the network RP information, so all routers in the network should have AutoRP either enabled or disabled. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

autorp announce A.B.C.D [A.B.C.D/M | group-list PREFIX_LIST]

Configure the router to advertise itself as a candidate PIM-SM RP via AutoRP. The supported groups can be defined as a single group range, or multiple group ranges can be defined via a prefix list.

autorp announce {scope (1-255) | interval (1-65535) | holdtime (0-65535)}

Configure the AutoRP advertise messages. The scope defines the TTL value in the messages to limit the scope, defaults to 31. Interval defines the number of seconds elapsed between advertise messages sent, defaults to 60. Hold time defines how long the AutoRP mapping agent will consider the information valid, setting to 0 will disable expiration of the candidate RP information, defaults to 3 * interval.

rp keep-alive-timer (1-65535)

Modify the time out value for a S,G flow from 1-65535 seconds at RP. The normal keepalive period for the KAT(S,G) defaults to 210 seconds. However, at the RP, the keepalive period must be at least the Register_Suppression_Time, or the RP may time out the (S,G) state before the next Null-Register arrives. Thus, the KAT(S,G) is set to max(Keepalive_Period, RP_Keepalive_Period) when a Register-Stop is sent. If choosing a value below 31 seconds be aware that some hardware platforms cannot see data flowing in better than 30 second chunks. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

bsr candidate-bsr [priority (0-255)] [source [address A.B.C.D] | [interface INTERFACE] | [loopback] | [any]]

Configure the router to advertise itself as a candidate PIM-SM BSR. The candidate with the highest priority becomes the BSR for the domain (high wins). When priority is the same for more than one candidate BSR, the candidate with the highest IP address becomes the BSR of the domain. The address can be configured explicitly via address, or be selecting an interface name using interface. If any is configured the highest address from any interface will be selected. By default, the highest loopback address is selected, which can also be configured via loopback

bsr candidate-rp [interval]

Configure the router to advertise itself as a candidate PIM-SM RP at the specified interval in seconds.

bsr candidate-rp group A.B.C.D/M

Configure the multicast group prefix that this candidate RP advertises itself for. This command can be repeated for all desired groups that need to be added to the candidate RP advertisement.

bsr candidate-rp [priority (0-255)] [source [address A.B.C.D] | [interface INTERFACE] | [loopback] | [any]]

Configure the router to advertise itself as a candidate PIM-SM RP. interval can be used to configure the interval in seconds to send these advertisements. The candidate with the lowest priority becomes the RP for the domain (low wins). When priority is the same for more than one candidate RP, the candidate with the highest IP address becomes the BSR of the domain. The address can be configured explicitly via address, or be selecting an interface name using interface. If any is configured the highest address from any interface will be selected.By default, the highest loopback address is selected, which can also be configured via loopback.

register-accept-list PLIST

When pim receives a register packet the source of the packet will be compared to the prefix-list specified, PLIST, and if a permit is received normal processing continues. If a deny is returned for the source address of the register packet a register stop message is sent to the source.

spt-switchover infinity-and-beyond [prefix-list PLIST]

On the last hop router if it is desired to not switch over to the SPT tree configure this command. Optional parameter prefix-list can be use to control which groups to switch or not switch. If a group is PERMIT as per the PLIST, then the SPT switchover does not happen for it and if it is DENY, then the SPT switchover happens. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

ecmp

If pim has the a choice of ECMP nexthops for a particular RPF, pim will cause S,G flows to be spread out amongst the nexthops. If this command is not specified then the first nexthop found will be used. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

ecmp rebalance

If pim is using ECMP and an interface goes down, cause pim to rebalance all S,G flows across the remaining nexthops. If this command is not configured pim only modifies those S,G flows that were using the interface that went down. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

join-prune-interval (1-65535)

Modify the join/prune interval that pim uses to the new value. Time is specified in seconds. This command is vrf aware, to configure for a vrf, enter the vrf submode. The default time is 60 seconds. If you enter a value smaller than 60 seconds be aware that this can and will affect convergence at scale.

keep-alive-timer (1-65535)

Modify the time out value for a S,G flow from 1-65535 seconds. If choosing a value below 31 seconds be aware that some hardware platforms cannot see data flowing in better than 30 second chunks. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

packets (1-255)

When processing packets from a neighbor process the number of packets incoming at one time before moving on to the next task. The default value is 3 packets. This command is only useful at scale when you can possibly have a large number of pim control packets flowing. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

register-suppress-time (1-65535)

Modify the time that pim will register suppress a FHR will send register notifications to the kernel. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

send-v6-secondary

When sending pim hello packets tell pim to send any v6 secondary addresses on the interface. This information is used to allow pim to use v6 nexthops in it’s decision for RPF lookup. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

ssm prefix-list WORD

Specify a range of group addresses via a prefix-list that forces pim to never do SM over. This command is vrf aware, to configure for a vrf, specify the vrf in the router pim block.

Global Multicast

These commands are valid at the top-level of the configuration (or also per vrf where indicated), instead of under the ‘router pim’ submode.

ip multicast rpf-lookup-mode WORD

Modify how PIM does RPF lookups in the zebra routing table. You can use these choices:

longer-prefix

Lookup the RPF in both tables using the longer prefix as a match

lower-distance

Lookup the RPF in both tables using the lower distance as a match

mrib-only

Lookup in the Multicast RIB only

mrib-then-urib

Lookup in the Multicast RIB then the Unicast Rib, returning first found. This is the default value for lookup if this command is not entered

urib-only

Lookup in the Unicast Rib only.

ip igmp generate-query-once [version (2-3)]

Generate IGMP query (v2/v3) on user requirement. This will not depend on the existing IGMP general query timer.If no version is provided in the cli, the default will be the igmp version enabled on that interface.

ip igmp watermark-warn (1-65535)

Configure watermark warning generation for an igmp group limit. Generates warning once the configured group limit is reached while adding new groups. ‘no’ form of the command disables the warning generation. This command is vrf aware. To configure per vrf, enter vrf submode.

PIM Interface Configuration

PIM interface commands allow you to configure an interface as either a Receiver or a interface that you would like to form pim neighbors on. If the interface is in a vrf, enter the interface command with the vrf keyword at the end.

ip pim active-active

Turn on pim active-active configuration for a Vxlan interface. This command will not do anything if you do not have the underlying ability of a mlag implementation.

ip pim bsm

Tell pim that we would like to use this interface to process bootstrap messages. This is enabled by default. ‘no’ form of this command is used to restrict bsm messages on this interface.

ip pim unicast-bsm

Tell pim that we would like to allow interface to process unicast bootstrap messages. This is enabled by default. ‘no’ form of this command is used to restrict processing of unicast bsm messages on this interface.

ip pim drpriority (0-4294967295)

Set the DR Priority for the interface. This command is useful to allow the user to influence what node becomes the DR for a lan segment.

ip pim hello (1-65535) (1-65535)

Set the pim hello and hold interval for a interface.

ip pim

Tell pim that we would like to use this interface to form pim neighbors over. Please note that this command does not enable the reception of IGMP reports on the interface. Refer to the next ip igmp command for IGMP management.

ip pim use-source A.B.C.D

If you have multiple addresses configured on a particular interface and would like pim to use a specific source address associated with that interface.

ip pim passive

Disable sending and receiving pim control packets on the interface.

ip igmp

Tell pim to receive IGMP reports and Query on this interface. The default version is v3. This command is useful on a LHR.

ip igmp join-group A.B.C.D [A.B.C.D]

Join multicast group or source-group on an interface. This will result in an IGMP join happening through a local socket so that IGMP reports will be sent on this interface. It may also have the side effect of the kernel forwarding multicast traffic to the socket unnessarily.

ip igmp static-group A.B.C.D [A.B.C.D]

Add a static multicast group or source-group on an interface. This will behave as if there is a receiver on this interface without any IGMP reports.

ip igmp proxy

Tell pim to send proxy IGMP reports for joins occuring on all other interfaces on this interface. Join-groups on other interfaces will also be proxied. The default version is v3.

ip igmp query-interval (1-65535)

Set the IGMP query interval that PIM will use.

ip igmp query-max-response-time (1-65535)

Set the IGMP query response timeout value. If an report is not returned in the specified time we will assume the S,G or *,G has timed out.

ip igmp version (2-3)

Set the IGMP version used on this interface. The default value is 3.

ip multicast boundary oil WORD

Set a pim multicast boundary, based upon the WORD prefix-list. If a pim join or IGMP report is received on this interface and the Group is denied by the prefix-list, PIM will ignore the join or report.

ip igmp last-member-query-count (1-255)

Set the IGMP last member query count. The default value is 2. ‘no’ form of this command is used to to configure back to the default value.

ip igmp last-member-query-interval (1-65535)

Set the IGMP last member query interval in deciseconds. The default value is 10 deciseconds. ‘no’ form of this command is used to to configure back to the default value.

ip mroute INTERFACE A.B.C.D [A.B.C.D]

Set a static multicast route for a traffic coming on the current interface to be forwarded on the given interface if the traffic matches the group address and optionally the source address.

PIM Multicast RIB

In order to influence Multicast RPF lookup, it is possible to insert into zebra routes for the Multicast RIB. These routes are only used for RPF lookup and will not be used by zebra for insertion into the kernel or for normal rib processing. As such it is possible to create weird states with these commands. Use with caution. Most of the time this will not be necessary.

ip mroute A.B.C.D/M A.B.C.D (1-255)

Insert into the Multicast Rib Route A.B.C.D/M with specified nexthop. The distance can be specified as well if desired.

ip mroute A.B.C.D/M INTERFACE (1-255)

Insert into the Multicast Rib Route A.B.C.D/M using the specified INTERFACE. The distance can be specified as well if desired.

Multicast Source Discovery Protocol (MSDP) Configuration

MSDP can be setup in different ways:

  • MSDP meshed-group: where all peers are connected with each other creating a fully meshed network. SAs (source active) messages are not forwarded in this mode because the origin is able to send SAs to all members.

    This setup is commonly used with anycast.

  • MSDP peering: when there is one or more peers that are not fully meshed. SAs may be forwarded depending on the result of filtering and RPF checks.

    This setup is commonly consistent with BGP peerings (for RPF checks).

  • MSDP default peer: there is only one peer and all SAs will be forwarded there.

Note

MSDP default peer is not implemented.

Commands available for MSDP

Note

MSDP configuration is available under ‘router pim’.

msdp timers (1-65535) (1-65535) [(1-65535)]

Configure global MSDP timers.

First value is the keep-alive interval. This configures the interval in seconds between keep-alive messages. The default value is 60 seconds. It should be less than the remote hold time.

Second value is the hold-time. This configures the interval in seconds before closing a non responding connection. The default value is 75. This value should be greater than the remote keep alive time.

Third value is the connection retry interval and it is optional. This configures the interval between connection attempts. The default value is 30 seconds.

msdp mesh-group WORD member A.B.C.D

Create or update a mesh group to include the specified MSDP peer.

msdp mesh-group WORD source A.B.C.D

Create or update a mesh group to set the source address used to connect to peers.

msdp peer A.B.C.D source A.B.C.D

Create a regular MSDP session with peer using the specified source address.

msdp peer A.B.C.D sa-filter ACL_NAME <in|out>

Configure incoming or outgoing SA filtering rule.

Note

The filtering will only take effect starting from the command application.

msdp peer A.B.C.D password WORD

Use MD5 authentication to connect with the remote peer.

Note

The authentication will only take effect when starting a new connection.

To apply it immediately call clear ip msdp peer A.B.C.D.

Show PIM Information

All PIM show commands are vrf aware and typically allow you to insert a specified vrf command if information is desired about a specific vrf. If no vrf is specified then the default vrf is assumed. Finally the special keyword ‘all’ allows you to look at all vrfs for the command. Naming a vrf ‘all’ will cause great confusion.

show ip igmp interface

Display IGMP interface information.

show ip igmp [vrf NAME] join [json]

Display IGMP static join information.

show ip igmp [vrf NAME] groups [INTERFACE [GROUP]] [detail] [json]

Display IGMP groups information.

show ip igmp groups retransmissions

Display IGMP group retransmission information.

show ip igmp [vrf NAME] proxy [json]

Display IGMP proxy join information.

show ip igmp [vrf NAME] sources [json]

Display IGMP sources information.

show ip igmp sources retransmissions

Display IGMP source retransmission information.

show ip igmp statistics

Display IGMP statistics information.

show ip multicast

Display various information about the interfaces used in this pim instance.

show ip mroute [vrf NAME] [A.B.C.D [A.B.C.D]] [fill] [json]

Display information about installed into the kernel S,G mroutes. If one address is specified we assume it is the Group we are interested in displaying data on. If the second address is specified then it is Source Group. The keyword fill says to fill in all assumed data for test/data gathering purposes.

show ip mroute [vrf NAME] count [json]

Display information about installed into the kernel S,G mroutes and in addition display data about packet flow for the mroutes for a specific vrf.

show ip mroute vrf all count [json]

Display information about installed into the kernel S,G mroutes and in addition display data about packet flow for the mroutes for all vrfs.

show ip mroute [vrf NAME] summary [json]

Display total number of S,G mroutes and number of S,G mroutes installed into the kernel for a specific vrf.

show ip mroute vrf all summary [json]

Display total number of S,G mroutes and number of S,G mroutes installed into the kernel for all vrfs.

show ip msdp mesh-group

Display the configured mesh-groups, the local address associated with each mesh-group, the peer members included in each mesh-group, and their status.

show ip msdp peer

Display information about the MSDP peers. That includes the peer address, the local address used to establish the connection to the peer, the connection status, and the number of active sources.

show ip pim assert

Display information about asserts in the PIM system for S,G mroutes. This command does not show S,G Channel states that in a NOINFO state.

show ip pim assert-internal

Display internal assert state for S,G mroutes

show ip pim assert-metric

Display metric information about assert state for S,G mroutes

show ip pim assert-winner-metric

Display winner metric for assert state for S,G mroutes

show ip pim group-type

Display SSM group ranges.

show ip pim interface

Display information about interfaces PIM is using.

show ip pim mlag [vrf NAME|all] interface [detail|WORD] [json]

Display mlag interface information.

show ip pim join

Display information about PIM joins received. If one address is specified then we assume it is the Group we are interested in displaying data on. If the second address is specified then it is Source Group.

show ip pim local-membership

Display information about PIM interface local-membership.

show ip pim mlag summary [json]

Display mlag information state that PIM is keeping track of.

show ip pim neighbor

Display information about PIM neighbors.

show ip pim nexthop

Display information about pim nexthops that are being used.

show ip pim nexthop-lookup

Display information about a S,G pair and how the RPF would be chosen. This is especially useful if there are ECMP’s available from the RPF lookup.

show ip pim [vrf NAME] rp-info [A.B.C.D/M] [json]

Display information about RP’s that are configured on this router.

You can filter the output by specifying an arbitrary group range.

# show ip pim rp-info
RP address       group/prefix-list   OIF               I am RP    Source   Group-Type
192.168.10.123   225.0.0.0/24        eth2              yes        Static   ASM
192.168.10.123   239.0.0.0/8         eth2              yes        Static   ASM
192.168.10.123   239.4.0.0/24        eth2              yes        Static   SSM

# show ip pim rp-info 239.4.0.0/25
RP address       group/prefix-list   OIF               I am RP    Source   Group-Type
192.168.10.123   239.0.0.0/8         eth2              yes        Static   ASM
192.168.10.123   239.4.0.0/24        eth2              yes        Static   SSM
show ip pim [vrf NAME] autorp [json]

Display information about AutoRP. Including state of AutoRP Discovery parsing and configured AutoRP candidate RP information.

show ip pim rpf

Display information about currently being used S,G’s and their RPF lookup information. Additionally display some statistics about what has been happening on the router.

show ip pim secondary

Display information about an interface and all the secondary addresses associated with it.

show ip pim state

Display information about known S,G’s and incoming interface as well as the OIL and how they were chosen.

show ip pim [vrf NAME] upstream [A.B.C.D [A.B.C.D]] [json]

Display upstream information about a S,G mroute. Allow the user to specify sub Source and Groups that we are only interested in.

show ip pim upstream-join-desired

Display upstream information for S,G’s and if we desire to join the multicast tree

show ip pim upstream-rpf

Display upstream information for S,G’s and the RPF data associated with them.

show ip pim [vrf NAME] mlag upstream [A.B.C.D [A.B.C.D]] [json]

Display upstream entries that are synced across MLAG switches. Allow the user to specify sub Source and Groups address filters.

show ip pim mlag summary

Display PIM MLAG (multi-chassis link aggregation) session status and control message statistics.

show ip pim bsr [vrf NAME] [json]

Display current bsr, its uptime and last received bsm age.

show ip pim bsr candidate-bsr [vrf NAME] [json]

Display information about the candidate BSR state on this router.

show ip pim bsr candidate-rp [vrf NAME] [json]

Display information about the candidate RP state on this router.

show ip pim bsr candidate-rp-database [vrf NAME] [json]

Display the current list of candidate RPs received by this router.

show ip pim bsr groups [vrf NAME] [json]

Display the current list of multicast group mapping received by this router from candidate RPs.

show ip pim bsr rp-info [vrf NAME] [json]

Display group-to-rp mappings received from E-BSR.

show ip pim bsm-database [vrf NAME] [json]

Display all fragments of stored bootstrap message in user readable format.

mtrace A.B.C.D [A.B.C.D]

Display multicast traceroute towards source, optionally for particular group.

show ip multicast count [vrf NAME] [json]

Display multicast data packets count per interface for a vrf.

show ip multicast count vrf all [json]

Display multicast data packets count per interface for all vrf.

PIM Debug Commands

The debugging subsystem for PIM behaves in accordance with how FRR handles debugging. You can specify debugging at the enable CLI mode as well as the configure CLI mode. If you specify debug commands in the configuration cli mode, the debug commands can be persistent across restarts of the FRR pimd if the config was written out.

debug igmp

This turns on debugging for IGMP protocol activity.

debug mtrace

This turns on debugging for mtrace protocol activity.

debug mroute

This turns on debugging for PIM interaction with kernel MFC cache.

debug pim events

This turns on debugging for PIM system events. Especially timers.

debug pim nht

This turns on debugging for PIM nexthop tracking. It will display information about RPF lookups and information about when a nexthop changes.

debug pim nht detail

This turns on debugging for PIM nexthop in detail. This is not enabled by default.

debug pim packet-dump

This turns on an extraordinary amount of data. Each pim packet sent and received is dumped for debugging purposes. This should be considered a developer only command.

debug pim packets

This turns on information about packet generation for sending and about packet handling from a received packet.

debug pim trace

This traces pim code and how it is running.

debug pim bsm

This turns on debugging for BSR message processing.

debug pim zebra

This gathers data about events from zebra that come up through the ZAPI.

debug pim autorp

This turns on debugging for PIM AutoRP protocol events.

PIM Clear Commands

Clear commands reset various variables.

clear ip interfaces

Reset interfaces.

clear ip igmp interfaces

Reset IGMP interfaces.

clear ip mroute

Reset multicast routes.

clear ip mroute [vrf NAME] count

When this command is issued, reset the counts of data shown for packet count, byte count and wrong interface to 0 and start count up from this spot.

clear ip pim interfaces

Reset PIM interfaces.

clear ip pim oil

Rescan PIM OIL (output interface list).

clear ip pim [vrf NAME] bsr-data

This command will clear the BSM scope data struct. This command also removes the next hop tracking for the bsr and resets the upstreams for the dynamically learnt RPs.

clear ip msdp peer A.B.C.D

Reset MSDP peer connection.

Use this command to set/unset MD5 authentication.

PIM EVPN configuration

To use PIM in the underlay for overlay BUM forwarding associate a multicast group with the L2 VNI. The actual configuration is based on your distribution. Here is an ifupdown2 example:

auto vx-10100
iface vx-10100
    vxlan-id 10100
    bridge-access 100
    vxlan-local-tunnelip 27.0.0.11
    vxlan-mcastgrp 239.1.1.100

Note

PIM will see the vxlan-mcastgrp configuration and auto configure state to properly forward BUM traffic.

PIM also needs to be configured in the underlay to allow the BUM MDT to be setup. This is existing PIM configuration:

  • Enable pim on the underlay L3 interface via the “ip pim” command.

  • Configure RPs for the BUM multicast group range.

  • Ensure the PIM is enabled on the lo of the VTEPs and the RP.

Sample configuration

debug igmp
debug pim
debug pim zebra

! You may want to enable ssmpingd for troubleshooting
! See http://www.venaas.no/multicast/ssmping/
!
router pim
 ssmpingd 1.1.1.1
 ssmpingd 2.2.2.2

! HINTS:
!  - Enable "ip pim ssm" on the interface directly attached to the
!    multicast source host (if this is the first-hop router)
!  - Enable "ip pim ssm" on pim-routers-facing interfaces
!  - Enable "ip igmp" on IGMPv3-hosts-facing interfaces
!  - In order to inject IGMPv3 local membership information in the
!    PIM protocol state, enable both "ip pim ssm" and "ip igmp" on
!    the same interface; otherwise PIM won't advertise
!    IGMPv3-learned membership to other PIM routers

interface eth0
 ip pim ssm
 ip igmp