162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef __NET_TC_PED_H
362306a36Sopenharmony_ci#define __NET_TC_PED_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <net/act_api.h>
662306a36Sopenharmony_ci#include <linux/tc_act/tc_pedit.h>
762306a36Sopenharmony_ci#include <linux/types.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_cistruct tcf_pedit_key_ex {
1062306a36Sopenharmony_ci	enum pedit_header_type htype;
1162306a36Sopenharmony_ci	enum pedit_cmd cmd;
1262306a36Sopenharmony_ci};
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct tcf_pedit_parms {
1562306a36Sopenharmony_ci	struct tc_pedit_key	*tcfp_keys;
1662306a36Sopenharmony_ci	struct tcf_pedit_key_ex	*tcfp_keys_ex;
1762306a36Sopenharmony_ci	u32 tcfp_off_max_hint;
1862306a36Sopenharmony_ci	unsigned char tcfp_nkeys;
1962306a36Sopenharmony_ci	unsigned char tcfp_flags;
2062306a36Sopenharmony_ci	struct rcu_head rcu;
2162306a36Sopenharmony_ci};
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_cistruct tcf_pedit {
2462306a36Sopenharmony_ci	struct tc_action common;
2562306a36Sopenharmony_ci	struct tcf_pedit_parms __rcu *parms;
2662306a36Sopenharmony_ci};
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define to_pedit(a) ((struct tcf_pedit *)a)
2962306a36Sopenharmony_ci#define to_pedit_parms(a) (rcu_dereference(to_pedit(a)->parms))
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic inline bool is_tcf_pedit(const struct tc_action *a)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci#ifdef CONFIG_NET_CLS_ACT
3462306a36Sopenharmony_ci	if (a->ops && a->ops->id == TCA_ID_PEDIT)
3562306a36Sopenharmony_ci		return true;
3662306a36Sopenharmony_ci#endif
3762306a36Sopenharmony_ci	return false;
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline int tcf_pedit_nkeys(const struct tc_action *a)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
4362306a36Sopenharmony_ci	int nkeys;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	rcu_read_lock();
4662306a36Sopenharmony_ci	parms = to_pedit_parms(a);
4762306a36Sopenharmony_ci	nkeys = parms->tcfp_nkeys;
4862306a36Sopenharmony_ci	rcu_read_unlock();
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	return nkeys;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline u32 tcf_pedit_htype(const struct tc_action *a, int index)
5462306a36Sopenharmony_ci{
5562306a36Sopenharmony_ci	u32 htype = TCA_PEDIT_KEY_EX_HDR_TYPE_NETWORK;
5662306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	rcu_read_lock();
5962306a36Sopenharmony_ci	parms = to_pedit_parms(a);
6062306a36Sopenharmony_ci	if (parms->tcfp_keys_ex)
6162306a36Sopenharmony_ci		htype = parms->tcfp_keys_ex[index].htype;
6262306a36Sopenharmony_ci	rcu_read_unlock();
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	return htype;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline u32 tcf_pedit_cmd(const struct tc_action *a, int index)
6862306a36Sopenharmony_ci{
6962306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
7062306a36Sopenharmony_ci	u32 cmd = __PEDIT_CMD_MAX;
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	rcu_read_lock();
7362306a36Sopenharmony_ci	parms = to_pedit_parms(a);
7462306a36Sopenharmony_ci	if (parms->tcfp_keys_ex)
7562306a36Sopenharmony_ci		cmd = parms->tcfp_keys_ex[index].cmd;
7662306a36Sopenharmony_ci	rcu_read_unlock();
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	return cmd;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline u32 tcf_pedit_mask(const struct tc_action *a, int index)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
8462306a36Sopenharmony_ci	u32 mask;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	rcu_read_lock();
8762306a36Sopenharmony_ci	parms = to_pedit_parms(a);
8862306a36Sopenharmony_ci	mask = parms->tcfp_keys[index].mask;
8962306a36Sopenharmony_ci	rcu_read_unlock();
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci	return mask;
9262306a36Sopenharmony_ci}
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_cistatic inline u32 tcf_pedit_val(const struct tc_action *a, int index)
9562306a36Sopenharmony_ci{
9662306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
9762306a36Sopenharmony_ci	u32 val;
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	rcu_read_lock();
10062306a36Sopenharmony_ci	parms = to_pedit_parms(a);
10162306a36Sopenharmony_ci	val = parms->tcfp_keys[index].val;
10262306a36Sopenharmony_ci	rcu_read_unlock();
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	return val;
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic inline u32 tcf_pedit_offset(const struct tc_action *a, int index)
10862306a36Sopenharmony_ci{
10962306a36Sopenharmony_ci	struct tcf_pedit_parms *parms;
11062306a36Sopenharmony_ci	u32 off;
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	rcu_read_lock();
11362306a36Sopenharmony_ci	parms = to_pedit_parms(a);
11462306a36Sopenharmony_ci	off = parms->tcfp_keys[index].off;
11562306a36Sopenharmony_ci	rcu_read_unlock();
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	return off;
11862306a36Sopenharmony_ci}
11962306a36Sopenharmony_ci#endif /* __NET_TC_PED_H */
120