1 /* 2 * Copyright (c) 2014 Jiri Pirko <jiri@resnulli.us> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 */ 9 10 #ifndef __NET_TC_VLAN_H 11 #define __NET_TC_VLAN_H 12 13 #include <net/act_api.h> 14 #include <linux/tc_act/tc_vlan.h> 15 16 struct tcf_vlan_params { 17 int tcfv_action; 18 u16 tcfv_push_vid; 19 __be16 tcfv_push_proto; 20 u8 tcfv_push_prio; 21 struct rcu_head rcu; 22 }; 23 24 struct tcf_vlan { 25 struct tc_action common; 26 struct tcf_vlan_params __rcu *vlan_p; 27 }; 28 #define to_vlan(a) ((struct tcf_vlan *)a) 29 30 static inline bool is_tcf_vlan(const struct tc_action *a) 31 { 32 #ifdef CONFIG_NET_CLS_ACT 33 if (a->ops && a->ops->type == TCA_ACT_VLAN) 34 return true; 35 #endif 36 return false; 37 } 38 39 static inline u32 tcf_vlan_action(const struct tc_action *a) 40 { 41 u32 tcfv_action; 42 43 rcu_read_lock(); 44 tcfv_action = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_action; 45 rcu_read_unlock(); 46 47 return tcfv_action; 48 } 49 50 static inline u16 tcf_vlan_push_vid(const struct tc_action *a) 51 { 52 u16 tcfv_push_vid; 53 54 rcu_read_lock(); 55 tcfv_push_vid = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_vid; 56 rcu_read_unlock(); 57 58 return tcfv_push_vid; 59 } 60 61 static inline __be16 tcf_vlan_push_proto(const struct tc_action *a) 62 { 63 __be16 tcfv_push_proto; 64 65 rcu_read_lock(); 66 tcfv_push_proto = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_proto; 67 rcu_read_unlock(); 68 69 return tcfv_push_proto; 70 } 71 72 static inline u8 tcf_vlan_push_prio(const struct tc_action *a) 73 { 74 u8 tcfv_push_prio; 75 76 rcu_read_lock(); 77 tcfv_push_prio = rcu_dereference(to_vlan(a)->vlan_p)->tcfv_push_prio; 78 rcu_read_unlock(); 79 80 return tcfv_push_prio; 81 } 82 #endif /* __NET_TC_VLAN_H */ 83