[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220309130256.1402040-2-roid@nvidia.com>
Date: Wed, 9 Mar 2022 15:02:54 +0200
From: Roi Dayan <roid@...dia.com>
To: <netdev@...r.kernel.org>
CC: Roi Dayan <roid@...dia.com>, Maor Dickman <maord@...dia.com>,
"Jakub Kicinski" <kuba@...nel.org>,
"David S. Miller" <davem@...emloft.net>,
"Jamal Hadi Salim" <jhs@...atatu.com>, Jiri Pirko <jiri@...dia.com>
Subject: [PATCH net-next 1/3] net/sched: add vlan push_eth and pop_eth action to the hardware IR
From: Maor Dickman <maord@...dia.com>
Add vlan push_eth and pop_eth action to the hardware intermediate
representation model which would subsequently allow it to be used
by drivers for offload.
Signed-off-by: Maor Dickman <maord@...dia.com>
Reviewed-by: Roi Dayan <roid@...dia.com>
---
include/net/flow_offload.h | 4 ++++
include/net/tc_act/tc_vlan.h | 14 ++++++++++++++
net/sched/act_vlan.c | 14 ++++++++++++++
3 files changed, 32 insertions(+)
diff --git a/include/net/flow_offload.h b/include/net/flow_offload.h
index 92267d23083e..2bfa666842c5 100644
--- a/include/net/flow_offload.h
+++ b/include/net/flow_offload.h
@@ -150,6 +150,8 @@ enum flow_action_id {
FLOW_ACTION_PPPOE_PUSH,
FLOW_ACTION_JUMP,
FLOW_ACTION_PIPE,
+ FLOW_ACTION_VLAN_PUSH_ETH,
+ FLOW_ACTION_VLAN_POP_ETH,
NUM_FLOW_ACTIONS,
};
@@ -211,6 +213,8 @@ struct flow_action_entry {
__be16 proto;
u8 prio;
} vlan;
+ unsigned char vlan_push_eth_dst[ETH_ALEN];
+ unsigned char vlan_push_eth_src[ETH_ALEN];
struct { /* FLOW_ACTION_MANGLE */
/* FLOW_ACTION_ADD */
enum flow_action_mangle_base htype;
diff --git a/include/net/tc_act/tc_vlan.h b/include/net/tc_act/tc_vlan.h
index f94b8bc26f9e..8a3422c70f9f 100644
--- a/include/net/tc_act/tc_vlan.h
+++ b/include/net/tc_act/tc_vlan.h
@@ -78,4 +78,18 @@ static inline u8 tcf_vlan_push_prio(const struct tc_action *a)
return tcfv_push_prio;
}
+
+static inline void tcf_vlan_push_dst(unsigned char *dest, const struct tc_action *a)
+{
+ rcu_read_lock();
+ memcpy(dest, rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_dst, ETH_ALEN);
+ rcu_read_unlock();
+}
+
+static inline void tcf_vlan_push_src(unsigned char *dest, const struct tc_action *a)
+{
+ rcu_read_lock();
+ memcpy(dest, rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_src, ETH_ALEN);
+ rcu_read_unlock();
+}
#endif /* __NET_TC_VLAN_H */
diff --git a/net/sched/act_vlan.c b/net/sched/act_vlan.c
index 756e2dcde1cd..d27604204f17 100644
--- a/net/sched/act_vlan.c
+++ b/net/sched/act_vlan.c
@@ -390,6 +390,14 @@ static int tcf_vlan_offload_act_setup(struct tc_action *act, void *entry_data,
entry->vlan.proto = tcf_vlan_push_proto(act);
entry->vlan.prio = tcf_vlan_push_prio(act);
break;
+ case TCA_VLAN_ACT_POP_ETH:
+ entry->id = FLOW_ACTION_VLAN_POP_ETH;
+ break;
+ case TCA_VLAN_ACT_PUSH_ETH:
+ entry->id = FLOW_ACTION_VLAN_PUSH_ETH;
+ tcf_vlan_push_dst(entry->vlan_push_eth_dst, act);
+ tcf_vlan_push_src(entry->vlan_push_eth_src, act);
+ break;
default:
return -EOPNOTSUPP;
}
@@ -407,6 +415,12 @@ static int tcf_vlan_offload_act_setup(struct tc_action *act, void *entry_data,
case TCA_VLAN_ACT_MODIFY:
fl_action->id = FLOW_ACTION_VLAN_MANGLE;
break;
+ case TCA_VLAN_ACT_POP_ETH:
+ fl_action->id = FLOW_ACTION_VLAN_POP_ETH;
+ break;
+ case TCA_VLAN_ACT_PUSH_ETH:
+ fl_action->id = FLOW_ACTION_VLAN_PUSH_ETH;
+ break;
default:
return -EOPNOTSUPP;
}
--
2.34.1
Powered by blists - more mailing lists