﻿<?xml version="1.0" encoding="UTF-8"?>
<!--  Edited by Dino Farinacci farinacci@gmail.com -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd">

<rfc category="exp" ipr="trust200902" docName="draft-ietf-pim-gaap-23">

<?rfc toc="yes" ?>
<?rfc symrefs="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc iprnotified="no" ?>
<?rfc strict="yes" ?>

<front>

  <title>Group Address Allocation Protocol (GAAP)</title>

  <author initials='D' surname="Farinacci" fullname='Dino Farinacci'>
    <organization>lispers.net</organization>
    <address><postal>
    <street></street>
    <city>San Jose</city> <region>CA</region>
    <code></code>
    <country>USA</country>
    </postal>
    <email>farinacci@gmail.com</email></address>
  </author>

  <author initials='M' surname="McBride" fullname='Mike McBride'>
    <organization>Futurewei</organization>
    <address><postal>
    <street></street>
    <city>Santa Clara</city> <region>CA</region>
    <code></code>
    <country>USA</country>
    </postal>
    <email>mmcbride7@gmail.com</email></address>
  </author>

  <date></date>

  <abstract>
    <t>This document describes a design for a lightweight
    decentralized multicast group address allocation protocol (named
    GAAP and pronounced "gap" as in "mind the gap"). GAAP requires no
    centralized service or coordination for the address-allocation
    protocol itself, though it depends on ASM-capable multicast
    routing already being provisioned in the deployment domain, and
    deployments using encryption or administrative scoping may
    require additional configuration. The protocol runs among group
    participants which need a unique group address to send and
    receive multicast packets. Tailored for IPv4 and IPv6 networks,
    this design offers a simple, lightweight option rather than
    extending an existing protocol. This document is Experimental,
    see <xref target="RATIONALE"/> for the rationale and the criteria
    for concluding the experiment.</t>
  </abstract>

</front>

<middle>

  <section title="Introduction">
    <t>The Group Address Allocation Protocol (GAAP) is a decentralized
    multicast protocol used by participating applications which send
    and receive packets to/from a multicast group. The protocol is
    relatively lightweight, runs with minimized messaging and state so
    that it can run within a library a multicast application compiles
    into its executable binary.</t>

    <t>GAAP is a possible solution to the issues described in problem 
    statement <xref target="RFC10019"/>. This document specifies an
    Experimental protocol, see <xref target="RATIONALE"/> for why, and
    for the scope of the experiment.</t>

    <t>Other approaches to multicast group allocation have been
    proposed in the past, they include SAP <xref target="RFC2974"/>, SDP
    <xref target="RFC8866"/>, mDNS <xref target="RFC6762"/>, MADCAP
    <xref target="RFC2730"/>, MASC <xref target="RFC2909"/>, and IPv6
    Allocation Guidelines <xref target="RFC3307"/>. However, depending
    on the specific mechanism, these approaches can require global
    scope (adding latency), explicit configuration, reliance on a
    single subnet, or a centralized or semi-centralized service; not
    every limitation applies to every mechanism listed.</t>

    <t>This document will describe the protocol operation, protocol
    message formats, the API definition, and how multicast
    applications use the API.</t>
    <t><vspace blankLines="100"/></t>
  </section>

  <section title="Definition of Terms" anchor="TERMS">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
    NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
    "MAY", and "OPTIONAL" in this document are to be interpreted as
    described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/>
    when, and only when, they appear in all capitals, as shown here.</t>
    
    <t><list style="hanging">
      <t hangText="GAAP node:">a host, process, or library instance
      running the GAAP protocol on behalf of one or more local
      applications. Multiple local applications on the same GAAP
      node may share a single GAAP node's claiming state for a
      group name, per <xref target="DETAILS"/>.</t>

      <t hangText="Group Name:">is a UTF-8 <xref target="RFC3629"/>
      string used by
      applications so they can rendezvous on the same group
      address. The application is started using this group name
      parameter. Applications can use multiple group names if they
      have requirements to use multiple group addresses.</t>

      <t hangText="Group Address:">is an IPv4 multicast group address
      <xref target="RFC1112"/> not from the Local Network Control
      Block <xref target="RFC5771"/> unless explicitly assigned for
      GAAP protocol operation, or an IPv6 multicast group address
      <xref target="RFC4291"/>. The application allocation range is
      a range set aside for expansion of the IPv4 Organization-Local
      scope <xref
      target="RFC2365"/> and a sub-range of the IPv6 Experimental
      Use range <xref target="RFC10028"/>; see <xref
      target="operational-considerations"/>.</t>

      <t hangText="GAAP Group Address:">is an IANA assigned
      group address the GAAP protocol itself sends Claim messages
      to (see <xref target="IANA"/>, "GAAP Protocol Multicast
      Addresses"). This is distinct from the GAAP Multicast Group
      Allocation Range that applications derive
      their own group addresses from (see <xref
      target="operational-considerations"/>); the GAAP Group
      Address MUST NOT be allocated from that range.</t>

      <t hangText="Hash Function:">is a cryptographic hash function
      which takes an octet sequence as input and produces a hash value
      as output. The GAAP protocol uses SHA-256 <xref
      target="RFC6234"/>.</t>

      <t hangText="Acceptable Group Hash List:">There are 4 hashed
      values regarded as "acceptable" for a group name. They are
      calculated using the SHA-256 hash function on 1 of 4 character
      strings: &quot;&lt;group-name&gt;&quot;,
      &quot;&lt;group-name&gt;+1&quot;,
      &quot;&lt;group-name&gt;+2&quot;, or
      &quot;&lt;group-name&gt;+3&quot;. See <xref target="DETAILS"/>
      for the exact hash input construction and for the resulting
      Hashed Value. These 4 hashes are the only candidate group
      addresses a GAAP node will ever try for a given group name; a
      GAAP node MUST NOT run the hash on any other strings for this
      group name. See <xref target="DETAILS"/> also for the behavior
      when all 4 candidate addresses collide, including the case
      where two distinct group names produce the same candidate
      string (for example, a group name that itself ends in "+1"):
      this is handled by the normal collision procedure like any
      other hash collision.</t>

      <t hangText="Hashed Value:">the output of the SHA-256 <xref
      target="RFC6234"/> hash function on one of the 4 character
      strings in the Acceptable Group Hash List above, further defined
      in <xref target="DETAILS"/>. The Hashed Value is used to produce
      a network layer multicast group address that is unique among
      the group names in use. This network-layer uniqueness is what
      GAAP's collision detection targets; it is a separate goal from
      avoiding Layer-2 MAC aliasing, which depends on the address
      family (23 bits for IPv4 <xref target="RFC1112"/>, 32 bits for
      IPv6 <xref target="RFC2464"/>) and is not itself guaranteed by
      GAAP for IPv4.</t>

      <t hangText="Collided Group Address:">a network layer group
      address where one group address allocated by GAAP is the same as
      another group address allocated by GAAP for a different group
      name (the low-order 32 bits for IPv6, or the bits available
      within the assigned GAAP IPv4 allocation range for IPv4). See the
      Hashed Value definition above regarding the separate Layer-2 MAC
      aliasing concern.</t>

      <t hangText="Claim Message:">a GAAP protocol message that
      allocates a unique group address and claims it among other GAAP
      nodes on the network.</t>
    </list></t>
  </section>

  <section title="Overview of Protocol Operation">
    <t>This section will describe the high-level functionality of the
    GAAP protocol. Each application runs the GAAP protocol by using
    the API defined in <xref target="API"/>.</t>

    <t><list style="symbols">
      <t>An application is started with a group name.</t>

      <t>The group name is used to create a random allocated group address.</t>

      <t>A timestamp is taken when the group address is created.</t>

      <t>A Claim message, see <xref target="CLAIM"/>, is sent with
      group name, group address, and timestamp to determine if the
      group address has been claimed by any other GAAP nodes.</t>

      <t>The GAAP node waits one periodic Claim interval (see <xref
      target="DETAILS"/>, roughly 1 minute) after sending its initial
      Claim message. If no colliding Claim message is received from
      another GAAP node within that window, the application can start
      using the group address.</t>

      <t>If a colliding Claim message is sent in response within that
      window, a collision has occurred and the GAAP node MUST allocate
      another group address and send a Claim message for the new group
      address.</t>

      <t>Claim messages are sent periodically. They are sent by a
      single node using a delay-timer suppression mechanism similar to
      IGMPv2 report suppression <xref target="RFC2236"/>. See <xref
      target="DETAILS"/> for details.</t>

      <t>GAAP nodes are not required to cache information from Claim messages.</t>

      <t>GAAP is designed to be decentralized and stateless. The nodes
      that participate in the GAAP protocol are responsible for
      allocating and claiming group addresses. No other entities are
      needed.</t>
	</list></t>
  </section>

  <section title="GAAP Message Format" anchor="CLAIM">
    <t>At this time, there is a single defined message called the
    Claim message with Type value 1. Type value 0 is reserved. A
    receiver that does not recognize the Type value MUST discard the
    message without further processing. Claim messages 
    are sent to the GAAP Group Address (see <xref target="TERMS"/>), a well-known multicast 
    address allocated by IANA (see <xref target="IANA"/>), distinct from the addresses GAAP 
    allocates for applications. When an IPv6 GAAP Group Address is
    used, implementations MUST use an admin-local or
    organization-local IPv6 scope (not link-local scope) for that
    address, so that Claim messages can be forwarded beyond a single
    link when the deployment requires it (see <xref target="IANA"/>
    for the specific address requested). The Claim message is sent in a UDP checksummed 
    packet where the source port is ephemeral and chosen by the sender and the 
    destination port is a well-known port allocated by IANA specifically
    for GAAP (see <xref target="IANA"/>). GAAP can work behind
    firewall devices as long as the GAAP destination port is
    permitted through filters. IPv4 NAT
    does not translate or forward multicast traffic in any standard
    way. If a deployment nonetheless places address or
    port-translating middleboxes on the path, the source-address-dependent 
    mechanisms in this document (Timestamp tie-breaking in
    this section, and the bad-actor list in <xref
    target="RATECONTROLS"/>) are not expected to function correctly
    across that path.</t>

    <t>A sender MUST NOT send a Claim message whose total UDP payload
    exceeds 1232 octets, so that it fits within the 1280-octet IPv6
    minimum MTU without fragmentation, accounting for typical
    IPv6/UDP header overhead. A node with more (group name, group
    address) pairs to claim than fit in one message sends them across
    successive Claim messages, each within the limit. This bounds the
    number of records per message well below the maximum Record Count
    of 255 when Group Names are long. A sender SHOULD keep a
    multi-record Claim message small enough to avoid IP fragmentation
    on the path more generally, per <xref target="RFC8085"/>. The UDP
    checksum MUST be enabled and verified. A receiver MUST discard,
    without further processing, any packet whose UDP payload length
    (as reported by the UDP header) exceeds 1232 octets. A receiver
    MUST also validate the Marker before further processing a packet
    that is within that length, discarding malformed packets as
    described below.</t>

    <figure align="center" title="GAAP Claim Message"> <artwork><![CDATA[
     0                   1                   2                   3
     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |Type=1 |              Reserved                 | Record Count  |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                       0xAAAAAAAA Marker                       |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |                  IPv4 Multicast Group Address                 | \
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  \
    |                                                               |    R
    |                        IPv6 Multicast                         |    e
    |                         Group Address                         |    c
    |                                                               |    o
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+    r
    |                          Timestamp                            |    d
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   /
    |                          Group Name ...                       |  /
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ /
    |                             ...                               |/
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ]]></artwork></figure>

      <t><list style="hanging">
        <t hangText="Packet field descriptions:"></t>
        <t><list style="hanging">
          <t hangText="Type (4 bits):">Claim Message uses value 1;
          value 0 is reserved. See <xref target="IANA"/> for the GAAP
          Message Types registry governing the remaining values. Per
          above, an unrecognized Type value causes the message to be
          discarded before the Marker is examined.</t>
          <t hangText="Reserved (20 bits):">MUST be set to zero by the sender and
          ignored by the receiver.</t>
          <t hangText="Record Count (8 bits):">The number of records in this
          Claim message. See "Record field descriptions" below for the
          maximum permitted value and malformed-message handling.</t>
          <t hangText="Marker (32 bits):">The fixed bit pattern
          0xAAAAAAAA. When a Claim message is not encrypted, the
          sender sets this field to 0xAAAAAAAA in cleartext. When
          encryption is in use, this field is encrypted along with
          the rest of the record data (see <xref target="SECURITY"/>),
          so it will not equal 0xAAAAAAAA on the wire. A receiver
          that has verified the Type value (above) checks the Marker:
          if it equals 0xAAAAAAAA, the packet is an unencrypted Claim
          message: a receiver with no shared key configured processes
          it, and a receiver with a shared key configured MUST drop
          it (see <xref target="SECURITY"/>); if it does not, and the
          receiver
          has a shared key configured, the receiver attempts
          decryption of the record data. If that decryption, or the
          resulting decrypted Marker, does not produce a well-formed
          result, or the receiver has no shared key configured, the
          message MUST be dropped. This single check does not by
          itself distinguish a wrong key, a mismatched encryption
          mechanism between sender and receiver, and a mutated
          packet, from one another; all three are handled identically
          (the packet is dropped).</t>
        </list></t>
        <t hangText="Record field descriptions:"></t>
        <t><list style="hanging">
          <t hangText="IPv4 Multicast Group Address:">a 32-bit
          multicast address in network byte order <xref
          target="RFC1112"/>. If all bits are set to 0, there is no
          IPv4 address being allocated and claimed.</t>

          <t hangText="IPv6 Multicast Group Address:">a 128-bit
          multicast address in network byte order <xref
          target="RFC4291"/>. If all bits are set to 0, there is no
          IPv6 address being allocated and claimed.</t>
          
          <t hangText="Address Field Usage:">The IPv4 and IPv6 address
          fields are fixed length (4 bytes and 16 bytes)
          and their positions in the message are well known. Either or
          both address fields may be populated, consistent with the
          group address types being claimed. If only one address type
          is used, the unused address field MUST be set to 0 by the
          sender and ignored by the receiver. If both address fields
          are set to 0, the message is invalid and MUST be discarded.</t>

          <t hangText="Timestamp:">A 32-bit unsigned integer counting
          seconds since the Unix epoch, 1970-01-01T00:00:00Z, in the
          sender's clock, ignoring leap seconds. The timestamp is
          intended to provide a relative ordering between competing
          claims rather than represent absolute time.</t>

          <t hangText="Timestamp comparison:">Timestamps are compared
          using serial number arithmetic <xref target="RFC1982"/> so
          that a single wraparound of the 32-bit counter (in the year
          2106) does not by itself cause incorrect ordering. If, under
          that comparison, two Timestamps for a Collided Group Address
          are equal, or are neither less than nor greater than one
          another (the case noted in Section 3.2 of <xref
          target="RFC1982"/>, reachable here as a difference of exactly
          2^31 seconds), the tie is broken by the lower value of the
          IPv4 or IPv6 source address (as applicable) of the Claim
          message; the node with the lower source address wins the
          collision. A Timestamp of 0 is treated as an unset clock and
          always loses the tie-break against any other Timestamp. GAAP
          nodes are not required to have synchronized clocks; where a
          monotonic or NTP-disciplined clock source is available, it is
          preferable to use it for the Timestamp. A Timestamp that
          appears to be more than a small, locally configured skew
          allowance ahead of, or behind, the receiver's own clock
          SHOULD be treated with the same tie-breaking rule as an equal
          timestamp rather than assumed to win or lose outright, since
          it may result from a misconfigured or unsynchronized clock,
          including a clock that has not yet been set after boot, which
          typically reads a value far in the past or at zero and would
          otherwise win every collision it is party to. See <xref
          target="SECURITY"/> for the rationale behind this rule in the
          context of a bad-faith Timestamp.</t>

          <t hangText="Group Name:">A variable length group name the
          multicast application uses, encoded as UTF-8 <xref
          target="RFC3629"/>. The string is terminated with a null
          character; a valid UTF-8 encoding never contains a null
          octet as part of a multi-octet character, so this
          delimiter remains unambiguous. Since the Group Name is variable length, subsequent
          records may not occur on a long- or short-word boundary. The
          string MUST NOT exceed 255 octets in length (not including the
          null terminator).</t>

          <t hangText="Multi-record parsing:">Each record consists of
          the fixed-length IPv4 and IPv6 address fields, the
          fixed-length Timestamp field, followed by the variable-length
          null-terminated Group Name. A receiver locates the next
          record, if any, immediately after the null terminator of the
          current record's Group Name; no padding or alignment is
          inserted between records. A zero-length Group Name (a single
          null byte) is syntactically valid but MUST be ignored by the
          receiver, since GAAP does not define a meaning for an empty
          group name. Duplicate records for the same group name and
          group address within one Claim message are valid and MUST be
          treated as a single claim. The maximum Group Name length is
          255 octets, not including the null terminator, and the
          maximum Record Count is 255. Receivers MUST ensure that a
          null terminator for each record's Group Name is present
          within the bounds of the received packet, and that the
          number of records actually present matches Record Count;
          otherwise the message is malformed and MUST be discarded
          without further processing.</t>
        </list></t>
      </list></t>
  </section>

  <section title="GAAP API" anchor="API">
    <t>The GAAP API has the following API calls a multicast
    application will use. A multicast application imports the library
    before using it in its code logic. This section documents a python
    library. The following API is illustrative and shows one possible
    application interface; it is not a normative part of the GAAP
    protocol specification. Implementations are free to expose
    different programming interfaces as long as the on-the-wire
    protocol defined in <xref target="CLAIM"/> is followed.</t>

    <section title="gaap.init()">
      <t>gaap.init() is used to initialize the GAAP API with an
      application callback function. The callback function is called
      when a group address has changed (due to collision) for a group
      name the application allocated.</t>
      <figure><artwork><![CDATA[
<CODE BEGINS>
      
        import gaap

        status = gaap.init(app_callback_func)
        if (status == False):
            print("error")
            exit(1)
        #endif

        def app_callback_func(group_name, group_address)
            print("Group name {} changed to group address {}". \
                format((group_name, group_address))
        #enddef
        
<CODE ENDS>
        ]]></artwork></figure>
    </section>

    <section title="gaap.allocate()">
      <t>gaap.allocate() is used when the application needs a group
      address to send or receive on.</t>
      <figure><artwork><![CDATA[
<CODE BEGINS>
      
        import gaap

        group_name = "my-audio-group"

        group_address = gaap.allocate(group_name)
        if (group_address == None):
            print("error")
            exit(1)
        #endif

        print("Name {} allocated address {}".format(group_name, group_address))
        
<CODE ENDS>
        ]]></artwork></figure>
    </section>

    <section title="gaap.release()">
      <t>gaap.release() is used when an application is finished using a group address.</t>
      <figure><artwork><![CDATA[
<CODE BEGINS>
      
        import gaap

        group_address = gaap.allocate("my-audio-group")

        status = gaap.release(group_address)
        if (status == False):
            print("error")
            exit(1)
        #endif

        print("Released address {}".format(group_address))
        
<CODE ENDS>
        ]]></artwork></figure>
    </section>

    <section title="gaap.close()">
      <t>gaap.close() is used when an application is finished using the GAAP protocol.</t>
      <figure><artwork><![CDATA[
<CODE BEGINS>
      
        import gaap

        #
        # Initialize the GAAP API with no callback function. Return if errored.
        #
        if (gaap.init() == False):
            print("error")
            exit(1)
        #endif

        #
        # Do multicast work by allocating, sending, and receiving group addresses.
        #
        ...

        #
        # Application shutting down. No longer need to run GAAP on local node.
        #
        gaap.close()
        
<CODE ENDS>
        ]]></artwork></figure>
    </section>

  </section>

  <section title="Detailed Protocol Operation" anchor="DETAILS">
    <section title="Allocating Group Addresses">
      <t>When an application needs a group address it provides the
      GAAP API with a group name, the group name is used as input to a
      SHA-256 hash function <xref target="RFC6234"/>, hashing the
      UTF-8 octets of the group name (and, for the collision-fallback
      candidates below, the literal appended ASCII characters, which
      are a subset of UTF-8) directly;
      the null terminator used to mark the end of the Group Name field
      on the wire (see <xref target="CLAIM"/>) is a wire-format
      delimiter only and is never itself part of the hash input.
      Initially, when
      no group address collision is detected the group name is passed
      as a string to the hash function and the Hashed Value's low-order
      bits are used for a group address. The Hashed Value is the
      32-bit unsigned integer formed from the last 4 octets of the
      32-octet SHA-256 digest, taken in network byte order (that is,
      the third-to-last digest octet is the most significant octet of
      the Hashed Value and the last digest octet is the least
      significant). The address is constructed so that it
      always falls within the fixed GAAP IPv4 or IPv6 allocation
      range (see <xref target="operational-considerations"/> for
      the specific ranges), and never outside it. The following
      pseudo-code illustrates the functionality, where GAAP_V4_BASE and
      GAAP_V4_MASK are derived from the fixed GAAP
      IPv4 allocation, and GAAP_V6_BASE and GAAP_V6_MASK are derived
      from the fixed GAAP IPv6 allocation:</t>

      <sourcecode type="pseudocode"><![CDATA[
hashed_value = hashed_value_of(sha256(group_name))
if (v4):
    # GAAP_V4_BASE/GAAP_V4_MASK are derived from the
    # fixed GAAP IPv4 allocation range (239.0.0.0/10).
    group_address = GAAP_V4_BASE | (hashed_value & GAAP_V4_MASK)
#endif
if (v6):
    # GAAP_V6_BASE/GAAP_V6_MASK are derived from the
    # fixed GAAP IPv6 allocation range.
    group_address = GAAP_V6_BASE | (hashed_value & GAAP_V6_MASK)
#endif
return(group_address)
]]></sourcecode>

      <t>For IPv6, GAAP derives only the group ID. The group ID is
      formed by placing the low-order bits of the Hashed Value into
      the host portion of the GAAP group ID range (see <xref
      target="IANA"/> for how many bits that range leaves available).
      The remaining bits of the multicast address - flags, scope, and,
      where the <xref target="RFC3306"/> or <xref target="RFC3956"/>
      formats are in use, the embedded prefix or Rendezvous Point
      information - are determined by the deployment and are outside
      the scope of this document, other than the scope constraint in
      <xref target="IANA"/>.</t>

      <t>When the hash function is used to resolve a collision, the
      following pseudo-code will illustrate how 3 more attempts are
      used to find a unique group address:</t>

      <sourcecode type="pseudocode"><![CDATA[
for append in ["+1", "+2", "+3"]:
    hashed_value = hashed_value_of(sha256(group_name + append))
    group_address = make_group_from_hash(hashed_value)
    collision = send_claim(group_address)
    if (collision == False):
        return(group_address)
#endfor
# All 4 candidate addresses (see "Acceptable Group Hash
# List" in Section 2) collided. gaap.allocate() returns
# an error to the calling application; the application
# MAY retry later or select a different group name. This
# condition MUST be logged and exposed via the local
# management interface (see Section 7), including the group
# name, the four contested addresses, and, where known, the
# claimants.
return(None)
]]></sourcecode>

      <t>Two distinct group names can, by construction of the strings
      above, occasionally produce the same candidate string. For
      example, a group name that itself ends in the literal
      characters "+1" produces the same input to the hash function as
      a different group name's second candidate. This is not treated
      as a special case as it results in an ordinary collision between
      the two group names on that candidate address and resolved by the
      normal collision procedure described in <xref
      target="CLAIM"/> and below, the same as any other hash
      collision between unrelated group names.</t>

      <t>If all 4 candidate addresses for a group name collide, the
      GAAP API returns an error to the application, as shown above.
      GAAP does not define automatic retry behavior in this case,
      since retrying with the same group name would deterministically
      produce the same 4 candidate addresses. This condition is
      permanent for that group name within the deployment domain
      until resolved out of band (for example, by every participant
      independently being reconfigured to use a different group
      name; this document defines no in-band coordination mechanism
      for that). Because the failure would otherwise be silent, a
      GAAP node MUST log this condition and expose it - at minimum,
      the group name, the four contested addresses, and, where known,
      the claimants - through the local management interface
      described in <xref target="operational-considerations"/>. Note
      that a GAAP node receiving a Claim message for the same group
      name and the same group address it is already claiming is not a
      collision, per the Definition of Terms; two independent
      partitions using the same group name are therefore expected to
      converge on the same address once they can communicate.</t>

      <t>When a group address collision is detected by 2 GAAP nodes,
      the node with the earliest timestamp for the group address
      creation wins the collision and keeps using the address. The
      node with a later timestamp has the responsibility to allocate a
      new group address to prevent the collision.</t>
    </section>

    <section title="Claiming Group Addresses">
      <t>When a group address is allocated by a GAAP node, it will
      build and send a Claim message. Included in the Claim message is
      the group name, group address, and timestamp. If the group
      address collides with other GAAP nodes already using the
      address, one of the nodes will send a Claim message to notify
      the colliding node that it needs to allocate a new group
      address.</t>

      <t>Collisions can occur two ways, the first is when multiple group names
      produce the same hash, the second is when different hashes are produced
      but when truncated to fit into a group address format, those bits are
      the same.</t>

      <t>A collision is defined to be the same group address allocated
      to 2 different group names. So if a GAAP node is claiming a
      group address for its group name and a Claim is received with
      the same group name with the same group address, it is not a
      collision. It is simply a peer group participant claiming the
      group address you both agree to be using.</t>

      <t>Each GAAP node will periodically send Claim messages for all
      group names for the applications running on the node. It will do
      this in a multi-record Claim message. The periodic Claim message
      is sent by setting a periodic timer to a random value in the
      range 60 to 66 seconds (a base of 1 minute, plus jitter of 0 to
      10% of 1 minute). When the timer expires, a Claim message is
      sent. Suppression is per (group name, group address) pair: a
      receiver of a Claim message that carries both the same group
      address and the same group name as one the receiver is claiming
      resets its own timer for that pair, thereby suppressing its own
      Claim for it; timers for other group addresses the node is
      claiming are unaffected. This allows only a single GAAP node
      that is using a given (group name, group address) pair to keep
      claiming that the pair is still in use. A Claim message that
      carries the same group address with a different group name is a
      collision (see above) and MUST NOT suppress the receiver's
      timer for its own (group name, group address) pair; the
      receiver instead processes it as described below.</t>

      <t>On receiving a Claim message carrying a group address it is
      currently claiming with a different group name (an ordinary
      collision, as opposed to the new-node case below), a GAAP node
      MUST send a Claim message for that (group name, group address)
      pair after a random delay uniformly distributed in [0, 1]
      second, rather than waiting for its periodic timer, unless it
      receives an equivalent Claim from another node claiming the same
      pair during that delay, in which case it suppresses its own per
      the suppression rule above. A GAAP node MUST NOT send more than
      one such triggered Claim per (group name, group address) pair
      per second.</t>

      <t>A new GAAP node may come up after a group address collision
      has already been resolved by other nodes using a later entry in
      the Acceptable Group Hash List. It will send a Claim message for
      the first group hash from the Acceptable Group Hash List, since
      it has no way to know a prior collision occurred. For a given
      group name, a later-list-position address, once established
      among the group's participants by a prior collision resolution,
      always prevails over an earlier-list-position address for that
      same group name. A GAAP node using a later-list address that
      receives a Claim message carrying its own group name with an
      earlier-list address continues claiming its own (later) address
      and MUST send a triggered Claim, per the delay and rate limit
      above, rather than yielding; a GAAP node using an earlier-list
      address (such as a newly started node) that receives a Claim
      message carrying its own group name with a later-list address
      MUST yield and switch to that later address, rather than
      continuing to use, or allocating, an earlier one. Timestamps
      are not used for this comparison, only position in the
      Acceptable Group Hash List. If more than one existing node
      responds, the new node processes the first valid response it
      receives and MAY discard duplicates; the new node's own Claim
      for the earlier-list address is then withdrawn implicitly by no
      longer being refreshed. If a triggered Claim is lost in transit, the
      node still claiming the later-list address continues to
      periodically re-claim it; the node claiming the earlier-list
      address will observe the unsuppressed Claim on its own next
      periodic timer expiry (or trigger again immediately on receipt
      of the repeated Claim) and retransmit its own Claim, so the
      state converges without a bound on the number of retries.</t>
    </section>

    <section title="Partition Repair">
      <t>There will be network outage situations where all GAAP nodes
      may not receive Claim messages. During a partition, duplicate
      group addresses may be allocated and used by nodes on each side
      of the partition.  During this condition, multicast nodes can
      operate normally and there is no conflict until the partition
      heals. When the partition heals, duplicate group addresses will
      be detected and fixed. The group address with the earliest
      Timestamp is used to determine who keeps the collided group
      address, using the same comparison and tie-breaking rule defined
      in <xref target="CLAIM"/> for equal or skewed Timestamps. All
      others will have to rehash a new group address and have the
      applications start using the new address (meaning senders will
      send to the new group address and receivers will leave the
      collided group and join the new group).</t>

      <t>This repair mechanism detects and resolves the case where
      both sides of a partition end up using the same address for a
      group name (a same-address collision, per the Definition of
      Terms). It does not detect the case where the two sides
      independently fall back to different candidate addresses for
      the same group name (for example, one side falls back to the
      "+1" candidate and the other to "+2", each due to an unrelated
      local collision on its own side): since the two sides are then
      using different addresses, nothing collides, and the group
      remains split on healing. Resolving this case is an open
      question for the experiment described in <xref
      target="RATIONALE"/>.</t>
    </section>

    <section title="Releasing Group Addresses">
      <t>When applications are no longer sending to a group address or
      not joined to a group address, they can inform the GAAP API to
      release the group. Release is purely a local action: no GAAP
      release message is sent on the wire. When this happens, the GAAP
      protocol stops claiming the group address in periodic messages
      and will not respond to a Claim for this address for a different
      group name. It is important for receiver applications to leave
      the group before releasing the group address. If more than one
      local application on the same node uses the same group name (and
      therefore the same group address), the GAAP implementation MUST
      track this locally and continue claiming the group address on
      behalf of the remaining applications until the last local
      application using that group name has released it.</t>
    </section>

    <section title="Sending and Receiving Rate Controls" anchor="RATECONTROLS">
      <t>The periodic and jittered Claim timer described above already
      bounds the sending rate of a well-behaved node; implementations
      SHOULD additionally rate-limit processing of received Claim
      messages per source to bound the cost of handling a misbehaving
      or malicious sender. A cooperating node that identifies a Claim
      message as misbehaving under either of the two cases below SHOULD
      place the apparent source of that message on a local bad-actor
      list and ignore further messages from it: (1) a Claim message
      claiming a group address not derived from one of the group name
      inputs used for the Acceptable Group Hash List (<xref
      target="TERMS"/>); or (2) a source sending Claim
      messages more often than the periodic and triggered-Claim
      procedures in this document permit. Losing a Timestamp
      comparison is not itself grounds for bad-actor listing: exactly
      one side of every ordinary, honest collision loses that
      comparison, and the skew-tolerant treatment of an implausible
      Timestamp in <xref target="CLAIM"/> already prevents a
      fabricated or skewed Timestamp from winning a collision it
      should not, without needing to separately flag the sender. A
      node on the bad-actor list
      MUST NOT have its Claim messages trigger a Claim response, reset
      a periodic timer, or otherwise be treated as suppressing traffic
      from other nodes. Because Claim message source addresses can be
      spoofed, implementations SHOULD bound the size of the bad-actor
      list and treat its entries as advisory hints rather than
      authoritative state; see <xref target="SECURITY"/> for the
      rationale behind each case. GAAP Claim messages, whether for the
      well-known GAAP Group Address or for application group
      addresses, are intended for delivery within the scope implied by
      the multicast group address used (see <xref target="IANA"/>),
      and implementations SHOULD set the IPv4 TTL or IPv6 Hop Limit
      consistently with that scope rather than defaulting to a large
      value.</t>
    </section>
  </section>

<section title="Operational Considerations" anchor="operational-considerations">
  <t>
    This section summarizes operational considerations for GAAP deployment.
    Implementations should provide a local management interface through
    which operators can observe GAAP's local active-claim state (see
    below) and the exhausted-candidate-address condition described in
    <xref target="DETAILS"/>.
  </t>

  <t>
    Group name selection is application deployment specific and may be driven by
    configuration, applications, or provisioning systems. Operators should
    define policies to avoid administrative conflicts.
  </t>

  <t>
    GAAP is expected to co-exist with other multicast address allocation
    mechanisms. Deployments should ensure that GAAP operates within defined
    address ranges to avoid conflicts with non-GAAP assigned multicast addresses. 
    Operators should also be aware that, due to Layer-2 multicast address mapping, 
    multiple IPv4 multicast addresses, allocated by different multicast allocation procedures, 
    may map to the same ethernet multicast MAC address, which may result in hosts 
    receiving multicast traffic for groups to which they did not explicitly subscribe.
  </t>
  
  <t>
  GAAP is intended for deployment within a single routed multicast
  administrative domain that already provides ASM-capable multicast
  routing and forwarding (see below); it is not intended for
  deployment on a single link or IP subnet without such
  infrastructure, and this document does not define behavior for
  GAAP Claim messages crossing administrative domain boundaries. What
  GAAP removes, relative to <xref target="RFC10019"/>'s zeroconf goals,
  is centralized coordination and configuration of the
  application-level group-address-allocation function itself: within
  a domain with multicast routing already provisioned, applications
  obtain and defend unique group addresses without a centralized
  allocation service, explicit per-application configuration, or
  reliance on a single subnet. GAAP's decentralized, periodic
  Claim-based model is not intended as a general replacement for
  existing address allocation mechanisms in traditionally managed
  networks, and networks that already have a centralized or
  administratively assigned multicast address allocation scheme in
  place do not need to deploy GAAP alongside it. A narrower first
  experiment confined to a single link or subnet, exercising the
  derivation, collision detection, and suppression mechanisms without
  requiring ASM/RP infrastructure across the whole domain, is also a
  reasonable deployment for early experimentation; see <xref
  target="RATIONALE"/>.
</t>

  <t>
  GAAP does not require receivers to be GAAP aware. However, all nodes allocating 
  multicast addresses for the same application or group name are expected to use 
  GAAP in order for collision detection to operate correctly. GAAP allocated groups 
  and non GAAP allocated groups may co-exist in the same network when used by 
  different applications or services. Deployment within a coordinated administrative domain 
  is recommended to avoid conflicts between allocation methods.
  </t>

  <t>
  GAAP defines a method for deriving multicast addresses from group
  names and detecting address allocation conflicts. Applications use
  the derived multicast addresses for communication. A group name is
  intended to be shared by, and only by, the participants of a single
  application or session that need to rendezvous on the same group
  address; deployments are responsible for keeping group names unique
  across unrelated applications within their administrative domain,
  for example through a naming convention. GAAP's collision detection
  mechanism handles the case where two unrelated group names happen to
  hash to the same address, but it cannot detect or prevent two
  unrelated applications from being deliberately or accidentally
  configured with the same group name. The creation, distribution and
  discovery of group names are application specific functions and are
  outside the scope of this document.
  </t>

  <t>
    GAAP is stateless in the sense that no node is required to persist
    claim information across restarts, and no node needs to keep a
    complete table of every group name and address in use by other
    nodes in order for the protocol to function; each node only needs
    to track the group names and addresses its own local applications
    have allocated. The soft state a GAAP node does keep locally (its
    own allocations and their periodic timers) is rebuilt from scratch
    on restart via a new round of Claim messages. The local management
    interface referenced above should also allow operators to clear or
    reset this state for operational purposes.
  </t>

  <t>
    Deployments should include protections against spoofed claims using
    appropriate authentication mechanisms, though specific methods are
    outside the scope of this document.
  </t>

  <t>
    Implementations may limit the number of records per message and should
    perform basic validation, including detection of duplicate multicast
    address claims.
  </t>

  <t>
    While strict time synchronization is not required, loosely synchronized
    clocks are recommended to ensure consistent timer behavior.
  </t>

  <t>GAAP requires the underlying network to support IP multicast group
membership (IGMP/MLD) and ASM-capable multicast routing/forwarding
(e.g., PIM-SM) for delivery of Claim messages, consistent with the
routed-administrative-domain scope described above. Applications using
GAAP-allocated addresses will typically also rely on ASM delivery
for their own traffic, though an application with a single known
source could in principle use PIM-SSM for its own data plane once
its address has been allocated and claimed via GAAP.  In IPv4 deployments 
using PIM-SM, the Rendezvous Point(s) serving the GAAP Group Address 
and the GAAP IPv4 allocation range need to be configured to support the full 
range described in <xref target="IANA"/>, since a GAAP node may allocate any address within it.</t>

  <t>In practice, native multicast routing/forwarding support across
  underlay networks remains inconsistent enough that GAAP is expected
  most often to be deployed with Claim messages, and the application
  traffic using GAAP-allocated addresses, carried over an overlay
  network rather than relying directly on the underlay's multicast
  capability. Running over an overlay also allows GAAP to work across
  NAT and other underlay level connectivity restrictions between
  participants, since the overlay is what actually delivers the multicast packets 
  between GAAP nodes. This document does not mandate an overlay and 
  describes GAAP's requirements in terms of the multicast service it needs, which an
  overlay or a natively multicast capable underlay can both provide.</t>

  <t>
  GAAP's application use address ranges are drawn from space that
  requires no per user IANA assignment. Because two independently
  implemented GAAP nodes must still interoperate for GAAP to be genuinely
  decentralized, each address family's range is a single value fixed
  by this document, not an operator-configurable setting. An
  operator can control which applications run in a domain, but not
  which independently written GAAP implementations those
  applications might use, so a configurable range would only be
  reliably compatible with itself.
  </t>

  <t>
  For IPv4, GAAP implementations MUST use 239.0.0.0/10 as the
  application-use range. This is one of the three ranges (239.0.0.0/10, 
  239.64.0.0/10 and 239.128.0.0/10) that Section
  6.2.1 of <xref target="RFC2365"/> records as unassigned and
  available for expansion of the IPv4 Organization-Local scope,
  within the Administratively Scoped Block that <xref
  target="RFC5771"/> records as requiring no IANA assignment policy.
  A /10 keeps collisions infrequent enough, combined with the up to 4
  candidate addresses per group name (see "Acceptable Group Hash
  List" in <xref target="TERMS"/>), that a GAAP node rarely needs to
  fall back past its first candidate address.
  </t>

  <t>
  For IPv6, GAAP implementations MUST use the Experimental Use range
  0xFE000000-0xFEFFFFFF of the 32-bit Group ID space defined by <xref
  target="RFC10028"/> as the application-use range, which states that
  range "may be used for experimentation with new dynamic allocation
  protocols" without IANA action. Other experimental protocols may
  also draw on this same range; GAAP does not have it exclusively,
  which is an inherent property of Experimental status rather than
  something this document can change.
  </t>

  <t>
  The GAAP_V4_MASK and GAAP_V6_MASK referenced in <xref
  target="DETAILS"/> are derived from the fixed ranges above.
  Transitioning any part of the IPv6 range to a permanent Standards
  Action assignment, should GAAP or a successor advance beyond
  Experimental, is a topic for that future document rather than this
  one.
  </t>

    <t>
    This document does not define GAAP-specific behavior for
    inter-AS multicast delivery (e.g., use of the RPF Vector <xref
    target="RFC5496"/>) or for delivery over a Multicast VPN <xref
    target="RFC6513"/> <xref target="RFC6514"/>. GAAP relies
    entirely on the underlying multicast routing and forwarding
    infrastructure for delivery of both Claim messages and
    application traffic. No GAAP-specific considerations beyond
    normal multicast deployment practice are known for these
    environments.
  </t>

</section>

  <section title="Rationale for Experimental Status" anchor="RATIONALE">
  <t>
    GAAP is published as Experimental because decentralized hash-based
    multicast group address allocation has not been deployed. The experiment
    aims to determine whether the collision detection and resolution mechanisms
    defined in this document are sufficient for practical deployments and what
    collision rates occur in networks of varying scale. The experiment is
    considered complete when operational experience demonstrates the protocol
    is suitable for Standards Track or when fundamental limitations are
    identified that require a revision.
  </t>

  <t>
    The scalability of periodic Claim traffic has not yet been
    measured for deployments with large numbers of GAAP nodes
    claiming the same group name. Operators of such deployments
    should monitor Claim traffic volume and tune deployment-specific
    parameters as needed; this is expected to be an area of active
    investigation as operational experience with this experimental
    protocol accumulates. A narrower first experiment confined to a
    single link or subnet, per <xref
    target="operational-considerations"/>, would exercise the
    derivation, collision detection, and suppression mechanisms - where
    every open question in this document lies - without requiring
    ASM/RP infrastructure across a full administrative domain.
  </t>
  </section>

  <section title="Security Considerations" anchor="SECURITY">
   <t>It is suggested that the GAAP protocol run over an encrypted
multicast channel, particularly on networks where GAAP traffic
could be observed or injected by untrusted parties. This document
does not define a mandatory-to-implement encryption mechanism.
Deployments that enable encryption need to agree out of band on a
common mechanism and key management procedure, which could be
difficult in embedded devices with different configurations. The
message Marker (see <xref target="CLAIM"/>) provides an implicit
signal of whether a received Claim message is encrypted: an
unencrypted Claim carries the Marker as cleartext 0xAAAAAAAA, while
an encrypted Claim has the Marker encrypted along with the rest of
the record data and so will not match 0xAAAAAAAA on the wire. A
receiver that sees a non-matching Marker and has a shared key
configured attempts decryption. If that fails, or the receiver has
no shared key configured, the message MUST be dropped. Note that
this single mismatch-triggered check does not distinguish, from the
receiver's perspective, between a wrong or missing key, a mismatched
encryption mechanism between sender and receiver, and a mutated
packet. All three result in the message being dropped, without a
diagnostic distinction between them.</t>

    <t>Because whether a given Claim message is encrypted is
    signaled only implicitly via the Marker rather than declared
    in cleartext, a deployment where some nodes are configured with
    a shared key and others are not does not fail outright. Unkeyed
    nodes can still exchange unencrypted Claims with each other, and
    keyed nodes can exchange encrypted Claims with each other, but a
    keyed node's encrypted Claims are indistinguishable from noise to
    an unkeyed node and vice versa. For a single group name split
    across both populations, this results in two collision-detection
    sub-groups that function correctly within themselves but are
    mutually invisible to one another, rather than a single
    interoperable group. This is a consequence of misconfiguration
    that this document does not attempt to prevent or detect.</t>

    <t>ChaCha20 <xref target="RFC8439"/> without a message
    authentication code has been used to encrypt GAAP messages.
    Deployments choosing an encryption mechanism SHOULD prefer an
    Authenticated Encryption with Associated Data (AEAD) construction
    such as ChaCha20-Poly1305 <xref target="RFC8439"/>, which
    additionally authenticates the message, over ChaCha20 alone.
    Where a shared key is configured with the application, key
    management is a deployment responsibility; see below.</t>
    
    <t>Deployments enabling encryption MUST use a mechanism that provides
    both confidentiality and integrity, such as an AEAD construction
    (e.g., ChaCha20-Poly1305); using ChaCha20 without a message
    authentication code is NOT RECOMMENDED, since a matching decrypted
    Marker on its own is not a cryptographic integrity check over the
    rest of the message. Implementations
    MUST ensure nonce uniqueness per key across all senders sharing that
    key. A receiver configured with a shared key MUST reject an
    unencrypted Claim message rather than process it, to prevent downgrade
    to the unauthenticated base mode. This document does not specify a nonce 
    construction or associated data binding scheme, these are implementation and 
    deployment responsibilities when encryption is enabled.</t>

    <t>Dynamic rekeying mechanisms are outside the scope of this document. 
    However, GAAP can operate with external key management systems, including 
    automated or Dynamic Key Management (DKM) solutions. In the absence of 
    such mechanisms, keys may be provisioned manually. </t>
    
    <t>The base (unauthenticated, unencrypted) mode of GAAP offers no protection 
    against an on-network attacker and is suitable only for deployment within a trusted 
    domain where all participants are assumed non-malicious. When GAAP is deployed 
    with out-of-band pre-shared keys and encryption, an attacker without the shared key 
    cannot forge, replay-with-modification or selectively spoof Claim messages. This 
    substantially mitigates the denial-of-allocation, timestamp-spoofing and 
    bad-actor-list-poisoning threats. This does not protect against an authorized, keyed 
    participant that behaves maliciously.</t>

    <t>Encryption alone does not protect against a legitimate,
    keyed GAAP node behaving badly. The message validation guidance in
    <xref target="CLAIM"/> and the per-source rate limiting and
    duplicate-detection guidance in <xref target="DETAILS"/> apply
    regardless of whether encryption is in use. Rationale for three
    specific threats, with pointers to the normative mitigations
    defined elsewhere in this document, follows:</t>
    <t><list style="numbered">
      <t>Even when an encrypted channel is used, a bad actor could be
      claiming a group address not derived from one of the group name
      inputs used for the Acceptable Group Hash List (see
      Definition of Terms section). This is why cooperating nodes
      ignore such messages rather than send Claim messages to correct
      the bad actor node, and why the bad-actor list is bounded and
      advisory rather than authoritative, per <xref
      target="DETAILS"/>; a bad actor can spoof the source address of
      another node's Claim message, so source-address based
      mitigations are best-effort in any case.</t>

      <t>A bad actor could send a fabricated or artificially early
      Timestamp giving it tie-breaking priority when a group address
      collision occurs. This is not mitigated by placing the sender on
      the bad-actor list, since losing a Timestamp comparison is the
      expected, honest behavior of one side of any ordinary collision
      and is not on its own evidence of bad faith - see <xref
      target="DETAILS"/>. Instead, this is why a Timestamp that
      appears more than a
      small, locally configured skew allowance ahead of, or behind,
      the receiver's own clock is treated as an equal timestamp for
      tie-breaking purposes, per <xref target="CLAIM"/>, rather than
      assumed to win or lose outright - since it may equally result
      from a misconfigured or unsynchronized clock rather than bad
      faith, and this comparison rule denies a fabricated Timestamp
      the outright win it was sent to obtain regardless of intent.</t>

      <t>A bad actor could send messages too often and is not adhering
      to the random delay or periodic timer procedures in this
      document. This is why cooperating nodes ignore messages from a
      node on the bad-actor list rather than reset or cancel timers,
      or send triggered Claims, in response to them, per <xref
      target="DETAILS"/>.</t>
    </list></t>
  </section>

  <section title="IANA Considerations" anchor="IANA">
    <t>This section lists the IANA actions requested for GAAP, one
    per subsection.</t>

    <section title="GAAP UDP Port Numbers">
      <t>IANA is requested to assign one UDP port number for the GAAP
      protocol from the User Ports range, registered per the Service
      Name and Transport Protocol Port Number Registry guidance in
      <xref target="RFC6335"/>. A User Ports assignment, rather than
      use of the Dynamic Ports range, is requested because GAAP
      Claim messages are sent to a well-known, IANA-assigned multicast
      group address by design (see <xref target="CLAIM"/> and "GAAP
      Protocol Multicast Addresses" below); a GAAP node cannot
      negotiate or discover a dynamically-chosen port for this traffic
      out of band the way an application-layer protocol with an
      existing rendezvous mechanism could, since GAAP itself is that
      rendezvous mechanism, so a fixed, documented port is necessary
      for interoperability among independently implemented GAAP nodes
      that have never communicated before. A System Ports assignment
      is not requested, since GAAP does not require privileged-port
      semantics and a User Ports assignment is sufficient.</t>
        <table anchor="iana-port-number" align="center">
          <name/>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Service Name</th>
              <th align="left" colspan="1" rowspan="1">Port Number</th>
              <th align="left" colspan="1" rowspan="1">Transport Protocol</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
              <th align="left" colspan="1" rowspan="1">Assignee</th>
              <th align="left" colspan="1" rowspan="1">Contact</th>
              <th align="left" colspan="1" rowspan="1">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">gaap</td>
              <td align="left" colspan="1" rowspan="1">TBD (User Ports)</td>
              <td align="left" colspan="1" rowspan="1">udp</td>
              <td align="left" colspan="1" rowspan="1">GAAP Control Packets</td>
              <td align="left" colspan="1" rowspan="1">IESG</td>
              <td align="left" colspan="1" rowspan="1">IETF Chair</td>
              <td align="left" colspan="1" rowspan="1">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
    </section>

    <section title="GAAP Protocol Multicast Addresses">
      <t>IANA is requested to assign one multicast address from the
      IPv4 Internetwork Control Block 224.0.1.0/24 <xref
      target="RFC5771"/>, and one multicast address from the IPv6
      Variable Scope Multicast Addresses Block FF0X::/16, for the
      operation of the GAAP protocol. The registry description field
      for each entry should indicate "GAAP". GAAP control messages
      sent to these addresses are intended to reach all GAAP nodes
      within an administrative domain rather than being confined to a
      single link; consistent with that, the IPv4 address is requested
      from the Internetwork Control Block rather than the Local
      Network Control Block. The scope value X selected for the IPv6
      address is expected to be admin-local or organization-local
      (not link-local), so that control messages can be forwarded
      beyond a single link when the deployment requires it; this
      requirement on implementations is stated normatively in <xref
      target="CLAIM"/>.</t>
        <table anchor="iana-mcast-addresses" align="center">
          <name/>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Address</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
              <th align="left" colspan="1" rowspan="1">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">TBD1 (from 224.0.1.0/24)</td>
              <td align="left" colspan="1" rowspan="1">GAAP</td>
              <td align="left" colspan="1" rowspan="1">RFCXXXX</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">TBD2 (from FF0X::/16)</td>
              <td align="left" colspan="1" rowspan="1">GAAP</td>
              <td align="left" colspan="1" rowspan="1">RFCXXXX</td>
            </tr>
          </tbody>
        </table>
    </section>

    <section title="GAAP Message Types">
      <t>IANA is requested to create the "GAAP Message Types"
      registry in a new "Group Address Allocation Protocol (GAAP)"
      registry group. The registration policy is IETF Review. Each
      entry contains a Value (a 4-bit unsigned integer), a Name, and a
      Reference. The initial contents are:</t>

      <table anchor="gaap-message-types" align="center">
        <name/>
        <thead>
          <tr>
            <th align="left" colspan="1" rowspan="1">Value</th>
            <th align="left" colspan="1" rowspan="1">Name</th>
            <th align="left" colspan="1" rowspan="1">Reference</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left" colspan="1" rowspan="1">0</td>
            <td align="left" colspan="1" rowspan="1">Reserved</td>
            <td align="left" colspan="1" rowspan="1">RFCXXXX</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">1</td>
            <td align="left" colspan="1" rowspan="1">Claim</td>
            <td align="left" colspan="1" rowspan="1">RFCXXXX</td>
          </tr>
          <tr>
            <td align="left" colspan="1" rowspan="1">2-15</td>
            <td align="left" colspan="1" rowspan="1">Unassigned</td>
            <td align="left" colspan="1" rowspan="1"></td>
          </tr>
        </tbody>
      </table>
    </section>
  </section>

</middle>

<back>

  <references title='Normative References'>
    <?rfc include="reference.RFC.1112'?>
    <?rfc include="reference.RFC.4291'?>
    <?rfc include="reference.RFC.6234'?>
    <?rfc include="reference.RFC.3629'?>
    <?rfc include="reference.RFC.2119'?>
    <?rfc include="reference.RFC.8174'?>
    <?rfc include="reference.RFC.1982'?>
    <?rfc include="reference.RFC.5771'?>
    <?rfc include="reference.RFC.2365'?>
    <?rfc include="reference.RFC.2236'?>
    <?rfc include="reference.RFC.8085'?>
    <?rfc include="reference.RFC.8439'?>
    <?rfc include="reference.RFC.10028'?>
    <?rfc include="reference.RFC.6335'?>
    <!--<?rfc include='http://xml.resource.org/public/rfc/bibxml3/reference.I-D.ietf-xxx.xml'?> -->
  </references>

  <references title='Informative References'>
    <?rfc include="reference.RFC.2974'?>
    <?rfc include="reference.RFC.8866'?>
    <?rfc include="reference.RFC.6762'?>
    <?rfc include="reference.RFC.2730'?>
    <?rfc include="reference.RFC.2909'?>
    <?rfc include="reference.RFC.3307'?>
    <?rfc include="reference.RFC.3306'?>
    <?rfc include="reference.RFC.3956'?>
    <?rfc include="reference.RFC.2464'?>
    <?rfc include="reference.RFC.5496'?>
    <?rfc include="reference.RFC.6513'?>
    <?rfc include="reference.RFC.6514'?>
    <?rfc include="reference.RFC.10019'?>
  </references>

  <section title="Acknowledgments">
    <t>The authors would like to thank the following people for their
    motivation to start this draft. They include Chris Hopps, Acee
    Lindem, David Lamparter, Jeff Tantsura, Nate Karstens, and
    Lenny Giuliano. And thank you to Gunter Van de Velde for the 
    extensive review prior to publication.</t>
  </section>

  <section title="Document Change Log">

    <t>Note to the RFC Editor: please remove this appendix before
    publication as an RFC.</t>

  <section title="Changes to draft-ietf-pim-gaap-23">
      <t><list style="symbols">
        <t>Submitted September 2026.</t>
        <t>Addressed Eric Vyncke's IESG DISCUSS and COMMENT ballot.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>

  <section title="Changes to draft-ietf-pim-gaap-22">
      <t><list style="symbols">
        <t>Submitted September 2026.</t>
        <t>Follow-up round on the Ketan Talaulikar IESG review.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>

  <section title="Changes to draft-ietf-pim-gaap-21">
      <t><list style="symbols">
        <t>Submitted August 2026.</t>
        <t>Addressed the IESG DISCUSS and COMMENT ballot from Ketan
        Talaulikar.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>

  <section title="Changes to draft-ietf-pim-gaap-20">
      <t><list style="symbols">
        <t>Submitted August 2026.</t>
        <t>Rewrote parts of the Security Considerations section per secdir by Tim Hollebeek. Also included
        a new deployment paragraph per Bo Wu's review.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>       
    
          <section title="Changes to draft-ietf-pim-gaap-19">
      <t><list style="symbols">
        <t>Submitted August 2026.</t>
        <t>Addressed many comments from Tommy, Sasha and Bo Wu as part of the tsvart, rtgdir
        and opsdir last call reviews.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>    

      <section title="Changes to draft-ietf-pim-gaap-18">
      <t><list style="symbols">
        <t>Submitted July 2026.</t>
        <t>Addressed review comments from Gunter Van de Velde. Major changes:
        aligned the IPv4 address pseudocode with the requested /10
        allocation; clarified that GAAP's collision detection is network-layer only;
        softened the encryption interoperability claim and recommended
        ChaCha20-Poly1305 [RFC8439] as a stronger alternative; made
        the dependency on draft-ietf-pim-updt-ipv6-dyn-mcast-addr-grp-id normative;
        added UDP usage guidance per RFC8085. Minor clarifications: distinguished
        the GAAP protocol address from the application allocation range; defined
        multi-record parsing rules and a Timestamp comparison/tie-breaking rule;
        removed the RFC8536 timestamp reference; marked the GAAP API as
        illustrative; fully specified the IPv6 address format; clarified the
        claim/response wait window, per-group-address suppression, and the new-node
        collision state machine; clarified that address release is local-only;
        clarified group-name uniqueness scope and GAAP's soft-state model; and
        aligned the IANA UDP port and multicast address requests with RFC6335 and
        RFC5771 guidance.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>

      <section title="Changes to draft-ietf-pim-gaap-17">
      <t><list style="symbols">
        <t>Submitted June 2026.</t>
        <t>Addressed comments from Stig clarifying IANA requests, adding a paragraph
        on why GAAP is Experimental and wrapping code in CODE BEGINS/ENDS.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>    
  
      <section title="Changes to draft-ietf-pim-gaap-16">
      <t><list style="symbols">
        <t>Submitted June 2026.</t>
        <t>Addressed comments from Stig involving adding a boilerplate, new normative references 
        and changing a few musts to MUST.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>  
  
      <section title="Changes to draft-ietf-pim-gaap-15">
      <t><list style="symbols">
        <t>Submitted April 2026.</t>
        <t>Addressed comments from the IntDir review by Sheng Jiang.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>
  
      <section title="Changes to draft-ietf-pim-gaap-14">
      <t><list style="symbols">
        <t>Submitted April 2026.</t>
        <t>Clarified statements in the Operational Considerations section.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>
  
      <section title="Changes to draft-ietf-pim-gaap-13">
      <t><list style="symbols">
        <t>Submitted April 2026.</t>
        <t>Created a new Operational Considerations section to reflect comments from Med.</t>
        <t>Changes made by Mike.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-12">
      <t><list style="symbols">
        <t>Submitted March 2026.</t>
        <t>Made changes to reflect Sandy comments about clarifying how multiple group names could
        cause collisions as well as clarifying text about encryption.</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-11">
      <t><list style="symbols">
        <t>Submitted March 2026.</t>
        <t>Change IANA request for an IPv4 multicast block from /8 to /10.</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-10">
      <t><list style="symbols">
        <t>Submitted February 2026.</t>
        <t>Incorporated suggestion from Toerless Eckert to add paragraph discussing
        SAP and SDP approaches to multicast group allocation in the Introduction section.</t>
        <t>Added references to RFC2974 (SAP) and RFC4566 (SDP).</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-09">
      <t><list style="symbols">
        <t>Submitted February 2026.</t>
        <t>Be more clear about variable length group names and how subsequent records may
        not be aligned.</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-08">
      <t><list style="symbols">
        <t>Submitted February 2026.</t>
        <t>Incorporated WG review comments from Stig Venaas on GAAP Group Address definition, Timestamp field documentation, encryption interoperability requirements, and IANA allocation discussion.</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-07">
      <t><list style="symbols">
        <t>Submitted January 2026.</t>
        <t>Change draft name in IANA considerations section to point to the IETF
        draft name and not the individual contribution draft name.</t>
        <t>Changes made by Dino.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-06">
      <t><list style="symbols">
        <t>Submitted September 2025.</t>
        <t>Dino fixes Kasten reference.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-05">
      <t><list style="symbols">
        <t>Submitted September 2025.</t>
        <t>Mike adds one-liner to abstract.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-04">
      <t><list style="symbols">
        <t>Submitted August 2025.</t>
        <t>Fix some typos in the GAAP API section.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-03">
      <t><list style="symbols">
        <t>Submitted February 2025.</t>
        <t>Fix some typos in the GAAP API section.</t>
        <t>Update references and docuemnt timer.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-02">
      <t><list style="symbols">
        <t>Submitted September 2024.</t>
        <t>Update references and docuemnt timer.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-01">
      <t><list style="symbols">
        <t>Submitted April 2024.</t>
        <t>Update references and docuemnt timer.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-ietf-pim-gaap-00">
      <t><list style="symbols">
        <t>Submitted October 2023.</t>
        <t>Made draft-farinacci-pim-gaap-06 into WG document per PIM WG consensus.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-06">
      <t><list style="symbols">
        <t>Submitted September 2023.</t>
        <t>Fix Nate last name misspelling.</t>
        <t>Add reference to
        draft-ietf-pim-zeroconf-mcast-addr-alloc-ps (published as
        <xref target="RFC10019"/>) to intro
        section.</t>
        <t>In the IANA Considerations, add IPv6 allocation for GAAP in
        the 0xA0000000-0xAFFFFFFF range, as suggested by Nate.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-05">
      <t><list style="symbols">
        <t>Submitted August 2023.</t>
        <t>Update IANA Considerations section to have IPv6 GAAP
        application allocations come from the registry that
        draft-ietf-pim-updt-ipv6-dyn-mcast-addr-grp-id (published as
        <xref target="RFC10028"/>) is
        creating.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-04">
      <t><list style="symbols">
        <t>Submitted April 2023.</t>
        <t>Added specific text recommended by IANA in the IANA
        Considerations section.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-03">
      <t><list style="symbols">
        <t>Submitted April 2023.</t>
        <t>Changes to reflect comments from PIM and MBONED WG meetings.</t>
        <t>Put IANA Considerations requests in standard request format.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-02">
      <t><list style="symbols">
        <t>Submitted March 2023.</t>
        <t>Fix typos and grammer.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-01">
      <t><list style="symbols">
        <t>Submitted February 2023.</t>
        <t>Updated spec to reflect implementation.</t>
        <t>Add Marker in message format.</t>
        <t>Add definition for the Acceptable Group Hash List.</t>
        <t>Discuss security threats and possible mitigation methods.</t>
	  </list></t>
    </section>

    <section title="Changes to draft-farinacci-pim-gaap-00">
      <t><list style="symbols">
        <t>Initial posting November 2022.</t>
	  </list></t>
    </section>

  </section>

</back>
</rfc>
