summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
25a27ba)
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>
| (1ULL << OVS_KEY_ATTR_ARP)
| (1ULL << OVS_KEY_ATTR_ND));
| (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);
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);
return -EINVAL;
SW_FLOW_KEY_PUT(match, phy.in_port, in_port, is_mask);
*attrs &= ~(1ULL << OVS_KEY_ATTR_IN_PORT);
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)) {
}
if (*attrs & (1ULL << OVS_KEY_ATTR_SKB_MARK)) {