arm64: dts: qcom: sm8550: add TRNG node
[linux-modified.git] / tc_act / tc_skbedit.h
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(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(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 */