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