• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 ptype;
21  	struct rcu_head rcu;
22  };
23  
24  struct tcf_skbedit {
25  	struct tc_action common;
26  	struct tcf_skbedit_params __rcu *params;
27  };
28  #define to_skbedit(a) ((struct tcf_skbedit *)a)
29  
30  /* Return true iff action is the one identified by FLAG. */
is_tcf_skbedit_with_flag(const struct tc_action * a,u32 flag)31  static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag)
32  {
33  #ifdef CONFIG_NET_CLS_ACT
34  	u32 flags;
35  
36  	if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
37  		rcu_read_lock();
38  		flags = rcu_dereference(to_skbedit(a)->params)->flags;
39  		rcu_read_unlock();
40  		return flags == flag;
41  	}
42  #endif
43  	return false;
44  }
45  
46  /* Return true iff action is mark */
is_tcf_skbedit_mark(const struct tc_action * a)47  static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
48  {
49  	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK);
50  }
51  
tcf_skbedit_mark(const struct tc_action * a)52  static inline u32 tcf_skbedit_mark(const struct tc_action *a)
53  {
54  	u32 mark;
55  
56  	rcu_read_lock();
57  	mark = rcu_dereference(to_skbedit(a)->params)->mark;
58  	rcu_read_unlock();
59  
60  	return mark;
61  }
62  
63  /* Return true iff action is ptype */
is_tcf_skbedit_ptype(const struct tc_action * a)64  static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
65  {
66  	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE);
67  }
68  
tcf_skbedit_ptype(const struct tc_action * a)69  static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
70  {
71  	u16 ptype;
72  
73  	rcu_read_lock();
74  	ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
75  	rcu_read_unlock();
76  
77  	return ptype;
78  }
79  
80  /* Return true iff action is priority */
is_tcf_skbedit_priority(const struct tc_action * a)81  static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
82  {
83  	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
84  }
85  
tcf_skbedit_priority(const struct tc_action * a)86  static inline u32 tcf_skbedit_priority(const struct tc_action *a)
87  {
88  	u32 priority;
89  
90  	rcu_read_lock();
91  	priority = rcu_dereference(to_skbedit(a)->params)->priority;
92  	rcu_read_unlock();
93  
94  	return priority;
95  }
96  
97  #endif /* __NET_TC_SKBEDIT_H */
98