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