Sets mask bits for the given field and its prerequisite fields.
Needed for unwildcarding the proper bits from datapath masks.

Signed-off-by: Jarno Rajahalme <[email protected]>
---
v2: Address Ben's review comments:
  - make mf_force_prereqs() clearer by setting the bits for dl_type as well.
  - make exact_match_mask local to the function.
  - use IN6ADDR_EXACT_INIT

 lib/meta-flow.c |   38 ++++++++++++++++++++++++++++++++++++++
 lib/meta-flow.h |   14 ++++++++------
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 02fee46..3d092cd 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -1017,6 +1017,44 @@ mf_are_prereqs_ok(const struct mf_field *mf, const 
struct flow *flow)
     NOT_REACHED();
 }
 
+/* Set field and it's prerequisities in the mask.
+ * This is only ever called for writeable 'mf's, but we do not make the
+ * distinction here. */
+void
+mf_force_prereqs(const struct mf_field *mf, struct flow *mask)
+{
+    static const union mf_value exact_match_mask = MF_EXACT_MASK_INITIALIZER;
+
+    mf_set_flow_value(mf, &exact_match_mask, mask);
+
+    switch (mf->prereqs) {
+    case MFP_ND:
+    case MFP_ND_SOLICIT:
+    case MFP_ND_ADVERT:
+        mask->tp_src = OVS_BE16_MAX;
+        mask->tp_dst = OVS_BE16_MAX;
+        /* Fall through. */
+    case MFP_TCP:
+    case MFP_UDP:
+    case MFP_SCTP:
+    case MFP_ICMPV4:
+    case MFP_ICMPV6:
+        mask->nw_proto = 0xff;
+        /* Fall through. */
+    case MFP_ARP:
+    case MFP_IPV4:
+    case MFP_IPV6:
+    case MFP_MPLS:
+    case MFP_VLAN_VID:
+    case MFP_IP_ANY:
+        mask->dl_type = OVS_BE16_MAX;
+        /* Fall through. */
+    case MFP_NONE:
+        break;
+    }
+}
+
+
 /* Returns true if 'value' may be a valid value *as part of a masked match*,
  * false otherwise.
  *
diff --git a/lib/meta-flow.h b/lib/meta-flow.h
index dd8b95d..946c2d5 100644
--- a/lib/meta-flow.h
+++ b/lib/meta-flow.h
@@ -297,15 +297,17 @@ struct mf_field {
 
 /* The representation of a field's value. */
 union mf_value {
-    uint8_t u8;
-    ovs_be16 be16;
-    ovs_be32 be32;
-    ovs_be64 be64;
-    uint8_t mac[ETH_ADDR_LEN];
     struct in6_addr ipv6;
+    uint8_t mac[ETH_ADDR_LEN];
+    ovs_be64 be64;
+    ovs_be32 be32;
+    ovs_be16 be16;
+    uint8_t u8;
 };
 BUILD_ASSERT_DECL(sizeof(union mf_value) == 16);
 
+#define MF_EXACT_MASK_INITIALIZER { IN6ADDR_EXACT_INIT }
+
 /* Part of a field. */
 struct mf_subfield {
     const struct mf_field *field;
@@ -341,7 +343,7 @@ void mf_get_mask(const struct mf_field *, const struct 
flow_wildcards *,
 
 /* Prerequisites. */
 bool mf_are_prereqs_ok(const struct mf_field *, const struct flow *);
-void mf_force_prereqs(const struct mf_field *, struct match *);
+void mf_force_prereqs(const struct mf_field *, struct flow *mask);
 
 /* Field values. */
 bool mf_is_value_valid(const struct mf_field *, const union mf_value *value);
-- 
1.7.10.4

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to