162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/* Copyright 2020 NXP */
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#ifndef __NET_TC_GATE_H
562306a36Sopenharmony_ci#define __NET_TC_GATE_H
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <net/act_api.h>
862306a36Sopenharmony_ci#include <linux/tc_act/tc_gate.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct action_gate_entry {
1162306a36Sopenharmony_ci	u8			gate_state;
1262306a36Sopenharmony_ci	u32			interval;
1362306a36Sopenharmony_ci	s32			ipv;
1462306a36Sopenharmony_ci	s32			maxoctets;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct tcfg_gate_entry {
1862306a36Sopenharmony_ci	int			index;
1962306a36Sopenharmony_ci	u8			gate_state;
2062306a36Sopenharmony_ci	u32			interval;
2162306a36Sopenharmony_ci	s32			ipv;
2262306a36Sopenharmony_ci	s32			maxoctets;
2362306a36Sopenharmony_ci	struct list_head	list;
2462306a36Sopenharmony_ci};
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistruct tcf_gate_params {
2762306a36Sopenharmony_ci	s32			tcfg_priority;
2862306a36Sopenharmony_ci	u64			tcfg_basetime;
2962306a36Sopenharmony_ci	u64			tcfg_cycletime;
3062306a36Sopenharmony_ci	u64			tcfg_cycletime_ext;
3162306a36Sopenharmony_ci	u32			tcfg_flags;
3262306a36Sopenharmony_ci	s32			tcfg_clockid;
3362306a36Sopenharmony_ci	size_t			num_entries;
3462306a36Sopenharmony_ci	struct list_head	entries;
3562306a36Sopenharmony_ci};
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define GATE_ACT_GATE_OPEN	BIT(0)
3862306a36Sopenharmony_ci#define GATE_ACT_PENDING	BIT(1)
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct tcf_gate {
4162306a36Sopenharmony_ci	struct tc_action	common;
4262306a36Sopenharmony_ci	struct tcf_gate_params	param;
4362306a36Sopenharmony_ci	u8			current_gate_status;
4462306a36Sopenharmony_ci	ktime_t			current_close_time;
4562306a36Sopenharmony_ci	u32			current_entry_octets;
4662306a36Sopenharmony_ci	s32			current_max_octets;
4762306a36Sopenharmony_ci	struct tcfg_gate_entry	*next_entry;
4862306a36Sopenharmony_ci	struct hrtimer		hitimer;
4962306a36Sopenharmony_ci	enum tk_offsets		tk_offset;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define to_gate(a) ((struct tcf_gate *)a)
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_cistatic inline bool is_tcf_gate(const struct tc_action *a)
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci#ifdef CONFIG_NET_CLS_ACT
5762306a36Sopenharmony_ci	if (a->ops && a->ops->id == TCA_ID_GATE)
5862306a36Sopenharmony_ci		return true;
5962306a36Sopenharmony_ci#endif
6062306a36Sopenharmony_ci	return false;
6162306a36Sopenharmony_ci}
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_cistatic inline s32 tcf_gate_prio(const struct tc_action *a)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	s32 tcfg_prio;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	tcfg_prio = to_gate(a)->param.tcfg_priority;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	return tcfg_prio;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistatic inline u64 tcf_gate_basetime(const struct tc_action *a)
7362306a36Sopenharmony_ci{
7462306a36Sopenharmony_ci	u64 tcfg_basetime;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	tcfg_basetime = to_gate(a)->param.tcfg_basetime;
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci	return tcfg_basetime;
7962306a36Sopenharmony_ci}
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_cistatic inline u64 tcf_gate_cycletime(const struct tc_action *a)
8262306a36Sopenharmony_ci{
8362306a36Sopenharmony_ci	u64 tcfg_cycletime;
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci	tcfg_cycletime = to_gate(a)->param.tcfg_cycletime;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	return tcfg_cycletime;
8862306a36Sopenharmony_ci}
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_cistatic inline u64 tcf_gate_cycletimeext(const struct tc_action *a)
9162306a36Sopenharmony_ci{
9262306a36Sopenharmony_ci	u64 tcfg_cycletimeext;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	tcfg_cycletimeext = to_gate(a)->param.tcfg_cycletime_ext;
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	return tcfg_cycletimeext;
9762306a36Sopenharmony_ci}
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistatic inline u32 tcf_gate_num_entries(const struct tc_action *a)
10062306a36Sopenharmony_ci{
10162306a36Sopenharmony_ci	u32 num_entries;
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	num_entries = to_gate(a)->param.num_entries;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	return num_entries;
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic inline struct action_gate_entry
10962306a36Sopenharmony_ci			*tcf_gate_get_list(const struct tc_action *a)
11062306a36Sopenharmony_ci{
11162306a36Sopenharmony_ci	struct action_gate_entry *oe;
11262306a36Sopenharmony_ci	struct tcf_gate_params *p;
11362306a36Sopenharmony_ci	struct tcfg_gate_entry *entry;
11462306a36Sopenharmony_ci	u32 num_entries;
11562306a36Sopenharmony_ci	int i = 0;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci	p = &to_gate(a)->param;
11862306a36Sopenharmony_ci	num_entries = p->num_entries;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	list_for_each_entry(entry, &p->entries, list)
12162306a36Sopenharmony_ci		i++;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	if (i != num_entries)
12462306a36Sopenharmony_ci		return NULL;
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci	oe = kcalloc(num_entries, sizeof(*oe), GFP_ATOMIC);
12762306a36Sopenharmony_ci	if (!oe)
12862306a36Sopenharmony_ci		return NULL;
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	i = 0;
13162306a36Sopenharmony_ci	list_for_each_entry(entry, &p->entries, list) {
13262306a36Sopenharmony_ci		oe[i].gate_state = entry->gate_state;
13362306a36Sopenharmony_ci		oe[i].interval = entry->interval;
13462306a36Sopenharmony_ci		oe[i].ipv = entry->ipv;
13562306a36Sopenharmony_ci		oe[i].maxoctets = entry->maxoctets;
13662306a36Sopenharmony_ci		i++;
13762306a36Sopenharmony_ci	}
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	return oe;
14062306a36Sopenharmony_ci}
14162306a36Sopenharmony_ci#endif
142