datapath: Use DP_MAX_PORTS when no IN_PORT attribute is present.
[sliver-openvswitch.git] / datapath / flow.c
index adb918f..9ae94bc 100644 (file)
@@ -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)) {