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. */ |
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 */ |
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 | |
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 */ |
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 | |
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 */ |
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 | |
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 | 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 */ |
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 */ |
116 | static inline bool is_tcf_skbedit_ingress(u32 flags) |
117 | { |
118 | return flags & TCA_ACT_FLAGS_AT_INGRESS; |
119 | } |
120 | |
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(flags: a->tcfa_flags); |
125 | } |
126 | |
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(flags: a->tcfa_flags); |
131 | } |
132 | |
133 | /* Return true iff action is inheritdsfield */ |
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 |