<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     ipr="trust200902"
     docName="draft-ramasamy-idr-sr-policy-composite-perflow-00"
     category="std"
     submissionType="IETF"
     consensus="true"
     xml:lang="en"
     tocInclude="true"
     sortRefs="true"
     symRefs="true"
     version="3">

  <front>
    <title abbrev="BGP Composite CP and Per-Flow FC">BGP Extensions for SRv6 Per-Flow Traffic Engineering: Composite Candidate Path and Forwarding-Class Signaling</title>
    <seriesInfo name="Internet-Draft" value="draft-ramasamy-idr-sr-policy-composite-perflow-00"/>

    <author fullname="Selvamani Ramasamy" initials="S." surname="Ramasamy" role="editor">
      <organization>Nexthop AI</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>selva@nexthop.ai</email>
      </address>
    </author>

    <author fullname="Manoharan Sundaramoorthy" initials="M." surname="Sundaramoorthy">
      <organization>Nexthop AI</organization>
      <address>
        <postal>
          <country>India</country>
        </postal>
        <email>manoharan@nexthop.ai</email>
      </address>
    </author>

    <author fullname="Shyam Sethuram" initials="S." surname="Sethuram">
      <organization>Nexthop AI</organization>
      <address>
        <postal>
          <country>India</country>
        </postal>
        <email>shyam@nexthop.ai</email>
      </address>
    </author>

    <author fullname="Venkitraman Kasiviswanathan" initials="V." surname="Kasiviswanathan">
      <organization>Nexthop AI</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>venkit@nexthop.ai</email>
      </address>
    </author>

    <date year="2026" month="May" day="29"/>

    <area>Routing</area>
    <workgroup>Inter-Domain Routing</workgroup>

    <keyword>BGP</keyword>
    <keyword>Segment Routing</keyword>
    <keyword>SRv6</keyword>
    <keyword>SR Policy</keyword>
    <keyword>Composite Candidate Path</keyword>
    <keyword>Per-Flow Steering</keyword>
    <keyword>Forwarding Class</keyword>

    <abstract>
      <t>The Segment Routing Policy Architecture (RFC 9256) defines the concept of a Composite Candidate Path, which enables a parent SR Policy to recursively steer traffic into a set of constituent SR Policies. Section 8.6 of RFC 9256 further defines per-flow steering, in which packets are classified into a Forwarding Class value by a Quality-of-Service classifier at the headend, and that Forwarding Class value selects a specific constituent SR Policy, identified by its color, for forwarding.</t>

      <t>RFC 9830 specifies how BGP distributes SR Policy Candidate Paths but explicitly excludes composite Candidate Paths from its scope. Consequently, no standard BGP mechanism currently exists to distribute a parent per-flow SR Policy -- including its Forwarding-Class-to-color mapping table -- to headend nodes. This document defines two new sub-TLVs for the BGP Tunnel Encapsulation Attribute (SR Policy type, Tunnel Type 15): the Constituent SR Policy sub-TLV and the nested Per-Flow Forwarding Class sub-TLV. Together, these extensions allow a controller to distribute a fully specified composite or per-flow Candidate Path to headend routers via BGP.</t>
    </abstract>
  </front>

  <middle>

    <section numbered="true" toc="default" anchor="introduction">
      <name>Introduction</name>
      <t>Segment Routing (SR) <xref target="RFC8402"/> allows a headend node to steer packet flows along any explicitly specified path. The headend instantiates an SR Policy <xref target="RFC9256"/> identified by the tuple &lt;Headend, Color, Endpoint&gt;. A Candidate Path (CP) is the unit of signaling, and RFC 9830 specifies how BGP distributes these CPs to headends using a dedicated SR Policy SAFI (SAFI 73) with Tunnel Encapsulation Attribute sub-TLVs.</t>

      <t>RFC 9256 Section 2.2 defines three types of Candidate Paths:</t>

      <ul spacing="normal">
        <li><strong>Explicit:</strong> A specific set of Segment Lists.</li>
        <li><strong>Dynamic:</strong> An optimization objective and constraints.</li>
        <li><strong>Composite:</strong> A container grouping multiple constituent SR Policies for combined steering.</li>
      </ul>

      <t>The Composite CP enables the construction of a parent SR Policy that distributes traffic across multiple constituent SR Policies, each identified by a distinct color and sharing the same headend and endpoint as the parent.</t>

      <section numbered="true" toc="default" anchor="per-flow-te">
        <name>Per-Flow Traffic Engineering</name>
        <t>Section 8.6 of RFC 9256 specifies per-flow steering. A headend maintains a forwarding array indexed by a Forwarding Class (FC) value. Each index maps to either:</t>

        <ul spacing="normal">
          <li>The IGP (Interior Gateway Protocol) shortest path to the endpoint (the default), or</li>
          <li>A constituent SR Policy identified by its color.</li>
        </ul>

        <t>A Quality-of-Service (QoS) classifier on ingress assigns each packet an FC value derived from DSCP (Differentiated Services Code Point) markings, 802.1p bits, or other local policy. The headend then steers the packet into the SR Policy (or IGP path) corresponding to that FC.</t>

        <t>The FC field width and value range are encoding choices of this document. This document encodes FC as a 3-bit value (range 0-7); see <xref target="fc-sub-tlv"/>. Implementations that natively classify traffic into more than 8 forwarding classes are responsible for mapping their internal classes onto the 0-7 range before BGP signaling.</t>

        <t>The configuration model below illustrates this construct (illustrative, implementation-agnostic syntax):</t>

        <artwork align="left" type="ascii-art"><![CDATA[
! Segment lists for constituent policies
segment-list SL_GOLD
  index 10 srv6-sid 2001:db8:100::1

segment-list SL_SILVER
  index 10 srv6-sid 2001:db8:200::1

! Child SR Policy: color 100, endpoint 2001:db8::1
policy color 100 endpoint 2001:db8::1
  candidate-path preference 100 name p100 explicit
    segment-list SL_GOLD

! Child SR Policy: color 200, same endpoint
policy color 200 endpoint 2001:db8::1
  candidate-path preference 100 name p200 explicit
    segment-list SL_SILVER

! Parent per-flow SR Policy: color 300, endpoint 2001:db8::1
!   FC 1 -> color 100 (high-priority path)
!   FC 2 -> color 200 (best-effort path)
!   FC 0,3-7 -> IGP (default)
policy color 300 endpoint 2001:db8::1
  candidate-path preference 70 name pf300 per-flow
    forwarding-class 1 color 100
    forwarding-class 2 color 200
    forwarding-class default action igp
]]></artwork>

        <t>In a controller-driven deployment, the controller must distribute this parent policy -- including the FC-to-color mapping -- to the headend via BGP. RFC 9830 provides no mechanism to do so. This document fills that gap.</t>
      </section>

      <section numbered="true" toc="default" anchor="scope">
        <name>Scope</name>
        <t>This document:</t>

        <ul spacing="normal">
          <li>Defines the <strong>Constituent SR Policy sub-TLV</strong> as a new optional sub-TLV within the BGP Tunnel Encapsulation Attribute SR Policy type (Tunnel Type 15).</li>
          <li>Defines the <strong>Per-Flow Forwarding Class (FC) sub-TLV</strong> as a nested optional sub-TLV within the Constituent SR Policy sub-TLV.</li>
          <li>Specifies procedures for origination, advertisement, reception, and SR Policy Module (SRPM) processing of composite and per-flow Candidate Paths distributed via BGP.</li>
          <li>Specifies error handling for malformed sub-TLVs.</li>
          <li>Requests IANA allocations for the new sub-TLV code points.</li>
        </ul>

        <t>This document does not modify any sub-TLV defined in RFC 9830 or RFC 9012. The SR Policy BGP SAFI (Subsequent Address Family Identifier), NLRI format, RR propagation rules, and best-path selection procedures of RFC 9830 remain unchanged. Inter-AS distribution of Composite Candidate Paths is out of scope; the same operational caveats as RFC 9830 Section 8 apply. PCEP (Path Computation Element Communication Protocol)-based composite CP distribution is addressed by <xref target="I-D.ietf-pce-multipath"/> and is out of scope.</t>

        <t>This document covers similar ground to other individual Internet-Drafts addressing BGP distribution of Composite Candidate Paths (e.g., <xref target="I-D.jiang-idr-sr-policy-composite-path"/>). The authors encourage coordination and possible consolidation with such efforts during IDR WG discussion.</t>
      </section>

      <section numbered="true" toc="default" anchor="reqs-language">
        <name>Requirements Language</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all capitals, as shown here.</t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="terminology">
      <name>Terminology</name>
      <t>This document uses terms defined in <xref target="RFC9256"/> and <xref target="RFC9830"/>. Additional terms used are:</t>

      <dl spacing="normal" newline="false">
        <dt>SR Policy:</dt>
        <dd>Identified by &lt;Headend, Color, Endpoint&gt;; a source-routing policy defined by an ordered list of segments <xref target="RFC9256"/>.</dd>

        <dt>Candidate Path (CP):</dt>
        <dd>The unit of signaling for an SR Policy. May be explicit, dynamic, or composite <xref target="RFC9256"/>.</dd>

        <dt>Composite CP:</dt>
        <dd>A CP that groups constituent SR Policies for combined or per-flow steering (RFC 9256, Section 2.2).</dd>

        <dt>Constituent SR Policy:</dt>
        <dd>A child SR Policy forming part of a Composite CP; referenced solely by color (RFC 9256, Section 2.2).</dd>

        <dt>FC (Forwarding Class):</dt>
        <dd>A value assigned to a packet by an ingress QoS classifier and used to select a per-flow forwarding entry, consistent with the Forwarding Class concept of RFC 9256, Section 8.6. This document encodes FC as a 3-bit value (range 0-7); see <xref target="fc-sub-tlv"/>.</dd>

        <dt>Per-Flow Steering:</dt>
        <dd>A mode where each FC maps to a constituent SR Policy or the IGP path, consistent with RFC 9256, Section 8.6.</dd>

        <dt>Parent SR Policy:</dt>
        <dd>The SR Policy whose active CP is a Composite CP. Has its own distinct color.</dd>

        <dt>SRPM:</dt>
        <dd>SR Policy Module -- the headend block that processes SR Policy information and installs it in the forwarding plane <xref target="RFC9830"/>.</dd>

        <dt>BFD:</dt>
        <dd>Bidirectional Forwarding Detection <xref target="RFC5880"/>.</dd>

        <dt>DSCP:</dt>
        <dd>Differentiated Services Code Point <xref target="RFC2474"/>.</dd>

        <dt>ENLP:</dt>
        <dd>Explicit NULL Label Policy sub-TLV <xref target="RFC9830"/>.</dd>

        <dt>EVPN:</dt>
        <dd>Ethernet Virtual Private Network <xref target="RFC7432"/>.</dd>

        <dt>IGP:</dt>
        <dd>Interior Gateway Protocol.</dd>

        <dt>PCE:</dt>
        <dd>Path Computation Element.</dd>

        <dt>PCEP:</dt>
        <dd>Path Computation Element Communication Protocol.</dd>

        <dt>QoS:</dt>
        <dd>Quality of Service.</dd>

        <dt>ROV:</dt>
        <dd>Route Origin Validation <xref target="RFC6811"/>.</dd>

        <dt>SAFI:</dt>
        <dd>Subsequent Address Family Identifier.</dd>

        <dt>VPN:</dt>
        <dd>Virtual Private Network.</dd>
      </dl>
    </section>

    <section numbered="true" toc="default" anchor="problem-statement">
      <name>Problem Statement</name>

      <section numbered="true" toc="default">
        <name>Composite CPs Are Outside RFC 9830 Scope</name>
        <t>RFC 9830 Section 1 explicitly states: <em>"The signaling of Dynamic and Composite CPs (Sections 5.2 and 5.3, respectively, of [RFC9256]) is outside the scope of this document."</em> As a consequence, RFC 9830 defines no sub-TLV encoding for: the list of constituent SR Policies forming a Composite CP; the FC-to-color mapping enabling per-flow steering; or the default action for unmatched FC values.</t>
      </section>

      <section numbered="true" toc="default">
        <name>Controller-to-Headend Signaling Gap</name>
        <t>In a controller-driven SRv6 TE deployment, an SR Policy Controller distributes SR Policies to headends via BGP SAFI 73. For per-flow TE:</t>

        <ol spacing="normal">
          <li>The controller computes constituent SR Policies (e.g., color 100 for high-priority traffic, color 200 for best-effort).</li>
          <li>The controller computes the parent per-flow SR Policy (e.g., color 300) with the FC mapping.</li>
          <li>The controller distributes constituent policies (colors 100 and 200) via RFC 9830. This works today.</li>
          <li>The controller distributes the parent per-flow policy (color 300) via BGP. This fails -- no composite/FC encoding exists in RFC 9830.</li>
        </ol>

        <t>Step 4 forces operators to configure the parent policy via CLI or NETCONF on every headend, defeating controller-driven automation. This document addresses that gap.</t>
      </section>

      <section numbered="true" toc="default">
        <name>Interaction with the Color Extended Community</name>
        <t>The Color Extended Community <xref target="RFC9012"/> enables BGP service routes (unicast, VPN, EVPN) to be steered into SR Policies at the headend by matching the community color to the SR Policy color. For per-flow TE:</t>

        <ul spacing="normal">
          <li>Service routes carry the color of the <strong>parent</strong> SR Policy (e.g., color 300).</li>
          <li>The headend steers matching traffic into the parent policy.</li>
          <li>The parent policy's per-flow Composite CP steers each packet to a constituent SR Policy based on its FC value.</li>
        </ul>

        <t>The Color Extended Community mechanism requires no change. The extensions defined in this document operate entirely at the SR Policy SAFI layer and do not affect service route processing.</t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="encoding-extensions">
      <name>BGP SR Policy Encoding Extensions</name>

      <section numbered="true" toc="default" anchor="extended-encoding">
        <name>Extended SR Policy Encoding Structure</name>
        <t>RFC 9830 defines the SR Policy encoding using the BGP Tunnel Encapsulation Attribute (Attribute Type 23, Tunnel Type 15). This document extends that structure with the Constituent SR Policy sub-TLV as a new optional sub-TLV within Tunnel Type 15.</t>

        <artwork align="left" type="ascii-art"><![CDATA[
SR Policy SAFI NLRI: <Distinguisher, Policy-Color, Endpoint>
  Attributes:
    Tunnel Encapsulation Attribute (Type 23)
      Tunnel Type: SR Policy (15)
        Binding SID sub-TLV                  [optional, RFC 9830]
        SRv6 Binding SID sub-TLV             [optional, RFC 9830]
        Preference sub-TLV                   [optional, RFC 9830]
        Priority sub-TLV                     [optional, RFC 9830]
        SR Policy Name sub-TLV               [optional, RFC 9830]
        SR Policy CP Name sub-TLV            [optional, RFC 9830]
        ENLP sub-TLV                         [optional, RFC 9830]
        Constituent SR Policy sub-TLV        [optional, THIS DOCUMENT]
          RESERVED (2 octets)
          Color (4 octets)
          Weight (4 octets)
          Per-Flow FC sub-TLV                [optional, THIS DOCUMENT]
        Constituent SR Policy sub-TLV        [optional, MAY repeat]
          ...
]]></artwork>

        <t><strong>Mutual Exclusion:</strong> A Constituent SR Policy sub-TLV and a Segment List sub-TLV (Type 128, RFC 9830) <bcp14>MUST NOT</bcp14> appear in the same SR Policy Tunnel Type encoding. A Candidate Path is either composite (uses Constituent SR Policy sub-TLVs) or explicit/dynamic (uses Segment List sub-TLVs). Presence of both is a malformed condition (<xref target="error-handling"/>, Condition 1).</t>

        <t><strong>Candidate-path selection:</strong> When both Composite and explicit/dynamic Candidate Paths are advertised for the same &lt;Headend, Color, Endpoint&gt;, Candidate Path selection follows Section 2.9 of <xref target="RFC9256"/>. The composite encoding does not alter the preference-based ordering.</t>
      </section>

      <section numbered="true" toc="default" anchor="constituent-sub-tlv">
        <name>Constituent SR Policy Sub-TLV</name>
        <t>The Constituent SR Policy sub-TLV is a new optional sub-TLV of the BGP Tunnel Encapsulation Attribute SR Policy Tunnel Type. It encodes a single constituent SR Policy within a Composite CP. Multiple occurrences <bcp14>MAY</bcp14> appear in the same SR Policy encoding, each representing one constituent SR Policy. The ordering of occurrences is not significant.</t>

        <t><strong>Wire Format:</strong></t>

        <artwork align="left" type="ascii-art"><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |    Length     |          RESERVED             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Color                              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Weight                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|              sub-TLVs (variable length, optional)             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>

        <t><strong>Fields:</strong></t>

        <dl spacing="normal" newline="false">
          <dt>Type:</dt>
          <dd>To be assigned by IANA from the "BGP Tunnel Encapsulation Attribute Sub-TLVs" registry under the Standards Action policy.</dd>

          <dt>Length:</dt>
          <dd>1-octet unsigned integer. Total length in octets of all fields following the Length field (RESERVED + Color + Weight + sub-TLVs). The minimum value is <strong>10</strong> (2 octets RESERVED + 4 octets Color + 4 octets Weight). A Length value less than 10 is a malformed condition (<xref target="error-handling"/>, Condition 8).</dd>

          <dt>RESERVED:</dt>
          <dd>
            <t>2 octets. <bcp14>MUST</bcp14> be set to zero on transmission and <bcp14>MUST</bcp14> be ignored on receipt. The 2-octet RESERVED field preserves 32-bit word alignment for the Color and Weight fields.</t>
            <t>The 1-octet Length field limits the total nested sub-TLV content per Constituent SR Policy sub-TLV to 245 octets (255 minus the 10 bytes of fixed fields). Future nested sub-TLVs requiring more than 245 octets of combined content will require a separate 2-octet-Length Constituent sub-TLV code point to be defined at that time.</t>
          </dd>

          <dt>Color:</dt>
          <dd>4-octet unsigned non-zero integer. Identifies the constituent SR Policy. Constituent SR Policies share the headend and endpoint of the parent SR Policy; they are uniquely identified by this Color within the context of the parent. The Color <bcp14>MUST NOT</bcp14> equal zero (<xref target="error-handling"/>, Condition 9) and <bcp14>MUST NOT</bcp14> equal the Color of the parent SR Policy in the NLRI (<xref target="error-handling"/>, Condition 7). All Constituent SR Policy sub-TLVs within a single SR Policy encoding <bcp14>MUST</bcp14> carry distinct Color values (<xref target="error-handling"/>, Condition 10).</dd>

          <dt>Weight:</dt>
          <dd>
            <t>4-octet unsigned integer. Specifies the weight of this constituent SR Policy for weighted load-balancing, consistent with Section 2.11 of <xref target="RFC9256"/>. The Weight field is always present on the wire as a fixed 4-octet field; there is no implicit/absent default on receipt. On origination, controllers <bcp14>SHOULD</bcp14> encode Weight=1 when no explicit weight policy is configured.</t>
            <t>In <strong>weighted load-balancing mode</strong> (no Per-Flow FC sub-TLV present in any Constituent SR Policy sub-TLV in the encoding), a Weight value of zero marks that constituent as receiving no traffic; this is a constituent-level validity outcome, not a treat-as-withdraw condition. If the Weight values of <em>all</em> constituents in the encoding are zero, the Composite CP carries no traffic and is treated as malformed (<xref target="error-handling"/>, Condition 3).</t>
            <t>In <strong>per-flow steering mode</strong> (every Constituent SR Policy sub-TLV carries a Per-Flow FC sub-TLV), the Weight field has no load-balancing effect between FC-mapped constituents (per-flow steering directs each classified packet to a single constituent) and <bcp14>MUST</bcp14> be ignored on receipt. Originators <bcp14>MAY</bcp14> encode any value; the value is not interpreted. Weighted load balancing within the active CP of the constituent SR Policy itself remains governed by Section 2.11 of <xref target="RFC9256"/>.</t>
          </dd>

          <dt>sub-TLVs:</dt>
          <dd>Variable-length field containing zero or one Per-Flow FC sub-TLV (<xref target="fc-sub-tlv"/>) and optionally other sub-TLVs defined in the future.</dd>
        </dl>

        <t><strong>Semantics -- Weighted Load Balancing Mode:</strong> When no Per-Flow FC sub-TLV is present in a Constituent SR Policy sub-TLV, the constituent participates in weighted load balancing over all traffic steered into the parent policy. The traffic fraction steered to this constituent is w_i / sum_j(w_j), where w_i is this Weight and the sum is over all valid constituents in the Composite CP.</t>

        <t><strong>Semantics -- Per-Flow Steering Mode:</strong> When a Per-Flow FC sub-TLV is present, the constituent receives only traffic classified to the specified FC value.</t>

        <t><strong>Mixed encoding</strong> is not permitted: all Constituent SR Policy sub-TLVs in a single encoding <bcp14>MUST</bcp14> either all include a Per-Flow FC sub-TLV or all omit it. The rationale is that mixing FC-classified and weighted-LB traffic in one Composite CP would require defining a residual-traffic policy for unclassified FC values in the presence of weighted constituents, which is not specified and creates ambiguous behavior. A mixed encoding is a malformed condition (<xref target="error-handling"/>, Condition 6).</t>
      </section>

      <section numbered="true" toc="default" anchor="fc-sub-tlv">
        <name>Per-Flow Forwarding Class (FC) Sub-TLV</name>
        <t>The Per-Flow FC sub-TLV is a nested optional sub-TLV within the Constituent SR Policy sub-TLV. It assigns a 3-bit FC value to the containing constituent SR Policy, enabling QoS-based per-flow steering.</t>

        <t><strong>Wire Format:</strong></t>

        <artwork align="left" type="ascii-art"><![CDATA[
 0                   1
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Type      |   Length(=2)  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|D|        RESERVED       | FC  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork>

        <t>The sub-TLV is 4 octets total: 1-octet Type + 1-octet Length + 2 octets of value content.</t>

        <t>The 2-octet value field is laid out as follows, where bit 0 is the most significant bit of the first value octet:</t>

        <artwork align="left" type="ascii-art"><![CDATA[
  Bit  0      : D (Default-Drop flag)
  Bits 1-12   : RESERVED (12 bits)
  Bits 13-15  : FC (3 bits; LSBs of the second value octet)
]]></artwork>

        <t>All 16 bits of the value field are accounted for: 1 (D) + 12 (RESERVED) + 3 (FC) = 16 bits.</t>

        <t><strong>Fields:</strong></t>

        <dl spacing="normal" newline="false">
          <dt>Type:</dt>
          <dd>To be assigned by IANA from the new "Constituent SR Policy Sub-TLV Types" registry (<xref target="iana-nested-registry"/>).</dd>

          <dt>Length:</dt>
          <dd>1 octet. <bcp14>MUST</bcp14> be 2. A value other than 2 is a malformed condition (<xref target="error-handling"/>, Condition 5).</dd>

          <dt>D (Default-Drop flag, bit 0):</dt>
          <dd>When set to 1, if the constituent SR Policy referenced by this sub-TLV becomes invalid, traffic for this FC entry <bcp14>MUST</bcp14> be dropped rather than forwarded via the IGP path. When set to 0 (default), traffic falls back to the IGP shortest path to the endpoint. This flag provides an extension point for the default-action choice described in RFC 9256, Section 8.6; absent this flag the per-flow default action is resolved via local policy per that section.</dd>

          <dt>RESERVED (bits 1-12, 12 bits):</dt>
          <dd><bcp14>MUST</bcp14> be set to zero on transmission and <bcp14>MUST</bcp14> be ignored on receipt.</dd>

          <dt>FC (bits 13-15, 3 bits):</dt>
          <dd>The Forwarding Class value for this constituent SR Policy. Valid range: 0-7. Different Constituent SR Policy sub-TLVs within the same SR Policy encoding <bcp14>MUST</bcp14> carry distinct FC values (<xref target="error-handling"/>, Condition 2).</dd>
        </dl>

        <t><strong>Nested-registry Length convention.</strong> All sub-TLVs registered in the "Constituent SR Policy Sub-TLV Types" registry (<xref target="iana-nested-registry"/>) -- across both the Standards Action range (1-127) and the Expert Review range (128-254) -- use a <strong>1-octet Length field</strong>, regardless of Type value. This nested registry does not follow the RFC 9012, Section 2 high-bit Type / Length-width rule used for the parent BGP Tunnel Encapsulation Attribute Sub-TLVs registry. The 1-octet Length field bounds any single nested sub-TLV's value content to 255 octets, which is sufficient for the per-Constituent extension points anticipated by this document. Definitions of future nested sub-TLVs in this registry <bcp14>MUST</bcp14> conform to this convention.</t>

        <t><strong>Semantics:</strong> Upon receiving a Composite CP with Per-Flow FC sub-TLVs, the SRPM builds an FC-indexed steering array as follows:</t>

        <ul spacing="normal">
          <li>All eight FC entries (0-7) are initialized to the IGP shortest path to the endpoint (the default action, consistent with RFC 9256, Section 8.6).</li>
          <li>For each Constituent SR Policy sub-TLV carrying a Per-Flow FC sub-TLV, the array entry at index FC is set to the constituent SR Policy identified by Color.</li>
          <li>If the constituent SR Policy for a given FC entry becomes invalid, the SRPM reverts that entry to the IGP shortest path (D=0) or drops traffic (D=1), consistent with RFC 9256, Section 8.6.</li>
          <li>FC values not mapped by any Constituent SR Policy sub-TLV retain the default IGP action throughout the lifetime of the Composite CP.</li>
        </ul>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="encoding-example">
      <name>Encoding Example</name>
      <t>The following example encodes the parent per-flow SR Policy from <xref target="per-flow-te"/> (color 300, endpoint 2001:db8::1, preference 70, CP name "pf300"). FC 1 maps to color 100 and FC 2 maps to color 200. All other FCs default to IGP (D=0 for both).</t>

      <t>The Weight value of <tt>1</tt> shown in each Constituent SR Policy sub-TLV below is illustrative; because every constituent carries a Per-Flow FC sub-TLV, this is per-flow steering mode and the Weight field is ignored on receipt (<xref target="constituent-sub-tlv"/>).</t>

      <t><strong>SR Policy SAFI NLRI:</strong></t>

      <artwork align="left" type="ascii-art"><![CDATA[
  Distinguisher : 1
  Color         : 300
  Endpoint      : 2001:db8::1  (AFI=2, SAFI=73)
]]></artwork>

      <t><strong>BGP Tunnel Encapsulation Attribute (Type 23, Tunnel Type 15):</strong></t>

      <artwork align="left" type="ascii-art"><![CDATA[
  Preference sub-TLV (Type 12):
    Preference: 70

  SR Policy CP Name sub-TLV (Type 129):
    Name: "pf300"

  Constituent SR Policy sub-TLV (Type TBA1):
    Length:   14  (2 RESERVED + 4 Color + 4 Weight + 4 FC sub-TLV)
    RESERVED: 0x0000
    Color:    100
    Weight:   1
    Per-Flow FC sub-TLV (Type TBA2):
      Length:   2
      Value octet 0: 0x00  (D=0, RESERVED bits 1-7 = 0)
      Value octet 1: 0x01  (bits 8-12 = 0; FC bits 13-15 = 001 = 1)
      Decoded: D=0, RESERVED=0, FC=1   (FC 1 -> color 100)

  Constituent SR Policy sub-TLV (Type TBA1):
    Length:   14
    RESERVED: 0x0000
    Color:    200
    Weight:   1
    Per-Flow FC sub-TLV (Type TBA2):
      Length:   2
      Value octet 0: 0x00  (D=0, RESERVED bits 1-7 = 0)
      Value octet 1: 0x02  (bits 8-12 = 0; FC bits 13-15 = 010 = 2)
      Decoded: D=0, RESERVED=0, FC=2   (FC 2 -> color 200)
]]></artwork>

      <t>The SRPM on the receiving headend installs the following FC steering array for SR Policy (color 300, endpoint 2001:db8::1):</t>

      <table align="center">
        <thead>
          <tr><th>FC</th><th>Forwarding Action</th><th>Fallback on Invalid</th></tr>
        </thead>
        <tbody>
          <tr><td>0</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
          <tr><td>1</td><td>SR Policy color 100 -- SID 2001:db8:100::1</td><td>IGP (D=0)</td></tr>
          <tr><td>2</td><td>SR Policy color 200 -- SID 2001:db8:200::1</td><td>IGP (D=0)</td></tr>
          <tr><td>3</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
          <tr><td>4</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
          <tr><td>5</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
          <tr><td>6</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
          <tr><td>7</td><td>IGP to 2001:db8::1 (default)</td><td>--</td></tr>
        </tbody>
      </table>
    </section>

    <section numbered="true" toc="default" anchor="procedures">
      <name>Procedures</name>

      <section numbered="true" toc="default" anchor="origination">
        <name>Origination</name>
        <t>An SR Policy Controller or BGP egress router originating a Composite or per-flow SR Policy CP <bcp14>MUST</bcp14>:</t>

        <ol spacing="normal">
          <li>Set the SR Policy SAFI NLRI to represent the <strong>parent</strong> SR Policy (e.g., color 300, endpoint 2001:db8::1).</li>
          <li>Include one Constituent SR Policy sub-TLV per constituent SR Policy. Each <bcp14>MUST</bcp14> carry a non-zero Color field that does not equal the parent policy's color or the color of any other Constituent SR Policy sub-TLV in the same encoding.</li>
          <li>For per-flow steering, include a Per-Flow FC sub-TLV within each applicable Constituent SR Policy sub-TLV. All constituents <bcp14>MUST</bcp14> include the FC sub-TLV (no mixed encoding).</li>
          <li><bcp14>MUST NOT</bcp14> include a Segment List sub-TLV (Type 128) in the same encoding as any Constituent SR Policy sub-TLV.</li>
          <li>Originate separate BGP SR Policy SAFI updates for each constituent (child) SR Policy using standard RFC 9830 Segment List sub-TLVs, as these are distinct NLRIs.</li>
          <li>Distribute constituent (child) SR Policies <strong>before</strong> the parent Composite CP. While the SRPM tolerates transient inversion by treating unknown constituents as invalid (<xref target="reception-srpm"/>), controllers <bcp14>SHOULD</bcp14> sequence updates in child-then-parent order to minimize disruption during initial convergence.</li>
        </ol>
      </section>

      <section numbered="true" toc="default" anchor="reception-srpm">
        <name>Reception and SRPM Processing</name>
        <t>Upon receiving a BGP UPDATE carrying an SR Policy SAFI NLRI with one or more Constituent SR Policy sub-TLVs, the BGP speaker applies standard BGP best-path selection per RFC 9830 to choose the best-path NLRI for the &lt;Distinguisher, Color, Endpoint&gt; tuple. The resulting Candidate Path is then offered to the SRPM along with locally configured and PCEP-signaled Candidate Paths for the same &lt;Headend, Color, Endpoint&gt; SR Policy. The SRPM performs its own Candidate Path selection across all sources per Section 2.9 of <xref target="RFC9256"/>; the BGP best-path output is one input to that selection, not the final outcome.</t>

        <t>The SRPM <bcp14>SHALL</bcp14>:</t>

        <ol spacing="normal">
          <li>Recognize the CP as a <strong>Composite CP</strong> type per RFC 9256, Section 2.2.</li>
          <li>For each Constituent SR Policy sub-TLV, identify the corresponding child SR Policy at the local headend by matching &lt;Headend, Color=sub-TLV Color, Endpoint&gt;.</li>
          <li>If a referenced constituent SR Policy is not locally known or has no valid CP, treat that constituent as <strong>invalid</strong>. The Composite CP remains valid as long as at least one constituent is valid, consistent with RFC 9256, Section 5.3. If all constituents are invalid, the Composite CP is invalid. If no other CP exists for the parent SR Policy, the parent SR Policy is invalid, and service routes steered by the Color Extended Community fall back to their unsteered BGP next hop.</li>
          <li>Install the FC-indexed steering array per <xref target="fc-sub-tlv"/> semantics.</li>
          <li>The SRPM <bcp14>SHOULD</bcp14> install the FC array <strong>atomically</strong> with respect to packet classification to avoid transient mis-steering during Composite CP changes.</li>
          <li>Monitor liveness of constituent SR Policies. If a constituent transitions from valid to invalid, the SRPM <bcp14>MUST</bcp14> update the corresponding FC entry to the appropriate fallback (IGP path or drop per D flag) without waiting for a BGP update.</li>
        </ol>

        <t><strong>Convergence behavior:</strong> If the parent Composite CP arrives before one or more constituent SR Policies have been installed by BGP, the SRPM <bcp14>MUST</bcp14> treat those missing constituents as invalid (applying IGP or drop fallback for their FC entries) and <bcp14>MUST</bcp14> update the FC array when the constituent later becomes valid. Liveness monitoring (step 6) handles the transition once convergence completes.</t>
      </section>

      <section numbered="true" toc="default" anchor="rr-transparency">
        <name>Route Reflector Transparency</name>
        <t>Route Reflectors (RRs) <xref target="RFC4456"/> that do not implement the sub-TLVs defined in this document <bcp14>MUST</bcp14> propagate the Constituent SR Policy sub-TLV and its nested Per-Flow FC sub-TLV unchanged, consistent with the handling of unknown sub-TLVs specified in Section 2 of <xref target="RFC9012"/>, as applied by <xref target="RFC9830"/>.</t>
      </section>

      <section numbered="true" toc="default" anchor="graceful-restart">
        <name>Graceful Restart</name>
        <t>During BGP Graceful Restart <xref target="RFC4724"/> and Long-Lived Graceful Restart <xref target="RFC9494"/>, stale Composite CP routes remain installed at the SRPM for the duration of the stale-routes timer. Constituent SR Policy liveness is handled independently per RFC 4724 / RFC 9494 for those NLRIs. The Composite CP need not be re-validated against constituent liveness during the stale interval, to avoid blackholing traffic during BGP session restart.</t>
      </section>

      <section numbered="true" toc="default" anchor="capability-advertisement">
        <name>Capability Advertisement</name>
        <t>A BGP speaker indicates support for Composite CP processing implicitly by advertising SR Policy SAFI (SAFI 73) capability in the BGP OPEN message. A headend that supports SAFI 73 but does not implement this document's extensions will ignore the Constituent SR Policy sub-TLV as an unknown sub-TLV per RFC 9830, rendering the parent CP invalid (<xref target="backward-compat"/>). This is a safe failure mode. No separate capability code is defined.</t>

        <t>Operators <bcp14>SHOULD</bcp14> verify that headend software supports Composite CP processing before distributing parent per-flow policy advertisements. Where available, the headend's YANG operational state model (see <xref target="rel-yang"/> for companion YANG status) or BGP-LS state collection (<xref target="rel-bgp-ls"/>) may be used to confirm support; absent such telemetry, operators may rely on vendor release notes or controlled-rollout testing.</t>
      </section>

      <section numbered="true" toc="default" anchor="backward-compat">
        <name>Backward Compatibility</name>
        <t>BGP speakers that do not implement this document will encounter an unknown sub-TLV type in the SR Policy Tunnel Encapsulation. Per RFC 9830, unknown sub-TLVs are ignored. The SRPM will see no Segment List sub-TLVs and no Constituent SR Policy sub-TLVs, treating the Candidate Path as having no valid forwarding information and marking it invalid. No incorrect forwarding state is installed. This is a safe failure mode.</t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="error-handling">
      <name>Error Handling</name>
      <t>Error handling for BGP UPDATE messages follows the "treat-as-withdraw" strategy of <xref target="RFC7606"/> and RFC 9830, Section 5. Each of the following conditions constitutes a malformed SR Policy NLRI; the treat-as-withdraw procedure <bcp14>MUST</bcp14> be applied:</t>

      <table align="center">
        <thead>
          <tr><th>#</th><th>Malformed Condition</th></tr>
        </thead>
        <tbody>
          <tr><td>1</td><td>A Segment List sub-TLV (Type 128) and one or more Constituent SR Policy sub-TLVs co-exist in the same SR Policy encoding.</td></tr>
          <tr><td>2</td><td>Two or more Constituent SR Policy sub-TLVs carry Per-Flow FC sub-TLVs with duplicate FC values.</td></tr>
          <tr><td>3</td><td>In weighted load-balancing mode, the Weight values of ALL Constituent SR Policy sub-TLVs in the encoding are zero (so no traffic can be steered into any constituent). (Per-constituent Weight=0 is a constituent-level validity outcome -- see <xref target="constituent-sub-tlv"/> -- and is not by itself a malformed NLRI. In per-flow steering mode, Weight is ignored entirely.)</td></tr>
          <tr><td>4</td><td>A Per-Flow FC sub-TLV appears more than once within a single Constituent SR Policy sub-TLV.</td></tr>
          <tr><td>5</td><td>A Per-Flow FC sub-TLV has a Length value other than 2.</td></tr>
          <tr><td>6</td><td>Mixed encoding: some Constituent SR Policy sub-TLVs carry a Per-Flow FC sub-TLV and others do not.</td></tr>
          <tr><td>7</td><td>A Constituent SR Policy sub-TLV carries a Color value equal to the parent SR Policy's Color in the NLRI.</td></tr>
          <tr><td>8</td><td>A Constituent SR Policy sub-TLV carries a Length value less than 10.</td></tr>
          <tr><td>9</td><td>A Constituent SR Policy sub-TLV carries a Color value of zero.</td></tr>
          <tr><td>10</td><td>Two or more Constituent SR Policy sub-TLVs within the same SR Policy encoding carry identical Color values.</td></tr>
          <tr><td>11</td><td>An SR Policy Tunnel Type encoding contains neither a Segment List sub-TLV nor any Constituent SR Policy sub-TLV (i.e., an empty Candidate Path with no forwarding contents).</td></tr>
        </tbody>
      </table>

      <t><strong>Cycle detection.</strong> Constituent SR Policies <bcp14>SHOULD</bcp14> reference non-composite SR Policies (i.e., the active CP of each constituent <bcp14>SHOULD</bcp14> itself be an explicit or dynamic CP, not a Composite CP). If transitive composition is permitted by local policy, the SRPM <bcp14>MUST</bcp14> bound recursion to a configurable maximum depth (default 2) and treat references that exceed that depth, or that form a transitive reference cycle, as <strong>invalid at the constituent level</strong>: the affected constituent entry is marked invalid, the Composite CP remains valid if at least one other constituent is valid, and standard treat-as-withdraw does not apply. A directly self-referential Color (Color equals the parent Color in the NLRI) is already a malformed NLRI per Condition 7.</t>

      <t>A Per-Flow FC sub-TLV is defined only inside a Constituent SR Policy sub-TLV (<xref target="fc-sub-tlv"/>). The nested type space (<xref target="iana-nested-registry"/>) is independent of the top-level BGP Tunnel Encapsulation Attribute Sub-TLVs registry; a top-level Type value is always interpreted per the top-level registry, so an "FC sub-TLV at the top level" is not a detectable error condition and is therefore not enumerated here.</t>
    </section>

    <section numbered="true" toc="default" anchor="related-documents">
      <name>Relationship to Other Documents</name>

      <section numbered="true" toc="default" anchor="rel-rfc9256">
        <name>RFC 9256 -- SR Policy Architecture</name>
        <t>RFC 9256 is the architectural authority. Sections 2.2 and 8.6 define Composite CPs and per-flow steering respectively. This document implements the BGP signaling plane for those constructs. One gap remains in RFC 9256: the <tt>default action drop</tt> behavior is mentioned in some implementations but not normatively defined in RFC 9256, Section 8.6. The D flag in the Per-Flow FC sub-TLV (<xref target="fc-sub-tlv"/>) provides a forward-compatible extension point for this choice.</t>

        <t><strong>SPRING WG coordination required.</strong> The normative semantics of the per-flow default-action -- and any future widening of the Forwarding Class field beyond 3 bits -- are architectural decisions that belong to the SPRING WG (responsible for RFC 9256). Adoption and progression of this document by the IDR WG <bcp14>SHOULD</bcp14> include explicit confirmation from the SPRING WG that (a) the 3-bit FC encoding adopted here is compatible with the RFC 9256 architecture, and (b) the D-flag semantics described in <xref target="fc-sub-tlv"/> are consistent with any future SPRING work on the default-action choice.</t>
      </section>

      <section numbered="true" toc="default" anchor="rel-rfc9830">
        <name>RFC 9830 -- Advertising SR Policies in BGP</name>
        <t>RFC 9830 is the parent document extended here. All SAFI 73 operational procedures remain unchanged. This document does not carry an <tt>Updates: RFC 9830</tt> header because it adds new optional sub-TLVs within the extensibility model that RFC 9830 already provides and does not modify any existing RFC 9830 normative behavior.</t>

        <t><strong>Note for Last Call review.</strong> RFC 9830, Section 1 explicitly scopes Composite Candidate Path signaling out of that document. A reviewer may argue that bringing Composite CPs into scope warrants an <tt>Updates:</tt> clause. The authors take the position that scope is set per-document and does not constrain extensibility, and that adding new sub-TLVs through RFC 9830's pre-existing extensibility model does not require an <tt>Updates:</tt> header. The shepherd writeup should record this position so the IESG/IDR review can resolve it explicitly rather than re-litigating it on the list.</t>
      </section>

      <section numbered="true" toc="default" anchor="rel-bgp-ls">
        <name>BGP-LS Northbound Collection</name>
        <t>A companion BGP-LS mechanism is expected to extend RFC 9857 with TLVs corresponding to the Constituent SR Policy and Per-Flow FC sub-TLVs defined here, enabling northbound collection of Composite CP state from headends to a controller. Implementations <bcp14>SHOULD</bcp14> support both southbound signaling (this document) and northbound state collection for full controller visibility.</t>
      </section>

      <section numbered="true" toc="default" anchor="rel-pcep">
        <name>PCEP Per-Flow Encoding</name>
        <t>PCEP-based distribution of SR Policy Candidate Paths is defined in <xref target="RFC9862"/>. Composite and per-flow extensions to PCEP are being defined separately in the PCE Working Group (<xref target="I-D.ietf-pce-multipath"/>). The exact TLV names and object placement in that draft should be cross-checked against its latest revision before publication; this document does not normatively depend on those names. The BGP encoding in this document and the PCEP encoding are complementary; SRPM behavior on receipt is identical regardless of the signaling protocol used.</t>
      </section>

      <section numbered="true" toc="default" anchor="rel-yang">
        <name>YANG Data Model</name>
        <t>The SPRING WG YANG data model for SR Policy (<xref target="I-D.ietf-spring-sr-policy-yang"/>) currently excludes Composite CP modeling. A companion contribution to that draft is expected to add a <tt>composite</tt> CP type container, a <tt>constituent-sr-policy</tt> list (color, weight, fc-value, default-drop), and a <tt>per-flow-forwarding-class</tt> leaf-list. For current observability, BGP-LS <xref target="RFC9857"/> collection of Composite CP state (<xref target="rel-bgp-ls"/>) is recommended.</t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="operations">
      <name>Operations</name>

      <section numbered="true" toc="default">
        <name>Distribution Ordering</name>
        <t>BGP provides no atomicity guarantee across separate NLRI updates. Controllers <bcp14>SHOULD</bcp14> distribute constituent (child) SR Policy CPs before the parent Composite CP, as specified in <xref target="origination"/>. Headends <bcp14>MUST</bcp14> tolerate transient inversions gracefully per <xref target="reception-srpm"/>, applying IGP or drop fallback for unresolved constituents until convergence completes.</t>
      </section>

      <section numbered="true" toc="default" anchor="per-peer-limits">
        <name>Per-Peer State Limits</name>
        <t>A controller advertising large numbers of Composite CPs referencing nonexistent or invalid constituents will cause the SRPM to maintain per-constituent invalid state and IGP-fallback entries. Implementations <bcp14>SHOULD</bcp14> enforce configurable per-peer limits on the number of Composite CP NLRIs and the number of Constituent SR Policy sub-TLVs per CP. Note that per-flow steering naturally caps the per-CP constituent count at 8 (one per FC value), but weighted load-balancing mode does not impose a comparable cap and is therefore the primary state-amplification surface. Exceeding configured limits <bcp14>SHOULD</bcp14> be logged and <bcp14>MAY</bcp14> result in treat-as-withdraw of excess NLRIs per RFC 7606. Operators <bcp14>SHOULD</bcp14> restrict SR Policy SAFI sessions to trusted controllers to limit the blast radius of misconfiguration.</t>
      </section>

      <section numbered="true" toc="default">
        <name>Convergence and Reconvergence</name>
        <t>When a constituent SR Policy transitions from valid to invalid (e.g., due to a link failure or BFD session down), the SRPM updates the affected FC entries per <xref target="reception-srpm"/> without waiting for a BGP update. The headend need not withdraw and re-advertise the parent Composite CP; liveness is handled locally. When the constituent recovers, the SRPM re-installs the original FC-to-color mapping.</t>
      </section>

      <section numbered="true" toc="default">
        <name>Observability</name>
        <t>For operational visibility into installed Composite CP state -- including constituent validity and FC-array contents -- operators are <bcp14>RECOMMENDED</bcp14> to use the BGP-LS SR Policy distribution mechanism <xref target="RFC9857"/> combined with a Composite CP companion as outlined in <xref target="rel-bgp-ls"/>. The SRPM <bcp14>SHOULD</bcp14> expose Composite CP state in the operational data model (see <xref target="rel-yang"/> for YANG companion status).</t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The security considerations of BGP <xref target="RFC4271"/>, BGP SR Policy <xref target="RFC9830"/>, and SR Policy Architecture <xref target="RFC9256"/> apply in full to this document.</t>

      <t><strong>Unauthorized policy injection.</strong> As with all SR Policy BGP updates, unauthorized injection of Composite CP advertisements could redirect traffic across unintended paths. Mitigations: (a) BGP session integrity via TCP-AO <xref target="RFC5925"/>; (b) Route Target communities to restrict SR Policy SAFI propagation to intended headends; (c) operational policies restricting SR Policy SAFI peering to trusted controllers. Note that BGPsec <xref target="RFC8205"/> protects AS_PATH integrity and does not protect the Tunnel Encapsulation Attribute carrying SR Policy contents; RPKI/ROV <xref target="RFC6811"/> validates origin AS, not policy contents. These tools are useful complements but not direct mitigations for attribute-level injection.</t>

      <t><strong>FC value manipulation.</strong> An adversary able to inject or modify SR Policy SAFI BGP updates could alter FC-to-color mappings, steering specific traffic classes onto unintended paths. BGP session integrity per TCP-AO <xref target="RFC5925"/> is the primary mitigation.</t>

      <t><strong>Constituent reference amplification.</strong> A malicious or misconfigured controller can advertise large numbers of Composite CPs referencing nonexistent constituents, causing SRPM state consumption and IGP-fallback installation for each invalid constituent entry. Operators <bcp14>MUST</bcp14> apply per-peer SR Policy SAFI session limits and per-peer CP count limits as discussed in <xref target="per-peer-limits"/>.</t>

      <t><strong>Privacy.</strong> SR Policy content reveals traffic engineering intent and topology preferences. Composite CP advertisements expose QoS class mappings (FC-to-color) and the SRv6 SID structure of constituent paths. This content <bcp14>MUST NOT</bcp14> be distributed via untrusted BGP peers. Route Target communities and peer access policies <bcp14>SHOULD</bcp14> be configured to prevent leakage beyond intended headend sets.</t>

      <t>TCP-AO <xref target="RFC5925"/> provides integrity and authentication for the BGP session but does not provide confidentiality; an on-path observer can still read SR Policy contents in transit. Where confidentiality of TE intent is required, operators <bcp14>SHOULD</bcp14> additionally rely on physical/link-layer protection of BGP-carrying links, or carry BGP over an authenticated and encrypted transport (e.g., IPsec) between trusted peers.</t>

      <t><strong>No data-plane security changes.</strong> This document does not alter SRv6 data-plane forwarding or SID processing. Data-plane security is governed by <xref target="RFC8754"/> and <xref target="RFC8986"/>.</t>
    </section>

    <section numbered="true" toc="default" anchor="iana-considerations">
      <name>IANA Considerations</name>

      <section numbered="true" toc="default" anchor="iana-top-registry">
        <name>BGP Tunnel Encapsulation Attribute Sub-TLVs Registry</name>
        <t>IANA is requested to allocate one value from the "BGP Tunnel Encapsulation Attribute Sub-TLVs" registry for the Constituent SR Policy Sub-TLV defined in this document:</t>

        <table align="center">
          <thead>
            <tr><th>Value</th><th>Description</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>TBA1</td><td>Constituent SR Policy Sub-TLV</td><td>This document</td></tr>
          </tbody>
        </table>

        <t>Per the registration procedures of that registry (RFC 9012, Section 13.1; Length-field width per RFC 9012, Section 2), the registry is partitioned by Type value range, with each range carrying both a Length-field width and a registration policy:</t>

        <table align="center">
          <thead>
            <tr><th>Range</th><th>Length field</th><th>Registration policy</th></tr>
          </thead>
          <tbody>
            <tr><td>1-63</td><td>1 octet</td><td>Standards Action</td></tr>
            <tr><td>64-125</td><td>1 octet</td><td>First Come First Served</td></tr>
            <tr><td>126-127</td><td>1 octet</td><td>Experimental Use</td></tr>
            <tr><td>128-191</td><td>2 octets</td><td>Standards Action</td></tr>
            <tr><td>192-252</td><td>2 octets</td><td>First Come First Served</td></tr>
            <tr><td>253-254</td><td>2 octets</td><td>Experimental Use</td></tr>
            <tr><td>0, 255</td><td>--</td><td>Reserved</td></tr>
          </tbody>
        </table>

        <t>The Constituent SR Policy sub-TLV uses a 1-octet Length field (<xref target="constituent-sub-tlv"/>). TBA1 <bcp14>MUST</bcp14> therefore be assigned from the range <strong>1-63</strong> (Standards Action, 1-octet Length). The draft does not prescribe a specific numeric value within that range.</t>
      </section>

      <section numbered="true" toc="default" anchor="iana-nested-registry">
        <name>Constituent SR Policy Sub-TLV Types Registry</name>
        <t>IANA is requested to create a new sub-registry titled <strong>"Constituent SR Policy Sub-TLV Types"</strong> under the "Border Gateway Protocol (BGP) Tunnel Encapsulation" registry group. Registration policies:</t>

        <table align="center">
          <thead>
            <tr><th>Range</th><th>Policy</th></tr>
          </thead>
          <tbody>
            <tr><td>0</td><td>Reserved</td></tr>
            <tr><td>1-127</td><td>Standards Action</td></tr>
            <tr><td>128-254</td><td>Expert Review</td></tr>
            <tr><td>255</td><td>Reserved</td></tr>
          </tbody>
        </table>

        <t>Initial assignments:</t>

        <table align="center">
          <thead>
            <tr><th>Value</th><th>Description</th><th>Reference</th></tr>
          </thead>
          <tbody>
            <tr><td>0</td><td>Reserved</td><td>This document</td></tr>
            <tr><td>TBA2</td><td>Per-Flow FC Sub-TLV</td><td>This document</td></tr>
            <tr><td>Remaining values in 1-127</td><td>Unassigned (Standards Action)</td><td></td></tr>
            <tr><td>128-254</td><td>Unassigned (Expert Review)</td><td></td></tr>
            <tr><td>255</td><td>Reserved</td><td>This document</td></tr>
          </tbody>
        </table>

        <t>TBA2 is to be assigned by IANA from the range 1-127 (Standards Action) of this new sub-registry. All values in 1-127 other than TBA2 remain unassigned and subject to Standards Action. The Expert Review range (128-254) allows vendors to register experimental or vendor-specific nested sub-TLVs without requiring a Standards Track document, mirroring RFC 9012 practice.</t>
      </section>
    </section>

  </middle>

  <back>

    <references>
      <name>Normative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4271.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5925.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7606.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8402.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9012.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9256.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9830.xml"/>
    </references>

    <references>
      <name>Informative References</name>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2474.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4456.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4724.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5880.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6811.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7432.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8205.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8754.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8986.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9494.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9857.xml"/>
      <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9862.xml"/>

      <reference anchor="I-D.ietf-pce-multipath">
        <front>
          <title>PCEP Extensions for Signaling Multipath Information</title>
          <author initials="M." surname="Koldychev" fullname="Mike Koldychev">
            <organization>Ciena Corporation</organization>
          </author>
          <date/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-pce-multipath"/>
      </reference>

      <reference anchor="I-D.ietf-spring-sr-policy-yang">
        <front>
          <title>YANG Data Model for Segment Routing Policy</title>
          <author>
            <organization>SPRING Working Group</organization>
          </author>
          <date/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-spring-sr-policy-yang"/>
      </reference>

      <reference anchor="I-D.jiang-idr-sr-policy-composite-path">
        <front>
          <title>BGP Extensions of SR Policy for Composite Candidate Path</title>
          <author initials="W." surname="Jiang" fullname="Wenying Jiang">
            <organization>China Mobile</organization>
          </author>
          <author initials="C." surname="Lin" fullname="Changwang Lin">
            <organization>New H3C Technologies</organization>
          </author>
          <author initials="R." surname="Chen" fullname="Ran Chen">
            <organization>ZTE Corporation</organization>
          </author>
          <date/>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-jiang-idr-sr-policy-composite-path"/>
      </reference>
    </references>

  </back>
</rfc>
