IPv6 Multicast

IPv6 multicast routing uses the same PIMv2 protocol that IPv4 routing does. The main difference with IPv6 multicast routing is the host signaling protocol, which is MLD (Multicast Listener Discovery) instead of IGMP.

IPv6 multicast allows you to use PIM-SM and PIM-SSM. Auto-RP, PIM-DM and MSDP are not supported for IPv6 multicast.

Addressing

IPv6 uses the FF00::/8 range for multicast addressing. The first two hex digits are always FF. IPv6 has built-in scoping for multicast using FF0X, where X indicates the scope.

Multicast Prefix

Scope

FF01

Interface local

FF02

Link local

FF04

Admin local

FF05

Site local

FF08

Organization local

FF0E

Global

SSM uses FF3X::/32

The mapping of IPv6 addresses onto MAC addresses is much more simple than IPv4 multicast addresses. The MAC prefix is 33:33:XX:XX:XX:XX. The last 32 bits of the IPv6 address map directly onto the MAC address. This is the last 8 hex digits.

For example, ff02::3d1:ff19:6fc6 maps to 33:33:ff:19:6f:c6

MLD (Multicast Listener Discovery)

MLD is used for host signaling in IPv6 multicast. MLDv1 is comparable to IGMPv2 and MLDv2 is copmarable to IGMPv3. MLDv2 allows for SSM. Cisco routers default to using MLDv2. You must specify MLDv1 if you wish to use it. (In comparison, routers default to using IGMPv2 for IPv4). Just like IGMPv3, MLDv2 is backwards compatible with MLDv1-only hosts.

Enabling IPv6 multicast routing

Enabling IPv6 multicast routing is extremely simple in IOS-XE. You simply turn on ipv6 multicast-routing globally. This command automatically enables PIMv2 and MLDv2 on all IPv6-enabled interfaces. (If you wish to disable PIM on an interface, use no ipv6 pim under the specific interface). Additionally, it automatically enables the PIM-SSM default range. This means that if you are using PIM-SSM, you simply need this one command for multicast traffic to work.

Lab

We’ll reuse the interdomain topology from the previous article. Enable IPv6 on all transit links and remove all ipv4 multicast configuration. Configure the loopbacks for 2001:db8:100::[R#]/128 for domain 1 and 2001:db8:200::[R#]/128 for domain 2. Finally, configure the subnets as noted in the topology:

#R1
ipv6 unicast-routing
!
int Gi1
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int Gi2
 no ip pim sparse-mode
 no ip address
 ipv6 address 2001:db8:100:100::1/64
 ipv6 ospf 1 area 0
!
int lo0
 ipv6 address 2001:db8:100::1/128
 ipv6 ospf 1 area 0
!
router ospfv3 1
 passive-interface Gi2
!
no router ospf 1

#R2
ipv6 unicast-routing
!
int Gi1
 no ip address
 ipv6 address 2001:db8:100:10::1/64
 no ip pim sparse-mode
 ipv6 ospf 1 area 0
!
int Gi2
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int lo0
 ipv6 address 2001:db8:100::2/128
 ipv6 ospf 1 area 0
!
router ospfv3 1
 passive-interface Gi1
!
no router ospf 1

#R3
ipv6 unicast-routing
!
no ip pim bsr-candidate lo0
no ip pim rp-candidate lo0
!
int Gi1
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int Gi2
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int Gi3
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int lo0
 ipv6 address 2001:db8:100::3/128
 ipv6 ospf 1 area 0
!
no router ospf 1

#R4
ipv6 unicast-routing
!
int Gi1
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 ospf 1 area 0
 ipv6 ospf network point-to-point
!
int Gi2
 no ip pim sparse-mode
 no ip pim bsr-border
 no ip address
 ipv6 address 2001:db8:45::4/64
!
int lo0
 ipv6 address 2001:db8:100::4/128
 ipv6 ospf 1 area 0
!
no router ospf 1

#R5
ipv6 unicast-routing
!
int Gi1
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 router isis
!
int Gi2
 no ip pim sparse-mode
 no ip pim bsr-border
 no ip address
 ipv6 address 2001:db8:45::5/64
!
int lo0
 ipv6 address 2001:db8:200::5/128
 ipv6 router isis

#R6
ipv6 unicast-routing
!
int Gi1
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 router isis
!
int Gi2
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 router isis
!
int lo0
 ipv6 address 2001:db8:200::6/128
 ipv6 router isis

#R7
ipv6 unicast-routing
!
int Gi1
 no ip pim sparse-mode
 no ip address
 ipv6 enable
 ipv6 router isis
!
int Gi2
 no ip pim sparse-mode
 no ip address
 ipv6 address 2001:db8:200:100::1/64
!
int lo0
 ipv6 address 2001:db8:200::7/128
 ipv6 router isis

#Source1
ipv6 unicast-routing
!
int Gi1
 no ip address
 ipv6 address 2001:db8:100:10::10/64
!
ipv6 route ::/0 2001:db8:100:10::1

#Host1
ipv6 unicast-routing
!
int Gi0/0
 no ip address
 ipv6 address 2001:db8:100:100::10/64
!
ipv6 route ::/0 2001:db8:100:100::1

#Host2
ipv6 unicast-routing
!
int Gi0/0
 no ip address
 ipv6 address 2001:db8:200:100::10/64
!
ipv6 route ::/0 2001:db8:200:100::1

Let’s now enable IPv6 multicast routing. Simply issue the command ipv6 multicast-routing on each router. This automatically enables PIMv2 on all interfaces, as well as MLDv2. Configure R3 and R6 to be the RP using BSR. Ensure that Bootstrap messages do not leak from domain 1 to domain 2 and vice versa.

#R1-R7
ipv6 multicast-routing

#R3
! You must specify an address instead of an interface when using BSR for IPv6
ipv6 pim bsr candidate bsr 2001:db8:100::3
ipv6 pim bsr candidate rp 2001:db8:100::3

#R4, R5
int Gi2
 ipv6 pim bsr border

#R6
ipv6 pim bsr candidate bsr 2001:db8:200::6
ipv6 pim bsr candidate rp 2001:db8:200::6

On Host1, join the group FF08::10

#Host1
int Gi0/0
 ipv6 mld join-group ff08::10

Just like IGMPv3, an ASM group join uses the “Exclude” type with zero sources. There are some additional default multicast group addresses that a router will join that you also see. ff02::2 is all routers. ff02::1:ff00:10 and ff02::1:ff1c:f402 are solicied node addresses that were automatically generated and I believe are used for ND (neighbor discovery).

The MLD Report message above uses a destination address of ff02::16 which is the multicast link-local address for all MLDv2 routers.

PIMv2 operates in the same manner when using IPv6 as when using IPv4. R3 will have state for (*, ff08::10) via a PIM Join.

R3#show ipv6 mroute

(*, FF08::10), 00:18:11/00:03:26, RP 2001:DB8:100::3, flags: S
  Incoming interface: Tunnel2
  RPF nbr: 2001:DB8:100::3
  Immediate Outgoing interface list:
    GigabitEthernet2, Forward, 00:18:11/00:03:26

You may notice that the incoming interface in this output looks different. Tunnel2 is automatically created and decapsulates PIM Register messages. This output is showing that the RP will accept traffic that is encapsulated in a PIM Register. This is actually no different from PIMv2 with IPv4 - the tunnel interface is always there. The difference is the output of the show command displaying the incoming interface as the tunnel interface.

R3#show int tun2
Tunnel2 is up, line protocol is up 
  Hardware is Tunnel
  Description: Pim Register Tunnel (Decap) for RP 2001:DB8:100::3

Ping ff08::10 from Source1. You must specify the output interface when pinging an IPv6 multicast address.

Source1#ping ff08::10 repeat 3
Output Interface: GigabitEthernet1      
Type escape sequence to abort.
Sending 3, 100-byte ICMP Echos to FF08::10, timeout is 2 seconds:
Packet sent with a source address of 2001:DB8:100:10::10

Reply to request 0 received from 2001:DB8:100:100::10, 48 ms
Reply to request 1 received from 2001:DB8:100:100::10, 5 ms
Reply to request 1 received from 2001:DB8:100:100::10, 35 ms
Reply to request 2 received from 2001:DB8:100:100::10, 5 ms
Success rate is 100 percent (3/3), round-trip min/avg/max = 5/23/48 ms
4 multicast replies and 0 errors.

The FHR sends a PIM Register to the RP via unicast. This is no different than IPv4.

The RP joins a (S, G) tree rooted at the source. Just like with IPv4 PIM-SM, the second ping is duplicated due to the latency between the Register-Stop and when the RP begins receiving traffic via the (S, G) distribution tree.

R3#show ipv6 mroute ff08::10

(*, FF08::10), 00:21:29/00:03:08, RP 2001:DB8:100::3, flags: S
  Incoming interface: Tunnel2
  RPF nbr: 2001:DB8:100::3
  Immediate Outgoing interface list:
    GigabitEthernet2, Forward, 00:21:29/00:03:08

(2001:DB8:100:10::10, FF08::10), 00:01:24/00:03:04, flags: ST
  Incoming interface: GigabitEthernet1
  RPF nbr: FE80::5054:FF:FE04:215B
  Immediate Outgoing interface list:
    GigabitEthernet2, Forward, 00:01:24/00:03:08

Interdomain multicast with PIM-SSM

Let’s now configure interdomain multicast. Host2 also wishes to receive traffic to ff08::10 from Source1. MSDP does not work for IPv6 multicast. We’ll use PIM-SSM to achieve interdomain multicast routing. The only requirement is for domain 2 to have a multicast route to the source. This can be via unicast or via the multicast RIB. We need to re-configure BGP at the ASBRs to use the IPv6 addresses. Internally we must also run ipv6 multicast within domain 2.

#R4
router bgp 100
 neighbor 2001:db8:45::5 remote-as 200
 address-family ipv6 multicast
  neighbor 2001:db8:45::5 activate
  network 2001:db8:100:10::/64

#R5
router bgp 200
 neighbor 2001:db8:45::4 remote-as 100
 address-family ipv6 multicast
  neighbor 2001:db8:45::4 activate
 
 ! We must also run ipv6 multicast internally within Domain 2
router bgp 200
 neighbor 2001:db8:200::6 remote-as 200
 neighbor 2001:db8:200::6 update-source lo0
 address-family ipv6 multicast
  neighbor 2001:db8:200::6 activate
  neighbor 2001:db8:200::6 next-hop-self

#R6
router bgp 200
 neighbor 2001:db8:200::5 remote-as 200
 neighbor 2001:db8:200::5 update-source lo0
 neighbor 2001:db8:200::7 remote-as 200
 neighbor 2001:db8:200::7 update-source lo0
 address-family ipv6 multicast
  neighbor 2001:db8:200::5 activate
  neighbor 2001:db8:200::5 route-reflector-client
  neighbor 2001:db8:200::7 activate
  neighbor 2001:db8:200::7 route-reflector-client

#R7
router bgp 200
 neighbor 2001:db8:200::6 remote-as 200
 neighbor 2001:db8:200::6 update-source lo0
 address-family ipv6 multicast
  neighbor 2001:db8:200::6 activate

We’ll now configure Host1 and Host2 to join the SSM group (2001:db8:100:10::10, ff08::10). To do this in IOS-XE, we must associate an ACL with the mld configuration statement. MLDv2 is also the default even when ipv6 multicast-routing is not configured. (In IPv4 we had to specify IGMPv3 on the hosts).

#Host1, Host2
ipv6 access-list SSM_SOURCE_LIST
 permit ipv6 2001:db8:100:10::10/128 any
!
int Gi0/0
 ipv6 mld join-group FF08::10 source-list SSM_SOURCE_LIST

On R7, verify the MLDv2 Join was seen:

R7#show ipv6 mld groups det  
Interface:      GigabitEthernet2
Group:          FF08::10
Uptime:         00:00:25
Router mode:    INCLUDE
Host mode:      INCLUDE
Last reporter:  FE80::5054:FF:FE14:3B55
Group source list:
Source Address                          Uptime    Expires   Fwd  Flags
2001:DB8:100:10::10                     00:00:25  00:04:17  Yes  Remote 4

On R5 you should see state for this SSM entry.

R5#show ipv6 mroute 

(2001:DB8:100:10::10, FF08::10), 00:01:20/00:03:11, flags: ST
  Incoming interface: GigabitEthernet2
  RPF nbr: FE80::5054:FF:FE18:7FBD
  Immediate Outgoing interface list:
    GigabitEthernet1, Forward, 00:01:20/00:03:11

On all routers in domain 2, the ipv6 mroute table was consulted to determine the RPF interface. R5 will accept traffic incoming on Gi2 and forward out Gi1.

R5 also sent a PIM Join to R4, so R4 has state for this entry as well.

R4#show ipv6 mroute

(2001:DB8:100:10::10, FF08::10), 00:02:17/00:03:18, flags: ST
  Incoming interface: GigabitEthernet1
  RPF nbr: FE80::5054:FF:FE1D:4502
  Immediate Outgoing interface list:
    GigabitEthernet2, Forward, 00:02:17/00:03:18

A ping from Source1 to ff08::10 should be seen at Host2, although the ICMP Reply will not be deliverable, due to the unicast route missing from domain 2. An ICMPv6 debug is not working for me on Host2, perhaps due to a limitation with IOSv. Instead I’ve taken a pcap on the link:

Source1#ping ff08::10   
Output Interface: GigabitEthernet1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to FF08::10, timeout is 2 seconds:
Packet sent with a source address of 2001:DB8:100:10::10

Reply to request 0 received from 2001:DB8:100:100::10, 12 ms
Reply to request 1 received from 2001:DB8:100:100::10, 4 ms
Reply to request 2 received from 2001:DB8:100:100::10, 7 ms
Reply to request 3 received from 2001:DB8:100:100::10, 5 ms
Reply to request 4 received from 2001:DB8:100:100::10, 6 ms
Success rate is 100 percent (5/5), round-trip min/avg/max = 4/6/12 ms
5 multicast replies and 0 errors.

Conclusion

IPv6 multicast routing is very similar to IPv4 multicast routing. Operations of the PIMv2 protocol are nearly identical. Legacy PIM modes (PIM-DM) and RP discovery protocols (Auto-RP) are not available. Additionally, MSDP is not available. In terms of configuration, IPv6 multicast is extremely easy to configure. The global command ipv6 multicast-routing enables PIMv2 and MLDv2 on all interfaces automatically.

The IPv6 multicast address range is FF00::/8. The MAC addresses use 33:33:XX:XX:XX:XX, where the last 32 bits of the IPv6 address map to the MAC address.

The major difference with IPv6 multicasting is the host signaling protocol, which is MLD. However, MLD is operationally very similar to IGMP. MLDv1 is similar to IGMPv2, and MLDv2 (the default) is similar to IGMPv3.

Last updated