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


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

<!ENTITY RFC8402 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8402.xml">
<!ENTITY RFC8660 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8660.xml">
<!ENTITY RFC8754 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8754.xml">
<!ENTITY RFC8986 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8986.xml">
<!ENTITY I-D.ietf-spring-segment-routing-policy SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-spring-segment-routing-policy.xml">
<!ENTITY I-D.dawra-idr-bgp-sr-service-chaining SYSTEM "https://xml2rfc.tools.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://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.xu-mpls-payload-protocol-identifier.xml">
<!ENTITY RFC7665 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7665.xml">
<!ENTITY RFC8300 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8300.xml">
<!ENTITY RFC8595 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8595.xml">
]>


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

    <author initials="F." surname="Clad" fullname="Francois Clad" role="editor">
      <organization>Cisco Systems, Inc.</organization>
      <address>
        <postal>
          <country>France</country>
        </postal>
        <email>fclad@cisco.com</email>
      </address>
    </author>
    <author initials="X." surname="Xu" fullname="Xiaohu Xu" role="editor">
      <organization>Alibaba</organization>
      <address>
        <email>xiaohu.xxh@alibaba-inc.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="2022" month="June" day="09"/>

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

    <abstract>


<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>


<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="I-D.ietf-spring-segment-routing-policy"/> 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="I-D.ietf-spring-segment-routing-policy"/>.  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="I-D.ietf-spring-segment-routing-policy"/> 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="I-D.ietf-spring-segment-routing-policy"/>, 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="I-D.ietf-spring-segment-routing-policy"/>, 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="I-D.ietf-spring-segment-routing-policy"/>.</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>
<section anchor="contributors"><name>Contributors</name>

<t>The following people have contributed to this document:</t>

<t>Pablo Camarillo<br />
Cisco Systems, Inc.<br />
Spain</t>

<t>Email: pcamaril@cisco.com</t>

<t>Bart Peirens<br />
Proximus<br />
Belgium</t>

<t>Email: bart.peirens@proximus.com</t>

<t>Dirk Steinberg<br />
Lapishills Consulting Limited<br />
Cyprus</t>

<t>Email: dirk@lapishills.com</t>

<t>Ahmed AbdelSalam<br />
Cisco Systems, Inc.<br />
Italy</t>

<t>Email: ahabdels@cisco.com</t>

<t>Gaurav Dawra<br />
LinkedIn<br />
United States of America</t>

<t>Email: gdawra@linkedin.com</t>

<t>Stewart Bryant<br />
Futurewei Technologies Inc</t>

<t>Email: stewart.bryant@gmail.com</t>

<t>Hamid Assarpour<br />
Broadcom</t>

<t>Email: hamid.assarpour@broadcom.com</t>

<t>Himanshu Shah<br />
Ciena</t>

<t>Email: hshah@ciena.com</t>

<t>Luis M. Contreras<br />
Telefonica I+D<br />
Spain</t>

<t>Email: luismiguel.contrerasmurillo@telefonica.com</t>

<t>Jeff Tantsura<br />
Individual</t>

<t>Email: jefftant@gmail.com</t>

<t>Martin Vigoureux<br />
Nokia</t>

<t>Email: martin.vigoureux@nokia.com</t>

<t>Jisu Bhattacharya<br />
Cisco Systems, Inc.<br />
United States of America</t>

<t>Email: jisu@cisco.com</t>

</section>


  </middle>

  <back>


    <references title='Normative References'>

&RFC8402;
&RFC8660;
&RFC8754;
&RFC8986;
&I-D.ietf-spring-segment-routing-policy;


    </references>

    <references title='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>



  </back>

<!-- ##markdown-source:
H4sIAJGooWIAA+19aXcbR5Lgd/yKGvm9WXINQKQs0zJ33E+UKJmcoWiuQKmn
X0/vvAKQBMoqVKHrIImWtG//xv69/SUbZx6FwkFddveI3abAQlZmZGRk3BnZ
6/U6VVKl5jAamOI6GZnoosgnRTybJdkkukmqKXwxmZmsil7mdQUPO+N8lMUz
eGNcxFdVLzHVVa+cF/BVryx6JXfTm7tuensHnXFcmcPOCH5P8mJxGJXVuNNJ
5sVhVBV1WT3Y2/tx70EnLkx8GP1sMlPEaecmL95MiryeA3AXL0/Pf+68MQt4
OD6MTrPKFJmpescIQ6czyscw0GFUl724HCVJZ54cRn+u8lE3KvOiKsxVCZ8W
M/zwl04nrqtpXhx2ol4nipKsPIye96OnaTyGP3luz4s4G+VJqU/zYhJnyd/i
Ksmzw+hpUo7yaLAoKzODjk+zUR/aFDni0YyTKi/gTzOLk/QwuhpBD49H+EZ/
lM/gi1FeZxUigQYxHhT/3o/+vbYw/HsS59Oan4TjH6XJMB7GK8e8pTf7t7fT
xzE37SUAIw1vB3vaj54naXkF/9khYbaFAZj8b7aZuow7umqf6BOTTpLaH/y4
Dw+LLDGFHfsYRjGp9zgcGPpIo6dxFo9jN+CY3ukP+Z3HQ2jTH8X+0PqGP+2z
xE14aoDO6UE43Ekd35jEmxo2TJP97x5P6ZsGMp/0o2MzKmIgXdv3k6LOcv9x
OMIvsPoT40YYYvP+WJo/zunrjSQz6EcvYjvkYBrnNybjR+FwLwA3cZbfugFn
ccnNH0/wwTJ5/Ckep/E8TlMfX3FSxdkiDr9skOflP196mFvs/fho/DiuquZk
Xg2OvAH/2I9OTDY2RTJ6c2sH/GMyCx+HQ53nbxKPHm6SWX9qWz/O8NvNxAg4
HMRpCdhxiKzMFfztPQ/HfZUl16YoARfROAHWOIuje5d5Eb020KyK7zmQSu6p
X3JPj+ssKaD5g35S+VCdVnG66HSyvJjBENfALKPo5fOnjx7uPdCPBwd7+vGH
7x/qxx8fHeDH095xP2DFzLV7BXPt3jxPk9HiEJhuduWPge+N45sCOMS46A0n
c5+Jj2C1M2Ss0vC27s3madmbx4s0j8fI5IHH5im8C2MlV7AHBawfDg6+Vwi/
27Nwf/8jPT19fnqx/wg/RZHlxfjT4wU56kdHw7EBhKXxLPgmWCr32LFv9+wC
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
wF5GBI2IMjTMyXDZQrV4CRc6g483XyQU7fIDy3ooktX1ydgSLy27S9XOwgQh
XW/rhSPheoxpnRdEB2+/IdubhqQTSe8/rYhtyIjwx7rw26Xt3YWtvBZKMobh
D1FTmDWerxW7vVWSdxvZG60Sv9sI4CWwG8+bUjiKdvadMN154H3+zvv8cJcB
5tf8Ebb4rK/hcP1+nwaGz2fI9eRz+PwZPf/40TaNEL07zTCzZf6m+gSjbRoh
WMg7jNby2hYj3GW0Da9tMcKm0bZ/7e7MYnvVjTiW6m8XzM5v4vRNFBoTwl9Q
nztt+6KpEViZD/ydjxuN12SPebkeJFbndTkV12g+tyZp4ME2LuozRbcKxU4a
02K/oA+W+OiWTXHrx3YqnEo1TzPDzM2GTpmULBVTUmg1X9ZNTia8wj0ZSyPa
lZ7Oh+4CHYX1QdvwWbNhCCPruf7Q6zRdCp/OzJgTIsnno4emOCdDFBTycLXo
vxKnI/2FzpShb+IG04vYlYWalnqHREuj3/dRA9Uv+NEzSnAUhYRdYl6WjXWK
RafZ2HAKW3BKhVEoihVqLdlSehH0yfkY2JyzjIC0yJ4gELqqtwXZUTln11BO
LitvfD7QqGtHIjk0fqIxJnUJOgWJpqOjCd5iSQTrIUToddvtSjIX9eZZ+QU0
pASuS/UiqDZonY+EA6SOqkH0ShwYUkY1h3wWXuIRp2xYtDENj+gwODtIWDM7
U9zxmNaPLvl4khAvMTmgNZgwOg99UgRtmmwZVpw9MoZVB+URXZ5/VI+MYC4u
CoqJoVEgeYuEw7HhgygSLqMNJyfB2cFiR/Gi9jbsf+VyAxqqbHhi1MzQCB3Z
dJHlnYcMyu1h0rYHNq4RRn273joJraon1duS1ltbaERAsjDpcFbeEtRz1GRT
dzRvUWMKElTCLHByQAsfHCoZLaX8+jMReyChHZW5yGAz+NXVPcBjyom1jFDF
49uIXAXkMFUk8sGlWz+B3gPQ2hzkgoRv8hnabAnF0dRc4SQPHl7SJOb5fI6c
y+UbOTpMvFAw2M65BHIyxDsllDK4wk1oV1FuL8dzm0xTLYPrg5VmQVlcH3xJ
s4ChWeWC+2oWyM/v1yw4vTjYOen2+7uozNJnEA72c/D82e5HK+qDlyc7z6DX
LvS6+bOv3wNT7vf/B1sTGz6Hr539lOzq12c//ep9fuN93vv4uXmK+hafP260
z6qoIw9Zp6i7De9r6e6p1YUvbKBDNfPGqSH/KIekq0gkdSG+FPUZrjgSvQPE
susf+9lWayc++dto7TKV3hmdhl+lrmsKhzgow4MHXf9Em2RzqPruv/hsd5Xe
HgDxJRR3Tvz4bTV3zdvH+co/mF02NDbL30X3lpL6P1pvl5X0VYJh0VAK+YwA
6+6qoct7d9LRG0SwTlP/AD14tYJ4V6W2kcrOU92s22aKlH9A1daSyW+l3DKl
SGK25vdabVfn6pMxneZao9cKFa7RbLtCCeJHv2fl5L0VnLsZSeDMYDbLGqNT
4E5TzgwWD7I5j/DVM4QHBBesC24kd/QRz6v20nhBNVGk3yuXVmIz0C4I6U9s
spuo45IhtzLKviZdDholk0yjNRTnWVGJQfM62o6s0Lk/Tt23ycUcXtLkiNJ4
gyKytsyVbM1HJOGDErsM089yd1jH33Vhnm5pgzXBSYfw4OJQkuE54QPDN1Mw
iZdTab3zeHL4QwsNRC7c5mdCBqi3OYGVv258yl7T5tyBZj6zsoR8zurxSBwg
XZHfbhP82tGalMq8/ZlotlxZIxITqjaAtFLWhXGRyGaGNEAwyXLE8g5pXCri
bPEP1cH8AqhldGauqgjEPBArDLJH+5gTk61o81gOiWQTEsEOOU0uTi4kg39s
/AxQ6yuB/18MLqKrNL7Oi10+g++C+GOPE+CqqfY2wbqpeFrIdhPmE9ORlZuc
ko6kTBXyeEAmpSFRPiTWbys4aciekWlqfmrjhpqYnO7TIzc2NV1f5wNLXuqe
4oR1xe1OB0maULkiLxueAlc2cUFlkbI863kANBVHkp7AN8fUG50OwaSHSXLN
Hjk95HL6/Ojps94vry7pFHJmj8aEcycFxOBhD8ZmkFluj6nnxKyG6BBppnHj
6DzU6TmF1UE/M60J/t7ZeQIdHYccZrenKm/tBrGKmuwxnQxXj5Pxlk8Dupi0
xQQnR7MfkuPz7Zi1bsDm+7REd8aLracgap89kG47pkPYeGrbe7Lz+uzovNxl
XbVedSZ7BTYo1V2lqksis91vk9DV9Ha0mqK+8yRa8/NuVUtN+t7ccn2f28Np
f/5XFJ3nxF0affnD6wKvbmF/rhstgkyxFcDA83e8bBEuon6GJXyHLb3N/251
hwiGa9lx3/zBA88yUQe71/CzIH0rPwXrueyh+Fn4v8IqPgnHEVwmRlcSdDRJ
w06vvZ7OYafTiwZ4ImvE7eDPY850sn8PKFGzNwN5WCzs0xdx+dfaYNVHtiDh
YecZRmXsQCSWNFMbpQ/ovzANEBYjTmvGwAksTkKZYazPkl5Qz7C469+coTo0
aE5TlmnLUXP/iHlpUkCEvCRHFgKDjZHBBXuCyjM+n7NytllpDYMhFgLxjLtk
fmCjYSWJEO2SVWq5zt1zSbf4+dbbBcHvrXt41/b7xaqNvkUPA/odf0QPU/pd
fkQPMf3+60f0UNDv+oN6OKbfxv6+Sw+MvQX9HltI7tJDRb+zBjbu0kPs/Z5Z
SO4Ow8zDQ3LHHhLv98zO6C49jLzfffo9sWGYLX5W76wlwaAPNK/DPf7T0u8e
BWRW9dD6uOU39QC8ng2L0n5xmqV4HINMEm1/sfT7T58OhmZTGjk8DrcGD0tr
sWJxNq0FVe+OYjAFUdo0DmsoaOfebwfJJ6OHS/KwxIVYrlQjUotoN2BoYuOT
4aGxbMdHwelReby0FudHl5+LHi4kqyAAo5UePhVN2sqVUp4NiZ7NeLKqFRHB
uCO07+X3Z9oXCsQYFJZ1a/E59+aFujN65OZERe6Lw3CpfkgXvlmzFp9pX+CP
dZLax2t49YCJCdTKD8aDNaCCHk4vrh/6PXxWebGiB3KcrYXhE/Gore2gHpgE
3rEY1qzZTCBb6DzHmwDQUVOXUppTTpf5Ros71zfMq2novXt9/ny34d7g03Je
3TmruKP1IHkqbDlZF3ngGO+V9O179veXnpHlzmovl5NpZFM1D6AFbn57WHij
71qraGn4hIowiL/G96RpcVysuzaW3pbyL706++JNdcmlWAaQAxsSf2C7Tlw8
usm6TOjQEfbCbnCLSlleV3WteX4ntHBnsGxo/i3oEoIZhvBKtGpPz8+fvexd
/uniGd4q5UAiIw6+Pz/pHR0fvzyMztGERj+7ZQGxFEfaoaOUVxRiy6RGO0Ou
NzTs4kDqazqUtD7nGGv3qbF/z6M/28np+XIfvE6NopRrHWvQ3dOjpyfPDpv+
RSZpG1PTaoRbdOnHHDSCD7r3f+eB+oOjQ6YHuRbCIpBoFrG467U+Ox1cHtp0
B8psNrfolCs5sblRC5M6lh43UAoRtgY4rijQZUsGeTNpEIMcTSWcLJX28mz9
YV5nUjtpHifkhbcVlXyfpedpsD5Oie4Q5+GX6NwM8yrAamp8zzS6+OdUqcA0
WqOb3/kY3KiaqkxBeyrHAMs5wyrH5EWx9RW8oAtTQ102L0wYJj07JkfvGp6K
KJKSU1LNxJ7dEu8JzlHVrUd7D/r7/3OtQ5Zw67yyob9XTx25aIYWd/KLtlVF
MplQcM0eQvYcPZbTxbrqN1NMU2xE5qkmrym9/JI2xhPwcYWB6YQjRq2efVdn
WsguDFFkPqF6fnWPVSwXz1Ce3hjKFRWzxbaw1nnAwaVwkUoWm0Djm2k+f5dj
kwvHO5YCanpiPC6lRB7x9WbwhAVfkvFWsvUB/CD/cnihnQMWpqoLks3LzErp
y4q9YCCLFyyhPgt4M82ghRG0kkKTAzU3hpJRXVqiYJS7ewy6zBJddW/vUIdw
QN6ma05xYMTvjw6m4PYb7T9xbJFPjgR8mrIEmiUXMdidSXEHYgMn0U4VT7ru
jGZqrir7Z2TLJ+jNH7sSPGNkeIpLWJpOj+T69EZ6CEU1p2YJ1pakGr4dyRY3
VPGjnAlhp2mvCgdjJsFVZYq2rYtgDDFBS8m0G4BPVR5dvetmxC4E1CtI5NfL
kZoguLKesiXRVMJLS+lGqtZGzS8vz6ycPIE+zpIZMJXrOK29cshD49dQhN3K
stidaM1yqRgtxCt5gsysYFNTf2VLTBJY7H8rbY1EeIFQjCxG+QtBFnAXr3aW
FprTaviI0CynOGmRqODLPE8/X+GhB7eHRgtkOUR6gVdm2YWJZxz51g0jldK4
R0PZFsAjbSYcJcUgrVE+GFUAsYYqJ8xIxJhjLuJKMFQK3FIGFSBJKOK97nVl
UkEdRV0zW9tdq1PIVnnYI93UFeHWuwUwR0jFtE0FiVcqTX55ZKrzAp16dZ68
Ei4x1TfBnVKycsKA0Wn2oDSzlrtdPShO1ulSdZb8tTb2Di5XulmS0VwWVOz0
rTatRI+/e6Xs2pk5F54NEmEcLwmchdpriltKU+wozwfLmOBhfltc3GODJYuk
2p6H4XjPCmzEXiQaUSwVa1UtDPirlkti65bq4C+8SkM2owOTlAD2JwZPJmHd
hUQLTDmxuZT+EVTzCurt+xE0KzQ9fTX28ioCkopLT3q7JjsqoHcja2LZCbch
yBLfaahmbNZWu0G9ueW+qd7PMoTLib8Wd04j77eY9qt3casxKLlg94b1bK6U
eAP932upx1SFHmUWDpw1rJYr8y3Nym6pjSPFIXxNWWxbL8SJzZyp7mjH3q3Q
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
ls9p20obdIxbmIQexh3VBZ2EXSq+wY1RTpKkgub2/K9eKqDj2QFQoV4q/XO5
TJlUY8hk9nIA3YJBTSFaBzqju1TpSU4M+/NJVB+gK/boGD+VsgI6A0HpCmnh
ofCE6SfSw/7NY/p6f6QrhbDhhGl0hOfH86yXJtmbHhOdvTwEUUff0eO1iT6x
V4sIsJqmsu2CcmXhco6FI5VSvcO/k7ylitp7W4rfXZfB5Z6KfC73B9Bit9Zi
wKHxIgDY9Kj/6o1EVKJp1SnbNmanrUKFLB8i32akwxKZwo7gnD+4dEUt9Sxi
LVE9SaS83FXIXpZG2WlDilzMu7ulDaGblffpIBryZnCn44kF7jkj4rjVb+JZ
DL9chJ2KKkNmOH6xVDoOq7KuVUOtKrOsX29pIciCcb7/FkdLggVmrWX/EFk/
3SaTZ3wXy9JyBeuBF3X4F3LInpbLsSrv1rH2i2W4f3T6uJs9tCo4YPQQS73Y
G26YE3H1kgp07b8Zu6mkFvvIjPGWFKDGEawEU5/lYR171J65EBVgSLQKTIMY
fEZLN05lVrOhtzt8AiR6XhfIHvCCMCy4gOGVWVxMkkx1Fq/2jDJwR4pMG9RV
h7yTVFyD68PHVKRkZIVEyVUEbN0NurWlN8qpPFg1lXpCdhoddCKSm4tL9Ug9
FceY7ZpRVUcpMEG1ZUo7Fe1tZDrlDHQXrlAklSjcxGTGogciAUhdMujGn0K0
M+f7vMYde5GNnLSJ5aYZVGd2W5J1lxIuu834n1eccdly7Wy0XFtLO6ywXFen
XHqMC9R9rpSaZJ23b9edLcZN1NLCD+G8f49+1fZGB34//pUn3YbN3HKA5/ME
CBqiA68A07X1MdQQf43p+bnmyxgK8hD4wve299Wl1kRNkJPdDUtbWjdWx0Nf
WwFOvZTO3mSY0g16g/0f+KrD/Ucb5NNOv9+PxIMZRe93yZu5b/251gIOvQeb
REnoMW0TJzviLF3rLu33d+8mdwjhW7gvl+TOJ+TxVE6l84l4vJ7yO/Jc8yuZ
+3bsu7Mt+442s+/OWvbtQHZMPFrDxDvbMnGgWOgWFPRUDPTneEfJGckzPrbB
yOnohWQ3zupR7VCxLkxmqeJicwlgdh0y83h2jVGd/wGrN8FAtVdbzjPcCJCk
6gQ3UbVsMEccPhV8Mf96C/f0w5budl08PcrX4/74CK9NDDzcf78ytEVMkG20
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
Cl35NPT/AWG0dcewDAEA

-->

</rfc>

