xref: /linux/include/net/tc_act/tc_skbedit.h (revision 38a6f0865796e26fc38fff4858f681d9ae76fa0f)
19952f691SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2ca9b0e27SAlexander Duyck /*
3ca9b0e27SAlexander Duyck  * Copyright (c) 2008, Intel Corporation.
4ca9b0e27SAlexander Duyck  *
5ca9b0e27SAlexander Duyck  * Author: Alexander Duyck <alexander.h.duyck@intel.com>
6ca9b0e27SAlexander Duyck  */
7ca9b0e27SAlexander Duyck 
8ca9b0e27SAlexander Duyck #ifndef __NET_TC_SKBEDIT_H
9ca9b0e27SAlexander Duyck #define __NET_TC_SKBEDIT_H
10ca9b0e27SAlexander Duyck 
11ca9b0e27SAlexander Duyck #include <net/act_api.h>
12519afb18SAmir Vadai #include <linux/tc_act/tc_skbedit.h>
13ca9b0e27SAlexander Duyck 
14c749cddaSDavide Caratti struct tcf_skbedit_params {
15ca9b0e27SAlexander Duyck 	u32 flags;
16ca9b0e27SAlexander Duyck 	u32 priority;
171c55d62eSjamal 	u32 mark;
184fe77d82SAntonio Quartulli 	u32 mask;
19ca9b0e27SAlexander Duyck 	u16 queue_mapping;
20*38a6f086STonghao Zhang 	u16 mapping_mod;
21ff202ee1SJamal Hadi Salim 	u16 ptype;
22c749cddaSDavide Caratti 	struct rcu_head rcu;
23c749cddaSDavide Caratti };
24c749cddaSDavide Caratti 
25c749cddaSDavide Caratti struct tcf_skbedit {
26c749cddaSDavide Caratti 	struct tc_action common;
27c749cddaSDavide Caratti 	struct tcf_skbedit_params __rcu *params;
28ca9b0e27SAlexander Duyck };
29a85a970aSWANG Cong #define to_skbedit(a) ((struct tcf_skbedit *)a)
30ca9b0e27SAlexander Duyck 
31fe93f0b2SPetr Machata /* Return true iff action is the one identified by FLAG. */
32fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag)
33519afb18SAmir Vadai {
34519afb18SAmir Vadai #ifdef CONFIG_NET_CLS_ACT
35c749cddaSDavide Caratti 	u32 flags;
36c749cddaSDavide Caratti 
37eddd2cf1SEli Cohen 	if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
38c749cddaSDavide Caratti 		rcu_read_lock();
39c749cddaSDavide Caratti 		flags = rcu_dereference(to_skbedit(a)->params)->flags;
40c749cddaSDavide Caratti 		rcu_read_unlock();
41fe93f0b2SPetr Machata 		return flags == flag;
42c749cddaSDavide Caratti 	}
43519afb18SAmir Vadai #endif
44519afb18SAmir Vadai 	return false;
45519afb18SAmir Vadai }
46519afb18SAmir Vadai 
47fe93f0b2SPetr Machata /* Return true iff action is mark */
48fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
49fe93f0b2SPetr Machata {
50fe93f0b2SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK);
51fe93f0b2SPetr Machata }
52fe93f0b2SPetr Machata 
53519afb18SAmir Vadai static inline u32 tcf_skbedit_mark(const struct tc_action *a)
54519afb18SAmir Vadai {
55c749cddaSDavide Caratti 	u32 mark;
56c749cddaSDavide Caratti 
57c749cddaSDavide Caratti 	rcu_read_lock();
58c749cddaSDavide Caratti 	mark = rcu_dereference(to_skbedit(a)->params)->mark;
59c749cddaSDavide Caratti 	rcu_read_unlock();
60c749cddaSDavide Caratti 
61c749cddaSDavide Caratti 	return mark;
62519afb18SAmir Vadai }
63519afb18SAmir Vadai 
6477feb4eeSJohn Hurley /* Return true iff action is ptype */
6577feb4eeSJohn Hurley static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
6677feb4eeSJohn Hurley {
67fe93f0b2SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE);
6877feb4eeSJohn Hurley }
6977feb4eeSJohn Hurley 
7077feb4eeSJohn Hurley static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
7177feb4eeSJohn Hurley {
7277feb4eeSJohn Hurley 	u16 ptype;
7377feb4eeSJohn Hurley 
7477feb4eeSJohn Hurley 	rcu_read_lock();
7577feb4eeSJohn Hurley 	ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
7677feb4eeSJohn Hurley 	rcu_read_unlock();
7777feb4eeSJohn Hurley 
7877feb4eeSJohn Hurley 	return ptype;
7977feb4eeSJohn Hurley }
8077feb4eeSJohn Hurley 
812ce12410SPetr Machata /* Return true iff action is priority */
822ce12410SPetr Machata static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
832ce12410SPetr Machata {
842ce12410SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
852ce12410SPetr Machata }
862ce12410SPetr Machata 
872ce12410SPetr Machata static inline u32 tcf_skbedit_priority(const struct tc_action *a)
882ce12410SPetr Machata {
892ce12410SPetr Machata 	u32 priority;
902ce12410SPetr Machata 
912ce12410SPetr Machata 	rcu_read_lock();
922ce12410SPetr Machata 	priority = rcu_dereference(to_skbedit(a)->params)->priority;
932ce12410SPetr Machata 	rcu_read_unlock();
942ce12410SPetr Machata 
952ce12410SPetr Machata 	return priority;
962ce12410SPetr Machata }
972ce12410SPetr Machata 
98a9c64939SIdo Schimmel /* Return true iff action is queue_mapping */
99a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a)
100a9c64939SIdo Schimmel {
101a9c64939SIdo Schimmel 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING);
102a9c64939SIdo Schimmel }
103a9c64939SIdo Schimmel 
104a9c64939SIdo Schimmel /* Return true iff action is inheritdsfield */
105a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a)
106a9c64939SIdo Schimmel {
107a9c64939SIdo Schimmel 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD);
108a9c64939SIdo Schimmel }
109a9c64939SIdo Schimmel 
110ca9b0e27SAlexander Duyck #endif /* __NET_TC_SKBEDIT_H */
111