[ovs-dev] [netlink mask exceptions v2 3/3] datapath: Accept any 802.2 eth_type mask but override to be exact match

Andy Zhou azhou at nicira.com
Thu Aug 1 17:49:46 UTC 2013


When key.eth_type is absent it is interpreted to be 802.2. In this
case, the eth_type mask, if supplied, will be overridden to be exact
match, regardless of the value supplied.

Signed-off-by: Andy Zhou <azhou at nicira.com>
---
 datapath/flow.c |   13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/datapath/flow.c b/datapath/flow.c
index 5aac1f9..47f81b9 100644
--- a/datapath/flow.c
+++ b/datapath/flow.c
@@ -137,11 +137,8 @@ static bool ovs_match_validate(const struct sw_flow_match *match,
 
 	/* Always allowed mask fields. */
 	mask_allowed |= ((1ULL << OVS_KEY_ATTR_TUNNEL)
-			 | (1ULL << OVS_KEY_ATTR_IN_PORT));
-
-	if (match->key->eth.type == htons(ETH_P_802_2) &&
-	    match->mask && (match->mask->key.eth.type == htons(0xffff)))
-		mask_allowed |= (1ULL << OVS_KEY_ATTR_ETHERTYPE);
+			| (1ULL << OVS_KEY_ATTR_IN_PORT)
+			| (11ULL << OVS_KEY_ATTR_ETHERTYPE));
 
 	/* Check key attributes. */
 	if (match->key->eth.type == htons(ETH_P_ARP)
@@ -1386,7 +1383,11 @@ static int ovs_key_from_nlattrs(struct sw_flow_match *match,  u64 attrs,
 		__be16 eth_type;
 
 		eth_type = nla_get_be16(a[OVS_KEY_ATTR_ETHERTYPE]);
-		if (!is_mask && ntohs(eth_type) < ETH_P_802_3_MIN) {
+		if (is_mask) {
+			if (match->key->eth.type == htons(ETH_P_802_2))
+				/* Always exact match 802.2 ether type. */
+				eth_type = htons(0xffff);
+		} else if (ntohs(eth_type) < ETH_P_802_3_MIN) {
 			OVS_NLERR("EtherType is less than mimimum (type=%x, min=%x).\n",
 					ntohs(eth_type), ETH_P_802_3_MIN);
 			return -EINVAL;
-- 
1.7.9.5




More information about the dev mailing list