<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-model href="rfc7991bis.rnc"?>
<?rfc toc="yes"?>
<?rfc tocompact="yes"?>
<?rfc tocdepth="3"?>
<?rfc tocindent="yes"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
     category="std"
     consensus="true"
     docName="draft-tantsura-idr-unreachability-safi-01"
     ipr="trust200902"
     obsoletes=""
     updates=""
     submissionType="IETF"
     xml:lang="en"
     tocInclude="true"
     tocDepth="3"
     symRefs="true"
     sortRefs="true"
     version="3">

  <front>
    <title abbrev="BGP Unreachability SAFI">BGP Unreachability Information SAFI</title>
    <seriesInfo name="Internet-Draft" value="draft-tantsura-idr-unreachability-safi-01"/>
    
    <author fullname="Jeff Tantsura" initials="J." surname="Tantsura">
      <organization>Nvidia</organization>
      <address>
        <email>jefftant.ietf@gmail.com</email>
      </address>
    </author>

    <author fullname="Donald Sharp" initials="D." surname="Sharp">
      <organization>Nvidia</organization>
      <address>
        <email>sharpd@nvidia.com</email>
      </address>
    </author>

    <author fullname="Vivek Venkatraman" initials="V." surname="Venkatraman">
      <organization>Nvidia</organization>
      <address>
        <email>vivek@nvidia.com</email>
      </address>
    </author>

    <author fullname="Karthikeya Venkat Muppalla" initials="K." surname="Muppalla">
      <organization>Nvidia</organization>
      <address>
        <email>kmuppalla@nvidia.com</email>
      </address>
    </author>

    <author fullname="Maciej Rzehak" initials="M." surname="Rzehak">
      <organization>CoreWeave</organization>
      <address>
        <email>mrzehak@coreweave.com</email>
      </address>
    </author>

    <author fullname="Abderrahman Jouhari" initials="A." surname="Jouhari">
      <organization>Oracle</organization>
      <address>
        <email>jouharii@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="January" day="19"/>
    
    <area>Routing</area>
    <workgroup>IDR Working Group</workgroup>
    
    <keyword>BGP</keyword>
    <keyword>SAFI</keyword>
    <keyword>Unreachability</keyword>
    <keyword>Monitoring</keyword>
    <keyword>Telemetry</keyword>
    <keyword>Aggregation</keyword>
    
    <abstract>
      <t>
        This document defines a new BGP Subsequent Address Family
        Identifier (SAFI) called "Unreachability Information" that allows
        the propagation of prefix unreachability information through BGP
        without affecting the installation or removal of routes in the
        Routing Information Base (RIB) or Forwarding Information Base
        (FIB). This mechanism enables network operators to share
        information about unreachable prefixes for monitoring, debugging,
        and coordination purposes while maintaining complete separation
        from the active routing plane.
      </t>
    </abstract>
  </front>

  <middle>
    <section numbered="true" toc="default">
      <name>Introduction</name>
      <t>
        BGP-4 <xref target="RFC4271" format="default"/> withdrawals are only propagated for prefixes that
        have been previously announced. This behavior, while preventing
        certain attack vectors, limits the ability of operators to share
        information about prefix unreachability for prefixes that were
        never announced in the first place.
      </t>
      <t>
        There are several use cases where propagating unreachability
        information without affecting routing decisions would be valuable:
      </t>
      <ul spacing="normal">
        <li>Debugging and troubleshooting routing issues across
            administrative domains</li>
        <li>Sharing information about DDoS targets without null-routing
            traffic</li>
        <li>Coordinating information about potentially hijacked prefixes</li>
        <li>Monitoring and anomaly detection systems that need visibility
            into negative routing events</li>
        <li>Providing telemetry about routing system health without
            affecting production traffic</li>
        <li>Correlating unreachability reports from multiple network
            vantage points</li>
      </ul>
      <t>
        This document defines a new SAFI that creates a parallel
        information plane for unreachability data, allowing BGP speakers
        to share this information while maintaining complete separation
        from the routing plane.
      </t>
      
      <section numbered="true" toc="default">
        <name>Requirements Language</name>
        <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 numbered="true" toc="default">
        <name>Terminology</name>
        <dl newline="false" spacing="normal" indent="10">
          <dt>UI-RIB:</dt>
          <dd>Unreachability Information RIB</dd>
          <dt>NLRI:</dt>
          <dd>Network Layer Reachability Information</dd>
          <dt>AFI:</dt>
          <dd>Address Family Identifier</dd>
          <dt>SAFI:</dt>
          <dd>Subsequent Address Family Identifier</dd>
          <dt>TLV:</dt>
          <dd>Type-Length-Value</dd>
          <dt>Reporter TLV:</dt>
          <dd>A nested TLV structure containing information about one 
              reporting BGP speaker and its associated unreachability 
              details</dd>
          <dt>Aggregation:</dt>
          <dd>The process of combining multiple Reporter TLVs from 
              different paths into a single NLRI</dd>
          <dt>Advertising Speaker:</dt>
          <dd>The BGP speaker that sends the UPDATE message containing
              the unreachability information</dd>
          <dt>Reporting Speaker:</dt>
          <dd>The BGP speaker that originally generated the unreachability
              information (identified within a Reporter TLV)</dd>
        </dl>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Protocol Extensions</name>
      
      <section numbered="true" toc="default">
        <name>Unreachability Information SAFI</name>
        <t>This document defines a new SAFI:</t>
        <ul spacing="normal">
          <li>Value: TBD1 (to be assigned by IANA)</li>
          <li>Name: Unreachability Information (UNREACH)</li>
          <li>Applicable to AFI: 1 (IPv4) and 2 (IPv6)</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>Capability Advertisement</name>
        <t>
          A BGP speaker that wishes to exchange Unreachability Information
          MUST advertise the corresponding AFI/SAFI capability as defined
          in <xref target="RFC5492" format="default"/>.
        </t>
        <t>
          The Capability Code for Multiprotocol Extensions is 1. The
          Capability Value field contains:
        </t>
        <artwork name="" type="" align="left" alt=""><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          AFI                  |   Reserved    |    SAFI       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>AFI = 1 (IPv4) or 2 (IPv6)</li>
          <li>Reserved = 0 (MUST be set to 0 on transmit, ignored on receive)</li>
          <li>SAFI = TBD1 (Unreachability Information)</li>
        </ul>
        <t>Additionally, this document defines a new capability:</t>
        <ul spacing="normal">
          <li>Capability Code: TBD2 (to be assigned by IANA)</li>
          <li>Capability Name: Enhanced Unreachability Information</li>
          <li>Capability Value: 1 octet flags field</li>
        </ul>
        <artwork name="" type="" align="left" alt=""><![CDATA[
 0 1 2 3 4 5 6 7
+-+-+-+-+-+-+-+-+
|A|   Reserved  |
+-+-+-+-+-+-+-+-+]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>A bit: If set, speaker supports Aggregation of multiple 
              Reporter TLVs</li>
          <li>Reserved: MUST be zero on transmit, ignored on receive</li>
        </ul>
        <t>
          The A bit indicates support for the aggregation procedures in
          <xref target="aggregation-procedures"/>. A speaker that advertises
          A=1 SHALL combine Reporter TLVs from multiple paths into a single
          NLRI. A speaker that advertises A=0 MUST NOT perform aggregation
          and therefore only advertises the Reporter TLVs present on its
          best path. A peer receiving A=0 MUST NOT send aggregated NLRIs
          on that session.
        </t>
      </section>
      
      <section numbered="true" toc="default">
        <name>BGP Path Attributes for Carrying Unreachability Information</name>
        <t>
          Unreachability Information NLRI is carried in BGP UPDATE messages
          using the Multiprotocol Extensions for BGP-4 as defined in
          <xref target="RFC4760" format="default"/>. Specifically:
        </t>
        <ul spacing="normal">
          <li>
            <t>MP_REACH_NLRI (Path Attribute Type Code 14): Used to announce
            unreachability information for one or more prefixes. The presence
            of a prefix in MP_REACH_NLRI with AFI/SAFI indicating Unreachability
            Information signifies that the prefix is being reported as unreachable
            by one or more reporting speakers.</t>
          </li>
          <li>
            <t>MP_UNREACH_NLRI (Path Attribute Type Code 15): Used to withdraw
            previously announced unreachability information. The presence of a
            prefix in MP_UNREACH_NLRI with AFI/SAFI indicating Unreachability
            Information signifies that the unreachability condition for that
            prefix has been cleared by all previously reporting speakers.</t>
          </li>
        </ul>
        <t>
          The AFI field in both attributes MUST be set to 1 (IPv4) or 2 (IPv6),
          and the SAFI field MUST be set to TBD1 (Unreachability Information).
        </t>
        <t>
          The NLRI field within MP_REACH_NLRI contains the Unreachability
          Information NLRI as described in <xref target="nlri-format"/>.
          The NLRI field within MP_UNREACH_NLRI contains only the prefix
          (Prefix Length and Prefix) without TLVs.
        </t>
        <t>
          Standard BGP path attributes (AS_PATH, ORIGIN, NEXT_HOP via
          MP_REACH_NLRI, etc.) apply as defined in <xref target="RFC4760"/>
          and <xref target="RFC4271"/>. These attributes represent the
          path taken by the UPDATE message itself, not the paths of
          individual reporters (which are preserved in Reporter TLVs).
        </t>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="nlri-format">
      <name>NLRI Format</name>
      <t>
        The NLRI is uniquely identified by the combination of Prefix Length
        and Prefix. Reporter TLVs are NOT part of the NLRI key but provide
        information about each reporting speaker. The presence of an
        Unreachability Information NLRI for a prefix signifies that one or
        more speakers report the prefix as unreachable. The withdrawal of
        such an NLRI indicates that all reporters have cleared their
        unreachability reports for that prefix.
      </t>
      
      <section numbered="true" toc="default">
        <name>Approach to deal with multiple Reporters</name>
        <t>
          When multiple BGP speakers report unreachability for the same
          prefix, implementers have several options:
        </t>
        <ol spacing="normal" type="1">
          <li>
            <t>Single Reporter: Do nothing and allow the Reporter
            Identifier of the best path to be used as the only Reporter.
            This is the simplest approach but loses information from other
            reporters.</t>
          </li>
          <li>
            <t>Nested TLV Aggregation (Recommended): Implement the nested
            TLV aggregation approach described in this specification to
            preserve all reporter perspectives in a single NLRI. This
            provides the most comprehensive view while maintaining a single
            BGP path per prefix.</t>
          </li>
          <li>
            <t>BGP ADD-PATH: Use BGP ADD-PATH
            <xref target="RFC7911" format="default"/> to maintain multiple
            paths, each carrying its own Reporter TLV. This preserves full
            BGP path attributes per reporter but requires ADD-PATH support.</t>
          </li>
        </ol>
        <t>
          This specification focuses on the nested TLV aggregation approach
          as the preferred mechanism, providing detailed procedures and
          encodings for this method throughout the remainder of this document.
        </t>
      </section>

      <section numbered="true" toc="default">
        <name>IPv4 Unreachability NLRI (AFI=1, SAFI=TBD1)</name>
        <artwork name="" type="" align="left" alt=""><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix Length |           IPv4 Prefix (variable)              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Reporter TLVs (variable)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        <ul spacing="normal">
          <li>Prefix Length: 1 octet (0-32 bits)</li>
          <li>IPv4 Prefix: Variable, encoded as in <xref target="RFC4271" format="default"/> Section 4.3, and carried in MP_REACH_NLRI per <xref target="RFC4760" format="default"/></li>
          <li>Reporter TLVs: One or more Reporter TLVs (<xref target="reporter-tlv-format"/>)</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>IPv6 Unreachability NLRI (AFI=2, SAFI=TBD1)</name>
        <artwork name="" type="" align="left" alt=""><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Prefix Length |           IPv6 Prefix (variable)              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                  Reporter TLVs (variable)                     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        <ul spacing="normal">
          <li>Prefix Length: 1 octet (0-128 bits)</li>
          <li>IPv6 Prefix: Variable, encoded in MP_REACH_NLRI as defined in <xref target="RFC4760" format="default"/></li>
          <li>Reporter TLVs: One or more Reporter TLVs (<xref target="reporter-tlv-format"/>)</li>
        </ul>
        <t>Example IPv6 prefix: 2001:db8::/32.</t>
      </section>
      
      <section numbered="true" toc="default" anchor="reporter-tlv-format">
        <name>Reporter TLV Format</name>
        <t>
          The Reporter TLV is a container that encapsulates information about
          a single reporting BGP speaker and its associated unreachability
          details. Multiple Reporter TLVs MAY appear in a single NLRI to
          represent reports from different speakers.
        </t>
        <artwork name="" type="" align="left" alt=""><![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             |               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
|                   Reporter Identifier (4 octets)              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Reporter AS Number (4 octets)                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|               Sub-TLVs (variable)                             |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        
        <t>Reporter TLV Fields:</t>
        <dl newline="false" spacing="normal">
          <dt>Type:</dt>
          <dd>1 octet. Value: 1 (Reporter)</dd>
          
          <dt>Length:</dt>
          <dd>2 octets. Total length of the Reporter Identifier, Reporter
              AS Number, and Sub-TLVs fields (minimum 8 octets)</dd>
          
          <dt>Reporter Identifier:</dt>
          <dd>4 octets. BGP Identifier (Router ID) of the reporting speaker
              in network byte order</dd>
          
          <dt>Reporter AS Number:</dt>
          <dd>4 octets. 4-octet AS number of the reporting speaker in 
              network byte order. If the AS number is less than 65536, 
              the upper 2 octets are set to 0</dd>
          
          <dt>Sub-TLVs:</dt>
          <dd>Variable length. Contains one or more Sub-TLVs providing 
              details about this reporter's unreachability observation</dd>
        </dl>
        
        <t>
          The combination of Reporter Identifier and Reporter AS Number
          uniquely identifies the reporting speaker. Multiple Reporter TLVs
          with the same Reporter Identifier and AS Number MUST NOT appear
          in the same NLRI. If such duplication occurs, only the first
          occurrence SHOULD be processed.
        </t>
      </section>
      
      <section numbered="true" toc="default" anchor="sub-tlv-format">
        <name>Sub-TLV Format</name>
        <t>
          Sub-TLVs appear within Reporter TLVs and provide specific details
          about the unreachability observation by that reporter.
        </t>
        <artwork name="" type="" align="left" alt=""><![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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|   Sub-Type    |         Sub-Length            |               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+               |
|                   Sub-Value (variable)                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+]]></artwork>
        
        <t>Defined Sub-TLV Types:</t>
        
        <t>
          Implementations MUST ignore unknown Sub-TLV types to allow for
          future extensibility. Multiple Sub-TLVs of the same type SHOULD
          NOT appear within a single Reporter TLV; if present, only the
          first occurrence SHOULD be processed.
        </t>
        
        <section numbered="true" toc="default">
          <name>Sub-TLV Type 1: Unreachability Reason Code</name>
          <ul spacing="normal">
            <li>Sub-Type: 1</li>
            <li>Sub-Length: 2 octets</li>
            <li>Sub-Value: 2-octet reason code in network byte order</li>
          </ul>
          <t>Defined Reason Codes:</t>
          <ul spacing="normal">
            <li>0: Unspecified</li>
            <li>1: Policy Blocked</li>
            <li>2: Security Filtered</li>
            <li>3: RPKI Invalid</li>
            <li>4: No Export Policy</li>
            <li>5: Martian Address</li>
            <li>6: Bogon Prefix</li>
            <li>7: Route Dampening</li>
            <li>8: Local Administrative Action</li>
            <li>9: Local Link Down</li>
            <li>10-64535: Reserved</li>
            <li>64536-65535: Reserved for Private Use</li>
          </ul>
        </section>
        
        <section numbered="true" toc="default">
          <name>Sub-TLV Type 2: Timestamp</name>
          <ul spacing="normal">
            <li>Sub-Type: 2</li>
            <li>Sub-Length: 8 octets</li>
            <li>Sub-Value: Unix timestamp (seconds since epoch) in network
                byte order, indicates when the unreachability event occurred
                or was detected by this reporter</li>
          </ul>
        </section>
      </section>
      
      <section numbered="true" toc="default" anchor="encoding-examples">
        <name>Encoding Examples</name>
        
        <section numbered="true" toc="default">
          <name>Single Reporter</name>
          <t>Example: 192.0.2.0/24 unreachable, reported by AS 65001,
             Router ID 198.51.100.1, Reason: RPKI Invalid</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Prefix Length: 24 (0x18)
Prefix: 192.0.2.0 (0xC0000200)

Reporter TLV:
  Type: 1
  Length: 24 (0x0018)
  Reporter Identifier: 198.51.100.1 (0xC6336401)
  Reporter AS: 65001 (0x0000FDE9)
  
  Sub-TLV (Reason):
    Sub-Type: 1
    Sub-Length: 2 (0x0002)
    Sub-Value: 3 (0x0003) [RPKI Invalid]
  
  Sub-TLV (Timestamp):
    Sub-Type: 2
    Sub-Length: 8 (0x0008)
    Sub-Value: 1733789400 (0x0000000067596958)

Hexdecimal encoding:
18 C0 00 02 01 00 18 C6 33 64 01 00 00 FD E9 01 
00 02 00 03 02 00 08 00 00 00 00 67 59 69 58]]></artwork>
        </section>
        
        <section numbered="true" toc="default">
          <name>Multiple Reporters</name>
          <t>Example: 192.0.2.0/24 unreachable, reported by two speakers</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
Prefix Length: 24
Prefix: 192.0.2.0

Reporter TLV #1:
  Type: 1
  Length: 24
  Reporter Identifier: 198.51.100.1
  Reporter AS: 65001
  Sub-TLV (Reason): 3 (RPKI Invalid)
  Sub-TLV (Timestamp): 1733789400

Reporter TLV #2:
  Type: 1
  Length: 24
  Reporter Identifier: 198.51.100.2
  Reporter AS: 65002
  Sub-TLV (Reason): 1 (Policy Blocked)
  Sub-TLV (Timestamp): 1733789410

Total NLRI length: 4 + 27 + 27 = 58 octets]]></artwork>
        </section>
      </section>
    </section>

    <section numbered="true" toc="default" anchor="operation">
      <name>Operation</name>
      
      <section numbered="true" toc="default" anchor="nlri-processing">
        <name>NLRI Processing and Aggregation</name>
        <t>
          When a BGP speaker receives an UPDATE message with Unreachability
          Information SAFI:
        </t>
        <ol spacing="normal" type="1">
          <li>It MUST NOT install or remove any routes in the Loc-RIB based
              on this information</li>
          <li>It MUST maintain a separate Unreachability Information RIB
              (UI-RIB) for this SAFI</li>
          <li>It SHOULD apply standard BGP path selection to UI-RIB entries for consistency</li>
          <li>It MAY propagate the information according to standard BGP
              rules, local policy, and aggregation procedures defined in
              <xref target="aggregation-procedures"/></li>
          <li>It MUST NOT mix Unreachability Information NLRI with other
              SAFIs in the same UPDATE message</li>
        </ol>
        
        
        <section numbered="true" toc="default" anchor="aggregation-procedures">
          <name>Aggregation Procedures</name>
          <t>
            When multiple UPDATE messages arrive advertising unreachability
            for the same prefix from different neighbors, a BGP speaker
            supporting aggregation (A bit set in capability) SHOULD combine
            the Reporter TLVs according to the following procedure:
          </t>
          <ol spacing="normal" type="1">
            <li>
              <t>Perform standard BGP path selection on the received updates.
              The "best path" is determined based on standard BGP decision
              process, considering only standard BGP attributes (AS_PATH length,
              LOCAL_PREF, etc.), NOT the content of Reporter TLVs.</t>
            </li>
            <li>
              <t>Extract all Reporter TLVs from the best path.</t>
            </li>
            <li>
              <t>For each non-selected path that would be feasible (not
              filtered by policy):</t>
              <ul spacing="normal">
                <li>Extract all Reporter TLVs from that path</li>
                <li>For each Reporter TLV, check if a Reporter with the
                    same Reporter Identifier and Reporter AS already exists
                    in the aggregated set</li>
                <li>If not present, add the Reporter TLV to the aggregated set</li>
                <li>If already present, compare timestamps (if present) and
                    keep the more recent report, or keep the existing entry
                    if timestamps are equal or absent</li>
              </ul>
            </li>
            <li>
              <t>Create a new NLRI containing all unique Reporter TLVs</t>
            </li>
            <li>
              <t>Advertise this aggregated NLRI to appropriate neighbors,
              with BGP path attributes taken from the best path</t>
            </li>
          </ol>
          
          <t>
            The maximum number of Reporter TLVs that can be aggregated in
            a single NLRI is limited by the maximum BGP UPDATE message size
            (4096 octets). Implementations SHOULD limit the number of
            Reporter TLVs to prevent NLRI size from becoming unwieldy. A
            RECOMMENDED maximum is 50 Reporter TLVs per prefix, which allows
            for comprehensive multi-vantage-point monitoring while maintaining
            reasonable message sizes.
          </t>
          
          <t>
            If the maximum is reached and a new reporter must be added,
            implementations SHOULD remove the oldest Reporter TLV (based on
            Timestamp Sub-TLV if present), unless this is the reporter of
            the best path. In that case the second oldest reporter should
            be removed.
          </t>
        </section>
      </section>
      
      <section numbered="true" toc="default" anchor="withdrawal-procedures">
        <name>Withdrawal Procedures</name>
        <t>
          Withdrawal of unreachability information operates at two levels:
        </t>
        
        <section numbered="true" toc="default">
          <name>Individual Reporter Withdrawal</name>
          <t>
            When a BGP speaker determines that a specific reporter no longer
            considers a prefix unreachable (e.g., receives an UPDATE from
            that reporter's AS that doesn't include the unreachability NLRI,
            or local policy determines the report is stale), it SHOULD:
          </t>
          <ol spacing="normal" type="1">
            <li>Remove the corresponding Reporter TLV from the NLRI</li>
            <li>If other Reporter TLVs remain, re-advertise the NLRI with
                the remaining Reporter TLVs</li>
            <li>If no Reporter TLVs remain, withdraw the entire NLRI as
                described in <xref target="complete-withdrawal"/></li>
          </ol>
          
          <t>
            To facilitate individual reporter withdrawal, implementations
            MUST track the source of each Reporter TLV (which BGP neighbor
            or local process it came from).
          </t>
        </section>
        
        <section numbered="true" toc="default" anchor="complete-withdrawal">
          <name>Complete NLRI Withdrawal</name>
          <t>
            A BGP speaker MUST withdraw an Unreachability Information NLRI
            (send the prefix in MP_UNREACH_NLRI) when:
          </t>
          <ul spacing="normal">
            <li>All Reporter TLVs have been removed</li>
            <li>The prefix is explicitly withdrawn by all upstream sources</li>
            <li>Local policy dictates the information should no longer be
                propagated</li>
          </ul>
          
          <t>
            The MP_UNREACH_NLRI contains only the prefix (Prefix Length and
            Prefix) without any TLVs.
          </t>
        </section>
        
        <section numbered="true" toc="default">
          <name>Stale Reporter Detection</name>
          <t>
            Implementations SHOULD implement aging mechanisms to remove
            stale Reporter TLVs:
          </t>
          <ul spacing="normal">
            <li>If a Timestamp Sub-TLV is present and indicates the report
                is older than a configurable threshold (RECOMMENDED default:
                24 hours), the Reporter TLV MAY be removed</li>
            <li>If the BGP session to the neighbor that provided a Reporter
                TLV goes down, implementations SHOULD mark associated Reporter
                TLVs as potentially stale and MAY remove them after a
                grace period</li>
          </ul>
        </section>
      </section>
      
      <section numbered="true" toc="default" anchor="path-selection">
        <name>Path Selection for Aggregation</name>
        <t>
          The path selection for Unreachability Information SAFI follows
          standard BGP best path selection (RFC 4271 Section 9.1) with the
          following clarifications:
        </t>
        <ul spacing="normal">
          <li>
            <t>Weight/Local Preference: Apply normally based on local policy.</t>
          </li>
          <li>
            <t>AS_PATH Length: Shorter AS_PATH is preferred. This represents
            the path the UPDATE message took.</t>
          </li>
          <li>
            <t>ORIGIN: IGP preferred over EGP over INCOMPLETE.</t>
          </li>
          <li>
            <t>MED: Apply if comparing paths from the same neighboring AS.</t>
          </li>
          <li>
            <t>BGP Identifier: Use for tie-breaking.</t>
          </li>
        </ul>
        <t>
          The content of Reporter TLVs (number of reporters, reason codes,
          etc.) MUST NOT influence path selection. Path selection determines
          which UPDATE's BGP attributes are used for propagation, while
          aggregation combines Reporter TLVs from multiple paths.
        </t>
      </section>
      
      <section numbered="true" toc="default">
        <name>Interaction with Route Reflection</name>
        <t>
          Route Reflectors process Unreachability Information SAFI like any
          other AFI/SAFI combination:
        </t>
        <ul spacing="normal">
          <li>Apply standard route reflection rules</li>
          <li>ORIGINATOR_ID and CLUSTER_LIST attributes apply normally to
              the UPDATE message, not to individual reporters</li>
          <li>Route Reflectors SHOULD support aggregation to combine reports
              from multiple clients</li>
          <li>When reflecting to clients, include all aggregated Reporter TLVs</li>
        </ul>
        <t>
          The distinction between the ORIGINATOR_ID BGP attribute and the
          Reporter Identifier field in Reporter TLVs is important:
        </t>
        <ul spacing="normal">
          <li>ORIGINATOR_ID identifies the originator of the BGP UPDATE message
              for loop prevention</li>
          <li>Reporter Identifier identifies the speaker that observed and
              reported the unreachability condition</li>
          <li>These MAY be different in aggregated scenarios</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>Communities and Attributes</name>
        <t>
          Standard BGP communities and attributes apply to the UPDATE message:
        </t>
        <ul spacing="normal">
          <li>NO_EXPORT, NO_ADVERTISE, and NO_EXPORT_SUBCONFED work as defined</li>
          <li>Large Communities <xref target="RFC8092"/> MAY be used for policy
              control of aggregation behavior</li>
          <li>AS_PATH is constructed normally for the UPDATE message path</li>
          <li>ORIGIN SHOULD be set to IGP for locally generated information</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default" anchor="graceful-restart">
        <name>Interaction with Graceful Restart</name>
        <t>
          BGP Graceful Restart (GR) as defined in <xref target="RFC4724"/>
          applies to the Unreachability Information SAFI. This section
          describes how UI-RIB is handled during restart scenarios.
        </t>
        
        <section numbered="true" toc="default">
          <name>Graceful Restart Capability</name>
          <t>
            A BGP speaker that supports Graceful Restart for Unreachability
            Information SAFI MUST include the AFI/SAFI pair (AFI=1 or 2,
            SAFI=TBD1) in the Graceful Restart Capability advertisement as
            defined in RFC 4724.
          </t>
          <t>
            The "Forwarding State" (F) bit for this SAFI:
          </t>
          <ul spacing="normal">
            <li>
              <t>Since Unreachability Information does not affect the
              forwarding plane (Loc-RIB or FIB), there is no forwarding
              state to preserve.</t>
            </li>
            <li>
              <t>The F bit SHOULD be set to 0 in the Graceful Restart Capability
              for this AFI/SAFI combination.</t>
            </li>
            <li>
              <t>Receiving speakers MUST NOT interpret the F bit for this SAFI
              as indicating preservation of forwarding state. The F bit, if set,
              has no defined meaning for this SAFI and MUST be ignored.</t>
            </li>
            <li>
              <t>Implementations MAY use the F bit in future extensions to signal
              UI-RIB preservation capabilities, but such usage is outside the
              scope of this document.</t>
            </li>
          </ul>
        </section>
        
        <section numbered="true" toc="default">
          <name>Restarting Speaker Behavior</name>
          <t>
            When a BGP speaker restarts and has negotiated GR for the
            Unreachability Information SAFI:
          </t>
          <ol spacing="normal" type="1">
            <li>
              <t>The speaker SHOULD set the F bit to 0 in the Graceful Restart
              Capability for this AFI/SAFI pair, as there is no forwarding
              state associated with this SAFI.</t>
            </li>
            <li>
              <t>If the speaker preserved its UI-RIB across the restart, it
              SHOULD re-advertise all retained UI-RIB entries to its peers
              as soon as possible after restart, but MAY do so gradually to
              avoid overwhelming the network.</t>
            </li>
            <li>
              <t>If the speaker did NOT preserve its UI-RIB across the restart,
              it SHOULD rebuild the UI-RIB from local information sources
              before re-advertising entries.</t>
            </li>
            <li>
              <t>The speaker MUST send an End-of-RIB (EoR) marker for this SAFI
              after completing the re-advertisement of UI-RIB entries. The EoR
              marker is an UPDATE message with no NLRI and the MP_UNREACH_NLRI
              attribute containing the AFI/SAFI pair but no withdrawn routes.</t>
            </li>
          </ol>
        </section>
        
        <section numbered="true" toc="default">
          <name>Receiving Speaker Behavior</name>
          <t>
            When a BGP speaker detects that a peer has restarted with GR
            capability for Unreachability Information SAFI:
          </t>
          <ol spacing="normal" type="1">
            <li>
              <t>The speaker MUST mark all UI-RIB entries learned from the
              restarting peer as stale. Stale marking occurs regardless of
              the F bit value, since the F bit has no defined semantics for
              this SAFI.</t>
            </li>
            <li>
              <t>Stale entries MUST NOT be immediately withdrawn. They MUST
              be retained for the duration of the Restart Time advertised in
              the peer's GR Capability, or until the End-of-RIB marker is
              received, whichever comes first.</t>
            </li>
            <li>
              <t>During the Restart Time period:</t>
              <ul spacing="normal">
                <li>Stale entries MAY be used for monitoring and correlation
                    purposes</li>
                <li>Implementations MAY mark stale entries distinctly in
                    display and APIs</li>
                <li>Stale entries SHOULD NOT be propagated to other peers
                    unless explicitly configured to do so</li>
              </ul>
            </li>
            <li>
              <t>Upon receiving the End-of-RIB marker from the restarting peer:</t>
              <ul spacing="normal">
                <li>All stale entries that were not refreshed MUST be removed
                    from the UI-RIB</li>
                <li>Reporter TLVs from the restarted peer that were part of
                    aggregated NLRIs MUST be removed if not refreshed</li>
                <li>If removal of Reporter TLVs leaves other Reporter TLVs for
                    the same prefix, the NLRI SHOULD be re-advertised with the
                    remaining Reporter TLVs</li>
              </ul>
            </li>
            <li>
              <t>If the Restart Time expires before receiving the End-of-RIB
              marker, all stale entries MUST be removed immediately.</t>
            </li>
          </ol>
        </section>
        
        <section numbered="true" toc="default">
          <name>Route Reflector Considerations</name>
          <t>
            Route Reflectors implementing Graceful Restart for this SAFI:
          </t>
          <ul spacing="normal">
            <li>MUST properly handle stale marking of UI-RIB entries from
                restarting clients</li>
            <li>SHOULD NOT reflect stale entries to other clients unless
                configured with a specific policy to do so</li>
            <li>MUST correctly manage ORIGINATOR_ID and CLUSTER_LIST for
                entries that transition through stale and refresh phases</li>
            <li>SHOULD send End-of-RIB markers to clients after the RR itself
                completes restart processing</li>
          </ul>
        </section>
        
        <section numbered="true" toc="default">
          <name>Implementation Recommendations</name>
          <ul spacing="normal">
            <li>
              <t>Restart Time for this SAFI SHOULD be configurable independently
              from other AFI/SAFI combinations, with a RECOMMENDED default of
              120 seconds.</t>
            </li>
            <li>
              <t>Implementations SHOULD provide configuration options to:
              </t>
              <ul spacing="normal">
                <li>Enable/disable preservation of UI-RIB across restarts</li>
                <li>Control whether stale entries are propagated during GR</li>
                <li>Set the Restart Time for this SAFI</li>
                <li>Configure actions when End-of-RIB is not received in time</li>
              </ul>
            </li>
            <li>
              <t>Implementations SHOULD log GR events for this SAFI to aid in
              debugging, including:</t>
              <ul spacing="normal">
                <li>Detection of peer restart</li>
                <li>Stale marking of entries</li>
                <li>Receipt of End-of-RIB marker</li>
                <li>Removal of stale entries</li>
              </ul>
            </li>
          </ul>
        </section>
      </section>
      
      <section numbered="true" toc="default" anchor="preventing-state-explosion">
        <name>Preventing State Explosion</name>
        <t>To prevent unbounded growth of the UI-RIB:</t>
        <ol spacing="normal" type="1">
          <li>Implementations SHOULD limit the number of Reporter TLVs per
              prefix (RECOMMENDED maximum: 50)</li>
          <li>Implementations SHOULD implement rate limiting for accepting
              new unreachability information</li>
          <li>Default maximum UI-RIB size SHOULD be configurable with a
              reasonable default (e.g., 100,000 prefixes)</li>
          <li>Implementations SHOULD implement memory limits for total
              Reporter TLV storage</li>
        </ol>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Deployment Considerations</name>
      
      <section numbered="true" toc="default">
        <name>Incremental Deployment</name>
        <t>
          The Unreachability Information SAFI can be deployed incrementally:
        </t>
        <ul spacing="normal">
          <li>Speakers that don't support it simply don't negotiate the
              capability</li>
          <li>Mixed environments work correctly with normal BGP capability
              negotiation</li>
          <li>Can be enabled on specific sessions for testing</li>
          <li>Aggregation support (A bit in capability) is OPTIONAL; speakers
              without it can still propagate single-reporter NLRIs</li>
          <li>Speakers MAY use BGP dynamic capabilities to enable or disable
              this SAFI without resetting the BGP session</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>Use Cases</name>
        <t>Example deployment scenarios:</t>
        <dl newline="false" spacing="normal">
          <dt>Inter-AS Debugging:</dt>
          <dd>Enable between cooperating ASes for troubleshooting. 
              Aggregation provides comprehensive view of why different
              ASes find a prefix unreachable.</dd>
          
          <dt>Route Collectors:</dt>
          <dd>Deploy on route collector sessions for enhanced telemetry.
              Collectors can aggregate reports from multiple feeders to
              provide consolidated unreachability view.</dd>
          
          <dt>DDoS Coordination:</dt>
          <dd>Share attack target information without null-routing.
              Multiple reports from different locations confirm attack
              patterns.</dd>
          
          <dt>Security Monitoring:</dt>
          <dd>Track suspicious unreachability patterns. Correlation of
              reports from multiple vantage points aids in distinguishing
              localized issues from widespread problems.</dd>
          
          <dt>RPKI Validation Monitoring:</dt>
          <dd>Track RPKI validation failures across different ASes.
              Aggregation shows consensus or disagreement on RPKI status.</dd>
        </dl>
      </section>
      
      <section numbered="true" toc="default">
        <name>Operational Recommendations</name>
        <ul spacing="normal">
          <li>Enable aggregation on route collectors and monitoring systems
              to maximize visibility</li>
          <li>Configure reasonable Reporter TLV limits based on expected
              number of reporters</li>
          <li>Use Timestamp Sub-TLVs to facilitate debugging of temporal
              aspects of unreachability</li>
          <li>Monitor UI-RIB size and Reporter TLV counts for capacity planning</li>
        </ul>
      </section>
    </section>

    <section numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>
        The Unreachability Information SAFI introduces new security
        considerations:
      </t>
      <ol spacing="normal" type="1">
        <li>
          <t>Information Leakage: Unreachability information might reveal
          network topology or operational issues. Reporter TLVs explicitly
          identify reporting ASes and routers. Operators SHOULD carefully
          consider peering policies for this SAFI.</t>
        </li>
        <li>
          <t>State Exhaustion: Malicious peers could attempt to exhaust
          memory by advertising large numbers of unreachable prefixes or
          including excessive Reporter TLVs. Implementations SHOULD enforce
          limits as described in <xref target="preventing-state-explosion"/>.</t>
        </li>
        <li>
          <t>False Information: Peers could advertise false unreachability
          information or spoof Reporter TLVs. This SAFI SHOULD only be
          enabled with trusted peers. Consider validating Reporter
          Identifiers and AS Numbers against known valid values.</t>
        </li>
        <li>
          <t>Prefix Hijacking: The SAFI could be used to claim prefixes
          are unreachable when they're not. Since this doesn't affect
          routing, the impact is limited to monitoring systems.</t>
        </li>
        <li>
          <t>Reporter Impersonation: A malicious speaker could include
          Reporter TLVs claiming to represent other ASes. Implementations
          SHOULD validate that Reporter AS Numbers in TLVs are consistent
          with the AS_PATH of UPDATEs that introduced them.</t>
        </li>
        <li>
          <t>Aggregation Amplification: A malicious speaker could send
          many UPDATEs with different Reporter TLVs for the same prefix,
          causing downstream aggregating speakers to accumulate and
          propagate large numbers of Reporter TLVs. Rate limiting and
          Reporter TLV limits mitigate this.</t>
        </li>
      </ol>
      
      <t>Operators SHOULD:</t>
      <ul spacing="normal">
        <li>Use BGP TCP-AO <xref target="RFC5925"/> or MD5 for session
            protection</li>
        <li>Implement prefix filtering for unreachability information</li>
        <li>Monitor UI-RIB size and Reporter TLV counts</li>
        <li>Enable this SAFI only with explicitly trusted peers</li>
        <li>Validate Reporter AS Numbers against expected values</li>
        <li>Configure appropriate Reporter TLV limits per prefix</li>
        <li>Implement rate limiting on incoming unreachability UPDATEs</li>
      </ul>
    </section>

    <section numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>IANA is requested to assign:</t>
      <ol spacing="normal" type="1">
        <li>
          A new SAFI value (TBD1) for "Unreachability Information"
          applicable to AFI 1 and AFI 2 in the "Subsequent Address Family
          Identifiers (SAFI) Parameters" registry.
        </li>
        <li>
          A new BGP Capability Code (TBD2) for "Enhanced
          Unreachability Information" in the "Capability Codes" registry.
        </li>
        <li>
          <t>Create a new registry called "BGP Unreachability Information
          Reporter TLV Types" under the "Border Gateway Protocol (BGP)
          Parameters" registry page. The registration procedure is
          "Standards Action". Initial value:</t>
          <ul spacing="normal">
            <li>Type 1: Reporter TLV (this document)</li>
          </ul>
        </li>
        <li>
          <t>Create a new registry called "BGP Unreachability Information
          Sub-TLV Types" under the "Border Gateway Protocol (BGP) Parameters"
          registry page. The registration procedure is "RFC Required".
          Initial values:</t>
          <ul spacing="normal">
            <li>Sub-Type 1: Unreachability Reason Code (this document)</li>
            <li>Sub-Type 2: Timestamp (this document)</li>
          </ul>
        </li>
        <li>
          Create a new registry called "BGP Unreachability Reason Codes"
          under the "Border Gateway Protocol (BGP) Parameters" registry
          page. The registration procedure is "RFC Required". Initial values
          defined in <xref target="sub-tlv-format"/>.
        </li>
      </ol>
    </section>

    <section numbered="true" toc="default">
      <name>Acknowledgements</name>
      <t>
        The authors would like to thank the IDR working group for their
        valuable feedback and suggestions on this proposal.
      </t>
    </section>
  </middle>

  <back>
    <references>
      <name>References</name>
      
      <references>
        <name>Normative References</name>
        
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner"/>
            <date year="1997" month="March"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        
        <reference anchor="RFC4271" target="https://www.rfc-editor.org/info/rfc4271">
          <front>
            <title>A Border Gateway Protocol 4 (BGP-4)</title>
            <author initials="Y." surname="Rekhter" fullname="Y. Rekhter" role="editor"/>
            <author initials="T." surname="Li" fullname="T. Li" role="editor"/>
            <author initials="S." surname="Hares" fullname="S. Hares" role="editor"/>
            <date year="2006" month="January"/>
          </front>
          <seriesInfo name="RFC" value="4271"/>
          <seriesInfo name="DOI" value="10.17487/RFC4271"/>
        </reference>
        
        <reference anchor="RFC4760" target="https://www.rfc-editor.org/info/rfc4760">
          <front>
            <title>Multiprotocol Extensions for BGP-4</title>
            <author initials="T." surname="Bates" fullname="T. Bates"/>
            <author initials="R." surname="Chandra" fullname="R. Chandra"/>
            <author initials="D." surname="Katz" fullname="D. Katz"/>
            <author initials="Y." surname="Rekhter" fullname="Y. Rekhter"/>
            <date year="2007" month="January"/>
          </front>
          <seriesInfo name="RFC" value="4760"/>
          <seriesInfo name="DOI" value="10.17487/RFC4760"/>
        </reference>
        
        <reference anchor="RFC4724" target="https://www.rfc-editor.org/info/rfc4724">
          <front>
            <title>Graceful Restart Mechanism for BGP</title>
            <author initials="S." surname="Sangli" fullname="S. Sangli"/>
            <author initials="E." surname="Chen" fullname="E. Chen"/>
            <author initials="R." surname="Fernando" fullname="R. Fernando"/>
            <author initials="J." surname="Scudder" fullname="J. Scudder"/>
            <author initials="Y." surname="Rekhter" fullname="Y. Rekhter"/>
            <date year="2007" month="January"/>
          </front>
          <seriesInfo name="RFC" value="4724"/>
          <seriesInfo name="DOI" value="10.17487/RFC4724"/>
        </reference>
        
        <reference anchor="RFC5492" target="https://www.rfc-editor.org/info/rfc5492">
          <front>
            <title>Capabilities Advertisement with BGP-4</title>
            <author initials="J." surname="Scudder" fullname="J. Scudder"/>
            <author initials="R." surname="Chandra" fullname="R. Chandra"/>
            <date year="2009" month="February"/>
          </front>
          <seriesInfo name="RFC" value="5492"/>
          <seriesInfo name="DOI" value="10.17487/RFC5492"/>
        </reference>
        
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author initials="B." surname="Leiba" fullname="B. Leiba"/>
            <date year="2017" month="May"/>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      
      <references>
        <name>Informative References</name>
        
        <reference anchor="RFC5925" target="https://www.rfc-editor.org/info/rfc5925">
          <front>
            <title>The TCP Authentication Option</title>
            <author initials="J." surname="Touch" fullname="J. Touch"/>
            <author initials="A." surname="Mankin" fullname="A. Mankin"/>
            <author initials="R." surname="Bonica" fullname="R. Bonica"/>
            <date year="2010" month="June"/>
          </front>
          <seriesInfo name="RFC" value="5925"/>
          <seriesInfo name="DOI" value="10.17487/RFC5925"/>
        </reference>
        
        <reference anchor="RFC8092" target="https://www.rfc-editor.org/info/rfc8092">
          <front>
            <title>BGP Large Communities Attribute</title>
            <author initials="J." surname="Heitz" fullname="J. Heitz" role="editor"/>
            <author initials="J." surname="Snijders" fullname="J. Snijders" role="editor"/>
            <author initials="K." surname="Patel" fullname="K. Patel"/>
            <author initials="I." surname="Bagdonas" fullname="I. Bagdonas"/>
            <author initials="N." surname="Hilliard" fullname="N. Hilliard"/>
            <date year="2017" month="February"/>
          </front>
          <seriesInfo name="RFC" value="8092"/>
          <seriesInfo name="DOI" value="10.17487/RFC8092"/>
        </reference>
        
        <reference anchor="RFC7854" target="https://www.rfc-editor.org/info/rfc7854">
          <front>
            <title>BGP Monitoring Protocol (BMP)</title>
            <author initials="J." surname="Scudder" fullname="J. Scudder" role="editor"/>
            <author initials="R." surname="Fernando" fullname="R. Fernando"/>
            <author initials="S." surname="Stuart" fullname="S. Stuart"/>
            <date year="2016" month="June"/>
          </front>
          <seriesInfo name="RFC" value="7854"/>
          <seriesInfo name="DOI" value="10.17487/RFC7854"/>
        </reference>
        
        <reference anchor="RFC7911" target="https://www.rfc-editor.org/info/rfc7911">
          <front>
            <title>Advertisement of Multiple Paths in BGP</title>
            <author initials="D." surname="Walton" fullname="D. Walton"/>
            <author initials="A." surname="Retana" fullname="A. Retana"/>
            <author initials="E." surname="Chen" fullname="E. Chen"/>
            <author initials="J." surname="Scudder" fullname="J. Scudder"/>
            <date year="2016" month="July"/>
          </front>
          <seriesInfo name="RFC" value="7911"/>
          <seriesInfo name="DOI" value="10.17487/RFC7911"/>
        </reference>
      </references>
    </references>

    <section numbered="true" toc="default">
      <name>Implementation Considerations</name>
      <t>
        Implementers should consider the following aspects when
        implementing the Unreachability Information SAFI with nested
        Reporter TLVs:
      </t>
      <ol spacing="normal" type="1">
        <li>UI-RIB should store both the NLRI and associated Reporter TLVs
            with tracking of which neighbor provided each Reporter TLV</li>
        <li>Show commands should clearly display all reporters for a given
            prefix, including Reporter ID, AS, Reason, and Timestamp</li>
        <li>MIB/YANG models need structures to represent multiple reporters
            per prefix</li>
        <li>BMP <xref target="RFC7854"/> should be extended to convey Reporter
            TLV information in monitoring messages</li>
        <li>Efficient data structures for Reporter TLV storage and lookup are
            important for performance</li>
        <li>Consider implementing a local database to track reporter history
            for forensic analysis</li>
      </ol>
    </section>

    <section numbered="true" toc="default">
      <name>Detailed Examples</name>
      
      <section numbered="true" toc="default">
        <name>Complete UPDATE Message Example</name>
        <t>
          An UPDATE message advertising that 192.0.2.0/24 is unreachable,
          reported by AS 65001 (Router 198.51.100.1) due to RPKI validation
          failure:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
BGP UPDATE Message:
  Withdrawn Routes Length: 0
  Total Path Attribute Length: (calculated)
  
  Path Attributes:
    MP_REACH_NLRI (Type 14, Flags 0x90):
      AFI: 1 (IPv4)
      SAFI: TBD1 (Unreachability Information)
      Next Hop Length: 0
      Reserved: 0
      NLRI:
        Prefix Length: 24
        Prefix: 192.0.2.0
        Reporter TLV:
          Type: 1
          Length: 24
          Reporter ID: 198.51.100.1
          Reporter AS: 65001
          Sub-TLV (Reason):
            Sub-Type: 1
            Sub-Length: 2
            Reason: 3 (RPKI Invalid)
          Sub-TLV (Timestamp):
            Sub-Type: 2
            Sub-Length: 8
            Value: 1733789400
    
    AS_PATH (Type 2):
      Segment Type: AS_SEQUENCE
      Segment Length: 1
      AS: 65001
    
    ORIGIN (Type 1):
      Value: IGP (0)]]></artwork>
      </section>
      
      <section numbered="true" toc="default">
        <name>Aggregation Example</name>
        <t>
          Router R1 receives two UPDATEs for 192.0.2.0/24:
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
UPDATE 1 (from Neighbor N1, AS 65100):
  AS_PATH: 65100
  Reporter TLV:
    Reporter ID: 198.51.100.1, AS: 65001
    Reason: RPKI Invalid (3)
    Timestamp: 1733789400

UPDATE 2 (from Neighbor N2, AS 65200):
  AS_PATH: 65200
  Reporter TLV:
    Reporter ID: 198.51.100.2, AS: 65002
    Reason: Policy Blocked (1)
    Timestamp: 1733789410

R1 Path Selection:
  - Compare AS_PATH length: both length 1
  - Compare by BGP ID: UPDATE 1 wins
  
R1 Aggregation:
  - Extract Reporter TLV from UPDATE 1 (best path)
  - Extract Reporter TLV from UPDATE 2 (add to aggregated set)
  - Result: NLRI with 2 Reporter TLVs

R1 Advertisement to downstream:
  AS_PATH: 65100 (from best path)
  NLRI for 192.0.2.0/24:
    Reporter TLV #1:
      Reporter ID: 198.51.100.1, AS: 65001
      Reason: 3, Timestamp: 1733789400
    Reporter TLV #2:
      Reporter ID: 198.51.100.2, AS: 65002
      Reason: 1, Timestamp: 1733789410]]></artwork>
      </section>
      
      <section numbered="true" toc="default">
        <name>Withdrawal Example</name>
        <t>
          Scenario: Reporter 198.51.100.1 (AS 65001) clears its unreachability
          report, but Reporter 198.51.100.2 (AS 65002) maintains its report.
        </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
Initial State on Router R1:
  UI-RIB Entry for 192.0.2.0/24:
    Reporter TLV #1: 198.51.100.1/AS65001 (from Neighbor N1)
    Reporter TLV #2: 198.51.100.2/AS65002 (from Neighbor N2)

Event: N1 sends MP_UNREACH_NLRI for 192.0.2.0/24

R1 Processing:
  1. Identify that withdrawal came from N1
  2. Find Reporter TLVs associated with N1
  3. Remove Reporter TLV for 198.51.100.1/AS65001
  4. Check remaining Reporter TLVs
  5. Reporter TLV #2 still present
  6. Re-advertise NLRI with remaining Reporter TLV

R1 Advertisement to downstream:
  MP_REACH_NLRI for 192.0.2.0/24:
    Reporter TLV #2:
      Reporter ID: 198.51.100.2, AS: 65002
      Reason: 1, Timestamp: 1733789410

Later Event: N2 also sends MP_UNREACH_NLRI for 192.0.2.0/24

R1 Processing:
  1. Remove Reporter TLV for 198.51.100.2/AS65002
  2. No Reporter TLVs remain
  3. Send MP_UNREACH_NLRI for 192.0.2.0/24

R1 Advertisement to downstream:
  MP_UNREACH_NLRI:
    AFI: 1, SAFI: TBD1
    Withdrawn Route: 192.0.2.0/24]]></artwork>
      </section>
    </section>
    
    <section numbered="true" toc="default">
      <name>Comparison with ADD-PATH Approach</name>
      <t>
        This nested TLV approach differs from using BGP ADD-PATH
        <xref target="RFC7911" format="default"/> in several fundamental ways:
      </t>
      
      <section numbered="true" toc="default">
        <name>Architectural Differences</name>
        <dl newline="false" spacing="normal">
          <dt>ADD-PATH Approach:</dt>
          <dd>Maintains multiple complete BGP paths for the same prefix,
              each with full set of BGP attributes (AS_PATH, communities,
              etc.). Each reporter's information travels as a separate
              BGP UPDATE path.</dd>
          
          <dt>Nested TLV Approach:</dt>
          <dd>Aggregates multiple reporter perspectives into a single
              BGP path. Only one set of BGP attributes (representing the
              advertising path), but multiple Reporter TLVs within the NLRI.</dd>
        </dl>
      </section>
      
      <section numbered="true" toc="default">
        <name>Advantages of Nested TLV Approach</name>
        <ul spacing="normal">
          <li>No ADD-PATH capability negotiation required - works with all
              BGP implementations</li>
          <li>More compact representation - single UPDATE can carry reports
              from many speakers</li>
          <li>Explicit aggregation model designed for consolidating multiple
              perspectives</li>
          <li>Lower BGP state - one path entry instead of multiple</li>
          <li>Easier correlation - all reports for a prefix in one NLRI</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>Disadvantages of Nested TLV Approach</name>
        <ul spacing="normal">
          <li>More complex specification and implementation</li>
          <li>BGP attribute ambiguity - AS_PATH represents the path of the
              UPDATE message, not the original paths reporters observed</li>
          <li>Withdrawal complexity - requires tracking which neighbor
              provided each Reporter TLV</li>
          <li>NLRI size can grow large with many reporters</li>
          <li>Non-standard pattern in BGP protocol design</li>
          <li>Path selection doesn't consider reporter content</li>
          <li>New capability bit and processing logic required</li>
        </ul>
      </section>
      
      <section numbered="true" toc="default">
        <name>When to Use Each Approach</name>
        <dl newline="false" spacing="normal">
          <dt>Use ADD-PATH when:</dt>
          <dd>
            <ul spacing="normal">
              <li>Full BGP path information per reporter is important</li>
              <li>Independent lifecycle management is critical</li>
              <li>ADD-PATH is already widely deployed in the network</li>
              <li>Standard BGP mechanisms are preferred</li>
            </ul>
          </dd>
          
          <dt>Use Nested TLV when:</dt>
          <dd>
            <ul spacing="normal">
              <li>ADD-PATH support is limited or unavailable</li>
              <li>Compact aggregation is desired</li>
              <li>Monitoring systems want single consolidated view</li>
              <li>Lower BGP state is important</li>
            </ul>
          </dd>
        </dl>
      </section>
    </section>
  </back>
</rfc>

