<?xml version='1.0' encoding='utf-8'?>
<!-- This template is for creating an Internet Draft using xml2rfc,
     which is available here: http://xml.resource.org. -->
<!-- ><!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> -->
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" 
	category="exp" 
	docName="draft-oran-icnrg-pathsteering-06" 
	ipr="trust200902" 
	obsoletes="" 
	updates="" 
	submissionType="IRTF" 
	xml:lang="en" 
	tocInclude="true" 
	tocDepth="4" 
	symRefs="true" 
	sortRefs="true" 
	version="3">
	
  <!-- xml2rfc v2v3 conversion 2.44.0 -->
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN"
     they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->
<front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the
         full title is longer than 39 characters -->
    <title abbrev="ICN Path Steering">
    Path Steering in CCNx and NDN
    </title>
    <seriesInfo name="Internet-Draft" value="draft-oran-icnrg-pathsteering-06"/>
    

    <author fullname="Ilya Moiseenko" surname="I. Moiseenko">
      <organization>UCLA</organization>
      <address>
        <postal>
          <street/>
          <city/>
          <region/>
          <code/>
          <country/>
        </postal>
        <phone/>
        <email>iliamo@ucla.edu</email>
        <!-- uri and facsimile elements may also be added -->
      </address>
    </author>
    
    <author fullname="Dave Oran" surname="D. Oran">
      <organization>Network Systems Research and Design</organization>
      <address>
        <postal>
          <street>4 Shady Hill Square</street>
          <!-- Reorder these if your country does things differently -->
                <city>Cambridge</city>
          <region>MA</region>
          <code>02138</code>
          <country>USA</country>
        </postal>
        <phone/>
        <email>daveoran@orandom.net</email>
        <!-- uri and facsimile elements may also be added -->
        </address>
    </author>
    <date year="2022"/>


    <!-- Meta-data Declarations -->

    <area>IRTF</area>
    <workgroup>ICNRG</workgroup>

    <keyword>template</keyword>
    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->

    <abstract>
      <t>Path Steering is a mechanism to discover paths to the producers of ICN content objects and steer subsequent Interest messages along a previously discovered path. It has various uses, including the operation of state-of-the-art multipath congestion control algorithms and for network measurement and management. This specification derives directly from the design published in <em>Path Switching in Content Centric and Named Data Networks</em> (4th ACM Conference on Information-Centric Networking - ICN'17) and therefore does not recapitulate the design motivations, implementation details, or evaluation of the scheme. Some technical details are different however, and where there are differences, the design documented here is to be considered definitive.</t>
      <!--This document is a product of the IRTF Information-Centric Networking Research Group (ICNRG). -->
    </abstract>
  </front>
  <middle>
    <section anchor="intro" numbered="true" toc="default">
      <name>Introduction</name>
      <t>Path Steering is a mechanism to discover paths to the producers of ICN content objects and steer subsequent Interest messages along a previously discovered path. It has various uses, including the operation of state-of-the-art multipath congestion control algorithms and for network measurement and management. This specification derives directly from the design published in <xref target="Moiseenko2017" format="default"/> and therefore does not recapitulate the design motivations, implementation details, or evaluation of the scheme. That publication should be considered a normative reference as it is not likely a reader will be able to understand all elements of this design without first having read the reference. Some technical details are different however, and where there are differences, the design documented here is to be considered definitive.</t>
            
      <t>Path discovery and subsequent path steering in ICN networks is facilitated by the symmetry of forward and reverse paths in the CCNx and NDN architectures. Path discovery is achieved by a consumer endpoint transmitting an ordinary Interest message and receiving a Content (Data) message containing an end-to-end path label constructed on the reverse path by the forwarding plane. Path steering is achieved by a consumer endpoint including a path label in the Interest message, which is forwarded to each nexthop through the corresponding egress interfaces in conjunction with longest name prefix match (LNPM) FIB lookup.</t>
      
      <section anchor="experimenting">
      	<name>Path Steering as an experimental extension to ICN protocol architectures</name>
      	<t>There are a number of important use cases to justify extending ICN architectures such as <xref target="RFC8569" format="default">CCNx</xref> or <xref target="NDN" format="default">NDN</xref> to provide these capabilities. These are summarized as follows:</t>
	      <ul spacing="normal">
        	<li>Support the discovery, monitoring and troubleshooting of multi-path network connectivity based on names and name prefixes. Analogous functions have been shown to be a crucial operational capability in multicast and multi-path topologies for IP. The canonical tools are the well-known <em>traceroute</em> and <em>ping</em>. For point-to-multipoint MPLS the more recent <xref target="RFC8029" format="default">tree trace</xref> protocol is used. Equivalent diagnostic functions have been defined for CCNx through the <xref target="I-D.irtf-icnrg-icnping" format="default">ICN Ping</xref> and <xref target="I-D.irtf-icnrg-icntraceroute" format="default">ICN Traceroute</xref> specifications, both of which are capable of exploiting path steering if available.</li>
        	
        	<li>Perform accurate online measurement of network performance, which generally requires multiple consecutive packets follow the same path under control of an application.</li>
        	
        	<li>Improve the performance and flexibility of multi-path congestion control algorithms. Congestion control schemes such as <xref target="Mahdian2016" format="default"/> and <xref target="Song2018" format="default"/> depend on the ability of a consumer to explicitly steer packets onto individual paths in a multi-path and/or multi-destination topology.</li>
        	
        	<li>A consumer endpoint can mitigate content poisoning attacks by directing its Interests onto the network paths that bypass poisoned caches.</li>
      	</ul>

	  </section>
	        
      <section numbered="true" toc="default">
        <name>Requirements Language</name>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
        document are to be interpreted as described in <xref target="RFC2119" format="default">RFC 2119</xref>.</t>
      </section>
      
      <section>
      	<name>Terminology</name>
      	<t>This document uses the general ICN terms that are defined in <xref target="RFC8793"/>. In addition we define the following terms specific to path steering:</t>
        <dl>
            <dt>Path Discovery:</dt><dd>The process of sending an Interest requesting discover of a path and if successful, receiving a Data containing a Path Label for the path the corresponding Interest traversed</dd>
            
            <dt>Path Steering:</dt><dd>The process of sending an Interest message containing the Path Label of a previously discovered path in roder that the forwarders use that path when forwarding that particular Interest message.</dd>
            
            <dt>Path Label:</dt><dd>An optional field in the packet indicating a particular path from a consumer to either a producer, or a forwarder cache that can respond with the requested item. In an Interest message, the Path Label gets built up hop by hop as the interest traverses a path. In a Data message, the Path Label carries the full path information back to the consumer for use in one or more subsequent Interest messages.</dd>
            
            <dt>Nexthop Label:</dt><dd>One entry in a Path Label representing the next hop for the corresponding forwarder to use when a path-steered Interest message arrives at that forwarder. A sequence of Nexthop Labels constitutes a full Path Label.</dd>
        </dl>
    </section>

    </section>
    <section anchor="design" numbered="true" toc="default">
      <name>Essential elements of ICN path discovery and path steering</name>
      <t>We elucidate the design using <xref target="RFC8569" format="default">CCNx semantics</xref> and extend its <xref target="RFC8609" format="default">Packet Encoding</xref> as defined in <xref target="CCNx-encoding" format="default"/>. While the terminology is slightly different, this design can be applied also to NDN, by extending its bespoke <xref target="NDNTLV" format="default">packet encodings</xref> (See <xref target="NDN-encoding" format="default"/>).</t>
      <section anchor="discovery" numbered="true" toc="default">
        <name>Path Discovery</name>
        <t><em>End-to-end Path Discovery</em> for CCNx is achieved by creating a <em>path label</em> and placing it as a hop-by-hop TLV in a CCNx Content (Data) message. The path label is constructed hop-by-hop as the message traverses the reverse path of transit CCNx forwarders as shown in the first example in <xref target="pathsteeringoverview"/>. The path label is updated by adding to the existing path label the nexthop label of the interface at which the Content (Data) message has arrived. Eventually, when the Content(Data) message arrives at the consumer, the path label identifies the complete path the Content (Data) message took to reach the consumer. As shown in the second example in the figure, when multiple paths are available, subsequent interests can discover additional paths by omitting a path steering TLV and obtaining a new path label on the returning interest.</t>
        <figure anchor="pathsteeringoverview">
          <name>Basic example of path discovery and steering</name>
          <artwork name="Path Discovery 1" type="" align="left" alt=""><![CDATA[
          Discover and use first path:
          
               Consumer                  Interest 1  ___  Interest 2
                  |                          |        ^       |
                  |                          |        |       |
                  |                          |        |       |
             Forwarder 1                     v        |       V
                  | (nexthop 1)          (nexthop 1)  ^   (nexthop 1)
                  |                          |        |       |
                  |                          |        |       |
             Forwarder 2                     v        |       v
     (nexthop 3) / \ (nexthop 2)         (nexthop 2)  ^   (nexthop 2)
                /   \                        |        |       |
               /     \                       |        |       |
              /       \                      |        |       |
             /         \                     |        |       |
            /           \                    |        |       |
      Forwarder 4    Forwarder 3             v        |       v
(nexthop 5)\             / (nexthop 4)   (nexthop 4)  ^   (nexthop 4)
            \           /                    |        |       |
             \         /                     |        |       |
              \       /                      |        |       |
               \     /                       |        |       |
                \   /                        |        |       |
                 \ /                         v        |       v
               Producer                     ___     Data 1   ___
                 or
            Content Store
      ]]></artwork>
      <artwork name="Path Discovery 2" type="" align="left" alt=""><![CDATA[
          Discover and use second path:
          
               Consumer                  Interest 3  ___  Interest 4
                  |                          |        ^       |
                  |                          |        |       |
                  |                          |        |       |
             Forwarder 1                     v        |       V
                  | (nexthop 1)          (nexthop 1)  ^   (nexthop 1)
                  |                          |        |       |
                  |                          |        |       |
             Forwarder 2                     v        |       v
     (nexthop 3) / \ (nexthop 2)         (nexthop 3)  ^   (nexthop 3)
                /   \                        |        |       |
               /     \                       |        |       |
              /       \                      |        |       |
             /         \                     |        |       |
            /           \                    |        |       |
      Forwarder 4    Forwarder 3             v        |       v
(nexthop 5)\             / (nexthop 4)   (nexthop 5)  ^   (nexthop 5)
            \           /                    |        |       |
             \         /                     |        |       |
              \       /                      |        |       |
               \     /                       |        |       |
                \   /                        |        |       |
                 \ /                         v        |       v
               Producer                     ___     Data 2   ___
                 or
            Content Store
      ]]></artwork>
        </figure>
        <!-->
		<t><spanx style="strong">Issue:</spanx> <spanx>how to indicate in an Interest message that the consumer wants to do path discovery? Flag in the fixed header? Empty Path Label TLV (with index set to zero?). If we do the former, would need some way to indicate how big the producer should make it since it doesn't know how many hops there are on the reverse path. That's not a problem if we do the latter, but that makes the Interest message bigger even though it doesn't have a path yet. Making the path Label TLV the maximum size (i.e. based on what hop limit is set to) wastes a lot of space since most paths are likely to be way shorter than what the hop limit is set to by the consumer. Doing so does make transforming the Interest message into a Content Object message a bit easier though, since the hop-by-hop headers are likely already sized right. Another option is to define a new TLV to carry the unmodified hop limit by the consumer. Then the producer then just does a subtraction to get the traversed path length.</spanx></t>

    <t><spanx style="strong">Ilya:</spanx>I added some flags TLV, so it is possible to have a separate "Discovery mode" flag, that would tell forwarders to increment hop label index (instead of decrementing and reading the path label)</t>
    <t><spanx style="strong">Ilya:</spanx>Is 64 bytes really much these days? I don't quite like the idea of telling the producer how far away i am. I think it will be a privacy concern for some people.</t>
    <t><spanx style="strong">Ilya:</spanx>Can it be solved from prefix registration side? Producer gets label size supported by the network from its ISP? Idk what about intermediate caches. </t>

-->

	</section>
      <section anchor="steering" numbered="true" toc="default">
        <name>Path Steering</name>
        <t>Due to the symmetry of forward and reverse paths in CCNx, a consumer application can reuse a discovered path label to fetch the same or similar (e.g. next chunk, or next Application Data Unit, or next pointer in a <xref target="I-D.irtf-icnrg-flic" format="default">Manifest</xref>) Content (Data) message over the discovered network path. This <em>Path Steering</em> is achieved by processing the Interest message's path label at each transit ICN forwarder and forwarding the Interest through the specified nexthop among those identified as feasible by LNPM FIB lookup (<xref target="pathsteeringdataplane"/>).</t>
        <figure anchor="pathsteeringdataplane">
          <name>Path Steering CCN / NDN data plane</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[

------------------------------------------------------------------------
                              FORWARD PATH
------------------------------------------------------------------------

Interest +---------+  +-----+ (path label) +--------+ (match) Interest
-------->| Content |->| PIT | ------------>| Label  |---------------->
         |  Store  |  +-----+              | Lookup |
         +---------+   | \ (no path label) +--------+
          |            |  \                    |\ (path label mismatch)
Data      |            |   \                   | \
<---------+            v    \                  |  \
                  aggregate  \                 |   \
                              \                |    \
                               \               |     +-----+  Interest
                                +--------------|---->| FIB | --------->
                                               |     +-----+
Interest-Return (NACK)                         v        | (no route)
<----------------------------------------------+<-------+


------------------------------------------------------------------------
                              REVERSE PATH
------------------------------------------------------------------------

Interest-return(NACK) +-----+ (update path label) Interest-Return(NACK)
<---------------------|     |<-----------------------------------------
                      |     |
Data   +---------+    | PIT |  (update path label)                Data
<------| Content |<---|     |<-----------------------------------------
       |  Store  |    |     |
       +---------+    +-----+
                         |
                         | (no match)
                         v
      ]]></artwork>
        </figure>
      </section>
      <section anchor="error-processing" numbered="true" toc="default">
        <name>Handling Path Steering errors</name>
        <t>Over time, the state of interfaces and the FIB on forwarders may change such that, at any particular forwarder, a given nexthop is no longer valid for a given prefix. In this case, the path label will point to a now-invalid nexthop. This is detected by failure to find a match between the decoded nexthop ID and the nexthops of the FIB entry after LNPM FIB lookup.</t>
        <t>On detecting an invalid path label, the forwarder SHOULD respond to the Interest with an Interest-Return. We therefore define a new <em>Invalid path label</em> response code for the Interest Return message and include the current path label as a hop-by-hop header. Each transit forwarder processing the Interest-Return message updates the path label in the same manner as Content (Data) messages, so that the consumer receiving the Interest-Return (NACK) can easily identify which path label is no longer valid.</t>
        <!-->
		<t><spanx style="strong">Issue:</spanx> <spanx>should we provide an option to the consumer to forward the interest rather than returning the error? This is briefly discussed in the paper, but specific machinery isn't suggested. I think this would potentially be useful for diagnosis. If so, we need to re-jigger the description a bit and include the following paragraph</spanx></t>
-->

		<t>A consumer may alternatively request that a forwarder detecting the inconsistency forward the Interest by means of normal LNPM FIB lookup rather than returning an error. The consumer endpoint, if it cares, can keep enough information about outstanding Interests to determine if the path label sent with the Interest fails to match the path label in the corresponding returned Content (Data), and use that information to replace stale path labels. It does so by setting the FALLBACK MODE flag of the path label TLV in its Interest message.</t>
      </section>
      <section anchor="label-encoding" numbered="true" toc="default">
        <name>How to represent the Path Label</name>
        <t><xref target="Moiseenko2017" format="default"/> presents various options for how to represent a path label, with different tradeoffs in flexibility, performance and space efficiency. For this specification, we choose the <em>Polynomial encoding</em> which achieves reasonable space efficiency at the cost of establishing a hard limit on the length of paths that can be represented.</t>
        <t>The polynomial encoding utilizes a fixed-size bit array. Each transit ICN forwarder is allocated a fixed sized portion of the bit array. This design allocates 12 bits (i.e. 4095 as a <em>generator polynomial</em>) to each intermediate ICN forwarder. This should match the scalability of today's commercial routers that support up to 4096 physical and logical interfaces and usually do not have more than a few hundred active ones.</t>

        <figure>
          <name>Fixed size path label</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
+------------------------------------------------------------------+
|                      Path Label bitmap                           |
+----------+-----------------+-----------------+-------------------+
|   index  |  nexthop label  |  nexthop label  |                   |
+----------+-----------------+-----------------+-------------------+
|<- 8bit ->|<---- 12bit ---->|<---- 12bit ---->|<----------------->|
]]></artwork>
        </figure>

        <t>A forwarder that receives a Content (Data) message encodes the nexthop label in the next available slot and increments label index. Conversely, a forwarder that receives an Interest message reads the current nexthop label and decrements label index. Therefore, the extra computation required at each hop to forward either an interest or Content Object message with a path label is minimized and constitutes a fairly trivial additional overhead compared to FIB lookup and other required operations.</t>
        <t>This approach results in individual path label TLV instances being of fixed pre-computed size. While this places a hard upper bound on the maximum number of network hops that can be represented, this is not a significant a practical problem in NDN and CCNx,
      since the size can be pre-set during Content(Data) message encoding based on the exact number of network hops traversed by the Interest message.
      Even long paths of 24 hops will fit in a path label bitmap of 36 bytes if nexthop label is encoded in 12 bits.</t>
      </section>
    </section>
    <section anchor="encoding" numbered="true" toc="default">
      <name>Mapping to CCNx and NDN packet encodings</name>
      <section anchor="Path-label-types" numbered="true" toc="default">
        <name>Path label TLV</name>
        <t> A Path label TLV is the tuple: {[Flags], [Path Label Hop Count], [Nexthop Label], 
    [Path label bitmap]}.</t>
        <table anchor="pathlabelflags" align="center">
          <name>Path label flags</name>
          <thead>
            <tr>
              <th align="center">Flag</th>
              <th align="center">Value (hex)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">DISCOVERY MODE</td>
              <td align="center">0x00</td>
            </tr>
            <tr>
              <td align="center">FALLBACK MODE</td>
              <td align="center">0x01</td>
            </tr>
            <tr>
              <td align="center">STRICT MODE</td>
              <td align="center">0x02</td>
            </tr>
          </tbody>
        </table>
        <t>The Path Label Hop Count (PLHC) MUST be incremented by NDN and CCNx forwarders if
    the Interest packet carries a path label and DISCOVERY mode flag is set.
    A producer node or a forwarder with cached data packet MUST use PLHC in calculation
    of a path label bitmap size suitable for encoding the entire path to the consumer.
    The Path Label Hop Count (PLHC) MUST be set to zero in newly created Data or Interest-Return (NACK) packets.
    A consumer node MUST reuse Path Label Hop Count (PLHC) together with the Path label bitmap (PLB) in order to correctly forward the Interest(s) along the corresponding network path.</t>
        <t>If an NDN or CCNx forwarder supports path labeling, the Nexthop label MUST be used  to determine the correct egress interface for an Interest packet carrying either the FALLBACK MODE or STRICT MODE flag. If any particular NDN or CCNx forwarder is configured to decrypt path labels of Interest packets (Section <xref target="security" format="default">"Security considerations"</xref>), then the forwarder MUST
        </t>
        <ol spacing="normal" type="1">
          <li>decrypt the path label with its own symmetric key,</li>
          <li>update the nexthop label with outermost label in the path label,</li>
          <li>decrement Path Label Hop Count (PLHC), and</li>
          <li>remove the outermost label from the path label.</li>
        </ol>
        <t>
    If any particular NDN or CCNx forwarder is NOT configured to decrypt path labels of Interest packets, then path label decryption SHOULD NOT be performed.</t>
        <t> The Nexthop label MUST be ignored by NDN and CCNx forwarders if present in Data or Interest-Return (NACK) packets. If any particular NDN or CCNx forwarder is configured to encrypt path labels of Data and Interest-Return (NACK) packets       (Section <xref target="security" format="default">Security Considerations</xref>), then the forwarder MUST encrypt existing path label with its own symmetric key, append the nexthop label of the ingress interface to the path label, and increment Path Label Hop Count (PLHC). If any particular NDN or CCNx forwarder is NOT configured to encrypt path labels of Interest packets, then path label encryption SHOULD NOT be performed.</t>
        <t>NDN and CCNx forwarders MUST fallback to longest name prefix match (LNPM) FIB lookup if an Interest packet carries an invalid nexthop label and the FALLBACK MODE flag is set.</t>
        <t>CCNx forwarders MUST respond with an Interest Return packet specifying the T_RETURN_INVALID_PATH_LABEL code if Interest packet carries an invalid path label and the STRICT MODE flag is set.</t>
        <t>CCNx forwarders MUST respond with an Interest Return packet specifying the T_RETURN_MALFORMED_INTEREST code if the Interest packet carries a path label TLV with both FALLBACK MODE and STRICT MODE flags set.</t>
      </section>
      <section anchor="CCNx-encoding" numbered="true" toc="default">
        <name>Path label encoding for CCNx</name>
        <t>Path Label is an optional Hop-by-Hop header TLV that can be present in CCNx Interest, InterestReturn and Content Object packets.</t>
        <figure>
          <name>Path label Hop-by-Hop header TLV for CCNx</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
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
+---------------+---------------+---------------+---------------+
|         T_PATH_LABEL          |          Length + 4           |
+---------------+---------------+---------------+---------------+
|     Flags     |  Path Label   |        Nexthop Label          |
|               |  Hop Count    |                               |
+---------------+---------------+---------------+---------------+
/                                                               /
/               Path label bitmap (Length octets)               /
/                                                               /
+---------------+---------------+---------------+---------------+
      ]]></artwork>
        </figure>
      </section>
      <section anchor="NDN-encoding" numbered="true" toc="default">
        <name>Path label encoding for NDN</name>
        <t>Path Label is an optional TLV in NDN Interest, Data and NACK packets. The Path Label TLV SHOULD NOT take part in Interest, Data or NACK signature calculation as it is potentially modified at every network hop.</t>
        <figure>
          <name>Path label TLV for NDN</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
        PathLabel = PATH-LABEL-TYPE TLV-LENGTH
                    PathLabelFlags
                    PathLabelBitmap

        PathLabelFlags    = PATH-LABEL-FLAGS-TYPE
                            TLV-LENGTH ; == 1
                            OCTET

        NexthopLabel      = PATH-LABEL-NEXTHOP-LABEL-TYPE
                            TLV-LENGTH ; == 2
                            2 OCTET

        PathLabelHopCount = PATH-LABEL-HOP-COUNT-TYPE
                            TLV-LENGTH ; == 1
                            OCTET

        PathLabelBitmap   = PATH-LABEL-BITMAP-TYPE
                            TLV-LENGTH ; == 64
                            64 OCTET
      ]]></artwork>
        </figure>
        <table anchor="pathlabelTLVs" align="center">
          <name>TLV-TYPE number assignments</name>
          <thead>
            <tr>
              <th align="center">Flag</th>
              <th align="center">Value (hex)</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">PATH-LABEL-TYPE</td>
              <td align="center">0x09</td>
            </tr>
            <tr>
              <td align="left">PATH-LABEL-FLAGS-TYPE</td>
              <td align="center">0x0B</td>
            </tr>
            <tr>
              <td align="left">PATH-LABEL-BITMAP-TYPE</td>
              <td align="center">0x0D</td>
            </tr>
            <tr>
              <td align="left">PATH-LABEL-NEXTHOP-LABEL-TYPE</td>
              <td align="center">0x0E</td>
            </tr>
            <tr>
              <td align="left">PATH-LABEL-HOP-COUNT-TYPE</td>
              <td align="center">0x0F</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <!-- This PI places the pagebreak correctly (before the section title) in the text output. -->
<!--<?rfc needLines="8" ?>-->
<!-- Possibly a 'Contributors' section ... -->

<section anchor="IANA" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>IANA is requested to make the following assignments:
</t>
      <ol spacing="normal" type="1">
        <li> Please assign the value 0x0004 for T_PATH_LABEL in the <strong>CCNx Hop-by-Hop Types</strong> registry.</li>
        <li>Please assign the TLV types in <xref target="pathlabelTLVs" format="default"/> in the <strong>CCNx Hop-by-Hop type registry</strong>.</li>
        <li>Please assign the value 0xA for the T_RETURN_INVALID_PATH_LABEL in the <strong>CCNx Interest Return Code Types" registry</strong>.</li>
        <li>Please create the <strong>CCNx Path Label Flags</strong> registry and assign the values listed in <xref target="pathlabelflags" format="default"/>.</li>
      </ol>
    </section>
    <section anchor="security" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>A path is invalidated by renumbering nexthop label(s). A malicious consumer can attempt to mount an attack by transmitting Interests with path labels which differ only in a single now-invalid nexthop label in order to <em>brute force</em> a valid nexthop label. If such an attack succeeds, a malicious consumer would be capable of steering Interests over a network path that may not match the paths computed by the routing algorithm or learned adaptively by the forwarders.</t>
      <t>When a label lookup fails, by default an <em>Invalid path label</em> Interest-Return (NACK) message is returned to the consumer. This contains a path label identical to the one included in the corresponding Interest message. A malicious consumer can therefore analyze the message's Hop Count field to infer which specific nexthop label had failed and direct an attack to influence path steering at that hop. This threat can be mitigated by the following countermeasures:

      </t>
      <ul spacing="normal">
        <li>A nexthop label of larger size is harder to crack. If nexthop labels are not allocated in a predictable fashion by the routers, brute forcing a 32-bit nexthop label requires on average O(2^31) Interests. However, this specification uses nexthop labels with much less entropy (12 bits), so depending on computational hardness is not workable.</li>
        <li>An ICN forwarder can periodically update nexthop labels to limit the maximum lifetime of paths. It is RECOMMENDED that forwarders update path labels at least every few minutes.</li>
        <li>A void Hop Count field in an <em>Invalid path label</em> Interest-Return (NACK) message would not give out the information on which specific nexthop label had failed. An attacker might need to brute force all nexthop labels in all combinations. However, some useful diagnostic capability is lost by obscuring the hop count. For example the locus of routing churn is harder to pin down through analysis of path-steered pings or traceroutes. A forwarder MAY choose to invalidate the hop count in addition to changing nexthop labels periodically as above.</li>
      </ul>
      <t>ICN protocols can be susceptible to a variety of cache poisoning attacks, where a colluding consumer and producer arrange for bogus content (with either invalid or inappropriate signatures) to populate forwarder caches. These are generally confined to on-path attacks. It is also theoretically possible to launch a similar attack without a cooperating producer such that the caches of on-path routers become poisoned with the content from off-path routers (i.e. physical connectivity, but no route in a FIB for a given prefix). We estimate that without any prior knowledge of the network topology, the complexity of this type of attack is in the ballpark of Breadth-First-Search and Depth-First-Search algorithms with the additional burden of transmitting 2^31 Interests in order to crack a nexthop label on each hop.

	Relatively short periodic update of nexthop labels and anti- <em>label scan</em> heuristics implemented in the ICN forwarder may successfully mitigate this type of attack.</t>
      <section anchor="encryptpathlabel" numbered="true" toc="default">
        <name>Cryptographic protection of a path label</name>
        <t>If the countermeasures listed above do not provide sufficient protection against malicious mis-steering of Interests, the path label can be made opaque to the consumer endpoint via hop-by-hop symmetric cryptography applied to the path labels (<xref target="pathlabelcryptoprocess"/>). This method is viable due to the symmetry of forward and reverse paths in CCNx and NDN architectures combined with ICN path steering requiring only reads/writes of the topmost nexthop label (i.e. active nexthop label) in the path label. This way a path steering capable ICN forwarder receiving a Data (Content) message encrypts the current path label with its own non-shared symmetric key prior to adding a new nexthop label to the path label. The Data (Content) message is forwarded downstream with unencrypted topmost (i.e active) nexthop label and encrypted remaining content of the path label. As a result, a consumer endpoint receives a Data (Content) message with a unique path label exposing only the topmost nexthop label as cleartext. A path steering  forwarder receiving an Interest message performs label lookup using the topmost nexthop label, decrypts the path label with its own non-shared symmetric key, and forwards the message upstream.</t>
        <t>Cryptographic protection of a path label does not require any key negotiation among ICN forwarders, and is no more expensive than MACsec or IPsec. It is also quite possible that strict hop-by-hop path label encryption is not necessary and path label encryption only on the border routers of the trusted administrative or routing domains may suffice.</t>
        <figure anchor="pathlabelcryptoprocess">
          <name>Path label protection with hop-by-hop symmetric cryptography</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
                            Producer
                            |      ^
                            |      |
     Path Label TLV         |      |           Path Label TLV
+-----------------------+   |      |     +-----------------------+
|nexthop label=456      |   v      |     |nexthop label=456      |
|encrypted path label={}|  Forwarder 3   |encrypted path label={}|
+-----------------------+   |      ^     +-----------------------+
                            |      |
path label is encrypted     |      |     path label is decrypted
with Forwarder 3            |      |     with Forwarder 3
symmetric key               |      |     symmetric key
                            |      |
                            |      |
                            |      |
                            |      |
                            |      |
     Path Label TLV         |      |           Path Label TLV
+-----------------------+   |      |     +-----------------------+
|nexthop label=634      |   v      |     |nexthop label=634      |
|encrypted path label=  |  Forwarder 2   |encrypted path label=  |
| {456}                 |   |      ^     | {456}                 |
+-----------------------+   |      |     +-----------------------+
                            |      |
path label is encrypted     |      |     path label is decrypted
with Forwarder 2            |      |     with Forwarder 2
symmetric key               |      |     symmetric key
                            |      |
                            |      |
                            |      |
                            |      |
                            |      |
     Path Label TLV         |      |           Path Label TLV
+-----------------------+   |      |     +-----------------------+
|nexthop label=912      |   v      |     |nexthop label=912      |
|encrypted path label=  |  Forwarder 1   |encrypted path label=  |
| {634, encrypted path  |   |      ^     | {634, encrypted path  |
| label {456}}          |   |      |     | label {456}}          |
+-----------------------+   |      |     +-----------------------+
                            |      |
path label is encrypted     |      |     path label is decrypted
with Forwarder 1            |      |     with Forwarder 1
symmetric key               |      |     symmetric key
                            |      |
                            |      |
                            |      |
                            |      |
                            v      |
                            Consumer
]]></artwork>
        </figure>
      </section>
    </section>
  </middle>
  <!--  *****BACK MATTER ***** -->

<back>
    <!-- References split into informative and normative -->

    <!-- There are 2 ways to insert reference entries from the citation libraries:
     1. define an ENTITY at the top, and use "ampersand character"RFC2629; here (as shown)
     2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml"?> here
        (for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.xml")

     Both are cited textually in the same manner: by using xref elements.
     If you use the PI option, xml2rfc will, by default, try to find included files in the same
     directory as the including file. You can also define the XML_LIBRARY environment variable
     with a value containing a set of directories to search.  These can be either in the local
     filing system or remote ones accessed by http (http://domain/dir/... ).-->

    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->
		<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8569.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8609.xml"/>
        
        <reference anchor="Moiseenko2017" target="https://conferences.sigcomm.org/acm-icn/2017/proceedings/icn17-2.pdf">
          <front>
            <title>Path Switching in Content Centric and Named Data Networks, in 4th ACM Conference on Information-Centric Networking (ICN 2017)</title>
            <seriesInfo name="DOI" value="10.1145/3125719.3125721"/>
            <author surname="Moiseenko" initials="I."/>
            <author surname="Oran" initials="D."/>
            <date year="2017" month="September"/>
          </front>
        </reference>
      </references>

      <references>
        <name>Informative References</name>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8029.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8793.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-irtf-icnrg-icnping.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-irtf-icnrg-icntraceroute.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-irtf-icnrg-flic.xml"/>
        
        <reference anchor="Mahdian2016" target="http://conferences2.sigcomm.org/acm-icn/2016/proceedings/p1-mahdian.pdf">
          <front>
            <title>MIRCC: Multipath-aware ICN Rate-based Congestion Control, in Proceedings of the 3rd ACM Conference on Information-Centric Networking</title>
            <seriesInfo name="DOI" value="10.1145/2984356.2984365"/>
            <author surname="Mahdian" initials="M."/>
            <author surname="Arianfar" initials="S."/>
            <author surname="Gibson" initials="J."/>
            <author surname="Oran" initials="D."/>
            <date year="2022"/>
          </front>
        </reference>
        <reference anchor="Song2018" target="https://conferences.sigcomm.org/acm-icn/2018/proceedings/icn18-final62.pdf">
          <front>
            <title>SMIC: Subflow-level Multi-path Interest Control for Information Centric Networking, in 5th ACM Conference on Information-Centric Networking</title>
            <seriesInfo name="DOI" value="10.1145/3267955.3267971"/>
            <author surname="Song" initials="J."/>
            <author surname="Lee" initials="M."/>
            <author surname="Kwon" initials="T."/>
            <date year="2018"/>
          </front>
        </reference>
        <reference anchor="NDN" target="https://named-data.net/project/execsummary/">
          <front>
            <title>Named Data Networking</title>
            <author surname="NDN team"/>
            <date>various</date>
          </front>
        </reference>
        <reference anchor="NDNTLV" target="http://named-data.net/doc/ndn-tlv/">
          <front>
            <title>NDN Packet Format Specification.</title>
            <author surname="NDN Project Team"/>
            <date year="2016"/>
          </front>
        </reference>
      </references>
    </references>
    <!-- Change Log
v00 2019-07-13  DRO Initial version
v01 2020-04-24	DRO	Respond to comments by Naveen Nathan and Klaus Schneider, convert to V3
v02 2020-11-02	DRO Update references for IN Ping and Traceroute
v03 2021-04-30	DRO Update references
v04 2021-10-25	DRO Keepalive
v05	2021-11-08	DRO	Changes based on Rute Sophia's comments on version -03
v06 2022-05-05	DRO Keepalive
	-->
  </back>
</rfc>
