184bf557fSMohit P. Tahiliani /* SPDX-License-Identifier: GPL-2.0-only */ 284bf557fSMohit P. Tahiliani #ifndef __NET_SCHED_PIE_H 384bf557fSMohit P. Tahiliani #define __NET_SCHED_PIE_H 484bf557fSMohit P. Tahiliani 584bf557fSMohit P. Tahiliani #include <linux/ktime.h> 684bf557fSMohit P. Tahiliani #include <linux/skbuff.h> 784bf557fSMohit P. Tahiliani #include <linux/types.h> 884bf557fSMohit P. Tahiliani #include <net/inet_ecn.h> 984bf557fSMohit P. Tahiliani #include <net/pkt_sched.h> 1084bf557fSMohit P. Tahiliani 11cf4eeee5SMohit P. Tahiliani #define MAX_PROB U64_MAX 12cf4eeee5SMohit P. Tahiliani #define DTIME_INVALID U64_MAX 1384bf557fSMohit P. Tahiliani #define QUEUE_THRESHOLD 16384 1484bf557fSMohit P. Tahiliani #define DQCOUNT_INVALID -1 1584bf557fSMohit P. Tahiliani #define PIE_SCALE 8 1684bf557fSMohit P. Tahiliani 17*b42a3d7cSMohit P. Tahiliani /** 18*b42a3d7cSMohit P. Tahiliani * struct pie_params - contains pie parameters 19*b42a3d7cSMohit P. Tahiliani * @target: target delay in pschedtime 20*b42a3d7cSMohit P. Tahiliani * @tudpate: interval at which drop probability is calculated 21*b42a3d7cSMohit P. Tahiliani * @limit: total number of packets that can be in the queue 22*b42a3d7cSMohit P. Tahiliani * @alpha: parameter to control drop probability 23*b42a3d7cSMohit P. Tahiliani * @beta: parameter to control drop probability 24*b42a3d7cSMohit P. Tahiliani * @ecn: is ECN marking of packets enabled 25*b42a3d7cSMohit P. Tahiliani * @bytemode: is drop probability scaled based on pkt size 26*b42a3d7cSMohit P. Tahiliani * @dq_rate_estimator: is Little's law used for qdelay calculation 27*b42a3d7cSMohit P. Tahiliani */ 2884bf557fSMohit P. Tahiliani struct pie_params { 29*b42a3d7cSMohit P. Tahiliani psched_time_t target; 30*b42a3d7cSMohit P. Tahiliani u32 tupdate; 31*b42a3d7cSMohit P. Tahiliani u32 limit; 32*b42a3d7cSMohit P. Tahiliani u32 alpha; 33*b42a3d7cSMohit P. Tahiliani u32 beta; 34*b42a3d7cSMohit P. Tahiliani u8 ecn; 35*b42a3d7cSMohit P. Tahiliani u8 bytemode; 36*b42a3d7cSMohit P. Tahiliani u8 dq_rate_estimator; 3784bf557fSMohit P. Tahiliani }; 3884bf557fSMohit P. Tahiliani 39*b42a3d7cSMohit P. Tahiliani /** 40*b42a3d7cSMohit P. Tahiliani * struct pie_vars - contains pie variables 41*b42a3d7cSMohit P. Tahiliani * @qdelay: current queue delay 42*b42a3d7cSMohit P. Tahiliani * @qdelay_old: queue delay in previous qdelay calculation 43*b42a3d7cSMohit P. Tahiliani * @burst_time: burst time allowance 44*b42a3d7cSMohit P. Tahiliani * @dq_tstamp: timestamp at which dq rate was last calculated 45*b42a3d7cSMohit P. Tahiliani * @prob: drop probability 46*b42a3d7cSMohit P. Tahiliani * @accu_prob: accumulated drop probability 47*b42a3d7cSMohit P. Tahiliani * @dq_count: number of bytes dequeued in a measurement cycle 48*b42a3d7cSMohit P. Tahiliani * @avg_dq_rate: calculated average dq rate 49*b42a3d7cSMohit P. Tahiliani * @qlen_old: queue length during previous qdelay calculation 50*b42a3d7cSMohit P. Tahiliani * @accu_prob_overflows: number of times accu_prob overflows 51*b42a3d7cSMohit P. Tahiliani */ 5284bf557fSMohit P. Tahiliani struct pie_vars { 5384bf557fSMohit P. Tahiliani psched_time_t qdelay; 5484bf557fSMohit P. Tahiliani psched_time_t qdelay_old; 552dfb1952SMohit P. Tahiliani psched_time_t burst_time; 56*b42a3d7cSMohit P. Tahiliani psched_time_t dq_tstamp; 57*b42a3d7cSMohit P. Tahiliani u64 prob; 58*b42a3d7cSMohit P. Tahiliani u64 accu_prob; 59*b42a3d7cSMohit P. Tahiliani u64 dq_count; 60*b42a3d7cSMohit P. Tahiliani u32 avg_dq_rate; 61*b42a3d7cSMohit P. Tahiliani u32 qlen_old; 62*b42a3d7cSMohit P. Tahiliani u8 accu_prob_overflows; 6384bf557fSMohit P. Tahiliani }; 6484bf557fSMohit P. Tahiliani 65*b42a3d7cSMohit P. Tahiliani /** 66*b42a3d7cSMohit P. Tahiliani * struct pie_stats - contains pie stats 67*b42a3d7cSMohit P. Tahiliani * @packets_in: total number of packets enqueued 68*b42a3d7cSMohit P. Tahiliani * @dropped: packets dropped due to pie action 69*b42a3d7cSMohit P. Tahiliani * @overlimit: packets dropped due to lack of space in queue 70*b42a3d7cSMohit P. Tahiliani * @ecn_mark: packets marked with ECN 71*b42a3d7cSMohit P. Tahiliani * @maxq: maximum queue size 72*b42a3d7cSMohit P. Tahiliani */ 7384bf557fSMohit P. Tahiliani struct pie_stats { 74*b42a3d7cSMohit P. Tahiliani u32 packets_in; 75*b42a3d7cSMohit P. Tahiliani u32 dropped; 76*b42a3d7cSMohit P. Tahiliani u32 overlimit; 77*b42a3d7cSMohit P. Tahiliani u32 ecn_mark; 78*b42a3d7cSMohit P. Tahiliani u32 maxq; 7984bf557fSMohit P. Tahiliani }; 8084bf557fSMohit P. Tahiliani 81*b42a3d7cSMohit P. Tahiliani /** 82*b42a3d7cSMohit P. Tahiliani * struct pie_skb_cb - contains private skb vars 83*b42a3d7cSMohit P. Tahiliani * @enqueue_time: timestamp when the packet is enqueued 84*b42a3d7cSMohit P. Tahiliani */ 8584bf557fSMohit P. Tahiliani struct pie_skb_cb { 8684bf557fSMohit P. Tahiliani psched_time_t enqueue_time; 8784bf557fSMohit P. Tahiliani }; 8884bf557fSMohit P. Tahiliani 8984bf557fSMohit P. Tahiliani static inline void pie_params_init(struct pie_params *params) 9084bf557fSMohit P. Tahiliani { 912dfb1952SMohit P. Tahiliani params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ 9284bf557fSMohit P. Tahiliani params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ 93*b42a3d7cSMohit P. Tahiliani params->limit = 1000; 942dfb1952SMohit P. Tahiliani params->alpha = 2; 952dfb1952SMohit P. Tahiliani params->beta = 20; 9684bf557fSMohit P. Tahiliani params->ecn = false; 9784bf557fSMohit P. Tahiliani params->bytemode = false; 9884bf557fSMohit P. Tahiliani params->dq_rate_estimator = false; 9984bf557fSMohit P. Tahiliani } 10084bf557fSMohit P. Tahiliani 10184bf557fSMohit P. Tahiliani static inline void pie_vars_init(struct pie_vars *vars) 10284bf557fSMohit P. Tahiliani { 103*b42a3d7cSMohit P. Tahiliani vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */ 1042dfb1952SMohit P. Tahiliani vars->dq_tstamp = DTIME_INVALID; 1052dfb1952SMohit P. Tahiliani vars->accu_prob = 0; 1062dfb1952SMohit P. Tahiliani vars->dq_count = DQCOUNT_INVALID; 1072dfb1952SMohit P. Tahiliani vars->avg_dq_rate = 0; 10884bf557fSMohit P. Tahiliani vars->accu_prob_overflows = 0; 10984bf557fSMohit P. Tahiliani } 11084bf557fSMohit P. Tahiliani 11184bf557fSMohit P. Tahiliani static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb) 11284bf557fSMohit P. Tahiliani { 11384bf557fSMohit P. Tahiliani qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb)); 11484bf557fSMohit P. Tahiliani return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data; 11584bf557fSMohit P. Tahiliani } 11684bf557fSMohit P. Tahiliani 11784bf557fSMohit P. Tahiliani static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb) 11884bf557fSMohit P. Tahiliani { 11984bf557fSMohit P. Tahiliani return get_pie_cb(skb)->enqueue_time; 12084bf557fSMohit P. Tahiliani } 12184bf557fSMohit P. Tahiliani 12284bf557fSMohit P. Tahiliani static inline void pie_set_enqueue_time(struct sk_buff *skb) 12384bf557fSMohit P. Tahiliani { 12484bf557fSMohit P. Tahiliani get_pie_cb(skb)->enqueue_time = psched_get_time(); 12584bf557fSMohit P. Tahiliani } 12684bf557fSMohit P. Tahiliani 12784bf557fSMohit P. Tahiliani #endif 128