<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="independent"
        docName="draft-menon-svr-03" category="info" ipr="trust200902"
        obsoletes="" updates="" xml:lang="en" tocInclude="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.14.2 -->
  <front>
    <title>Secure Vector Routing (SVR)</title>
    <seriesInfo name="Internet-Draft" value="draft-menon-svr-03"/>
    <author initials="A." surname="Menon" fullname="Abilash Menon">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Part Dr.</street>
          <city>Westford</city>
          <region>MA</region>
          <code>01886</code>
          <country>US</country>
        </postal>
        <email>abilashm@juniper.net</email>
      </address>
    </author>
    <author initials="P." surname="MeLampy" fullname="Patrick MeLampy">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Part Dr.</street>
          <city>Westford</city>
          <region>MA</region>
          <code>01886</code>
          <country>US</country>
        </postal>
        <email>pmelampy@juniper.net</email>
      </address>
    </author>
    <author initials="M." surname="Baj" fullname="Michael Baj">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Part Dr.</street>
          <city>Westford</city>
          <region>MA</region>
          <code>01886</code>
          <country>US</country>
        </postal>
        <email>mbaj@juniper.net</email>
      </address>
    </author>
    <author initials="P." surname="Timmons" fullname="Patrick Timmons">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Part Dr.</street>
          <city>Westford</city>
          <region>MA</region>
          <code>01886</code>
          <country>US</country>
        </postal>
        <email>ptimmons@gmail.com</email>
      </address>
    </author>
    <author initials="H." surname="Kaplan" fullname="Hadriel Kaplan">
      <organization>Juniper Networks</organization>
      <address>
        <postal>
          <street>10 Technology Park Dr.</street>
          <city>Westford</city>
          <region>MA</region>
          <code>01886</code>
          <country>US</country>
        </postal>
        <email>hkaplan@juniper.net</email>
      </address>
    </author>
    <date year="2023" month="March" day="27"/>
    <area>General</area>
    <abstract>
      <t>This document describes Secure Vector Routing (SVR).
     SVR is an overlay inter-networking protocol that operates
     at the session layer.
     SVR provides end-to-end communication of network requirements
     not possible or practical using network header layers. SVR
     uses application layer cookies that eliminate the need
     to create and maintain non-overlapping address spaces
     necessary to manage network routing requirements. 
     SVR is an overlay networking protocol that works through
     middleboxes and address translators including those existing
     between private networks, the
     IPv4 public internet, and the IPv6 public internet. SVR
     enables SD-WAN and multi-cloud use cases and improves
     security at the networking routing plane. SVR eliminates the
     need for encapsulation and decapsulation often used to
     create non-overlapping address spaces.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="intro" toc="default" numbered="true">
      <name>Introduction</name>
      <t>There exists a need to communicate network requirements between IP
routers and networks to provide an end-to-end experience. Selection
of specific paths whose attributes meet or exceed the networking 
requirements are an objective of SVR. There is also a need for applications to
communicate their requirements to networks. This need is increasing as
workloads move to public clouds and the numbers of cloud locations increase.
The standard practice today is to use an overlay network of tunnels to create
a virtual network. SVR overlay is being proposed as an alternative to using
tunnels. SVR simplifies the network by virtue of having only one network layer.
SVR securely transports traffic with authentication and adaptive encryption.
The absence of tunneling overhead reduces bandwidth. Since SVR specifies
requirements abstractly, it also has the capability to interwork policies
between different networks and address spaces.</t>
      <t>Most WAN  networks are deployed with a virtual private network (VPN) across
IP backbone facilities. VPNs have the significant disadvantage of carrying
additional network layers increasing packet size and  leading to IP
fragmentation as well as reduced bandwidth.</t>
      <section anchor="terminology" toc="default" numbered="true">
        <name>Terminology</name>
        <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
        NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
        "MAY", and "OPTIONAL" in this document are to be interpreted as
        described in <xref target="RFC2119" format="default">BCP 14</xref>
          <xref target="RFC8174" format="default"/>
        when, and only when, they appear in all capitals, as shown here.
        </t>
      </section>
      <!-- terminology -->

<section anchor="overview" toc="default" numbered="true">
        <name>Overview</name>
        <figure anchor="net_diagram">
          <artwork name="" type="" align="left" alt=""><![CDATA[
                   +---------+
                   |Network2 |
+----------+       |         |       +----------+
|         SVR<---->+<-L3-IP->+<---->SVR         |  
|          |       +---------+       |          |
|Network1  |       +---------+       |Network 4 |
|         SVR<--->SVR       SVR<--->SVR         |    
+----------+       |         |       +----------+
                   |Network3 |
+----------+       |         |
|Client   SVR<--->SVR        |
+----------+       +---------+
]]></artwork>
        </figure>
        <t>An SVR implementation describes a network requirement semantically and shares
this as metadata with a routing peer. The requirement to a peer
is conveyed by means of a cookie, often referred to as first packet
metadata, which is placed in the first packet of a session that is targeted
towards the SVR peer. SVR requires session state on every participating SVR
router and sets up a bi-flow (matching forward and reverse flows) based on the
requirement. Once the session is established bi-directionally, the cookie is
not sent in subsequent packets, resulting in elimination of additional
overhead.</t>
        <t>Benefits from this approach include:</t>
        <ul spacing="normal">
          <li>Tunnel Compression: The metadata contains
information required to eliminate tunnel header information for established
sessions. This can result in anywhere from 12% to 100% bandwidth
savings when compared to IPSEC based tunnels depending on the original
packet size.</li>
          <li>Elimination of Elephant Flow problems: Tunnels are very long lived and often
contain large aggregates of inner flows. Tunnels are often fixed on a
specific network "hash" while each SVR session has a unique network hash.</li>
          <li>QoS support is per flow, not per packet: Because each SVR flow has a unique
5-tuple on the wire, standard MPLS routing and QoS techniques work seamlessly.
Adding QoS to Tunnels requires QoS on entry to a tunnel, tunnel DSCP markings,
and policies to copy/map inner packet DSCP to Tunnel Packet DSCP. In
practice many core networks do not look at the DSCP markings once a
fast path forwarding rules are established.</li>
          <li>Avoid Re-encryption: Tunnels often encrypt all traffic. Much of the 
traffic in the tunnel is already encrypted, thus there is a re-encryption
penalty. SVR support adaptive encryption which performs encryption on
only those sessions that require it.</li>
          <li>Firewalls and security proxies can intercept TLS sessions and perform
decryption and encryption if they tolerate SVR metadata. This is not possible
with IPSEC tunnels by design.</li>
          <li>Scaling of software-based encryption is much higher when session state is
available. Encryption performance is limited to what is possible in a single 
processing core for a single session, and at the time of this document being
written the limit is currently 1.5GigE for Tunnel termination.</li>
        </ul>
      </section>
      <!-- overview -->



<section anchor="definitions" toc="default" numbered="true">
        <name>Definitions</name>
        <t>The following terms are used throughout this document.</t>
        <dl newline="false" spacing="normal">
          <dt>Authority:</dt>
          <dd> A textual definition of the owner of an SVR namespace.  Each
  namespace owner can allocate Tenant names (representing collections of network
  endpoints sharing common network enforcement policy), and Service names
  (representing accessible destinations and traffic treatment policy). Authority
  namespaces must be unique to permit internetworking. Claiming and resolving
  disputes about authority naming are outside the scope of this document.</dd>
          <dt>Tenant(s):</dt>
          <dd> This is a textual description defining network endpoints
  that share common access policy (allow lists or block lists to network
  destinations). These may be mapped using any known technique including
  source IP address mask, a VLAN tag, ingress interface, provided by an
  authentication system, or even client supplied, and this mapping is outside
  the scope of this document. Often these are location specific definitions,
  but the Tenant has global meaning within an authority. Tenant names can
  conform to domain name syntax, and be expressed as hierarchical structures
  (i.e., location.department.example).</dd>
          <dt>Service(s):</dt>
          <dd> This is a textual description of what server(s) can be
  accessed with this intent. Examples include Zoom, or Office365/Outlook.
  Although outside the scope of this document, these could be defined with any
  known technique, including URLs, IP address(es) protocol(s) and port(s),
  CIDR block(s), etc. Having a single text name to describe a network
  destination makes defining network requirements easier. Other Service
  specific network requirements including Quality Policies and Security Policies
  can be associated with Services in data models, but are not described in this
  document.</dd>
          <dt>Context:</dt>
          <dd> This is the original "5-tuple" of an IP packet, including
  source IP, source port, destination IP, destination port, and protocol. Optionally,
  Layer 2 information such as MAC Address or VLAN tags may be included for
  certain use cases if required.</dd>
          <dt>Signature:</dt>
          <dd> The metadata packets MUST be cryptographically signed
  using HMAC by the source router, and all packets traversing an SRV peer pathway
  SHOULD have an HMAC signature so the next hop router can authenticate the
  sender of the data and verify its integrity. The portion of the packet that
  is signed must not include the IP header, as it may go through a NAT or
  IPv4 to IPv6 conversion.</dd>
          <dt>Direction:</dt>
          <dd> This is inferred, and not a specific metadata field.
  The Direction represents the intended client to server direction. The initial
  network packet of a communication session indicates this direction. For
  example, a TCP SYN packet would travel from client to server, defining the
  direction of a service. Forward direction is always client to server, and
  reverse is always server to the client. These directions have nothing to do
  with a network topology (for example, hub and spoke), and a single network
  path could have forward sessions going bi-directionally -- traffic going from
  node A to node B may represent the forward direction for some sessions and
  the reverse direction for other sessions.</dd>
          <dt>Peer:</dt>
          <dd> An SVR Peer is a client, server, or router
  that supports the SVR protocol. The SVR Peer could be either directly
  adjacent, or reachable through an IP network. The SVR Peer should not
  be confused with BGP Peer. Since SVR Peers must be able to reach each
  other, and because SVR Peers are often deployed at network edges, SVR
  Peers can also be BGP Peers. In this document peer will always mean SVR
  Peer.</dd>
          <dt>Waypoint:</dt>
          <dd> A Waypoint is a reachable IP Address associated
  with an SVR Routers interface. Some physical interfaces may have multiple
  IP Addresses, and as such a single physical interface could represent multiple
  Waypoints. In some cases, routers use dynamically assigned addresses on 
  interfaces. In these cases, a Waypoint address may change dynamically.</dd>
          <dt>Peer Received IP Address:</dt>
          <dd> This is the destination IP
  address to send packets to reach a Waypoint Address. Normally, this is
  the same IP Address as a Waypoint Address, unless there is a NAT present
  between Peers.</dd>
          <dt>Peer Pathway:</dt>
          <dd anchor="svr_peer_paths">
  An SVR Peer Pathway is a unique pair of Waypoint
  addresses that can reach each other. The path can be defined as either a pair
  of IP addresses or a pair of domain names that resolve to IP Addresses. 
  Peer Pathways have attributes related to availability, performance
  (jitter, latency, packet loss) and cost. Techniques such as BFD
  <xref target="RFC5880" format="default"/> can ensure a Peer Pathway's state and readiness
  for packet transmission.</dd>
          <dt>Router Certificate:</dt>
          <dd anchor="router_certificate_definition">
  A Certificate Signing Request (CSR) is created by every router that attaches
  to an SVR network that contains the routers name, authority, and public key.
  The resulting  certificate is used to authenticate SVR routes on Peer Pathways.
  The certificate (and public key) are fairly long lived, and seldom used. 
  Rekeying procedures are based on the life of the certificate.</dd>
          <dt>Peer Key:</dt>
          <dd anchor="peer_key_definition">
  After authentication, every SVR router peer pathway creates additional 
  public keys to obtain a much shorter lived Peer Key used for encrypting
  SVR Metadata. The Peer Key is rekeyed on a regular basis. Peer Keys are
  signed using the Router Certificate Public/Private keys. This prevents
  any man in the middle between two SVR routers.</dd>
          <dt>Session HMAC Key:</dt>
          <dd anchor="session_hmac_key_definition">
  Timed Based HMAC signatures can be used to protect SVR pathways against
  replay attacks. Ever session upon start creates a Session HMAC Key which
  is the Peer Key at the time the session was created. Session HMAC Keys
  must be saved for the life of a session, and do not change. Time based
  HMAC signatures essentially change the key every 2 seconds.</dd>
        </dl>
      </section>
      <!-- definitions -->

</section>
    <!-- intro -->



<section anchor="op_theory" toc="default" numbered="true">
      <name>Theory of operation of Secure Vector Routing</name>
      <t>Secure Vector Routing is a session stateful routing overlay that operates
at edges of networks where stateful NATs are normally performed. It is at
these same locations where multi-path routing is being deployed. These
locations include edge routers located at branches, data centers, and
public clouds. SVR maps local network requirements into administratively
defined text strings that have global meaning. These are communicated
or signaled by insertion of a networking cookie called SVR metadata
directly into IP Packets in transit.</t>
      <t>SVR metadata is inserted into existing packets directly after the
L4 header (see <xref target="std_md_insertion" format="default"/>) The metadata in the 
first packet of a new session (TCP or UDP bidirectional flow) can be 
used for path selection and security. Metadata can be inserted in any
subsequent packet to change/update the networking requirements.
The metadata is inserted into the payload portion of a packet to guarantee
it makes it unchanged between SVR routers.</t>
      <t>Sessions supported by SVR include TCP, UDP, UDP Unicast, point-to-point
ethernet, and ICMP. Sessions are characterized by having an initial first
packet that is unique to an SVR router. Often this is described as a 
unique 5-tuples as seen by the router. Sessions start when the first packet
is processed, and end when either the L4 protocol indicates the session is
completed (TCP FIN/FIN ACK) or there has been no activity for a length of
time (UDP, ICMP, UDP Unicast, point-to-point ethernet).</t>
      <section anchor="directionality" toc="include" numbered="true">
        <name>Directionality</name>
        <t>SVR utilizes the concept of session direction. The direction of the session
  is what creates a Secure Vector. Routing policies include a Tenant (source) and
  Service (destination) pair that exactly match the direction of sessions.
  When describing metadata in this document, direction is either forward or
  reverse; it is not tied to network topology, but rather the direction of session
  establishment. For TCP, the forward direction is always the client side towards
  the server side. For UDP, the forward direction is from the sender of the first
  packet. Reverse is the opposite direction.  On a given pathway Secure Vector
  Routes could be traversing on the same pathways with opposite directions.</t>
        <t>Metadata formats described in this document will be labeled as
  "forward" or "reverse". Forward metadata is inserted in packets
  going from client to server. Reverse metadata is inserted in packets that
  travel from server to client.</t>
      </section>
      <!-- directionality -->

  <section anchor="mixedsvr" toc="include" numbered="true">
        <name>SVR with Other Traffic</name>
        <t>SVR co-exists with traditional routing. In fact, the router interface
  addresses known as Waypoints in this document MUST be reachable via traditional
  networking for every peer relationship. When packet routing is being decided
  in the router, should the route resolve to an SVR capable router (i.e., the
  next hop address returned in the route equals a known Waypoint address of an
  SVR Peer) then metadata MAY be inserted and session stateful SVR is performed.
  Otherwise, the packet is forwarded like any traditional IP router.</t>
      </section>
      <!-- mixedsvr -->

  <section anchor="handshake" toc="include" numbered="true">
        <name>Metadata Handshake</name>
        <t>To ensure the metadata is received and understood between peers, a
  handshake is performed. A router that supports SVR peer pathways  inserts
  metadata for each packet flow in the following circumstances:</t>
        <ul spacing="normal">
          <li>It is a "forward" packet representing a new session and the ingress
    node has not yet received any reverse metadata from the recipient egress
    node.</li>
          <li>It is a "reverse" packet from the recipient egress node to the
    initiating ingress node and recipient egress node has not received forward
    packets from this session without metadata.</li>
        </ul>
        <t>These two comprise what is known as the "metadata handshake" -- that is,
  the initiating router includes metadata in all packets it sends to the
  recipient router until it receives a reverse packet with metadata from that
  recipient. Likewise, the recipient continues to send metadata to the
  initiating router until it receives a packet without metadata. This is how
  two routers acknowledge receipt of metadata from their counterparts: the
  absence of metadata in a packet indicates that it has received metadata from
  its counterpart.</t>
      </section>
      <!-- handshake -->

  <section anchor="path_obstruct" toc="include" numbered="true">
        <name>Pathway Obstructions and Changes</name>
        <t>Firewalls and middleboxes that sit along a peer pathway may not propagate TCP
  SYN messages with data in the payload (Despite being valid), or may verify
  sequence numbers in TCP streams (which are invalidated due to the inclusion of
  SVR metadata). The two devices that represent the peer pathway endpoints may
  determine through testing if there is a firewall, NAT, or other active middlebox
  between the two routers. The BFD protocol with metadata can be used to detect
  the presence of a NAT. See <xref target="bfd_nat_detection" format="default"/>. Additional procedures like STUN
  <xref target="RFC8489" format="default"/>, TURN <xref target="RFC6062" format="default"/>, and ICE
  <xref target="RFC8445" format="default"/> are well-known, and not included in this document.</t>
        <t>If a NAT is detected on the Peer Pathway, the SVR Router that determines its
  Waypoint address is being changed saves this as an attribute of the pathway.
  The NAT will change the port address assignment, and require NAT keep alives
  as exemplified in <xref target="nat_keep_alive" format="default"/>.</t>
        <t>If a middlebox is detected, the packets can be UDP-transformed i.e., the
  protocol byte can be changed from TCP to UDP by the transmitting router and
  restored to TCP by the receiving router for packets flowing in both directions.
  See <xref target="std_udp_transform" format="default"/> and <xref target="std_udp_untransform" format="default"/>
  for more information.</t>
        <t>When routers use IP addresses that are dynamic, such as DHCP served addresses
  or PPPoE network attachments, it's possible to be assigned a new address. If this
  happens all existing sessions using that Waypoint address must be updated to use
  the new address. For existing sessions this can be performed in real time be
  reviewing the sending address. If the address is changed internal references to
  the old address can be updated. For idle circuits, BFD with metadata is used to
  detect address changes. See <xref target="bfd_router_address_change" format="default"/> for details.</t>
      </section>
      <!-- path_obstruct -->

  <section anchor="meta_remove" toc="include" numbered="true">
        <name>Metadata removal</name>
        <t>To prevent breaking any applications, there MUST be a 100% guarantee that
  metadata inserted by a participating SVR device is removed prior to the
  consumption of the data by the application service. If the client and server
  support metadata, then SVR metadata can be sent end-to-end. When a
  mid-stream packet router wants to insert SVR metadata, it must guarantee
  that the packet is directed to a next hop device that will understand and
  remove the metadata.</t>
        <t>A router can be certain an SVR capable router is on the path when the
  next-hop address returned from a FIB table exactly matches a known peer
  Waypoint address. Before sending the packet with metadata to the Waypoint
  address, the originating SVR router should determine the Peer reachability
  as exemplified in <xref target="SVR_example" format="default"/> and <xref target="std_bfd" format="default"/>.</t>
        <t>If the next-hop is not a known reachable peer, SVR metadata
  insertion MUST NOT be performed.</t>
      </section>
      <!-- meta_remove -->

  <section anchor="transport_addr_mod" toc="include" numbered="true">
        <name>Modification of transport   addresses</name>
        <t>To guarantee that the packet will go to a specific router, the
  destination address for the packet is changed to the Waypoint Address of the
  chosen peer. The original addresses are stored in the forward context 
  (see <xref target="fwd_ctx_v4" format="default"/>) and can be recovered when needed. This is
  similar to IPv6 segment routing (see <xref target="RFC8986" format="default"/>) or a
  LISP (see <xref target="RFC9300" format="default"/>) RLOC with the exception that the original
  addresses are stored in metadata within the payload portion of the packet,
  and not the IP Network Header.</t>
        <t>Selection of the Waypoint Address to direct sessions to is implementation
  specific.  In the general case a standard FIB lookup returns one or more IP
  Address(es) (Waypoints) of the next SVR peer. When more than one Waypoint address
  is returned from the FIB, additional logic can be applied to select the best
  Waypoint based on observed peer pathway quality OR session layer load balancing.
  See <xref target="SVR_example" format="default"/> for exemplary details.</t>
        <t>To provide a return path for the return flow the source SVR peer changes
  the source address to be its own egress Waypoint address.  This provides a
  guarantee of a symmetric flow. The state of the session MUST be held in
  both the source SVR router and the destination SVR peer.</t>
        <t>The address translation rules for the session become state information that
  is processed on every packet after the metadata handshake. All 5 tuples of
  addressing information are updated bidirectionally for the session. This action
  replaces tunnel encapsulation and decapsulation (tunnel compression), and is an
  order of magnitude simpler computationally.</t>
      </section>
      <!-- transport_addr_mod -->

  <section anchor="semantic_based_routing" numbered="true" toc="default">
        <name>Optional use of Tenants and Service names for Routing</name>
        <t>SVR metadata contains contextual IP Addresses (sources, destinations,
    and Waypoints) along with textual service names (i.e., Zoom, Office365, etc.).
    The SVR routers can apply policies and route sessions based on the textual
    names if they have a route information base that contains service names. When
    performing name based routing, a destination NAT is often required when
    exiting the SVR network. The primary use case for this is networking
    between public clouds such as AWS and Azure.</t>
        <t>With semantic based routing, the use of Dynamic DNS to locate a service
    can be eliminated if clients support SVR. Clients can simply request the
    service by name, and the SVR router can resolve the route, and deliver
    the session to the best location. The last SVR Router on egress
    performs a destination NAT for the chosen best instance of a service.</t>
        <t>A local DNS server resolving service addresses to a nearby SVR
    router can also provide semantic based routing. This can eliminate
    the need to use dynamic DNS for locating services inside data centers.</t>
      </section>
      <!-- semantic_based_routing -->
    
  <section anchor="unique_tuples" toc="include" numbered="true">
        <name>Unique 5-Tuples for Every Session</name>
        <t>To avoid sharing a hash with all traffic, and to make sessions completely
  independent on peer pathways, the source port and destination port can be
  assigned any values that are unique by the source router. When there are no
  NATs between the two router interfaces, this permits 2^32 (4,294,967,296)
  different unique sessions on a peer pathway. If there are source NATs, this
  will be reduced to 2^16 (65,536) different unique sessions. Ports can be
  reassigned if not in active use. It is also possible that middle boxes will
  limit what destination ports are permissible, reducing the number of
  possibilities. Due to all these reasons, range of ports that can be used
  on a peer pathway are provisioned by an administrator.</t>
        <t>The ingress SVR peer (client side) assigns both source and destination
  ports, even ports for local (source port) and odd ports for remote
  (destination port). This provides total uniqueness between any two peers,
  with no negotiation or collision possibilities. This reduces the number of
  sessions originating by a router to half of the total sessions (or 2^30).
  Think of the two ports as a Session Identification Tag. Even if a session
  traveling in the opposite direction was allocated the same exact ports,
  because the source address and destination addresses would be swapped, the
  5-tuples on the wire remain unique.</t>
        <t>This unique tuple per TCP/UDP session also allows any DSCP or QoS scheme
  to work properly. Those fields in the original packet were not modified and
  the underlay network routers will see those fields on a session-by-session
  basis.</t>
      </section>
      <!-- unique_tuples -->

  <section anchor="post_exchange" toc="include" numbered="true">
        <name>Session Packets Post Metadata Exchange</name>
        <t>After the metadata handshake has been completed. all subsequent packets
  are simply translated (all 5-tuples, bidirectionally).  This is a very efficient
  process compared to IPSEC encapsulation which requires memory copies, new
  header creation, completely new packet checksums, and mandatory encryption.</t>
      </section>
      <!-- post_exchange -->

  <section anchor="session_state_reqs" toc="include" numbered="true">
        <name>Session State Requirements</name>
        <t>Each participant (peer) in secure vector routing must maintain state for
  every active session. This includes the full set of original addresses and
  translations required. This allows participants to stop sending metadata
  once it has been received by the peer. There are three possible scenarios
  for how state could be lost. The loss of state for poorly constructed applications
  can result in sessions that are stale or hung.</t>
  <ul spacing="normal">
  <li>SVR Ingress Router Loses State: The session state at a router that originated
  the SVR session loses state. This could happen during a redundancy failure.</li>
  <li>SVR Peer  Router Loses State: The session state is lost in an intermediate
  (2nd to nth) router processing an SVR session.</li>
  <li>One or more middleboxes lose state between two SVR routers, breaking or
  modifying the session.</li>
  </ul>

    <dl newline="false" spacing="normal">
    <dt>Reacquiring State:</dt>
    <dd>In all cases, securely reacquiring and/or reestablishing the state from an SVR
    peer for a session is necessary. If neither peer has session state, the session
    can be considered a new session and treated like any first packet. See 
    <xref target="east_first_pkt_proc" format="default"/>.

    Detection of potential loss of state is performed on every SVR router for every 
    session at all times. Just prior to transmitting a packet from an SVR router for
    a session, the elapsed time since a packet was received from an SVR peer is
    compared to an inactivity timeout. The inactivity timeout is provisioned, and 
    has a recommended value of 5 seconds. If the inactivity timeout is exceeded, then
    a loss of session state MAY be indicated. Note that this logic has no relationship
    with session timers guarding session state against no activity.</dd>

    <dt>Unicast Flows:</dt>
    <dd>For unicast flows, or asynchronous sessions, consisting of packets in one direction
    detection of potential loss of state will occur frequently. This will result in
    this inactivity timeout occuring on a routine basis for these types of sessions.</dd>

    <dt>Potential Loss of State:</dt>
    <dd>If a potential loss of session state is indicated, then a Session Health Check
    metadata is inserted in the packet being transmitted. When the SVR 
    peer receives Session Health Check metadata, if the session is valid, and simply
    idle, a unicast flow, or an asynchronous session, the SVR peer will respond with a
    generated packet that includes Forced Drop metadata with a reason of 8 indicating
    the session health check is good. For unicast and asymmetric flows, this
    bi-directional exchange of metadata ensures the session is valid and any
    middleboxes between the SVR routers have valid session state. This exchange
    only occurs during normal packet transmittal, and as such does not replace session
    keep alive. (see <xref target="nats_and_keepalive" format="default"/>).</dd>

    <dt>State not present:</dt>

    <dd>If a SVR peer receives a packet with Session Health Check metadata
    and it has no session state for the session, a generated packet that
    includes Forced Drop metadata with reason 2 indicating that full session set
    metadata should be sent in the next packet.
    See <xref target="state_recovery_examples" format="default"/>
    for an example. In certain cases, where a middle box has lost state information, or
    arbitrarily modified some aspect of the session, packets with
    metadata may not transmit successfully. In cases where there is no response
    to a Session Health Check, the next forward packet is treated as a new
    session and is processed as such. See <xref target="east_first_pkt_proc"
    format="default"/>. </dd>
        </dl>
      </section>
      <!-- session_state_reqs -->

  <section anchor="nats_and_keepalive" toc="include" numbered="true">
        <name>NATs and Session Keep Alive</name>
        <t>Each SVR router (peer) must statefully remember the source address that a
  session with metadata was received on. This may not be the same address the
  router sent a packet from due to a NAT or Firewall in the pathway. Routers
  use both provisioned and learned Waypoint Addresses. Routers MUST store the
  actual Waypoint Addresses received on the wire from a peer.</t>
        <t>When a firewall or middlebox is detected, the SVR router behind such a 
  device must send metadata packets periodically on idle sessions to keep any
  firewall pinholes translations from being removed. For every UDP and TCP session 
  that has seen no packets after a programmable length of time (20 seconds is
  recommended), then the SVR Peer should send an SVR Control  Message on the peer
  path with the source and dest ports from the idle session's saved state. See
  <xref target="proto_msg" format="default"/> for more information and see
  <xref target="nat_keep_alive" format="default"/> for an example.</t>
      </section>
      <!-- nats_and_keepalive -->

  <section anchor="opt_bfd_metadata" toc="include" numbered="true">
        <name>Use of BFD on Peer Pathways</name>
        <t>BFD <xref target="RFC5880" format="default"/> is used to verify Peer
  Pathways. BFD is used to determine reachability, presence of NATs, changes of
  Waypoint Addresses, determination of MTU size, current quality on idle circuits,
  authentication of peers, and maintenance of peer cryptographic keys. Alternative
  methods can be used for each of these if both peers agree. The use of BFD is 
  included in this specification as a preferred technique for Peer Pathway
  management.</t>
        <t>BFD metadata is defined and required to measure quality, perform
  authentication, and maintain security keys because standard BFD authentication
  fields are insufficient. BFD metadata is different than SVR metadata because it
  is inserted at the very end of a BFD control packet, and not at the end of the
  layer 4 header. BFD metadata is never encrypted.  To make processing easy,
  protobufs are used to transmit the BFD metadata instead of TLV's. The specifics
  of BFD metadata can be found in <xref target="std_bfd" format="default"/>.</t>
      </section>
      <!-- opt_bfd_metadata -->

</section>
    <!-- op_theory -->

<section anchor="SVR_example" toc="include" numbered="true">
      <name>SVR Multi-path Routing Example</name>
      <t keepWithNext="true">The example below shows two SVR capable routing peers
  with multiple peer pathways.</t>
      <figure anchor="ex_setup">
        <artwork name="" type="" align="left" alt=""><![CDATA[

 Client
  LAN
10.x.x.x
   |
   |  +--------+                                  +---------+
   |  |        |                                  |         |
   |  |        |                                  |         |
   +->] East  [203.0.113.1<---MPLS---->203.0.113.89] West   |
      | SVR    |                                  |  SVR    |
      | Router[198.51.100.2<--Inet-+--->198.51.100.8] Router|
      |        |                   |              |         |
      |       [192.0.2.1<-----LTE--+              |         [<--+
      |        |                                  |         |   |
      +--------+                                  +---------+   |
                <========= Peer Pathways ========>              |
                                                                |
                                                          172.15.11.x 
                                                              LAN
                                                             Servers
  ]]></artwork>
      </figure>
      <t>Note: The client, server, and MPLS network can support the private
    routes in 10.x.x.x and 172.15.11.x address spaces natively, but the
    internet and LTE networks do not. This is an example of using secure
    vectors to join networks together.</t>

    <section anchor="Establish_peer" toc="include" numbered="true">
        <name>Establish SVR Peer</name>
        <t>The first step is that routers would apply any locally defined static
        L3 routes, and begin advertising and receiving routes using L3 networking 
        protocols (BGP, OSPF, etc.)  from their IP peers to build a forward information
        base or FIB. This is required initially to ensure that the Waypoints are
        reachable bidirectionally allowing SVR Peer Paths to be established.</t>

        <t>The second step is for both the East and West routers to establish
        the authenticated peer pathways that make up the SVR Peer relationship.
        It is recommended that each peer pathway must be authenticated
        bi-directionally before the SVR pathway is used.</t>

        <section anchor="peer_auth" toc="include" numbered="true">
          <name>Reachability and Peer Authentication</name>
          <t>Authentication of peers is recommended. It is technically possible
      to send SVR metadata and determine a key for peers without authentication,
      but this is discouraged. Either peer could require authentication, and
      declare the peer relationship invalid should authentication fail.</t>
          <t>Authentication is based on a certificate signature request
      created by the router that contains its name and authority that is signed
      by a trusted CA (The Router Certificate). The device registration, creation,
      signing, and the secure installation of this certificate are omitted from
      this specification.  Please refer to <xref target="RFC4210" format="default"/>.</t>
          <t>Elliptical Curve encryption (see <xref target="RFC8422" format="default"/>) techniques
      are used in SVR. These are more efficient, and have smaller footprints
      than RSA which is necessary to efficiently operate inside the BFD protocol.
      The SVR Curve that is to be used is defined globally by an administrator.
      It is recommended that NIST Curve P-256 be used for all SVR metadata
      cryptography. All participating routers in an SVR network must use the
      same elliptic curve.</t>
          <t>Each peer sends a BFD packet that contains BFD Metadata in clear text
      that contains an x509 Router Certificate in PEM format (see
      <xref target="RFC5758" format="default"/>). See <xref target="peer_auth_procedure" format="default"/> for
      specifications.  Upon receipt, this certificate is verified like any other
      x509 certificate.  The common name in the certificate provides the authenticated
      name of the peer router.  The router must verify that the name identified
      in the certificate is a valid peer in its routing configuration. The
      certificate should have a locally verifiable chain to a trusted certificate
      authority.</t>
          <t>In our example above, there are three pathways. The BFD message with
      the x509 certificate is sent by each side (East and West) on each pathway.
      Each side verifies the certificate, and then determines if the peer pathway
      is valid and should be used between peers. To communicate that the peer
      has received the certificate, and to stop sending it in subsequent BFD
      packets, a BFD packet without a certificate is sent. This defines the
      handshake for the local and remote peer. If a certificate is ever
      required (for example when a routers IP address changes) a peer can
      request it be transmitted by sending its certificate.</t>
          <t>The public key of the router is stored and saved to verify signatures used
      in subsequent keying procedures (see <xref target="peer_key" format="default"/>. If the routers
      certificate is updated, this process must be repeated. Any outstanding
      valid keys remain operational, preventing outages during recertification.</t>
        </section>
        <!-- peer_auth -->
    
    <section anchor="peer_key" toc="include" numbered="true">
          <name>Peer Cryptographic Key/Re-keying</name>
          <t>In the above example <xref target="ex_setup" format="default"/>
      there are three pathways that define the peer
      relationship between East and West. Assuming that all three pathways
      have been authenticated, the East West peer relationship has three
      transport pathways that are authenticated.</t>
          <t>To securely send SVR that can't be intercepted by a man-in-the-middle
      an elliptical curve Peer Key needs to be determined that can only be known
      to the authenticated peers. Elliptical curve method requires each peer
      previously authenticated create a new key pair (see
      <xref target="peer_key_procedure" format="default"/>) every time a key is required or needs
      updated. The public keys for each side are signed by each router (ECDSA
      signature using the same public key from the routers authentication
      certificate above) and sent as BFD metadata inside BFD messages on one of
      the authenticated peer paths. This is transmitted once per second until a
      corresponding BFD message arrives without the BFD metadata. This provides
      the handshake guaranteeing delivery.</t>
          <t>As soon as both sides have each other's public key, an ECDH based  peer
      key can be calculated that can be used bidirectionally to encrypt all SVR
      metadata on any of the peer paths that represent the peer relationship. See
      <xref target="RFC8422" format="default"/> for more information on ECDH and ECDSA.</t>
          <t>To rekey, at any time, either party can generate a new key pair, and
      send a BFD message with a new public key. The peer will then respond with
      a newly computed public key, and the SVR peer key can be recomputed.</t>
          <t>With each new key computed, the security ID TLV <xref target="security_id" format="default"/>
      sent in SVR metadata is incremented to indicate which key version is to be
      used for decryption. This solves transitory race conditions that are theoretically
      possible.</t>
          <t>The same SVR Peer Key is used for all pathways between peers. This is
      beneficial when sessions move from one pathway to another during
      multipath routing use cases.</t>
        </section>
        <!-- peer_key -->

    <section anchor="peer_service_state" toc="include" numbered="true">
          <name>Bring Peer Into Service</name>
          <t>When a peer has at least one working authenticated pathway, and has
      calculated an Elliptical Curve Peer Key (ECPK), the SVR Peer is assumed
      ready for transport traffic bidirectionally, and the peer is declared
      operational and in service.</t>
        </section>
        <!-- peer_service_state -->
   
    <section anchor="peer_in_service" toc="include" numbered="true">
          <name>Resulting Peer Relationship</name>
          <t>When in service, East and West independently communicate using BFD to
      each other's interfaces to ensure operational status and measure path
      characteristics such as jitter, latency, and packet loss.  In our example,
      assuming 100 percent success, the resulting peer pathways would be:</t>
          <figure anchor="ex_peer_config">
            <artwork name="" type="" align="left" alt=""><![CDATA[

PEER: East -> West Authenticated/In Service
  Name      Description                    Characteristics
  MPLS      203.0.113.1->203.0.113.89      20ms Lat, 0 Loss,  2 Jit
  Internet  198.51.100.2->198.51.100.8     30ms Lat, 0 Loss,  3 Jit
  LTE       192.0.2.1->198.51.100.8        50ms Lat, 0 Loss, 15 Jit

PEER: West -> East Authenticated/In Service
  Name      Description                    Characteristics
  MPLS      203.0.113.89->203.0.113.1      20ms Lat, 0 Loss,  2 Jit
  Internet  198.51.100.8->198.51.100.2     30ms Lat, 0 Loss,  3 Jit
  LTE       198.51.100.8->192.0.2.1        50ms Lat, 0 Loss, 15 Jit

  ]]></artwork>
          </figure>
          <t>BFD is also used on in service Peer Pathways to determine MTU size
    and detect address changes, and monitor quality when idle.</t>
        </section>
        <!-- peer_in_service -->

  </section>
      <!-- Establish_peer -->

  <section anchor="svr_fib" toc="include" numbered="true">
        <name>CIDR based SVR Peer FIB Entries</name>
        <t>To route packets and sessions of packets onto SVR Peer Pathways, a
    route lookup must return an indication of either which peer pathway
    to use, or which peer to use.</t>
        <t>In the example shown below our assumption is that there are servers
    that are located inside 172.15.11.0/24 at the West location. West
    publishes or otherwise advertises this route to East on each path
    available to it.  Subsequently East's
    FIB will look like this:</t>
        <figure anchor="ex_fib">
          <artwork name="" type="" align="left" alt=""><![CDATA[
 
  East's Forward Information Base (FIB)
     Route             Next-Hop IP Addr
     ----------------  -----------------
     172.15.11.0/24    203.0.113.89
     172.15.11.0/24    198.51.100.8
     ....
     [FIB Entries to reach Waypoints omitted]

  ]]></artwork>
        </figure>
        <t>Additionally, we will assume there exists a network policy created by the
    authority Example that defines a tenant "engineering" as 10.0.0.0/25 VLAN2,
    and "github.example" as 172.15.11.23 using TCP port 22. The provisioning
    and/or discovery of this policy is outside the scope of this protocol
    description.</t>
        <t>A first packet from an engineering client with github as a destination
    received at the East SVR Router will result in a search of the FIB and result
    in two possible next-hop IP Addresses. East will consult its SVR Peer Pathway
    list and recognize that three of its peer pathways have an exact match of this
    next-hop IP Address. These represent the three possible pathways that may be
    used for routing this session. The resulting potential routes are:</t>
        <figure anchor="ex_fib_results">
          <artwork name="" type="" align="left" alt=""><![CDATA[
  Possible Routes
    MPLS      20ms Latency, 0 Loss,  2 Jitter
    Internet  30ms Latency, 0 Loss,  3 Jitter
    LTE       50ms Latency, 0 Loss, 15 Jitter
  ]]></artwork>
        </figure>
        <t>The East router can now choose which pathway (peer pathway) is desired for the 
    specific session. If the East router has quality service levels to maintain, it
    can choose from any of the peer pathways based on their current quality metrics.
    If all things are equal, the East router could load balance using approaches
    like "least busy" or other techniques. Once a peer pathway is chosen, the first
    packet metadata is constructed, inserted into the first packet, and sent down the
    chosen pathway to the West peer router.</t>
        <t>For this example, the private address space in the LAN supported by the
    East Router is different. This is often the case with large networks. This is 
    illustrative of a branch router performing network address translation (NAT)
    on a source address to solve overlapping address problems.</t>
        <t>In this specific case, assuming MPLS was chosen, East would perform first
    packet processing resulting in the insertion of metadata in the first packet
    (see <xref target="east_first_pkt_proc" format="default"/>) and send it out East's interface with
    a source address of 203.0.113.1 and a destination address of 203.0.113.89.
    These are the exact addresses of the MPLS Peer Pathway.</t>
        <t>Both the East and West routers would use the same address pairs (only
    reversed) for the bidirectional session, using the allocated
    source and destination ports to recognize the specific session. All packets
    from all sessions on a peer path will have the same exact IP addresses,
    differentiated solely by their port numbers.</t>
      </section>
      <!-- svr_fib -->
  
  <section anchor="svr_name_fib" toc="include" numbered="true">
        <name>Optional FIB Containing Service Names</name>
        <t>SVR first packet metadata contains text strings that contain service names.
    SVR routing can route traffic by these names if the FIB contained text entries.
    There are some use cases where this might make sense:</t>
        <dl newline="false" spacing="normal">
          <dt>Avoiding Dynamic DNS:</dt>
          <dd>Dynamic DNS is used to augment network
      routing protocols by answering the question: What best IP Address is available
      and best for a session now? Dynamic DNS can be plagued by delays in real time
      updates and additional complexity and cost. In private networks, path service
      state may not be reflected in Dynamic DNS responses.</dd>
          <dt>Multi-Cloud Networking:</dt>
          <dd>Public clouds run service instances
      on dynamically allocated private IP addresses. They provide very accurate and
      responsive DNS updates to help find IP addresses for networking. These DNS
      services are not available outside the cloud, making internetworking
      difficult. SVR Routers can use DNS resolution to find IP Addresses for
      named services.</dd>
        </dl>
        <t>Below is an example FIB that contains named services and traditional FIB
    entries. The next-hop addresses were changed to Waypoint Addresses to reflect
    the FIB is now an SVR fib containing service names, protocols, and ports.</t>
        <figure anchor="ex_name_fib">
          <artwork name="" type="" align="left" alt=""><![CDATA[
 
  East's Extended SVR Forward Information Base (OPTIONAL)

                                                       Egress 
  Service Name        Route                Waypoint    Action
  --------------     ------------------  ------------  --------
  github.example     172.15.11.23:TCP:22  203.0.113.89 FWD
  github.example     172.15.11.23:TCP:22  198.51.100.8 FWD
  logsvc.example     172.15.11.20:UDP:514 203.0.113.89 DNS
  logsvc.example     172.15.11.20:UDP:514 198.51.100.8 DNS
  https.example      172.15.11.24:TCP:443 203.0.113.89 DEST NAT
                                                       -196.168.1.1
                                                       -196.168.1.2
                                                       -196.168.1.3
     [FIB Entries to reach Waypoints omitted]

    ]]></artwork>
        </figure>
        <t>Longest prefix matching (LPM), protocol and port will be used to match Routes
    for packets intended for github on ingress to SVR. The text string "github.example" 
    will be used by all other SVR routers until egress from SVR. The SVR fib can
    be used to LPM match on IP addresses and exactly match protocol and ports. In the
    above illustrative example, only three protocols are supported (SSH, Syslog, and
    HTTPs). All other packets will be denied by default.</t>
        <t>The egress action in the SVR fib can be used to support three different egress
    actions:</t>
        <dl newline="false" spacing="normal">
          <dt>Forward Packet (Default):</dt>
          <dd>Restore the IP Addresses and forward. 
      If a source NAT is provided in the metadata, NAT the source address.</dd>
          <dt>DNS:</dt>
          <dd>Use DNS to resolve the service name locally. In this example
      DNS resolution procedures would be used on egress to resolve "logsvc.example".</dd>
          <dt>DEST NAT:</dt>
          <dd>NAT the destination address to one (or load balance to a
      pool of addresses). This is identical to load balancers.</dd>
        </dl>
        <t>These named routes can co-exist with traditional FIB entries shown above. SVR
    will always matched a named route first, and fall through to the generic routes 
    second.</t>
      </section>
      <!-- svr_name_fib -->

  <section anchor="security_definitions" toc="include" numbered="true">
        <name>SVR Security Definitions</name>
        <t>For basic SVR functionality to work between peers, there must be a
    Authority wide provisioned set of rules. These rules include:</t>
        <dl newline="false" spacing="normal">
          <dt>HMAC Method:</dt>
          <dd>This describes the method/technique for signing
      SVR packets. This could be SHA1, SHA256, or SHA256-128.</dd>
          <dt>Use Time Based HMAC:</dt>
          <dd>This is either YES or NO.</dd>
          <dt>HMAC Metadata or ALL:</dt>
          <dd>This is NONE, Metadata Only, ALL</dd>
          <dt>Metadata Block Cipher:</dt>
          <dd>This is either NONE, AES128, AES256.</dd>
          <dt>Elliptical Curve:</dt>
          <dd>This is the curve to use
      (defaults to Curve P-256).</dd>
        </dl>
        <t>SVR does not limit the use of ciphers and techniques to just those listed.
    The requirements for both signatures and encryption are that the results are 
    fixed well-known block sizes.</t>
        <t>Security Policies are used during session setup to setup payload encryption
    specifically for individual sessions. These are exchanged in first packet
    metadata.</t>
        <t>For this example will use the following SVR security definitions.</t>
        <figure anchor="security_definition_example">
          <artwork name="" type="" align="left" alt=""><![CDATA[

      HMAC: (On, time-based, SHA256-128, ALL Packets)
      Metadata Encryption (On, AES256)
      Elliptical Curve: Curve 256P (NIST)

    ]]></artwork>
        </figure>
      </section>
      <!-- security_definitions -->

  <section anchor="hmac_details" toc="include" numbered="true">
        <name>Time Based HMAC Details</name>
        <t>To positively authenticate and provide integrity for SVR session, SVR 
    peers use Time Based HMAC signatures. HMAC signatures are defined in
    <xref target="RFC2104" format="default"/>.  Please see <xref target="std_hmac_signature" format="default"/>.</t>
        <t>In our example, we are using SHA256-128 with a size of 16 Bytes.</t>
      </section>
      <!-- hmac_details -->

  <section anchor="key_versions" toc="include" numbered="true">
        <name>Security Keying/Rekeying Considerations</name>
        <t>Every metadata transaction includes a security ID header TLV (see
    <xref target="security_id" format="default"/>).</t>
        <t>Each SRV Peer will have its initial Peer Key (version 1) established during
    the peering establishment. The key may be updated at any time, and the key
    version will be incremented. The security key version is always
    sent in metadata to ensure the peer knows which key to use to decrypt
    the metadata just sent. If a peer only has version 1 of a key, and
    metadata arrives specifying it is now at version 2, the SVR router must
    obtain the new key before it can process any packets. Please see 
    <xref target="peer_key" format="default"/>).</t>
        <t>For networks that are large and actively performing key management,
    there may be multiple versions of a key active for very brief moments
    in time, and SVR routers MUST be able to utilize any key for a
    reasonable amount of time.</t>
      </section>
      <!-- key_versions -->

  <section anchor="new_session_init" toc="include" numbered="true">
        <name>New Session Initiation Detailed</name>
        <t>The diagram below shows the example github TCP session flowing
    between a client and server through the East and West routers
    in our example  network.</t>
        <t keepWithNext="true">Ladder Diagram for SSH Example:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

    Engineering                                      Github
    Client . . . . . . . . . . . . . . . . . . . . . Server
      |                                                 |
      +         East Router              West Router    |
      |            |                        |           |
      +---SYN----->|                        |           |
      |            |--SYN[MD]-------------->|           |
      |            |                        |--SYN----->|
      |            |                        |           |
      |            |                        |<--SYN/ACK-|
      |            |<------SYN/ACK[RMD]-----|           |
      |<--SYN/ACK--|                        |           |
      |            |                        |           |
      |            |                        |           |
      |<==== Session Packets Flow with No Metadata ====>|

      ]]></artwork>
        <t>The East Router MUST construct and insert metadata (MD) in the
    first packet of the SSH session, which will be a TCP SYN packet.
    The West Router must remove the metadata, and forward the SYN
    packet, and wait for the server to respond with a SYN/ACK.
    Upon receipt of the SYN/ACK, the West Router will create
    reverse metadata (RMD), and insert it into the SYN/ACK. This will
    create the metadata handshake for the SSH session. All forward
    and reverse metadata are inserted into existing packets if
    possible.</t>
        <t>When a client or router detects that a new session is being
    established, the East Router will insert metadata into the first packet to
    communicate intent to the West Router. At both East and West Routers,
    the first packet will require specialized handling.  Detecting a
    first packet for a session is protocol specific. For TCP, it's a new
    5-Tuple packet (new flow) with the just the SYN flag set. For UDP,
    it's simply a new 5-Tuple packet not currently in active use.</t>
        <section anchor="east_first_pkt_proc" toc="include" numbered="true">
          <name>East First Packet Processing</name>
          <t>Utilizing the same example, assume that the packet shown below
      arrives on the East Router from the Client LAN. The packet is
      the result of an engineer attempting to access a github service
      via SSH.</t>
          <t keepWithNext="true">Arriving Packet at East Router</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[
      Packet received on LAN side East Router 
      Engineer using SSH to access Github
      +---------+---------------------+--------------+----------+
      |L2 HDR   | IP Header           | TCP Header   | PAYLOAD  |
      |  VLAN=2 |    SRC=10.0.1.1     |   Sport=6969 |   Data   |
      |         |    DST=172.15.11.23 |   Dport=22   |  (N/A)   |
      +---------+---------------------+--------------+----------+
      ]]></artwork>
          <section anchor="determine_tenant" toc="include" numbered="true">
            <name>Determine Tenant</name>
            <t>Determine the Tenant. The tenant is a text name which describes the
        routes and policies that are available for a group of source IP
        addresses. Tenants are like security zones. In our example, the
        "engineer" is based upon VLAN 2, and the tenant will be "engineer" as
        named by the authority "example". The configuration and data models to
        map physical network attributes to named tenants is implementation
        specific. Associating a default tenant with every logical interface
        on a SVR Router is recommended.</t>
          </section>
          <!-- determine_tenant -->

    <section anchor="determine_service" toc="include" numbered="true">
            <name>Determine Service</name>
            <t>There are multiple ways to determine what an intended service is.
        Application Identification technology is used that understands all
        popular SaaS offerings. These techniques use combinations of IP 
        address ranges and ports, SNI fields in TLS, Common Name from
        Certificates, and extraction of URLs from http requests. Most
        popular SaaS vendors today publish and update frequently their
        CIDR blocks and ports used by their services. This is out of
        scope for this document.</t>
            <t>Longest prefix matching algorithms are used to extract the
        major and key services at a site. If there is traffic which 
        cannot be identified accurately, often it will be placed into
        a "catch-all" service called "internet".</t>
            <t>We will assume for this document, that the address 172.15.11.23
        is a well-known address for git servers at Example, and port 22
        is known to be SSH.</t>
          </section>
          <!-- determine_service -->

    <section anchor="determine_network_requirements" toc="include" numbered="true">
            <name>Determine Network Requirements</name>
            <t>Once the tenant and service have been determined, a lookup for
        network requirements can be determined.
        The requirements should include</t>
            <t keepWithNext="true">Example Network Requirements</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[

          SERVICE: github
            Access Policies:
              Tenants Allowed: engineering
              Tenants Denied: release.engineering
            Quality Policy: latency < 40ms
            Security Policy:None

        ]]></artwork>
            <t>The above definition for github defines an example network
        requirement. Access policies determine which tenants are 
        allowed, and if any specifically denied.  The Quality policy defines
        the service level experience requirements.  Secure Vector Routing
        exchanges tenants, services, and security policies using character
        strings in metadata. Access and quality policies are defined and
        used locally within a router and logically tied to the service.
        The implementation of quality and access policy controls are site
        specific. For example, VLAN based subnets may have different meanings
        at various locations. Also, QoS management schemes may be different
        for different network areas.</t>
          </section>
          <!-- determine_network_requirements -->
  
    <section anchor="picking_a_peer_path" toc="include" numbered="true">
            <name>Picking a Peer Path</name>
            <t>As stated previously, the East Router has three peer paths that
        can reach the destination based on L3 reachability. The next step
        is to apply the network requirements to see which of the peer paths
        remain. Our policy requires latency to be less than 40 Msecs, and this
        effectively eliminates East's LTE pathway from consideration. The
        remaining two pathways MPLS and Internet are both possible. We
        will choose MPLS as it has the lowest latency, offering the 
        user the best experience.</t>
            <t>Many different criteria can be used in selecting a peer pathway.
        In practice, how busy a peer path is and its capacity result in new
        sessions routing to 2nd best options. Often simple load balancing
        is used. In cases where there are higher costs (such as LTE or
        5G networking), these may be held in reserve for backup or 
        disaster recovery. The actual algorithms for picking peer pathways 
        are outside the scope of this protocol.</t>
          </section>
          <!-- picking_a_peer_path -->

    <section anchor="perform_source_nat" toc="include" numbered="true">
            <name>Allocate Source NAT if Necessary</name>
            <t>In this github example, there is a source NAT at the East Router
      on the MPLS interface to the datacenter. This by design allows all of the
      remote branch sites to use overlapping addresses, and is very common in larger
      networks. Routers that perform source NAT have two options: use the
      interface address and allocate a new source port, or use an IP address pool
      and allocate full IP addresses for each session. Either way, this
      allocated address only needs to be placed into metadata, as the existing
      packet address will be translated to Waypoint Addresses shortly. The
      egress SVR router will apply the source NAT.</t>
          </section>
          <!-- perform_source_nat -->

    <section anchor="allocate_svr_ports" toc="include" numbered="true">
            <name>Allocation of Ports</name>
            <t>The next step is to allocate new ports for the SVR session. The ports
      being allocated must not be in use, and should not have been used recently
      to avoid any issues with middleboxes.
      See <xref target="std_md_insertion" format="default"/>.</t>
            <t>The range of ports that can be used may be site specific and tied to
      policies that exist in upstream firewalls or middleboxes. For these
      reasons, the actual pool of available addresses is provisioned on every
      SVR router. The East router has ports 8000 to 24000 available for both the
      source and destination ports. In this example we will allocate an even 
      source port of 8000, and an odd destination port of 8001.</t>
          </section>
          <!-- allocate_svr_ports -->

    <section anchor="save_session_state" toc="include" numbered="true">
            <name>Session State and Metadata Construction</name>
            <t>The router now has reached a point where it can forward the packet.
      It has valid network requirements, available peer paths, and has available
      SVR ports. The next step is to create and save all session state
      information for subsequent packet processing. A session
      UUID is created for end-to-end tracking of sessions. The table below
      refers to metadata TLVs and specific contents that are documented
      in <xref target="meta_format" format="default"/>.</t>
            <t keepWithNext="true">Session State Table Entry</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[

State Information & Mappings to Metadata Fields

              Metadata TLV                          |------TLV------|
Category       -Field              VALUE             Type   Len  Hdr 
--------      ------------------   ----------------
Header                                                   12   
Header TLVs
              Security ID          1                   16     4    4
              Path Metrics                             26    10    4
               -Tx Color           5
               -Tx TimeValue       4200 MSecs
               -Rx Color           3
               -Rx TimeVlue        3950 MSecs
               -Drop               No
               -Prev Color Count   950 Packets
                                                            ---  ---
                            Total Header Length = 34 (26+8)  26    8

Payload TLVs
               Forward Context                         2     13    4
               - Source IP Addr     10.0.0.1
               - Dest IP Addr       172.15.11.23
               - Protocol           TCP
               - Source Port        6969
               - Dest Port          22
               Tenant Name          engineering         7    11    4
               Service Name         github             10     6    4
               UUID                 ABCDEFGHIJKLMNOP    6    16    4
               Source Router Name   East Router        14    11    4
               Source NAT Address   203.0.113.1        25     4    4
               Security Policy      NONE               15     4    4
               Peer Path                               19    22    4
               - Source Addr        203.0.113.1
               - Dest Addr          203.0.113.89
                                                            ---  ---
                         Total Payload Length = 119 (87+32)  87   32 

                                 To West     Fr West
              Allocated Ports     Router      Router
               -Source Port        8000        8001
               -Dest Port          8001        8000

              Session HMAC Key    [Peer Key at session start]
      ]]></artwork>
            <t>The required and optional metadata attributes that must be inserted
        in a first packet of a new sessions are defined in
        <xref target="std_ip_session_tlvs" format="default"/>.</t>
            <t>One optional metadata attribute is included in this example
        for the pathway metrics. This is documented in
        <xref target="path_metrics" format="default"/>.</t>
            <t>The order of the TLVs is arbitrary, but header TLVs must be
        before any payload TLVs. If a TLV is received that is unknown to a
        peer, it MUST ignore it. In this example, the header length including the
        two header TLVs is 34, and the 8 payload TLV's are 119 bytes long.</t>
            <t>The Session HMAC Key is state information retained by the router. 
        The Session HMAC Key is set to the current Peer Key at session
        initiation. This key is used for the life of a session.</t>
          </section>
          <!-- save_session_state -->

    <section anchor="encryption_of_metadata" toc="include" numbered="true">
            <name>Encryption of Metadata</name>
            <t>The next step is to encrypt the metadata block as defined in
      <xref target="std_metadata_encryption" format="default"/>. In our example, our provisioned
      security definitions include AES256 for metadata encryption.
      AES has a 128-bit block size for all key lengths. In our example,
      the metadata payload TLVs are 119 bytes large.  Padding will be added during
      encryption to make it 128 bytes (or 9 bytes of padding). In addition, to make
      the encrypted data stateless, we must also include a 16 byte initialization
      vector directly after the encrypted block. The resultant encrypted metadata
      block is 178 bytes and looks like this:</t>
            <t keepWithNext="true">Metadata Block</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
      +--------------+--------------+---------+----------------+
      | Metadata     | Metadata     |Padding  | Initialization |
      | Header )     | Payload TLVs |         |    Vector      |
      | (Unecrypted) | Payload TLVs |         |    Vector      |
      |  34 Bytes    | 119 Bytes    | 9 Bytes |  16 Bytes      |
      +--------------+--------------+---------+----------------+
      |<---Clear---->|<---Encrypted Portion-->|

      |<----------------178 Byte Metadata Block--------------->|

      ]]></artwork>
          </section>
          <!-- encryption_of_metadata -->

    <section anchor="insert_metadata" toc="include" numbered="true">
            <name>Insert Metadata</name>
            <t>The metadata block is inserted into the packet directly after the L4
        Header. The total length of this specific metadata block  is 178 bytes,
        34 of which are header bytes and 119 for payload TLVs. If there is data
        in the payload portion of the IP Packet, the payload data is moved down
        to make room for the metadata.  The packet structure will now look like:</t>
            <t keepWithNext="true">Metadata Added</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
      Packet with metadata inserted
      +---------------------+--------------+----------+-----------+
      | IP Header           | TCP Header   |Metadata  |  PAYLOAD  |
      |    SRC=10.0.1.1     |   Sport=6969 |Block     |    Data   |
      |    DST=172.15.11.23 |   Dport=22   |178 Bytes | (optional)|
      +---------------------+--------------+----------+-----------+
      ]]></artwork>
            <t>The transport addresses in the packet are updated to use the selected
        peer path.</t>
            <t keepWithNext="true">Transport Addresses Updated</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
      Final Transformed Packet with metadata inserted
      +---------------------+--------------+----------+-----------+
      | IP Header           | TCP Header   |Metadata  |  PAYLOAD  |
      |    SRC=203.0.113.1  |   Sport=8000 |Block     |    Data   |
      |    DST=203.0.113.89 |   Dport=8001 |178 Bytes | (optional)|
      +---------------------+--------------+----------+-----------+
      ]]></artwork>
          </section>
          <!-- insert_metadata -->

    <section anchor="signing_svr_pkts" toc="include" numbered="true">
            <name>Signing SVR Packet</name>
            <t>The packet containing metadata is now signed with a HMAC signature
        (See <xref target="hmac_details" format="default"/>). The HMAC signature is placed at the very
        end of the packet, extending the packet size by the signature's length.
        The IP header is excluded from the signature. The current peer key
        is used (see <xref target="peer_key_procedure" format="default"/>) for signing and
        verifying the authenticity of the packet. In this case the HMAC is
        16 bytes.</t>
            <t keepWithNext="true">HMAC Signature Added</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
    Packet with metadata inserted
    +-------------------+--------------+----------+---------+-----+
    |IP Header          | TCP Header   |Encrypted | PAYLOAD | HMAC|
    |  SRC=203.0.113.1  |   Sport=8000 | metadata |   Data  | 16  |
    |  DST=203.0.113.89 |   Dport=8001 |          |         |Bytes|
    +-------------------+--------------+----------+---------+-----+
                        |                                   |
                        |<=========HMAC Signed Data========>|

        ]]></artwork>
          </section>
          <!-- signing_svr_pkts -->

    <section anchor="xmit_first_packet" toc="include" numbered="true">
            <name>Sending the First Packet</name>
            <t>The packet length and checksum is corrected, and the packet is
        transmitted. The sending side will include the same
        exact metadata on every packet until a packet in the opposite direction
        (reverse direction) arrives with reverse metadata indicating a complete
        handshake. For TCP, the SYN packet contains metadata, and typically a
        SYN-ACK from the server side responds with metadata, and there is no
        further metadata inserted in a session.</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
        Client ---->    TCP SYN w/Metadata  ----> Server
        Server <---- TCP SYN-ACK w/Metadata <---- Server
        ]]></artwork>
            <t>For UDP, metadata can be inserted in packets until there is a reverse
        flow packet with metadata, except for unidirectional flows as noted 
        in Section 3.5.7.</t>
          </section>
          <!-- xmit_first_packet -->


  </section>
        <!-- east_first_pkt_proc -->

  <section anchor="west_first_pkt_proc" toc="include" numbered="true">
          <name>West First Packet Processing</name>
          <t>If a packet arrives at the West Router having the West Routers
      Waypoint (interface address) as a destination address (i.e., the
      packet was sent to the router, and not to a destination beyond the
      router) the packet may likely contain metadata. When this occurs, 
      the following steps are taken.</t>
          <section anchor="ck_src_addr_is_waypoint" toc="include" numbered="true">
            <name>Verify Source Address is a Waypoint</name>
            <t>Packets arriving on the routers must be verified to be valid
        before they are processed (see <xref target="std_metadata_checking"
            format="default"/>).
        These simple checks can eliminate any potential attack vectors.
        If the packet fails authentication or validation the packet MAY be
        dropped or responded to with an ICMP Destination Unreachable packet.</t>
            <t>In the example case we are using, there are only three source
        addresses that could be possible:</t>
            <t keepWithNext="true">Possible Source Addresses</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[
            203.0.113.1      MPLS Peer Pathway
            198.51.100.2     Internet Peer Pathway
            169.254.231.106  LTE Peer Pathway
           ]]></artwork>
          </section>
          <section anchor="ck_metadata_block" toc="include" numbered="true">
            <name>Verify Metadata Block</name>
            <t>The very first and most efficient test is to verify that
        the metadata is present is to look for header magic number
        (see <xref target="std_metadata_dpi" format="default"/>).</t>
            <t>The next verification step is to check the HMAC signature
        (see <xref target="std_hmac_signature" format="default"/>).  If the signature is
        invalid, the packet should be dropped and a security event noted. If
        valid, processing continues.</t>
            <t>The unencrypted portions of the metadata header should be
        verified for reasonableness. The Header Length and Payload Length
        must be less than the metadata block size.</t>
          </section>
          <!-- ck_metadata_block -->

      <section anchor="save_state_and_xlations" toc="include" numbered="true">
            <name>Parse Metadata and Save State and Translations</name>
            <t>The next step is to decrypt the metadata
        (See <xref target="std_metadata_decryption" format="default"/>).  If there are any
        reasons why the metadata block can not be decrypted, or the
        decryption fails, the packet is dropped.</t>
            <t>The payload TLVs can now be parsed and the necessary state
        and translations loaded into memory. If there is a failure
        to parse all TLV's, the packet is dropped.</t>
            <t>Next the metadata block and HMAC signatures are removed from
        the packet.</t>
          </section>
          <!-- save_state_and_xlations -->

      <section anchor="restore_addresses_and_route" toc="include" numbered="true">
            <name>Restore Addresses and Route Packet</name>
            <t>The metadata information is used to restore the original 
        context to the packet. The packet is then recursively processed
        exactly like the first packet described in
        <xref target="east_first_pkt_proc" format="default"/> with a few differences.
        The Context, Tenant, Service, Security Policy and Session UUID strings are
        used from the metadata (as opposed to locally determining them) eliminating
        these steps. These are then used for applying policy and routing
        decisions locally. The end result is the packet may go through
        another SVR Peer Pathway or be delivered via standard networking
        techniques. In this example, the West Router delivers the packet
        to the Server LAN.</t>
            <t>When the packet is forwarded to another SVR Peer, there are
        some differences. The Tenant, Service, Session UUID, Security Policy 
        and the original 5-tuple addresses are all cloned. This provides
        consistent data across a multi-hop SVR network. It should be
        noted that the metadata must be decrypted at every SVR Router
        and then re-encrypted because the Waypoint addresses are
        different for each selected peer pathway.</t>
          </section>
          <!-- restore_addresses_and_route -->

      <section anchor="looping_session_detection" toc="include" numbered="true">
            <name>Detection of a Looping Session</name>
            <t>Because every hop between SVR Routers utilizes the same 
        session UUID, a looping first packet is easy to detect. There
        MUST never be two sessions with the same UUID. Any session that
        loops must be dropped. By detecting looping packets during the
        first packet transmitted, subsequent packets can be dropped on
        ingress by the SVR Router that detected the looping behavior.
        SVR routers must also decrement the TTL and operate in all ways
        like a traditional router to prevent looping packets that are
        not detected by SVR.</t>
            <t>When a packet arrives with metadata after the metadata
        handshake has been completed, it is assumed to be an update and
        not classified as looping. Updates can be used to change any
        attribute, but most commonly to change a peer pathway for
        a session. See <xref target="moving_session" format="default"/>.</t>
          </section>
          <!-- looping_session_detection -->

  </section>
        <!-- west_first_pkt_proc -->

  <section anchor="return_rules_establish" toc="include" numbered="true">
          <name>Return Packet Path Pre-Established</name>
          <t>After processing the first forward  packet at both East and West
     routers, both the East and West routers have established packet
     forwarding rules and translations for both directions. This means that
     eastbound rules and westbound rules are all established and
     installed. The router is thus capable now of recognizing 5-tuples
     in either direction and acting on the packets without consulting
     routing tables. This is known as fast path processing.</t>
        </section>
        <!-- return_rules_establish -->

  <section anchor="sending_reverse_metadata" toc="include" numbered="true">
          <name>Sending Reverse Metadata</name>
          <t>On a session-by-session basis, SVR Routers must know the status
      of a metadata handshake. If a packet for a session arrives and the
      metadata handshake is not complete, the SVR Router must insert
      metadata for the session. This will continue until there is verification
      that the SVR Peer has received the information. As stated
      previously, for TCP SYN this is normally the first reverse packet
      which is a TCP SYN/ACK. The purpose of reverse metadata is:</t>
          <ul spacing="normal">
            <li>To indicate to the sender that it can stop sending metadata.
        (Completion of the metadata handshake.)</li>
            <li>Provide backward information about the service for routing of future
        instances.</li>
          </ul>
          <t>In this example, the reverse metadata includes:</t>
          <t keepWithNext="true">Reverse Metadata Response</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

          Reverse Metadata Response
State Information & Mappings to Metadata Fields

              Metadata TLV                          |------TLV------|
Category       -Field              VALUE             Type   Len  Hdr 
--------      ------------------   ----------------
Header                                                   12   
Header TLVs
              Security ID          1                   16     4    4
              Path Metrics                             26    10    4
               -Tx Color           3
               -Tx TimeValue       4100 MSecs
               -Rx Color           5
               -Rx TimeVlue        4050 MSecs
               -Drop               No
               -Prev Color Count   1950 Packets
                                                            ---  ---
                           Total Header Length = 34 (26+8)   26    8

Payload TLVs
               Reverse Context                         4     13    4
               - Source IP Addr     203.0.113.1
               - Dest IP Addr       172.15.11.23
               - Protocol           TCP
               - Source Port        7891
               - Dest Port          6969
               Peer Path                               19    22    4
               - Source Addr        203.0.113.89
               - Dest Addr          203.0.113.1
                                                            ---  ---
                          Total Payload Length = 43 (35+8)  35     8 

                                   To East     From East
               Allocated Ports     Router       Router 
               - Source Port        8001         8000
               - Dest Port          8000         8001

              Session HMAC Key   [Peer key used by remote peer]

      ]]></artwork>
          <t>See <xref target="std_req_tlvs" format="default"/> for required and optional TLVs in
      reverse metadata.</t>
          <t>One optional metadata attribute is included in this example
      for the pathway metrics. This is documented in
      <xref target="path_metrics" format="default"/>.</t>
          <t>The Session HMAC Key is state information retained by the router.
      The Session HMAC Key is set to the Peer Key version specified in
      the SVR Metadata (Security ID). This is most like the current Peer
      Key but it is possible ReKeying could create a race condition. To
      solve this problem, the Session State for routers terminating SVR 
      sessions uses the Peer Key indicated by the initiator. This key is
      used for the life of a session.</t>
          <t>One of the outstanding benefits of SVR is the complete tracking
      end-to-end of sessions. In this example, the metadata state located 
      in the SVR router contains all addresses used. The forward context
      provides the egress SVR router with the addresses being used pre-NAT,
      and the source NAT information. The reverse context would likewise
      supply the ingress SVR destination NAT addresses. Also knowing the
      Waypoint Addresses used along with the ports used provides a complete
      end-to-end visibility of each session.</t>
          <t>This metadata will be encrypted, inserted, and an HMAC checksum
      will be computed and attached as per the previous example. The
      reverse packet in this example will have 34 bytes of header data,
      and 43 bytes of payload data, 5 bytes of padding, and a 16 byte
      initialization vector resulting in a metadata block that is 98
      bytes long.</t>
        </section>
        <!-- sending_reverse_metadata -->

    <section anchor="subs_pkt_proc" toc="include" numbered="true">
          <name>Subsequent Packet Processing</name>
          <t>As soon as an SVR peer receives a packet of a session from another
      SVR peer and there is no metadata, the SVR Handshake is complete, and
      it can stop sending metadata. This work for both the East Router and
      the West Router. Both will transmit metadata until they receive a 
      packet without metadata.</t>
        </section>
        <!-- subs_pkt_proc -->

    <section anchor="session_terminate" toc="include" numbered="true">
          <name>Session Termination</name>
          <t>No metadata is sent upon normal session termination. The router can
      monitor the TCP state machine and have a guard timer after seeing a
      FIN/ACK or RST exchange. After the guard timer, the session can be
      removed from the system. If a new session arrives during this period (a
      TCP SYN), then it will cause immediate termination of the existing
      session. In addition, all protocols also have an associated inactivity
      timeout, after which the session gets terminated if no packets flow in
      either direction. Should an existing session send a packet after the
      inactivity timeout, it will be processed as a new session.</t>
        </section>
        <!-- session_terminate -->

    <section anchor="unicast_async_flows" toc="include" numbered="true">
          <name>Unidirectional/Asymmetric Flows</name>
          <t>When there are unidirectional flows, or path asymmetry (e.g. TCP
      sequence numbers advance with no reverse packets observed), and there
      is end-to-end communication, one can stop sending metadata. For UDP
      asymmetry, the sending router will send a maximum of 11 packets with
      metadata; if no reverse packets are seen during that time, the receiving
      peer router generates and sends a disable metadata packet to the
      originating router to complete the metadata handshake.</t>
        </section>
        <!-- unicast_async_flows -->

    <section anchor="session_ladder" toc="include" numbered="true">
          <name>Multi-Hop Session Ladder Diagram</name>
          <t>The diagram below shows a typical normal TCP session flowing between
      a client and server through routers in a network.</t>
          <t keepWithNext="true">Ladder Diagram for Session Initiation
            with Metadata:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          +         RouterA       RouterB      RouterC        |
          |            |             |            |           |
          +---SYN----->|             |            |           |
          |            |--SYN[MD1]-->|            |           |
          |            |             |--SYN[MD2]->|           |
          |            |             |            |--SYN----->|
          |            |             |            |           |
          |            |             |            |<--SYN/ACK-|
          |            |             |<--SYN/ACK--|           |
          |            |<--SYN/ACK---|   [RMD2]   |           |
          |<--SYN/ACK--|    [RMD1]   |            |           |
          |            |             |            |           |
          |            |             |            |           |
          |<===== Session Packets Flow with No Metadata =====>|

        ]]></artwork>
          <t>Note that each router constructs metadata for the next chosen peer
      in the routed pathway as depicted by MD1 and MD2 in the above diagram.
      Upon receipt of first reverse packet, reverse metadata RMD2 and RMD1 is
      inserted.  Each router allocates its own transport addresses (Waypoints)
      for each session.  The context, service name, tenant name, and session
      UUID  are sent unchanged between all routers, and can be used for
      determining routing policies to apply. The session UUID is the same in
      MD1, MD2, RMD1, and RMD2 in the above diagram.</t>
          <t>Likewise, the diagram below shows a session teardown sequence
      for a typical TCP session.</t>
          <t keepWithNext="true">Ladder Diagram for Session Teardown Metadata:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          +         RouterA       RouterB      RouterC        |
          |            |             |            |           |
          +---FIN----->|             |            |           |
          |            |-----FIN---->|            |           |
          |            |             |----FIN---->|           |
          |            |             |            |-----FIN-->|
          |            |             |            |           |
          |            |             |            |<--FIN/ACK-|
          |            |             |<--FIN/ACK--|           |
          |            |<--FIN/ACK---|            |           |
          |<--FIN/ACK--|             |            |           |
          |            |             |            |           |
          |            |             |            |           |
        ]]></artwork>
          <t>No metadata is sent or required when sessions terminate. Each
      router keeps its state information for a programmed length of time
      in case a FIN/ACK is delayed or dropped, then the state information
      is removed.</t>
        </section>
        <!-- session_ladder -->
  </section>
      <!-- new_session_init -->

</section>
    <!-- SVR_example -->

<section anchor="std_svr" toc="include" numbered="true">
      <name>SVR Protocol Definition</name>
      <t>This section provides the normative requirements for SVR Metadata to
  achieve interoperability.</t>
      <section anchor="std_session_types" toc="include" numbered="true">
        <name>SVR Session Definitions and Types</name>
        <t>SVR implementations MUST support TCP, UDP, and ICMP. SVR implementations
     SHOULD support UDP Unicast. Sessions are characterized by having an initial
     first packet that is a unique to an SVR router. Often this is described as a
     unique 5-tuples as seen by the router.  Sessions start when the first packet is
     processed, and end when either the L4 protocol indicates the session is completed
     (TCP FIN/FIN ACK) or there has been no activity for a length of time (UDP,
     ICMP, UDP Unicast, point-to-point ethernet).</t>
        <t>SVR is always OPTIONAL. SVR implementations  can choose when
     to use SVR on a session-by-session basis. SVR implementations MUST
     support non-SVR traffic.</t>
      </section>
      <!-- std_session_types -->

  <section anchor="std_md_insertion" toc="include" numbered="true">
        <name>SVR Metadata Insertion</name>
        <section anchor="std_md_location" toc="include" numbered="true">
          <name>Metadata Packet Location</name>
          <t>SVR implementations MUST insert metadata into packets directly after the
      L4 header, even if the resulting increase in packet size would cause the
      packet to require fragmentation. For Ethernet point-to-point and ICMP error
      messages, IP Headers and L4 headers MUST be created, and if associated with an
      existing session MUST share the exact transport 5-tuples (SVR Waypoints and Ports)
      as the session the ICMP error message relates to. The metadata MUST be in the
      very first packet of a new session (TCP or UDP bidirectional flow) to have any
      role in path selection or security. Metadata SHALL be sent in any subsequent packet
      in any direction to change or update the networking requirements. The metadata is
      inserted into the payload portion of a packet to guarantee it makes it unchanged
      through the network. Packet lengths and checksums MUST be adjusted accordingly.
      TCP sequence numbers MUST NOT be adjusted.</t>
        </section>
        <!-- std_md_location -->

    <section anchor="std_md_prereq" toc="include" numbered="true">
          <name>Metadata Prerequisites</name>
          <t>A prerequisite for SVR metadata insertion is that a Peer Pathway MUST be
      selected relating to a specific session. This is similar to choosing
      a tunnel between two networks. This Peer Pathway has IP addresses on either
      side (Waypoint Addresses), and these addresses will always be the transport
      IP addresses for packets containing SVR metadata.</t>
        </section>
        <!-- std_md_prereq -->

    <section anchor="std_md_port_alloc" toc="include" numbered="true">
          <name>Metadata Port Allocation for Sessions</name>
          <t>The SVR peer originating the session (client side) MUST allocate both source
      and destination ports. The ingress side MUST choose even ports for local
      (source port) and odd ports for remote (destination port) This provides total
      uniqueness between any two peers, with no negotiation or collision
      possibilities. The range of ports to use for allocation is provisioned.
      Ports in use MUST be excluded from allocation. Ports MUST be unallocated when
      session state is removed. Ports MUST have a 60 second guard time before
      being reallocated</t>
        </section>
        <!-- std_md_port_alloc -->

    <section anchor="std_md_no_piggyback" toc="include" numbered="true">
          <name>Metadata on Idle Session</name>
          <t>SVR implementations MAY need to send metadata to a peer at a time when
    there are no existing packets. In these cases an IP packet MUST be created and
    inserted into the appropriate existing session with an indication the packet
    should be dropped. See <xref target="nat_keep_alive" format="default"/> for an example. The packet
    MUST be processed, interpreted, and dropped by the directly adjacent peer and
    not forwarded to any other SVR peer.</t>
        </section>
        <!-- std_md_no_piggyback -->

    <section anchor="std_md_pkt_structure" toc="include" numbered="true">
          <name>Metadata Packet Structure</name>
          <artwork name="" type="" align="left" alt=""><![CDATA[
   Existing IP Packet with metadata inserted
   +------------------+-----------------+---------+----------+----+
   | Existing IP Hdr  | Existing L4 Hdr |Metadata | PAYLOAD  |HMAC|
   |   Source IP Addr |   Source Port   |Block    |   Data   |    |
   |   Dest IP Addr   |   Dest Port     |         |(optional)|    |
   +------------------+-----------------+---------+----------+----+

   GeneratedIP Packet with metadata inserted
   +-------------------+------------------+---------+----+
   | Created  IP Hdr   | Created L4 Hdr   |Metadata |HMAC|
   |   Source IP Addr  |   Source Port    |Block    |    |
   |   Dest IP Addr    |   Dest Port      |         |    |
   +-------------------+------------------+---------+----+

   ICMP Packet with metadata inserted
   +-----------------+----------------+----------+--------+----+
   | Created IP Hdr  |Created UDP Hdr |Metadata  |  ICMP  |HMAC|
   |   Source IP Addr|   Source Port  |Block     |  MSG   |    |
   |   Dest IP Addr  |   Dest Port    |          |        |    |
   +-----------------+----------------+----------+--------+----+

   Ethernet Packet with metadata inserted
   +-----------------+----------------+---------+---------+----+
   | Created IP Hdr  |Created UDP Hdr |Metadata | Ethernet|HMAC|
   |   Source IP Addr|   Source Port  |Block    | MSG     |    |
   |   Dest IP Addr  |   Dest Port    |         |         |    |
   +-----------------+----------------+---------+---------+----+

      ]]></artwork>
          <t>If UDP protocol, the UDP Header MUST be updated to have the correct
     packet length.</t>
          <t>The Layer 4 header (TCP/UDP) MUST have its checksum recalculated per
     the appropriate procedures.</t>
          <t>The IP Packet length field MUST be updated to reflect the number of
     bytes added for the metadata block AND the HMAC signature.</t>
          <t>The IP Header Checksum MUST be updated after the IP Packet length is
     adjusted.</t>
          <t>If TCP protocol, the TCP Sequence numbers MUST NOT be changed.</t>
        </section>
        <!-- std_md_pkt_structure -->
    <section anchor="std_false_positives" toc="include" numbered="true">
          <name>Prevention of False Positives</name>
          <t>Metadata is sent inside the payload portion of TCP and UDP packets.
      Given that no byte sequence is truly unique in the payload of a
      packet, in the scenario where the original payload after the L4 header
      contained the same byte sequence as the SVR magic number, false positive logic is
      enacted on the packet. This guarantees downstream SVR routers will not confuse
      metadata magic number signatures.</t>
          <t>False positives SHALL NOT occur when first packets are processed, since
      valid metadata will always be inserted regardless of the contents of the first
      8 bytes of the payload. False positive can only occur during existing valid SVR
      sessions between peers.</t>
          <t>To implement false positive logic, SVR implementations MUST insert an empty
      metadata header (12 byte header with 0 TLVs). This creates a contract with
      downstream SVR routers that if the magic number is present, there MUST
      be valid metadata that requires processing and removal.</t>
          <t>The structure of a false positive metadata includes just a header
      of length 12 bytes, with zero header TLVs and zero payload TLVs. 
      The SVR router receiving a packet with false positive metadata will strip out
      the metadata header and any TLV's as is normally expected. The inserted
      metadata header has no TLV's and is not encrypted.</t>
          <t keepWithNext="true">Metadata Location</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

   Received Midstream SVR Packet matching SVR Magic Number
   +-------+--------+-------------------------+
   |IP Hdr | L4 Hdr |0x4c48dbc6ddf6670c ..... |
   +-------+--------+-------------------------+

   Midstream SVR Packet with False Positive metadata inserted
   +--------+--------+--------+---------------------------+
   | IP Hdr | L4 Hdr |Metadata| 0x4c48dbc6ddf6670c ...... |
   |        |        |  HDR   |                           |
   +--------+--------+--------+---------------------------+

      ]]></artwork>
          <t>Insertion of header or payload TLV's is OPTIONAL and at the discretion
      of the implementation. If adding TLV's, standard procedures MUST be applied
      including encryption if payload TLV's are added.</t>
        </section>
        <!-- std_false_positives -->
    <section anchor="std_udp_transform" toc="include" numbered="true">
          <name>TCP to UDP Transformation</name>
          <t>TCP to UDP transformation is required when a middlebox blocks certain
      TCP packets that contain metadata.  SVR implementations typically test
      Peer Pathways to ensure metadata insertion into TCP SYN packets will pass
      through any middleboxes. If TCP SYN packets with metadata are dropped by
      a middle box, then TCP packets are transformed to UDP for SVR processing,
      and restored when exiting SVR processing. The steps to transform TCP to 
      UDP are:</t>
          <t>The protocol field in the IP header
      MUST be changed from 0x06 (TCP) to 0x11(UDP).</t>
          <t>The UDP checksum will
      write over the sequence number. To save the sequence number, it is copied
      to the 32-bit checksum/urgent pointer location of the TCP header.</t>
          <t>To positively
      communicate that TCP to UDP transformation has occurred, one must add
      TLV 12 to the metadata being transmitted.
      See <xref target="tcp_syn_pkt" format="default"/>.</t>
          <t>The UDP transformation is for every packet in a session, not just the
      packets with metadata. The restoration process is depicted in
      <xref target="std_udp_untransform" format="default"/>.</t>
        </section>
        <!-- std_udp_transform -->
  </section>
      <!-- std_md_insertion -->

  <section anchor="std_req_tlvs" toc="include" numbered="true">
        <name>Required and Optional TLVs</name>
        <section anchor="std_ip_session_tlvs" toc="include" numbered="true">
          <name>New and Moved IP Sessions TLVs</name>
          <t>The metadata TLVs that MUST be inserted in a first
        forward metadata packet of a new sessions includes:</t>
          <ul spacing="normal">
            <li>Header: Security Identifier: see
            <xref target="security_id" format="default"/>.</li>
            <li>Payload: Forward Context: see
            <xref target="fwd_ctx_v4" format="default"/>, 
            <xref target="fwd_ctx_v6" format="default"/>.</li>
            <li>Payload: Tenant Name: see
            <xref target="tenant_name" format="default"/>.</li>
            <li>Payload: Service Name: see
            <xref target="service_name" format="default"/>.</li>
            <li>Payload: Session UUID: see
            <xref target="session_uuid" format="default"/>.</li>
            <li>Payload: Source Router Name: see
            <xref target="src_rtr_name" format="default"/>.</li>
            <li>Payload: Security Policy: see
            <xref target="src_rtr_sec_policy" format="default"/>.</li>
            <li>Payload: Peer Pathway ID: see
            <xref target="peer_rtr_id" format="default"/>.</li>
          </ul>
          <t>Optional metadata TLV's that MAY be included in forward metadata are:</t>
          <ul spacing="normal">
            <li>Header: Patch Metrics: see
              <xref target="path_metrics" format="default"/>.</li>
            <li>Header: SVR Control Message: see
              <xref target="proto_msg" format="default"/>.</li>
            <li>Payload: Session Encrypted: see
              <xref target="session_encrypt" format="default"/>.</li>
            <li>Payload: TCP Syn Packet: see
              <xref target="tcp_syn_pkt" format="default"/>.</li>
            <li>Payload: IPv4 Source NAT Address: see
              <xref target="src_nat_addr_v4" format="default"/>.</li>
            <li>Payload: Remaining Session Time: see
              <xref target="remaining_session_time" format="default"/>.</li>
          </ul>
          <t>The order of the TLVs is arbitrary, but header TLVs must be
        before any payload TLVs. If a TLV is received that is unknown to a
        peer, it MUST ignore it.</t>
          <t>The metadata TLVs that MUST be inserted in a first
        reverse packet of a new sessions include:</t>
          <ul spacing="normal">
            <li>Header: Security Identifier: see
              <xref target="security_id" format="default"/>.</li>
            <li>Payload: Reverse Context: see 
              <xref target="rev_ctx_v4" format="default"/>,
              <xref target="rev_ctx_v6" format="default"/>.</li>
            <li>Payload: Peer Pathway ID: see
              <xref target="peer_rtr_id" format="default"/>.</li>
          </ul>
          <t>Optional metadata TLV's that MAY be included reverse metadata are:</t>
          <ul spacing="normal">
            <li>Payload: Patch Metrics: see
              <xref target="path_metrics" format="default"/>.</li>
          </ul>
        </section>
        <!-- std_ip_session_tlvs -->

    <section anchor="std_icmp_session_tlvs" toc="include" numbered="true">
          <name>ICMP TLVs</name>
          <t>The metadata TLVs that MUST be inserted when 
        returning an ICMP Error include:</t>
          <ul spacing="normal">
            <li>Header: ICMP Error Location Address: see
              <xref target="rtr_egress_src_addr_v4" format="default"/>,
              <xref target="rtr_egress_src_addr_v6" format="default"/>.</li>
          </ul>
          <t>Optional metadata TLV's that MAY be included reverse metadata are:</t>
          <ul spacing="normal">
            <li>Header: Patch Metrics: see
              <xref target="path_metrics" format="default"/>.</li>
          </ul>
        </section>
        <!-- std_icmp_session_tlvs -->
  </section>
      <!-- std_req_tlvs -->
  <section anchor="std_metadata_encryption" toc="include" numbered="true">
        <name>Metadata Encryption</name>
        <t>Encryption of metadata utilizes block mode ciphers.
      Cipher's MUST have a consistent block size. The cipher to use and
      its block size MUST be provisioned and known to peers in advance.
      The provisioning methodology is outside the scope of this document. 
      The Peer Key used for encryption is specific to all Peer Pathways between
      any two peers and is obtained using BFD with metadata (See
      <xref target="peer_key_procedure" format="default"/>). When data is encrypted with
      block mode ciphers, the block will be padded with zeros (0x0's) to
      equal an increment of the block size used by the cipher.
      An initialization vector allows the decryption to be performed without
      any state.</t>
        <t keepWithNext="true">Metadata Block</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

          Cipher      Block Size        IV Size
         -------   -----------------     -------
          AES256   128 Bits(16 Bytes)    16 Bytes
          AES128   128 Bits(16 Bytes)    16 Bytes

      +----------+--------+---------+--------+----------------+
      | Metadata | Header | Payload |Padding | Initialization |
      | Header   | TLVs   | TLVs    |        |    Vector      |
      +----------+--------+---------+--------+----------------+
      |<------Clear------>|<-- Encrypted --->|

      |<---------------------- Metadata Block ---------------->|
      ]]></artwork>
        <t>The padding can be computed as the length of the metadata payload
      TLVs MOD block size.</t>
      </section>
      <!-- std_metadata_encryption -->
  <section anchor="std_metadata_hmac" toc="include" numbered="true">
        <name>SVR Packet Authentication</name>
        <section anchor="std_hmac_signature" toc="include" numbered="true">
          <name>HMAC Signatures</name>
          <t>Through provisioning (outside the scope of this document), an SVR Authority
      MUST define if HMAC signatures are to be used. An SVR Authority MUST also define
      if Time Based HMAC is to be used. AN SVR Authority MUST determine if ALL packets
      are signed, or just packets containing metadata. Due to the possibility of
      replay attacks, it is RECOMMENDED that Time Based HMAC signatures be used on
      ALL SVR packets. The Session HMAC Key is determined at session initialization
      and defaults to the Peer Key (see <xref target="peer_key_procedure" format="default"/>).</t>
          <t>SVR Peers SHOULD sign all packets with HMAC signatures defined in
      <xref target="RFC2104" format="default"/>. The Session HMAC Key should be used when creating
      an HMAC signature. When present there MUST be only one HMAC signature
      in an IP packet even if it fragments across multiple physical IP packets.
      Time-based HMAC signatures are RECOMMENDED. For time-based HMAC signatures,
      SVR routers append the current time since epoch (measured in seconds) divided by 2
      to the data being signed. SVR routers MUST have clocks synchronized accurately.
      Methods for synchronizing clocks and measuring any differences or drifts are
      outside the scope of this document. Minimally NTP <xref target="RFC5905" format="default"/>
      should be implemented. In cases where the current time cannot be relied on,
      one may need to disable the time based HMAC and use a standard HMAC, but this
      is NOT RECOMMENDED.</t>
          <t>The HMAC signature is always added to the very end of a packet. The size of
      the HMAC signature depends on which signature is used. Well known HMAC types
      are used with SVR including SHA1, SHA256-128, and SHA256.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

    SVR Packet with metadata inserted
    +-----------+--------------+---------+----------+-------+
    |IP Header  |  L4 Header   |Metadata | PAYLOAD  | HMAC  |
    |           |              |         |(optional)|       |
    +-----------+--------------+---------+----------+-------+
                |                                   |
                |<======= HMAC Signed Data ========>|

    Subsequent SVR Packet 
    +-----------+--------------+---------+-------+
    |IP Header  |  L4 Header   |Payload  | HMAC  |
    |           |              |         |       |
    +-----------+--------------+---------+-------+
                |                        |
                |<== HMAC Signed Data ==>|


       HMAC TYPE          LENGTH OF SIGNATURE
      ------------------  ----------------------
         SHA1             20 Bytes
         SHA256-128       16 Bytes
         SHA256           32 Bytes

      ]]></artwork>
        </section>
        <!-- std_hmac_signature -->
    <section anchor="std_hmac_verification" toc="include" numbered="true">
          <name>HMAC Verification</name>
          <t>If HMAC signatures are present in an SVR implementation, SVR implementations
      MUST verify and remove the signature. Verification provides both authentication
      of the SVR router that sent the packet, and integrity that the packet has not been
      modified in any way intentionally, or through transmission errors between two
      SVR routers.</t>
          <t>Through provisioning (outside the scope of this document), an SVR Authority
      MUST define if HMAC signatures are present. An SVR Authority MUST also define
      if Time Based HMAC is to be used. AN SVR Authority MUST determine if ALL packets
      are signed, or just packets containing metadata. Due to the possibility of
      replay attacks, it is RECOMMENDED that Time Based HMAC signatures be used on
      ALL SVR packets. The Session HMAC Key associated with the session state is
      used for all HMAC signatures and verification.</t>
          <t>To verify the HMAC signature, a new signature is generated on the packet and
      bytewise compared to the signature transmitted in the packet.</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

    SVR Packet with HMAC Signature
    +-----------+--------------+----------+-------+
    |IP Header  |  L4 Header   | PAYLOAD  | HMAC  |
    |           |              |(optional)|       |
    +-----------+--------------+----------+-------+
                |                         |
                |<== Signed Data ========>|


    SVR Packet with HMAC Signature removed
    +-----------+--------------+----------+
    |IP Header  |  L4 Header   | PAYLOAD  |
    |           |              |(optional)|
    +-----------+--------------+----------+

      ]]></artwork>
          <t>For efficiency reasons, when verifying an Time Based HMAC signature,
      implementers SHOULD compute the HMAC on the packet (not including the IP
      header) and save the preliminary result. Then try updating the HMAC signature
      with the current window value. If this fails to match the signature, one must try
      updating the preliminary result using the next time window by adding 2 seconds 
      (or previous by subtracting 2). If the time window is determined to be the
      next time window; it will remain that way for all packets received from a
      particular peer until it advances with clock time. Keeping an active time window
      per peer can make this process much more efficient.</t>
          <t>If the signature does not match after checking adjacent time windows and
      newly issued keys, then the packet is dropped and a security event noted.</t>
          <t>If the signature matches exactly the signature in the packet, then the packet
      has been authenticated as being sent by the previous SVR router, and assured
      that the packets integrity between the two routers is good. The HMAC signature
      MUST be removed from the packet.</t>
          <t>The IP Packet length field MUST be updated to reflect the number of
      bytes removed.</t>
          <t>The IP Header Checksum MUST be updated after the IP Packet length is
      adjusted.</t>
        </section>
        <!-- std_hmac_verification -->
  </section>
      <!-- std_metadata_hmac -->
  <section anchor="std_metadata_processing" toc="include" numbered="true">
        <name>Processing SVR Packets with Potential Metadata</name>
        <t>Routers MUST process SVR traffic and non-SVR traffic. SVR Routers MUST keep
    track of sessions that are using SVR. Only sessions setup with SVR may use
    the procedures described below. Traffic that is using SVR will always 
    originate and terminate on Waypoint addresses (known peer pathways). This
    provides efficient separation of non-SVR traffic and SVR traffic.</t>
        <t>Packets received on known Peer Pathways MUST be assumed to either have metadata
    or be packets associated with existing SVR sessions.</t>
        <section anchor="std_metadata_dpi" toc="include" numbered="true">
          <name>Detection of Potential Metadata in Packets</name>
          <t>Any packet could arrive at any time with metadata. DPI MUST be used
        to scan for the presence of metadata on every packet. Metadata MAY be 
        expected and required for first packet processing, and the absence of
        metadata will result in dropped packets.</t>
          <t>The HMAC verification step (defined above) MUST be performed prior
        to performing any other metadata verification steps. This prevents attacks
        by modifying packet on the wire.</t>
          <t>If the first 8 bytes of the payload (TCP or UDP) exactly matches the
        SVR magic number (0x4c48dbc6ddf6670c) it indicates that packet MUST have
        metadata. If the first 8 bytes do not match, the packet does not contain
        metadata. If metadata is not present the packet SHOULD be routed if part of
        an existing session (See <xref target="std_session_packets" format="default"/>). If not part
        of an existing session the packet MUST be dropped and a security event noted.</t>
        </section>
        <!-- std_metadata_dpi -->

    <section anchor="std_metadata_checking" toc="include" numbered="true">
          <name>Verification of Metadata in Packets</name>
          <section anchor="std_metadata_initial_parsing" toc="include" numbered="true">
            <name>TLV Parsing</name>
            <t>The metadata header is parsed (see <xref target="meta_header" format="default"/>). If the
          header length and payload length are both zero, the metadata is simply removed
          and the packet is forwarded. Please see <xref target="std_false_positives" format="default"/>
          for description of false positive metadata header insertion.
          The next step is to walk the header TLV's to ensure they are reasonable. If 
          the payload length is zero, then the metadata can be accepted and processed.
          Decryption of metadata is only required when there are payload TLV's.</t>
            <t>If a TLV is sent that is unknown to the implementation, the TLV should be
          skipped and the TLV MUST NOT be forwarded.</t>
            <t>If the metadata TLVs are not reasonable, the packet MUST be dropped and
          security events noted.</t>
          </section>
          <!-- std_metadata_initial_parsing -->

        <section anchor="std_metadata_decryption" toc="include" numbered="true">
            <name>Decryption of Metadata Blocks</name>
            <t>If the peers have been provisioned to encrypt metadata with a specific
          cipher AND the payload length in the header is non-zero, then the SVR
          implementation MUST assume that an encrypted metadata block was transmitted.</t>
            <t>To decrypt the encrypted metadata block, an SVR implementation  MUST have
          the pre-provisioned Cipher, block size, and initialization vector size. Once
          these are known, it is possible based on the payload length in the metadata
          header to determine the exact structure of the packet, and how to decrypt it.</t>
            <t keepWithNext="true">Encrypted Metadata Block</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[

        Known in advice: Cipher, Block Size, IV size
        From Metadata Header: Payload TLV size

   +----------+--------+-------+-------+----------------+--~~~
   | Metadata | Header |Payload|Padding| Initialization | Rest...
   | Header   | TLVs   |TLVs   |       |    Vector (IV) | of  ...
   |          |        |       |       |                | Pkt ...
   +----------+--------+-------+-------+----------------+--~~~
   |<------Clear------>|<- Encrypted ->|

   |<------------------ Metadata Block ---------------->|

           ]]></artwork>
            <t>The padding is equal to the payload length from the
           header MOD cipher block size. The "block" is then decrypted assuming
           that the IV size bytes following the "block" is the Initialization
           vector.</t>
            <t>If the decryption fails, then the packet MUST be assumed invalid and
           dropped.  When this happens a security event is noted.</t>
            <t>After the decryption succeeds, the payload TLV's MUST be reviewed for
           reasonableness and completeness. See <xref target="std_req_tlvs" format="default"/> for 
           minimum required TLV's. If there are insufficient TLV's present for the
           SVR implementation, the packets MUST be dropped and errors noted.</t>
            <t>After review of the TLV's, the metadata is considered valid and
           accepted by the SVR implementation. The metadata block is removed from
           the packet, and the IP header length and checksum MUST be corrected.
           The packet signatures and decryption provide a very high degree of assurance
           that the metadata is authentic and has integrity.</t>
          </section>
          <!-- std_metadata_decryption -->
    </section>
        <!-- std_metadata_checking -->

    <section anchor="std_udp_untransform" toc="include" numbered="true">
          <name>UDP to TCP Transformation</name>
          <t>If the received metadata block contains a TCP SYN Packet TLV (see
        <xref target="tcp_syn_pkt" format="default"/>) then the following procedures MUST be 
        performed on EVERY packet of the session. This also signals to the
        SVR Router that packets flowing in the opposite direction MUST also
        be UDP transformed. See <xref target="std_udp_transform" format="default"/>. The
        steps performed are:</t>
          <t>The protocol field in the IP header
        MUST be changed from 0x11 (UDP) to 0x06 (TCP).</t>
          <t>Copy the 32-bit
        integer in the checksum/urgent pointer location of the TCP header to
        the sequence number, effectively restoring it.</t>
          <t>The TCP Checksum MUST be
        recalculated.</t>
        </section>
        <!-- std_udp_untransform -->
    <section anchor="std_session_packets" toc="include" numbered="true">
          <name>SVR Session Packets</name>
          <t>Any packet that is has a source and destination IP address that maps
        to a Peer Pathway is an SVR packet. SVR Packets that do not have metadata
        are SVR session packets. Each of these MUST have corresponding known
        session state. If no session state exists, these packets MUST be dropped, or
        there must be an attempt to restore session state (see <xref target="session_state_reqs" format="default"/>).</t>
          <t>Packets ingressing to a peer pathway that are part of existing SVR
        sessions that do not contain metadata MUST be translated (all 5-tuples,
        bidirectionally). The source address MUST be replaced with the local Waypoint
        address associated with the peer pathway. The destination address MUST
        be replaced with the Waypoint of the SVR Peer chosen. The protocol either
        remains the same, or is modified if UDP Transformation is required (See
        <xref target="std_udp_transform" format="default"/>). The source and destination port
        fields MUST be replaced with the ports allocated for this SVR session.
        For efficiency, implementors SHOULD save a single checksum delta as
        part of the session state because the address/protocol/port modifications
        will always be identical for each packet of a session.</t>
          <t>Packets egressing from a peer pathway must have their addresses
        restored. SVR session state MUST contain the original packet context
        5-tuples for every SVR session. The original Source IP Address MUST be
        restored. The original Destination IP Address MUST be restored. The
        original protocol must be restored, and if it is changes from UDP to
        TCP then one MUST follow the procedures defined in
        <xref target="std_udp_untransform" format="default"/>. The source port MUST be restored.
        The destination port MUST be restored.</t>
        </section>
        <!-- std_session_packets -->
    <section anchor="std_tenant_service_overview" toc="include" numbered="true">
          <name>Tenant/Service Overview</name>
          <t>A provisioned SVR Policy SHOULD include both a tenant and service. Absence of an
      applicable SVR policy SHOULD prevent SVR sessions from being established. Traditional
      IP routing can be used when SVR policies do not apply.</t>
          <section anchor="std_service_processing" toc="include" numbered="true">
            <name>Interpretation of the Service</name>
            <t>Services are textual names for sets of CIDR blocks, protocols, and ports.
         Services map directly to our human understanding of a network use case. Examples
         include "Zoom" or "Office365".</t>
            <t keepWithNext="true">Service Definition</t>
            <artwork name="" type="" align="left" alt=""><![CDATA[

            svc_name
                protocol:TCP/UDP
                port ranges[]
                CIDR Blocks[]

           ]]></artwork>
            <t>When a packet arrives with metadata at an SVR Router the name of the
         service MUST be in first packet metadata.</t>
            <t>When a first packet arrives without metadata, the service must be 
         determined through a lookup of the IP destination address, port, and
         protocol. The resultant string becomes the service name. If this fails
         to result in a service, the name of the service can be determined by
         using application recognition techniques. These are omitted from this
         document, but include HTTP Request Analysis, TLS SNI, and Common names
         in certificates.</t>
            <t>Services can have associated quality policies and security policies
         associated with them via provisioning. This is outside the scope of this
         document.</t>
            <t>When egressing an SVR Peer Pathway, the service name can be used to
         route the packet to another SVR Peer, or to the final destination. If 
         another SVR peer is chosen, the service name MUST be used as provided by
         the previous SVR peer. When exiting SVR and returning to traditional
         network routing, the textual service name MUST be resolved to an IP
         address. SVR supports several options:</t>
            <dl newline="false" spacing="normal">
              <dt>Use Destination from Context:</dt>
              <dd>This is the default
           action. The original destination address will be restored and the
           packet will be forwarded to the destination.</dd>
              <dt>Destination NAT Based on Local Configuration:</dt>
              <dd>Some
           provisioned service configurations locally (nearest the destination
           SVR router) will map the service to one or more local IP addresses
           through implementation of a destination NAT. This effectively becomes
           a load balancing algorithm to destination service instances, and is 
           very useful in public clouds.</dd>
              <dt>Resolve Destination using Local DNS:</dt>
              <dd>DNS resolution
           can be provisioned for services when the IP address is not known.
           This if often the case with services in private clouds.</dd>
            </dl>
            <t>Services SHOULD be provisioned to have lists of Tenants that are
         permitted to use a Service, and tenants that are denied using a service.
         These access controls are RECOMMENDED.</t>
          </section>
          <!-- std_service_processing -->

      <section anchor="std_tenant_processing" toc="include" numbered="true">
            <name>Determination and Interpretation of the Tenant</name>
            <t>Tenant is a text string hierarchy delimited by periods. Tenants are logically
        similar to VLANs, CIDR block subnets, and Security Zones. The entire text string,
        including the full hierarchy is used to define a tenant, and for policy application,
        the tenant MAY match right to left in full segments (delimited by periods).
        The longest match will always be used (the most segments).</t>
            <t>Tenants SHOULD be referenced and associated with Services to create a from-to
        vector. This has the benefits of associating ACLs directly with Destinations.
        A provisioned SVR Policy SHOULD include both a tenant and service. Absence of a
        applicable SVR policy prevents SVR sessions from being established. The deny by
        default approach is RECOMMENDED.</t>
            <t>It is RECOMMENDED that a tenant be associated with physical interfaces and
        logical interfaces (VLANs) as a default for arriving sessions. CIDR block-based
        tenants SHOULD override these defaults. Tenant definitions directly from clients
        that self-assert their tenancy SHOULD override all other tenant definitions.</t>
            <t>All network interface-based tenant definitions are local to an SVR router.
        The tenant definitions on ingress to SVR MAY not match those on egress from SVR.
        This permits the use of different segmentation techniques in different networks.</t>
          </section>
          <!-- std_tenant_processing -->
  </section>
        <!-- std_tenant_service_overview -->
  <section anchor="std_sec_policy_processing" toc="include" numbered="true">
          <name>Security Policy and Payload Encryption</name>
          <t>If payload encryption is required, a Security Policy is used to describe all
      aspects of the agreed upon methods. The Security Policy meaning must be valid
      and equal at the point of encryption and decryption in multi-hop use cases.
      The current Peer Key is the default key used for encryption. The security 
      policy may require a new key be created for every session, replacing the Peer
      Key. Either way, the Security KEY TLV (see <xref target="src_rtr_sec_key" format="default"/>)
      contains the key for encryption/decryption in the first packet.
      This allows the key for decryption to go end-to-end in multi-hop router cases.
      The key is safe because metadata is encrypted hop-by-hop through the network.
      Thus each payload encrypted packet is decrypted once at the end of the SVR route.
      Using a semantically named Security Policy permits implementations to use whatever
      ciphers and techniques they wish, as long as they can be named.</t>
          <t>If a router that has originated an SVR session that required payload 
      encryption rekeys with the peer handling the session (see
      <xref target="peer_key_procedure" format="default"/>) it can send the new key in metadata in the
      very first packet encrypted with the new key. Packets coming from the remote peer will
      continue to arrive encrypted with the old key. When the remote router responsible
      for decryption receives the new key, it begins using it for the session. The
      key is included in reverse metadata when the first packet is encrypted with
      this new key in the reverse direction.</t>
          <t>If the security policy agreed up has an alternative key methodology, the initial
      and subsequent keys are treated the same way. The responsibility for the key
      is always the source of the SVR session, and communication of the key is always
      using SVR metadata.</t>
        </section>
        <!-- std_sec_policy_processing -->
  </section>
      <!-- std_metadata_processing -->
</section>
    <!-- std_svr -->

<section anchor="std_bfd" toc="include" numbered="true">
      <name>BFD for Peer Pathways</name>
      <t>Peer Pathways are similar to Tunnels. They represent virtual transport pathways
  between routers. BFD is an excellent way to very reachability, measure quality of
  a pathway, and to perform authentication and key management.</t>
      <section anchor="svr_peering" toc="include" numbered="true">
        <name>SVR Peering and use of BFD</name>
        <t>It is RECOMMENDED for every configured or discovered SVR Peer pathway, A UDP BFD
    session be used to monitor the state of the pathway, and through extensions, measure
    path quality.</t>
        <t>BFD Control messages are sent by each router on each peer path. The BFD message
    is constructed with appropriate timers for the Peer Pathway which are administratively
    determined. BFD as defined in <xref target="RFC5880" format="default"/> does not support certificates
    or exchange of public keys. To overcome this, BFD metadata is used.</t>
        <t>BFD Metadata is inserted into existing BFD messages for the following purposes:</t>
        <ul spacing="normal">
          <li>To determine the Peer Received IP Address.</li>
          <li>To determine there are NATs on a Peer Pathway.</li>
          <li>To determine if a routers Peer Received IP Address has changed.</li>
          <li>To determine MTU size on a pathway.</li>
          <li>Measure path quality of when idle (see <xref target="path_metrics" format="default"/> for
      measuring quality on active circuits).</li>
          <li>Determine if Peer Pathway has failed to another redundant physical link.</li>
          <li>To authenticate a peer through certificate exchange.</li>
          <li>To determine a cryptography key using Elliptic-curve Diffie-Hellman (ECDH).</li>
        </ul>
        <t>BFD Metadata is added to the end of the BFD packet when required. If BFD metadata
    is added, the length field in the IP Header, UDP Header, and BFD Control message
    are all adjusted to be accurate.</t>
        <t keepWithNext="true">BFD Metadata Location:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

      BFD Control Packet with Metadata

    +-----------+--------+---------+----------+
    |IP Header  |  UDP   |   BFD   | protobuf |
    |           | Header | Control | BFD      |
    |           |        |  Packet | Metadata |
    +-----------+--------+---------+----------+
                         |                    |
                         |<== BFD Pkt Len  ==>|

      ]]></artwork>
        <t>In all cases, BFD packets will be defined as BFD Control Packets. When sending
    MeasureData messages which behave like BFD Echo packets, the Required Min Echo RX
    Interval (see <xref target="RFC5880" format="default"/>) is greater than zero.</t>
        <t>The metadata is described by as follows:</t>
        <t keepWithNext="true">BFD Metadata Protobuf Definition:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
  syntax = "proto2";
  package pb.bfd;
  import "ip.proto";

  message PeerAuth {
      required string certificate = 1;
  }

  message PeerPublicKey {
      required string signed_key = 1;
  }

  message SessionData {
      required ip.Tuple original_ipTuple  = 1;
      required ip.Tuple received_ipTuple  = 2;
      optional string peername = 3;
      optional string routername = 4;
  }

  message MeasureData {
      message Request {
          required uint32 transId = 1;
      }
      message Response {
          required uint32 request_transId  = 1;
          required uint32 response_transId = 2;
      }
      oneof type {
          Request      request   = 1;
          Response     response  = 2;
      }
      optional bool mtu_discovery = 3;
  }

  message NodeInfo {
      required uint32 id = 1;
      required uint64 create_timestamp = 2;
      optional uint64 time_value = 3;
  }

  message Metadata {
      optional SessionData     sessionData  = 1;
      optional MeasureData     measure         = 2;
      optional NodeInfo        nodeInfo     = 3;
      optional PeerAuth        peerAuth     = 4;
      optional PeerKey         peerKey      = 5;
  }
      ]]></artwork>
        <section anchor="bfd_peer_received_address" toc="include" numbered="true">
          <name>Peer Determination of Received Peer IP Address</name>
          <t>The SessionData message can be used to determine the source address a
      remote peer router receives on a Peer Pathway. This is required to 
      establish a peer path. Configuration will be tied to a router hostname,
      and not a dynamic address associated with a hostname. Remote Peers will
      create a local address resolution table (i.e. /etc/hosts)  to resolve the
      hostname in configuration to the dynamic IP address. This action can
      be performed simultaneously with Detection of NAT between Peers below.</t>
          <t keepWithNext="true">Determination of Peer Received Address:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

     Router-A                Router-B                 Local
    [Addr-A ->               -Addr-B]                  DNS
        |                       |                       |
        |BFD ------------------>|                       |
        | original_ipTuple=A    |                       |
        | hostname="Router-A"   |                       |
        |                       |DNS Update------------>|
        |                       | Router-A: Address A   |
        |                       |                       |
        |                       |                       |

    Router-B has hostname lookup for Router-A

      ]]></artwork>
        </section>
        <!-- bfd_peer_received_address -->

    <section anchor="bfd_nat_detection" toc="include" numbered="true">
          <name>Detection of between Peers using BFD</name>
          <t>The SessionData message can optionally be used to detect NATs between two routing
      peers. Typically, this is performed during initial peer pathway establishment, and
      often grouped together with sending Peer Authorization certificates. Similarly to
      STUN, the IP address of the originating interface is  stored in the field
      SessionData.original_ipTuple. If the router has received any BFD packets from its
      peer router, it will store the IP address of the received BFD packet in this field.
      When sending the SessionData BFD metadata, a router OPTIONALLY places its own name in
      the peername field. Through the process of comparing real addresses seen on the wire
      with addresses used by the routers interfaces, one can detect when there is a NAT
      on a Peer Pathway.</t>
          <t keepWithNext="true">BFD NAT Detection on Pathway:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

     Router-A                  NAT                  Router-B
     Addr-A                   Addr-N                 Addr-B
        |                       |                       |
        |BFD ------------------>|                       |
        | original_ipTuple=A    |                       |
        |                       |                       |
        |                       |BFD ------------------>|
        |                       | original_ipTuple=N    |
        |                       |                       |
        |                       |                       |

                                                NAT Detected
                                                Router-B gets N 
                                                address on the wire
                                                and it doesn't match
                                                original_ipTuple
        |                       |                       |
        |                       |                       |
        |                       |<-------------------BFD|
        |                       |    original_ipTuple=B |
        |                       |    received_ipTuple=N |
        |<-------------------BFD|                       |
        |    original_ipTuple=B |                       |
        |    received_ipTuple=N |                       |
        |                       |                       |

    No NAT detected
    Router-A gets B's address
    on the wire which matches
    the original_ipTuple

      ]]></artwork>
          <t>If a NAT is detected in a Peer Pathway as in the above example, care must
      be taken to associate address N with the Peer Pathway to Router-A. Sessions that
      are traversing this Peer Pathway may require NAT Keep Alive processing. See
      <xref target="nat_keep_alive" format="default"/>.</t>
        </section>
        <!-- bfd_nat_detection -->

    <section anchor="bfd_router_address_change" toc="include" numbered="true">
          <name>Detection of Routers Address Changing using BFD</name>
          <t>Often branch data routers are connected to networks and receive their IP Address
      dynamically from DHCP, LTE or PPPoE procedures. Although it is rare, sometimes these
      addresses change unexpectedly. This may be the result of a lease running out, or
      a router reestablishing connectivity after a failure. When this happens, any peer
      that was using the old address will lose connectivity to this peer. By including
      SessionData BFD Metadata, learning the address of the peer and recovery occur very
      quickly.</t>
          <t keepWithNext="true">BFD Detection on Router Address Change:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

     Router-A               DHCP                Router-B
    [Addr-A ->              Server            <-Addr-B]
        |                     |                     |
        |BFD -------------------------------------->|
        | original_ipTuple=A  |                     |
        | received_ipTuple="" |                     |
        |                     |                     |
        |<---------------------------------------BFD|
        |                     |  original_ipTuple=B |
        |                     |  received_ipTuple=A |
        |BFD -------------------------------------->|
        | original_ipTuple=A  |                     |
        | received_ipTuple=B  |                     |

        Both routers have learned each other's IP Address
        and have confidence there are no NAT's between them

        |DHCP Lease  Exp ---->|                     |
        |<-------New Address C|                     |
        |                     |                     |
        |BFD -------------------------------------->|
        | original_ipTuple=C  |                     |
        | received_ipTuple=B  |                     |
        |<---------------------------------------BFD|
        |                     |  original_ipTuple=B |
        |                     |  received_ipTuple=C |

        Both routers have the correct IP Address and
        confidence there are no NATs between them

      ]]></artwork>
        </section>
        <!-- bfd_router_address_change -->

    <section anchor="bfd_mtu" toc="include" numbered="true">
          <name>Determining MTU Size with BFD</name>
          <t>Knowing the MTU size on a path is important for routers so
      they can fragment packets when necessary. After a peer pathway
      is established, a series of BFD MeasureData packets that 
      increase in size can help us find the limit of packet
      size between peers. To make the BFD packet larger the
      lengths are adjusted in the IP header, UDP header, and BFD
      header. A peer receiving a BFD request with the MTU Discovery field 
      equal to TRUE that is fragmented simply does not respond.</t>
          <t>Often there is an entire network between peers. As such, the
      MTU size may change over time. It is recommended that the MTU
      size be measured routinely, and updated if it should change.</t>
          <t keepWithNext="true">BFD MeasureData for Determining Pathway MTU:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

     Router-A                                       Router-B
    [Addr-A ->                                     <-Addr-B]
         |                                                |
         |BFD MeasureData (id=1, size 1200)-------------->|
         |BFD MeasureData (id=2, size 1250)-------------->|
         |BFD MeasureData (id=3, size 1300)-------------->|
         |BFD MeasureData (id=4, size 1350)-------------->|
         |BFD MeasureData (id=5, size 1400)-------------->|
         |BFD MeasureData (id=6, size 1450)-------------->|
         |BFD MeasureData (id=7, size 1500)-{fragmented}->|
         |                                                |
         |<----(req_id=1, resp_id=1)-------BFD MeasureData|
         |<----(req_id=2, resp_id=2)-------BFD MeasureData|
         |<----(req_id=3, resp_id=3)-------BFD MeasureData|
         |<----(req_id=4, resp_id=4)-------BFD MeasureData|
         |<----(req_id=5, resp_id=5)-------BFD MeasureData|
         |<----(req_id=6, resp_id=6)-------BFD MeasureData|

         MTU Size = 1450
         
      ]]></artwork>
        </section>
        <!-- bfd_mtu -->

    <section anchor="bfd_quality_measurement" toc="include" numbered="true">
          <name>Measuring Peer Pathway quality using BFD</name>
          <t>After a Peer Pathway is authenticated, and ready for use, BFD can be used
      to measure latency and packetloss. This is performed by sending BFD
      packets with BFD MeasureData metadata. Both sides of a Peer Pathway can
      test for quality if desired.  The number of packets in a burst is determined
      by configuration. The frequency of quality tests is also determined by
      configuration. Quite often routers with a large number of Peer Pathways
      (such as a data center hub router) may never perform quality tests, and rely
      solely on observations made by its peer spoke routers.</t>
          <t>These quality measurements are only required when circuits are idle. When
      sessions are traversing a peer path, quality measurements can made for existing
      sessions using SVR Path Metrics (See <xref target="path_metrics" format="default"/>).</t>
          <t>The receiving side generates a response message by re-writing the BFD
      metadata and supplies information if requested. Each "request" generates a
      "response". Each request has a transaction ID, and so does each response.
      This solves a problem of exact symmetry where by a peer may not know if a
      message is a response or a request from a peer.</t>
          <t keepWithNext="true">BFD MeasureData for Measuring Pathway Quality:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

     Router-A                                     Router-B
    [Addr-A ->                                   <-Addr-B]
         |                                             |
         |BFD MeasureData (req_id=1)------------------>|
         |BFD MeasureData (req_id=2)------------------>|
         |BFD MeasureData (req_id=3)------------------>|
                 .......
         |BFD MeasureData (req_id=n)------------------>|
         |<----(req_id=1, resp_id=1)----BFD MeasureData|
         |<----(req_id=3, resp_id=2)----BFD MeasureData|
         |<----(req_id=1, resp_id=3)----BFD MeasureData|
                  ......
         |<----(req_id=N, resp_id=N-1)--BFD MeasureData|
         
      Latency = Sum of RTT(pkt 1-n)/(2*n)
      Jitter = Std Dev RTT(pkt 1-n)
      Packet Loss = 1-(Pcks_Sent-Pcks_recv/Pkts_Sent)

      ]]></artwork>
          <t>Router-B responds to each BFD MeasureData message it receives by
      responding to the original message and adding a serialized resp_id.
      To measure latency, the sending (measuring) side (Router-A in this case)
      can measure the elapsed time between each req_id sent, and its response.
      Absence of a responce counts as a packet lost. The variability in latency
      provides a method of calculating jitter, and MoS scores can be computed
      once latency, packetloss, and jitter are known.</t>
          <t>Both Router-A and Router-B must send their own BFD  MeasureData 
      messages to get their own quality measurements from their own specific
      point of view. The actual network quality between these two routers can
      vary based on direction.</t>
        </section>
        <!-- bfd_quality_measurement -->

    <section anchor="bfd_path_failover" toc="include" numbered="true">
          <name>Detection of Path Failover using BFD</name>
          <t>If one side of a Peer Pathway fails, and there is a redundancy action
      that automatically takes over, BFD NodeInfo metadata can be used to detect
      this event. Knowledge of a Peer Pathway failover may be required by routers
      in certain feature scenarios.</t>
          <t>For redundancy, routers are often grouped into a cluster of active/active
      modes. Responsibility for a Peer Pathway may change from one member of a
      cluster to another. When sending BFD with Metadata, by including the
      Node ID (instance number in a cluster) and a timestamp of when the Peer
      router started, one can detect redundancy events at the far end side of a
      Peer Pathway.</t>
          <t>Inclusion of this is optional. There may be features that require
      special actions by a remote peer where redundancy events impact them.
      If this is the case, you may need to use this method.</t>
        </section>
        <!-- bfd_path_failovers -->

    <section anchor="peer_auth_procedure" toc="include" numbered="true">
          <name>Peer Authentication Procedures</name>
          <t>SVR Routers will authenticate with each other using their textual names.
      This is similar to how servers authentic using their domain names. In SVR,
      Authorities have name space control over router names, and as such SVR Router
      names for authentication will consist of "name/authority". For example, if an
      authority named "example" created a router named "router1", the name used for
      authentication will be "router1/example".  All configuration referencing this
      specific router would use this name.</t>
          <t>Names are used for authentication because router IP Addresses often change.
      This is true when transport addresses of branch routers are established using DHCP
      and leases expire. Names are also used for authentication between routers to avoid
      duplicate certificate verification for multiple pathways for a single router
      peering relationship.</t>
          <t>When a router is initialized, if it does not have a signed authentication
      certificate that is valid, it must obtain one from a certificate authority. The
      router will create an elliptic-curve public/private key pair (see
      <xref target="RFC8422" format="default"/>). The public key is
      used to create an x.509 certificate signing request (CSR) with the common name
      field set to the routers name. Elliptic-curve is used to ensure the x509 certificate
      is as small as possible. A certificate signing request is initiated to a known and
      trusted CA through a secure connection. The CA will digitally sign (ECDSA) the
      the CSR and return it to the requesting router. The specific details of this process is
      omitted from this specification, but it is recommended that it follow the procedures
      and guidelines defined in <xref target="RFC4210" format="default"/>. Certificates and Public Keys
      are stored locally on each router in PEM format defined by
      <xref target="RFC7468" format="default"/>.</t>
          <t keepWithNext="true">Creating Router Authentication Certificate:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

                           RouterA
                        Certificate
            RouterA       Authority
              |                | 
       +------+------+         |
       |Cert Missing,|         |
       | Invalid     |         |
       | or Expiring |         |
       +-------------+         |
              |                |
        +-----+-----+          |
        |   Create  |          |
        |Curve-P256 |          |
        |  Pub/Priv |          |
        |  Key Pair |          |
        +-----------+          |
              |                |
        +-----+-----+          |
        |   Create  |          |
        | x.509 Cert|          |
        | CN=RouterA|          |
        +-----------+          |
              |                |
              +------CSR------>|
              |                |
              |<--x509 Signed--|

        ]]></artwork>
          <t>The certificate is stored on the router persistently in PEM format. The private key
      associated with the certificate should be stored in a secure non-volatile storage, such
      as a Trusted Platform Module (TPM).</t>
          <t>When establishing a peer pathway, The routers authentication certificate (encoded in
      PEM format is inserted as BFD Metadata into a BFD message and the BFD message is sent
      to a peer. The certificate MUST be included in all BFD messages until the remote peer
      successfully sends its certificate in response, and the certificate has been validated.
      This provides a handshake guaranteeing delivery for both local and remote peers.</t>
          <t>The diagram below shows two routers, with two peer pathways. The certificates are sent
      by both routers on both pathways, but only need to be validated one time for each router
      peer.</t>
          <t keepWithNext="true">Router Authentication:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

           RouterA      RouterA      RouterB      RouterB
           Peerpath1    Peerpath2    Peerpath1    Peerpath2
               |           |            |            |
       =============ALL PEER PATHS ARE DISCONNECTED==========
               |           |            |            |
               |--BFD w x509 Cert------>|            |
               |           |--BFD w x509 Cert------->|
               |           |            |            |
              ....Delay between retransmissions .......
               |           |            |            |
               |--BFD w x509 Cert------>|            |
               |           |         RouterA         |
               |           |        Validated        |
               |           |            |            |
               |           |--BFD w x509 Cert------->|
               |           |            |            |
               |<----BFD w x509 Cert----|            |
            RouterB        |            |            |
           Validated       |            |            |
               |           |<-----BFD w x509 Cert----|
               |           |            |            |
      =============ALL PEER PATHS ARE OPERATIONAL==========
               |           |            |            |
              ....Delay between retransmissions .......
               |           |            |            |
               |----BFD---------------->|            |
               |           |-------BFD-------------->|
               |<-------------BFD-------|            |
               |           |<-------------BFD--------|
            
        ]]></artwork>
          <t>When a certificate is received from a peer, it must be validated. The validation
      includes the following checks:</t>
          <ul spacing="normal">
            <li>Verify the dates are valid.</li>
            <li>Verify the signature of the Certificate Authority.</li>
            <li>If revocation list available, verify the certificate has not been revoked.</li>
            <li>Verify the router name is supported in configuration. Administrative
        revocation is a primary means of control.</li>
          </ul>
          <t>The validation for a peer only needs to be done one time. When a certificate is
      received from a peer on multiple peer paths, if the certificate is identical to a 
      previously validated certificate, a cached validation response can be used.</t>
          <t>When receiving a certificate from a peer router, after validation, the receiving
      router must extract the peer routers public key and save it. This will be used for
      validating Peer Key/rekey requests authenticity.</t>
          <t>Each router should update its authentication certificate before the current
      certificate expires utilizing the same exact steps identified herein.</t>
        </section>
        <!-- peer_auth_procedure -->

    <section anchor="peer_key_procedure" toc="include" numbered="true">
          <name>Peer Key/Rekey Procedures</name>
          <t>Elliptic-Curve Diffie-Hellman is used between two peers to compute a key
      for cryptography. See <xref target="ECDH_Key_Exchange" format="default"/> for details on
      key calculation, and see <xref target="RFC8422" format="default"/> for examples on how ECDH
      is used in TLS. For example, a 256 Bit key can be computed from the public
      key exchange for a peer relationship between two routers.</t>
          <t>A single key is used for all paths between two routers. The key is kept
      and considered valid until a new key is accepted as a replacement. This
      includes across network outages and path failures. If a key is lost, or
      doesn't appear to function correctly, a new key must be obtained before
      processing of traffic with SVR metadata can occur.</t>
          <t>Anytime a key is needed, a new public/private key pair is generated locally
      for the peer relationship. The public key is signed, and stored locally as
      a PEM formatted text string. The PEM string is inserted as BFD metadata and
      transmitted to the peer UDP BFD Control packet. Upon receipt the remote peer
      will respond by creating a new public/private key pair for the same peer
      relationship, and then return its public key, signed with its router public
      key formatted as a PEM string.</t>
          <t>The key is shared on all peer paths between two peers. Once calculated on one
      peerpath, it can be used immediately on all others with the same remote peer.</t>
          <t>When both local and remote peers have their newly created public keys, then
      a new shared peer key can be computed using Elliptic-Curve Diffie-Hellman techniques.
      The key can be immediately used for encrypting metadata after incrementing
      the Security ID (see <xref target="security_id" format="default"/>).</t>
          <t keepWithNext="true">Peer Path Key/Rekeying:</t>
          <artwork name="" type="" align="left" alt=""><![CDATA[

           RouterA      RouterA      RouterB      RouterB
           Peerpath1    Peerpath2    Peerpath1    Peerpath2
               |           |            |            |
            ........NO Current Key Exists...............
               |           |            |            |
               |--BFD w KEY Req-------->|            |
               |           |            |            |
               |<----BFD w KEY Req------|            |
               |           |            |            |
              Key          |           Key           |
            Computed       |         Computed        |
               |           |            |            |
             ......Security ID=1, 1st Key Exists........
               |           |            |            |
             ...........At Rekeying Interval............
               |           |            |            |
               |           |--BFD w Key Req--------->|
               |           |<---BFD w Key Req--------|
               |           |            |            |
             ........... 2nd Key Exists.................
               |           |            |            |
             ..........Transition Guard Time.............
               |           |            |            |
             .......Security ID=2, 2nd Key used..........
             
            
        ]]></artwork>
          <t>SVR Payload Metadata uses encryption. During the rekeying period
      prior to both sides exchanging new public keys, and computing their new
      peer key, the old key is used. A reasonable guard time should be added
      post key computation to prevent any retransmitted packets, delayed packets
      or long latency packets not having a key ready for use.</t>
          <t>If a peer sends BFD with Key Request to a peer for which there is not
      a current valid key, and there is no response, then the peer path remains
      out of service until there is a valid response.</t>
          <t>If a peer sends a BFD with Key Request to a peer, and there is no
      response, the peer continues to resend it at periodic intervals. If there
      is no response after a very long period of time, the peer path can be 
      declared not valid, and removed from service based on administrative 
      timers.</t>
        </section>
        <!-- peer_key_procedure -->
  </section>
      <!-- svr_peering -->

</section>
    <!-- std_bfd -->

<section anchor="meta_use_cases" toc="include" numbered="true">
      <name>Additional SVR Metadata Exchanges and Use Cases</name>
      <t>Metadata can be inserted and used to share network intent between routers.
Below are examples for specific use cases. The metadata is not limited to
these use cases, these are just illustrative.</t>
      <section anchor="moving_session" toc="include" numbered="true">
        <name>Moving a Session</name>
        <t>To change the pathway of a session between two routers, any SVR
    Router simply reinserts the metadata described in section
    <xref target="save_session_state" format="default"/> and transmits the packet on
    a different peer path, but retains the same Session UUID
    of the existing session that is being moved. </t>
        <ul spacing="normal">
          <li>Update its fast path forwarding tables to reflect the new IP
      addresses and ports (Waypoints) for transport. All other aspects
      of the session remains the same. The presence of middle boxes
      means that routers on both sides must once again perform NATP
      detection and update real transmit addresses/ports to ensure
      that sessions will continue.</li>
        </ul>
        <t>After 5 seconds the old path state entries can be removed.
    By keeping the old and new fast path entries during this 5
    second transition, no packets in flight will be dropped. The
    diagram below shows the sequence for moving sessions around a
    failed mid-pathway router.</t>
        <t keepWithNext="true">Ladder Diagram for Existing Session Reroute
             with Metadata:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

                   RTR-A      RTR-B      RTR-C      RTR-D
        Client . . . . . . . . . . . . . . . . . . . . . . . . Server
          |          |          |          |          |          |
          |--PUSH--->|          |          |          |          |
          |          |--PUSH-------------->|          |          |
          |          |          |          |--PUSH--->|          |
          |          |          |          |          |--PUSH--->|
          |          |          |          |          |<---ACK---|
          |          |          |          |<---ACK---|          |
          |          |<--------------ACK---|          |          |
          |<---ACK---|          |          |          |          |
          |          |          |          |          |          |
          ......................RTR-C Fails.......................
          |--PUSH--->|          |          |          |          |
          |          |--PUSH--->|          |          |          |
          |          |  [MD1]   |          |          |          |
          |          |          |--PUSH[MD2]--------->|          |
          |          |          |          |          |--PUSH--->|
          |          |          |          |          |<--ACK----|
          |          |          |<-----ACK[RMD2]------|          |
          |          |<--ACK----|          |          |          |
          |<--ACK----|  [RMD1]  |          |          |          |
          |          |          |          |          |          |
          |<======== Session Packets Flow without Metadata =====>|

        ]]></artwork>
        <t>When router C fails, metadata MD1,MD2 can be included in the very
      next packet being sent in either direction.  Confirmation that the move
      was completed is confirmed with reverse metadata RMD2, RMD1.
      For established TCP sessions, this is either a PUSH
      (as shown) or an ACK (Not shown). This can reestablish the SVR session
      state into a new router (Router B in this example) that previously
      did not have any involvement in the session. This technique can also be
      used to modify paths between two routers effectively moving TCP
      sessions from one transport (MPLS for example) to another (LTE). A
      session move can be initiated by any router at any time.</t>
        <t keepWithNext="true">Ladder Diagram for Session Reroute Between
           Peers with Metadata:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
                                                           
                 +-------+              +--------+        
                 |       +-----MPLS-----+        |       
         Client--| Rtr-A |              | Rtr-B  +----Server
                 |       +------LTE-----+        |
                 +-------+              +--------+ 

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          |         RouterA                    RouterB        |
          |            |                          |           |
          |---PUSH---->|                          |           |
          |            |---PUSH over MPLS-------->|           |
          |            |                          |---PUSH--->|
          ................MPLS has Poor Quality ................
          |            |                          |           |
          |---PUSH---->|                          |           |
          |            |---PUSH over LTE[MD]----->|           |
          |            |                          |---PUSH--->|
          |            |                          |<---ACK----|
          |            |<---ACK over LTE[RMD]-----|           |
          |<---ACK-----|                          |           |
          |            |                          |           |
          |<===== Session Packets Flow without Metadata =====>|
          

        ]]></artwork>
        <t>The diagram shows moving an active TCP session from one
      transport network to another by injecting metadata (MD) into any
      packet that is part of the transport in either direction.
      Reverse metadata is sent on any packet going in the reverse
      direction to confirm that the move was successful (RMD).</t>
      </section>
      <!-- moving_session -->

    <section anchor="one_way_media_move" toc="include" numbered="true">
        <name>Moving Sessions that are Quiescent or One-Way Flows</name>
        <t>Certain sessions may be idle or packets may create
        a one-way information flow (TCP Pushes) with one way acknowledgement
        (TCP ACKS). In these scenarios, insertion of metadata into existing
        packets may not be possible.</t>
        <t>After moving a session, if an SVR router determines no packets
        are received or sent for an active session over an elapsed time
        of 1 second, the SVR router will generate an SVR Control Message
        to the peer.</t>
        <t keepWithNext="true">Ladder Diagram for One Way Media Move
             with Metadata:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
                                                           
                 +-------+              +--------+        
                 |       +-----MPLS-----+        |       
         Client--| Rtr-A |              | Rtr-B  +----Server
                 |       +------LTE-----+        |
                 +-------+              +--------+ 

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          |         RouterA                    RouterB        |
          |            |                          |           |
          |            |                          |<---PUSH---|
          |            |<---PUSH over MPLS------->|           |
          |<---PUSH----|                          |           |
          |----ACK---->|                          |           |
          |            |------ACK over MPLS------>|           |
          |            |                          |---ACK---->|
          |            X RouterA MPLS FAILS       |           |
          |            X           RouterB MPLS OK|           |
          |            X                          |           |
          ..............RouterA Moves Session to LTE..........
          |            |                          |<---PUSH---|
          |            X<---PUSH over MPLS------->|           |
          |            |                          |<---PUSH---|
          |            X<---PUSH over MPLS------->|           |
          |            |                          |           |
          .......NO Packets at Router A for Moved Session......
          |            |                          |           |
          |            |-----[MD over LTE]------->|           |
          ...............RouterB Moves Session to LTE..........
          |            |                          |<---PUSH---|
          |            |<--PUSH over LTE [RMD]--->|           |
          |<---PUSH----|                          |           |
          |----ACK---->|                          |           |
          |            |------ACK over LTE------->|           |
          |            |                          |---ACK---->|
          |<======== Session Packets Continue flowing =======>|

        ]]></artwork>
        <t>The SVR Control Message uses the new SVR router interface
      addresses (Waypoints) and contains the standard first packet
      metadata fields with the SVR Control Message TLV added to the
      header with drop reason "FLOW MOVED". Also added is a TLV
      attribute with the remaining session time. This is essential
      to ensure mid-stream routers remove sessions from their tables
      roughly at the same time. This message will be transmitted 
      once every second for 5 seconds OR reverse metadata has been
      received. If no reverse metadata has been received in 5 seconds
      the session is torn down. For a quiescent flow, the RMD is
      a generated SVR Control Message as well as shown below:</t>
        <t keepWithNext="true">Ladder Diagram for Quiescent Moved Session
             with Metadata:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
                                                           
                 +-------+              +--------+        
                 |       +-----MPLS-----+        |       
         Client--| Rtr-A |              | Rtr-B  +----Server
                 |       +------LTE-----+        |
                 +-------+              +--------+ 

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          |         RouterA                    RouterB        |
          |            |                          |           |
          |<========== Quiescent Session Established ========>|
          |            |                          |           |
          |            X RouterA MPLS FAILS       |           |
          |            X           RouterB MPLS OK|           |
          |            X                          |           |
          ..............RouterA Moves Session to LTE..........
          |            |                          |           |
          |            |-----[MD over LTE]------->|           |
          |            |                          |           |
          ...............RouterB Moves Session to LTE..........
          |            |                          |           |
          |            |<-----[RMD over LTE]----->|           |
          |            |                          |           |
          |<=========== Quiescent Session Continues =========>|

        ]]></artwork>
      </section>
      <!-- one_way_media_move -->

    <section anchor="nat_keep_alive" toc="include" numbered="true">
        <name>NAT Keep Alive</name>
        <t>If an SVR Router determines there is one or more 
      NATs on a peer pathway (See <xref target="path_obstruct" format="default"/>,
      the SVR Peer must maintain the NAT bindings for each active
      session by sending keep alive metadata in the direction of the NAT.
      For keep alive, SVR utilizes a packet that matches the L4 header
      of the idle session that includes metadata type 24 with the drop 
      reason set to Keep Alive.</t>
        <t keepWithNext="true">Ladder Diagram for NAT Keep Alive
             with Metadata:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

                   RTR-A       NAT       RTR-B
        Client . . . . . . . . . . . . . . . . . . Server
          |          |          |          |          |
          ...................Existing SVR Session......
          |--PUSH--->|          |          |          |
          |          |--PUSH--->|          |          |
          |          |          |---PUSH-->|          |
          |          |          |          |--PUSH--->|
          |          |          |          |<---ACK---|
          |          |          |<---ACK---|          |
          |          |<--PUSH---|          |          |
          |<--PUSH---|          |          |          |
          .........NO PACKETS EITHER DIRECTION FOR 20 SECS........
          |          |          |          |          |
          |          |--[MD1]-->|          |          |
          |          |          |--[MD1]-->|          |
          |          |          |          |          |
          .........NO PACKETS EITHER DIRECTION FOR 20 SECS........
          |          |          |          |          |
          |          |--[MD1]-->|          |          |
          |          |          |--[MD1]-->|          |
          |          |          |          |          |

        ]]></artwork>
        <t>The metadata attributes that MUST be inserted in a keep
      alive for existing packet sessions includes:</t>
        <ul spacing="normal">
          <li>Header: SVR Control Message: see
          <xref target="proto_msg" format="default"/>.</li>
          <li>Header: Security Identifier: see
            <xref target="security_id" format="default"/>.</li>
          <li>Payload: Session UUID: see
            <xref target="session_uuid" format="default"/>.</li>
          <li>Payload: Source Router Name: see
            <xref target="src_rtr_name" format="default"/>.</li>
          <li>Payload: Peer Pathway ID: see
            <xref target="peer_rtr_id" format="default"/>.</li>
        </ul>
        <t>With this minimum set of information, the receiver of this
        message can verify and update any modifications in a session
        NAT state. The Session UUID is used to verify all information
        positively.</t>
      </section>
      <!-- nat_keep_alive -->

    <section anchor="adaptive_encryption" toc="include" numbered="true">
        <name>Adaptive Encryption</name>
        <t>Unlike a tunnel where all packets must be encrypted, each session in
      SVR is unique and independent. Most of the modern applications sessions 
      are already using TLS or DTLS. SVR Routers have the capability of 
      encrypting only sessions that are not already encrypted. Below is an
      example of adaptive encryption. With adaptive encryption, every session
      begins unencrypted. By analyzing the first 4 packets, the router can
      determine that encryption is required or not. If the fourth packet in a
      TLS Client hello message, encryption is NOT required. Any sequence of
      packets that does not indicate TLS or DTLS setup would immediately toggle
      encryption on.</t>
        <t keepWithNext="true">Ladder Diagram of Adaptive Encryption
             with Client Hello:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . . . . . . . . . . . . Server
          |                                           |
          +         RouterA            RouterB        |
          +---SYN----->|                  |           |
          |            |----SYN[MD1]----->|           |
          |            |                  |--SYN----->|
          |            |                  |<--SYN/ACK-|
          |            |<----SYN/ACK------|           |
          |<--SYN/ACK--|    [RMD1]        |           |
          |---ACK----->|                  |           |
          |            |------ACK-------->|           | 
          |            |                  |--ACK----->|
          |--Client--->|                  |           |
          |  Hello     |<== ENCRYPTION===>|           |
          |            |   Not Required   |           |
          |            |                  |           |
          |            |-----Client------>|           |
          |            |      Hello       |--Client-->|
          |            |                  |           |

        ]]></artwork>
        <t>If the fourth packet is not an indication that encryption
      will be performed by the transport layer, then the ingress SVR
      Routers must encrypt and the egress SVR router must
      decrypt the session bidirectionally. This ensures that any 
      data between the SVR Routers is encrypted.</t>
        <t keepWithNext="true">Ladder Diagram of Adaptive Encryption
             with data:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . .  . . . . . . . . Server
          |                                       |
          +         RouterA        RouterB        |
          +---SYN----->|              |           |
          |            |--SYN[MD1]--->|           |
          |            |              |--SYN----->|
          |            |              |<--SYN/ACK-|
          |            |<--SYN/ACK----|           |
          |<--SYN/ACK--|    [RMD1]    |           |
          |---ACK----->|              |           |
          |            |----ACK------>|           | 
          |            |              |--ACK----->|
          |---Data---->|              |           |
          |            |<==ENCRYPT===>|           |
          |            |  Required    |           |
          |            |              |           |
          |            |--Encrypted-->|           |
          |            |   Data       |---Data--->|

        ]]></artwork>
        <t>Adaptive encryption is part of the security provisioning. Security
      policies are associated with services, and as such certain applications 
      can mandate encryption; others may allow adaptive encryption, and still
      others may specify no encryption.</t>
      </section>
      <!-- adaptive_encryption -->

    <section anchor="packet_fragmentation" toc="include" numbered="true">
        <name>Packet Fragmentation</name>
        <t>When a fragmented packet is presented to a SVR Router, the packet
    must be completely assembled to be processed. The SVR Router routes
    IP packets, and as all SVR actions require the entire packet.
    As such, the HMAC must be applied to the entire packet, and the entire
    packet must be routed as a whole.  Each resulting fragment must be turned
    into an IP packet with 5-tuples that match the corresponding session to
    ingress and pass through an SVR. The SVR Router will simply use the same L4
    header on all fragments from the session state table (peer pathway
    and transit ports). a time based HMAC signature is created for the
    entire packet and appended to the last fragment. Each fragment must also
    have metadata inserted that clearly identifies the fragment to the SVR
    routing peer.</t>
        <t keepWithNext="true">Ladder Diagram Fragmented Packets:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

     Client . . . . . . . . . . . . . . . . . . . . . . Server
       |                                                   |
       |         RouterA                    RouterB        |
       |            |                          |           |
       |--Frag 1--->|                          |           |
       |--Frag 3--->|                          |           |
       |--Frag 2--->|                          |           |
       |        +---+----+                     |           |
       |        |Assemble|                     |           |
       |        +---+----+                     |           |
       |            |----Frag 1[L4/MD]-------->|           |
       |            |                          |           |
       |            |----Frag 2[L4/MD]-------->|           |
       |            |                          |           |
       |            |----Frag 3[L4/MD]-------->|           |
       |            |                     +--------+       |
       |            |                     |Assemble|       |
       |            |                     +--------+       |
       |            |                          |--Frag 1-->|
       |            |                          |--Frag 2-->|
       |            |                          |--Frag 3-->|

        ]]></artwork>
        <t>In the diagram above, Router A collects all the fragments 1
    2, and 3. Reassembly is performed. Router A records two things from
    the inbound fragments: The Original ID, and the largest fragment
    size received. Router A then proceeds to send the jumbo packet by
    fragmenting it again, but this time sending each piece inside a  
    packet with a newly created L4 which maps exactly to the peer
    pathway chosen with ports assigned from the session state table.
    The fragment size will be the lesser of the smallest MTU on the
    path OR the largest fragment seen, whichever is smaller.
    The Metadata header and header TLV's are not encrypted.
    The packet construction looks like this:</t>
        <t keepWithNext="true">SVR Packet Layout</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
     Fragment 1
    +-----+-----+----------+----------+---------+
    |Peer |Peer | Metadata | Header   | First   |
    |IP   |L4   | Header   | TLV-1,16 | Fragment|
    |HDR  |HDR  | 12 Bytes | 22 Bytes |         |
    +-----+-----+----------+----------+---------+

     Fragment 2
    +-----+-----+----------+----------+---------+
    |Peer |Peer | Metadata | Header   | Second  |
    |IP   |L4   | Header   | TLV-1    | Fragment|
    |HDR  |HDR  | 12 Bytes | 14 Bytes |         |
    +-----+-----+----------+----------+---------+

     Fragment 3
    +-----+-----+----------+----------+---------+----------+
    |Peer |Peer | Metadata | Header   | Third   | PKT      |
    |IP   |L4   | Header   | TLV-1    | Fragment| HMAC     |
    |HDR  |HDR  | 12 Bytes | 14 Bytes |         | SIGNATURE|
    +-----+-----+----------+----------+---------+----------+

        ]]></artwork>
        <t>The metadata type 1 inside the SVR fragment will have its own 
    extended ID assigned. This allows a different number of fragments
    to be between router A and B than the Client and Server have. It
    also allows independent fragmentation by SVR should it be required.
    Router B will process the fragments from router A. Router B will 
    look at its egress MTU size, and the largest fragment seen recorded by 
    RouterA and transmitted in Metadata to determine the proper size
    fragments to send, and the packet is fragmented and sent.</t>
        <t>There are no other metadata fields required. All information
    about the session state is tied to the 5-tuple peer pathway and 
    transports ports.</t>
        <t>The details on packet fragmentation are identical to what is 
    standardly performed in IP fragmentation, exception for
    the full L4 headers and metadata insertion.</t>
        <t>If a packet traversing an SVR needs to be fragmented by the
    router for an SVR segment for any reason, including the insertion of
    metadata, the initiating router inserts metadata on the first packet
    and duplicates the L4 header (either TCP or UDP)  on subsequent
    fragments and inserts metadata. In this case the Largest Fragment
    Seen and Original ID field in the metadata is left blank.</t>
        <t keepWithNext="true">Ladder Diagram Fragmented Packets:</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . . . . . . . . . . . . . . . . Server
          |                                                   |
          |         RouterA                    RouterB        |
          |            |                          |           |
          |--Lg Pkt--->|                          |           |
          |            |--------Frag 1[MD]------->|           |
          |            |                          |           |
          |            |----Frag 2[L4 Hdr|MD]---->|           |
          |            |                          |--Lg Pkt-->|
          |            |                          |           |

        ]]></artwork>
      </section>
      <!-- packet_fragmentation -->

  <section anchor="icmp" toc="include" numbered="true">
        <name>ICMP and SVR</name>
        <t>There are two types of ICMP messages. There are messages associated
  with specific packet delivery network errors. This includes:</t>
        <ul spacing="normal">
          <li> Type 3: Destination Unreachable </li>
          <li> Type 11: Time Exceeded (TTL)</li>
        </ul>
        <t>These messages have information from the packet that generated the
  error by including the IP header + 8 bytes  in the ICMP message (See 
  <xref target="RFC0792" format="default"/>. It is important to deliver the ICMP message back to
  the origin.  For these ICMP messages, the router MUST determine what active
  session the ICMP message belongs to by parsing the IP header information
  inside the ICMP message.  Once a session is found, the ICMP message is
  transported across the SVR and reverse metadata is applied by having its
  destination address changed to the Waypoint Addresses of the routers.</t>
        <t>Metadata type 20 and 21 are used to send the source of the ICMP
  error backward through the networks. See <xref target="rtr_egress_src_addr_v4" format="default"/> and
  <xref target="rtr_egress_src_addr_v6" format="default"/> for information about these metadata
  formats.  This repeats until the ICMP packet arrives at the initial SVR router.
  At this point the ICMP packet is recreated and the source address is changed
  to the address communicated through metadata type 20 and 21.</t>
        <t keepWithNext="true">SVR Fragment Packet Layout</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[
    +------------+------------+----------------+--------------+
    |  IP HEADER | UDP HEADER | Metadata 20/21 | ICMP Packet  |
    +------------+------------+----------------+--------------+
        ]]></artwork>
        <t keepWithNext="true">ICMP over SVR for Network Failures</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

    Client . . . . . . . . . . . . . . . . . . . . . . .No Network 
      |                                                  Found
      |         RouterA                    RouterB          |
      |            |                          |             |
      |----PKT---->|                          |             |
      |            |------PKT[MD]------------>|             |
      |            |                          |<--ICMP------|
      |            |                          |  (Router B) |
      |            |<--UDP[ICMP[RMD]]---------|             |
      |<--ICMP-----|                          |             |
      | (Client)   |                          |             |
      |            |                          |             |

        ]]></artwork>
        <t>The first ICMP message is directed to Router B. Router B examines
  the ICMP error to find the session, and forwards backwards to the correct
  Waypoint for Router A. Router A recreates the ICMP message, and sends to
  the Client. The address of where the error was detected is in </t>
        <t>The second type of ICMP message is not related to any specific
  sessions. These types of messages include ICMP ECHO for example.
  These are always encapsulated as UDP, and a session is created for
  the ICMP message. The identifier field in ICMP and the IP addresses
  are used as the 5-tuple session key. This includes:</t>
        <ul spacing="normal">
          <li> Type 8:ECHO Request (Ping)  </li>
        </ul>
        <t keepWithNext="true">ICMP over SVR for Information </t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

        Client . . . . . . . . . . . . . . . . . . . . . . . Target
          |                                                     |
          |             RouterA             RouterB             |
          |                |                   |                |
          |--ICMP ECHO---->|                   |                |
          |                |---UDP[ICMP ECHO]->|                |
          |                |       [MD1]       |                |
          |                |                   |---ICMP ECHO--->|
          |                |                   |<--ECHO RESP----|
          |                |<--UDP[ECHO RESP]--|                |
          |                |       [RMD1]      |                |
          |<--ECHO RESP----|                   |                |

        ]]></artwork>
        <t>The ICMP message creates a session on Router A directed towards
  Router B. Metadata MD1 is inserted just like any UDP session to
  establish the return pathway for the response. Reverse metadata is
  inserted into the ECHO Response, effectively creating an ICMP session. 
  Subsequent identical ICMP messages will utilize this path without
  metadata being inserted.  This session state MUST be guarded with an
  inactivity timer and the state deleted.</t>
      </section>
      <!-- icmp -->

      <section anchor="state_recovery_examples" toc="include" numbered="true">
        <name>State Recovery Examples</name>

        <t>It is exceedingly rare, but there are cases where session
        state can be lost. Well written applications generally self 
        correct for any networking changes or interruptions. There are
        however applications with long lived nearly idle sessions (for example
        Session Initiation Protocol on idle handsets). In these situations
        recovering state is required.</t>

        <t>Every SVR session has one or more SVR routers that have the full
        session state. Below is a set of techniques to reobtain the session
        state either from a peer or through regeneration and replacement.</t>

	<t>The simplest scenario is when the Ingress SVR router
        loses state. In this scenario, it simple creates a new session
        for the old existing session but has the exact parameters
        of the original session. When this packet with first
        packet metadata reaches the egress SVR, the session state
        tables are updated, allowing two way end-to-end packet
        processing.</t>

        <t>This is secured against attack because the first packet
        metadata is both signed and encrypted.</t>

        <t keepWithNext="true">
            State Recovering Ingress Router with Active Session</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

      Client . . . . . . . . . . . . . . . . . . . . . . . Server
        |                                                     |
        |        Ingress      Middle        Egress            |
        |          SVR         BOX           SVR              |
        |           |           |             |               |
      <================Existing Bi-Directional Session=========>
        |           |           |             |               |
        |         State         |             |               |
        |         Lost          |             |               |
        |           |           |             |               |
        |---PKT---->|           |             |
        |         Create        |             |               |
        |          New          |             |               |
        |        Session        |             |               |
        |           |--PKT[MD]->|             |               |
        |           |           |--PKT[MD]--->|               |
        |           |           |           Update            |
        |           |           |          Existing           |
        |           |           |           Session           |
        |           |           |             |----PKT------->|
                  

        ]]></artwork>

        <t>The next scenario is when the Ingress SVR loses session
        state, and the client application is idle. There is data
        from the server that can't be delivered. If a packet
        arrives from the server at the Egress SVR the length of
        time the client has been inactive is reviewed. If longer
        than the defined inactivity timer (provisioned, but
        defaults to 5 seconds), Session Health Check (see
        <xref target="session_health_check" format="default" />.)
        metadata will be inserted into the packet. The Ingress SVR
        responds by generating a packet (UDP) with the same L3 and
        L4 information as the session, and adds SVR Control Message
        to respond (see <xref target="proto_msg" format="default"/>).
        If the Ingress SVR needs state for the session, it sets the
        drop reason in metadata to type=6, delete session. This 
        causes the very next packet from the server to include
        first packet metadata. The session will be treated as a
        new session. This data is used to restore all
        aspects of the session.</t> 

        <t keepWithNext="true">
            State Recovering Ingress Router Client Inactive</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

      Client . . . . . . . . . . . . . . . . . . . . . . Server
        |                                                     |
        |        Ingress        Middle        Egress          |
        |          SVR           BOX           SVR            |
        |           |             |             |             |
      <================Existing Bi-Directional Session=======>
        |           |             |             |             |
        |         State           |             |             |
        |         Lost            |             |             |
        |           |             |             |<----PKT-----|
        |           |             |             |             |
        |           |             |       Client Inactivity   |
        |           |             |         Timer Exceeded    |
        |           |             |             |             |
        <---<--< SEND SESSION HEALTH CHECK METADATA <---<---<-
        |           |             |             |             |
        |           |             |<---PKT[MD]--|             |
        |           |<--PKT[MD]---|             |             |
        |       No State          |             |             |
        |           |             |             |             |
        >---->---> SEND SVR Control Metadata Drop=6 >--->---->-
        |           |             |             |             |
        |           |-GenPKT[MD]->|             |             |
        |           |             |-GenPKT[MD]->|             |
        |           |             |             |             |
        |           |             |         Clear State       |
        |           |             |             |             |
        |           |             |          Send First       |
        |           |             |         PKT Metadata      |
        |           |             |          Next PKT         |
        |           |             |             |             |
        <--<- ON NEXT PACKET SEND FIRST PACKET METADATA <---<-
        |           |             |             |             |
        |           |             |             |<---PKT------|
        |           |             |<--PKT[MD]---|             |
        |           |<--PKT[MD]---|             |             |
        |           |             |             |             |
        |    New Session  State   |             |             |
        |           |             |             |             |
        =======Treat as a new session from this point =========
                  
        ]]></artwork>

        <t>If an Egress router loses state for a session, it 
        must reobtain the state from a peer. In the example shown
        below the Ingress SVR detects upon receipt of a packet that
        the server has not responded for more than the inactivity
        timer. The packet that arrived is then augmented with 
        Session Health Check metadata (see
        <xref target="session_health_check" format="default"/>).
        If the egress router MUST reply to the session health
        check by generating a UDP packet with SVR Control Message
        metadata (see <xref target="proto_msg" format="default"/>).
        If it requires state, it must set the drop reason
        to a type=2, indicating metadata needs to be sent. The next
        packet from the client will include all of the first
        packet metadata which is used to restore the mission
        state information.</t>

        <t keepWithNext="true">
            State Recovering Egress Router</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

      Client . . . . . . . . . . . . . . . . . . . . . . Server
        |                                                     |
        |        Ingress        Middle        Egress          |
        |          SVR           BOX           SVR            |
        |           |             |             |             |
      <================Existing Bi-Directional Session=======>
        |           |             |             |             |
        |           |             |           State           |
        |           |             |            Lost           |
        |           |             |             |             |
        |--PKT----->|             |             |<---PKT------|
        |           |----PKT----->|             |             |
        |           |             |----PKT----->|             |
        |           |             |             |             |
        |           |             |          Pkts Dropped     |
        |--PKT----->|             |             |             |
        |       Inactivity        |             |             |
        |       Exceeded          |             |             |
        |           |             |             |             |
        >--->---> SEND SESSION HEALTH CHECK METADATA >--->---->
        |           |             |             |             |
        |           |---PKT[MD]-->|             |             |
        |           |             |--PKT[MD]--->|             |
        |           |             |          No State         |
        |           |             |             |             |
        <----<---- SEND SVR CONTROL MESSAGE TYPE=2 <----<----<-
        |           |             |             |             |
        |           |             |<-GenPKT[MD]-|             |
        |           |<-GenPKT[MD]-|             |             |
        |--PKT----->|             |             |             |
        |           |             |             |             |
        -->---> SEND FIRST PACKET METADATA IN NEXT PACKET ---->
        |           |             |             |             |
        |           |---PKT[MD]-->|             |             |
        |           |             |--PKT[MD]--->|             |
        |           |             |          Session          |
        |           |             |        State Restored     |
        |           |             |             |---PKT------>|
        |           |             |             |             |
                  
        ]]></artwork>

        <t>The most likely loss of state occurs in middle boxes.
        Often the middle box will either stop routing packets
        in one direction, both directions, or modify the UDP
        or TCP ports without notice.</t>

        <t>In this instance, we do not know for certain where the
        state was lost, so we attempt to recover it from our SVR
        peer by including Session Health Check metadata in a
        packet of the session. SRV Peers must respond to this
        packet, so no response indicates there is a middle box
        or network problem.</t>

        <t>To restore the session, the session state is cleared
        and the next packet is treated as a first packet. A full
        metadata exchange between peers is completed as documented
        in <xref target="east_first_pkt_proc" format="default"/>.
        Both Ingress and Egress SVRs can detect that there is an
        existing session with the exact same addresses and ports
        and simply replace the session state.</t>

        <t keepWithNext="true">
            State Recovering of Middlebox</t>
        <artwork name="" type="" align="left" alt=""><![CDATA[

      Client . . . . . . . . . . . . . . . . . . . . . . Server
        |                                                     |
        |        Ingress        Middle        Egress          |
        |          SVR           BOX           SVR            |
        |           |             |             |             |
      <================Existing Bi-Directional Session=======>
        |           |             |             |             |
        |           |          State            |             |
        |           |           Lost            |             |
        |           |             |             |             |
        |--PKT----->|             |             |<---PKT------|
        |           |----PKT----->|             |             |
        |           |             |<---PKT------|             |
        |           |          Packets          |             |
        |           |          Dropped          |             |
        |        Inactivty        |             |             |
        |        Exceeded         |             |             |
        |           |             |             |             |
        |---PKT---->|             |             |             |
        |           |             |             |             |
        |           |             |             |             |
        |           |---PKT[MD]-->|             |             |
        |           |             |             |             |
        |      No Response        |             |             |
        |           |             |             |             |
        |      Re Allocate Ports  |             |             |
        |   Update Session State  |             |             |
        |           |             |             |             |
        |--PKT----->|             |             |             |
        |           |             |             |             |
        ---> SEND FIRST PACKET METADATA, KEEP OLD SESSIONID--->
        |           |             |             |             |
        |           |--PKT[MD]--->|             |             |
        |           |             |--PKT[MD]--->|             |
        |           |             |          Update           |
        |           |             |          Session          |
        |           |             |             |---PKT------>|
        |           |             |             |             |
        ]]></artwork>
      </section>
      <!-- state_recovery_examples -->
</section>
    <!-- meta_use_cases -->

<section anchor="meta_format" toc="include" numbered="true">
      <name>SVR Metadata Format and Composition</name>
      <t>The format of metadata has both Header attributes as well as Payload
attributes. Header attributes are always guaranteed to be unencrypted. These
headers may be inspected by intermediate network elements but can't be
changed. Header attributes do not have a forward or reverse direction.
Header attributes are used for router and peer pathway controls.</t>
      <t>Payload attributes optionally can be encrypted by the sender. Payload
attributes are associated with sessions, and as such have a forward and
reverse direction. For encryption, the pre-existing security association
and key sharing is outside the scope of this document. Each SVR attribute
defined will indicate whether it is a header attribute (unencrypted) or
payload attribute (optionally encrypted).  There are no attributes that can
exist in both sections.</t>
      <section anchor="meta_header" toc="include" numbered="true">
        <name>Metadata Header</name>
        <t>The metadata header is shown below. A well-known "cookie"
    (0x4c48dbc6ddf6670c in network byte order byte order)
    is built into the header which is used in concert with
    contextual awareness of the packet itself to determine the presence of
    metadata within a packet. This is an eight-byte pattern that immediately
    follows the L4 header and is an indicator to a receiving router that a
    packet contains metadata. NOTE: Normal IP traffic will never
    have the Waypoint Address as its destination. If a packet arrives at
    a SVR Router Waypoint it has to have Metadata or be associated with
    an active SVR session. Please see <xref target="session_state_reqs" format="default"/>
    for a discussion of state recovery techniques.</t>
        <figure anchor="meta_header_diagram">
          <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                             Cookie                            +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |Version|   Header Length       |         Payload Length        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |     Header TLVs ...           |       Payload TLVs ...        |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ]]></artwork>
        </figure>
        <dl newline="false" spacing="normal">
          <dt>Cookie (8 bytes):</dt>
          <dd>The fingerprint of metadata. This value
      is used to determine the existence of metadata within a packet.</dd>
          <dt>Version (4-bits):</dt>
          <dd>Field representing the version of the
      metadata header. The current version of metadata is 0x1.</dd>
          <dt>Header Length (12-bits):</dt>
          <dd>Length of the metadata header
      including any added Header TLV attributes that are guaranteed to be
      unencrypted. When there are no Header TLVs, the value Header Length
      is 12 Bytes or OxC.</dd>
          <dt>Payload Length (2 bytes):</dt>
          <dd>Length of data following the
      metadata header, not including the size of the header. This data could
      be encrypted.  The value of this field is the number of bytes in the
      Payload TLV's. If there are no TLV's the value is zero.</dd>
        </dl>
        <section anchor="false_positives" toc="include" numbered="true">
          <name>False Positives</name>
          <t>Given that no byte sequence is truly unique in the payload of a
      packet, in the scenario where the original payload after the L4 header
      contained the same byte sequence as the cookie, false positive logic is
      enacted on the packet. If the metadata HMAC signature can't verify that the
      metadata is valid, then a false positive metadata header is added to the
      packet to indicate that the first eight bytes of the payload matches the
      cookie.</t>
          <t>The structure of a false positive metadata includes just a header
      of length 12 bytes, with zero header TLVs and zero payload TLVs. 
      The receiving side of a packet with false positive metadata will strip out
      the metadata header.</t>
          <t>In the scenario where a router receives a false positive metadata
      header but intends to add metadata to the packet, the false positive
      metadata header is modified to contain the newly added attributes. Once
      attributes are added, the metadata header is no longer considered to be
      false positive.</t>
        </section>
        <!-- false_positives -->

    <section anchor="fwd_rev_attr" toc="include" numbered="true">
          <name>Forward and Reverse Attributes</name>
          <t>Payload metadata attributes may be valid in the forward
      direction, the reverse direction, or both. If not valid, it is ignored
      quietly by the receiving side.</t>
        </section>
        <!-- fwd_rev_attr -->

  </section>
      <!-- meta_header -->

  <section anchor="tlv_structure" toc="include" numbered="true">
        <name>TLVs for Attributes</name>
        <t>All metadata attributes are expressed as Tag Length Values or TLV's.
    This includes Header and Payload TLVs. It is recommended that Payload
    TLVs be encrypted, but not mandatory. When debugging networks, or if
    mid-stream routers need to consult the TLV's, they can be transmitted
    in clear text. The entire metadata block is signed, and thus the
    integrity of the data can be verified. No midstream router or middlebox
    can modify any aspect of the metadata. Doing so will invalidate the
    signature, and the metadata will be dropped.</t>
        <figure anchor="tlv_diagram">
          <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type               |           Length              |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Variable Length Values .....                         |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/

    ]]></artwork>
        </figure>
        <dl newline="false" spacing="normal">
          <dt>Type (2 bytes):</dt>
          <dd>Type of data that follows. Each of
    different Header and Payload TLV's are defined below.</dd>
          <dt>Length (2 bytes):</dt>
          <dd>Number of bytes associated with the
    length of the value (not including the 4 bytes associated with the
    type and length fields).</dd>
        </dl>
      </section>
      <!-- tlv_structure -->


  <section anchor="header_attr" toc="include" numbered="true">
        <name>Header Attributes</name>
        <section anchor="fragment" toc="include" numbered="true">
          <name>Fragment</name>
          <t>When a packet is fragmented to insert metadata, a new fragmentation
    mechanism must be added to prevent fragmentation attacks and to support
    reassembly (which requires protocol and port information). If a packet
    is received that IS a fragment, and it must transit through a metadata
    signaled pathway, it must also have this metadata attached to properly
    bind the fragment with the correct session.</t>
          <t>All fragments will have a metadata header and the fragment TLV added
    to the guaranteed unencrypted portion of the metadata header. If the
    original packet already has a metadata header on it, the fragment TLV
    will be added to it. See <xref target="RFC0791" format="default"/> for information about
    IP Fragmentation. For a detailed example of packet fragmentation in 
    SVR please see <xref target="packet_fragmentation" format="default"/></t>
          <figure anchor="fragment_attr_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 1           |           Length = 10         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                         Extended ID                           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |       Original ID             |Flags|    Fragment Offset      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |    Largest Seen Fragment      |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 1, Length 10.</dd>
            <dt>Extended ID (4 bytes):</dt>
            <dd>Uniquely identifies a packet that
        is broken into fragments This ID is assigned by the SVR  that is
        processing fragmented packets. IPv6 uses a 32-bit Extended ID, and IPv4
        uses a 16-bit ID. We use the same algorithm for fragmenting packets
        for both IPv6 and IPv4, therefore we chose a 32-Bit Extended ID.  .</dd>
            <dt>Original ID (2 bytes):</dt>
            <dd>Original identification value of
        the L3 header of a received packet that is already fragmented.</dd>
            <dt>Flags (3-bits):</dt>
            <dd>
              <t>Field used for identifying fragment
        attributes. They are (in order, from most significant to least
        significant):

              </t>
              <ul empty="true" spacing="normal">
                <li>bit 0: Reserved; must be zero.</li>
                <li>bit 1: Don't fragment (DF).</li>
                <li>bit 2: More fragments (MF).</li>
              </ul>
            </dd>
            <dt>Fragment Offset (13-bits):</dt>
            <dd>Field associated with the
        number of eight-byte segments the fragment payload contains.</dd>
            <dt>Largest Seen Fragment (2 bytes):</dt>
            <dd>Each SVR router keeps
        track of the largest fragment processed from each interface. This allows
        the router to make inferences about the MTU size when fragmenting packets
        in the opposite direction. This information is used along with a given
        egress network interface MTU to determine the fragment size of a
        reassembled packet.</dd>
          </dl>
        </section>
        <!-- fragment -->

    <section anchor="security_id" toc="include" numbered="true">
          <name>Security Identifier</name>
          <t>A versioning identifier used to determine which security key version
      should be used when handling features dealing with security and
      authenticity of a packet.</t>
          <figure anchor="security_id_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 16           |            Length = 4         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Security Key Version                   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 16, Length 4.</dd>
            <dt>Security Key Version (4 bytes):</dt>
            <dd>This is a four-byte
        security key version identifier. This is used to identify the
        algorithmic version used for metadata authentication and
        encryption.</dd>
          </dl>
        </section>
        <!-- security_id -->

    <section anchor="disabled_fwd_meta" toc="include" numbered="true">
          <name>Disable Forward Metadata</name>
          <t>An indication that forward metadata should be disabled.  This is sent
      in the reverse metadata to acknowledge receipt of the metadata. This is
      the second part of the metadata handshake.</t>
          <figure anchor="disabled_fwd_attr_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 18           |         Length = 0            |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 18, Length 0.</dd>
          </dl>
          <t>No other data is required. The specific session that is being
      referred to is looked up based on the 5-tuple address of the packet.
      See metadata handshake in <xref target="handshake" format="default"/>.</t>
        </section>
        <!-- disabled_fwd_meta -->

    <section anchor="rtr_egress_src_addr_v4" toc="include" numbered="true">
          <name>IPv4 ICMP Error Location Address</name>
          <t>This is exclusively used to implement ICMP messages that need to
      travel backwards through SVR pathways. See <xref target="icmp" format="default"/> for 
      more information. The IPv4 address of the source of the ICMP message
      is placed into metadata. This metadata travels in the reverse
      direction backwards to the originating SVR, which restores the
      information and sends an ICMP message to the originator of the packet.</t>
          <figure anchor="rtr_egress_src_addr_v4_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 20           |          Length = 4           |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Source Address                         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 20, Length 4.</dd>
            <dt>Source Address (4 bytes):</dt>
            <dd>Original IPv4 source address of
        the originating router.</dd>
          </dl>
        </section>
        <!-- rtr_egress_src_addr_v4 -->

    <section anchor="rtr_egress_src_addr_v6" toc="include" numbered="true">
          <name>IPv6 ICMP Error Location Address</name>
          <t>This is exclusively used to implement ICMP messages that need to
      travel backwards through SVR pathways. See <xref target="icmp" format="default"/> for 
      more information. The IPv6 address of the source of the ICMP message
      is placed into metadata. This metadata travels in the reverse
      direction backwards to the originating SVR, which restores the
      information and sends an ICMP message to the originator of the packet.</t>
          <figure anchor="rtr_egress_src_addr_v6_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 21           |          Length = 16          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                        Source Address                         +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 21, Length 16.</dd>
            <dt>Source Address (16 bytes):</dt>
            <dd>Original IPv6 source address
        of the originating router.</dd>
          </dl>
        </section>
        <!-- rtr_egress_src_addr_v6 -->


    <section anchor="proto_msg" toc="include" numbered="true">
          <name>SVR Control Message</name>
          <t>The SVR Control  Message is used for protocol specific purposes
      that are limited to a single peer pathway. This message is sent by an
      SVR router to a peer. This metadata is always sent in a UDP message
      originating by the SVR control plane.</t>
          <dl newline="false" spacing="normal">
            <dt>Keep Alive:</dt>
            <dd>When an SVR peer is behind a NAT device
          and the SVR peer has active sessions, the SVR peer will generate
          a "Keep Alive" often enough (i.e., 20 seconds) to prevent the
          firewall from closing a pinhole. This message is generated
          completely by the SVR router, and directed to the SVR peer for
          a session. The UDP address and ports fields must exactly match
          the session that has been idle longer than the provisioned time.</dd>
            <dt>Turn On Metadata:</dt>
            <dd>When a packet is received, and there
          is missing SVR Session State, the correction procedure may involve
          sending this request to a peer SVR router that has the information.
          Please see <xref target="session_state_reqs" format="default"/> for more
          information.</dd>
            <dt>Turn Off Metadata:</dt>
            <dd>Disable Metadata on a specific
          5-tuple. In certain cases, the SVR peer may continue
          so send metadata because there are no reverse flow packets
          or because metadata was enabled to recover from a loss of
          state. This message is not part of the normal metadata
          handshake and only has a scope of a single peer pathway.</dd>
           <dt>Delete Session:</dt>
           <dd>The session associated with the flow spec used by this generated
           packet should be deleted. This provides an administrative and error
           correcting capability to remove a session when required.</dd>
           <dt>Session State Exists:</dt>
           <dd>In response to a Session Health Check request (see
           <xref target="session_health_check" format="default"/> to indicate
           that state for a session exists.</dd>
          </dl>
          <figure anchor="proto_msg_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Type = 24            |           Length = 1          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |  Drop Reason  |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 24, Length 1.</dd>
            <dt>Drop Reason (1 byte):</dt>
            <dd>
              <t>Reason why this packet should be
        dropped. </t>
              <ul spacing="normal">
                <li>0 = Unknown. This value is reserved and used for backwards
            compatibility.</li>
                <li>1 = Keep Alive. A packet that is dropped by the receiving node.
            Used only to keep NAT pinholes alive on middleboxes.</li>
                <li>2 = Enable Metadata. Begin sending metadata on the
            peer pathway for the 5-tuple matching this control packet.</li>
                <li>3 = Disable Metadata. Stop sending metadata on the
            peer pathway for a 5-tuple matching this control packet.</li>
                <li>6 = Delete Session. Delete any state for the session
            associated with this metadata.</li>
                <li>8 = Session Health Check indicates state exists, and is
            valid.</li>
              </ul>
            </dd>
          </dl>
        </section>
        <!-- proto_msg -->

    <section anchor="path_metrics" toc="include" numbered="true">
          <name>Path Metrics</name>
          <t>This metadata type is used to allows peers to measure and
      compute inline flow metrics for a specific peer pathway and a chosen
      subset of traffic.
      class. The flow metrics can include jitter, latency and packet loss.
      This is an optional metadata type.</t>
          <t>When a peer sends this metadata, it provides the information
      for the period of time to the peer.</t>
          <t>When a peer receives this metadata type 26, it responds with
      metadata type 26.</t>
          <t>After several exchanges, each side can compute accurate path
      metrics for the traffic included. This metadata can be sent
      at any time, but is normally sent when metadata is being sent
      for other reasons. The metadata includes "colors" which represent
      blocks of packets. Packet loss and latency can be determined between
      routers using this in line method. Using colors to measure
      inline flow performance is outside the scope of this document.
      Please refer to <xref target="RFC9341" format="default"/></t>
          <figure anchor="path_metrics_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 26           |           Length = 10         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | Tx Co |                Transmit TimeValue                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  | Rx Co |                Received TimeValue                     |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |D|   Previous Rx Color Count   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 26, Length 10.</dd>
            <dt>Transmit Color (4-bits):</dt>
            <dd>Current color of a transmitting
        node.</dd>
            <dt>Transmit Time Value (28-bits):</dt>
            <dd>Current time value in
        milliseconds at time of marking. This time value represents the amount
        of time which has elapsed since the start of a transmit color.</dd>
            <dt>Received Color (4-bits):</dt>
            <dd>Most recently received color
        from a remote node. This represents the color last received from
        a specific peer.</dd>
            <dt>Receive Time Value (28-bits):</dt>
            <dd>Cached time value in
        milliseconds from adjacent node adjusted by the elapsed time between
        caching of the value and current time. This time value is associated
        with the received color.</dd>
            <dt>Drop Bit (1-bit):</dt>
            <dd>Should this packet be dropped. This
        is required if a packet is being sent solely to measure quality
        on an otherwise idle link.</dd>
            <dt>Previous Rx Color Count (15-bits):</dt>
            <dd>Number of packets
        received from the previous color block. This count is in reference to
        the color previous to the current RX color which is defined above.</dd>
          </dl>
        </section>
        <!-- path_metrics -->

    <section anchor="session_health_check" toc="include" numbered="true">
          <name>Session Health Check</name>
          <t>This metadata is used to request a session state check
      by a peer. The peer responds upon receipt with a generated packet
      with metadata confirming presense of metadata.  This metadata type
      can be included in an existing packet to check that the peer has
      session state.  The peer will always respond with a generated packet
      that includes a forced drop metadata attribute.
      See <xref target="state_recovery_examples" format="default"/>
      for an example.</t>

          <figure anchor="session_health_check_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 46          |           Length = 1          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Type = 1    |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 46, Length 1.</dd>
            <dt>TYPE: (1=Request, 2=Request/Timeout)</dt>
            <dd>Request to verify session state with backward metadata.
        Type 1 indicates session state is available, Type 2 indicates
        session state is available but will be cleared and replaced upon
        receipt of state from a peer. Type 2 is used when a middle box
        closes pinholes that must be recovered.</dd>
          </dl>
        </section>
        <!-- remaining_session_time -->


  </section> <!-- header_attr -->

  <section anchor="payload_attrs" toc="include" numbered="true">
        <name>Payload Attributes</name>
        <t>Payload attributes are used for session establishment and SHOULD be
    encrypted to provide privacy. Encryption can be disabled for
    debugging.</t>
        <section anchor="fwd_ctx_v4" toc="include" numbered="true">
          <name>Forward Context IPv4</name>
          <t>The context contains a five-tuple associated with the original
      addresses, ports, and protocol of the packet. This is also known as the
      Forward Session Key.</t>
          <figure anchor="fwd_ctx_v4_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             Type = 2          |           Length = 13         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Source Address                         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     Destination Address                       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |         Source Port           |      Destination Port         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Protocol    |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 2, Length 13.</dd>
            <dt>Source Address (4 bytes):</dt>
            <dd>Original IPv4 source address of
        the packet.</dd>
            <dt>Destination Address (4 bytes):</dt>
            <dd>Original IPv4 destination
        address of the packet.</dd>
            <dt>Source Port (2 bytes):</dt>
            <dd>Original source port of the
        packet.</dd>
            <dt>Destination Port (2 bytes):</dt>
            <dd>Original destination port of
        the packet.</dd>
            <dt>Protocol (1 byte):</dt>
            <dd>Original protocol of the packet.</dd>
          </dl>
        </section>
        <!-- fwd_ctx_v4 -->

    <section anchor="fwd_ctx_v6" toc="include" numbered="true">
          <name>Forward Context IPv6</name>
          <t>A five-tuple associated with the original addresses, ports, and
      protocol of the packet for IPv6.</t>
          <figure anchor="fwd_ctx_v6_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 3            |          Length = 37          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                         Source Address                        +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                       Destination Address                     +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |        Destination Port       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Protocol    |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 3, Length 37.</dd>
            <dt>Source Address (16 bytes):</dt>
            <dd>Original IPv6 source address of
        the packet.</dd>
            <dt>Destination Address (16 bytes):</dt>
            <dd>Original IPv6 destination
        address of the packet.</dd>
            <dt>Source Port (2 bytes):</dt>
            <dd>Original source port of the
        packet.</dd>
            <dt>Destination Port (2 bytes):</dt>
            <dd>Original destination port of
        the packet.</dd>
            <dt>Protocol (1 byte):</dt>
            <dd>Original protocol of the packet.</dd>
          </dl>
        </section>
        <!-- fwd_ctx_v6 -->

    <section anchor="rev_ctx_v4" toc="include" numbered="true">
          <name>Reverse Context IPv4</name>
          <t>Five-tuple associated with the egress (router) addresses, ports, and
      protocol of the packet. Forward context and reverse context session keys
      are not guaranteed to be symmetrical due to functions which apply source
      NAT, destination NAT, or both to a packet before leaving the router.</t>
          <figure anchor="rev_ctx_v4_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |             Type = 4          |           Length = 13         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        Source Address                         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     Destination Address                       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |         Source Port           |      Destination Port         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Protocol    |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 4, Length 13.</dd>
            <dt>Source Address (4 bytes):</dt>
            <dd>Egress IPv4 source address of
        the packet.</dd>
            <dt>Destination Address (4 bytes):</dt>
            <dd>Egress IPv4 destination
        address of the packet.</dd>
            <dt>Source Port (2 bytes):</dt>
            <dd>Egress source port of the
        packet.</dd>
            <dt>Destination Port (2 bytes):</dt>
            <dd>Egress destination port of
        the packet.</dd>
            <dt>Protocol (1 byte):</dt>
            <dd>Original protocol of the packet.</dd>
          </dl>
        </section>
        <!-- rev_ctx_v4 -->

    <section anchor="rev_ctx_v6" toc="include" numbered="true">
          <name>Reverse Context IPv6</name>
          <t>Five-tuple associated with the egress (router) addresses, ports, and
      protocol of the packet. Forward and reverse session keys are not
      guaranteed to be symmetrical due to functions which apply source NAT,
      destination NAT, or both to a packet before leaving the router.</t>
          <figure anchor="rev_ctx_v6_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |           Type = 5            |          Length = 37          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                         Source Address                        +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                       Destination Address                     +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |          Source Port          |        Destination Port       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |   Protocol    |
  +-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 5, Length 37.</dd>
            <dt>Source Address (16 bytes):</dt>
            <dd>Egress IPv6 source address of
        the packet.</dd>
            <dt>Destination Address (16 bytes):</dt>
            <dd>Egress IPv6 destination
        address of the packet.</dd>
            <dt>Source Port (2 bytes):</dt>
            <dd>Egress source port of the
        packet.</dd>
            <dt>Destination Port (2 bytes):</dt>
            <dd>Egress destination port of
        the packet.</dd>
            <dt>Protocol (1 byte):</dt>
            <dd>Original protocol of the packet.</dd>
          </dl>
        </section>
        <!-- rev_ctx_v6 -->

    <section anchor="session_uuid" toc="include" numbered="true">
          <name>Session UUID</name>
          <t>Unique identifier of a session. The UUID MUST be conformant
      to <xref target="RFC4122" format="default"/>This is assigned by the peer that is
      initiating a session. Once assigned, it is maintained through all
      participating routers end-to-end.</t>
          <t>The UUID is used to track sessions across multiple routers.
      The UUID also can be used to detect a looping session. The UUID metadata
      field is required for all session establishment.</t>
          <figure anchor="session_uuid_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 6           |           Length = 16         |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                                                               |
  +                                                               +
  |                                                               |
  +                              UUID                             +
  |                                                               |
  +                                                               +
  |                                                               |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 6, Length 16.</dd>
            <dt>UUID (16 bytes):</dt>
            <dd>Unique identifier of a session.</dd>
          </dl>
        </section>
        <!-- session_uuid -->

    <section anchor="tenant_name" toc="include" numbered="true">
          <name>Tenant Name</name>
          <t>An alphanumeric ASCII string which dictates what tenancy the session
      belongs to.</t>
          <figure anchor="tenant_name_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 7           |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                 Name (1 - n bytes) ....                       |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 7, Length variable.</dd>
            <dt>Name (variable length):</dt>
            <dd>The tenant name represented as a
        string.</dd>
          </dl>
        </section>
        <!-- tenant_name -->

    <section anchor="service_name" toc="include" numbered="true">
          <name>Service Name</name>
          <t>An alphanumeric string which dictates what service the session
      belongs to.</t>
          <figure anchor="service_name_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 10          |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                  Service Name (1-n bytes) .....               |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 10, Length variable.</dd>
            <dt>Name (variable length):</dt>
            <dd>The service name represented as a
        string.</dd>
          </dl>
        </section>
        <!-- service_name -->

    <section anchor="session_encrypt" toc="include" numbered="true">
          <name>Session Encrypted</name>
          <t>Indicates if the session is having its payload encrypted by
      the SVR router. This is different from having the metadata
      encrypted.  The keys used for payload encryption are dependent
      on the Security Policy defined for a session.</t>
          <t>This field is necessary because often traffic is already
      encrypted before arriving at an SVR router (making DPI a poor
      choice). Also in certain use cases, re-encryption may be required.
      This metadata TLV is always added when SVR encrypts the payload.</t>
          <figure anchor="session_encrypt_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 11          |           Length = 0          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 11, Length 0.</dd>
          </dl>
        </section>
        <!-- session_encrypt -->

    <section anchor="tcp_syn_pkt" toc="include" numbered="true">
          <name>TCP SYN Packet</name>
          <t>Indicates if the session is being converted from TCP to UDP
      to enable passing through middle boxes that are TCP session
      stateful. A SVR implementation must verify that metadata can
      be sent inside TCP packets through testing the Peer Pathway. If
      the data is blocked, then all TCP sessions must be converted to
      UDP sessions, and restored on the destination peer.</t>
          <t>Although this may seem redundant with the Forward Context
      that also has the same originating protocol, this refers to
      a specific peer pathway. In a multi-hop network, the TCP conversion
      to UDP could occur at the second hop. It's important to restore
      the TCP session as soon as possible after passing through the 
      obstructive middlebox.</t>
          <t>When TCP to UDP conversion occurs, no bytes are changed
      other than the protocol value (TCP-&gt;UDP). Because the UDP
      message length and checksum sit directly on top of the TCP
      Sequence Number, the Sequence number is overwritten. The
      Sequence number is saved by copying it to the TCP Checksum.
      The Checksum is recalculated upon restoration of the packet.
      The packet integrity against bit loss or malicious activity
      is provided through the HMAC signature.</t>
          <figure anchor="tcp_syn_pkt_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 12          |           Length = 0          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 12, Length 0.</dd>
          </dl>
          <t>Note: This type does not contain any value as its existence in
      metadata indicates a value.</t>
        </section>
        <!-- tcp_syn_pkt -->

    <section anchor="src_rtr_name" toc="include" numbered="true">
          <name>Source Router Name</name>
          <t>An alphanumeric string which dictates which source router the packet
      is originating from. This attribute may be present in all forward
      metadata packets if needed.</t>
          <figure anchor="src_rtr_name_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 14          |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |               Router Name (1-n bytes) ....                    |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 14, Length variable.</dd>
            <dt>Name (variable length):</dt>
            <dd>The router name represented as a
        string.</dd>
          </dl>
        </section>
        <!-- src_rtr_name -->

    <section anchor="src_rtr_sec_policy" toc="include" numbered="true">
          <name>Security Policy</name>
          <t>An alphanumeric string containing the Security Policy to use for a
      particular session. This is used only when payload encryption is being
      performed. The Security Policy describes the specifics about Ciphers
      used for payload encryption.</t>
          <figure anchor="src_rtr_sec_policy_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 15          |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        SECURITY POLICY                        |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 15, Length variable.</dd>
            <dt>KEY (variable length):</dt>
            <dd>The session key to
        use for encryption/decryption for this packet and future
        packets in a session.</dd>
          </dl>
        </section>
        <!-- src_rtr_sec_policy -->

    <section anchor="peer_rtr_id" toc="include" numbered="true">
          <name>Peer Pathway ID</name>
          <t>An ASCII string which dictates which router peer pathway has
      been chosen for a packet. This name is the hostname or IP address of the
      egress interface of the originating router. This can be used to determine
      the peer pathway used exactly when there may be multiple possibilities.
      This enables association of policies with specific paths.</t>
          <figure anchor="peer_rtr_id_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 19          |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Peer Pathway Name (1-n bytes) ....                 |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 19, Length variable.</dd>
            <dt>Name (variable length):</dt>
            <dd>The peer pathway name which is
        represented as a string.</dd>
          </dl>
        </section>
        <!-- peer_rtr_id -->

    <section anchor="src_nat_addr_v4" toc="include" numbered="true">
          <name>IPv4 Source NAT Address</name>
          <t>Routers may be provisioned to perform source NAT functions while
      routing packets. When a source NAT is performed by an SVR Peer,
      this metadata TLV MUST be included.  When the far end router
      reconstructs the packet, it will use this address as the source
      address for packets exiting the SVR.</t>
          <figure anchor="src_nat_addr_v4_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 25          |           Length = 4          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     IPv4 Source Nat Address                   |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 25, Length 4.</dd>
            <dt>Source Address (4 bytes):</dt>
            <dd>Source NAT address of the
        packet.</dd>
          </dl>
        </section>
        <!-- src_nat_addr_v4 -->

    <section anchor="remaining_session_time" toc="include" numbered="true">
          <name>Remaining Session Time</name>
          <t>After a path failure, it may become necessary to transmit
      a SVR Control Message when there are one-way flows waiting for
      a packet to be transmitted. In these cases, the metadata includes an
      attribute defining the remaining session time so intermediate routers
      creating new session entries will expire the session at the correct 
      time.</t>
          <figure anchor="remaining_session_time_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 42          |           Length = 4          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                     Remaining Session Time (seconds)          |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 42, Length 4.</dd>
            <dt>Remaining Session Time (4 bytes):</dt>
            <dd>Number of seconds
        remaining on a session packet guard time. This ensures accurate
        guarding of sessions that have been  moved.</dd>
          </dl>
        </section>
        <!-- remaining_session_time -->

    <section anchor="src_rtr_sec_key" toc="include" numbered="true">
          <name>Security Encryption Key</name>
          <t>An alphanumeric string containing the cryptographic key to use for
      a payload encryption of a particular session. This is used only when payload
      encryption is being performed. Unless specified in the Security Policy, the
      key used will default to the Peer Key (see <xref target="peer_key_procedure" format="default"/>).
      The key is encrypted in SVR metadata hop-by-hop through a network, preventing
      any party from obtaining the key. The router terminating the session
      utilizes this key to decrypt payload portions of packets. This prevents
      re-encryption penalties associated with multi-hop routing scenarious.
      To support the widest array of keys, the key is sent in PEM format.</t>
          <t>To rekey a session, this SVR metadata can be included in any
      subsequent packet with the new key to use. When rekeying, the
      SVR that initiated the encrypted session must compute a new key, and
      include the key as SVR metadata. Upon receipt, the terminating router
      must create a reverse metadata packet containing the same key to
      indicate when to switch to the new key for decryption. This solves
      race conditions with packets in flight.</t>
          <figure anchor="src_rtr_sec_key_diagram">
            <artwork name="" type="" align="left" alt=""><![CDATA[
   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |            Type = 46          |       Length = variable       |
  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  |                        SECURITY KEY                           |
  \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/
      ]]></artwork>
          </figure>
          <dl newline="false" spacing="normal">
            <dt>TLV:</dt>
            <dd>Type 46, Length variable.</dd>
            <dt>KEY (variable length):</dt>
            <dd>The session key to
        use for encryption/decryption for this packet and future
        packets in a session.</dd>
          </dl>
        </section>
        <!-- src_rtr_sec_policy -->

  </section> <!-- payload_attrs -->

</section> <!-- meta_format -->


<section anchor="sec_consider" toc="include" numbered="true">
      <name>Security Considerations</name>
      <section anchor="hmac_auth" toc="include" numbered="true">
        <name>HMAC Authentication</name>
        <t>HMAC signatures are REQUIRED for the packets that contain metadata to
    guarantee the contents were not changed, and that the router sending it is
    known to the receiver. Any HMAC algorithm can be used, from SHA128, or SHA256
    as long as both sides agree. HMAC is always performed on the layer
    4 payload of the packet. The signature is placed at the end of the
    existing packet.</t>
      </section>
      <!-- hmac_auth -->

  <section anchor="replay_prevent" toc="include" numbered="true">
        <name>Replay Prevention</name>
        <t>Optional HMAC signatures are RECOMMENDED for every packet. This
    prevents any mid-stream attempts to corrupt or impact sessions that are
    ongoing. This also helps detect and correct lost state at egress SVR
    routers. See <xref target="session_state_reqs" format="default"/>. The signature must
    include all of the packet after Layer 4, and include a current time of
    day to prevent replay attacks. The signature is placed at the end of
    the existing packet.</t>
        <t>Both the sending and receiving routers must agree on these optional
    HMAC signatures, details of which are outside the scope of this
    document.</t>
      </section>
      <!-- replay_prevent -->

  <section anchor="payload_encrypt" toc="include" numbered="true">
        <name>Payload Encryption</name>
        <t>Payload encryption can use AES-CBC-128 or AES-CBC-256 ciphers which can
    be configured. Since these are block-ciphers, the payload should be
    divisible by 16. If the actual payload length is divisible by 16, then the
    last 16 bytes will be all 0s. If the actual payload is not divisible by
    16, then the remaining data will be padded and the last byte will
    indicate the length.</t>
      </section>
      <!-- payload_encrypt -->

  <section anchor="ddos_attack" toc="include" numbered="true">
        <name>DDoS and Unexpected Traffic on Waypoint Addresses</name>
        <t>Waypoint addresses could be addressed by any client at any time. IP
    packets that arrive on the router's interface will be processed with the
    assumption that they MUST contain metadata OR be part of an existing
    established routing protocol.</t>
        <t>Routers will only accept metadata from routers that they are
    provisioned to speak with. As such an ACL on incoming source addresses is
    limited to routers provisioned to communicate. All other packets are
    dropped.</t>
        <t>When a packet is received the "cookie" in the metadata header is
    reviewed first. If the cookie isn't correct, the packet is dropped.</t>
        <t>The HMAC signature is checked. If the signature validates, the packet
    is assumed to be good, and processing continues. If the HMAC fails, the
    packet is dropped.</t>
        <t>These methods prevent distributed denial of service attacks on the
    Waypoint Addresses of routers.</t>
      </section>
      <!-- ddos_attack -->

</section>
    <!-- sec_consider -->


<section anchor="iana_considerations" toc="include" numbered="true">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA involvement.</t>
    </section>
    <!-- iana_considerations -->

<section anchor="acknowledgements" toc="include" numbered="true">
      <name>Acknowledgements</name>
      <t>The authors would like to thank Anya Yungelson, Scott McCulley, and
Chao Zhao for their input into this document.</t>
      <t>The authors would like to thank Tony Li for his extensive support and help
with all aspects of this document.</t>
      <t>The authors want to thank  Ron Bonica, Kireeti Kompella, and other IETFers
at Juniper Networks for their support and guidance.</t>
    </section>
    <!-- acknowledgements -->

</middle>
  <back>
    <references>
      <name>Normative References</name>
      <reference anchor="ECDH_Key_Exchange" target="https://cryptobook.nakov.com/asymmetric-key-ciphers/ecdh-key-exchange">
        <front>
          <title>Practical Cryptography for Developers</title>
          <author initials="S." surname="Nakov" fullname="Svetlin Nakov, PhD">
            <organization/>
          </author>
          <date year="2018" month="November"/>
        </front>
        <seriesInfo name="ISBN" value="978-619-00-0870-5"/>
        <seriesInfo name="Publisher" value="Sofia"/>
      </reference>
      <reference anchor="RFC0791" target="https://www.rfc-editor.org/info/rfc791">
        <front>
          <title>Internet Protocol</title>
          <author initials="J." surname="Postel" fullname="J. Postel">
            <organization/>
          </author>
          <date year="1981" month="September"/>
        </front>
        <seriesInfo name="STD" value="5"/>
        <seriesInfo name="RFC" value="791"/>
        <seriesInfo name="DOI" value="10.17487/RFC0791"/>
      </reference>
      <reference anchor="RFC0792" target="https://www.rfc-editor.org/info/rfc792">
        <front>
          <title>Internet Protocol</title>
          <author initials="J." surname="Postel" fullname="J. Postel">
            <organization/>
          </author>
          <date year="1981" month="September"/>
        </front>
        <seriesInfo name="STD" value="5"/>
        <seriesInfo name="RFC" value="792"/>
        <seriesInfo name="DOI" value="10.17487/RFC0792"/>
      </reference>
      <reference anchor="RFC2104" target="https://www.rfc-editor.org/info/rfc2104" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2104.xml">
        <front>
          <title>HMAC: Keyed-Hashing for Message Authentication</title>
          <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
          <author fullname="M. Bellare" initials="M." surname="Bellare"/>
          <author fullname="R. Canetti" initials="R." surname="Canetti"/>
          <date month="February" year="1997"/>
          <abstract>
            <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions.  HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key.  The cryptographic strength of HMAC depends on the properties of the underlying hash function.  This memo provides information for the Internet community.  This memo does not specify an Internet standard of any kind</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="2104"/>
        <seriesInfo name="DOI" value="10.17487/RFC2104"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <front>
          <title>Key words for use in RFCs to Indicate Requirement Levels</title>
          <author fullname="S. Bradner" initials="S." surname="Bradner"/>
          <date month="March" year="1997"/>
          <abstract>
            <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized.  This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="2119"/>
        <seriesInfo name="DOI" value="10.17487/RFC2119"/>
      </reference>
      <reference anchor="RFC4122" target="https://www.rfc-editor.org/info/rfc4122" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4122.xml">
        <front>
          <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
          <author fullname="P. Leach" initials="P." surname="Leach"/>
          <author fullname="M. Mealling" initials="M." surname="Mealling"/>
          <author fullname="R. Salz" initials="R." surname="Salz"/>
          <date month="July" year="2005"/>
          <abstract>
            <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier). A UUID is 128 bits long, and can guarantee uniqueness across space and time. UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
            <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group). Information from earlier versions of the DCE specification have been incorporated into this document. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4122"/>
        <seriesInfo name="DOI" value="10.17487/RFC4122"/>
      </reference>
      <reference anchor="RFC4210" target="https://www.rfc-editor.org/info/rfc4210" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4210.xml">
        <front>
          <title>Internet X.509 Public Key Infrastructure Certificate Management Protocol (CMP)</title>
          <author fullname="C. Adams" initials="C." surname="Adams"/>
          <author fullname="S. Farrell" initials="S." surname="Farrell"/>
          <author fullname="T. Kause" initials="T." surname="Kause"/>
          <author fullname="T. Mononen" initials="T." surname="Mononen"/>
          <date month="September" year="2005"/>
          <abstract>
            <t>This document describes the Internet X.509 Public Key Infrastructure (PKI) Certificate Management Protocol (CMP).  Protocol messages are defined for X.509v3 certificate creation and management.  CMP provides on-line interactions between PKI components, including an exchange between a Certification Authority (CA) and a client system. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4210"/>
        <seriesInfo name="DOI" value="10.17487/RFC4210"/>
      </reference>
      <reference anchor="RFC5880" target="https://www.rfc-editor.org/info/rfc5880" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5880.xml">
        <front>
          <title>Bidirectional Forwarding Detection (BFD)</title>
          <author fullname="D. Katz" initials="D." surname="Katz"/>
          <author fullname="D. Ward" initials="D." surname="Ward"/>
          <date month="June" year="2010"/>
          <abstract>
            <t>This document describes a protocol intended to detect faults in the bidirectional path between two forwarding engines, including interfaces, data link(s), and to the extent possible the forwarding engines themselves, with potentially very low latency.  It operates independently of media, data protocols, and routing protocols. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5880"/>
        <seriesInfo name="DOI" value="10.17487/RFC5880"/>
      </reference>
      <reference anchor="RFC5758" target="https://www.rfc-editor.org/info/rfc5758" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5758.xml">
        <front>
          <title>Internet X.509 Public Key Infrastructure: Additional Algorithms and Identifiers for DSA and ECDSA</title>
          <author fullname="Q. Dang" initials="Q." surname="Dang"/>
          <author fullname="S. Santesson" initials="S." surname="Santesson"/>
          <author fullname="K. Moriarty" initials="K." surname="Moriarty"/>
          <author fullname="D. Brown" initials="D." surname="Brown"/>
          <author fullname="T. Polk" initials="T." surname="Polk"/>
          <date month="January" year="2010"/>
          <abstract>
            <t>This document updates RFC 3279 to specify algorithm identifiers and ASN.1 encoding rules for the Digital Signature Algorithm (DSA) and Elliptic Curve Digital Signature Algorithm (ECDSA) digital signatures when using SHA-224, SHA-256, SHA-384, or SHA-512 as the hashing algorithm.  This specification applies to the Internet X.509 Public Key infrastructure (PKI) when digital signatures are used to sign certificates and certificate revocation lists (CRLs).  This document also identifies all four SHA2 hash algorithms for use in the Internet X.509 PKI. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5758"/>
        <seriesInfo name="DOI" value="10.17487/RFC5758"/>
      </reference>
      <reference anchor="RFC5905" target="https://www.rfc-editor.org/info/rfc5905" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5905.xml">
        <front>
          <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</title>
          <author fullname="D. Mills" initials="D." surname="Mills"/>
          <author fullname="J. Martin" initials="J." role="editor" surname="Martin"/>
          <author fullname="J. Burbank" initials="J." surname="Burbank"/>
          <author fullname="W. Kasch" initials="W." surname="Kasch"/>
          <date month="June" year="2010"/>
          <abstract>
            <t>The Network Time Protocol (NTP) is widely used to synchronize computer clocks in the Internet.  This document describes NTP version 4 (NTPv4), which is backwards compatible with NTP version 3 (NTPv3), described in RFC 1305, as well as previous versions of the protocol.  NTPv4 includes a modified protocol header to accommodate the Internet Protocol version 6 address family.  NTPv4 includes fundamental improvements in the mitigation and discipline algorithms that extend the potential accuracy to the tens of microseconds with modern workstations and fast LANs.  It includes a dynamic server discovery scheme, so that in many cases, specific server configuration is not required.  It corrects certain errors in the NTPv3 design and implementation and includes an optional extension mechanism. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5905"/>
        <seriesInfo name="DOI" value="10.17487/RFC5905"/>
      </reference>
      <reference anchor="RFC6062" target="https://www.rfc-editor.org/info/rfc6062" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6062.xml">
        <front>
          <title>Traversal Using Relays around NAT (TURN) Extensions for TCP Allocations</title>
          <author fullname="S. Perreault" initials="S." role="editor" surname="Perreault"/>
          <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
          <date month="November" year="2010"/>
          <abstract>
            <t>This specification defines an extension of Traversal Using Relays around NAT (TURN), a relay protocol for Network Address Translator (NAT) traversal.  This extension allows a TURN client to request TCP allocations, and defines new requests and indications for the TURN server to open and accept TCP connections with the client\'s peers.  TURN and this extension both purposefully restrict the ways in which the relayed address can be used.  In particular, it prevents users from running general-purpose servers from ports obtained from the TURN server. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="6062"/>
        <seriesInfo name="DOI" value="10.17487/RFC6062"/>
      </reference>
      <reference anchor="RFC9300" target="https://www.rfc-editor.org/info/rfc9300" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9300.xml">
        <front>
          <title>The Locator/ID Separation Protocol (LISP)</title>
          <author fullname="D. Farinacci" initials="D." surname="Farinacci"/>
          <author fullname="V. Fuller" initials="V." surname="Fuller"/>
          <author fullname="D. Meyer" initials="D." surname="Meyer"/>
          <author fullname="D. Lewis" initials="D." surname="Lewis"/>
          <date month="January" year="2013"/>
          <abstract>
            <t>This document describes a network-layer-based protocol that enables separation of IP addresses into two new numbering spaces: Endpoint Identifiers (EIDs) and Routing Locators (RLOCs). No changes are required to either host protocol stacks or to the "core" of the Internet infrastructure. The Locator/ID Separation Protocol (LISP) can be incrementally deployed, without a "flag day", and offers Traffic Engineering, multihoming, and mobility benefits to early adopters, even when there are relatively few LISP-capable sites.</t>
            <t>Design and development of LISP was largely motivated by the problem statement produced by the October 2006 IAB Routing and Addressing Workshop. This document defines an Experimental Protocol for the Internet community.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9300"/>
        <seriesInfo name="DOI" value="10.17487/RFC9300"/>
      </reference>
      <reference anchor="RFC7468" target="https://www.rfc-editor.org/info/rfc7468" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7468.xml">
        <front>
          <title>Textual Encodings of PKIX, PKCS, and CMS Structures</title>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <author fullname="S. Leonard" initials="S." surname="Leonard"/>
          <date month="April" year="2015"/>
          <abstract>
            <t>This document describes and discusses the textual encodings of the Public-Key Infrastructure X.509 (PKIX), Public-Key Cryptography Standards (PKCS), and Cryptographic Message Syntax (CMS).  The textual encodings are well-known, are implemented by several applications and libraries, and are widely deployed.  This document articulates the de facto rules by which existing implementations operate and defines them so that future implementations can interoperate.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7468"/>
        <seriesInfo name="DOI" value="10.17487/RFC7468"/>
      </reference>
      <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <front>
          <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
          <author fullname="B. Leiba" initials="B." surname="Leiba"/>
          <date month="May" year="2017"/>
          <abstract>
            <t>RFC 2119 specifies common key words that may be used in protocol specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
          </abstract>
        </front>
        <seriesInfo name="BCP" value="14"/>
        <seriesInfo name="RFC" value="8174"/>
        <seriesInfo name="DOI" value="10.17487/RFC8174"/>
      </reference>
      <reference anchor="RFC9341" target="https://www.rfc-editor.org/info/rfc9341" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9341.xml">
        <front>
          <title>Alternate-Marking Method for Passive and Hybrid Performance Monitoring</title>
          <author fullname="G. Fioccola" initials="G." role="editor" surname="Fioccola"/>
          <author fullname="A. Capello" initials="A." surname="Capello"/>
          <author fullname="M. Cociglio" initials="M." surname="Cociglio"/>
          <author fullname="L. Castaldelli" initials="L." surname="Castaldelli"/>
          <author fullname="M. Chen" initials="M." surname="Chen"/>
          <author fullname="L. Zheng" initials="L." surname="Zheng"/>
          <author fullname="G. Mirsky" initials="G." surname="Mirsky"/>
          <author fullname="T. Mizrahi" initials="T." surname="Mizrahi"/>
          <date month="January" year="2018"/>
          <abstract>
            <t>This document describes a method to perform packet loss, delay, and jitter measurements on live traffic.  This method is based on an Alternate-Marking (coloring) technique.  A report is provided in order to explain an example and show the method applicability.  This technology can be applied in various situations, as detailed in this document, and could be considered Passive or Hybrid depending on the application.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9341"/>
        <seriesInfo name="DOI" value="10.17487/RFC9341"/>
      </reference>
      <reference anchor="RFC8422" target="https://www.rfc-editor.org/info/rfc8422" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8422.xml">
        <front>
          <title>Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS) Versions 1.2 and Earlier</title>
          <author fullname="Y. Nir" initials="Y." surname="Nir"/>
          <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
          <author fullname="M. Pegourie-Gonnard" initials="M." surname="Pegourie-Gonnard"/>
          <date month="August" year="2018"/>
          <abstract>
            <t>This document describes key exchange algorithms based on Elliptic Curve Cryptography (ECC) for the Transport Layer Security (TLS) protocol. In particular, it specifies the use of Ephemeral Elliptic Curve Diffie-Hellman (ECDHE) key agreement in a TLS handshake and the use of the Elliptic Curve Digital Signature Algorithm (ECDSA) and Edwards-curve Digital Signature Algorithm (EdDSA) as authentication mechanisms.</t>
            <t>This document obsoletes RFC 4492.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8422"/>
        <seriesInfo name="DOI" value="10.17487/RFC8422"/>
      </reference>
      <reference anchor="RFC8445" target="https://www.rfc-editor.org/info/rfc8445" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8445.xml">
        <front>
          <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
          <author fullname="A. Keranen" initials="A." surname="Keranen"/>
          <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
          <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
          <date month="July" year="2018"/>
          <abstract>
            <t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based communication. This protocol is called Interactive Connectivity Establishment (ICE). ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).</t>
            <t>This document obsoletes RFC 5245.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8445"/>
        <seriesInfo name="DOI" value="10.17487/RFC8445"/>
      </reference>
      <reference anchor="RFC8489" target="https://www.rfc-editor.org/info/rfc8489" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8489.xml">
        <front>
          <title>Session Traversal Utilities for NAT (STUN)</title>
          <author fullname="M. Petit-Huguenin" initials="M." surname="Petit-Huguenin"/>
          <author fullname="G. Salgueiro" initials="G." surname="Salgueiro"/>
          <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
          <author fullname="D. Wing" initials="D." surname="Wing"/>
          <author fullname="R. Mahy" initials="R." surname="Mahy"/>
          <author fullname="P. Matthews" initials="P." surname="Matthews"/>
          <date month="February" year="2020"/>
          <abstract>
            <t>Session Traversal Utilities for NAT (STUN) is a protocol that serves as a tool for other protocols in dealing with NAT traversal. It can be used by an endpoint to determine the IP address and port allocated to it by a NAT. It can also be used to check connectivity between two endpoints and as a keep-alive protocol to maintain NAT bindings. STUN works with many existing NATs and does not require any special behavior from them.</t>
            <t>STUN is not a NAT traversal solution by itself. Rather, it is a tool to be used in the context of a NAT traversal solution.</t>
            <t>This document obsoletes RFC 5389.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8489"/>
        <seriesInfo name="DOI" value="10.17487/RFC8489"/>
      </reference>
      <reference anchor="RFC8986" target="https://www.rfc-editor.org/info/rfc8986" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8986.xml">
        <front>
          <title>Segment Routing over IPv6 (SRv6) Network Programming</title>
          <author fullname="C. Filsfils" initials="C." role="editor" surname="Filsfils"/>
          <author fullname="P. Camarillo" initials="P." role="editor" surname="Camarillo"/>
          <author fullname="J. Leddy" initials="J." surname="Leddy"/>
          <author fullname="D. Voyer" initials="D." surname="Voyer"/>
          <author fullname="S. Matsushima" initials="S." surname="Matsushima"/>
          <author fullname="Z. Li" initials="Z." surname="Li"/>
          <date month="February" year="2021"/>
          <abstract>
            <t>The Segment Routing over IPv6 (SRv6) Network Programming framework enables a network operator or an application to specify a packet processing program by encoding a sequence of instructions in the IPv6 packet header.</t>
            <t>Each instruction is implemented on one or several nodes in the network and identified by an SRv6 Segment Identifier in the packet.</t>
            <t>This document defines the SRv6 Network Programming concept and specifies the base set of SRv6 behaviors that enables the creation of interoperable overlays with underlay optimization.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8986"/>
        <seriesInfo name="DOI" value="10.17487/RFC8986"/>
      </reference>
    </references>
  </back>
</rfc>
