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 
98 /* Return true iff action is queue_mapping */
is_tcf_skbedit_queue_mapping(const struct tc_action * a)99 static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a)
100 {
101 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING);
102 }
103 
104 /* Return true iff action is inheritdsfield */
is_tcf_skbedit_inheritdsfield(const struct tc_action * a)105 static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a)
106 {
107 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD);
108 }
109 
110 #endif /* __NET_TC_SKBEDIT_H */
111