mirror of
https://github.com/openvswitch/ovs
synced 2025-10-23 14:57:06 +00:00
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 <azhou@nicira.com> Signed-off-by: Jesse Gross <jesse@nicira.com>
This commit is contained in:
@@ -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);
|
||||
@@ -1314,6 +1318,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)) {
|
||||
|
||||
Reference in New Issue
Block a user