When userspace inserts masked flows, it is not necessary to demand
that flows matching in a known ethertype also must have the
corresponding key, as a missing key will be automatically wildcarded.

For example, if a drop flow dropping all UDP packets is installed,
this patch allows the userspace application to not specify the
OVS_KEY_ATTR_UDP key.

Signed-off-by: Jarno Rajahalme <jrajaha...@nicira.com>
---
 datapath/flow_netlink.c |   23 -----------------------
 1 file changed, 23 deletions(-)

diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c
index 09aaf41..690f0e9 100644
--- a/datapath/flow_netlink.c
+++ b/datapath/flow_netlink.c
@@ -114,7 +114,6 @@ static void update_range(struct sw_flow_match *match,
 static bool match_validate(const struct sw_flow_match *match,
                           u64 key_attrs, u64 mask_attrs)
 {
-       u64 key_expected = 1ULL << OVS_KEY_ATTR_ETHERNET;
        u64 mask_allowed = key_attrs;  /* At most allow all key attributes */
 
        /* The following mask attributes allowed only if they
@@ -139,39 +138,32 @@ static bool match_validate(const struct sw_flow_match 
*match,
        /* Check key attributes. */
        if (match->key->eth.type == htons(ETH_P_ARP)
                        || match->key->eth.type == htons(ETH_P_RARP)) {
-               key_expected |= 1ULL << OVS_KEY_ATTR_ARP;
                if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
                        mask_allowed |= 1ULL << OVS_KEY_ATTR_ARP;
        }
 
 
        if (eth_p_mpls(match->key->eth.type)) {
-               key_expected |= 1ULL << OVS_KEY_ATTR_MPLS;
                if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
                        mask_allowed |= 1ULL << OVS_KEY_ATTR_MPLS;
        }
 
        if (match->key->eth.type == htons(ETH_P_IP)) {
-               key_expected |= 1ULL << OVS_KEY_ATTR_IPV4;
                if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
                        mask_allowed |= 1ULL << OVS_KEY_ATTR_IPV4;
 
                if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) {
                        if (match->key->ip.proto == IPPROTO_UDP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_UDP;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_UDP;
                        }
 
                        if (match->key->ip.proto == IPPROTO_SCTP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_SCTP;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_SCTP;
                        }
 
                        if (match->key->ip.proto == IPPROTO_TCP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_TCP;
-                               key_expected |= 1ULL << OVS_KEY_ATTR_TCP_FLAGS;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff)) {
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_TCP;
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_TCP_FLAGS;
@@ -179,7 +171,6 @@ static bool match_validate(const struct sw_flow_match 
*match,
                        }
 
                        if (match->key->ip.proto == IPPROTO_ICMP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_ICMP;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_ICMP;
                        }
@@ -187,26 +178,21 @@ static bool match_validate(const struct sw_flow_match 
*match,
        }
 
        if (match->key->eth.type == htons(ETH_P_IPV6)) {
-               key_expected |= 1ULL << OVS_KEY_ATTR_IPV6;
                if (match->mask && (match->mask->key.eth.type == htons(0xffff)))
                        mask_allowed |= 1ULL << OVS_KEY_ATTR_IPV6;
 
                if (match->key->ip.frag != OVS_FRAG_TYPE_LATER) {
                        if (match->key->ip.proto == IPPROTO_UDP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_UDP;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_UDP;
                        }
 
                        if (match->key->ip.proto == IPPROTO_SCTP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_SCTP;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_SCTP;
                        }
 
                        if (match->key->ip.proto == IPPROTO_TCP) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_TCP;
-                               key_expected |= 1ULL << OVS_KEY_ATTR_TCP_FLAGS;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff)) {
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_TCP;
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_TCP_FLAGS;
@@ -214,14 +200,12 @@ static bool match_validate(const struct sw_flow_match 
*match,
                        }
 
                        if (match->key->ip.proto == IPPROTO_ICMPV6) {
-                               key_expected |= 1ULL << OVS_KEY_ATTR_ICMPV6;
                                if (match->mask && (match->mask->key.ip.proto 
== 0xff))
                                        mask_allowed |= 1ULL << 
OVS_KEY_ATTR_ICMPV6;
 
                                if (match->key->tp.src ==
                                                
htons(NDISC_NEIGHBOUR_SOLICITATION) ||
                                    match->key->tp.src == 
htons(NDISC_NEIGHBOUR_ADVERTISEMENT)) {
-                                       key_expected |= 1ULL << OVS_KEY_ATTR_ND;
                                        if (match->mask && 
(match->mask->key.tp.src == htons(0xff)))
                                                mask_allowed |= 1ULL << 
OVS_KEY_ATTR_ND;
                                }
@@ -229,13 +213,6 @@ static bool match_validate(const struct sw_flow_match 
*match,
                }
        }
 
-       if ((key_attrs & key_expected) != key_expected) {
-               /* Key attributes check failed. */
-               OVS_NLERR("Missing expected key attributes (key_attrs=%llx, 
expected=%llx).\n",
-                               (unsigned long long)key_attrs, (unsigned long 
long)key_expected);
-               return false;
-       }
-
        if ((mask_attrs & mask_allowed) != mask_attrs) {
                /* Mask attributes check failed. */
                OVS_NLERR("Contain more than allowed mask fields 
(mask_attrs=%llx, mask_allowed=%llx).\n",
-- 
1.7.10.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to