Multicast PIM Assert Explained

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:

multicast assert

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.

Don’t confuse the PIM forwarder with the PIM DR (Designated Router). those are two different things!

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:

  1. 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.
  2. If the AD is equal, we will compare the unicast routing metric toward the source.
  3. 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.

Keep in mind that when we work with multicast, we are concerned about the source IP addresses, not destination IP addresses like with unicast routing.

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:

We're Sorry, Full Content Access is for Members Only...

If you like to keep on reading, Become a Member Now!

  • Learn any CCNA, CCNP and CCIE R&S Topic. Explained As Simple As Possible.
  • Try for Just $1. The Best Dollar You’ve Ever Spent on Your Cisco Career!
  • Full Access to our 799 Lessons. More Lessons Added Every Week!
  • Content created by Rene Molenaar (CCIE #41726)
542 Sign Ups in the last 30 days
satisfaction-guaranteed

  • 100% Satisfaction Guaranteed!
  • You may cancel your monthly membership at any time.
  • No Questions Asked!

Tags:


Forum Replies

  1. 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

  2. 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

  3. Do you also have the debug for the other router?

  4. Nice Article! Thanks Rene.

53 more replies! Ask a question or join the discussion by visiting our Community Forum