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