Provided by: openvswitch-common_3.0.0-0ubuntu1_amd64 bug

NAME

       ovs-fields - protocol header fields in OpenFlow and Open vSwitch

INTRODUCTION

       This  document  aims to comprehensively document all of the fields, both standard and non-
       standard, supported by OpenFlow or Open vSwitch, regardless of origin.

   Fields
       A field is a property of a packet. Most familiarly, data fields are  fields  that  can  be
       extracted  from a packet. Most data fields are copied directly from protocol headers, e.g.
       at layer 2, the Ethernet source and destination addresses, or the VLAN ID; at layer 3, the
       IPv4  or  IPv6  source  and  destination; and at layer 4, the TCP or UDP ports. Other data
       fields are computed, e.g. ip_frag describes whether a packet is a fragment but it  is  not
       copied directly from the IP header.

       Data fields that are always present as a consequence of the basic networking technology in
       use are called called root fields. Open vSwitch 2.7 and earlier considered Ethernet fields
       to  be  root  fields,  and  this  remains  the  default mode of operation for Open vSwitch
       bridges. When a packet is received from a non-Ethernet interfaces, such as a layer-3  LISP
       tunnel,  Open  vSwitch 2.7 and earlier force-fit the packet to this Ethernet-centric point
       of view by pretending that  an  Ethernet  header  is  present  whose  Ethernet  type  that
       indicates  the  packet’s  actual type (and whose source and destination addresses are all-
       zero).

       Open vSwitch 2.8 and later implement the ``packet type-aware pipeline’’ concept introduced
       in  OpenFlow  1.5.  Such a pipeline does not have any root fields. Instead, a new metadata
       field, packet_type, indicates the basic type of the packet, which can be  Ethernet,  IPv4,
       IPv6,  or  another  type. For backward compatibility, by default Open vSwitch 2.8 imitates
       the behavior of Open vSwitch 2.7 and earlier. Later versions of Open  vSwitch  may  change
       the default, and in the meantime controllers can turn off this legacy behavior, on a port-
       by-port basis, by setting options:packet_type to ptap in  the  Interface  table.  This  is
       significant  only  for ports that can handle non-Ethernet packets, which is currently just
       LISP, VXLAN-GPE, and GRE tunnel ports. See ovs-vwitchd.conf.db(5) for more information.

       Non-root data fields are not always present. A packet contains ARP  fields,  for  example,
       only  when  its  packet type is ARP or when it is an Ethernet packet whose Ethernet header
       indicates the Ethertype for ARP, 0x0806. In this documentation, we say  that  a  field  is
       applicable when it is present in a packet, and inapplicable when it is not. (These are not
       standard terms.) We refer to the conditions that determine whether a field  is  applicable
       as  prerequisites.  Some  VLAN-related  fields are a special case: these fields are always
       applicable for Ethernet packets, but have a designated value or bit that indicates whether
       a  VLAN  header is present, with the remaining values or bits indicating the VLAN header’s
       content (if it is present).

       An inapplicable field does not have a value, not even a nominal  ``value’’  such  as  all-
       zero-bits.  In  many  circumstances,  OpenFlow  and  Open vSwitch allow references only to
       applicable fields. For example, one may match (see Matching, below) a given field only  if
       the match includes the field’s prerequisite, e.g. matching an ARP field is only allowed if
       one also matches on Ethertype 0x0806 or the packet_type for ARP  in  a  packet  type-aware
       bridge.

       Sometimes  a  packet may contain multiple instances of a header. For example, a packet may
       contain multiple VLAN or MPLS headers, and tunnels can cause  any  data  field  to  recur.
       OpenFlow and Open vSwitch do not address these cases uniformly. For VLAN and MPLS headers,
       only the outermost header is accessible, so that inner headers may  be  accessed  only  by
       ``popping’’  (removing) the outer header. (Open vSwitch supports only a single VLAN header
       in any case.) For tunnels, e.g. GRE or VXLAN, the  outer  header  and  inner  headers  are
       treated as different data fields.

       Many network protocols are built in layers as a stack of concatenated headers. Each header
       typically contains a ``next type’’ field that indicates the type of  the  protocol  header
       that  follows,  e.g.  Ethernet contains an Ethertype and IPv4 contains a IP protocol type.
       The exceptional cases, where protocols are layered but an outer layer  does  not  indicate
       the  protocol  type  for  the  inner  layer,  or  gives  only an ambiguous indication, are
       troublesome. An MPLS header, for example, only indicates whether another  MPLS  header  or
       some  other protocol follows, and in the latter case the inner protocol must be known from
       the context. In these exceptional cases, OpenFlow and Open vSwitch cannot provide  insight
       into  the  inner  protocol data fields without additional context, and thus they treat all
       later data fields as inapplicable until  an  OpenFlow  action  explicitly  specifies  what
       protocol  follows.  In the case of MPLS, the OpenFlow ``pop MPLS’’ action that removes the
       last MPLS header from a packet provides this context, as the Ethertype of the payload. See
       Layer 2.5: MPLS for more information.

       OpenFlow  and  Open  vSwitch  support  some fields other than data fields. Metadata fields
       relate to the origin or treatment of a packet, but they are not extracted from the  packet
       data  itself.  One  example  is the physical port on which a packet arrived at the switch.
       Register fields act like variables: they give  an  OpenFlow  switch  space  for  temporary
       storage  while  processing  a  packet.  Existing  metadata  and  register  fields  have no
       prerequisites.

       A field’s value consists of an integral number of bytes. For data fields, sometimes  those
       bytes  are taken directly from the packet. Other data fields are copied from a packet with
       padding (usually with zeros and in the most significant  positions).  The  remaining  data
       fields  are  transformed  in  other ways as they are copied from the packets, to make them
       more useful for matching.

   Matching
       The most important use of fields in OpenFlow is matching, to determine whether  particular
       field  values  agree with a set of constraints called a match. A match consists of zero or
       more constraints on individual fields, all of which must be met to satisfy the  match.  (A
       match that contains no constraints is always satisfied.) OpenFlow and Open vSwitch support
       a number of forms of matching on individual fields:

              Exact match, e.g. nw_src=10.1.2.3
                     Only a particular value of the field  is  matched;  for  example,  only  one
                     particular  source IP address. Exact matches are written as field=value. The
                     forms accepted for value depend on the field.

                     All fields support exact matches.

              Bitwise match, e.g. nw_src=10.1.0.0/255.255.0.0
                     Specific bits in the field must have specified  values;  for  example,  only
                     source  IP  addresses in a particular subnet. Bitwise matches are written as
                     field=value/mask, where value and mask take one of the forms accepted for an
                     exact  match  on  field. Some fields accept other forms for bitwise matches;
                     for   example,   nw_src=10.1.0.0/255.255.0.0    may    also    be    written
                     nw_src=10.1.0.0/16.

                     Most  OpenFlow  switches  do not allow every bitwise matching on every field
                     (and before OpenFlow  1.2,  the  protocol  did  not  even  provide  for  the
                     possibility  for  most fields). Even switches that do allow bitwise matching
                     on a given field may restrict the masks that are allowed, e.g.  by  allowing
                     matches  only  on contiguous sets of bits starting from the most significant
                     bit, that is, ``CIDR’’ masks  [RFC  4632].  Open  vSwitch  does  not  allows
                     bitwise  matching  on  every field, but it allows arbitrary bitwise masks on
                     any field that does support  bitwise  matching.  (Older  versions  had  some
                     restrictions, as documented in the descriptions of individual fields.)

              Wildcard, e.g. ``any nw_src’’
                     The  value of the field is not constrained. Wildcarded fields may be written
                     as field=*, although it is unusual to mention them at all. (When  specifying
                     a  wildcard  explicitly in a command invocation, be sure to using quoting to
                     protect against shell expansion.)

                     There is a tiny difference between wildcarding a field  and  not  specifying
                     any  match  on  a field: wildcarding a field requires satisfying the field’s
                     prerequisites.

       Some types of matches on individual fields cannot be expressed directly with OpenFlow  and
       Open vSwitch. These can be expressed indirectly:

              Set match, e.g. ``tcp_dst ∈ {80, 443, 8080}’’
                     The  value  of a field is one of a specified set of values; for example, the
                     TCP destination port is 80, 443, or 8080.

                     For matches used in flows (see Flows, below), multiple  flows  can  simulate
                     set matches.

              Range match, e.g. ``1000 ≤ tcp_dst ≤ 1999’’
                     The  value  of the field must lie within a numerical range, for example, TCP
                     destination ports between 1000 and 1999.

                     Range matches can be expressed as  a  collection  of  bitwise  matches.  For
                     example,  suppose  that  the goal is to match TCP source ports 1000 to 1999,
                     inclusive. The binary representations of 1000 and 1999 are:

                     01111101000
                     11111001111

                     The following series of bitwise matches will match 1000 and 1999 and all the
                     values in between:

                     01111101xxx
                     0111111xxxx
                     10xxxxxxxxx
                     110xxxxxxxx
                     1110xxxxxxx
                     11110xxxxxx
                     1111100xxxx

                     which can be written as the following matches:

                     tcp,tp_src=0x03e8/0xfff8
                     tcp,tp_src=0x03f0/0xfff0
                     tcp,tp_src=0x0400/0xfe00
                     tcp,tp_src=0x0600/0xff00
                     tcp,tp_src=0x0700/0xff80
                     tcp,tp_src=0x0780/0xffc0
                     tcp,tp_src=0x07c0/0xfff0

              Inequality match, e.g. ``tcp_dst ≠ 80’’
                     The  value of the field differs from a specified value, for example, all TCP
                     destination ports except 80.

                     An inequality match on an n-bit field can be expressed as a disjunction of n
                     1-bit  matches.  For  example,  the inequality match ``vlan_pcp ≠ 5’’ can be
                     expressed as ``vlan_pcp = 0/4 or vlan_pcp = 2/2 or  vlan_pcp  =  0/1.’’  For
                     matches  used  in flows (see Flows, below), sometimes one can more compactly
                     express inequality as a higher-priority flow that  matches  the  exceptional
                     case paired with a lower-priority flow that matches the general case.

                     Alternatively,  an  inequality  match  may  be  converted to a pair of range
                     matches, e.g. tcp_src  80 may be expressed as ``0 ≤ tcp_src < 80  or  80  <
                     tcp_src  ≤  65535’’, and then each range match may in turn be converted to a
                     bitwise match.

              Conjunctive match, e.g. ``tcp_src ∈ {80, 443, 8080} and tcp_dst ∈ {80, 443, 8080}’’
                     As an OpenFlow extension, Open vSwitch supports matching  on  conditions  on
                     conjunctions  of  the  previously  mentioned  forms  of  matching.  See  the
                     documentation for conj_id for more information.

       All of these supported forms of matching are special cases of bitwise  matching.  In  some
       cases  this  influences the design of field values. ip_frag is the most prominent example:
       it is designed to make all of the practically useful checks for IP fragmentation  possible
       as a single bitwise match.

     Shorthands

       Some  matches are very commonly used, so Open vSwitch accepts shorthand notations. In some
       cases, Open vSwitch also uses shorthand notations when it displays matches. The  following
       shorthands are defined, with their long forms shown on the right side:

              eth    packet_type=(0,0) (Open vSwitch 2.8 and later)

              ip     eth_type=0x0800

              ipv6   eth_type=0x86dd

              icmp   eth_type=0x0800,ip_proto=1

              icmp6  eth_type=0x86dd,ip_proto=58

              tcp    eth_type=0x0800,ip_proto=6

              tcp6   eth_type=0x86dd,ip_proto=6

              udp    eth_type=0x0800,ip_proto=17

              udp6   eth_type=0x86dd,ip_proto=17

              sctp   eth_type=0x0800,ip_proto=132

              sctp6  eth_type=0x86dd,ip_proto=132

              arp    eth_type=0x0806

              rarp   eth_type=0x8035

              mpls   eth_type=0x8847

              mplsm  eth_type=0x8848

   Evolution of OpenFlow Fields
       The  discussion  so  far  applies  to all OpenFlow and Open vSwitch versions. This section
       starts to draw in specific information by explaining, in broad  terms,  the  treatment  of
       fields and matches in each OpenFlow version.

     OpenFlow 1.0

       OpenFlow  1.0  defined  the  OpenFlow  protocol  format  of a match as a fixed-length data
       structure that could match on the following fields:

              •      Ingress port.

              •      Ethernet source and destination MAC.

              •      Ethertype (with a special value to match frames that lack an Ethertype).

              •      VLAN ID and priority.

              •      IPv4 source, destination, protocol, and DSCP.

              •      TCP source and destination port.

              •      UDP source and destination port.

              •      ICMPv4 type and code.

              •      ARP IPv4 addresses (SPA and TPA) and opcode.

       Each supported field corresponded to some member  of  the  data  structure.  Some  members
       represented  multiple  fields,  in  the case of the TCP, UDP, ICMPv4, and ARP fields whose
       presence is mutually exclusive. This also meant that some members were poor fits for their
       fields:  only the low 8 bits of the 16-bit ARP opcode could be represented, and the ICMPv4
       type and code were padded with 8 bits of zeros to fit  in  the  16-bit  members  primarily
       meant  for  TCP  and  UDP  ports.  An additional bitmap member indicated, for each member,
       whether its field should be an ``exact’’ or  ``wildcarded’’  match  (see  Matching),  with
       additional support for CIDR prefix matching on the IPv4 source and destination fields.

       Simplicity  was  recognized  early  on as the main virtue of this approach. Obviously, any
       fixed-length data structure cannot support matching new protocols that do not  fit.  There
       was  no room, for example, for matching IPv6 fields, which was not a priority at the time.
       Lack of room to support matching the Ethernet addresses inside ARP packets actually caused
       more  of  a  design problem later, leading to an Open vSwitch extension action specialized
       for dropping ``spoofed’’ ARP packets in which the frame and ARP Ethernet source  addressed
       differed.  (This  extension  was never standardized. Open vSwitch dropped support for it a
       few releases after it added support for full ARP matching.)

       The design of the OpenFlow fixed-length matches  also  illustrates  compromises,  in  both
       directions, between the strengths and weaknesses of software and hardware that have always
       influenced the design of OpenFlow. Support for matching ARP fields that do fit in the data
       structure  was  only  added  late in the design process (and remained optional in OpenFlow
       1.0), for example, because common switch ASICs did not support matching these fields.

       The compromises in favor of software occurred for more complicated reasons.  The  OpenFlow
       designers  did  not know how to implement matching in software that was fast, dynamic, and
       general. (A way was later found [Srinivasan].)  Thus,  the  designers  sought  to  support
       dynamic,  general  matching  that  would be fast in realistic special cases, in particular
       when all of the matches were microflows, that is, matches that specify every field present
       in  a  packet,  because  such  matches  can  be implemented as a single hash table lookup.
       Contemporary research supported the feasibility of this approach: the number of microflows
       in  a  campus  network  had  been  measured to peak at about 10,000 [Casado, section 3.2].
       (Calculations show that this can only be true in a lightly loaded network [Pepelnjak].)

       As a result, OpenFlow 1.0 required switches to treat  microflow  matches  as  the  highest
       possible  priority.  This  let  software  switches perform the microflow hash table lookup
       first. Only on failure to match a microflow did the switch need to fall back  to  checking
       the  more  general  and  presumed  slower  matches.  Also, the OpenFlow 1.0 flow match was
       minimally flexible, with no support for general bitwise matching, partly on the basis that
       this  seemed  more  likely amenable to relatively efficient software implementation. (CIDR
       masking for IPv4 addresses was added relatively late in the OpenFlow 1.0 design process.)

       Microflow matching was later discovered to aid some  hardware  implementations.  The  TCAM
       chips  used  for  matching in hardware do not support priority in the same way as OpenFlow
       but instead tie priority to ordering  [Pagiamtzis].  Thus,  adding  a  new  match  with  a
       priority  between  the  priorities of existing matches can require reordering an arbitrary
       number of TCAM entries. On the other hand, when microflows are highest priority, they  can
       be managed as a set-aside portion of the TCAM entries.

       The emphasis on matching microflows also led designers to carefully consider the bandwidth
       requirements between switch and controller: to maximize the number of microflow setups per
       second,  one  must  minimize  the size of each flow’s description. This favored the fixed-
       length format in use, because it expressed common TCP and UDP microflows  in  fewer  bytes
       than  more  flexible ``type-length-value’’ (TLV) formats. (Early versions of OpenFlow also
       avoided TLVs in general to head off protocol fragmentation.)

       Inapplicable Fields

       OpenFlow 1.0 does not clearly specify how to treat inapplicable fields.  The  members  for
       inapplicable  fields  are always present in the match data structure, as are the bits that
       indicate whether the fields are matched, and the ``correct’’ member  and  bit  values  for
       inapplicable  fields  is unclear. OpenFlow 1.0 implementations changed their behavior over
       time as priorities shifted. The early OpenFlow reference implementation, motivated to make
       every  flow a microflow to enable hashing, treated inapplicable fields as exact matches on
       a value of 0. Initially, this behavior was implemented in the reference controller only.

       Later, the reference switch was also changed to actually force any wildcarded inapplicable
       fields into exact matches on 0. The latter behavior sometimes caused problems, because the
       modified flow was the one reported back to the controller later when it queried  the  flow
       table,  and  the  modifications  sometimes  meant  that  the controller could not properly
       recognize the flow that it had added. In retrospect,  perhaps  this  problem  should  have
       alerted  the  designers  to a design error, but the ability to use a single hash table was
       held to be more important than almost every other consideration at the time.

       When more flexible match formats were introduced much later, they disallowed  any  mention
       of  inapplicable  fields  as part of a match. This raised the question of how to translate
       between this new format and the OpenFlow 1.0 fixed format. It seemed somewhat inconsistent
       and  backward to treat fields as exact-match in one format and forbid matching them in the
       other, so instead the treatment of inapplicable fields  in  the  fixed-length  format  was
       changed  from  exact match on 0 to wildcarding. (A better classifier had by now eliminated
       software performance problems with wildcards.)

       The OpenFlow 1.0.1 errata (released  only  in  2012)  added  some  additional  explanation
       [OpenFlow  1.0.1,  section  3.4],  but  it  did  not  mandate specific behavior because of
       variation among implementations.

     OpenFlow 1.1

       The OpenFlow 1.1 protocol match format was designed as a type/length/value (TLV) format to
       allow   for  future  flexibility.  The  specification  standardized  only  a  single  type
       OFPMT_STANDARD (0) with a fixed-size payload, described here. The  additional  fields  and
       bitwise  masks  in OpenFlow 1.1 cause this match structure to be over twice as large as in
       OpenFlow 1.0, 88 bytes versus 40.

       OpenFlow 1.1 added support for the following fields:

              •      SCTP source and destination port.

              •      MPLS label and traffic control (TC) fields.

              •      One 64-bit register (named ``metadata’’).

       OpenFlow 1.1 increased the width of the ingress port number  field  (and  all  other  port
       numbers in the protocol) from 16 bits to 32 bits.

       OpenFlow  1.1  increased matching flexibility by introducing arbitrary bitwise matching on
       Ethernet and IPv4 address fields and on the new ``metadata’’ register field. Switches were
       not required to support all possible masks [OpenFlow 1.1, section 4.3].

       By a strict reading of the specification, OpenFlow 1.1 removed support for matching ICMPv4
       type and code [OpenFlow 1.1, section A.2.3], but this is likely an editing  error  because
       ICMP  matching  is  described  elsewhere  [OpenFlow 1.1, Table 3, Table 4, Figure 4]. Open
       vSwitch does support ICMPv4 type and code matching with OpenFlow 1.1.

       OpenFlow 1.1 avoided the pitfalls of inapplicable fields that OpenFlow 1.0 encountered, by
       requiring  the  switch to ignore the specified field values [OpenFlow 1.1, section A.2.3].
       It also implied that the switch should ignore the bits  that  indicate  whether  to  match
       inapplicable fields.

       Physical Ingress Port

       OpenFlow  1.1  introduced  a  new  pseudo-field,  the  physical ingress port. The physical
       ingress port is only a pseudo-field because it cannot be used  for  matching.  It  appears
       only one place in the protocol, in the ``packet-in’’ message that passes a packet received
       at the switch to an OpenFlow controller.

       A packet’s ingress port and  physical  ingress  port  are  identical  except  for  packets
       processed  by  a switch feature such as bonding or tunneling that makes a packet appear to
       arrive on a ``virtual’’ port associated with the bond or the tunnel. For such packets, the
       ingress port is the virtual port and the physical ingress port is, naturally, the physical
       port. Open vSwitch implements both bonding and tunneling, but its  bonding  implementation
       does  not  use virtual ports and its tunnels are typically not on the same OpenFlow switch
       as their physical ingress ports (which need not be part of any  switch),  so  the  ingress
       port and physical ingress port are always the same in Open vSwitch.

     OpenFlow 1.2

       OpenFlow  1.2  abandoned the fixed-length approach to matching. One reason was size, since
       adding support for IPv6 address matching (now seen  as  important),  with  bitwise  masks,
       would have added 64 bytes to the match length, increasing it from 88 bytes in OpenFlow 1.1
       to over  150  bytes.  Extensibility  had  also  become  important  as  controller  writers
       increasingly  wanted  support  for new fields without having to change messages throughout
       the OpenFlow protocol. The challenges of carefully defining fixed-length matches to  avoid
       problems with inapplicable fields had also become clear over time.

       Therefore,  OpenFlow  1.2  adopted  a flow format using a flexible type-length-value (TLV)
       representation, in which each TLV expresses a match on one field. These TLVs were in  turn
       encapsulated  inside  the  outer  TLV  wrapper  introduced  in  OpenFlow  1.1 with the new
       identifier OFPMT_OXM (1). (This wrapper fulfilled its intended  purpose  of  reducing  the
       amount  of  churn in the protocol when changing match formats; some messages that included
       matches remained unchanged from OpenFlow 1.1 to 1.2 and later versions.)

       OpenFlow 1.2 added support for the following fields:

              •      ARP hardware addresses (SHA and THA).

              •      IPv4 ECN.

              •      IPv6 source and destination addresses, flow label, DSCP, ECN, and protocol.

              •      TCP, UDP, and SCTP port numbers when encapsulated inside IPv6.

              •      ICMPv6 type and code.

              •      ICMPv6 Neighbor Discovery target address  and  source  and  target  Ethernet
                     addresses.

       The OpenFlow 1.2 format, called OXM (OpenFlow Extensible Match), was modeled closely on an
       extension to OpenFlow 1.0 introduced in Open  vSwitch  1.1  called  NXM  (Nicira  Extended
       Match). Each OXM or NXM TLV has the following format:

               type
        <---------------->
             16        7   1    8      length bytes
       +------------+-----+--+------+ +------------+
       |vendor/class|field|HM|length| |    body    |
       +------------+-----+--+------+ +------------+

       The  most  significant 16 bits of the NXM or OXM header, called vendor by NXM and class by
       OXM, identify an organization permitted to allocate identifiers for fields. NXM  allocates
       only  two  vendors,  0x0000  for  fields  supported  by OpenFlow 1.0 and 0x0001 for fields
       implemented as an Open vSwitch extension. OXM assigns classes as follows:

              0x0000 (OFPXMC_NXM_0).
              0x0001 (OFPXMC_NXM_1).
                   Reserved for NXM compatibility.

              0x0002 to 0x7fff
                   Reserved for allocation to ONF members, but none yet assigned.

              0x8000 (OFPXMC_OPENFLOW_BASIC)
                   Used for most standard OpenFlow fields.

              0x8001 (OFPXMC_PACKET_REGS)
                   Used for packet register fields in OpenFlow 1.5 and later.

              0x8002 to 0xfffe
                   Reserved for the OpenFlow specification.

              0xffff (OFPXMC_EXPERIMENTER)
                   Experimental use.

       When class is 0xffff, the OXM header is extended to 64 bits by using the first 32 bits  of
       the  body as an experimenter field whose most significant byte is zero and whose remaining
       bytes are an Organizationally Unique Identifier (OUI) assigned by the IEEE [IEEE OUI],  as
       shown below.

            type                 experimenter
        <---------->             <---------->
          16     7   1    8        8     24     (length - 4) bytes
       +------+-----+--+------+ +------+-----+ +------------------+
       |class |field|HM|length| | zero | OUI | |       body       |
       +------+-----+--+------+ +------+-----+ +------------------+
        0xffff                    0x00

       OpenFlow says that support for experimenter fields is optional. Open vSwitch 2.4 and later
       does support them, so that it can support the following experimenter classes:

              0x4f4e4600 (ONFOXM_ET)
                     Used by official Open Networking Foundation extensions in OpenFlow  1.3  and
                     later. e.g. [TCP Flags Match Field Extension].

              0x005ad650 (NXOXM_NSH)
                     Used  by Open vSwitch for NSH extensions, in the absence of an official ONF-
                     assigned class. (This OUI is randomly generated.)

       Taken as a unit, class (or  vendor),  field,  and  experimenter  (when  present)  uniquely
       identify a particular field.

       When hasmask (abbreviated HM above) is 0, the OXM is an exact match on an entire field. In
       this case, the body (excluding the experimenter field, if present) is a single value to be
       matched.

       When hasmask is 1, the OXM is a bitwise match. The body (excluding the experimenter field)
       consists of a value to match, followed by the bitwise mask to apply. A 1-bit in  the  mask
       indicates  that  the  corresponding bit in the value should be matched and a 0-bit that it
       should be ignored. For example, for an IP address field, a value of  192.168.0.0  followed
       by a mask of 255.255.0.0 would match addresses in the 196.168.0.0/16 subnet.

              •      Some  fields  might  not  support  masking  at  all, and some fields that do
                     support masking might restrict it to certain patterns. For  example,  fields
                     that  have  IP  address  values  might  be  restricted  to  CIDR  masks. The
                     descriptions of individual fields note these restrictions.

              •      An OXM TLV with a mask that is all zeros is not useful (although it  is  not
                     forbidden), because it is has the same effect as omitting the TLV entirely.

              •      It  is  not  meaningful  to  pair a 0-bit in an OXM mask with a 1-bit in its
                     value,  and  Open   vSwitch   rejects   such   an   OXM   with   the   error
                     OFPBMC_BAD_WILDCARDS, as required by OpenFlow 1.3 and later.

       The  length  identifies the number of bytes in the body, including the 4-byte experimenter
       header, if it is present. Each OXM TLV has a fixed length; that is,  given  class,  field,
       experimenter  (if  present),  and  hasmask,  length  is a constant. The length is included
       explicitly to allow software to minimally parse OXM TLVs of unknown types.

       OXM TLVs must be ordered so that a  field’s  prerequisites  are  satisfied  before  it  is
       parsed.  For  example,  an  OXM  TLV that matches on the IPv4 source address field is only
       allowed following an OXM TLV that matches on the Ethertype for IPv4. Similarly, an OXM TLV
       that matches on the TCP source port must follow a TLV that matches an Ethertype of IPv4 or
       IPv6 and one that matches an IP protocol of TCP (in that order). The order of OXM TLVs  is
       not otherwise restricted; no canonical ordering is defined.

       A given field may be matched only once in a series of OXM TLVs.

     OpenFlow 1.3

       OpenFlow  1.3 showed OXM to be largely successful, by adding new fields without making any
       changes to how flow matches otherwise worked. It  added  OXMs  for  the  following  fields
       supported by Open vSwitch:

              •      Tunnel ID for ports associated with e.g. VXLAN or keyed GRE.

              •      MPLS ``bottom of stack’’ (BOS) bit.

       OpenFlow  1.3  also  added  OXMs  for the following fields not documented here and not yet
       implemented by Open vSwitch:

              •      IPv6 extension header handling.

              •      PBB I-SID.

     OpenFlow 1.4

       OpenFlow 1.4 added OXMs  for  the  following  fields  not  documented  here  and  not  yet
       implemented by Open vSwitch:

              •      PBB UCA.

     OpenFlow 1.5

       OpenFlow 1.5 added OXMs for the following fields supported by Open vSwitch:

              •      Packet type.

              •      TCP flags.

              •      Packet registers.

              •      The output port in the OpenFlow action set.

FIELDS REFERENCE

       The  following  sections  document  the  fields  that  Open vSwitch supports. Each section
       provides introductory material on a group of related fields, followed  by  information  on
       each individual field. In addition to field-specific information, each field begins with a
       table with entries for the following important properties:

              Name   The field’s name, used  for  parsing  and  formatting  the  field,  e.g.  in
                     ovs-ofctl  commands.  For historical reasons, some fields have an additional
                     name that is accepted as an alternative in parsing. This name, when there is
                     one, is listed as well, e.g. ``tun (aka tunnel_id).’’

              Width  The field’s width, always a multiple of 8 bits. Some fields don’t use all of
                     the bits, so this  may  be  accompanied  by  an  explanation.  For  example,
                     OpenFlow  embeds the 2-bit IP ECN field as as the low bits in an 8-bit byte,
                     and so its width is expressed as ``8 bits (only the least-significant 2 bits
                     may be nonzero).’’

              Format How  a  value for the field is formatted or parsed by, e.g., ovs-ofctl. Some
                     possibilities are generic:

                     decimal
                            Formats as a decimal number. On input,  accepts  decimal  numbers  or
                            hexadecimal numbers prefixed by 0x.

                     hexadecimal
                            Formats  as  a  hexadecimal  number prefixed by 0x. On input, accepts
                            decimal numbers or hexadecimal numbers prefixed by 0x.  (The  default
                            for  parsing  is not hexadecimal: only a 0x prefix causes input to be
                            treated as hexadecimal.)

                     Ethernet
                            Formats   and   accepts   the   common   Ethernet   address    format
                            xx:xx:xx:xx:xx:xx.

                     IPv4   Formats  and  accepts  the  dotted-quad  format  a.b.c.d. For bitwise
                            matches, formats and accepts address/length CIDR notation in addition
                            to address/mask.

                     IPv6   Formats  and  accepts  the  common  IPv6  address  formats, plus CIDR
                            notation for bitwise matches.

                     OpenFlow 1.0 port
                            Accepts 16-bit port numbers in decimal, plus OpenFlow well-known port
                            names (e.g. IN_PORT) in uppercase or lowercase.

                     OpenFlow 1.1+ port
                            Same  syntax  as OpenFlow 1.0 ports but for 32-bit OpenFlow 1.1+ port
                            number fields.

                     Other, field-specific formats are explained along with their fields.

              Masking
                     For most fields, this says ``arbitrary bitwise masks,’’ meaning that a  flow
                     may  match  any  combination  of  bits in the field. Some fields instead say
                     ``exact match only,’’ which means that a flow that  matches  on  this  field
                     must match on the whole field instead of just certain bits. Either way, this
                     reports masking support for the latest version of Open vSwitch using OXM  or
                     NXM  (that  is,  either  OpenFlow 1.2+ or OpenFlow 1.0 plus Open vSwitch NXM
                     extensions). In particular, OpenFlow 1.0 (without NXM) and 1.1 don’t  always
                     support  masking even if Open vSwitch itself does; refer to the OpenFlow 1.0
                     and OpenFlow 1.1 rows to learn about masking with these protocol versions.

              Prerequisites
                     Requirements that must be met to match on this field.  For  example,  ip_src
                     has   IPv4   as   a   prerequisite,   meaning  that  a  match  must  include
                     eth_type=0x0800  to  match  on  the  IPv4  source  address.  The   following
                     prerequisites, with their requirements, are currently in use:

                     none   (no requirements)

                     VLAN VID
                            vlan_tci=0x1000/0x1000 (i.e. a VLAN header is present)

                     ARP    eth_type=0x0806 (ARP) or eth_type=0x8035 (RARP)

                     IPv4   eth_type=0x0800

                     IPv6   eth_type=0x86dd

                     IPv4/IPv6
                            IPv4 or IPv6

                     MPLS   eth_type=0x8847 or eth_type=0x8848

                     TCP    IPv4/IPv6 and ip_proto=6

                     UDP    IPv4/IPv6 and ip_proto=17

                     SCTP   IPv4/IPv6 and ip_proto=132

                     ICMPv4 IPv4 and ip_proto=1

                     ICMPv6 IPv6 and ip_proto=58

                     ND solicit
                            ICMPv6 and icmp_type=135 and icmp_code=0

                     ND advert
                            ICMPv6 and icmp_type=136 and icmp_code=0

                     ND     ND solicit or ND advert

                     The  TCP, UDP, and SCTP prerequisites also have the special requirement that
                     nw_frag is not being used to select ``later  fragments.’’  This  is  because
                     only  the  first fragment of a fragmented IPv4 or IPv6 datagram contains the
                     TCP or UDP header.

              Access Most fields are ``read/write,’’ which means  that  common  OpenFlow  actions
                     like  set_field  can  modify  them.  Fields that are ``read-only’’ cannot be
                     modified in these general-purpose ways, although there  may  be  other  ways
                     that actions can modify them.

              OpenFlow 1.0
              OpenFlow 1.1
                   These  rows  report  the  level  of support that OpenFlow 1.0 or OpenFlow 1.1,
                   respectively, has for a field. For OpenFlow 1.0, supported fields are reported
                   as  either  ``yes  (exact  match  only)’’  for  fields that do not support any
                   bitwise masking or ``yes (CIDR match only)’’  for  fields  that  support  CIDR
                   masking.  OpenFlow  1.1  supported  fields  report  either  ``yes (exact match
                   only)’’ or simply ``yes’’ for fields that do support  arbitrary  masks.  These
                   OpenFlow  versions  supported  a  fixed  collection  of  fields that cannot be
                   extended, so many more fields are reported as ``not supported.’’

              OXM
              NXM  These rows report the OXM and NXM code  points  that  correspond  to  a  given
                   field. Either or both may be ``none.’’

                   A  field  that has only an OXM code point is usually one that was standardized
                   before it was added to Open vSwitch. A field that has only an NXM  code  point
                   is usually one that is not yet standardized. When a field has both OXM and NXM
                   code points, it usually indicates that it was introduced as  an  Open  vSwitch
                   extension under the NXM code point, then later standardized under the OXM code
                   point. A field can have more than one OXM code point if it was standardized in
                   OpenFlow 1.4 or later and additionally introduced as an official ONF extension
                   for OpenFlow 1.3. (A field  that  has  neither  OXM  nor  NXM  code  point  is
                   typically  an obsolete field that is supported in some other form using OXM or
                   NXM.)

                   Each code point in these rows is described in the form ``NAME  (number)  since
                   OpenFlow  spec  and  Open  vSwitch version,’’ e.g. ``OXM_OF_ETH_TYPE (5) since
                   OpenFlow 1.2 and Open vSwitch 1.7.’’ First, NAME, which specifies a  name  for
                   the  code  point,  starts  with  a prefix that designates a class and, in some
                   cases, a vendor, as listed in the following table:

                   Prefix           Vendor       Class
                   ───────────────  ───────────  ───────
                   NXM_OF           (none)       0x0000
                   NXM_NX           (none)       0x0001
                   ERICOXM_OF       (none)       0x1000
                   OXM_OF           (none)       0x8000
                   OXM_OF_PKT_REG   (none)       0x8001
                   NXOXM_ET         0x00002320   0xffff
                   NXOXM_NSH        0x005ad650   0xffff
                   ONFOXM_ET        0x4f4e4600   0xffff

                   For more information on OXM/NXM classes and vendors, refer  back  to  OpenFlow
                   1.2  under Evolution of OpenFlow Fields. The number is the field number within
                   the class and vendor. The OpenFlow  spec  is  the  version  of  OpenFlow  that
                   standardized  the  code  point. It is omitted for NXM code points because they
                   are nonstandard. The version  is  the  version  of  Open  vSwitch  that  first
                   supported the code point.

CONJUNCTIVE MATCH FIELDS

   Summary:
       Name      Bytes   Mask   RW?   Prereqs   NXM/OXM Support
       ────────  ──────  ─────  ────  ────────  ────────────────
       conj_id   4       no     no    none      OVS 2.4+

       An  individual  OpenFlow  flow  can  match  only  a  single value for each field. However,
       situations often arise where one wants to match one of a set of values within a  field  or
       fields.  For matching a single field against a set, it is straightforward and efficient to
       add multiple flows to the flow table, one for each value in  the  set.  For  example,  one
       might  use the following flows to send packets with IP source address a, b, c, or d to the
       OpenFlow controller:

             ip,ip_src=a actions=controller
             ip,ip_src=b actions=controller
             ip,ip_src=c actions=controller
             ip,ip_src=d actions=controller

       Similarly, these flows send packets with IP destination address e,  f,  g,  or  h  to  the
       OpenFlow controller:

             ip,ip_dst=e actions=controller
             ip,ip_dst=f actions=controller
             ip,ip_dst=g actions=controller
             ip,ip_dst=h actions=controller

       Installing  all  of  the above flows in a single flow table yields a disjunctive effect: a
       packet is sent to the controller if ip_src ∈ {a,b,c,d} or ip_dst ∈  {e,f,g,h}  (or  both).
       (Pedantically,  if  both  of  the  above sets of flows are present in the flow table, they
       should have different priorities, because OpenFlow says that  the  results  are  undefined
       when two flows with same priority can both match a single packet.)

       Suppose,  on  the other hand, one wishes to match conjunctively, that is, to send a packet
       to the controller only if both ip_src ∈ {a,b,c,d} and ip_dst ∈ {e,f,g,h}. This requires  4
       × 4 = 16 flows, one for each possible pairing of ip_src and ip_dst. That is acceptable for
       our small example, but it does not gracefully extend to larger sets or greater numbers  of
       dimensions.

       The  conjunction  action  is  a  solution  for conjunctive matches that is built into Open
       vSwitch. A conjunction action ties groups of individual OpenFlow flows  into  higher-level
       ``conjunctive  flows’’.  Each group corresponds to one dimension, and each flow within the
       group matches one possible value for the dimension. A packet that matches  one  flow  from
       each group matches the conjunctive flow.

       To implement a conjunctive flow with conjunction, assign the conjunctive flow a 32-bit id,
       which must be unique within an OpenFlow table. Assign each of  the  n  ≥  2  dimensions  a
       unique  number from 1 to n; the ordering is unimportant. Add one flow to the OpenFlow flow
       table for each possible value of each dimension with conjunction(id, k/n)  as  the  flow’s
       actions,  where  k  is  the number assigned to the flow’s dimension. Together, these flows
       specify the conjunctive flow’s match condition. When the conjunctive  match  condition  is
       met, Open vSwitch looks up one more flow that specifies the conjunctive flow’s actions and
       receives its statistics. This flow is found by setting conj_id to  the  specified  id  and
       then again searching the flow table.

       The following flows provide an example. Whenever the IP source is one of the values in the
       flows that match on the IP source (dimension 1 of 2), and the IP destination is one of the
       values in the flows that match on IP destination (dimension 2 of 2), Open vSwitch searches
       for a flow that matches conj_id against the conjunction ID (1234), finding the first  flow
       listed below.

             conj_id=1234 actions=controller
             ip,ip_src=10.0.0.1 actions=conjunction(1234, 1/2)
             ip,ip_src=10.0.0.4 actions=conjunction(1234, 1/2)
             ip,ip_src=10.0.0.6 actions=conjunction(1234, 1/2)
             ip,ip_src=10.0.0.7 actions=conjunction(1234, 1/2)
             ip,ip_dst=10.0.0.2 actions=conjunction(1234, 2/2)
             ip,ip_dst=10.0.0.5 actions=conjunction(1234, 2/2)
             ip,ip_dst=10.0.0.7 actions=conjunction(1234, 2/2)
             ip,ip_dst=10.0.0.8 actions=conjunction(1234, 2/2)

       Many subtleties exist:

              •      In  the  example  above, every flow in a single dimension has the same form,
                     that is, dimension 1 matches on ip_src and dimension 2 on ip_dst,  but  this
                     is  not  a  requirement.  Different  flows  within  a dimension may match on
                     different bits within  a  field  (e.g.  IP  network  prefixes  of  different
                     lengths,  or  TCP/UDP  port  ranges as bitwise matches), or even on entirely
                     different fields (e.g. to match packets  for  TCP  source  port  80  or  TCP
                     destination port 80).

              •      The  flows  within  a  dimension can vary their matches across more than one
                     field, e.g. to match only  specific  pairs  of  IP  source  and  destination
                     addresses or L4 port numbers.

              •      A flow may have multiple conjunction actions, with different id values. This
                     is useful for multiple conjunctive  flows  with  overlapping  sets.  If  one
                     conjunctive flow matches packets with both ip_src ∈ {a,b} and ip_dst ∈ {d,e}
                     and a second conjunctive flow matches ip_src ∈ {b,c} and ip_dst ∈ {f,g}, for
                     example,  then  the  flow  that  matches ip_src=b would have two conjunction
                     actions, one for each conjunctive flow. The  order  of  conjunction  actions
                     within a list of actions is not significant.

              •      A   flow  with  conjunction  actions  may  also  include  note  actions  for
                     annotations, but not any other kind of actions. (They would  not  be  useful
                     because they would never be executed.)

              •      All  of  the  flows  that constitute a conjunctive flow with a given id must
                     have the same priority. (Flows with the same id but different priorities are
                     currently  treated  as  different  conjunctive  flows, that is, currently id
                     values need only be unique within an OpenFlow table  at  a  given  priority.
                     This behavior isn’t guaranteed to stay the same in later releases, so please
                     use id values unique within an OpenFlow table.)

              •      Conjunctive flows must not overlap with each other,  at  a  given  priority,
                     that is, any given packet must be able to match at most one conjunctive flow
                     at a given  priority.  Overlapping  conjunctive  flows  yield  unpredictable
                     results.  (The  flows  that  constitute  a conjunctive flow may overlap with
                     those that constitute the same or another conjunctive flow.)

              •      Following a conjunctive flow match, the search for the flow with  conj_id=id
                     is done in the same general-purpose way as other flow table searches, so one
                     can use flows with conj_id=id to act differently depending on circumstances.
                     (One  exception  is  that  the search for the conj_id=id flow itself ignores
                     conjunctive flows, to avoid recursion.) If the search with conj_id=id fails,
                     Open  vSwitch  acts  as  if the conjunctive flow had not matched at all, and
                     continues searching the flow table for other matching flows.

              •      OpenFlow prerequisite checking occurs for the flow with  conj_id=id  in  the
                     same  way  as  any  other  flow, e.g. in an OpenFlow 1.1+ context, putting a
                     mod_nw_src action into the example above would require adding an  ip  match,
                     like this:

                               conj_id=1234,ip actions=mod_nw_src:1.2.3.4,controller

              •      OpenFlow  prerequisite  checking  also  occurs for the individual flows that
                     comprise a conjunctive match in the same way as any other flow.

              •      The flows that constitute a conjunctive flow do not have useful  statistics.
                     They  are  never  updated with byte or packet counts, and so on. (For such a
                     flow, therefore, the idle and hard timeouts work much the same way.)

              •      Sometimes there is a choice of which flows include a particular  match.  For
                     example,  suppose that we added an extra constraint to our example, to match
                     on ip_src ∈ {a,b,c,d} and ip_dst ∈ {e,f,g,h} and tcp_dst =  i.  One  way  to
                     implement this is to add the new constraint to the conj_id flow, like this:

                               conj_id=1234,tcp,tcp_dst=i actions=mod_nw_src:1.2.3.4,controller

                     but  this  is  not  recommended  because of the cost of the extra flow table
                     lookup. Instead, add the constraint to the individual flows, either  in  one
                     of the dimensions or (slightly better) all of them.

              •      A  conjunctive  match  must  have  n ≥ 2 dimensions (otherwise a conjunctive
                     match is not necessary). Open vSwitch enforces this.

              •      Each dimension within a conjunctive match should ordinarily have  more  than
                     one flow. Open vSwitch does not enforce this.

       Conjunction ID Field

       Name:            conj_id
       Width:           32 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CONJ_ID (37) since Open vSwitch 2.4

       Used for conjunctive matching. See above for more information.

TUNNEL FIELDS

   Summary:
       Name                   Bytes             Mask   RW?   Prereqs   NXM/OXM Support
       ─────────────────────  ────────────────  ─────  ────  ────────  ─────────────────────
       tun_id aka tunnel_id   8                 yes    yes   none      OF 1.3+ and OVS 1.1+
       tun_src                4                 yes    yes   none      OVS 2.0+
       tun_dst                4                 yes    yes   none      OVS 2.0+
       tun_ipv6_src           16                yes    yes   none      OVS 2.5+
       tun_ipv6_dst           16                yes    yes   none      OVS 2.5+
       tun_gbp_id             2                 yes    yes   none      OVS 2.4+
       tun_gbp_flags          1                 yes    yes   none      OVS 2.4+
       tun_erspan_ver         1 (low 4 bits)    yes    yes   none      OVS 2.10+
       tun_erspan_idx         4 (low 20 bits)   yes    yes   none      OVS 2.10+
       tun_erspan_dir         1 (low 1 bits)    yes    yes   none      OVS 2.10+
       tun_erspan_hwid        1 (low 6 bits)    yes    yes   none      OVS 2.10+
       tun_gtpu_flags         1                 yes    no    none      OVS 2.13+
       tun_gtpu_msgtype       1                 yes    no    none      OVS 2.13+
       tun_metadata0          124               yes    yes   none      OVS 2.5+
       tun_metadata1          124               yes    yes   none      OVS 2.5+
       tun_metadata2          124               yes    yes   none      OVS 2.5+
       tun_metadata3          124               yes    yes   none      OVS 2.5+
       tun_metadata4          124               yes    yes   none      OVS 2.5+
       tun_metadata5          124               yes    yes   none      OVS 2.5+
       tun_metadata6          124               yes    yes   none      OVS 2.5+
       tun_metadata7          124               yes    yes   none      OVS 2.5+
       tun_metadata8          124               yes    yes   none      OVS 2.5+
       tun_metadata9          124               yes    yes   none      OVS 2.5+
       tun_metadata10         124               yes    yes   none      OVS 2.5+
       tun_metadata11         124               yes    yes   none      OVS 2.5+
       tun_metadata12         124               yes    yes   none      OVS 2.5+
       tun_metadata13         124               yes    yes   none      OVS 2.5+
       tun_metadata14         124               yes    yes   none      OVS 2.5+
       tun_metadata15         124               yes    yes   none      OVS 2.5+
       tun_metadata16         124               yes    yes   none      OVS 2.5+
       tun_metadata17         124               yes    yes   none      OVS 2.5+
       tun_metadata18         124               yes    yes   none      OVS 2.5+
       tun_metadata19         124               yes    yes   none      OVS 2.5+
       tun_metadata20         124               yes    yes   none      OVS 2.5+
       tun_metadata21         124               yes    yes   none      OVS 2.5+
       tun_metadata22         124               yes    yes   none      OVS 2.5+
       tun_metadata23         124               yes    yes   none      OVS 2.5+
       tun_metadata24         124               yes    yes   none      OVS 2.5+
       tun_metadata25         124               yes    yes   none      OVS 2.5+
       tun_metadata26         124               yes    yes   none      OVS 2.5+
       tun_metadata27         124               yes    yes   none      OVS 2.5+
       tun_metadata28         124               yes    yes   none      OVS 2.5+
       tun_metadata29         124               yes    yes   none      OVS 2.5+
       tun_metadata30         124               yes    yes   none      OVS 2.5+

       tun_metadata31         124               yes    yes   none      OVS 2.5+
       tun_metadata32         124               yes    yes   none      OVS 2.5+
       tun_metadata33         124               yes    yes   none      OVS 2.5+
       tun_metadata34         124               yes    yes   none      OVS 2.5+
       tun_metadata35         124               yes    yes   none      OVS 2.5+
       tun_metadata36         124               yes    yes   none      OVS 2.5+
       tun_metadata37         124               yes    yes   none      OVS 2.5+
       tun_metadata38         124               yes    yes   none      OVS 2.5+
       tun_metadata39         124               yes    yes   none      OVS 2.5+
       tun_metadata40         124               yes    yes   none      OVS 2.5+
       tun_metadata41         124               yes    yes   none      OVS 2.5+
       tun_metadata42         124               yes    yes   none      OVS 2.5+
       tun_metadata43         124               yes    yes   none      OVS 2.5+
       tun_metadata44         124               yes    yes   none      OVS 2.5+
       tun_metadata45         124               yes    yes   none      OVS 2.5+
       tun_metadata46         124               yes    yes   none      OVS 2.5+
       tun_metadata47         124               yes    yes   none      OVS 2.5+
       tun_metadata48         124               yes    yes   none      OVS 2.5+
       tun_metadata49         124               yes    yes   none      OVS 2.5+
       tun_metadata50         124               yes    yes   none      OVS 2.5+
       tun_metadata51         124               yes    yes   none      OVS 2.5+
       tun_metadata52         124               yes    yes   none      OVS 2.5+
       tun_metadata53         124               yes    yes   none      OVS 2.5+
       tun_metadata54         124               yes    yes   none      OVS 2.5+
       tun_metadata55         124               yes    yes   none      OVS 2.5+
       tun_metadata56         124               yes    yes   none      OVS 2.5+
       tun_metadata57         124               yes    yes   none      OVS 2.5+
       tun_metadata58         124               yes    yes   none      OVS 2.5+
       tun_metadata59         124               yes    yes   none      OVS 2.5+
       tun_metadata60         124               yes    yes   none      OVS 2.5+
       tun_metadata61         124               yes    yes   none      OVS 2.5+
       tun_metadata62         124               yes    yes   none      OVS 2.5+
       tun_metadata63         124               yes    yes   none      OVS 2.5+
       tun_flags              2 (low 1 bits)    yes    yes   none      OVS 2.5+

       The  fields  in this group relate to tunnels, which Open vSwitch supports in several forms
       (GRE, VXLAN, and so on). Most of these fields do appear in the wire format of a packet, so
       they  are data fields from that point of view, but they are metadata from an OpenFlow flow
       table point of view because they do not appear  in  packets  that  are  forwarded  to  the
       controller or to ordinary (non-tunnel) output ports.

       Open vSwitch supports a spectrum of usage models for mapping tunnels to OpenFlow ports:

              ``Port-based’’ tunnels
                     In  this  model,  an  OpenFlow  port  represents  one  tunnel:  it matches a
                     particular  type  of  tunnel  traffic  between  two  IP  endpoints,  with  a
                     particular  tunnel  key  (if  keys  are  in use). In this situation, in_port
                     suffices to distinguish one tunnel from another, so the tunnel header fields
                     have  little  importance  for OpenFlow processing. (They are still populated
                     and may be used if it is convenient.) The tunnel header fields play no  role
                     in  sending  packets out such an OpenFlow port, either, because the OpenFlow
                     port itself fully specifies the tunnel headers.

                     The following Open vSwitch commands create a bridge br-int, add port tap0 to
                     the bridge as OpenFlow port 1, establish a port-based GRE tunnel between the
                     local host and remote IP 192.168.1.1 using GRE key 5001 as OpenFlow port  2,
                     and arranges to forward all traffic from tap0 to the tunnel and vice versa:

                     ovs-vsctl add-br br-int
                     ovs-vsctl add-port br-int tap0 -- set interface tap0 ofport_request=1
                     ovs-vsctl add-port br-int gre0 -- \
                         set interface gre0 ofport_request=2 type=gre \
                                            options:remote_ip=192.168.1.1 options:key=5001
                     ovs-ofctl add-flow br-int in_port=1,actions=2
                     ovs-ofctl add-flow br-int in_port=2,actions=1

              ``Flow-based’’ tunnels
                     In  this model, one OpenFlow port represents all possible tunnels of a given
                     type with an endpoint on the current host, for example, all GRE tunnels.  In
                     this  situation,  in_port  only  indicates  that traffic was received on the
                     particular kind of tunnel. This is where the tunnel header fields  are  most
                     important:  they  allow  the  OpenFlow  tables to discriminate among tunnels
                     based on their IP endpoints or keys. Tunnel header fields also determine the
                     IP endpoints and keys of packets sent out such a tunnel port.

                     The following Open vSwitch commands create a bridge br-int, add port tap0 to
                     the bridge as OpenFlow port 1, establish a flow-based GRE tunnel port 3, and
                     arranges  to  forward  all traffic from tap0 to remote IP 192.168.1.1 over a
                     GRE tunnel with key 5001 and vice versa:

                     ovs-vsctl add-br br-int
                     ovs-vsctl add-port br-int tap0 -- set interface tap0 ofport_request=1
                     ovs-vsctl add-port br-int allgre -- \
                         set interface allgre ofport_request=3 type=gre \
                                              options:remote_ip=flow options:key=flow
                     ovs-ofctl add-flow br-int \
                         ’in_port=1 actions=set_tunnel:5001,set_field:192.168.1.1->tun_dst,3’
                     ovs-ofctl add-flow br-int ’in_port=3,tun_src=192.168.1.1,tun_id=5001 actions=1’

              Mixed models.
                     One may define both flow-based and port-based tunnels at the same time.  For
                     example,  it  is valid and possibly useful to create and configure both gre0
                     and allgre tunnel ports described above.

                     Traffic is attributed on ingress to the most specific matching  tunnel.  For
                     example,  gre0  is more specific than allgre. Therefore, if both exist, then
                     gre0 will be the ingress port for any GRE traffic received from  192.168.1.1
                     with key 5001.

                     On  egress,  traffic may be directed to any appropriate tunnel port. If both
                     gre0 and allgre are configured as already described, then the actions 2  and
                     set_tunnel:5001,set_field:192.168.1.1->tun_dst,3   send   the   same  tunnel
                     traffic.

              Intermediate models.
                     Ports may be configured as partially flow-based. For example, one may define
                     an  OpenFlow  port  that  represents tunnels between a pair of endpoints but
                     leaves the flow table to discriminate on the flow key.

       ovs-vswitchd.conf.db(5) describes all the details of tunnel configuration.

       These fields do not have any prerequisites, which means that a flow may match  on  any  or
       all of them, in any combination.

       These fields are zeros for packets that did not arrive on a tunnel.

       Tunnel ID Field

       Name:            tun_id (aka tunnel_id)
       Width:           64 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_TUNNEL_ID (38) since OpenFlow 1.3 and Open vSwitch 1.10
       NXM:             NXM_NX_TUN_ID (16) since Open vSwitch 1.1

       Many kinds of tunnels support a tunnel ID:

              •      VXLAN and Geneve have a 24-bit virtual network identifier (VNI).

              •      LISP has a 24-bit instance ID.

              •      GRE has an optional 32-bit key.

              •      STT has a 64-bit key.

              •      ERSPAN has a 10-bit key (Session ID).

              •      GTPU has a 32-bit key (Tunnel Endpoint ID).

       When  a  packet  is  received  from  a tunnel, this field holds the tunnel ID in its least
       significant bits, zero-extended to fit. This field is zero if the tunnel does not  support
       an  ID,  or  if  no ID is in use for a tunnel type that has an optional ID, or if an ID of
       zero received, or if the packet was not received over a tunnel.

       When a packet is output to a tunnel port, the tunnel configuration determines whether  the
       tunnel  ID is taken from this field or bound to a fixed value. See the earlier description
       of ``port-based’’ and ``flow-based’’ tunnels for more information.

       The following diagram shows the origin of this field in a typical keyed GRE tunnel:

          Ethernet            IPv4               GRE           Ethernet
        <----------->   <--------------->   <------------>   <---------->
        48  48   16           8   32  32    16    16   32    48  48   16
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
       |dst|src|type | |...|proto|src|dst| |...| type |key| |dst|src|type| ...
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
                0x800        47                 0x6558

       Tunnel IPv4 Source Field

       Name:            tun_src
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_IPV4_SRC (31) since Open vSwitch 2.0

       When a packet is received from a tunnel, this field is the source address in the outer  IP
       header  of  the  tunneled packet. This field is zero if the packet was not received over a
       tunnel.

       When a packet is output to a flow-based tunnel port, this field influences the IPv4 source
       address  used to send the packet. If it is zero, then the kernel chooses an appropriate IP
       address based using the routing table.

       The following diagram shows the origin of this field in a typical keyed GRE tunnel:

          Ethernet            IPv4               GRE           Ethernet
        <----------->   <--------------->   <------------>   <---------->
        48  48   16           8   32  32    16    16   32    48  48   16
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
       |dst|src|type | |...|proto|src|dst| |...| type |key| |dst|src|type| ...
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
                0x800        47                 0x6558

       Tunnel IPv4 Destination Field

       Name:            tun_dst
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_IPV4_DST (32) since Open vSwitch 2.0

       When a packet is received from a tunnel, this field is  the  destination  address  in  the
       outer  IP header of the tunneled packet. This field is zero if the packet was not received
       over a tunnel.

       When a packet is output to a flow-based tunnel port, this field specifies the  destination
       to which the tunnel packet is sent.

       The following diagram shows the origin of this field in a typical keyed GRE tunnel:

          Ethernet            IPv4               GRE           Ethernet
        <----------->   <--------------->   <------------>   <---------->
        48  48   16           8   32  32    16    16   32    48  48   16
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
       |dst|src|type | |...|proto|src|dst| |...| type |key| |dst|src|type| ...
       +---+---+-----+ +---+-----+---+---+ +---+------+---+ +---+---+----+
                0x800        47                 0x6558

       Tunnel IPv6 Source Field

       Name:            tun_ipv6_src
       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_IPV6_SRC (109) since Open vSwitch 2.5

       Similar to tun_src, but for tunnels over IPv6.

       Tunnel IPv6 Destination Field

       Name:            tun_ipv6_dst
       Width:           128 bits
       Format:          IPv6

       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_IPV6_DST (110) since Open vSwitch 2.5

       Similar to tun_dst, but for tunnels over IPv6.

   VXLAN Group-Based Policy Fields
       The  VXLAN  header  is  defined  as  follows [RFC 7348], where the I bit must be set to 1,
       unlabeled bits or those labeled reserved must be set to 0, and Open vSwitch makes the  VNI
       available via tun_id:

          VXLAN flags
        <------------->
        1 1 1 1 1 1 1 1    24    24     8
       +-+-+-+-+-+-+-+-+--------+---+--------+
       | | | | |I| | | |reserved|VNI|reserved|
       +-+-+-+-+-+-+-+-+--------+---+--------+

       VXLAN  Group-Based Policy [VXLAN Group Policy Option] adds new interpretations to existing
       bits in the VXLAN header, reinterpreting it as follows, with changes highlighted:

           GBP flags
        <------------->
        1 1 1 1 1 1 1 1       24        24     8
       +-+-+-+-+-+-+-+-+---------------+---+--------+
       | |D| | |A| | | |group policy ID|VNI|reserved|
       +-+-+-+-+-+-+-+-+---------------+---+--------+

       Open vSwitch makes GBP fields and flags  available  through  the  following  fields.  Only
       packets  that  arrive over a VXLAN tunnel with the GBP extension enabled have these fields
       set. In other packets they are zero on receive and ignored on transmit.

       VXLAN Group-Based Policy ID Field

       Name:            tun_gbp_id
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none

       NXM:             NXM_NX_TUN_GBP_ID (38) since Open vSwitch 2.4

       For a packet tunneled over VXLAN with the Group-Based Policy (GBP) extension,  this  field
       represents the GBP policy ID, as shown above.

       VXLAN Group-Based Policy Flags Field

       Name:            tun_gbp_flags
       Width:           8 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_GBP_FLAGS (39) since Open vSwitch 2.4

       For  a  packet tunneled over VXLAN with the Group-Based Policy (GBP) extension, this field
       represents the GBP policy flags, as shown above.

       The field has the format shown below:

           GBP Flags
        <------------->
        1 1 1 1 1 1 1 1
       +-+-+-+-+-+-+-+-+
       | |D| | |A| | | |
       +-+-+-+-+-+-+-+-+

       Unlabeled bits are reserved and must be transmitted as 0. The VXLAN GBP draft defines  the
       other bits’ meanings as:

              D (Don’t Learn)
                     When  set, this bit indicates that the egress tunnel endpoint must not learn
                     the source address of the encapsulated frame.

              A (Applied)
                     When set, indicates that the group policy has already been applied  to  this
                     packet. Devices must not apply policies when the A bit is set.

   ERSPAN Metadata Fields
       These  fields  provide access to features in the ERSPAN tunneling protocol [ERSPAN], which
       has two major versions: version 1 (aka type II) and version 2 (aka type III).

       Regardless of version, ERSPAN is encapsulated  within  a  fixed  8-byte  GRE  header  that
       consists  of  a  4-byte GRE base header and a 4-byte sequence number. The ERSPAN version 1
       header format is:

             GRE                ERSPAN v1            Ethernet
        <------------>   <--------------------->   <---------->
        16    16   32     4  18    10    12  20    48  48   16
       +---+------+---+ +---+---+-------+---+---+ +---+---+----+
       |...| type |seq| |ver|...|session|...|idx| |dst|src|type| ...
       +---+------+---+ +---+---+-------+---+---+ +---+---+----+
            0x88be        1      tun_id

       The ERSPAN version 2 header format is:

             GRE                         ERSPAN v2                      Ethernet
        <------------>   <---------------------------------------->   <---------->
        16    16   32     4  18    10       32     22   6    1   3    48  48   16
       +---+------+---+ +---+---+-------+---------+---+----+---+---+ +---+---+----+
       |...| type |seq| |ver|...|session|timestamp|...|hwid|dir|...| |dst|src|type| ...
       +---+------+---+ +---+---+-------+---------+---+----+---+---+ +---+---+----+
            0x22eb        2      tun_id                     0/1

       ERSPAN Version Field

       Name:            tun_erspan_ver
       Width:           8 bits (only the least-significant 4 bits may be nonzero)
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_ERSPAN_VER (12) since Open vSwitch 2.10

       ERSPAN version number: 1 for version 1, or 2 for version 2.

       ERSPAN Index Field

       Name:            tun_erspan_idx
       Width:           32 bits (only the least-significant 20 bits may be nonzero)
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_ERSPAN_IDX (11) since Open vSwitch 2.10

       This field is a 20-bit index/port number associated with the ERSPAN traffic’s source  port
       and direction (ingress/egress). This field is platform dependent.

       ERSPAN Direction Field

       Name:            tun_erspan_dir
       Width:           8 bits (only the least-significant 1 bits may be nonzero)
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_ERSPAN_DIR (13) since Open vSwitch 2.10

       For  ERSPAN  v2,  the  mirrored  traffic’s  direction: 0 for ingress traffic, 1 for egress
       traffic.

       ERSPAN Hardware ID Field

       Name:            tun_erspan_hwid
       Width:           8 bits (only the least-significant 6 bits may be nonzero)
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_ERSPAN_HWID (14) since Open vSwitch 2.10

       A 6-bit unique identifier of an ERSPAN v2 engine within a system.

   GTP-U Metadata Fields
       These fields provide access to set-up GPRS Tunnelling Protocol for User  Plane  (GTPv1-U),
       based on 3GPP TS 29.281. A GTP-U header has the following format:

          8      8       16    32
       +-----+--------+------+----+
       |flags|msg type|length|TEID| ...
       +-----+--------+------+----+

       The  flags  and  message type have the Open vSwitch GTP-U specific fields described below.
       Open vSwitch makes the TEID  (Tunnel  Endpoint  Identifier),  which  identifies  a  tunnel
       endpoint in the receiving GTP-U protocol entity, available via tun_id.

       GTP-U Flags Field

       Name:            tun_gtpu_flags

       Width:           8 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_GTPU_FLAGS (15) since Open vSwitch 2.13

       This field holds the 8-bit GTP-U flags, encoded as:

         GTP-U Tunnel Flags
        <------------------->
           3    1   1  1 1 1
       +-------+--+---+-+-+--+
       |version|PT|rsv|E|S|PN|
       +-------+--+---+-+-+--+
           1        0

       The flags are:

              version
                     Used  to determine the version of the GTP-U protocol, which should be set to
                     1.

              PT     Protocol type, used as a protocol discriminator between  GTP  (1)  and  GTP’
                     (0).

              rsv    Reserved. Must be zero.

              E      If  1,  indicates  the  presence of a meaningful value of the Next Extension
                     Header field.

              S      If 1, indicates the presence of a meaningful value of  the  Sequence  Number
                     field.

              PN     If  1,  indicates  the  presence  of  a meaningful value of the N-PDU Number
                     field.

       GTP-U Message Type Field

       Name:            tun_gtpu_msgtype
       Width:           8 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read-only

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_ET_GTPU_MSGTYPE (16) since Open vSwitch 2.13

       This field indicates whether it’s a signalling message used for path management, or a user
       plane  message  which carries the original packet. The complete range of message types can
       be referred to [3GPP TS 29.281].

   Geneve Fields
       These fields provide access to  additional  features  in  the  Geneve  tunneling  protocol
       [Geneve].  Their  names  are  somewhat  generic  in the hope that the same fields could be
       reused for other protocols in the future; for example, the NSH protocol [NSH] supports TLV
       options whose form is identical to that for Geneve options.

       Generic Tunnel Option 0 Field

       Name:            tun_metadata0
       Width:           992 bits (124 bytes)
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_METADATA0 (40) since Open vSwitch 2.5

       The  above  information  specifically  covers  generic  tunnel  option 0, but Open vSwitch
       supports 64 options, numbered 0 through 63, whose NXM field numbers are 40 through 103.

       These fields provide OpenFlow access to the generic type-length-value options  defined  by
       the  Geneve  tunneling  protocol or other protocols with options in the same TLV format as
       Geneve options. Each of these options has the following wire format:

               header                 body
        <-------------------> <------------------>
         16    8    3    5    4×(length - 1) bytes
       +-----+----+---+------+--------------------+
       |class|type|res|length|       value        |
       +-----+----+---+------+--------------------+
                    0

       Taken together, the class and type in the option format  mean  that  there  are  about  16
       million  distinct kinds of TLV options, too many to give individual OXM code points. Thus,
       Open vSwitch requires the user to define the TLV options of interest, by binding up to  64
       TLV options to generic tunnel option NXM code points. Each option may have up to 124 bytes
       in its body, the maximum allowed by the TLV format, but bound options may  total  at  most
       252 bytes of body.

       Open  vSwitch extensions to the OpenFlow protocol bind TLV options to NXM code points. The
       ovs-ofctl(8) program offers one way to use these extensions, e.g. to configure  a  mapping
       from a TLV option with class 0xffff, type 0, and a body length of 4 bytes:

       ovs-ofctl add-tlv-map br0 "{class=0xffff,type=0,len=4}->tun_metadata0"

       Once a TLV option is properly bound, it can be accessed and modified like any other field,
       e.g. to send packets  that  have  value  1234  for  the  option  described  above  to  the
       controller:

       ovs-ofctl add-flow br0 tun_metadata0=1234,actions=controller

       An option not received or not bound is matched as all zeros.

       Tunnel Flags Field

       Name:            tun_flags
       Width:           16 bits (only the least-significant 1 bits may be nonzero)
       Format:          tunnel flags
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_TUN_FLAGS (104) since Open vSwitch 2.5

       Flags indicating various aspects of the tunnel encapsulation.

       Matches  on  this field are most conveniently written in terms of symbolic names (given in
       the diagram below), each preceded by either + for a flag that must be set, or - for a flag
       that  must  be  unset, without any other delimiters between the flags. Flags not mentioned
       are wildcarded. For example, tun_flags=+oam matches only OAM packets. Matches can also  be
       written  as  flags/mask,  where  flags  and  mask  are  16-bit  numbers  in  decimal or in
       hexadecimal prefixed by 0x.

       Currently, only one flag is defined:

              oam    The  tunnel  protocol  indicated  that  this  is  an  OAM  (Operations   and
                     Management) control packet.

       The switch may reject matches against unknown flags.

       Newer  versions  of  Open  vSwitch may introduce additional flags with new meanings. It is
       therefore not recommended to use an exact match on this field since the behavior of  these
       new flags is unknown and should be ignored.

       For non-tunneled packets, the value is 0.

METADATA FIELDS

   Summary:
       Name            Bytes   Mask   RW?   Prereqs   NXM/OXM Support

       ──────────────  ──────  ─────  ────  ────────  ─────────────────────
       in_port         2       no     yes   none      OVS 1.1+
       in_port_oxm     4       no     yes   none      OF 1.2+ and OVS 1.7+

       skb_priority    4       no     no    none
       pkt_mark        4       yes    yes   none      OVS 2.0+
       actset_output   4       no     no    none      OF 1.3+ and OVS 2.4+

       packet_type     4       no     no    none      OF 1.5+ and OVS 2.8+

       These  fields  relate  to  the origin or treatment of a packet, but they are not extracted
       from the packet data itself.

       Ingress Port Field

       Name:            in_port
       Width:           16 bits
       Format:          OpenFlow 1.0 port

       Masking:         not maskable
       Prerequisites:   none
       Access:          read/write

       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             none

       NXM:             NXM_OF_IN_PORT (0) since Open vSwitch 1.1

       The OpenFlow port on which the packet being processed arrived. This is a 16-bit field that
       holds  an OpenFlow 1.0 port number. For receiving a packet, the only values that appear in
       this field are:

              1 through 0xfeff (65,279), inclusive.
                     Conventional OpenFlow port numbers.

              OFPP_LOCAL (0xfffe or 65,534).
                     The ``local’’ port, which in Open vSwitch is always named the  same  as  the
                     bridge itself. This represents a connection between the switch and the local
                     TCP/IP stack. This port is where an IP address is most  commonly  configured
                     on an Open vSwitch switch.

                     OpenFlow  does  not  require a switch to have a local port, but all existing
                     versions  of  Open  vSwitch  have  always  included  a  local  port.  Future
                     Directions: Future versions of Open vSwitch might be able to optionally omit
                     the local port, if someone submits code to implement such a feature.

              OFPP_NONE (OpenFlow 1.0) or OFPP_ANY (OpenFlow 1.1+) (0xffff or 65,535).
              OFPP_CONTROLLER (0xfffd or 65,533).
                   When a controller injects a packet into an OpenFlow switch  with  a  ``packet-
                   out’’  request, it can specify one of these ingress ports to indicate that the
                   packet was generated internally rather than having been received on some port.

                   OpenFlow  1.0  specified  OFPP_NONE  for  this  purpose.  Despite  that,  some
                   controllers   used   OFPP_CONTROLLER,   and   some   switches   only  accepted
                   OFPP_CONTROLLER, so OpenFlow 1.0.2 required support for both  ports.  OpenFlow
                   1.1  and  later  were  more clearly drafted to allow only OFPP_CONTROLLER. For
                   maximum compatibility, Open  vSwitch  allows  both  ports  with  all  OpenFlow
                   versions.

       Values  not  mentioned  above  will  never  appear  when receiving a packet, including the
       following notable values:

              0      Zero is not a valid OpenFlow port number.

              OFPP_MAX (0xff00 or 65,280).
                     This value has only been clearly specified as a  valid  port  number  as  of
                     OpenFlow 1.3.3. Before that, its status was unclear, and so Open vSwitch has
                     never allowed OFPP_MAX to be used as a port number, so packets will never be
                     received on this port. (Other OpenFlow switches, of course, might use it.)

              OFPP_UNSET (0xfff7 or 65,527)
              OFPP_IN_PORT (0xfff8 or 65,528)
              OFPP_TABLE (0xfff9 or 65,529)
              OFPP_NORMAL (0xfffa or 65,530)
              OFPP_FLOOD (0xfffb or 65,531)
              OFPP_ALL (0xfffc or 65,532)
                   These port numbers are used only in output actions and never appear as ingress
                   ports.

                   Most of these port numbers were defined in OpenFlow 1.0,  but  OFPP_UNSET  was
                   only introduced in OpenFlow 1.5.

       Values  that will never appear when receiving a packet may still be matched against in the
       flow table. There are still circumstances in which those flows can be matched:

              •      The resubmit Open vSwitch extension action allows a flow table  lookup  with
                     an arbitrary ingress port.

              •      An  action  that  modifies  the ingress port field (see below), such as e.g.
                     load or set_field, followed  by  an  action  or  instruction  that  performs
                     another flow table lookup, such as resubmit or goto_table.

       This  field is heavily used for matching in OpenFlow tables, but for packet egress, it has
       only very limited roles:

              •      OpenFlow requires suppressing  output  actions  to  in_port.  That  is,  the
                     following two flows both drop all packets that arrive on port 1:

                     in_port=1,actions=1
                     in_port=1,actions=drop

                     (This  behavior  is  occasionally  useful for flooding to a subset of ports.
                     Specifying actions=1,2,3,4, for example, outputs to ports 1, 2,  3,  and  4,
                     omitting the ingress port.)

              •      OpenFlow has a special port OFPP_IN_PORT (with value 0xfff8) that outputs to
                     the ingress port. For example, in a switch that has four  ports  numbered  1
                     through  4,  actions=1,2,3,4,in_port  outputs  to  ports  1,  2,  3,  and 4,
                     including the ingress port.

       Because the ingress port field has so little influence on packet processing, it  does  not
       ordinarily  make  sense  to  modify  the ingress port field. The field is writable only to
       support the occasional use case where the ingress port’s roles in packet egress, described
       above,  become  troublesome. For example, actions=load:0->NXM_OF_IN_PORT[],output:123 will
       output to port 123 regardless of whether it is in the ingress port. If the ingress port is
       important, then one may save and restore it on the stack:

       actions=push:NXM_OF_IN_PORT[],load:0->NXM_OF_IN_PORT[],output:123,pop:NXM_OF_IN_PORT[]

       or, in Open vSwitch 2.7 or later, use the clone action to save and restore it:

       actions=clone(load:0->NXM_OF_IN_PORT[],output:123)

       The ability to modify the ingress port is an Open vSwitch extension to OpenFlow.

       OXM Ingress Port Field

       Name:            in_port_oxm
       Width:           32 bits
       Format:          OpenFlow 1.1+ port
       Masking:         not maskable
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_IN_PORT (0) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             none

       OpenFlow  1.1  and later use a 32-bit port number, so this field supplies a 32-bit view of
       the ingress port. Current versions of Open vSwitch support only a 16-bit range of ports:

              •      OpenFlow 1.0 ports 0x0000 to 0xfeff, inclusive, map  to  OpenFlow  1.1  port
                     numbers with the same values.

              •      OpenFlow  1.0  ports  0xff00  to 0xffff, inclusive, map to OpenFlow 1.1 port
                     numbers 0xffffff00 to 0xffffffff.

              •      OpenFlow  1.1  ports  0x0000ff00  to  0xfffffeff  are  not  mapped  and  not
                     supported.

       in_port  and  in_port_oxm are two views of the same information, so all of the comments on
       in_port apply to in_port_oxm too. Modifying in_port changes in_port_oxm, and vice versa.

       Setting in_port_oxm to an unsupported value yields unspecified behavior.

       Output Queue Field

       Name:            skb_priority
       Width:           32 bits
       Format:          hexadecimal
       Masking:         not maskable
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             none

       Future Directions: Open vSwitch implements the output queue  as  a  field,  but  does  not
       currently  expose  it  through OXM or NXM for matching purposes. If this turns out to be a
       useful feature, it could be implemented in future versions. Only the  set_queue,  enqueue,
       and pop_queue actions currently influence the output queue.

       This field influences how packets in the flow will be queued, for quality of service (QoS)
       purposes, when they egress the switch. Its range of meaningful values, and their meanings,
       varies  greatly  from  one  OpenFlow  implementation  to  another.  Even  within  a single
       implementation, there is no guarantee  that  all  OpenFlow  ports  have  the  same  queues
       configured  or that all OpenFlow ports in an implementation can be configured the same way
       queue-wise.

       Configuring queues on OpenFlow is not well standardized. On Linux, Open  vSwitch  supports
       queue   configuration   via   OVSDB,   specifically   the   QoS   and  Queue  tables  (see
       ovs-vswitchd.conf.db(5) for details). Ports of  Open  vSwitch  to  other  platforms  might
       require queue configuration through some separate protocol (such as a CLI). Even on Linux,
       Open vSwitch exposes only a fraction of the kernel’s queuing features  through  OVSDB,  so
       advanced  or  unusual  uses  might  require  use of separate utilities (e.g. tc). OpenFlow
       switches other than Open vSwitch might use OF-CONFIG or any of the  configuration  methods
       mentioned  above.  Finally,  some  OpenFlow switches have a fixed number of fixed-function
       queues (e.g. eight queues with strictly defined priorities) and others do not support  any
       control over queuing.

       The  only output queue that all OpenFlow implementations must support is zero, to identify
       a default queue, whose properties are implementation-defined. Outputting  a  packet  to  a
       queue  that  does  not  exist  on the output port yields unpredictable behavior: among the
       possibilities are that the packet might be dropped or transmitted with a very high or very
       low priority.

       OpenFlow  1.0 only allowed output queues to be specified as part of an enqueue action that
       specified both a queue and an output port. That is, OpenFlow 1.0 treats the  queue  as  an
       argument to an action, not as a field.

       To  increase flexibility, OpenFlow 1.1 added an action to set the output queue. This model
       was carried forward, without change, through OpenFlow 1.5.

       Open vSwitch implements the native queuing model of each  OpenFlow  version  it  supports.
       Open  vSwitch  also  includes  an  extension  for setting the output queue as an action in
       OpenFlow 1.0.

       When a packet ingresses into an OpenFlow switch, the output queue is ordinarily set to  0,
       indicating  the  default  queue.  However, Open vSwitch supports various ways to forward a
       packet from one OpenFlow switch to another within a single  host.  In  these  cases,  Open
       vSwitch maintains the output queue across the forwarding step. For example:

              •      A hop across an Open vSwitch ``patch port’’ (which does not actually involve
                     queuing) preserves the output queue.

              •      When a flow sets the output queue then outputs to an OpenFlow  tunnel  port,
                     the  encapsulation  preserves  the  output queue. If the kernel TCP/IP stack
                     routes the encapsulated packet directly to a physical interface,  then  that
                     output  honors  the  output  queue.  Alternatively, if the kernel routes the
                     encapsulated packet to another Open vSwitch bridge, then  the  output  queue
                     set  previously  becomes  the  initial output queue on ingress to the second
                     bridge and will thus be used for further output actions  (unless  overridden
                     by a new ``set queue’’ action).

                     (This  description  reflects  the current behavior of Open vSwitch on Linux.
                     This behavior relies on details of the  Linux  TCP/IP  stack.  It  could  be
                     difficult to make ports to other operating systems behave the same way.)

       Packet Mark Field

       Name:            pkt_mark
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_PKT_MARK (33) since Open vSwitch 2.0

       Packet  mark  comes  to  Open  vSwitch  from  the  Linux kernel, in which the sk_buff data
       structure that represents a packet contains a 32-bit member named skb_mark. The  value  of
       skb_mark  propagates  along with the packet it accompanies wherever the packet goes in the
       kernel. It has no predefined semantics but various  kernel-user  interfaces  can  set  and
       match  on  it,  which  makes  it  suitable  for  ``marking’’ packets at one point in their
       handling and then acting on the mark later. With iptables, for example, one can mark  some
       traffic  specially  at ingress and then handle that traffic differently at egress based on
       the marked value.

       Packet mark is an attempt at a generalization of the skb_mark  concept  beyond  Linux,  at
       least  through  more  generic  naming.  Like skb_priority, packet mark is preserved across
       forwarding steps within a machine. Unlike skb_priority, packet mark has no  direct  effect
       on  packet  forwarding:  the  value  set  in packet mark does not matter unless some later
       OpenFlow table or switch matches on packet mark, or unless the packet passes through  some
       other kernel subsystem that has been configured to interpret packet mark in specific ways,
       e.g. through iptables configuration mentioned above.

       Preserving packet mark across kernel forwarding steps relies heavily  on  kernel  support,
       which  ports  to  non-Linux operating systems may not have. Regardless of operating system
       support, Open vSwitch supports packet mark within a single bridge and across patch ports.

       The value of packet mark when a packet ingresses into the  first  Open  vSwich  bridge  is
       typically  zero,  but  it  could be nonzero if its value was previously set by some kernel
       subsystem.

       Action Set Output Port Field

       Name:            actset_output
       Width:           32 bits
       Format:          OpenFlow 1.1+ port
       Masking:         not maskable
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             ONFOXM_ET_ACTSET_OUTPUT (43) since OpenFlow 1.3  and  Open  vSwitch  2.4;
                        OXM_OF_ACTSET_OUTPUT (43) since OpenFlow 1.5 and Open vSwitch 2.4
       NXM:             none

       Holds  the  output  port  currently in the OpenFlow action set (i.e. from an output action
       within a write_actions instruction). Its value is an OpenFlow port number. If there is  no
       output  port  in  the  OpenFlow  action  set,  or if the output port will be ignored (e.g.
       because there is an output group in the OpenFlow action  set),  then  the  value  will  be
       OFPP_UNSET.

       Open  vSwitch  allows any table to match this field. OpenFlow, however, only requires this
       field to be matchable from within an OpenFlow egress table (a feature  that  Open  vSwitch
       does not yet implement).

       Packet Type Field

       Name:            packet_type

       Width:           32 bits
       Format:          packet type
       Masking:         not maskable
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_PACKET_TYPE (44) since OpenFlow 1.5 and Open vSwitch 2.8
       NXM:             none

       The type of the packet in the format specified in OpenFlow 1.5:

        Packet type
        <--------->
        16    16
       +---+-------+
       |ns |ns_type| ...
       +---+-------+

       The  upper  16 bits, ns, are a namespace. The meaning of ns_type depends on the namespace.
       The packet type field is specified and displayed in the format (ns,ns_type).

       Open vSwitch currently supports the following classes of packet types for matching:

              (0,0)  Ethernet.

              (1,ethertype)
                     The  specified  ethertype.  Open  vSwitch  can  forward  packets  with   any
                     ethertype,  but  it  can  only  match  on  and  process  data fields for the
                     following supported packet types:

                     (1,0x800)
                            IPv4

                     (1,0x806)
                            ARP

                     (1,0x86dd)
                            IPv6

                     (1,0x8847)
                            MPLS

                     (1,0x8848)
                            MPLS multicast

                     (1,0x8035)
                            RARP

                     (1,0x894f)
                            NSH

       Consider the distinction between a packet with packet_type=(0,0),  dl_type=0x800  and  one
       with  packet_type=(1,0x800). The former is an Ethernet frame that contains an IPv4 packet,
       like this:

          Ethernet            IPv4
        <----------->   <--------------->
        48  48   16           8   32  32
       +---+---+-----+ +---+-----+---+---+
       |dst|src|type | |...|proto|src|dst| ...
       +---+---+-----+ +---+-----+---+---+
                0x800

       The latter is an IPv4 packet not encapsulated inside any outer frame, like this:

              IPv4
        <--------------->
              8   32  32
       +---+-----+---+---+
       |...|proto|src|dst| ...
       +---+-----+---+---+

       Matching on packet_type is a pre-requisite  for  matching  on  any  data  field,  but  for
       backward  compatibility,  when  a  match  on a data field is present without a packet_type
       match, Open vSwitch acts as  though  a  match  on  (0,0)  (Ethernet)  had  been  supplied.
       Similarly, when Open vSwitch sends flow match information to a controller, e.g. in a reply
       to a request to dump the flow table, Open vSwitch omits a match on packet type (0,0) if it
       would be implied by a data field match.

CONNECTION TRACKING FIELDS

   Summary:
       Name          Bytes   Mask   RW?   Prereqs   NXM/OXM Support
       ────────────  ──────  ─────  ────  ────────  ────────────────
       ct_state      4       yes    no    none      OVS 2.5+
       ct_zone       2       no     no    none      OVS 2.5+
       ct_mark       4       yes    yes   none      OVS 2.5+
       ct_label      16      yes    yes   none      OVS 2.5+
       ct_nw_src     4       yes    no    CT        OVS 2.8+
       ct_nw_dst     4       yes    no    CT        OVS 2.8+
       ct_ipv6_src   16      yes    no    CT        OVS 2.8+

       ct_ipv6_dst   16      yes    no    CT        OVS 2.8+
       ct_nw_proto   1       no     no    CT        OVS 2.8+
       ct_tp_src     2       yes    no    CT        OVS 2.8+
       ct_tp_dst     2       yes    no    CT        OVS 2.8+

       Open  vSwitch  supports  ``connection  tracking,’’  which  allows bidirectional streams of
       packets to be statefully grouped into connections. Open vSwitch connection  tracking,  for
       example,  identifies  the  patterns of TCP packets that indicates a successfully initiated
       connection, as well as those that indicate that a connection  has  been  torn  down.  Open
       vSwitch  connection  tracking  can  also  identify  related  connections, such as FTP data
       connections spawned from FTP control connections.

       An individual  packet  passing  through  the  pipeline  may  be  in  one  of  two  states,
       ``untracked’’ or ``tracked,’’ which may be distinguished via the ``trk’’ flag in ct_state.
       A packet is untracked at the beginning of the Open vSwitch pipeline and  continues  to  be
       untracked until the pipeline invokes the ct action. The connection tracking fields are all
       zeroes in an untracked packet. When a flow in the Open vSwitch  pipeline  invokes  the  ct
       action,  the  action  initializes  the  connection  tracking fields and the packet becomes
       tracked for the remainder of its processing.

       The connection tracker stores connection state in an internal table, but it  only  adds  a
       new  entry  to this table when a ct action for a new connection invokes ct with the commit
       parameter. For a given connection, when a pipeline has  executed  ct,  but  not  yet  with
       commit,  the  connection is said to be uncommitted. State for an uncommitted connection is
       ephemeral and does not persist past the end of the pipeline, so  some  features  are  only
       available  to committed connections. A connection would typically be left uncommitted as a
       way to drop its packets.

       Connection tracking is an Open vSwitch extension to OpenFlow. Open vSwitch 2.5  added  the
       initial  support  for  connection tracking. Subsequent versions of Open vSwitch added many
       refinements and extensions to the initial support. Many of these  capabilities  depend  on
       the  Open  vSwitch  datapath  rather  than  simply the userspace version. The capabilities
       column  in  the  Datapath  table  (see  ovs-vswitchd.conf.db(5))  reports   the   detailed
       capabilities of a particular Open vSwitch datapath.

       Connection Tracking State Field

       Name:            ct_state

       Width:           32 bits
       Format:          ct state
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_STATE (105) since Open vSwitch 2.5

       This  field  holds several flags that can be used to determine the state of the connection
       to which the packet belongs.

       Matches on this field are most conveniently written in terms  of  symbolic  names  (listed
       below),  each  preceded by either + for a flag that must be set, or - for a flag that must
       be unset, without any  other  delimiters  between  the  flags.  Flags  not  mentioned  are
       wildcarded.  For  example,  tcp,ct_state=+trk-new  matches  TCP packets that have been run
       through the connection tracker and do not establish a new connection. Matches can also  be
       written  as  flags/mask,  where  flags  and  mask  are  32-bit  numbers  in  decimal or in
       hexadecimal prefixed by 0x.

       The following flags are defined:

              new (0x01)
                     A new connection. Set to 1 if this is an uncommitted connection.

              est (0x02)
                     Part of an  existing  connection.  Set  to  1  if  packets  of  a  committed
                     connection have been seen by conntrack from both directions.

              rel (0x04)
                     Related  to an existing connection, e.g. an ICMP ``destination unreachable’’
                     message or an FTP data  connections.  This  flag  will  only  be  1  if  the
                     connection to which this one is related is committed.

                     Connections  identified  as rel are separate from the originating connection
                     and must be committed separately. All packets for a related connection  will
                     have the rel flag set, not just the initial packet.

              rpl (0x08)
                     This  packet  is  in the reply direction, meaning that it is in the opposite
                     direction from the packet that initiated the connection. This flag will only
                     be 1 if the connection is committed.

              inv (0x10)
                     The  state is invalid, meaning that the connection tracker couldn’t identify
                     the connection. This flag is a catch-all for problems in the  connection  or
                     the connection tracker, such as:

                     •      L3/L4  protocol  handler  is  not  loaded/unavailable. With the Linux
                            kernel  datapath,  this  may  mean  that  the  nf_conntrack_ipv4   or
                            nf_conntrack_ipv6 modules are not loaded.

                     •      L3/L4 protocol handler determines that the packet is malformed.

                     •      Packets are unexpected length for protocol.

              trk (0x20)
                     This  packet  is  tracked,  meaning  that  it  has  previously traversed the
                     connection tracker. If this flag is not set, then no  other  flags  will  be
                     set.  If  this  flag  is set, then the packet is tracked and other flags may
                     also be set.

              snat (0x40)
                     This  packet  was  transformed  by  source  address/port  translation  by  a
                     preceding ct action. Open vSwitch 2.6 added this flag.

              dnat (0x80)
                     This  packet  was  transformed  by destination address/port translation by a
                     preceding ct action. Open vSwitch 2.6 added this flag.

       There are additional constraints on these flags, listed in decreasing order of  precedence
       below:

              1.  If trk is unset, no other flags are set.

              2.  If trk is set, one or more other flags may be set.

              3.  If inv is set, only the trk flag is also set.

              4.  new and est are mutually exclusive.

              5.  new and rpl are mutually exclusive.

              6.  rel may be set in conjunction with any other flags.

       Future versions of Open vSwitch may define new flags.

       Connection Tracking Zone Field

       Name:            ct_zone
       Width:           16 bits
       Format:          hexadecimal

       Masking:         not maskable
       Prerequisites:   none
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_ZONE (106) since Open vSwitch 2.5

       A  connection tracking zone, the zone value passed to the most recent ct action. Each zone
       is an independent connection tracking context, so tracking the  same  packet  in  multiple
       contexts requires using the ct action multiple times.

       Connection Tracking Mark Field

       Name:            ct_mark
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_MARK (107) since Open vSwitch 2.5

       The  metadata  committed,  by an action within the exec parameter to the ct action, to the
       connection to which the current packet belongs.

       Connection Tracking Label Field

       Name:            ct_label
       Width:           128 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_LABEL (108) since Open vSwitch 2.5

       The label committed, by an action within the exec parameter  to  the  ct  action,  to  the
       connection to which the current packet belongs.

       Open vSwitch 2.8 introduced the matching support for connection tracker original direction
       5-tuple fields.

       For non-committed non-related connections the conntrack original  direction  tuple  fields
       always  have  the  same  values as the corresponding headers in the packet itself. For any
       other packets of a committed connection the  conntrack  original  direction  tuple  fields
       reflect  the  values  from  that initial non-committed non-related packet, and thus may be
       different from the actual packet headers, as the actual packet headers may be  in  reverse
       direction  (for  reply  packets),  transformed  by NAT (when nat option was applied to the
       connection), or be of different protocol (i.e., when an ICMP response is sent  to  an  UDP
       packet).  In  case  of  related  connections,  e.g.,  an FTP data connection, the original
       direction tuple contains the original direction headers from the parent connection,  e.g.,
       an FTP control connection.

       The  following  fields  are  populated  by  the  ct action, and require a match to a valid
       connection tracking state as a prerequisite, in addition  to  the  IP  or  IPv6  ethertype
       match.  Examples  of  valid  connection  tracking  state  matches  include  ct_state=+new,
       ct_state=+est, ct_state=+rel, and ct_state=+trk-inv.

       Connection Tracking Original Direction IPv4 Source Address Field

       Name:            ct_nw_src
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks

       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_NW_SRC (120) since Open vSwitch 2.8

       Matches IPv4 conntrack original direction tuple source address. See the  paragraphs  above
       for  general  description  to  the  conntrack original direction tuple. Introduced in Open
       vSwitch 2.8.

       Connection Tracking Original Direction IPv4 Destination Address Field

       Name:            ct_nw_dst
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks
       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_NW_DST (121) since Open vSwitch 2.8

       Matches IPv4 conntrack original direction tuple destination address.  See  the  paragraphs
       above  for  general  description  to the conntrack original direction tuple. Introduced in
       Open vSwitch 2.8.

       Connection Tracking Original Direction IPv6 Source Address Field

       Name:            ct_ipv6_src
       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks
       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_IPV6_SRC (122) since Open vSwitch 2.8

       Matches IPv6 conntrack original direction tuple source address. See the  paragraphs  above
       for  general  description  to  the  conntrack original direction tuple. Introduced in Open
       vSwitch 2.8.

       Connection Tracking Original Direction IPv6 Destination Address Field

       Name:            ct_ipv6_dst
       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks
       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_IPV6_DST (123) since Open vSwitch 2.8

       Matches IPv6 conntrack original direction tuple destination address.  See  the  paragraphs
       above  for  general  description  to the conntrack original direction tuple. Introduced in
       Open vSwitch 2.8.

       Connection Tracking Original Direction IP Protocol Field

       Name:            ct_nw_proto
       Width:           8 bits
       Format:          decimal

       Masking:         not maskable
       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_NW_PROTO (119) since Open vSwitch 2.8

       Matches conntrack original direction tuple IP protocol  type,  which  is  specified  as  a
       decimal  number  between  0 and 255, inclusive (e.g. 1 to match ICMP packets or 6 to match
       TCP packets). In case of, for example, an ICMP response to an  UDP  packet,  this  may  be
       different  from  the  IP  protocol type of the packet itself. See the paragraphs above for
       general description to the conntrack original direction tuple. Introduced in Open  vSwitch
       2.8.

       Connection Tracking Original Direction Transport Layer Source Port Field

       Name:            ct_tp_src
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   CT
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_TP_SRC (124) since Open vSwitch 2.8

       Bitwise   match   on  the  conntrack  original  direction  tuple  transport  source,  when
       MFF_CT_NW_PROTO has value 6 for TCP, 17 for UDP, or 132 for SCTP. When MFF_CT_NW_PROTO has
       value  1  for  ICMP,  or  58  for  ICMPv6,  the  lower 8 bits of MFF_CT_TP_SRC matches the
       conntrack original direction ICMP type. See the paragraphs above for  general  description
       to the conntrack original direction tuple. Introduced in Open vSwitch 2.8.

       Connection Tracking Original Direction Transport Layer Source Port Field

       Name:            ct_tp_dst
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   CT

       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_CT_TP_DST (125) since Open vSwitch 2.8

       Bitwise  match  on the conntrack original direction tuple transport destination port, when
       MFF_CT_NW_PROTO has value 6 for TCP, 17 for UDP, or 132 for SCTP. When MFF_CT_NW_PROTO has
       value  1  for  ICMP,  or  58  for  ICMPv6,  the  lower 8 bits of MFF_CT_TP_DST matches the
       conntrack original direction ICMP code. See the paragraphs above for  general  description
       to the conntrack original direction tuple. Introduced in Open vSwitch 2.8.

REGISTER FIELDS

   Summary:
       Name       Bytes   Mask   RW?   Prereqs   NXM/OXM Support
       ─────────  ──────  ─────  ────  ────────  ─────────────────────
       metadata   8       yes    yes   none      OF 1.2+ and OVS 1.8+
       reg0       4       yes    yes   none      OVS 1.1+
       reg1       4       yes    yes   none      OVS 1.1+
       reg2       4       yes    yes   none      OVS 1.1+
       reg3       4       yes    yes   none      OVS 1.1+

       reg4       4       yes    yes   none      OVS 1.3+
       reg5       4       yes    yes   none      OVS 1.7+
       reg6       4       yes    yes   none      OVS 1.7+
       reg7       4       yes    yes   none      OVS 1.7+
       reg8       4       yes    yes   none      OVS 2.6+
       reg9       4       yes    yes   none      OVS 2.6+
       reg10      4       yes    yes   none      OVS 2.6+
       reg11      4       yes    yes   none      OVS 2.6+
       reg12      4       yes    yes   none      OVS 2.6+
       reg13      4       yes    yes   none      OVS 2.6+

       reg14      4       yes    yes   none      OVS 2.6+
       reg15      4       yes    yes   none      OVS 2.6+
       xreg0      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg1      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg2      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg3      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg4      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg5      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg6      8       yes    yes   none      OF 1.3+ and OVS 2.4+
       xreg7      8       yes    yes   none      OF 1.3+ and OVS 2.4+

       xxreg0     16      yes    yes   none      OVS 2.6+
       xxreg1     16      yes    yes   none      OVS 2.6+
       xxreg2     16      yes    yes   none      OVS 2.6+
       xxreg3     16      yes    yes   none      OVS 2.6+

       These  fields  give  an  OpenFlow switch space for temporary storage while the pipeline is
       running. Whereas metadata fields can have a  meaningful  initial  value  and  can  persist
       across  some  hops  across  OpenFlow  switches, registers are always initially 0 and their
       values never persist across inter-switch hops (not even across patch ports).

       OpenFlow Metadata Field

       Name:            metadata
       Width:           64 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    yes
       OXM:             OXM_OF_METADATA (2) since OpenFlow 1.2 and Open vSwitch 1.8

       NXM:             none

       This field is the oldest standardized OpenFlow register field, introduced in OpenFlow 1.1.
       It  was  introduced  to model the limited number of user-defined bits that some ASIC-based
       switches can carry through their pipelines.  Because  of  hardware  limitations,  OpenFlow
       allows  switches  to  support writing and masking only an implementation-defined subset of
       bits, even no bits at all. The Open vSwitch software switch always supports all  64  bits,
       but  of course an Open vSwitch port to an ASIC would have the same restriction as the ASIC
       itself.

       This field has an OXM code point, but OpenFlow 1.4 and earlier allow  it  to  be  modified
       only with a specialized instruction, not with a ``set-field’’ action. OpenFlow 1.5 removes
       this restriction. Open vSwitch does not enforce this restriction, regardless  of  OpenFlow
       version.

       Register 0 Field

       Name:            reg0
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks

       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_REG0 (0) since Open vSwitch 1.1

       This  is  the  first  of  several  Open  vSwitch  registers,  all  of  which have the same
       properties. Open vSwitch 1.1 introduced registers 0,  1,  2,  and  3,  version  1.3  added
       register  4,  version  1.7  added registers 5, 6, and 7, and version 2.6 added registers 8
       through 15.

       Extended Register 0 Field

       Name:            xreg0
       Width:           64 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_PKT_REG0 (0) since OpenFlow 1.3 and Open vSwitch 2.4
       NXM:             none

       This is the first of the registers introduced in OpenFlow 1.5. OpenFlow  1.5  calls  these
       fields  just  the  ``packet  registers,’’ but Open vSwitch already had 32-bit registers by
       that name, so Open vSwitch uses the name ``extended registers’’ in an  attempt  to  reduce
       confusion.  The  standard  allows  for  up  to  128 registers, each 64 bits wide, but Open
       vSwitch only implements 4 (in versions 2.4 and 2.5) or 8 (in version 2.6 and later).

       Each of the 64-bit extended registers overlays two of the 32-bit registers: xreg0 overlays
       reg0  and reg1, with reg0 supplying the most-significant bits of xreg0 and reg1 the least-
       significant. Similarly, xreg1 overlays reg2 and reg3, and so on.

       The OpenFlow specification says, ``In most cases, the packet registers can not be  matched
       in tables, i.e. they usually can not be used in the flow entry match structure’’ [OpenFlow
       1.5, section 7.2.3.10], but there is no reason for a software  switch  to  impose  such  a
       restriction, and Open vSwitch does not.

       Double-Extended Register 0 Field

       Name:            xxreg0
       Width:           128 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   none
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_XXREG0 (111) since Open vSwitch 2.6

       This  is the first of the double-extended registers introduce in Open vSwitch 2.6. Each of
       the 128-bit extended registers overlays four of the 32-bit registers: xxreg0 overlays reg0
       through  reg3, with reg0 supplying the most-significant bits of xxreg0 and reg3 the least-
       significant. xxreg1 similarly overlays reg4 through reg7, and so on.

LAYER 2 (ETHERNET) FIELDS

   Summary:
       Name                   Bytes   Mask   RW?   Prereqs    NXM/OXM Support

       ─────────────────────  ──────  ─────  ────  ─────────  ─────────────────────
       eth_src aka dl_src     6       yes    yes   Ethernet   OF 1.2+ and OVS 1.1+
       eth_dst aka dl_dst     6       yes    yes   Ethernet   OF 1.2+ and OVS 1.1+
       eth_type aka dl_type   2       no     no    Ethernet   OF 1.2+ and OVS 1.1+

       Ethernet is the only layer-2 protocol that Open vSwitch supports. As with  most  software,
       Open  vSwitch  and  OpenFlow regard an Ethernet frame to begin with the 14-byte header and
       end with the final byte of  the  payload;  that  is,  the  frame  check  sequence  is  not
       considered part of the frame.

       Ethernet Source Field

       Name:            eth_src (aka dl_src)
       Width:           48 bits

       Format:          Ethernet
       Masking:         arbitrary bitwise masks
       Prerequisites:   Ethernet
       Access:          read/write

       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes
       OXM:             OXM_OF_ETH_SRC (4) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ETH_SRC (2) since Open vSwitch 1.1

       The Ethernet source address:

          Ethernet
        <---------->
        48  48   16
       +---+---+----+
       |dst|src|type| ...
       +---+---+----+

       Ethernet Destination Field

       Name:            eth_dst (aka dl_dst)
       Width:           48 bits

       Format:          Ethernet
       Masking:         arbitrary bitwise masks
       Prerequisites:   Ethernet
       Access:          read/write

       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes
       OXM:             OXM_OF_ETH_DST (3) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ETH_DST (1) since Open vSwitch 1.1

       The Ethernet destination address:

          Ethernet
        <---------->
        48  48   16
       +---+---+----+
       |dst|src|type| ...
       +---+---+----+

       Open  vSwitch 1.8 and later support arbitrary masks for source and/or destination. Earlier
       versions only support masking the destination with the following masks:

              01:00:00:00:00:00
                     Match         only         the         multicast         bit.          Thus,
                     dl_dst=01:00:00:00:00:00/01:00:00:00:00:00  matches all multicast (including
                     broadcast) Ethernet packets, and  dl_dst=00:00:00:00:00:00/01:00:00:00:00:00
                     matches all unicast Ethernet packets.

              fe:ff:ff:ff:ff:ff
                     Match all bits except the multicast bit. This is probably not useful.

              ff:ff:ff:ff:ff:ff
                     Exact match (equivalent to omitting the mask).

              00:00:00:00:00:00
                     Wildcard all bits (equivalent to dl_dst=*).

       Ethernet Type Field

       Name:            eth_type (aka dl_type)
       Width:           16 bits
       Format:          hexadecimal

       Masking:         not maskable
       Prerequisites:   Ethernet
       Access:          read-only
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_ETH_TYPE (5) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ETH_TYPE (3) since Open vSwitch 1.1

       The most commonly seen Ethernet frames today use a format called ``Ethernet II,’’ in which
       the last two bytes of the Ethernet header specify the Ethertype. For such  a  frame,  this
       field is copied from those bytes of the header, like so:

             Ethernet
        <---------------->
        48  48      16
       +---+---+----------+
       |dst|src|   type   | ...
       +---+---+----------+
                ≥0x600

       Every  Ethernet  type has a value 0x600 (1,536) or greater. When the last two bytes of the
       Ethernet header have a value too small to be an Ethernet type, then the value found  there
       is  the  total  length  of the frame in bytes, excluding the Ethernet header. An 802.2 LLC
       header typically follows the Ethernet header. OpenFlow and Open vSwitch only  support  LLC
       headers  with  DSAP and SSAP 0xaa and control byte 0x03, which indicate that a SNAP header
       follows the LLC header. In turn, OpenFlow and Open vSwitch only support a SNAP header with
       organization  0x000000.  In  such  a case, this field is copied from the type field in the
       SNAP header, like this:

           Ethernet           LLC                SNAP
        <------------>   <------------>   <----------------->
        48  48    16      8    8    8        24        16
       +---+---+------+ +----+----+----+ +--------+----------+
       |dst|src| type | |DSAP|SSAP|cntl| |  org   |   type   | ...
       +---+---+------+ +----+----+----+ +--------+----------+
                <0x600   0xaa 0xaa 0x03   0x000000 ≥0x600

       When an 802.1Q header is inserted after the Ethernet source and destination, this field is
       populated  with  the encapsulated Ethertype, not the 802.1Q Ethertype. With an Ethernet II
       inner frame, the result looks like this:

        Ethernet     802.1Q     Ethertype
        <------>   <-------->   <-------->
         48  48      16   16        16
       +----+---+ +------+---+ +----------+
       |dst |src| | TPID |TCI| |   type   | ...
       +----+---+ +------+---+ +----------+
                   0x8100       ≥0x600

       LLC and SNAP encapsulation look like this with an 802.1Q header:

        Ethernet     802.1Q     Ethertype        LLC                SNAP
        <------>   <-------->   <------->   <------------>   <----------------->
         48  48      16   16       16        8    8    8        24        16
       +----+---+ +------+---+ +---------+ +----+----+----+ +--------+----------+
       |dst |src| | TPID |TCI| |  type   | |DSAP|SSAP|cntl| |  org   |   type   | ...
       +----+---+ +------+---+ +---------+ +----+----+----+ +--------+----------+
                   0x8100        <0x600     0xaa 0xaa 0x03   0x000000 ≥0x600

       When a packet doesn’t match any of the header formats described above,  Open  vSwitch  and
       OpenFlow set this field to 0x5ff (OFP_DL_TYPE_NOT_ETH_TYPE).

VLAN FIELDS

   Summary:
       Name          Bytes             Mask   RW?   Prereqs    NXM/OXM Support

       ────────────  ────────────────  ─────  ────  ─────────  ─────────────────────
       dl_vlan       2 (low 12 bits)   no     yes   Ethernet
       dl_vlan_pcp   1 (low 3 bits)    no     yes   Ethernet

       vlan_vid      2 (low 12 bits)   yes    yes   Ethernet   OF 1.2+ and OVS 1.7+
       vlan_pcp      1 (low 3 bits)    no     yes   VLAN VID   OF 1.2+ and OVS 1.7+
       vlan_tci      2                 yes    yes   Ethernet   OVS 1.1+

       The  802.1Q VLAN header causes more trouble than any other 4 bytes in networking. OpenFlow
       1.0, 1.1, and 1.2+ all treat  VLANs  differently.  Open  vSwitch  extensions  add  another
       variant to the mix. Open vSwitch reconciles all four treatments as best it can.

   VLAN Header Format
       An 802.1Q VLAN header consists of two 16-bit fields:

          TPID        TCI
        <-------> <--------->
           16      3   1  12
       +---------+---+---+---+
       |Ethertype|PCP|CFI|VID|
       +---------+---+---+---+
         0x8100        0

       The first 16 bits of the VLAN header, the TPID (Tag Protocol IDentifier), is an Ethertype.
       When the VLAN header is inserted just after the source and destination MAC addresses in  a
       Ethertype  frame, the TPID serves to identify the presence of the VLAN. The standard TPID,
       the only one that Open vSwitch supports, is 0x8100. OpenFlow 1.0 explicitly supports  only
       TPID  0x8100.  OpenFlow  1.1, but not earlier or later versions, also requires support for
       TPID 0x88a8 (Open vSwitch does not support this). OpenFlow 1.2 through 1.5 do not  require
       support  for specific TPIDs (the ``push vlan header’’ action does say that only 0x8100 and
       0x88a8 should be pushed). No version of OpenFlow provides a way to distinguish or match on
       the TPID.

       The remaining 16 bits of the VLAN header, the TCI (Tag Control Information), is subdivided
       into three subfields:

              •      PCP (Priority Control  Point),  is  a  3-bit  802.1p  priority.  The  lowest
                     priority  is  value  1, the second-lowest is value 0, and priority increases
                     from 2 up to highest priority 7.

              •      CFI (Canonical Format Indicator), is a 1-bit field. On an Ethernet  network,
                     its  value is always 0. This led to it later being repurposed under the name
                     DEI (Drop Eligibility Indicator). By either name, OpenFlow and Open  vSwitch
                     don’t provide any way to match or set this bit.

              •      VID  (VLAN IDentifier), is a 12-bit VLAN. If the VID is 0, then the frame is
                     not part of a VLAN. In that case, the VLAN header is called a  priority  tag
                     because  it is only meaningful for assigning the frame a priority. VID 0xfff
                     (4,095) is reserved.

       See eth_type for illustrations of a complete Ethernet frame with 802.1Q tag included.

   Multiple VLANs
       Open vSwitch can match only a single VLAN header. If more than one VLAN header is present,
       then  eth_type  holds  the  TPID  of the inner VLAN header. Open vSwitch stops parsing the
       packet after the inner TPID, so matching further into the packet (e.g. on the inner TCI or
       L3 fields) is not possible.

       OpenFlow  only  directly supports matching a single VLAN header. In OpenFlow 1.1 or later,
       one OpenFlow table can match on the outermost VLAN header and pop  it  off,  and  a  later
       OpenFlow table can match on the next outermost header. Open vSwitch does not support this.

   VLAN Field Details
       The four variants have three different levels of expressiveness: OpenFlow 1.0 and 1.1 VLAN
       matching are less powerful than OpenFlow 1.2+ VLAN matching, which is less  powerful  than
       Open vSwitch extension VLAN matching.

   OpenFlow 1.0 VLAN Fields
       OpenFlow  1.0 uses two fields, called dl_vlan and dl_vlan_pcp, each of which can be either
       exact-matched or wildcarded, to specify VLAN matches:

              •      When both dl_vlan and dl_vlan_pcp are wildcarded, the flow  matches  packets
                     without an 802.1Q header or with any 802.1Q header.

              •      The  match  dl_vlan=0xffff  causes  a  flow to match only packets without an
                     802.1Q header. Such a flow should also wildcard dl_vlan_pcp, since a  packet
                     without an 802.1Q header does not have a PCP. OpenFlow does not specify what
                     to do if a match on PCP is actually present, but Open vSwitch ignores it.

              •      Otherwise, the flow matches only packets with an 802.1Q header.  If  dl_vlan
                     is  not  wildcarded,  then  the  flow  only matches packets with the VLAN ID
                     specified in dl_vlan’s low 12 bits. If dl_vlan_pcp is not  wildcarded,  then
                     the  flow  only matches packets with the priority specified in dl_vlan_pcp’s
                     low 3 bits.

                     OpenFlow does not specify how to interpret the high 4 bits of dl_vlan or the
                     high 5 bits of dl_vlan_pcp. Open vSwitch ignores them.

   OpenFlow 1.1 VLAN Fields
       VLAN  matching in OpenFlow 1.1 is similar to OpenFlow 1.0. The one refinement is that when
       dl_vlan matches on 0xfffe (OFVPID_ANY), the flow  matches  only  packets  with  an  802.1Q
       header,  with  any VLAN ID. If dl_vlan_pcp is wildcarded, the flow matches any packet with
       an 802.1Q header, regardless of VLAN ID or priority. If  dl_vlan_pcp  is  not  wildcarded,
       then  the  flow  only  matches  packets with the priority specified in dl_vlan_pcp’s low 3
       bits.

       OpenFlow 1.1 uses the name OFPVID_NONE, instead of OFP_VLAN_NONE, for a dl_vlan of 0xffff,
       but it has the same meaning.

       In  OpenFlow  1.1,  Open vSwitch reports error OFPBMC_BAD_VALUE for an attempt to match on
       dl_vlan between 4,096 and 0xfffd, inclusive, or dl_vlan_pcp greater than 7.

   OpenFlow 1.2 VLAN Fields
       OpenFlow 1.2+ VLAN ID Field

       Name:            vlan_vid

       Width:           16 bits (only the least-significant 12 bits may be nonzero)
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   Ethernet
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_VLAN_VID (6) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             none

       The OpenFlow standard describes this field as consisting of ``12+1’’ bits. On ingress, its
       value  is  0  if  no  802.1Q header is present, and otherwise it holds the VLAN VID in its
       least significant 12 bits, with bit 12 (0x1000 aka OFPVID_PRESENT)  also  set  to  1.  The
       three most significant bits are always zero:

        OXM_OF_VLAN_VID
        <------------->
         3  1     12
       +---+--+--------+
       |   |P |VLAN ID |
       +---+--+--------+
         0

       As a consequence of this field’s format, one may use it to match the VLAN ID in all of the
       ways available with the OpenFlow 1.0 and 1.1 formats, and a few new ways:

              Fully wildcarded
                     Matches any packet, that is, one without an 802.1Q header or with an  802.1Q
                     header with any TCI value.

              Value 0x0000 (OFPVID_NONE), mask 0xffff (or no mask)
                     Matches only packets without an 802.1Q header.

              Value 0x1000, mask 0x1000
                     Matches any packet with an 802.1Q header, regardless of VLAN ID.

              Value 0x1009, mask 0xffff (or no mask)
                     Match only packets with an 802.1Q header with VLAN ID 9.

              Value 0x1001, mask 0x1001
                     Matches  only  packets  that have an 802.1Q header with an odd-numbered VLAN
                     ID. (This is just an example; one can match  on  any  desired  VLAN  ID  bit
                     pattern.)

       OpenFlow 1.2+ VLAN Priority Field

       Name:            vlan_pcp

       Width:           8 bits (only the least-significant 3 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   VLAN VID
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_VLAN_PCP (7) since OpenFlow 1.2 and Open vSwitch 1.7

       NXM:             none

       The  3 least significant bits may be used to match the PCP bits in an 802.1Q header. Other
       bits are always zero:

        OXM_OF_VLAN_VID
        <------------->
           5       3
       +--------+------+
       |  zero  | PCP  |
       +--------+------+
           0

       This field may only be used when vlan_vid is not wildcarded and does not exact match on  0
       (which only matches when there is no 802.1Q header).

       See VLAN Comparison Chart, below, for some examples.

   Open vSwitch Extension VLAN Field
       The vlan_tci extension can describe more kinds of VLAN matches than the other variants. It
       is also simpler than the other variants.

       VLAN TCI Field

       Name:            vlan_tci

       Width:           16 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   Ethernet
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             none

       NXM:             NXM_OF_VLAN_TCI (4) since Open vSwitch 1.1

       For a packet without an 802.1Q header, this field is zero. For a  packet  with  an  802.1Q
       header,  this  field  is  the TCI with the bit in CFI’s position (marked P for ``present’’
       below) forced to 1. Thus, for a packet in VLAN 9 with priority 7, it has the value 0xf009:

        NXM_VLAN_TCI
        <---------->
         3   1   12
       +----+--+----+
       |PCP |P |VID |
       +----+--+----+
         7   1   9

       Usage examples:

              vlan_tci=0
                     Match packets without an 802.1Q header.

              vlan_tci=0x1000/0x1000
                     Match packets with an 802.1Q header, regardless of VLAN and priority values.

              vlan_tci=0xf123
                     Match packets tagged with priority 7 in VLAN 0x123.

              vlan_tci=0x1123/0x1fff
                     Match packets tagged with VLAN 0x123 (and any priority).

              vlan_tci=0x5000/0xf000
                     Match packets tagged with priority 2 (in any VLAN).

              vlan_tci=0/0xfff
                     Match packets with  no  802.1Q  header  or  tagged  with  VLAN  0  (and  any
                     priority).

              vlan_tci=0x5000/0xe000
                     Match packets with no 802.1Q header or tagged with priority 2 (in any VLAN).

              vlan_tci=0/0xefff
                     Match packets with no 802.1Q header or tagged with VLAN 0 and priority 0.

       See VLAN Comparison Chart, below, for more examples.

   VLAN Comparison Chart
       The  following table describes each of several possible matching criteria on 802.1Q header
       may be expressed with each variation of the VLAN matching fields:

       Criteria        OpenFlow 1.0    OpenFlow 1.1    OpenFlow 1.2+   NXM
                                             _      _      _      _      _
           [1]     ????/1,??/?     ????/1,??/?     0000/0000,--  0000/0000
           [2]     ffff/0,??/?     ffff/0,??/?     0000/ffff,--  0000/ffff
           [3]     0xxx/0,??/1     0xxx/0,??/1     1xxx/ffff,--  1xxx/1fff
           [4]     ????/1,0y/0     fffe/0,0y/0     1000/1000,0y  z000/f000
           [5]     0xxx/0,0y/0     0xxx/0,0y/0     1xxx/ffff,0y  zxxx/ffff

                           [6]     (none)  (none)  1001/1001,--  1001/1001
                                 [7]     (none)  (none)  (none)  3000/3000
                                 [8]     (none)  (none)  (none)  0000/0fff
                                 [9]     (none)  (none)  (none)  0000/f000
                                 [10]    (none)  (none)  (none)  0000/efff

       All numbers in the table are expressed in  hexadecimal.  The  columns  in  the  table  are
       interpreted as follows:

              Criteria
                     See the list below.

              OpenFlow 1.0
              OpenFlow 1.1
                   wwww/x,yy/z  means  VLAN  ID match value wwww with wildcard bit x and VLAN PCP
                   match value yy with wildcard bit z. ? means that the given  bits  are  ignored
                   (and conventionally 0 for wwww or yy, conventionally 1 for x or z). ``(none)’’
                   means that OpenFlow 1.0 (or 1.1) cannot match with these criteria.

              OpenFlow 1.2+
                   xxxx/yyyy,zz means vlan_vid with value xxxx and mask yyyy, and vlan_pcp (which
                   is  not maskable) with value zz. -- means that vlan_pcp is omitted. ``(none)’’
                   means that OpenFlow 1.2 cannot match with these criteria.

              NXM  xxxx/yyyy means vlan_tci with value xxxx and mask yyyy.

       The matching criteria described by the table are:

              [1]    Matches any packet, that is, one without an 802.1Q header or with an  802.1Q
                     header with any TCI value.

              [2]    Matches only packets without an 802.1Q header.

                     OpenFlow  1.0  doesn’t  define  the behavior if dl_vlan is set to 0xffff and
                     dl_vlan_pcp is not wildcarded. (Open vSwitch always ignores dl_vlan_pcp when
                     dl_vlan is set to 0xffff.)

                     OpenFlow  1.1  says  explicitly to ignore dl_vlan_pcp when dl_vlan is set to
                     0xffff.

                     OpenFlow 1.2 doesn’t say how to interpret a match with vlan_vid value 0  and
                     a mask with OFPVID_PRESENT (0x1000) set to 1 and some other bits in the mask
                     set to 1 also. Open vSwitch interprets it the same way as a mask of 0x1000.

                     Any NXM match with vlan_tci value 0 and the CFI bit set to 1 in the mask  is
                     equivalent to the one listed in the table.

              [3]    Matches only packets that have an 802.1Q header with VID xxx (and any PCP).

              [4]    Matches only packets that have an 802.1Q header with PCP y (and any VID).

                     OpenFlow 1.0 doesn’t clearly define the behavior for this case. Open vSwitch
                     implements it this way.

                     In the NXM value, z equals (y << 1) | 1.

              [5]    Matches only packets that have an 802.1Q header with VID xxx and PCP y.

                     In the NXM value, z equals (y << 1) | 1.

              [6]    Matches only packets that have an 802.1Q header  with  an  odd-numbered  VID
                     (and  any  PCP).  Only  possible with OpenFlow 1.2 and NXM. (This is just an
                     example; one can match on any desired VID bit pattern.)

              [7]    Matches only packets that have an 802.1Q header  with  an  odd-numbered  PCP
                     (and  any  VID).  Only  possible with NXM. (This is just an example; one can
                     match on any desired VID bit pattern.)

              [8]    Matches packets with no 802.1Q header or with an 802.1Q header with a VID of
                     0. Only possible with NXM.

              [9]    Matches packets with no 802.1Q header or with an 802.1Q header with a PCP of
                     0. Only possible with NXM.

              [10]   Matches packets with no 802.1Q header or with an 802.1Q header with both VID
                     and PCP of 0. Only possible with NXM.

LAYER 2.5: MPLS FIELDS

   Summary:
       Name         Bytes             Mask   RW?   Prereqs   NXM/OXM Support

       ───────────  ────────────────  ─────  ────  ────────  ──────────────────────
       mpls_label   4 (low 20 bits)   no     yes   MPLS      OF 1.2+ and OVS 1.11+
       mpls_tc      1 (low 3 bits)    no     yes   MPLS      OF 1.2+ and OVS 1.11+

       mpls_bos     1 (low 1 bits)    no     no    MPLS      OF 1.3+ and OVS 1.11+
       mpls_ttl     1                 no     yes   MPLS      OVS 2.6+

       One  or more MPLS headers (more commonly called MPLS labels) follow an Ethernet type field
       that specifies an MPLS Ethernet type [RFC 3032]. Ethertype 0x8847 is used for all unicast.
       Multicast  MPLS  is  divided into two specific classes, one of which uses Ethertype 0x8847
       and the other 0x8848 [RFC 5332].

       The most common overall packet format is Ethernet II, shown below (SNAP encapsulation  may
       be used but is not ordinarily seen in Ethernet networks):

           Ethernet           MPLS
        <------------>   <------------>
        48  48    16      20   3  1  8
       +---+---+------+ +-----+--+-+---+
       |dst|src| type | |label|TC|S|TTL| ...
       +---+---+------+ +-----+--+-+---+
                0x8847

       MPLS can be encapsulated inside an 802.1Q header, in which case the combination looks like
       this:

        Ethernet     802.1Q     Ethertype        MPLS
        <------>   <-------->   <------->   <------------>
         48  48      16   16       16        20   3  1  8
       +----+---+ +------+---+ +---------+ +-----+--+-+---+
       |dst |src| | TPID |TCI| |  type   | |label|TC|S|TTL| ...
       +----+---+ +------+---+ +---------+ +-----+--+-+---+
                   0x8100        0x8847

       The fields within an MPLS label are:

              Label, 20 bits.
                     An identifier.

              Traffic control (TC), 3 bits.
                     Used for quality of service.

              Bottom of stack (BOS), 1 bit (labeled just ``S’’ above).
                     0 indicates that another MPLS label follows this one.

                     1 indicates that this MPLS label is the last one in the stack, so that  some
                     other protocol follows this one.

              Time to live (TTL), 8 bits.
                     Each  hop  across  an MPLS network decrements the TTL by 1. If it reaches 0,
                     the packet is discarded.

                     OpenFlow does not make the MPLS TTL available as a match field, but  actions
                     are available to set and decrement the TTL. Open vSwitch 2.6 and later makes
                     the MPLS TTL available as an extension.

   MPLS Label Stacks
       Unlike the other encapsulations supported by OpenFlow and Open vSwitch,  MPLS  labels  are
       routinely  used  in  ``stacks’’  two or three deep and sometimes even deeper. Open vSwitch
       currently supports up to three labels.

       The OpenFlow specification only supports matching on the outermost MPLS label at any given
       time.  To match on the second label, one must first ``pop’’ the outer label and advance to
       another OpenFlow table, where the inner label may be matched. To match on the third label,
       one must pop the two outer labels, and so on.

   MPLS Inner Protocol
       Unlike  all  other  forms of encapsulation that Open vSwitch and OpenFlow support, an MPLS
       label does not  indicate  what  inner  protocol  it  encapsulates.  Different  deployments
       determine the inner protocol in different ways [RFC 3032]:

              •      A  few  reserved  label  values  do indicate an inner protocol. Label 0, the
                     ``IPv4 Explicit NULL Label,’’ indicates inner  IPv4.  Label  2,  the  ``IPv6
                     Explicit NULL Label,’’ indicates inner IPv6.

              •      Some deployments use a single inner protocol consistently.

              •      In  some deployments, the inner protocol must be inferred from the innermost
                     label.

              •      In some deployments, the inner protocol must be inferred from the  innermost
                     label  and the encapsulated data, e.g. to distinguish between inner IPv4 and
                     IPv6 based on whether the first nibble of the inner protocol data are  4  or
                     6. OpenFlow and Open vSwitch do not currently support these cases.

       Open  vSwitch  and OpenFlow do not infer the inner protocol, even if reserved label values
       are in use. Instead, the flow table must specify the inner protocol at the  time  it  pops
       the bottommost MPLS label, using the Ethertype argument to the pop_mpls action.

   Field Details
       MPLS Label Field

       Name:            mpls_label
       Width:           32 bits (only the least-significant 20 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   MPLS
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_MPLS_LABEL (34) since OpenFlow 1.2 and Open vSwitch 1.11
       NXM:             none

       The least significant 20 bits hold the ``label’’ field from the MPLS label. Other bits are
       zero:

        OXM_OF_MPLS_LABEL
        <--------------->
           12       20
       +--------+--------+
       |  zero  | label  |
       +--------+--------+
           0

       Most label values are available for any use by deployments. Values under 16 are reserved.

       MPLS Traffic Class Field

       Name:            mpls_tc
       Width:           8 bits (only the least-significant 3 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   MPLS
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_MPLS_TC (35) since OpenFlow 1.2 and Open vSwitch 1.11
       NXM:             none

       The least significant 3 bits hold the TC field from the MPLS label. Other bits are zero:

        OXM_OF_MPLS_TC
        <------------>
           5       3
       +--------+-----+
       |  zero  | TC  |
       +--------+-----+
           0

       This field is intended for use for  Quality  of  Service  (QoS)  and  Explicit  Congestion
       Notification purposes, but its particular interpretation is deployment specific.

       Before 2009, this field was named EXP and reserved for experimental use [RFC 5462].

       MPLS Bottom of Stack Field

       Name:            mpls_bos
       Width:           8 bits (only the least-significant 1 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   MPLS
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             OXM_OF_MPLS_BOS (36) since OpenFlow 1.3 and Open vSwitch 1.11
       NXM:             none

       The least significant bit holds the BOS field from the MPLS label. Other bits are zero:

        OXM_OF_MPLS_BOS
        <------------->
           7       1
       +--------+------+
       |  zero  | BOS  |
       +--------+------+
           0

       This  field  is useful as part of processing a series of incoming MPLS labels. A flow that
       includes a pop_mpls action should generally match on mpls_bos:

              •      When mpls_bos is 0, there is another MPLS label following this one,  so  the
                     Ethertype  passed  to  pop_mpls  should  be  an MPLS Ethertype. For example:
                     table=0, dl_type=0x8847, mpls_bos=0, actions=pop_mpls:0x8847, goto_table:1

              •      When mpls_bos is 1, this MPLS label is the last one, so the Ethertype passed
                     to  pop_mpls  should  be  a  non-MPLS  Ethertype  such as IPv4. For example:
                     table=1, dl_type=0x8847, mpls_bos=1, actions=pop_mpls:0x0800, goto_table:2

       MPLS Time-to-Live Field

       Name:            mpls_ttl
       Width:           8 bits

       Format:          decimal
       Masking:         not maskable
       Prerequisites:   MPLS
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_MPLS_TTL (30) since Open vSwitch 2.6

       Holds the 8-bit time-to-live field from the MPLS label:

        NXM_NX_MPLS_TTL
        <------------->
               8
       +---------------+
       |      TTL      |
       +---------------+

LAYER 3: IPV4 AND IPV6 FIELDS

   Summary:
       Name                    Bytes             Mask   RW?   Prereqs     NXM/OXM Support
       ──────────────────────  ────────────────  ─────  ────  ──────────  ─────────────────────
       ip_src aka nw_src       4                 yes    yes   IPv4        OF 1.2+ and OVS 1.1+
       ip_dst aka nw_dst       4                 yes    yes   IPv4        OF 1.2+ and OVS 1.1+

       ipv6_src                16                yes    yes   IPv6        OF 1.2+ and OVS 1.1+
       ipv6_dst                16                yes    yes   IPv6        OF 1.2+ and OVS 1.1+
       ipv6_label              4 (low 20 bits)   yes    yes   IPv6        OF 1.2+ and OVS 1.4+
       nw_proto aka ip_proto   1                 no     no    IPv4/IPv6   OF 1.2+ and OVS 1.1+
       nw_ttl                  1                 no     yes   IPv4/IPv6   OVS 1.4+
       ip_frag aka nw_frag     1 (low 2 bits)    yes    no    IPv4/IPv6   OVS 1.3+
       nw_tos                  1                 no     yes   IPv4/IPv6   OVS 1.1+

       ip_dscp                 1 (low 6 bits)    no     yes   IPv4/IPv6   OF 1.2+ and OVS 1.7+
       nw_ecn aka ip_ecn       1 (low 2 bits)    no     yes   IPv4/IPv6   OF 1.2+ and OVS 1.4+

   IPv4 Specific Fields
       These fields are applicable only to IPv4 flows, that is, flows  that  match  on  the  IPv4
       Ethertype 0x0800.

       IPv4 Source Address Field

       Name:            ip_src (aka nw_src)
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks
       Prerequisites:   IPv4
       Access:          read/write

       OpenFlow 1.0:    yes (CIDR match only)
       OpenFlow 1.1:    yes
       OXM:             OXM_OF_IPV4_SRC (11) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_IP_SRC (7) since Open vSwitch 1.1

       The source address from the IPv4 header:

          Ethernet            IPv4
        <----------->   <--------------->
        48  48   16           8   32  32
       +---+---+-----+ +---+-----+---+---+
       |dst|src|type | |...|proto|src|dst| ...
       +---+---+-----+ +---+-----+---+---+
                0x800

       For  historical reasons, in an ARP or RARP flow, Open vSwitch interprets matches on nw_src
       as actually referring to the ARP SPA.

       IPv4 Destination Address Field

       Name:            ip_dst (aka nw_dst)
       Width:           32 bits

       Format:          IPv4
       Masking:         arbitrary bitwise masks
       Prerequisites:   IPv4
       Access:          read/write
       OpenFlow 1.0:    yes (CIDR match only)
       OpenFlow 1.1:    yes
       OXM:             OXM_OF_IPV4_DST (12) since OpenFlow 1.2 and Open vSwitch 1.7

       NXM:             NXM_OF_IP_DST (8) since Open vSwitch 1.1

       The destination address from the IPv4 header:

          Ethernet            IPv4
        <----------->   <--------------->
        48  48   16           8   32  32
       +---+---+-----+ +---+-----+---+---+
       |dst|src|type | |...|proto|src|dst| ...
       +---+---+-----+ +---+-----+---+---+
                0x800

       For historical reasons, in an ARP or RARP flow, Open vSwitch interprets matches on  nw_dst
       as actually referring to the ARP TPA.

   IPv6 Specific Fields
       These  fields  apply  only  to IPv6 flows, that is, flows that match on the IPv6 Ethertype
       0x86dd.

       IPv6 Source Address Field

       Name:            ipv6_src

       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks
       Prerequisites:   IPv6
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             OXM_OF_IPV6_SRC (26) since OpenFlow 1.2 and Open vSwitch 1.1
       NXM:             NXM_NX_IPV6_SRC (19) since Open vSwitch 1.1

       The source address from the IPv6 header:

           Ethernet            IPv6
        <------------>   <-------------->
        48  48    16          8   128 128
       +---+---+------+ +---+----+---+---+
       |dst|src| type | |...|next|src|dst| ...
       +---+---+------+ +---+----+---+---+
                0x86dd

       Open vSwitch 1.8 added support for bitwise matching; earlier versions supported only  CIDR
       masks.

       IPv6 Destination Address Field

       Name:            ipv6_dst
       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks

       Prerequisites:   IPv6
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_IPV6_DST (27) since OpenFlow 1.2 and Open vSwitch 1.1
       NXM:             NXM_NX_IPV6_DST (20) since Open vSwitch 1.1

       The destination address from the IPv6 header:

           Ethernet            IPv6
        <------------>   <-------------->
        48  48    16          8   128 128
       +---+---+------+ +---+----+---+---+
       |dst|src| type | |...|next|src|dst| ...
       +---+---+------+ +---+----+---+---+
                0x86dd

       Open  vSwitch 1.8 added support for bitwise matching; earlier versions supported only CIDR
       masks.

       IPv6 Flow Label Field

       Name:            ipv6_label
       Width:           32 bits (only the least-significant 20 bits may be nonzero)
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   IPv6
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_IPV6_FLABEL (28) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_IPV6_LABEL (27) since Open vSwitch 1.4

       The least significant 20 bits hold the flow label field from the IPv6 header.  Other  bits
       are zero:

        OXM_OF_IPV6_FLABEL
        <---------------->
           12       20
       +--------+---------+
       |  zero  |  label  |
       +--------+---------+
           0

   IPv4/IPv6 Fields
       These  fields exist with at least approximately the same meaning in both IPv4 and IPv6, so
       they are treated as a single field for matching purposes. Any flow  that  matches  on  the
       IPv4 Ethertype 0x0800 or the IPv6 Ethertype 0x86dd may match on these fields.

       IPv4/v6 Protocol Field

       Name:            nw_proto (aka ip_proto)
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   IPv4/IPv6
       Access:          read-only
       OpenFlow 1.0:    yes (exact match only)

       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_IP_PROTO (10) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_IP_PROTO (6) since Open vSwitch 1.1

       Matches the IPv4 or IPv6 protocol type.

       For  historical  reasons,  in  an  ARP  or  RARP  flow, Open vSwitch interprets matches on
       nw_proto as actually referring to the ARP opcode. The ARP opcode is a 16-bit field, so for
       matching  purposes  ARP  opcodes  greater than 255 are treated as 0; this works adequately
       because in practice ARP and RARP only use opcodes 1 through 4.

       In the case of fragmented traffic, a difference exists in the way the field acts for  IPv4
       and  IPv6  later fragments. For IPv6 fragments with nonzero offset, nw_proto is set to the
       IPv6 protocol type for fragments (44). Conversely, for IPv4 later fragments, the field  is
       set based on the protocol type present in the header.

       IPv4/v6 TTL/Hop Limit Field

       Name:            nw_ttl
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   IPv4/IPv6

       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_IP_TTL (29) since Open vSwitch 1.4

       The  main  reason  to  match  on the TTL or hop limit field is to detect whether a dec_ttl
       action will fail due to a TTL exceeded error. Another way that a controller can detect TTL
       exceeded is to listen for OFPR_INVALID_TTL ``packet-in’’ messages via OpenFlow.

       IPv4/v6 Fragment Bitmask Field

       Name:            ip_frag (aka nw_frag)
       Width:           8 bits (only the least-significant 2 bits may be nonzero)
       Format:          frag

       Masking:         arbitrary bitwise masks
       Prerequisites:   IPv4/IPv6
       Access:          read-only
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXM_NX_IP_FRAG (26) since Open vSwitch 1.3

       Specifies  what  kinds of IP fragments or non-fragments to match. The value for this field
       is most conveniently specified as one of the following:

              no     Match only non-fragmented packets.

              yes    Matches all fragments.

              first  Matches only fragments with offset 0.

              later  Matches only fragments with nonzero offset.

              not_later
                     Matches non-fragmented packets and fragments with zero offset.

       The field is internally formatted as 2 bits: bit 0 is 1 for an IP fragment with any offset
       (and  otherwise  0),  and bit 1 is 1 for an IP fragment with nonzero offset (and otherwise
       0), like so:

        NXM_NX_IP_FRAG
        <------------>
         6     1    1
       +----+-----+---+
       |zero|later|any|
       +----+-----+---+
         0

       Even though 2 bits have 4 possible values, this field only uses 3 of them:

              •      A packet that is not an IP fragment has value 0.

              •      A packet that is an IP fragment with offset 0 (the first fragment) has bit 0
                     set and thus value 1.

              •      A packet that is an IP fragment with nonzero offset has bits 0 and 1 set and
                     thus value 3.

       The switch may reject matches against values that can never appear.

       It is important to understand how this field interacts with the OpenFlow fragment handling
       mode:

              •      In  OFPC_FRAG_DROP  mode,  the OpenFlow switch drops all IP fragments before
                     they reach the flow table, so every packet that is  available  for  matching
                     will have value 0 in this field.

              •      Open  vSwitch does not implement OFPC_FRAG_REASM mode, but if it did then IP
                     fragments would be reassembled before they reached the flow table and  again
                     every packet available for matching would always have value 0.

              •      In  OFPC_FRAG_NORMAL  mode,  all three values are possible, but OpenFlow 1.0
                     says that fragments’ transport ports  are  always  0,  even  for  the  first
                     fragment, so this does not provide much extra information.

              •      In  OFPC_FRAG_NX_MATCH  mode,  all  three values are possible. For fragments
                     with offset 0, Open vSwitch makes L4 header information available.

       Thus, this field is likely to be most useful for an  Open  vSwitch  switch  configured  in
       OFPC_FRAG_NX_MATCH mode. See the description of the set-frags command in ovs-ofctl(8), for
       more details.

     IPv4/IPv6 TOS Fields

       IPv4 and IPv6 contain a one-byte ``type of service’’ or TOS field that has  the  following
       format:

        type of service
        <------------->
           6       2
       +--------+------+
       |  DSCP  | ECN  |
       +--------+------+

       IPv4/v6 DSCP (Bits 2-7) Field

       Name:            nw_tos
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable

       Prerequisites:   IPv4/IPv6
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             none
       NXM:             NXM_OF_IP_TOS (5) since Open vSwitch 1.1

       This field is the TOS byte with the two ECN bits cleared to 0:

        NXM_OF_IP_TOS
        <----------->
          6      2
       +------+------+
       | DSCP | zero |
       +------+------+
                 0

       IPv4/v6 DSCP (Bits 0-5) Field

       Name:            ip_dscp
       Width:           8 bits (only the least-significant 6 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   IPv4/IPv6
       Access:          read/write

       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_IP_DSCP (8) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             none

       This  field  is the TOS byte shifted right to put the DSCP bits in the 6 least-significant
       bits:

        OXM_OF_IP_DSCP
        <------------>
           2      6
       +-------+------+
       | zero  | DSCP |
       +-------+------+
           0

       IPv4/v6 ECN Field

       Name:            nw_ecn (aka ip_ecn)
       Width:           8 bits (only the least-significant 2 bits may be nonzero)
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   IPv4/IPv6
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_IP_ECN (9) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_IP_ECN (28) since Open vSwitch 1.4

       This field is the TOS byte with the DSCP bits cleared to 0:

        OXM_OF_IP_ECN
        <----------->
           6      2
       +-------+-----+
       | zero  | ECN |
       +-------+-----+
           0

LAYER 3: ARP FIELDS

   Summary:
       Name      Bytes   Mask   RW?   Prereqs   NXM/OXM Support

       ────────  ──────  ─────  ────  ────────  ─────────────────────
       arp_op    2       no     yes   ARP       OF 1.2+ and OVS 1.1+
       arp_spa   4       yes    yes   ARP       OF 1.2+ and OVS 1.1+
       arp_tpa   4       yes    yes   ARP       OF 1.2+ and OVS 1.1+

       arp_sha   6       yes    yes   ARP       OF 1.2+ and OVS 1.1+
       arp_tha   6       yes    yes   ARP       OF 1.2+ and OVS 1.1+

       In theory, Address Resolution Protocol, or ARP, is a  generic  protocol  generic  protocol
       that  can  be  used  to  obtain  the hardware address that corresponds to any higher-level
       protocol address. In contemporary usage, ARP is used only in Ethernet networks  to  obtain
       the Ethernet address for a given IPv4 address. OpenFlow and Open vSwitch only support this
       usage of ARP. For this use case, an ARP packet has the  following  format,  with  the  ARP
       fields exposed as Open vSwitch fields highlighted:

          Ethernet                      ARP
        <----------->   <---------------------------------->
        48  48   16     16   16    8   8  16 48  16  48  16
       +---+---+-----+ +---+-----+---+---+--+---+---+---+---+
       |dst|src|type | |hrd| pro |hln|pln|op|sha|spa|tha|tpa|
       +---+---+-----+ +---+-----+---+---+--+---+---+---+---+
                0x806    1  0x800  6   4

       The  ARP  fields  are  also  used for RARP, the Reverse Address Resolution Protocol, which
       shares ARP’s wire format.

       ARP Opcode Field

       Name:            arp_op
       Width:           16 bits
       Format:          decimal
       Masking:         not maskable

       Prerequisites:   ARP
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_ARP_OP (21) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ARP_OP (15) since Open vSwitch 1.1

       Even though this is a 16-bit field, Open vSwitch does not support ARP opcodes greater than
       255;  it  treats them to zero. This works adequately because in practice ARP and RARP only
       use opcodes 1 through 4.

       ARP Source IPv4 Address Field

       Name:            arp_spa
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks

       Prerequisites:   ARP
       Access:          read/write
       OpenFlow 1.0:    yes (CIDR match only)
       OpenFlow 1.1:    yes

       OXM:             OXM_OF_ARP_SPA (22) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ARP_SPA (16) since Open vSwitch 1.1

       ARP Target IPv4 Address Field

       Name:            arp_tpa
       Width:           32 bits
       Format:          IPv4
       Masking:         arbitrary bitwise masks

       Prerequisites:   ARP
       Access:          read/write
       OpenFlow 1.0:    yes (CIDR match only)
       OpenFlow 1.1:    yes

       OXM:             OXM_OF_ARP_TPA (23) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ARP_TPA (17) since Open vSwitch 1.1

       ARP Source Ethernet Address Field

       Name:            arp_sha
       Width:           48 bits
       Format:          Ethernet
       Masking:         arbitrary bitwise masks

       Prerequisites:   ARP
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             OXM_OF_ARP_SHA (24) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ARP_SHA (17) since Open vSwitch 1.1

       ARP Target Ethernet Address Field

       Name:            arp_tha
       Width:           48 bits
       Format:          Ethernet
       Masking:         arbitrary bitwise masks

       Prerequisites:   ARP
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             OXM_OF_ARP_THA (25) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ARP_THA (18) since Open vSwitch 1.1

LAYER 3: NSH FIELDS

   Summary:
       Name               Bytes             Mask   RW?   Prereqs   NXM/OXM Support

       ─────────────────  ────────────────  ─────  ────  ────────  ────────────────
       nsh_flags          1                 yes    yes   NSH       OVS 2.8+
       nsh_ttl            1                 no     yes   NSH       OVS 2.9+
       nsh_mdtype         1                 no     no    NSH       OVS 2.8+

       nsh_np             1                 no     no    NSH       OVS 2.8+
       nsh_spi aka nsp    4 (low 24 bits)   no     yes   NSH       OVS 2.8+
       nsh_si aka nsi     1                 no     yes   NSH       OVS 2.8+
       nsh_c1 aka nshc1   4                 yes    yes   NSH       OVS 2.8+

       nsh_c2 aka nshc2   4                 yes    yes   NSH       OVS 2.8+
       nsh_c3 aka nshc3   4                 yes    yes   NSH       OVS 2.8+
       nsh_c4 aka nshc4   4                 yes    yes   NSH       OVS 2.8+

       Service functions are widely deployed  and  essential  in  many  networks.  These  service
       functions  provide a range of features such as security, WAN acceleration, and server load
       balancing. Service functions may be  instantiated  at  different  points  in  the  network
       infrastructure such as the wide area network, data center, and so forth.

       Prior to development of the SFC architecture [RFC 7665] and the protocol specified in this
       document, current service function deployment models have been relatively static and bound
       to  topology  for  insertion  and policy selection. Furthermore, they do not adapt well to
       elastic service environments enabled by virtualization.

       New data center network and cloud architectures require  more  flexible  service  function
       deployment  models.  Additionally,  the  transition  to virtual platforms demands an agile
       service insertion model that supports dynamic and elastic service delivery.  Specifically,
       the following functions are necessary:

              1.  The movement of service functions and application workloads in the network.

              2.  The ability to easily bind service policy to granular information, such as per-
                  subscriber state.

              3.  The capability to steer traffic to the requisite service function(s).

       The Network Service Header (NSH) specification defines a new data plane protocol, which is
       an  encapsulation  for  service  function  chains.  The  NSH is designed to encapsulate an
       original packet or frame, and in turn be encapsulated by an outer transport  encapsulation
       (which is used to deliver the NSH to NSH-aware network elements), as shown below:

       +-----------------------+----------------------------+---------------------+
       |Transport Encapsulation|Network Service Header (NSH)|Original Packet/Frame|
       +-----------------------+----------------------------+---------------------+

       The NSH is composed of the following elements:

              1.  Service Function Path identification.

              2.  Indication of location within a Service Function Path.

              3.  Optional, per packet metadata (fixed length or variable).

       [RFC  7665]  provides  an overview of a service chaining architecture that clearly defines
       the roles  of  the  various  elements  and  the  scope  of  a  service  function  chaining
       encapsulation.  Figure  3  of  [RFC  7665]  depicts the SFC architectural components after
       classification. The NSH is the SFC encapsulation referenced in [RFC 7665].

       flags field (2 bits) Field

       Name:            nsh_flags
       Width:           8 bits

       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   NSH
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             none
       NXM:             NXOXM_NSH_FLAGS (1) since Open vSwitch 2.8

       TTL field (6 bits) Field

       Name:            nsh_ttl

       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   NSH
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_TTL (10) since Open vSwitch 2.9

       mdtype field (8 bits) Field

       Name:            nsh_mdtype
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   NSH
       Access:          read-only

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_MDTYPE (2) since Open vSwitch 2.8

       np (next protocol) field (8 bits) Field

       Name:            nsh_np
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   NSH
       Access:          read-only

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_NP (3) since Open vSwitch 2.8

       spi (service path identifier) field (24 bits) Field

       Name:            nsh_spi (aka nsp)
       Width:           32 bits (only the least-significant 24 bits may be nonzero)
       Format:          hexadecimal
       Masking:         not maskable
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_SPI (4) since Open vSwitch 2.8

       si (service index) field (8 bits) Field

       Name:            nsh_si (aka nsi)
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_SI (5) since Open vSwitch 2.8

       c1 (Network Platform Context) field (32 bits) Field

       Name:            nsh_c1 (aka nshc1)
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_C1 (6) since Open vSwitch 2.8

       c2 (Network Shared Context) field (32 bits) Field

       Name:            nsh_c2 (aka nshc2)
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_C2 (7) since Open vSwitch 2.8

       c3 (Service Platform Context) field (32 bits) Field

       Name:            nsh_c3 (aka nshc3)
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_C3 (8) since Open vSwitch 2.8

       c4 (Service Shared Context) field (32 bits) Field

       Name:            nsh_c4 (aka nshc4)
       Width:           32 bits
       Format:          hexadecimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   NSH
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none
       NXM:             NXOXM_NSH_C4 (9) since Open vSwitch 2.8

LAYER 4: TCP, UDP, AND SCTP FIELDS

   Summary:
       Name                 Bytes             Mask   RW?   Prereqs   NXM/OXM Support

       ───────────────────  ────────────────  ─────  ────  ────────  ─────────────────────
       tcp_src aka tp_src   2                 yes    yes   TCP       OF 1.2+ and OVS 1.1+
       tcp_dst aka tp_dst   2                 yes    yes   TCP       OF 1.2+ and OVS 1.1+
       tcp_flags            2 (low 12 bits)   yes    no    TCP       OF 1.3+ and OVS 2.1+

       udp_src              2                 yes    yes   UDP       OF 1.2+ and OVS 1.1+
       udp_dst              2                 yes    yes   UDP       OF 1.2+ and OVS 1.1+
       sctp_src             2                 yes    yes   SCTP      OF 1.2+ and OVS 2.0+
       sctp_dst             2                 yes    yes   SCTP      OF 1.2+ and OVS 2.0+

       For matching purposes, no distinction is made whether  these  protocols  are  encapsulated
       within IPv4 or IPv6.

   TCP
       The  following diagram shows TCP within IPv4. Open vSwitch also supports TCP in IPv6. Only
       TCP fields implemented as Open vSwitch fields are shown:

          Ethernet            IPv4                   TCP
        <----------->   <--------------->   <------------------->
        48  48   16           8   32  32    16  16       12
       +---+---+-----+ +---+-----+---+---+ +---+---+---+-----+---+
       |dst|src|type | |...|proto|src|dst| |src|dst|...|flags|...| ...
       +---+---+-----+ +---+-----+---+---+ +---+---+---+-----+---+
                0x800         6

       TCP Source Port Field

       Name:            tcp_src (aka tp_src)
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   TCP

       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_TCP_SRC (13) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_TCP_SRC (9) since Open vSwitch 1.1

       Open vSwitch 1.6 added support for bitwise matching.

       TCP Destination Port Field

       Name:            tcp_dst (aka tp_dst)

       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   TCP
       Access:          read/write

       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_TCP_DST (14) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_TCP_DST (10) since Open vSwitch 1.1

       Open vSwitch 1.6 added support for bitwise matching.

       TCP Flags Field

       Name:            tcp_flags
       Width:           16 bits (only the least-significant 12 bits may be nonzero)

       Format:          TCP flags
       Masking:         arbitrary bitwise masks
       Prerequisites:   TCP
       Access:          read-only
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             ONFOXM_ET_TCP_FLAGS  (42)  since  OpenFlow  1.3  and  Open  vSwitch  2.4;
                        OXM_OF_TCP_FLAGS (42) since OpenFlow 1.5 and Open vSwitch 2.3
       NXM:             NXM_NX_TCP_FLAGS (34) since Open vSwitch 2.1

       This  field  holds  the TCP flags. TCP currently defines 9 flag bits. An additional 3 bits
       are reserved. For more information, see [RFC 793], [RFC 3168], and [RFC 3540].

       Matches on this field are most conveniently written in terms of symbolic names  (given  in
       the diagram below), each preceded by either + for a flag that must be set, or - for a flag
       that must be unset, without any other delimiters between the flags.  Flags  not  mentioned
       are  wildcarded.  For  example, tcp,tcp_flags=+syn-ack matches TCP SYNs that are not ACKs,
       and tcp,tcp_flags=+[200] matches TCP packets with the reserved [200] flag set. Matches can
       also  be  written  as flags/mask, where flags and mask are 16-bit numbers in decimal or in
       hexadecimal prefixed by 0x.

       The flag bits are:

                 reserved      later RFCs         RFC 793
             <---------------> <--------> <--------------------->
         4     1     1     1   1   1   1   1   1   1   1   1   1
       +----+-----+-----+-----+--+---+---+---+---+---+---+---+---+
       |zero|[800]|[400]|[200]|NS|CWR|ECE|URG|ACK|PSH|RST|SYN|FIN|
       +----+-----+-----+-----+--+---+---+---+---+---+---+---+---+
         0

   UDP
       The following diagram shows UDP within IPv4. Open vSwitch also supports UDP in IPv6.  Only
       UDP fields that Open vSwitch exposes as fields are shown:

          Ethernet            IPv4              UDP
        <----------->   <--------------->   <--------->
        48  48   16           8   32  32    16  16
       +---+---+-----+ +---+-----+---+---+ +---+---+---+
       |dst|src|type | |...|proto|src|dst| |src|dst|...| ...
       +---+---+-----+ +---+-----+---+---+ +---+---+---+
                0x800        17

       UDP Source Port Field

       Name:            udp_src
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   UDP

       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_UDP_SRC (15) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_UDP_SRC (11) since Open vSwitch 1.1

       UDP Destination Port Field

       Name:            udp_dst
       Width:           16 bits
       Format:          decimal

       Masking:         arbitrary bitwise masks
       Prerequisites:   UDP
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_UDP_DST (16) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_UDP_DST (12) since Open vSwitch 1.1

   SCTP
       The  following  diagram  shows  SCTP within IPv4. Open vSwitch also supports SCTP in IPv6.
       Only SCTP fields that Open vSwitch exposes as fields are shown:

          Ethernet            IPv4             SCTP
        <----------->   <--------------->   <--------->
        48  48   16           8   32  32    16  16
       +---+---+-----+ +---+-----+---+---+ +---+---+---+
       |dst|src|type | |...|proto|src|dst| |src|dst|...| ...
       +---+---+-----+ +---+-----+---+---+ +---+---+---+
                0x800        132

       SCTP Source Port Field

       Name:            sctp_src
       Width:           16 bits
       Format:          decimal
       Masking:         arbitrary bitwise masks
       Prerequisites:   SCTP

       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_SCTP_SRC (17) since OpenFlow 1.2 and Open vSwitch 2.0
       NXM:             none

       SCTP Destination Port Field

       Name:            sctp_dst
       Width:           16 bits
       Format:          decimal

       Masking:         arbitrary bitwise masks
       Prerequisites:   SCTP
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    yes (exact match only)

       OXM:             OXM_OF_SCTP_DST (18) since OpenFlow 1.2 and Open vSwitch 2.0
       NXM:             none

LAYER 4: ICMPV4 AND ICMPV6 FIELDS

   Summary:
       Name              Bytes   Mask   RW?   Prereqs      NXM/OXM Support

       ────────────────  ──────  ─────  ────  ───────────  ─────────────────────
       icmp_type         1       no     yes   ICMPv4       OF 1.2+ and OVS 1.1+
       icmp_code         1       no     yes   ICMPv4       OF 1.2+ and OVS 1.1+
       icmpv6_type       1       no     yes   ICMPv6       OF 1.2+ and OVS 1.1+

       icmpv6_code       1       no     yes   ICMPv6       OF 1.2+ and OVS 1.1+
       nd_target         16      yes    yes   ND           OF 1.2+ and OVS 1.1+
       nd_sll            6       yes    yes   ND solicit   OF 1.2+ and OVS 1.1+
       nd_tll            6       yes    yes   ND advert    OF 1.2+ and OVS 1.1+

       nd_reserved       4       no     yes   ND           OVS 2.11+
       nd_options_type   1       no     yes   ND           OVS 2.11+

   ICMPv4
          Ethernet            IPv4             ICMPv4
        <----------->   <--------------->   <----------->
        48  48   16           8   32  32     8    8
       +---+---+-----+ +---+-----+---+---+ +----+----+---+
       |dst|src|type | |...|proto|src|dst| |type|code|...| ...
       +---+---+-----+ +---+-----+---+---+ +----+----+---+
                0x800         1

       ICMPv4 Type Field

       Name:            icmp_type
       Width:           8 bits

       Format:          decimal
       Masking:         not maskable
       Prerequisites:   ICMPv4
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)

       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_ICMPV4_TYPE (19) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ICMP_TYPE (13) since Open vSwitch 1.1

       For historical reasons, in an ICMPv4 flow, Open vSwitch interprets matches  on  tp_src  as
       actually referring to the ICMP type.

       ICMPv4 Code Field

       Name:            icmp_code
       Width:           8 bits

       Format:          decimal
       Masking:         not maskable
       Prerequisites:   ICMPv4
       Access:          read/write
       OpenFlow 1.0:    yes (exact match only)

       OpenFlow 1.1:    yes (exact match only)
       OXM:             OXM_OF_ICMPV4_CODE (20) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_OF_ICMP_CODE (14) since Open vSwitch 1.1

       For  historical  reasons,  in an ICMPv4 flow, Open vSwitch interprets matches on tp_dst as
       actually referring to the ICMP code.

   ICMPv6
           Ethernet            IPv6            ICMPv6
        <------------>   <-------------->   <----------->
        48  48    16          8   128 128    8    8
       +---+---+------+ +---+----+---+---+ +----+----+---+
       |dst|src| type | |...|next|src|dst| |type|code|...| ...
       +---+---+------+ +---+----+---+---+ +----+----+---+
                0x86dd        58

       ICMPv6 Type Field

       Name:            icmpv6_type
       Width:           8 bits
       Format:          decimal
       Masking:         not maskable

       Prerequisites:   ICMPv6
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_ICMPV6_TYPE (29) since OpenFlow 1.2 and Open vSwitch 1.7

       NXM:             NXM_NX_ICMPV6_TYPE (21) since Open vSwitch 1.1

       ICMPv6 Code Field

       Name:            icmpv6_code

       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   ICMPv6
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_ICMPV6_CODE (30) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ICMPV6_CODE (22) since Open vSwitch 1.1

   ICMPv6 Neighbor Discovery
           Ethernet            IPv6              ICMPv6            ICMPv6 ND
        <------------>   <-------------->   <-------------->   <--------------->
        48  48    16          8   128 128      8     8          128
       +---+---+------+ +---+----+---+---+ +-------+----+---+ +------+----------+
       |dst|src| type | |...|next|src|dst| | type  |code|...| |target|option ...|
       +---+---+------+ +---+----+---+---+ +-------+----+---+ +------+----------+
                0x86dd        58            135/136  0

       ICMPv6 Neighbor Discovery Target IPv6 Field

       Name:            nd_target
       Width:           128 bits
       Format:          IPv6
       Masking:         arbitrary bitwise masks
       Prerequisites:   ND
       Access:          read/write

       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_IPV6_ND_TARGET (31) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ND_TARGET (23) since Open vSwitch 1.1

       ICMPv6 Neighbor Discovery Source Ethernet Address Field

       Name:            nd_sll
       Width:           48 bits
       Format:          Ethernet
       Masking:         arbitrary bitwise masks
       Prerequisites:   ND solicit
       Access:          read/write
       OpenFlow 1.0:    not supported

       OpenFlow 1.1:    not supported
       OXM:             OXM_OF_IPV6_ND_SLL (32) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ND_SLL (24) since Open vSwitch 1.1

       ICMPv6 Neighbor Discovery Target Ethernet Address Field

       Name:            nd_tll

       Width:           48 bits
       Format:          Ethernet
       Masking:         arbitrary bitwise masks
       Prerequisites:   ND advert
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             OXM_OF_IPV6_ND_TLL (33) since OpenFlow 1.2 and Open vSwitch 1.7
       NXM:             NXM_NX_ND_TLL (25) since Open vSwitch 1.1

       ICMPv6 Neighbor Discovery Reserved Field Field

       Name:            nd_reserved
       Width:           32 bits

       Format:          decimal
       Masking:         not maskable
       Prerequisites:   ND
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported
       OXM:             none

       NXM:             ERICOXM_OF_ICMPV6_ND_RESERVED (1) since Open vSwitch 2.11

       This is used to set the R,S,O bits in Neighbor Advertisement Messages

       ICMPv6 Neighbor Discovery Options Type Field Field

       Name:            nd_options_type

       Width:           8 bits
       Format:          decimal
       Masking:         not maskable
       Prerequisites:   ND
       Access:          read/write
       OpenFlow 1.0:    not supported
       OpenFlow 1.1:    not supported

       OXM:             none
       NXM:             ERICOXM_OF_ICMPV6_ND_OPTIONS_TYPE (2) since Open vSwitch 2.11

       A value of 1 indicates that the option is Source Link Layer. A value of 2  indicates  that
       the options is Target Link Layer. See RFC 4861 for further details.

REFERENCES

              Casado M.  Casado,  M.  J. Freedman, J. Pettit, J. Luo, N. McKeown, and S. Shenker,
                     ``Ethane:  Taking  Control  of  the  Enterprise,’’  Computer  Communications
                     Review, October 2007.

              ERSPAN M.  Foschiano,  K.  Ghosh,  M.  Mehta,  ``Cisco Systems’ Encapsulated Remote
                     Switch Port Analyzer (ERSPAN),’’ ⟨https://tools.ietf.org/html/
                     draft-foschiano-erspan-03⟩ .

              EXT-56 J.  Tonsing,  ``Permit  one  of  a set of prerequisites to apply, e.g. don’t
                     preclude non-Ethernet media,’’ ⟨https://rs.opennetworking.org/bugs/browse/
                     EXT-56⟩ (ONF members only).

              EXT-112
                     J. Tourrilhes, ``Support non-Ethernet packets throughout the pipeline,’’
                     ⟨https://rs.opennetworking.org/bugs/browse/EXT-112⟩ (ONF members only).

              EXT-134
                     J. Tourrilhes, ``Match first nibble of the MPLS payload,’’ ⟨https://
                     rs.opennetworking.org/bugs/browse/EXT-134⟩ (ONF members only).

              Geneve J.  Gross,  I.  Ganga,  and  T.  Sridhar, editors, ``Geneve: Generic Network
                     Virtualization Encapsulation,’’ ⟨https://datatracker.ietf.org/doc/
                     draft-ietf-nvo3-geneve/⟩ .

              IEEE OUI
                     IEEE Standards Association, ``MAC Address Block Large (MA-L),’’ ⟨https://
                     standards.ieee.org/develop/regauth/oui/index.html⟩ .

              NSH    P. Quinn and U. Elzur, editors, ``Network Service Header,’’ ⟨https://
                     datatracker.ietf.org/doc/draft-ietf-sfc-nsh/⟩ .

              OpenFlow 1.0.1
                     Open  Networking Foundation, ``OpenFlow Switch Errata, Version 1.0.1,’’ June
                     2012.

              OpenFlow 1.1
                     OpenFlow  Consortium,  ``OpenFlow   Switch   Specification   Version   1.1.0
                     Implemented (Wire Protocol 0x02),’’ February 2011.

              OpenFlow 1.5
                     Open  Networking  Foundation,  ``OpenFlow Switch Specification Version 1.5.0
                     (Protocol version 0x06),’’ December 2014.

              OpenFlow Extensions 1.3.x Package 2
                     Open  Networking  Foundation,  ``OpenFlow  Extensions  1.3.x  Package   2,’’
                     December 2013.

              TCP Flags Match Field Extension
                     Open  Networking  Foundation,  ``TCP flags match field Extension,’’ December
                     2014. In [OpenFlow Extensions 1.3.x Package 2].

              Pepelnjak
                     I. Pepelnjak, ``OpenFlow and Fermi Estimates,’’ ⟨http://blog.ipspace.net/
                     2013/09/openflow-and-fermi-estimates.html⟩ .

              RFC 793
                     ``Transmission Control Protocol,’’ ⟨http://www.ietf.org/rfc/rfc793.txt⟩ .

              RFC 3032
                     E.  Rosen,  D.  Tappan, G. Fedorkow, Y. Rekhter, D. Farinacci, T. Li, and A.
                     Conta, ``MPLS Label Stack Encoding,’’  ⟨http://www.ietf.org/rfc/rfc3032.txt⟩
                     .

              RFC 3168
                     K.  Ramakrishnan,  S.  Floyd,  and  D.  Black,  ``The  Addition  of Explicit
                     Congestion Notification (ECN) to IP,’’ ⟨https://tools.ietf.org/html/rfc3168⟩
                     .

              RFC 3540
                     N.   Spring,   D.  Wetherall,  and  D.  Ely,  ``Robust  Explicit  Congestion
                     Notification (ECN) Signaling with Nonces,’’ ⟨https://tools.ietf.org/html/
                     rfc3540⟩ .

              RFC 4632
                     V.  Fuller  and T. Li, ``Classless Inter-domain Routing (CIDR): The Internet
                     Address Assignment and Aggregation Plan,’’ ⟨https://tools.ietf.org/html/
                     rfc4632⟩ .

              RFC 5462
                     L.  Andersson  and  R.  Asati,  ``Multiprotocol Label Switching (MPLS) Label
                     Stack Entry: ``EXP’’ Field Renamed to ``Traffic Class’’ Field,’’ ⟨http://
                     www.ietf.org/rfc/rfc5462.txt⟩ .

              RFC 6830
                     D. Farinacci, V. Fuller, D. Meyer, and D. Lewis, ``The Locator/ID Separation
                     Protocol (LISP),’’ ⟨http://www.ietf.org/rfc/rfc6830.txt⟩ .

              RFC 7348
                     M. Mahalingam, D. Dutt, K. Duda, P. Agarwal,  L.  Kreeger,  T.  Sridhar,  M.
                     Bursell,  and  C. Wright, ``Virtual eXtensible Local Area Network (VXLAN): A
                     Framework for Overlaying Virtualized Layer 2 Networks over Layer 3 Networks,
                     ’’ ⟨https://tools.ietf.org/html/rfc7348⟩ .

              RFC 7665
                     J.  Halpern,  Ed.  and  C. Pignataro, Ed., ``Service Function Chaining (SFC)
                     Architecture,’’ ⟨https://tools.ietf.org/html/rfc7665⟩ .

              Srinivasan
                     V. Srinivasan, S. Suriy, and  G.  Varghese,  ``Packet  Classification  using
                     Tuple Space Search,’’ SIGCOMM 1999.

              Pagiamtzis
                     K.  Pagiamtzis  and  A.  Sheikholeslami,  ``Content-addressable memory (CAM)
                     circuits and architectures: A tutorial and survey,’’ IEEE Journal of  Solid-
                     State Circuits, vol. 41, no. 3, pp. 712-727, March 2006.

              VXLAN Group Policy Option
                     M. Smith and L. Kreeger, `` VXLAN Group Policy Option.’’ Internet-Draft.
                     ⟨https://tools.ietf.org/html/draft-smith-vxlan-group-policy⟩ .

AUTHORS

       Ben Pfaff, with advice from Justin Pettit and Jean Tourrilhes.