Implementing Source-Specific Multicast (SSM) on Cisco IOS…
I read over RFC 3569 (overview of SSM) and decided to try my hand at SSM in my lab environment. I configured a lab environment as follows:
The above is fairly self-explanatory, so I won't go into the details. The relevant portions of the configurations are provided below:
R1:
ip multicast-routing
!
interface Loopback0
ip address 10.10.10.10 255.255.255.255
ip pim sparse-dense-mode
!
interface Serial2/0
ip address 10.0.0.5 255.255.255.252
ip pim sparse-dense-mode
serial restart-delay 0
clock rate 128000
!
interface Serial2/1
ip address 10.0.0.1 255.255.255.252
ip pim sparse-dense-mode
serial restart-delay 0
clock rate 128000
!
router ospf 1
router-id 1.1.1.1
log-adjacency-changes
network 10.0.0.0 0.0.0.255 area 0
network 10.10.10.10 0.0.0.0 area 0
!
ip pim send-rp-discovery Loopback0 scope 16
R2:
ip multicast-routing
!
interface Loopback0
ip address 172.16.32.3 255.255.255.255
ip pim sparse-dense-mode
!
interface FastEthernet1/0
ip address 192.168.1.1 255.255.255.0
ip pim dr-priority 1000
ip pim sparse-dense-mode
duplex auto
speed auto
!
interface Serial2/0
ip address 10.0.0.6 255.255.255.252
ip pim sparse-dense-mode
serial restart-delay 0
!
router ospf 1
router-id 2.2.2.2
log-adjacency-changes
network 10.0.0.0 0.0.0.255 area 0
network 172.16.32.0 0.0.0.255 area 0
network 192.168.1.0 0.0.0.255 area 0
!
ip pim send-rp-announce Loopback0 scope 16
ip msdp peer 10.0.0.2 connect-source Serial2/0
R3:
ip multicast-routing
!
interface Loopback0
ip address 172.16.32.3 255.255.255.255
ip pim sparse-dense-mode
!
interface FastEthernet1/0
ip address 192.168.10.1 255.255.255.0
ip pim dr-priority 1000
ip pim sparse-dense-mode
duplex auto
speed auto
!
interface Serial2/0
ip address 10.0.0.2 255.255.255.252
ip pim sparse-dense-mode
serial restart-delay 0
no fair-queue
!
router ospf 1
router-id 3.3.3.3
log-adjacency-changes
network 10.0.0.0 0.0.0.255 area 0
network 172.16.32.0 0.0.0.255 area 0
network 192.168.10.0 0.0.0.255 area 0
!
ip pim send-rp-announce Loopback0 scope 16
ip pim ssm default
ip msdp peer 10.0.0.6 connect-source Serial2/0
R4:
ip multicast-routing
!
interface Loopback0
ip address 10.4.4.4 255.255.255.255
ip pim sparse-dense-mode
ip igmp join-group 232.4.11.4 source 192.168.10.5
ip igmp join-group 239.4.11.4
ip igmp version 3
!
interface FastEthernet1/0
ip address 192.168.1.4 255.255.255.0
ip pim sparse-dense-mode
ip igmp version 3
duplex auto
speed auto
!
router ospf 1
router-id 4.4.4.4
log-adjacency-changes
network 10.4.4.0 0.0.0.255 area 0
network 192.168.1.0 0.0.0.255 area 0
!
R5:
ip multicast-routing
!
interface FastEthernet1/0
ip address 192.168.10.5 255.255.255.0
ip pim sparse-dense-mode
duplex auto
speed auto
!
router ospf 1
router-id 5.5.5.5
log-adjacency-changes
network 192.168.10.0 0.0.0.255 area 0
!
Based on the above configs, my goal was to have R4 join two multicast groups: 239.4.11.4 and 232.4.11.4. Obviously, since the 232.0.0.0/8 prefix is for SSM, I assumed that the routers would follow the guidelines in RFC 3569. I thought that since the 232.4.11.4 was in the SSM range, that the routers would react accordingly. This meant that the routers would not send (nor would the RPs accept) (*,232.4.11.4) joins/registers. I expectantly looked at the sho ip mroute output on R4 and R2 (R2 was the closest anycast-RP and would therefore be used in this scenario). Below is what I found:
r4#sho ip mroute
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
(*, 239.4.11.4), 00:00:40/stopped, RP 172.16.32.3, flags: SJCL
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:00:40/00:02:19
(*, 232.4.11.4), 00:00:30/00:02:42, RP 172.16.32.3, flags: SJCL
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:00:30/00:02:42
(*, 224.0.1.39), 00:35:43/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:35:43/00:00:00
(172.16.32.3, 224.0.1.39), 00:01:17/00:01:42, flags: PT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
(*, 224.0.1.40), 00:36:18/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:36:18/00:00:00
(10.10.10.10, 224.0.1.40), 00:34:45/00:02:43, flags: PLT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
r4#
Notice that even IGMP is running version 3 (this can be confirmed via the show ip igmp interface command, which will show IGMP details for all interfaces running IGMP, including the send and receive version), PIM isn't responding in a SSM-way. The router's using the shared tree (*, 232.4.11.4) rather than the source tree.
Okay, now I had to check the RP (R2):
r2#sho ip mroute
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
(*, 239.4.11.4), 00:02:54/00:02:33, RP 172.16.32.3, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:02:54/00:02:33
(*, 232.4.11.4), 00:12:08/00:02:17, RP 172.16.32.3, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:02:45/00:02:43
(*, 224.0.1.39), 00:37:59/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:37:38/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:37:46/00:00:00
(172.16.32.3, 224.0.1.39), 00:37:59/00:02:29, flags: TA
Incoming interface: Loopback0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Prune/Sparse-Dense, 00:00:30/00:02:38
Serial2/0, Forward/Sparse-Dense, 00:37:46/00:00:00
(*, 224.0.1.40), 00:38:14/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:37:39/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:37:46/00:00:00
Loopback0, Forward/Sparse-Dense, 00:38:14/00:00:00
(10.10.10.10, 224.0.1.40), 00:36:58/00:02:30, flags: LTA
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:36:58/00:00:00
FastEthernet1/0, Forward/Sparse-Dense, 00:36:58/00:00:00
r2#
Ouch! Obviously the RP wasn't following the RFC guidelines either! I was surprised. I thought that maybe the client was being "lazy" and not following the RFC guidelines, but I thought that for sure the Cisco IOS PIM-SM RP implementation would follow RFC 3569.
I thought about it and realized that possibly I needed to specify the groups that the RPs are handling, so I tried it. On R2 and R3 (I only showed R2 - the same commands were entered on R3) I configured the following commands:
r2(config)#access-list 1 deny 232.0.0.0 0.255.255.255
r2(config)#access-list 1 permit any
r2(config)#ip pim send-rp-announce lo0 scope 16 group-list 1
After that, I checked out the RP mapping on R4:
r4#sho ip pim rp map
PIM Group-to-RP Mappings
Group(s) 224.0.0.0/4
RP 172.16.32.3 (?), v2v1
Info source: 10.10.10.10 (?), elected via Auto-RP
Uptime: 00:41:35, expires: 00:02:08
Group(s) (-)232.0.0.0/8
RP 172.16.32.3 (?), v2v1
Info source: 10.10.10.10 (?), elected via Auto-RP
Uptime: 00:01:08, expires: 00:02:46
r4#
R2 wasn't showing the SSM group (232.4.11.4) anymore in its mroute (so far, a good sign!):
r2#sho ip mroute
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
(*, 239.4.11.4), 00:09:23/00:02:56, RP 172.16.32.3, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:09:23/00:02:56
(*, 224.0.1.39), 00:44:28/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:44:07/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:44:14/00:00:00
(172.16.32.3, 224.0.1.39), 00:44:28/00:02:19, flags: TA
Incoming interface: Loopback0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Prune/Sparse-Dense, 00:00:40/00:02:29
Serial2/0, Forward/Sparse-Dense, 00:44:15/00:00:00
(*, 224.0.1.40), 00:44:42/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:44:08/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:44:15/00:00:00
Loopback0, Forward/Sparse-Dense, 00:44:43/00:00:00
(10.10.10.10, 224.0.1.40), 00:43:27/00:02:23, flags: LTA
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:43:27/00:00:00
FastEthernet1/0, Forward/Sparse-Dense, 00:43:27/00:00:00
r2#
Voila! So far things were looking good - the SSM range was excluded in the RP mapping, so it should work right, right? Well, take a look at the multicast routing table on R4:
r4#sho ip mroute
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
(*, 239.4.11.4), 00:08:58/00:00:43, RP 172.16.32.3, flags: SJCL
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:08:58/00:00:43
(*, 232.4.11.4), 00:02:16/00:02:22, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:02:16/00:00:00
FastEthernet1/0, Forward/Sparse-Dense, 00:02:16/00:00:00
(*, 224.0.1.39), 00:44:02/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:44:02/00:00:00
(172.16.32.3, 224.0.1.39), 00:00:14/00:02:45, flags: PT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
(*, 224.0.1.40), 00:44:35/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:44:35/00:00:00
(10.10.10.10, 224.0.1.40), 00:43:02/00:02:41, flags: PLT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
r4#
This isn't good - it's still using sparse-mode and it's not requesting the specific source. Looking back at the config, I have IGMPv3 (required for IPv4 SSM to work - IGMPv1/v2 don't support specifying the source) and in the router's IGMP join, I've specified the source, so what gives?!
Well, I searched the 'net, looking for Cisco SSM and found several older documents, but it sent me in the right direction. Like a goof-ball, I'd failed to look at the IOS command reference. Lo and behold, there's a command specifically for enabling SSM support!
I went back to R2 and R3 and removed the group-list filter on both RPs:
r2(config)#ip pim send-rp-announce lo0 scope 16
Then I added the wonderful command on all of the routers (r1-r5) in the network to enable SSM handling of multicast traffic. To do this, I entered the following command:
r1(config)#ip pim ssm default
This told the router to enable SSM on the local host. Note that this is specific to the local host - you can't turn it on your RPs or mapping agents or any other single router in your multicast domain and expect it to turn on SSM-handling for the entire domain - each router must have SSM turned on.
Now take a look at the multicast routing tables on R2 and R4:
r2#sho ip mroute
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
(*, 239.4.11.4), 00:16:27/00:03:13, RP 172.16.32.3, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:16:27/00:03:13
(192.168.10.5, 232.4.11.4), 00:00:27/00:03:02, flags: sT
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:00:27/00:03:02
(*, 224.0.1.39), 00:51:32/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:51:11/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:51:19/00:00:00
(172.16.32.3, 224.0.1.39), 00:51:32/00:02:13, flags: TA
Incoming interface: Loopback0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Prune/Sparse-Dense, 00:00:47/00:02:14
Serial2/0, Forward/Sparse-Dense, 00:51:19/00:00:00
(*, 224.0.1.40), 00:51:47/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:51:12/00:00:00
Serial2/0, Forward/Sparse-Dense, 00:51:19/00:00:00
Loopback0, Forward/Sparse-Dense, 00:51:47/00:00:00
(10.10.10.10, 224.0.1.40), 00:50:32/00:02:18, flags: LTA
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:50:32/00:00:00
FastEthernet1/0, Forward/Sparse-Dense, 00:50:32/00:00:00
r2#
r4#sho ip mroute
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
(*, 239.4.11.4), 00:05:34/stopped, RP 172.16.32.3, flags: SJCL
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:05:34/00:00:26
(192.168.10.5, 232.4.11.4), 00:00:46/00:02:34, flags: sLTI
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 00:00:46/00:02:34
(*, 224.0.1.39), 00:05:03/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:05:03/00:00:00
(172.16.32.3, 224.0.1.39), 00:01:05/00:01:54, flags: PT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
(*, 224.0.1.40), 00:05:09/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:05:09/00:00:00
(10.10.10.10, 224.0.1.40), 00:05:09/00:02:55, flags: PLT
Incoming interface: FastEthernet1/0, RPF nbr 192.168.1.1
Outgoing interface list: Null
r4#
This is great - it's now registering the SSM address as a SSM host, and it's doing that across the network. To test this, I pinged 232.4.11.4 from r3:
r3#ping 232.4.11.4
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 232.4.11.4, timeout is 2 seconds:
.
r3#
… and pinged 232.4.11.4 from r5:
r5#ping 232.4.11.4
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 232.4.11.4, timeout is 2 seconds:
Reply to request 0 from 192.168.1.4, 308 ms
r5#
It's alive!!! It's working - I'm happy. You're happy. We're all happy. Moving on now…
By using the ip pim ssm default command, you're telling the router to handle 232/8 traffic as SSM traffic and to follow the guidelines specified in the RFC. Handling of traffic outside of this range will not be treated in a SSM way, even if a source is specified. Examine what happens when I join the 239.4.11.4 group with a source of 192.168.10.5 (R5). To do this:
r4(config)#int lo0
r4(config-if)#ip igmp join 239.4.11.4 source 192.168.10.5
Now, on R5:
r5#ping 239.4.11.4
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 239.4.11.4, timeout is 2 seconds:
Reply to request 0 from 192.168.1.4, 1272 ms
r5#
To try a different source (R1):
r1#ping 239.4.11.4
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 239.4.11.4, timeout is 2 seconds:
Reply to request 0 from 192.168.1.4, 380 ms
Reply to request 0 from 192.168.1.4, 384 ms
Reply to request 0 from 192.168.1.4, 384 ms
r1#
Look at the multicast routing table on R2 (R4's RP):
r2#sho ip mroute
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
(*, 239.4.11.4), 00:36:21/00:03:05, RP 172.16.32.3, flags: S
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:36:21/00:03:05
(10.0.0.1, 239.4.11.4), 00:00:52/00:02:07, flags: M
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:00:52/00:03:05
(10.0.0.5, 239.4.11.4), 00:00:52/00:02:38, flags: TA
Incoming interface: Serial2/0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:00:52/00:03:04
(10.10.10.10, 239.4.11.4), 00:00:52/00:02:07, flags: A
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:00:52/00:03:04
(192.168.10.5, 239.4.11.4), 00:00:59/00:02:01, flags: M
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:00:59/00:03:29
(192.168.10.5, 232.4.11.4), 00:07:28/00:02:57, flags: sT
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 00:07:28/00:02:57
(*, 224.0.1.39), 01:11:26/stopped, RP 0.0.0.0, flags: D
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 01:11:06/00:00:00
Serial2/0, Forward/Sparse-Dense, 01:11:13/00:00:00
(172.16.32.3, 224.0.1.39), 01:11:26/00:02:31, flags: TA
Incoming interface: Loopback0, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Prune/Sparse-Dense, 00:04:30/00:01:34
Serial2/0, Forward/Sparse-Dense, 01:11:13/00:00:00
(*, 224.0.1.40), 01:11:41/stopped, RP 0.0.0.0, flags: DCL
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
FastEthernet1/0, Forward/Sparse-Dense, 01:11:06/00:00:00
Serial2/0, Forward/Sparse-Dense, 01:11:14/00:00:00
Loopback0, Forward/Sparse-Dense, 01:11:41/00:00:00
(10.10.10.10, 224.0.1.40), 01:10:26/00:02:20, flags: LTA
Incoming interface: Serial2/0, RPF nbr 10.0.0.5
Outgoing interface list:
Loopback0, Forward/Sparse-Dense, 01:10:26/00:00:00
FastEthernet1/0, Forward/Sparse-Dense, 01:10:26/00:00:00
r2#
Notice the shared tree (*, 239.4.11.4) entry above. SSM rules aren't being used here - because the router is looking to treat traffic in the default SSM range (232/8) only as SSM traffic. All other traffic, even if the client is requesting a particular source (the client wants SSM treatment), is handled as regular multicast (RFC 3569 calls this "Any-Source Multicast").
You can change what range(s) are treated in a SSM-way, rather than using the default keyword, use the range keyword and specify an ACL (which specifies what range(s) should be treated as SSM).
In summary: Hopefully this short rant of an article will provide someone out there with a better understanding of the SSM implementation in the Cisco IOS. SSM does work on Cisco IOS 12.4 (didn't have doubts that it didn't prior to this, but I'd never previously implemented it) - it helps to know the command to enable SSM behavior on the router!