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