<?xml version="1.0" encoding="us-ascii"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.23 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC8402 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8402.xml">
<!ENTITY RFC8660 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8660.xml">
<!ENTITY RFC8754 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8754.xml">
<!ENTITY RFC8986 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8986.xml">
<!ENTITY RFC9256 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9256.xml">
<!ENTITY I-D.dawra-idr-bgp-sr-service-chaining SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.dawra-idr-bgp-sr-service-chaining.xml">
<!ENTITY I-D.xu-mpls-payload-protocol-identifier SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.xu-mpls-payload-protocol-identifier.xml">
<!ENTITY RFC7665 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7665.xml">
<!ENTITY RFC8300 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8300.xml">
<!ENTITY RFC8595 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8595.xml">
]>


<rfc ipr="trust200902" docName="draft-ietf-spring-sr-service-programming-12" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title>Service Programming with Segment Routing</title>

    <author initials="A." surname="AbdelSalam" fullname="Ahmed AbdelSalam" role="editor">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>ahabdels@cisco.com</email>
      </address>
    </author>
    <author initials="X." surname="Xu" fullname="Xiaohu Xu" role="editor">
      <organization>China Mobile</organization>
      <address>
        <email>xuxiaohu@cmss.chinamobile.com</email>
      </address>
    </author>
    <author initials="C." surname="Filsfils" fullname="Clarence Filsfils">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>Belgium</country>
        </postal>
        <email>cf@cisco.com</email>
      </address>
    </author>
    <author initials="D." surname="Bernier" fullname="Daniel Bernier">
      <organization>Bell Canada</organization>
      <address>
        <postal>
          <country>Canada</country>
        </postal>
        <email>daniel.bernier@bell.ca</email>
      </address>
    </author>
    <author initials="C." surname="Li" fullname="Cheng Li">
      <organization>Huawei</organization>
      <address>
        <email>chengli13@huawei.com</email>
      </address>
    </author>
    <author initials="B." surname="Decraene" fullname="Bruno Decraene">
      <organization>Orange</organization>
      <address>
        <postal>
          <country>France</country>
        </postal>
        <email>bruno.decraene@orange.com</email>
      </address>
    </author>
    <author initials="S." surname="Ma" fullname="Shaowen Ma">
      <organization>Mellanox</organization>
      <address>
        <email>mashaowen@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Yadlapalli" fullname="Chaitanya Yadlapalli">
      <organization>AT&amp;T</organization>
      <address>
        <postal>
          <country>USA</country>
        </postal>
        <email>cy098d@att.com</email>
      </address>
    </author>
    <author initials="W." surname="Henderickx" fullname="Wim Henderickx">
      <organization>Nokia</organization>
      <address>
        <postal>
          <country>Belgium</country>
        </postal>
        <email>wim.henderickx@nokia.com</email>
      </address>
    </author>
    <author initials="S." surname="Salsano" fullname="Stefano Salsano">
      <organization>Universita di Roma "Tor Vergata"</organization>
      <address>
        <postal>
          <country>Italy</country>
        </postal>
        <email>stefano.salsano@uniroma2.it</email>
      </address>
    </author>

    <date year="2025" month="November" day="03"/>

    <area>General</area>
    <workgroup>SPRING</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 183?>

<t>This document defines data plane functionality required to implement service segments and achieve service programming in SR-enabled MPLS and IPv6 networks, as described in the Segment Routing architecture.</t>



    </abstract>



  </front>

  <middle>


<?line 187?>

<section anchor="introduction"><name>Introduction</name>

<t>Segment Routing (SR) <xref target="RFC8402"/> is an architecture based on the source routing paradigm that seeks the right balance between distributed intelligence and centralized programmability.  SR can be used with an MPLS or an IPv6 data plane to steer packets through an ordered list of instructions, called segments.  These segments may encode simple routing instructions for forwarding packets along a specific network path, but also steer them through Virtual Network Functions (VNFs) or physical service appliances available in the network.</t>

<t>In an SR network, each of these services, running either on a physical appliance or in a virtual environment, are associated with a segment identifier (SID). These service SIDs are then leveraged as part of a SID-list to steer packets through the corresponding services.  Service SIDs may be combined together in a SID-list to achieve service programming, but also with other types of segments as defined in <xref target="RFC8402"/>.  SR thus provides a fully integrated solution for overlay, underlay and service programming. Furthermore, the IPv6 instantiation of SR (SRv6) <xref target="RFC8986"/> supports metadata transportation in the Segment Routing Header <xref target="RFC8754"/>, either natively in the tag field or with extensions such as TLVs.</t>

<t>This document describes how a service can be associated with a SID, including legacy services with no SR capabilities, and how these service SIDs are integrated within an SR policy. The definition of an SR Policy and the traffic steering mechanisms are covered in <xref target="RFC9256"/> and hence outside the scope of this document.</t>

<t>The definition of control plane components, such as service segment discovery, is outside the scope of this data plane document.  For reference, the option of using BGP extensions to support SR service programming is proposed in <xref target="I-D.dawra-idr-bgp-sr-service-chaining"/>.</t>

</section>
<section anchor="terminology"><name>Terminology</name>

<t>This document leverages the terminology proposed in <xref target="RFC8402"/>, <xref target="RFC8660"/>, <xref target="RFC8754"/>, <xref target="RFC8986"/> and <xref target="RFC9256"/>.  It also introduces the following new terms.</t>

<t>Service segment: A segment associated with a service. The service may either run on a physical appliance or in a virtual environment such as a virtual machine or container.</t>

<t>SR-aware service: A service that is fully capable of processing SR traffic. An SR-aware service can be directly associated with a service segment.</t>

<t>SR-unaware service: A service that is unable to process SR traffic or may behave incorrectly due to presence of SR information in the packet headers. An SR-unaware service can be associated with a service segment through an SR proxy function.</t>

</section>
<section anchor="classification-and-steering"><name>Classification and Steering</name>

<t>Classification and steering mechanisms are defined in section 8 of <xref target="RFC9256"/> and are independent from the purpose of the SR policy.  From the perspective of a headend node classifying and steering traffic into an SR policy, there is no difference whether this policy contains IGP, BGP, peering, VPN or service segments, or any combination of these.</t>

<t>As documented in the above reference, traffic is classified when entering an SR domain.  The SR policy headend may, depending on its capabilities, classify the packets on a per-destination basis, via simple FIB entries, or apply more complex policy routing rules requiring to look deeper into the packet.  These rules are expected to support basic policy routing such as 5-tuple matching.  In addition, the IPv6 SRH tag field defined in <xref target="RFC8754"/> can be used to identify and classify packets sharing the same set of properties.  Classified traffic is then steered into the appropriate SR policy and forwarded as per the SID-list(s) of the active candidate path.</t>

<t>SR traffic can be re-classified by an SR endpoint along the original SR policy (e.g., DPI service) or a transit node intercepting the traffic.  This node is the head-end of a new SR policy that is imposed onto the packet, either as a stack of MPLS labels or as an IPv6 SRH.</t>

</section>
<section anchor="service-segments"><name>Service Segments</name>

<t>In the context of this document, the term service refers to a physical appliance running on dedicated hardware, a virtualized service inside an isolated environment such as a Virtual Machine (VM), container or namespace, or any process running on a compute element.  A service may also comprise multiple sub-components running in different processes or containers.  Unless otherwise stated, this document does not make any assumption on the type or execution environment of a service.</t>

<t>The execution of a service can be integrated as part of an SR policy by assigning a segment identifier, or SID, to the service and including this service SID in the SR policy SID-list.  Such a service SID may be of local or global significance. In the former case, other segments, such as prefix or adjacency segments, can be used to steer the traffic up to the node where the service segment is instantiated. In the latter case, the service is directly reachable from anywhere in the routing domain.  This is realized with SR-MPLS by assigning a SID from the global label block (<xref target="RFC8660"/>), or with SRv6 by advertising the SID locator in the routing protocol (<xref target="RFC8986"/>).  It is up to the network operator to define the scope and reachability of each service SID.  This decision can be based on various considerations such as infrastructure dynamicity, available control plane or orchestration system capabilities.</t>

<t>This document categorizes services in two types, depending on whether they are able to behave properly in the presence of SR information or not. These are respectively named SR-aware and SR-unaware services.</t>

<section anchor="sr-aware-services"><name>SR-Aware Services</name>

<t>An SR-aware service can process the SR information in the packets it receives. This means being able to identify the active segment as a local instruction and move forward in the segment list, but also that the service&#39;s own behavior is not hindered due to the presence of SR information.  For example, an SR-aware firewall filtering SRv6 traffic based on its final destination must retrieve that information from the last entry in the SRH rather than the Destination Address field of the IPv6 header.</t>

<t>An SR-aware service is associated with a locally instantiated service segment, which is used to steer traffic through it.</t>

<t>If the service is configured to intercept all the packets passing through the appliance, the underlying routing system only has to implement a default SR endpoint behavior (e.g., SR-MPLS node segment or SRv6 End behavior), and the corresponding SID will be used to steer traffic through the service.</t>

<t>If the service requires the packets to be directed to a specific virtual interface, networking queue or process, a dedicated SR behavior may be required to steer the packets to the appropriate location.  The definition of such service-specific functions is out of the scope of this document.</t>

<t>SR-aware services also enable advanced network programming functionalities such as conditional branching and jumping to arbitrary SIDs in the segment list. In addition, SRv6 provides several ways of passing and exchanging information between services (e.g., SID arguments, tag field and TLVs). An example scenario involving these features is described in <xref target="IFIP18"/>, which discusses the implementation of an SR-aware Intrusion Detection System.</t>

<t>Examples of SR-aware services are provided in section <xref target="sec-implem-aware"/>.</t>

</section>
<section anchor="sr-unaware-services"><name>SR-Unaware Services</name>

<t>Any service that does not meet the above criteria for SR-awareness is considered as SR-unaware.</t>

<t>An SR-unaware service is not able to process the SR information in the traffic that it receives.  It may either drop the traffic or take erroneous decisions due to the unrecognized routing information.  In order to include such services in an SR policy, it is thus required to remove the SR information as well as any other encapsulation header before the service receives the packet, or to alter it in such a way that the service can correctly process the packet.</t>

<t>In this document, we define the concept of an SR proxy as an entity, separate from the service, that performs these modifications and handle the SR processing on behalf of a service.  The SR proxy can run as a separate process on the service appliance, on a virtual switch or router on the compute node or on a different host.</t>

<t>An SR-unaware service is associated with a service segment instantiated on the SR proxy, which is used to steer traffic through the service. <xref target="sec-proxies"/> describes several SR proxy behaviors to handle the encapsulation headers and SR information under various circumstances.</t>

</section>
</section>
<section anchor="sr-service-policies"><name>SR Service Policies</name>

<t>An SR service policy is an SR policy, as defined in <xref target="RFC9256"/>, that includes at least one service. This service is represented in the SID-list by its associated service SID. In case the policy should include several services, the service traversal order is indicated by the relative position of each service SID in the SID-list. Using the mechanisms described in <xref target="RFC9256"/>, it is possible to load balance the traffic over several services, or instances of the same service, by associating with the SR service policy a weighted set of SID-lists, each containing a possible sequence of service SIDs to be traversed. Similarly, several candidate paths can be specified for the SR service policy, each with its own set of SID-lists, for resiliency purposes.</t>

<t>Furthermore, binding SIDs (BSIDs) <xref target="RFC8402"/> can be leveraged in the context of service policies to reduce the number of SIDs imposed by the headend, provide opacity between domains and improve scalability. For example, a network operator may want a policy in its core domain to include services that are running in one of its datacenters. One option is to define an SR policy at ingress edge of the core domain that explicitly includes all the SIDs needed to steer the traffic through the core and in the DC, but that may result in a long SID-list and requires to update the ingress edge configuration every time the DC part of the policy is modified. Alternatively, a separate policy can be defined at the ingress edge of the datacenter with only the SIDs that needs to be executed there and its BSID included in the core domain policy. That BSID remains stable when the DC policy is modified and can even be shared among several core domain policies that would require the same type of processing in the DC.</t>

<t>This section describes how services can be integrated within an SR-MPLS or SRv6 service policy.</t>

<figure title="SR service policy" anchor="fig-policy"><artwork><![CDATA[
     +------------------------------------------+
     |               SR network                 |
     |                                          |
+----+----+          +---------+           +----+-----+
|    H    +----------+    S    +-----------+    E     |
|(headend)|          |(service)|           |(endpoint)|
+----+----+          +---------+           +----+-----+
     |  =====================================>  |
     |     P1(H,E,C)                            |
     +------------------------------------------+
]]></artwork></figure>

<t><xref target="fig-policy"/> illustrates a basic SR service policy instantiated on a headend node H towards an endpoint E and traversing a service S. The SR policy may also include additional requirements, such as traffic engineering or VPN. On the head-end H, the SR policy P1 is created with a color C and endpoint E and associated with an SR path that can either be explicitly configured, dynamically computed on H or provisioned by a network controller.</t>

<t>In its most basic form, the SR policy P1 would be resolved into the SID-list &lt; SID(S), SID(E) &gt;. This is assuming that SID(S) and SID(E) are directly reachable from H and S, respectively, and that the forwarding path meets the policy requirement. However, depending on the dataplane and the segments available in the network, additional SIDs may be required to enforce the SR policy.</t>

<t>This model applies regardless of the SR-awareness of the service. If it is SR-unaware, then S simply represents the proxy that takes care of transmitting the packet to the actual service.</t>

<t>Traffic can then be steered into this policy using any of the mechanisms described in <xref target="RFC9256"/>.</t>

<t>The following subsections describe the specificities of each SR dataplane.</t>

<section anchor="sec-policy-mpls"><name>SR-MPLS Data Plane</name>

<figure title="Packet walk in an SR-MPLS network" anchor="fig-policy-mpls"><artwork><![CDATA[
     +-----------------------------------------------+
     |                SR-MPLS network                |
     |                                               |
+----+----+   ------>   +---------+   ------>   +----+-----+
|    H    +-------------+    S    +-------------+    E     |
|(headend)|             |(service)|             |(endpoint)|
+----+----+             +---------+             +----+-----+
     |    (1)         (2)         (3)         (4)    |
     |+---------+ +---------+ +---------+ +---------+|
     ||   ...   | |  L(S)   | |   ...   | |  L(E)   ||
     |+---------+ +---------+ +---------+ +---------+|
     ||  L(S)   | |   ...   | |  L(E)   | |Inner pkt||
     |+---------+ +---------+ +---------+ +---------+|
     ||   ...   | |  L(E)   | |Inner pkt|            |
     |+---------+ +---------+ +---------+            |
     ||  L(E)   | |Inner pkt|                        |
     |+---------+ +---------+                        |
     ||Inner pkt|                                    |
     |+---------+                                    |
     +-----------------------------------------------+
]]></artwork></figure>

<t>In an SR-MPLS network, the SR policy SID-list is encoded as a stack of MPLS labels <xref target="RFC8660"/> and pushed on top of the packet.</t>

<t>In the example shown on <xref target="fig-policy-mpls"/>, the SR policy should steer the traffic from the head-end H to the endpoint E via a service S. This translates into an MPLS label stack that includes at least a label L(S) associated to service S and a label L(E) associated to the endpoint E. The label stack may also include additional intermediate SIDs if these are required for traffic engineering (e.g., to encode a low latency path between H and S and / or between S and E) or simply for reachability purposes. Indeed, the service SID L(S) may be taken from the global or local SID block of node S and, in the latter case, one or more SIDs might be needed before L(S) in order for the packet to reach node S (e.g., a prefix-SID of S), where L(S) can be interpreted. The same applies for the SID L(E) at the SR policy endpoint.</t>

<t>Special consideration must be taken into account when using Local SIDs for service identification due to increased label stack depth and the associated impacts.</t>

<t>When the packet arrives at S, this node determines the MPLS payload type and the appropriate behavior for processing the packet based on the semantic locally associated to the top label L(S). If S is an SR-aware service, the SID L(S) may provide additional context or indication on how to process the packet (e.g., a firewall SID may indicate which rule set should be applied onto the packet). If S is a proxy in front of an SR-unaware service, L(S) indicates how and to which service attached to this proxy the packet should be transmitted. At some point in the process, L(S) is also popped from the label stack in order to expose the next SID, which may be L(E) or another intermediate SID.</t>

</section>
<section anchor="sec-policy-srv6"><name>SRv6 Data Plane</name>

<figure title="Packet walk in an SRv6 network" anchor="fig-policy-srv6"><artwork><![CDATA[
     +-----------------------------------------------+
     |                 SRv6 network                  |
     |                                               |
+----+----+   ------>   +---------+   ------>   +----+-----+
|    H    +-------------+    S    +-------------+    E     |
|(headend)|             |(service)|             |(endpoint)|
+----+----+             +---------+             +----+-----+
     |    (1)         (2)         (3)         (4)    |
     |+---------+ +---------+ +---------+ +---------+|
     ||IP6(H,..)| |IP6(H, S)| |IP6(H,..)| |IP6(H, E)||
     |+---------+ +---------+ +---------+ +---------+|
     ||SRH(E,..,| |SRH(E,..,| |SRH(E,..,| |SRH(E,..,||
     ||    S,..;| |    S,..;| |    S,..;| |    S,..;||
     ||    SL=i)| |    SL=j)| |    SL=k)| |    SL=0)||
     |+---------+ +---------+ +---------+ +---------+|
     ||Inner pkt| |Inner pkt| |Inner pkt| |Inner pkt||
     |+---------+ +---------+ +---------+ +---------+|
     +-----------------------------------------------+
]]></artwork></figure>

<t>In an SRv6 network, the SR Policy is encoded into the packet as an IPv6 header possibly followed by a Segment Routing Header (SRH) <xref target="RFC8754"/>.</t>

<t>In the example shown on <xref target="fig-policy-srv6"/>, the SR policy should steer the traffic from the head-end H to the endpoint E via a service S. This translates into Segment-List that includes at least a segment SID(S) to the service, or service proxy, S and a segment SID(E) to the endpoint E. The Segment-List may also include additional intermediate SIDs if these are required for traffic engineering (e.g., the encode a low latency path between H and S and / or between S and E) or simply for reachability purposes. Indeed, the service SID locator may or may not be advertised in the routing protocol and, in the latter case, one or more SIDs might be needed before SID(S) in order to bring the packet up to node S, where SID(S) can be interpreted. The same applies for the segment SID(E) at the SR policy endpoint.</t>

<t>When the packet arrives at S, this node determines how to process the packet based on the semantic locally associated to the active segment SID(S). If S is an SR-aware service, then SID(S) may provide additional context or indication on how to process the packet (e.g., a firewall SID may indicate which rule set should be applied onto the packet). If S is a proxy in front of an SR-unaware service, SID(S) indicates how and to which service attached to this proxy the packet should be transmitted. At some point in the process, the SRv6 End function is also applied in order to make the next SID, which may be SID(E) or another intermediate SID, active.</t>

<t>The &quot;Inner pkt&quot; on <xref target="fig-policy-srv6"/> represents the SRv6 payload, which may be an encapsulated IP packet, an Ethernet frame or a transport-layer payload, for example.</t>

</section>
</section>
<section anchor="sec-proxies"><name>SR Proxy Behaviors</name>

<t>This section describes several SR proxy behaviors designed to enable SR service programming through SR-unaware services.  A system implementing one of these behaviors may handle the SR processing on behalf of an SR-unaware service and allows the service to properly process the traffic that is steered through it.</t>

<t>A service may be located at any hop in an SR policy, including the last segment.  However, the SR proxy behaviors defined in this section are dedicated to supporting SR-unaware services at intermediate hops in the segment list.  In case an SR-unaware service is at the last segment, it is sufficient to ensure that the SR information is ignored (IPv6 routing extension header with Segments Left equal to 0) or removed before the packet reaches the service (MPLS PHP, SRv6 decapsulation behavior or PSP flavor).</t>

<t>As illustrated on <xref target="fig-proxy"/>, the generic behavior of an SR proxy has two parts.  The first part is in charge of passing traffic from the network to the service.  It intercepts the SR traffic destined for the service via a locally instantiated service segment, modifies it in such a way that it appears as non-SR traffic to the service, then sends it out on a given interface, IFACE-OUT, connected to the service.  The second part receives the traffic coming back from the service on IFACE-IN, restores the SR information and forwards it according to the next segment in the list.  IFACE-OUT and IFACE-IN are respectively the proxy interface used for sending traffic to the service and the proxy interface that receives the traffic coming back from the service.  These can be physical interfaces or sub-interfaces (VLANs) and, unless otherwise stated, IFACE-OUT and IFACE-IN can represent the same interface.</t>

<figure title="Generic SR proxy" anchor="fig-proxy"><artwork><![CDATA[
           +----------------------------+
           |                            |
           |           Service          |
           |                            |
           +----------------------------+
                    ^  Non SR   |
                    |  traffic  |
                    |           v
              +-----------+----------+
           +--| IFACE OUT | IFACE IN |--+
SR traffic |  +-----------+----------+  | SR traffic
---------->|          SR proxy          |---------->
           |                            |
           +----------------------------+
]]></artwork></figure>

<t>In the next subsections, the following SR proxy mechanisms are defined:</t>

<t><list style="symbols">
  <t>Static proxy</t>
  <t>Dynamic proxy</t>
  <t>Shared-memory proxy</t>
  <t>Masquerading proxy</t>
</list></t>

<t>Each mechanism has its own characteristics and constraints, which are summarized in the below table.  It is up to the operator to select the best one based on the proxy node capabilities, the service behavior and the traffic type.  It is also possible to use different proxy mechanisms within the same service policy.</t>

<figure title="SR proxy summary" anchor="fig-proxy-sum"><artwork><![CDATA[
                                        +-----+-----+-----+-----+
                                        |     |     |     |  M  |
                                        |     |     |  S  |  a  |
                                        |     |     |  h  |  s  |
                                        |     |     |  a  |  q  |
                                        |     |     |  r  |  u  |
                                        |     |  D  |  e  |  e  |
                                        |  S  |  y  |  d  |  r  |
                                        |  t  |  n  |     |  a  |
                                        |  a  |  a  |  m  |  d  |
                                        |  t  |  m  |  e  |  i  |
                                        |  i  |  i  |  m  |  n  |
                                        |  c  |  c  |  .  |  g  |
+---------------------------------------+-----+-----+-----+-----+
|                |       SR-MPLS        |  Y  |  Y  |  Y  |  -  |
|                |                      |     |     |     |     |
|   SR flavors   |     Inline SRv6      |  P  |  P  |  P  |  Y  |
|                |                      |     |     |     |     |
|                |  SRv6 encapsulation  |  Y  |  Y  |  Y  |  -  |
+----------------+----------------------+-----+-----+-----+-----+
|     Chain agnostic configuration      |  N  |  N  |  Y  |  Y  |
+---------------------------------------+-----+-----+-----+-----+
|     Transparent to chain changes      |  N  |  Y  |  Y  |  Y  |
+----------------+----------------------+-----+-----+-----+-----+
|                |   DA modification    |  Y  |  Y  |  Y  | NAT |
|                |                      |     |     |     |     |
|                | Payload modification |  Y  |  Y  |  Y  |  Y  |
|                |                      |     |     |     |     |
|Service support |  Packet generation   |  Y  |  Y  |cache|cache|
|                |                      |     |     |     |     |
|                |   Packet deletion    |  Y  |  Y  |  Y  |  Y  |
|                |                      |     |     |     |     |
|                |  Packet re-ordering  |  Y  |  Y  |  Y  |  Y  |
|                |                      |     |     |     |     |
|                |  Transport endpoint  |  Y  |  Y  |cache|cache|
+----------------+----------------------+-----+-----+-----+-----+
|                |       Ethernet       |  Y  |  Y  |  Y  |  -  |
|   Supported    |                      |     |     |     |     |
|    traffic     |         IPv4         |  Y  |  Y  |  Y  |  -  |
|                |                      |     |     |     |     |
|                |         IPv6         |  Y  |  Y  |  Y  |  Y  |
+----------------+----------------------+-----+-----+-----+-----+
]]></artwork></figure>

<t>Note: The use of a shared memory proxy requires both the service (VNF) and the proxy to be running on the same node.</t>

<section anchor="sec-proxies-static"><name>Static SR Proxy</name>

<t>The static proxy is an SR endpoint behavior for processing SR-MPLS or SRv6 encapsulated traffic on behalf of an SR-unaware service.  This proxy thus receives SR traffic that is formed of an MPLS label stack or an IPv6 header on top of an inner packet, which can be Ethernet, IPv4 or IPv6.</t>

<t>A static SR proxy segment is associated with the following mandatory parameters</t>

<t><list style="symbols">
  <t>INNER-TYPE: Inner packet type</t>
  <t>NH-ADDR: Next hop Ethernet address (only for inner type IPv4 and IPv6)</t>
  <t>IFACE-OUT: Local interface for sending traffic towards the service</t>
  <t>IFACE-IN: Local interface receiving the traffic coming back from the service</t>
  <t>CACHE: SR information to be attached on the traffic coming back from the service, including at least
  <list style="symbols">
      <t>CACHE.SA: IPv6 source address (SRv6 only)</t>
      <t>CACHE.LIST: Segment list expressed as MPLS labels or IPv6 address</t>
    </list></t>
</list></t>

<t>A static SR proxy segment is thus defined for a specific service, inner packet type and cached SR information.  It is also bound to a pair of directed interfaces on the proxy.  These may be both directions of a single interface, or opposite directions of two different interfaces. The latter is recommended in case the service is to be used as part of a bi-directional SR service policy.  If the proxy and the service both support 802.1Q, IFACE-OUT and IFACE-IN can also represent sub-interfaces.</t>

<t>The first part of this behavior is triggered when the proxy node receives a packet whose active segment matches a segment associated with the static proxy behavior.  It removes the SR information from the packet then sends it on a specific interface towards the associated service.  This SR information corresponds to the full label stack for SR-MPLS or to the encapsulation IPv6 header with any attached extension header in the case of SRv6.</t>

<t>The second part is an inbound policy attached to the proxy interface receiving the traffic returning from the service, IFACE-IN.  This policy attaches to the incoming traffic the cached SR information associated with the SR proxy segment.  If the proxy segment uses the SR-MPLS data plane, CACHE contains a stack of labels to be pushed on top of the packets.  With the SRv6 data plane, CACHE is defined as a source address, an active segment and an optional SRH (tag, segments left, segment list and metadata).  The proxy encapsulates the packets with an IPv6 header that has the source address, the active segment as destination address and the SRH as a routing extension header.  After the SR information has been attached, the packets are forwarded according to the active segment, which is represented by the top MPLS label or the IPv6 Destination Address. An MPLS TTL or IPv6 Hop Limit value may also be configured in CACHE. If it is not, the proxy should set these values according to the node&#39;s default setting for MPLS or IPv6 encapsulation.</t>

<t>In this scenario, there are no restrictions on the operations that can be performed by the service on the stream of packets.  It may operate at all protocol layers, terminate transport layer connections, generate new packets and initiate transport layer connections.  This behavior may also be used to integrate an IPv4-only service into an SRv6 policy.  However, a static SR proxy segment can be used in only one service policy at a time.  As opposed to most other segment types, a static SR proxy segment is bound to a unique list of segments, which represents a directed SR service policy.  This is due to the cached SR information being defined in the segment configuration.  This limitation only prevents multiple segment lists from using the same static SR proxy segment at the same time, but a single segment list can be shared by any number of traffic flows.  Besides, since the returning traffic from the service is re-classified based on the incoming interface, an interface can be used as receiving interface (IFACE-IN) only for a single SR proxy segment at a time.  In the case of a bi-directional SR service policy, a different SR proxy segment and receiving interface are required for the return direction.</t>

<t>The static proxy behavior may also be used for sending traffic through &quot;bump in the wire&quot; services that are transparent to the IP and Ethernet layers. This type of processing is assumed when the inner traffic type is Ethernet, since the original destination address of the Ethernet frame is preserved when the packet is steered into the SR Policy and likely associated with a node downstream of the policy tail-end. In case the inner type is IP (IPv4 or IPv6), the NH-ADDR parameter may be set to a dummy or broadcast Ethernet address, or simply to the address of the proxy receiving interface (IFACE-IN).</t>

<section anchor="sec-proxies-static-mpls"><name>SR-MPLS Pseudocode</name>

<section anchor="static-proxy-for-inner-type-ethernet"><name>Static Proxy for Inner Type Ethernet</name>

<t>When processing an MPLS packet whose top label matches a locally instantiated
MPLS static proxy SID for Ethernet traffic, the following pseudocode is
executed.</t>

<figure title="SID processing for MPLS static proxy
(Ethernet)" anchor="code-static-mpls-eth-sid"><artwork><![CDATA[
S01. POP all labels in the MPLS label stack.
S02. Submit the frame to the Ethernet module for transmission via
     interface IFACE-OUT.
]]></artwork></figure>

<t>When processing an Ethernet frame received on the interface IFACE-IN and with a
destination MAC address that is neither a broadcast address nor matches the
address of IFACE-IN, the following pseudocode is executed.</t>

<figure title="Inbound policy for MPLS static proxy
(Ethernet)" anchor="code-static-mpls-eth-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Remove the preamble or Frame Check Sequence (FCS).
S04.   PUSH all labels from the retrieved CACHE entry.
S05.   Submit the packet to the MPLS module for transmission as per
       the top label in the MPLS label stack.
S06. }
]]></artwork></figure>

</section>
<section anchor="static-proxy-for-inner-type-ipv4"><name>Static Proxy for Inner Type IPv4</name>

<t>When processing an MPLS packet whose top label matches a locally instantiated
MPLS static proxy SID for IPv4 traffic, the following pseudocode is
executed.</t>

<figure title="SID processing for MPLS static proxy
(IPv4)" anchor="code-static-mpls-ipv4-sid"><artwork><![CDATA[
S01. POP all labels in the MPLS label stack.
S02. Submit the packet to the IPv4 module for transmission on
     interface IFACE-OUT via NH-ADDR.
]]></artwork></figure>

<t>When processing an IPv4 packet received on the interface IFACE-IN and with a
destination address that does not match any address of IFACE-IN, the following
pseudocode is executed.</t>

<figure title="Inbound policy for MPLS static proxy
(IPv4)" anchor="code-static-mpls-ipv4-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Decrement the TTL and adjust the checksum accordingly.
S04.   PUSH all labels from the retrieved CACHE entry.
S05.   Submit the packet to the MPLS module for transmission as per
       the top label in the MPLS label stack.
S06. }
]]></artwork></figure>

</section>
<section anchor="static-proxy-for-inner-type-ipv6"><name>Static Proxy for Inner Type IPv6</name>

<t>When processing an MPLS packet whose top label matches a locally instantiated
MPLS static proxy SID for IPv6 traffic, the following pseudocode is
executed.</t>

<figure title="SID processing for MPLS static proxy
(IPv6)" anchor="code-static-mpls-ipv6-sid"><artwork><![CDATA[
S01. POP all labels in the MPLS label stack.
S02. Submit the packet to the IPv6 module for transmission on
     interface IFACE-OUT via NH-ADDR.
]]></artwork></figure>

<t>When processing an IPv6 packet received on the interface IFACE-IN and with a
destination address that does not match any address of IFACE-IN, the following
pseudocode is executed.</t>

<figure title="Inbound policy for MPLS static proxy
(IPv6)" anchor="code-static-mpls-ipv6-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Decrement the Hop Limit.
S04.   PUSH all labels from the retrieved CACHE entry.
S05.   Submit the packet to the MPLS module for transmission as per
       the top label in the MPLS label stack.
S06. }
]]></artwork></figure>

</section>
</section>
<section anchor="sec-proxies-static-srv6"><name>SRv6 Pseudocode</name>

<section anchor="static-proxy-for-inner-type-ethernet-1"><name>Static Proxy for Inner Type Ethernet</name>

<t>When processing an IPv6 packet matching a FIB entry locally instantiated as an
SRv6 static proxy SID for Ethernet traffic, the following pseudocode is
executed.</t>

<figure title="SID processing for SRv6 static proxy
(Ethernet)" anchor="code-static-srv6-eth-sid"><artwork><![CDATA[
S01. When an SRH is processed {
S02.   If (Segments Left == 0) {
S03.     Proceed to process the next header in the packet.
S04.   }
S05.   If (IPv6 Hop Limit <= 1) {
S06.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S07.   }
S08.   max_last_entry = (Hdr Ext Len / 2) - 1
S09.   If ((Last Entry > max_last_entry) or
           (Segments Left > (Last Entry + 1))) {
S10.     Send an ICMP Parameter Problem message to the Source Address,
         Code 0 (Erroneous header field encountered),
         Pointer set to the Segments Left field,
         Interrupt packet processing and discard the packet.
S11.   }
S12.   Decrement Hop Limit by 1.
S13.   Decrement Segments Left by 1.
S14.   Copy Segment List[Segments Left] from the SRH to the
       Destination Address of the IPv6 header.
S15.   If (Upper-layer header type != 143 (Ethernet)) {
S16.     Resubmit the packet to the IPv6 module for transmission to
         the new destination.
S17.   }
S18.   Perform IPv6 decapsulation.
S19.   Submit the frame to the Ethernet module for transmission via
       interface IFACE-OUT.
S20. }
]]></artwork></figure>

<t>S15: 143 (Ethernet) refers to the value assigned by IANA for &quot;Ethernet&quot; in the
&quot;Internet Protocol Numbers&quot; registry.</t>

<t>When processing the Upper-layer header of a packet matching a FIB entry locally
instantiated as an SRv6 static proxy SID for Ethernet traffic, the following
pseudocode is executed.</t>

<figure title="Upper-layer header processing for SRv6
static proxy (Ethernet)" anchor="code-static-srv6-eth-ulh"><artwork><![CDATA[
S01. If (Upper-layer header type != 143 (Ethernet)) {
S02.   Process as per [RFC8986] Section 4.1.1
S03. }
S04. Perform IPv6 decapsulation.
S05. Submit the frame to the Ethernet module for transmission via
     interface IFACE-OUT.
]]></artwork></figure>

<t>When processing an Ethernet frame received on the interface IFACE-IN and with a
destination MAC address that is neither a broadcast address nor matches the
address of IFACE-IN, the following pseudocode is executed.</t>

<figure title="Inbound policy for SRv6 static proxy
(Ethernet)" anchor="code-static-srv6-eth-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Remove the preamble or Frame Check Sequence (FCS).
S04.   Perform IPv6 encapsulation with an SRH
         Source Address of the IPv6 header is set to CACHE.SA,
         Destination Address of the IPv6 header is set to
         CACHE.LIST[0],
         Next Header of the SRH is set to 143 (Ethernet),
         Segment List of the SRH is set to CACHE.LIST.
S05.   Submit the packet to the IPv6 module for transmission to the
       next destination.
S06. }
]]></artwork></figure>

<t>S04: CACHE.LIST[0] represents the first entry in CACHE.LIST. Unless a local
configuration indicates otherwise, the SIDs in CACHE.LIST should be encoded
in the Segment List field in reversed order, the Segment Left and Last Entry
values should be set of the length of CACHE.LIST minus 1. If CACHE.LIST contains
a single entry, the SRH can be omitted and the Next Header field of the IPv6
header set to 143 (Ethernet).</t>

</section>
<section anchor="static-proxy-for-inner-type-ipv4-1"><name>Static Proxy for Inner Type IPv4</name>

<t>When processing an IPv6 packet matching a FIB entry locally instantiated as an
SRv6 static proxy SID for IPv4 traffic, the following pseudocode is executed.</t>

<figure title="SID processing for SRv6 static proxy
(IPv4)" anchor="code-static-srv6-ipv4-sid"><artwork><![CDATA[
S01. When an SRH is processed {
S02.   If (Segments Left == 0) {
S03.     Proceed to process the next header in the packet.
S04.   }
S05.   If (IPv6 Hop Limit <= 1) {
S06.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S07.   }
S08.   max_last_entry = (Hdr Ext Len / 2) - 1
S09.   If ((Last Entry > max_last_entry) or
           (Segments Left > (Last Entry + 1))) {
S10.     Send an ICMP Parameter Problem message to the Source Address,
         Code 0 (Erroneous header field encountered),
         Pointer set to the Segments Left field,
         Interrupt packet processing and discard the packet.
S11.   }
S12.   Decrement Hop Limit by 1.
S13.   Decrement Segments Left by 1.
S14.   Copy Segment List[Segments Left] from the SRH to the
       Destination Address of the IPv6 header.
S15.   If (Upper-layer header type != 4 (IPv4)) {
S16.     Resubmit the packet to the IPv6 module for transmission to
         the new destination.
S17.   }
S18.   Perform IPv6 decapsulation.
S19.   Submit the packet to the IPv4 module for transmission on
       interface IFACE-OUT via NH-ADDR.
S20. }
]]></artwork></figure>

<t>When processing the Upper-layer header of a packet matching a FIB entry locally
instantiated as an SRv6 static proxy SID for IPv4 traffic, the following
pseudocode is executed.</t>

<figure title="Upper-layer header processing for SRv6
static proxy (IPv4)" anchor="code-static-srv6-ipv4-ulh"><artwork><![CDATA[
S01. If (Upper-layer header type != 4 (IPv4)) {
S02.   Process as per [RFC8986] Section 4.1.1
S03. }
S04. Perform IPv6 decapsulation.
S05. Submit the packet to the IPv4 module for transmission on
     interface IFACE-OUT via NH-ADDR.
]]></artwork></figure>

<t>When processing an IPv4 packet received on the interface IFACE-IN and with a
destination address that does not match any address of IFACE-IN, the following
pseudocode is executed.</t>

<figure title="Inbound policy for SRv6 static proxy
(IPv4)" anchor="code-static-srv6-ipv4-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Decrement the TTL and adjust the checksum accordingly.
S04.   Perform IPv6 encapsulation with an SRH
         Source Address of the IPv6 header is set to CACHE.SA,
         Destination Address of the IPv6 header is set to
         CACHE.LIST[0],
         Next Header of the SRH is set to 4 (IPv4),
         Segment List of the SRH is set to CACHE.LIST.
S05.   Submit the packet to the IPv6 module for transmission to the
       next destination.
S06. }
]]></artwork></figure>

<t>S04: CACHE.LIST[0] represents the first entry in CACHE.LIST. Unless a local
configuration indicates otherwise, the SIDs in CACHE.LIST should be encoded
in the Segment List field in reversed order, the Segment Left and Last Entry
values should be set of the length of CACHE.LIST minus 1. If CACHE.LIST contains
a single entry, the SRH can be omitted and the Next Header field of the IPv6
header set to 4 (IPv4).</t>

</section>
<section anchor="static-proxy-for-inner-type-ipv6-1"><name>Static Proxy for Inner Type IPv6</name>

<t>When processing an IPv6 packet matching a FIB entry locally instantiated as an
SRv6 static proxy SID for IPv6 traffic, the following pseudocode is executed.</t>

<figure title="SID processing for SRv6 static proxy
(IPv6)" anchor="code-static-srv6-ipv6-sid"><artwork><![CDATA[
S01. When an SRH is processed {
S02.   If (Segments Left == 0) {
S03.     Proceed to process the next header in the packet.
S04.   }
S05.   If (IPv6 Hop Limit <= 1) {
S06.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S07.   }
S08.   max_last_entry = (Hdr Ext Len / 2) - 1
S09.   If ((Last Entry > max_last_entry) or
           (Segments Left > (Last Entry + 1))) {
S10.     Send an ICMP Parameter Problem message to the Source Address,
         Code 0 (Erroneous header field encountered),
         Pointer set to the Segments Left field,
         Interrupt packet processing and discard the packet.
S11.   }
S12.   Decrement Hop Limit by 1.
S13.   Decrement Segments Left by 1.
S14.   Copy Segment List[Segments Left] from the SRH to the
       Destination Address of the IPv6 header.
S15.   If (Upper-layer header type != 41 (IPv6)) {
S16.     Resubmit the packet to the IPv6 module for transmission to
         the new destination.
S17.   }
S18.   Perform IPv6 decapsulation.
S19.   Submit the packet to the IPv6 module for transmission on
       interface IFACE-OUT via NH-ADDR.
S20. }
]]></artwork></figure>

<t>When processing the Upper-layer header of a packet matching a FIB entry locally
instantiated as an SRv6 static proxy SID for IPv6 traffic, the following
pseudocode is executed.</t>

<figure title="Upper-layer header processing for SRv6
static proxy (IPv6)" anchor="code-static-srv6-ipv6-ulh"><artwork><![CDATA[
S01. If (Upper-layer header type != 41 (IPv6)) {
S02.   Process as per [RFC8986] Section 4.1.1
S03. }
S04. Perform IPv6 decapsulation.
S05. Submit the packet to the IPv6 module for transmission on
     interface IFACE-OUT via NH-ADDR.
]]></artwork></figure>

<t>When processing an IPv6 packet received on the interface IFACE-IN and with a
destination address that does not match any address of IFACE-IN, the following
pseudocode is executed.</t>

<figure title="Inbound policy for SRv6 static proxy
(IPv6)" anchor="code-static-srv6-ipv6-inbound"><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   Decrement the Hop Limit.
S04.   Perform IPv6 encapsulation with an SRH
         Source Address of the IPv6 header is set to CACHE.SA,
         Destination Address of the IPv6 header is set to
         CACHE.LIST[0],
         Next Header of the SRH is set to 41 (IPv6),
         Segment List of the SRH is set to CACHE.LIST.
S05.   Submit the packet to the IPv6 module for transmission to the
       next destination.
S06. }
]]></artwork></figure>

<t>S04: CACHE.LIST[0] represents the first entry in CACHE.LIST. Unless a local
configuration indicates otherwise, the SIDs in CACHE.LIST should be encoded
in the Segment List field in reversed order, the Segment Left and Last Entry
values should be set of the length of CACHE.LIST minus 1. If CACHE.LIST contains
a single entry, the SRH can be omitted and the Next Header field of the (outer)
IPv6 header set to 41 (IPv6).</t>

</section>
</section>
</section>
<section anchor="sec-proxies-dynamic"><name>Dynamic SR Proxy</name>

<t>The dynamic proxy is an improvement over the static proxy that dynamically learns the SR information before removing it from the incoming traffic.  The same information can then be re-attached to the traffic returning from the service.  As opposed to the static SR proxy, no CACHE information needs to be configured.  Instead, the dynamic SR proxy relies on a local caching mechanism on the node instantiating this segment.</t>

<t>Upon receiving a packet whose active segment matches a dynamic SR proxy function, the proxy node pops the top MPLS label or applies the SRv6 End behavior, then compares the updated SR information with the cache entry for the current segment.  If the cache is empty or different, it is updated with the new SR information.  The SR information is then removed and the inner packet is sent towards the service.</t>

<t>The cache entry is not mapped to any particular packet, but instead to an SR service policy identified by the receiving interface (IFACE-IN). Any non-link-local IP packet or non-local Ethernet frame received on that interface will be re-encapsulated with the cached headers as described in <xref target="sec-proxies-static"/>.  The service may thus drop, modify or generate new packets without affecting the proxy.</t>

<section anchor="sr-mpls-pseudocode"><name>SR-MPLS Pseudocode</name>

<t>The dynamic proxy SR-MPLS pseudocode is obtained by inserting the following instructions at the beginning of the static SR-MPLS pseudocode (<xref target="sec-proxies-static-mpls"/>).</t>

<figure title="SID processing for MPLS dynamic proxy" anchor="code-dynamic-mpls-sid"><artwork><![CDATA[
S01. If the top label S bit is different from 0 {
S02.   Discard the packet.
S03. }
S04. POP the top label.
S05. Copy the MPLS label stack in a CACHE entry associated with the
     interface IFACE-IN.
]]></artwork></figure>

<t>S01: As mentioned at the beginning of <xref target="sec-proxies"/>, an SR proxy is not needed to include an SR-unaware service at the end of an SR policy.</t>

<t>S05: An implementation may optimize the caching procedure by copying information
into the cache only if it is different from the current content of the cache
entry. Furthermore, a TTL margin can be configured for the top label stack entry
to prevent constant cache updates when multiple equal-cost paths with different
hop counts are used towards the SR proxy node.  In that case, a TTL difference
smaller than the configured margin should not trigger a cache update (provided
that the labels are the same).</t>

<t>When processing an Ethernet frame, an IPv4 packet or an IPv6 packet received on
the interface IFACE-IN and with a destination address that does not match any
address of IFACE-IN, the pseudocode reported in
<xref target="code-static-mpls-eth-inbound"/>, <xref target="code-static-mpls-ipv4-inbound"/> or
<xref target="code-static-mpls-ipv6-inbound"/>, respectively, is executed.</t>

</section>
<section anchor="srv6-pseudocode"><name>SRv6 Pseudocode</name>

<t>When processing an IPv6 packet matching a FIB entry locally instantiated as an
SRv6 dynamic proxy SID, the same pseudocode as described in
<xref target="code-static-srv6-eth-sid"/>, <xref target="code-static-srv6-ipv4-sid"/> and
<xref target="code-static-srv6-ipv6-sid"/>, respectively for Ethernet, IPv4 and IPv6 traffic,
is executed with the following addition between lines S17 and S18.</t>

<figure title="SID processing for SRv6 dynamic proxy" anchor="code-dynamic-srv6-sid"><artwork><![CDATA[
(... S17.     })
S17.1.   Copy the IPv6 encapsulation in a CACHE entry associated with
         the interface IFACE-IN.
(S18.     Perform IPv6 decapsulation...)
]]></artwork></figure>

<t>An implementation may optimize the caching procedure by copying information into
the cache only if it is different from the current content of the cache entry.
A Hop Limit margin can be configured to prevent constant cache updates when
multiple equal-cost paths with different hop counts are used towards the SR
proxy node.  In that case, a Hop Limit difference smaller than the configured
margin should not trigger a cache update. Similarly, the Flow Label value can be
ignored when comparing the current packet IPv6 header with the cache entry. In
this case, the Flow Label should be re-computed by the proxy node when it
restores the IPv6 encapsulation from the cache entry.</t>

<t>When processing the Upper-layer header of a packet matching a FIB entry locally
instantiated as an SRv6 dynamic proxy SID, process the packet as per
<xref target="RFC8986"/> Section 4.1.1.</t>

<t>When processing an Ethernet frame, an IPv4 packet or an IPv6 packet received on
the interface IFACE-IN and with a destination address that does not match any
address of IFACE-IN, the same pseudocode as in <xref target="code-static-srv6-eth-inbound"/>,
<xref target="code-static-srv6-ipv4-inbound"/> or <xref target="code-static-srv6-ipv6-inbound"/>,
respectively, is executed.</t>

</section>
</section>
<section anchor="shared-memory-sr-proxy"><name>Shared Memory SR Proxy</name>

<t>The shared memory proxy is an SR endpoint behavior for processing SR-MPLS or SRv6 encapsulated traffic on behalf of an SR-unaware service. This proxy behavior leverages a shared-memory interface with a virtualized service (VNF) in order to hide the SR information from an SR-unaware service while keeping it attached to the packet.  We assume in this case that the proxy and the VNF are running on the same compute node.  A typical scenario is an SR-capable vrouter running on a container host and forwarding traffic to VNFs isolated within their respective container.</t>

</section>
<section anchor="masquerading-sr-proxy"><name>Masquerading SR Proxy</name>

<t>The masquerading proxy is an SR endpoint behavior for processing SRv6 traffic on behalf of an SR-unaware service.  This proxy thus receives SR traffic that is formed of an IPv6 header and an SRH on top of an inner payload.  The masquerading behavior is independent from the inner payload type.  Hence, the inner payload can be of any type but it is usually expected to be a transport layer packet, such as TCP or UDP.</t>

<t>A masquerading SR proxy segment is associated with the following mandatory parameters:</t>

<t><list style="symbols">
  <t>NH-ADDR: Next hop Ethernet address</t>
  <t>IFACE-OUT: Local interface for sending traffic towards the service</t>
  <t>IFACE-IN: Local interface receiving the traffic coming back from the service</t>
</list></t>

<t>A masquerading SR proxy segment is thus defined for a specific service and bound to a pair of directed interfaces or sub-interfaces on the proxy.  As opposed to the static and dynamic SR proxies, a masquerading segment can be present at the same time in any number of SR service policies and the same interfaces can be bound to multiple masquerading proxy segments.  The only restriction is that a masquerading proxy segment cannot be the last segment in an SR service policy.</t>

<t>The first part of the masquerading behavior is triggered when the proxy node receives an IPv6 packet whose Destination Address matches a masquerading proxy SID.  The proxy inspects the IPv6 extension headers and substitutes the Destination Address with the last SID in the SRH attached to the IPv6 header, which represents the final destination of the IPv6 packet.  The packet is then sent out towards the service.</t>

<t>The service receives an IPv6 packet whose source and destination addresses are respectively the original source and final destination.  It does not attempt to inspect the SRH, as RFC8200 specifies that routing extension headers are not examined or processed by transit nodes. Instead, the service simply forwards the packet based on its current Destination Address.  In this scenario, we assume that the service can only inspect, drop or perform limited changes to the packets.  For example, Intrusion Detection Systems, Deep Packet Inspectors and non-NAT Firewalls are among the services that can be supported by a masquerading SR proxy.  Flavors of the masquerading behavior are defined in <xref target="sec-proxies-am-nat"/> and <xref target="sec-proxies-am-cache"/> to support a wider range of services.</t>

<t>The second part of the masquerading behavior, also called de-masquerading, is an inbound policy attached to the proxy interface receiving the traffic returning from the service, IFACE-IN.  This policy inspects the incoming traffic and triggers a regular SRv6 endpoint processing (End) on any IPv6 packet that contains an SRH.  This processing occurs before any lookup on the packet Destination Address is performed and it is sufficient to restore the right active SID as the Destination Address of the IPv6 packet.</t>

<section anchor="srv6-masquerading-proxy-pseudocode"><name>SRv6 Masquerading Proxy Pseudocode</name>

<t>Masquerading: When processing an IPv6 packet matching a FIB entry locally
instantiated as an SRv6 masquerading proxy SID, the following pseudocode is
executed.</t>

<figure title="SID processing for SRv6 masquerading proxy" anchor="code-masquerading-sid"><artwork><![CDATA[
S01. When an SRH is processed {
S02.   If (Segments Left == 0) {
S03.     Proceed to process the next header in the packet.
S04.   }
S05.   If (IPv6 Hop Limit <= 1) {
S06.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S07.   }
S08.   max_last_entry = (Hdr Ext Len / 2) - 1
S09.   If ((Last Entry > max_last_entry) or
           (Segments Left > (Last Entry + 1))) {
S10.     Send an ICMP Parameter Problem message to the Source Address,
         Code 0 (Erroneous header field encountered),
         Pointer set to the Segments Left field,
         Interrupt packet processing and discard the packet.
S11.   }
S12.   Decrement Hop Limit by 1.
S13.   Decrement Segments Left by 1.
S14.   Copy Segment List[0] from the SRH to the Destination Address
       of the IPv6 header.
S15.   Submit the packet to the IPv6 module for transmission on
       interface IFACE-OUT via NH-ADDR.
S16. }
]]></artwork></figure>

<t>When processing the Upper-layer header of a packet matching a FIB entry locally
instantiated as an SRv6 masquerading proxy SID, process the packet as per
<xref target="RFC8986"/> Section 4.1.1.</t>

<t>De-masquerading: When processing an IPv6 packet received on the interface
IFACE-IN and with a destination address that does not match any address of
IFACE-IN, the following pseudocode is executed.</t>

<figure title="Inbound policy for SRv6 masquerading proxy" anchor="code-masquerading-inbound"><artwork><![CDATA[
S01. When an SRH is processed {
S02.   If (IPv6 Hop Limit <= 1) {
S03.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S04.   }
S05.   If (Segments Left != 0) {
S06.     max_last_entry = (Hdr Ext Len / 2) - 1
S07.     If ((Last Entry > max_last_entry) or
             (Segments Left > Last Entry)) {
S08.       Send an ICMP Parameter Problem message to the Source Address,
           Code 0 (Erroneous header field encountered),
           Pointer set to the Segments Left field,
           Interrupt packet processing and discard the packet.
S09.     }
S10.     Copy Segment List[Segments Left] from the SRH to the
         Destination Address of the IPv6 header.
S11.   }
S12.   Decrement Hop Limit by 1.
S13.   Submit the packet to the IPv6 module for transmission to the
       next destination.
S14. }
]]></artwork></figure>

</section>
<section anchor="sec-proxies-am-nat"><name>Destination NAT Flavor</name>

<t>Services modifying the destination address in the packets they process, such as
NATs, can be supported by reporting the updated Destination Address back into
the Segment List field of the SRH.</t>

<t>The Destination NAT flavor of the SRv6 masquerading proxy is enabled by adding
the following instruction between lines S09 and S10 of the de-masquerading
pseudocode in <xref target="code-masquerading-inbound"/>.</t>

<figure><artwork><![CDATA[
(... S09.     })
S09.1.   Copy the Destination Address of the IPv6 header to the
         Segment List[0] entry of the SRH.
(S10.     Copy Segment List[Segments Left] from the SRH to the
          Destination Address of the IPv6 header...)
]]></artwork></figure>

</section>
<section anchor="sec-proxies-am-cache"><name>Caching Flavor</name>

<t>Services generating packets or acting as endpoints for transport connections can be supported by adding a dynamic caching mechanism similar to the one described in <xref target="sec-proxies-dynamic"/>.</t>

<t>The caching flavor of the SRv6 masquerading proxy is enabled by:</t>

<t><list style="symbols">
  <t>Adding the following instruction between lines S14 and S15 of the masquerading
pseudocode in <xref target="code-masquerading-sid"/>.</t>
</list></t>

<figure><artwork><![CDATA[
(... S14.   Copy Segment List[0] from the SRH to the Destination
            Address of the IPv6 header.
S14.1. Copy the IPv6 encapsulation in a CACHE entry associated with
       the interface IFACE-IN.
(S15.   Submit the packet to the IPv6 module for transmission on
        interface IFACE-OUT via NH-ADDR.)
]]></artwork></figure>

<t><list style="symbols">
  <t>Updating the de-masquerading pseudocode such that, in addition to the SRH
processing in <xref target="code-masquerading-inbound"/>, the following pseudocode is
executed when processing an IPv6 packet (received on the interface IFACE-IN and
with a destination address that does not match any address of IFACE-IN) that
does not contain an SRH.</t>
</list></t>

<figure><artwork><![CDATA[
S01. Retrieve the CACHE entry associated with IFACE-IN.
S02. If the CACHE entry is not empty {
S03.   If (IPv6 Hop Limit <= 1) {
S04.     Send an ICMP Time Exceeded message to the Source Address,
         Code 0 (hop limit exceeded in transit),
         Interrupt packet processing and discard the packet.
S05.   }
S06.   Decrement Hop Limit by 1.
S07.   Update the IPv6 encapsulation according to the retrieved CACHE
       entry.
S08.   Submit the packet to the IPv6 module for transmission to the
       next destination.
S09. }
]]></artwork></figure>

</section>
</section>
</section>
<section anchor="metadata"><name>Metadata</name>

<section anchor="mpls-data-plane"><name>MPLS Data Plane</name>

<t>Metadata can be carried for SR-MPLS traffic in a Segment Routing Header inserted between the last MPLS label and the MPLS payload. When used solely as a metadata container, the SRH does not carry any segment but only the mandatory header fields, including the tag and flags, and any TLVs that is required for transporting the metadata.</t>

<t>Since the MPLS encapsulation has no explicit protocol identifier field to indicate the protocol type of the MPLS payload, how to indicate the presence of metadata in an MPLS packet is a potential issue to be addressed.  One possible solution is to add the indication about the presence of metadata in the semantic of the SIDs. Note that only the SIDs whose behavior involves looking at the metadata or the MPLS payload would need to include such semantic (e.g., service segments). Other segments, such as topological segments, are not affected by the presence of metadata.  Another, more generic, solution is to introduce a protocol identifier field within the MPLS packet as described in <xref target="I-D.xu-mpls-payload-protocol-identifier"/>.</t>

</section>
<section anchor="ipv6-data-plane"><name>IPv6 Data Plane</name>

<section anchor="srh-tlv-objects"><name>SRH TLV Objects</name>

<t>The IPv6 SRH TLV objects are designed to carry all sorts of metadata. TLV objects can be imposed by the ingress edge router that steers the traffic into the SR service policy.</t>

<t>An SR-aware service may impose, modify or remove any TLV object attached to the first SRH, either by directly modifying the packet headers or via a control channel between the service and its forwarding plane.</t>

<t>An SR-aware service that re-classifies the traffic and steers it into a new SR service policy (e.g.  DPI) may attach any TLV object to the new SRH.</t>

<t>Metadata imposition and handling will be further discussed in a future version of this document.</t>

<section anchor="opaque-metadata-tlv"><name>Opaque Metadata TLV</name>

<t>This document defines an SRv6 TLV called Opaque Metadata TLV. This is a fixed-length container to carry any type of Service Metadata. No assumption is made by this document on the structure or the content of the carried metadata. The Opaque Metadata TLV has the following format:</t>

<figure><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Type     |     Length    |                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+                               |
|                                                               |
|                       Service Metadata                        |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t>Type: to be assigned by IANA.</t>
  <t>Length: 14.</t>
  <t>Service Metadata: 14 octets of opaque data.</t>
</list></t>

</section>
<section anchor="nsh-carrier-tlv"><name>NSH Carrier TLV</name>

<t>This document defines an SRv6 TLV called NSH Carrier TLV. It is a container to carry Service Metadata in the form of Variable-Length Metadata as defined in <xref target="RFC8300"/> for NSH MD Type 2. The NSH Carrier TLV has the following format:</t>

<figure><artwork><![CDATA[
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      Type     |     Length    |     Flags     |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
//            Service Metadata                                 //
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
]]></artwork></figure>

<t>where:</t>

<t><list style="symbols">
  <t>Type: to be assigned by IANA.</t>
  <t>Length: the total length of the TLV.</t>
  <t>Flags: 8 bits.  No flags are defined in this document.  SHOULD be set to 0 on transmission and MUST be ignored on receipt.</t>
  <t>Service Metadata: a list of Service Metadata TLV as defined in <xref target="RFC8300"/> for NSH MD Type 2.</t>
</list></t>

</section>
</section>
<section anchor="srh-tag"><name>SRH Tag</name>

<t>The SRH tag identifies a packet as part of a group or class of packets <xref target="RFC8754"/>.</t>

<t>In the context of service programming, this field can be used to encode basic metadata in the SRH. An example use-case is to leverage the SRH tag to encode a policy ID. This policy ID can then be used by an SR-aware function to identify a particular processing policy to be applied on that packet.</t>

</section>
</section>
</section>
<section anchor="implementation-status"><name>Implementation Status</name>

<t>This section is to be removed prior to publishing as an RFC.</t>

<section anchor="sec-implem-aware"><name>SR-Aware Services</name>

<t>Specific SRv6 support has been implemented for the below open-source services:</t>

<t><list style="symbols">
  <t>Iptables (1.6.2 and later) <xref target="IPTABLES"/></t>
  <t>Nftables (0.8.4 and later) <xref target="NFTABLES"/></t>
  <t>Snort <xref target="SNORT"/></t>
</list></t>

<t>In addition, any service relying on the Linux kernel, version 4.10 and later, or FD.io VPP for packet forwarding can be considered as SR-aware.</t>

</section>
<section anchor="proxy-behaviors"><name>Proxy Behaviors</name>

<t>The static SR proxy is available for SR-MPLS and SRv6 on various Cisco hardware and software platforms.  Furthermore, the following proxies are available on open-source software.</t>

<figure title="Open-source implementation status table" anchor="tab-implem"><artwork><![CDATA[
                                        +-------------+-------------+
                                        |     VPP     |    Linux    |
+---+-----------------------------------+-------------+-------------+
| M |           Static proxy            |  Available  | In progress |
| P |                                   |             |             |
| L |           Dynamic proxy           | In progress | In progress |
| S |                                   |             |             |
|   |        Shared memory proxy        | In progress | In progress |
+---+-----------------------------------+-------------+-------------+
|   |           Static proxy            |  Available  | In progress |
| S |                                   |             |             |
| R |           Dynamic proxy           |  Available  |  Available  |
| v |                                   |             |             |
| 6 |        Shared memory proxy        | In progress | In progress |
|   |                                   |             |             |
|   |        Masquerading proxy         |  Available  |  Available  |
+---+-----------------------------------+-------------+-------------+
]]></artwork></figure>

</section>
</section>
<section anchor="related-works"><name>Related Works</name>

<t>The Segment Routing solution addresses a wide problem that covers both topological and service policies.  The topological and service instructions can be either deployed in isolation or in combination.  SR has thus a wider applicability than the architecture defined in <xref target="RFC7665"/>.  Furthermore, the inherent property of SR is a stateless network fabric.  In SR, there is no state within the fabric to recognize a flow and associate it with a policy.  State is only present at the ingress edge of the SR domain, where the policy is encoded into the packets.  This is completely different from other proposals such as <xref target="RFC8300"/> and the MPLS label swapping mechanism described in <xref target="RFC8595"/>, which rely on state configured at every hop of the service chain.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<section anchor="srv6-endpoint-behaviors"><name>SRv6 Endpoint Behaviors</name>

<t>This I-D requests the IANA to allocate, within the &quot;SRv6 Endpoint Behaviors&quot; sub-registry belonging to the top-level &quot;Segment-routing with IPv6 dataplane (SRv6) Parameters&quot; registry, the following allocations:</t>

<figure><artwork><![CDATA[
Value      Description                               Reference
--------------------------------------------------------------
TBA1-1     End.AN - SR-aware function (native)       [This.ID]
TBA1-2     End.AS - Static proxy                     [This.ID]
TBA1-3     End.AD - Dynamic proxy                    [This.ID]
TBA1-4     End.AM - Masquerading proxy               [This.ID]
TBA1-5     End.AM - Masquerading proxy with NAT      [This.ID]
TBA1-6     End.AM - Masquerading proxy with Caching  [This.ID]
TBA1-7     End.AM - Masquerading proxy with NAT &    [This.ID]
                    Caching
]]></artwork></figure>

</section>
<section anchor="segment-routing-header-tlvs"><name>Segment Routing Header TLVs</name>

<t>This I-D requests the IANA to allocate, within the &quot;Segment Routing Header TLVs&quot; registry, the following allocations:</t>

<figure><artwork><![CDATA[
Value      Description               Reference
----------------------------------------------
TBA2-1     Opaque Metadata TLV       [This.ID]
TBA2-2     NSH Carrier TLV           [This.ID]
]]></artwork></figure>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>The security requirements and mechanisms described in <xref target="RFC8402"/>, <xref target="RFC8754"/> and <xref target="RFC8986"/> also apply to this document.</t>

<t>This document does not introduce any new security vulnerabilities.</t>

</section>
<section anchor="acknowledgements"><name>Acknowledgements</name>

<t>The authors would like to thank Thierry Couture, Ketan Talaulikar, Loa Andersson, Andrew G.  Malis, Adrian Farrel, Alexander Vainshtein and Joel M.  Halpern for their valuable comments and suggestions on the document.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC8402;
&RFC8660;
&RFC8754;
&RFC8986;
&RFC9256;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&I-D.dawra-idr-bgp-sr-service-chaining;
&I-D.xu-mpls-payload-protocol-identifier;
&RFC7665;
&RFC8300;
&RFC8595;
<reference anchor="IFIP18" >
  <front>
    <title>SEgment Routing Aware Firewall For Service Function Chaining scenarios</title>
    <author initials="A." surname="Abdelsalam">
      <organization></organization>
    </author>
    <author initials="S." surname="Salsano">
      <organization></organization>
    </author>
    <author initials="F." surname="Clad">
      <organization></organization>
    </author>
    <author initials="P." surname="Camarillo">
      <organization></organization>
    </author>
    <author initials="C." surname="Filsfils">
      <organization></organization>
    </author>
    <date year="2018" month="May"/>
  </front>
  <seriesInfo name="IFIP Networking conference" value=""/>
</reference>
<reference anchor="IPTABLES" target="https://netfilter.org/projects/iptables/files/changes-iptables-1.6.2.txt">
  <front>
    <title>iptables-1.6.2 changes</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018" month="February"/>
  </front>
</reference>
<reference anchor="NFTABLES" target="https://netfilter.org/projects/nftables/files/changes-nftables-0.8.4.txt">
  <front>
    <title>nftables-0.8.4 changes</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018" month="May"/>
  </front>
</reference>
<reference anchor="SNORT" target="https://github.com/SRouting/SR-Snort">
  <front>
    <title>SR-Snort</title>
    <author >
      <organization></organization>
    </author>
    <date year="2018" month="March"/>
  </front>
</reference>


    </references>

</references>


    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
        <name>Contributors</name>
    <contact initials="F." surname="Clad" fullname="Francois Clad">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>France</country>
        </postal>
        <email>fclad.ietf@gmail.com</email>
      </address>
    </contact>
    <contact initials="P." surname="Camarillo" fullname="Pablo Camarillo">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>Spain</country>
        </postal>
        <email>pcamaril@cisco.com</email>
      </address>
    </contact>
    <contact initials="B." surname="Peirens" fullname="Bart Peirens">
      <organization>Proximus</organization>
      <address>
        <postal>
          <country>Belgium</country>
        </postal>
        <email>bart.peirens@proximus.com</email>
      </address>
    </contact>
    <contact initials="D." surname="Steinberg" fullname="Dirk Steinberg">
      <organization>Lapishills Consulting Limited</organization>
      <address>
        <postal>
          <country>Cyprus</country>
        </postal>
        <email>dirk@lapishills.com</email>
      </address>
    </contact>
    <contact initials="G." surname="Dawra" fullname="Gaurav Dawra">
      <organization>LinkedIn</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>gdawra@linkedin.com</email>
      </address>
    </contact>
    <contact initials="S." surname="Bryant" fullname="Stewart Bryant">
      <organization>Futurewei Technologies Inc</organization>
      <address>
        <email>stewart.bryant@gmail.com</email>
      </address>
    </contact>
    <contact initials="H." surname="Assarpour" fullname="Hamid Assarpour">
      <organization>Broadcom</organization>
      <address>
        <email>hamid.assarpour@broadcom.com</email>
      </address>
    </contact>
    <contact initials="H." surname="Shah" fullname="Himanshu Shah">
      <organization>Ciena</organization>
      <address>
        <email>hshah@ciena.com</email>
      </address>
    </contact>
    <contact initials="L. M." surname="Contreras" fullname="Luis M. Contreras">
      <organization>Telefonica I+D</organization>
      <address>
        <postal>
          <country>Spain</country>
        </postal>
        <email>luismiguel.contrerasmurillo@telefonica.com</email>
      </address>
    </contact>
    <contact initials="J." surname="Tantsura" fullname="Jeff Tantsura">
      <organization>Individual</organization>
      <address>
        <email>jefftant@gmail.com</email>
      </address>
    </contact>
    <contact initials="M." surname="Vigoureux" fullname="Martin Vigoureux">
      <organization>Nokia</organization>
      <address>
        <email>martin.vigoureux@nokia.com</email>
      </address>
    </contact>
    <contact initials="J." surname="Bhattacharya" fullname="Jisu Bhattacharya">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>United States of America</country>
        </postal>
        <email>jisu@cisco.com</email>
      </address>
    </contact>
    </section>

  </back>

<!-- ##markdown-source:
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
Md5ucunDM00yUCVZOniPNduqY2POhJauJSAJYedcTcbmEfmUunC3aUcov5Vo
+5/i//4yNuDGDvBbMcpv9t83+++b/fd7sv/ucxrE78Ly+4gw2QZe64+1ADeI
l7UI7qXxsq9qiK3g/l/OCAtI7auYX792XNXRyafaYd/CrL9qmPWf3sjSvfnP
ZV5tGERexaa/2Va/OdtKaXVDq6o9xP/FrKrNYvzfrKpvVtU3q+qf16ra5a3y
+zSr1qcCfVmzal1OULu8bs8J+tpm1TL2/wXNqoDWfh276isnjzlC+Qx21bdc
si+ZS/bPbznp9vunM502SZVbxYq/mU6/rum0lQObKLY7PuU3iZYLGWnN1yWV
jOR2ayllNPILxGpJhyn8dcWMAP6VQuA+p2X2512TnZq4yFqrZUjJdaqnQYfj
Kqe4NWs2aIVuruPslcHw7kEuTK9ZY2J9FYmFk87ejPQYaRdPqkuFBW9svBRF
Cze4Q/d0erWsTCwVBEYO53oakC44oWogfLkiHl+mGke2pq5IHzr+6DQT1nOI
uXAlik7n9SzPvPOFm5Y+WQBKb8fwawPQ6DOs90+oXChboFe18NLKNRt6MFbq
s+Ml6bHWQa9no7haPKdtK23QMW5hEnoYd1gXdBJ2ofgGv4xykiQVvG7P/+ql
AjqeHQAV6oXSPxeLlEk1hkxmLwfQLRjUFKJ1oDO6C5We5MSwP59E9QG6Yo+O
8VMpK6AzEJSukBYeCk+YfiI97N88pq/3R7pSCGtOmEYHeH48z3ppkr3tMdHZ
y0MQdfQdPV6Z6BN7tYgAq2kq2y4oVxYu50g4UinVO/xLx1uqqH2wpfjddRlc
7qnIZ3J/AC12ay0GHBovAoBNj/qv3khEJZqWnbJtY3b6VqiQ5QPk24x0WCJT
2BGc8weXrqilnkWsJarHiZSXuwzZy8IoW21IkYt5tze0IXSz8j49jwa8Gdzp
eGKBO86IOGz1m3gWw8uzsFNRZcgMxy8WSsdhVdaVaqhVZRb16w0tBFkwzvff
4GhJsMCstezuI+un22TyjO9iWViuYD3wog7/Qg7Z03I5VuXdOtZ+sQz3j04f
d7OHVgUHjO5jqRd7ww1zIq5eUoGu/Q9jN5XUYh+aEd6SAtQ4hJVg6rM8rGOP
2jMXogIMiVaBaRCDz2jpxqnMajbUusMnQKLndYHsAS8Iw4ILGF6ZxsU4yVRn
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
YIf0sh6PMd8EFShxHjic/X8AO+vXCA4BAA==

-->

</rfc>

