Commit cf2885a7 authored by Kumar Sanghvi's avatar Kumar Sanghvi Committed by David S. Miller

cxgb4: add support to offload action vlan

Add support for offloading tc-flower flows having
vlan actions: pop, push and modify.
Signed-off-by: default avatarKumar Sanghvi <kumaras@chelsio.com>
Signed-off-by: default avatarRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Signed-off-by: default avatarGanesh Goudar <ganeshgr@chelsio.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 62488e4b
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <net/tc_act/tc_gact.h> #include <net/tc_act/tc_gact.h>
#include <net/tc_act/tc_mirred.h> #include <net/tc_act/tc_mirred.h>
#include <net/tc_act/tc_vlan.h>
#include "cxgb4.h" #include "cxgb4.h"
#include "cxgb4_tc_flower.h" #include "cxgb4_tc_flower.h"
...@@ -185,6 +186,27 @@ static void cxgb4_process_flow_actions(struct net_device *in, ...@@ -185,6 +186,27 @@ static void cxgb4_process_flow_actions(struct net_device *in,
fs->action = FILTER_SWITCH; fs->action = FILTER_SWITCH;
fs->eport = pi->port_id; fs->eport = pi->port_id;
} else if (is_tcf_vlan(a)) {
u32 vlan_action = tcf_vlan_action(a);
u8 prio = tcf_vlan_push_prio(a);
u16 vid = tcf_vlan_push_vid(a);
u16 vlan_tci = (prio << VLAN_PRIO_SHIFT) | vid;
switch (vlan_action) {
case TCA_VLAN_ACT_POP:
fs->newvlan |= VLAN_REMOVE;
break;
case TCA_VLAN_ACT_PUSH:
fs->newvlan |= VLAN_INSERT;
fs->vlan = vlan_tci;
break;
case TCA_VLAN_ACT_MODIFY:
fs->newvlan |= VLAN_REWRITE;
fs->vlan = vlan_tci;
break;
default:
break;
}
} }
} }
} }
...@@ -222,6 +244,26 @@ static int cxgb4_validate_flow_actions(struct net_device *dev, ...@@ -222,6 +244,26 @@ static int cxgb4_validate_flow_actions(struct net_device *dev,
__func__); __func__);
return -EINVAL; return -EINVAL;
} }
} else if (is_tcf_vlan(a)) {
u16 proto = be16_to_cpu(tcf_vlan_push_proto(a));
u32 vlan_action = tcf_vlan_action(a);
switch (vlan_action) {
case TCA_VLAN_ACT_POP:
break;
case TCA_VLAN_ACT_PUSH:
case TCA_VLAN_ACT_MODIFY:
if (proto != ETH_P_8021Q) {
netdev_err(dev, "%s: Unsupported vlan proto\n",
__func__);
return -EOPNOTSUPP;
}
break;
default:
netdev_err(dev, "%s: Unsupported vlan action\n",
__func__);
return -EOPNOTSUPP;
}
} else { } else {
netdev_err(dev, "%s: Unsupported action\n", __func__); netdev_err(dev, "%s: Unsupported action\n", __func__);
return -EOPNOTSUPP; return -EOPNOTSUPP;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment