xref: /linux/include/net/tc_act/tc_skbedit.h (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
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. */
is_tcf_skbedit_with_flag(const struct tc_action * a,u32 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 */
is_tcf_skbedit_mark(const struct tc_action * a)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 
tcf_skbedit_mark(const struct tc_action * a)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 */
is_tcf_skbedit_ptype(const struct tc_action * a)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 
tcf_skbedit_ptype(const struct tc_action * a)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 */
is_tcf_skbedit_priority(const struct tc_action * a)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 
tcf_skbedit_priority(const struct tc_action * a)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 
tcf_skbedit_rx_queue_mapping(const struct tc_action * a)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 */
is_tcf_skbedit_queue_mapping(const struct tc_action * a)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 */
is_tcf_skbedit_ingress(u32 flags)116 static inline bool is_tcf_skbedit_ingress(u32 flags)
117 {
118 	return flags & TCA_ACT_FLAGS_AT_INGRESS;
119 }
120 
is_tcf_skbedit_tx_queue_mapping(const struct tc_action * a)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 
is_tcf_skbedit_rx_queue_mapping(const struct tc_action * a)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 */
is_tcf_skbedit_inheritdsfield(const struct tc_action * a)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