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 mapping_mod; 21 u16 ptype; 22 struct rcu_head rcu; 23 }; 24 25 struct tcf_skbedit { 26 struct tc_action common; 27 struct tcf_skbedit_params __rcu *params; 28 }; 29 #define to_skbedit(a) ((struct tcf_skbedit *)a) 30 31 /* Return true iff action is the one identified by FLAG. */ 32 static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag) 33 { 34 #ifdef CONFIG_NET_CLS_ACT 35 u32 flags; 36 37 if (a->ops && a->ops->id == TCA_ID_SKBEDIT) { 38 rcu_read_lock(); 39 flags = rcu_dereference(to_skbedit(a)->params)->flags; 40 rcu_read_unlock(); 41 return flags == flag; 42 } 43 #endif 44 return false; 45 } 46 47 /* Return true iff action is mark */ 48 static inline bool is_tcf_skbedit_mark(const struct tc_action *a) 49 { 50 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK); 51 } 52 53 static inline u32 tcf_skbedit_mark(const struct tc_action *a) 54 { 55 u32 mark; 56 57 rcu_read_lock(); 58 mark = rcu_dereference(to_skbedit(a)->params)->mark; 59 rcu_read_unlock(); 60 61 return mark; 62 } 63 64 /* Return true iff action is ptype */ 65 static inline bool is_tcf_skbedit_ptype(const struct tc_action *a) 66 { 67 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE); 68 } 69 70 static inline u32 tcf_skbedit_ptype(const struct tc_action *a) 71 { 72 u16 ptype; 73 74 rcu_read_lock(); 75 ptype = rcu_dereference(to_skbedit(a)->params)->ptype; 76 rcu_read_unlock(); 77 78 return ptype; 79 } 80 81 /* Return true iff action is priority */ 82 static inline bool is_tcf_skbedit_priority(const struct tc_action *a) 83 { 84 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY); 85 } 86 87 static inline u32 tcf_skbedit_priority(const struct tc_action *a) 88 { 89 u32 priority; 90 91 rcu_read_lock(); 92 priority = rcu_dereference(to_skbedit(a)->params)->priority; 93 rcu_read_unlock(); 94 95 return priority; 96 } 97 98 static inline u16 tcf_skbedit_rx_queue_mapping(const struct tc_action *a) 99 { 100 u16 rx_queue; 101 102 rcu_read_lock(); 103 rx_queue = rcu_dereference(to_skbedit(a)->params)->queue_mapping; 104 rcu_read_unlock(); 105 106 return rx_queue; 107 } 108 109 /* Return true iff action is queue_mapping */ 110 static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a) 111 { 112 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING); 113 } 114 115 /* Return true if action is on ingress traffic */ 116 static inline bool is_tcf_skbedit_ingress(u32 flags) 117 { 118 return flags & TCA_ACT_FLAGS_AT_INGRESS; 119 } 120 121 static inline bool is_tcf_skbedit_tx_queue_mapping(const struct tc_action *a) 122 { 123 return is_tcf_skbedit_queue_mapping(a) && 124 !is_tcf_skbedit_ingress(a->tcfa_flags); 125 } 126 127 static inline bool is_tcf_skbedit_rx_queue_mapping(const struct tc_action *a) 128 { 129 return is_tcf_skbedit_queue_mapping(a) && 130 is_tcf_skbedit_ingress(a->tcfa_flags); 131 } 132 133 /* Return true iff action is inheritdsfield */ 134 static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a) 135 { 136 return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD); 137 } 138 139 #endif /* __NET_TC_SKBEDIT_H */ 140