2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2014-11-19 14:05:03 +01:00
/*
* Copyright ( c ) 2014 Jiri Pirko < jiri @ resnulli . us >
*/
# ifndef __NET_TC_VLAN_H
# define __NET_TC_VLAN_H
# include <net/act_api.h>
2016-09-22 20:01:41 +03:00
# include <linux/tc_act/tc_vlan.h>
2014-11-19 14:05:03 +01:00
2017-11-07 15:49:05 -05:00
struct tcf_vlan_params {
int tcfv_action ;
2020-10-03 00:44:28 +02:00
unsigned char tcfv_push_dst [ ETH_ALEN ] ;
unsigned char tcfv_push_src [ ETH_ALEN ] ;
2017-11-07 15:49:05 -05:00
u16 tcfv_push_vid ;
__be16 tcfv_push_proto ;
u8 tcfv_push_prio ;
2021-06-01 15:30:50 +03:00
bool tcfv_push_prio_exists ;
2017-11-07 15:49:05 -05:00
struct rcu_head rcu ;
} ;
2014-11-19 14:05:03 +01:00
struct tcf_vlan {
2016-07-25 16:09:42 -07:00
struct tc_action common ;
2017-11-07 15:49:05 -05:00
struct tcf_vlan_params __rcu * vlan_p ;
2014-11-19 14:05:03 +01:00
} ;
2016-07-25 16:09:41 -07:00
# define to_vlan(a) ((struct tcf_vlan *)a)
2014-11-19 14:05:03 +01:00
2016-09-22 20:01:41 +03:00
static inline bool is_tcf_vlan ( const struct tc_action * a )
{
# ifdef CONFIG_NET_CLS_ACT
2019-02-10 14:25:00 +02:00
if ( a - > ops & & a - > ops - > id = = TCA_ID_VLAN )
2016-09-22 20:01:41 +03:00
return true ;
# endif
return false ;
}
static inline u32 tcf_vlan_action ( const struct tc_action * a )
{
2017-11-07 15:49:05 -05:00
u32 tcfv_action ;
rcu_read_lock ( ) ;
tcfv_action = rcu_dereference ( to_vlan ( a ) - > vlan_p ) - > tcfv_action ;
rcu_read_unlock ( ) ;
return tcfv_action ;
2016-09-22 20:01:41 +03:00
}
static inline u16 tcf_vlan_push_vid ( const struct tc_action * a )
{
2017-11-07 15:49:05 -05:00
u16 tcfv_push_vid ;
rcu_read_lock ( ) ;
tcfv_push_vid = rcu_dereference ( to_vlan ( a ) - > vlan_p ) - > tcfv_push_vid ;
rcu_read_unlock ( ) ;
return tcfv_push_vid ;
2016-09-22 20:01:41 +03:00
}
static inline __be16 tcf_vlan_push_proto ( const struct tc_action * a )
{
2017-11-07 15:49:05 -05:00
__be16 tcfv_push_proto ;
rcu_read_lock ( ) ;
tcfv_push_proto = rcu_dereference ( to_vlan ( a ) - > vlan_p ) - > tcfv_push_proto ;
rcu_read_unlock ( ) ;
return tcfv_push_proto ;
2016-09-22 20:01:41 +03:00
}
2017-03-09 09:25:19 +01:00
static inline u8 tcf_vlan_push_prio ( const struct tc_action * a )
{
2017-11-07 15:49:05 -05:00
u8 tcfv_push_prio ;
2017-03-09 09:25:19 +01:00
2017-11-07 15:49:05 -05:00
rcu_read_lock ( ) ;
tcfv_push_prio = rcu_dereference ( to_vlan ( a ) - > vlan_p ) - > tcfv_push_prio ;
rcu_read_unlock ( ) ;
return tcfv_push_prio ;
}
2022-03-15 13:02:09 +02:00
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 ) ;
2022-03-23 11:25:06 +02:00
memcpy ( src , rcu_dereference ( to_vlan ( a ) - > vlan_p ) - > tcfv_push_src , ETH_ALEN ) ;
2022-03-15 13:02:09 +02:00
rcu_read_unlock ( ) ;
}
2014-11-19 14:05:03 +01:00
# endif /* __NET_TC_VLAN_H */