1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Copyright (c) 2008, Intel Corporation. 4 * 5 * Author: Alexander Duyck <alexander.h.duyck@intel.com> 6 */ 7 8 #ifndef __NET_TC_SKBEDIT_H 9 #define __NET_TC_SKBEDIT_H 10 11 #include <net/act_api.h> 12 #include <linux/tc_act/tc_skbedit.h> 13 14 struct tcf_skbedit_params { 15 u32 flags; 16 u32 priority; 17 u32 mark; 18 u32 mask; 19 u16 queue_mapping; 20 u16 ptype; 21 struct rcu_head rcu; 22 }; 23 24 struct tcf_skbedit { 25 struct tc_action common; 26 struct tcf_skbedit_params __rcu *params; 27 }; 28 #define to_skbedit(a) ((struct tcf_skbedit *)a) 29 30 /* Return true iff action is the one identified by FLAG. */ is_tcf_skbedit_with_flag(const struct tc_action * a,u32 flag)31static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag) 32 { 33 #ifdef CONFIG_NET_CLS_ACT 34 u32 flags; 35 36 if (a->ops && a->ops->id == TCA_ID_SKBEDIT) { 37 rcu_read_lock(); 38 flags = rcu_dereference(to_skbedit(a)->params)->flags; 39 rcu_read_unlock(); 40 return flags == flag; 41 } 42 #endif 43 return false; 44 } 45 46 /* Return true iff action is mark */ is_tcf_skbedit_mark(const struct tc_action * a)47static inline bool is_tcf_skbedit_mark(const struct tc_action *a) 48 { 49 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK); 50 } 51 tcf_skbedit_mark(const struct tc_action * a)52static inline u32 tcf_skbedit_mark(const struct tc_action *a) 53 { 54 u32 mark; 55 56 rcu_read_lock(); 57 mark = rcu_dereference(to_skbedit(a)->params)->mark; 58 rcu_read_unlock(); 59 60 return mark; 61 } 62 63 /* Return true iff action is ptype */ is_tcf_skbedit_ptype(const struct tc_action * a)64static inline bool is_tcf_skbedit_ptype(const struct tc_action *a) 65 { 66 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE); 67 } 68 tcf_skbedit_ptype(const struct tc_action * a)69static inline u32 tcf_skbedit_ptype(const struct tc_action *a) 70 { 71 u16 ptype; 72 73 rcu_read_lock(); 74 ptype = rcu_dereference(to_skbedit(a)->params)->ptype; 75 rcu_read_unlock(); 76 77 return ptype; 78 } 79 80 /* Return true iff action is priority */ is_tcf_skbedit_priority(const struct tc_action * a)81static inline bool is_tcf_skbedit_priority(const struct tc_action *a) 82 { 83 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY); 84 } 85 tcf_skbedit_priority(const struct tc_action * a)86static inline u32 tcf_skbedit_priority(const struct tc_action *a) 87 { 88 u32 priority; 89 90 rcu_read_lock(); 91 priority = rcu_dereference(to_skbedit(a)->params)->priority; 92 rcu_read_unlock(); 93 94 return priority; 95 } 96 97 #endif /* __NET_TC_SKBEDIT_H */ 98