rfc9777xml2.original.xml | rfc9777.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<?rfc toc="yes"?> | ||||
<?rfc sortrefs="yes"?> | ||||
<?rfc symrefs="yes"?> | ||||
<?rfc compact="yes"?> | ||||
<?rfc comments="yes"?> | ||||
<?rfc inline="yes"?> | ||||
<rfc category="std" docName="draft-ietf-pim-3810bis-12" ipr="pre5378trust200902" | ||||
updates="2710" obsoletes="3810"> | ||||
<front> | ||||
<title abbrev="MLDv2 Revision">Multicast Listener Discovery Version 2 (MLDv2 | ||||
) for IPv6</title> | ||||
<author fullname="Brian Haberman" initials="B." surname="Haberman" role="edit | <!DOCTYPE rfc [ | |||
or"> | <!ENTITY nbsp " "> | |||
<!ENTITY zwsp "​"> | ||||
<!ENTITY nbhy "‑"> | ||||
<!ENTITY wj "⁠"> | ||||
]> | ||||
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-ie | ||||
tf-pim-3810bis-12" number="9777" ipr="pre5378trust200902" updates="2710" obsolet | ||||
es="3810" consensus="true" submissionType="IETF" xml:lang="en" tocInclude="true" | ||||
sortRefs="true" symRefs="true" version="3"> | ||||
<front> | ||||
<!--[rfced] May we update the short title that spans the top of the | ||||
PDF file from "MLDv2 Revision" to "MLDv2 for IPv6" for clarity | ||||
and to match the document title more closely? | ||||
Original: | ||||
MLDv2 Revision | ||||
Perhaps: | ||||
MLDv2 for IPv6 | ||||
--> | ||||
<!-- MLDv2 is being published as an Internet Stanard. We have marked this | ||||
as STD 101 (new STD), as we do not see any existing STDs related to MLD. | ||||
Please review and let us know if changes are needed. See | ||||
https://www.rfc-editor.org/search/rfc_search_detail.php?sortkey=Number&sorting=D | ||||
ESC&page=All&pubstatus%5B%5D=Standards%20Track&std_trk=Internet%20Standard | ||||
--> | ||||
<!-- [rfced] While we understand the original document was published with much | ||||
of the text we are questioning below, the questions are aimed at making the text | ||||
as correct as possible. Please let us know if these updates are incorrect or | ||||
undesirable. | ||||
--> | ||||
<title abbrev="MLDv2 Revision">Multicast Listener Discovery Version 2 (MLDv2 | ||||
) for IPv6</title> | ||||
<seriesInfo name="RFC" value="9777"/> | ||||
<seriesInfo name="STD" value="101"/> | ||||
<author fullname="Brian Haberman" initials="B." surname="Haberman" role="edi | ||||
tor"> | ||||
<organization abbrev="JHU APL">Johns Hopkins University Applied Physics La b</organization> | <organization abbrev="JHU APL">Johns Hopkins University Applied Physics La b</organization> | |||
<address> | <address> | |||
<email>brian@innovationslab.net</email> | <email>brian@innovationslab.net</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year="2025" month="March"/> | ||||
<abstract> | <area>RTG</area> | |||
<t>This document updates RFC 2710, and it specifies Version 2 of the | <workgroup>pim</workgroup> | |||
Multicast Listener Discovery Protocol (MLDv2). MLD is used by an | ||||
<!-- [rfced] Please insert any keywords (beyond those that appear in | ||||
the title) for use on https://www.rfc-editor.org/search. --> | ||||
<keyword>example</keyword> | ||||
<abstract> | ||||
<!--[rfced] In the Abstract, is it preferred to lead with the Updates | ||||
relationship, e.g., "This document updates RFC 2710" (first | ||||
sentence), or should that text be grouped with "This document | ||||
obsoletes RFC 3810" (last sentence), which would also match the | ||||
Abstract in draft-ietf-pim-3376bis-12? | ||||
Also, note that we updated the expansion of "MLD" so that it does | ||||
not include "Protocol" for consistency. | ||||
Original: | ||||
This document updates RFC 2710, and it specifies Version 2 | ||||
of the Multicast Listener Discovery Protocol (MLDv2). | ||||
This document obsoletes RFC 3810. | ||||
Perhaps: | ||||
This document specifies the Multicast Listener Discovery | ||||
version 2 (MLDv2) protocol. | ||||
This document updates RFC 2710 and obsoletes RFC 3810. | ||||
--> | ||||
<t>This document updates RFC 2710, and it specifies the | ||||
Multicast Listener Discovery version 2 (MLDv2) protocol. MLD is used by an | ||||
IPv6 router to discover the presence of multicast listeners on | IPv6 router to discover the presence of multicast listeners on | |||
directly attached links, and to discover which multicast addresses | directly attached links and to discover which multicast addresses | |||
are of interest to those neighboring nodes. MLDv2 is designed to be | are of interest to those neighboring nodes. MLDv2 is designed to be | |||
interoperable with MLDv1. MLDv2 adds the ability for a node to | interoperable with MLDv1. MLDv2 adds the ability for a node to | |||
report interest in listening to packets with a particular multicast | report interest in listening to packets with a particular multicast | |||
address only from specific source addresses or from all sources | address only from specific source addresses or from all sources | |||
except for specific source addresses.</t> | except for specific source addresses.</t> | |||
<t>This document obsoletes RFC 3810.</t> | ||||
</abstract> | ||||
</front> | ||||
<middle> | ||||
<section anchor="intro" numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t>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. | ||||
<t>This document obsoletes RFC 3810.</t> | <!--[rfced] Is "on the one hand" and "on the other hand" necessary in | |||
</abstract> | this sentence? While we understand that it was included in RFC | |||
</front> | 3810, please consider, for ease of reading, if you would like to | |||
remove it and perhaps include "respectively", if performing the | ||||
"multicast router part" corresponds to collecting the multicast | ||||
listener information and the "multicast address listener part" | ||||
corresponds to informing other neighboring multicast routers of | ||||
its listening state, as shown below. | ||||
<middle> | Original: | |||
<section anchor="intro" title="Introduction"> | 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 on the one hand, and to inform itself and | ||||
other neighboring multicast routers of its listening state on the | ||||
other hand. | ||||
<t>The Multicast Listener Discovery Protocol (MLD) is used by IPv6 | Perhaps: | |||
routers to discover the presence of multicast listeners (i.e., nodes | Note that a multicast router may itself be a listener of one or more | |||
that wish to receive multicast packets) on their directly attached | multicast addresses; in this case, it performs both the "multicast | |||
links, and to discover specifically which multicast addresses are of | router part" and the "multicast address listener part" of the | |||
interest to those neighboring nodes. Note that a multicast router | 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. | ||||
--> | ||||
Note that a multicast router | ||||
may itself be a listener of one or more multicast addresses; in this | may itself be a listener of one or more multicast addresses; in this | |||
case it performs both the "multicast router part" and the "multicast | case, it performs both the "multicast router part" and the "multicast | |||
address listener part" of the protocol, to collect the multicast | address listener part" of the protocol, to collect the multicast | |||
listener information needed by its multicast routing protocol on the | listener information needed by its multicast routing protocol on the | |||
one hand, and to inform itself and other neighboring multicast | one hand, and to inform itself and other neighboring multicast | |||
routers of its listening state on the other hand.</t> | routers of its listening state on the other hand.</t> | |||
<t>This document specifies version 2 of MLD. The previous version of | ||||
<t>This document specifies Version 2 of MLD. The previous version of | MLD is specified in <xref target="RFC2710" format="default"/>; in this docume | |||
MLD is specified in <xref target="RFC2710" />. In this document we will refe | nt, we will refer to it as "MLDv1". MLDv2 is a translation of IGMPv3 <xref targ | |||
r to it | et="RFC9776" format="default"/> | |||
as MLDv1. MLDv2 is a translation of the IGMPv3 protocol <xref target="RFC337 | ||||
6" /> | ||||
for IPv6 semantics.</t> | for IPv6 semantics.</t> | |||
<t>The MLDv2 protocol, when compared to MLDv1, adds support for "source | ||||
<t>The MLDv2 protocol, when compared to MLDv1, adds support for "source | ||||
filtering", i.e., the ability for a node to report interest in | filtering", i.e., the ability for a node to report interest in | |||
listening to packets only from specific source addresses, as | listening to packets only from specific source addresses, as | |||
required to support Source-Specific Multicast <xref target="RFC3569" />, or f | required to support Source-Specific Multicast (SSM) <xref target="RFC3569" fo | |||
rom *all | rmat="default"/>, or from <strong>all | |||
but* specific source addresses, sent to a particular multicast | but</strong> specific source addresses, sent to a particular multicast | |||
address. MLDv2 is designed to be interoperable with MLDv1.</t> | address. MLDv2 is designed to be interoperable with MLDv1.</t> | |||
<t>This document uses "SSM-aware" to refer to systems that support SSM | ||||
as defined in <xref target="RFC4607" format="default"/>.</t> | ||||
<t>This document obsoletes <xref target="RFC3810" format="default"/>. <xre | ||||
f target="_810-changes" format="default"/> lists the main | ||||
changes from <xref target="RFC3810" format="default"/>.</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>Conventions Used in This Document</name> | ||||
<t>This document uses SSM-aware to refer to systems that support Source-Speci | <t> | |||
fic Multicast (SSM) | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
as defined in <xref target="RFC4607"/>.</t> | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | |||
", | ||||
<t>This document obsoletes <xref target="RFC3810"/>. <xref target="3810-chang | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
es"/> lists the main | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
changes from <xref target="RFC3810"/>.</t> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
be | ||||
<section title="Conventions Used in This Document"> | interpreted as described in BCP 14 <xref target="RFC2119"/> <xref | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | target="RFC8174"/> when, and only when, they appear in all capitals, as | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | shown here. | |||
"OPTIONAL" in this document are to be interpreted as described in BCP | </t> | |||
14 <xref target="RFC2119"/><xref target="RFC8174"/> when, and only when, they | </section> | |||
appear in all | </section> | |||
capitals, as shown here.</t> | <section numbered="true" toc="default"> | |||
</section> | <name>Protocol Overview</name> | |||
</section> | <t>This section gives a brief description of the protocol operation. The | |||
<section title="Protocol Overview"> | ||||
<t>This section gives a brief description of the protocol operation. The | ||||
following sections present the protocol details.</t> | following sections present the protocol details.</t> | |||
<t>MLD is an asymmetric protocol; it specifies separate behaviors for | ||||
<t>MLD is an asymmetric protocol; it specifies separate behaviors for | ||||
multicast address listeners (i.e., hosts or routers that listen to | multicast address listeners (i.e., hosts or routers that listen to | |||
multicast packets) and multicast routers. The purpose of MLD is to | multicast packets) and multicast routers. The purpose of MLD is to | |||
enable each multicast router to learn, for each of its directly | enable each multicast router to learn, for each of its directly | |||
attached links, which multicast addresses and which sources have | attached links, which multicast addresses and which sources have | |||
interested listeners on that link. The information gathered by MLD | interested listeners on that link. The information gathered by MLD | |||
is provided to whichever multicast routing protocol is used by the | is provided to whichever multicast routing protocol is used by the | |||
router, in order to ensure that multicast packets are delivered to | router, in order to ensure that multicast packets are delivered to | |||
all links where there are listeners interested in such packets.</t> | all links where there are listeners interested in such packets.</t> | |||
<t>Multicast routers only need to know that at least one node on an | ||||
<t>Multicast routers only need to know that at least one node on an | ||||
attached link is listening to packets for a particular multicast | attached link is listening to packets for a particular multicast | |||
address, from a particular source; a multicast router is not required | address, from a particular source; a multicast router is not required | |||
to individually keep track of the interests of each neighboring | to individually keep track of the interests of each neighboring | |||
node. (Nevertheless, see <xref target="host_suppress" /> item 1 for d | node. (Nevertheless, see <xref target="host_suppress" format="default | |||
iscussion.)</t> | "/>, item 1 for discussion.)</t> | |||
<t>A multicast router performs the router part of the MLDv2 protocol | ||||
<t>A multicast router performs the router part of the MLDv2 protocol | (described in detail in <xref target="mr_proto" format="default"/>) on each o | |||
(described in details in <xref target="mr_proto" />) on each of its directly | f its directly attached | |||
attached | ||||
links. If a multicast router has more than one interface connected | 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 | to the same link, it only needs to operate the protocol on one of | |||
those interfaces. The router behavior depends on whether there are | those interfaces. The router behavior depends on whether there are | |||
several multicast routers on the same subnet, or not. If that is the | several multicast routers on the same subnet, or not. If that is the | |||
case, a querier election mechanism (described in <xref target="elect" />) is | case, a querier election mechanism (described in <xref target="elect" format= "default"/>) is | |||
used to elect a single multicast router to be in Querier state. This | used to elect a single multicast router to be in Querier state. This | |||
router is called the Querier. All multicast routers on the subnet | router is called the "Querier". All multicast routers on the subnet | |||
listen to the messages sent by multicast address listeners, and | listen to the messages sent by multicast address listeners, and | |||
maintain the same multicast listening information state, so that they | maintain the same multicast listening information state, so that they | |||
can take over the querier role, should the present Querier fail. | can take over the querier role, should the present Querier fail. | |||
Nevertheless, only the Querier sends periodical or triggered query | Nevertheless, only the Querier sends periodical or triggered query | |||
messages on the subnet, as described in <xref target="mld_qrys" />.</t> | messages on the subnet, as described in <xref target="mld_qrys" format="defau | |||
lt"/>.</t> | ||||
<t>A multicast address listener performs the listener part of the | <t>A multicast address listener performs the listener part of the | |||
MLDv2 protocol (described in details in <xref target="proto" />) on all inter | MLDv2 protocol (described in detail in <xref target="proto" format="default"/ | |||
faces | >) on all interfaces | |||
on which multicast reception is supported, even if more than one of | on which multicast reception is supported, even if more than one of | |||
those interfaces are connected to the same link.</t> | those interfaces are connected to the same link.</t> | |||
<section anchor="build_state" numbered="true" toc="default"> | ||||
<section title="Building Multicast Listening State on Multicast Address Liste | <name>Building Multicast Listening State on Multicast Address Listeners< | |||
ners" anchor="build_state"> | /name> | |||
<t>Upper-layer protocols and applications that run on a multicast | ||||
<t>Upper-layer protocols and applications that run on a multicast | ||||
address listener node use specific service interface calls (described | address listener node use specific service interface calls (described | |||
in <xref target="srvc_if" />) to ask the IP layer to enable or disable recept ion of | in <xref target="srvc_if" format="default"/>) to ask the IP layer to enable o r disable reception of | |||
packets sent to specific multicast addresses. The node keeps | packets sent to specific multicast addresses. The node keeps | |||
Multicast Address Listening state for each socket on which the | Multicast Address Listening state for each socket on which the | |||
service interface calls have been invoked (<xref target="sock_state" />). In addition | service interface calls have been invoked (<xref target="sock_state" format=" default"/>). In addition | |||
to this per-socket multicast listening state, a node must also | to this per-socket multicast listening state, a node must also | |||
maintain or compute multicast listening state for each of its | maintain or compute multicast listening state for each of its | |||
interfaces (<xref target="if_state" />). Conceptually, that state consists o f a set | interfaces (<xref target="if_state" format="default"/>). Conceptually, that state consists of a set | |||
of records, with each record containing an IPv6 multicast address, a | of records, with each record containing an IPv6 multicast address, a | |||
filter mode, and a source list. The filter mode may be either | filter mode, and a source list. The filter mode may be either | |||
INCLUDE or EXCLUDE. In INCLUDE mode, reception of packets sent to | INCLUDE or EXCLUDE. In INCLUDE mode, reception of packets sent to | |||
the specified multicast address is enabled only from the source | the specified multicast address is enabled only from the source | |||
addresses listed in the source list. In EXCLUDE mode, reception of | addresses listed in the source list. In EXCLUDE mode, reception of | |||
packets sent to the given multicast address is enabled from all | packets sent to the given multicast address is enabled from all | |||
source addresses except those listed in the source list.</t> | source addresses except those listed in the source list.</t> | |||
<t>At most one record per multicast address exists for a given | <t>At most, one record per multicast address exists for a given | |||
interface. This per-interface state is derived from the per-socket | interface. This per-interface state is derived from the per-socket | |||
state, but may differ from it when different sockets have differing | 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 | filter modes and/or source lists for the same multicast address and | |||
interface. After a multicast packet has been accepted from an | interface. After a multicast packet has been accepted from an | |||
interface by the IP layer, its subsequent delivery to the application | interface by the IP layer, its subsequent delivery to the application | |||
connected to a particular socket depends on the multicast listening | connected to a particular socket depends on the multicast listening | |||
state of that socket (and possibly also on other conditions, such as | state of that socket (and possibly also on other conditions, such as | |||
what transport-layer port the socket is bound to). Note that MLDv2 | what transport-layer port the socket is bound to). Note that MLDv2 | |||
messages are not subject to source filtering and must always be | messages are not subject to source filtering and must always be | |||
processed by hosts and routers.</t> | processed by hosts and routers.</t> | |||
</section> | </section> | |||
<section anchor="msg_ex" numbered="true" toc="default"> | ||||
<section title="Exchanging Messages between the Querier and the Listening Nod | <name>Exchanging Messages between the Querier and the Listening Nodes</n | |||
es" anchor="msg_ex"> | ame> | |||
<t>There are three types of MLDv2 query messages: General Queries, | ||||
<t>There are three types of MLDv2 query messages: General Queries, | ||||
Multicast Address Specific Queries, and Multicast Address and Source | Multicast Address Specific Queries, and Multicast Address and Source | |||
Specific Queries. The Querier periodically sends General Queries, to | Specific Queries. The Querier periodically sends General Queries, to | |||
learn multicast address listener information from an attached link. | learn multicast address listener information from an attached link. | |||
These queries are used to build and refresh the Multicast Address | These queries are used to build and refresh the Multicast Address | |||
Listener state inside all multicast routers on the link.</t> | Listener state inside all multicast routers on the link.</t> | |||
<t>Nodes respond to these queries by reporting their per-interface | ||||
<t>Nodes respond to these queries by reporting their per-interface | Multicast Address Listening state through Current State Report | |||
Multicast Address Listening state, through Current State Report | messages sent to a specific multicast address that all MLDv2 routers on | |||
messages sent to a specific multicast address all MLDv2 routers on | ||||
the link listen to. On the other hand, if the listening state of a | the link listen to. On the other hand, if the listening state of a | |||
node changes, the node immediately reports these changes through a | node changes, the node immediately reports these changes through a | |||
State Change Report message. The State Change Report contains either | State Change Report message. The State Change Report contains either | |||
Filter Mode Change records, Source List Change records, or records of | Filter Mode Change Records, Source List Change Records, or records of | |||
both types. A detailed description of the report messages is | both types. A detailed description of the report messages is | |||
presented in <xref target="mar_types" />.</t> | presented in <xref target="mar_types" format="default"/>.</t> | |||
<t>Both router and listener state changes are mainly triggered by the | ||||
<t>Both router and listener state changes are mainly triggered by the | expiration of a specific timer or the reception of an MLD message | |||
expiration of a specific timer, or the reception of an MLD message | ||||
(listener state change can be also triggered by the invocation of a | (listener state change can be also triggered by the invocation of a | |||
service interface call). Therefore, to enhance protocol robustness, | service interface call). Therefore, to enhance protocol robustness, | |||
in spite of the possible unreliability of message exchanges, messages | in spite of the possible unreliability of message exchanges, messages | |||
are retransmitted several times. Furthermore, timers are set so as | are retransmitted several times. Furthermore, timers are set so as | |||
to take into account the possible message losses, and to wait for | to take into account the possible message losses and to wait for | |||
retransmissions.</t> | retransmissions.</t> | |||
<t>Periodical General Queries and Current State Reports do not apply | ||||
<t>Periodical General Queries and Current State Reports do not apply | this rule, in order to not overload the link; it is assumed that in | |||
this rule, in order not to overload the link; it is assumed that in | general, these messages do not generate state changes as their main | |||
general these messages do not generate state changes, their main | purpose is to refresh existing state. Thus, even if one such | |||
purpose being to refresh existing state. Thus, even if one such | ||||
message is lost, the corresponding state will be refreshed during the | message is lost, the corresponding state will be refreshed during the | |||
next reporting period.</t> | next reporting period.</t> | |||
<t>As opposed to Current State Reports, State Change Reports are | ||||
<t>As opposed to Current State Reports, State Change Reports are | ||||
retransmitted several times, in order to avoid them being missed by | retransmitted several times, in order to avoid them being missed by | |||
one or more multicast routers. The number of retransmissions depends | one or more multicast routers. The number of retransmissions depends | |||
on the so-called Robustness Variable. This variable allows tuning | on the so-called Robustness Variable. This variable allows tuning | |||
the protocol according to the expected packet loss on a link. If a | 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 | link is expected to be lossy (e.g., a wireless connection), the value | |||
of the Robustness Variable may be increased. MLD is robust to | of the Robustness Variable may be increased. MLD is robust to | |||
[Robustness Variable]-1 packet losses. This document recommends a | [Robustness Variable]-1 packet losses. This document recommends a | |||
default value of 2 for the Robustness Variable (see <xref target="robu | default value of 2 for the Robustness Variable (see <xref target="robu | |||
st" />).</t> | st" format="default"/>).</t> | |||
<t>If more changes to the same per-interface state entry occur before | ||||
<t>If more changes to the same per-interface state entry occur before | ||||
all the retransmissions of the State Change Report for the first | all the retransmissions of the State Change Report for the first | |||
change have been completed, each additional change triggers the | change have been completed, each additional change triggers the | |||
immediate transmission of a new State Change Report. <xref target="ch g_if_state" /> | immediate transmission of a new State Change Report. <xref target="ch g_if_state" format="default"/> | |||
shows how the content of this new report is computed. Retransmissions | 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 | 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 | ensure that each instance of state change is transmitted at least | |||
[Robustness Variable] times.</t> | [Robustness Variable] times.</t> | |||
<t>If a node on a link expresses, through a State Change Report, its | ||||
<t>If a node on a link expresses, through a State Change Report, its | ||||
desire to no longer listen to a particular multicast address (or | desire to no longer listen to a particular multicast address (or | |||
source), the Querier must query for other listeners of the multicast | source), the Querier must query for other listeners of the multicast | |||
address (or source) before deleting the multicast address (or source) | address (or source) before deleting the multicast address (or source) | |||
from its Multicast Address Listener state and stopping the | from its Multicast Address Listener state and stopping the | |||
corresponding traffic. Thus, the Querier sends a Multicast Address | corresponding traffic. Thus, the Querier sends a Multicast Address | |||
Specific Query to verify whether there are nodes still listening to a | Specific Query to verify whether there are nodes still listening to a | |||
specified multicast address or not. Similarly, the Querier sends a | specified multicast address or not. Similarly, the Querier sends a | |||
Multicast Address and Source Specific Query to verify whether, for a | Multicast Address and Source Specific Query to verify whether, for a | |||
specified multicast address, there are nodes still listening to a | specified multicast address, there are nodes still listening to a | |||
specific set of sources, or not. <xref target="qry_vars" /> describes each query | specific set of sources, or not. <xref target="qry_vars" format="defa ult"/> describes each query | |||
in more detail.</t> | in more detail.</t> | |||
<t>Both Multicast Address Specific Queries and Multicast Address and | ||||
<t>Both Multicast Address Specific Queries and Multicast Address and | ||||
Source Specific Queries are only sent in response to State Change | Source Specific Queries are only sent in response to State Change | |||
Reports, never in response to Current State Reports. This | Reports, never in response to Current State Reports. This | |||
distinction between the two types of reports is needed to avoid the | distinction between the two types of reports is needed to avoid the | |||
router treating all Multicast Listener Reports as potential changes | router treating all Multicast Listener Reports as potential changes | |||
in state. By doing so, the fast leave mechanism of MLDv2, described | in state. By doing so, the fast leave mechanism of MLDv2, described | |||
<!-- The following cross-reference appears to be to the wrong section | in more detail in <xref target="mr-state" format="default"/>, might not be ef | |||
--> | fective if a State | |||
in more detail in <xref target="mr-state" />, might not be effective if a Sta | Change Report is lost and only the following Current State Report is | |||
te | ||||
Change Report is lost, and only the following Current State Report is | ||||
received by the router. Nevertheless, it avoids an increased | received by the router. Nevertheless, it avoids an increased | |||
processing at the router and it reduces the MLD traffic on the link. | processing at the router, and it reduces the MLD traffic on the link. | |||
More details on the necessity of distinguishing between the two | More details on the necessity of distinguishing between the two | |||
report types can be found in <xref target="state_change" />.</t> | report types can be found in <xref target="state_change" format="defau | |||
lt"/>.</t> | ||||
<t>Nodes respond to the above queries through Current State Reports, | <t>Nodes respond to the above queries through Current State Reports | |||
that contain their per-interface Multicast Address Listening state | that contain their per-interface Multicast Address Listening state | |||
only for the multicast addresses (or sources) being queried.</t> | only for the multicast addresses (or sources) being queried.</t> | |||
<t>As stated earlier, in order to ensure protocol robustness, all the | ||||
<t>As stated earlier, in order to ensure protocol robustness, all the | ||||
queries, except the periodical General Queries, are retransmitted | queries, except the periodical General Queries, are retransmitted | |||
several times within a given time interval. The number of | several times within a given time interval. The number of | |||
retransmissions depends on the Robustness Variable. If, while | retransmissions depends on the Robustness Variable. If, while | |||
scheduling new queries, there are pending queries to be retransmitted | scheduling new queries, there are pending queries to be retransmitted | |||
for the same multicast address, the new queries and the pending | for the same multicast address, the new queries and the pending | |||
queries have to be merged. In addition, host reports received for a | queries have to be merged. In addition, host reports received for a | |||
multicast address with pending queries may affect the contents of | multicast address with pending queries may affect the contents of | |||
those queries. The process of building and maintaining the state of | those queries. The process of building and maintaining the state of | |||
pending queries is presented in <xref target="spec_qry" />.</t> | pending queries is presented in <xref target="spec_qry" format="defaul | |||
t"/>.</t> | ||||
<t>Protocol robustness is also enhanced through the use of the S flag | <t>Protocol robustness is also enhanced through the use of the S flag (S | |||
(Suppress Router-Side Processing). As described above, when a | uppress Router-Side Processing). As described above, when a | |||
Multicast Address Specific or a Multicast Address and Source Specific | Multicast Address Specific or a Multicast Address and Source Specific | |||
Query is sent by the Querier, a number of retransmissions of the | Query is sent by the Querier, a number of retransmissions of the | |||
query are scheduled. In the original (first) query the S flag is | query are scheduled. In the original (first) query, the S flag is | |||
clear. When the Querier sends this query, it lowers the timers for | clear. When the Querier sends this query, it lowers the timers for | |||
the concerned multicast address (or source) to a given value; | the concerned multicast address (or source) to a given value; | |||
similarly, any non-querier multicast router that receives the query | similarly, any non-querier multicast router that receives the query | |||
lowers its timers in the same way. Nevertheless, while waiting for | lowers its timers in the same way. Nevertheless, while waiting for | |||
the next scheduled queries to be sent, the Querier may receive a | the next scheduled queries to be sent, the Querier may receive a | |||
report that updates the timers. The scheduled queries still have to | 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 | be sent, in order to ensure that a non-querier router keeps its state | |||
synchronized with the current Querier (the non-querier router might | synchronized with the current Querier (the non-querier router might | |||
have missed the first query). Nevertheless, the timers should not be | have missed the first query). Nevertheless, the timers should not be | |||
lowered again, as a valid answer was already received. Therefore, in | lowered again, as a valid answer was already received. Therefore, in | |||
subsequent queries the Querier sets the S flag.</t> | subsequent queries, the Querier sets the S flag.</t> | |||
</section> | </section> | |||
<section anchor="mr-state" numbered="true" toc="default"> | ||||
<section anchor="mr-state" title="Building Multicast Address Listener State o | <name>Building Multicast Address Listener State on Multicast Routers</na | |||
n Multicast Routers"> | me> | |||
<t>Multicast routers that implement MLDv2 (whether they are in Querier | ||||
<t>Multicast routers that implement MLDv2 (whether they are in Querier | ||||
state or not) keep state per multicast address per attached link. | state or not) keep state per multicast address per attached link. | |||
This multicast address listener state consists of a Filter Mode, a | This multicast address listener state consists of a Filter Mode, a | |||
Filter Timer, and a Source List, with a timer associated to each | 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 | 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 | listening state of a multicast address to a minimum set, such that | |||
all nodes' listening states are respected. The Filter Mode may | all nodes' listening states are respected. The Filter Mode may | |||
change in response to the reception of particular types of report | change in response to the reception of particular types of report | |||
messages, or when certain timer conditions occur.</t> | messages or when certain timer conditions occur.</t> | |||
<t>A router is in INCLUDE mode for a specific multicast address on a | ||||
<t>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 | given interface if all the listeners on the link interested in that | |||
address are in INCLUDE mode. The router state is represented through | address are in INCLUDE mode. The router state is represented through | |||
the notation INCLUDE (A), where A is a list of sources, called the | 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 | "Include List". The Include List is the set of sources that one or | |||
more listeners on the link have requested to receive. All the | more listeners on the link have requested to receive. All the | |||
sources from the Include List will be forwarded by the router. Any | 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 | other source that is not in the Include List will be blocked by the | |||
router.</t> | router.</t> | |||
<t>A source can be added to the current Include List if a listener in | ||||
<t>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 | INCLUDE mode sends a Current State or a State Change Report that | |||
includes that source. Each source from the Include List is | includes that source. Each source from the Include List is | |||
associated with a source timer that is updated whenever a listener in | associated with a source timer that is updated whenever a listener in | |||
INCLUDE mode sends a report that confirms its interest in that | INCLUDE mode sends a report that confirms its interest in that | |||
specific source. If the timer of a source from the Include List | specific source. If the timer of a source from the Include List | |||
expires, the source is deleted from the Include List.</t> | expires, the source is deleted from the Include List.</t> | |||
<t>Besides this "soft leave" mechanism, there is also a "fast leave" | ||||
<t>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 | 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 | a node in INCLUDE mode expresses its desire to stop listening to a | |||
specific source, all the multicast routers on the link lower their | specific source, all the multicast routers on the link lower their | |||
timers for that source to a given value. The Querier then sends a | timers for that source to a given value. The Querier then sends a | |||
Multicast Address and Source Specific Query, to verify whether there | Multicast Address and Source Specific Query, to verify whether there | |||
are other listeners for that source on the link, or not. If a report | are other listeners for that source on the link, or not. If a report | |||
that includes this source is received before the timer expiration, | that includes this source is received before the timer expiration, | |||
all the multicast routers on the link update the source timer. If | all the multicast routers on the link update the source timer. If | |||
not, the source is deleted from the Include List. The handling of | not, the source is deleted from the Include List. The handling of | |||
the Include List, according to the received reports, is detailed in | the Include List, according to the received reports, is detailed in Sections | |||
<xref target="curr_state_recs" /> and <xref target="fm_chg" />.</t> | <xref target="curr_state_recs" format="counter"/> and <xref target="fm_chg" f | |||
ormat="counter"/>.</t> | ||||
<t>A router is in EXCLUDE mode for a specific multicast address on a | <t>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 | 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 | that address on the link. When the first report is received from | |||
such a listener, the router sets the Filter Timer that corresponds to | such a listener, the router sets the Filter Timer that corresponds to | |||
that address. This timer is reset each time an EXCLUDE mode listener | that address. This timer is reset each time an EXCLUDE mode listener | |||
confirms its listening state through a Current State Report. The | confirms its listening state through a Current State Report. The | |||
timer is also updated when a listener, formerly in INCLUDE mode, | timer is also updated when a listener, formerly in INCLUDE mode, | |||
announces its filter mode change through a State Change Report | announces its filter mode change through a State Change Report | |||
message. If the Filter Timer expires, it means that there are no | 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 | more listeners in EXCLUDE mode on the link. In this case, the router | |||
switches back to INCLUDE mode for that multicast address.</t> | switches back to INCLUDE mode for that multicast address.</t> | |||
<t>When the router is in EXCLUDE mode, the router state is represented | ||||
<t>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" | 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 | and Y is called the "Exclude List". All sources, except those from | |||
the Exclude List, will be forwarded by the router. The Requested | the Exclude List, will be forwarded by the router. The Requested | |||
List has no effect on forwarding. Nevertheless, the router has to | List has no effect on forwarding. Nevertheless, the router has to | |||
maintain the Requested List for two reasons: | maintain the Requested List for two reasons: | |||
<list style="bullets"> | </t> | |||
<ol spacing="normal" type="1"> | ||||
<t>To keep track of sources that listeners in INCLUDE mode listen to. | <li> | |||
This is necessary to assure a seamless transition of the router to | <t>To keep track of sources that listeners in INCLUDE mode listen | |||
INCLUDE mode, when there is no listener in EXCLUDE mode left. | to. This is necessary to assure a seamless transition of the | |||
This transition should not interrupt the flow of traffic to | router to INCLUDE mode, when there is no listener in EXCLUDE mode | |||
listeners in INCLUDE mode for that multicast address. Therefore, | left. This transition should not interrupt the flow of traffic to | |||
at the time of the transition, the Requested List should contain | listeners in INCLUDE mode for that multicast address. Therefore, | |||
the set of sources that nodes in INCLUDE mode have explicitly | at the time of the transition, the Requested List should contain | |||
requested. | the set of sources that nodes in INCLUDE mode have explicitly | |||
<vspace blankLines="1" /> | requested. | |||
When the router switches to INCLUDE mode, the sources in the | </t> | |||
Requested List are moved to the Include List, and the Exclude List | <t> | |||
is deleted. Before switching, the Requested List can contain an | When the router switches to INCLUDE mode, the sources in the Requested | |||
inexact guess of the sources listeners in INCLUDE mode listen to - | List are moved to the Include List, and the Exclude List is deleted. | |||
might be too large or too small. These inexactitudes are due to | Before switching, the Requested List can contain an inexact guess of the | |||
the fact that the Requested List is also used for fast blocking | sources listeners in INCLUDE mode listen to, which might be too large or t | |||
purposes, as described below. If such a fast blocking is | oo | |||
required, some sources may be deleted from the Requested List (as | small. These inexactitudes are due to the fact that the Requested List | |||
shown in <xref target="curr_state_recs" /> and <xref target="fm_chg" />) i | is also used for fast blocking purposes, as described below. If such a | |||
n order to reduce router state. | fast blocking is required, some sources may be deleted from the | |||
Nevertheless, in each such case the Filter Timer is updated as | Requested List (as shown in Sections <xref target="curr_state_recs" | |||
well. Therefore, listeners in INCLUDE mode will have enough time, | format="counter"/> and <xref target="fm_chg" format="counter"/>) in | |||
before an eventual switching, to reconfirm their interest in the | order to reduce router state. Nevertheless, in each such case, the | |||
eliminated source(s), and rebuild the Requested List accordingly. | Filter Timer is updated as well. Therefore, listeners in INCLUDE mode | |||
The protocol ensures that when a switch to INCLUDE mode occurs, | will have enough time, before an eventual switching, to reconfirm their | |||
the Requested List will be accurate. Details about the transition | interest in the eliminated source(s) and rebuild the Requested List | |||
of the router to INCLUDE mode are presented in <xref target="mode_s | accordingly. The protocol ensures that when a switch to INCLUDE mode | |||
witch" />.</t> | occurs, the Requested List will be accurate. Details about the | |||
transition of the router to INCLUDE mode are presented in <xref | ||||
<t>To allow the fast blocking of previously unblocked sources. If | target="mode_switch" format="default"/>.</t> | |||
</li> | ||||
<li> | ||||
<t>To allow the fast blocking of previously unblocked sources. If | ||||
the router receives a report that contains such a request, the | the router receives a report that contains such a request, the | |||
concerned sources are added to the Requested List. Their timers | concerned sources are added to the Requested List. Their timers | |||
are set to a given small value, and a Multicast Address and Source | 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 | Specific Query is sent by the Querier, to check whether there are | |||
nodes on the link still interested in those sources, or not. If | nodes on the link still interested in those sources, or not. If | |||
no node announces its interest in receiving those specific source, | no node announces its interest in receiving those specific sources, | |||
the timers of those sources expire. Then, the sources are moved | the timers of those sources expire. Then, the sources are moved | |||
from the Requested List to the Exclude List. From then on, the | from the Requested List to the Exclude List. From then on, the | |||
sources will be blocked by the router.</t> | sources will be blocked by the router.</t> | |||
</list></t> | </li> | |||
</ol> | ||||
<t>The handling of the EXCLUDE mode router state, according to the | <t>The handling of the EXCLUDE mode router state, according to the | |||
received reports, is detailed in <xref target="curr_state_recs" /> and | received reports, is detailed in Sections <xref | |||
<xref target="fm_chg" />.</t> | target="curr_state_recs" format="counter"/> and <xref target="fm_chg" | |||
format="counter"/>.</t> | ||||
<t>Both the MLDv2 router and listener behaviors described in this | <t>Both the MLDv2 router and listener behaviors described in this | |||
document were defined to ensure backward interoperability with MLDv1 | document were defined to ensure backward interoperability with MLDv1 | |||
hosts and routers. Interoperability issues are detailed in <xref targ | hosts and routers. Interoperability issues are detailed in <xref targ | |||
et="interop" />.</t> | et="interop" format="default"/>.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="srvc_if" numbered="true" toc="default"> | ||||
<section title="The Service Interface for Requesting IP Multicast Reception" | <name>The Service Interface for Requesting IP Multicast Reception</name> | |||
anchor="srvc_if"> | <t>Within an IP system, there is (at least conceptually) a service | |||
<t>Within an IP system, there is (at least conceptually) a service | ||||
interface used by upper-layer protocols or application programs to | interface used by upper-layer protocols or application programs to | |||
ask the IP layer to enable or disable reception of packets sent 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 | specific IP multicast addresses. In order to take full advantage of | |||
the capabilities of MLDv2, a node's IP service interface must support | the capabilities of MLDv2, a node's IP service interface must support | |||
the following operation:</t> | the following operation:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
IPv6MulticastListen ( socket, interface, IPv6 multicast-address, | IPv6MulticastListen ( socket, interface, IPv6 multicast-address, | |||
filter-mode, source-list ) | filter-mode, source-list )]]></sourcecode> | |||
]]></artwork> | ||||
</figure> | ||||
<t>where: | ||||
<list style="symbols"> | ||||
<t>"socket" is an implementation-specific parameter used to | <t>where: | |||
distinguish among different requesting entities (e.g., programs, | </t> | |||
<ul spacing="normal"> | ||||
<li> | ||||
<t>"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 | processes) within the node; the socket parameter of BSD Unix | |||
system calls is a specific example.</t> | system calls is a specific example.</t> | |||
</li> | ||||
<t>"interface" is a local identifier of the network interface on | <li> | |||
<t>"interface" is a local identifier of the network interface on | ||||
which reception of the specified multicast address is to be | which reception of the specified multicast address is to be | |||
enabled or disabled. Interfaces may be physical (e.g., an | enabled or disabled. Interfaces may be physical (e.g., an | |||
Ethernet interface) or virtual (e.g., the endpoint of a Frame | Ethernet interface) or virtual (e.g., the endpoint of a Frame | |||
Relay virtual circuit or an IP-in-IP "tunnel"). An implementation | Relay virtual circuit or an IP-in-IP "tunnel"). An implementation | |||
may allow a special "unspecified" value to be passed as the | may allow a special "unspecified" value to be passed as the | |||
interface parameter, in which case the request would apply to the | interface parameter, in which case the request would apply to the | |||
"primary" or "default" interface of the node (perhaps established | "primary" or "default" interface of the node (perhaps established | |||
by system configuration). If reception of the same multicast | by system configuration). If reception of the same multicast | |||
address is desired on more than one interface, IPv6MulticastListen | address is desired on more than one interface, IPv6MulticastListen | |||
is invoked separately for each desired interface.</t> | is invoked separately for each desired interface.</t> | |||
</li> | ||||
<t>"IPv6 multicast address" is the multicast address to which the | <li> | |||
<t>"IPv6 multicast address" is the multicast address to which the | ||||
request pertains. If reception of more than one multicast address | request pertains. If reception of more than one multicast address | |||
on a given interface is desired, IPv6MulticastListen is invoked | on a given interface is desired, IPv6MulticastListen is invoked | |||
separately for each desired address.</t> | separately for each desired address.</t> | |||
</li> | ||||
<t>"filter mode" may be either INCLUDE or EXCLUDE. In INCLUDE mode, | <li> | |||
<t>"filter mode" may be either INCLUDE or EXCLUDE. In INCLUDE mode, | ||||
reception of packets sent to the specified multicast address is | reception of packets sent to the specified multicast address is | |||
requested only from the source addresses listed in the source | requested only from the source addresses listed in the source | |||
list parameter. In EXCLUDE mode, reception of packets sent to the | list parameter. In EXCLUDE mode, reception of packets sent to the | |||
given multicast address is requested from all source addresses | given multicast address is requested from all source addresses | |||
except those listed in the source list parameter.</t> | except those listed in the source list parameter.</t> | |||
</li> | ||||
<t>"source list" is an unordered list of zero or more unicast | <li> | |||
<t>"source list" is an unordered list of zero or more unicast | ||||
addresses from which multicast reception is desired or not | addresses from which multicast reception is desired or not | |||
desired, depending on the filter mode. An implementation MAY | desired, depending on the filter mode. An implementation <bcp14>MAY</bcp1 4> | |||
impose a limit on the size of source lists. When an operation | impose a limit on the size of source lists. When an operation | |||
causes the source list size limit to be exceeded, the service | causes the source list size limit to be exceeded, the service | |||
interface SHOULD return an error.</t> | interface <bcp14>SHOULD</bcp14> return an error.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>For a given combination of socket, interface, and IPv6 multicast | <t>For a given combination of socket, interface, and IPv6 multicast | |||
address, only a single filter mode and source list can be in effect | 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 | at any one time. Nevertheless, either the filter mode or the source | |||
list, or both, may be changed by subsequent IPv6MulticastListen | list, or both, may be changed by subsequent IPv6MulticastListen | |||
requests that specify the same socket, interface, and IPv6 multicast | requests that specify the same socket, interface, and IPv6 multicast | |||
address. Each subsequent request completely replaces any earlier | address. Each subsequent request completely replaces any earlier | |||
request for the given socket, interface, and multicast address.</t> | request for the given socket, interface, and multicast address.</t> | |||
<t>The MLDv1 protocol did not support source filters and had a simpler | ||||
<t>The MLDv1 protocol did not support source filters, and had a simpler | ||||
service interface; it consisted of Start Listening and Stop Listening | service interface; it consisted of Start Listening and Stop Listening | |||
operations to enable and disable listening to a given multicast | operations to enable and disable listening to a given multicast | |||
address (from all sources) on a given interface. The equivalent | address (from all sources) on a given interface. The equivalent | |||
operations in the new service interface are as follows:</t> | operations in the new service interface are as follows.</t> | |||
<t>The Start Listening operation is equivalent to:</t> | ||||
<t>The Start Listening operation is equivalent to:</t> | ||||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
IPv6MulticastListen ( socket, interface, IPv6 multicast address, | IPv6MulticastListen ( socket, interface, IPv6 multicast address, | |||
EXCLUDE, {} ) | EXCLUDE, {} )]]></sourcecode> | |||
]]></artwork> | ||||
</figure> | ||||
<t>and the Stop Listening operation is equivalent to:</t> | <t>and the Stop Listening operation is equivalent to:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
IPv6MulticastListen ( socket, interface, IPv6 multicast address, | IPv6MulticastListen ( socket, interface, IPv6 multicast address, | |||
INCLUDE, {} ) | INCLUDE, {} )]]></sourcecode> | |||
]]></artwork> | ||||
</figure> | ||||
<t>where {} is an empty source list.</t> | ||||
<t>An example of an API that provides the capabilities outlined in this | ||||
service interface is given in <xref target="RFC3678" />.</t> | ||||
</section> | ||||
<section title="Multicast Listening State Maintained by Nodes" anchor="node_s | ||||
tate"> | ||||
<section title="Per-Socket State" anchor="sock_state"> | ||||
<t>For each socket on which IPv6MulticastListen has been invoked, the | <t>where {} is an empty source list.</t> | |||
<t>An example of an API that provides the capabilities outlined in this | ||||
service interface is given in <xref target="RFC3678" format="default"/ | ||||
>.</t> | ||||
</section> | ||||
<section anchor="node_state" numbered="true" toc="default"> | ||||
<name>Multicast Listening State Maintained by Nodes</name> | ||||
<section anchor="sock_state" numbered="true" toc="default"> | ||||
<name>Per-Socket State</name> | ||||
<t>For each socket on which IPv6MulticastListen has been invoked, the | ||||
node records the desired multicast listening state for that socket. | node records the desired multicast listening state for that socket. | |||
That state conceptually consists of a set of records of the form:</t> | That state conceptually consists of a set of records of the form:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | (interface, IPv6 multicast address, filter mode, source list)]]></sourcecode> | |||
(interface, IPv6 multicast address, filter mode, source list) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>The per-socket state evolves in response to each invocation of | <t>The per-socket state evolves in response to each invocation of | |||
IPv6MulticastListen on the socket, as follows: | IPv6MulticastListen on the socket, as follows: | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>If the requested filter mode is INCLUDE and the requested source | <li> | |||
<t>If the requested filter mode is INCLUDE and the requested source | ||||
list is empty, then the entry that corresponds to the requested | list is empty, then the entry that corresponds to the requested | |||
interface and multicast address is deleted, if present. If no | interface and multicast address is deleted, if present. If no | |||
such entry is present, the request has no effect.</t> | such entry is present, the request has no effect.</t> | |||
</li> | ||||
<t>If the requested filter mode is EXCLUDE or the requested source | <li> | |||
<t>If the requested filter mode is EXCLUDE or the requested source | ||||
list is non-empty, then the entry that corresponds to the | list is non-empty, then the entry that corresponds to the | |||
requested interface and multicast address, if present, is changed | requested interface and multicast address, if present, is changed | |||
to contain the requested filter mode and source list. If no such | to contain the requested filter mode and source list. If no such | |||
entry is present, a new entry is created, using the parameters | entry is present, a new entry is created, using the parameters | |||
specified in the request.</t> | specified in the request.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Per-Interface State" anchor="if_state"> | <section anchor="if_state" numbered="true" toc="default"> | |||
<name>Per-Interface State</name> | ||||
<t>In addition to the per-socket multicast listening state, a node must | <t>In addition to the per-socket multicast listening state, a node must | |||
also maintain or compute multicast listening state for each of its | also maintain or compute multicast listening state for each of its | |||
interfaces. That state conceptually consists of a set of records of | interfaces. That state conceptually consists of a set of records of | |||
the form:</t> | the form:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | (IPv6 multicast address, filter mode, source list)]]></sourcecode> | |||
(IPv6 multicast address, filter mode, source list) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>At most one record per multicast address exists for a given | <t>At most, one record per multicast address exists for a given | |||
interface. This per-interface state is derived from the per-socket | interface. This per-interface state is derived from the per-socket | |||
state, but may differ from it when different sockets have differing | state, but it may differ from the per-socket state when different sockets hav e differing | |||
filter modes and/or source lists for the same multicast address and | filter modes and/or source lists for the same multicast address and | |||
interface. For example, suppose one application or process invokes | interface. For example, suppose one application or process invokes | |||
the following operation on socket s1:</t> | the following operation on socket s1:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c} )]]></sourcecode> | |||
IPv6MulticastListen ( s1, i, m, INCLUDE, {a, b, c} ) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>requesting reception on interface i of packets sent to multicast | <t>requesting reception on interface i of packets sent to multicast | |||
address m, only if they come from the sources a, b, or c. Suppose | address m, only if they come from the sources a, b, or c. Suppose | |||
another application or process invokes the following operation on | another application or process invokes the following operation on | |||
socket s2:</t> | socket s2:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d} )]]></sourcecode> | |||
IPv6MulticastListen ( s2, i, m, INCLUDE, {b, c, d} ) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>requesting reception on the same interface i of packets sent to the | <t>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 | same multicast address m, only if they come from sources b, c, or | |||
d. In order to satisfy the reception requirements of both sockets, | 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 | 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 | 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 | listening state of interface i for multicast address m has filter | |||
mode INCLUDE and source list {a, b, c, d}.</t> | mode INCLUDE and source list {a, b, c, d}.</t> | |||
<t>After a multicast packet has been accepted from an interface by the | ||||
<t>After a multicast packet has been accepted from an interface by the | ||||
IP layer, its subsequent delivery to the application or process that | IP layer, its subsequent delivery to the application or process that | |||
listens on a particular socket depends on the multicast listening | listens on a particular socket depends on the multicast listening | |||
state of that socket (and possibly also on other conditions, such as | 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 | what transport-layer port the socket is bound to). So, in the above | |||
example, if a packet arrives on interface i, destined to multicast | example, if a packet arrives on interface i, destined to multicast | |||
address m, with source address a, it may be delivered on socket s1 | 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 | 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> | source filtering and must always be processed by hosts and routers.</t> | |||
<t>Requiring the filtering of packets based upon a socket's multicast | ||||
<t>Requiring the filtering of packets based upon a socket's multicast | ||||
reception state is a new feature of this service interface. The | reception state is a new feature of this service interface. The | |||
previous service interface described no filtering based upon | previous service interface described no filtering based upon | |||
multicast listening state; rather, a Start Listening operation on a | multicast listening state; rather, a Start Listening operation on a | |||
socket simply caused the node to start to listen to a multicast | socket simply caused the node to start to listen to a multicast | |||
address on the given interface; packets sent to that multicast | address on the given interface; packets sent to that multicast | |||
address could be delivered to all sockets, whether they had started | address could be delivered to all sockets, whether they had started | |||
to listen or not.</t> | to listen or not.</t> | |||
<t>The general rules for deriving the per-interface state from the per- | ||||
<t>The general rules for deriving the per-interface state from the per- | ||||
socket state are as follows: for each distinct (interface, IPv6 | socket state are as follows: for each distinct (interface, IPv6 | |||
multicast address) pair that appears in any per-socket state, a per- | multicast address) pair that appears in any per-socket state, a per- | |||
interface record is created for that multicast address on that | interface record is created for that multicast address on that | |||
interface. Considering all socket records that contain the same | interface. Considering all socket records that contain the same | |||
(interface, IPv6 multicast address) pair, | (interface, IPv6 multicast address) pair, | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>if any such record has a filter mode of EXCLUDE, then the filter | <li> | |||
mode of the interface record is EXCLUDE, and the source list of | <t>if any such record has a filter mode of EXCLUDE, then the | |||
the interface record is the intersection of the source lists of | filter mode of the interface record is EXCLUDE, and the source | |||
all socket records in EXCLUDE mode, minus those source addresses | list of the interface record is the intersection of the source | |||
that appear in any socket record in INCLUDE mode. For example, if | lists of all socket records in EXCLUDE mode, minus those source | |||
the socket records for multicast address m on interface i are: | addresses that appear in any socket record in INCLUDE mode. For | |||
example, if the socket records for multicast address m on | ||||
<list style="hanging"> | interface i are:</t> | |||
<t>from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )</t> | <ul spacing="normal"> | |||
<t>from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )</t> | <li>from socket s1: ( i, m, EXCLUDE, {a, b, c, d} )</li> | |||
<t>from socket s3: ( i, m, INCLUDE, {d, e, f} )</t> | <li>from socket s2: ( i, m, EXCLUDE, {b, c, d, e} )</li> | |||
</list> | <li>from socket s3: ( i, m, INCLUDE, {d, e, f} )</li> | |||
</ul> | ||||
then the corresponding interface record on interface i is: | <t>then the corresponding interface record on interface i is:</t> | |||
<ul spacing="normal"> | ||||
<list style="hanging"> | <li>( m, EXCLUDE, {b, c} )</li> | |||
<t>( m, EXCLUDE, {b, c} )</t> | </ul> | |||
</list> | <t>If a fourth socket is added, such as:</t> | |||
<ul spacing="normal"> | ||||
If a fourth socket is added, such as: | <li>From socket s4: ( i, m, EXCLUDE, {} )</li> | |||
</ul> | ||||
<list style="hanging"> | <t>then the interface record becomes:</t> | |||
<t>From socket s4: ( i, m, EXCLUDE, {} )</t> | <ul spacing="normal"> | |||
</list> | <li>( m, EXCLUDE, {} )</li> | |||
</ul> | ||||
then the interface record becomes: | </li> | |||
<li> | ||||
<list style="hanging"> | <t>if all such records have a filter mode of INCLUDE, then the | |||
<t>( m, EXCLUDE, {} )</t> | filter mode of the interface record is INCLUDE, and the source | |||
</list></t> | list of the interface record is the union of the source lists of | |||
all the socket records. For example, if the socket records for | ||||
<t>if all such records have a filter mode of INCLUDE, then the | multicast address m on interface i are:</t> | |||
filter mode of the interface record is INCLUDE, and the source | <ul spacing="normal"> | |||
list of the interface record is the union of the source lists of | <li>from socket s1: ( i, m, INCLUDE, {a, b, c} )</li> | |||
all the socket records. For example, if the socket records for | <li>from socket s2: ( i, m, INCLUDE, {b, c, d} )</li> | |||
multicast address m on interface i are: | <li>from socket s3: ( i, m, INCLUDE, {e, f} )</li> | |||
</ul> | ||||
<list style="hanging"> | <t>then the corresponding interface record on interface i is:</t> | |||
<t>from socket s1: ( i, m, INCLUDE, {a, b, c} )</t> | <ul spacing="normal"> | |||
<t>from socket s2: ( i, m, INCLUDE, {b, c, d} )</t> | <li>( m, INCLUDE, {a, b, c, d, e, f} )</li> | |||
<t>from socket s3: ( i, m, INCLUDE, {e, f} )</t> | </ul> | |||
</list> | <t>An implementation <bcp14>MUST NOT</bcp14> use an EXCLUDE | |||
interface record for a multicast address if all sockets for this | ||||
then the corresponding interface record on interface i is: | multicast address are in INCLUDE state. If system resource limits | |||
are reached when a per- interface state source list is calculated, | ||||
<list style="hanging"> | an error <bcp14>MUST</bcp14> be returned to the application which | |||
<t>( m, INCLUDE, {a, b, c, d, e, f} )</t> | requested the operation.</t> | |||
</list> | </li> | |||
</ul> | ||||
An implementation MUST NOT 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 MUST be returned | ||||
to the application which requested the operation.</t> | ||||
</list></t> | ||||
<t>The above rules for deriving the per-interface state are | <t>The above rules for deriving the per-interface state are | |||
(re)evaluated whenever an IPv6MulticastListen invocation modifies the | (re)evaluated whenever an IPv6MulticastListen invocation modifies the | |||
per-socket state by adding, deleting, or modifying a per-socket state | per-socket state by adding, deleting, or modifying a per-socket state | |||
record. Note that a change of the per-socket state does not | record. Note that a change of the per-socket state does not | |||
necessarily result in a change of the per-interface state.</t> | necessarily result in a change of the per-interface state.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Message Formats"> | <name>Message Formats</name> | |||
<t>MLDv2 is a sub-protocol of ICMPv6, that is, MLDv2 message types are a | ||||
<t>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 | subset of ICMPv6 messages, and MLDv2 messages are identified in IPv6 | |||
packets by a preceding Next Header value of 58. All MLDv2 messages | packets by a preceding Next Header value of 58. All MLDv2 messages | |||
described in this document MUST be sent with a link-local IPv6 Source | 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 | Address, an IPv6 Hop Limit of 1, and an IPv6 Router Alert option | |||
<xref target="RFC2711" /> in a Hop-by-Hop Options header. (The Router Alert option | <xref target="RFC2711" format="default"/> in a Hop-by-Hop Options header. (T he Router Alert option | |||
is necessary to cause routers to examine MLDv2 messages sent to IPv6 | is necessary to cause routers to examine MLDv2 messages sent to IPv6 | |||
multicast addresses in which the routers themselves have no | multicast addresses in which the routers themselves have no | |||
interest.) MLDv2 Reports can be sent with the source address set to | interest.) MLDv2 Reports can be sent with the source address set to | |||
the unspecified address <xref target="RFC4291" />, if a valid link-loc al IPv6 source | the unspecified address <xref target="RFC4291" format="default"/>, if a valid link-local IPv6 source | |||
address has not been acquired yet for the sending interface. (See | address has not been acquired yet for the sending interface. (See | |||
<xref target="src_addrs" />. for details.)</t> | <xref target="src_addrs" format="default"/> for details.)</t> | |||
<t>There are two MLD message types of concern to the MLDv2 protocol | ||||
<t>There are two MLD message types of concern to the MLDv2 protocol | ||||
described in this document: | described in this document: | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>Multicast Listener Query (Type = decimal 130)</t> | <li> | |||
<t>Multicast Listener Query (Type = decimal 130)</t> | ||||
<t>Version 2 Multicast Listener Report (Type = decimal 143). See | </li> | |||
<xref target="iana" /> for IANA considerations.</t> | <li> | |||
</list></t> | <t>Version 2 Multicast Listener Report (Type = decimal 143). See | |||
<xref target="iana" format="default"/> for IANA considerations.</t> | ||||
<t>To assure the interoperability with nodes that implement MLDv1 (see | </li> | |||
<xref target="interop" />), an implementation of MLDv2 must also support the | </ul> | |||
<t>To assure the interoperability with nodes that implement MLDv1 (see | ||||
<xref target="interop" format="default"/>), an implementation of MLDv2 must a | ||||
lso support the | ||||
following two message types: | following two message types: | |||
<list style="bullets"> | </t> | |||
<!-- [rfced] We believe these values correspond to the values assigned in <https | ||||
://www.iana.org/assignments/icmpv6-parameters>. Some of the names are slightly | ||||
different (e.g., no version number). Should these be made consistent, or is thi | ||||
s as expected? | ||||
<t>Version 1 Multicast Listener Report (Type = decimal 131) <xref targ | Original: | |||
et="RFC2710" /></t> | * Version 1 Multicast Listener Report (Type = decimal 131) [RFC2710] | |||
<t>Version 1 Multicast Listener Done (Type = decimal 132) <xref target | * Version 1 Multicast Listener Done (Type = decimal 132) [RFC2710] | |||
="RFC2710" /></t> | ||||
</list></t> | ||||
<t>Unrecognized message types MUST be silently ignored. Other message | In the IANA registry: | |||
131 Multicast Listener Report | ||||
132 Multicast Listener Done | ||||
--> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Version 1 Multicast Listener Report (Type = decimal 131) <xref targ | ||||
et="RFC2710" format="default"/></t> | ||||
</li> | ||||
<li> | ||||
<t>Version 1 Multicast Listener Done (Type = decimal 132) <xref target | ||||
="RFC2710" format="default"/></t> | ||||
</li> | ||||
</ul> | ||||
<t>Unrecognized message types <bcp14>MUST</bcp14> be silently ignored. Ot | ||||
her message | ||||
types may be used by newer versions or extensions of MLD, by | types may be used by newer versions or extensions of MLD, by | |||
multicast routing protocols, or for other uses.</t> | multicast routing protocols, or for other uses.</t> | |||
<t>In this document, unless otherwise qualified, the capitalized words | ||||
<t>In this document, unless otherwise qualified, the capitalized words | ||||
"Query" and "Report" refer to MLD Multicast Listener Queries and MLD | "Query" and "Report" refer to MLD Multicast Listener Queries and MLD | |||
Version 2 Multicast Listener Reports, respectively.</t> | Version 2 Multicast Listener Reports, respectively.</t> | |||
<section anchor="qry_msg" numbered="true" toc="default"> | ||||
<section title="Multicast Listener Query Message" anchor="qry_msg"> | <name>Multicast Listener Query Message</name> | |||
<t>Multicast Listener Queries are sent by multicast routers in Querier | ||||
<t>Multicast Listener Queries are sent by multicast routers in Querier | state to query the multicast listening state of neighboring | |||
State to query the multicast listening state of neighboring | ||||
interfaces. Queries have the following format:</t> | interfaces. Queries have the following format:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 | | | Type = 130 | Code | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Maximum Response Code | Reserved | | | Maximum Response Code | Reserved | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
skipping to change at line 730 ¶ | skipping to change at line 778 ¶ | |||
. . . | . . . | |||
. . . | . . . | |||
+- -+ | +- -+ | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
* Source Address [N] * | * Source Address [N] * | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<section title="Code"> | ||||
<t>Initialized to zero by the sender; ignored by receivers.</t> | <section numbered="true" toc="default"> | |||
</section> | <!--[rfced] For consistency with the other subsections, we added | |||
<section title="Checksum"> | introductory text to Sections 5.1.1, 5.1.2, 5.2.2, 5.2.6, and | |||
9.3. Please let us know if any further updates are needed. | ||||
<t>The standard ICMPv6 checksum; it covers the entire MLDv2 message, | Note that Sections 5.1.2 and 5.2.2 contain the same text; however, | |||
plus a "pseudo-header" of IPv6 header fields <xref target="RFC4443" /> | Section 5.1.2 does not include a reference to RFC 8200. Should | |||
. For | Section 5.1.2 be updated to match, or is this variance intentional? | |||
computing the checksum, the Checksum field is set to zero. When a | And may we list RFC 4443 before RFC 8200? | |||
packet is received, the checksum MUST be verified before processing | ||||
it.</t> | ||||
</section> | ||||
<section title="Maximum Response Code" anchor="mrcode"> | Some examples: | |||
<t>The Maximum Response Code field specifies the maximum time allowed | Original: | |||
before sending a responding Report. The actual time allowed, called | 5.1.1. Code | |||
the Maximum Response Delay, is represented in units of milliseconds, | ||||
and is derived from the Maximum Response Code as follows:</t> | ||||
<t>If Maximum Response Code < 32768, Maximum Response Delay = Maximum Resp onse Code</t> | Initialized to zero by the sender; ignored by receivers. | |||
<t>If Maximum Response Code >=32768, Maximum Response Code represents a | 5.1.2. Checksum | |||
floating-point value as follows:</t> | ||||
<figure> | The standard ICMPv6 checksum; it covers the entire MLDv2 message, | |||
<artwork><![CDATA[ | plus a "pseudo-header" of IPv6 header fields [RFC4443]. | |||
0 1 2 3 4 5 6 7 8 9 A B C D E F | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
|1| exp | mant | | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
Maximum Response Delay = (mant | 0x1000) << (exp+3) | 5.2.2. Checksum | |||
]]></artwork> | ||||
</figure> | ||||
<t>Small values of Maximum Response Delay allow MLDv2 routers to tune | The standard ICMPv6 checksum; it covers the entire MLDv2 message, | |||
the "leave latency" (the time between the moment the last node on a | plus a "pseudo-header" of IPv6 header fields [RFC8200] [RFC4443]. | |||
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 title="Reserved"> | Perhaps: | |||
5.1.1. Code | ||||
<t>The Reserved field is set to zero on transmission, and ignored on receptio | The Code field is initialized to zero by the sender and ignored | |||
n.</t> | by receivers. | |||
</section> | 5.1.2. Checksum | |||
<section title="Multicast Address"> | The Checksum field is the standard ICMPv6 checksum; it covers | |||
the entire MLDv2 message, plus a "pseudo-header" of IPv6 | ||||
header fields [RFC4443] [RFC8200]. | ||||
<t>For a General Query, the Multicast Address field is set to zero. For | 5.2.2. Checksum | |||
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" />, below).</t> | ||||
</section> | ||||
<section title="Flags"> | The Checksum field is the standard ICMPv6 checksum; it covers | |||
the entire MLDv2 message, plus a "pseudo-header" of IPv6 header | ||||
fields [RFC4443] [RFC8200]. | ||||
--> | ||||
<name>Code</name> | ||||
<t>The Code field is initialized to zero by the sender and ignored by | ||||
receivers.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Checksum</name> | ||||
<t>The Checksum field is the standard ICMPv6 checksum; it covers the e | ||||
ntire MLDv2 message, | ||||
plus a "pseudo-header" of IPv6 header fields <xref target="RFC4443" fo | ||||
rmat="default"/>. For | ||||
computing the checksum, the Checksum field is set to zero. When a | ||||
packet is received, the checksum <bcp14>MUST</bcp14> be verified before proce | ||||
ssing | ||||
it.</t> | ||||
</section> | ||||
<section anchor="mrcode" numbered="true" toc="default"> | ||||
<name>Maximum Response Code</name> | ||||
<t>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"> | ||||
<li>If Maximum Response Code < 32768, Maximum Response Delay = | ||||
Maximum Response Code.</li> | ||||
<li><t>If Maximum Response Code | ||||
>=32768, Maximum Response Code represents a floating-point | ||||
value as follows:</t> | ||||
<t>Allocation of individual bits within the Flags field is described in | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
Section 2.2 of <xref target="I-D.ietf-pim-3228bis" />. Future specifications | 0 1 2 3 4 5 6 7 8 9 A B C D E F | |||
will define the associated meaning tied to any such allocation.</t> | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
</section> | |1| exp | mant | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ||||
<section title="S Flag (Suppress Router-Side Processing)"> | Maximum Response Delay = (mant | 0x1000) << (exp+3)]]></artwork> | |||
</li> | ||||
</ul> | ||||
<t>When set to one, the S Flag indicates to any receiving multicast | <t>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="default"> | ||||
<name>Reserved</name> | ||||
<t>The Reserved field is set to zero on transmission and ignored on re | ||||
ception.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Multicast Address</name> | ||||
<t>For a General Query, the Multicast Address field is set to zero. F | ||||
or | ||||
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"/>, below).</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Flags</name> | ||||
<t>Allocation of individual bits within the Flags field is described i | ||||
n | ||||
<xref target="RFC9778" sectionFormat="of" section="2.2"/>. Future specificati | ||||
ons | ||||
will define the associated meaning tied to any such allocation.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>S Flag (Suppress Router-Side Processing)</name> | ||||
<t>When set to one, the S flag indicates to any receiving multicast | ||||
routers that they have to suppress the normal timer updates they | routers that they have to suppress the normal timer updates they | |||
perform upon hearing a Query. Nevertheless, it does not suppress the | perform upon hearing a Query. Nevertheless, it does not suppress the | |||
querier election or the normal "host-side" processing of a Query that | 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 router may be required to perform as a consequence of itself being | |||
a multicast listener.</t> | a multicast listener.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="QRV (Querier's Robustness Variable)"> | <name>QRV (Querier's Robustness Variable)</name> | |||
<t>If non-zero, the QRV field contains the [Robustness Variable] value | ||||
<t>If non-zero, the QRV field contains the [Robustness Variable] value | ||||
used by the Querier. If the Querier's [Robustness Variable] exceeds | 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> | 7 (the maximum value of the QRV field), the QRV field is set to zero.< /t> | |||
<t>Routers adopt the QRV value from the most recently received Query a | ||||
<t>Routers adopt the QRV value from the most recently received Query as | s | |||
their own [Robustness Variable] value, unless that most recently | their own [Robustness Variable] value, unless that most recently | |||
received QRV was zero, in which case they use the default [Robustness | received QRV was zero, in which case they use the default [Robustness | |||
Variable] value specified in <xref target="robust" />, or a statically configured | Variable] value specified in <xref target="robust" format="default"/> or a statically configured | |||
value.</t> | value.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="QQIC (Querier's Query Interval Code)"> | <name>QQIC (Querier's Query Interval Code)</name> | |||
<t>The QQIC field specifies the [Query | ||||
<t>The Querier's Query Interval Code field specifies the [Query | ||||
Interval] used by the Querier. The actual interval, called the | Interval] used by the Querier. The actual interval, called the | |||
Querier's Query Interval (QQI), is represented in units of seconds, | "Querier's Query Interval (QQI)", is represented in units of seconds | |||
and is derived from the Querier's Query Interval Code as follows:</t> | and is derived from the QQIC as follows:</t> | |||
<ul spacing="normal"> | ||||
<t>If QQIC < 128, QQI = QQIC</t> | <li>If QQIC < 128, QQI = QQIC</li> | |||
<li><t>If QQIC >= 128, QQIC represents a floating-point value as | ||||
<t>If QQIC >= 128, QQIC represents a floating-point value as follows:</t> | follows:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | 0 1 2 3 4 5 6 7 | |||
0 1 2 3 4 5 6 7 | +-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+ | |1| exp | mant | | |||
|1| exp | mant | | +-+-+-+-+-+-+-+-+ | |||
+-+-+-+-+-+-+-+-+ | ||||
QQI = (mant | 0x10) << (exp + 3) | QQI = (mant | 0x10) << (exp + 3)]]></artwork> | |||
]]></artwork> | </li> | |||
</figure> | </ul> | |||
<t>Multicast routers that are not the current Querier adopt the QQI | <t>Multicast routers that are not the current Querier adopt the QQI | |||
value from the most recently received Query as their own [Query | value from the most recently received Query as their own [Query | |||
Interval] value, unless that most recently received QQI was zero, in | Interval] value, unless that most recently received QQI was zero, in | |||
which case the receiving routers use the default [Query Interval] | which case the receiving routers use the default [Query Interval] | |||
value specified in <xref target="qry_int" />.</t> | value specified in <xref target="qry_int" format="default"/>.</t> | |||
</section> | </section> | |||
<section anchor="num_srcs" numbered="true" toc="default"> | ||||
<section title="Number of Sources (N)" anchor="num_srcs"> | <name>Number of Sources (N)</name> | |||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
<t>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 | 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 | a Multicast Address Specific Query and non-zero in a Multicast | |||
Address and Source Specific Query. This number is limited by the MTU | 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 | 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) | Ethernet link with an MTU of 1500 octets, the IPv6 header (40 octets) | |||
together with the Hop-By-Hop Extension Header (8 octets) that | together with the Hop-by-Hop Extension Header (8 octets) that | |||
includes the Router Alert option consume 48 octets; the MLD fields up | 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 | to the Number of Sources (N) field consume 28 octets; thus, there are | |||
1424 octets left for source addresses, which limits the number of | 1424 octets left for source addresses, which limits the number of | |||
source addresses to 89 (1424/16).</t> | source addresses to 89 (1424/16).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Source Address [i]"> | <name>Source Address [i]</name> | |||
<t>The Source Address [i] fields are a vector of n unicast addresses, | ||||
<t>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> | where n is the value in the Number of Sources (N) field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Additional Data"> | <name>Additional Data</name> | |||
<t>If the Payload Length field in the IPv6 header of a received Query | ||||
<t>If the Payload Length field in the IPv6 header of a received Query | ||||
indicates that there are additional octets of data present, beyond | indicates that there are additional octets of data present, beyond | |||
the fields described here, MLDv2 implementations MUST include those | the fields described here, MLDv2 implementations <bcp14>MUST</bcp14> include those | |||
octets in the computation to verify the received MLD Checksum, but | octets in the computation to verify the received MLD Checksum, but | |||
MUST otherwise ignore those additional octets. When sending a Query, | <bcp14>MUST</bcp14> otherwise ignore those additional octets. When sending a | |||
an MLDv2 implementation MUST NOT include additional octets beyond the | Query, | |||
an MLDv2 implementation <bcp14>MUST NOT</bcp14> include additional octets bey | ||||
ond the | ||||
fields described above.</t> | fields described above.</t> | |||
</section> | </section> | |||
<section anchor="qry_vars" numbered="true" toc="default"> | ||||
<section title="Query Variants" anchor="qry_vars"> | <name>Query Variants</name> | |||
<t>There are three variants of the Query message: | ||||
<t>There are three variants of the Query message: | </t> | |||
<list style="bullets"> | <ul spacing="normal"> | |||
<li> | ||||
<t>A "General Query" is sent by the Querier to learn which multicast | <t>A "General Query" is sent by the Querier to learn which | |||
addresses have listeners on an attached link. In a General Query, | multicast addresses have listeners on an attached link. In a | |||
both the Multicast Address field and the Number of Sources (N) | General Query, both the Multicast Address field and the Number | |||
field are zero.</t> | of Sources (N) field are zero.</t> | |||
</li> | ||||
<t>A "Multicast Address Specific Query" is sent by the Querier to | <li> | |||
learn if a particular multicast address has any listeners on an | <t>A "Multicast Address Specific Query" is sent by the Querier | |||
attached link. In a Multicast Address Specific Query, the | to learn if a particular multicast address has any listeners on | |||
Multicast Address field contains the multicast address of | an attached link. In a Multicast Address Specific Query, the | |||
interest, while the Number of Sources (N) field is set to zero.</t> | Multicast Address field contains the multicast address of | |||
interest, while the Number of Sources (N) field is set to | ||||
<t>A "Multicast Address and Source Specific Query" is sent by the | zero.</t> | |||
Querier to learn if any of the sources from the specified list for | </li> | |||
the particular multicast address has any listeners on an attached | <li> | |||
link or not. In a Multicast Address and Source Specific Query the | <t>A "Multicast Address and Source Specific Query" is sent by | |||
Multicast Address field contains the multicast address of | the Querier to learn if any of the sources from the specified | |||
interest, while the Source Address [i] field(s) contain(s) the | list for the particular multicast address has any listeners on | |||
source address(es) of interest.</t> | an attached link or not. In a Multicast Address and Source | |||
</list></t> | Specific Query the Multicast Address field contains the | |||
</section> | multicast address of interest, while the Source Address [i] | |||
field(s) contain(s) the source address(es) of interest.</t> | ||||
<section title="Source Addresses for Queries"> | </li> | |||
</ul> | ||||
<t>All MLDv2 Queries MUST be sent with a valid IPv6 link-local source | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Source Addresses for Queries</name> | ||||
<t>All MLDv2 Queries <bcp14>MUST</bcp14> be sent with a valid IPv6 lin | ||||
k-local source | ||||
address. If a node (router or host) receives a Query message with | address. If a node (router or host) receives a Query message with | |||
the IPv6 Source Address set to the unspecified address (::), or any | the IPv6 Source Address set to the unspecified address (::), or any | |||
other address that is not a valid IPv6 link-local address, it MUST | other address that is not a valid IPv6 link-local address, it <bcp14>MUST</bc | |||
silently discard the message and SHOULD log a warning.</t> | p14> | |||
</section> | silently discard the message and <bcp14>SHOULD</bcp14> log a warning.< | |||
/t> | ||||
<section title="Destination Addresses for Queries"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<t>In MLDv2, General Queries are sent to the link-scope all-nodes | <name>Destination Addresses for Queries</name> | |||
<t>In MLDv2, General Queries are sent to the link-scope all-nodes | ||||
multicast address (ff02::1). Multicast Address Specific and | multicast address (ff02::1). Multicast Address Specific and | |||
Multicast Address and Source Specific Queries are sent with an IP | Multicast Address and Source Specific Queries are sent with an IP | |||
destination address equal to the multicast address of interest. | destination address equal to the multicast address of interest. | |||
However, a node MUST accept and process any Query whose IP | However, a node <bcp14>MUST</bcp14> accept and process any Query whose IP | |||
Destination Address field contains any of the addresses (unicast or | Destination Address field contains any of the addresses (unicast or | |||
multicast) assigned to the interface on which the Query arrives. This | multicast) assigned to the interface on which the Query arrives. This | |||
might be useful, e.g., for debugging purposes.</t> | might be useful, e.g., for debugging purposes.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Version 2 Multicast Listener Report Message"> | <name>Version 2 Multicast Listener Report Message</name> | |||
<t>Version 2 Multicast Listener Reports are sent by IP nodes to report | ||||
<t>Version 2 Multicast Listener Reports are sent by IP nodes to report | ||||
(to neighboring routers) the current multicast listening state, or | (to neighboring routers) the current multicast listening state, or | |||
changes in the multicast listening state, of their interfaces. | changes in the multicast listening state, of their interfaces. | |||
Reports have the following format:</t> | Reports have the following format:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure> | ||||
<artwork><![CDATA[ | ||||
0 1 2 3 | 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 | 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 | | | Type = 143 | Reserved | Checksum | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Flags |Nr of Mcast Address Records (M)| | | Flags |Nr of Mcast Address Records (M)| | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Multicast Address Record [1] . | . Multicast Address Record [1] . | |||
skipping to change at line 969 ¶ | skipping to change at line 1045 ¶ | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| . | | | . | | |||
. . . | . . . | |||
| . | | | . | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Multicast Address Record [M] . | . Multicast Address Record [M] . | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<t>Each Multicast Address Record has the following internal format:</t> | <t>Each Multicast Address Record has the following internal format:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| Record Type | Aux Data Len | Number of Sources (N) | | | Record Type | Aux Data Len | Number of Sources (N) | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
* Multicast Address * | * Multicast Address * | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
skipping to change at line 1021 ¶ | skipping to change at line 1094 ¶ | |||
* Source Address [N] * | * Source Address [N] * | |||
| | | | | | |||
* * | * * | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | |||
| | | | | | |||
. . | . . | |||
. Auxiliary Data . | . Auxiliary Data . | |||
. . | . . | |||
| | | | | | |||
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork> | |||
]]></artwork> | ||||
</figure> | ||||
<section title="Reserved"> | ||||
<t>The Reserved field is set to zero on transmission, and ignored on receptio | ||||
n.</t> | ||||
</section> | ||||
<section title="Checksum"> | ||||
<t>The standard ICMPv6 checksum; it covers the entire MLDv2 message, | <section numbered="true" toc="default"> | |||
plus a "pseudo-header" of IPv6 header fields <xref target="RFC8200" /><xref t | <name>Reserved</name> | |||
arget="RFC4443" />. In | <t>The Reserved field is set to zero on transmission and ignored on re | |||
ception.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Checksum</name> | ||||
<t>The Checksum Field is the standard ICMPv6 checksum; it covers the e | ||||
ntire MLDv2 message, plus a "pseudo-header" of IPv6 header fields <xref target=" | ||||
RFC8200" format="default"/> <xref target="RFC4443" format="default"/>. In | ||||
order to compute the checksum, the Checksum field is set to zero. | order to compute the checksum, the Checksum field is set to zero. | |||
When a packet is received, the checksum MUST be verified before | When a packet is received, the checksum <bcp14>MUST</bcp14> be verified befor e | |||
processing it.</t> | processing it.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Flags"> | <name>Flags</name> | |||
<t>Allocation of individual bits within the Flags field is described i | ||||
<t>Allocation of individual bits within the Flags field is described in | n | |||
Section 2.3 of <xref target="I-D.ietf-pim-3228bis" />. Future specifications | <xref target="RFC9778" sectionFormat="of" section="2.3"/>. Future specificati | |||
ons | ||||
will define the associated meaning tied to any such allocation.</t> | will define the associated meaning tied to any such allocation.</t> | |||
</section> | ||||
</section> | <section numbered="true" toc="default"> | |||
<name>Nr of Mcast Address Records (M)</name> | ||||
<section title="Nr of Mcast Address Records (M)"> | <t>The Nr of the Mcast Address Records (M) field specifies how many | |||
<t>The Nr of Mcast Address Records (M) field specifies how many | ||||
Multicast Address Records are present in this Report.</t> | Multicast Address Records are present in this Report.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Address Record"> | <name>Multicast Address Record</name> | |||
<t>Each Multicast Address Record is a block of fields that contain | ||||
<t>Each Multicast Address Record is a block of fields that contain | ||||
information on the sender listening to a single multicast address on | information on the sender listening to a single multicast address on | |||
the interface from which the Report is sent.</t> | the interface from which the Report is sent.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Record Type"> | <name>Record Type</name> | |||
<t>The Record Type field specifies the type of the Multicast Address R | ||||
<t>It specifies the type of the Multicast Address Record. See | ecord. See | |||
<xref target="mar_types" /> for a detailed description of the different possi | <xref target="mar_types" format="default"/> for a detailed description of the | |||
ble Record | different possible Record | |||
Types.</t> | Types.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Aux Data Len"> | <name>Aux Data Len</name> | |||
<t>The Aux Data Len field contains the length of the Auxiliary Data | ||||
<t>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 | |||
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> | may contain zero, to indicate the absence of any auxiliary data.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Number of Sources (N)"> | <name>Number of Sources (N)</name> | |||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
<t>The Number of Sources (N) field specifies how many source addresses | ||||
are present in this Multicast Address Record.</t> | are present in this Multicast Address Record.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Address"> | <name>Multicast Address</name> | |||
<t>The Multicast Address field contains the multicast address to which | ||||
<t>The Multicast Address field contains the multicast address to which | ||||
this Multicast Address Record pertains.</t> | this Multicast Address Record pertains.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Source Address [i]"> | <name>Source Address [i]</name> | |||
<t>The Source Address [i] fields are a vector of n unicast addresses, | ||||
<t>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> | where n is the value in this record's Number of Sources (N) field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Auxiliary Data"> | <name>Auxiliary Data</name> | |||
<t>The Auxiliary Data field, if present, contains additional informati | ||||
<t>The Auxiliary Data field, if present, contains additional information | on | |||
that pertain to this Multicast Address Record. The protocol | that pertains to this Multicast Address Record. The protocol | |||
specified in this document, MLDv2, does not define any auxiliary | specified in this document, MLDv2, does not define any auxiliary | |||
data. Therefore, implementations of MLDv2 MUST NOT include any | data. Therefore, implementations of MLDv2 <bcp14>MUST NOT</bcp14> include an | |||
auxiliary data (i.e., MUST set the Aux Data Len field to zero) in any | y | |||
transmitted Multicast Address Record, and MUST ignore any such data | 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 | present in any received Multicast Address Record. The semantics and | |||
the internal encoding of the Auxiliary Data field are to be defined | 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> | by any future version or extension of MLD that uses this field.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Additional Data"> | <name>Additional Data</name> | |||
<t>If the Payload Length field in the IPv6 header of a received Report | ||||
<t>If the Payload Length field in the IPv6 header of a received Report | ||||
indicates that there are additional octets of data present, beyond | indicates that there are additional octets of data present, beyond | |||
the last Multicast Address Record, MLDv2 implementations MUST include | the last Multicast Address Record, MLDv2 implementations <bcp14>MUST</bcp14> include | |||
those octets in the computation to verify the received MLD Checksum, | those octets in the computation to verify the received MLD Checksum, | |||
but MUST otherwise ignore those additional octets. When sending a | but <bcp14>MUST</bcp14> otherwise ignore those additional octets. When sendi | |||
Report, an MLDv2 implementation MUST NOT include additional octets | ng a | |||
Report, an MLDv2 implementation <bcp14>MUST NOT</bcp14> include additional oc | ||||
tets | ||||
beyond the last Multicast Address Record.</t> | beyond the last Multicast Address Record.</t> | |||
</section> | </section> | |||
<section anchor="mar_types" numbered="true" toc="default"> | ||||
<section title="Multicast Address Record Types" anchor="mar_types"> | <name>Multicast Address Record Types</name> | |||
<t>There are a number of different types of Multicast Address | ||||
<t>There are a number of different types of Multicast Address Records | Records that may be included in a Report message:</t> | |||
that may be included in a Report message: | ||||
<list style="bullets"> | ||||
<t>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: | ||||
<list style="format %d - " counter="my_cnt"> | ||||
<t>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> | ||||
<t>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 SHOULD NOT 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"/>.</t | ||||
> | ||||
</list></t> | ||||
<t>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: | ||||
<list style="format %d - " counter="my_cnt"> | ||||
<t>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> | ||||
<t>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 SHOULD NOT send a CHANGE_TO_EXCLUDE_MODE record type fo | ||||
r | ||||
multicast addresses that fall within the SSM address range.</t> | ||||
</list></t> | ||||
<t>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: | ||||
<list style="format %d - " counter="my_cnt"> | ||||
<t>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> | ||||
<t>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> | ||||
</list></t> | ||||
</list></t> | ||||
<t>If a change of source list results in both allowing new sources and | <ul spacing="normal"> | |||
<li><t>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"><li> | ||||
<t>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> | ||||
<t>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"/>.</t> | ||||
</li> | ||||
</ol> | ||||
</li> | ||||
<li> | ||||
<t>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"><li> | ||||
<t>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> | ||||
<t>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> | ||||
<t>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"><li> | ||||
<t>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> | ||||
<t>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>If a change of source list results in both allowing new sources and | ||||
blocking old sources, then two Multicast Address Records are sent for | blocking old sources, then two Multicast Address Records are sent for | |||
the same multicast address, one of type ALLOW_NEW_SOURCES and one of | the same multicast address, one of type ALLOW_NEW_SOURCES and one of | |||
type BLOCK_OLD_SOURCES.</t> | type BLOCK_OLD_SOURCES.</t> | |||
<t>We use the term "State Change Record" to refer to either a Filter | ||||
<t>We use the term "State Change Record" to refer to either a Filter | ||||
Mode Change Record or a Source List Change Record.</t> | Mode Change Record or a Source List Change Record.</t> | |||
<t>Multicast Address Records with an unrecognized Record Type value <b | ||||
<t>Multicast Address Records with an unrecognized Record Type value MUST | cp14>MUST</bcp14> | |||
be silently ignored, with the rest of the report being processed.</t> | be silently ignored, with the rest of the report being processed.</t> | |||
<t>In the rest of this document, we use the following notation to | ||||
<t>In the rest of this document, we use the following notation to | ||||
describe the contents of a Multicast Address Record that pertains to | describe the contents of a Multicast Address Record that pertains to | |||
a particular multicast address:</t> | a particular multicast address:</t> | |||
<figure> | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
<artwork><![CDATA[ | IS_IN ( x ) - Type MODE_IS_INCLUDE, source addresses x | |||
IS_IN ( x ) - Type MODE_IS_INCLUDE, source addresses x | IS_EX ( x ) - Type MODE_IS_EXCLUDE, source addresses x | |||
IS_EX ( x ) - Type MODE_IS_EXCLUDE, source addresses x | TO_IN ( x ) - Type CHANGE_TO_INCLUDE_MODE, source addresses x | |||
TO_IN ( x ) - Type CHANGE_TO_INCLUDE_MODE, source addresses x | TO_EX ( x ) - Type CHANGE_TO_EXCLUDE_MODE, source addresses x | |||
TO_EX ( x ) - Type CHANGE_TO_EXCLUDE_MODE, source addresses x | ALLOW ( x ) - Type ALLOW_NEW_SOURCES, source addresses x | |||
ALLOW ( x ) - Type ALLOW_NEW_SOURCES, source addresses x | BLOCK ( x ) - Type BLOCK_OLD_SOURCES, source addresses x]]></artwork> | |||
BLOCK ( x ) - Type BLOCK_OLD_SOURCES, source addresses x | ||||
]]></artwork> | ||||
</figure> | ||||
<t>where x is either: | <t>where x is either: | |||
<list style="bullets"> | </t> | |||
<t>a capital letter (e.g., "A") to represent the set of source | <ul spacing="normal"> | |||
addresses, or</t> | <li> | |||
<t>a set expression (e.g., "A+B"), where "A+B" means the union of | <t>a capital letter (e.g., "A") to represent the set of source | |||
addresses or</t> | ||||
</li> | ||||
<li> | ||||
<t>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 | 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> | "A-B" means the removal of all elements of set B from set A.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Source Addresses for Reports" anchor="src_addrs"> | <section anchor="src_addrs" numbered="true" toc="default"> | |||
<name>Source Addresses for Reports</name> | ||||
<t>An MLDv2 Report MUST be sent with a valid IPv6 link-local source | <t>An MLDv2 Report <bcp14>MUST</bcp14> be sent with a valid IPv6 link- | |||
local source | ||||
address, or the unspecified address (::), if the sending interface | address, or the unspecified address (::), if the sending interface | |||
has not acquired a valid link-local address yet. Sending reports | has not acquired a valid link-local address yet. Sending reports | |||
with the unspecified address is allowed to support the use of IP | with the unspecified address is allowed to support the use of IP | |||
multicast in the Neighbor Discovery Protocol <xref target="RFC4861" />. For | multicast in the Neighbor Discovery Protocol <xref target="RFC4861" format="d | |||
stateless autoconfiguration, as defined in <xref target="RFC4862" />, a node | efault"/>. For | |||
is | stateless autoconfiguration, as defined in <xref target="RFC4862" format="def | |||
ault"/>, a node is | ||||
required to join several IPv6 multicast groups, in order to perform | required to join several IPv6 multicast groups, in order to perform | |||
Duplicate Address Detection (DAD). Prior to DAD, the only address | Duplicate Address Detection (DAD). Prior to DAD, the only address | |||
the reporting node has for the sending interface is a tentative one, | the reporting node has for the sending interface is a tentative one, | |||
which cannot be used for communication. Thus, the unspecified | which cannot be used for communication. Thus, the unspecified | |||
address must be used.</t> | address must be used.</t> | |||
<t>On the other hand, routers <bcp14>MUST</bcp14> silently discard a m | ||||
<t>On the other hand, routers MUST silently discard a message that is | essage that is | |||
not sent with a valid link-local address, without taking any action | 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 | on the contents of the packet. Thus, a Report is discarded if the | |||
router cannot identify the source address of the packet as belonging | router cannot identify the source address of the packet as belonging | |||
to a link connected to the interface on which the packet was | to a link connected to the interface on which the packet was | |||
received. A Report sent with the unspecified address is also | received. A Report sent with the unspecified address is also | |||
discarded by the router. This enhances security, as unidentified | discarded by the router. This enhances security, as unidentified | |||
reporting nodes cannot influence the state of the MLDv2 router(s). | reporting nodes cannot influence the state of the MLDv2 router(s). | |||
Nevertheless, the reporting node has modified its listening state for | Nevertheless, the reporting node has modified its listening state for | |||
multicast addresses that are contained in the Multicast Address | multicast addresses that are contained in the Multicast Address | |||
Records of the Report message. From now on, it will treat packets | Records of the Report message. From now on, it will treat packets | |||
sent to those multicast addresses according to this new listening | sent to those multicast addresses according to this new listening | |||
state. Once a valid link-local address is available, a node SHOULD | state. Once a valid link-local address is available, a node <bcp14>SHOULD</b cp14> | |||
generate new MLDv2 Report messages for all multicast addresses joined | generate new MLDv2 Report messages for all multicast addresses joined | |||
on the interface.</t> | on the interface.</t> | |||
</section> | </section> | |||
<section anchor="dest_addr" numbered="true" toc="default"> | ||||
<section title="Destination Addresses for Reports" anchor="dest_addr"> | <name>Destination Addresses for Reports</name> | |||
<t>Version 2 Multicast Listener Reports are sent with an IP destinatio | ||||
<t>Version 2 Multicast Listener Reports are sent with an IP destination | n | |||
address of ff02::16, to which all MLDv2-capable multicast | address of ff02::16, to which all MLDv2-capable multicast | |||
routers listen (see <xref target="iana" /> for IANA considerations related to | routers listen (see <xref target="iana" format="default"/> for IANA considera tions related to | |||
this special destination address). A node that operates in version 1 | this special destination address). A node that operates in version 1 | |||
compatibility mode (see details in <xref target="interop" />) sends version 1 Reports | compatibility mode (see details in <xref target="interop" format="default"/>) sends version 1 Reports | |||
to the multicast address specified in the Multicast Address field of | to the multicast address specified in the Multicast Address field of | |||
the Report. In addition, a node MUST accept and process any version | the Report. In addition, a node <bcp14>MUST</bcp14> accept and process any v ersion | |||
1 Report whose IP Destination Address field contains any of the | 1 Report whose IP Destination Address field contains any of the | |||
IPv6 addresses (unicast or multicast) assigned to the interface on | IPv6 addresses (unicast or multicast) assigned to the interface on | |||
which the Report arrives. This might be useful, e.g., for debugging | which the Report arrives. This might be useful, e.g., for debugging | |||
purposes.</t> | purposes.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Listener Report Size"> | <name>Multicast Listener Report Size</name> | |||
<t>If the set of Multicast Address Records required in a Report does n | ||||
<t>If the set of Multicast Address Records required in a Report does not | ot | |||
fit within the size limit of a single Report message (as determined | 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 | 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 | Address Records are sent in as many Report messages as needed to | |||
report the entire set.</t> | report the entire set.</t> | |||
<t>If a single Multicast Address Record contains so many source | ||||
<t>If a single Multicast Address Record contains so many source | ||||
addresses that it does not fit within the size limit of a single | addresses that it does not fit within the size limit of a single | |||
Report message, then: | Report message, then: | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>if its Type is not IS_EX or TO_EX, it is split into multiple | <li> | |||
<t>if its Type is not IS_EX or TO_EX, it is split into multiple | ||||
Multicast Address Records; each such record contains a different | Multicast Address Records; each such record contains a different | |||
subset of the source addresses, and is sent in a separate Report.</t> | subset of the source addresses and is sent in a separate Report.</t> | |||
</li> | ||||
<t>if its Type is IS_EX or TO_EX, a single Multicast Address Record | <li> | |||
<t>if its Type is IS_EX or TO_EX, a single Multicast Address Recor | ||||
d | ||||
is sent, with as many source addresses as can fit; the remaining | is sent, with as many source addresses as can fit; the remaining | |||
source addresses are not reported. Although the choice of which | source addresses are not reported. Although the choice of which | |||
sources to report is arbitrary, it is preferable to report the | sources to report is arbitrary, it is preferable to report the | |||
same set of sources in each subsequent report, rather than | same set of sources in each subsequent report, rather than | |||
reporting different sources each time.</t> | reporting different sources each time.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | ||||
<section title="Protocol Description for Multicast Address Listeners" anchor= | <section anchor="proto" numbered="true" toc="default"> | |||
"proto"> | <name>Protocol Description for Multicast Address Listeners</name> | |||
<t>MLD is an asymmetric protocol, as it specifies separate behaviors for | ||||
<t>MLD is an asymmetric protocol, as it specifies separate behaviors for | ||||
multicast address listeners -- that is, hosts or routers that listen | multicast address listeners -- that is, hosts or routers that listen | |||
to multicast packets -- and multicast routers. This section | to multicast packets -- and multicast routers. This section | |||
describes the part of MLDv2 that applies to all multicast address | describes the part of MLDv2 that applies to all multicast address | |||
listeners. (Note that a multicast router that is also a multicast | listeners. (Note that a multicast router that is also a multicast | |||
address listener performs both parts of MLDv2; it receives and it | address listener performs both parts of MLDv2; it receives and it | |||
responds to its own MLD messages, as well as to those of its | responds to its own MLD messages as well as to those of its | |||
neighbors.) The multicast router part of MLDv2 is described in | neighbors.) The multicast router part of MLDv2 is described in | |||
<xref target="mr_proto" />.</t> | <xref target="mr_proto" format="default"/>.</t> | |||
<t>A node performs the protocol described in this section over all | ||||
<t>A node performs the protocol described in this section over all | ||||
interfaces on which multicast reception is supported, even if more | interfaces on which multicast reception is supported, even if more | |||
than one of those interfaces are connected to the same link.</t> | than one of those interfaces are connected to the same link.</t> | |||
<t>For interoperability with multicast routers that run the MLDv1 | ||||
<t>For interoperability with multicast routers that run the MLDv1 | ||||
protocol, nodes maintain a Host Compatibility Mode variable for each | protocol, nodes maintain a Host Compatibility Mode variable for each | |||
interface on which multicast reception is supported. This section | interface on which multicast reception is supported. This section | |||
describes the behavior of multicast address listener nodes on | describes the behavior of multicast address listener nodes on | |||
interfaces for which Host Compatibility Mode = MLDv2. The algorithm | interfaces for which Host Compatibility Mode = MLDv2. The algorithm | |||
for determining Host Compatibility Mode, and the behavior if its | for determining Host Compatibility Mode and the behavior if its | |||
value is set to MLDv1, are described in <xref target="interop" />.</t> | value is set to MLDv1 are described in <xref target="interop" format="default | |||
"/>.</t> | ||||
<t>The link-scope all-nodes multicast address, (ff02::1), is handled as | <t>The link-scope all-nodes multicast address, (ff02::1), is handled as | |||
a special case. On all nodes -- that is all hosts and routers, | a special case. On all nodes -- that is, all hosts and routers | |||
including multicast routers -- listening to packets destined to the | including multicast routers -- listening to packets destined to the | |||
all-nodes multicast address, from all sources, is permanently enabled | all-nodes multicast address, from all sources, is permanently enabled | |||
on all interfaces on which multicast listening is supported. | on all interfaces on which multicast listening is supported. | |||
No MLD messages are ever sent regarding neither the link-scope all-nodes | No MLD messages are ever sent regarding neither the link-scope all-nodes | |||
multicast address, nor any multicast address of scope 0 (reserved) or | multicast address, nor any multicast address of scope 0 (reserved) or | |||
1 (node-local). Multicast listeners MUST send MLD messages for all multicast | 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 multi cast | addresses except for the link-scope all-nodes multicast address and any multi cast | |||
addresses of scope less than 2.</t> | addresses of scope less than 2.</t> | |||
<t>There are three types of events that trigger MLDv2 protocol actions | ||||
<t>There are three types of events that trigger MLDv2 protocol actions | ||||
on an interface: | on an interface: | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>a change of the per-interface listening state, caused by a local | <li> | |||
<t>a change of the per-interface listening state, caused by a local | ||||
invocation of IPv6MulticastListen;</t> | invocation of IPv6MulticastListen;</t> | |||
<t>the firing of a specific timer;</t> | </li> | |||
<t>the reception of a Query.</t> | <li> | |||
</list></t> | <t>the firing of a specific timer; and</t> | |||
</li> | ||||
<t>(Received MLD messages of types other than Query are silently | <li> | |||
<t>the reception of a Query.</t> | ||||
</li> | ||||
</ul> | ||||
<t>(Received MLD messages of types other than Query are silently | ||||
ignored, except as required for interoperation with nodes that | ignored, except as required for interoperation with nodes that | |||
implement MLDv1.)</t> | implement MLDv1.)</t> | |||
<t>The following subsections describe the actions to be taken for each | ||||
<t>The following subsections describe the actions to be taken for each | ||||
case. Timer and counter names appear in square brackets. Default | case. Timer and counter names appear in square brackets. Default | |||
values for those timers and counters are specified in <xref target="ti | values for those timers and counters are specified in <xref target="ti | |||
mers" />.</t> | mers" format="default"/>.</t> | |||
<section anchor="chg_if_state" numbered="true" toc="default"> | ||||
<section title="Action on Change of Per-Interface State" anchor="chg_if_state | <name>Action on Change of Per-Interface State</name> | |||
"> | <t>An invocation of IPv6MulticastListen may cause the multicast | |||
<t>An invocation of IPv6MulticastListen may cause the multicast | ||||
listening state of an interface to change, according to the rules in | listening state of an interface to change, according to the rules in | |||
<xref target="if_state" />. Each such change affects the per-interface entry for a | <xref target="if_state" format="default"/>. Each such change affects the per -interface entry for a | |||
single multicast address.</t> | single multicast address.</t> | |||
<t>A change of per-interface state causes the node to immediately | ||||
<t>A change of per-interface state causes the node to immediately | ||||
transmit a State Change Report from that interface. The type and | transmit a State Change Report from that interface. The type and | |||
contents of the Multicast Address Record(s) in that Report are | contents of the Multicast Address Record(s) in that Report are | |||
determined by comparing the filter mode and source list for the | determined by comparing the filter mode and source list for the | |||
affected multicast address before and after the change, according to | affected multicast address before and after the change, according to | |||
<xref target="rec-xmit-logic"/>. If no per-interface state existed for that | <xref target="rec-xmit-logic" format="default"/>. If no per-interface state existed for that | |||
multicast address before the change (i.e., the change consisted of | multicast address before the change (i.e., the change consisted of | |||
creating a new per-interface record), or if no state exists after the | creating a new per-interface record), or if no state exists after the | |||
change (i.e., the change consisted of deleting a per-interface | change (i.e., the change consisted of deleting a per-interface | |||
record), then the "non-existent" state is considered to have an | record), then the "non-existent" state is considered to have an | |||
INCLUDE filter mode and an empty source list.</t> | INCLUDE filter mode and an empty source list.</t> | |||
<table align="left" anchor="rec-xmit-logic"> | ||||
<table title="State Change Record Transmission Logic" anchor="rec-xmit-logic" | <name>State Change Record Transmission Logic</name> | |||
> | <tbody> | |||
<tbody> | <tr> | |||
<tr><th align="center">Old State</th> | <th>Old State</th> | |||
<th align="center">New State</th> | <th>New State</th> | |||
<th align="center">State Change Record Sent</th></tr> | <th>State Change Record Sent</th> | |||
<tr><td>INCLUDE (A)</td><td>INCLUDE (B)</td><td>ALLOW (B-A), BLOCK (A-B | </tr> | |||
)</td></tr> | <tr> | |||
<tr><td>EXCLUDE (A)</td><td>EXCLUDE (B)</td><td>ALLOW (A-B), BLOCK (B-A | <td>INCLUDE (A)</td> | |||
)</td></tr> | <td>INCLUDE (B)</td> | |||
<tr><td>INCLUDE (A)</td><td>EXCLUDE (B)</td><td>TO_EX (B)</td></tr> | <td>ALLOW (B-A), BLOCK (A-B)</td> | |||
<tr><td>EXCLUDE (A)</td><td>INCLUDE (B)</td><td>TO_IN (B)</td></tr> | </tr> | |||
</tbody> | <tr> | |||
</table> | <td>EXCLUDE (A)</td> | |||
<td>EXCLUDE (B)</td> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK State | <td>ALLOW (A-B), BLOCK (B-A)</td> | |||
</tr> | ||||
<tr> | ||||
<td>INCLUDE (A)</td> | ||||
<td>EXCLUDE (B)</td> | ||||
<td>TO_EX (B)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (A)</td> | ||||
<td>INCLUDE (B)</td> | ||||
<td>TO_IN (B)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>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> | Change Record is empty, that record is omitted from the Report.</t> | |||
<t>To cover the possibility of the State Change Report being missed by | ||||
<t>To cover the possibility of the State Change Report being missed by | ||||
one or more multicast routers, [Robustness Variable] - 1 | one or more multicast routers, [Robustness Variable] - 1 | |||
retransmissions are scheduled, through a Retransmission Timer, at | retransmissions are scheduled, through a Retransmission Timer, at | |||
intervals chosen at random from the range (0, [Unsolicited Report | intervals chosen at random from the range (0, [Unsolicited Report | |||
Interval]).</t> | Interval]).</t> | |||
<t>If more changes to the same per-interface state entry occur before | ||||
<t>If more changes to the same per-interface state entry occur before | ||||
all the retransmissions of the State Change Report for the first | all the retransmissions of the State Change Report for the first | |||
change have been completed, each such additional change triggers the | change have been completed, each such additional change triggers the | |||
immediate transmission of a new State Change Report.</t> | immediate transmission of a new State Change Report.</t> | |||
<t>The contents of the new Report are calculated as follows: | ||||
<t>The contents of the new Report are calculated as follows: | </t> | |||
<list style="bullets"> | <ul spacing="normal"> | |||
<li> | ||||
<t>As for the first Report, the per-interface state for the affected | <t>As for the first Report, the per-interface state for the affected | |||
multicast address before and after the latest change is compared.</t> | multicast address before and after the latest change is compared.</t> | |||
</li> | ||||
<t>The records that express the difference are built according to the | <li> | |||
<t>The records that express the difference are built according to th | ||||
e | ||||
table above. Nevertheless, these records are not transmitted in a | table above. Nevertheless, these records are not transmitted in a | |||
separate message, but they are instead merged with the contents of | separate message, but they are instead merged with the contents of | |||
the pending report, to create the new State Change Report. The | the pending report, to create the new State Change Report. The | |||
rules for calculating this merged report are described below.</t> | rules for calculating this merged report are described below.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>The transmission of the merged State Change Report terminates | <t>The transmission of the merged State Change Report terminates | |||
retransmissions of the earlier State Change Reports for the same | retransmissions of the earlier State Change Reports for the same | |||
multicast address, and becomes the first of [Robustness Variable] | multicast address and becomes the first of [Robustness Variable] | |||
transmissions of the new State Change Reports. These transmissions | transmissions of the new State Change Reports. These transmissions | |||
are necessary in order to ensure that each instance of state change | are necessary in order to ensure that each instance of state change | |||
is transmitted at least [Robustness Variable] times.</t> | is transmitted at least [Robustness Variable] times.</t> | |||
<t>Each time a source is included in the difference report calculated | ||||
<t>Each time a source is included in the difference report calculated | ||||
above, retransmission state for that source needs to be maintained | above, retransmission state for that source needs to be maintained | |||
until [Robustness Variable] State Change Reports have been sent by | until [Robustness Variable] State Change Reports have been sent by | |||
the node. This is done in order to ensure that a series of | the node. This is done in order to ensure that a series of | |||
successive state changes do not break the protocol robustness. | successive state changes do not break the protocol robustness. | |||
Sources in retransmission state can be kept in a per multicast | Sources in retransmission state can be kept in a per-multicast-address | |||
address Retransmission List, with a Source Retransmission Counter | Retransmission List, with a Source Retransmission Counter | |||
associated to each source in the list. When a source is included in | 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 | the list, its counter is set to [Robustness Variable]. Each time a | |||
State Change Report is sent the counter is decreased by one unit. | State Change Report is sent, the counter is decreased by one unit. | |||
When the counter reaches zero, the source is deleted from the | When the counter reaches zero, the source is deleted from the | |||
Retransmission List for that multicast address.</t> | Retransmission List for that multicast address.</t> | |||
<t>If the per-interface listening change that triggers the new report is | ||||
<t>If the per-interface listening change that triggers the new report is | ||||
a filter mode change, then the next [Robustness Variable] State | a filter mode change, then the next [Robustness Variable] State | |||
Change Reports will include a Filter Mode Change Record. This | Change Reports will include a Filter Mode Change Record. This | |||
applies even if any number of source list changes occur in that | applies even if any number of source list changes occur in that | |||
period. The node has to maintain retransmission state for the | period. The node has to maintain retransmission state for the | |||
multicast address until the [Robustness Variable] State Change | multicast address until the [Robustness Variable] State Change | |||
Reports have been sent. This can be done through a per multicast | Reports have been sent. This can be done through a per-multicast-address | |||
address Filter Mode Retransmission Counter. When the filter mode | Filter Mode Retransmission Counter. When the filter mode | |||
changes, the counter is set to [Robustness Variable]. Each time a | changes, the counter is set to [Robustness Variable]. Each time a | |||
State Change Report is sent the counter is decreased by one unit. | State Change Report is sent the counter is decreased by one unit. | |||
When the counter reaches zero, i.e., [Robustness Variable] State | When the counter reaches zero, i.e., [Robustness Variable] State | |||
Change Reports with Filter Mode Change Records have been transmitted | Change Reports with Filter Mode Change Records have been transmitted | |||
after the last filter mode change, and if source list changes have | after the last filter mode change, and if source list changes have | |||
resulted in additional reports being scheduled, then the next State | resulted in additional reports being scheduled, then the next State | |||
Change Report will include Source List Change Records.</t> | Change Report will include Source List Change Records.</t> | |||
<t>Each time a per-interface listening state change triggers the | ||||
<t>Each time a per-interface listening state change triggers the | immediate transmission of a new State Change Report, its contents are | |||
Immediate transmission of a new State Change Report, its contents are | ||||
determined as follows. If the report should contain a Filter Mode | determined as follows. If the report should contain a Filter Mode | |||
Change Record, i.e., the Filter Mode Retransmission Counter for that | Change Record, i.e., the Filter Mode Retransmission Counter for that | |||
multicast address has a value higher than zero, then, if the current | 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 | 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 | in the report; otherwise, a TO_EX record is included. If instead the | |||
report should contain Source List Change Records, i.e., the Filter | report should contain Source List Change Records, i.e., the Filter | |||
Mode Retransmission Counter for that multicast address is zero, an | Mode Retransmission Counter for that multicast address is zero, an | |||
ALLOW and a BLOCK record is included. The contents of these records | ALLOW and a BLOCK record is included. The contents of these records | |||
are built according <xref target="if-rep-info"/>.</t> | are built according <xref target="if-rep-info" format="default"/>.</t> | |||
<table align="left" anchor="if-rep-info"> | ||||
<table title="Per-Interface State Change Report Contents" anchor="if-rep-info | <name>Per-Interface State Change Report Contents</name> | |||
"> | <tbody> | |||
<tbody> | <tr> | |||
<tr><th align="center">Record</th> | <th>Record</th> | |||
<th align="center">Sources Included</th></tr> | <th>Sources Included</th> | |||
<tr><td>TO_IN</td><td>All in the current per-interface state that must | </tr> | |||
be forwarded</td></tr> | <tr> | |||
<tr><td>TO_EX</td><td>All in the current per-interface state that must | <td>TO_IN</td> | |||
be blocked</td></tr> | <td>All in the current per-interface state that must be forwarded. | |||
<tr><td>ALLOW</td><td>All with retransmission state (i.e., all sources | </td> | |||
from the Retransmission List) that must be forwarded</td></tr> | </tr> | |||
<tr><td>BLOCK</td><td>All with retransmission state that must be block | <tr> | |||
ed</td></tr> | <td>TO_EX</td> | |||
</tbody> | <td>All in the current per-interface state that must be blocked.</ | |||
</table> | td> | |||
</tr> | ||||
<tr> | ||||
<td>ALLOW</td> | ||||
<td>All with retransmission state (i.e., all sources from the Retr | ||||
ansmission List) that must be forwarded.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>BLOCK</td> | ||||
<td>All with retransmission state that must be blocked.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>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> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK record is | <!-- [rfced] Please review whether any of the notes in this document | |||
empty, that record is omitted from the State Change Report.</t> | should be in the <aside> element. It is defined as "a container for | |||
content that is semantically less important or tangential to the | ||||
content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside) | ||||
. | ||||
--> | ||||
<t>Note: When the first State Change Report is sent, the non-existent | <t>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 | pending report to merge with can be treated as a Source Change Report | |||
with empty ALLOW and BLOCK records (no sources have retransmission | with empty ALLOW and BLOCK records (no sources have retransmission | |||
state).</t> | state).</t> | |||
<t>The building of a scheduled State Change Report, triggered by the | ||||
<t>The building of a scheduled State Change Report, triggered by the | ||||
firing of a Retransmission Timer, instead of a per-interface | firing of a Retransmission Timer, instead of a per-interface | |||
listening state change, is described in <xref target="timer_act" />.</ | listening state change, is described in <xref target="timer_act" forma | |||
t> | t="default"/>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Action on Reception of a Query"> | <name>Action on Reception of a Query</name> | |||
<t>Upon reception of an MLD message that contains a Query, the node | ||||
<t>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 | 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 | 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 | is present in the Hop-by-Hop Options header of the IPv6 packet. If | |||
any of these checks fails, the packet is dropped.</t> | any of these checks fail, the packet is dropped.</t> | |||
<t>If the validity of the MLD message is verified, the node starts to | ||||
<t>If the validity of the MLD message is verified, the node starts to | ||||
process the Query. Instead of responding immediately, the node | process the Query. Instead of responding immediately, the node | |||
delays its response by a random amount of time, bounded by the | delays its response by a random amount of time, bounded by the | |||
Maximum Response Delay value derived from the Maximum Response Code | Maximum Response Delay value derived from the Maximum Response Code | |||
in the received Query message. A node may receive a variety of | in the received Query message. A node may receive a variety of | |||
Queries on different interfaces and of different kinds (e.g., General | Queries on different interfaces and of different kinds (e.g., General | |||
Queries, Multicast Address Specific Queries, and Multicast Address | Queries, Multicast Address Specific Queries, and Multicast Address | |||
and Source Specific Queries), each of which may require its own | and Source Specific Queries), each of which may require its own | |||
delayed response.</t> | delayed response.</t> | |||
<t>Before scheduling a response to a Query, the node must first consider | ||||
<t>Before scheduling a response to a Query, the node must first consider | ||||
previously scheduled pending responses and, in many cases, schedule a | previously scheduled pending responses and, in many cases, schedule a | |||
combined response. Therefore, for each of its interfaces on which it | combined response. Therefore, for each of its interfaces on which it | |||
operates the listener part of the MLDv2 protocol, the node must be | operates the listener part of the MLDv2 protocol, the node must be | |||
able to maintain the following state: | able to maintain the following state: | |||
<list style="bullets"> | </t> | |||
<t>an Interface Timer for scheduling responses to General Queries;</t> | <ul spacing="normal"> | |||
<t>a Multicast Address Timer for scheduling responses to Multicast | <li> | |||
<t>an Interface Timer for scheduling responses to General Queries;</ | ||||
t> | ||||
</li> | ||||
<li> | ||||
<t>a Multicast Address Timer for scheduling responses to Multicast | ||||
Address (and Source) Specific Queries, for each multicast address | Address (and Source) Specific Queries, for each multicast address | |||
the node has to report on;</t> | the node has to report on; and</t> | |||
<t>a per-multicast-address list of sources to be reported in response | </li> | |||
<li> | ||||
<t>a per-multicast-address list of sources to be reported in respons | ||||
e | ||||
to a Multicast Address and Source Specific Query.</t> | to a Multicast Address and Source Specific Query.</t> | |||
</list></t> | </li> | |||
</ul> | ||||
<t>When a new valid General Query arrives on an interface, the node | <t>When a new valid General Query arrives on an interface, the node | |||
checks whether it has any per-interface listening state record to | checks whether it has any per-interface listening state record to | |||
report on, or not. Similarly, when a new valid Multicast Address | report on, or not. Similarly, when a new valid Multicast Address | |||
(and Source) Specific Query arrives on an interface, the node checks | (and Source) Specific Query arrives on an interface, the node checks | |||
whether it has a per-interface listening state record that | whether it has a per-interface listening state record that | |||
corresponds to the queried multicast address (and source), or not. If | 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, | it does, a delay for a response is randomly selected in the range (0, | |||
[Maximum Response Delay]), where Maximum Response Delay is derived | [Maximum Response Delay]), where Maximum Response Delay is derived | |||
from the Maximum Response Code inserted in the received Query | from the Maximum Response Code inserted in the received Query | |||
message. The following rules are then used to determine if a Report | 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. | 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 | (The rules are considered in order and only the first matching rule | |||
is applied.) | is applied.) | |||
<list style="numbers"> | </t> | |||
<t>If there is a pending response to a previous General Query | <ol spacing="normal" type="1"><li> | |||
<t>If there is a pending response to a previous General Query | ||||
scheduled sooner than the selected delay, no additional response | scheduled sooner than the selected delay, no additional response | |||
needs to be scheduled.</t> | needs to be scheduled.</t> | |||
<t>If the received Query is a General Query, the Interface Timer is | </li> | |||
<li> | ||||
<t>If the received Query is a General Query, the Interface Timer is | ||||
used to schedule a response to the General Query after the | used to schedule a response to the General Query after the | |||
selected delay. Any previously pending response to a General | selected delay. Any previously pending response to a General | |||
Query is canceled.</t> | Query is canceled.</t> | |||
<t>If the received Query is a Multicast Address Specific Query or a | </li> | |||
<li> | ||||
<t>If the received Query is a Multicast Address Specific Query or a | ||||
Multicast Address and Source Specific Query and there is no | Multicast Address and Source Specific Query and there is no | |||
pending response to a previous Query for this multicast address, | pending response to a previous Query for this multicast address, | |||
then the Multicast Address Timer is used to schedule a report. If | then the Multicast Address Timer is used to schedule a report. If | |||
the received Query is a Multicast Address and Source Specific | the received Query is a Multicast Address and Source Specific | |||
Query, the list of queried sources is recorded to be used when | Query, the list of queried sources is recorded for use when | |||
generating a response.</t> | generating a response.</t> | |||
<t>If there is already a pending response to a previous Query | </li> | |||
<li> | ||||
<t>If there is already a pending response to a previous Query | ||||
scheduled for this multicast address, and either the new Query is | scheduled for this multicast address, and either the new Query is | |||
a Multicast Address Specific Query or the recorded source list | a Multicast Address Specific Query or the recorded source list | |||
associated with the multicast address is empty, then the multicast | associated with the multicast address is empty, then the multicast | |||
address source list is cleared and a single response is scheduled, | address source list is cleared and a single response is scheduled, | |||
using the Multicast Address Timer. The new 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 | to be sent at the earliest of the remaining time for the pending | |||
report and the selected delay.</t> | report and the selected delay.</t> | |||
<t>If the received Query is a Multicast Address and Source Specific | </li> | |||
<li> | ||||
<t>If the received Query is a Multicast Address and Source Specific | ||||
Query and there is a pending response for this multicast address | Query and there is a pending response for this multicast address | |||
with a non-empty source list, then the multicast address source | with a non-empty source list, then the multicast address source | |||
list is augmented to contain the list of sources in the new Query, | list is augmented to contain the list of sources in the new Query, | |||
and a single response is scheduled using the Multicast Address | and a single response is scheduled using the Multicast Address | |||
Timer. The new response is scheduled to be sent at the earliest | Timer. The new response is scheduled to be sent at the earliest | |||
of the remaining time for the pending report and the selected | of the remaining time for the pending report and the selected | |||
delay.</t> | delay.</t> | |||
</list></t> | </li> | |||
</section> | </ol> | |||
</section> | ||||
<section title="Action on Timer Expiration" anchor="timer_act"> | <section anchor="timer_act" numbered="true" toc="default"> | |||
<name>Action on Timer Expiration</name> | ||||
<t>There are several timers that, upon expiration, trigger protocol | <t>There are several timers that, upon expiration, trigger protocol | |||
actions on an MLDv2 Multicast Address Listener node. All these | actions on an MLDv2 Multicast Address Listener node. All these | |||
actions are related to pending reports scheduled by the node. | actions are related to pending reports scheduled by the node. | |||
<list style="format %d." counter="my_cnt_2"> | </t> | |||
<ol group="my_cnt_2" spacing="normal" type="1"><li> | ||||
<t>If the expired timer is the Interface Timer (i.e., there is a | <t>If the expired timer is the Interface Timer (i.e., there is a | |||
pending response to a General Query), then one Current State | pending response to a General Query), then one Current State | |||
Record is sent for each multicast address for which the specified | Record is sent for each multicast address for which the specified | |||
interface has listening state, as described in <xref target="if_state" />. | interface has listening state, as described in <xref | |||
The | target="if_state" format="default"/>. The Current State Record | |||
Current State Record carries the multicast address and its | carries the multicast address and its associated filter mode | |||
associated filter mode (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and | (MODE_IS_INCLUDE or MODE_IS_EXCLUDE) and source list. Multiple | |||
Source list. Multiple Current State Records are packed into | Current State Records are packed into individual Report messages, | |||
individual Report messages, to the extent possible. | to the extent possible.</t> | |||
<vspace blankLines="1" /> | <t>This naive algorithm may result in bursts of packets when a | |||
This naive algorithm may result in bursts of packets when a node | node listens to a large number of multicast addresses. Instead of | |||
listens to a large number of multicast addresses. Instead of | using a single Interface Timer, implementations are recommended to | |||
using a single Interface Timer, implementations are recommended to | spread transmission of such Report messages over the interval (0, | |||
spread transmission of such Report messages over the interval (0, | [Maximum Response Delay]). Note that any such implementation | |||
[Maximum Response Delay]). Note that any such implementation MUST | <bcp14>MUST</bcp14> avoid the "ack-implosion" problem, i.e., | |||
avoid the "ack-implosion" problem, i.e., MUST NOT send a Report | <bcp14>MUST NOT</bcp14> send a Report immediately upon reception | |||
immediately upon reception of a General Query.</t> | of a General Query.</t> | |||
<t>If the expired timer is a Multicast Address Timer and the list of | </li> | |||
recorded sources for that multicast address is empty (i.e., there | <li> | |||
is a pending response to a Multicast Address Specific Query), then | <t>If the expired timer is a Multicast Address Timer and the list | |||
if, and only if, the interface has listening state for that | of recorded sources for that multicast address is empty (i.e., | |||
multicast address, a single Current State Record is sent for that | there is a pending response to a Multicast Address Specific | |||
address. The Current State Record carries the multicast address | Query), then if, and only if, the interface has listening state | |||
and its associated filter mode (MODE_IS_INCLUDE or | for that multicast address, a single Current State Record is sent | |||
MODE_IS_EXCLUDE) and source list, if any.</t> | for that address. The Current State Record carries the multicast | |||
<t>If the expired timer is a Multicast Address Timer and the list of | address and its associated filter mode (MODE_IS_INCLUDE or | |||
recorded sources for that multicast address is non-empty (i.e., | MODE_IS_EXCLUDE) and source list, if any.</t> | |||
there is a pending response to a Multicast Address and Source | </li> | |||
Specific Query), then if, and only if, the interface has listening | <li> | |||
state for that multicast address, the contents of the | <t>If the expired timer is a Multicast Address Timer and the list | |||
corresponding Current State Record are determined from the per- | of recorded sources for that multicast address is non-empty (i.e., | |||
interface state and the pending response record, as specified in | there is a pending response to a Multicast Address and Source | |||
<xref target="csr-info"/>.</t> | Specific Query), then if, and only if, the interface has listening | |||
</list></t> | state for that multicast address, the contents of the | |||
corresponding Current State Record are determined from the per- | ||||
<table title="Determining Contents of Current State Record" anchor="csr-info" | interface state and the pending response record, as specified in | |||
> | <xref target="csr-info" format="default"/>.</t> | |||
<tbody> | ||||
<tr><th align="center">Per-Interface State</th> | ||||
<th align="center">Set of Sources in the Pending Response Record</th> | ||||
<th align="center">Current State Record</th></tr> | ||||
<tr><td>INCLUDE (A)</td><td>B</td><td>IS_IN (A*B)</td></tr> | ||||
<tr><td>EXCLUDE (A)</td><td>B</td><td>IS_IN (B-A)</td></tr> | ||||
</tbody> | ||||
</table> | ||||
<t><list style="hanging"> | ||||
<t>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> | ||||
</list></t> | ||||
<t><list style="format %d." counter="my_cnt_2"> | <table align="left" anchor="csr-info"> | |||
<t>If the expired timer is a Retransmission Timer for a multicast | <name>Determining Contents of Current State Record</name> | |||
address (i.e., there is a pending State Change Report for that | <tbody> | |||
multicast address), the contents of the report are determined as | <tr> | |||
follows. If the report should contain a Filter Mode Change | <th>Per-Interface State</th> | |||
Record, i.e., the Filter Mode Retransmission Counter for that | <th>Set of Sources in the Pending Response Record</th> | |||
multicast address has a value higher than zero, then, if the | <th>Current State Record</th> | |||
current filter mode of the interface is INCLUDE, a TO_IN record is | </tr> | |||
included in the report; otherwise a TO_EX record is included. In | <tr> | |||
both cases, the Filter Mode Retransmission Counter for that | <td>INCLUDE (A)</td> | |||
multicast address is decremented by one unit after the | <td>B</td> | |||
transmission of the report. | <td>IS_IN (A*B)</td> | |||
<vspace blankLines="1" /> | </tr> | |||
If instead the report should contain Source List Change Records, | <tr> | |||
i.e., the Filter Mode Retransmission Counter for that multicast | <td>EXCLUDE (A)</td> | |||
address is zero, an ALLOW and a BLOCK record is included. The | <td>B</td> | |||
contents of these records are built according to <xref target="slcr | <td>IS_IN (B-A)</td> | |||
-info"/>.</t> | </tr> | |||
</list></t> | </tbody> | |||
</table> | ||||
<t>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> | ||||
<t>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>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"/>.</t> | ||||
<table title="Determining Contents of Source List Change Records" anchor=" | <table align="left" anchor="slcr-info"> | |||
slcr-info"> | <name>Determining Contents of Source List Change Records</name> | |||
<tbody> | <tbody> | |||
<tr><th align="center">Record</th> | <tr> | |||
<th align="center">Sources included</th></tr> | <th>Record</th> | |||
<tr><td>TO_IN</td><td>All in the current per-interface state that mu | <th>Sources Included</th> | |||
st be forwarded</td></tr> | </tr> | |||
<tr><td>TO_EX</td><td>All in the current per-interface state that mu | <tr> | |||
st be blocked</td></tr> | <td>TO_IN</td> | |||
<tr><td>ALLOW</td><td>All with retransmission state (i.e., all sourc | <td>All in the current per-interface state that must be forwarded. | |||
es from the | </td> | |||
</tr> | ||||
<tr> | ||||
<td>TO_EX</td> | ||||
<td>All in the current per-interface state that must be blocked.</ | ||||
td> | ||||
</tr> | ||||
<tr> | ||||
<td>ALLOW</td> | ||||
<td>All with retransmission state (i.e., all sources from the | ||||
Retransmission List) that must be forwarded. For each incl uded source, | Retransmission List) that must be forwarded. For each incl uded source, | |||
its Source Retransmission Counter is decreased with one uni t after the | its Source Retransmission Counter is decreased with one uni t after the | |||
transmission of the report. If the counter reaches zero, t he source is | transmission of the report. If the counter reaches zero, t he source is | |||
deleted from the Retransmission List for that multicast addre | deleted from the Retransmission List for that multicast addre | |||
ss.</td></tr> | ss.</td> | |||
<tr><td>BLOCK</td><td>All with retransmission state (i.e., all sourc | </tr> | |||
es from the | <tr> | |||
<td>BLOCK</td> | ||||
<td>All with retransmission state (i.e., all sources from the | ||||
Retransmission List) that must be blocked. For each includ ed source, | Retransmission List) that must be blocked. For each includ ed source, | |||
its Source Retransmission Counter is decreased with one uni t after the | its Source Retransmission Counter is decreased with one uni t after the | |||
transmission of the report. If the counter reaches zero, t he source is | transmission of the report. If the counter reaches zero, t he source is | |||
deleted from the Retransmission List for that multicast addre | deleted from the Retransmission List for that multicast addre | |||
ss.</td></tr> | ss.</td> | |||
</tbody> | </tr> | |||
</table> | </tbody> | |||
</table> | ||||
<t>If the computed source list for either an ALLOW or a BLOCK record | <t>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> | is empty, that record is omitted from the State Change Report.</t> | |||
</li> | ||||
</ol> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="mr_proto" numbered="true" toc="default"> | ||||
<section title="Description of the Protocol for Multicast Routers" anchor= | <name>Description of the Protocol for Multicast Routers</name> | |||
"mr_proto"> | <t>The purpose of MLD is to enable each multicast router to learn, for | |||
<t>The purpose of MLD is to enable each multicast router to learn, for | ||||
each of its directly attached links, which multicast addresses have | each of its directly attached links, which multicast addresses have | |||
listeners on that link. MLD version 2 adds the capability for a | listeners on that link. MLD version 2 adds the capability for a | |||
multicast router to also learn which sources have listeners among | multicast router to also learn which sources have listeners among | |||
the neighboring nodes, for packets sent to any particular multicast | the neighboring nodes, for packets sent to any particular multicast | |||
address. The information gathered by MLD is provided to whichever | address. The information gathered by MLD is provided to whichever | |||
multicast routing protocol is used by the router, in order to ensure | multicast routing protocol is used by the router, in order to ensure | |||
that multicast packets are delivered to all links where there are | that multicast packets are delivered to all links where there are | |||
interested listeners.</t> | interested listeners.</t> | |||
<t>This section describes the part of MLDv2 that is performed by | ||||
<t>This section describes the part of MLDv2 that is performed by | ||||
multicast routers. Multicast routers may themselves become multicast | multicast routers. Multicast routers may themselves become multicast | |||
address listeners, and therefore also perform the multicast listener | address listeners and therefore also perform the multicast listener | |||
part of MLDv2, described in <xref target="proto" />.</t> | part of MLDv2, as described in <xref target="proto" format="default"/> | |||
.</t> | ||||
<t>A multicast router performs the protocol described in this section | <t>A multicast router performs the protocol described in this section | |||
over each of its directly attached links. If a multicast router has | 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 | more than one interface to the same link, it only needs to operate | |||
this protocol over one of those interfaces.</t> | this protocol over one of those interfaces.</t> | |||
<t>For each interface over which the router operates the MLD protocol, | ||||
<t>For each interface over which the router operates the MLD protocol, | ||||
the router must configure that interface to listen to all link-layer | the router must configure that interface to listen to all link-layer | |||
multicast addresses that can be generated by IPv6 multicasts. For | multicast addresses that can be generated by IPv6 multicasts. For | |||
example, an Ethernet-attached router must set its Ethernet address | example, an Ethernet-attached router must set its Ethernet address | |||
reception filter to accept all Ethernet multicast addresses that | reception filter to accept all Ethernet multicast addresses that | |||
start with the hexadecimal value 3333 <xref target="RFC2464" />; in th e case of an | start with the hexadecimal value 3333 <xref target="RFC2464" format="d efault"/>; in the case of an | |||
Ethernet interface that does not support the filtering of such a | Ethernet interface that does not support the filtering of such a | |||
multicast address range, it must be configured to accept ALL Ethernet | multicast address range, it must be configured to accept ALL Ethernet | |||
multicast addresses, in order to meet the requirements of MLD.</t> | multicast addresses, in order to meet the requirements of MLD.</t> | |||
<t>On each interface over which this protocol is being run, the router | ||||
<t>On each interface over which this protocol is being run, the router | <bcp14>MUST</bcp14> enable reception of the link-scope "all MLDv2-capable rou | |||
MUST enable reception of the link-scope "all MLDv2-capable routers" | ters" | |||
multicast address from all sources, and MUST perform the multicast | multicast address from all sources and <bcp14>MUST</bcp14> perform the multic | |||
ast | ||||
address listener part of MLDv2 for that address on that interface.</t> | address listener part of MLDv2 for that address on that interface.</t> | |||
<t>Multicast routers only need to know that at least one node on an | ||||
<t>Multicast routers only need to know that at least one node on an | ||||
attached link listens to packets for a particular multicast address | attached link listens to packets for a particular multicast address | |||
from a particular source; a multicast router is not required to | from a particular source; a multicast router is not required to | |||
individually keep track of the interests of each neighboring node. | individually keep track of the interests of each neighboring node. | |||
(Nevertheless, see <xref target="host_suppress" /> item 1 for discussi | (Nevertheless, see <xref target="host_suppress" format="default"/>, it | |||
on.)</t> | em 1 for discussion.)</t> | |||
<t>MLDv2 is backward compatible with the MLDv1 protocol. For a detailed | ||||
<t>MLDv2 is backward compatible with the MLDv1 protocol. For a detailed | description of compatibility issues, see <xref target="interop" format | |||
description of compatibility issues see <xref target="interop" />.</t> | ="default"/>.</t> | |||
<section anchor="mld_qrys" numbered="true" toc="default"> | ||||
<section title="Conditions for MLD Queries" anchor="mld_qrys"> | <name>Conditions for MLD Queries</name> | |||
<t>The behavior of a router that implements the MLDv2 protocol depends | ||||
<t>The behavior of a router that implements the MLDv2 protocol depends | ||||
on whether there are several multicast routers on the same subnet, or | on whether there are several multicast routers on the same subnet, or | |||
not. If it is the case, a querier election mechanism (described in | not. If it is the case, a querier election mechanism (described in | |||
<xref target="elect" />) is used to elect a single multicast router to be in | <xref target="elect" format="default"/>) is used to elect a single mul ticast router to be in | |||
Querier state. All the multicast routers on the subnet listen to the | Querier state. All the multicast routers on the subnet listen to the | |||
messages sent by multicast address listeners, and maintain the same | messages sent by multicast address listeners, and maintain the same | |||
multicast listening information state, so that they can quickly and | multicast listening information state, so that they can quickly and | |||
correctly take over the querier functionality, should the present | correctly take over the querier functionality, should the present | |||
Querier fail. Nevertheless, it is only the Querier that sends | Querier fail. Nevertheless, it is only the Querier that sends | |||
periodical or triggered query messages on the subnet.</t> | periodical or triggered query messages on the subnet.</t> | |||
<t>The Querier periodically sends General Queries to request Multicast | ||||
<t>The Querier periodically sends General Queries to request Multicast | ||||
Address Listener information from an attached link. These queries | Address Listener information from an attached link. These queries | |||
are used to build and refresh the Multicast Address Listener state of | are used to build and refresh the Multicast Address Listener state of | |||
routers on attached links.</t> | routers on attached links.</t> | |||
<t>Nodes respond to these queries by reporting their Multicast Address | ||||
<t>Nodes respond to these queries by reporting their Multicast Address | ||||
Listening state (and set of sources they listen to) with Current | Listening state (and set of sources they listen to) with Current | |||
State Multicast Address Records in MLDv2 Multicast Listener Reports.</ t> | State Multicast Address Records in MLDv2 Multicast Listener Reports.</ t> | |||
<t>As a listener of a multicast address, a node may express interest in | ||||
<t>As a listener of a multicast address, a node may express interest in | ||||
listening or not listening to traffic from particular sources. As | listening or not listening to traffic from particular sources. As | |||
the desired listening state of a node changes, it reports these | the desired listening state of a node changes, it reports these | |||
changes using Filter Mode Change Records or Source List Change | changes using Filter Mode Change Records or Source List Change | |||
Records. These records indicate an explicit state change in a | Records. These records indicate an explicit state change in a | |||
multicast address at a node in either the Multicast Address Record's | multicast address at a node in either the Multicast Address Record's | |||
source list or its filter mode. When Multicast Address Listening is | source list or its filter mode. When Multicast Address Listening is | |||
terminated at a node or traffic from a particular source is no longer | terminated at a node or traffic from a particular source is no longer | |||
desired, the Querier must query for other listeners of the multicast | desired, the Querier must query for other listeners of the multicast | |||
address or of the source before deleting the multicast address (or | address or of the source before deleting the multicast address (or | |||
source) from its Multicast Address Listener state and pruning its | source) from its Multicast Address Listener state and pruning its | |||
traffic.</t> | traffic.</t> | |||
<t>To enable all nodes on a link to respond to changes in multicast | ||||
<t>To enable all nodes on a link to respond to changes in multicast | ||||
address listening, the Querier sends specific queries. A Multicast | address listening, the Querier sends specific queries. A Multicast | |||
Address Specific Query is sent to verify that there are no nodes that | Address Specific Query is sent to verify that there are no nodes that | |||
listen to the specified multicast address or to "rebuild" the | listen to the specified multicast address or to "rebuild" the | |||
listening state for a particular multicast address. Multicast | listening state for a particular multicast address. Multicast | |||
Address Specific Queries are sent when the Querier receives a State | Address Specific Queries are sent when the Querier receives a State | |||
Change Record indicating that a node ceases to listen to a multicast | 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 | 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 | a router from EXCLUDE to INCLUDE mode, in case a received State | |||
Change Record motivates this action.</t> | Change Record motivates this action.</t> | |||
<t>A Multicast Address and Source Specific Query is used to verify that | ||||
<t>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 | |||
there are no nodes on a link which listen to traffic from a specific | ||||
set of sources. Multicast Address and Source Specific Queries list | set of sources. Multicast Address and Source Specific Queries list | |||
sources for a particular multicast address which have been requested | sources for a particular multicast address that have been requested | |||
to no longer be forwarded. This query is sent by the Querier in | 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 | order to learn if any node listens to packets sent to the specified | |||
multicast address, from the specified source addresses. Multicast | multicast address, from the specified source addresses. Multicast | |||
Address and Source Specific Queries are only sent in response to | Address and Source Specific Queries are only sent in response to | |||
State Change Records and never in response to Current State Records. | State Change Records and never in response to Current State Records. | |||
<xref target="qry_vars" /> describes each query in more detail.</t> | <xref target="qry_vars" format="default"/> describes each query in mor | |||
</section> | e detail.</t> | |||
</section> | ||||
<section title="MLD State Maintained by Multicast Routers"> | <section numbered="true" toc="default"> | |||
<name>MLD State Maintained by Multicast Routers</name> | ||||
<t>Multicast routers that implement the MLDv2 protocol keep state per | <t>Multicast routers that implement the MLDv2 protocol keep state per | |||
multicast address per attached link. This multicast address state | multicast address per attached link. This multicast address state | |||
consists of a filter mode, a list of sources, and various timers. For | 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 | each attached link on which MLD runs, a multicast router records the | |||
listening state for that link. That state conceptually consists of a | listening state for that link. That state conceptually consists of a | |||
set of records of the form:</t> | set of records of the form:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | ||||
(IPv6 multicast address, Filter Timer, | (IPv6 multicast address, Filter Timer, | |||
Router Filter Mode, (source records) ) | Router Filter Mode, (source records) )]]></sourcecode> | |||
]]></artwork> | ||||
</figure> | ||||
<t>Each source record is of the form:</t> | <t>Each source record is of the form:</t> | |||
<figure> | <sourcecode name="" type=""><![CDATA[ | |||
<artwork><![CDATA[ | (IPv6 source address, source timer)]]></sourcecode> | |||
(IPv6 source address, source timer) | ||||
]]></artwork> | ||||
</figure> | ||||
<t>If all sources for a multicast address are listened to, an empty | <t>If all sources for a multicast address are listened to, an empty | |||
source record list is kept with the Router Filter Mode set to | source record list is kept with the Router Filter Mode set to | |||
EXCLUDE. This means that nodes on this link want all sources for | EXCLUDE. This means that nodes on this link want all sources for | |||
this multicast address to be forwarded. This is the MLDv2 equivalent | this multicast address to be forwarded. This is the MLDv2 equivalent | |||
of an MLDv1 listening state.</t> | of an MLDv1 listening state.</t> | |||
<section numbered="true" toc="default" anchor="def-router-filter-mode"> | ||||
<section title="Definition of Router Filter Mode"> | <name>Definition of Router Filter Mode</name> | |||
<t>To reduce internal state, MLDv2 routers keep a filter mode per | ||||
<t>To reduce internal state, MLDv2 routers keep a filter mode per | ||||
multicast address per attached link. This filter mode is used to | multicast address per attached link. This filter mode is used to | |||
summarize the total listening state of a multicast address to a | summarize the total listening state of a multicast address to a | |||
minimum set such that all nodes' listening states are respected. The | minimum set such that all nodes' listening states are respected. The | |||
filter mode may change in response to the reception of particular | filter mode may change in response to the reception of particular | |||
types of Multicast Address Records or when certain timer conditions | types of Multicast Address Records or when certain timer conditions | |||
occur. In the following sections, we use the term "Router Filter | occur. In the following sections, we use the term "Router Filter | |||
Mode" to refer to the filter mode of a particular multicast address | Mode" to refer to the filter mode of a particular multicast address | |||
within a router. <xref target="rcv_rpt" /> describes the changes of t he Router | within a router. <xref target="rcv_rpt" format="default"/> describes the changes of the Router | |||
Filter Mode per Multicast Address Record received.</t> | Filter Mode per Multicast Address Record received.</t> | |||
<t>A router is in INCLUDE mode for a specific multicast address on a | ||||
<t>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 | given interface if all the listeners on the link interested in that | |||
address are in INCLUDE mode. The router state is represented through | address are in INCLUDE mode. The router state is represented through | |||
the notation INCLUDE (A), where A is called the "Include List". The | 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 | 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 | link have requested to receive. All the sources from the Include | |||
List will be forwarded by the router. Any other source that is not | List will be forwarded by the router. Any other source that is not | |||
in the Include List will be blocked by the router.</t> | in the Include List will be blocked by the router.</t> | |||
<t>A router is in EXCLUDE mode for a specific multicast address on a | ||||
<t>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 | given interface if there is at least one listener in EXCLUDE mode | |||
interested in that address on the link. Conceptually, when a | interested in that address on the link. Conceptually, when a | |||
Multicast Address Record is received, the Router Filter Mode for that | Multicast Address Record is received, the Router Filter Mode for that | |||
multicast address is updated to cover all the requested sources using | multicast address is updated to cover all the requested sources using | |||
the least amount of state. As a rule, once a Multicast Address | the least amount of state. As a rule, once a Multicast Address | |||
Record with a filter mode of EXCLUDE is received, the Router Filter | Record with a filter mode of EXCLUDE is received, the Router Filter | |||
Mode for that multicast address will be set to EXCLUDE. Nevertheless, | Mode for that multicast address will be set to EXCLUDE. Nevertheless, | |||
if all nodes with a multicast address record having filter mode set | if all nodes with a multicast address record having filter mode set | |||
to EXCLUDE cease reporting, it is desirable for the Router Filter | to EXCLUDE cease reporting, it is desirable for the Router Filter | |||
Mode for that multicast address to transition back to INCLUDE mode. | Mode for that multicast address to transition back to INCLUDE mode. | |||
This transition occurs when the Filter Timer expires, and is | This transition occurs when the Filter Timer expires; see <xref target="rtr_m | |||
explained in detail in <xref target="rtr_mode" />.</t> | ode" format="default"/> for more details.</t> | |||
<t>When the router is in EXCLUDE mode, the router state is represented | ||||
<t>When the router is in EXCLUDE mode, the router state is represented | ||||
through the notation EXCLUDE (X,Y), where X is called the "Requested | through the notation EXCLUDE (X,Y), where X is called the "Requested | |||
List" and Y is called the "Exclude List". All sources, except those | List" and Y is called the "Exclude List". All sources, except those | |||
from the Exclude List, will be forwarded by the router. The | from the Exclude List, will be forwarded by the router. The | |||
Requested List has no effect on forwarding. Nevertheless, it has to | Requested List has no effect on forwarding. Nevertheless, it has to | |||
be maintained for several reasons, as explained in <xref target="src_t | be maintained for several reasons, as explained in <xref target="src_t | |||
imers" />.</t> | imers" format="default"/>.</t> | |||
<t>The exact handling of both the INCLUDE and EXCLUDE mode router stat | ||||
<t>The exact handling of both the INCLUDE and EXCLUDE mode router state, | e, | |||
according to the received reports, is presented in details in | according to the received reports, is presented in detail in Sections | |||
<xref target="curr_state_recs" /> and <xref target="fm_chg" />.</t> | <xref target="curr_state_recs" format="counter"/> and <xref target="fm_chg" f | |||
</section> | ormat="counter"/>.</t> | |||
</section> | ||||
<section title="Definition of Filter Timers"> | <section numbered="true" toc="default"> | |||
<name>Definition of Filter Timers</name> | ||||
<t>The Filter Timer is only used when the router is in EXCLUDE mode for | <t>The Filter Timer is only used when the router is in EXCLUDE mode fo | |||
r | ||||
a specific multicast address, and it represents the time for the | a specific multicast address, and it represents the time for the | |||
Router Filter Mode of the multicast address to expire and switch to | Router Filter Mode of the multicast address to expire and switch to | |||
INCLUDE mode. A Filter Timer is a decrementing timer with a lower | INCLUDE mode. A Filter Timer is a decrementing timer with a lower | |||
bound of zero. One Filter Timer exists per multicast address record. | bound of zero. One Filter Timer exists per multicast address record. | |||
Filter Timers are updated according to the types of Multicast Address | Filter Timers are updated according to the types of Multicast Address | |||
Records received.</t> | Records received.</t> | |||
<t>If a Filter Timer expires, with the Router Filter Mode for that | ||||
<t>If a Filter Timer expires, with the Router Filter Mode for that | ||||
multicast address being EXCLUDE, it means that there are no more | multicast address being EXCLUDE, it means that there are no more | |||
listeners in EXCLUDE mode on the attached link. At this point, the | listeners in EXCLUDE mode on the attached link. At this point, the | |||
router transitions to INCLUDE filter mode. <xref target="rtr_mode" /> descri bes the | router transitions to INCLUDE filter mode. <xref target="rtr_mode" format="d efault"/> describes the | |||
actions taken when a Filter Timer expires while in EXCLUDE mode.</t> | actions taken when a Filter Timer expires while in EXCLUDE mode.</t> | |||
<t keepWithNext="true"><xref target="FTM" format="default"/> summarize | ||||
<t keepWithNext='true'><xref target="FTM"/> summarizes the role of the Filter | s the role of the Filter Timer. | |||
Timer. | <xref target="rcv_rpt" format="default"/> describes the details of setting th | |||
<xref target="rcv_rpt" /> describes the details of setting the Filter Timer p | e Filter Timer per type of | |||
er type of | ||||
Multicast Address Record received.</t> | Multicast Address Record received.</t> | |||
<table align="left" anchor="FTM"> | ||||
<table title="Filter Timer Management" anchor="FTM"> | <name>Filter Timer Management</name> | |||
<tbody> | <tbody> | |||
<tr><th align="center">Router Filter Mode</th> | <tr> | |||
<th align="center">Filter Timer Value</th> | <th>Router Filter Mode</th> | |||
<th align="center">Actions/Comments</th></tr> | <th>Filter Timer Value</th> | |||
<tr><td>INCLUDE</td><td>Not Used</td><td>All listeners in INCLUDE mode.</ | <th>Actions/Comments</th> | |||
td></tr> | </tr> | |||
<tr><td>EXCLUDE</td><td>Timer > 0</td><td>At least one listener in EXCLUD | <tr> | |||
E mode.</td></tr> | <td>INCLUDE</td> | |||
<tr><td>EXCLUDE</td><td>Timer == 0</td><td>No more listeners in EXCLUDE m | <td>Not Used</td> | |||
ode for | <td>All listeners in INCLUDE mode.</td> | |||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE</td> | ||||
<td>Timer > 0</td> | ||||
<td>At least one listener in EXCLUDE mode.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE</td> | ||||
<td>Timer == 0</td> | ||||
<td>No more listeners in EXCLUDE mode for | ||||
the multicast address. If the Requested List is empty, delete | the multicast address. If the Requested List is empty, delete | |||
Multicast Address Record. If not, switch to INCLUDE filter mode; | Multicast Address Record. If not, switch to INCLUDE filter mode; | |||
the sources in the Requested List are moved to the Include List, | the sources in the Requested List are moved to the Include List, | |||
and the Exclude List is deleted.</td></tr> | and the Exclude List is deleted.</td> | |||
</tbody> | </tr> | |||
</table> | </tbody> | |||
</section> | </table> | |||
</section> | ||||
<section title="Definition of Source Timers" anchor="src_timers"> | <section anchor="src_timers" numbered="true" toc="default"> | |||
<name>Definition of Source Timers</name> | ||||
<t>A Source Timer is a decrementing timer with a lower bound of zero. | <t>A Source Timer is a decrementing timer with a lower bound of zero. | |||
One Source Timer is kept per source record. Source timers are | One Source Timer is kept per source record. Source timers are | |||
updated according to the type and filter mode of the Multicast | updated according to the type and filter mode of the Multicast | |||
Address Record received. <xref target="rcv_rpt" /> describes the sett ing of source | Address Record received. <xref target="rcv_rpt" format="default"/> de scribes the setting of source | |||
timers per type of Multicast Address Records received.</t> | timers per type of Multicast Address Records received.</t> | |||
<t>In the following, abbreviations are used for several variables (all | ||||
<t>In the following, abbreviations are used for several variables (all | of which are described in detail in <xref target="timers" format="defa | |||
of which are described in detail in <xref target="timers" />). The va | ult"/>). The variable MALI | |||
riable MALI | ||||
stands for the Multicast Address Listening Interval, which is the | stands for the Multicast Address Listening Interval, which is the | |||
time in which multicast address listening state will time out. The | time in which multicast address listening state will time out. The | |||
variable LLQT is the Last Listener Query Time, which is the total | 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 | time the router should wait for a report, after the Querier has sent | |||
the first query. During this time, the Querier should send [Last | the first query. During this time, the Querier should send [Last | |||
Member Query Count]-1 retransmissions of the query. LLQT represents | Member Query Count]-1 retransmissions of the query. LLQT represents | |||
the "leave latency", or the difference between the transmission of a | the "leave latency" or the difference between the transmission of a | |||
listener state change and the modification of the information passed | listener state change and the modification of the information passed | |||
to the routing protocol.</t> | to the routing protocol.</t> | |||
<t>If the router is in INCLUDE filter mode, a source can be added to t | ||||
<t>If the router is in INCLUDE filter mode, a source can be added to the | he | |||
current Include List if a listener in INCLUDE mode sends a Current | current Include List if a listener in INCLUDE mode sends a Current | |||
State or a State Change Report which includes that source. Each | State or a State Change Report that includes that source. Each | |||
source from the Include List is associated with a source timer that | source from the Include List is associated with a source timer that | |||
is updated whenever a listener in INCLUDE mode sends a report 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 | confirms its interest in that specific source. If the timer of a | |||
source from the Include List expires, the source is deleted from the | source from the Include List expires, the source is deleted from the | |||
Include List. If there are no more source records left, the | Include List. If there are no more source records left, the | |||
multicast address record is deleted from the router.</t> | multicast address record is deleted from the router.</t> | |||
<t>Besides this "soft leave" mechanism, there is also a "fast leave" | ||||
<t>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 | 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 | a node in INCLUDE mode expresses its desire to stop listening to a | |||
specific source, all the multicast routers on the link lower their | specific source, all the multicast routers on the link lower their | |||
timer for that source to a small interval of LLQT milliseconds. The | timer for that source to a small interval of LLQT milliseconds. The | |||
Querier then sends then a Multicast Address and Source Specific | Querier then sends then a Multicast Address and Source Specific | |||
Query, to verify whether there are other listeners for that source on | Query, to verify whether there are other listeners for that source on | |||
the link, or not. If a corresponding report is received before the | the link, or not. If a corresponding report is received before the | |||
timer expires, all the multicast routers on the link update their | timer expires, all the multicast routers on the link update their | |||
source timer. If not, the source is deleted from the Include List. | source timer. If not, the source is deleted from the Include List. | |||
The handling of the Include List, according to the received reports, | The handling of the Include List, according to the received reports, | |||
is detailed in <xref target="curr_state_recs" /> and <xref target="fm_ | is detailed in Sections <xref target="curr_state_recs" format="counter | |||
chg" />.</t> | "/> and <xref target="fm_chg" format="counter"/>.</t> | |||
<t>Source timers are treated differently when the Router Filter Mode f | ||||
<t>Source timers are treated differently when the Router Filter Mode for | or | |||
a multicast address is EXCLUDE. For sources from the Requested List | a multicast address is EXCLUDE. For sources from the Requested List, | |||
the source timers have running values; these sources are forwarded by | the source timers have running values; these sources are forwarded by | |||
the router. For sources from the Exclude List the source timers are | 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 | 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 | of a source from the Requested List expires, the source is moved to | |||
the Exclude List. The router informs then the routing protocol that | the Exclude List. Then, the router informs the routing protocol that | |||
there is no longer a listener on the link interested in traffic from | there is no longer a listener on the link interested in traffic from | |||
this source.</t> | this source.</t> | |||
<t>The router has to maintain the Requested List for two reasons: | ||||
</t> | ||||
<ol type="1" spacing="normal"> | ||||
<li> | ||||
<t>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>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. Th | ||||
ese | ||||
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"/> and <xref | ||||
target="fm_chg" format="counter"/>) 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"/>.</t> | ||||
</li> | ||||
<li> | ||||
<t>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>The router has to maintain the Requested List for two reasons: | <t>The handling of the EXCLUDE mode router state, according to the | |||
<list style="bullets"> | received reports, is detailed in Sections <xref | |||
<t>To keep track of sources that listeners in INCLUDE mode listen to. | target="curr_state_recs" format="counter"/> and <xref | |||
This is necessary in order to assure a seamless transition of the | target="fm_chg" format="counter"/>.</t> | |||
router to INCLUDE mode, when there will be no listener in EXCLUDE | <t>When the Router Filter Mode for a multicast address is EXCLUDE, | |||
mode left. This transition should not interrupt the flow of | source records are only deleted when the Filter Timer expires or | |||
traffic to the listeners in INCLUDE mode still interested in that | when newly received Multicast Address Records modify the source | |||
multicast address. Therefore, at the moment of the transition, | record list of the router.</t> | |||
the Requested List should represent the set of sources that nodes | </section> | |||
in INCLUDE mode have explicitly requested. | </section> | |||
<vspace blankLines="1" /> | <section numbered="true" toc="default"> | |||
When the router switches to INCLUDE mode, the sources in the | <name>MLDv2 Source-Specific Forwarding Rules</name> | |||
Requested List are moved to the Include List, and the Exclude List | <t>When a multicast router receives a datagram from a source destined to | |||
is deleted. Before the switch, the Requested List can contain an | ||||
inexact guess at the sources that listeners in INCLUDE mode listen | ||||
to - 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 <xref target="curr_state_recs" /> and <xref target="fm_chg" / | ||||
>) 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_swit | ||||
ch" />.</t> | ||||
<t>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> | ||||
</list></t> | ||||
<t>The handling of the EXCLUDE mode router state, according to the | ||||
received reports, is detailed in <xref target="curr_state_recs" /> and | ||||
<xref target="fm_chg" />.</t> | ||||
<t>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 title="MLDv2 Source Specific Forwarding Rules"> | ||||
<t>When a multicast router receives a datagram from a source destined to | ||||
a particular multicast address, a decision has to be made whether to | a particular multicast address, a decision has to be made whether to | |||
forward the datagram on an attached link or not. The multicast | forward the datagram on an attached link or not. The multicast | |||
routing protocol in use is in charge of this decision, and should use | routing protocol in use is in charge of this decision and should use | |||
the MLDv2 information to ensure that all sources/multicast addresses | the MLDv2 information to ensure that all sources/multicast addresses | |||
that have listeners on a link are forwarded to that link. MLDv2 | that have listeners on a link are forwarded to that link. MLDv2 | |||
information does not override multicast routing information; for | information does not override multicast routing information; for | |||
example, if the MLDv2 filter mode for a multicast address is EXCLUDE, | example, if the MLDv2 filter mode for a multicast address is EXCLUDE, | |||
a router may still forward packets for excluded sources to a transit | a router may still forward packets for excluded sources to a transit | |||
link.</t> | link.</t> | |||
<t>To summarize, <xref target="MLDv2_forwarding_suggestions"/> below des | ||||
<t>To summarize, the following table describes the forwarding | cribes the forwarding | |||
suggestions made by MLDv2 to the routing protocol for traffic | suggestions made by MLDv2 to the routing protocol for traffic | |||
originating from a source destined to a multicast address. It also | originating from a source destined to a multicast address. It also | |||
summarizes the actions taken upon the expiration of a source timer | summarizes the actions taken upon the expiration of a source timer | |||
based on the Router Filter Mode of the multicast address.</t> | based on the Router Filter Mode of the multicast address.</t> | |||
<table> | <!--[rfced] Tables 6 and 9 do not have titles; would you like to add | |||
<tbody> | them? If so, please provide the desired text. | |||
<tr><th align="center">Router Filter Mode</th> | --> | |||
<th align="center">Source Timer Value</th> | ||||
<th align="center">Action</th></tr> | ||||
<!-- Are we missing an INCLUDE mode where no source elements a | ||||
re present? --> | ||||
<tr><td>INCLUDE</td><td>TIMER > 0</td><td>Suggest to forward traffic fr | ||||
om source</td></tr> | ||||
<tr><td>INCLUDE</td><td>TIMER == 0</td><td>Suggest to stop forwarding tr | ||||
affic from | ||||
source and remove source record. If there are no more source | ||||
records, | ||||
delete multicast address record</td></tr> | ||||
<tr><td>EXCLUDE</td><td>TIMER > 0</td><td>Suggest to forward traffic fro | ||||
m source</td></tr> | ||||
<tr><td>EXCLUDE</td><td>TIMER == 0</td><td>Suggest to not forward traffi | ||||
c from source. | ||||
Move the source from the Requested List to the Exclude | ||||
List (DO NOT remove source record)</td></tr> | ||||
<tr><td>EXCLUDE</td><td>No Source Element</td><td>Suggest to forward tra | ||||
ffic from all sources</td></tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section title="Action on Reception of Reports" anchor="rcv_rpt"> | <!--[rfced] Has the following comment been addressed by the authors? | |||
Please see Table 6 (Section 7.3). | ||||
<t>Upon reception of an MLD message that contains a Report, the router | Author comment in the XML: | |||
Are we missing an INCLUDE mode where no source elements are present? | ||||
--> | ||||
<table align="left" anchor="MLDv2_forwarding_suggestions"> | ||||
<tbody> | ||||
<tr> | ||||
<th>Router Filter Mode</th> | ||||
<th>Source Timer Value</th> | ||||
<th>Action</th> | ||||
</tr> | ||||
<!-- Are we missing an INCLUDE mode where no source elements are pre | ||||
sent? --> | ||||
<tr> | ||||
<td>INCLUDE</td> | ||||
<td>TIMER > 0</td> | ||||
<td>Suggest to forward traffic from source.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>INCLUDE</td> | ||||
<td>TIMER == 0</td> | ||||
<td>Suggest to stop forwarding traffic from | ||||
source and remove the source record. If there are no more sou | ||||
rce records, | ||||
delete the multicast address record.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE</td> | ||||
<td>TIMER > 0</td> | ||||
<td>Suggest to forward traffic from source.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE</td> | ||||
<td>TIMER == 0</td> | ||||
<td>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>EXCLUDE</td> | ||||
<td>No Source Element</td> | ||||
<td>Suggest to forward traffic from all sources.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="rcv_rpt" numbered="true" toc="default"> | ||||
<name>Action on Reception of Reports</name> | ||||
<t>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 | 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 | 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 | is present in the Hop-by-Hop Options header of the IPv6 packet. If | |||
any of these checks fails, the packet is dropped. If the validity of | 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> | the MLD message is verified, the router starts to process the Report.</t> | |||
<t>SSM-aware routers <bcp14>SHOULD</bcp14> ignore records that contain m | ||||
<t>SSM-aware routers SHOULD ignore records that contain multicast addresses | ulticast addresses | |||
in the SSM address range if the record type is MODE_IS_EXCLUDE or | in the SSM address range if the record type is MODE_IS_EXCLUDE or | |||
CHANGE_TO_EXCLUDE_MODE. SSM-aware routers SHOULD ignore MLDv1 Report and DONE | CHANGE_TO_EXCLUDE_MODE. SSM-aware routers <bcp14>SHOULD</bcp14> ignore MLDv1 Report and DONE | |||
messages that | messages that | |||
contain multicast addresses in the SSM address range, SHOULD NOT use | contain multicast addresses in the SSM address range, <bcp14>SHOULD NOT</bcp1 | |||
such Reports to establish IP forwarding state, and MAY log an error if it | 4> use | |||
such Reports to establish IP forwarding state, and <bcp14>MAY</bcp14> log an | ||||
error if it | ||||
receives such a message.</t> | receives such a message.</t> | |||
<section anchor="curr_state_recs" numbered="true" toc="default"> | ||||
<section title="Reception of Current State Records" anchor="curr_state_recs"> | <name>Reception of Current State Records</name> | |||
<t>When receiving Current State Records, a router updates both its | ||||
<t>When receiving Current State Records, a router updates both its | ||||
Filter Timer and its source timers. In some circumstances, the | Filter Timer and its source timers. In some circumstances, the | |||
reception of a type of multicast address record will cause the Router | reception of a type of multicast address record will cause the Router | |||
Filter Mode for that multicast address to change. <xref target="rcvd-csr"/> | Filter Mode for that multicast address to change. <xref target="rcvd-csr" fo rmat="default"/> | |||
describes the actions, with respect to state and timers, that occur | describes the actions, with respect to state and timers, that occur | |||
to a router's state upon reception of Current State Records.</t> | to a router's state upon reception of Current State Records.</t> | |||
<t>If the router is in INCLUDE filter mode for a multicast address, we | ||||
<t>If the router is in INCLUDE filter mode for a multicast address, we | ||||
will use the notation INCLUDE (A), where A denotes the associated | will use the notation INCLUDE (A), where A denotes the associated | |||
Include List. If the router is in EXCLUDE filter mode for a | Include List. If the router is in EXCLUDE filter mode for a | |||
multicast address, we will use the notation EXCLUDE (X,Y), where X | multicast address, we will use the notation EXCLUDE (X,Y), where X | |||
and Y denote the associated Requested List and Exclude List | and Y denote the associated Requested List and Exclude List, | |||
respectively.</t> | respectively.</t> | |||
<t>Within the "Actions" section of the router state tables, we use the | ||||
<t>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 | |||
notation '(A)=J', which means that the set A of source records should | have their source timers set to value J. 'Delete (A)' means that | |||
have their source timers set to value J. 'Delete (A)' means that the | set A of the source records should be deleted. 'Filter Timer = J' means | |||
set A of source records should be deleted. 'Filter Timer = J' means | ||||
that the Filter Timer for the multicast address should be set to | that the Filter Timer for the multicast address should be set to | |||
value J.</t> | value J.</t> | |||
<table align="left" anchor="rcvd-csr"> | ||||
<table title="Actions for Received Current State Records" anchor="rcvd-csr"> | <name>Actions for Received Current State Records</name> | |||
<tbody> | <tbody> | |||
<tr><th align="center">Router State</th> | <tr> | |||
<th align="center">Report Received</th> | <th>Router State</th> | |||
<th align="center">New Router State</th> | <th>Report Received</th> | |||
<th align="center">Actions</th></tr> | <th>New Router State</th> | |||
<tr><td>INCLUDE (A)</td> | <th>Actions</th> | |||
<td>IS_IN (B)</td> | </tr> | |||
<td>INCLUDE (A+B)</td> | <tr> | |||
<td>(B)=MALI</td></tr> | <td>INCLUDE (A)</td> | |||
<tr><td>INCLUDE (A)</td> | <td>IS_IN (B)</td> | |||
<td>IS_EX (B)</td> | <td>INCLUDE (A+B)</td> | |||
<td>EXCLUDE (A*B, B-A)</td> | <td>(B)=MALI</td> | |||
<td><ul empty="true" bare="true"> | </tr> | |||
<li>(B-A)=0</li> | <tr> | |||
<li>Delete (A-B)</li> | <td>INCLUDE (A)</td> | |||
<li>Filter Timer=MALI</li></ul></td></tr> | <td>IS_EX (B)</td> | |||
<tr><td>EXCLUDE (X,Y)</td> | <td>EXCLUDE (A*B, B-A)</td> | |||
<td>IS_IN (A)</td> | <td> | |||
<td>EXCLUDE (X+A, Y-A)</td> | <ul empty="true" bare="true"> | |||
<td>(A)=MALI</td></tr> | <li>(B-A)=0</li> | |||
<tr><td>EXCLUDE (X,Y)</td> | <li>Delete (A-B)</li> | |||
<td>IS_EX (A)</td> | <li>Filter Timer=MALI</li> | |||
<td>EXCLUDE (A-Y, Y*A)</td> | </ul> | |||
<td><ul empty="true" bare="true"> | </td> | |||
<li>(A-X-Y)=MALI</li> | </tr> | |||
<li>Delete (X-A)</li> | <tr> | |||
<li>Delete (Y-A)</li> | <td>EXCLUDE (X,Y)</td> | |||
<li>Filter Timer=MALI</li></ul></td></tr> | <td>IS_IN (A)</td> | |||
</tbody> | <td>EXCLUDE (X+A, Y-A)</td> | |||
</table> | <td>(A)=MALI</td> | |||
</section> | </tr> | |||
<tr> | ||||
<section title="Reception of Filter Mode Change and Source List Change Record | <td>EXCLUDE (X,Y)</td> | |||
s" anchor="fm_chg"> | <td>IS_EX (A)</td> | |||
<td>EXCLUDE (A-Y, Y*A)</td> | ||||
<t>When a change in the global state of a multicast address occurs in a | <td> | |||
<ul empty="true" bare="true"> | ||||
<li>(A-X-Y)=MALI</li> | ||||
<li>Delete (X-A)</li> | ||||
<li>Delete (Y-A)</li> | ||||
<li>Filter Timer=MALI</li> | ||||
</ul> | ||||
</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section anchor="fm_chg" numbered="true" toc="default"> | ||||
<name>Reception of Filter Mode Change and Source List Change Records</ | ||||
name> | ||||
<t>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 | node, the node sends either a Source List Change Record or a Filter | |||
Mode Change Record for that multicast address. As with Current State | Mode Change Record for that multicast address. As with Current State | |||
Records, routers must act upon these records and possibly change | Records, routers must act upon these records and possibly change | |||
their own state to reflect the new listening state of the link.</t> | their own state to reflect the new listening state of the link.</t> | |||
<t>The Querier must query sources or multicast addresses that are | ||||
<t>The Querier must query sources or multicast addresses that are | ||||
requested to be no longer forwarded. When a router queries or | requested to be no longer forwarded. When a router queries or | |||
receives a query for a specific set of sources, it lowers its source | 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 | timers for those sources to a small interval of Last Listener Query | |||
Time milliseconds. If multicast address records are received in | Time milliseconds. If multicast address records are received in | |||
response to the queries which express interest in listening the | response to the queries that express interest in listening to the | |||
queried sources, the corresponding timers are updated.</t> | queried sources, the corresponding timers are updated.</t> | |||
<t>Multicast Address Specific queries can also be used in order to | ||||
<t>Multicast Address Specific queries can also be used in order to | ||||
enable a fast transition of a router from EXCLUDE to INCLUDE mode, in | enable a fast transition of a router from EXCLUDE to INCLUDE mode, in | |||
case a received Multicast Address Record motivates this action. The | case a received Multicast Address Record motivates this action. The | |||
Filter Timer for that multicast address is lowered to a small | Filter Timer for that multicast address is lowered to a small | |||
interval of Last Listener Query Time milliseconds. If any multicast | interval of Last Listener Query Time milliseconds. If any multicast | |||
address records that express EXCLUDE mode interest in the multicast | address records that express EXCLUDE mode interest in the multicast | |||
address are received within this interval, the Filter Timer is | address are received within this interval, the Filter Timer is | |||
updated and the suggestion to the routing protocol to forward the | updated and the suggestion to the routing protocol to forward the | |||
multicast address stands without any interruption. If not, the | multicast address stands without any interruption. If not, the | |||
router will switch to INCLUDE filter mode for that multicast address.< /t> | router will switch to INCLUDE filter mode for that multicast address.< /t> | |||
<t>During the query period (i.e., Last Listener Query Time millisecond | ||||
<t>During the query period (i.e., Last Listener Query Time milliseconds) | s), | |||
the MLD component in the router continues to suggest to the routing | the MLD component in the router continues to suggest to the routing | |||
protocol to forward traffic from the multicast addresses or sources | protocol to forward traffic from the multicast addresses or sources | |||
that are queried. It is not until after Last Listener Query Time | that are queried. | |||
<!--[rfced] The following sentence is hard to read. May we add "and" | ||||
and two commas for easier readability as shown below? | ||||
Original: | ||||
It is not until after the Last Listener Query Time milliseconds | ||||
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. | ||||
Perhaps: | ||||
It is not until after the 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. | ||||
--> | ||||
It is not until after Last Listener Query Time | ||||
milliseconds without receiving a record that expresses interest in | milliseconds without receiving a record that expresses interest in | |||
the queried multicast address or sources that the router may prune | the queried multicast address or sources that the router may prune | |||
the multicast address or sources from the link.</t> | the multicast address or sources from the link.</t> | |||
<t><xref target="mr-state-trans" format="default"/> describes the chan | ||||
<t><xref target="mr-state-trans"/> describes the changes in multicast address | ges in multicast address state | |||
state | ||||
and the action(s) taken when receiving either Filter Mode Change or | and the action(s) taken when receiving either Filter Mode Change or | |||
Source List Change Records. <xref target="mr-state-trans"/> also describes t | Source List Change Records. <xref target="mr-state-trans" format="default"/> | |||
he queries | also describes the queries | |||
which are sent by the Querier when a particular report is received.</t | that are sent by the Querier when a particular report is received.</t> | |||
> | <t>We use the following notation to describe the queries that are | |||
<t>We use the following notation for describing the queries that are | ||||
sent. We use the notation 'Q(MA)' to describe a Multicast Address | sent. We use the notation 'Q(MA)' to describe a Multicast Address | |||
Specific Query to the MA multicast address. We use the notation | Specific Query to the MA multicast address. We use the notation | |||
'Q(MA,A)' to describe a Multicast Address and Source Specific Query | '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 | 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 | null as a result of the action (e.g. A*B), then no query is sent as a | |||
result of the operation.</t> | result of the operation.</t> | |||
<t>In order to maintain protocol robustness, queries defined in the | ||||
<t>In order to maintain protocol robustness, queries defined in the | Actions column of <xref target="mr-state-trans" format="default"/> need to be | |||
Actions column of <xref target="mr-state-trans"/> need to be transmitted [Las | transmitted [Last | |||
t | ||||
Listener Query Count] times, once every [Last Listener Query | Listener Query Count] times, once every [Last Listener Query | |||
Interval] period.</t> | Interval] period.</t> | |||
<t>If while scheduling new queries there are already pending queries t | ||||
<t>If while scheduling new queries, there are already pending queries to | o | |||
be retransmitted for the same multicast address, the new and pending | be retransmitted for the same multicast address, the new and pending | |||
queries have to be merged. In addition, received host reports for a | queries have to be merged. In addition, received host reports for a | |||
multicast address with pending queries may affect the contents of | multicast address with pending queries may affect the contents of | |||
those queries. <xref target="spec_qry" /> describes the process of bu ilding and | those queries. <xref target="spec_qry" format="default"/> describes t he process of building and | |||
maintaining the state of pending queries.</t> | maintaining the state of pending queries.</t> | |||
<table align="left" anchor="mr-state-trans"> | ||||
<table title="Multicast Router State Transitions" anchor="mr-state-trans"> | <name>Multicast Router State Transitions</name> | |||
<tbody> | <tbody> | |||
<tr><th align="center">Router State</th> | <tr> | |||
<th align="center">Report Received</th> | <th>Router State</th> | |||
<th align="center">New Router State</th> | <th>Report Received</th> | |||
<th align="center">Actions</th></tr> | <th>New Router State</th> | |||
<tr><td>INCLUDE (A)</td><td>ALLOW (B)</td><td>INCLUDE(A+B)</td><td>(B)= | <th>Actions</th> | |||
MALI</td></tr> | </tr> | |||
<tr><td>INCLUDE (A)</td><td>BLOCK (B)</td><td>INCLUDE(A)</td><td>Send Q( | <tr> | |||
MA,A*B)</td></tr> | <td>INCLUDE (A)</td> | |||
<tr><td>INCLUDE (A)</td><td>TO_EX (B)</td><td>EXCLUDE(A*B,B-A)</td><td>( | <td>ALLOW (B)</td> | |||
B-A)=0, Delete (A-B), Send Q(MA,A*B), Filter Timer=MALI</td></tr> | <td>INCLUDE(A+B)</td> | |||
<tr><td>INCLUDE (A)</td><td>TO_IN (B)</td><td>INCLUDE(A+B)</td><td>(B)=M | <td>(B)=MALI</td> | |||
ALI, Send Q(MA,A-B)</td></tr> | </tr> | |||
<tr><td>EXCLUDE (X,Y)</td><td>ALLOW (A)</td><td>EXCLUDE(X+A,Y-A)</td><td | <tr> | |||
>(A)=MALI</td></tr> | <td>INCLUDE (A)</td> | |||
<tr><td>EXCLUDE (X,Y)</td><td>BLOCK (A)</td><td>EXCLUDE(X+(A-Y),Y)</td>< | <td>BLOCK (B)</td> | |||
td>(A-X-Y)=Filter Timer, Send Q(MA,A-Y)</td></tr> | <td>INCLUDE(A)</td> | |||
<tr><td>EXCLUDE (X,Y)</td><td>TO_EX (A)</td><td>EXCLUDE(A-Y,Y*A)</td><td | <td>Send Q(MA,A*B)</td> | |||
>(A-X-Y)=Filter Timer, Delete (X-A), Delete (Y-A), Send Q(MA,A-Y), Filter Timer= | </tr> | |||
MALI</td></tr> | <tr> | |||
<tr><td>EXCLUDE (X,Y)</td><td>TO_IN (A)</td><td>EXCLUDE(X+A,Y-A)</td><td | <td>INCLUDE (A)</td> | |||
>(A)=MALI, Send Q(MA,X-A), Send Q(MA)</td></tr> | <td>TO_EX (B)</td> | |||
</tbody> | <td>EXCLUDE(A*B,B-A)</td> | |||
</table> | <td>(B-A)=0, Delete (A-B), Send Q(MA,A*B), Filter Timer=MALI</td | |||
</section> | > | |||
</section> | </tr> | |||
<tr> | ||||
<section title="Switching Router Filter Modes" anchor="rtr_mode"> | <td>INCLUDE (A)</td> | |||
<td>TO_IN (B)</td> | ||||
<t>The Filter Timer is used as a mechanism for transitioning the Router | <td>INCLUDE(A+B)</td> | |||
<td>(B)=MALI, Send Q(MA,A-B)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>ALLOW (A)</td> | ||||
<td>EXCLUDE(X+A,Y-A)</td> | ||||
<td>(A)=MALI</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>BLOCK (A)</td> | ||||
<td>EXCLUDE(X+(A-Y),Y)</td> | ||||
<td>(A-X-Y)=Filter Timer, Send Q(MA,A-Y)</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>TO_EX (A)</td> | ||||
<td>EXCLUDE(A-Y,Y*A)</td> | ||||
<td>(A-X-Y)=Filter Timer, Delete (X-A), Delete (Y-A), Send Q(MA, | ||||
A-Y), Filter Timer=MALI</td> | ||||
</tr> | ||||
<tr> | ||||
<td>EXCLUDE (X,Y)</td> | ||||
<td>TO_IN (A)</td> | ||||
<td>EXCLUDE(X+A,Y-A)</td> | ||||
<td>(A)=MALI, Send Q(MA,X-A), Send Q(MA)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
</section> | ||||
<section anchor="rtr_mode" numbered="true" toc="default"> | ||||
<name>Switching Router Filter Modes</name> | ||||
<t>The Filter Timer is used as a mechanism for transitioning the Router | ||||
Filter Mode from EXCLUDE to INCLUDE.</t> | Filter Mode from EXCLUDE to INCLUDE.</t> | |||
<t>When a Filter Timer expires with a Router Filter Mode of EXCLUDE, a | ||||
<t>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 | router assumes that there are no nodes with a filter mode of | |||
EXCLUDE present on the attached link. Thus, the router transitions | EXCLUDE present on the attached link. Thus, the router transitions | |||
to INCLUDE filter mode for the multicast address.</t> | to INCLUDE filter mode for the multicast address.</t> | |||
<t>A router uses the sources from the Requested List as its state for | ||||
<t>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 | 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 moved in the Include List, while sources from the Exclude | |||
List are deleted. For example, if a router's state for a multicast | 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 | address is EXCLUDE(X,Y) and the Filter Timer expires for that | |||
multicast address, the router switches to filter mode of INCLUDE with | multicast address, the router switches to filter mode of INCLUDE with | |||
state INCLUDE(X). If at the moment of the switch the Requested List | state INCLUDE(X). If at the moment of the switch the Requested List | |||
(X) is empty, the multicast address record is deleted from the | (X) is empty, the multicast address record is deleted from the | |||
router.</t> | router.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Action on Reception of Queries"> | <name>Action on Reception of Queries</name> | |||
<t>Upon reception of an MLD message that contains a Query, the router | ||||
<t>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 | 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 | 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 | is present in the Hop-by-Hop Options header of the IPv6 packet. If | |||
any of these checks fails, the packet is dropped.</t> | any of these checks fail, the packet is dropped.</t> | |||
<t>If the validity of the MLD message is verified, the router starts to | ||||
<t>If the validity of the MLD message is verified, the router starts to | ||||
process the Query.</t> | process the Query.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Timer Updates"> | <name>Timer Updates</name> | |||
<t>MLDv2 uses the S flag to ensure | ||||
<t>MLDv2 uses the Suppress Router-Side Processing flag to ensure | robustness, as explained in <xref target="build_state" format="default | |||
robustness, as explained in <xref target="build_state" />. When a rou | "/>. When a router sends or | |||
ter sends or | receives a query with a clear S flag, | |||
receives a query with a clear Suppress Router-Side Processing flag, | ||||
it must update its timers to reflect the correct timeout values for | it must update its timers to reflect the correct timeout values for | |||
the multicast address or sources being queried. The following table | the multicast address or sources being queried. The following table | |||
describes the timer actions when sending or receiving a Multicast | describes the timer actions when sending or receiving a Multicast | |||
Address Specific or Multicast Address and Source Specific Query with | Address Specific or Multicast Address and Source Specific Query with | |||
the Suppress Router-Side Processing flag not set.</t> | the S flag not set.</t> | |||
<figure> | ||||
<artwork><![CDATA[ | ||||
Query Action | ||||
Q(MA,A) Source Timers for sources in A are lowered to LLQT | ||||
Q(MA) Filter Timer is lowered to LLQT | ||||
]]></artwork> | ||||
</figure> | ||||
<t>When a router sends or receives a query with the Suppress Router-Side | ||||
Processing flag set, it will not update its timers.</t> | ||||
</section> | ||||
<section title="Querier Election" anchor="elect"> | ||||
<t>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 <xref target=" | ||||
start_qry_int" /> | ||||
and <xref target="start_qry_cnt" /> for details).</t> | ||||
<t>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 | ||||
Timeout; 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>All MLDv2 queries MUST 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 title="Building and Sending Specific Queries" anchor="spec_qry"> | ||||
<section title="Building and Sending Multicast Address Specific Queries"> | <table align="left"> | |||
<thead> | ||||
<tr> | ||||
<th>Query</th> | ||||
<th>Action</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td>Q(MA,A)</td> | ||||
<td>Source Timers for sources in A are lowered to LLQT.</td> | ||||
</tr> | ||||
<tr> | ||||
<td>Q(MA)</td> | ||||
<td>The Filter Timer is lowered to LLQT.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>When a table action "Send Q(MA)" is encountered, the Filter Timer | <t>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="default"> | ||||
<name>Querier Election</name> | ||||
<t>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"/> and | ||||
<xref target="start_qry_cnt" format="counter"/> for details).</t> | ||||
<t>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 Timeout; 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>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="default"> | ||||
<name>Building and Sending Specific Queries</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>Building and Sending Multicast Address Specific Queries</name> | ||||
<t>When a table action "Send Q(MA)" is encountered, the Filter Timer | ||||
must be lowered to LLQT. The Querier must then immediately send a | must be lowered to LLQT. The Querier must then immediately send a | |||
Multicast Address Specific query as well as schedule [Last Listener | Multicast Address Specific Query as well as schedule [Last Listener | |||
Query Count - 1] query retransmissions to be sent every [Last | Query Count - 1] query retransmissions to be sent every [Last | |||
Listener Query Interval], over [Last Listener Query Time].</t> | Listener Query Interval], over [Last Listener Query Time].</t> | |||
<t>When transmitting a Multicast Address Specific Query, if the Filt | ||||
<t>When transmitting a Multicast Address Specific Query, if the Filter | er | |||
Timer is larger than LLQT, the "Suppress Router-Side Processing" bit | Timer is larger than LLQT, the "Suppress Router-Side Processing" bit | |||
is set in the query message.</t> | is set in the query message.</t> | |||
</section> | </section> | |||
<section title="Building and Sending Multicast Address and Source Specific Qu | <section numbered="true" toc="default"> | |||
eries"> | <name>Building and Sending Multicast Address and Source Specific Que | |||
ries</name> | ||||
<t>When a table action "Send Q(MA,X)" is encountered by the Querier in | <!-- [rfced] We see "Send Q(MA,X-A)" not "Send Q(MA,X)" in Table 8. Is | |||
the table in <xref target="fm_chg" />, the following actions must be performe | this variance okay or is an update needed? | |||
d | ||||
for each of the sources in X that send to multicast address MA, with | Current: | |||
When a table action "Send Q(MA,X)" is encountered by the Querier in | ||||
Table 8 (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: | source timer larger than LLQT: | |||
<list style="bullets"> | ||||
<t>Lower source timer to LLQT;</t> | ||||
<t>Add the sources to the Retransmission List;</t> | ||||
<t>Set the Source Retransmission Counter for each source to [Last List | ||||
ener Query Count].</t> | ||||
</list></t> | ||||
<t>The Querier must then immediately send a Multicast Address and Source | Perhaps: | |||
When a table action "Send Q(MA,X-A)" is encountered by the Querier in | ||||
Table 8 (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>When a table action "Send Q(MA,X)" is encountered by the Querier | ||||
in | ||||
<xref target="mr-state-trans"/> (<xref target="fm_chg" format="default"/>), t | ||||
he 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"> | ||||
<li> | ||||
<t>lower source timer to LLQT;</t> | ||||
</li> | ||||
<li> | ||||
<t>add the sources to the Retransmission List; and</t> | ||||
</li> | ||||
<li> | ||||
<t>set the Source Retransmission Counter for each source to [Las | ||||
t Listener Query Count].</t> | ||||
</li> | ||||
</ul> | ||||
<t>The Querier must then immediately send a Multicast Address and So | ||||
urce | ||||
Specific Query as well as schedule [Last Listener Query Count -1] | Specific Query as well as schedule [Last Listener Query Count -1] | |||
query retransmissions to be sent every [Last Listener Query | query retransmissions to be sent every [Last Listener Query | |||
Interval], over [Last Listener Query Time]. The contents of these | Interval], over [Last Listener Query Time]. The contents of these | |||
queries are calculated as follows.</t> | queries are calculated as follows.</t> | |||
<t>When building a Multicast Address and Source Specific Query for a | ||||
<t>When building a Multicast Address and Source Specific Query for a | ||||
multicast address MA, two separate query messages are sent for the | multicast address MA, two separate query messages are sent for the | |||
multicast address. The first one has the "Suppress Router-Side | multicast address. The first one has the "Suppress Router-Side | |||
Processing" bit set and contains all the sources with retransmission | Processing" bit set and contains all the sources with retransmission | |||
state (i.e., sources from the Retransmission List of that multicast | state (i.e., sources from the Retransmission List of that multicast | |||
address), and timers greater than LLQT. The second has the "Suppress | address) and timers greater than LLQT. The second has the "Suppress | |||
Router-Side Processing" bit clear and contains all the sources with | Router-Side Processing" bit clear and contains all the sources with | |||
retransmission state and timers lower or equal to LLQT. If either of | retransmission state and timers lower or equal to LLQT. If either of | |||
the two calculated messages does not contain any sources, then its | the two calculated messages does not contain any sources, then its | |||
transmission is suppressed.</t> | transmission is suppressed.</t> | |||
<t>Note: If a Multicast Address Specific Query is scheduled to be | ||||
<t>Note: If a Multicast Address Specific query is scheduled to be | ||||
transmitted at the same time as a Multicast Address and Source | transmitted at the same time as a Multicast Address and Source | |||
specific query for the same multicast address, then transmission of | Specific Query for the same multicast address, then transmission of | |||
the Multicast Address and Source Specific message with the "Suppress | the Multicast Address and Source Specific message with the "Suppress | |||
Router-Side Processing" bit set may be suppressed.</t> | Router-Side Processing" bit set may be suppressed.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="interop" numbered="true" toc="default"> | ||||
<section title="Interoperation with MLDv1" anchor="interop"> | <name>Interoperation with MLDv1</name> | |||
<t>MLD version 2 hosts and routers interoperate with hosts and routers | ||||
<t>MLD version 2 hosts and routers interoperate with hosts and routers | ||||
that have not yet been upgraded to MLDv2. This compatibility is | that have not yet been upgraded to MLDv2. This compatibility is | |||
maintained by hosts and routers taking appropriate actions depending | maintained by hosts and routers taking appropriate actions depending | |||
on the versions of MLD operating on hosts and routers within a | on the versions of MLD operating on hosts and routers within a | |||
network.</t> | network.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Version Distinctions"> | <name>Query Version Distinctions</name> | |||
<t>The MLD version of a Multicast Listener Query message is determined | ||||
<t>The MLD version of a Multicast Listener Query message is determined | ||||
as follows: | as follows: | |||
<list style="empty"> | </t> | |||
<t>MLDv1 Query: length = 24 octets</t> | <ul spacing="normal"> | |||
<t>MLDv2 Query: length >= 28 octets</t> | <li> | |||
</list></t> | <t>MLDv1 Query: length = 24 octets</t> | |||
</li> | ||||
<t>Query messages that do not match any of the above conditions (e.g., a | <li> | |||
Query of length 26 octets) MUST be silently ignored.</t> | <t>MLDv2 Query: length >= 28 octets</t> | |||
</section> | </li> | |||
</ul> | ||||
<section title="Multicast Address Listener Behavior"> | <t>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 title="In the Presence of MLDv1 Routers"> | > | |||
<t>In order to be compatible with MLDv1 routers, MLDv2 hosts MUST | </section> | |||
operate in version 1 compatibility mode. MLDv2 hosts MUST keep state | <section numbered="true" toc="default"> | |||
<name>Multicast Address Listener Behavior</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>In the Presence of MLDv1 Routers</name> | ||||
<t>In order to be compatible with MLDv1 routers, MLDv2 hosts <bcp14>MU | ||||
ST</bcp14> | ||||
operate in version 1 compatibility mode. MLDv2 hosts <bcp14>MUST</bcp14> kee | ||||
p state | ||||
per local interface regarding the compatibility mode of each attached | per local interface regarding the compatibility mode of each attached | |||
link. A host's compatibility mode is determined from the Host | link. A host's compatibility mode is determined from the Host | |||
Compatibility Mode variable which can be in one of the two states: | Compatibility Mode variable that can be in one of the two states: | |||
MLDv1 or MLDv2.</t> | MLDv1 or MLDv2.</t> | |||
<t>The Host Compatibility Mode of an interface is set to MLDv1 wheneve | ||||
<t>The Host Compatibility Mode of an interface is set to MLDv1 whenever | r | |||
an MLDv1 Multicast Address Listener General Query is received on that | an MLDv1 Multicast Address Listener General Query is received on that | |||
interface. At the same time, the Older Version Querier Present timer | interface. At the same time, the Older Version Querier Present timer | |||
for the interface is set to Older Version Querier Present Timeout | for the interface is set to Older Version Querier Present Timeout | |||
seconds. The timer is re-set whenever a new MLDv1 General Query is received | seconds. The timer is reset whenever a new MLDv1 General Query is received | |||
on that interface. If the Older Version Querier Present timer | on that interface. If the Older Version Querier Present timer | |||
expires, the host switches back to Host Compatibility Mode of MLDv2.</ t> | expires, the host switches back to Host Compatibility Mode of MLDv2.</ t> | |||
<t>When Host Compatibility Mode is MLDv2, a host acts using the MLDv2 | ||||
<t>When Host Compatibility Mode is MLDv2, a host acts using the MLDv2 | ||||
protocol on that interface. When Host Compatibility Mode is MLDv1, a | protocol on that interface. When Host Compatibility Mode is MLDv1, a | |||
host acts in MLDv1 compatibility mode, using only the MLDv1 protocol, | host acts in MLDv1 compatibility mode, using only the MLDv1 protocol, | |||
on that interface.</t> | on that interface.</t> | |||
<t>An MLDv1 Querier will send General Queries with the Maximum Respons | ||||
<t>An MLDv1 Querier will send General Queries with the Maximum Response | e | |||
Code set to the desired Maximum Response Delay, i.e., the full range | Code set to the desired Maximum Response Delay, i.e., the full range | |||
of this field is linear and the exponential algorithm described in | of this field is linear and the exponential algorithm described in | |||
<xref target="mrcode" />. is not used.</t> | <xref target="mrcode" format="default"/>. is not used.</t> | |||
<t>Whenever a host changes its compatibility mode, it cancels all its | ||||
<t>Whenever a host changes its compatibility mode, it cancels all its | ||||
pending responses and retransmission timers.</t> | pending responses and retransmission timers.</t> | |||
<t>An SSM-aware host that receives an MLDv1 General Query or MLDv1 Gro | ||||
<t>An SSM-aware host that receives an MLDv1 General Query or MLDv1 Group | up | |||
Specific Query for a multicast address in the SSM address range SHOULD log an | Specific Query for a multicast address in the SSM address range <bcp14>SHOULD | |||
error. | </bcp14> log an error. | |||
It is RECOMMENDED that implementions provide a configuration option to disabl | It is <bcp14>RECOMMENDED</bcp14> that implementations provide a configuration | |||
e | option to disable the | |||
use of Host Compatibility Mode to allow networks to operate only in SSM mode. | use of Host Compatibility Mode to allow networks to operate only in SSM mode. | |||
This configuration option SHOULD be disabled by default.</t> | This configuration option <bcp14>SHOULD</bcp14> be disabled by default.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="In the Presence of MLDv1 Multicast Address Listeners"> | <name>In the Presence of MLDv1 Multicast Address Listeners</name> | |||
<t>An MLDv2 host may be placed on a link where there are MLDv1 hosts. | ||||
<t>An MLDv2 host may be placed on a link where there are MLDv1 hosts. A | A | |||
host MAY allow its MLDv2 Multicast Listener Report to be suppressed | host <bcp14>MAY</bcp14> allow its MLDv2 Multicast Listener Report to be suppr | |||
essed | ||||
by a Version 1 Multicast Listener Report.</t> | by a Version 1 Multicast Listener Report.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Router Behavior"> | <name>Multicast Router Behavior</name> | |||
<section title="In the Presence of MLDv1 Routers"> | <section numbered="true" toc="default"> | |||
<name>In the Presence of MLDv1 Routers</name> | ||||
<t>MLDv2 routers may be placed on a network where there is at least one | <t>MLDv2 routers may be placed on a network where there is at least on | |||
e | ||||
MLDv1 router. The following requirements apply: | MLDv1 router. The following requirements apply: | |||
<list style="bullets"> | </t> | |||
<t>If an MLDv1 router is present on the link, the Querier MUST use | <ul spacing="normal"> | |||
<li> | ||||
<t>If an MLDv1 router is present on the link, the Querier <bcp14>M | ||||
UST</bcp14> use | ||||
the lowest version of MLD present on the network. This must be | the lowest version of MLD present on the network. This must be | |||
administratively assured. Routers that desire to be compatible | administratively assured. Routers that desire to be compatible | |||
with MLDv1 MUST have a configuration option to act in MLDv1 mode; | 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 | if an MLDv1 router is present on the link, the system | |||
administrator must explicitly configure all MLDv2 routers to act | administrator must explicitly configure all MLDv2 routers to act | |||
in MLDv1 mode. When in MLDv1 mode, the Querier MUST send periodic | in MLDv1 mode. When in MLDv1 mode, the Querier <bcp14>MUST</bcp14> send pe riodic | |||
General Queries truncated at the Multicast Address field (i.e., 24 | General Queries truncated at the Multicast Address field (i.e., 24 | |||
bytes long), and SHOULD also warn about receiving an MLDv2 Query | bytes long) and <bcp14>SHOULD</bcp14> also warn about receiving an MLDv2 Q | |||
(such warnings MUST be rate-limited). The Querier MUST also fill | uery | |||
(such warnings <bcp14>MUST</bcp14> be rate-limited). The Querier <bcp14>M | ||||
UST</bcp14> also fill | ||||
in the Maximum Response Delay in the Maximum Response Code field, | in the Maximum Response Delay in the Maximum Response Code field, | |||
i.e., the exponential algorithm described in <xref target="mrcode" /> is n ot | i.e., the exponential algorithm described in <xref target="mrcode" format= "default"/> is not | |||
used.</t> | used.</t> | |||
<t>If a router is not explicitly configured to use MLDv1 and receives | </li> | |||
an MLDv1 General Query, it SHOULD log a warning. These warnings | <li> | |||
MUST be rate-limited.</t> | <t>If a router is not explicitly configured to use MLDv1 and recei | |||
<t>It is RECOMMENDED that implementions provide a configuration option | ves | |||
an MLDv1 General Query, it <bcp14>SHOULD</bcp14> log a warning. These war | ||||
nings | ||||
<bcp14>MUST</bcp14> be rate-limited.</t> | ||||
</li> | ||||
<li> | ||||
<t>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. | to disable use of compatibility mode to allow networks to operate only in SSM mode. | |||
This configuration option SHOULD be disabled by default.</t> | This configuration option <bcp14>SHOULD</bcp14> be disabled by default.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="In the Presence of MLDv1 Multicast Address Listeners"> | <section numbered="true" toc="default"> | |||
<name>In the Presence of MLDv1 Multicast Address Listeners</name> | ||||
<t>MLDv2 routers may be placed on a network where there are hosts that | <t>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 | have not yet been upgraded to MLDv2. In order to be compatible with | |||
MLDv1 hosts, MLDv2 routers MUST operate in version 1 compatibility | MLDv1 hosts, MLDv2 routers <bcp14>MUST</bcp14> operate in version 1 compatibi lity | |||
mode. MLDv2 routers keep a compatibility mode per multicast address | mode. MLDv2 routers keep a compatibility mode per multicast address | |||
record. The compatibility mode of a multicast address is determined | record. The compatibility mode of a multicast address is determined | |||
from the Multicast Address Compatibility Mode variable, which can be | from the Multicast Address Compatibility Mode variable, which can be | |||
in one of the two following states: MLDv1 or MLDv2.</t> | in one of the two following states: MLDv1 or MLDv2.</t> | |||
<t>The Multicast Address Compatibility Mode of a multicast address | ||||
<t>The Multicast Address Compatibility Mode of a multicast address | ||||
record is set to MLDv1 whenever an MLDv1 Multicast Listener Report is | record is set to MLDv1 whenever an MLDv1 Multicast Listener Report is | |||
received for that multicast address. At the same time, the Older | 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 timer for the multicast address is set to Older | |||
Version Host Present Timeout seconds. The timer is re-set whenever a | Version Host Present Timeout seconds. The timer is reset whenever a | |||
new MLDv1 Report is received for that multicast address. If the | new MLDv1 Report is received for that multicast address. If the | |||
Older Version Host Present timer expires, the router switches back to | Older Version Host Present timer expires, the router switches back to | |||
Multicast Address Compatibility Mode of MLDv2 for that multicast | the Multicast Address Compatibility Mode of MLDv2 for that multicast | |||
address.</t> | address.</t> | |||
<t>Note that when a router switches back to MLDv2 Multicast Address | ||||
<t>Note that when a router switches back to MLDv2 Multicast Address | ||||
Compatibility Mode for a multicast address, it takes some time to | Compatibility Mode for a multicast address, it takes some time to | |||
regain source-specific state information. Source-specific | regain source-specific state information. Source-specific | |||
information will be learned during the next General Query, but | information will be learned during the next General Query, but | |||
sources that should be blocked will not be blocked until [Multicast | sources that should be blocked will not be blocked until [Multicast | |||
Address Listening Interval] after that.</t> | Address Listening Interval] after that.</t> | |||
<t>When Multicast Address Compatibility Mode is MLDv2, a router acts | ||||
<t>When Multicast Address Compatibility Mode is MLDv2, a router acts | ||||
using the MLDv2 protocol for that multicast address. When Multicast | using the MLDv2 protocol for that multicast address. When Multicast | |||
Address Compatibility Mode is MLDv1, a router internally translates | Address Compatibility Mode is MLDv1, a router internally translates | |||
the following MLDv1 messages for that multicast address to their | the following MLDv1 messages for that multicast address to their | |||
MLDv2 equivalents (<xref target="msg-xlate"/>).</t> | MLDv2 equivalents (<xref target="msg-xlate" format="default"/>).</t> | |||
<table title="MLD Message Translation" anchor="msg-xlate"> | <table anchor="msg-xlate"> | |||
<tbody> | <name>MLD Message Translation</name> | |||
<tr><th align="center">MLDv1 Message</th> | <tbody> | |||
<th align="center">MLDv2 Equivalent</th></tr> | <tr> | |||
<tr><td>Report</td><td>IS_EX( {} )</td></tr> | <th align="left">MLDv1 Message</th> | |||
<tr><td>Done</td><td>TO_IN( {} )</td></tr> | <th align="left">MLDv2 Equivalent</th> | |||
</tbody> | </tr> | |||
</table> | <tr> | |||
<td>Report</td> | ||||
<t>MLDv2 BLOCK messages are ignored, as are source-lists in TO_EX() | <td>IS_EX( {} )</td> | |||
</tr> | ||||
<tr> | ||||
<td>Done</td> | ||||
<td>TO_IN( {} )</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>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 | messages (i.e., any TO_EX() message is treated as TO_EX( {} )). On | |||
the other hand, the Querier continues to send MLDv2 queries, | the other hand, the Querier continues to send MLDv2 queries, | |||
regardless of its Multicast Address Compatibility Mode.</t> | regardless of its Multicast Address Compatibility Mode.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="timers" numbered="true" toc="default"> | ||||
<section title="List of Timers, Counters, and their Default Values" anchor="t | <name>List of Timers, Counters, and Their Default Values</name> | |||
imers"> | <t>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 | ||||
<t>Most of these timers are configurable. If non-default settings are | . Note | |||
used, they MUST be consistent among all nodes on a single link. Note | ||||
that parentheses are used to group expressions to make the algebra | that parentheses are used to group expressions to make the algebra | |||
clear.</t> | clear.</t> | |||
<section anchor="robust" numbered="true" toc="default"> | ||||
<section title="Robustness Variable" anchor="robust"> | <name>Robustness Variable</name> | |||
<t>The Robustness Variable allows tuning for the expected packet loss on | ||||
<t>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 | a link. If a link is expected to be lossy, the value of the | |||
Robustness Variable may be increased. MLD is robust to [Robustness | Robustness Variable may be increased. MLD is robust to [Robustness | |||
Variable] - 1 packet losses. The value of the Robustness Variable | Variable] - 1 packet losses. The value of the Robustness Variable | |||
MUST NOT be zero, and SHOULD NOT be one. Default value: 2.</t> | <bcp14>MUST NOT</bcp14> be zero and <bcp14>SHOULD NOT</bcp14> be one. | |||
</section> | Default value: 2.</t> | |||
</section> | ||||
<section title="Query Interval" anchor="qry_int"> | <section anchor="qry_int" numbered="true" toc="default"> | |||
<name>Query Interval</name> | ||||
<t>The Query Interval variable denotes the interval between General | <t>The Query Interval variable denotes the interval between General | |||
Queries sent by the Querier. Default value: 125 seconds.</t> | Queries sent by the Querier. Default value: 125 seconds.</t> | |||
<t>By varying the [Query Interval], an administrator may tune the number | ||||
<t>By varying the [Query Interval], an administrator may tune the number | ||||
of MLD messages on the link; larger values cause MLD Queries to be | of MLD messages on the link; larger values cause MLD Queries to be | |||
sent less often.</t> | sent less often.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Response Interval"> | <name>Query Response Interval</name> | |||
<t>The Query Response Interval is the Maximum Response Delay used to cal | ||||
<t>The Maximum Response Delay used to calculate the Maximum Response | culate the Maximum Response | |||
Code inserted into the periodic General Queries. Default value: | Code that is inserted into the periodic General Queries. Default value: | |||
10000 (10 seconds)</t> | 10000 (10 seconds)</t> | |||
<t>By varying the [Query Response Interval], an administrator may tune | ||||
<t>By varying the [Query Response Interval], an administrator may tune | ||||
the burstiness of MLD messages on the link; larger values make the | the burstiness of MLD messages on the link; larger values make the | |||
traffic less bursty, as host responses are spread out over a larger | traffic less bursty, as host responses are spread out over a larger | |||
interval. The number of seconds represented by the [Query Response | interval. The number of seconds represented by the [Query Response | |||
Interval] must be less than the [Query Interval].</t> | Interval] must be less than the [Query Interval].</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Multicast Address Listening Interval"> | <name>Multicast Address Listening Interval</name> | |||
<t>The Multicast Address Listening Interval (MALI) is the amount of time | ||||
<t>The Multicast Address Listening Interval (MALI) is the amount of time | ||||
that must pass before a multicast router decides there are no more | that must pass before a multicast router decides there are no more | |||
listeners of a multicast address or a particular source on a link. | listeners of a multicast address or a particular source on a link. | |||
This value MUST be ([Robustness Variable] times [Query Interval]) | This value <bcp14>MUST</bcp14> be ([Robustness Variable] times [Query Interva l]) | |||
plus 2 times [Query Response Interval].</t> | plus 2 times [Query Response Interval].</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Other Querier Present Timeout"> | <name>Other Querier Present Timeout</name> | |||
<t>The Other Querier Present Timeout is the length of time that must | ||||
<t>The Other Querier Present Timeout is the length of time that must | ||||
pass before a multicast router decides that there is no longer | pass before a multicast router decides that there is no longer | |||
another multicast router which should be the Querier. This value | another multicast router that should be the Querier. This value | |||
MUST be ([Robustness Variable] times ([Query Interval]) plus (one | <bcp14>MUST</bcp14> be ([Robustness Variable] times ([Query Interval]) plus ( | |||
one | ||||
half of [Query Response Interval]).</t> | half of [Query Response Interval]).</t> | |||
</section> | </section> | |||
<section anchor="start_qry_int" numbered="true" toc="default"> | ||||
<section title="Startup Query Interval" anchor="start_qry_int"> | <name>Startup Query Interval</name> | |||
<t>The Startup Query Interval is the interval between General Queries | ||||
<t>The Startup Query Interval is the interval between General Queries | ||||
sent by a Querier on startup. Default value: 1/4 the [Query | sent by a Querier on startup. Default value: 1/4 the [Query | |||
Interval].</t> | Interval].</t> | |||
</section> | </section> | |||
<section anchor="start_qry_cnt" numbered="true" toc="default"> | ||||
<section title="Startup Query Count" anchor="start_qry_cnt"> | <name>Startup Query Count</name> | |||
<t>The Startup Query Count is the number of Queries sent out on startup, | ||||
<t>The Startup Query Count is the number of Queries sent out on startup, | ||||
separated by the Startup Query Interval. Default value: [Robustness | separated by the Startup Query Interval. Default value: [Robustness | |||
Variable].</t> | Variable].</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Last Listener Query Interval"> | <name>Last Listener Query Interval</name> | |||
<t>The Last Listener Query Interval (LLQI) is the Maximum Response Delay | ||||
<t>The Last Listener Query Interval is the Maximum Response Delay used | used | |||
to calculate the Maximum Response Code inserted into Multicast | to calculate the Maximum Response Code inserted into Multicast | |||
Address Specific Queries sent in response to Version 1 Multicast | Address Specific Queries sent in response to Version 1 Multicast | |||
Listener Done messages. It is also the Maximum Response Delay used | Listener Done messages. It is also the Maximum Response Delay used | |||
to calculate the Maximum Response Code inserted into Multicast | to calculate the Maximum Response Code inserted into Multicast | |||
Address and Source Specific Query messages. Default value: 1000 (1 | Address and Source Specific Query messages. Default value: 1000 (1 | |||
second).</t> | second).</t> | |||
<t>Note that for values of LLQI greater than 32.768 seconds, a limited | <t>Note that for values of LLQI greater than 32.768 seconds, a limited | |||
set of values can be represented, corresponding to sequential values | set of values can be represented, corresponding to sequential values | |||
of Maximum Response Code. When converting a configured time to a | of Maximum Response Code. When converting a configured time to a | |||
Maximum Response Code value, it is recommended to use the exact value | 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 | if possible, or the next lower value if the requested value is not | |||
exactly representable.</t> | exactly representable.</t> | |||
<t>This value may be tuned to modify the "leave latency" of the link. A | ||||
<t>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 | reduced value results in reduced time to detect the departure of the | |||
last listener for a multicast address or source.</t> | last listener for a multicast address or source.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Last Listener Query Count"> | <name>Last Listener Query Count</name> | |||
<t>The Last Listener Query Count is the number of Multicast Address | ||||
<t>The Last Listener Query Count is the number of Multicast Address | ||||
Specific Queries sent before the router assumes there are no local | Specific Queries sent before the router assumes there are no local | |||
listeners. The Last Listener Query Count is also the number of | listeners. The Last Listener Query Count is also the number of | |||
Multicast Address and Source Specific Queries sent before the router | Multicast Address and Source Specific Queries sent before the router | |||
assumes there are no listeners for a particular source. Default | assumes there are no listeners for a particular source. Default | |||
value: [Robustness Variable].</t> | value: [Robustness Variable].</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Last Listener Query Time"> | <name>Last Listener Query Time</name> | |||
<t>The Last Listener Query Time is the time value represented by the | ||||
<t>The Last Listener Query Time is the time value represented by the | ||||
Last Listener Query Interval, multiplied by [Last Listener Query | Last Listener Query Interval, multiplied by [Last Listener Query | |||
Count]. It is not a tunable value, but may be tuned by changing its | Count]. It is not a tunable value, but it may be tuned by changing its | |||
components.</t> | components.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Unsolicited Report Interval"> | <name>Unsolicited Report Interval</name> | |||
<t>The Unsolicited Report Interval is the time between repetitions of a | ||||
<t>The Unsolicited Report Interval is the time between repetitions of a | ||||
node's initial report of interest in a multicast address. Default | node's initial report of interest in a multicast address. Default | |||
value: 1 second.</t> | value: 1 second.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Older Version Querier Present Timeout"> | <name>Older Version Querier Present Timeout</name> | |||
<t>The Older Version Querier Present Timeout is the timeout for | ||||
<t>The Older Version Querier Present Timeout is the time-out for | ||||
transitioning a host back to MLDv2 Host Compatibility Mode. When an | transitioning a host back to MLDv2 Host Compatibility Mode. When an | |||
MLDv1 query is received, MLDv2 hosts set their Older Version Querier | MLDv1 query is received, MLDv2 hosts set their Older Version Querier | |||
Present Timer to [Older Version Querier Present Timeout].</t> | Present Timer to [Older Version Querier Present Timeout].</t> | |||
<t>This value <bcp14>MUST</bcp14> be ([Robustness Variable] times (the [ | ||||
<t>This value MUST be ([Robustness Variable] times (the [Query Interval] | Query Interval] | |||
in the last Query received)) plus ([Query Response Interval]).</t> | in the last Query received)) plus ([Query Response Interval]).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Older Version Host Present Timeout"> | <name>Older Version Host Present Timeout</name> | |||
<t>The Older Version Host Present Timeout is the timeout for | ||||
<t>The Older Version Host Present Timeout is the time-out for | ||||
transitioning a router back to MLDv2 Multicast Address Compatibility | transitioning a router back to MLDv2 Multicast Address Compatibility | |||
Mode for a specific multicast address. When an MLDv1 report is | Mode for a specific multicast address. When an MLDv1 report is | |||
received for that multicast address, routers set their Older Version | received for that multicast address, routers set their Older Version | |||
Host Present Timer to [Older Version Host Present Timeout].</t> | Host Present Timer to [Older Version Host Present Timeout].</t> | |||
<t>This value <bcp14>MUST</bcp14> be ([Robustness Variable] times [Query | ||||
<t>This value MUST be ([Robustness Variable] times [Query Interval]) | Interval]) | |||
plus ([Query Response Interval]).</t> | plus ([Query Response Interval]).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Configuring timers"> | <name>Configuring Timers</name> | |||
<t>This section is meant to provide advice to network administrators on | ||||
<t>This section is meant to provide advice to network administrators on | ||||
how to tune these settings to their network. Ambitious router | how to tune these settings to their network. Ambitious router | |||
implementations might tune these settings dynamically based upon | implementations might tune these settings dynamically based upon | |||
changing characteristics of the network.</t> | changing characteristics of the network.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Robustness Variable"> | <name>Robustness Variable</name> | |||
<t>The Robustness Variable tunes MLD to expected losses on a link. | ||||
<t>The Robustness Variable tunes MLD to expected losses on a link. | ||||
MLDv2 is robust to [Robustness Variable] - 1 packet losses, e.g., if | 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 | 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 | robust to a single packet loss but may operate imperfectly if more | |||
losses occur. On lossy links, the value of the Robustness Variable | losses occur. On lossy links, the value of the Robustness Variable | |||
should be increased to allow for the expected level of packet loss. | should be increased to allow for the expected level of packet loss. | |||
However, increasing the value of the Robustness Variable increases | However, increasing the value of the Robustness Variable increases | |||
the leave latency of the link (the time between when the last | the leave latency of the link (the time between when the last | |||
listener stops listening to a source or multicast address and when | listener stops listening to a source or multicast address and when | |||
the traffic stops flowing).</t> | the traffic stops flowing).</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Interval"> | <name>Query Interval</name> | |||
<t>The overall level of periodic MLD traffic is inversely proportional | ||||
<t>The overall level of periodic MLD traffic is inversely proportional | ||||
to the Query Interval. A longer Query Interval results in a lower | to the Query Interval. A longer Query Interval results in a lower | |||
overall level of MLD traffic. The value of the Query Interval MUST | overall level of MLD traffic. The value of the Query Interval <bcp14>MUST</b cp14> | |||
be equal to or greater than the Maximum Response Delay used to | be equal to or greater than the Maximum Response Delay used to | |||
calculate the Maximum Response Code inserted in General Query | calculate the Maximum Response Code inserted in General Query | |||
messages.</t> | messages.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Maximum Response Delay"> | <name>Maximum Response Delay</name> | |||
<t>The burstiness of MLD traffic is inversely proportional to the | ||||
<t>The burstiness of MLD traffic is inversely proportional to the | ||||
Maximum Response Delay. A longer Maximum Response Delay will spread | Maximum Response Delay. A longer Maximum Response Delay will spread | |||
Report messages over a longer interval. However, a longer Maximum | Report messages over a longer interval. However, a longer Maximum | |||
Response Delay in Multicast Address Specific and Multicast Address | Response Delay in Multicast Address Specific and Multicast Address | |||
And Source Specific Queries extends the leave latency (the time | and Source Specific Queries extends the leave latency (the time | |||
between when the last listener stops listening to a source or | between when the last listener stops listening to a source or | |||
multicast address and when the traffic stops flowing.) The expected | multicast address and when the traffic stops flowing.) The expected | |||
rate of Report messages can be calculated by dividing the expected | rate of Report messages can be calculated by dividing the expected | |||
number of Reporters by the Maximum Response Delay. The Maximum | number of Reporters by the Maximum Response Delay. The Maximum | |||
Response Delay may be dynamically calculated (shown in <xref target="mrd-calc "/>) per Query by using the | Response Delay may be dynamically calculated (as shown in <xref target="mrd-c alc" format="default"/>) per Query by using the | |||
expected number of Reporters for that Query.</t> | expected number of Reporters for that Query.</t> | |||
<table anchor="mrd-calc"> | ||||
<table title="Maximum Response Delay Calculation" anchor="mrd-calc"> | <name>Maximum Response Delay Calculation</name> | |||
<tbody> | <tbody> | |||
<tr><th align="center">Query Type</th> | <tr> | |||
<th align="center">Expected Number of Reporters</th></tr> | <th align="left">Query Type</th> | |||
<tr><td>General Query</td><td>All nodes on link</td></tr> | <th align="left">Expected Number of Reporters</th> | |||
<tr><td>Multicast Address Specific Query</td><td>All nodes on the link t | </tr> | |||
hat had expressed interest in the multicast address</td></tr> | <tr> | |||
<tr><td>Multicast Address and Source Specific Query</td><td>All nodes on | <td>General Query</td> | |||
the link that had expressed interest in the source and multicast address</td></ | <td>All nodes on the link.</td> | |||
tr> | </tr> | |||
</tbody> | <tr> | |||
</table> | <td>Multicast Address Specific Query</td> | |||
<td>All nodes on the link that had expressed interest in the mul | ||||
<t>A router is not required to calculate these populations or tune the | ticast address.</td> | |||
</tr> | ||||
<tr> | ||||
<td>Multicast Address and Source Specific Query</td> | ||||
<td>All nodes on the link that had expressed interest in the sou | ||||
rce and multicast address.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>A router is not required to calculate these populations or tune the | ||||
Maximum Response Delay dynamically; these are simply guidelines.</t> | Maximum Response Delay dynamically; these are simply guidelines.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Security Considerations"> | <name>Security Considerations</name> | |||
<t>MLD does not contain any cryptographic protection, thus its messages | ||||
<t>MLD does not contain any cryptographic protection thus its messages | ||||
are not authenticated, the message contents are not confidential, and | are not authenticated, the message contents are not confidential, and | |||
any message can be replayed. The ability to replay messages does not affect | any message can be replayed. The ability to replay messages does not affect | |||
the behavior of the protocol itself.</t> | the behavior of the protocol itself.</t> | |||
<t>Replaying messages can lead to multicast | ||||
<t>Replaying messages can lead to multicast | ||||
forwarding state to remain active beyond the needs of group members on a | forwarding state to remain active beyond the needs of group members on a | |||
link. Excessive retention of multicast state may lead to resource | link. Excessive retention of multicast state may lead to resource | |||
exhaustion in some devices.</t> | exhaustion in some devices.</t> | |||
<t>The lack of confidentiality allows any device with access to the link | ||||
<t>The lack of confidentiality allows any device with access to the link | ||||
to determine which multicast groups are being requested. This is a privacy | to determine which multicast groups are being requested. This is a privacy | |||
issue as some multicast content may be sensitive.</t> | issue as some multicast content may be sensitive.</t> | |||
<t>The lack of authentication allows for the creation of forged messages. | ||||
<t>The lack of authentication allows for the creation of forged messages. No | Note | |||
te | ||||
that before processing an MLD message, nodes verify if the source | that before processing an MLD message, nodes verify if the source | |||
address of the message is a valid link-local address (or the | 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 | 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 | 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 | packet. If any of these checks fails, the packet is dropped. This | |||
defends the MLDv2 nodes from acting on forged MLD messages originated | defends the MLDv2 nodes from acting on forged MLD messages originated | |||
off-link. Therefore, in the following we discuss only the effects of | off-link. Therefore, we discuss only the effects of | |||
on-link forgery.</t> | on-link forgery in the following section.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Query Message"> | <name>Query Message</name> | |||
<t>A forged Query message from a machine with a lower IPv6 address than | ||||
<t>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 | the current Querier will cause Querier duties to be assigned to the | |||
forger. If the forger then sends no more Query messages, other | forger. If the forger then sends no more Query messages, other | |||
routers' Other Querier Present timer will time out and one will | routers' Other Querier Present timer will time out and one will | |||
resume the role of Querier. During this time, if the forger ignores | resume the role of Querier. During this time, if the forger ignores | |||
Multicast Listener Done Messages, traffic might flow to multicast | Multicast Listener Done messages, traffic might flow to multicast | |||
addresses with no listeners for up to [Multicast Address Listener | addresses with no listeners for up to [Multicast Address Listener | |||
Interval].</t> | Interval].</t> | |||
<t>A forged Version 1 Query message will put MLDv2 listeners on that | ||||
<t>A forged Version 1 Query message will put MLDv2 listeners on that | ||||
link in MLDv1 Host Compatibility Mode. This scenario can be avoided | link in MLDv1 Host Compatibility Mode. This scenario can be avoided | |||
by providing MLDv2 hosts with a configuration option to ignore | by providing MLDv2 hosts with a configuration option to ignore | |||
Version 1 messages completely.</t> | Version 1 messages completely.</t> | |||
<t>A DoS attack on a node could be staged through forged Multicast | ||||
<t>A DoS attack on a node could be staged through forged Multicast | ||||
Address and Source Specific Queries. The attacker can find out about | Address and Source Specific Queries. The attacker can find out about | |||
the listening state of a specific node with a general query. After | the listening state of a specific node with a general query. After | |||
that it could send a large number of Multicast Address and Source | that, it could send a large number of Multicast Address and Source | |||
Specific Queries, each with a large source list and/or long Maximum | Specific Queries, each with a large source list and/or long Maximum | |||
Response Delay. The node will have to store and maintain the sources | 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 | 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 | delayed response. This would consume both memory and CPU cycles in | |||
order to augment the recorded sources with the source lists included | order to augment the recorded sources with the source lists included | |||
in the successive queries.</t> | in the successive queries.</t> | |||
<t>To protect against such a DoS attack, a node stack implementation | ||||
<t>To protect against such a DoS attack, a node stack implementation | ||||
could restrict the number of Multicast Address and Source Specific | could restrict the number of Multicast Address and Source Specific | |||
Queries per multicast address within this interval, and/or record | Queries per multicast address within this interval and/or record | |||
only a limited number of sources.</t> | only a limited number of sources.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Current State Report messages"> | <name>Current State Report Messages</name> | |||
<t>A forged Report message may cause multicast routers to think there | ||||
<t>A forged Report message may cause multicast routers to think there | ||||
are listeners of a multicast address on a link when there are not. | are listeners of a multicast address on a link when there are not. | |||
Nevertheless, since listening to a multicast address on a host is | Nevertheless, since listening to a multicast address on a host is | |||
generally an unprivileged operation, a local user may trivially gain | generally an unprivileged operation, a local user may trivially gain | |||
the same result without forging any messages. If a large number of | the same result without forging any messages. If a large number of | |||
forged Report messages are generated, a multicast router may consume | forged Report messages are generated, a multicast router may consume | |||
significant resources maintaining multicast forwarding state.</t> | significant resources maintaining multicast forwarding state.</t> | |||
<t>A forged Version 1 Report Message may put a router into MLDv1 | ||||
<t>A forged Version 1 Report Message may put a router into MLDv1 | ||||
Multicast Address Compatibility Mode for a particular multicast | Multicast Address Compatibility Mode for a particular multicast | |||
address, meaning that the router will ignore MLDv2 source specific | address, meaning that the router will ignore MLDv2 source-specific | |||
state messages. This can cause traffic to flow from unwanted sources | state messages. This can cause traffic to flow from unwanted sources | |||
for up to [Multicast Address Listener Interval]. This can be solved | for up to [Multicast Address Listener Interval]. This can be solved | |||
by providing routers with a configuration switch to ignore Version 1 | by providing routers with a configuration switch to ignore Version 1 | |||
messages completely. This breaks automatic compatibility with | messages completely. This breaks automatic compatibility with | |||
Version 1 hosts, so it should only be used in situations where source | Version 1 hosts, so it should only be used in situations where source | |||
filtering is critical.</t> | filtering is critical.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="State Change Report messages"> | <name>State Change Report Messages</name> | |||
<t>A forged State Change Report message will cause the Querier to send | ||||
<t>A forged State Change Report message will cause the Querier to send | ||||
out Multicast Address Specific or Multicast Address and Source | out Multicast Address Specific or Multicast Address and Source | |||
Specific Queries for the multicast address in question. This causes | Specific Queries for the multicast address in question. This causes | |||
extra processing on each router and on each listener of the multicast | extra processing on each router and on each listener of the multicast | |||
address, but cannot cause loss of desired traffic.</t> | address, but it cannot cause loss of desired traffic.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="iana" numbered="true" toc="default"> | ||||
<section title="IANA Considerations" anchor="iana"> | <name>IANA Considerations</name> | |||
<t>IANA has assigned the IPv6 link-local multicast address | ||||
<t>IANA has assigned the IPv6 link-local multicast address | ||||
ff02::16, called "all MLDv2-capable routers", as described | ff02::16, called "all MLDv2-capable routers", as described | |||
in <xref target="dest_addr" />. Version 2 Multicast Listener Reports will be | in <xref target="dest_addr" format="default"/>. Version 2 Multicast Listener | |||
sent | Reports will be sent | |||
to this special address. The reference for this assignment should be changed | to this special address.</t> | |||
to | <t>In addition, IANA has assigned the ICMPv6 message Type value of 143 | |||
this document upon publication as an RFC.</t> | ||||
<t>In addition, IANA has assigned the ICMPv6 message type value of 143 | ||||
for Version 2 Multicast Listener Report messages, as specified in | for Version 2 Multicast Listener Report messages, as specified in | |||
<xref target="node_state" />. The reference for this assignment should be cha | <xref target="node_state" format="default"/>.</t> | |||
nged to | </section> | |||
this document upon publication as an RFC.</t> | ||||
</section> | ||||
<section title="Contributors"> | ||||
<t>Roland Vida, Luis Henrique Maciel Kosmalski Costa, Serge Fdida, | ||||
Steve Deering, Bill Fenner, and Isidor Kouvelas are the authors of | ||||
RFC 3810, which makes up the majority of the content in this document.</t> | ||||
<t>Anuj Budhiraja, Toerless Eckert, Olufemi Komolafe and Tim Winters have con | </middle> | |||
tributed | <back> | |||
valuable content to this version of the specification.</t> | <references> | |||
</section> | <name>References</name> | |||
<references> | ||||
<name>Normative References</name> | ||||
<section title="Acknowledgments"> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
<t>We would like to thank Hitoshi Asaeda, Randy Bush, Francis Dupont, | 119.xml"/> | |||
Ted Hardie, Russ Housley, Konstantin Kabassanov, Erik Nordmark, | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
Shinsuke Suzuki, Margaret Wasserman, Bert Wijnen, and Remi Zara for | 200.xml"/> | |||
their valuable comments and suggestions on this document.</t> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
174.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
443.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
604.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
464.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
710.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
711.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
291.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
607.xml"/> | ||||
<t>Stig Venaas, Hitoshi Asaeda, and Mike McBride have provided valuable feedb | <!-- [I-D.ietf-pim-3228bis] companion document RFC 9778--> | |||
ack on this | <reference anchor="RFC9778" target="https://www.rfc-editor.org/info/rfc9 | |||
version of the specification and we thank them for their input.</t> | 778"> | |||
</section> | <front> | |||
<title>IANA Considerations for Internet Group Management Protocols</t | ||||
itle> | ||||
<author initials="B." surname="Haberman" fullname="Brian Haberman" ro | ||||
le="editor"> | ||||
<organization>Johns Hopkins University Applied Physics Lab</organiz | ||||
ation> | ||||
</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> | ||||
</middle> | </references> | |||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
861.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4 | ||||
862.xml"/> | ||||
<back> | <!-- Because this document will likey be published at the same time as 3376bis, | |||
<references title="Normative References"> | we have updated the reference to refer to RFC 9776. Please let us know if any co | |||
<?rfc include="reference.RFC.2119" ?> | rrections are needed. | |||
<?rfc include="reference.RFC.8200" ?> | ||||
<?rfc include="reference.RFC.8174" ?> | ||||
<?rfc include="reference.RFC.4443" ?> | ||||
<?rfc include="reference.RFC.4604" ?> | ||||
<?rfc include="reference.RFC.2464" ?> | ||||
<?rfc include="reference.RFC.2710" ?> | ||||
<?rfc include="reference.RFC.2711" ?> | ||||
<?rfc include="reference.RFC.4291" ?> | ||||
<?rfc include="reference.RFC.4607" ?> | ||||
<?rfc include="reference.I-D.ietf-pim-3228bis" ?> | ||||
</references> | ||||
<references title="Informative References"> | Please consider whether it is appropriate to refer to [BCP57] and [STD100], or i | |||
<?rfc include="reference.RFC.4861" ?> | f referring to the specific RFCs is preferred. | |||
<?rfc include="reference.RFC.4862" ?> | --> | |||
<?rfc include="reference.RFC.3376" ?> | ||||
<?rfc include="reference.RFC.3569" ?> | ||||
<?rfc include="reference.RFC.3678" ?> | ||||
<?rfc include="reference.RFC.3810" ?> | ||||
</references> | ||||
<section title="Design Rationale"> | <!-- <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.R | |||
<section title="The Need for State Change Messages" anchor="state_change"> | FC.3376.xml"/>--> | |||
<reference anchor="RFC9776" | ||||
target="https://www.rfc-editor.org/info/rfc9776"> | ||||
<front> | ||||
<title>Internet Group Management Protocol, Version 3</title> | ||||
<author initials="B." surname="Haberman" fullname="Brian Haberman"> | ||||
<organization>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> | ||||
<t>MLDv2 specifies two types of Multicast Listener Reports: Current | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | |||
569.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
678.xml"/> | ||||
<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3 | ||||
810.xml"/> | ||||
</references> | ||||
</references> | ||||
<section numbered="true" toc="default"> | ||||
<name>Design Rationale</name> | ||||
<section anchor="state_change" numbered="true" toc="default"> | ||||
<name>The Need for State Change Messages</name> | ||||
<t>MLDv2 specifies two types of Multicast Listener Reports: Current | ||||
State and State Change. This section describes the rationale for the | State and State Change. This section describes the rationale for the | |||
need for both these types of Reports.</t> | need for both these types of Reports.</t> | |||
<t>Routers need to distinguish Multicast Listener Reports that were sent | ||||
<t>Routers need to distinguish Multicast Listener Reports that were sent | ||||
in response to Queries from those that were sent as a result of a | in response to Queries from those that were sent as a result of a | |||
change in the per-interface state. Multicast Listener Reports that | change in the per-interface state. Multicast Listener Reports that | |||
are sent in response to Multicast Address Listener Queries are used | are sent in response to Multicast Address Listener Queries are used | |||
mainly to refresh the existing state at the router; they typically do | mainly to refresh the existing state at the router; they typically do | |||
not cause transitions in state at the router. Multicast Listener | not cause transitions in state at the router. Multicast Listener | |||
Reports that are sent in response to changes in the per-interface | Reports that are sent in response to changes in the per-interface | |||
state require the router to take some action in response to the | state require the router to take some action in response to the | |||
received report (see <xref target="rcv_rpt" />).</t> | received report (see <xref target="rcv_rpt" format="default"/>).</t> | |||
<t>The inability to distinguish between the two types of reports would | ||||
<t>The inability to distinguish between the two types of reports would | ||||
force a router to treat all Multicast Listener Reports as potential | force a router to treat all Multicast Listener Reports as potential | |||
changes in state and could result in increased processing at the | changes in state and could result in increased processing at the | |||
router as well as an increase in MLD traffic on the link.</t> | router as well as an increase in MLD traffic on the link.</t> | |||
</section> | </section> | |||
<section anchor="host_suppress" numbered="true" toc="default"> | ||||
<section title="Host Suppression" anchor="host_suppress"> | <name>Host Suppression</name> | |||
<t>In MLDv1, a host would not send a pending multicast listener report | ||||
<t>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 | if a similar report was sent by another listener on the link. In | |||
MLDv2, the suppression of multicast listener reports has been | MLDv2, the suppression of multicast listener reports has been | |||
removed. The following points explain this decision. | removed. The following points explain this decision. | |||
<list style="numbers"> | </t> | |||
<ol spacing="normal" type="1"><li> | ||||
<t>Routers may want to track per-host multicast listener status on an | <t>Routers may want to track per-host multicast listener status on a | |||
n | ||||
interface. This would allow routers to implement fast leaves | interface. This would allow routers to implement fast leaves | |||
(e.g., for layered multicast congestion control schemes), as well | (e.g., for layered multicast congestion control schemes) as well | |||
as track listener status for possible security or accounting | as track listener status for possible security or accounting | |||
purposes. The present specification does not require routers to | purposes. The present specification does not require routers to | |||
implement per-host tracking. Nevertheless, the lack of host | implement per-host tracking. Nevertheless, the lack of host | |||
suppression in MLDv2 makes possible to implement either | suppression in MLDv2 makes it possible to implement either | |||
proprietary or future standard behavior of multicast routers that | proprietary or future standard behavior of multicast routers that | |||
would support per-host tracking, while being fully interoperable | would support per-host tracking, while being fully interoperable | |||
with MLDv2 listeners and routers that implement the exact behavior | with MLDv2 listeners and routers that implement the exact behavior | |||
described in this specification.</t> | described in this specification.</t> | |||
</li> | ||||
<t>Multicast Listener Report suppression does not work well on | <li> | |||
bridged LANs. Many bridges and Layer2/Layer3 switches that | <t>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 | implement MLD snooping do not forward MLD messages across LAN | |||
segments in order to prevent multicast listener report | segments in order to prevent multicast listener report | |||
suppression.</t> | suppression.</t> | |||
</li> | ||||
<t>By eliminating multicast listener report suppression, hosts have | <li> | |||
<t>By eliminating multicast listener report suppression, hosts have | ||||
fewer messages to process; this leads to a simpler state machine | fewer messages to process; this leads to a simpler state machine | |||
implementation.</t> | implementation.</t> | |||
</li> | ||||
<t>In MLDv2, a single multicast listener report now bundles multiple | <li> | |||
<t>In MLDv2, a single multicast listener report now bundles multiple | ||||
multicast address records to decrease the number of packets sent. | multicast address records to decrease the number of packets sent. | |||
In comparison, the previous version of MLD required that each | In comparison, the previous version of MLD required that each | |||
multicast address be reported in a separate message.</t> | multicast address be reported in a separate message.</t> | |||
</list></t> | </li> | |||
</section> | </ol> | |||
</section> | ||||
<section title="Switching router filter modes from EXCLUDE to INCLUDE" anchor | <section anchor="mode_switch" numbered="true" toc="default"> | |||
="mode_switch"> | <name>Switching Router Filter Modes from EXCLUDE to INCLUDE</name> | |||
<t>If on a link there are nodes in both EXCLUDE and INCLUDE modes for a | ||||
<t>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 | single multicast address, the router must be in EXCLUDE mode as well | |||
(see section 7.2.1). In EXCLUDE mode, a router forwards traffic from | (see <xref target="def-router-filter-mode" format="default"/>). In EXCLUDE m ode, a router forwards traffic from | |||
all sources except those in the Exclude List. If all nodes in | 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 | EXCLUDE mode cease to exist or to listen, it would be desirable for | |||
the router to switch back to INCLUDE mode seamlessly, without | the router to switch back to INCLUDE mode seamlessly, without | |||
interrupting the flow of traffic to existing listeners.</t> | interrupting the flow of traffic to existing listeners.</t> | |||
<t>One of the ways to accomplish this is for routers to keep track of | ||||
<t>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 | 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 | 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 | a multicast address expires, it implies that there are no nodes in | |||
EXCLUDE mode on the link (otherwise a multicast listener report from | EXCLUDE mode on the link (otherwise, a multicast listener report from | |||
that node would have refreshed the Filter Timer). The router can | that node would have refreshed the Filter Timer). The router can | |||
then switch to INCLUDE mode seamlessly; sources from the Requested | then switch to INCLUDE mode seamlessly; sources from the Requested | |||
List are moved to the Include List, while sources from the Exclude | List are moved to the Include List, while sources from the Exclude | |||
List are deleted.</t> | List are deleted.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Summary of Changes"> | <name>Summary of Changes</name> | |||
<section title="MLDv1"> | <section numbered="true" toc="default"> | |||
<name>MLDv1</name> | ||||
<t>The following is a summary of changes from MLDv1, specified in <xref targe | <t>The following is a summary of changes from MLDv1, specified in <xref | |||
t="RFC2710" />. | target="RFC2710" format="default"/>. | |||
<list style="bullets"> | </t> | |||
<ul spacing="normal"> | ||||
<t>MLDv2 introduces source filtering.</t> | <li> | |||
<t>MLDv2 introduces source filtering.</t> | ||||
<t>The IP service interface of MLDv2 nodes is modified accordingly. | </li> | |||
<li> | ||||
<t>The IP service interface of MLDv2 nodes is modified accordingly. | ||||
It enables the specification of a filter mode and a source list.</t> | It enables the specification of a filter mode and a source list.</t> | |||
</li> | ||||
<t>An MLDv2 node keeps per-socket and per-interface multicast | <li> | |||
<t>An MLDv2 node keeps per-socket and per-interface multicast | ||||
listening states that include a filter mode and a source list for | listening states that include a filter mode and a source list for | |||
each multicast address. This enables packet filtering based on a | each multicast address. This enables packet filtering based on a | |||
socket's multicast reception state.</t> | socket's multicast reception state.</t> | |||
</li> | ||||
<t>MLDv2 state kept on routers includes a filter mode and a list of | <li> | |||
<t>MLDv2 state kept on routers includes a filter mode and a list of | ||||
sources and source timers for each multicast address that has | sources and source timers for each multicast address that has | |||
listeners on the link. MLDv1 routers kept only the list of | listeners on the link. MLDv1 routers kept only the list of | |||
multicast addresses.</t> | multicast addresses.</t> | |||
</li> | ||||
<t>Queries include additional fields (<xref target="qry_msg" />).</t> | <li> | |||
<t>Queries include additional fields (<xref target="qry_msg" format= | ||||
<t>The S flag (Suppress Router-Side Processing) is included in | "default"/>).</t> | |||
queries in order to fix robustness issues.</t> | </li> | |||
<li> | ||||
<t>The Querier's Robustness Variable and Query Interval Code are | <t>The S flag is included in queries in order to fix robustness issu | |||
es.</t> | ||||
</li> | ||||
<li> | ||||
<t>The Querier's Robustness Variable and Query Interval Code are | ||||
included in Queries in order to synchronize all MLDv2 routers | included in Queries in order to synchronize all MLDv2 routers | |||
connected to the same link.</t> | connected to the same link.</t> | |||
</li> | ||||
<t>A new Query type (Multicast Address and Source Specific Query) is | <li> | |||
<t>A new Query type (Multicast Address and Source Specific Query) is | ||||
introduced.</t> | introduced.</t> | |||
</li> | ||||
<t>The Maximum Response Delay is not directly included in the Query | <li> | |||
<t>The Maximum Response Delay is not directly included in the Query | ||||
anymore. Instead, an exponential algorithm is used to calculate | anymore. Instead, an exponential algorithm is used to calculate | |||
its value, based on the Maximum Response Code included in the | its value, based on the Maximum Response Code included in the | |||
Query. The maximum value is increased from 65535 milliseconds to | Query. The maximum value is increased from 65535 milliseconds to | |||
about 140 minutes.</t> | about 140 minutes.</t> | |||
</li> | ||||
<t>Reports include Multicast Address Records. Information on the | <li> | |||
<t>Reports include Multicast Address Records. Information on the | ||||
listening state for several different multicast addresses can be | listening state for several different multicast addresses can be | |||
included in the same Report message.</t> | included in the same Report message.</t> | |||
</li> | ||||
<t>Reports are sent to the "all MLDv2-capable multicast routers" | <li> | |||
<t>Reports are sent to the "all MLDv2-capable multicast routers" | ||||
address, instead of the multicast address the host listens to, as | address, instead of the multicast address the host listens to, as | |||
in MLDv1. This facilitates the operation of layer-2 snooping | in MLDv1. This facilitates the operation of Layer 2 snooping | |||
switches.</t> | switches.</t> | |||
</li> | ||||
<t>There is no "host suppression", as in MLDv1. All nodes send | <li> | |||
<t>There is no "host suppression", as in MLDv1. All nodes send | ||||
Report messages.</t> | Report messages.</t> | |||
</li> | ||||
<t>Unsolicited Reports, announcing changes in receiver listening | <li> | |||
state, are sent [Robustness Variable] times. RFC 2710 is less | <t>Unsolicited Reports, announcing changes in receiver listening | |||
state, are sent [Robustness Variable] times. <xref target="RFC2710"/> is | ||||
less | ||||
explicit.</t> | explicit.</t> | |||
</li> | ||||
<t>There are no Done messages.</t> | <li> | |||
<t>There are no Done messages.</t> | ||||
<t>Interoperability with MLDv1 systems is achieved by MLDv2 state | </li> | |||
<li> | ||||
<t>Interoperability with MLDv1 systems is achieved by MLDv2 state | ||||
operations.</t> | operations.</t> | |||
</li> | ||||
<t>In order to ensure interoperability, hosts maintain a Host | <li> | |||
<t>In order to ensure interoperability, hosts maintain a Host | ||||
Compatibility Mode variable and an Older Version Querier Present | Compatibility Mode variable and an Older Version Querier Present | |||
timer per interface. Routers maintain a Multicast Address | timer per interface. Routers maintain a Multicast Address | |||
Compatibility Mode variable and an Older Version Host Present | Compatibility Mode variable and an Older Version Host Present | |||
timer per multicast address.</t> | timer per multicast address.</t> | |||
</list></t> | </li> | |||
</section> | </ul> | |||
<section anchor="3810-changes" title="Changes since RFC 3810"> | </section> | |||
<t>The following summarizes the changes made since <xref target="RFC3810"/>. | <section anchor="_810-changes" numbered="true" toc="default"> | |||
<list style="bullets"> | <name>Changes since RFC 3810</name> | |||
<t>Added definition of Resv to address Erratum 4773.</t> | ||||
<t>Added clarifying text on which multicast addresses require the send | <t>The following summarizes the changes made since <xref target="RFC3810 | |||
ing of MLD messages | " format="default"/>. | |||
</t> | ||||
<ul spacing="normal"> | ||||
<li> | ||||
<t>Added definition of Resv to address Erratum 4773.</t> | ||||
</li> | ||||
<li> | ||||
<t>Added clarifying text on which multicast addresses require the se | ||||
nding of MLD messages | ||||
to address Erratum 5977.</t> | to address Erratum 5977.</t> | |||
<t>Added text to clarify the Group Membership Interval timer changes | </li> | |||
from Erratum 6725.</t> | <li> | |||
<t>Changed Reserved field in messages to Flags field to facilitate use | <!-- [rfced] Erratum 6725 is for RFC 3376, not RFC 3810. Should the text that re | |||
of an IANA-managed registry for | ferences Erratum 6725 be removed from this document and | |||
future bit allocations.</t> | perhaps added to RFC 9776? | |||
</list></t> | ||||
</section> | Current: | |||
</section> | The following summarizes the changes made since [RFC3810]. | |||
</back> | ||||
... | ||||
* Added text to clarify the Group Membership Interval timer changes | ||||
per Erratum 6725. | ||||
--> | ||||
<t>Added text to clarify the Group Membership Interval timer changes | ||||
per Erratum 6725.</t> | ||||
</li> | ||||
<li> | ||||
<t>Changed "Reserved field" to "Flags field" in messages to facilita | ||||
te use of an IANA-managed registry for future bit allocations.</t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>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><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="default"> | ||||
<name>Contributors</name> | ||||
<t><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><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> | ||||
</back> | ||||
<!-- [rfced] Please review each artwork element and let us know if any should | ||||
be marked as sourcecode (or another element) instead. | ||||
In addition, please consider whether the "type" attribute of any sourcecode | ||||
element should be set. | ||||
The current list of preferred values for "type" is available at | ||||
<https://www.rfc-editor.org/rpc/wiki/doku.php?id=sourcecode-types>. | ||||
If the current list does not contain an applicable type, feel free to | ||||
suggest additions for consideration. Note that it is also acceptable | ||||
to leave the "type" attribute not set. | ||||
--> | ||||
<!-- [rfced] Terminology | ||||
a) Throughout the text, the following terminology appears to be used | ||||
inconsistently. Please review these occurrences and let us know if/how they | ||||
may be made consistent. | ||||
Multicast Address Listening state vs. Multicast Address Listener state | ||||
[Note: are these states different, or should the state be either | ||||
"Listening" or "Listener"? Also consider instances of | ||||
"multicast listening state" and "multicast listener status".] | ||||
Multicast Address Listener vs. multicast address listener | ||||
Multicast Address Record vs. multicast address record | ||||
Multicast Listener Report vs. multicast listener report | ||||
b) We updated the text to reflect the forms on the right. Please let us | ||||
know if any additional changes are needed. | ||||
Filter Mode Change records -> Filter Mode Change Records (1 instance) | ||||
Hop-By-Hop -> Hop-by-Hop (for consistency and to align with other RFCs) | ||||
Multicast Address Specific query -> Multicast Address Specific Query (2) | ||||
Multicast Address and Source specific query -> | ||||
Multicast Address and Source Specific Query (1) | ||||
Multicast Listener Done Messages -> Multicast Listener Done messages (1) | ||||
Querier State -> Querier state (1) | ||||
Source list -> source list (1) | ||||
Source List Change records -> Source List Change Records (1) | ||||
type value -> Type value (1) | ||||
Version 2 -> version 2 (when referring to MLDv2) (2) | ||||
c) We note that "Filter Mode" is uppercase when a part of "Filter | ||||
Mode Change Record", "Filter Mode Retransmission Counter", and | ||||
"Router Filter Mode"; otherwise, it appears as lowercase. Given | ||||
this, should any of the instances in the text below be made | ||||
lowercase? | ||||
And is "Source List" referring to a "Source List Change Record" or a | ||||
"source list" (general)? | ||||
Also, "Filter Timer" is consistently uppercase, but should all | ||||
instances be made lowercase to match "source timer" in the | ||||
running text? | ||||
Current: | ||||
This Multicast Address Listener 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. | ||||
--> | ||||
<!-- [rfced] Please review the "Inclusive Language" portion of the online | ||||
Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language> | ||||
and let us know if any changes are needed. Updates of this nature typically | ||||
result in more precise language, which is helpful for readers. | ||||
Note that our script did not flag any words in particular, but this should | ||||
still be reviewed as a best practice. | ||||
--> | ||||
</rfc> | </rfc> | |||
End of changes. 435 change blocks. | ||||
1853 lines changed or deleted | 2305 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |