[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