dpif-linux: Recheck the socket pointer existence before getting its pid.
[cascardo/ovs.git] / lib / meta-flow.h
index b43b13f..7a4b8dc 100644 (file)
@@ -33,6 +33,8 @@ struct match;
  * to represent its value. */
 enum OVS_PACKED_ENUM mf_field_id {
     /* Metadata. */
+    MFF_DP_HASH,                /* be32 */
+    MFF_RECIRC_ID,              /* be32 */
     MFF_TUN_ID,                 /* be64 */
     MFF_TUN_SRC,                /* be32 */
     MFF_TUN_DST,                /* be32 */
@@ -87,6 +89,8 @@ enum OVS_PACKED_ENUM mf_field_id {
     MFF_MPLS_BOS,               /* u8 */
 
     /* L3. */
+    /* Update mf_is_l3_or_higher() if MFF_IPV4_SRC is
+     * no longer the first element for a field of layer 3 or higher */
     MFF_IPV4_SRC,               /* be32 */
     MFF_IPV4_DST,               /* be32 */
 
@@ -272,6 +276,11 @@ struct mf_field {
      *
      *   - NXM and OXM both define such a field: nxm_header and oxm_header will
      *     both be nonzero and different, similarly for nxm_name and oxm_name.
+     *     In this case, 'oxm_version' is significant: if it is greater than
+     *     OFP12_VERSION, then only that version of OpenFlow introduced this
+     *     OXM header, so ovs-vswitchd should send 'nxm_header' instead with
+     *     earlier protocol versions to avoid confusing controllers that were
+     *     using a previous Open vSwitch extension.
      *
      *   - Only NXM or only OXM defines such a field: nxm_header and oxm_header
      *     will both have the same value (either an OXM_* or NXM_* value) and
@@ -281,11 +290,14 @@ struct mf_field {
      * NXM formatted match, since it will be an NXM_* constant when possible
      * for compatibility with OpenFlow implementations that expect that, with
      * OXM_* constants used for fields that OXM adds.  Conversely, 'oxm_header'
-     * is the header to use when outputting an OXM formatted match. */
+     * is the header to use when outputting an OXM formatted match to an
+     * OpenFlow connection of version 'oxm_version' or above (and otherwise
+     * 'nxm_header'). */
     uint32_t nxm_header;        /* An NXM_* (or OXM_*) constant. */
     const char *nxm_name;       /* The nxm_header constant's name. */
     uint32_t oxm_header;        /* An OXM_* (or NXM_*) constant. */
     const char *oxm_name;       /* The oxm_header constant's name */
+    enum ofp_version oxm_version; /* OpenFlow version that added oxm_header. */
 
     /* Usable protocols.
      * NXM and OXM are extensible, allowing later extensions to be sent in
@@ -297,6 +309,9 @@ struct mf_field {
     enum ofputil_protocol usable_protocols; /* If fully/cidr masked. */
     /* If partially/non-cidr masked. */
     enum ofputil_protocol usable_protocols_bitwise;
+
+    int flow_be32ofs;  /* Field's be32 offset in "struct flow", if prefix tree
+                        * lookup is supported for the field, or -1. */
 };
 
 /* The representation of a field's value. */
@@ -345,6 +360,9 @@ mf_from_id(enum mf_field_id id)
     return &mf_fields[id];
 }
 
+/* NXM and OXM protocol headers. */
+uint32_t mf_oxm_header(enum mf_field_id, enum ofp_version oxm_version);
+
 /* Inspecting wildcarded bits. */
 bool mf_is_all_wild(const struct mf_field *, const struct flow_wildcards *);
 
@@ -356,6 +374,12 @@ void mf_get_mask(const struct mf_field *, const struct flow_wildcards *,
 bool mf_are_prereqs_ok(const struct mf_field *, const struct flow *);
 void mf_mask_field_and_prereqs(const struct mf_field *, struct flow *mask);
 
+static inline bool
+mf_is_l3_or_higher(const struct mf_field *mf)
+{
+    return mf->id >= MFF_IPV4_SRC;
+}
+
 /* Field values. */
 bool mf_is_value_valid(const struct mf_field *, const union mf_value *value);
 
@@ -379,8 +403,6 @@ enum ofputil_protocol mf_set(const struct mf_field *,
 
 void mf_set_wild(const struct mf_field *, struct match *);
 
-void mf_random_value(const struct mf_field *, union mf_value *value);
-
 /* Subfields. */
 void mf_write_subfield_flow(const struct mf_subfield *,
                             const union mf_subvalue *, struct flow *);