<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" docName="draft-ietf-pim-3810bis-12" number="9777" ipr="pre5378trust200902" updates="2710" obsoletes="3810" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" prepTime="2025-03-28T12:02:10" indexInclude="true" scripts="Common,Latin" tocDepth="3">
  <link href="https://datatracker.ietf.org/doc/draft-ietf-pim-3810bis-12" rel="prev"/>
  <link href="https://dx.doi.org/10.17487/rfc9777" rel="alternate"/>
  <link href="urn:issn:2070-1721" rel="alternate"/>
  <front>
    <title abbrev="MLDv2 for IPv6">Multicast Listener Discovery Version 2 (MLDv2) for IPv6</title>
    <seriesInfo name="RFC" value="9777" stream="IETF"/>
    <seriesInfo name="STD" value="101" stream="IETF"/>
    <author fullname="Brian Haberman" initials="B." surname="Haberman" role="editor">
      <organization abbrev="JHU APL" showOnFrontPage="true">Johns Hopkins University Applied Physics Lab</organization>
      <address>
        <email>brian@innovationslab.net</email>
      </address>
    </author>
    <date month="03" year="2025"/>
    <area>RTG</area>
    <workgroup>pim</workgroup>
    <abstract pn="section-abstract">
      <t indent="0" pn="section-abstract-1">This document specifies the
   Multicast Listener Discovery version 2 (MLDv2) protocol.  MLD is used by an
   IPv6 router to discover the presence of multicast listeners on
   directly attached links and to discover which multicast addresses
   are of interest to those neighboring nodes.  MLDv2 is designed to be
   interoperable with MLDv1.  MLDv2 adds the ability for a node to
   report interest in listening to packets with a particular multicast
   address only from specific source addresses or from all sources
   except for specific source addresses.</t>
      <t indent="0" pn="section-abstract-2">This document updates RFC 2710 and obsoletes RFC 3810.</t>
    </abstract>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t indent="0" pn="section-boilerplate.1-1">
            This is an Internet Standards Track document.
        </t>
        <t indent="0" pn="section-boilerplate.1-2">
            This document is a product of the Internet Engineering Task Force
            (IETF).  It represents the consensus of the IETF community.  It has
            received public review and has been approved for publication by
            the Internet Engineering Steering Group (IESG).  Further
            information on Internet Standards is available in Section 2 of 
            RFC 7841.
        </t>
        <t indent="0" pn="section-boilerplate.1-3">
            Information about the current status of this document, any
            errata, and how to provide feedback on it may be obtained at
            <eref target="https://www.rfc-editor.org/info/rfc9777" brackets="none"/>.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t indent="0" pn="section-boilerplate.2-1">
            Copyright (c) 2025 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t indent="0" pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Revised BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Revised BSD License.
        </t>
        <t indent="0" pn="section-boilerplate.2-3">
            This document may contain material from IETF Documents or IETF
            Contributions published or made publicly available before November
            10, 2008. The person(s) controlling the copyright in some of this
            material may not have granted the IETF Trust the right to allow
            modifications of such material outside the IETF Standards Process.
            Without obtaining an adequate license from the person(s)
            controlling the copyright in such materials, this document may not
            be modified outside the IETF Standards Process, and derivative
            works of it may not be created outside the IETF Standards Process,
            except to format it for publication as an RFC or to translate it
            into languages other than English.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-conventions-used-in-this-do">Conventions Used in This Document</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t indent="0" pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-protocol-overview">Protocol Overview</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t indent="0" keepWithNext="true" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-building-multicast-address-">Building Multicast Address Listening State on Multicast Address Listeners</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.2">
                <t indent="0" pn="section-toc.1-1.2.2.2.1"><xref derivedContent="2.2" format="counter" sectionFormat="of" target="section-2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-exchanging-messages-between">Exchanging Messages between the Querier and the Listening Nodes</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.3">
                <t indent="0" pn="section-toc.1-1.2.2.3.1"><xref derivedContent="2.3" format="counter" sectionFormat="of" target="section-2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-building-multicast-address-l">Building Multicast Address Listening State on Multicast Routers</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t indent="0" pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-service-interface-for-r">The Service Interface for Requesting IP Multicast Reception</xref></t>
          </li>
          <li pn="section-toc.1-1.4">
            <t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-listening">Multicast Address Listening State Maintained by Nodes</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t indent="0" pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-per-socket-state">Per-Socket State</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t indent="0" pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-per-interface-state">Per-Interface State</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-message-formats">Message Formats</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t indent="0" pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-listener-query-me">Multicast Listener Query Message</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2.1.2">
                  <li pn="section-toc.1-1.5.2.1.2.1">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.1.1"><xref derivedContent="5.1.1" format="counter" sectionFormat="of" target="section-5.1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-code">Code</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.2">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.2.1"><xref derivedContent="5.1.2" format="counter" sectionFormat="of" target="section-5.1.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-checksum">Checksum</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.3">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.3.1"><xref derivedContent="5.1.3" format="counter" sectionFormat="of" target="section-5.1.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-maximum-response-code">Maximum Response Code</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.4">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.4.1"><xref derivedContent="5.1.4" format="counter" sectionFormat="of" target="section-5.1.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-reserved">Reserved</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.5">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.5.1"><xref derivedContent="5.1.5" format="counter" sectionFormat="of" target="section-5.1.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address">Multicast Address</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.6">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.6.1"><xref derivedContent="5.1.6" format="counter" sectionFormat="of" target="section-5.1.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-flags">Flags</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.7">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.7.1"><xref derivedContent="5.1.7" format="counter" sectionFormat="of" target="section-5.1.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-s-flag-suppress-router-side">S Flag (Suppress Router-Side Processing)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.8">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.8.1"><xref derivedContent="5.1.8" format="counter" sectionFormat="of" target="section-5.1.8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-qrv-queriers-robustness-var">QRV (Querier's Robustness Variable)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.9">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.9.1"><xref derivedContent="5.1.9" format="counter" sectionFormat="of" target="section-5.1.9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-qqic-queriers-query-interva">QQIC (Querier's Query Interval Code)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.10">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.10.1"><xref derivedContent="5.1.10" format="counter" sectionFormat="of" target="section-5.1.10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-number-of-sources-n">Number of Sources (N)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.11">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.11.1"><xref derivedContent="5.1.11" format="counter" sectionFormat="of" target="section-5.1.11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-source-address-i">Source Address [i]</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.12">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.12.1"><xref derivedContent="5.1.12" format="counter" sectionFormat="of" target="section-5.1.12"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-additional-data">Additional Data</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.13">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.13.1"><xref derivedContent="5.1.13" format="counter" sectionFormat="of" target="section-5.1.13"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-query-variants">Query Variants</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.14">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.14.1"><xref derivedContent="5.1.14" format="counter" sectionFormat="of" target="section-5.1.14"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-source-addresses-for-querie">Source Addresses for Queries</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.1.2.15">
                    <t indent="0" pn="section-toc.1-1.5.2.1.2.15.1"><xref derivedContent="5.1.15" format="counter" sectionFormat="of" target="section-5.1.15"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-destination-addresses-for-q">Destination Addresses for Queries</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t indent="0" pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-version-2-multicast-listene">Version 2 Multicast Listener Report Message</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2.2.2">
                  <li pn="section-toc.1-1.5.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.1.1"><xref derivedContent="5.2.1" format="counter" sectionFormat="of" target="section-5.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-reserved-2">Reserved</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.2.1"><xref derivedContent="5.2.2" format="counter" sectionFormat="of" target="section-5.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-checksum-2">Checksum</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.3">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.3.1"><xref derivedContent="5.2.3" format="counter" sectionFormat="of" target="section-5.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-flags-2">Flags</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.4">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.4.1"><xref derivedContent="5.2.4" format="counter" sectionFormat="of" target="section-5.2.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-nr-of-mcast-address-records">Nr of Mcast Address Records (M)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.5">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.5.1"><xref derivedContent="5.2.5" format="counter" sectionFormat="of" target="section-5.2.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-record">Multicast Address Record</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.6">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.6.1"><xref derivedContent="5.2.6" format="counter" sectionFormat="of" target="section-5.2.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-record-type">Record Type</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.7">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.7.1"><xref derivedContent="5.2.7" format="counter" sectionFormat="of" target="section-5.2.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-aux-data-len">Aux Data Len</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.8">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.8.1"><xref derivedContent="5.2.8" format="counter" sectionFormat="of" target="section-5.2.8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-number-of-sources-n-2">Number of Sources (N)</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.9">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.9.1"><xref derivedContent="5.2.9" format="counter" sectionFormat="of" target="section-5.2.9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-2">Multicast Address</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.10">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.10.1"><xref derivedContent="5.2.10" format="counter" sectionFormat="of" target="section-5.2.10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-source-address-i-2">Source Address [i]</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.11">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.11.1"><xref derivedContent="5.2.11" format="counter" sectionFormat="of" target="section-5.2.11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-auxiliary-data">Auxiliary Data</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.12">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.12.1"><xref derivedContent="5.2.12" format="counter" sectionFormat="of" target="section-5.2.12"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-additional-data-2">Additional Data</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.13">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.13.1"><xref derivedContent="5.2.13" format="counter" sectionFormat="of" target="section-5.2.13"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-record-ty">Multicast Address Record Types</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.14">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.14.1"><xref derivedContent="5.2.14" format="counter" sectionFormat="of" target="section-5.2.14"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-source-addresses-for-report">Source Addresses for Reports</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.15">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.15.1"><xref derivedContent="5.2.15" format="counter" sectionFormat="of" target="section-5.2.15"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-destination-addresses-for-r">Destination Addresses for Reports</xref></t>
                  </li>
                  <li pn="section-toc.1-1.5.2.2.2.16">
                    <t indent="0" pn="section-toc.1-1.5.2.2.2.16.1"><xref derivedContent="5.2.16" format="counter" sectionFormat="of" target="section-5.2.16"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-listener-report-s">Multicast Listener Report Size</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-protocol-description-for-mu">Protocol Description for Multicast Address Listeners</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t indent="0" pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-action-on-change-of-per-int">Action on Change of Per-Interface State</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t indent="0" pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-action-on-reception-of-a-qu">Action on Reception of a Query</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.3">
                <t indent="0" pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" format="counter" sectionFormat="of" target="section-6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-action-on-timer-expiration">Action on Timer Expiration</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-description-of-the-protocol">Description of the Protocol for Multicast Routers</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t indent="0" pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-conditions-for-mld-queries">Conditions for MLD Queries</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t indent="0" pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-mld-state-maintained-by-mul">MLD State Maintained by Multicast Routers</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.2.2">
                  <li pn="section-toc.1-1.7.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.2.2.1.1"><xref derivedContent="7.2.1" format="counter" sectionFormat="of" target="section-7.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-definition-of-router-filter">Definition of Router Filter Mode</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.7.2.2.2.2.1"><xref derivedContent="7.2.2" format="counter" sectionFormat="of" target="section-7.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-definition-of-filter-timers">Definition of Filter Timers</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.2.2.3">
                    <t indent="0" pn="section-toc.1-1.7.2.2.2.3.1"><xref derivedContent="7.2.3" format="counter" sectionFormat="of" target="section-7.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-definition-of-source-timers">Definition of Source Timers</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.7.2.3">
                <t indent="0" pn="section-toc.1-1.7.2.3.1"><xref derivedContent="7.3" format="counter" sectionFormat="of" target="section-7.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-mldv2-source-specific-forwa">MLDv2 Source-Specific Forwarding Rules</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.4">
                <t indent="0" pn="section-toc.1-1.7.2.4.1"><xref derivedContent="7.4" format="counter" sectionFormat="of" target="section-7.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-action-on-reception-of-repo">Action on Reception of Reports</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.4.2">
                  <li pn="section-toc.1-1.7.2.4.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.1.1"><xref derivedContent="7.4.1" format="counter" sectionFormat="of" target="section-7.4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-reception-of-current-state-">Reception of Current-State Records</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.4.2.2">
                    <t indent="0" pn="section-toc.1-1.7.2.4.2.2.1"><xref derivedContent="7.4.2" format="counter" sectionFormat="of" target="section-7.4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-reception-of-filter-mode-ch">Reception of Filter-Mode-Change and Source-List-Change Records</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.7.2.5">
                <t indent="0" pn="section-toc.1-1.7.2.5.1"><xref derivedContent="7.5" format="counter" sectionFormat="of" target="section-7.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-switching-router-filter-mod">Switching Router Filter Modes</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.6">
                <t indent="0" pn="section-toc.1-1.7.2.6.1"><xref derivedContent="7.6" format="counter" sectionFormat="of" target="section-7.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-action-on-reception-of-quer">Action on Reception of Queries</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2.6.2">
                  <li pn="section-toc.1-1.7.2.6.2.1">
                    <t indent="0" pn="section-toc.1-1.7.2.6.2.1.1"><xref derivedContent="7.6.1" format="counter" sectionFormat="of" target="section-7.6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-timer-updates">Timer Updates</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.6.2.2">
                    <t indent="0" pn="section-toc.1-1.7.2.6.2.2.1"><xref derivedContent="7.6.2" format="counter" sectionFormat="of" target="section-7.6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-querier-election">Querier Election</xref></t>
                  </li>
                  <li pn="section-toc.1-1.7.2.6.2.3">
                    <t indent="0" pn="section-toc.1-1.7.2.6.2.3.1"><xref derivedContent="7.6.3" format="counter" sectionFormat="of" target="section-7.6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-building-and-sending-specif">Building and Sending Specific Queries</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter" sectionFormat="of" target="section-8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-interoperation-with-mldv1">Interoperation with MLDv1</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.8.2">
              <li pn="section-toc.1-1.8.2.1">
                <t indent="0" pn="section-toc.1-1.8.2.1.1"><xref derivedContent="8.1" format="counter" sectionFormat="of" target="section-8.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-version-distinctions">Query Version Distinctions</xref></t>
              </li>
              <li pn="section-toc.1-1.8.2.2">
                <t indent="0" pn="section-toc.1-1.8.2.2.1"><xref derivedContent="8.2" format="counter" sectionFormat="of" target="section-8.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-listener-">Multicast Address Listener Behavior</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.8.2.2.2">
                  <li pn="section-toc.1-1.8.2.2.2.1">
                    <t indent="0" pn="section-toc.1-1.8.2.2.2.1.1"><xref derivedContent="8.2.1" format="counter" sectionFormat="of" target="section-8.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-in-the-presence-of-mldv1-ro">In the Presence of MLDv1 Routers</xref></t>
                  </li>
                  <li pn="section-toc.1-1.8.2.2.2.2">
                    <t indent="0" pn="section-toc.1-1.8.2.2.2.2.1"><xref derivedContent="8.2.2" format="counter" sectionFormat="of" target="section-8.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-in-the-presence-of-mldv1-mu">In the Presence of MLDv1 Multicast Address Listeners</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.8.2.3">
                <t indent="0" pn="section-toc.1-1.8.2.3.1"><xref derivedContent="8.3" format="counter" sectionFormat="of" target="section-8.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-router-behavior">Multicast Router Behavior</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.8.2.3.2">
                  <li pn="section-toc.1-1.8.2.3.2.1">
                    <t indent="0" pn="section-toc.1-1.8.2.3.2.1.1"><xref derivedContent="8.3.1" format="counter" sectionFormat="of" target="section-8.3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-in-the-presence-of-mldv1-rou">In the Presence of MLDv1 Routers</xref></t>
                  </li>
                  <li pn="section-toc.1-1.8.2.3.2.2">
                    <t indent="0" pn="section-toc.1-1.8.2.3.2.2.1"><xref derivedContent="8.3.2" format="counter" sectionFormat="of" target="section-8.3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-in-the-presence-of-mldv1-mul">In the Presence of MLDv1 Multicast Address Listeners</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.9">
            <t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter" sectionFormat="of" target="section-9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-list-of-timers-counters-and">List of Timers, Counters, and Their Default Values</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2">
              <li pn="section-toc.1-1.9.2.1">
                <t indent="0" pn="section-toc.1-1.9.2.1.1"><xref derivedContent="9.1" format="counter" sectionFormat="of" target="section-9.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-robustness-variable">Robustness Variable</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.2">
                <t indent="0" pn="section-toc.1-1.9.2.2.1"><xref derivedContent="9.2" format="counter" sectionFormat="of" target="section-9.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-interval">Query Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.3">
                <t indent="0" pn="section-toc.1-1.9.2.3.1"><xref derivedContent="9.3" format="counter" sectionFormat="of" target="section-9.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-response-interval">Query Response Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.4">
                <t indent="0" pn="section-toc.1-1.9.2.4.1"><xref derivedContent="9.4" format="counter" sectionFormat="of" target="section-9.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-multicast-address-listening-">Multicast Address Listening Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.5">
                <t indent="0" pn="section-toc.1-1.9.2.5.1"><xref derivedContent="9.5" format="counter" sectionFormat="of" target="section-9.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-other-querier-present-inter">Other Querier Present Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.6">
                <t indent="0" pn="section-toc.1-1.9.2.6.1"><xref derivedContent="9.6" format="counter" sectionFormat="of" target="section-9.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-startup-query-interval">Startup Query Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.7">
                <t indent="0" pn="section-toc.1-1.9.2.7.1"><xref derivedContent="9.7" format="counter" sectionFormat="of" target="section-9.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-startup-query-count">Startup Query Count</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.8">
                <t indent="0" pn="section-toc.1-1.9.2.8.1"><xref derivedContent="9.8" format="counter" sectionFormat="of" target="section-9.8"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-last-listener-query-interva">Last Listener Query Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.9">
                <t indent="0" pn="section-toc.1-1.9.2.9.1"><xref derivedContent="9.9" format="counter" sectionFormat="of" target="section-9.9"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-last-listener-query-count">Last Listener Query Count</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.10">
                <t indent="0" pn="section-toc.1-1.9.2.10.1"><xref derivedContent="9.10" format="counter" sectionFormat="of" target="section-9.10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-last-listener-query-time">Last Listener Query Time</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.11">
                <t indent="0" pn="section-toc.1-1.9.2.11.1"><xref derivedContent="9.11" format="counter" sectionFormat="of" target="section-9.11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-unsolicited-report-interval">Unsolicited Report Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.12">
                <t indent="0" pn="section-toc.1-1.9.2.12.1"><xref derivedContent="9.12" format="counter" sectionFormat="of" target="section-9.12"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-older-version-querier-prese">Older Version Querier Present Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.13">
                <t indent="0" pn="section-toc.1-1.9.2.13.1"><xref derivedContent="9.13" format="counter" sectionFormat="of" target="section-9.13"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-older-version-host-present-">Older Version Host Present Interval</xref></t>
              </li>
              <li pn="section-toc.1-1.9.2.14">
                <t indent="0" pn="section-toc.1-1.9.2.14.1"><xref derivedContent="9.14" format="counter" sectionFormat="of" target="section-9.14"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-configuring-timers">Configuring Timers</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.9.2.14.2">
                  <li pn="section-toc.1-1.9.2.14.2.1">
                    <t indent="0" pn="section-toc.1-1.9.2.14.2.1.1"><xref derivedContent="9.14.1" format="counter" sectionFormat="of" target="section-9.14.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-robustness-variable-2">Robustness Variable</xref></t>
                  </li>
                  <li pn="section-toc.1-1.9.2.14.2.2">
                    <t indent="0" pn="section-toc.1-1.9.2.14.2.2.1"><xref derivedContent="9.14.2" format="counter" sectionFormat="of" target="section-9.14.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-interval-2">Query Interval</xref></t>
                  </li>
                  <li pn="section-toc.1-1.9.2.14.2.3">
                    <t indent="0" pn="section-toc.1-1.9.2.14.2.3.1"><xref derivedContent="9.14.3" format="counter" sectionFormat="of" target="section-9.14.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-maximum-response-delay">Maximum Response Delay</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.10">
            <t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" format="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-security-considerations">Security Considerations</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.10.2">
              <li pn="section-toc.1-1.10.2.1">
                <t indent="0" pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" format="counter" sectionFormat="of" target="section-10.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-query-message">Query Message</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.2">
                <t indent="0" pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" format="counter" sectionFormat="of" target="section-10.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-current-state-report-messag">Current-State Report Messages</xref></t>
              </li>
              <li pn="section-toc.1-1.10.2.3">
                <t indent="0" pn="section-toc.1-1.10.2.3.1"><xref derivedContent="10.3" format="counter" sectionFormat="of" target="section-10.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-state-change-report-message">State-Change Report Messages</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.11">
            <t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" format="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xref></t>
          </li>
          <li pn="section-toc.1-1.12">
            <t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="12" format="counter" sectionFormat="of" target="section-12"/>. <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.12.2">
              <li pn="section-toc.1-1.12.2.1">
                <t indent="0" pn="section-toc.1-1.12.2.1.1"><xref derivedContent="12.1" format="counter" sectionFormat="of" target="section-12.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.12.2.2">
                <t indent="0" pn="section-toc.1-1.12.2.2.1"><xref derivedContent="12.2" format="counter" sectionFormat="of" target="section-12.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.13">
            <t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-design-rationale">Design Rationale</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.13.2">
              <li pn="section-toc.1-1.13.2.1">
                <t indent="0" pn="section-toc.1-1.13.2.1.1"><xref derivedContent="A.1" format="counter" sectionFormat="of" target="section-appendix.a.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-the-need-for-state-change-r">The Need for State-Change Report Messages</xref></t>
              </li>
              <li pn="section-toc.1-1.13.2.2">
                <t indent="0" pn="section-toc.1-1.13.2.2.1"><xref derivedContent="A.2" format="counter" sectionFormat="of" target="section-appendix.a.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-host-suppression">Host Suppression</xref></t>
              </li>
              <li pn="section-toc.1-1.13.2.3">
                <t indent="0" pn="section-toc.1-1.13.2.3.1"><xref derivedContent="A.3" format="counter" sectionFormat="of" target="section-appendix.a.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-switching-router-filter-mode">Switching Router Filter Modes from EXCLUDE to INCLUDE</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.14">
            <t indent="0" pn="section-toc.1-1.14.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-summary-of-changes">Summary of Changes</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.14.2">
              <li pn="section-toc.1-1.14.2.1">
                <t indent="0" pn="section-toc.1-1.14.2.1.1"><xref derivedContent="B.1" format="counter" sectionFormat="of" target="section-appendix.b.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-mldv1">MLDv1</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.2">
                <t indent="0" pn="section-toc.1-1.14.2.2.1"><xref derivedContent="B.2" format="counter" sectionFormat="of" target="section-appendix.b.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-changes-since-rfc-3810">Changes since RFC 3810</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.3">
                <t indent="0" pn="section-toc.1-1.14.2.3.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b.3"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgments">Acknowledgments</xref></t>
              </li>
              <li pn="section-toc.1-1.14.2.4">
                <t indent="0" pn="section-toc.1-1.14.2.4.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.b.4"/><xref derivedContent="" format="title" sectionFormat="of" target="name-contributors">Contributors</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.15">
            <t indent="0" pn="section-toc.1-1.15.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-address">Author's Address</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="intro" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t indent="0" pn="section-1-1">The Multicast Listener Discovery (MLD) protocol is used by IPv6
   routers to discover the presence of multicast listeners (i.e., nodes
   that wish to receive multicast packets) on their directly attached
   links and to discover specifically which multicast addresses are of
   interest to those neighboring nodes.
   Note that a multicast router
   may itself be a listener of one or more multicast addresses; in this
   case, it performs both the "multicast router part" and the "Multicast
   Address Listener part" of the protocol, to collect the multicast
   listener information needed by its multicast routing protocol and to inform
   itself and other neighboring multicast
   routers of its listening state, respectively.</t>
      <t indent="0" pn="section-1-2">This document specifies version 2 of MLD.  The previous version of
      MLD is specified in <xref target="RFC2710" format="default" sectionFormat="of" derivedContent="RFC2710"/>; in this document,
      we will refer to it as "MLDv1".  MLDv2 is a translation of IGMPv3 <xref target="RFC9776" format="default" sectionFormat="of" derivedContent="RFC9776"/>
   for IPv6 semantics.</t>
      <t indent="0" pn="section-1-3">The MLDv2 protocol, when compared to MLDv1, adds support for "source
   filtering", i.e., the ability for a node to report interest in
   listening to packets only from specific source addresses, as
   required to support Source-Specific Multicast (SSM) <xref target="RFC3569" format="default" sectionFormat="of" derivedContent="RFC3569"/>, or from <strong>all
   but</strong> specific source addresses, sent to a particular multicast
   address.  MLDv2 is designed to be interoperable with MLDv1.</t>
      <t indent="0" pn="section-1-4">This document uses "SSM-aware" to refer to systems that support SSM
	   as defined in <xref target="RFC4607" format="default" sectionFormat="of" derivedContent="RFC4607"/>.</t>
      <t indent="0" pn="section-1-5">This document obsoletes <xref target="RFC3810" format="default" sectionFormat="of" derivedContent="RFC3810"/>. <xref target="_810-changes" format="default" sectionFormat="of" derivedContent="Appendix B.2"/> lists the main
   changes from <xref target="RFC3810" format="default" sectionFormat="of" derivedContent="RFC3810"/>.</t>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-1.1">
        <name slugifiedName="name-conventions-used-in-this-do">Conventions Used in This Document</name>
        <t indent="0" pn="section-1.1-1">
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
    "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
    interpreted as described in BCP 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they appear in all capitals, as
    shown here.
        </t>
      </section>
    </section>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-protocol-overview">Protocol Overview</name>
      <t indent="0" pn="section-2-1">This section gives a brief description of the protocol operation. The
   following sections present the protocol details.</t>
      <t indent="0" pn="section-2-2">MLD is an asymmetric protocol; it specifies separate behaviors for
   Multicast Address Listeners (i.e., hosts or routers that listen to
   multicast packets) and multicast routers.  The purpose of MLD is to
   enable each multicast router to learn, for each of its directly
   attached links, which multicast addresses and which sources have
   interested listeners on that link.  The information gathered by MLD
   is provided to whichever multicast routing protocol is used by the
   router, in order to ensure that multicast packets are delivered to
   all links where there are listeners interested in such packets.</t>
      <t indent="0" pn="section-2-3">Multicast routers only need to know that at least one node on an
   attached link is listening to packets for a particular multicast
   address, from a particular source; a multicast router is not required
   to individually keep track of the interests of each neighboring
	   node.  (Nevertheless, see <xref target="host_suppress" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>, item 1 for discussion.)</t>
      <t indent="0" pn="section-2-4">A multicast router performs the router part of the MLDv2 protocol
   (described in detail in <xref target="mr_proto" format="default" sectionFormat="of" derivedContent="Section 7"/>) on each of its directly attached
   links.  If a multicast router has more than one interface connected
   to the same link, it only needs to operate the protocol on one of
   those interfaces.  The router behavior depends on whether there are
   several multicast routers on the same subnet, or not.  If that is the
   case, a querier election mechanism (described in <xref target="elect" format="default" sectionFormat="of" derivedContent="Section 7.6.2"/>) is
   used to elect a single multicast router to be in Querier state.  This
   router is called the "Querier".  All multicast routers on the subnet
   listen to the messages sent by Multicast Address Listeners, and
   maintain the same multicast listening information state, so that they
   can take over the querier role, should the present Querier fail.
   Nevertheless, only the Querier sends periodical or triggered Query
   Messages on the subnet, as described in <xref target="mld_qrys" format="default" sectionFormat="of" derivedContent="Section 7.1"/>.</t>
      <t indent="0" pn="section-2-5">A Multicast Address Listener performs the listener part of the
   MLDv2 protocol (described in detail in <xref target="proto" format="default" sectionFormat="of" derivedContent="Section 6"/>) on all interfaces
   on which multicast reception is supported, even if more than one of
   those interfaces are connected to the same link.</t>
      <section anchor="build_state" numbered="true" toc="include" removeInRFC="false" pn="section-2.1">
        <name slugifiedName="name-building-multicast-address-">Building Multicast Address Listening State on Multicast Address Listeners</name>
        <t indent="0" pn="section-2.1-1">Upper-layer protocols and applications that run on a Multicast
   Address Listener node use specific service interface calls (described
   in <xref target="srvc_if" format="default" sectionFormat="of" derivedContent="Section 3"/>) to ask the IP layer to enable or disable reception of
   packets sent to specific multicast addresses.  The node keeps
   Multicast Address Listening state for each socket on which the
   service interface calls have been invoked (<xref target="sock_state" format="default" sectionFormat="of" derivedContent="Section 4.1"/>).  In addition
   to this per-socket Multicast Address Listening state, a node must also
   maintain or compute Multicast Address Listening state for each of its
   interfaces (<xref target="if_state" format="default" sectionFormat="of" derivedContent="Section 4.2"/>).  Conceptually, that state consists of a set
   of records, with each record containing an IPv6 multicast address, a
   filter-mode, and a source-list.  The filter-mode may be either
   INCLUDE or EXCLUDE.  In INCLUDE mode, reception of packets sent to
   the specified multicast address is enabled only from the source
   addresses listed in the source-list.  In EXCLUDE mode, reception of
   packets sent to the given multicast address is enabled from all
	source addresses except those listed in the source-list.</t>
        <t indent="0" pn="section-2.1-2">At most, one record per multicast address exists for a given
   interface.  This per-interface state is derived from the per-socket
   state, but it may differ from the per-socket state when different
   sockets have differing
   filter-modes and/or source-lists for the same multicast address and
   interface.  After a multicast packet has been accepted from an
   interface by the IP layer, its subsequent delivery to the application
   connected to a particular socket depends on the Multicast Address Listening
   state of that socket (and possibly also on other conditions, such as
   what transport-layer port the socket is bound to).  Note that MLDv2
   messages are not subject to source filtering and must always be
   processed by hosts and routers.</t>
      </section>
      <section anchor="msg_ex" numbered="true" toc="include" removeInRFC="false" pn="section-2.2">
        <name slugifiedName="name-exchanging-messages-between">Exchanging Messages between the Querier and the Listening Nodes</name>
        <t indent="0" pn="section-2.2-1">There are three types of MLDv2 Query Messages: General Queries,
   Multicast Address Specific Queries, and Multicast Address and Source
   Specific Queries.  The Querier periodically sends General Queries, to
   learn Multicast Address Listener information from an attached link.
   These queries are used to build and refresh the Multicast Address
   Listening state inside all multicast routers on the link.</t>
        <t indent="0" pn="section-2.2-2">Nodes respond to these queries by reporting their per-interface
   Multicast Address Listening state through Current-State Report
   messages sent to a specific multicast address that all MLDv2 routers on
   the link listen to.  On the other hand, if the listening state of a
   node changes, the node immediately reports these changes through a
   State-Change Report message.  The State-Change Report contains either
   Filter-Mode-Change Records, Source-List-Change Records, or records of
   both types.  A detailed description of the report messages is
   presented in <xref target="mar_types" format="default" sectionFormat="of" derivedContent="Section 5.2.13"/>.</t>
        <t indent="0" pn="section-2.2-3">Both router and listener state changes are mainly triggered by the
   expiration of a specific timer or the reception of an MLD message
   (listener state change can be also triggered by the invocation of a
   service interface call).  Therefore, to enhance protocol robustness,
   in spite of the possible unreliability of message exchanges, messages
   are retransmitted several times.  Furthermore, timers are set so as
   to take into account the possible message losses and to wait for
   retransmissions.</t>
        <t indent="0" pn="section-2.2-4">Periodical General Queries and Current-State Reports do not apply
   this rule, in order to not overload the link; it is assumed that in
   general, these messages do not generate state changes as their main
   purpose is to refresh existing state.  Thus, even if one such
   message is lost, the corresponding state will be refreshed during the
   next reporting period.</t>
        <t indent="0" pn="section-2.2-5">As opposed to Current-State Reports, State-Change Reports are
   retransmitted several times, in order to avoid them being missed by
   one or more multicast routers.  The number of retransmissions depends
   on the so-called Robustness Variable.  This variable allows tuning
   the protocol according to the expected packet loss on a link.  If a
   link is expected to be lossy (e.g., a wireless connection), the value
   of the Robustness Variable may be increased.  MLD is robust to
   [Robustness Variable]-1 packet losses.  This document recommends a
	   default value of 2 for the Robustness Variable (see <xref target="robust" format="default" sectionFormat="of" derivedContent="Section 9.1"/>).</t>
        <t indent="0" pn="section-2.2-6">If more changes to the same per-interface state entry occur before
   all the retransmissions of the State-Change Report for the first
   change have been completed, each additional change triggers the
	   immediate transmission of a new State-Change Report.  <xref target="chg_if_state" format="default" sectionFormat="of" derivedContent="Section 6.1"/>
   shows how the content of this new report is computed. Retransmissions
   of the new State-Change Report will be scheduled as well, in order to
   ensure that each instance of state change is transmitted at least
	   [Robustness Variable] times.</t>
        <t indent="0" pn="section-2.2-7">If a node on a link expresses, through a State-Change Report, its
   desire to no longer listen to a particular multicast address (or
   source),  the Querier must query for other listeners of the multicast
   address (or source) before deleting the multicast address (or source)
   from its Multicast Address Listening state and stopping the
   corresponding traffic.  Thus, the Querier sends a Multicast Address
   Specific Query to verify whether there are nodes still listening to a
   specified multicast address or not.  Similarly, the Querier sends a
   Multicast Address and Source Specific Query to verify whether, for a
   specified multicast address, there are nodes still listening to a
	   specific set of sources, or not.  <xref target="qry_vars" format="default" sectionFormat="of" derivedContent="Section 5.1.13"/> describes each query
	   in more detail.</t>
        <t indent="0" pn="section-2.2-8">Both Multicast Address Specific Queries and Multicast Address and
   Source Specific Queries are only sent in response to State-Change
   Reports, never in response to Current-State Reports.  This
   distinction between the two types of reports is needed to avoid the
   router treating all Multicast Listener Reports as potential changes
   in state.  By doing so, the fast leave mechanism of MLDv2, described
   in more detail in <xref target="mr-state" format="default" sectionFormat="of" derivedContent="Section 2.3"/>, might not be effective if a State-Change
   Report is lost and only the following Current-State Report is
   received by the router.  Nevertheless, it avoids an increased
   processing at the router, and it reduces the MLD traffic on the link.
   More details on the necessity of distinguishing between the two
	   report types can be found in <xref target="state_change" format="default" sectionFormat="of" derivedContent="Appendix A.1"/>.</t>
        <t indent="0" pn="section-2.2-9">Nodes respond to the above queries through Current-State Reports
   that contain their per-interface Multicast Address Listening state
	   only for the multicast addresses (or sources) being queried.</t>
        <t indent="0" pn="section-2.2-10">As stated earlier, in order to ensure protocol robustness, all the
   queries, except the periodical General Queries, are retransmitted
   several times within a given time interval.  The number of
   retransmissions depends on the Robustness Variable.  If, while
   scheduling new queries, there are pending queries to be retransmitted
   for the same multicast address, the new queries and the pending
   queries have to be merged.  In addition, host reports received for a
   multicast address with pending queries may affect the contents of
   those queries.  The process of building and maintaining the state of
	   pending queries is presented in <xref target="spec_qry" format="default" sectionFormat="of" derivedContent="Section 7.6.3"/>.</t>
        <t indent="0" pn="section-2.2-11">Protocol robustness is also enhanced through the use of the S flag (Suppress Router-Side Processing).  As described above, when a
   Multicast Address Specific or a Multicast Address and Source Specific
   Query is sent by the Querier, a number of retransmissions of the
   query are scheduled.  In the original (first) query, the S flag is
   clear.  When the Querier sends this query, it lowers the timers for
   the concerned multicast address (or source) to a given value;
   similarly, any non-querier multicast router that receives the query
   lowers its timers in the same way.  Nevertheless, while waiting for
   the next scheduled queries to be sent, the Querier may receive a
   report that updates the timers.  The scheduled queries still have to
   be sent, in order to ensure that a non-querier router keeps its state
   synchronized with the current Querier (the non-querier router might
   have missed the first query).  Nevertheless, the timers should not be
   lowered again, as a valid answer was already received.  Therefore, in
	   subsequent queries, the Querier sets the S flag.</t>
      </section>
      <section anchor="mr-state" numbered="true" toc="include" removeInRFC="false" pn="section-2.3">
        <name slugifiedName="name-building-multicast-address-l">Building Multicast Address Listening State on Multicast Routers</name>
        <t indent="0" pn="section-2.3-1">Multicast routers that implement MLDv2 (whether they are in Querier
   state or not) keep state per multicast address per attached link.
   This Multicast Address Listening state consists of a filter-mode, a
   filter timer, and a source-list, with a timer associated to each
   source from the list.  The filter-mode is used to summarize the total
   listening state of a multicast address to a minimum set, such that
   all nodes' listening states are respected.  The filter-mode may
   change in response to the reception of particular types of report
	   messages or when certain timer conditions occur.</t>
        <t indent="0" pn="section-2.3-2">A router is in INCLUDE mode for a specific multicast address on a
   given interface if all the listeners on the link interested in that
   address are in INCLUDE mode.  The router state is represented through
   the notation INCLUDE (A), where A is a list of sources, called the
   "Include List".  The Include List is the set of sources that one or
   more listeners on the link have requested to receive.  All the
   sources from the Include List will be forwarded by the router.  Any
   other source that is not in the Include List will be blocked by the
	   router.</t>
        <t indent="0" pn="section-2.3-3">A source can be added to the current Include List if a listener in
   INCLUDE mode sends a Current-State or a State-Change Report that
   includes that source.  Each source from the Include List is
   associated with a Source Timer that is updated whenever a listener in
   INCLUDE mode sends a report that confirms its interest in that
   specific source.  If the timer of a source from the Include List
	   expires, the source is deleted from the Include List.</t>
        <t indent="0" pn="section-2.3-4">Besides this "soft leave" mechanism, there is also a "fast leave"
   scheme in MLDv2; it is also based on the use of source timers.  When
   a node in INCLUDE mode expresses its desire to stop listening to a
   specific source, all the multicast routers on the link lower their
   timers for that source to a given value.  The Querier then sends a
   Multicast Address and Source Specific Query, to verify whether there
   are other listeners for that source on the link, or not.  If a report
   that includes this source is received before the timer expiration,
   all the multicast routers on the link update the source timer.  If
   not, the source is deleted from the Include List.  The handling of
   the Include List, according to the received reports, is detailed in Sections 
   <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>.</t>
        <t indent="0" pn="section-2.3-5">A router is in EXCLUDE mode for a specific multicast address on a
   given interface if there is at least one listener in EXCLUDE mode for
   that address on the link.  When the first report is received from
   such a listener, the router sets the Filter Timer that corresponds to
   that address.  This timer is reset each time an EXCLUDE mode listener
   confirms its listening state through a Current-State Report.  The
   timer is also updated when a listener, formerly in INCLUDE mode,
   announces its filter-mode change through a State-Change Report
   message.  If the Filter Timer expires, it means that there are no
   more listeners in EXCLUDE mode on the link.  In this case, the router
	   switches back to INCLUDE mode for that multicast address.</t>
        <t indent="0" pn="section-2.3-6">When the router is in EXCLUDE mode, the router state is represented
   by the notation EXCLUDE (X,Y), where X is called the "Requested List"
   and Y is called the "Exclude List".  All sources, except those from
   the Exclude List, will be forwarded by the router.  The Requested
   List has no effect on forwarding.  Nevertheless, the router has to
   maintain the Requested List for two reasons:
        </t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-2.3-7">
          <li pn="section-2.3-7.1" derivedCounter="1.">
            <t indent="0" pn="section-2.3-7.1.1">To keep track of sources that listeners in INCLUDE mode listen
            to.  This is necessary to assure a seamless transition of the
            router to INCLUDE mode, when there is no listener in EXCLUDE mode
            left.  This transition should not interrupt the flow of traffic to
            listeners in INCLUDE mode for that multicast address.  Therefore,
            at the time of the transition, the Requested List should contain
            the set of sources that nodes in INCLUDE mode have explicitly
            requested.
            </t>
            <t indent="0" pn="section-2.3-7.1.2">
      When the router switches to INCLUDE mode, the sources in the Requested
      List are moved to the Include List, and the Exclude List is deleted.
      Before switching, the Requested List can contain an inexact guess of the
      sources listeners in INCLUDE mode listen to, which might be too large or too
      small.  These inexactitudes are due to the fact that the Requested List
      is also used for fast blocking purposes, as described below.  If such a
      fast blocking is required, some sources may be deleted from the
      Requested List (as shown in Sections <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>) in
      order to reduce router state.  Nevertheless, in each such case, the
      Filter Timer is updated as well.  Therefore, listeners in INCLUDE mode
      will have enough time, before an eventual switching, to reconfirm their
      interest in the eliminated source(s) and rebuild the Requested List
      accordingly.  The protocol ensures that when a switch to INCLUDE mode
      occurs, the Requested List will be accurate.  Details about the
      transition of the router to INCLUDE mode are presented in <xref target="mode_switch" format="default" sectionFormat="of" derivedContent="Appendix A.3"/>.</t>
          </li>
          <li pn="section-2.3-7.2" derivedCounter="2.">
            <t indent="0" pn="section-2.3-7.2.1">To allow the fast blocking of previously unblocked sources.  If
      the router receives a report that contains such a request, the
      concerned sources are added to the Requested List.  Their timers
      are set to a given small value, and a Multicast Address and Source
      Specific Query is sent by the Querier, to check whether there are
      nodes on the link still interested in those sources, or not.  If
      no node announces its interest in receiving those specific sources,
      the timers of those sources expire.  Then, the sources are moved
      from the Requested List to the Exclude List.  From then on, the
	   sources will be blocked by the router.</t>
          </li>
        </ol>
        <t indent="0" pn="section-2.3-8">The handling of the EXCLUDE mode router state, according to the
        received reports, is detailed in Sections <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>.</t>
        <t indent="0" pn="section-2.3-9">Both the MLDv2 router and listener behaviors described in this
   document were defined to ensure backward interoperability with MLDv1
	   hosts and routers.  Interoperability issues are detailed in <xref target="interop" format="default" sectionFormat="of" derivedContent="Section 8"/>.</t>
      </section>
    </section>
    <section anchor="srvc_if" numbered="true" toc="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-the-service-interface-for-r">The Service Interface for Requesting IP Multicast Reception</name>
      <t indent="0" pn="section-3-1">Within an IP system, there is (at least conceptually) a service
   interface used by upper-layer protocols or application programs to
   ask the IP layer to enable or disable reception of packets sent to
   specific IP multicast addresses.  In order to take full advantage of
   the capabilities of MLDv2, a node's IP service interface must support
	   the following operation:</t>
      <sourcecode name="" type="" markers="false" pn="section-3-2">
   IPv6MulticastListen ( socket, interface, IPv6 multicast-address,
                         filter-mode, source-list )</sourcecode>
      <t indent="0" pn="section-3-3">where:
      </t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-3-4">
        <li pn="section-3-4.1">
          <t indent="0" pn="section-3-4.1.1">"socket" is an implementation-specific parameter used to
      distinguish among different requesting entities (e.g., programs and
      processes) within the node; the socket parameter of BSD Unix
	   system calls is a specific example.</t>
        </li>
        <li pn="section-3-4.2">
          <t indent="0" pn="section-3-4.2.1">"interface" is a local identifier of the network interface on
      which reception of the specified multicast address is to be
      enabled or disabled.  Interfaces may be physical (e.g., an
      Ethernet interface) or virtual (e.g., the endpoint of a Frame
      Relay virtual circuit or an IP-in-IP "tunnel").  An implementation
      may allow a special "unspecified" value to be passed as the
      interface parameter, in which case the request would apply to the
      "primary" or "default" interface of the node (perhaps established
      by system configuration).  If reception of the same multicast
      address is desired on more than one interface, IPv6MulticastListen
	   is invoked separately for each desired interface.</t>
        </li>
        <li pn="section-3-4.3">
          <t indent="0" pn="section-3-4.3.1">"IPv6 multicast address" is the multicast address to which the
      request pertains.  If reception of more than one multicast address
      on a given interface is desired, IPv6MulticastListen is invoked
	   separately for each desired address.</t>
        </li>
        <li pn="section-3-4.4">
          <t indent="0" pn="section-3-4.4.1">"filter-mode" may be either INCLUDE or EXCLUDE.  In INCLUDE mode,
      reception of packets sent to the specified multicast address is
      requested only from the source addresses listed in the source-list
      parameter.  In EXCLUDE mode, reception of packets sent to the
      given multicast address is requested from all source addresses
	   except those listed in the source-list parameter.</t>
        </li>
        <li pn="section-3-4.5">
          <t indent="0" pn="section-3-4.5.1">"source-list" is an unordered list of zero or more unicast
      addresses from which multicast reception is desired or not
      desired, depending on the filter-mode.  An implementation <bcp14>MAY</bcp14>
      impose a limit on the size of source-lists.  When an operation
      causes the source-list size limit to be exceeded, the service
	   interface <bcp14>SHOULD</bcp14> return an error.</t>
        </li>
      </ul>
      <t indent="0" pn="section-3-5">For a given combination of socket, interface, and IPv6 multicast
   address, only a single filter-mode and source-list can be in effect
   at any one time.  Nevertheless, either the filter-mode or the source-list,
   or both, may be changed by subsequent IPv6MulticastListen
   requests that specify the same socket, interface, and IPv6 multicast
   address.  Each subsequent request completely replaces any earlier
	   request for the given socket, interface, and multicast address.</t>
      <t indent="0" pn="section-3-6">The MLDv1 protocol did not support source filters and had a simpler
   service interface; it consisted of Start Listening and Stop Listening
   operations to enable and disable listening to a given multicast
   address (from all sources) on a given interface.  The equivalent
	   operations in the service interface are as follows.</t>
      <t indent="0" pn="section-3-7">The Start Listening operation is equivalent to:</t>
      <sourcecode name="" type="" markers="false" pn="section-3-8">
   IPv6MulticastListen ( socket, interface, IPv6 multicast address,
                         EXCLUDE, {} )</sourcecode>
      <t indent="0" pn="section-3-9">and the Stop Listening operation is equivalent to:</t>
      <sourcecode name="" type="" markers="false" pn="section-3-10">
   IPv6MulticastListen ( socket, interface, IPv6 multicast address,
                         INCLUDE, {} )</sourcecode>
      <t indent="0" pn="section-3-11">where {} is an empty source-list.</t>
      <t indent="0" pn="section-3-12">An example of an API that provides the capabilities outlined in this
	   service interface is given in <xref target="RFC3678" format="default" sectionFormat="of" derivedContent="RFC3678"/>.</t>
    </section>
    <section anchor="node_state" numbered="true" toc="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-multicast-address-listening">Multicast Address Listening State Maintained by Nodes</name>
      <section anchor="sock_state" numbered="true" toc="include" removeInRFC="false" pn="section-4.1">
        <name slugifiedName="name-per-socket-state">Per-Socket State</name>
        <t indent="0" pn="section-4.1-1">For each socket on which IPv6MulticastListen has been invoked, the
   node records the desired Multicast Address Listening state for that socket.
	   That state conceptually consists of a set of records of the form:</t>
        <sourcecode name="" type="" markers="false" pn="section-4.1-2">
   (interface, IPv6 multicast address, filter-mode, source-list)</sourcecode>
        <t indent="0" pn="section-4.1-3">The per-socket state evolves in response to each invocation of
   IPv6MulticastListen on the socket, as follows:
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.1-4">
          <li pn="section-4.1-4.1">
            <t indent="0" pn="section-4.1-4.1.1">If the requested filter-mode is INCLUDE and the requested source-list
      is empty, then the entry that corresponds to the requested
      interface and multicast address is deleted, if present.  If no
	   such entry is present, the request has no effect.</t>
          </li>
          <li pn="section-4.1-4.2">
            <t indent="0" pn="section-4.1-4.2.1">If the requested filter-mode is EXCLUDE or the requested source-list
      is non-empty, then the entry that corresponds to the
      requested interface and multicast address, if present, is changed
      to contain the requested filter-mode and source-list.  If no such
      entry is present, a new entry is created, using the parameters
	   specified in the request.</t>
          </li>
        </ul>
      </section>
      <section anchor="if_state" numbered="true" toc="include" removeInRFC="false" pn="section-4.2">
        <name slugifiedName="name-per-interface-state">Per-Interface State</name>
        <t indent="0" pn="section-4.2-1">In addition to the per-socket Multicast Address Listening state, a node must
   also maintain or compute Multicast Address Listening state for each of its
   interfaces.  That state conceptually consists of a set of records of
   the form:</t>
        <sourcecode name="" type="" markers="false" pn="section-4.2-2">
      (IPv6 multicast address, filter-mode, source-list)</sourcecode>
        <t indent="0" pn="section-4.2-3">At most, one record per multicast address exists for a given
   interface.  This per-interface state is derived from the per-socket
   state, but it may differ from the per-socket state when different sockets have differing
   filter-modes and/or source-lists for the same multicast address and
   interface. For example, suppose one application or process invokes
   the following operation on socket s1:</t>
        <sourcecode name="" type="" markers="false" pn="section-4.2-4">
      IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c} )</sourcecode>
        <t indent="0" pn="section-4.2-5">requesting reception on interface i of packets sent to multicast
   address m, only if they come from the sources a, b, or c.  Suppose
   another application or process invokes the following operation on
   socket s2:</t>
        <sourcecode name="" type="" markers="false" pn="section-4.2-6">
      IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d} )</sourcecode>
        <t indent="0" pn="section-4.2-7">requesting reception on the same interface i of packets sent to the
   same multicast address m, only if they come from sources b, c, or
   d.  In order to satisfy the reception requirements of both sockets,
   it is necessary for interface i to receive packets sent to m from any
   one of the sources a, b, c, or d.  Thus, in this example, the
   listening state of interface i for multicast address m has filter-mode
   INCLUDE and source-list {a, b, c, d}.</t>
        <t indent="0" pn="section-4.2-8">After a multicast packet has been accepted from an interface by the
   IP layer, its subsequent delivery to the application or process that
   listens on a particular socket depends on the Multicast Address Listening
   state of that socket (and possibly also on other conditions, such as
   what transport-layer port the socket is bound to).  So, in the above
   example, if a packet arrives on interface i, destined to multicast
   address m, with source address a, it may be delivered on socket s1
   but not on socket s2.  Note that MLDv2 messages are not subject to
   source filtering and must always be processed by hosts and routers.</t>
        <t indent="0" pn="section-4.2-9">Requiring the filtering of packets based upon a socket's multicast
   reception state is a feature of this service interface.  The
   previous service interface described no filtering based upon
   Multicast Address Listening state; rather, a Start Listening operation on a
   socket simply caused the node to start to listen to a multicast
   address on the given interface; packets sent to that multicast
   address could be delivered to all sockets, whether they had started
   to listen or not.</t>
        <t indent="0" pn="section-4.2-10">The general rules for deriving the per-interface state from the per-
   socket state are as follows:  for each distinct (interface, IPv6
   multicast address) pair that appears in any per-socket state, a per-
   interface record is created for that multicast address on that
   interface.  Considering all socket records that contain the same
   (interface, IPv6 multicast address) pair,
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11">
          <li pn="section-4.2-11.1">
            <t indent="0" pn="section-4.2-11.1.1">if any such record has a filter-mode of EXCLUDE, then the
            filter-mode of the interface record is EXCLUDE, and the source-list
            of the interface record is the intersection of the source-lists
            of all socket records in EXCLUDE mode, minus those source
            addresses that appear in any socket record in INCLUDE mode.  For
            example, if the socket records for multicast address m on
            interface i are:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.1.2">
              <li pn="section-4.2-11.1.2.1">from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )</li>
              <li pn="section-4.2-11.1.2.2">from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )</li>
              <li pn="section-4.2-11.1.2.3">from socket s3: ( i, m, INCLUDE, {d, e, f} )</li>
            </ul>
            <t indent="0" pn="section-4.2-11.1.3">then the corresponding interface record on interface i is:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.1.4">
              <li pn="section-4.2-11.1.4.1">( m, EXCLUDE, {b, c} )</li>
            </ul>
            <t indent="0" pn="section-4.2-11.1.5">If a fourth socket is added, such as:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.1.6">
              <li pn="section-4.2-11.1.6.1">From socket s4: ( i, m, EXCLUDE, {} )</li>
            </ul>
            <t indent="0" pn="section-4.2-11.1.7">then the interface record becomes:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.1.8">
              <li pn="section-4.2-11.1.8.1">( m, EXCLUDE, {} )</li>
            </ul>
          </li>
          <li pn="section-4.2-11.2">
            <t indent="0" pn="section-4.2-11.2.1">if all such records have a filter-mode of INCLUDE, then the
            filter-mode of the interface record is INCLUDE, and the source-list
            of the interface record is the union of the source-lists of
            all the socket records.  For example, if the socket records for
            multicast address m on interface i are:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.2.2">
              <li pn="section-4.2-11.2.2.1">from socket s1:  ( i, m, INCLUDE, {a, b, c} )</li>
              <li pn="section-4.2-11.2.2.2">from socket s2:  ( i, m, INCLUDE, {b, c, d} )</li>
              <li pn="section-4.2-11.2.2.3">from socket s3:  ( i, m, INCLUDE, {e, f} )</li>
            </ul>
            <t indent="0" pn="section-4.2-11.2.3">then the corresponding interface record on interface i is:</t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-4.2-11.2.4">
              <li pn="section-4.2-11.2.4.1">( m, INCLUDE, {a, b, c, d, e, f} )</li>
            </ul>
            <t indent="0" pn="section-4.2-11.2.5">An implementation <bcp14>MUST NOT</bcp14> use an EXCLUDE
            interface record for a multicast address if all sockets for this
            multicast address are in INCLUDE state.  If system resource limits
            are reached when a per- interface state source-list is calculated,
            an error <bcp14>MUST</bcp14> be returned to the application which
            requested the operation.</t>
          </li>
        </ul>
        <t indent="0" pn="section-4.2-12">The above rules for deriving the per-interface state are
   (re)evaluated whenever an IPv6MulticastListen invocation modifies the
   per-socket state by adding, deleting, or modifying a per-socket state
   record.  Note that a change of the per-socket state does not
	   necessarily result in a change of the per-interface state.</t>
      </section>
    </section>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-message-formats">Message Formats</name>
      <t indent="0" pn="section-5-1">MLDv2 is a sub-protocol of ICMPv6, that is, MLDv2 message types are a
   subset of ICMPv6 messages, and MLDv2 messages are identified in IPv6
   packets by a preceding Next Header value of 58.  All MLDv2 messages
   described in this document <bcp14>MUST</bcp14> be sent with a link-local IPv6 Source
   Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option
   <xref target="RFC2711" format="default" sectionFormat="of" derivedContent="RFC2711"/> in a Hop-by-Hop Options header.  (The Router Alert option
   is necessary to cause routers to examine MLDv2 messages sent to IPv6
   multicast addresses in which the routers themselves have no
   interest.)  MLDv2 Reports can be sent with the source address set to
	   the unspecified address <xref target="RFC4291" format="default" sectionFormat="of" derivedContent="RFC4291"/>, if a valid link-local IPv6 source
   address has not been acquired yet for the sending interface.  (See
	   <xref target="src_addrs" format="default" sectionFormat="of" derivedContent="Section 5.2.14"/> for details.)</t>
      <t indent="0" pn="section-5-2">There are two MLD message types of concern to the MLDv2 protocol
   described in this document:
      </t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5-3">
        <li pn="section-5-3.1">
          <t indent="0" pn="section-5-3.1.1">Multicast Listener Query (Type = decimal 130)</t>
        </li>
        <li pn="section-5-3.2">
          <t indent="0" pn="section-5-3.2.1">Version 2 Multicast Listener Report (Type = decimal 143).  See
	   <xref target="iana" format="default" sectionFormat="of" derivedContent="Section 11"/> for IANA considerations.</t>
        </li>
      </ul>
      <t indent="0" pn="section-5-4">To assure the interoperability with nodes that implement MLDv1 (see
   <xref target="interop" format="default" sectionFormat="of" derivedContent="Section 8"/>), an implementation of MLDv2 must also support the
   following two message types:
      </t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5-5">
        <li pn="section-5-5.1">
          <t indent="0" pn="section-5-5.1.1">Multicast Listener Report (Type = decimal 131) <xref target="RFC2710" format="default" sectionFormat="of" derivedContent="RFC2710"/></t>
        </li>
        <li pn="section-5-5.2">
          <t indent="0" pn="section-5-5.2.1">Multicast Listener Done (Type = decimal 132) <xref target="RFC2710" format="default" sectionFormat="of" derivedContent="RFC2710"/></t>
        </li>
      </ul>
      <t indent="0" pn="section-5-6">Unrecognized message types <bcp14>MUST</bcp14> be silently ignored.  Other message
   types may be used by newer versions or extensions of MLD, by
	   multicast routing protocols, or for other uses.</t>
      <t indent="0" pn="section-5-7">In this document, unless otherwise qualified, the capitalized words
   "Query" and "Report" refer to MLD Multicast Listener Queries and MLD
	   Version 2 Multicast Listener Reports, respectively.</t>
      <section anchor="qry_msg" numbered="true" toc="include" removeInRFC="false" pn="section-5.1">
        <name slugifiedName="name-multicast-listener-query-me">Multicast Listener Query Message</name>
        <t indent="0" pn="section-5.1-1">Multicast Listener Queries are sent by multicast routers in Querier
   state to query the Multicast Address Listening state of neighboring
	   interfaces.  Queries have the following format:</t>
        <artwork name="" type="" align="left" alt="" pn="section-5.1-2">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Type = 130   |      Code     |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Maximum Response Code      |           Reserved            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Multicast Address                       *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Flags |S| QRV |     QQIC      |     Number of Sources (N)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [1]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [2]                      *
|                                                               |
*                                                               *
|                                                               |
+-                              .                              -+
.                               .                               .
.                               .                               .
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [N]                      *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</artwork>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.1">
          <name slugifiedName="name-code">Code</name>
          <t indent="0" pn="section-5.1.1-1">The Code field is initialized to zero by the sender and ignored by receivers.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.2">
          <name slugifiedName="name-checksum">Checksum</name>
          <t indent="0" pn="section-5.1.2-1">The Checksum field is the standard ICMPv6 checksum; it covers the entire MLDv2 message,
	   plus a "pseudo-header" of IPv6 header fields <xref target="RFC4443" format="default" sectionFormat="of" derivedContent="RFC4443"/>  <xref target="RFC8200" format="default" sectionFormat="of" derivedContent="RFC8200"/>.  For
   computing the checksum, the Checksum field is set to zero.  When a
   packet is received, the checksum <bcp14>MUST</bcp14> be verified before processing
	   it.</t>
        </section>
        <section anchor="mrcode" numbered="true" toc="include" removeInRFC="false" pn="section-5.1.3">
          <name slugifiedName="name-maximum-response-code">Maximum Response Code</name>
          <t indent="0" pn="section-5.1.3-1">The Maximum Response Code field specifies the maximum time
          allowed before sending a responding Report.  The actual time
          allowed, called the "Maximum Response Delay", is represented in units
          of milliseconds and is derived from the Maximum Response Code as
          follows:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1.3-2">
            <li pn="section-5.1.3-2.1">If Maximum Response Code &lt; 32768, Maximum Response Delay =
            Maximum Response Code.</li>
            <li pn="section-5.1.3-2.2">
              <t indent="0" pn="section-5.1.3-2.2.1">If Maximum Response Code
            &gt;=32768, Maximum Response Code represents a floating-point
            value as follows:</t>
              <artwork name="" type="" align="left" alt="" pn="section-5.1.3-2.2.2">
    0 1 2 3 4 5 6 7 8 9 A B C D E F
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |1| exp |          mant         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Maximum Response Delay = (mant | 0x1000) &lt;&lt; (exp+3)</artwork>
            </li>
          </ul>
          <t indent="0" pn="section-5.1.3-3">Small values of Maximum Response Delay allow MLDv2 routers to tune
   the leave latency (the time between the moment the last node on a
   link ceases to listen to a specific multicast address and the moment
   the routing protocol is notified that there are no more listeners for
   that address).  Larger values, especially in the exponential range,
	   allow the tuning of the burstiness of MLD traffic on a link.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.4">
          <name slugifiedName="name-reserved">Reserved</name>
          <t indent="0" pn="section-5.1.4-1">The Reserved field is set to zero on transmission and ignored on reception.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.5">
          <name slugifiedName="name-multicast-address">Multicast Address</name>
          <t indent="0" pn="section-5.1.5-1">For a General Query, the Multicast Address field is set to zero.  For
   a Multicast Address Specific Query or Multicast Address and Source
   Specific Query, it is set to the multicast address being queried (see
	   <xref target="num_srcs" format="default" sectionFormat="of" derivedContent="Section 5.1.10"/>, below).</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.6">
          <name slugifiedName="name-flags">Flags</name>
          <t indent="0" pn="section-5.1.6-1">Allocation of individual bits within the Flags field is described in
   <xref target="RFC9778" sectionFormat="of" section="2.2" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9778#section-2.2" derivedContent="RFC9778"/>. Future specifications
   will define the associated meaning tied to any such allocation.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.7">
          <name slugifiedName="name-s-flag-suppress-router-side">S Flag (Suppress Router-Side Processing)</name>
          <t indent="0" pn="section-5.1.7-1">When set to one, the S flag indicates to any receiving multicast
   routers that they have to suppress the normal timer updates they
   perform upon receiving a Query.  Nevertheless, it does not suppress the
   querier election or the normal "host-side" processing of a Query that
   a router may be required to perform as a consequence of itself being
	   a multicast listener.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.8">
          <name slugifiedName="name-qrv-queriers-robustness-var">QRV (Querier's Robustness Variable)</name>
          <t indent="0" pn="section-5.1.8-1">If non-zero, the QRV field contains the [Robustness Variable] value
   used by the Querier.  If the Querier's [Robustness Variable] exceeds
	   7 (the maximum value of the QRV field), the QRV field is set to zero.</t>
          <t indent="0" pn="section-5.1.8-2">Routers adopt the QRV value from the most recently received Query as
   their own [Robustness Variable] value, unless that most recently
   received QRV was zero, in which case they use the default [Robustness
	   Variable] value specified in <xref target="robust" format="default" sectionFormat="of" derivedContent="Section 9.1"/> or a statically configured
	   value.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.9">
          <name slugifiedName="name-qqic-queriers-query-interva">QQIC (Querier's Query Interval Code)</name>
          <t indent="0" pn="section-5.1.9-1">The QQIC field specifies the [Query
   Interval] used by the Querier.  The actual interval, called the
   "Querier's Query Interval (QQI)", is represented in units of seconds
	   and is derived from the QQIC as follows:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1.9-2">
            <li pn="section-5.1.9-2.1">If QQIC &lt; 128, QQI = QQIC</li>
            <li pn="section-5.1.9-2.2">
              <t indent="0" pn="section-5.1.9-2.2.1">If QQIC &gt;= 128, QQIC represents a floating-point value as follows:</t>
              <artwork name="" type="" align="left" alt="" pn="section-5.1.9-2.2.2">
    0 1 2 3 4 5 6 7
   +-+-+-+-+-+-+-+-+
   |1| exp | mant  |
   +-+-+-+-+-+-+-+-+

QQI = (mant | 0x10) &lt;&lt; (exp + 3)</artwork>
            </li>
          </ul>
          <t indent="0" pn="section-5.1.9-3">Multicast routers that are not the current Querier adopt the QQI
   value from the most recently received Query as their own [Query
   Interval] value, unless that most recently received QQI was zero, in
   which case the receiving routers use the default [Query Interval]
	   value specified in <xref target="qry_int" format="default" sectionFormat="of" derivedContent="Section 9.2"/>.</t>
        </section>
        <section anchor="num_srcs" numbered="true" toc="include" removeInRFC="false" pn="section-5.1.10">
          <name slugifiedName="name-number-of-sources-n">Number of Sources (N)</name>
          <t indent="0" pn="section-5.1.10-1">The Number of Sources (N) field specifies how many source addresses
   are present in the Query.  This number is zero in a General Query or
   a Multicast Address Specific Query and non-zero in a Multicast
   Address and Source Specific Query.  This number is limited by the MTU
   of the link over which the Query is transmitted.  For example, on an
   Ethernet link with an MTU of 1500 octets, the IPv6 header (40 octets)
   together with the Hop-by-Hop Extension Header (8 octets) that
   includes the Router Alert option consume 48 octets; the MLD fields up
   to the Number of Sources (N) field consume 28 octets; thus, there are
   1424 octets left for source addresses, which limits the number of
	   source addresses to 89 (1424/16).</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.11">
          <name slugifiedName="name-source-address-i">Source Address [i]</name>
          <t indent="0" pn="section-5.1.11-1">The Source Address [i] fields are a vector of n unicast addresses,
	   where n is the value in the Number of Sources (N) field.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.12">
          <name slugifiedName="name-additional-data">Additional Data</name>
          <t indent="0" pn="section-5.1.12-1">If the Payload Length field in the IPv6 header of a received Query
   indicates that there are additional octets of data present, beyond
   the fields described here, MLDv2 implementations <bcp14>MUST</bcp14> include those
   octets in the computation to verify the received MLD Checksum, but
   <bcp14>MUST</bcp14> otherwise ignore those additional octets.  When sending a Query,
   an MLDv2 implementation <bcp14>MUST NOT</bcp14> include additional octets beyond the
	   fields described above.</t>
        </section>
        <section anchor="qry_vars" numbered="true" toc="include" removeInRFC="false" pn="section-5.1.13">
          <name slugifiedName="name-query-variants">Query Variants</name>
          <t indent="0" pn="section-5.1.13-1">There are three variants of the Query Message:
          </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.1.13-2">
            <li pn="section-5.1.13-2.1">
              <t indent="0" pn="section-5.1.13-2.1.1">A "General Query" is sent by the Querier to learn which
              multicast addresses have listeners on an attached link.  In a
              General Query, both the Multicast Address field and the Number
              of Sources (N) field are zero.</t>
            </li>
            <li pn="section-5.1.13-2.2">
              <t indent="0" pn="section-5.1.13-2.2.1">A "Multicast Address Specific Query" is sent by the Querier
              to learn if a particular multicast address has any listeners on
              an attached link.  In a Multicast Address Specific Query, the
              Multicast Address field contains the multicast address of
              interest, while the Number of Sources (N) field is set to
              zero.</t>
            </li>
            <li pn="section-5.1.13-2.3">
              <t indent="0" pn="section-5.1.13-2.3.1">A "Multicast Address and Source Specific Query" is sent by
              the Querier to learn if any of the sources from the specified
              list for the particular multicast address has any listeners on
              an attached link or not.  In a Multicast Address and Source
              Specific Query the Multicast Address field contains the
              multicast address of interest, while the Source Address [i]
              field(s) contain(s) the source address(es) of interest.</t>
            </li>
          </ul>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.14">
          <name slugifiedName="name-source-addresses-for-querie">Source Addresses for Queries</name>
          <t indent="0" pn="section-5.1.14-1">All MLDv2 Queries <bcp14>MUST</bcp14> be sent with a valid IPv6 link-local source
   address.  If a node (router or host) receives a Query Message with
   the IPv6 Source Address set to the unspecified address (::), or any
   other address that is not a valid IPv6 link-local address, it <bcp14>MUST</bcp14>
	   silently discard the message and <bcp14>SHOULD</bcp14> log a warning.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.1.15">
          <name slugifiedName="name-destination-addresses-for-q">Destination Addresses for Queries</name>
          <t indent="0" pn="section-5.1.15-1">In MLDv2, General Queries are sent to the link-scope all-nodes
   multicast address (ff02::1).  Multicast Address Specific and
   Multicast Address and Source Specific Queries are sent with an IP
   destination address equal to the multicast address of interest.
   However, a node <bcp14>MUST</bcp14> accept and process any Query whose IP
   Destination Address field contains any of the addresses (unicast or
   multicast) assigned to the interface on which the Query arrives. This
	   might be useful, e.g., for debugging purposes.</t>
        </section>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2">
        <name slugifiedName="name-version-2-multicast-listene">Version 2 Multicast Listener Report Message</name>
        <t indent="0" pn="section-5.2-1">Version 2 Multicast Listener Reports are sent by IP nodes to report
   (to neighboring routers) the current Multicast Address Listening state, or
   changes in the Multicast Address Listening state, of their interfaces.
	   Reports have the following format:</t>
        <artwork name="" type="" align="left" alt="" pn="section-5.2-2">
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Type = 143   |    Reserved   |           Checksum            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|             Flags             |Nr of Mcast Address Records (M)|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [1]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [2]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               .                               |
.                               .                               .
|                               .                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                  Multicast Address Record [M]                 .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</artwork>
        <t indent="0" pn="section-5.2-3">Each Multicast Address Record has the following internal format:</t>
        <artwork name="" type="" align="left" alt="" pn="section-5.2-4">
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Record Type  |  Aux Data Len |     Number of Sources (N)     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Multicast Address                       *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [1]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [2]                      *
|                                                               |
*                                                               *
|                                                               |
+-                                                             -+
.                               .                               .
.                               .                               .
.                               .                               .
+-                                                             -+
|                                                               |
*                                                               *
|                                                               |
*                       Source Address [N]                      *
|                                                               |
*                                                               *
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
.                                                               .
.                         Auxiliary Data                        .
.                                                               .
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+</artwork>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.1">
          <name slugifiedName="name-reserved-2">Reserved</name>
          <t indent="0" pn="section-5.2.1-1">The Reserved field is set to zero on transmission and ignored on reception.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.2">
          <name slugifiedName="name-checksum-2">Checksum</name>
          <t indent="0" pn="section-5.2.2-1">The Checksum Field is the standard ICMPv6 checksum; it covers the entire MLDv2 message, plus a "pseudo-header" of IPv6 header fields <xref target="RFC4443" format="default" sectionFormat="of" derivedContent="RFC4443"/> <xref target="RFC8200" format="default" sectionFormat="of" derivedContent="RFC8200"/>.  In
   order to compute the checksum, the Checksum field is set to zero.
   When a packet is received, the checksum <bcp14>MUST</bcp14> be verified before
	   processing it.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.3">
          <name slugifiedName="name-flags-2">Flags</name>
          <t indent="0" pn="section-5.2.3-1">Allocation of individual bits within the Flags field is described in
   <xref target="RFC9778" sectionFormat="of" section="2.3" format="default" derivedLink="https://rfc-editor.org/rfc/rfc9778#section-2.3" derivedContent="RFC9778"/>. Future specifications
   will define the associated meaning tied to any such allocation.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.4">
          <name slugifiedName="name-nr-of-mcast-address-records">Nr of Mcast Address Records (M)</name>
          <t indent="0" pn="section-5.2.4-1">The Nr of the Mcast Address Records (M) field specifies how many
	   Multicast Address Records are present in this Report.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.5">
          <name slugifiedName="name-multicast-address-record">Multicast Address Record</name>
          <t indent="0" pn="section-5.2.5-1">Each Multicast Address Record is a block of fields that contain
   information on the sender listening to a single multicast address on
	   the interface from which the Report is sent.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.6">
          <name slugifiedName="name-record-type">Record Type</name>
          <t indent="0" pn="section-5.2.6-1">The Record Type field specifies the type of the Multicast Address Record.  See 
   <xref target="mar_types" format="default" sectionFormat="of" derivedContent="Section 5.2.13"/> for a detailed description of the different possible Record
	   Types.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.7">
          <name slugifiedName="name-aux-data-len">Aux Data Len</name>
          <t indent="0" pn="section-5.2.7-1">The Aux Data Len field contains the length of the Auxiliary Data
   field in this Multicast Address Record, in units of 32-bit words.  It
	   may contain zero, to indicate the absence of any auxiliary data.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.8">
          <name slugifiedName="name-number-of-sources-n-2">Number of Sources (N)</name>
          <t indent="0" pn="section-5.2.8-1">The Number of Sources (N) field specifies how many source addresses
	   are present in this Multicast Address Record.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.9">
          <name slugifiedName="name-multicast-address-2">Multicast Address</name>
          <t indent="0" pn="section-5.2.9-1">The Multicast Address field contains the multicast address to which
	   this Multicast Address Record pertains.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.10">
          <name slugifiedName="name-source-address-i-2">Source Address [i]</name>
          <t indent="0" pn="section-5.2.10-1">The Source Address [i] fields are a vector of n unicast addresses,
	   where n is the value in this record's Number of Sources (N) field.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.11">
          <name slugifiedName="name-auxiliary-data">Auxiliary Data</name>
          <t indent="0" pn="section-5.2.11-1">The Auxiliary Data field, if present, contains additional information
   that pertains to this Multicast Address Record.  The protocol
   specified in this document, MLDv2, does not define any auxiliary
   data.  Therefore, implementations of MLDv2 <bcp14>MUST NOT</bcp14> include any
   auxiliary data (i.e., <bcp14>MUST</bcp14> set the Aux Data Len field to zero) in any
   transmitted Multicast Address Record and <bcp14>MUST</bcp14> ignore any such data
   present in any received Multicast Address Record.  The semantics and
   the internal encoding of the Auxiliary Data field are to be defined
	   by any future version or extension of MLD that uses this field.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.12">
          <name slugifiedName="name-additional-data-2">Additional Data</name>
          <t indent="0" pn="section-5.2.12-1">If the Payload Length field in the IPv6 header of a received Report
   indicates that there are additional octets of data present, beyond
   the last Multicast Address Record, MLDv2 implementations <bcp14>MUST</bcp14> include
   those octets in the computation to verify the received MLD Checksum,
   but <bcp14>MUST</bcp14> otherwise ignore those additional octets.  When sending a
   Report, an MLDv2 implementation <bcp14>MUST NOT</bcp14> include additional octets
	   beyond the last Multicast Address Record.</t>
        </section>
        <section anchor="mar_types" numbered="true" toc="include" removeInRFC="false" pn="section-5.2.13">
          <name slugifiedName="name-multicast-address-record-ty">Multicast Address Record Types</name>
          <t indent="0" pn="section-5.2.13-1">There are a number of different types of Multicast Address
          Records that may be included in a Report message:</t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.2.13-2">
            <li pn="section-5.2.13-2.1">
              <t indent="0" pn="section-5.2.13-2.1.1">A "Current-State Record" is sent by a node in response to
            a Query received on an interface.  It reports the current
            listening state of that interface, with respect to a single
            multicast address.  The Record Type of a Current-State Record may
            be one of the following two values:</t>
              <ol group="my_cnt" spacing="normal" type="1" start="1" indent="adaptive" pn="section-5.2.13-2.1.2"><li pn="section-5.2.13-2.1.2.1" derivedCounter="1.">
                  <t indent="0" pn="section-5.2.13-2.1.2.1.1">MODE_IS_INCLUDE - indicates that the interface has a
                  filter-mode of INCLUDE for the specified multicast address.
                  The Source Address [i] fields in this Multicast Address
                  Record contain the interface's source-list for the specified
                  multicast address.  A MODE_IS_INCLUDE Record is never sent
                  with an empty source-list.</t>
                </li>
                <li pn="section-5.2.13-2.1.2.2" derivedCounter="2.">
                  <t indent="0" pn="section-5.2.13-2.1.2.2.1">MODE_IS_EXCLUDE - indicates that the interface has a
                  filter-mode of EXCLUDE for the specified multicast address.
                  The Source Address [i] fields in this Multicast Address
                  Record contain the interface's source-list for the specified
                  multicast address, if it is non-empty. An SSM-aware host
                  <bcp14>SHOULD NOT</bcp14> send a MODE_IS_EXCLUDE record type
                  for multicast addresses that fall within the SSM address
                  range as they will be ignored by SSM-aware routers <xref target="RFC4604" format="default" sectionFormat="of" derivedContent="RFC4604"/>.</t>
                </li>
              </ol>
            </li>
            <li pn="section-5.2.13-2.2">
              <t indent="0" pn="section-5.2.13-2.2.1">A "Filter-Mode-Change Record" is sent by a node whenever a
              local invocation of IPv6MulticastListen causes a change of the
              filter-mode (i.e., a change from INCLUDE to EXCLUDE, or from
              EXCLUDE to INCLUDE) of the interface-level state entry for a
              particular multicast address, whether the source-list changes at
              the same time or not.  The Record is included in a Report sent
              from the interface on which the change occurred.  The Record
              Type of a Filter-Mode-Change Record may be one of the following
              two values:
              </t>
              <ol group="my_cnt" spacing="normal" type="1" start="3" indent="adaptive" pn="section-5.2.13-2.2.2"><li pn="section-5.2.13-2.2.2.1" derivedCounter="3.">
                  <t indent="0" pn="section-5.2.13-2.2.2.1.1">CHANGE_TO_INCLUDE_MODE - indicates that the interface has
                  changed to INCLUDE filter-mode for the specified multicast
                  address.  The Source Address [i] fields in this Multicast
                  Address Record contain the interface's new source-list for
                  the specified multicast address, if it is non-empty.</t>
                </li>
                <li pn="section-5.2.13-2.2.2.2" derivedCounter="4.">
                  <t indent="0" pn="section-5.2.13-2.2.2.2.1">CHANGE_TO_EXCLUDE_MODE - indicates that the interface has
                  changed to EXCLUDE filter-mode for the specified multicast
                  address.  The Source Address [i] fields in this Multicast
                  Address Record contain the interface's new source-list for
                  the specified multicast address, if it is non-empty. An
                  SSM-aware host <bcp14>SHOULD NOT</bcp14> send a
                  CHANGE_TO_EXCLUDE_MODE record type for multicast addresses
                  that fall within the SSM address range.</t>
                </li>
              </ol>
            </li>
            <li pn="section-5.2.13-2.3">
              <t indent="0" pn="section-5.2.13-2.3.1">A "Source-List-Change Record" is sent by a node whenever a
              local invocation of IPv6MulticastListen causes a change of
              source-list that is not coincident with a change of filter-mode,
              of the interface-level state entry for a particular multicast
              address.  The Record is included in a Report sent from the
              interface on which the change occurred.  The Record Type of a
              Source-List-Change Record may be one of the following two
              values:</t>
              <ol group="my_cnt" spacing="normal" type="1" start="5" indent="adaptive" pn="section-5.2.13-2.3.2"><li pn="section-5.2.13-2.3.2.1" derivedCounter="5.">
                  <t indent="0" pn="section-5.2.13-2.3.2.1.1">ALLOW_NEW_SOURCES - indicates that the Source Address [i]
                  fields in this Multicast Address Record contain a list of
                  the additional sources that the node wishes to listen to,
                  for packets sent to the specified multicast address.  If the
                  change was to an INCLUDE source-list, these are the
                  addresses that were added to the list; if the change was to
                  an EXCLUDE source-list, these are the addresses that were
                  deleted from the list.</t>
                </li>
                <li pn="section-5.2.13-2.3.2.2" derivedCounter="6.">
                  <t indent="0" pn="section-5.2.13-2.3.2.2.1">BLOCK_OLD_SOURCES - indicates that the Source Address [i]
                  fields in this Multicast Address Record contain a list of
                  the sources that the node no longer wishes to listen to, for
                  packets sent to the specified multicast address.  If the
                  change was to an INCLUDE source-list, these are the
                  addresses that were deleted from the list; if the change was
                  to an EXCLUDE source-list, these are the addresses that were
                  added to the list.</t>
                </li>
              </ol>
            </li>
          </ul>
          <t indent="0" pn="section-5.2.13-3">If a change of source-list results in both allowing new sources and
   blocking old sources, then two Multicast Address Records are sent for
   the same multicast address, one of type ALLOW_NEW_SOURCES and one of
	   type BLOCK_OLD_SOURCES.</t>
          <t indent="0" pn="section-5.2.13-4">We use the term "State-Change Record" to refer to either a Filter
	   Mode Change Record or a Source-List-Change Record.</t>
          <t indent="0" pn="section-5.2.13-5">Multicast Address Records with an unrecognized Record Type value <bcp14>MUST</bcp14>
	   be silently ignored, with the rest of the report being processed.</t>
          <t indent="0" pn="section-5.2.13-6">In the rest of this document, we use the following notation to
   describe the contents of a Multicast Address Record that pertains to
	   a particular multicast address:</t>
          <ul spacing="compact" bare="false" empty="false" indent="3" pn="section-5.2.13-7">
            <li pn="section-5.2.13-7.1">IS_IN ( x )  -  Type MODE_IS_INCLUDE, source addresses x</li>
            <li pn="section-5.2.13-7.2">IS_EX ( x )  -  Type MODE_IS_EXCLUDE, source addresses x</li>
            <li pn="section-5.2.13-7.3">TO_IN ( x )  -  Type CHANGE_TO_INCLUDE_MODE, source addresses x</li>
            <li pn="section-5.2.13-7.4">TO_EX ( x )  -  Type CHANGE_TO_EXCLUDE_MODE, source addresses x</li>
            <li pn="section-5.2.13-7.5">ALLOW ( x )  -  Type ALLOW_NEW_SOURCES, source addresses x</li>
            <li pn="section-5.2.13-7.6">BLOCK ( x )  -  Type BLOCK_OLD_SOURCES, source addresses x</li>
          </ul>
          <t indent="0" pn="section-5.2.13-8">where x is either:
          </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.2.13-9">
            <li pn="section-5.2.13-9.1">
              <t indent="0" pn="section-5.2.13-9.1.1">a capital letter (e.g., "A") to represent the set of source
	   addresses or</t>
            </li>
            <li pn="section-5.2.13-9.2">
              <t indent="0" pn="section-5.2.13-9.2.1">a set expression (e.g., "A+B"), where "A+B" means the union of
      sets A and B,  "A*B" means the intersection of sets A and B, and
	   "A-B" means the removal of all elements of set B from set A.</t>
            </li>
          </ul>
        </section>
        <section anchor="src_addrs" numbered="true" toc="include" removeInRFC="false" pn="section-5.2.14">
          <name slugifiedName="name-source-addresses-for-report">Source Addresses for Reports</name>
          <t indent="0" pn="section-5.2.14-1">An MLDv2 Report <bcp14>MUST</bcp14> be sent with a valid IPv6 link-local source
   address, or the unspecified address (::), if the sending interface
   has not acquired a valid link-local address yet.  Sending reports
   with the unspecified address is allowed to support the use of IP
   multicast in the Neighbor Discovery Protocol <xref target="RFC4861" format="default" sectionFormat="of" derivedContent="RFC4861"/>.  For
   stateless autoconfiguration, as defined in <xref target="RFC4862" format="default" sectionFormat="of" derivedContent="RFC4862"/>, a node is
   required to join several IPv6 multicast groups, in order to perform
   Duplicate Address Detection (DAD).  Prior to DAD, the only address
   the reporting node has for the sending interface is a tentative one,
   which cannot be used for communication.  Thus, the unspecified
	   address must be used.</t>
          <t indent="0" pn="section-5.2.14-2">On the other hand, routers <bcp14>MUST</bcp14> silently discard a message that is
   not sent with a valid link-local address, without taking any action
   on the contents of the packet.  Thus, a Report is discarded if the
   router cannot identify the source address of the packet as belonging
   to a link connected to the interface on which the packet was
   received.  A Report sent with the unspecified address is also
   discarded by the router.  This enhances security, as unidentified
   reporting nodes cannot influence the state of the MLDv2 router(s).
   Nevertheless, the reporting node has modified its listening state for
   multicast addresses that are contained in the Multicast Address
   Records of the Report message.  From now on, it will treat packets
   sent to those multicast addresses according to this new listening
   state.  Once a valid link-local address is available, a node <bcp14>SHOULD</bcp14>
   generate new MLDv2 Report messages for all multicast addresses joined
	   on the interface.</t>
        </section>
        <section anchor="dest_addr" numbered="true" toc="include" removeInRFC="false" pn="section-5.2.15">
          <name slugifiedName="name-destination-addresses-for-r">Destination Addresses for Reports</name>
          <t indent="0" pn="section-5.2.15-1">Version 2 Multicast Listener Reports are sent with an IP destination
   address of ff02::16, to which all MLDv2-capable multicast
   routers listen (see <xref target="iana" format="default" sectionFormat="of" derivedContent="Section 11"/> for IANA considerations related to
   this special destination address).  A node that operates in version 1
   compatibility mode (see details in <xref target="interop" format="default" sectionFormat="of" derivedContent="Section 8"/>) sends version 1 Reports
   to the multicast address specified in the Multicast Address field of
   the Report.  In addition, a node <bcp14>MUST</bcp14> accept and process any version
   1 Report whose IP Destination Address field contains any of the
   IPv6 addresses (unicast or multicast) assigned to the interface on
   which the Report arrives.  This might be useful, e.g., for debugging
   purposes.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-5.2.16">
          <name slugifiedName="name-multicast-listener-report-s">Multicast Listener Report Size</name>
          <t indent="0" pn="section-5.2.16-1">If the set of Multicast Address Records required in a Report does not
   fit within the size limit of a single Report message (as determined
   by the MTU of the link on which it will be sent), the Multicast
   Address Records are sent in as many Report messages as needed to
	   report the entire set.</t>
          <t indent="0" pn="section-5.2.16-2">If a single Multicast Address Record contains so many source
   addresses that it does not fit within the size limit of a single
   Report message, then:
          </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-5.2.16-3">
            <li pn="section-5.2.16-3.1">
              <t indent="0" pn="section-5.2.16-3.1.1">if its Type is not IS_EX or TO_EX, it is split into multiple
      Multicast Address Records; each such record contains a different
	   subset of the source addresses and is sent in a separate Report.</t>
            </li>
            <li pn="section-5.2.16-3.2">
              <t indent="0" pn="section-5.2.16-3.2.1">if its Type is IS_EX or TO_EX, a single Multicast Address Record
      is sent, with as many source addresses as can fit; the remaining
      source addresses are not reported.  Although the choice of which
      sources to report is arbitrary, it is preferable to report the
      same set of sources in each subsequent report, rather than
	   reporting different sources each time.</t>
            </li>
          </ul>
        </section>
      </section>
    </section>
    <section anchor="proto" numbered="true" toc="include" removeInRFC="false" pn="section-6">
      <name slugifiedName="name-protocol-description-for-mu">Protocol Description for Multicast Address Listeners</name>
      <t indent="0" pn="section-6-1">MLD is an asymmetric protocol, as it specifies separate behaviors for
   Multicast Address Listeners -- that is, hosts or routers that listen
   to multicast packets -- and multicast routers.  This section
   describes the part of MLDv2 that applies to all Multicast Address
   Listeners.  (Note that a multicast router that is also a Multicast
   Address Listener performs both parts of MLDv2; it receives and it
   responds to its own MLD messages as well as to those of its
   neighbors.)  The multicast router part of MLDv2 is described in
   <xref target="mr_proto" format="default" sectionFormat="of" derivedContent="Section 7"/>.</t>
      <t indent="0" pn="section-6-2">A node performs the protocol described in this section over all
   interfaces on which multicast reception is supported, even if more
   than one of those interfaces are connected to the same link.</t>
      <t indent="0" pn="section-6-3">For interoperability with multicast routers that run the MLDv1
   protocol, nodes maintain a Host Compatibility Mode variable for each
   interface on which multicast reception is supported.  This section
   describes the behavior of Multicast Address Listener nodes on
   interfaces for which Host Compatibility Mode = MLDv2.  The algorithm
   for determining Host Compatibility Mode and the behavior if its
   value is set to MLDv1 are described in <xref target="interop" format="default" sectionFormat="of" derivedContent="Section 8"/>.</t>
      <t indent="0" pn="section-6-4">The link-scope all-nodes multicast address, (ff02::1), is handled as
   a special case.  On all nodes -- that is, all hosts and routers
   including multicast routers -- listening to packets destined to the
   all-nodes multicast address, from all sources, is permanently enabled
   on all interfaces on which multicast listening is supported.
   No MLD messages are ever sent regarding neither the link-scope all-nodes
   multicast address, nor any multicast address of scope 0 (reserved) or
   1 (node-local). Multicast listeners <bcp14>MUST</bcp14> send MLD messages for all multicast
   addresses except for the link-scope all-nodes multicast address and any multicast
   addresses of scope less than 2.</t>
      <t indent="0" pn="section-6-5">There are three types of events that trigger MLDv2 protocol actions
   on an interface:
      </t>
      <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6-6">
        <li pn="section-6-6.1">
          <t indent="0" pn="section-6-6.1.1">a change of the per-interface listening state, caused by a local
	   invocation of IPv6MulticastListen;</t>
        </li>
        <li pn="section-6-6.2">
          <t indent="0" pn="section-6-6.2.1">the firing of a specific timer; and</t>
        </li>
        <li pn="section-6-6.3">
          <t indent="0" pn="section-6-6.3.1">the reception of a Query.</t>
        </li>
      </ul>
      <t indent="0" pn="section-6-7">(Received MLD messages of types other than Query are silently
   ignored, except as required for interoperation with nodes that
	   implement MLDv1.)</t>
      <t indent="0" pn="section-6-8">The following subsections describe the actions to be taken for each
   case.  Timer and counter names appear in square brackets.  Default
	   values for those timers and counters are specified in <xref target="timers" format="default" sectionFormat="of" derivedContent="Section 9"/>.</t>
      <section anchor="chg_if_state" numbered="true" toc="include" removeInRFC="false" pn="section-6.1">
        <name slugifiedName="name-action-on-change-of-per-int">Action on Change of Per-Interface State</name>
        <t indent="0" pn="section-6.1-1">An invocation of IPv6MulticastListen may cause the Multicast Address Listening
	state of an interface to change, according to the rules in
   <xref target="if_state" format="default" sectionFormat="of" derivedContent="Section 4.2"/>.  Each such change affects the per-interface entry for a
   single multicast address.</t>
        <t indent="0" pn="section-6.1-2">A change of per-interface state causes the node to immediately
   transmit a State-Change Report from that interface.  The type and
   contents of the Multicast Address Record(s) in that Report are
   determined by comparing the filter-mode and source-list for the
   affected multicast address before and after the change, according to
   <xref target="rec-xmit-logic" format="default" sectionFormat="of" derivedContent="Table 1"/>.  If no per-interface state existed for that
   multicast address before the change (i.e., the change consisted of
   creating a new per-interface record), or if no state exists after the
   change (i.e., the change consisted of deleting a per-interface
   record), then the "non-existent" state is considered to have an
	   INCLUDE filter-mode and an empty source-list.</t>
        <table align="left" anchor="rec-xmit-logic" pn="table-1">
          <name slugifiedName="name-state-change-record-transmi">State-Change Record Transmission Logic</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Old State</th>
              <th align="left" colspan="1" rowspan="1">New State</th>
              <th align="left" colspan="1" rowspan="1">State-Change Record Sent</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
              <td align="left" colspan="1" rowspan="1">INCLUDE (B)</td>
              <td align="left" colspan="1" rowspan="1">ALLOW (B-A), BLOCK (A-B)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">EXCLUDE (A)</td>
              <td align="left" colspan="1" rowspan="1">EXCLUDE (B)</td>
              <td align="left" colspan="1" rowspan="1">ALLOW (A-B), BLOCK (B-A)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
              <td align="left" colspan="1" rowspan="1">EXCLUDE (B)</td>
              <td align="left" colspan="1" rowspan="1">TO_EX (B)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">EXCLUDE (A)</td>
              <td align="left" colspan="1" rowspan="1">INCLUDE (B)</td>
              <td align="left" colspan="1" rowspan="1">TO_IN (B)</td>
            </tr>
          </tbody>
        </table>
        <t indent="0" pn="section-6.1-4">If the computed source-list for either an ALLOW or a BLOCK State-Change 
	   Record is empty, that record is omitted from the Report.</t>
        <t indent="0" pn="section-6.1-5">To cover the possibility of the State-Change Report being missed by
   one or more multicast routers, [Robustness Variable] - 1
   retransmissions are scheduled, through a Retransmission Timer, at
   intervals chosen at random from the range (0, [Unsolicited Report
	   Interval]).</t>
        <t indent="0" pn="section-6.1-6">If more changes to the same per-interface state entry occur before
   all the retransmissions of the State-Change Report for the first
   change have been completed, each such additional change triggers the
	   immediate transmission of a new State-Change Report.</t>
        <t indent="0" pn="section-6.1-7">The contents of the new Report are calculated as follows:
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.1-8">
          <li pn="section-6.1-8.1">
            <t indent="0" pn="section-6.1-8.1.1">As for the first Report, the per-interface state for the affected
	   multicast address before and after the latest change is compared.</t>
          </li>
          <li pn="section-6.1-8.2">
            <t indent="0" pn="section-6.1-8.2.1">The records that express the difference are built according to the
      table above.  Nevertheless, these records are not transmitted in a
      separate message, but they are instead merged with the contents of
      the pending report, to create the new State-Change Report.  The
	   rules for calculating this merged report are described below.</t>
          </li>
        </ul>
        <t indent="0" pn="section-6.1-9">The transmission of the merged State-Change Report terminates
   retransmissions of the earlier State-Change Reports for the same
   multicast address and becomes the first of [Robustness Variable]
   transmissions of the new State-Change Reports.  These transmissions
   are necessary in order to ensure that each instance of state change
	   is transmitted at least [Robustness Variable] times.</t>
        <t indent="0" pn="section-6.1-10">Each time a source is included in the difference report calculated
   above, retransmission state for that source needs to be maintained
   until [Robustness Variable] State-Change Reports have been sent by
   the node.  This is done in order to ensure that a series of
   successive state changes do not break the protocol robustness.
   Sources in retransmission state can be kept in a per-multicast-address
   Retransmission List, with a Source Retransmission Counter
   associated to each source in the list.  When a source is included in
   the list, its counter is set to [Robustness Variable].  Each time a
   State-Change Report is sent, the counter is decreased by one unit.
   When the counter reaches zero, the source is deleted from the
	   Retransmission List for that multicast address.</t>
        <t indent="0" pn="section-6.1-11">If the per-interface listening change that triggers the new report is
   a filter-mode change, then the next [Robustness Variable] State-Change
   Reports will include a Filter-Mode-Change Record.  This
   applies even if any number of source-list changes occur in that
   period.  The node has to maintain retransmission state for the
   multicast address until the [Robustness Variable] State-Change
   Reports have been sent. This can be done through a per-multicast-address
   Filter Mode Retransmission Counter.  When the filter-mode
   changes, the counter is set to [Robustness Variable].  Each time a
   State-Change Report is sent the counter is decreased by one unit.
   When the counter reaches zero, i.e., [Robustness Variable] State-Change
   Reports with Filter-Mode-Change Records have been transmitted
   after the last filter-mode change, and if source-list changes have
   resulted in additional reports being scheduled, then the next State-Change
	   Report will include Source-List-Change Records.</t>
        <t indent="0" pn="section-6.1-12">Each time a per-interface listening state change triggers the
   immediate transmission of a new State-Change Report, its contents are
   determined as follows.  If the report should contain a Filter-Mode-Change
   Record, i.e., the Filter Mode Retransmission Counter for that
   multicast address has a value higher than zero, then, if the current
   filter-mode of the interface is INCLUDE, a TO_IN record is included
   in the report; otherwise, a TO_EX record is included.  If instead the
   report should contain Source-List-Change Records, i.e., the Filter
   Mode Retransmission Counter for that multicast address is zero, an
   ALLOW and a BLOCK record is included.  The contents of these records
	   are built according <xref target="if-rep-info" format="default" sectionFormat="of" derivedContent="Table 2"/>.</t>
        <table align="left" anchor="if-rep-info" pn="table-2">
          <name slugifiedName="name-per-interface-state-change-">Per-Interface State-Change Report Contents</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Record</th>
              <th align="left" colspan="1" rowspan="1">Sources Included</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">TO_IN</td>
              <td align="left" colspan="1" rowspan="1">All in the current per-interface state that must be forwarded.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">TO_EX</td>
              <td align="left" colspan="1" rowspan="1">All in the current per-interface state that must be blocked.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">ALLOW</td>
              <td align="left" colspan="1" rowspan="1">All with retransmission state (i.e., all sources from the Retransmission List) that must be forwarded.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">BLOCK</td>
              <td align="left" colspan="1" rowspan="1">All with retransmission state that must be blocked.</td>
            </tr>
          </tbody>
        </table>
        <t indent="0" pn="section-6.1-14">If the computed source-list for either an ALLOW or a BLOCK record is
	empty, that record is omitted from the State-Change Report.</t>
        <aside pn="section-6.1-15">
          <t indent="0" pn="section-6.1-15.1">Note:  When the first State-Change Report is sent, the non-existent
   pending report to merge with can be treated as a Source-Change Report
   with empty ALLOW and BLOCK records (no sources have retransmission
	   state).</t>
        </aside>
        <t indent="0" pn="section-6.1-16">The building of a scheduled State-Change Report, triggered by the
   firing of a Retransmission Timer, instead of a per-interface
	   listening state change, is described in <xref target="timer_act" format="default" sectionFormat="of" derivedContent="Section 6.3"/>.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-6.2">
        <name slugifiedName="name-action-on-reception-of-a-qu">Action on Reception of a Query</name>
        <t indent="0" pn="section-6.2-1">Upon reception of an MLD message that contains a Query, the node
   checks if the source address of the message is a valid link-local
   address, if the Hop Limit is set to 1, and if the Router Alert option
   is present in the Hop-by-Hop Options header of the IPv6 packet.  If
	   any of these checks fail, the packet is dropped.</t>
        <t indent="0" pn="section-6.2-2">If the validity of the MLD message is verified, the node starts to
   process the Query.  Instead of responding immediately, the node
   delays its response by a random amount of time, bounded by the
   Maximum Response Delay value derived from the Maximum Response Code
   in the received Query Message.  A node may receive a variety of
   Queries on different interfaces and of different kinds (e.g., General
   Queries, Multicast Address Specific Queries, and Multicast Address
   and Source Specific Queries), each of which may require its own
	   delayed response.</t>
        <t indent="0" pn="section-6.2-3">Before scheduling a response to a Query, the node must first consider
   previously scheduled pending responses and, in many cases, schedule a
   combined response.  Therefore, for each of its interfaces on which it
   operates the listener part of the MLDv2 protocol, the node must be
   able to maintain the following state:
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-6.2-4">
          <li pn="section-6.2-4.1">
            <t indent="0" pn="section-6.2-4.1.1">an Interface Timer for scheduling responses to General Queries;</t>
          </li>
          <li pn="section-6.2-4.2">
            <t indent="0" pn="section-6.2-4.2.1">a Multicast Address Timer for scheduling responses to Multicast
      Address (and Source) Specific Queries, for each multicast address
	   the node has to report on; and</t>
          </li>
          <li pn="section-6.2-4.3">
            <t indent="0" pn="section-6.2-4.3.1">a per-multicast-address list of sources to be reported in response
	   to a Multicast Address and Source Specific Query.</t>
          </li>
        </ul>
        <t indent="0" pn="section-6.2-5">When a valid General Query arrives on an interface, the node
   checks whether it has any per-interface listening state record to
   report on, or not.  Similarly, when a valid Multicast Address
   (and Source) Specific Query arrives on an interface, the node checks
   whether it has a per-interface listening state record that
   corresponds to the queried multicast address (and source), or not. If
   it does, a delay for a response is randomly selected in the range (0,
   [Maximum Response Delay]), where Maximum Response Delay is derived
   from the Maximum Response Code inserted in the received Query
   Message.  The following rules are then used to determine if a Report
   needs to be scheduled or not and the type of Report to schedule.
   (The rules are considered in order and only the first matching rule
   is applied.)

        </t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-6.2-6"><li pn="section-6.2-6.1" derivedCounter="1.">
            <t indent="0" pn="section-6.2-6.1.1">If there is a pending response to a previous General Query
      scheduled sooner than the selected delay, no additional response
	   needs to be scheduled.</t>
          </li>
          <li pn="section-6.2-6.2" derivedCounter="2.">
            <t indent="0" pn="section-6.2-6.2.1">If the received Query is a General Query, the Interface Timer is
      used to schedule a response to the General Query after the
      selected delay.  Any previously pending response to a General
	   Query is canceled.</t>
          </li>
          <li pn="section-6.2-6.3" derivedCounter="3.">
            <t indent="0" pn="section-6.2-6.3.1">If the received Query is a Multicast Address Specific Query or a
      Multicast Address and Source Specific Query and there is no
      pending response to a previous Query for this multicast address,
      then the Multicast Address Timer is used to schedule a report.  If
      the received Query is a Multicast Address and Source Specific
      Query, the list of queried sources is recorded for use when
	   generating a response.</t>
          </li>
          <li pn="section-6.2-6.4" derivedCounter="4.">
            <t indent="0" pn="section-6.2-6.4.1">If there is already a pending response to a previous Query
      scheduled for this multicast address, and either the new Query is
      a Multicast Address Specific Query or the recorded source-list
      associated with the multicast address is empty, then the multicast
      address source-list is cleared and a single response is scheduled,
      using the Multicast Address Timer.  The new response is scheduled
      to be sent at the earliest of the remaining time for the pending
	   report and the selected delay.</t>
          </li>
          <li pn="section-6.2-6.5" derivedCounter="5.">
            <t indent="0" pn="section-6.2-6.5.1">If the received Query is a Multicast Address and Source Specific
      Query and there is a pending response for this multicast address
      with a non-empty source-list, then the multicast address source-list
      is augmented to contain the list of sources in the new Query,
      and a single response is scheduled using the Multicast Address
      Timer.  The new response is scheduled to be sent at the earliest
      of the remaining time for the pending report and the selected
	   delay.</t>
          </li>
        </ol>
      </section>
      <section anchor="timer_act" numbered="true" toc="include" removeInRFC="false" pn="section-6.3">
        <name slugifiedName="name-action-on-timer-expiration">Action on Timer Expiration</name>
        <t indent="0" pn="section-6.3-1">There are several timers that, upon expiration, trigger protocol
   actions on an MLDv2 Multicast Address Listener node.  All these
   actions are related to pending reports scheduled by the node.
        </t>
        <ol group="my_cnt_2" spacing="normal" type="1" start="1" indent="adaptive" pn="section-6.3-2"><li pn="section-6.3-2.1" derivedCounter="1.">
            <t indent="0" pn="section-6.3-2.1.1">If the expired timer is the Interface Timer (i.e., there is a
            pending response to a General Query), then one Current-State
            Record is sent for each multicast address for which the specified
            interface has listening state, as described in <xref target="if_state" format="default" sectionFormat="of" derivedContent="Section 4.2"/>.  The Current-State Record
            carries the multicast address and its associated filter-mode
            (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source-list.  Multiple
            Current-State Records are packed into individual Report messages,
            to the extent possible.</t>
            <t indent="0" pn="section-6.3-2.1.2">This naive algorithm may result in bursts of packets when a
            node listens to a large number of multicast addresses.  Instead of
            using a single Interface Timer, implementations are recommended to
            spread transmission of such Report messages over the interval (0,
            [Maximum Response Delay]).  Note that any such implementation
            <bcp14>MUST</bcp14> avoid the "ack-implosion" problem, i.e.,
            <bcp14>MUST NOT</bcp14> send a Report immediately upon reception
            of a General Query.</t>
          </li>
          <li pn="section-6.3-2.2" derivedCounter="2.">
            <t indent="0" pn="section-6.3-2.2.1">If the expired timer is a Multicast Address Timer and the list
            of recorded sources for that multicast address is empty (i.e.,
            there is a pending response to a Multicast Address Specific
            Query), then if, and only if, the interface has listening state
            for that multicast address, a single Current-State Record is sent
            for that address.  The Current-State Record carries the multicast
            address and its associated filter-mode (MODE_IS_INCLUDE or
            MODE_IS_EXCLUDE) and source-list, if any.</t>
          </li>
          <li pn="section-6.3-2.3" derivedCounter="3.">
            <t indent="0" pn="section-6.3-2.3.1">If the expired timer is a Multicast Address Timer and the list
            of recorded sources for that multicast address is non-empty (i.e.,
            there is a pending response to a Multicast Address and Source
            Specific Query), then if, and only if, the interface has listening
            state for that multicast address, the contents of the
            corresponding Current-State Record are determined from the per-
            interface state and the pending response record, as specified in
            <xref target="csr-info" format="default" sectionFormat="of" derivedContent="Table 3"/>.</t>
            <table align="left" anchor="csr-info" pn="table-3">
              <name slugifiedName="name-determining-contents-of-cur">Determining Contents of Current-State Record</name>
              <thead>
                <tr>
                  <th align="left" colspan="1" rowspan="1">Per-Interface State</th>
                  <th align="left" colspan="1" rowspan="1">Set of Sources in the Pending Response Record</th>
                  <th align="left" colspan="1" rowspan="1">Current-State Record</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                  <td align="left" colspan="1" rowspan="1">B</td>
                  <td align="left" colspan="1" rowspan="1">IS_IN (A*B)</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">EXCLUDE (A)</td>
                  <td align="left" colspan="1" rowspan="1">B</td>
                  <td align="left" colspan="1" rowspan="1">IS_IN (B-A)</td>
                </tr>
              </tbody>
            </table>
            <t indent="0" pn="section-6.3-2.3.3">If the resulting Current-State Record has an empty set of
          source addresses, then no response is sent.  After the required
          Report messages have been generated, the source-lists associated
          with any reported multicast addresses are cleared.</t>
          </li>
          <li pn="section-6.3-2.4" derivedCounter="4.">
            <t indent="0" pn="section-6.3-2.4.1">If the expired timer is a Retransmission Timer for a multicast
            address (i.e., there is a pending State-Change Report for that
            multicast address), the contents of the report are determined as
            follows.  If the report should contain a Filter-Mode-Change
            Record, i.e., the Filter Mode Retransmission Counter for that
            multicast address has a value higher than zero, then, if the
            current filter-mode of the interface is INCLUDE, a TO_IN record is
            included in the report; otherwise a TO_EX record is included.  In
            both cases, the Filter Mode Retransmission Counter for that
            multicast address is decremented by one unit after the
            transmission of the report.
            </t>
            <t indent="0" pn="section-6.3-2.4.2">If instead the report should contain Source-List-Change
            Records, i.e., the Filter Mode Retransmission Counter for that
            multicast address is zero, an ALLOW and a BLOCK record is
            included.  The contents of these records are built according to
            <xref target="slcr-info" format="default" sectionFormat="of" derivedContent="Table 4"/>.</t>
            <table align="left" anchor="slcr-info" pn="table-4">
              <name slugifiedName="name-determining-contents-of-sou">Determining Contents of Source-List-Change Records</name>
              <thead>
                <tr>
                  <th align="left" colspan="1" rowspan="1">Record</th>
                  <th align="left" colspan="1" rowspan="1">Sources Included</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="left" colspan="1" rowspan="1">TO_IN</td>
                  <td align="left" colspan="1" rowspan="1">All in the current per-interface state that must be forwarded.</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">TO_EX</td>
                  <td align="left" colspan="1" rowspan="1">All in the current per-interface state that must be blocked.</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">ALLOW</td>
                  <td align="left" colspan="1" rowspan="1">All with retransmission state (i.e., all sources from the
		      Retransmission List) that must be forwarded.  For each included source,
		      its Source Retransmission Counter is decreased with one unit after the
		      transmission of the report.  If the counter reaches zero, the source is
		    deleted from the Retransmission List for that multicast address.</td>
                </tr>
                <tr>
                  <td align="left" colspan="1" rowspan="1">BLOCK</td>
                  <td align="left" colspan="1" rowspan="1">All with retransmission state (i.e., all sources from the
		      Retransmission List) that must be blocked.  For each included source,
		      its Source Retransmission Counter is decreased with one unit after the
		      transmission of the report.  If the counter reaches zero, the source is
		    deleted from the Retransmission List for that multicast address.</td>
                </tr>
              </tbody>
            </table>
            <t indent="0" pn="section-6.3-2.4.4">If the computed source-list for either an ALLOW or a BLOCK record
      is empty, that record is omitted from the State-Change Report.</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="mr_proto" numbered="true" toc="include" removeInRFC="false" pn="section-7">
      <name slugifiedName="name-description-of-the-protocol">Description of the Protocol for Multicast Routers</name>
      <t indent="0" pn="section-7-1">The purpose of MLD is to enable each multicast router to learn, for
   each of its directly attached links, which multicast addresses have
   listeners on that link.  MLD version 2 adds the capability for a
   multicast router to also learn which sources have listeners among
   the neighboring nodes, for packets sent to any particular multicast
   address.  The information gathered by MLD is provided to whichever
   multicast routing protocol is used by the router, in order to ensure
   that multicast packets are delivered to all links where there are
	   interested listeners.</t>
      <t indent="0" pn="section-7-2">This section describes the part of MLDv2 that is performed by
   multicast routers.  Multicast routers may themselves become Multicast
   Address Listeners and therefore also perform the multicast listener
	   part of MLDv2, as described in <xref target="proto" format="default" sectionFormat="of" derivedContent="Section 6"/>.</t>
      <t indent="0" pn="section-7-3">A multicast router performs the protocol described in this section
   over each of its directly attached links.  If a multicast router has
   more than one interface to the same link, it only needs to operate
	   this protocol over one of those interfaces.</t>
      <t indent="0" pn="section-7-4">For each interface over which the router operates the MLD protocol,
   the router must configure that interface to listen to all link-layer
   multicast addresses that can be generated by IPv6 multicasts.  For
   example, an Ethernet-attached router must set its Ethernet address
   reception filter to accept all Ethernet multicast addresses that
	   start with the hexadecimal value 3333 <xref target="RFC2464" format="default" sectionFormat="of" derivedContent="RFC2464"/>; in the case of an
   Ethernet interface that does not support the filtering of such a
   multicast address range, it must be configured to accept ALL Ethernet
	   multicast addresses, in order to meet the requirements of MLD.</t>
      <t indent="0" pn="section-7-5">On each interface over which this protocol is being run, the router
   <bcp14>MUST</bcp14> enable reception of the link-scope "all MLDv2-capable routers"
   multicast address from all sources and <bcp14>MUST</bcp14> perform the Multicast
	   Address Listener part of MLDv2 for that address on that interface.</t>
      <t indent="0" pn="section-7-6">Multicast routers only need to know that at least one node on an
   attached link listens to packets for a particular multicast address
   from a particular source; a multicast router is not required to
   individually keep track of the interests of each neighboring node.
	   (Nevertheless, see <xref target="host_suppress" format="default" sectionFormat="of" derivedContent="Appendix A.2"/>, item 1 for discussion.)</t>
      <t indent="0" pn="section-7-7">MLDv2 is backward compatible with the MLDv1 protocol.  For a detailed
	   description of compatibility issues, see <xref target="interop" format="default" sectionFormat="of" derivedContent="Section 8"/>.</t>
      <section anchor="mld_qrys" numbered="true" toc="include" removeInRFC="false" pn="section-7.1">
        <name slugifiedName="name-conditions-for-mld-queries">Conditions for MLD Queries</name>
        <t indent="0" pn="section-7.1-1">The behavior of a router that implements the MLDv2 protocol depends
   on whether there are several multicast routers on the same subnet, or
   not.  If it is the case, a querier election mechanism (described in
	   <xref target="elect" format="default" sectionFormat="of" derivedContent="Section 7.6.2"/>) is used to elect a single multicast router to be in
   Querier state.  All the multicast routers on the subnet listen to the
   messages sent by Multicast Address Listeners, and maintain the same
   multicast listening information state, so that they can quickly and
   correctly take over the querier functionality, should the present
   Querier fail.  Nevertheless, it is only the Querier that sends
	   periodical or triggered Query Messages on the subnet.</t>
        <t indent="0" pn="section-7.1-2">The Querier periodically sends General Queries to request Multicast
   Address Listener information from an attached link.  These queries
   are used to build and refresh the Multicast Address Listening state of
	   routers on attached links.</t>
        <t indent="0" pn="section-7.1-3">Nodes respond to these queries by reporting their Multicast Address
   Listening state (and set of sources they listen to) with Current
	   State Multicast Address Records in MLD Version 2 Multicast Listener Reports.</t>
        <t indent="0" pn="section-7.1-4">As a listener of a multicast address, a node may express interest in
   listening or not listening to traffic from particular sources.  As
   the desired listening state of a node changes, it reports these
   changes using Filter-Mode-Change Records or Source-List-Change
   Records.  These records indicate an explicit state change in a
   multicast address at a node in either the Multicast Address Record's
   source-list or its filter-mode.  When Multicast Address Listening is
   terminated at a node or traffic from a particular source is no longer
   desired, the Querier must query for other listeners of the multicast
   address or of the source before deleting the multicast address (or
   source) from its Multicast Address Listening state and pruning its
	   traffic.</t>
        <t indent="0" pn="section-7.1-5">To enable all nodes on a link to respond to changes in multicast
   address listening, the Querier sends specific queries.  A Multicast
   Address Specific Query is sent to verify that there are no nodes that
   listen to the specified multicast address or to "rebuild" the
   listening state for a particular multicast address.  Multicast
   Address Specific Queries are sent when the Querier receives a State-Change 
   Record indicating that a node ceases to listen to a multicast
   address.  They are also sent in order to enable a fast transition of
   a router from EXCLUDE to INCLUDE mode, in case a received State-Change 
	   Record motivates this action.</t>
        <t indent="0" pn="section-7.1-6">A Multicast Address and Source Specific Query is used to verify that
   there are no nodes on a link that listen to traffic from a specific
   set of sources.  Multicast Address and Source Specific Queries list
   sources for a particular multicast address that have been requested
   to no longer be forwarded.  This query is sent by the Querier in
   order to learn if any node listens to packets sent to the specified
   multicast address, from the specified source addresses.  Multicast
   Address and Source Specific Queries are only sent in response to
   State-Change Records and never in response to Current-State Records.
	   <xref target="qry_vars" format="default" sectionFormat="of" derivedContent="Section 5.1.13"/> describes each query in more detail.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-7.2">
        <name slugifiedName="name-mld-state-maintained-by-mul">MLD State Maintained by Multicast Routers</name>
        <t indent="0" pn="section-7.2-1">Multicast routers that implement the MLDv2 protocol keep state per
   multicast address per attached link.  This multicast address state
   consists of a filter-mode, a list of sources, and various timers. For
   each attached link on which MLD runs, a multicast router records the
   listening state for that link.  That state conceptually consists of a
	   set of records of the form:</t>
        <sourcecode name="" type="" markers="false" pn="section-7.2-2">
      (IPv6 multicast address, Filter Timer,
       Router Filter Mode, (source records) )</sourcecode>
        <t indent="0" pn="section-7.2-3">Each source record is of the form:</t>
        <sourcecode name="" type="" markers="false" pn="section-7.2-4">
      (IPv6 source address, source timer)</sourcecode>
        <t indent="0" pn="section-7.2-5">If all sources for a multicast address are listened to, an empty
   source record list is kept with the Router Filter Mode set to
   EXCLUDE.  This means that nodes on this link want all sources for
   this multicast address to be forwarded.  This is the MLDv2 equivalent
	   of an MLDv1 listening state.</t>
        <section numbered="true" toc="include" anchor="def-router-filter-mode" removeInRFC="false" pn="section-7.2.1">
          <name slugifiedName="name-definition-of-router-filter">Definition of Router Filter Mode</name>
          <t indent="0" pn="section-7.2.1-1">To reduce internal state, MLDv2 routers keep a filter-mode per
   multicast address per attached link.  This filter-mode is used to
   summarize the total listening state of a multicast address to a
   minimum set such that all nodes' listening states are respected.  The
   filter-mode may change in response to the reception of particular
   types of Multicast Address Records or when certain timer conditions
   occur.  In the following sections, we use the term "Router Filter
   Mode" to refer to the filter-mode of a particular multicast address
	   within a router.  <xref target="rcv_rpt" format="default" sectionFormat="of" derivedContent="Section 7.4"/> describes the changes of the Router
	   Filter Mode per Multicast Address Record received.</t>
          <t indent="0" pn="section-7.2.1-2">A router is in INCLUDE mode for a specific multicast address on a
   given interface if all the listeners on the link interested in that
   address are in INCLUDE mode.  The router state is represented through
   the notation INCLUDE (A), where A is called the "Include List".  The
   Include List is the set of sources that one or more listeners on the
   link have requested to receive.  All the sources from the Include
   List will be forwarded by the router.  Any other source that is not
	   in the Include List will be blocked by the router.</t>
          <t indent="0" pn="section-7.2.1-3">A router is in EXCLUDE mode for a specific multicast address on a
   given interface if there is at least one listener in EXCLUDE mode
   interested in that address on the link.  Conceptually, when a
   Multicast Address Record is received, the Router Filter Mode for that
   multicast address is updated to cover all the requested sources using
   the least amount of state.  As a rule, once a Multicast Address
   Record with a filter-mode of EXCLUDE is received, the Router Filter
   Mode for that multicast address will be set to EXCLUDE. Nevertheless,
   if all nodes with a Multicast Address Record having filter-mode set
   to EXCLUDE cease reporting, it is desirable for the Router Filter
   Mode for that multicast address to transition back to INCLUDE mode.
   This transition occurs when the Filter Timer expires; see <xref target="rtr_mode" format="default" sectionFormat="of" derivedContent="Section 7.5"/> for more details.</t>
          <t indent="0" pn="section-7.2.1-4">When the router is in EXCLUDE mode, the router state is represented
   through the notation EXCLUDE (X,Y), where X is called the "Requested
   List" and Y is called the "Exclude List".  All sources, except those
   from the Exclude List, will be forwarded by the router.  The
   Requested List has no effect on forwarding.  Nevertheless, it has to
	   be maintained for several reasons, as explained in <xref target="src_timers" format="default" sectionFormat="of" derivedContent="Section 7.2.3"/>.</t>
          <t indent="0" pn="section-7.2.1-5">The exact handling of both the INCLUDE and EXCLUDE mode router state,
   according to the received reports, is presented in detail in Sections 
   <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-7.2.2">
          <name slugifiedName="name-definition-of-filter-timers">Definition of Filter Timers</name>
          <t indent="0" pn="section-7.2.2-1">The Filter Timer is only used when the router is in EXCLUDE mode for
   a specific multicast address, and it represents the time for the
   Router Filter Mode of the multicast address to expire and switch to
   INCLUDE mode.  A Filter Timer is a decrementing timer with a lower
   bound of zero.  One Filter Timer exists per Multicast Address Record.
   Filter timers are updated according to the types of Multicast Address
   Records received.</t>
          <t indent="0" pn="section-7.2.2-2">If a Filter Timer expires, with the Router Filter Mode for that
   multicast address being EXCLUDE, it means that there are no more
   listeners in EXCLUDE mode on the attached link.  At this point, the
   router transitions to INCLUDE filter-mode.  <xref target="rtr_mode" format="default" sectionFormat="of" derivedContent="Section 7.5"/> describes the
   actions taken when a Filter Timer expires while in EXCLUDE mode.</t>
          <t keepWithNext="true" indent="0" pn="section-7.2.2-3"><xref target="FTM" format="default" sectionFormat="of" derivedContent="Table 5"/> summarizes the role of the Filter Timer. 
   <xref target="rcv_rpt" format="default" sectionFormat="of" derivedContent="Section 7.4"/> describes the details of setting the Filter Timer per type of
	   Multicast Address Record received.</t>
          <table align="left" anchor="FTM" pn="table-5">
            <name slugifiedName="name-filter-timer-management">Filter Timer Management</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Router Filter Mode</th>
                <th align="left" colspan="1" rowspan="1">Filter Timer Value</th>
                <th align="left" colspan="1" rowspan="1">Actions/Comments</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE</td>
                <td align="left" colspan="1" rowspan="1">Not Used</td>
                <td align="left" colspan="1" rowspan="1">All listeners in INCLUDE mode.</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE</td>
                <td align="left" colspan="1" rowspan="1">Timer &gt; 0</td>
                <td align="left" colspan="1" rowspan="1">At least one listener in EXCLUDE mode.</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE</td>
                <td align="left" colspan="1" rowspan="1">Timer == 0</td>
                <td align="left" colspan="1" rowspan="1">No more listeners in EXCLUDE mode for
	   the multicast address.  If the Requested List is empty, delete
	   Multicast Address Record.  If not, switch to INCLUDE filter-mode;
	   the sources in the Requested List are moved to the Include List,
	   and the Exclude List is deleted.</td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="src_timers" numbered="true" toc="include" removeInRFC="false" pn="section-7.2.3">
          <name slugifiedName="name-definition-of-source-timers">Definition of Source Timers</name>
          <t indent="0" pn="section-7.2.3-1">A Source Timer is a decrementing timer with a lower bound of zero.
   One Source Timer is kept per source record.  Source timers are
   updated according to the type and filter-mode of the Multicast
	   Address Record received.  <xref target="rcv_rpt" format="default" sectionFormat="of" derivedContent="Section 7.4"/> describes the setting of source
	   timers per type of Multicast Address Records received.</t>
          <t indent="0" pn="section-7.2.3-2">In the following, abbreviations are used for several variables (all
	   of which are described in detail in <xref target="timers" format="default" sectionFormat="of" derivedContent="Section 9"/>).  The variable MALI
   stands for the Multicast Address Listening Interval, which is the
   time in which multicast address listening state will time out.  The
   variable LLQT is the Last Listener Query Time, which is the total
   time the router should wait for a report, after the Querier has sent
   the first query.  During this time, the Querier should send [Last
   Member Query Count]-1 retransmissions of the query.  LLQT represents
   the leave latency or the difference between the transmission of a
   listener state change and the modification of the information passed
	   to the routing protocol.</t>
          <t indent="0" pn="section-7.2.3-3">If the router is in INCLUDE filter-mode, a source can be added to the
   current Include List if a listener in INCLUDE mode sends a Current-State
   or a State-Change Report that includes that source.  Each
   source from the Include List is associated with a Source Timer that
   is updated whenever a listener in INCLUDE mode sends a report that
   confirms its interest in that specific source.  If the timer of a
   source from the Include List expires, the source is deleted from the
   Include List.  If there are no more source records left, the
	   Multicast Address Record is deleted from the router.</t>
          <t indent="0" pn="section-7.2.3-4">Besides this "soft leave" mechanism, there is also a "fast leave"
   scheme in MLDv2; it is also based on the use of source timers.  When
   a node in INCLUDE mode expresses its desire to stop listening to a
   specific source, all the multicast routers on the link lower their
   timer for that source to a small interval of LLQT milliseconds.  The
   Querier then sends then a Multicast Address and Source Specific
   Query, to verify whether there are other listeners for that source on
   the link, or not.  If a corresponding report is received before the
   timer expires, all the multicast routers on the link update their
   source timer.  If not, the source is deleted from the Include List.
   The handling of the Include List, according to the received reports,
	   is detailed in Sections <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>.</t>
          <t indent="0" pn="section-7.2.3-5">Source timers are treated differently when the Router Filter Mode for
   a multicast address is EXCLUDE.  For sources from the Requested List,
   the source timers have running values; these sources are forwarded by
   the router.  For sources from the Exclude List, the source timers are
   set to zero; these sources are blocked by the router.  If the timer
   of a source from the Requested List expires, the source is moved to
   the Exclude List.  Then, the router informs the routing protocol that
   there is no longer a listener on the link interested in traffic from
	   this source.</t>
          <t indent="0" pn="section-7.2.3-6">The router has to maintain the Requested List for two reasons:
          </t>
          <ol type="1" spacing="normal" indent="adaptive" start="1" pn="section-7.2.3-7">
            <li pn="section-7.2.3-7.1" derivedCounter="1.">
              <t indent="0" pn="section-7.2.3-7.1.1">To keep track of sources that listeners in INCLUDE mode
              listen to.  This is necessary in order to assure a seamless
              transition of the router to INCLUDE mode, when there will be no
              listener in EXCLUDE mode left.  This transition should not
              interrupt the flow of traffic to the listeners in INCLUDE mode
              still interested in that multicast address.  Therefore, at the
              moment of the transition, the Requested List should represent
              the set of sources that nodes in INCLUDE mode have explicitly
              requested.
              </t>
              <t indent="0" pn="section-7.2.3-7.1.2">When the router switches to INCLUDE mode, the sources in the
              Requested List are moved to the Include List, and the Exclude
              List is deleted.  Before the switch, the Requested List can
              contain an inexact guess at the sources that listeners in
              INCLUDE mode listen to, which might be too large or too small.  These
              inexactitudes are due to the fact that the Requested List is
              also used for fast blocking purposes, as described below.  If
              such a fast blocking is required, some sources may be deleted
              from the Requested List (as shown in Sections <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>) in order to reduce router
              state.  Nevertheless, in each such case the Filter Timer is
              updated as well.  Therefore, listeners in INCLUDE mode will have
              enough time, before an eventual switching, to reconfirm their
              interest in the eliminated source(s), and rebuild the Requested
              List accordingly.  The protocol ensures that when a switch to
              INCLUDE mode occurs, the Requested List will be accurate.
              Details about the transition of the router to INCLUDE mode are
              presented in <xref target="mode_switch" format="default" sectionFormat="of" derivedContent="Appendix A.3"/>.</t>
            </li>
            <li pn="section-7.2.3-7.2" derivedCounter="2.">
              <t indent="0" pn="section-7.2.3-7.2.1">To allow a fast blocking of previously unblocked sources.  If
              the router receives a report that contains such a request, the
              concerned sources are added to the Requested List.  Their timers
              are set to a small interval of LLQT milliseconds, and a
              Multicast Address and Source Specific Query is sent by the
              Querier, to check whether there are nodes on the link still
              interested in those sources, or not.  If no node confirms its
              interest in receiving a specific source, the timer of that
              source expires.  Then, the source is moved from the Requested
              List to the Exclude List.  From then on, the source will be
              blocked by the router.</t>
            </li>
          </ol>
          <t indent="0" pn="section-7.2.3-8">The handling of the EXCLUDE mode router state, according to the
          received reports, is detailed in Sections <xref target="curr_state_recs" format="counter" sectionFormat="of" derivedContent="7.4.1"/> and <xref target="fm_chg" format="counter" sectionFormat="of" derivedContent="7.4.2"/>.</t>
          <t indent="0" pn="section-7.2.3-9">When the Router Filter Mode for a multicast address is EXCLUDE,
          source records are only deleted when the Filter Timer expires or
          when newly received Multicast Address Records modify the source
          record list of the router.</t>
        </section>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-7.3">
        <name slugifiedName="name-mldv2-source-specific-forwa">MLDv2 Source-Specific Forwarding Rules</name>
        <t indent="0" pn="section-7.3-1">When a multicast router receives a datagram from a source destined to
   a particular multicast address, a decision has to be made whether to
   forward the datagram on an attached link or not.  The multicast
   routing protocol in use is in charge of this decision and should use
   the MLDv2 information to ensure that all sources/multicast addresses
   that have listeners on a link are forwarded to that link.  MLDv2
   information does not override multicast routing information; for
   example, if the MLDv2 filter-mode for a multicast address is EXCLUDE,
   a router may still forward packets for excluded sources to a transit
	   link.</t>
        <t indent="0" pn="section-7.3-2">To summarize, <xref target="MLDv2_forwarding_suggestions" format="default" sectionFormat="of" derivedContent="Table 6"/> below describes the forwarding
   suggestions made by MLDv2 to the routing protocol for traffic
   originating from a source destined to a multicast address.  It also
   summarizes the actions taken upon the expiration of a Source Timer
	based on the Router Filter Mode of the multicast address.</t>
        <table align="left" anchor="MLDv2_forwarding_suggestions" pn="table-6">
          <name slugifiedName="name-mld-forwarding-recommendati">MLD Forwarding Recommendations</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Router Filter Mode</th>
              <th align="left" colspan="1" rowspan="1">Source Timer Value</th>
              <th align="left" colspan="1" rowspan="1">Action</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">INCLUDE</td>
              <td align="left" colspan="1" rowspan="1">TIMER &gt; 0</td>
              <td align="left" colspan="1" rowspan="1">Suggest to forward traffic from source.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">INCLUDE</td>
              <td align="left" colspan="1" rowspan="1">TIMER == 0</td>
              <td align="left" colspan="1" rowspan="1">Suggest to stop forwarding traffic from
		   source and remove the source record.  If there are no more source records,
		   delete the Multicast Address Record.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">INCLUDE</td>
              <td align="left" colspan="1" rowspan="1">No Source Element</td>
              <td align="left" colspan="1" rowspan="1">Suggest to not forward traffic from source.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">EXCLUDE</td>
              <td align="left" colspan="1" rowspan="1">TIMER &gt; 0</td>
              <td align="left" colspan="1" rowspan="1">Suggest to forward traffic from source.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">EXCLUDE</td>
              <td align="left" colspan="1" rowspan="1">TIMER == 0</td>
              <td align="left" colspan="1" rowspan="1">Suggest to not forward traffic from source.
			   Move the source from the Requested List to the Exclude List (DO NOT remove the source record).</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">EXCLUDE</td>
              <td align="left" colspan="1" rowspan="1">No Source Element</td>
              <td align="left" colspan="1" rowspan="1">Suggest to forward traffic from all sources.</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="rcv_rpt" numbered="true" toc="include" removeInRFC="false" pn="section-7.4">
        <name slugifiedName="name-action-on-reception-of-repo">Action on Reception of Reports</name>
        <t indent="0" pn="section-7.4-1">Upon reception of an MLD message that contains a Report, the router
   checks if the source address of the message is a valid link-local
   address, if the Hop Limit is set to 1, and if the Router Alert option
   is present in the Hop-by-Hop Options header of the IPv6 packet.  If
   any of these checks fail, the packet is dropped.  If the validity of
   the MLD message is verified, the router starts to process the Report.</t>
        <t indent="0" pn="section-7.4-2">SSM-aware routers <bcp14>SHOULD</bcp14> ignore records that contain multicast addresses
   in the SSM address range if the record type is MODE_IS_EXCLUDE or
   CHANGE_TO_EXCLUDE_MODE. SSM-aware routers <bcp14>SHOULD</bcp14> ignore MLDv1 Report and DONE
   messages that
   contain multicast addresses in the SSM address range, <bcp14>SHOULD NOT</bcp14> use
   such Reports to establish IP forwarding state, and <bcp14>MAY</bcp14> log an error if it
   receives such a message.</t>
        <section anchor="curr_state_recs" numbered="true" toc="include" removeInRFC="false" pn="section-7.4.1">
          <name slugifiedName="name-reception-of-current-state-">Reception of Current-State Records</name>
          <t indent="0" pn="section-7.4.1-1">When receiving Current-State Records, a router updates both its
   Filter Timer and its source timers.  In some circumstances, the
   reception of a type of Multicast Address Record will cause the Router
   Filter Mode for that multicast address to change.  <xref target="rcvd-csr" format="default" sectionFormat="of" derivedContent="Table 7"/>
   describes the actions, with respect to state and timers, that occur
   to a router's state upon reception of Current-State Records.</t>
          <t indent="0" pn="section-7.4.1-2">If the router is in INCLUDE filter-mode for a multicast address, we
   will use the notation INCLUDE (A), where A denotes the associated
   Include List.  If the router is in EXCLUDE filter-mode for a
   multicast address, we will use the notation EXCLUDE (X,Y), where X
   and Y denote the associated Requested List and Exclude List,
   respectively.</t>
          <t indent="0" pn="section-7.4.1-3">Within the "Actions" section of the router state tables, we use the
   notation '(A)=J', which means that set A of the source records should
   have their source timers set to value J.  'Delete (A)' means that 
   set A of the source records should be deleted.  'Filter Timer = J' means
   that the Filter Timer for the multicast address should be set to
   value J.</t>
          <table align="left" anchor="rcvd-csr" pn="table-7">
            <name slugifiedName="name-actions-for-received-curren">Actions for Received Current-State Records</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Router State</th>
                <th align="left" colspan="1" rowspan="1">Report Received</th>
                <th align="left" colspan="1" rowspan="1">New Router State</th>
                <th align="left" colspan="1" rowspan="1">Actions</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">IS_IN (B)</td>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A+B)</td>
                <td align="left" colspan="1" rowspan="1">(B)=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">IS_EX (B)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (A*B, B-A)</td>
                <td align="left" colspan="1" rowspan="1">
                  <ul empty="true" bare="true" indent="3" spacing="normal" pn="section-7.4.1-4.2.2.4.1">
                    <li pn="section-7.4.1-4.2.2.4.1.1">(B-A)=0</li>
                    <li pn="section-7.4.1-4.2.2.4.1.2">Delete (A-B)</li>
                    <li pn="section-7.4.1-4.2.2.4.1.3">Filter Timer=MALI</li>
                  </ul>
                </td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">IS_IN (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X+A, Y-A)</td>
                <td align="left" colspan="1" rowspan="1">(A)=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">IS_EX (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (A-Y, Y*A)</td>
                <td align="left" colspan="1" rowspan="1">
                  <ul empty="true" bare="true" indent="3" spacing="normal" pn="section-7.4.1-4.2.4.4.1">
                    <li pn="section-7.4.1-4.2.4.4.1.1">(A-X-Y)=MALI</li>
                    <li pn="section-7.4.1-4.2.4.4.1.2">Delete (X-A)</li>
                    <li pn="section-7.4.1-4.2.4.4.1.3">Delete (Y-A)</li>
                    <li pn="section-7.4.1-4.2.4.4.1.4">Filter Timer=MALI</li>
                  </ul>
                </td>
              </tr>
            </tbody>
          </table>
        </section>
        <section anchor="fm_chg" numbered="true" toc="include" removeInRFC="false" pn="section-7.4.2">
          <name slugifiedName="name-reception-of-filter-mode-ch">Reception of Filter-Mode-Change and Source-List-Change Records</name>
          <t indent="0" pn="section-7.4.2-1">When a change in the global state of a multicast address occurs in a
   node, the node sends either a Source-List-Change Record or a Filter
   Mode Change Record for that multicast address.  As with Current-State
   Records, routers must act upon these records and possibly change
	   their own state to reflect the new listening state of the link.</t>
          <t indent="0" pn="section-7.4.2-2">The Querier must query sources or multicast addresses that are
   requested to be no longer forwarded.  When a router queries or
   receives a query for a specific set of sources, it lowers its source
   timers for those sources to a small interval of Last Listener Query
   Time milliseconds.  If Multicast Address Records are received in
   response to the queries that express interest in listening to the
	   queried sources, the corresponding timers are updated.</t>
          <t indent="0" pn="section-7.4.2-3">Multicast Address Specific queries can also be used in order to
   enable a fast transition of a router from EXCLUDE to INCLUDE mode, in
   case a received Multicast Address Record motivates this action.  The
   Filter Timer for that multicast address is lowered to a small
   interval of Last Listener Query Time milliseconds.  If any Multicast
   Address Records that express EXCLUDE mode interest in the multicast
   address are received within this interval, the Filter Timer is
   updated and the suggestion to the routing protocol to forward the
   multicast address stands without any interruption.  If not, the
	   router will switch to INCLUDE filter-mode for that multicast address.</t>
          <t indent="0" pn="section-7.4.2-4">During the query period (i.e., Last Listener Query Time milliseconds),
	  the MLD component in the router continues to suggest to the routing
   protocol to forward traffic from the multicast addresses or sources
   that are queried.
   It is not until after Last Listener Query Time
   milliseconds, and without receiving a record that expresses interest in
   the queried multicast address or sources, that the router may prune
	   the multicast address or sources from the link.</t>
          <t indent="0" pn="section-7.4.2-5"><xref target="mr-state-trans" format="default" sectionFormat="of" derivedContent="Table 8"/> describes the changes in multicast address state
   and the action(s) taken when receiving either Filter-Mode-Change or
   Source-List-Change Records.  <xref target="mr-state-trans" format="default" sectionFormat="of" derivedContent="Table 8"/> also describes the queries
	   that are sent by the Querier when a particular report is received.</t>
          <t indent="0" pn="section-7.4.2-6">We use the following notation to describe the queries that are
   sent.  We use the notation 'Q(MA)' to describe a Multicast Address
   Specific Query to the MA multicast address.  We use the notation
   'Q(MA,A)' to describe a Multicast Address and Source Specific Query
   to the MA multicast address with source-list A.  If source-list A is
   null as a result of the action (e.g. A*B), then no query is sent as a
	   result of the operation.</t>
          <t indent="0" pn="section-7.4.2-7">In order to maintain protocol robustness, queries defined in the
   Actions column of <xref target="mr-state-trans" format="default" sectionFormat="of" derivedContent="Table 8"/> need to be transmitted [Last
   Listener Query Count] times, once every [Last Listener Query
	   Interval] period.</t>
          <t indent="0" pn="section-7.4.2-8">If while scheduling new queries there are already pending queries to
   be retransmitted for the same multicast address, the new and pending
   queries have to be merged.  In addition, received host reports for a
   multicast address with pending queries may affect the contents of
	   those queries.  <xref target="spec_qry" format="default" sectionFormat="of" derivedContent="Section 7.6.3"/> describes the process of building and
	   maintaining the state of pending queries.</t>
          <table align="left" anchor="mr-state-trans" pn="table-8">
            <name slugifiedName="name-multicast-router-state-tran">Multicast Router State Transitions</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Router State</th>
                <th align="left" colspan="1" rowspan="1">Report Received</th>
                <th align="left" colspan="1" rowspan="1">New Router State</th>
                <th align="left" colspan="1" rowspan="1">Actions</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">ALLOW (B)</td>
                <td align="left" colspan="1" rowspan="1">INCLUDE(A+B)</td>
                <td align="left" colspan="1" rowspan="1">(B)=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">BLOCK (B)</td>
                <td align="left" colspan="1" rowspan="1">INCLUDE(A)</td>
                <td align="left" colspan="1" rowspan="1">Send Q(MA,A*B)</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">TO_EX (B)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE(A*B,B-A)</td>
                <td align="left" colspan="1" rowspan="1">(B-A)=0, Delete (A-B), Send Q(MA,A*B), Filter Timer=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">INCLUDE (A)</td>
                <td align="left" colspan="1" rowspan="1">TO_IN (B)</td>
                <td align="left" colspan="1" rowspan="1">INCLUDE(A+B)</td>
                <td align="left" colspan="1" rowspan="1">(B)=MALI, Send Q(MA,A-B)</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">ALLOW (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE(X+A,Y-A)</td>
                <td align="left" colspan="1" rowspan="1">(A)=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">BLOCK (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE(X+(A-Y),Y)</td>
                <td align="left" colspan="1" rowspan="1">(A-X-Y)=Filter Timer, Send Q(MA,A-Y)</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">TO_EX (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE(A-Y,Y*A)</td>
                <td align="left" colspan="1" rowspan="1">(A-X-Y)=Filter Timer, Delete (X-A), Delete (Y-A), Send Q(MA,A-Y), Filter Timer=MALI</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">EXCLUDE (X,Y)</td>
                <td align="left" colspan="1" rowspan="1">TO_IN (A)</td>
                <td align="left" colspan="1" rowspan="1">EXCLUDE(X+A,Y-A)</td>
                <td align="left" colspan="1" rowspan="1">(A)=MALI, Send Q(MA,X-A), Send Q(MA)</td>
              </tr>
            </tbody>
          </table>
        </section>
      </section>
      <section anchor="rtr_mode" numbered="true" toc="include" removeInRFC="false" pn="section-7.5">
        <name slugifiedName="name-switching-router-filter-mod">Switching Router Filter Modes</name>
        <t indent="0" pn="section-7.5-1">The Filter Timer is used as a mechanism for transitioning the Router
	   Filter Mode from EXCLUDE to INCLUDE.</t>
        <t indent="0" pn="section-7.5-2">When a Filter Timer expires with a Router Filter Mode of EXCLUDE, a
   router assumes that there are no nodes with a filter-mode of
   EXCLUDE present on the attached link.  Thus, the router transitions
	   to INCLUDE filter-mode for the multicast address.</t>
        <t indent="0" pn="section-7.5-3">A router uses the sources from the Requested List as its state for
   the switch to a filter-mode of INCLUDE.  Sources from the Requested
   List are moved in the Include List, while sources from the Exclude
   List are deleted.  For example, if a router's state for a multicast
   address is EXCLUDE(X,Y) and the Filter Timer expires for that
   multicast address, the router switches to filter-mode of INCLUDE with
   state INCLUDE(X).  If at the moment of the switch the Requested List
   (X) is empty, the Multicast Address Record is deleted from the
	   router.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-7.6">
        <name slugifiedName="name-action-on-reception-of-quer">Action on Reception of Queries</name>
        <t indent="0" pn="section-7.6-1">Upon reception of an MLD message that contains a Query, the router
   checks if the source address of the message is a valid link-local
   address, if the Hop Limit is set to 1, and if the Router Alert option
   is present in the Hop-by-Hop Options header of the IPv6 packet.  If
	   any of these checks fail, the packet is dropped.</t>
        <t indent="0" pn="section-7.6-2">If the validity of the MLD message is verified, the router starts to
	   process the Query.</t>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-7.6.1">
          <name slugifiedName="name-timer-updates">Timer Updates</name>
          <t indent="0" pn="section-7.6.1-1">MLDv2 uses the S flag to ensure
	   robustness, as explained in <xref target="build_state" format="default" sectionFormat="of" derivedContent="Section 2.1"/>.  When a router sends or
   receives a query with a clear S flag,
   it must update its timers to reflect the correct timeout values for
   the multicast address or sources being queried.  The following table
   describes the timer actions when sending or receiving a Multicast
   Address Specific or Multicast Address and Source Specific Query with
	   the S flag not set.</t>
          <table align="left" pn="table-9">
            <name slugifiedName="name-timer-actions-for-query-mes">Timer Actions for Query Message Transmission</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Query</th>
                <th align="left" colspan="1" rowspan="1">Action</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">Q(MA,A)</td>
                <td align="left" colspan="1" rowspan="1">Source Timers for sources in A are lowered to LLQT.</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">Q(MA)</td>
                <td align="left" colspan="1" rowspan="1">The Filter Timer is lowered to LLQT.</td>
              </tr>
            </tbody>
          </table>
          <t indent="0" pn="section-7.6.1-3">When a router sends or receives a query with the S
	  flag set, it will not update its timers.</t>
        </section>
        <section anchor="elect" numbered="true" toc="include" removeInRFC="false" pn="section-7.6.2">
          <name slugifiedName="name-querier-election">Querier Election</name>
          <t indent="0" pn="section-7.6.2-1">MLDv2 elects a single router per subnet to be in Querier state;
          all the other routers on the subnet should be in Non-Querier
          state. MLDv2 uses the same querier election mechanism as MLDv1,
          namely the IPv6 address.  When a router starts operating on a
          subnet, by default it considers itself as being the Querier.  Thus,
          it sends several General Queries separated by a small time interval
          (see Sections <xref target="start_qry_int" format="counter" sectionFormat="of" derivedContent="9.6"/> and
          <xref target="start_qry_cnt" format="counter" sectionFormat="of" derivedContent="9.7"/> for details).</t>
          <t indent="0" pn="section-7.6.2-2">When a router receives a query with a lower IPv6 address than its
          own, it sets the Other-Querier-Present Timer to [Other Querier
          Present Interval]; if it was previously in Querier state, it switches
          to Non- Querier state and ceases to send queries on the link.  After
          the Other-Querier-Present Timer expires, it should re-enter the
          Querier state and begin sending General Queries.</t>
          <t indent="0" pn="section-7.6.2-3">All MLDv2 queries <bcp14>MUST</bcp14> be sent with the fe80::/64
          link-local source address prefix.  Therefore, for the purpose of
          MLDv2 querier election, an IPv6 address A is considered to be lower
          than an IPv6 address B if the interface ID represented by the last
          64 bits of address A, in big-endian bit order, is lower than the
          interface ID represented by the last 64 bits of address B.</t>
        </section>
        <section anchor="spec_qry" numbered="true" toc="include" removeInRFC="false" pn="section-7.6.3">
          <name slugifiedName="name-building-and-sending-specif">Building and Sending Specific Queries</name>
          <section numbered="true" toc="exclude" removeInRFC="false" pn="section-7.6.3.1">
            <name slugifiedName="name-building-and-sending-multic">Building and Sending Multicast Address Specific Queries</name>
            <t indent="0" pn="section-7.6.3.1-1">When a table action "Send Q(MA)" is encountered, the Filter Timer
   must be lowered to LLQT.  The Querier must then immediately send a
   Multicast Address Specific Query as well as schedule [Last Listener
   Query Count - 1] query retransmissions to be sent every [Last
	   Listener Query Interval], over [Last Listener Query Time].</t>
            <t indent="0" pn="section-7.6.3.1-2">When transmitting a Multicast Address Specific Query, if the Filter
   Timer is larger than LLQT, the "Suppress Router-Side Processing" bit
	   is set in the Query Message.</t>
          </section>
          <section numbered="true" toc="exclude" removeInRFC="false" pn="section-7.6.3.2">
            <name slugifiedName="name-building-and-sending-multica">Building and Sending Multicast Address and Source Specific Queries</name>
            <t indent="0" pn="section-7.6.3.2-1">When a table action "Send Q(MA,X)" is encountered by the Querier in
   <xref target="mr-state-trans" format="default" sectionFormat="of" derivedContent="Table 8"/> (<xref target="fm_chg" format="default" sectionFormat="of" derivedContent="Section 7.4.2"/>), the following actions must be performed
   for each of the sources in X that send to multicast address MA, with
   the Source Timer larger than LLQT:
            </t>
            <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-7.6.3.2-2">
              <li pn="section-7.6.3.2-2.1">
                <t indent="0" pn="section-7.6.3.2-2.1.1">lower Source Timer to LLQT;</t>
              </li>
              <li pn="section-7.6.3.2-2.2">
                <t indent="0" pn="section-7.6.3.2-2.2.1">add the sources to the Retransmission List; and</t>
              </li>
              <li pn="section-7.6.3.2-2.3">
                <t indent="0" pn="section-7.6.3.2-2.3.1">set the Source Retransmission Counter for each source to [Last Listener Query Count].</t>
              </li>
            </ul>
            <t indent="0" pn="section-7.6.3.2-3">The Querier must then immediately send a Multicast Address and Source
   Specific Query as well as schedule [Last Listener Query Count -1]
   query retransmissions to be sent every [Last Listener Query
   Interval], over [Last Listener Query Time].  The contents of these
	   queries are calculated as follows.</t>
            <t indent="0" pn="section-7.6.3.2-4">When building a Multicast Address and Source Specific Query for a
   multicast address MA, two separate Query Messages are sent for the
   multicast address.  The first one has the "Suppress Router-Side
   Processing" bit set and contains all the sources with retransmission
   state (i.e., sources from the Retransmission List of that multicast
   address) and timers greater than LLQT.  The second has the "Suppress
   Router-Side Processing" bit clear and contains all the sources with
   retransmission state and timers lower or equal to LLQT.  If either of
   the two calculated messages does not contain any sources, then its
	   transmission is suppressed.</t>
            <aside pn="section-7.6.3.2-5">
              <t indent="0" pn="section-7.6.3.2-5.1">Note: If a Multicast Address Specific Query is scheduled to be
   transmitted at the same time as a Multicast Address and Source
   Specific Query for the same multicast address, then transmission of
   the Multicast Address and Source Specific message with the "Suppress
	   Router-Side Processing" bit set may be suppressed.</t>
            </aside>
          </section>
        </section>
      </section>
    </section>
    <section anchor="interop" numbered="true" toc="include" removeInRFC="false" pn="section-8">
      <name slugifiedName="name-interoperation-with-mldv1">Interoperation with MLDv1</name>
      <t indent="0" pn="section-8-1">MLD version 2 hosts and routers interoperate with hosts and routers
   that have not yet been upgraded to MLDv2.  This compatibility is
   maintained by hosts and routers taking appropriate actions depending
   on the versions of MLD operating on hosts and routers within a
	   network.</t>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-8.1">
        <name slugifiedName="name-query-version-distinctions">Query Version Distinctions</name>
        <t indent="0" pn="section-8.1-1">The MLD version of a Multicast Listener Query Message is determined
   as follows:
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8.1-2">
          <li pn="section-8.1-2.1">
            <t indent="0" pn="section-8.1-2.1.1">MLDv1 Query: length = 24 octets</t>
          </li>
          <li pn="section-8.1-2.2">
            <t indent="0" pn="section-8.1-2.2.1">MLDv2 Query: length &gt;= 28 octets</t>
          </li>
        </ul>
        <t indent="0" pn="section-8.1-3">Query Messages that do not match any of the above conditions (e.g., a
	   Query of length 26 octets) <bcp14>MUST</bcp14> be silently ignored.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-8.2">
        <name slugifiedName="name-multicast-address-listener-">Multicast Address Listener Behavior</name>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-8.2.1">
          <name slugifiedName="name-in-the-presence-of-mldv1-ro">In the Presence of MLDv1 Routers</name>
          <t indent="0" pn="section-8.2.1-1">In order to be compatible with MLDv1 routers, MLDv2 hosts <bcp14>MUST</bcp14>
   operate in version 1 compatibility mode.  MLDv2 hosts <bcp14>MUST</bcp14> keep state
   per local interface regarding the compatibility mode of each attached
   link.  A host's compatibility mode is determined from the Host
   Compatibility Mode variable that can be in one of the two states:
	   MLDv1 or MLDv2.</t>
          <t indent="0" pn="section-8.2.1-2">The Host Compatibility Mode of an interface is set to MLDv1 whenever
   an MLDv1 Multicast Address Listener General Query is received on that
   interface.  At the same time, the Older-Version-Querier-Present Timer
   for the interface is set to [Older Version Querier Present Interval]
   seconds.  The timer is reset whenever a new MLDv1 General Query is received
   on that interface.  If the Older-Version-Querier-Present Timer
	   expires, the host switches back to Host Compatibility Mode of MLDv2.</t>
          <t indent="0" pn="section-8.2.1-3">When Host Compatibility Mode is MLDv2, a host acts using the MLDv2
   protocol on that interface.  When Host Compatibility Mode is MLDv1, a
   host acts in MLDv1 compatibility mode, using only the MLDv1 protocol,
	   on that interface.</t>
          <t indent="0" pn="section-8.2.1-4">An MLDv1 Querier will send General Queries with the Maximum Response
   Code set to the desired Maximum Response Delay, i.e., the full range
   of this field is linear and the exponential algorithm described in
	   <xref target="mrcode" format="default" sectionFormat="of" derivedContent="Section 5.1.3"/>. is not used.</t>
          <t indent="0" pn="section-8.2.1-5">Whenever a host changes its compatibility mode, it cancels all its
	   pending responses and retransmission timers.</t>
          <t indent="0" pn="section-8.2.1-6">An SSM-aware host that receives an MLDv1 General Query or MLDv1 Group
   Specific Query for a multicast address in the SSM address range <bcp14>SHOULD</bcp14> log an error.
   It is <bcp14>RECOMMENDED</bcp14> that implementations provide a configuration option to disable the
   use of Host Compatibility Mode to allow networks to operate only in SSM mode.
   This configuration option <bcp14>SHOULD</bcp14> be disabled by default.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-8.2.2">
          <name slugifiedName="name-in-the-presence-of-mldv1-mu">In the Presence of MLDv1 Multicast Address Listeners</name>
          <t indent="0" pn="section-8.2.2-1">An MLDv2 host may be placed on a link where there are MLDv1 hosts.  A
   host <bcp14>MAY</bcp14> allow its MLD Version 2 Multicast Listener Report to be suppressed
	   by an MLDv1 Multicast Listener Report (Type = decimal 131).</t>
        </section>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-8.3">
        <name slugifiedName="name-multicast-router-behavior">Multicast Router Behavior</name>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-8.3.1">
          <name slugifiedName="name-in-the-presence-of-mldv1-rou">In the Presence of MLDv1 Routers</name>
          <t indent="0" pn="section-8.3.1-1">MLDv2 routers may be placed on a network where there is at least one
   MLDv1 router.  The following requirements apply:
          </t>
          <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8.3.1-2">
            <li pn="section-8.3.1-2.1">
              <t indent="0" pn="section-8.3.1-2.1.1">If an MLDv1 router is present on the link, the Querier <bcp14>MUST</bcp14> use
      the lowest version of MLD present on the network.  This must be
      administratively assured.  Routers that desire to be compatible
      with MLDv1 <bcp14>MUST</bcp14> have a configuration option to act in MLDv1 mode;
      if an MLDv1 router is present on the link, the system
      administrator must explicitly configure all MLDv2 routers to act
      in MLDv1 mode. When in MLDv1 mode, the Querier <bcp14>MUST</bcp14> send periodic
      General Queries truncated at the Multicast Address field (i.e., 24
      bytes long) and <bcp14>SHOULD</bcp14> also warn about receiving an MLDv2 Query
      (such warnings <bcp14>MUST</bcp14> be rate-limited).  The Querier <bcp14>MUST</bcp14> also fill
      in the Maximum Response Delay in the Maximum Response Code field,
      i.e., the exponential algorithm described in <xref target="mrcode" format="default" sectionFormat="of" derivedContent="Section 5.1.3"/> is not
	      used.</t>
            </li>
            <li pn="section-8.3.1-2.2">
              <t indent="0" pn="section-8.3.1-2.2.1">If a router is not explicitly configured to use MLDv1 and receives
      an MLDv1 General Query, it <bcp14>SHOULD</bcp14> log a warning.  These warnings
	   <bcp14>MUST</bcp14> be rate-limited.</t>
            </li>
            <li pn="section-8.3.1-2.3">
              <t indent="0" pn="section-8.3.1-2.3.1">It is <bcp14>RECOMMENDED</bcp14> that implementations provide a configuration option
   to disable use of compatibility mode to allow networks to operate only in SSM mode.
   This configuration option <bcp14>SHOULD</bcp14> be disabled by default.</t>
            </li>
          </ul>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-8.3.2">
          <name slugifiedName="name-in-the-presence-of-mldv1-mul">In the Presence of MLDv1 Multicast Address Listeners</name>
          <t indent="0" pn="section-8.3.2-1">MLDv2 routers may be placed on a network where there are hosts that
   have not yet been upgraded to MLDv2.  In order to be compatible with
   MLDv1 hosts, MLDv2 routers <bcp14>MUST</bcp14> operate in version 1 compatibility
   mode.  MLDv2 routers keep a compatibility mode per Multicast Address
   Record.  The compatibility mode of a multicast address is determined
   from the Multicast Address Compatibility Mode variable, which can be
	   in one of the two following states: MLDv1 or MLDv2.</t>
          <t indent="0" pn="section-8.3.2-2">The Multicast Address Compatibility Mode of a Multicast Address
   Record is set to MLDv1 whenever an MLDv1 Multicast Listener Report (Type = decimal 131) is
   received for that multicast address.  At the same time, the Older-Version-Host-Present
   Timer for the multicast address is set to [Older Version Host Present Interval] seconds. The timer is reset whenever a
   new MLDv1 Report is received for that multicast address.  If the
   Older-Version-Host-Present Timer expires, the router switches back to
   the Multicast Address Compatibility Mode of MLDv2 for that multicast
	   address.</t>
          <t indent="0" pn="section-8.3.2-3">Note that when a router switches back to MLDv2 Multicast Address
   Compatibility Mode for a multicast address, it takes some time to
   regain source-specific state information.  Source-specific
   information will be learned during the next General Query, but
   sources that should be blocked will not be blocked until [Multicast
	   Address Listening Interval] after that.</t>
          <t indent="0" pn="section-8.3.2-4">When Multicast Address Compatibility Mode is MLDv2, a router acts
   using the MLDv2 protocol for that multicast address.  When Multicast
   Address Compatibility Mode is MLDv1, a router internally translates
   the following MLDv1 messages for that multicast address to their
	   MLDv2 equivalents (<xref target="msg-xlate" format="default" sectionFormat="of" derivedContent="Table 10"/>).</t>
          <table anchor="msg-xlate" align="center" pn="table-10">
            <name slugifiedName="name-mld-message-translation">MLD Message Translation</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">MLDv1 Message</th>
                <th align="left" colspan="1" rowspan="1">MLDv2 Equivalent</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">Report</td>
                <td align="left" colspan="1" rowspan="1">IS_EX( {} )</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">Done</td>
                <td align="left" colspan="1" rowspan="1">TO_IN( {} )</td>
              </tr>
            </tbody>
          </table>
          <t indent="0" pn="section-8.3.2-6">MLDv2 BLOCK messages are ignored, as are source-lists in TO_EX()
   messages (i.e., any TO_EX() message is treated as TO_EX( {} )).  On
   the other hand, the Querier continues to send MLDv2 queries,
	   regardless of its Multicast Address Compatibility Mode.</t>
        </section>
      </section>
    </section>
    <section anchor="timers" numbered="true" toc="include" removeInRFC="false" pn="section-9">
      <name slugifiedName="name-list-of-timers-counters-and">List of Timers, Counters, and Their Default Values</name>
      <t indent="0" pn="section-9-1">Most of these timers are configurable.  If non-default settings are
   used, they <bcp14>MUST</bcp14> be consistent among all nodes on a single link.  Note
   that parentheses are used to group expressions to make the algebra
	   clear.</t>
      <section anchor="robust" numbered="true" toc="include" removeInRFC="false" pn="section-9.1">
        <name slugifiedName="name-robustness-variable">Robustness Variable</name>
        <t indent="0" pn="section-9.1-1">The Robustness Variable allows tuning for the expected packet loss on
   a link.  If a link is expected to be lossy, the value of the
   Robustness Variable may be increased.  MLD is robust to [Robustness
   Variable] - 1 packet losses.  The value of the Robustness Variable
	   <bcp14>MUST NOT</bcp14> be zero and <bcp14>SHOULD NOT</bcp14> be one.  Default value: 2.</t>
      </section>
      <section anchor="qry_int" numbered="true" toc="include" removeInRFC="false" pn="section-9.2">
        <name slugifiedName="name-query-interval">Query Interval</name>
        <t indent="0" pn="section-9.2-1">The Query Interval variable denotes the interval between General
	   Queries sent by the Querier.  Default value: 125 seconds.</t>
        <t indent="0" pn="section-9.2-2">By varying the Query Interval, an administrator may tune the number
   of MLD messages on the link; larger values cause MLD Queries to be
	   sent less often.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.3">
        <name slugifiedName="name-query-response-interval">Query Response Interval</name>
        <t indent="0" pn="section-9.3-1">The Query Response Interval is the Maximum Response Delay used to calculate the Maximum Response
   Code that is inserted into the periodic General Queries.  Default value:
	   10000 (10 seconds)</t>
        <t indent="0" pn="section-9.3-2">By varying the Query Response Interval, an administrator may tune
   the burstiness of MLD messages on the link; larger values make the
   traffic less bursty, as host responses are spread out over a larger
   interval.  The number of seconds represented by [Query Response
	   Interval] must be less than the [Query Interval].</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.4">
        <name slugifiedName="name-multicast-address-listening-">Multicast Address Listening Interval</name>
        <t indent="0" pn="section-9.4-1">The Multicast Address Listening Interval (MALI) is the amount of time
   that must pass before a multicast router decides there are no more
   listeners of a multicast address or a particular source on a link.
   This value <bcp14>MUST</bcp14> be ([Robustness Variable] times [Query Interval])
   plus 2 times [Query Response Interval].</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.5">
        <name slugifiedName="name-other-querier-present-inter">Other Querier Present Interval</name>
        <t indent="0" pn="section-9.5-1">The Other Querier Present Interval is the length of time that must
   pass before a multicast router decides that there is no longer
   another multicast router that should be the Querier.  This value
   <bcp14>MUST</bcp14> be ([Robustness Variable] times ([Query Interval]) plus
	   (0.5 times [Query Response Interval]).</t>
      </section>
      <section anchor="start_qry_int" numbered="true" toc="include" removeInRFC="false" pn="section-9.6">
        <name slugifiedName="name-startup-query-interval">Startup Query Interval</name>
        <t indent="0" pn="section-9.6-1">The Startup Query Interval is the interval between General Queries
   sent by a Querier on startup.  Default value: 1/4 the [Query
	   Interval].</t>
      </section>
      <section anchor="start_qry_cnt" numbered="true" toc="include" removeInRFC="false" pn="section-9.7">
        <name slugifiedName="name-startup-query-count">Startup Query Count</name>
        <t indent="0" pn="section-9.7-1">The Startup Query Count is the number of Queries sent out on startup,
   separated by the Startup Query Interval.  Default value: [Robustness
	   Variable].</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.8">
        <name slugifiedName="name-last-listener-query-interva">Last Listener Query Interval</name>
        <t indent="0" pn="section-9.8-1">The Last Listener Query Interval (LLQI) is the Maximum Response Delay used
   to calculate the Maximum Response Code inserted into Multicast
   Address Specific Queries sent in response to MLDv1 Multicast
   Listener Done (Type = decimal 132) messages.  It is also the Maximum Response Delay used
   to calculate the Maximum Response Code inserted into Multicast
   Address and Source Specific Query Messages.  Default value: 1000 (1
	second).</t>
        <t indent="0" pn="section-9.8-2">Note that for values of LLQI greater than 32.768 seconds, a limited
   set of values can be represented, corresponding to sequential values
   of Maximum Response Code.  When converting a configured time to a
   Maximum Response Code value, it is recommended to use the exact value
   if possible, or the next lower value if the requested value is not
	   exactly representable.</t>
        <t indent="0" pn="section-9.8-3">This value may be tuned to modify the leave latency of the link.  A
   reduced value results in reduced time to detect the departure of the
	   last listener for a multicast address or source.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.9">
        <name slugifiedName="name-last-listener-query-count">Last Listener Query Count</name>
        <t indent="0" pn="section-9.9-1">The Last Listener Query Count is the number of Multicast Address
   Specific Queries sent before the router assumes there are no local
   listeners.  The Last Listener Query Count is also the number of
   Multicast Address and Source Specific Queries sent before the router
   assumes there are no listeners for a particular source.  Default
	   value: [Robustness Variable].</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.10">
        <name slugifiedName="name-last-listener-query-time">Last Listener Query Time</name>
        <t indent="0" pn="section-9.10-1">The Last Listener Query Time is the time value represented by the
   [Last Listener Query Interval] times [Last Listener Query
   Count].  It is not a tunable value, but it may be tuned by changing its
	   components.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.11">
        <name slugifiedName="name-unsolicited-report-interval">Unsolicited Report Interval</name>
        <t indent="0" pn="section-9.11-1">The Unsolicited Report Interval is the time between repetitions of a
   node's initial report of interest in a multicast address.  Default
	   value: 1 second.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.12">
        <name slugifiedName="name-older-version-querier-prese">Older Version Querier Present Interval</name>
        <t indent="0" pn="section-9.12-1">The Older Version Querier Present Interval is the timeout for
   transitioning a host back to MLDv2 Host Compatibility Mode.  When an
   MLDv1 query is received, MLDv2 hosts set their Older-Version-Querier-Present
	   Timer to [Older Version Querier Present Interval].</t>
        <t indent="0" pn="section-9.12-2">This value <bcp14>MUST</bcp14> be ([Robustness Variable] times [Query Interval]
	   in the last Query received) plus ([Query Response Interval]).</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.13">
        <name slugifiedName="name-older-version-host-present-">Older Version Host Present Interval</name>
        <t indent="0" pn="section-9.13-1">The Older Version Host Present Interval is the timeout for
   transitioning a router back to MLDv2 Multicast Address Compatibility
   Mode for a specific multicast address.  When an MLDv1 report is
   received for that multicast address, routers set their Older-Version-Host-Present
	   Timer to [Older Version Host Present Interval].</t>
        <t indent="0" pn="section-9.13-2">This value <bcp14>MUST</bcp14> be ([Robustness Variable] times [Query Interval])
	   plus ([Query Response Interval]).</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-9.14">
        <name slugifiedName="name-configuring-timers">Configuring Timers</name>
        <t indent="0" pn="section-9.14-1">This section is meant to provide advice to network administrators on
   how to tune these settings to their network.  Ambitious router
   implementations might tune these settings dynamically based upon
	   changing characteristics of the network.</t>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-9.14.1">
          <name slugifiedName="name-robustness-variable-2">Robustness Variable</name>
          <t indent="0" pn="section-9.14.1-1">The Robustness Variable tunes MLD to expected losses on a link.
   MLDv2 is robust to [Robustness Variable] - 1 packet losses, e.g., if
   the Robustness Variable is set to the default value of 2, MLDv2 is
   robust to a single packet loss but may operate imperfectly if more
   losses occur.  On lossy links, the value of the Robustness Variable
   should be increased to allow for the expected level of packet loss.
   However, increasing the value of the Robustness Variable increases
   the leave latency of the link (the time between when the last
   listener stops listening to a source or multicast address and when
	   the traffic stops flowing).</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-9.14.2">
          <name slugifiedName="name-query-interval-2">Query Interval</name>
          <t indent="0" pn="section-9.14.2-1">The overall level of periodic MLD traffic is inversely proportional
   to the Query Interval.  A longer Query Interval results in a lower
   overall level of MLD traffic.  The value of the Query Interval <bcp14>MUST</bcp14>
   be equal to or greater than the Maximum Response Delay used to
   calculate the Maximum Response Code inserted in General Query
	   Messages.</t>
        </section>
        <section numbered="true" toc="include" removeInRFC="false" pn="section-9.14.3">
          <name slugifiedName="name-maximum-response-delay">Maximum Response Delay</name>
          <t indent="0" pn="section-9.14.3-1">The burstiness of MLD traffic is inversely proportional to the
   Maximum Response Delay.  A longer Maximum Response Delay will spread
   Report messages over a longer interval.  However, a longer Maximum
   Response Delay in Multicast Address Specific and Multicast Address
   and Source Specific Queries extends the leave latency (the time
   between when the last listener stops listening to a source or
   multicast address and when the traffic stops flowing.)  The expected
   rate of Report messages can be calculated by dividing the expected
   number of Reporters by the Maximum Response Delay.  The Maximum
   Response Delay may be dynamically calculated (as shown in <xref target="mrd-calc" format="default" sectionFormat="of" derivedContent="Table 11"/>) per Query by using the
   expected number of Reporters for that Query.</t>
          <table anchor="mrd-calc" align="center" pn="table-11">
            <name slugifiedName="name-maximum-response-delay-calc">Maximum Response Delay Calculation</name>
            <thead>
              <tr>
                <th align="left" colspan="1" rowspan="1">Query Type</th>
                <th align="left" colspan="1" rowspan="1">Expected Number of Reporters</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left" colspan="1" rowspan="1">General Query</td>
                <td align="left" colspan="1" rowspan="1">All nodes on the link.</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">Multicast Address Specific Query</td>
                <td align="left" colspan="1" rowspan="1">All nodes on the link that had expressed interest in the multicast address.</td>
              </tr>
              <tr>
                <td align="left" colspan="1" rowspan="1">Multicast Address and Source Specific Query</td>
                <td align="left" colspan="1" rowspan="1">All nodes on the link that had expressed interest in the source and multicast address.</td>
              </tr>
            </tbody>
          </table>
          <t indent="0" pn="section-9.14.3-3">A router is not required to calculate these populations or tune the
	   Maximum Response Delay dynamically; these are simply guidelines.</t>
        </section>
      </section>
    </section>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-10">
      <name slugifiedName="name-security-considerations">Security Considerations</name>
      <t indent="0" pn="section-10-1">MLD does not contain any cryptographic protection, thus its messages
   are not authenticated, the message contents are not confidential, and
   any message can be replayed. The ability to replay messages does not affect
   the behavior of the protocol itself.</t>
      <t indent="0" pn="section-10-2">Replaying messages can lead to multicast
   forwarding state to remain active beyond the needs of group members on a
   link. Excessive retention of multicast state may lead to resource
   exhaustion in some devices.</t>
      <t indent="0" pn="section-10-3">The lack of confidentiality allows any device with access to the link
   to determine which multicast groups are being requested. This is a privacy
	   issue as some multicast content may be sensitive.</t>
      <t indent="0" pn="section-10-4">The lack of authentication allows for the creation of forged messages.  Note
   that before processing an MLD message, nodes verify if the source
   address of the message is a valid link-local address (or the
   unspecified address), if the Hop Limit is set to 1, and if the Router
   Alert option is present in the Hop-by-Hop Options header of the IPv6
   packet.  If any of these checks fails, the packet is dropped.  This
   defends the MLDv2 nodes from acting on forged MLD messages originated
   off-link.  Therefore, we discuss only the effects of
	   on-link forgery in the following section.</t>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-10.1">
        <name slugifiedName="name-query-message">Query Message</name>
        <t indent="0" pn="section-10.1-1">A forged Query Message from a machine with a lower IPv6 address than
   the current Querier will cause Querier duties to be assigned to the
   forger.  If the forger then sends no more Query Messages, other
   routers' Other Querier Present Timer will time out and one will
   resume the role of Querier.  During this time, if the forger ignores
   Multicast Listener Done messages, traffic might flow to multicast
   addresses with no listeners for up to [Multicast Address Listener
   Interval].</t>
        <t indent="0" pn="section-10.1-2">A forged Version 1 Query Message will put MLDv2 listeners on that
   link in MLDv1 Host Compatibility Mode.  This scenario can be avoided
   by providing MLDv2 hosts with a configuration option to ignore
   Version 1 messages completely.</t>
        <t indent="0" pn="section-10.1-3">A DoS attack on a node could be staged through forged Multicast
   Address and Source Specific Queries.  The attacker can find out about
   the listening state of a specific node with a General Query.  After
   that, it could send a large number of Multicast Address and Source
   Specific Queries, each with a large source-list and/or long Maximum
   Response Delay.  The node will have to store and maintain the sources
   specified in all of those queries for as long as it takes to send the
   delayed response.  This would consume both memory and CPU cycles in
   order to augment the recorded sources with the source-lists included
   in the successive queries.</t>
        <t indent="0" pn="section-10.1-4">To protect against such a DoS attack, a node stack implementation
   could restrict the number of Multicast Address and Source Specific
   Queries per multicast address within this interval and/or record
   only a limited number of sources.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-10.2">
        <name slugifiedName="name-current-state-report-messag">Current-State Report Messages</name>
        <t indent="0" pn="section-10.2-1">A forged Report message may cause multicast routers to think there
   are listeners of a multicast address on a link when there are not.
   Nevertheless, since listening to a multicast address on a host is
   generally an unprivileged operation, a local user may trivially gain
   the same result without forging any messages. If a large number of
   forged Report messages are generated, a multicast router may consume
   significant resources maintaining multicast forwarding state.</t>
        <t indent="0" pn="section-10.2-2">A forged Version 1 Report Message may put a router into MLDv1
   Multicast Address Compatibility Mode for a particular multicast
   address, meaning that the router will ignore MLDv2 source-specific
   state messages.  This can cause traffic to flow from unwanted sources
   for up to [Multicast Address Listener Interval].  This can be solved
   by providing routers with a configuration switch to ignore Version 1
   messages completely.  This breaks automatic compatibility with
   Version 1 hosts, so it should only be used in situations where source
   filtering is critical.</t>
      </section>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-10.3">
        <name slugifiedName="name-state-change-report-message">State-Change Report Messages</name>
        <t indent="0" pn="section-10.3-1">A forged State-Change Report message will cause the Querier to send
   out Multicast Address Specific or Multicast Address and Source
   Specific Queries for the multicast address in question.  This causes
   extra processing on each router and on each listener of the multicast
   address, but it cannot cause loss of desired traffic.</t>
      </section>
    </section>
    <section anchor="iana" numbered="true" toc="include" removeInRFC="false" pn="section-11">
      <name slugifiedName="name-iana-considerations">IANA Considerations</name>
      <t indent="0" pn="section-11-1">IANA has assigned the IPv6 link-local multicast address
   ff02::16, called "all MLDv2-capable routers", as described
   in <xref target="dest_addr" format="default" sectionFormat="of" derivedContent="Section 5.2.15"/>.  Version 2 Multicast Listener Reports will be sent
   to this special address.</t>
      <t indent="0" pn="section-11-2">In addition, IANA has assigned the ICMPv6 message Type value of 143
   for Version 2 Multicast Listener Report messages, as specified in
   <xref target="node_state" format="default" sectionFormat="of" derivedContent="Section 4"/>.</t>
    </section>
  </middle>
  <back>
    <references pn="section-12">
      <name slugifiedName="name-references">References</name>
      <references pn="section-12.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t indent="0">In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC2464" target="https://www.rfc-editor.org/info/rfc2464" quoteTitle="true" derivedAnchor="RFC2464">
          <front>
            <title>Transmission of IPv6 Packets over Ethernet Networks</title>
            <author fullname="M. Crawford" initials="M." surname="Crawford"/>
            <date month="December" year="1998"/>
            <abstract>
              <t indent="0">This document specifies the frame format for transmission of IPv6 packets and the method of forming IPv6 link-local addresses and statelessly autoconfigured addresses on Ethernet networks. It also specifies the content of the Source/Target Link-layer Address option used in Router Solicitation, Router Advertisement, Neighbor Solicitation, Neighbor Advertisement and Redirect messages when those messages are transmitted on an Ethernet. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2464"/>
          <seriesInfo name="DOI" value="10.17487/RFC2464"/>
        </reference>
        <reference anchor="RFC2710" target="https://www.rfc-editor.org/info/rfc2710" quoteTitle="true" derivedAnchor="RFC2710">
          <front>
            <title>Multicast Listener Discovery (MLD) for IPv6</title>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="W. Fenner" initials="W." surname="Fenner"/>
            <author fullname="B. Haberman" initials="B." surname="Haberman"/>
            <date month="October" year="1999"/>
            <abstract>
              <t indent="0">This document specifies the protocol used by an IPv6 router to discover the presence of multicast listeners (that is, nodes wishing to receive multicast packets) on its directly attached links, and to discover specifically which multicast addresses are of interest to those neighboring nodes. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2710"/>
          <seriesInfo name="DOI" value="10.17487/RFC2710"/>
        </reference>
        <reference anchor="RFC2711" target="https://www.rfc-editor.org/info/rfc2711" quoteTitle="true" derivedAnchor="RFC2711">
          <front>
            <title>IPv6 Router Alert Option</title>
            <author fullname="C. Partridge" initials="C." surname="Partridge"/>
            <author fullname="A. Jackson" initials="A." surname="Jackson"/>
            <date month="October" year="1999"/>
            <abstract>
              <t indent="0">This memo describes a new IPv6 Hop-by-Hop Option type that alerts transit routers to more closely examine the contents of an IP datagram. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2711"/>
          <seriesInfo name="DOI" value="10.17487/RFC2711"/>
        </reference>
        <reference anchor="RFC4291" target="https://www.rfc-editor.org/info/rfc4291" quoteTitle="true" derivedAnchor="RFC4291">
          <front>
            <title>IP Version 6 Addressing Architecture</title>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <date month="February" year="2006"/>
            <abstract>
              <t indent="0">This specification defines the addressing architecture of the IP Version 6 (IPv6) protocol. The document includes the IPv6 addressing model, text representations of IPv6 addresses, definition of IPv6 unicast addresses, anycast addresses, and multicast addresses, and an IPv6 node's required addresses.</t>
              <t indent="0">This document obsoletes RFC 3513, "IP Version 6 Addressing Architecture". [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4291"/>
          <seriesInfo name="DOI" value="10.17487/RFC4291"/>
        </reference>
        <reference anchor="RFC4443" target="https://www.rfc-editor.org/info/rfc4443" quoteTitle="true" derivedAnchor="RFC4443">
          <front>
            <title>Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification</title>
            <author fullname="A. Conta" initials="A." surname="Conta"/>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="M. Gupta" initials="M." role="editor" surname="Gupta"/>
            <date month="March" year="2006"/>
            <abstract>
              <t indent="0">This document describes the format of a set of control messages used in ICMPv6 (Internet Control Message Protocol). ICMPv6 is the Internet Control Message Protocol for Internet Protocol version 6 (IPv6). [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="89"/>
          <seriesInfo name="RFC" value="4443"/>
          <seriesInfo name="DOI" value="10.17487/RFC4443"/>
        </reference>
        <reference anchor="RFC4604" target="https://www.rfc-editor.org/info/rfc4604" quoteTitle="true" derivedAnchor="RFC4604">
          <front>
            <title>Using Internet Group Management Protocol Version 3 (IGMPv3) and Multicast Listener Discovery Protocol Version 2 (MLDv2) for Source-Specific Multicast</title>
            <author fullname="H. Holbrook" initials="H." surname="Holbrook"/>
            <author fullname="B. Cain" initials="B." surname="Cain"/>
            <author fullname="B. Haberman" initials="B." surname="Haberman"/>
            <date month="August" year="2006"/>
            <abstract>
              <t indent="0">The Internet Group Management Protocol Version 3 (IGMPv3) and the Multicast Listener Discovery Protocol Version 2 (MLDv2) are protocols that allow a host to inform its neighboring routers of its desire to receive IPv4 and IPv6 multicast transmissions, respectively. Source-specific multicast (SSM) is a form of multicast in which a receiver is required to specify both the network-layer address of the source and the multicast destination address in order to receive the multicast transmission. This document defines the notion of an "SSM-aware" router and host, and clarifies and (in some cases) modifies the behavior of IGMPv3 and MLDv2 on SSM-aware routers and hosts to accommodate source-specific multicast. This document updates the IGMPv3 and MLDv2 specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4604"/>
          <seriesInfo name="DOI" value="10.17487/RFC4604"/>
        </reference>
        <reference anchor="RFC4607" target="https://www.rfc-editor.org/info/rfc4607" quoteTitle="true" derivedAnchor="RFC4607">
          <front>
            <title>Source-Specific Multicast for IP</title>
            <author fullname="H. Holbrook" initials="H." surname="Holbrook"/>
            <author fullname="B. Cain" initials="B." surname="Cain"/>
            <date month="August" year="2006"/>
            <abstract>
              <t indent="0">IP version 4 (IPv4) addresses in the 232/8 (232.0.0.0 to 232.255.255.255) range are designated as source-specific multicast (SSM) destination addresses and are reserved for use by source-specific applications and protocols. For IP version 6 (IPv6), the address prefix FF3x::/32 is reserved for source-specific multicast use. This document defines an extension to the Internet network service that applies to datagrams sent to SSM addresses and defines the host and router requirements to support this extension. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4607"/>
          <seriesInfo name="DOI" value="10.17487/RFC4607"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t indent="0">RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC8200" target="https://www.rfc-editor.org/info/rfc8200" quoteTitle="true" derivedAnchor="RFC8200">
          <front>
            <title>Internet Protocol, Version 6 (IPv6) Specification</title>
            <author fullname="S. Deering" initials="S." surname="Deering"/>
            <author fullname="R. Hinden" initials="R." surname="Hinden"/>
            <date month="July" year="2017"/>
            <abstract>
              <t indent="0">This document specifies version 6 of the Internet Protocol (IPv6). It obsoletes RFC 2460.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="86"/>
          <seriesInfo name="RFC" value="8200"/>
          <seriesInfo name="DOI" value="10.17487/RFC8200"/>
        </reference>
        <reference anchor="RFC9778" target="https://www.rfc-editor.org/info/rfc9778" quoteTitle="true" derivedAnchor="RFC9778">
          <front>
            <title>IANA Considerations for Internet Group Management Protocols</title>
            <author initials="B." surname="Haberman" fullname="Brian Haberman" role="editor">
              <organization showOnFrontPage="true">Johns Hopkins University Applied Physics Lab</organization>
            </author>
            <date month="March" year="2025"/>
          </front>
          <seriesInfo name="BCP" value="57"/>
          <seriesInfo name="RFC" value="9778"/>
          <seriesInfo name="DOI" value="10.17487/RFC9778"/>
        </reference>
      </references>
      <references pn="section-12.2">
        <name slugifiedName="name-informative-references">Informative References</name>
        <reference anchor="RFC3569" target="https://www.rfc-editor.org/info/rfc3569" quoteTitle="true" derivedAnchor="RFC3569">
          <front>
            <title>An Overview of Source-Specific Multicast (SSM)</title>
            <author fullname="S. Bhattacharyya" initials="S." role="editor" surname="Bhattacharyya"/>
            <date month="July" year="2003"/>
            <abstract>
              <t indent="0">The purpose of this document is to provide an overview of Source-Specific Multicast (SSM) and issues related to its deployment. It discusses how the SSM service model addresses the challenges faced in inter-domain multicast deployment, changes needed to routing protocols and applications to deploy SSM and interoperability issues with current multicast service models. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3569"/>
          <seriesInfo name="DOI" value="10.17487/RFC3569"/>
        </reference>
        <reference anchor="RFC3678" target="https://www.rfc-editor.org/info/rfc3678" quoteTitle="true" derivedAnchor="RFC3678">
          <front>
            <title>Socket Interface Extensions for Multicast Source Filters</title>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="B. Fenner" initials="B." surname="Fenner"/>
            <author fullname="B. Quinn" initials="B." surname="Quinn"/>
            <date month="January" year="2004"/>
            <abstract>
              <t indent="0">The Internet Group Management Protocol (IGMPv3) for IPv4 and the Multicast Listener Discovery (MLDv2) for IPv6 add the capability for applications to express source filters on multicast group memberships, which allows receiver applications to determine the set of senders (sources) from which to accept multicast traffic. This capability also simplifies support of one-to-many type multicast applications. This document specifies new socket options and functions to manage source filters for IP Multicast group memberships. It also defines the socket structures to provide input and output arguments to these new application program interfaces (APIs). These extensions are designed to provide access to the source filtering features, while introducing a minimum of change into the system and providing complete compatibility for existing multicast applications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3678"/>
          <seriesInfo name="DOI" value="10.17487/RFC3678"/>
        </reference>
        <reference anchor="RFC3810" target="https://www.rfc-editor.org/info/rfc3810" quoteTitle="true" derivedAnchor="RFC3810">
          <front>
            <title>Multicast Listener Discovery Version 2 (MLDv2) for IPv6</title>
            <author fullname="R. Vida" initials="R." role="editor" surname="Vida"/>
            <author fullname="L. Costa" initials="L." role="editor" surname="Costa"/>
            <date month="June" year="2004"/>
            <abstract>
              <t indent="0">This document updates RFC 2710, and it specifies Version 2 of the ulticast Listener Discovery Protocol (MLDv2). MLD is used by an IPv6 router to discover the presence of multicast listeners on directly attached links, and to discover which multicast addresses are of interest to those neighboring nodes. MLDv2 is designed to be interoperable with MLDv1. MLDv2 adds the ability for a node to report interest in listening to packets with a particular multicast address only from specific source addresses or from all sources except for specific source addresses. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3810"/>
          <seriesInfo name="DOI" value="10.17487/RFC3810"/>
        </reference>
        <reference anchor="RFC4861" target="https://www.rfc-editor.org/info/rfc4861" quoteTitle="true" derivedAnchor="RFC4861">
          <front>
            <title>Neighbor Discovery for IP version 6 (IPv6)</title>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <author fullname="E. Nordmark" initials="E." surname="Nordmark"/>
            <author fullname="W. Simpson" initials="W." surname="Simpson"/>
            <author fullname="H. Soliman" initials="H." surname="Soliman"/>
            <date month="September" year="2007"/>
            <abstract>
              <t indent="0">This document specifies the Neighbor Discovery protocol for IP Version 6. IPv6 nodes on the same link use Neighbor Discovery to discover each other's presence, to determine each other's link-layer addresses, to find routers, and to maintain reachability information about the paths to active neighbors. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4861"/>
          <seriesInfo name="DOI" value="10.17487/RFC4861"/>
        </reference>
        <reference anchor="RFC4862" target="https://www.rfc-editor.org/info/rfc4862" quoteTitle="true" derivedAnchor="RFC4862">
          <front>
            <title>IPv6 Stateless Address Autoconfiguration</title>
            <author fullname="S. Thomson" initials="S." surname="Thomson"/>
            <author fullname="T. Narten" initials="T." surname="Narten"/>
            <author fullname="T. Jinmei" initials="T." surname="Jinmei"/>
            <date month="September" year="2007"/>
            <abstract>
              <t indent="0">This document specifies the steps a host takes in deciding how to autoconfigure its interfaces in IP version 6. The autoconfiguration process includes generating a link-local address, generating global addresses via stateless address autoconfiguration, and the Duplicate Address Detection procedure to verify the uniqueness of the addresses on a link. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4862"/>
          <seriesInfo name="DOI" value="10.17487/RFC4862"/>
        </reference>
        <reference anchor="RFC9776" target="https://www.rfc-editor.org/info/rfc9776" quoteTitle="true" derivedAnchor="RFC9776">
          <front>
            <title>Internet Group Management Protocol, Version 3</title>
            <author initials="B." surname="Haberman" fullname="Brian Haberman" role="editor">
              <organization showOnFrontPage="true">Johns Hopkins University Applied Physics Lab</organization>
            </author>
            <date month="March" year="2025"/>
          </front>
          <seriesInfo name="STD" value="100"/>
          <seriesInfo name="RFC" value="9776"/>
          <seriesInfo name="DOI" value="10.17487/RFC9776"/>
        </reference>
      </references>
    </references>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-design-rationale">Design Rationale</name>
      <section anchor="state_change" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a.1">
        <name slugifiedName="name-the-need-for-state-change-r">The Need for State-Change Report Messages</name>
        <t indent="0" pn="section-appendix.a.1-1">MLDv2 specifies two types of Multicast Listener Reports: Current
   State and State Change.  This section describes the rationale for the
   need for both these types of Reports.</t>
        <t indent="0" pn="section-appendix.a.1-2">Routers need to distinguish Multicast Listener Reports that were sent
   in response to Queries from those that were sent as a result of a
   change in the per-interface state.  Multicast Listener Reports that
   are sent in response to Multicast Address Listener Queries are used
   mainly to refresh the existing state at the router; they typically do
   not cause transitions in state at the router.  Multicast Listener
   Reports that are sent in response to changes in the per-interface
   state require the router to take some action in response to the
	   received report (see <xref target="rcv_rpt" format="default" sectionFormat="of" derivedContent="Section 7.4"/>).</t>
        <t indent="0" pn="section-appendix.a.1-3">The inability to distinguish between the two types of reports would
   force a router to treat all Multicast Listener Reports as potential
   changes in state and could result in increased processing at the
   router as well as an increase in MLD traffic on the link.</t>
      </section>
      <section anchor="host_suppress" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a.2">
        <name slugifiedName="name-host-suppression">Host Suppression</name>
        <t indent="0" pn="section-appendix.a.2-1">In MLDv1, a host would not send a pending Multicast Listener Report
   if a similar report was sent by another listener on the link.  In
   MLDv2, the suppression of Multicast Listener Reports has been
   removed.  The following points explain this decision.
        </t>
        <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-appendix.a.2-2"><li pn="section-appendix.a.2-2.1" derivedCounter="1.">
            <t indent="0" pn="section-appendix.a.2-2.1.1">Routers may want to track per-host Multicast Listener status on an
      interface.  This would allow routers to implement fast leaves
      (e.g., for layered multicast congestion control schemes) as well
      as track listener status for possible security or accounting
      purposes.  The present specification does not require routers to
      implement per-host tracking.  Nevertheless, the lack of host
      suppression in MLDv2 makes it possible to implement either
      proprietary or future standard behavior of multicast routers that
      would support per-host tracking, while being fully interoperable
      with MLDv2 listeners and routers that implement the exact behavior
		   described in this specification.</t>
          </li>
          <li pn="section-appendix.a.2-2.2" derivedCounter="2.">
            <t indent="0" pn="section-appendix.a.2-2.2.1">Multicast Listener Report suppression does not work well on
      bridged LANs.  Many bridges and Layer 2 / Layer 3 switches that
      implement MLD snooping do not forward MLD messages across LAN
      segments in order to prevent Multicast Listener Report
		   suppression.</t>
          </li>
          <li pn="section-appendix.a.2-2.3" derivedCounter="3.">
            <t indent="0" pn="section-appendix.a.2-2.3.1">By eliminating Multicast Listener Report suppression, hosts have
      fewer messages to process; this leads to a simpler state machine
		   implementation.</t>
          </li>
          <li pn="section-appendix.a.2-2.4" derivedCounter="4.">
            <t indent="0" pn="section-appendix.a.2-2.4.1">In MLDv2, a single Multicast Listener Report now bundles multiple
      Multicast Address Records to decrease the number of packets sent.
      In comparison, the previous version of MLD required that each
		   multicast address be reported in a separate message.</t>
          </li>
        </ol>
      </section>
      <section anchor="mode_switch" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a.3">
        <name slugifiedName="name-switching-router-filter-mode">Switching Router Filter Modes from EXCLUDE to INCLUDE</name>
        <t indent="0" pn="section-appendix.a.3-1">If on a link there are nodes in both EXCLUDE and INCLUDE modes for a
   single multicast address, the router must be in EXCLUDE mode as well
   (see <xref target="def-router-filter-mode" format="default" sectionFormat="of" derivedContent="Section 7.2.1"/>).  In EXCLUDE mode, a router forwards traffic from
   all sources except those in the Exclude List.  If all nodes in
   EXCLUDE mode cease to exist or to listen, it would be desirable for
   the router to switch back to INCLUDE mode seamlessly, without
	   interrupting the flow of traffic to existing listeners.</t>
        <t indent="0" pn="section-appendix.a.3-2">One of the ways to accomplish this is for routers to keep track of
   all sources that nodes that are in INCLUDE mode listen to, even
   though the router itself is in EXCLUDE mode.  If the Filter Timer for
   a multicast address expires, it implies that there are no nodes in
   EXCLUDE mode on the link (otherwise, a Multicast Listener Report from
   that node would have refreshed the filter timer).  The router can
   then switch to INCLUDE mode seamlessly; sources from the Requested
   List are moved to the Include List, while sources from the Exclude
	   List are deleted.</t>
      </section>
    </section>
    <section numbered="true" toc="include" removeInRFC="false" pn="section-appendix.b">
      <name slugifiedName="name-summary-of-changes">Summary of Changes</name>
      <section numbered="true" toc="include" removeInRFC="false" pn="section-appendix.b.1">
        <name slugifiedName="name-mldv1">MLDv1</name>
        <t indent="0" pn="section-appendix.b.1-1">The following is a summary of changes from MLDv1, specified in <xref target="RFC2710" format="default" sectionFormat="of" derivedContent="RFC2710"/>.
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.b.1-2">
          <li pn="section-appendix.b.1-2.1">
            <t indent="0" pn="section-appendix.b.1-2.1.1">MLDv2 introduces source filtering.</t>
          </li>
          <li pn="section-appendix.b.1-2.2">
            <t indent="0" pn="section-appendix.b.1-2.2.1">The IP service interface of MLDv2 nodes is modified accordingly.
	   It enables the specification of a filter-mode and a source-list.</t>
          </li>
          <li pn="section-appendix.b.1-2.3">
            <t indent="0" pn="section-appendix.b.1-2.3.1">An MLDv2 node keeps per-socket and per-interface Multicast Address Listening states that include a filter-mode and a source-list for
      each multicast address.  This enables packet filtering based on a
	   socket's multicast reception state.</t>
          </li>
          <li pn="section-appendix.b.1-2.4">
            <t indent="0" pn="section-appendix.b.1-2.4.1">MLDv2 state kept on routers includes a filter-mode and a list of
      sources and source timers for each multicast address that has
      listeners on the link.  MLDv1 routers kept only the list of
	   multicast addresses.</t>
          </li>
          <li pn="section-appendix.b.1-2.5">
            <t indent="0" pn="section-appendix.b.1-2.5.1">Queries include additional fields (<xref target="qry_msg" format="default" sectionFormat="of" derivedContent="Section 5.1"/>).</t>
          </li>
          <li pn="section-appendix.b.1-2.6">
            <t indent="0" pn="section-appendix.b.1-2.6.1">The S flag is included in queries in order to fix robustness issues.</t>
          </li>
          <li pn="section-appendix.b.1-2.7">
            <t indent="0" pn="section-appendix.b.1-2.7.1">The Querier's Robustness Variable and Query Interval Code are
      included in Queries in order to synchronize all MLDv2 routers
	   connected to the same link.</t>
          </li>
          <li pn="section-appendix.b.1-2.8">
            <t indent="0" pn="section-appendix.b.1-2.8.1">A new Query type (Multicast Address and Source Specific Query) is
	   introduced.</t>
          </li>
          <li pn="section-appendix.b.1-2.9">
            <t indent="0" pn="section-appendix.b.1-2.9.1">The Maximum Response Delay is not directly included in the Query
      anymore.  Instead, an exponential algorithm is used to calculate
      its value, based on the Maximum Response Code included in the
      Query.  The maximum value is increased from 65535 milliseconds to
	   about 140 minutes.</t>
          </li>
          <li pn="section-appendix.b.1-2.10">
            <t indent="0" pn="section-appendix.b.1-2.10.1">Reports include Multicast Address Records.  Information on the
      listening state for several different multicast addresses can be
	   included in the same Report message.</t>
          </li>
          <li pn="section-appendix.b.1-2.11">
            <t indent="0" pn="section-appendix.b.1-2.11.1">Reports are sent to the "all MLDv2-capable multicast routers"
      address, instead of the multicast address the host listens to, as
      in MLDv1.  This facilitates the operation of Layer 2 snooping
	   switches.</t>
          </li>
          <li pn="section-appendix.b.1-2.12">
            <t indent="0" pn="section-appendix.b.1-2.12.1">There is no "host suppression", as in MLDv1.  All nodes send
	   Report messages.</t>
          </li>
          <li pn="section-appendix.b.1-2.13">
            <t indent="0" pn="section-appendix.b.1-2.13.1">Unsolicited Reports, announcing changes in receiver listening
      state, are sent [Robustness Variable] times.  <xref target="RFC2710" format="default" sectionFormat="of" derivedContent="RFC2710"/> is less
	   explicit.</t>
          </li>
          <li pn="section-appendix.b.1-2.14">
            <t indent="0" pn="section-appendix.b.1-2.14.1">There are no Done messages.</t>
          </li>
          <li pn="section-appendix.b.1-2.15">
            <t indent="0" pn="section-appendix.b.1-2.15.1">Interoperability with MLDv1 systems is achieved by MLDv2 state
	   operations.</t>
          </li>
          <li pn="section-appendix.b.1-2.16">
            <t indent="0" pn="section-appendix.b.1-2.16.1">In order to ensure interoperability, hosts maintain a Host
      Compatibility Mode variable and an Older-Version-Querier-Present
      Timer per interface.  Routers maintain a Multicast Address
      Compatibility Mode variable and an Older-Version-Host-Present
      Timer per multicast address.</t>
          </li>
        </ul>
      </section>
      <section anchor="_810-changes" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.b.2">
        <name slugifiedName="name-changes-since-rfc-3810">Changes since RFC 3810</name>
        <t indent="0" pn="section-appendix.b.2-1">The following summarizes the changes made since <xref target="RFC3810" format="default" sectionFormat="of" derivedContent="RFC3810"/>.
        </t>
        <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-appendix.b.2-2">
          <li pn="section-appendix.b.2-2.1">
            <t indent="0" pn="section-appendix.b.2-2.1.1">Added definition of Resv to address Erratum 4773.</t>
          </li>
          <li pn="section-appendix.b.2-2.2">
            <t indent="0" pn="section-appendix.b.2-2.2.1">Added clarifying text on which multicast addresses require the sending of MLD messages
	   to address Erratum 5977.</t>
          </li>
          <li pn="section-appendix.b.2-2.3">
            <t indent="0" pn="section-appendix.b.2-2.3.1">Added text to clarify the Group Membership Interval Timer changes per Erratum 6725.</t>
          </li>
          <li pn="section-appendix.b.2-2.4">
            <t indent="0" pn="section-appendix.b.2-2.4.1">Changed "Reserved field" to "Flags field" in messages to facilitate use of an IANA-managed registry for future bit allocations.</t>
          </li>
        </ul>
      </section>
      <section numbered="false" toc="include" removeInRFC="false" pn="section-appendix.b.3">
        <name slugifiedName="name-acknowledgments">Acknowledgments</name>
        <t indent="0" pn="section-appendix.b.3-1">We would like to thank <contact fullname="Hitoshi Asaeda"/>, <contact fullname="Randy Bush"/>, <contact fullname="Francis Dupont"/>, <contact fullname="Ted Hardie"/>, <contact fullname="Russ Housley"/>, <contact fullname="Konstantin Kabassanov"/>, <contact fullname="Erik Nordmark"/>,
      <contact fullname="Shinsuke Suzuki"/>, <contact fullname="Margaret       Wasserman"/>, <contact fullname="Bert Wijnen"/>, and <contact fullname="Remi Zara"/> for their valuable comments and suggestions on
      this specification.</t>
        <t indent="0" pn="section-appendix.b.3-2"><contact fullname="Stig Venaas"/>, <contact fullname="Hitoshi       Asaeda"/>, and <contact fullname="Mike McBride"/> have provided valuable
      feedback on this specification, and we thank them for
      their input.</t>
      </section>
      <section numbered="false" toc="include" removeInRFC="false" pn="section-appendix.b.4">
        <name slugifiedName="name-contributors">Contributors</name>
        <t indent="0" pn="section-appendix.b.4-1"><contact fullname="Roland Vida"/>, <contact fullname="Luis Henrique       Maciel Kosmalski Costa"/>, <contact fullname="Serge Fdida"/>, <contact fullname="Steve Deering"/>, <contact fullname="Bill Fenner"/>, and
      <contact fullname="Isidor Kouvelas"/> are the authors of RFC 3810, which
      makes up the majority of the content in this specification.</t>
        <t indent="0" pn="section-appendix.b.4-2"><contact fullname="Anuj Budhiraja"/>, <contact fullname="Toerless       Eckert"/>, <contact fullname="Olufemi Komolafe"/>, and <contact fullname="Tim Winters"/> have contributed valuable content to this
      specification.</t>
      </section>
    </section>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.c">
      <name slugifiedName="name-authors-address">Author's Address</name>
      <author fullname="Brian Haberman" initials="B." surname="Haberman" role="editor">
        <organization abbrev="JHU APL" showOnFrontPage="true">Johns Hopkins University Applied Physics Lab</organization>
        <address>
          <email>brian@innovationslab.net</email>
        </address>
      </author>
    </section>
  </back>
</rfc>
