1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us> 4 */ 5 6 #ifndef __NET_TC_VLAN_H 7 #define __NET_TC_VLAN_H 8 9 #include <net/act_api.h> 10 #include <linux/tc_act/tc_vlan.h> 11 12 struct tcf_vlan_params { 13 int tcfv_action; 14 u16 tcfv_push_vid; 15 __be16 tcfv_push_proto; 16 u8 tcfv_push_prio; 17 struct rcu_head rcu; 18 }; 19 20 struct tcf_vlan { 21 struct tc_action common; 22 struct tcf_vlan_params __rcu *vlan_p; 23 }; 24 #define to_vlan(a) ((struct tcf_vlan *)a) 25 26 static inline bool is_tcf_vlan(const struct tc_action *a) 27 { 28 #ifdef CONFIG_NET_CLS_ACT 29 if (a->ops && a->ops->id == TCA_ID_VLAN) 30 return true; 31 #endif 32 return false; 33 } 34 35 static inline u32 tcf_vlan_action(const struct tc_action *a) 36 { 37 u32 tcfv_action; 38 39 rcu_read_lock(); 40 tcfv_action = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_action; 41 rcu_read_unlock(); 42 43 return tcfv_action; 44 } 45 46 static inline u16 tcf_vlan_push_vid(const struct tc_action *a) 47 { 48 u16 tcfv_push_vid; 49 50 rcu_read_lock(); 51 tcfv_push_vid = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_vid; 52 rcu_read_unlock(); 53 54 return tcfv_push_vid; 55 } 56 57 static inline __be16 tcf_vlan_push_proto(const struct tc_action *a) 58 { 59 __be16 tcfv_push_proto; 60 61 rcu_read_lock(); 62 tcfv_push_proto = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_proto; 63 rcu_read_unlock(); 64 65 return tcfv_push_proto; 66 } 67 68 static inline u8 tcf_vlan_push_prio(const struct tc_action *a) 69 { 70 u8 tcfv_push_prio; 71 72 rcu_read_lock(); 73 tcfv_push_prio = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_prio; 74 rcu_read_unlock(); 75 76 return tcfv_push_prio; 77 } 78 #endif /* __NET_TC_VLAN_H */ 79