From: Jesse Gross Date: Tue, 9 Jul 2013 21:21:26 +0000 (-0700) Subject: datapath: Use DP_MAX_PORTS when no IN_PORT attribute is present. X-Git-Tag: v1.11.0~41 X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Fovs.git;a=commitdiff_plain;h=8bf118c212fed261aeeb33ee8900b423aee31ed8 datapath: Use DP_MAX_PORTS when no IN_PORT attribute is present. To indicate that a flow is not associated with any particular in port, userspace may omit the IN_PORT attribute, which the kernel translates internally to the special value DP_MAX_PORTS. After the megaflows changes, this was no longer being done, resulting in it using port 0 (the internal port). This also adopts a wildcarding scheme similar to 802.2 packets where a mask can be specified for this non-existent key attribute but it must either be completely wildcarded or completely exact match. CC: Andy Zhou Signed-off-by: Jesse Gross --- diff --git a/datapath/flow.c b/datapath/flow.c index e97bf4942..7d6392ea1 100644 --- a/datapath/flow.c +++ b/datapath/flow.c @@ -133,6 +133,10 @@ static bool ovs_match_validate(const struct sw_flow_match *match, | (1ULL << OVS_KEY_ATTR_ARP) | (1ULL << OVS_KEY_ATTR_ND)); + if (match->key->phy.in_port == DP_MAX_PORTS && + match->mask && (match->mask->key.phy.in_port == 0xffff)) + mask_allowed |= (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); @@ -1312,6 +1316,8 @@ static int metadata_from_nlattrs(struct sw_flow_match *match, u64 *attrs, return -EINVAL; SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask); *attrs &= ~(1ULL << OVS_KEY_ATTR_IN_PORT); + } else if (!is_mask) { + SW_FLOW_KEY_PUT(match, phy.in_port, DP_MAX_PORTS, is_mask); } if (*attrs & (1ULL << OVS_KEY_ATTR_SKB_MARK)) {