162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */
262306a36Sopenharmony_ci/* Copyright (C) 2019 Netronome Systems, Inc. */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __NET_TC_MPLS_H
562306a36Sopenharmony_ci#define __NET_TC_MPLS_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/tc_act/tc_mpls.h>
862306a36Sopenharmony_ci#include <net/act_api.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct tcf_mpls_params {
1162306a36Sopenharmony_ci	int tcfm_action;
1262306a36Sopenharmony_ci	u32 tcfm_label;
1362306a36Sopenharmony_ci	u8 tcfm_tc;
1462306a36Sopenharmony_ci	u8 tcfm_ttl;
1562306a36Sopenharmony_ci	u8 tcfm_bos;
1662306a36Sopenharmony_ci	__be16 tcfm_proto;
1762306a36Sopenharmony_ci	struct rcu_head	rcu;
1862306a36Sopenharmony_ci};
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define ACT_MPLS_TC_NOT_SET	0xff
2162306a36Sopenharmony_ci#define ACT_MPLS_BOS_NOT_SET	0xff
2262306a36Sopenharmony_ci#define ACT_MPLS_LABEL_NOT_SET	0xffffffff
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct tcf_mpls {
2562306a36Sopenharmony_ci	struct tc_action common;
2662306a36Sopenharmony_ci	struct tcf_mpls_params __rcu *mpls_p;
2762306a36Sopenharmony_ci};
2862306a36Sopenharmony_ci#define to_mpls(a) ((struct tcf_mpls *)a)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cistatic inline bool is_tcf_mpls(const struct tc_action *a)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci#ifdef CONFIG_NET_CLS_ACT
3362306a36Sopenharmony_ci	if (a->ops && a->ops->id == TCA_ID_MPLS)
3462306a36Sopenharmony_ci		return true;
3562306a36Sopenharmony_ci#endif
3662306a36Sopenharmony_ci	return false;
3762306a36Sopenharmony_ci}
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistatic inline u32 tcf_mpls_action(const struct tc_action *a)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	u32 tcfm_action;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	rcu_read_lock();
4462306a36Sopenharmony_ci	tcfm_action = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_action;
4562306a36Sopenharmony_ci	rcu_read_unlock();
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return tcfm_action;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline __be16 tcf_mpls_proto(const struct tc_action *a)
5162306a36Sopenharmony_ci{
5262306a36Sopenharmony_ci	__be16 tcfm_proto;
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	rcu_read_lock();
5562306a36Sopenharmony_ci	tcfm_proto = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_proto;
5662306a36Sopenharmony_ci	rcu_read_unlock();
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	return tcfm_proto;
5962306a36Sopenharmony_ci}
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cistatic inline u32 tcf_mpls_label(const struct tc_action *a)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	u32 tcfm_label;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	rcu_read_lock();
6662306a36Sopenharmony_ci	tcfm_label = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_label;
6762306a36Sopenharmony_ci	rcu_read_unlock();
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	return tcfm_label;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline u8 tcf_mpls_tc(const struct tc_action *a)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	u8 tcfm_tc;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	rcu_read_lock();
7762306a36Sopenharmony_ci	tcfm_tc = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_tc;
7862306a36Sopenharmony_ci	rcu_read_unlock();
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	return tcfm_tc;
8162306a36Sopenharmony_ci}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic inline u8 tcf_mpls_bos(const struct tc_action *a)
8462306a36Sopenharmony_ci{
8562306a36Sopenharmony_ci	u8 tcfm_bos;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	rcu_read_lock();
8862306a36Sopenharmony_ci	tcfm_bos = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_bos;
8962306a36Sopenharmony_ci	rcu_read_unlock();
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	return tcfm_bos;
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic inline u8 tcf_mpls_ttl(const struct tc_action *a)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	u8 tcfm_ttl;
9762306a36Sopenharmony_ci
9862306a36Sopenharmony_ci	rcu_read_lock();
9962306a36Sopenharmony_ci	tcfm_ttl = rcu_dereference(to_mpls(a)->mpls_p)->tcfm_ttl;
10062306a36Sopenharmony_ci	rcu_read_unlock();
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	return tcfm_ttl;
10362306a36Sopenharmony_ci}
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#endif /* __NET_TC_MPLS_H */
106