From: Jarno Rajahalme Date: Tue, 15 Oct 2013 19:40:37 +0000 (-0700) Subject: meta-flow: Add mf_mask_field_and_prereqs(). X-Git-Tag: sliver-openvswitch-2.0.90-1~7^2~72 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=b283836c09ad0564b85ea29a94ed495b33bfe0d0;p=sliver-openvswitch.git meta-flow: Add mf_mask_field_and_prereqs(). Sets mask bits for the given field and its prerequisite fields. Needed for unwildcarding the proper bits from datapath masks. Removed old prototype for mf_force_prereqs(). Signed-off-by: Jarno Rajahalme Signed-off-by: Ben Pfaff --- diff --git a/lib/meta-flow.c b/lib/meta-flow.c index 69d514039..3ac396f37 100644 --- a/lib/meta-flow.c +++ b/lib/meta-flow.c @@ -1021,6 +1021,46 @@ 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_mask_field_and_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_IP_ANY: + mask->dl_type = OVS_BE16_MAX; + break; + case MFP_VLAN_VID: + mask->vlan_tci |= htons(VLAN_CFI); + break; + 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 dd8b95d71..a3f6701fe 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_mask_field_and_prereqs(const struct mf_field *, struct flow *mask); /* Field values. */ bool mf_is_value_valid(const struct mf_field *, const union mf_value *value);