<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>

<rfc category="std" docName="draft-zhang-cats-clients-request-packet-00" ipr="trust200902" consensus="true" updates="" obsoletes="">
  <front>
    <title abbrev="CATS Client Request Packet">CATS Client Service Request Packet Format (IPv6 Extension Header and Payload-Based Carriage of CS-ID and Network/Computing Requirement Parameters)</title>

    <author fullname="Bin Zhang" initials="B." role="editor" surname="Zhang">
      <!-- https://authors.ietf.org/en/rfcxml-vocabulary#author -->
      <!-- initials should not include an initial for the surname -->
      <!-- role="editor" is optional -->
      <!-- Can have more than one author -->

      <!-- all of the following elements are optional -->
      <organization>Pengcheng Laboratory</organization>      <!-- https://authors.ietf.org/en/rfcxml-vocabulary#organization -->
      <address>        <!-- https://authors.ietf.org/en/rfcxml-vocabulary#address -->
        <postal>
          <!-- Reorder these if your country does things differently -->
          <street>Sibilong Street</street>
          <city>Shenzhen</city>
          <code>518055</code>
          <country>China</country>
          <!-- Can use two letter country code -->
        </postal>
        <email>zhangb@pcl.ac.cn</email>
        <!-- Can have more than one <email> element -->
      </address>
    </author>

    <author fullname="Yina Dai" initials="Y." role="editor" surname="Dai">
      <!-- https://authors.ietf.org/en/rfcxml-vocabulary#author -->
      <!-- initials should not include an initial for the surname -->
      <!-- role="editor" is optional -->
      <!-- Can have more than one author -->

      <!-- all of the following elements are optional -->
      <organization>Sun Yat-sen University</organization>      <!-- https://authors.ietf.org/en/rfcxml-vocabulary#organization -->
      <address>        <!-- https://authors.ietf.org/en/rfcxml-vocabulary#address -->
        <postal>
          <!-- Reorder these if your country does things differently -->
          <street>Sun Yat-sen Street</street>
          <city>Guangzhou</city>
          <code>510080</code>
          <country>China</country>
          <!-- Can use two letter country code -->
        </postal>
        <email>daiyn5@mail2.sysu.edu.cn</email>
        <!-- Can have more than one <email> element -->
      </address>
    </author>

    <date day="21" month="July" year="2026"/>

    <area>Routing</area>
    <workgroup>CATS</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>CATS</keyword>
    <keyword>Client Service Request</keyword>
    <keyword>IPv6 Extension Header</keyword>
    <keyword>CS-ID</keyword>
    <keyword>Computing-Aware Traffic Steering</keyword>

    <abstract>
      <t>This document specifies two complementary mechanisms for carrying the CATS Service Identifier (CS-ID) and network/computing requirement parameters in client service request packets within the Computing-Aware Traffic Steering (CATS) framework.</t>
      <t>Mode A uses IPv6 Extension Headers to carry CS-ID and requirement parameters as hop-by-hop or destination options, enabling in-band signaling that is visible to all CATS-aware network nodes along the path. Mode B uses a payload-based TLV structure that is transport-protocol agnostic and can be used with both IPv4 and IPv6, as well as with encrypted transports.</t>
      <t>The document defines the Virtual Placeholder Address (VPA) prefix requirements, the CATS Service Request Extension Header (CSREH) format, the CATS Service Request TLV format, and the CATS_PACKET_IN process for handling these packets at ingress CATS-Forwarders.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction" anchor="introduction">
      <t>The Computing-Aware Traffic Steering (CATS) framework <xref target="I-D.ietf-cats-framework"/> defines an architecture for steering service requests to the most suitable service contact instance based on both network and computing metrics. Clients need a mechanism to express not only which service they want to access, but also the specific network and computing requirements that enable optimal instance selection.</t>
      <t>This document addresses this gap by providing a standardized message format for clients to explicitly declare:</t>
      <ul>
        <li>the CS-ID (Computing-aware Service ID) they wish to access;</li>
        <li>network requirements such as bandwidth;</li>
        <li>computing requirements such as computing time;</li>
      </ul>

      <t>This document specifies two complementary mechanisms for carrying CS-ID and requirement parameters in client service request packets:</t>
      <list style="symbols">
        <t>Mode A - Extension Header-Based Carriage: Leverages IPv6 Extension Headers <xref target="RFC8200"/> to carry CS-ID and requirement parameters as hop-by-hop or destination options. This mode provides in-band signaling that is visible to all CATS-aware network nodes along the path, enabling early classification and steering decisions at ingress CATS-Forwarders.</t>
        <t>Mode B - Payload-Based Carriage: Encapsulates CS-ID and requirement parameters within a dedicated CATS Service Request TLV structure carried in the packet payload. This mode is transport-protocol agnostic and can be used with both IPv4 and IPv6, as well as with encrypted transports where extension headers may not be accessible.</t>
      </list>
      <t>Both modes MAY be used independently or in combination. When both modes are present in a single packet, the extension header information takes precedence for CATS-Forwarder processing, while the payload-based information is used as a fallback or for end-to-end service negotiation.</t>
      <t>The Virtual Placeholder Address (VPA) serves as the destination address for all service requests, ensuring that packets addressed to it reach an ingress CATS-Forwarder for CATS_PACKET_IN processing.</t>

      <section title="Requirements Language" anchor="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="Terminology" anchor="terminology">
      <t>This document uses the following terms defined in <xref target="I-D.ietf-cats-framework"/> and <xref target="I-D.zhangb-cats-service-metrics-op"/>:</t>
      <list style="symbols">
        <t>CATS Service ID (CS-ID)</t>
        <t>CATS Service Contact Instance ID (CSCI-ID)</t>
        <t>CATS-Forwarder (Ingress/Egress)</t>
        <t>CATS Path Selector (C-PS)</t>
        <t>CATS Traffic Classifier (C-TC)</t>
        <t>Global Available Slots (GAS)</t>
      </list>
      <t>Additionally, this document defines the following terms:</t>
      <list style="hanging">
        <t hangText="Virtual Placeholder Address (VPA):">A non-routable address within a configured prefix that serves as the destination address for CATS service requests. Packets addressed to a VPA are intercepted by ingress CATS-Forwarders and trigger the CATS_PACKET_IN process.</t>
        <t hangText="CATS Service Request Packet:">A packet sent by a client to initiate a service request within the CATS domain. Such packets carry a CS-ID and optionally, network and computing requirement parameters.</t>
        <t hangText="Network Requirement Parameter:">A quantitative/qualitative constraint or preference related to network performance, such as maximum latency, minimum bandwidth, or maximum packet loss.</t>
        <t hangText="Computing Requirement Parameter:">A quantitative/qualitative constraint or preference related to computing services, such as GAS, computing time, or cost.</t>
      </list>
    </section>

    <section title="Virtual Placeholder Address (VPA)" anchor="vpa">
      <section title="VPA Prefix Requirements" anchor="vpa-requirements">
        <t>The VPA prefix MUST satisfy the following requirements:</t>
        <list style="numbers">
          <t>Globally Unique: The VPA prefix MUST be globally unique within the CATS domain to avoid ambiguity in service request routing. Multiple CATS domains MAY use distinct VPA prefixes.</t>
          <t>Non-Routable in Underlay: The VPA prefix MUST NOT be routable in the underlay IP infrastructure. This ensures that packets addressed to a VPA are not forwarded by standard IP routing but are instead intercepted by ingress CATS-Forwarders.</t>
          <t>Sufficiently Large: The VPA prefix MUST be sufficiently large to allow sub-prefix allocation per service category if desired. The following prefix lengths are RECOMMENDED:
            <list style="symbols">
              <t>IPv4: /16 prefix (65,536 addresses), allowing /24 sub-prefixes per service category.</t>
              <t>IPv6: /48 prefix (2^80 addresses), allowing /64 sub-prefixes per service category.</t>
            </list>
          </t>
          <t>Administratively Scoped: The VPA prefix SHOULD be allocated from administratively scoped address space (e.g., RFC1918 for IPv4, Unique Local Addresses <xref target="RFC4193"/> for IPv6) to prevent conflicts with the global Internet.</t>
        </list>
        <t>Example VPA Prefix Allocations:</t>
        <figure>
          <artwork>
+----------------+------------------+----------------------------+
| Address Family | Recommended Prefix | Example Allocation       |
+----------------+------------------+----------------------------+
| IPv4           | 10.128.0.0/16    | 10.128.0.0/24 = AI Service |
|                |                  | 10.128.1.0/24 = Gaming     |
|                |                  | 10.128.2.0/24 = Video      |
+----------------+------------------+----------------------------+
| IPv6           | fd00:cats::/48   | fd00:cats:1::/64 = AI      |
|                |                  | fd00:cats:2::/64 = Gaming  |
|                |                  | fd00:cats:3::/64 = Video   |
+----------------+------------------+----------------------------+
          </artwork>
        </figure>
      </section>

      <section title="VPA Catch-All Route Configuration" anchor="vpa-catchall">
        <t>The VPA prefix SHOULD be configured on all ingress CATS-Forwarders as a "catch-all" route pointing to a local CPU/handling pipeline. This configuration triggers the CATS_PACKET_IN process when a packet with a VPA destination address arrives.</t>
        <t>The catch-all route configuration MUST include the following:</t>
        <list style="symbols">
          <t>Route destination: The configured VPA prefix.</t>
          <t>Next hop: Local CPU/handling pipeline (not a remote next hop).</t>
          <t>Action: Trigger CATS_PACKET_IN and invoke C-TC classification.</t>
        </list>
        <t>The CATS_PACKET_IN process performs the following operations:</t>
        <list style="numbers">
          <t>Extract the CS-ID from the packet (via extension header or payload parsing).</t>
          <t>Extract network and computing requirement parameters.</t>
          <t>Query the C-PS for path selection based on CS-ID and parameters.</t>
          <t>Install forwarding state for the flow.</t>
          <t>Forward the packet along the CATS-computed path.</t>
        </list>
      </section>
    </section>

    <section title="Client Service Request Packet Overview" anchor="packet-overview">
      <t>A client service request packet has the following general structure:</t>
      <figure>
        <artwork>
+---------------------------------------------------------------+
|                    IP Header (IPv4 or IPv6)                   |
|  Source: Client's real IP address                             |
|  Destination: VPA within configured prefix                    |
+---------------------------------------------------------------+
|  [Optional] IPv6 Extension Headers (Mode A)                   |
|    - CATS Service Request Extension Header                    |
+---------------------------------------------------------------+
|  Transport Header (TCP/UDP/QUIC/etc.)                         |
+---------------------------------------------------------------+
|  [Optional] CATS Service Request TLV (Mode B)                 |
|    - Carried in transport payload                             |
+---------------------------------------------------------------+
|  Application Payload                                          |
+---------------------------------------------------------------+
        </artwork>
      </figure>
      <list style="hanging">
        <t hangText="Source IP/MAC:">The client's real network address.</t>
        <t hangText="Destination IP:">A VPA within the configured prefix. The specific VPA MAY encode service category information in sub-prefix bits.</t>
      </list>
      <t>The packet MUST contain a CS-ID, carried via either Mode A (extension header) or Mode B (payload), or both.</t>
    </section>

    <section title="Mode A: IPv6 Extension Header-Based Carriage" anchor="mode-a">
      <section title="CATS Service Request Extension Header" anchor="csreh">
        <t>This document defines a new IPv6 Extension Header called the "CATS Service Request Extension Header" (CSREH). The CSREH is a Hop-by-Hop Options Header <xref target="RFC8200"/> that carries CATS-specific information visible to all CATS-aware nodes along the forwarding path.</t>
        <t>The CSREH uses the Next Header value TBD1 (to be assigned by IANA).</t>
        <t>CSREH Format:</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Next Header  |  Hdr Ext Len  |          Reserved             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Option Type |  Opt Data Len |          CS-ID                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            CS-ID (cont.)                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Option Type |  Opt Data Len |  Network Req Parameters...    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Option Type |  Opt Data Len |  Computing Req Parameters...  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <t>Fields:</t>
        <list style="hanging">
          <t hangText="Next Header (8 bits):">Identifies the type of header immediately following the CSREH. Uses standard IP protocol numbers.</t>
          <t hangText="Hdr Ext Len (8 bits):">Length of the CSREH in 8-octet units, not including the first 8 octets. Minimum value is 0 (8 octets total).</t>
          <t hangText="Reserved (16 bits):">MUST be set to zero on transmission and ignored on reception.</t>
          <t hangText="Options:">Variable-length options carrying CS-ID, network requirements, and computing requirements. Each option uses the standard IPv6 Options format <xref target="RFC8200"/>.</t>
        </list>
        <t>The CSREH MUST contain exactly one CS-ID Option. It MAY contain zero or one Network Requirement Option and zero or one Computing Requirement Option.</t>
      </section>

      <section title="CS-ID Option Format" anchor="csid-option">
        <t>The CS-ID Option carries the CATS Service Identifier.</t>
        <figure>
          <artwork>
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|0|0|  Opt Data Len |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
+                          CS-ID (variable)                     +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Option Type: 0x10 (TBD2 - to be assigned by IANA):">Bits 00 (skip if not recognized); Bit 0 (does not change en-route)</t>
          <t hangText="Opt Data Len (8 bits):">Length of the CS-ID field in octets. RECOMMENDED values:
            <list style="symbols">
              <t>2: 16-bit CS-ID (small-scale deployments)</t>
              <t>4: 32-bit CS-ID (standard deployments)</t>
              <t>8: 64-bit CS-ID (large-scale deployments)</t>
              <t>16: 128-bit CS-ID (UUID-based identifiers)</t>
            </list>
          </t>
          <t hangText="CS-ID (variable length):">The CATS Service Identifier. The length and semantics of the CS-ID are deployment-specific but MUST be consistent within a CATS domain.</t>
        </list>
      </section>

      <section title="Network Requirement Option Format" anchor="network-option">
        <t>The Network Requirement Option carries network performance constraints requested by the client.</t>
        <figure>
          <artwork>
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|0|1|  Opt Data Len |    Num Req    |   Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                    Network Requirement Entries                ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Option Type: 0x11 (TBD3 - to be assigned by IANA)"></t>
          <t hangText="Num Req (8 bits):">Number of Network Requirement Entries following this field.</t>
          <t hangText="Reserved (8 bits):">MUST be set to zero on transmission and ignored on reception.</t>
        </list>
        <t>Network Requirement Entry Format:</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Req Type    |   Req Flags   |           Value               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Value (cont.)          |          Unit Code          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Req Type (8 bits):">Identifies the type of network requirement:
            <figure>
              <artwork>
+--------+--------------------------------+-----------+
| Value  | Requirement Type                | Unit Code|
+--------+--------------------------------+-----------+
| 0x01   | Maximum Latency                | 0x01=ms   |
| 0x02   | Minimum Bandwidth              | 0x02=Mbps |
| 0x03   | Maximum Packet Loss Rate       | 0x03=%    |
| 0x04   | Maximum Jitter                 | 0x04=ms   |
| 0x05   | Minimum Throughput             | 0x05=Mbps |
| 0x06   | Maximum Path Hops              | 0x06=count|
| 0x07   | Path Diversity Required        | 0x07=bool |
| 0x08   | Encryption Required            | 0x08=bool |
| 0x09-0xFF | Reserved for future use     |           |
+--------+--------------------------------+-----------+
              </artwork>
            </figure>
          </t>
          <t hangText="Req Flags (8 bits):">Bit 0 (0x01): HARD constraint - MUST be satisfied; Bit 1 (0x02): SOFT constraint - SHOULD be satisfied; Bit 2 (0x04): PREFERENCE - preferred but not required; Bits 3-7: Reserved, MUST be zero</t>
          <t hangText="Value (32 bits):">The numerical value of the requirement. Interpretation depends on the Req Type and Unit Code. The value zero is reserved as a qualitative indicator for all requirement types. It Indicates that the client requires the optimal services for the corresponding requirement type. For example:<list style="symbols">
              <t>Maximum Latency=0: selecting the minimum latency among all candidates</t>
              <t>Minimum Bandwidth=0: selecting the maximum bandwidth among all candidates</t>
              <t>Maximum Packet Loss Rate=0: selecting the minimum Packet Loss Rate among all candidates</t>
              <t>Maximum Jitter=0: selecting the minimum Jitter among all candidates</t>
            </list>
          </t>
          <t hangText="Unit Code (16 bits):">Specifies the unit of the Value field:
            <figure>
              <artwork>
+--------+---------------------+--------+-------------------+
| Value  | Unit                | Value  | Unit              |
+--------+---------------------+--------+-------------------+
| 0x0001 | Milliseconds (ms)   | 0x0007 | Gbps              |
| 0x0002 | Megabits/sec (Mbps) | 0x0008 | Bytes/sec (Bps)   |
| 0x0003 | Percentage (%)      | 0x0009 | Kbps              |
| 0x0004 | Count (integer)     | 0x000A | Hops (count)      |
| 0x0005 | Boolean (0/1)       | 0x000B | Reserved          |
| 0x0006 | Microseconds (us)   | 0x000C | Reserved          |
+--------+---------------------+--------+-------------------+
              </artwork>
            </figure>
          </t>
        </list>
      </section>

      <section title="Computing Requirement Option Format" anchor="computing-option">
        <t>The Computing Requirement Option carries computing service constraints requested by the client.</t>
        <figure>
          <artwork>
0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|0|0|0|1|0|0|1|0|  Opt Data Len |    Num Req    |   Reserved   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                   Computing Requirement Entries               ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Option Type: 0x12 (TBD4 - to be assigned by IANA)"></t>
          <t hangText="Num Req (8 bits):">Number of Computing Requirement Entries following this field.</t>
          <t hangText="Reserved (8 bits):">MUST be set to zero on transmission and ignored on reception.</t>
        </list>
        <t>Computing Requirement Entry Format:</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Req Type    |   Req Flags   |           Value               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Value (cont.)          |          Unit Code          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Req Type (8 bits):">Identifies the type of computing requirement:
            <figure>
              <artwork>
+--------+--------------------------------+------------+
| Value  | Requirement Type                | Unit Code |
+--------+--------------------------------+-----------+
| 0x01   | Minimum GAS                     | 0x01=count|
| 0x02   | Maximum Computing Time          | 0x02=ms   |
| 0x03   | Maximum Cost                    | 0x03=count|
| 0x04   | Minimum Reputation              | 0x04=count|
| 0x05   | Minimum Security Label          | 0x05=count|
| 0x06   | Minimum Capability              | 0x06=count|
| 0x07-0xFF | Reserved for future use      |           |
+--------+--------------------------------+------------+
              </artwork>
            </figure>
          </t>
          <t hangText="Req Flags (8 bits):">Same format as Network Requirement Option (Section 5.3).</t>
          <t hangText="Value (32 bits):">The numerical value of the requirement. Interpretation depends on the Req Type and Unit Code. The value zero is reserved as a qualitative indicator for all requirement types. It Indicates that the client requires the optimal services for the corresponding requirement type. For example:<list style="symbols">
              <t>Minimum GAS=0: selecting the maximum GAS among all candidates</t>
              <t>Maximum Computing Time=0: selecting the minimum Computing Time among all candidates</t>
              <t>Maximum Cost=0: selecting the minimum Cost among all candidates</t>
              <t>Minimum Reputation=0: selecting the maximum Reputation among all candidates</t>
              <t>Minimum Security Label=0: selecting the maximum Security Label among all candidates</t>
            </list>
          </t>
          <t hangText="Unit Code (16 bits):">Same values as defined in Section 5.3.
          </t>
        </list>

      </section>

      <section title="Extension Header Processing Rules" anchor="eh-processing">
        <list style="numbers">
          <t>A CATS-Forwarder receiving a packet with a CSREH MUST process the CS-ID Option. If the CS-ID Option is absent, the packet MUST be dropped and an ICMP Parameter Problem message MAY be sent to the source.</t>
          <t>If the CSREH contains multiple CS-ID Options, only the first one MUST be processed; subsequent CS-ID Options MUST be ignored.</t>
          <t>Network and Computing Requirement Options are OPTIONAL. If absent, the C-PS SHOULD use default policies or service-specific profiles configured by the operator.</t>
          <t>A CATS-Forwarder that does not recognize the CSREH Next Header value MUST pass the packet to the next header processor without modification (standard IPv6 extension header behavior).</t>
          <t>The CSREH MUST be removed by the Egress CATS-Forwarder before delivering the packet to the service contact instance, unless the service contact instance is explicitly configured to receive CATS signaling.</t>
        </list>
      </section>
    </section>

    <section title="Mode B: Payload-Based Carriage" anchor="mode-b">
      <section title="CATS Service Request TLV Format" anchor="tlv-format">
        <t>Mode B uses a Type-Length-Value (TLV) structure carried in the transport payload. This mode is independent of the IP version and can be used with any transport protocol.</t>
        <t>The CATS Service Request TLV structure is placed at the beginning of the transport payload, before any application-specific data. A magic number identifies the presence of the CATS TLV block.</t>
        <t>Overall Structure:</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Magic Number                          |
|                       (0x43415453 = "CATS")                   |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Version    |    Flags      |         Total Length          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                      TLV Block(s)                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                    Application Payload                        ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Magic Number (32 bits):">Fixed value 0x43415453 (ASCII "CATS"). Used to detect the presence of the CATS TLV block in the payload.</t>
          <t hangText="Version (8 bits):">Version of the CATS TLV format. This document specifies version 0x01.</t>
          <t hangText="Flags (8 bits):">Bit 0 (0x01): EXT_HEADER_PRESENT - Set if Mode A extension header is also present in this packet; Bit 1 (0x02): ENCRYPTED - Set if the TLV block is encrypted (future use); Bit 2 (0x04): SIGNED - Set if the TLV block is signed (future use); Bits 3-7: Reserved, MUST be zero.</t>
          <t hangText="Total Length (16 bits):">Total length of the TLV block(s) in octets, including this header but excluding the Magic Number.</t>
        </list>
        <t>TLV Block Format:</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    TLV Type   |  TLV Flags    |         TLV Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
~                         TLV Value                             ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="TLV Type (8 bits):">Identifies the type of TLV (see Section 6.2).</t>
          <t hangText="TLV Flags (8 bits):">Bit 0 (0x01): CRITICAL - If set and this TLV is not understood, the entire packet MUST be dropped; Bit 1 (0x02): MUST_HONOR - The requirement MUST be satisfied; if not possible, the request MUST be rejected; Bits 2-7: Reserved, MUST be zero.</t>
          <t hangText="TLV Length (16 bits):">Length of the TLV Value field in octets.</t>
        </list>
      </section>

      <section title="TLV Type Definitions" anchor="tlv-types">
        <figure>
          <artwork>
+--------+---------------------------+--------------------------------+
| Type   | Name                      | Description                    |
+--------+---------------------------+--------------------------------+
| 0x01   | CS-ID TLV                 | CATS Service ID                |
| 0x02   | Network Requirements TLV  | Network params                 |
| 0x03   | Computing Requirements TLV| Computing params               |
| 0x04   | Service Contact Instance ID| CSCI-ID (optional)            |
| 0x05   | Client Capability TLV     | Client capabilities            |
| 0x06   | Request Timestamp TLV     | Request time                   |
| 0x07   | Request Nonce TLV         | Anti-replay nonce              |
| 0x08   | Service Affinity TLV      | Affinity hint                  |
| 0x09   | QoS Class TLV             | Traffic class                  |
| 0x0A-0x7F | Reserved for CATS use  |                                |
| 0x80-0xFF | Private/Experimental   |                                |
+--------+---------------------------+--------------------------------+
          </artwork>
        </figure>
      </section>

      <section title="CS-ID TLV" anchor="csid-tlv">
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     0x01      |  TLV Flags    |         TLV Length           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   ID Length   |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
~                          CS-ID                                ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="ID Length (8 bits):">Length of the CS-ID in octets. RECOMMENDED values: 2, 4, 8, 16.</t>
          <t hangText="CS-ID (variable):">The CATS Service Identifier. Same semantics as in Mode A.</t>
        </list>
      </section>

      <section title="Network Requirements TLV" anchor="network-tlv">
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     0x02      |  TLV Flags    |         TLV Length            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Num Req    |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
~                 Network Requirement Entries                   ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Num Req (8 bits):">Number of Network Requirement Entries.</t>
        </list>
        <t>Network Requirement Entry (TLV Mode):</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Req Type    |   Req Flags   |          Unit Code            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Value                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Req Type (8 bits):">Same values as defined in Section 5.3.</t>
          <t hangText="Req Flags (8 bits):">Bit 0 (0x01): HARD - Hard constraint; Bit 1 (0x02): SOFT - Soft constraint; Bit 2 (0x04): PREF - Preference; Bits 3-7: Reserved</t>
          <t hangText="Unit Code (16 bits):">Same values as defined in Section 5.3.</t>
          <t hangText="Value (32 bits):">The numerical value of the requirement.</t>
        </list>
      </section>

      <section title="Computing Requirements TLV" anchor="computing-tlv">
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     0x03      |  TLV Flags    |         TLV Length           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|    Num Req    |                                               |
+-+-+-+-+-+-+-+-+                                               +
|                                                               |
~                Computing Requirement Entries                  ~
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Num Req (8 bits):">Number of Computing Requirement Entries.</t>
        </list>
        <t>Computing Requirement Entry (TLV Mode):</t>
        <figure>
          <artwork>
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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Req Type    |   Req Flags   |          Unit Code            |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Value                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          </artwork>
        </figure>
        <list style="hanging">
          <t hangText="Req Type (8 bits):">Same values as defined in Section 5.4.</t>
          <t hangText="Req Flags (8 bits):">Same format as Network Requirements TLV.</t>
          <t hangText="Unit Code (16 bits):">Same values as defined in Section 5.4.</t>
          <t hangText="Value (32 bits):">The numerical value of the requirement.</t>
        </list>
      </section>

      <section title="Payload Processing Rules" anchor="payload-processing">
        <list style="numbers">
          <t>A CATS-Forwarder processing a packet in payload mode MUST scan the transport payload for the Magic Number 0x43415453.</t>
          <t>If the Magic Number is found, the CATS-Forwarder MUST parse the TLV block to extract the CS-ID and requirement parameters.</t>
          <t>If the Magic Number is not found and the packet is addressed to a VPA, the CATS-Forwarder MAY attempt deep packet inspection or MAY drop the packet depending on local policy.</t>
          <t>The CATS TLV block SHOULD be removed by the Egress CATS-Forwarder before delivering the packet to the service contact instance, unless the service contact instance is configured to receive it.</t>
          <t>If both Mode A and Mode B are present, the CATS-Forwarder MUST use the Mode A (extension header) information for CATS processing and MAY validate consistency with Mode B information.</t>
        </list>
      </section>
    </section>

    <section title="Dual-Mode Operation and Interoperability" anchor="dual-mode">
      <t>This section defines the behavior when both Mode A and Mode B are present in a single packet.</t>
      <figure>
        <artwork>
+-----------------+-----------------+-------------------------------------------+
| Mode A Present  | Mode B Present  | CATS-Forwarder Behavior                   |
+-----------------+-----------------+------------------------------------------+
| Yes             | Yes             | Use Mode A; validate consistency          |
| Yes             | No              | Use Mode A                                |
| No              | Yes             | Use Mode B                                |
| No              | No              | Drop or DFI                               |
+-----------------+-----------------+-------------------------------------------+
        </artwork>
      </figure>
      <t>DFI = Deep Flow Inspection (operator-configured fallback)</t>
      <t>Consistency Validation:</t>
      <t>When both modes are present, the CATS-Forwarder SHOULD verify that the CS-ID values match. If they do not match, the packet MUST be dropped and a CATS error notification MAY be logged.</t>
    </section>

    <section title="CATS_PACKET_IN Process" anchor="packet-in-process">
      <t>The CATS_PACKET_IN process is triggered when an ingress CATS-Forwarder receives a packet destined to a VPA. The process consists of the following steps:</t>
      <list style="numbers">
        <t>Step 1: Packet Interception
          <t>The ingress CATS-Forwarder matches the destination address against the configured VPA catch-all route and redirects the packet to the local CPU/handling pipeline.</t>
        </t>
        <t>Step 2: CS-ID Extraction
          <t>The C-TC examines the packet for CS-ID:</t>
          <list style="symbols">
            <t>First, check for Mode A (CSREH with CS-ID Option).</t>
            <t>If not found, check for Mode B (CATS TLV block with CS-ID TLV).</t>
            <t>If neither is found, apply operator-configured fallback (e.g., drop, default service, or deep packet inspection).</t>
          </list>
        </t>
        <t>Step 3: Requirement Parameter Extraction
          <t>Extract network and computing requirement parameters from the same source as the CS-ID (Mode A or Mode B).</t>
        </t>
        <t>Step 4: Path Selection
          <t>The C-PS performs path selection using:</t>
          <list style="symbols">
            <t>CS-ID (required)</t>
            <t>Network requirements (optional, defaults if absent)</t>
            <t>Computing requirements (optional, defaults if absent)</t>
            <t>Current network metrics from C-NMA</t>
            <t>Current computing metrics from C-SMA</t>
          </list>
        </t>
        <t>Step 5: Flow State Installation
          <t>Install forwarding state in the CATS-Forwarder to ensure all subsequent packets of this flow are steered to the selected service contact instance.</t>
        </t>
        <t>Step 6: Packet Forwarding
          <t>Encapsulate the packet (if needed) and forward it along the CATS-computed path to the selected Egress CATS-Forwarder.</t>
        </t>
      </list>
      <t>Flow Identification:</t>
      <t>For flow state installation, the flow is typically identified by the 5-tuple (source IP, destination IP, source port, destination port, protocol). The CATS-Forwarder MAY use additional fields (e.g., flow label) for finer-grained identification.</t>
    </section>

    <section title="Security Considerations" anchor="security">
      <t>This section describes security considerations for the CATS client service request packet format.</t>

      <section title="CS-ID Spoofing" anchor="sec-spoofing">
        <t>An attacker could forge a packet with a legitimate CS-ID to redirect traffic to an unauthorized service contact instance.</t>
        <t>To mitigate this:</t>
        <list style="symbols">
          <t>Ingress CATS-Forwarders SHOULD authenticate the source of service requests using existing mechanisms (e.g., IPsec, TLS, or network-layer authentication).</t>
          <t>The VPA prefix SHOULD be protected by ingress filtering <xref target="RFC2827"/> to prevent external injection of spoofed packets.</t>
        </list>
      </section>

      <section title="Requirement Parameter Manipulation" anchor="sec-params">
        <t>An attacker could modify requirement parameters to cause denial of service (e.g., requesting impossible resource combinations) or to steer traffic to overloaded instances.</t>
        <t>Mitigations:</t>
        <list style="symbols">
          <t>C-PS implementations SHOULD validate requirement parameters against operator-defined bounds.</t>
          <t>Requirement parameters carried in Mode B SHOULD be integrity-protected using transport-layer security (e.g., TLS, DTLS).</t>
        </list>
      </section>

      <section title="Extension Header Amplification" anchor="sec-amplification">
        <t>Maliciously crafted extension headers with excessive options could cause processing overhead.</t>
        <t>Mitigations:</t>
        <list style="symbols">
          <t>CATS-Forwarders SHOULD enforce a maximum CSREH length (RECOMMENDED: 256 octets).</t>
          <t>Unknown or malformed options SHOULD be handled according to the option type bits (skip, discard, discard with ICMP).</t>
        </list>
      </section>

      <section title="Privacy" anchor="sec-privacy">
        <t>The CS-ID may reveal information about the service being accessed. When privacy is a concern:</t>
        <list style="symbols">
          <t>Use encrypted transports (TLS, QUIC) to protect Mode B TLVs.</t>
          <t>Consider that Mode A extension headers are visible to all on-path nodes.</t>
        </list>
      </section>

      <section title="Replay Attacks" anchor="sec-replay">
        <t>An attacker could replay captured service request packets to exhaust computing resources.</t>
        <t>Mitigations:</t>
        <list style="symbols">
          <t>The Request Nonce TLV (Type 0x07) MAY be used to detect replays.</t>
          <t>CATS-Forwarders SHOULD implement rate limiting per source.</t>
        </list>
      </section>
    </section>

    <section title="Privacy Considerations" anchor="privacy">
      <t>The CATS client service request packet format raises the following privacy considerations:</t>

      <section title="Service Fingerprinting" anchor="priv-fingerprinting">
        <t>The CS-ID may allow on-path observers to infer which service a client is accessing. This is particularly relevant for Mode A, where the CS-ID is carried in a visible extension header.</t>
        <t>Mitigation: Clients concerned about service fingerprinting SHOULD use Mode B with encrypted transports, or request that the operator deploy per-client VPAs.</t>
      </section>

      <section title="Requirement Disclosure" anchor="priv-disclosure">
        <t>Computing requirement parameters may reveal sensitive information about the client's workload type or data sensitivity.</t>
        <t>Mitigation: Requirement parameters SHOULD be encrypted when transmitted over untrusted networks. Mode B with TLS provides this protection.</t>
      </section>

      <section title="Location Privacy" anchor="priv-location">
        <t>The source IP address in the service request packet reveals the client's network location. This is inherent to IP networking and not specific to CATS.</t>
        <t>Mitigation: Standard IP privacy techniques (e.g., VPNs, proxies) may be used in conjunction with CATS.</t>
      </section>
    </section>

    <section title="IANA Considerations" anchor="iana">
      <t>This document requests IANA to make the following assignments:</t>

      <section title="IPv6 Next Header Value" anchor="iana-next-header">
        <t>A new IPv6 Next Header value for the CATS Service Request Extension Header (CSREH):</t>
        <figure>
          <artwork>
+--------+-----------------------------+-----------+
| Value  | Protocol                    | Reference |
+--------+-----------------------------+-----------+
| TBD1   | CATS Service Request EH     | This doc  |
+--------+-----------------------------+-----------+
          </artwork>
        </figure>
      </section>

      <section title="IPv6 Hop-by-Hop Option Types" anchor="iana-options">
        <t>Three new IPv6 Hop-by-Hop Option Types:</t>
        <figure>
          <artwork>
+--------+-----------------------------------+-----------+
| Value  | Name                              | Reference |
+--------+-----------------------------------+-----------+
| TBD2   | CS-ID Option                      | This doc  |
| TBD3   | Network Requirement Option        | This doc  |
| TBD4   | Computing Requirement Option      | This doc  |
+--------+-----------------------------------+-----------+
          </artwork>
        </figure>
      </section>

      <section title="CATS TLV Registry" anchor="iana-tlv">
        <t>A new registry for CATS Service Request TLV Types:</t>
        <t>Registry Name: CATS Service Request TLV Types</t>
        <t>Registration Procedure: Standards Action for 0x00-0x7F, Expert Review for 0x80-0xFF</t>
        <t>Initial assignments:</t>
        <figure>
          <artwork>
+--------+---------------------------+-----------+
| Type   | Name                      | Reference |
+--------+---------------------------+-----------+
| 0x00   | Reserved                  | This doc  |
| 0x01   | CS-ID TLV                 | This doc  |
| 0x02   | Network Requirements TLV  | This doc  |
| 0x03   | Computing Requirements TLV| This doc  |
| 0x04   | CSCI-ID TLV               | This doc  |
| 0x05   | Client Capability TLV     | This doc  |
| 0x06   | Request Timestamp TLV     | This doc  |
| 0x07   | Request Nonce TLV         | This doc  |
| 0x08   | Service Affinity TLV      | This doc  |
| 0x09   | QoS Class TLV             | This doc  |
| 0x0A-0x7F | Unassigned            |            |
| 0x80-0xFF | Private/Experimental   | This doc  |
+--------+---------------------------+-----------+
          </artwork>
        </figure>
      </section>

      <section title="Requirement Type Registries" anchor="iana-reqtypes">
        <t>Two new registries for Network and Computing Requirement Types:</t>
        <list style="symbols">
          <t>Registry Name: CATS Network Requirement Types; Registration Procedure: Expert Review</t>
          <t>Registry Name: CATS Computing Requirement Types; Registration Procedure: Expert Review</t>
        </list>
        <t>Initial assignments as specified in Sections 5.3 and 5.4.</t>
      </section>
    </section>

    <section title="Packet Format Examples" anchor="appendix-a">
      <section title="Example 1: Mode A - AI Inference Service Request" anchor="example-a">
        <t>Client requests an AI inference service with specific cost requirements using IPv6 extension headers.</t>
        <t>IPv6 Header:</t>
        <list style="symbols">
          <t>Source: 2001:db8:client::1</t>
          <t>Destination: fd00:cats:1::1 (VPA for AI services)</t>
          <t>Next Header: TBD1 (CSREH)</t>
        </list>
        <t>CATS Service Request Extension Header:</t>
        <list style="symbols">
          <t>Next Header: 6 (TCP)</t>
          <t>Hdr Ext Len: 3 (32 octets)</t>
          <t>Option 1 - CS-ID Option (Type 0x10):
            <list style="symbols">
              <t>Opt Data Len: 4</t>
              <t>CS-ID: 0x00010001 (AI Inference Service)</t>
            </list>
          </t>
          <t>Option 2 - Network Requirement Option (Type 0x11):
            <list style="symbols">
              <t>Opt Data Len: 16</t>
              <t>Num Req: 2</t>
              <t>Entry 1: Max Latency = 10ms (HARD)
                <list style="symbols">
                  <t>Req Type: 0x01, Req Flags: 0x01, Value: 10, Unit: 0x0001</t>
                </list>
              </t>
              <t>Entry 2: Min Bandwidth = 100Mbps (SOFT)
                <list style="symbols">
                  <t>Req Type: 0x02, Req Flags: 0x02, Value: 100, Unit: 0x0002</t>
                </list>
              </t>
            </list>
          </t>
          <t>Option 3 - Computing Requirement Option (Type 0x12):
            <list style="symbols">
              <t>Opt Data Len: 12</t>
              <t>Num Req: 1</t>
              <t>Entry 1: Max Cost = 5 (HARD)
                <list style="symbols">
                  <t>Req Type: 0x03, Req Flags: 0x01, Value: 5, Unit: 0x0004</t>
                </list>
              </t>
            </list>
          </t>
        </list>
        <t>TCP Header + Application Payload follows.</t>
      </section>

      <section title="Example 2: Mode B - Gaming Service Request" anchor="example-b">
        <t>Client requests a cloud gaming service using payload-based TLVs over UDP.</t>
        <t>IPv4 Header:</t>
        <list style="symbols">
          <t>Source: 192.168.1.100</t>
          <t>Destination: 10.128.2.50 (VPA for Gaming services)</t>
          <t>Protocol: 17 (UDP)</t>
        </list>
        <t>UDP Header:</t>
        <list style="symbols">
          <t>Source Port: 54321</t>
          <t>Destination Port: 3478</t>
        </list>
        <t>CATS TLV Block:</t>
        <list style="symbols">
          <t>Magic: 0x43415453 ("CATS")</t>
          <t>Version: 0x01</t>
          <t>Flags: 0x00</t>
          <t>Total Length: 28</t>
          <t>TLV 1 - CS-ID TLV (Type 0x01):
            <list style="symbols">
              <t>Flags: 0x03 (CRITICAL | MUST_HONOR)</t>
              <t>Length: 5</t>
              <t>ID Length: 4</t>
              <t>CS-ID: 0x00020001 (Cloud Gaming Service)</t>
            </list>
          </t>
          <t>TLV 2 - Network Requirements TLV (Type 0x02):
            <list style="symbols">
              <t>Flags: 0x01 (CRITICAL)</t>
              <t>Length: 12</t>
              <t>Num Req: 1</t>
              <t>Entry: Max Latency = 20ms (HARD)
                <list style="symbols">
                  <t>Req Type: 0x01, Req Flags: 0x01, Unit: 0x0001, Value: 20</t>
                </list>
              </t>
            </list>
          </t>
          <t>TLV 3 - Computing Requirements TLV (Type 0x03):
            <list style="symbols">
              <t>Flags: 0x01 (CRITICAL)</t>
              <t>Length: 12</t>
              <t>Num Req: 1</t>
              <t>Entry: Max Computing Time = 2ms (HARD)
                <list style="symbols">
                  <t>Req Type: 0x02, Req Flags: 0x01, Unit: 0x0001, Value: 2</t>
                </list>
              </t>
            </list>
          </t>
        </list>
        <t>Application Payload follows.</t>
      </section>

      <section title="Example 3: Dual Mode - Video Streaming Service" anchor="example-c">
        <t>Client sends a request with both Mode A and Mode B for redundancy and compatibility.</t>
        <t>IPv6 Header:</t>
        <list style="symbols">
          <t>Source: 2001:db8:client::2</t>
          <t>Destination: fd00:cats:3::1 (VPA for Video services)</t>
          <t>Next Header: TBD1 (CSREH)</t>
        </list>
        <t>CSREH (Mode A):</t>
        <list style="symbols">
          <t>Next Header: 17 (UDP)</t>
          <t>Contains: CS-ID=0x00030001, Max Latency=50ms</t>
        </list>
        <t>UDP Header:</t>
        <list style="symbols">
          <t>Destination Port: 554 (RTSP)</t>
        </list>
        <t>CATS TLV Block (Mode B):</t>
        <list style="symbols">
          <t>Magic: 0x43415453</t>
          <t>Flags: 0x01 (EXT_HEADER_PRESENT)</t>
          <t>Contains: CS-ID=0x00030001, Min Bandwidth=25Mbps</t>
        </list>
        <t>RTSP Payload follows.</t>
      </section>
    </section>

    <section title="YANG Data Model for CATS Request Parameters" anchor="appendix-b">
      <t>This appendix provides a simplified YANG data model for configuring and managing CATS client request parameters.</t>
      <figure>
        <artwork>
module ietf-cats-request {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-cats-request";
  prefix cats-req;

  import ietf-inet-types {
    prefix inet;
  }

  organization
    "IETF CATS Working Group";
  description
    "YANG data model for CATS client service request parameters.";

  revision 2026-07-07 {
    description
      "Initial revision.";
  }

  typedef cs-id {
    type binary {
      length "2..16";
    }
    description
      "CATS Service Identifier.";
  }

  typedef req-type {
    type uint8 {
      range "1..255";
    }
    description
      "Requirement type identifier.";
  }

  typedef unit-code {
    type uint16;
    description
      "Unit code for requirement values.";
  }

  grouping requirement-entry {
    leaf req-type {
      type req-type;
      mandatory true;
    }
    leaf req-flags {
      type bits {
        bit hard {
          position 0;
        }
        bit soft {
          position 1;
        }
        bit preference {
          position 2;
        }
      }
      default "hard";
    }
    leaf value {
      type uint32;
      mandatory true;
    }
    leaf unit-code {
      type unit-code;
      mandatory true;
    }
  }

  grouping network-requirements {
    list network-req {
      key "req-type";
      uses requirement-entry;
    }
  }

  grouping computing-requirements {
    list computing-req {
      key "req-type";
      uses requirement-entry;
    }
  }

  container cats-service-request {
    leaf cs-id {
      type cs-id;
      mandatory true;
    }
    leaf mode {
      type enumeration {
        enum extension-header;
        enum payload-based;
        enum dual-mode;
      }
      default "dual-mode";
    }
    uses network-requirements;
    uses computing-requirements;
  }
}
        </artwork>
      </figure>
    </section>

    <section title="Acknowledgements" anchor="appendix-c">
      <t>The authors would like to thank the CATS Working Group for their valuable feedback and contributions to this document.</t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      <reference anchor="RFC2119">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author initials="S." surname="Bradner" fullname="S. Bradner"/>
          <date month="March" year="1997"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
      </reference>

      <reference anchor="RFC8174">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author initials="B." surname="Leiba" fullname="B. Leiba"/>
          <date month="May" year="2017"/>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
      </reference>

      <reference anchor="RFC8200">
        <front>
          <title>Internet Protocol, Version 6 (IPv6) Specification</title>
          <author initials="S." surname="Deering" fullname="S. Deering"/>
          <author initials="R." surname="Hinden" fullname="R. Hinden"/>
          <date month="July" year="2017"/>
        </front>
        <seriesInfo name="STD" value="86"/>
        <seriesInfo name="RFC" value="8200"/>
      </reference>

      <reference anchor="RFC4193">
        <front>
          <title>Unique Local IPv6 Unicast Addresses</title>
          <author initials="R." surname="Hinden" fullname="R. Hinden"/>
          <author initials="B." surname="Haberman" fullname="B. Haberman"/>
          <date month="October" year="2005"/>
        </front>
        <seriesInfo name="RFC" value="4193"/>
      </reference>

      <reference anchor="RFC2827">
        <front>
          <title>Network Ingress Filtering: Defeating Denial of Service Attacks which employ IP Source Address Spoofing</title>
          <author initials="P." surname="Ferguson" fullname="P. Ferguson"/>
          <author initials="D." surname="Senie" fullname="D. Senie"/>
          <date month="May" year="2000"/>
        </front>
        <seriesInfo name="BCP" value="38"/>
        <seriesInfo name="RFC" value="2827"/>
      </reference>
    </references>

    <references title="Informative References">
      <reference anchor="I-D.ietf-cats-framework">
        <front>
          <title>A Framework for Computing-Aware Traffic Steering (CATS)</title>
          <author initials="C." surname="Li" fullname="C. Li" role="editor"/>
          <author initials="Z." surname="Du" fullname="Z. Du"/>
          <author initials="M." surname="Boucadair" fullname="M. Boucadair" role="editor"/>
          <author initials="L. M." surname="Contreras" fullname="L. M. Contreras"/>
          <author initials="J." surname="Drake" fullname="J. Drake"/>
          <date month="March" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-cats-framework-22"/>
      </reference>

      <reference anchor="I-D.zhangb-cats-service-metrics-op">
        <front>
          <title>Computing Service Metric Definitions and Operation under CATS</title>
          <author fullname="B. Zhang" initials="B." surname="Zhang"/>
          <date month="June" year="2026"/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-zhangb-cats-service-metrics-op-03"/>
      </reference>

    </references>

    <section title="Authors' Addresses" anchor="authors">
      <t>[Editor's Note: To be completed upon working group adoption.]</t>
    </section>
  </back>
</rfc>
