GNU Linux-libre 6.0.15-gnu
[releases.git] / include / net / 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 /* Return true iff action is queue_mapping */
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 */
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 */