Multicast PIM Assert is one of those important multicast topics that most people don’t really think about. Let’s take a look at the following topology:
Above, you see four routers that are configured to use multicast. R1 is the source, and R4 is our receiver. As you can see, R2, R3, and R4 are connected to the same switch.
Now when R1 starts streaming multicast traffic towards R2 and R3, they will both forward multicast packets to R4, resulting in duplicate traffic. To stop this, PIM will elect one PIM forwarder for this segment. PIM doesn’t have any routing information itself but relies on other routing protocols that are configured, it will use this information to select the best forwarding path with the PIM assert mechanism.
When R2 and R3 both forward multicast packets to the 192.168.234.0 /24 segment, they will see each other’s multicast traffic, this will trigger the PIM assert mechanism. We will elect a PIM forwarder based on the following rules:
- The router with the lowest administrative distance to the source of the multicast stream will be the elected PIM forwarder. This only happens if you use two routing protocols or when you use a static route pointing to the source.
- If the AD is equal, we will compare the unicast routing metric toward the source.
- If the AD and metric are both the same, we will elect the PIM forwarded based on the highest IP address.
The elected PIM forwarder will keep forwarding traffic to the receiver, while the loser will prune its interface.
Now let’s take a look at this in action! First, I’ll configure a basic PIM Dense mode setup:
R1(config)#ip multicast-routing
R1(config)#interface loopback 0
R1(config-if)#ip address 1.1.1.1 255.255.255.255
R1(config-if)#ip pim dense-mode
R1(config)#interface fastEthernet 0/0
R1(config-if)#ip pim dense-mode
R1(config)#interface fastEthernet 0/1
R1(config-if)#ip pim dense-mode
I will use a loopback interface on R1 as the source for our multicast stream.
R2(config)#ip multicast-routing
R2(config)#interface fastEthernet 0/0
R2(config-if)#ip pim dense-mode
R2(config)#interface fastEthernet 0/1
R2(config-if)#ip pim dense-mode
R3(config)#ip multicast-routing
R3(config)#interface fastEthernet 0/0
R3(config-if)#ip pim dense-mode
R3(config)#interface fastEthernet 0/1
R3(config-if)#ip pim dense-mode
R2 and R3 are simple. Just enable multicast routing and PIM Dense mode on the interfaces. Only R4 left:
R4(config)#ip multicast-routing
R4(config)#interface fastEthernet 0/0
R4(config-if)#ip pim dense-mode
R4(config-if)#ip igmp join-group 239.1.1.1
On R4, we will also enable PIM dense mode and make it listen to the 239.1.1.1 multicast group address.
I applied OSPF to all routers, using the quick “shotgun approach” to advertise everything:
router ospf 1
network 0.0.0.0 255.255.255.255 area 0
Now let’s start a multicast stream from R1:
R1#ping 239.1.1.1 source loopback 0 repeat 9999
Type escape sequence to abort.
Sending 9999, 100-byte ICMP Echos to 239.1.1.1, timeout is 2 seconds:
Packet sent with a source address of 1.1.1.1
Reply to request 0 from 192.168.234.4, 12 ms
You will see replies from R4. Now let’s check who is forwarding this traffic:
R2#show ip mroute 1.1.1.1 239.1.1.1
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
L - Local, P - Pruned, R - RP-bit set, F - Register flag,
T - SPT-bit set, J - Join SPT, M - MSDP created entry,
X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
U - URD, I - Received Source Specific Host Report,
Z - Multicast Tunnel, z - MDT-data group sender,
Y - Joined MDT-data group, y - Sending to MDT-data group
Outgoing interface flags: H - Hardware switched, A - Assert winner
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(1.1.1.1, 239.1.1.1), 00:02:56/00:00:07, flags: PT
Incoming interface: FastEthernet0/0, RPF nbr 192.168.12.1
Outgoing interface list:
FastEthernet0/1, Prune/Dense, 00:02:56/00:00:03
R3#show ip mroute 1.1.1.1 239.1.1.1
IP Multicast Routing Table
Flags: D - Dense, S - Sparse, B - Bidir Group, s - SSM Group, C - Connected,
L - Local, P - Pruned, R - RP-bit set, F - Register flag,
T - SPT-bit set, J - Join SPT, M - MSDP created entry,
X - Proxy Join Timer Running, A - Candidate for MSDP Advertisement,
U - URD, I - Received Source Specific Host Report,
Z - Multicast Tunnel, z - MDT-data group sender,
Y - Joined MDT-data group, y - Sending to MDT-data group
Outgoing interface flags: H - Hardware switched, A - Assert winner
Timers: Uptime/Expires
Interface state: Interface, Next-Hop or VCD, State/Mode
(1.1.1.1, 239.1.1.1), 00:02:48/00:02:57, flags: T
Incoming interface: FastEthernet0/0, RPF nbr 192.168.13.1
Outgoing interface list:
FastEthernet0/1, Forward/Dense, 00:02:48/00:00:00, A
As you can see above, R2 has pruned its outgoing interface while R3 is forwarding it. Note that you also see the “A” indicating that R3 is the assert winner. R3 has won this PIM assert election because it has the highest IP address. Let’s change the AD on R2 to see if it becomes the new assert winner:
R2(config)#router ospf 1
R2(config-router)#distance 100 0.0.0.0 255.255.255.255 1
R2(config)#access-list 1 permit host 1.1.1.1
We will change the AD on R2 to 100 for all prefixes matching access-list 1. Access-list 1 matches 1.1.1.1, which is the source of our multicast stream.
Let’s verify our work:
R2#show ip route | include 1.1.1.1
O 1.1.1.1 [100/11] via 192.168.12.1, 00:01:32, FastEthernet0/0
R3#show ip route | include 1.1.1.1
O 1.1.1.1 [110/11] via 192.168.13.1, 00:01:20, FastEthernet0/0
R2 now has a better administrative distance, so it should win the PIM assert election; let’s see if this is true:
i did to change AD , it work
when i try to change metric, and make debugging which tell me is the winner, it is still give outbound prune
why?
my scenario is the same as your scenario
this is the result of the debug
FULL, Loading Done
*Mar 1 00:53:23.595: PIM(0): Received v2 Assert on Serial1/0 from 155.1.24.4
*Mar 1 00:53:23.595: PIM(0): Assert metric to source 3.3.3.3 is [110/75]
*Mar 1 00:53:23.599: PIM(0): We win, our metric [110/6]
*Mar 1 00:53:23.603: PIM(0): Prune Serial1/0/235.1.1.1 from (3.3.3.3/32, 235.1.1.1)
Mar 1 00:53:23.603: PIM(0): Pruning immediately Serial1/0 (p2p)
the serial 1/0 is the outbound interface which goes to receiver
Do you also have the debug for the other router?
Nice Article! Thanks Rene.
Thanks Tim!