net/sched: add vlan push_eth and pop_eth action to the hardware IR
authorMaor Dickman <maord@nvidia.com>
Tue, 15 Mar 2022 11:02:09 +0000 (13:02 +0200)
committerJakub Kicinski <kuba@kernel.org>
Thu, 17 Mar 2022 02:59:36 +0000 (19:59 -0700)
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@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/net/flow_offload.h
include/net/tc_act/tc_vlan.h
net/sched/act_vlan.c

index 92267d2..021778a 100644 (file)
@@ -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,10 @@ struct flow_action_entry {
                        __be16          proto;
                        u8              prio;
                } vlan;
+               struct {                                /* FLOW_ACTION_VLAN_PUSH_ETH */
+                       unsigned char dst[ETH_ALEN];
+                       unsigned char src[ETH_ALEN];
+               } vlan_push_eth;
                struct {                                /* FLOW_ACTION_MANGLE */
                                                        /* FLOW_ACTION_ADD */
                        enum flow_action_mangle_base htype;
index f94b8bc..a97600f 100644 (file)
@@ -78,4 +78,14 @@ static inline u8 tcf_vlan_push_prio(const struct tc_action *a)
 
        return tcfv_push_prio;
 }
+
+static inline void tcf_vlan_push_eth(unsigned char *src, 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);
+       memcpy(dest, rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_src, ETH_ALEN);
+       rcu_read_unlock();
+}
+
 #endif /* __NET_TC_VLAN_H */
index 756e2dc..883454c 100644 (file)
@@ -390,6 +390,13 @@ 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_eth(entry->vlan_push_eth.src, entry->vlan_push_eth.dst, act);
+                       break;
                default:
                        return -EOPNOTSUPP;
                }
@@ -407,6 +414,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;
                }