Message ID | 20220309130256.1402040-2-roid@nvidia.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | flow_offload: add tc vlan push_eth and pop_eth actions | expand |
Sorry for the late review. On Wed, 9 Mar 2022 15:02:54 +0200 Roi Dayan wrote: > @@ -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]; Let's wrap these two in a struct, like all other members here, and add the customary comment indicating which action its for. > 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(); > +} The use of these two helpers separately makes no sense, we can't push half a header. It should be one helper populating both src and dst, IMO.
On 2022-03-15 7:02 AM, Jakub Kicinski wrote: > Sorry for the late review. > > On Wed, 9 Mar 2022 15:02:54 +0200 Roi Dayan wrote: >> @@ -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]; > > Let's wrap these two in a struct, like all other members here, > and add the customary comment indicating which action its for. > ok. >> 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(); >> +} > > The use of these two helpers separately makes no sense, we can't push > half a header. It should be one helper populating both src and dst, IMO. ok.
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; }