[ovs-dev] [PATCH 1/2] meta-flow: Implement mf_force_prereqs().

Jarno Rajahalme jrajahalme at nicira.com
Mon Oct 14 22:57:34 UTC 2013


Sets mask bits for the given field and its prerequisite fields.
Needed for later patches.

Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
 lib/meta-flow.c |   37 +++++++++++++++++++++++++++++++++++++
 lib/meta-flow.h |   15 +++++++++------
 2 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/lib/meta-flow.c b/lib/meta-flow.c
index 02fee46..77ea1c5 100644
--- a/lib/meta-flow.c
+++ b/lib/meta-flow.c
@@ -1017,6 +1017,43 @@ mf_are_prereqs_ok(const struct mf_field *mf, const struct flow *flow)
     NOT_REACHED();
 }
 
+static const union mf_value exact_match_mask = MF_EXACT_MASK_INITIALIZER;
+
+/* Set field and it's prerequisities in the mask.
+ * The caller is responsible for setting the mask for dl_type. */
+void
+mf_force_prereqs(const struct mf_field *mf, struct flow *mask)
+{
+    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..80fde5e 100644
--- a/lib/meta-flow.h
+++ b/lib/meta-flow.h
@@ -297,15 +297,18 @@ 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 { { { { ~0, ~0, ~0, ~0,  ~0, ~0, ~0, ~0, \
+                        ~0, ~0, ~0, ~0,  ~0, ~0, ~0, ~0 } } } }
+
 /* Part of a field. */
 struct mf_subfield {
     const struct mf_field *field;
@@ -341,7 +344,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




More information about the dev mailing list