1/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
2/* Copyright (C) 2019 Netronome Systems, Inc. */
3
4#ifndef __NET_TC_MPLS_H
5#define __NET_TC_MPLS_H
6
7#include <linux/tc_act/tc_mpls.h>
8#include <net/act_api.h>
9
10struct tcf_mpls_params {
11 int tcfm_action;
12 u32 tcfm_label;
13 int action; /* tcf_action */
14 u8 tcfm_tc;
15 u8 tcfm_ttl;
16 u8 tcfm_bos;
17 __be16 tcfm_proto;
18 struct rcu_head rcu;
19};
20
21#define ACT_MPLS_TC_NOT_SET 0xff
22#define ACT_MPLS_BOS_NOT_SET 0xff
23#define ACT_MPLS_LABEL_NOT_SET 0xffffffff
24
25struct tcf_mpls {
26 struct tc_action common;
27 struct tcf_mpls_params __rcu *mpls_p;
28};
29#define to_mpls(a) ((struct tcf_mpls *)a)
30
31static inline u32 tcf_mpls_action(const struct tc_action *a)
32{
33 u32 tcfm_action;
34
35 rcu_read_lock();
36 tcfm_action = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_action;
37 rcu_read_unlock();
38
39 return tcfm_action;
40}
41
42static inline __be16 tcf_mpls_proto(const struct tc_action *a)
43{
44 __be16 tcfm_proto;
45
46 rcu_read_lock();
47 tcfm_proto = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_proto;
48 rcu_read_unlock();
49
50 return tcfm_proto;
51}
52
53static inline u32 tcf_mpls_label(const struct tc_action *a)
54{
55 u32 tcfm_label;
56
57 rcu_read_lock();
58 tcfm_label = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_label;
59 rcu_read_unlock();
60
61 return tcfm_label;
62}
63
64static inline u8 tcf_mpls_tc(const struct tc_action *a)
65{
66 u8 tcfm_tc;
67
68 rcu_read_lock();
69 tcfm_tc = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_tc;
70 rcu_read_unlock();
71
72 return tcfm_tc;
73}
74
75static inline u8 tcf_mpls_bos(const struct tc_action *a)
76{
77 u8 tcfm_bos;
78
79 rcu_read_lock();
80 tcfm_bos = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_bos;
81 rcu_read_unlock();
82
83 return tcfm_bos;
84}
85
86static inline u8 tcf_mpls_ttl(const struct tc_action *a)
87{
88 u8 tcfm_ttl;
89
90 rcu_read_lock();
91 tcfm_ttl = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_ttl;
92 rcu_read_unlock();
93
94 return tcfm_ttl;
95}
96
97#endif /* __NET_TC_MPLS_H */
98