datapath: VLAN actions should use push/pop semantics
[sliver-openvswitch.git] / datapath / datapath.c
index 7499081..454f96c 100644 (file)
@@ -131,7 +131,6 @@ static inline size_t br_nlmsg_size(void)
               + nla_total_size(MAX_ADDR_LEN) /* IFLA_ADDRESS */
               + nla_total_size(4) /* IFLA_MASTER */
               + nla_total_size(4) /* IFLA_MTU */
-              + nla_total_size(4) /* IFLA_LINK */
               + nla_total_size(1); /* IFLA_OPERSTATE */
 }
 
@@ -546,8 +545,8 @@ static int validate_actions(const struct nlattr *attr)
                static const u32 action_lens[OVS_ACTION_ATTR_MAX + 1] = {
                        [OVS_ACTION_ATTR_OUTPUT] = 4,
                        [OVS_ACTION_ATTR_USERSPACE] = 8,
-                       [OVS_ACTION_ATTR_SET_DL_TCI] = 2,
-                       [OVS_ACTION_ATTR_STRIP_VLAN] = 0,
+                       [OVS_ACTION_ATTR_PUSH_VLAN] = 2,
+                       [OVS_ACTION_ATTR_POP_VLAN] = 0,
                        [OVS_ACTION_ATTR_SET_DL_SRC] = ETH_ALEN,
                        [OVS_ACTION_ATTR_SET_DL_DST] = ETH_ALEN,
                        [OVS_ACTION_ATTR_SET_NW_SRC] = 4,
@@ -569,7 +568,7 @@ static int validate_actions(const struct nlattr *attr)
                        return -EINVAL;
 
                case OVS_ACTION_ATTR_USERSPACE:
-               case OVS_ACTION_ATTR_STRIP_VLAN:
+               case OVS_ACTION_ATTR_POP_VLAN:
                case OVS_ACTION_ATTR_SET_DL_SRC:
                case OVS_ACTION_ATTR_SET_DL_DST:
                case OVS_ACTION_ATTR_SET_NW_SRC:
@@ -587,7 +586,7 @@ static int validate_actions(const struct nlattr *attr)
                                return -EINVAL;
                        break;
 
-               case OVS_ACTION_ATTR_SET_DL_TCI:
+               case OVS_ACTION_ATTR_PUSH_VLAN:
                        if (nla_get_be16(a) & htons(VLAN_CFI_MASK))
                                return -EINVAL;
                        break;
@@ -686,7 +685,6 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
        err = flow_extract(packet, -1, &flow->key, &key_len, &is_frag);
        if (err)
                goto err_flow_put;
-       flow->tbl_node.hash = flow_hash(&flow->key, key_len);
 
        err = flow_metadata_from_nlattrs(&flow->key.eth.in_port,
                                         &flow->key.eth.tun_id,
@@ -694,6 +692,8 @@ static int ovs_packet_cmd_execute(struct sk_buff *skb, struct genl_info *info)
        if (err)
                goto err_flow_put;
 
+       flow->tbl_node.hash = flow_hash(&flow->key, key_len);
+
        acts = flow_actions_alloc(a[OVS_PACKET_ATTR_ACTIONS]);
        err = PTR_ERR(acts);
        if (IS_ERR(acts))