C1 IGMPv3 backward compatibility with IGMPv1 and IGMPv2 is not
   implemented. See RFC 3376, 7.3. Multicast Router Behavior. That's
   because only Source-Specific Multicast is currently targeted.

C2 IGMPv3 support for forwarding any-source groups is not
   implemented. Traffic for groups in mode EXCLUDE {empty} won't be
   forwarded.  See RFC 3376, 6.3. Source-Specific Forwarding
   Rules. That's because only Source-Specific Multicast is currently
   targeted.

C3 Load Splitting of IP Multicast Traffic over ECMP is not supported.
   See also: RFC 2991
   Multipath Issues in Unicast and Multicast Next-Hop Selection
   http://www.rfc-editor.org/rfc/rfc2991.txt

C4 IPSec AH authentication is not supported (RFC 4601:
   6.3. Authentication Using IPsec).

C5 PIM support is limited to SSM mode as defined in section 4.8.2
   (PIM-SSM-Only Routers) of RFC4601. That's because only
   Source-Specific Multicast is currently targeted.

C6 PIM implementation currently does not support IPv6. PIM-SSM
   requires IGMPv3 for IPv4 and MLDv2 for IPv6. MLDv2 is currently
   missing. See also CAVEAT C9.

C7 FIXED (S,G) Assert state machine (RFC 4601, section 4.6.1) is not
   implemented. See also TODO T6. See also CAVEAT C10.

C8 It is not possible to disable join suppression in order to
   explicitly track the join membership of individual downstream
   routers.
   - IGMPv3 Explicit Membership Tracking is not supported.
     When explicit tracking is enabled on a router, the router can
     individually track the Internet Group Management Protocol (IGMP)
     membership state of all reporting hosts. This feature allows the
     router to achieve minimal leave latencies when hosts leave a
     multicast group or channel. Example:
       conf t
        interface eth0
         ip igmp explicit-tracking

C9 Only IPv4 Address Family (number=1) is supported in the PIM Address
   Family field.
   See also RFC 4601: 5.1. PIM Address Family
   See also CAVEAT C6.
   See also http://www.iana.org/assignments/address-family-numbers

C10 FIXED Assert metric depends on metric_preference and
    route_metric. Those parameters should be fetched from RIB
    (zebra). See also pim_rpf.c, pim_rpf_update().

C11 SSM Mapping is not supported

    SSM Mapping Overview:

    SSM mapping introduces a means for the last hop router to discover
    sources sending to groups. When SSM mapping is configured, if a
    router receives an IGMPv1 or IGMPv2 membership report for a
    particular group G, the router translates this report into one or
    more (S, G) channel memberships for the well-known sources
    associated with this group.

    When the router receives an IGMPv1 or IGMPv2 membership report for
    a group G, the router uses SSM mapping to determine one or more
    source IP addresses for the group G. SSM mapping then translates
    the membership report as an IGMPv3 report INCLUDE (G, [S1, G],
    [S2, G]...[Sn, G] and continues as if it had received an IGMPv3
    report. The router then sends out PIM joins toward (S1, G) to (Sn,
    G) and continues to be joined to these groups as long as it
    continues to receive the IGMPv1 or IGMPv2 membership reports and
    as long as the SSM mapping for the group remains the same. SSM
    mapping, thus, enables you to leverage SSM for video delivery to
    legacy STBs that do not support IGMPv3 or for applications that do
    not take advantage of the IGMPv3 host stack.

    SSM mapping enables the last hop router to determine the source
    addresses either by a statically configured table on the router or
    by consulting a DNS server. When the statically configured table
    is changed, or when the DNS mapping changes, the router will leave
    the current sources associated with the joined groups.

C12 FIXED MRIB for incongruent unicast/multicast topologies is not
    supported.  RPF mechanism currently just looks up the information
    in the unicast routing table.

    See also:
    RFC5110: 2.2.3.  Issue: Overlapping Unicast/Multicast Topology
    
    Sometimes, multicast RPF mechanisms first look up the multicast
    routing table, or M-RIB ("topology database") with a longest
    prefix match algorithm, and if they find any entry (including a
    default route), that is used; if no match is found, the unicast
    routing table is used instead.

C13 Can't detect change of primary address before the actual change.
    Possible approach is to craft old interface address into ip source
    address by using raw ip socket.

    See also:

    RFC 4601: 4.3.1.  Sending Hello Messages

    Before an interface goes down or changes primary IP address, a
    Hello message with a zero HoldTime should be sent immediately
    (with the old IP address if the IP address changed).

    See also pim_sock_delete().

C14 FIXED Detection of interface primary address changes may fail when
    there are multiple addresses.
    See also TODO T32.

C15 Changes in interface secondary address list are not immediately
    detected.
    See also detect_secondary_address_change
    See also TODO T31.

C16 AMT Draft (mboned-auto-multicast) is not supported.
    AMT = Automatic IP Multicast Without Explicit Tunnels

    See also:

    Draft
    http://tools.ietf.org/html/draft-ietf-mboned-auto-multicast
    http://tools.ietf.org/html/draft-ietf-mboned-auto-multicast-09

    AMT gateway implementation for Linux
    http://cs.utdallas.edu/amt/

    AMT for Streaming (IPTV) on Global IP Multicast by Greg Shepherd (Cisco)
    http://nznog.miniconf.org/nznog-2008-sysadmin-miniconf-greg-shepherd-iptv.pdf

C17 SNMP / RFC 5060 (PIM MIB) is not supported.

C18 MFC never recovers from removal of static route to source

    # route add -host 1.2.3.4 gw 192.168.56.10
    Before removal:
    quagga-pimd-router# sh ip mroute
    Source          Group           Proto Input iVifI Output oVifI TTL Uptime
    1.2.3.4         232.1.2.3       I     eth1      3 eth0       2   1 00:00:36

    # route del -host 1.2.3.4 gw 192.168.56.10
    After removal: sh ip mroute --> empty output

    # route add -host 1.2.3.4 gw 192.168.56.10
    After the route is restored: sh ip mroute --> never recovers (empty output)

    At this point, "no ip pim ssm" on the upstream interface (eth0) crashes pimd:

    2014/02/14 16:30:14 PIM: ifmembership_set: (S,G)=(1.2.3.4,232.1.2.3) membership now is NOINFO on interface eth0
    2014/02/14 16:30:14 PIM: pim_ifchannel_update_assert_tracking_desired: AssertTrackingDesired(1.2.3.4,232.1.2.3,eth0) changed from 1 to 0
    2014/02/14 16:30:14 PIM: pim_zebra.c del_oif: nonexistent protocol mask 2 removed OIF eth0 (vif_index=2, min_ttl=0) from channel (S,G)=(1.2.3.4,232.1.2.3)
    2014/02/14 16:30:14 PIM: pim_ifchannel_update_could_assert: CouldAssert(1.2.3.4,232.1.2.3,eth0) changed from 1 to 0
    2014/02/14 16:30:14 PIM: pim_ifchannel_update_my_assert_metric: my_assert_metric(1.2.3.4,232.1.2.3,eth0) changed from 0,0,0,10.0.2.15 to 1,4294967295,4294967295,0.0.0.0
    2014/02/14 16:30:14 PIM: pim_zebra.c del_oif: nonexistent protocol mask 1 removed OIF eth0 (vif_index=2, min_ttl=0) from channel (S,G)=(1.2.3.4,232.1.2.3)
    2014/02/14 16:30:14 PIM: Assertion `!IGMP_SOURCE_TEST_FORWARDING(source->source_flags)' failed in file pim_igmpv3.c, line 412, function igmp_source_delete

C19 Provision to prevent group mode clash

    Beware group mode clash. A host/application issuing IGMPv2
    any-source joins for a group will disrupt SSM multicast for that
    group.

    For instance, support for source-specific static igmp WILL FAIL if
    there is host/application issuing IGMPv2 any-source joins for the
    same group.

    The reason is the IGMPv2 any-source join forces qpimd to switch
    the group mode to ASM (any-source multicast); however, qpimd is
    unable to program ASM groups into the kernel; multicast won't
    flow. There could be some provision to prevent such a behavior,
    but currently there is none.

-x-
