/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2008, Intel Corporation.
 *
 * Author: Alexander Duyck <alexander.h.duyck@intel.com>
 */

#ifndef __NET_TC_SKBEDIT_H
#define __NET_TC_SKBEDIT_H

#include <net/act_api.h>
#include <linux/tc_act/tc_skbedit.h>

struct tcf_skbedit_params {
	u32 flags;
	u32 priority;
	u32 mark;
	u32 mask;
	u16 queue_mapping;
	u16 mapping_mod;
	u16 ptype;
	struct rcu_head rcu;
};

struct tcf_skbedit {
	struct tc_action common;
	struct tcf_skbedit_params __rcu *params;
};
#define to_skbedit(a) ((struct tcf_skbedit *)a)

/* Return true iff action is the one identified by FLAG. */
static inline bool is_tcf_skbedit_with_flag(const struct tc_action *a, u32 flag)
{
#ifdef CONFIG_NET_CLS_ACT
	u32 flags;

	if (a->ops && a->ops->id == TCA_ID_SKBEDIT) {
		rcu_read_lock();
		flags = rcu_dereference(to_skbedit(a)->params)->flags;
		rcu_read_unlock();
		return flags == flag;
	}
#endif
	return false;
}

/* Return true iff action is mark */
static inline bool is_tcf_skbedit_mark(const struct tc_action *a)
{
	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_MARK);
}

static inline u32 tcf_skbedit_mark(const struct tc_action *a)
{
	u32 mark;

	rcu_read_lock();
	mark = rcu_dereference(to_skbedit(a)->params)->mark;
	rcu_read_unlock();

	return mark;
}

/* Return true iff action is ptype */
static inline bool is_tcf_skbedit_ptype(const struct tc_action *a)
{
	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PTYPE);
}

static inline u32 tcf_skbedit_ptype(const struct tc_action *a)
{
	u16 ptype;

	rcu_read_lock();
	ptype = rcu_dereference(to_skbedit(a)->params)->ptype;
	rcu_read_unlock();

	return ptype;
}

/* Return true iff action is priority */
static inline bool is_tcf_skbedit_priority(const struct tc_action *a)
{
	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_PRIORITY);
}

static inline u32 tcf_skbedit_priority(const struct tc_action *a)
{
	u32 priority;

	rcu_read_lock();
	priority = rcu_dereference(to_skbedit(a)->params)->priority;
	rcu_read_unlock();

	return priority;
}

static inline u16 tcf_skbedit_rx_queue_mapping(const struct tc_action *a)
{
	u16 rx_queue;

	rcu_read_lock();
	rx_queue = rcu_dereference(to_skbedit(a)->params)->queue_mapping;
	rcu_read_unlock();

	return rx_queue;
}

/* Return true iff action is queue_mapping */
static inline bool is_tcf_skbedit_queue_mapping(const struct tc_action *a)
{
	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_QUEUE_MAPPING);
}

/* Return true if action is on ingress traffic */
static inline bool is_tcf_skbedit_ingress(u32 flags)
{
	return flags & TCA_ACT_FLAGS_AT_INGRESS;
}

static inline bool is_tcf_skbedit_tx_queue_mapping(const struct tc_action *a)
{
	return is_tcf_skbedit_queue_mapping(a) &&
	       !is_tcf_skbedit_ingress(a->tcfa_flags);
}

static inline bool is_tcf_skbedit_rx_queue_mapping(const struct tc_action *a)
{
	return is_tcf_skbedit_queue_mapping(a) &&
	       is_tcf_skbedit_ingress(a->tcfa_flags);
}

/* Return true iff action is inheritdsfield */
static inline bool is_tcf_skbedit_inheritdsfield(const struct tc_action *a)
{
	return is_tcf_skbedit_with_flag(a, SKBEDIT_F_INHERITDSFIELD);
}

#endif /* __NET_TC_SKBEDIT_H */
