<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc category="std" docName="draft-ietf-ippm-capacity-protocol-05"
     ipr="trust200902" updates="">
  <front>
    <title abbrev="Test Protocol: IP Capacity Measurement">Test Protocol for
    One-way IP Capacity Measurement</title>

    <author fullname="Len Ciavattone" initials="L." surname="Ciavattone">
      <organization>AT&amp;T Labs</organization>

      <address>
        <postal>
          <street/>

          <city>St. Johns</city>

          <region>FL</region>

          <code/>

          <country>USA</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>lencia@att.com</email>

        <uri/>
      </address>
    </author>
	
	<author fullname="Ruediger Geib" initials="R." surname="Geib">
      <organization>Deutsche Telekom</organization>

      <address>
        <postal>
          <street>Heinrich Hertz Str. 3-7</street>
          <!-- Reorder these if your country does things differently -->
          <code>64295</code>
          <city>Darmstadt</city>
          <region/>
          <country>Germany</country> 
        </postal>
        <phone>+49 6151 5812747</phone>
        <email>Ruediger.Geib@telekom.de</email>
        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>

 <!--   <author fullname="Al Morton" initials="A." surname="Morton">
      <organization>AT&amp;T Labs</organization>

      <address>
        <postal>
          <street/>

          <city>Chicago</city>

          <region>IL</region>

          <code>60660</code>

          <country>USA</country>
        </postal>

        <phone/>

        <facsimile/>

        <email>acmorton@att.com</email>

        <uri/>
      </address>
    </author>
-->
    <date year="2023"/>

    <abstract>
      <t>This memo addresses the problem of protocol support for measuring
      Network Capacity metrics in RFC 9097, where the method deploys a
      feedback channel from the receiver to control the sender's transmission
      rate in near-real-time. This memo defines a simple protocol to perform
      the RFC 9097 (and other) measurements.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>The IETF's efforts to define Network and Bulk Transport Capacity have
      been chartered and finally progressed after over twenty years.</t>

      <t>In that time, the performance community has seen development of
      Informative definitions in <xref target="RFC3148"/> for Framework for
      Bulk Transport Capacity (BTC), RFC 5136 for Network Capacity and Maximum
      IP-layer Capacity, and the Experimental metric definitions and methods
      in <xref target="RFC8337"/>, Model-Based Metrics for BTC.</t>

      <t>This memo looks at the problem of measuring Network Capacity metrics
      defined in <xref target="RFC9097"/> where the method deploys a feedback
      channel from the receiver to control the sender's transmission rate in
      near-real-time.</t>

      <t>Although there are several test protocols already available for
      support and management of active measurements, this protocol is a major
      departure from their operation:</t>

      <t><list style="numbers">
          <t>UDP transport, not TCP, is used for Control phase messages (e.g.,
          Test Setup, Test Activation) and Data phase messages (e.g., Load,
          Status Feedback).</t>

          <t>TWAMP <xref target="RFC5357"/> and STAMP <xref target="RFC8762"/>
          use the philosophy that one host is a Session-Reflector, sending
          test packets every time they receive a test packet. This protocol
          supports a one-way test with periodic status messages returned to
          the sender. These messages are also a basis for on-path Round-trip
          delay measurements, which are a key input to the load adjustment
          search algorithm.</t>

          <t>OWAMP <xref target="RFC4656"/> supports one-way testing with
          results Fetch at the end of the test session. This protocol supports
          a one-way test and requires periodic status messages returned to the
          sender to support the load adjustment search algorithm.</t>

          <t>The security features of OWAMP <xref target="RFC4656"/> and TWAMP
          <xref target="RFC5357"/> have been described as "unusual", to the
          point that IESG approved their use while also asking that these
          methods not be used again. Further, the common OWAMP <xref
          target="RFC4656"/> and TWAMP <xref target="RFC5357"/> approach to
          security is over 15 years old at this time.</t>
        </list></t>

      <t>Note: the -00 update of this draft will be the last that describes
      version 8 of the protocol in the running code. Updates -01 and -02 of
      the draft correspond to version 9 of the protocol, which strives to
      allow interoperability with version 8. The -03 and -04 updates of the
      draft incorporate new security modes of operation, and correspond to
      version 10 of the protocol.</t>
	  
	  <t>Ruediger Geib joined the team of authors to help completing this 
	  draft. He's not replacing Al Morton, as Al can't be replaced.</t>
<!--  This statement may be removed by the RFC editor -->

      <section title="Requirements Language">
        <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>
      </section>
    </section>

    <section title="Scope, Goals, and Applicability">
      <t>The scope of this memo is to define a protocol to measure the Maximum
      IP-Layer Capacity metric and according to the standardized method. We
      note that aspects of this protocol and end-host configuration can lead
      to support of additional forms of measurement, such as application
      emulation enabled by creative use of the Load Adjustment algorithm.</t>

      <t>The continued goal is to harmonize the specified IP-Layer Capacity
      metric and method across the industry, and this protocol supports the
      specifications of IETF and other Standards Development
      Organizations.</t>

      <t>All active testing protocols currently defined by the IPPM WG are
      UDP-based, but this protocol specifies both control and test protocols
      using UDP transport. Also, a feedback message stream continues operating
      during testing to convey results and dynamic configurations.</t>

      <t>The primary application of the protocol described here is the same as
      in Section 2 of <xref target="RFC7497"/> where:<list style="symbols">
          <t>The access portion of the network is the focus of this problem
          statement. The user typically subscribes to a service with
          bidirectional access partly described by rates in bits per
          second.</t>
        </list></t>
    </section>

    <section title="Protocol Overview">
      <t>This section gives an informative overview of the communication
      protocol between two test end-points (without expressing requirements or
      describing the authentication and encryption aspects; later sections
      provide these details and requirements).</t>

      <t>One end-point takes the role of server, listening for connection
      requests on a well-known destination port from the other end-point, the
      client.</t>

      <t>The client requires configuration of a test direction parameter
      (upstream or downstream test, where the client performs the role of
      sender or receiver, respectively) as well as the hostname or IP address
      of the server in order to begin the setup and configuration exchanges
      with the server.</t>

      <t>The protocol uses UDP transport and has four types of exchanges in
      two phases. Exchanges 1 and 2 constitute the Control phase, while
      exchanges 3 and 4 constitute the Data phase.<list style="numbers">
          <t>Setup Request and Response Exchange: The client requests to begin
          a test by communicating its protocol version, intended security
          mode, and jumbo datagram support. The server either confirms
          matching configuration or rejects the connection. The server also
          communicates the ephemeral port for further communication when
          accepting the client's request.</t>

          <t>Test Activation Request and Response: the client composes a
          request conveying parameters such as the testing direction, the
          duration of the test interval and test sub-intervals, and various
          thresholds. The server then chooses to accept, ignore or modify any
          of the test parameters, and communicates the set that will be used
          unless the client rejects the modifications. Note that the client
          assumes that the Test Activation exchange has opened any co-located
          firewalls and network address/port translators for the test
          connection (in response to the Request packet on the ephemeral port)
          and the traffic that follows. If the Test Activation Request is
          rejected or fails, the client assumes that the firewall will close
          the address/port combination after the firewall's configured idle
          traffic time-out.</t>

          <t>Test Stream Transmission and Measurement Feedback Messages:
          Testing proceeds with one end-point sending load PDUs and the other
          end-point receiving the load PDUs and sending frequent status
          messages to communicate status and transmission conditions there.
          The feedback messages are input to a load-control algorithm at the
          server, which controls future sending rates at either end-point as
          needed. The choice to locate the load-control algorithm at the
          server, regardless of transmission direction, means that the
          algorithm can be updated more easily at a host within the network,
          and at a fewer number of hosts than the number of clients.</t>

          <t>Stopping the Test: When the specified test duration has been
          reached, the server initiates the exchange to stop the test by
          setting the STOP1 indication in load PDUs or status feedback
          messages. The client acknowledges by setting the STOP2 in further
          load PDUs or messages, and a graceful connection termination at each
          end-point follows. (Since the load PDUs and feedback messages are
          used, this exchange is kind of a sub-exchange of 3.) If the Test
          traffic stops or the communication path fails, the client assumes
          that the firewall will close the address/port combination after the
          firewall's configured idle traffic time-out.</t>

          <t>Both the client and server react to unexpected interruptions in
          the Control phase or test traffic. Watchdog timers limit the time a
          server or client will wait before stopping all traffic and
          terminating a test.</t>
        </list></t>

      <t/>
    </section>

    <section title="Parameters and Security-related Operations">
      <t/>

      <section title="Parameters and Definitions">
        <t>For Parameters related to the Maximum IP-Layer Capacity Metric and
        Method, please see Section 4 of <xref target="RFC9097"/>.</t>
      </section>

      <section title="Security Mode Operations">
        <t>There are four security modes of operation: <list style="numbers">
            <t>A REQUIRED mode with authentication during the Control phase:
            Test Setup and Test Activation exchanges.</t>

            <t>An OPTIONAL mode with additional authentication during the Data
            phase: applicable only to the Status Feedback messages.</t>

            <t>An OPTIONAL unauthenticated mode for all messages.</t>

            <t>An OPTIONAL mode with encryption of the Control phase exchanges
            and the Status Feedback messages.</t>

            <t>For full encryption, OPTIONAL operation of both Control and
            Data phase exchanges inside an encrypted tunnel chosen and
            instantiated via a bilateral agreement between the users.</t>
          </list></t>

        <t>The requirements below refer to the PDUs in the sections that
        follow, primarily the authUnixTime field and the authDigest field. The
        roles in this section have been generalized so that the requirements
        for the PDU sender and receiver can be re-used and referred to
        elsewhere.</t>

        <section title="Mode 0: OPTIONAL unauthenticated mode">
          <t>In the OPTIONAL unauthenticated mode, all PDU senders SHALL set
          the authUnixTime field and the authDigest field of all packets to
          all zeroes.</t>

          <t>Any errors (configuration miss-match between client and server)
          found in the Test Setup exchange or the Test Activation exchange
          SHOULD result in silent rejection (no further packets sent on the
          address/port pairs). The exception is when the testing hosts have
          been configured for trouble-shooting Control phase failures and
          rejection messages will aid in the process.</t>
        </section>

        <section title="Mode 1: REQUIRED authentication mode">
          <t>In the REQUIRED authentication mode, the client and the server
          SHALL be configured to use one of a number of shared secret
          keys.</t>

          <t>During the Control phase, the sender SHALL read the current time
          and populate the authUnixTime field, then calculate the authDigest
          field of the request packet (with the authDigest field set to all
          zeroes) according to <xref target="RFC6234"/> and send the packet to
          the receiver.</t>

          <t>Upon reception, the receiver SHALL validate the message PDU for
          validity of the authDigest, the authUnixTime field for acceptable
          immediacy, correct length, and formatting (PDU-specific fields are
          also checked, such as protocol version).</t>

          <t>If the validation fails, the receiver SHOULD NOT continue with
          the Control phase and implement silent rejection (no further packets
          sent on the address/port pairs). The exception is when the testing
          hosts have been configured for trouble-shooting Control phase
          failures and rejection messages will aid in the process.</t>

          <t>If the validation succeeds, the receiver SHALL continue with the
          Control phase and compose a successful response or a response
          indicating the error conditions identified.</t>

          <t>This process SHALL be executed for each request and response in
          the Test Setup exchange (Section 5) and the Test Activation exchange
          (Section 6), amounting to four packets exchanged (plus any "dummy"
          packets needed).</t>
        </section>

        <section title="Mode 2: OPTIONAL authentication for Data phase">
          <t>When using the OPTIONAL authentication during the Data Phase, the
          process SHALL be applied to the Status PDU only. The client sends
          the Status PDU in a downstream test, and the server sends in an
          upstream test.</t>

          <t>The Status PDU sender reads the current time and populates the
          authUnixTime field, then calculates the authDigest field of the
          entire Status PDU (see Section 7.2). The Authentication Fields
          appear at the end of the Status PDU.</t>

          <t>Upon reception of a Status PDU in mode 2, the receiver SHALL
          validate the message PDU for validity of the authDigest, the
          authUnixTime field for acceptable immediacy, correct length, and
          formatting (PDU-specific fields are also checked, such as protocol
          version).</t>

          <t>If the authentication validation fails, the receiver SHALL ignore
          the message. If the watchdog timer expires (due to successive failed
          validations, the test session will prematurely terminate (no further
          load traffic SHALL be transmitted).</t>

          <t>If this optional mode has not been selected, then the
          authUnixTime field and the authDigest field of the Status PDU (see
          Section 7.2) SHALL be populated with all zeroes.</t>
        </section>

        <section title="Mode 3: OPTIONAL Partial Encryption - Control and Status Feedback">
          <t>This mode is mutually exclusive with the Authenticated modes (1
          and 2). The encryption algorithm specified includes integrity
          protection. This mode re-uses several protocol fields beginning with
          "auth", which is reasonable since both authentication and encryption
          are provided (the field format is presented in later sections).</t>

          <t>When using the OPTIONAL Partial Encryption, the process SHALL be
          applied to the Test Setup Request, the Test Setup Response, the Test
          Activation Request, the Test Activation Response, and the Status
          PDU. The client sends the Status PDU in a downstream test, and the
          server sends it in an upstream test.</t>

          <t>In the OPTIONAL Partial encryption mode, the client and the
          server SHALL be configured to use one of a number of shared secret
          keys (see keyID).</t>

          <t>The following encryption specifications SHALL be used:<list
              style="numbers">
              <t>Advanced Encryption Standard, AES, according to Federal
              Information Processing Standards Publication 197 <xref
              target="FIPS-197"/>.</t>

              <t>Galois/Counter Mode (GCM) <xref target="GCM"/></t>

              <t>Key size of 256 bits (fixed block size of 128 bits)</t>
            </list></t>

          <t>The sender (intending to use encryption) SHALL read the current
          time and populate the authUnixTime field of the request packet.
          Then, the sender SHALL encrypt the header up to but not including
          the Initialization Vector (IV) field. The IV SHALL be stored in the
          IV field as-is, with any unused bits as MBZ, and communicated in the
          clear. Finally, the sender SHALL send the packet with encrypted PDU
          to the receiver.</t>

          <t>Upon reception, the receiver SHALL decrypt the PDU using the
          included IV and shared key, and then validate the correct header
          length, ID, and protocol version. Next, check the authUnixTime field
          for acceptable immediacy, and testSessionID for uniqueness. Finally,
          the PDU-specific fields that control the test are processed.</t>

          <t>If the PDU validation fails in the Control phase, the receiver
          SHOULD NOT continue with current exchange and implement silent
          rejection (no further packets sent on the address/port pairs). The
          exception is when the testing hosts have been configured for
          trouble-shooting Control phase failures and rejection messages will
          aid in the process.</t>

          <t>If the validation succeeds in the Control phase, the receiver
          SHALL continue with the current exchange and compose a successful
          response or a response indicating the error conditions identified.
          The response PDU SHALL be encrypted as described above, and the
          packet with encrypted PDU SHALL be sent back to the originator.</t>

          <t>This process SHALL be executed for each request and response in
          the Test Setup exchange (Section 5) and the Test Activation exchange
          (Section 6), amounting to four packets exchanged (plus any "dummy"
          packets needed).</t>

          <t>The Status Feedback Message header PDU SHALL also be encrypted by
          the sender, (with authUnixTime populated and the IV plus MBZ
          remainder in the authDigest field) and subjected to header field
          validations at the receiver after the decryption process.</t>

          <t>If the PDU validation fails for a Status PDU, the receiver SHALL
          ignore the message. If the watchdog timer expires (due to successive
          failed validations, the test session will prematurely terminate (no
          further load traffic SHALL be transmitted).</t>
        </section>

        <section title="OPTIONAL Fully Encrypted mode">
          <t>Two users may wish to make private measurements as part of a
          bilateral agreement, and they might achieve this goal by encrypting
          the traffic of this protocol. However, there is no advantage in a
          native-protocol mode to encrypt all traffic when industry solutions
          for encrypted tunnels are widespread and users can deploy the tunnel
          technology of their choice (<xref target="RFC6071"/> for IPsec and
          <xref target="RFC8446"/> for TLS).</t>

          <t>Although it was suggested, DTLS <xref target="RFC9147"/> could
          not be the basis for a mode with encryption of the all PDUs. The
          replay protection would remove duplicated packets and prevent
          transparent measurement of this impairment.</t>

          <t>The protocol's operation is mostly independent from the tunnel
          operation, but reject messages during the Control phase MAY be sent,
          the same as when configuring the server for troubleshooting. Also,
          the additional encapsulation header size will likely limit the
          maximum UDP payload possible in the Full Encryption mode, and users
          may need to account for the smaller limit.</t>

          <t>Operation of both Control and Data phases inside an encrypted
          tunnel would provide a measure of privacy for all protocol
          operations, but the cost could be inaccurate measurements (from the
          additional processing overhead on Load PDUs at Gigabit rates) and
          reduced scale (when considering a server's capacity to host test
          sessions).</t>

          <t>The primary scope of this protocol is Internet access
          measurement. This scope greatly limits the geography of the
          eavesdropping attack surface, and encourages user-selected
          encryption solutions when needed (although this need may be more
          likely when the protocol is used beyond its intended scope). IPPM
          protocols that have been deployed in this scope have not used the
          encryption option, and at least one of these protocols [TWAMP] has
          been deployed at great scale without using the encrypted mode.</t>

          <t>The key pieces of information exposed by the protocol are found
          in the feedback status messages which are transferred every 50ms
          with default timing. The feedback status messages contain either
          detailed measurements of the previous status interval in a
          downstream test, or the next sending rate for the sender in an
          upstream test. If the feedback status messages are encrypted and
          de-crypted, then the processing time may affect the Round-Trip-Time
          measurements and affect the protocol operation, especially the load
          adjustment search algorithm. Thus, the processing time is a key
          concern for low cost CPE (e.g., residential gateways hosting the
          client function). The test configuration information exchanged
          elsewhere is considered mundane.</t>

          <t>The tunnel approach has some advantages. Some users may want to
          characterize the encrypted tunnel in comparison to transport in the
          clear. It is RECOMMENDED to use the Unauthenticated mode to maximize
          server and client performance for the clear transport case, but some
          may wish to use the Authenticated mode (1). Users can also leave the
          encrypted tunnel up when conducting repeating tests, and reduce test
          setup time to the minimum.</t>
        </section>
      </section>

      <section title="Key Management">
        <t>Section 2 of <xref target="RFC7210"/> specifies a conceptual
        database for long-lived cryptographic keys. The database is
        implemented as a plaintext table, to allow text editor maintenance of
        the key table. The key table SHALL be used with the REQUIRED
        authentication mode and the OPTIONAL authentication mode (using the
        same key). The same key table SHALL be used with the OPTIONAL Partial
        Encryption mode, when used.</t>

        <t>The Key table SHALL have (at least) the following fields, referring
        to Section 2 of <xref target="RFC7210"/>:<list style="symbols">
            <t>AdminKeyName</t>

            <t>LocalKeyName</t>

            <t>AlgID</t>

            <t>Key</t>

            <t>SendLifetimeStart</t>

            <t>SendLifetimeEnd</t>

            <t>AcceptLifetimeStart</t>

            <t>AcceptLifetimeEnd</t>
          </list></t>

        <t>The LocalKeyName SHALL be determined from the corresponding
        protocol field in the PDUs that follow, KeyID.</t>
      </section>

      <section title="Firewall Configuration">
        <t>Normal firewall configuration allows a host to open a bidirectional
        connection using unique source and destination addresses and port
        numbers by sending a packet using that set of 4-tuple values. The
        client's interaction with its firewall depends on this
        configuration.</t>

        <t>The firewall at the server MUST be configured with an open pinhole
        for the server IP address and well-known UDP port of the server.</t>

        <t>Assuming that the firewall administration at the server does not
        allow an open UDP ephemeral port range, then the server MUST send a
        dummy packet to the client with the ephemeral port selected by the
        server and communicated to the client in the Test Setup Response. The
        dummy packet may not reach the client: it may be discarded by the
        client's firewall.</t>

        <t>If the server firewall administration allows an open UDP ephemeral
        port range, then the dummy packet operation is not strictly necessary.
        However, the availability of an open port range policy cannot be
        assumed.</t>
      </section>
    </section>

    <section title="Test Setup Request and Response Exchange">
      <t>All messages defined in this section SHALL use UDP transport. The
      hosts SHALL calculate and include the UDP checksum, or check the UDP
      checksum as necessary.</t>

      <section title="Client Generates Test Setup Request">
        <t>The client SHALL begin the Control phase exchanges by sending a
        Test Setup Request message to the server's control (well-known)
        port.</t>

        <t>The client SHALL simultaneously start a test initiation timer so
        that if the Control phase fails to complete Test Setup and Test
        Activation exchanges in the allocated time, the client software SHALL
        exit (close the UDP socket and indicate an error message to the user).
        Lost messages SHALL NOT be retransmitted. The test initiation timer
        uses the watchdog timeout (for a no-traffic warning) and a longer test
        termination timeout.</t>

        <t>Note: In version 9 and 10, the watchdog timeout is configured as a
        1 second interval to trigger a warning message that the received
        traffic has stopped. The test termination timeout is based on the
        watchdog interval, and implements a wait time of 2 additional seconds
        before triggering a non-graceful termination.</t>

        <t>The Setup Request message PDU SHALL be organized as follows:</t>

        <t><figure>
            <artwork><![CDATA[        uint16_t controlId;   // Control ID = 0xACE1
        uint16_t protocolVer; // Protocol version = 10
        uint8_t cmdRequest;   // Command request (=1 for Request)
        uint8_t cmdResponse;  // Command response (=0 for Request)
        uint16_t maxBandwidth;// Required max. bit rate for the test 
        uint16_t testPort;    // Test port on server  (=0 for Request)
        uint8_t modifierBitmap;// Modifier bitmap
        uint8_t authMode;     // Authentication mode (includes encryption)
        uint16_t testSessionId; // a pseudo-random number, see below.
        uint8_t keyId;        // localKeyName, the numeric key identifier
                                 in the shared Key table
        uint8_t reserved;     // reserved octet
        uint32_t authUnixTime;// Authentication time stamp
        unsigned char authDigest[AUTH_DIGEST_LENGTH] // 32 oct, also IV

]]></artwork>

            <postamble>Figure 1 Test Setup PDU with Request fields populated,
            others explained below</postamble>
          </figure></t>

        <t>The UDP PDU format layout SHALL be as follows (big-endian
        AB):<figure>
            <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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          controlId            |          protocolVer          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  cmdRequest   | cmdResponse   |         maxBandwidth          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|           testPort            |modifierBitmap |   authMode    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|       testSessionId           |     keyId     |   reserved    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         authUnixTime                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                                                               |
|                                                               |
|          authDigest[AUTH_DIGEST_LENGTH](256 bits)             |
|                               or                              |
| Initialization Vector (IV)(up to 256 bits, remaining bits MBZ)|
|                                                               |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>

            <postamble>Figure 2 Test Setup Message PDU Format</postamble>
          </figure></t>

        <t>maxBandwith: when this field is non-zero, it is a specification of
        the maximum bit rate the client expects to send or receive during the
        requested test. The server compares this value to a configured
        limit.</t>

        <t>modifierBitmap: There are two bits currently assigned in this
        bitmap:</t>

        <t><list style="hanging">
            <t hangText="0x01">Do not use Jumbo Frames above sending rates of
            1Gbps</t>

            <t hangText="0x02">Use Traditional MTU (1500 bytes with
            IP-header)</t>
          </list>Other bit positions are currently undefined. A new registry
        will be needed for modifierBitmap assignments; see the IANA
        Considerations Section.</t>

        <t>testSessionId: This is a pseudo-random number used with
        authentication or encryption. The client SHALL select an identifier
        (ID) for the test session which is unlikely to match values used by
        other clients or previous sessions of the local client (e.g., the
        software's process ID or ephemeral source port number). Note: it is
        even more unlikely to have collisions between two clients that
        accidentaly choose the same testSessionID if the authUnixTime is also
        stored with the testSessionID as a pair.</t>

        <t>keyId: This is a localKeyName, the numeric key identifier for a key
        in the shared Key table.</t>

        <t>authMode: The authMode field currently has four values assigned:
        <list style="hanging">
            <t hangText="0:">OPTIONAL unauthenticated mode</t>

            <t hangText="1:">REQUIRED authentication for Control phase</t>

            <t hangText="2:">OPTIONAL authentication for Data phase, in the
            Status Feedback PDU (added to Mode 1 requirements)</t>

            <t hangText="3:">OPTIONAL partial encrypted mode</t>
          </list>plus, a range of values for experimentation: 60 through 63. A
        new registry will be needed for mode values; see the IANA
        Considerations Section.</t>

        <t>authDigest or Initialization Vector field: In Authenticated mode,
        this field contains the authDigest from the SHA-256 function. In
        Partial Encrypted mode, this field begins with the Initialization
        Vector (IV) bits and the remaining (unused) bits are MBZ.</t>

        <section title="Authenticated Modes">
          <t>When operating in either of the authenticated modes (authMode 1
          and authMode 2), the client SHALL follow the requirements of Section
          4.2.2 (and 4.2.3 if applicable), and SHALL generate the authDigest
          field. The SHA-256 calculation SHALL cover the 12 preceding fields.
          The current Unix time SHALL be read and inserted immediately prior
          to the calculation (as immediately as possible). Computation of
          authDigest SHA-256 is specified in <xref target="RFC6234"/>.</t>
        </section>

        <section title="Unauthenticated Mode">
          <t>When operating in Unauthenticated mode (authMode 0), the
          requirements of Section 4.2.1 SHALL be followed.</t>
        </section>

        <section title="Partial Encrypted Mode">
          <t>When operating in the partial encryption mode, the client SHALL
          follow the requirements of Section 4.2.4 and SHALL encrypt the Test
          Setup Request PDU through the authUnixTime field, but no
          further.</t>

          <t>The current Unix time SHALL be read and inserted immediately
          prior to the encryption processing (as immediately as possible).</t>
        </section>
      </section>

      <section title="Server Processes Test Setup Request and Generates Response">
        <t>This Section describes the processes at the server to evaluate the
        Test Setup Request and determine the next steps.</t>

        <section title="Test Setup Request Processing - Rejection">
          <t>When the server receives the Setup Request, it SHALL:</t>

          <t><list style="symbols">
              <t>process/validate the request message by checking the
              authDigest if operating in one of the Authenticated modes as
              prescribed in Section 4.2.2, or</t>

              <t>validate and decrypt the request message using the method
              prescribed in Section 4.2.4 if operating in the Partial
              Encryption mode,</t>
            </list></t>

          <t>and then proceed to evaluate the other fields in the protocol
          header, such as the protocol version, the controlID (to validate the
          type of message, Setup), the maximum Bandwidth requested for the
          test, and the modifierBitmap for use of options such as Jumbo
          datagram status and traditional MTU (1500 bytes). The value in the
          authUnixTime field is a 32-bit time stamp and a 5 minute tolerance
          window (+/- 2.5 minutes) SHALL be used (if in one of the
          Authenticated modes) to distinguish a subsequent replay of a Test
          Setup Request. Replay of most other fields would remain valid if
          there was no authUnixTime field in the PDU, although the
          testSessionId MUST be unique as well. The authUnixTime is covered by
          the authDigest hash, as specified earlier.</t>

          <t>If the client has selected options for:<list style="symbols">
              <t>Jumbo datagram support status (modifierBitmap),</t>

              <t>Traditional MTU (modifierBitmap),</t>

              <t>Authentication mode (authMode)</t>
            </list></t>

          <t>that do not match the server configuration, the server MUST
          reject the Setup Request.</t>

          <t>If the Setup Request must be rejected (due to the reasons in the
          Command Response, CRSP, codes listed below), the conditions below
          determine whether the server sends a response:</t>

          <t><list style="symbols">
              <t>In Authenticated modes, if the authDigest is valid, a Test
              Setup Response SHALL be sent back to the client with a
              corresponding command response value indicating the reason for
              the rejection. The server SHALL follow the requirements of
              Section 4.2.2 and insert the autDigest in the response.</t>

              <t>In Authenticated modes, if the authDigest is invalid, then
              the Test Setup Request SHOULD fail silently. The exception is
              for operations support: server administrators using
              Authentication are permitted to send a Setup Response to support
              operations and troubleshooting.</t>

              <t>If unauthenticated mode is selected, the Test Setup Request
              SHALL fail silently.</t>

              <t>If Partial Encrypted mode is used, only valid Test Setup
              Request packets will be decrypted for server processing and a
              Test Setup Response is REQUIRED. The server SHALL follow the
              requirements of Section 4.2.4 to encrypt the response.</t>

              <t>If Full Encrypted mode is used, only valid Setup request
              packets will be forwarded up the stack for server processing and
              a Test Setup Response is possible if the server is configured to
              send responses for troubleshooting.</t>
            </list>The additional, non-authentication and
          non-encryption-related circumstances when a server SHALL not
          communicate the appropriate Command Response Code for an error
          condition (fail silently) are when: <list style="numbers">
              <t>the Setup Request PDU size is not correct,</t>

              <t>the control ID is invalid, or</t>

              <t>a directed attack has been detected,</t>
            </list>in which case the server will allow setup attempts to
          terminate silently. Attack detection is beyond the scope of this
          specification.</t>

          <t>When the server replies to the Test Setup Request message, the
          PDU SHALL be organized as follows:</t>

          <t><figure>
              <artwork><![CDATA[        uint16_t controlId;   // Control ID = 0xACE1
        uint16_t protocolVer; // Protocol version = 10
        uint8_t cmdRequest;   // Command request = 2 (reply)
        uint8_t cmdResponse;  // Command response = <see table below>
        uint16_t maxBandwidth;// Required bandwidth 
        uint16_t testPort;    // Test port on server(available port in Resp)
        uint8_t modifierBitmap;// Modifier bitmap (see table below)
        uint8_t authMode;     // Authentication mode
        uint16_t testSessionId;    // client-selected pseudo-random number 
                                      for the test session
        uint8_t keyId;        // localKeyName, an index to the 
                                 shared Key table
        uint8_t reserved;     // reserved octet
        uint32_t authUnixTime;// Authentication time stamp
        unsigned char authDigest[AUTH_DIGEST_LENGTH] //32 octets, also IV

cmdResponse Code Field: Command Server Response Codes (CSRP) (decimal)
CHSR_CRSP_NONE     0 = None (value used by client in Request)
CHSR_CRSP_ACKOK    1 = Acknowledgement
CHSR_CRSP_BADVER   2 = Bad Protocol Version
CHSR_CRSP_BADJS    3 = Invalid Jumbo datagram option
CHSR_CRSP_AUTHNC   4 = Unexpected Authentication in Setup Request
CHSR_CRSP_AUTHREQ  5 = Authentication missing in Setup Request
CHSR_CRSP_AUTHINV  6 = Invalid authentication method
CHSR_CRSP_AUTHFAIL 7 = Authentication failure
CHSR_CRSP_AUTHTIME 8 = Authentication time is invalid in Setup Request
CHSR_CRSP_NOMAXBW  9  = No Maximum test Bit rate specified
CHSR_CRSP_CAPEXC   10 = Server Maximum Bit rate exceeded
CHSR_CRSP_BADTMTU  11 = MTU option does not match Server

maxBandwidth Field MSB Code Bit:
CHSR_USDIR_BIT 0x8000 Bandwidth upstream direction bit, Set for Upstream

modifierBitmap Code Field: Setup
CHSR_JUMBO_STATUS    0x01 = set to use Jumbo datagram sizes above 1Gbps
CHSR_TRADITIONAL_MTU 0x02 = set to use datagrams for 1500 byte packets

]]></artwork>

              <postamble>Figure 3 Organization/Definitions of Server Test
              Setup Response - Rejection</postamble>
            </figure></t>

          <t>There is a set of Command Response codes, beginning with: "2 =
          Bad Protocol Version", one of which SHOULD be communicated to
          indicate the cause when an error condition detected and testing
          cannot proceed:</t>

          <t><figure>
              <artwork><![CDATA[Decimal values
2 = Bad Protocol Version
3 = Invalid Jumbo datagram option
5 = Authentication missing in Setup Request
4 = Unexpected Authentication in Setup Request
6 = Invalid authentication method (SHA-256 not used)
7 = Authentication failure (both shared secret and time)
8 = Authentication time is invalid in Setup Request (replay attack)
9  = No Maximum test Bit rate specified
10 = Server Maximum Bit rate exceeded
11 = MTU option does not match Server
]]></artwork>

              <postamble>Figure 4 Command Response Error Codes</postamble>
            </figure></t>

          <t>When indicating a Bad Protocol Version error and sending a
          response, the server SHALL update the protocolVer field in the Test
          Setup Response to indicate the current version supported.</t>
        </section>

        <section title="Test Setup Request Processing - Acceptance">
          <t>If the server finds that the Setup Request matches its
          configuration and is otherwise acceptable, the server SHALL initiate
          a new connection to receive the Test Activation Request and other
          traffic from the client, using a new UDP socket allocated from the
          UDP ephemeral port range. Then, the server SHALL start a watchdog
          timer (to terminate the connection in case the client goes silent),
          and sends the Setup Response back to the client (see below for
          composition).</t>

          <t>When the Setup Request is accepted by the server, a Setup
          Response SHALL be sent back to the client with a corresponding
          command response value indicating 1 = Acknowledgement.<figure>
              <artwork><![CDATA[        uint16_t controlId;   // Control ID = 0xACE1
        uint16_t protocolVer; // Protocol version = 10
        uint8_t cmdRequest;   // Command request = 2 (reply)
        uint8_t cmdResponse;  // Command response = 1 (ACK)
        uint16_t maxBandwidth;// Required bandwidth (added in v9)
        uint16_t testPort;    // Test port on server  
                                 (available port in Response)
        uint8_t modifierBitmap;// Modifier bitmap (see table below)
        uint8_t authMode;     // Authentication mode
        uint16_t testSessionId;    // client-selected pseudo-random 
                                      number for the test session
        uint8_t keyId;        // localKeyName, an index to the 
                                 shared Key table
        uint8_t reserved;     // reserved octet
        uint32_t authUnixTime;// Authentication time stamp
        unsigned char authDigest[AUTH_DIGEST_LENGTH] // 32 octets
        uint8_t keyId;        // localKeyName, a numeric identifier of 
                                 a key in the shared Key table
        uint8_t reserved;     // reserved octet
        uint32_t authUnixTime;// Authentication time stamp
        unsigned char authDigest[AUTH_DIGEST_LENGTH] //32 octets,also IV
]]></artwork>

              <postamble>Figure 5 Organization/Definitions of Server Test
              Setup Response - Acceptance</postamble>
            </figure></t>

          <t>The Setup Response SHALL include the server-selected ephemeral
          port number (testPort field) for the new socket, and this
          server-selected UDP port SHALL be used for all subsequent
          communication.</t>

          <t>The server SHALL confirm, coerce, or populate the values of:
          <list style="symbols">
              <t>protocolVersion</t>

              <t>Jumbo datagram support status (modifierBitmap),</t>

              <t>Traditional MTU (modifierBitmap),</t>

              <t>authMode (will be all zeroes if unauthenticated)</t>

              <t>maxBandwidth</t>

              <t>testPort (ephemeral port)</t>

              <t>testSessionId</t>

              <t>keyId</t>

              <t>authUnixTime (will be all zeroes if unauthenticated mode)</t>

              <t>authDigest or IV (will be all zeroes if unauthenticated)</t>
            </list></t>

          <t>for the client's use on the new connection in its Setup Response,
          and calculate authDigest in the authenticated modes.</t>

          <t>When the server prepares to send the Test Setup Response, it
          SHALL:</t>

          <t><list style="symbols">
              <t>add the authUnixTime and calculate the authDigest for the
              response message using the method prescribed in Section 4.2.2 if
              operating in one of the Authenticated modes, or</t>

              <t>add the authUnixTime and encrypt the request message using
              the method prescribed in Section 4.2.4 if operating in the
              Partial Encryption mode,</t>
            </list></t>

          <t>and then send the Test Setup Response message to the client.</t>

          <t>Finally, the new UDP connection associated with the new socket
          and port number is opened, and the server awaits communication
          there.</t>

          <t>To ensure that the server's local firewall will successfully
          deliver packets received for the new ephemeral port, the server
          SHALL immediately send a "dummy" packet with the corresponding
          4-tuple values including the source and destination IP addresses and
          port numbers. The source port SHALL be the new ephemeral port. This
          operation allows communication to the server even when the server's
          local firewall prohibits open ranges of ephemeral ports. The packet
          is not expected to arrive successfully at the client if the
          client-side firewall blocks unexpected traffic. If the "dummy"
          packet arrives at the client, it is a confirmation that further
          exchanges are possible on the new port-pair (but this is not
          strictly necessary).</t>

          <t>The four Test Setup PDU fields shown below SHALL be used as the
          "dummy" packet PDU.<figure>
              <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
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |          controlId            |          protocolVer          |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |  cmdRequest   | cmdResponse   |           reserved            |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>

              <postamble>Figure 6 The "dummy" Packet PDU Format</postamble>
            </figure></t>

          <t>If a Test Activation Request is not subsequently received from
          the client on this new ephemeral port number before the watchdog
          timer expires, the server SHALL close the socket and deallocate the
          port.</t>
        </section>
      </section>

      <section title="Setup Response Processing at the Client">
        <t>When the client receives the Test Setup Response, it SHALL:</t>

        <t><list style="symbols">
            <t>process/validate the response message by checking the
            authDigest if operating in one of the Authenticated modes as
            prescribed in Section 4.2.2, or</t>

            <t>validate and decrypt the response message using the method
            prescribed in Section 4.2.4 if operating in the Partial Encryption
            mode,</t>
          </list></t>

        <t>and then proceed to evaluate the other fields in the protocol,
        beginning with the protocol version, the controlID (to validate the
        type of message, Test Setup), cmdRequest for the role of the message
        (SHOULD be 2, Test Setup Response), the maxBandwidth requested for the
        test (if in use), and the modifierBitmap for use of options such as
        Jumbo datagram status and traditional MTU (1500 bytes). The value in
        the authUnixTime field is a 32-bit time stamp and a 5 minute tolerance
        window (+/- 2.5 minutes) SHALL be used (if in one of the Authenticated
        or Encrypted modes) to distinguish a subsequent replay of a Test Setup
        Response. Replay of most other fields would remain valid if there was
        no authUnixTime field in the PDU, although the testSessionId MUST be
        unique as well. The authUnixTime is covered by the authDigest hash or
        encrypted, as specified earlier.</t>

        <t>The authUnixTime field is expected to be MBZ in unauthenticated
        mode.</t>

        <t>IF the cmdResponse value indicates an error (values &gt;1) the
        client SHALL display/report a relevant message to the user or
        management process and exit. If the client receives a Command Server
        Response code (CRSP) that is not equal to one of the codes defined
        above, then the client MUST terminate the connection and terminate
        operation of the current Setup Request. If the Command Server Response
        code (CRSP) value indicates success (cmdResponse=1) the client SHALL
        compose a Test Activation Request with all the test parameters it
        desires, such as the test direction, the test duration, etc., as
        described below.</t>
      </section>
    </section>

    <section title="Test Activation Request and Response">
      <t>This section is divided according to the sending and processing of
      the client, server, and again at the client.</t>

      <t>All messages defined in this section SHALL use UDP transport. The
      hosts SHALL calculate and include the UDP checksum, or check the UDP
      checksum as necessary.</t>

      <section title="Client Generates Test Activation Request">
        <t>Upon a successful setup exchange, the client SHALL then compose and
        send the Test Activation Request to the UDP port number the server
        communicated in the Test Setup Response (the new ephemeral port, and
        not the well-known port).</t>

        <t>The client SHALL compose Test Activation Request as follows:<figure>
            <artwork><![CDATA[        uint16_t controlId;          // Control ID = 0xACE2
        uint16_t protocolVer;        // Protocol version = 10
        uint8_t cmdRequest;          // Command request, 1 = upstream, 
                                        2 = downstream
        uint8_t cmdResponse;         // Command response(set to 0 by client)
        uint16_t lowThresh;          // Low delay variation threshold
        uint16_t upperThresh;        // Upper delay variation threshold
        uint16_t trialInt;           // Status feedback/trial interval (ms)
        uint16_t testIntTime;        // Test interval time (sec) (duration, T)
        uint8_t subIntPeriod;        // Sub-interval period (sec)
        uint8_t ipTosByte;           // IP ToS byte for testing
        uint16_t srIndexConf;        // Configured sending rate index 
                                        (see Note below)
        uint8_t useOwDelVar;         // Use one-way delay instead of RTT
        uint8_t highSpeedDelta;      // High-speed row adjustment delta
        uint16_t slowAdjThresh;      // Slow rate adjustment threshold
        uint16_t seqErrThresh;       // Sequence error threshold
        uint8_t ignoreOooDup;        // Ignore Out-of-Order/Duplicate 
                                        datagrams
        uint8_t modifierBitmap;      // Modifier bitmap
        uint8_t rateAdjAlgo;         // Rate adjustment algo.
        uint8_t reserved1;           // reserved octet (alignment)
        MBZ 28 Octets
        uint16_t testSessionId; // a pseudo-random number, see below.
        uint8_t keyId;          // localKeyName, a numeric identifier of 
                                   a key in the shared Key table
        uint8_t reserved2;      // reserved octet (alignment)
        uint32_t authUnixTime;  // Authentication time stamp
        unsigned char authDigest[AUTH_DIGEST_LENGTH] // 32 oct, also IV


Control Header Test Activation Command Request Values:
CHTA_CREQ_NONE      0 = No Request
CHTA_CREQ_TESTACTUS 1 = Request test in Upstream direction (client to 
                        server, client in the role of sending test packets)
CHTA_CREQ_TESTACTDS 2 = Request test in Downstream direction (server to 
                        client, client's role is receiving test packets)

modifierBitmap Code Field: Test Activation
CHTA_SRIDX_ISSTART 0x01 = Set when srIndexConf IS START rate for search
CHTA_RAND_PAYLOAD  0x02 = Set for RANDOMIZED UDP payload 

rateAdjAlgo Values:
CHTA_RA_ALGO_B   = 0              // 0 = Algo. B, allows Algo. expansion
CHTA_RA_ALGO_MIN = CHTA_RA_ALGO_B // Limit check (with Algo B)
CHTA_RA_ALGO_MAX = CHTA_RA_ALGO_C// Limit check (with Algo C) 

Control Header Test Activation Command Response Values:
CHTA_CRSP_NONE     0 = Used by client when making a Request
CHTA_CRSP_ACKOK    1 = Used by Server in affirmative Response
CHTA_CRSP_BADPARAM 2 = Used by Server to indicate an error; 
                       bad parameter; reject;
]]></artwork>

            <postamble>Figure 7 Organization/Definitions of Client Test
            Activation Request</postamble>
          </figure></t>

        <t>The content of many of the unique fields in Figure 7 is defined
        above, or defined in Section 4 of <xref target="RFC9097"/> and
        Appendix A of <xref target="RFC9097"/>. Additional definitions are
        given below.<list style="hanging">
            <t hangText="srIndexConf">srIndexConf is the Send Rate table index
            of the configured fixed or starting send rate (depending on
            whether CHTA_SRIDX_ISSTART is cleared or set respectively).</t>
          </list></t>

        <t>The UDP PDU format of the Test Activation Request is as follows
        (big-endian AB):<figure>
            <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          controlId            |          protocolVer          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  cmdRequest   | cmdResponse   |           lowThresh           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         upperThresh           |           trialInt            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         testIntTime           | subIntPeriod  |  ipTosByte    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         srIndexConf           |  useOwDelVar  |highSpeedDelta |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         slowAdjThresh         |         seqErrThresh          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   | ignoreOooDup  |modifierBitmap |  rateAdjAlgo  |   reserved1   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .                                                               .
   .                          MBZ (28 octets)                      . 
   .                                                               .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       testSessionId           |     keyId     |   reserved2   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         authUnixTime                          | 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                                                               |
   |                                                               |
   |          authDigest[AUTH_DIGEST_LENGTH](256 bits)             |
   |                               or                              |
   | Initialization Vector (IV)(up to 256 bits, remaining bits MBZ)|
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Note: The 28 MBZ octets are replaced by the Send Rate Structure
in a Test Activation Response for an upstream test.

]]></artwork>

            <postamble>Figure 8 Test Activation Request PDU Format</postamble>
          </figure></t>

        <t>The client SHALL apply the configuration for<list style="symbols">
            <t>testPort</t>

            <t>modifierBitmap</t>

            <t>authMode</t>

            <t>testSessionID</t>

            <t>keyID</t>

            <t>and the remaining fields are populated based on default values
            or command-line options</t>
          </list></t>

        <t>requested in the Test Setup Request and communicated/confirmed by
        the server in the Test Setup Response.</t>

        <section title="Authenticated Modes">
          <t>When operating in either of the authenticated modes (authMode 1
          and authMode 2), the client SHALL follow the requirements of Section
          4.2.2 (and 4.2.3 if applicable), and SHALL generate the authDigest
          field. The SHA-256 calculation SHALL cover all the preceding fields.
          The current Unix time SHALL be read and inserted immediately prior
          to the calculation (as immediately as possible). Computation of
          authDigest SHA-256 is specified in <xref target="RFC6234"/>.</t>
        </section>

        <section title="Unauthenticated Mode">
          <t>When operating in Unauthenticated mode (authMode 0), the
          requirements of Section 4.2.1 SHALL be followed.</t>
        </section>

        <section title="Partial Encrypted Mode">
          <t>When operating in the partial encryption mode, the client SHALL
          follow the requirements of Section 4.2.4 and SHALL encrypt the Test
          Activation Request PDU through the authUnixTime field, but no
          further.</t>

          <t>The current Unix time SHALL be read and inserted immediately
          prior to the encryption processing (as immediately as possible).</t>
        </section>
      </section>

      <section title="Server Processes Test Activation Request and Generates Response">
        <t>After the server receives the Test Activation Request on the new
        connection, it MUST choose to accept, ignore or modify any of the test
        parameters.</t>

        <section title="Server Rejects or Modifies Request">
          <t>When evaluating the Test Activation Request, the server MAY allow
          the client to specify its own fixed or starting send rate.</t>

          <t>Alternatively, the server MAY enforce a maximum limit of the
          fixed or starting send rate which the client can successfully
          request. If the client's Test Activation Request exceeds the
          server's configured maximum, the server MUST either reject the
          request or coerce the value to the configured maximum bit rate, and
          communicate that maximum to the client in the Test Activation
          Response. The client can of course choose to end the test, as
          appropriate.</t>

          <t>Other parameters where the server has the OPTION to coerce the
          client to use values other than those in the Test Activation Request
          are (grouped by role):</t>

          <t><list style="symbols">
              <t>Load Adjustment Algo: lowThresh, upperThresh, useOwDelayVar,
              highSpeedDelta, slowAdjThresh, seqErrThresh, highSpeedDelta,
              ignoreOooDup, rateAdjAlgo.</t>

              <t>Test duration/intervals: trialInt, testIntTime,
              subIntPeriod</t>

              <t>Packet marking: ipTosByte</t>
            </list>Coersion is a step toward performing a test with the
          server-configured values; even though the client might prefer
          certain values the server gives the client an opportunity to run a
          test with different values than the preferred set.</t>

          <t>Note that the server has the option of completely rejecting the
          request and sending back an appropriate command response value:</t>

          <t>uint8_t cmdResponse; // Command response (set to 2, error)</t>

          <t>Whether this error response is sent or not depends on the
          Security mode of operation and the outcome of authDigest
          validation.</t>

          <t>If the Test Activation Request must be rejected (due to the
          reasons in the Command Response value=2 listed above), and</t>

          <t><list style="symbols">
              <t>In Authenticated modes, if the authDigest is valid, a Test
              Activation Response SHALL be sent back to the client with a
              corresponding command response value indicating the reason for
              the rejection. The server SHALL follow the requirements of
              Section 4.2.2 and insert the autDigest in the response.</t>

              <t>In Authenticated modes, if the authDigest is invalid, then
              the Test Activation Request SHOULD fail silently. The exception
              is for operations support: server administrators using
              Authentication are permitted to send a Setup Response to support
              operations and troubleshooting.</t>

              <t>If unauthenticated mode is selected, the Test Setup Request
              SHALL fail silently.</t>

              <t>If Partial Encrypted mode is used, only valid Test Activation
              Request packets will be decrypted for server processing and a
              Test Activation Response is REQUIRED. The server SHALL follow
              the requirements of Section 4.2.4 to encrypt the response.</t>

              <t>If Full Encrypted mode is used, only valid Test Activation
              Request packets will be forwarded up the stack for server
              processing and a Test Setup Response is possible if the server
              is configured to send responses for troubleshooting.</t>
            </list></t>

          <t>The additional, non-authentication and non-encryption-related
          circumstances when a server SHALL not communicate the appropriate
          Command Response Code for an error condition (fail silently) are
          when: <list style="numbers">
              <t>the Test Activation Request PDU size is not correct,</t>

              <t>the control ID is invalid, or</t>

              <t>a directed attack has been detected,</t>
            </list>in which case the server will allow Test Activation
          Requests to terminate silently. Attack detection is beyond the scope
          of this specification.</t>
        </section>

        <section title="Server Accepts Request and Generates Response">
          <t>When the server sends the Test Activation Response, it SHALL set
          the cmd Response field to:</t>

          <t>uint8_t cmdResponse;// Command response (set to 1, ACK)</t>

          <t>The server SHALL generate the Test Activation Response,
          populating all parameters in the Test Activation Response to
          indicate each value acceptance/changes/coersion to the client.</t>

          <t>If the client has requested an upstream test, the server
          SHALL:</t>

          <t><list style="symbols">
              <t>include the transmission parameters from the first row of the
              sending rate table in the Sending Rate Structure (defined
              below), OR</t>

              <t>use the parameters from the configured send rate index
              (srIndexConf) of the sending rate table for a fixed rate test,
              or the starting rate index for a test with Load Adjustment (this
              option indicated in the Test Activation modifierBitmap) when
              these options are present.</t>
            </list></t>

          <t>When generating the Test Activation Response (acceptance) for an
          upstream test, the server SHALL replace the 28 MBZ octets of the of
          the Test Activation Request with the Sending Rate Structure, which
          SHALL be organized as follows:</t>

          <t><figure>
              <artwork><![CDATA[        uint32_t txInterval1; // Transmit interval (us)
        uint32_t udpPayload1; // UDP payload (bytes)
        uint32_t burstSize1;  // UDP burst size per interval
        uint32_t txInterval2; // Transmit interval (us)
        uint32_t udpPayload2; // UDP payload (bytes)
        uint32_t burstSize2;  // UDP burst size per interval
        uint32_t udpAddon2;   // UDP add-on (bytes)]]></artwork>

              <postamble>Figure 9 Sending Rate Structure
              Definitions</postamble>
            </figure></t>

          <t>with<figure>
              <artwork><![CDATA[   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          txInterval1                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          udpPayload1                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          burstSize1                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          txInterval2                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          udpPayload2                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          burstSize2                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          udpAdddon2                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>

              <postamble>Figure 10 Sending Rate Structure Format</postamble>
            </figure></t>

          <t>If activation continues, server prepares the new connection for
          an upstream OR downstream test.</t>

          <t>In the case of a downstream test, the server SHALL prepare to
          send with either a single timer to send status PDUs at the specified
          interval OR dual timers to send load PDUs based on <list
              style="symbols">
              <t>the transmission parameters from the first row of the sending
              rate table in the Sending Rate Structure, OR</t>

              <t>the transmission parameters of the configured send rate index
              (srIndexConf) of the sending rate table, or starting rate index
              (indicated in the Test Activation modifierBitmap) when these
              options are present.</t>
            </list></t>

          <t>The server SHALL then send the Test Activation Response back to
          the client, update the watchdog timer with a new time-out value, and
          set a test duration timer to eventually stop the test. Once the
          requirements of the chosen security mode have been met, the Test
          Activation Response is ready to be sent to the client:</t>

          <section title="Authenticated Modes">
            <t>When operating in either of the authenticated modes (authMode 1
            and authMode 2), the server SHALL follow the requirements of
            Section 4.2.2 (and 4.2.3 if applicable), and SHALL generate the
            authDigest field. The SHA-256 calculation SHALL cover all the
            preceding fields. The current Unix time SHALL be read and inserted
            immediately prior to the calculation (as immediately as possible).
            Computation of authDigest SHA-256 is specified in <xref
            target="RFC6234"/>.</t>
          </section>

          <section title="Unauthenticated Mode">
            <t>When operating in Unauthenticated mode (authMode 0), the
            requirements of Section 4.2.1 SHALL be followed.</t>
          </section>

          <section title="Partial Encrypted Mode">
            <t>When operating in the partial encryption mode, the client SHALL
            follow the requirements of Section 4.2.4 and SHALL encrypt the
            Test Activation Response PDU through the authUnixTime field, but
            no further.</t>

            <t>The current Unix time SHALL be read and inserted immediately
            prior to the encryption processing (as immediately as
            possible).</t>
          </section>
        </section>
      </section>

      <section title="Client Processes Test Activation Response">
        <t>When the client receives the Test Activation Response, it
        SHALL:</t>

        <t><list style="symbols">
            <t>process/validate the response message by checking the
            authDigest if operating in one of the Authenticated modes as
            prescribed in Section 4.2.2, or</t>

            <t>validate and decrypt the response message using the method
            prescribed in Section 4.2.4 if operating in the Partial Encryption
            mode,</t>
          </list></t>

        <t>and then proceed to evaluate the other fields in the protocol.</t>

        <t>When the client receives the (vetted) Test Activation Response, it
        first checks the command response value.</t>

        <t>If the client receives a Test Activation Command Response value
        that indicates an error, the client SHALL display/report a relevant
        message to the user or management process and exit.</t>

        <t>If the client receives a Test Activation Command Response value
        that is not equal to one of the codes defined above, then the client
        MUST terminate the connection and terminate operation of the current
        Setup Request.</t>

        <t>If the client receives a Test Activation Command Response value
        that indicates success (CHTA_CRSP_ACKOK) the client SHALL update its
        configuration to use any test parameters modified by the server.</t>

        <t>Next, the client SHALL prepare its connection for either an
        upstream test with dual timers set to send load PDUs (based on the
        starting transmission parameters sent by the server), OR a downstream
        test with a single timer to send status PDUs at the specified
        interval.</t>

        <t>Then, the client SHALL stop the test initiation timer, set a new
        time-out value for the watchdog timer and start the timer (to detect
        if the server goes quiet).</t>

        <t>The connection is now ready for testing.</t>
      </section>
    </section>

    <section title="Test Stream Transmission and Measurement Feedback Messages">
      <t>This section describes the Data phase of the protocol. The roles of
      sender and receiver vary depending whether the direction of testing is
      from server to client, or the reverse.</t>

      <t>All messages defined in this section SHALL use UDP transport. The
      hosts SHALL calculate and include the UDP checksum, or check the
      received UDP checksum before further processing, as necessary.</t>

      <section title="Test Packet PDU and Roles">
        <t>Testing proceeds with one end point sending load PDUs, based on
        transmission parameters from the sending rate table, and the other end
        point receiving the load PDUs and sending status messages to
        communicate the traffic measurements at the receiver (or to control
        the receiver).</t>

        <t>The watchdog timer at the receiver SHALL be reset each time a test
        PDU is received. See non-graceful test stop in Section 8 for handling
        the watchdog/NOTRAFFIC time-out expiration at each end-point.</t>

        <t>When the server is sending Load PDUs in the role of sender, it
        SHALL use the transmission parameters directly from the sending rate
        table via the index that is currently selected (which was based on the
        feedback in its received status messages).</t>

        <t>However, when the client is sending load PDUs in the role of
        sender, it SHALL use the discreet transmission parameters that were
        communicated by the server in its periodic status messages (and not
        referencing a sending rate table row). This approach allows the server
        to control the individual sending rates as well as the algorithm used
        to decide when and how to adjust the rate.</t>

        <t>The server uses a load adjustment algorithm which evaluates
        measurements, either its local measurements or the contents of
        received feedback messages. This approach is unique to this protocol;
        it provides the ability to search for the Maximum IP Capacity and
        specify specific sender behaviors that is absent from other testing
        tools. Although the algorithm depends on the protocol, it is not part
        of the protocol per se.</t>

        <t>The default algorithm (B) has three paths to its decision on the
        next sending rate:<list style="numbers">
            <t>When there are no impairments present (no sequence errors, low
            delay variation), resulting in sending rate increase.</t>

            <t>When there are low impairments present (no sequence errors but
            higher levels of delay variation), so the same sending rate is
            retained.</t>

            <t>When the impairment levels are above the thresholds set for
            this purpose and "congestion" is inferred, resulting in sending
            rate decrease.</t>
          </list></t>

        <t>Algorithm (B) also has two modes for increasing/decreasing the
        sending rate:<list style="symbols">
            <t>A high-speed mode (fast) to achieve high sending rates quickly,
            but also back-off quickly when "congestion" is inferred from the
            measurements. Consecutive feedback intervals that have a
            supra-threshold count of sequence number anomalies and/or contain
            an upper delay variation threshold exception in all of the
            consecutive intervals are sufficient to declare "congestion"
            within a test. The threshold of consecutive feedback intervals
            SHALL be configurable with a default of 3 intervals.</t>

            <t>A single-step (slow) mode where all rate adjustments use the
            minimum increase or decrease of one step in the sending rate
            table. The single step mode continues after the first inference of
            "congestion" from measured impairments.</t>
          </list></t>

        <t>An OPTIONAL load adjustment algorithm (designated C) has been
        defined in <xref target="TR-471"/>. Algorithm C operation and modes
        are similar to B, but C uses multiplicative increases in the fast mode
        to reach the Gigabit range quickly and adds the possibility to re-try
        the fast mode during a test (which improves the measurement accuracy
        in dynamic or error-prone access, such as radio access).</t>

        <t>On the other hand, the test configuration MAY use a fixed sending
        rate requested by the client, using the field below:</t>

        <t>uint16_t srIndexConf; // Configured sending rate index</t>

        <t>The client MAY communicate the desired fixed rate in its activation
        request. The reasons to conduct a fixed-rate test include stable
        measurement at the maximum determined by the load adjustment (search)
        algorithm, or the desire to test at a known subscribed rate without
        searching.</t>

        <t>The Load PDU SHALL have the following format and field
        definitions:</t>

        <t><figure>
            <artwork><![CDATA[        uint16_t loadId; // Load ID (=0xBEEF for the Load PDU)
        uint8_t testAction;  // Test action (= 0x00 normally, 
                                until test stop)
        uint8_t rxStopped;   // Receive traffic stopped indicator (BOOL)
        uint32_t lpduSeqNo;  // Load PDU sequence number (starts at 1)
        uint16_t udpPayload; // UDP payload LENGTH (bytes)
        uint16_t spduSeqErr; // Status PDU sequence error count
        //
        uint32_t spduTime_sec;  // Send time in last received status PDU
        uint32_t spduTime_nsec; // Send time in last received status PDU
        uint32_t lpduTime_sec;  // Send time of this load PDU
        uint32_t lpduTime_nsec; // Send time of this load PDU

Test Action Codes
TEST_ACT_TEST  0  // normal
TEST_ACT_STOP1 1  // normal stop at end of test: server sends in STATUS or Test PDU
TEST_ACT_STOP2 2  // ACK of STOP1: sent by client in STATUS or Test PDU
]]></artwork>

            <postamble>Figure 11 Load PDU Field Definitions</postamble>
          </figure>The Test Load UDP PDU format is as follows (big-endian
        AB):<figure>
            <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           loadId              |   testAction  | rxStopped     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           lpduSeqNo                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           udpPayload          |           spduSeqErr          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          spduTime_sec                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         spduTime_nsec                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-|-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          lpduTime_sec                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         lpduTime_nsec                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .         udpPayloadContent = udpPayload minus 28 octets        .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .                                                               .]]></artwork>

            <postamble>Figure 12 Load PDU Format</postamble>
          </figure></t>

        <t>The field udpPayloadContent is all zeroes, all ones, or a pseudo
        random binary sequence.</t>
      </section>

      <section title="Status PDU">
        <t>The receiver SHALL send a Status PDU to the sender during a test at
        the configured feedback interval.</t>

        <t>The watchdog timer at the test PDU sender SHALL be reset each time
        a Status PDU is received. See non-graceful test stop in Section 8 for
        handling the watchdog/NOTRAFFIC time-out expiration at each
        end-point.</t>

        <t>The Status PDUs are a key part of the server-client control loop.
        To protect against bit errors (checksum) or on-path attacks (something
        stronger), there is a requirement to calculate and include/check the
        UDP checksum. Also, AUTHENTICATED mode 2 that covers the Status PDU
        and will detect bit errors or attempts to replace values in the
        original packets.</t>

        <t>The Status PDU SHALL have the following format and field
        definitions:<figure>
            <artwork><![CDATA[        uint16_t statusId;  // Status ID = 0xFEED
        uint8_t testAction; // Test action
        uint8_t rxStopped;  // Receive traffic stopped indicator (BOOL)
        uint32_t spduSeqNo; // Status PDU sequence number (starts at 1)
        //
        struct sendingRate srStruct; // Sending Rate Structure (28 octets)
        //
        uint32_t subIntSeqNo;      // Sub-interval sequence number
        struct subIntStats sisSav; // Sub-interval Saved Stats Structure 
                                      (52 octets)
        //
        uint32_t seqErrLoss; // Loss sum
        uint32_t seqErrOoo;  // Out-of-Order sum
        uint32_t seqErrDup;  // Duplicate sum
        //
        uint32_t clockDeltaMin; // Clock delta minimum (either RTT 
                                   or 1-way delay)
        uint32_t delayVarMin;   // Delay variation minimum
        uint32_t delayVarMax;   // Delay variation maximum
        uint32_t delayVarSum;   // Delay variation sum
        uint32_t delayVarCnt;   // Delay variation count
        uint32_t rttMinimum;    // Minimum round-trip time sampled
        uint32_t rttSample;     // Last round-trip time sample
        uint8_t delayMinUpd;    // Delay minimum(s) updated observed, 
                                   communicated in both directions.
        uint8_t reserved2;      // (alignment)
        uint16_t reserved3;     // (alignment)
        //
        uint32_t tiDeltaTime;   // Trial interval time duration, usec
        uint32_t tiRxDatagrams; // Trial interval receive datagram count
        uint32_t tiRxBytes;     // Trial interval receive byte count
        //
        uint32_t spduTime_sec;  // Send time of this status PDU, sec
        uint32_t spduTime_nsec; // Send time of this status PDU, nanosec
]]></artwork>

            <postamble>Figure 13 Status PDU Field Definitions</postamble>
          </figure></t>

        <t>The Status (UDP payload) PDUs format is as follows (big-endian
        AB):<figure>
            <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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          statusId             |   testAction  | rxStopped     |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           spduSeqNo                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .               Sending Rate Structure (28 octets)              .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          subIntSeqNo                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .        Sub-interval Saved Stats Structure  (52 octets)        .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrLoss                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrOoo                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrDup                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         clockDeltaMin                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarMin                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarMax                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarSum                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarCnt                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          rttMinimum                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           rttSample                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  delayMinUpd  |   reserved2   |           reserved3           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          tiDeltaTime                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         tiRxDatagrams                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           tiRxBytes                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         spduTime_sec                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         spduTime_nsec                         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   .                   Authentication Fields (40 octets)           .
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>

            <postamble>Figure 14 Status PDU Format</postamble>
          </figure></t>

        <t>Note that the Sending Rate Structure (28 octets) is defined in the
        Test Activation section.</t>

        <t>More details on the Status PDU measurement fields are provided in
        <xref target="RFC9097"/>.</t>

        <t>Also note that the Sub-interval Saved Stats Structure (52 octets)
        SHALL be included (and populated as required when the server is in the
        receiver role in an upstream test) as defined below.</t>

        <t>The Sub-interval saved statistics structure for received traffic
        measurements SHALL be organized and formatted as follows:<figure>
            <artwork><![CDATA[        uint32_t rxDatagrams; // Received datagrams
        uint32_t rxBytes;     // Received bytes
        uint32_t deltaTime;   // Time delta
        uint32_t seqErrLoss;  // Loss sum
        uint32_t seqErrOoo;   // Out-of-Order sum
        uint32_t seqErrDup;   // Duplicate sum
        uint32_t delayVarMin; // Delay variation minimum
        uint32_t delayVarMax; // Delay variation maximum
        uint32_t delayVarSum; // Delay variation sum
        uint32_t delayVarCnt; // Delay variation count
        uint32_t rttMinimum;  // Minimum round-trip time
        uint32_t rttMaximum;  // Maximum round-trip time
        uint32_t accumTime;   // Accumulated time
----------------------------------------------------------------------------

   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
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          rxDatagrams                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                            rxBytes                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           deltaTime                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrLoss                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrOoo                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           seqErrDup                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarMin                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarMax                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarSum                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          delayVarCnt                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          rttMinimum                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                          rttMaximum                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                           accumTime                           |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>

            <postamble>Figure 15 Saved Interval Statistics Structure,
            Definitions and Format</postamble>
          </figure></t>

        <t>Note that the 52 octet saved statistics structure above has slight
        differences from the 40 octets that follow in the status feedback PDU,
        particularly the time-related fields.</t>

        <t>The Authentication (and Encryption) Fields appear at the end of the
        Status PDU and SHALL be organized as follows:</t>

        <t><figure>
            <artwork><![CDATA[   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |       testSessionId           |     keyId     |   reserved4   |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                         authUnixTime                          | 
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                                                               |
   |                                                               |
   |                                                               |
   |          authDigest[AUTH_DIGEST_LENGTH](256 bits)             |
   |                               or                              |
   | Initialization Vector (IV)(up to 256 bits, remaining bits MBZ)|
   |                                                               |
   |                                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>

            <postamble>Figure 16 Organization of Authentication Field
            Format</postamble>
          </figure></t>

        <t>The Authentication (and Encryption) Fields and their operation are
        as defined previously in Sections 5 and 6.</t>

        <t>When a client or server prepares to send the Status PDU, it
        SHALL:</t>

        <t><list style="symbols">
            <t>add the authUnixTime and calculate the authDigest for the
            response message using the method prescribed in Section 4.2.2 if
            operating in one of the Authenticated modes, or</t>

            <t>add the authUnixTime and encrypt the request message using the
            method prescribed in Section 4.2.4 if operating in the Partial
            Encryption mode,</t>
          </list></t>

        <t>and then sends the Status PDU message to the other end-point.</t>

        <t>Upon receiving a Status Feedback PDU which has been validated and
        vetted according to the mode of operation (Authenticated mode 2 or
        Partial Encryption mode 3), the server SHALL <list style="symbols">
            <t>perform calculations required by the selected Load adjustment
            algorithm (see Appendix A of <xref target="RFC9097"/> or Annex B
            of <xref target="TR-471"/>) and adjust its sending rate, or</t>

            <t>signal that the client adjust its sending rate in its role as
            as sender (via the Status PDU Sending Rate Structure).</t>
          </list></t>

        <t/>
      </section>
    </section>

    <section title="Stopping the Test">
      <t>When the test duration timer on the server expires, it SHALL set the
      connection test action to STOP and mark all outgoing load or status PDUs
      with a test action of STOP1.</t>

      <t>uint8_t testAction; // Test action (server sets STOP1)</t>

      <t>This is simply a non-reversible state for all future messages sent
      from the server.</t>

      <t>When the client receives a load or status PDU with the STOP1
      indication, it SHALL finalize testing, display the test results, and
      also mark its connection with a test action of STOP (so that any PDUs
      received subsequent to the STOP1 are ignored).</t>

      <t>With the test action of the client's connection set to STOP, the very
      next expiry of a send timer for either a load or status PDU SHALL cause
      the client to schedule an immediate end time to exit.</t>

      <t>The client SHALL then send all subsequent load or status PDUs with a
      test action of STOP2.</t>

      <t>uint8_t testAction; // Test action (client sets STOP2)</t>

      <t>as confirmation to the server, and a graceful termination of the test
      can begin.</t>

      <t>When the server receives the STOP2 confirmation in the load or status
      PDU, the server SHALL schedule an immediate end time for the connection
      which closes the socket and deallocates it.</t>

      <t>In a non-graceful test stop due to path failure, the
      watchdog/NOTRAFFIC time-outs at each end-point will expire (sometimes at
      one end-point first), notifications in logs, STDOUT, and/or formatted
      output SHALL be made, and the test action of each end-point's connection
      SHALL be set to STOP.</t>

      <t>If an attacker clears STOP1 or STOP2 bits, then the configured
      testIntTime (test duration) value at the server and/or client will take
      action and stop sending its test stream.</t>
    </section>

    <section title="Method of Measurement">
      <t>The architecture of the method REQUIRES two cooperating hosts
      operating in the roles of Src (test packet sender) and Dst (receiver),
      with a measured path and return path between them.</t>

      <t>The duration of a test duration, parameter I, MUST be constrained in
      a production network, since this is an active test method and it will
      likely cause congestion on the Src to Dst host path during a test.</t>

      <section title="Notes on Interface Measurements">
        <t>Additional measurements may be useful in specific circumstances.
        For example, interface byte counters measured by a client at a
        residential gateway are possible when the client application has
        access to an interface that sees all traffic to/from a service
        subscriber's location. Adding a byte counter at the client for
        download or upload directions could be used to measure total traffic
        and possibly detect when non-test traffic is present (and using
        capacity). The client may not have the CPU cycles available to count
        both the interface traffic and IP-layer Capacity simultaneously, so
        this form of diagnostic measurement may not be possible.</t>
      </section>

      <section title="Running Code">
        <t>This section is for the benefit of the Document Shepherd's form,
        and will be deleted prior to publication.</t>

        <t>Much of the development of the method and comparisons with existing
        methods conducted at IETF Hackathons and elsewhere have been based on
        the example udpst Linux measurement tool (which is a working reference
        for further development) <xref target="udpst"/>. The current
        project:<list style="symbols">
            <t>is a utility that can function as a client or server daemon</t>

            <t>requires a successful client-initiated setup handshake between
            cooperating hosts and allows firewalls to control inbound
            unsolicited UDP which either go to a control port [expected and
            w/authentication] or to ephemeral ports on the client and server
            that are only created as needed.</t>

            <t>permits firewalls protecting each host to continue to do their
            job normally. This aspect is similar to many other test utilities
            available. The firewall at the server will need to open a pin-hole
            for the control port, the dynamic ephemeral port in response to
            the "dummy packet" (or open a limited range of ephemeral ports) to
            complete the second control exchange: Test Activation, where the
            client communicates to the server on an ephemeral destination port
            *assigned by the server*.</t>

            <t>has Authentication modes that require a secret key included in
            the SHA-256 HMAC calculation which utilizes the OpenSSL HMAC macro
            (https://www.openssl.org/docs/man3.0/man3/HMAC.html).</t>

            <t>is written in C, and built with gcc (release 9.3) and its
            standard run-time libraries</t>

            <t>allows configuration of most of the parameters described in
            Sections 4 through 8.</t>

            <t>supports IPv4 and IPv6 address families.</t>

            <t>supports IP-layer packet marking.</t>

            <t>supports the upstream and downstream interface byte counter
            measurements at the client, and the results are available in the
            Text and JSON output at the end of a test.</t>
          </list></t>

        <t/>
      </section>
    </section>

    <section title="Security Considerations">
      <t>Active metrics and measurements have a long history of security
      considerations. The security considerations that apply to any active
      measurement of live paths are relevant here. See <xref
      target="RFC4656"/> and <xref target="RFC5357"/>.</t>

      <t>When considering privacy of those involved in measurement or those
      whose traffic is measured, the sensitive information available to
      potential observers is greatly reduced when using active techniques
      which are within this scope of work. Passive observations of user
      traffic for measurement purposes raise many privacy issues. We refer the
      reader to the privacy considerations described in the Large Scale
      Measurement of Broadband Performance (LMAP) Framework <xref
      target="RFC7594"/>, which covers active and passive techniques.</t>

      <t>There are some new considerations for Capacity measurement as
      described in this memo.</t>

      <t><list style="numbers">
          <t>Cooperating client and server hosts and agreements to test the
          path between the hosts are REQUIRED. Hosts perform in either the
          server or client roles. One way to assure a cooperative agreement
          employs the optional Authorization mode through the use of the
          authDigest field and the known identity associated with the key used
          to create the authDigest field. Other means are also possible, such
          as access control lists at the server.</t>

          <t>It is REQUIRED to have a user client-initiated setup handshake
          between cooperating hosts that allows firewalls to control inbound
          unsolicited UDP traffic which either goes to a control port
          [expected and w/authentication] or to ephemeral ports that are only
          created as needed. Firewalls protecting each host can both continue
          to do their job normally.</t>

          <t>Client-server authentication and integrity protection for
          feedback messages conveying measurements is REQUIRED. To accommodate
          different host limitations and testing circumstances, different
          modes of operation are recommended, as described in Section 4
          above.</t>

          <t>Hosts MUST limit the number of simultaneous tests to avoid
          resource exhaustion and inaccurate results.</t>

          <t>Senders MUST be rate-limited. This can be accomplished using a
          pre-built table defining all the offered load rates that will be
          supported (Section 8.1). The default and optional load-control
          search algorithm result in "ramp up" from the lowest rate in the
          table.</t>

          <t>Service subscribers with limited data volumes who conduct
          extensive capacity testing might experience the effects of Service
          Provider controls on their service. Testing with the Service
          Provider's measurement hosts SHOULD be limited in frequency and/or
          overall volume of test traffic (for example, the range of test
          interval duration values SHOULD be limited).</t>
        </list></t>

      <t>One specific attack that has been recognized is an on-path attack on
      the Test STOP bits where the attacker would clear or set the bits.
      Adding the STOP bits to successive packets terminates the test
      prematurely, with no threat to the Internet but annoyance for the
      testers. If an attacker clears the STOP bits, the mitigation relies on
      knowledge of the test duration at the client and server, where these
      hosts cease all traffic when the specified test duration is
      complete.</t>
    </section>

    <section anchor="IANA" title="IANA Considerations">
      <t>This memo requests IANA to assign a "well-known" UDP port for the
      Test Setup exchange in the Control phase of protocol operation, and to
      create a new registry group for the UDP Speed Test (UDPST) protocol.</t>

      <section title="New System Port Assignment">
        <t><list style="hanging">
            <t hangText="Service:">udpst-control</t>

            <t hangText="Transport Protocol:">UDP</t>

            <t hangText="Assignee:">IESG &lt;iesg@ietf.org&gt;</t>

            <t hangText="Contact:">IETF Chair &lt;chair@ietf.org&gt;</t>

            <t hangText="Description:">UDP-based IP-Layer Capacity and
            performance measurement protocol</t>

            <t hangText="Reference:">This RFC, RFCYYYY. The protocol uses
            IP-Layer Unicast.</t>

            <t hangText="Port Number:">&lt;left blank, as instructed&gt;</t>
          </list></t>
      </section>

      <section title="New UDPST Registry Group">
        <t>This section describes the design of the UDP Speed Test (UDPST)
        registry group.</t>

        <t>The new registry group SHALL be named, "UDPST Registry".</t>

        <t>The following applies to each registry in the sub-sections
        below:</t>

        <t>Registration Procedure: Specification Required</t>

        <t>Reference: &lt;This RFC&gt;</t>

        <t>Experts: Performance Metrics Experts</t>

        <t>Note: TBD</t>

        <section title="PDU Identifier Registry">
          <t>The first two octets of the PDUs used in the UDPST protocol
          identify the role and format of PDU that follows.</t>

          <t><figure>
              <artwork><![CDATA[Identifier  Value  Reference   Change     Description 
Name                           Controller
===================================================================
controlId   0xACE1 <this RFC>  IETF       Test Setup PDU

controlId   0xACE2 <this RFC>  IETF       Test Activation PDU

loadId      0xBEEF <this RFC>  IETF       Load PDU

statusId    0xFEED <this RFC>  IETF       Status Feedback PDU


]]></artwork>
            </figure>Other values are unassigned.</t>
        </section>

        <section title="Protocol Number Registry">
          <t>The second two octets of the PDUs used in the UDPST protocol
          identify the version of the protocol in use. The table below defines
          the assigned decimal values in the registry.</t>

          <t><figure>
              <artwork><![CDATA[Field          Value  Reference   Change     Description 
Name                              Controller
===================================================================
protocolVer    0-7    <this RFC>  IETF       Reserved

protocolVer    8      <this RFC>  IETF       Protocol version 8

protocolVer    9      <this RFC>  IETF       Protocol version 9

protocolVer    10     <this RFC>  IETF       Protocol version 10


]]></artwork>
            </figure>Other values are unassigned, with an upper value of
          65535.</t>
        </section>

        <section title="Test Setup PDU Modifier Bitmap Registry">
          <t>The Test Setup PDU layout contains a modifierBitmap field. The
          table below defines the initial bit assignments in the registry.</t>

          <t><figure>
              <artwork><![CDATA[Field           Value  Reference   Change     Description 
Name                                Controller
===================================================================
modifierBitmap   0x00   <this RFC>  IETF      No modifications 

modifierBitmap   0x01   <this RFC>  IETF      Do not use Jumbo 
                                              Frames above sending
                                              rates of 1Gbps 

modifierBitmap   0x02   <this RFC>  IETF      Use Traditional MTU 
                                              (1500 bytes with 
                                              IP-header)

modifierBitmap   0x03-0xFF          IETF      Unassigned

]]></artwork>
            </figure></t>
        </section>

        <section title="Test Setup PDU Authentication Mode Registry">
          <t>The Test Setup PDU layout contains an authMode field. The table
          below defines the assigned decimal values in the registry, and a
          range for experimentation.</t>

          <t><figure>
              <artwork><![CDATA[Field     Value  Reference   Change     Description 
Name                         Controller
=====================================================================
authMode  0      <this RFC>  IETF       OPTIONAL unauthenticated mode 

authMode  1      <this RFC>  IETF       REQUIRED authentication  
                                        for the Control phase
authMode  2      <this RFC>  IETF       OPTIONAL authentication  
                                        for the Data phase, in
                                        addition to the Control phase

authMode  3      <this RFC>  IETF       OPTIONAL partial encrypted 
                                        mode

authMode  60-63  <this RFC>  IETF       Range for experimentation

]]></artwork>
            </figure>Other values are unassigned, with the upper boundary of
          255.</t>
        </section>

        <section title="Test Setup PDU Command Response Field Registry">
          <t>The Test Setup PDU layout contains an cmdResponse field. The
          table below defines the assigned decimal values in the registry.</t>

          <t><figure>
              <artwork><![CDATA[Field        Value  Reference   Change     Description 
Name                            Controller
===================================================================
cmdResponse  0      <this RFC>  IETF       None (value used by client in Request) 

cmdResponse  1      <this RFC>  IETF       Acknowledgement
                                        
cmdResponse  2      <this RFC>  IETF       Bad Protocol Version  
                                        
cmdResponse  3      <this RFC>  IETF       Invalid Jumbo datagram option

cmdResponse  4      <this RFC>  IETF       Unexpected Authentication in Setup Request

cmdResponse  5      <this RFC>  IETF       Authentication missing in Setup Request

cmdResponse  6      <this RFC>  IETF       Invalid authentication method

cmdResponse  7      <this RFC>  IETF       Authentication failure

cmdResponse  8      <this RFC>  IETF       Authentication time is invalid in Setup Request

cmdResponse  9      <this RFC>  IETF       No Maximum test Bit rate specified

cmdResponse  10     <this RFC>  IETF       Server Maximum Bit rate exceeded

cmdResponse  11     <this RFC>  IETF       MTU option does not match Server


]]></artwork>
            </figure>Other values are unassigned, with the upper boundary of
          255.</t>
        </section>

        <section title="Test Activation PDU Modifier Bitmap Registry">
          <t>The Test Activation PDU layout (also) contains a modifierBitmap
          field. The table below defines the initial bit assignments in the
          registry.</t>

          <t><figure>
              <artwork><![CDATA[Field           Value  Reference   Change     Description 
Name                               Controller
===================================================================
modifierBitmap   0x00   <this RFC>  IETF      No modifications 

modifierBitmap   0x01   <this RFC>  IETF      Set when srIndexConf is
                                              START rate for search 

modifierBitmap   0x02   <this RFC>  IETF      Set for RANDOMIZED 
                                              UDP payload

modifierBitmap   0x03-0xFF          IETF      Unassigned

]]></artwork>
            </figure></t>
        </section>

        <section title="Test Activation PDU Command Request Registry">
          <t>The Test Activation PDU layout contains a cmdRequest field. The
          table below defines the assigned decimal values in the registry.</t>

          <t><figure>
              <artwork><![CDATA[Field      Value    Reference  Change    Description 
Name                           Controller
===================================================================
cmdRequest  0      <this RFC>  IETF      No Request

cmdRequest  1      <this RFC>  IETF      Request test in Upstream 
                                         direction (client to server)

cmdRequest  2      <this RFC>  IETF      Request test in Downstream                                        
                                         direction (server to client)

]]></artwork>
            </figure>Other values are unassigned, with the upper boundary of
          255.</t>
        </section>

        <section title="Test Activation PDU Rate Adjustment Algo. Registry">
          <t>The Test Activation PDU layout contains a rateAdjAlgo field. The
          table below defines the assigned Capitalized alphabetic UTF-8 @@@@
          values in the registry.</t>

          <t><figure>
              <artwork><![CDATA[Field      Value    Reference  Change    Description 
Name                           Controller
===================================================================
rateAdjAlgo  A      <this RFC>  IETF      Not used

rateAdjAlgo  B      <this RFC>  IETF      Rate algorithm Type B 
                                         
rateAdjAlgo  C      <this RFC>  IETF      Rate algorithm Type C

]]></artwork>
            </figure>Other values are unassigned, with the upper boundary of
          Z.</t>
        </section>

        <section title="Test Activation PDU Command Response Field Registry">
          <t>The Test Activation PDU layout (also) contains a cmdResponse
          field. The table below defines the assigned decimal values in the
          registry.</t>

          <t><figure>
              <artwork><![CDATA[Field        Value  Reference   Change     Description 
Name                            Controller
===================================================================
cmdResponse  0      <this RFC>  IETF       None (value used by client in Request) 

cmdResponse  1      <this RFC>  IETF       Server Acknowledgement
                                        
cmdResponse  2      <this RFC>  IETF       Server indicates an error


]]></artwork>
            </figure>Other values are unassigned, with the upper boundary of
          255.</t>
        </section>
      </section>
    </section>

    <section title="Acknowledgments">
      <t>This specification has been edited by Al Morton. Al Morton died before 
	  he was able to finalise this work. As Al can't complete author tasks
	  during the IETF standardisation process anymore, it was decided not to 
	  keep him as an author in the proper section. Respecting, that almost 
	  all of the content here has been edited or created by Al, it seems fair
	  not just to give him credit for his work, but also list him as editor, 
	  if this document reaches RFC status.</t>

      <t>Thanks to Lincoln Lavoie, Can Desem, and Greg Mirsky
      for reviewing this draft and providing helpful suggestions and areas for
      further development. Ken Kerpez and Chen Li have provided helpful
      reviews. Amanda Baber provided early reviews of the IANA Considerations
      section.</t>

      <t>Brian Weis provided an early SEC-DIR review; version 02 captures
      clarifications and version 03 takes on the protocol changes the Brian
      suggested.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <?rfc include='reference.RFC.2330'?>

      <?rfc include='reference.I-D.ietf-ippm-capacity-metric-method'?>

      <?rfc ?>

      <?rfc include="reference.RFC.2119"?>

      <?rfc include='reference.RFC.6234'?>

      <?rfc include='reference.RFC.7210'?>

      <?rfc include='reference.RFC.7680'?>

      <?rfc include='reference.RFC.8468'?>

      <?rfc ?>

      <?rfc ?>

      <?rfc include='reference.RFC.8174'?>

      <?rfc include='reference.RFC.6438'?>

      <?rfc ?>

      <?rfc ?>

      <?rfc include='reference.RFC.2681'?>

      <?rfc ?>

      <?rfc include='reference.RFC.6071'?>

      <?rfc include='reference.RFC.7497'?>

      <?rfc include='reference.RFC.8446'?>

      <?rfc include='reference.RFC.9097'?>

      <?rfc include="reference.RFC.9147"?>

      <reference anchor="FIPS-197"
                 target="https://nvlpubs.nist.gov/nistpubs/fips/nist.fips.197.pdf">
        <front>
          <title>Federal Information Processing Standards Publication 197
          (FIPS-197), ADVANCED ENCRYPTION STANDARD (AES)</title>

          <author fullname="National Institute of Standards and Technology (NIST)"
                  initials="NIST"
                  surname="National Institute of Standards and Technology">
            <organization>NIST</organization>
          </author>

          <date day="26" month="November" year="2001"/>
        </front>
      </reference>
    </references>

    <references title="Informative References">
      <?rfc include='reference.RFC.2544'?>

      <?rfc include='reference.RFC.3148'?>

      <?rfc include='reference.RFC.3610'?>

      <?rfc include='reference.RFC.4656'?>

      <?rfc include='reference.RFC.5136'?>

      <?rfc include='reference.RFC.5357'?>

      <?rfc include='reference.RFC.6815'?>

      <?rfc include='reference.RFC.7312'?>

      <?rfc include='reference.RFC.7594'?>

      <?rfc include='reference.RFC.7799'?>

      <?rfc include='reference.RFC.8337'?>

      <?rfc include='reference.RFC.8762'?>

      <?rfc include='reference.RFC.8972'?>

      <reference anchor="GCM"
                 target="https://csrc.nist.gov/publications/detail/sp/800-38d/final">
        <front>
          <title>NIST Special Publication 800-38D: Recommendation for Block
          Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC, U.S.
          National Institute of Standards and Technology</title>

          <author fullname="M. Dworkin" initials="M." surname="Dworkin">
            <organization>NIST</organization>
          </author>

          <date month="November" year="2007"/>
        </front>
      </reference>

      <reference anchor="copycat"
                 target="https://irtf.org/anrw/2017/anrw17-final5.pdf">
        <front>
          <title>copycat: Testing Differential Treatment of New Transport
          Protocols in the Wild (ANRW '17)</title>

          <author fullname="Korian Edeline" initials="K." surname="Edleine">
            <organization/>
          </author>

          <author fullname="Mirja Kuhlewind" initials="K." surname="Kuhlewind">
            <organization/>
          </author>

          <author fullname="Brian Trammell" initials="B." surname="Trammell">
            <organization/>
          </author>

          <author fullname="Benoit Donnet" initials="B." surname="Donnet">
            <organization/>
          </author>

          <date day="15" month="July" year="2017"/>
        </front>
      </reference>

      <reference anchor="Y.Sup60"
                 target="https://www.itu.int/rec/T-REC-Y.Sup60/en">
        <front>
          <title>Recommendation Y.Sup60, (09/20) Interpreting ITU-T Y.1540
          maximum IP-layer capacity measurements</title>

          <author fullname="Al Morton" initials="A., Rapporteur"
                  surname="Morton">
            <organization>AT&amp;T</organization>
          </author>

          <date day="11" month="September" year="2020"/>
        </front>
      </reference>

      <reference anchor="TR-471"
                 target="https://www.broadband-forum.org/technical/download/TR-471.pdf">
        <front>
          <title>Broadband Forum TR-471: IP Layer Capacity Metrics and
          Measurement, Issue 3</title>

          <author fullname="" initials="Editor" surname="Morton, A,">
            <organization>AT&amp;T Labs</organization>
          </author>

          <date day="" month="December" year="2022"/>
        </front>
      </reference>

      <reference anchor="Y.1540"
                 target="https://www.itu.int/rec/T-REC-Y.1540-201912-I/en">
        <front>
          <title>Internet protocol data communication service - IP packet
          transfer and availability performance parameters</title>

          <author fullname="ITU-T Recommendation Y.1540" surname="">
            <organization>ITU-T</organization>
          </author>

          <date month="December" year="2019"/>
        </front>
      </reference>

      <reference anchor="LS-SG12-B"
                 target="https://datatracker.ietf.org/liaison/1645/">
        <front>
          <title>LS on harmonization of IP Capacity and Latency Parameters:
          Consent of Draft Rec. Y.1540 on IP packet transfer performance
          parameters and New Annex A with Lab &amp; Field Evaluation
          Plans</title>

          <author fullname="ITU-T SG 12" surname="">
            <organization>ITU-T</organization>
          </author>

          <date month="March" year="2019"/>
        </front>
      </reference>

      <reference anchor="LS-SG12-A"
                 target="https://datatracker.ietf.org/liaison/1632/">
        <front>
          <title>LS - Harmonization of IP Capacity and Latency Parameters:
          Revision of Draft Rec. Y.1540 on IP packet transfer performance
          parameters and New Annex A with Lab Evaluation Plan</title>

          <author fullname="ITU-T SG 12" surname="">
            <organization>ITU-T</organization>
          </author>

          <date month="May" year="2019"/>
        </front>
      </reference>

      <reference anchor="udpst"
                 target="https://github.com/BroadbandForum/obudpst">
        <front>
          <title>UDP Speed Test Open Broadband project</title>

          <author fullname="" surname="">
            <organization>udpst Project Collaborators</organization>
          </author>

          <date month="December" year="2020"/>
        </front>
      </reference>

      <?rfc ?>

      <?rfc ?>
    </references>
  </back>
</rfc>
