xref: /openbmc/linux/include/net/pie.h (revision b42a3d7c7cfff3555d7057c20dbbe57fe75d77c0)
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