1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* Copyright 2020 NXP */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __NET_TC_GATE_H 5*4882a593Smuzhiyun #define __NET_TC_GATE_H 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <net/act_api.h> 8*4882a593Smuzhiyun #include <linux/tc_act/tc_gate.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun struct action_gate_entry { 11*4882a593Smuzhiyun u8 gate_state; 12*4882a593Smuzhiyun u32 interval; 13*4882a593Smuzhiyun s32 ipv; 14*4882a593Smuzhiyun s32 maxoctets; 15*4882a593Smuzhiyun }; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct tcfg_gate_entry { 18*4882a593Smuzhiyun int index; 19*4882a593Smuzhiyun u8 gate_state; 20*4882a593Smuzhiyun u32 interval; 21*4882a593Smuzhiyun s32 ipv; 22*4882a593Smuzhiyun s32 maxoctets; 23*4882a593Smuzhiyun struct list_head list; 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct tcf_gate_params { 27*4882a593Smuzhiyun s32 tcfg_priority; 28*4882a593Smuzhiyun u64 tcfg_basetime; 29*4882a593Smuzhiyun u64 tcfg_cycletime; 30*4882a593Smuzhiyun u64 tcfg_cycletime_ext; 31*4882a593Smuzhiyun u32 tcfg_flags; 32*4882a593Smuzhiyun s32 tcfg_clockid; 33*4882a593Smuzhiyun size_t num_entries; 34*4882a593Smuzhiyun struct list_head entries; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun #define GATE_ACT_GATE_OPEN BIT(0) 38*4882a593Smuzhiyun #define GATE_ACT_PENDING BIT(1) 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct tcf_gate { 41*4882a593Smuzhiyun struct tc_action common; 42*4882a593Smuzhiyun struct tcf_gate_params param; 43*4882a593Smuzhiyun u8 current_gate_status; 44*4882a593Smuzhiyun ktime_t current_close_time; 45*4882a593Smuzhiyun u32 current_entry_octets; 46*4882a593Smuzhiyun s32 current_max_octets; 47*4882a593Smuzhiyun struct tcfg_gate_entry *next_entry; 48*4882a593Smuzhiyun struct hrtimer hitimer; 49*4882a593Smuzhiyun enum tk_offsets tk_offset; 50*4882a593Smuzhiyun }; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define to_gate(a) ((struct tcf_gate *)a) 53*4882a593Smuzhiyun is_tcf_gate(const struct tc_action * a)54*4882a593Smuzhiyunstatic inline bool is_tcf_gate(const struct tc_action *a) 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun #ifdef CONFIG_NET_CLS_ACT 57*4882a593Smuzhiyun if (a->ops && a->ops->id == TCA_ID_GATE) 58*4882a593Smuzhiyun return true; 59*4882a593Smuzhiyun #endif 60*4882a593Smuzhiyun return false; 61*4882a593Smuzhiyun } 62*4882a593Smuzhiyun tcf_gate_index(const struct tc_action * a)63*4882a593Smuzhiyunstatic inline u32 tcf_gate_index(const struct tc_action *a) 64*4882a593Smuzhiyun { 65*4882a593Smuzhiyun return a->tcfa_index; 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun tcf_gate_prio(const struct tc_action * a)68*4882a593Smuzhiyunstatic inline s32 tcf_gate_prio(const struct tc_action *a) 69*4882a593Smuzhiyun { 70*4882a593Smuzhiyun s32 tcfg_prio; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun tcfg_prio = to_gate(a)->param.tcfg_priority; 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun return tcfg_prio; 75*4882a593Smuzhiyun } 76*4882a593Smuzhiyun tcf_gate_basetime(const struct tc_action * a)77*4882a593Smuzhiyunstatic inline u64 tcf_gate_basetime(const struct tc_action *a) 78*4882a593Smuzhiyun { 79*4882a593Smuzhiyun u64 tcfg_basetime; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun tcfg_basetime = to_gate(a)->param.tcfg_basetime; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun return tcfg_basetime; 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun tcf_gate_cycletime(const struct tc_action * a)86*4882a593Smuzhiyunstatic inline u64 tcf_gate_cycletime(const struct tc_action *a) 87*4882a593Smuzhiyun { 88*4882a593Smuzhiyun u64 tcfg_cycletime; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun tcfg_cycletime = to_gate(a)->param.tcfg_cycletime; 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun return tcfg_cycletime; 93*4882a593Smuzhiyun } 94*4882a593Smuzhiyun tcf_gate_cycletimeext(const struct tc_action * a)95*4882a593Smuzhiyunstatic inline u64 tcf_gate_cycletimeext(const struct tc_action *a) 96*4882a593Smuzhiyun { 97*4882a593Smuzhiyun u64 tcfg_cycletimeext; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun tcfg_cycletimeext = to_gate(a)->param.tcfg_cycletime_ext; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun return tcfg_cycletimeext; 102*4882a593Smuzhiyun } 103*4882a593Smuzhiyun tcf_gate_num_entries(const struct tc_action * a)104*4882a593Smuzhiyunstatic inline u32 tcf_gate_num_entries(const struct tc_action *a) 105*4882a593Smuzhiyun { 106*4882a593Smuzhiyun u32 num_entries; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun num_entries = to_gate(a)->param.num_entries; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun return num_entries; 111*4882a593Smuzhiyun } 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun static inline struct action_gate_entry tcf_gate_get_list(const struct tc_action * a)114*4882a593Smuzhiyun *tcf_gate_get_list(const struct tc_action *a) 115*4882a593Smuzhiyun { 116*4882a593Smuzhiyun struct action_gate_entry *oe; 117*4882a593Smuzhiyun struct tcf_gate_params *p; 118*4882a593Smuzhiyun struct tcfg_gate_entry *entry; 119*4882a593Smuzhiyun u32 num_entries; 120*4882a593Smuzhiyun int i = 0; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun p = &to_gate(a)->param; 123*4882a593Smuzhiyun num_entries = p->num_entries; 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun list_for_each_entry(entry, &p->entries, list) 126*4882a593Smuzhiyun i++; 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun if (i != num_entries) 129*4882a593Smuzhiyun return NULL; 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun oe = kcalloc(num_entries, sizeof(*oe), GFP_ATOMIC); 132*4882a593Smuzhiyun if (!oe) 133*4882a593Smuzhiyun return NULL; 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun i = 0; 136*4882a593Smuzhiyun list_for_each_entry(entry, &p->entries, list) { 137*4882a593Smuzhiyun oe[i].gate_state = entry->gate_state; 138*4882a593Smuzhiyun oe[i].interval = entry->interval; 139*4882a593Smuzhiyun oe[i].ipv = entry->ipv; 140*4882a593Smuzhiyun oe[i].maxoctets = entry->maxoctets; 141*4882a593Smuzhiyun i++; 142*4882a593Smuzhiyun } 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun return oe; 145*4882a593Smuzhiyun } 146*4882a593Smuzhiyun #endif 147