datapath: VLAN actions should use push/pop semantics
[sliver-openvswitch.git] / datapath / datapath.c
index 0b6e2e5..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 */
 }
 
@@ -142,16 +141,12 @@ static int dp_fill_ifinfo(struct sk_buff *skb,
 {
        struct datapath *dp = port->dp;
        int ifindex = vport_get_ifindex(port);
-       int iflink = vport_get_iflink(port);
        struct ifinfomsg *hdr;
        struct nlmsghdr *nlh;
 
        if (ifindex < 0)
                return ifindex;
 
-       if (iflink < 0)
-               return iflink;
-
        nlh = nlmsg_put(skb, 0, 0, event, sizeof(*hdr), flags);
        if (nlh == NULL)
                return -EMSGSIZE;
@@ -177,9 +172,6 @@ static int dp_fill_ifinfo(struct sk_buff *skb,
 
        NLA_PUT(skb, IFLA_ADDRESS, ETH_ALEN, vport_get_addr(port));
 
-       if (ifindex != iflink)
-               NLA_PUT_U32(skb, IFLA_LINK,iflink);
-
        return nlmsg_end(skb, nlh);
 
 nla_put_failure:
@@ -553,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,
@@ -576,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:
@@ -594,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;
@@ -693,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,
@@ -701,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))
@@ -1603,7 +1596,7 @@ static struct genl_family dp_vport_genl_family = {
        .maxattr = OVS_VPORT_ATTR_MAX
 };
 
-static struct genl_multicast_group dp_vport_multicast_group = {
+struct genl_multicast_group dp_vport_multicast_group = {
        .name = OVS_VPORT_MCGROUP
 };
 
@@ -1613,7 +1606,7 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb,
 {
        struct ovs_header *ovs_header;
        struct nlattr *nla;
-       int ifindex, iflink;
+       int ifindex;
        int mtu;
        int err;
 
@@ -1648,10 +1641,6 @@ static int ovs_vport_cmd_fill_info(struct vport *vport, struct sk_buff *skb,
        if (ifindex > 0)
                NLA_PUT_U32(skb, OVS_VPORT_ATTR_IFINDEX, ifindex);
 
-       iflink = vport_get_iflink(vport);
-       if (iflink > 0)
-               NLA_PUT_U32(skb, OVS_VPORT_ATTR_IFLINK, iflink);
-
        return genlmsg_end(skb, ovs_header);
 
 nla_put_failure:
@@ -1662,8 +1651,8 @@ error:
 }
 
 /* Called with RTNL lock or RCU read lock. */
-static struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 pid,
-                                               u32 seq, u8 cmd)
+struct sk_buff *ovs_vport_cmd_build_info(struct vport *vport, u32 pid,
+                                        u32 seq, u8 cmd)
 {
        struct sk_buff *skb;
        int retval;