xref: /linux/include/net/tc_act/tc_skbedit.h (revision a9c64939b669b3c83cc54738d1986430e6beaff2)
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;
20ff202ee1SJamal Hadi Salim 	u16 ptype;
21c749cddaSDavide Caratti 	struct rcu_head rcu;
22c749cddaSDavide Caratti };
23c749cddaSDavide Caratti 
24c749cddaSDavide Caratti struct tcf_skbedit {
25c749cddaSDavide Caratti 	struct tc_action common;
26c749cddaSDavide Caratti 	struct tcf_skbedit_params __rcu *params;
27ca9b0e27SAlexander Duyck };
28a85a970aSWANG Cong #define to_skbedit(a) ((struct tcf_skbedit *)a)
29ca9b0e27SAlexander Duyck 
30fe93f0b2SPetr Machata /* Return true iff action is the one identified by FLAG. */
31fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag)
32519afb18SAmir Vadai {
33519afb18SAmir Vadai #ifdef CONFIG_NET_CLS_ACT
34c749cddaSDavide Caratti 	u32 flags;
35c749cddaSDavide Caratti 
36eddd2cf1SEli Cohen 	if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
37c749cddaSDavide Caratti 		rcu_read_lock();
38c749cddaSDavide Caratti 		flags = rcu_dereference(to_skbedit(a)->params)->flags;
39c749cddaSDavide Caratti 		rcu_read_unlock();
40fe93f0b2SPetr Machata 		return flags == flag;
41c749cddaSDavide Caratti 	}
42519afb18SAmir Vadai #endif
43519afb18SAmir Vadai 	return false;
44519afb18SAmir Vadai }
45519afb18SAmir Vadai 
46fe93f0b2SPetr Machata /* Return true iff action is mark */
47fe93f0b2SPetr Machata static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
48fe93f0b2SPetr Machata {
49fe93f0b2SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK);
50fe93f0b2SPetr Machata }
51fe93f0b2SPetr Machata 
52519afb18SAmir Vadai static inline u32 tcf_skbedit_mark(const struct tc_action *a)
53519afb18SAmir Vadai {
54c749cddaSDavide Caratti 	u32 mark;
55c749cddaSDavide Caratti 
56c749cddaSDavide Caratti 	rcu_read_lock();
57c749cddaSDavide Caratti 	mark = rcu_dereference(to_skbedit(a)->params)->mark;
58c749cddaSDavide Caratti 	rcu_read_unlock();
59c749cddaSDavide Caratti 
60c749cddaSDavide Caratti 	return mark;
61519afb18SAmir Vadai }
62519afb18SAmir Vadai 
6377feb4eeSJohn Hurley /* Return true iff action is ptype */
6477feb4eeSJohn Hurley static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
6577feb4eeSJohn Hurley {
66fe93f0b2SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE);
6777feb4eeSJohn Hurley }
6877feb4eeSJohn Hurley 
6977feb4eeSJohn Hurley static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
7077feb4eeSJohn Hurley {
7177feb4eeSJohn Hurley 	u16 ptype;
7277feb4eeSJohn Hurley 
7377feb4eeSJohn Hurley 	rcu_read_lock();
7477feb4eeSJohn Hurley 	ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
7577feb4eeSJohn Hurley 	rcu_read_unlock();
7677feb4eeSJohn Hurley 
7777feb4eeSJohn Hurley 	return ptype;
7877feb4eeSJohn Hurley }
7977feb4eeSJohn Hurley 
802ce12410SPetr Machata /* Return true iff action is priority */
812ce12410SPetr Machata static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
822ce12410SPetr Machata {
832ce12410SPetr Machata 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
842ce12410SPetr Machata }
852ce12410SPetr Machata 
862ce12410SPetr Machata static inline u32 tcf_skbedit_priority(const struct tc_action *a)
872ce12410SPetr Machata {
882ce12410SPetr Machata 	u32 priority;
892ce12410SPetr Machata 
902ce12410SPetr Machata 	rcu_read_lock();
912ce12410SPetr Machata 	priority = rcu_dereference(to_skbedit(a)->params)->priority;
922ce12410SPetr Machata 	rcu_read_unlock();
932ce12410SPetr Machata 
942ce12410SPetr Machata 	return priority;
952ce12410SPetr Machata }
962ce12410SPetr Machata 
97*a9c64939SIdo Schimmel /* Return true iff action is queue_mapping */
98*a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a)
99*a9c64939SIdo Schimmel {
100*a9c64939SIdo Schimmel 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING);
101*a9c64939SIdo Schimmel }
102*a9c64939SIdo Schimmel 
103*a9c64939SIdo Schimmel /* Return true iff action is inheritdsfield */
104*a9c64939SIdo Schimmel static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a)
105*a9c64939SIdo Schimmel {
106*a9c64939SIdo Schimmel 	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD);
107*a9c64939SIdo Schimmel }
108*a9c64939SIdo Schimmel 
109ca9b0e27SAlexander Duyck #endif /* __NET_TC_SKBEDIT_H */
110