<?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.3.3 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!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 toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-spring-sr-service-programming-04" category="std">

  <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>
          <street></street>
          <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>
          <street></street>
          <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>
          <street></street>
          <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>
          <street></street>
          <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>
          <street></street>
          <country>USA</country>
        </postal>
        <email>cy098d@att.com</email>
      </address>
    </author>
    <author initials="W." surname="Henderickx" fullname="Wim Henderickx">
      <organization>Nokia</organization>
      <address>
        <postal>
          <street></street>
          <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>
          <street></street>
          <country>Italy</country>
        </postal>
        <email>stefano.salsano@uniroma2.it</email>
      </address>
    </author>

    <date year="2021" month="March" day="10"/>

    <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" title="Introduction">

<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" title="Terminology">

<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" title="Classification and Steering">

<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" title="Service Segments">

<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" title="SR-Aware Services">

<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'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" title="SR-Unaware Services">

<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" title="SR Service Policies">

<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" title="SR-MPLS Data Plane">

<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" title="SRv6 Data Plane">

<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 "Inner pkt" 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" title="SR Proxy Behaviors">

<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" title="Static SR Proxy">

<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'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 "bump in the wire" 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" title="SR-MPLS Pseudocode">

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

<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" title="Static Proxy for Inner Type IPv4">

<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" title="Static Proxy for Inner Type IPv6">

<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" title="SRv6 Pseudocode">

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

<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 "Ethernet" in the
"Internet Protocol Numbers" 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" title="Static Proxy for Inner Type IPv4">

<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" title="Static Proxy for Inner Type IPv6">

<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" title="Dynamic SR Proxy">

<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" title="SR-MPLS Pseudocode">

<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" title="SRv6 Pseudocode">

<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" title="Shared Memory SR Proxy">

<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" title="Masquerading SR Proxy">

<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" title="SRv6 Masquerading Proxy Pseudocode">

<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" title="Destination NAT Flavor">

<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" title="Caching Flavor">

<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" title="Metadata">

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

<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" title="IPv6 Data Plane">

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

<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" title="Opaque Metadata TLV">

<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" title="NSH Carrier TLV">

<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" title="SRH Tag">

<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" title="Implementation Status">

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

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

<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" title="Proxy Behaviors">

<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" title="Related Works">

<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" title="IANA Considerations">

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

<t>This I-D requests the IANA to allocate, within the "SRv6 Endpoint Behaviors" sub-registry belonging to the top-level "Segment-routing with IPv6 dataplane (SRv6) Parameters" 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" title="Segment Routing Header TLVs">

<t>This I-D requests the IANA to allocate, within the "Segment Routing Header TLVs" 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" title="Security Considerations">

<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" title="Acknowledgements">

<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" title="Contributors">

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

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

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

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

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

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

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

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

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

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

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

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

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

<t>Hamid Assarpour<vspace />
Broadcom</t>

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

<t>Himanshu Shah<vspace />
Ciena</t>

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

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

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

<t>Jeff Tantsura<vspace />
Individual</t>

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

<t>Martin Vigoureux<vspace />
Nokia</t>

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

<t>Jisu Bhattacharya<vspace />
Cisco Systems, Inc.<vspace />
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:
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
Fbryaej/A6TOtp6wDAEA

-->

</rfc>

