1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __NET_TC_PED_H 3 #define __NET_TC_PED_H 4 5 #include <net/act_api.h> 6 #include <linux/tc_act/tc_pedit.h> 7 #include <linux/types.h> 8 9 struct tcf_pedit_key_ex { 10 enum pedit_header_type htype; 11 enum pedit_cmd cmd; 12 }; 13 14 struct tcf_pedit_parms { 15 struct tc_pedit_key *tcfp_keys; 16 struct tcf_pedit_key_ex *tcfp_keys_ex; 17 u32 tcfp_off_max_hint; 18 unsigned char tcfp_nkeys; 19 unsigned char tcfp_flags; 20 struct rcu_head rcu; 21 }; 22 23 struct tcf_pedit { 24 struct tc_action common; 25 struct tcf_pedit_parms __rcu *parms; 26 }; 27 28 #define to_pedit(a) ((struct tcf_pedit *)a) 29 #define to_pedit_parms(a) (rcu_dereference(to_pedit(a)->parms)) 30 31 static inline bool is_tcf_pedit(const struct tc_action *a) 32 { 33 #ifdef CONFIG_NET_CLS_ACT 34 if (a->ops && a->ops->id == TCA_ID_PEDIT) 35 return true; 36 #endif 37 return false; 38 } 39 40 static inline int tcf_pedit_nkeys(const struct tc_action *a) 41 { 42 struct tcf_pedit_parms *parms; 43 int nkeys; 44 45 rcu_read_lock(); 46 parms = to_pedit_parms(a); 47 nkeys = parms->tcfp_nkeys; 48 rcu_read_unlock(); 49 50 return nkeys; 51 } 52 53 static inline u32 tcf_pedit_htype(const struct tc_action *a, int index) 54 { 55 u32 htype = TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK; 56 struct tcf_pedit_parms *parms; 57 58 rcu_read_lock(); 59 parms = to_pedit_parms(a); 60 if (parms->tcfp_keys_ex) 61 htype = parms->tcfp_keys_ex[index].htype; 62 rcu_read_unlock(); 63 64 return htype; 65 } 66 67 static inline u32 tcf_pedit_cmd(const struct tc_action *a, int index) 68 { 69 struct tcf_pedit_parms *parms; 70 u32 cmd = __PEDIT_CMD_MAX; 71 72 rcu_read_lock(); 73 parms = to_pedit_parms(a); 74 if (parms->tcfp_keys_ex) 75 cmd = parms->tcfp_keys_ex[index].cmd; 76 rcu_read_unlock(); 77 78 return cmd; 79 } 80 81 static inline u32 tcf_pedit_mask(const struct tc_action *a, int index) 82 { 83 struct tcf_pedit_parms *parms; 84 u32 mask; 85 86 rcu_read_lock(); 87 parms = to_pedit_parms(a); 88 mask = parms->tcfp_keys[index].mask; 89 rcu_read_unlock(); 90 91 return mask; 92 } 93 94 static inline u32 tcf_pedit_val(const struct tc_action *a, int index) 95 { 96 struct tcf_pedit_parms *parms; 97 u32 val; 98 99 rcu_read_lock(); 100 parms = to_pedit_parms(a); 101 val = parms->tcfp_keys[index].val; 102 rcu_read_unlock(); 103 104 return val; 105 } 106 107 static inline u32 tcf_pedit_offset(const struct tc_action *a, int index) 108 { 109 struct tcf_pedit_parms *parms; 110 u32 off; 111 112 rcu_read_lock(); 113 parms = to_pedit_parms(a); 114 off = parms->tcfp_keys[index].off; 115 rcu_read_unlock(); 116 117 return off; 118 } 119 #endif /* __NET_TC_PED_H */ 120