1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 #ifndef __NET_SCHED_PIE_H 3 #define __NET_SCHED_PIE_H 4 5 #include <linux/ktime.h> 6 #include <linux/skbuff.h> 7 #include <linux/types.h> 8 #include <net/inet_ecn.h> 9 #include <net/pkt_sched.h> 10 11 #define MAX_PROB U64_MAX 12 #define DTIME_INVALID U64_MAX 13 #define QUEUE_THRESHOLD 16384 14 #define DQCOUNT_INVALID -1 15 #define PIE_SCALE 8 16 17 /** 18 * struct pie_params - contains pie parameters 19 * @target: target delay in pschedtime 20 * @tudpate: interval at which drop probability is calculated 21 * @limit: total number of packets that can be in the queue 22 * @alpha: parameter to control drop probability 23 * @beta: parameter to control drop probability 24 * @ecn: is ECN marking of packets enabled 25 * @bytemode: is drop probability scaled based on pkt size 26 * @dq_rate_estimator: is Little's law used for qdelay calculation 27 */ 28 struct pie_params { 29 psched_time_t target; 30 u32 tupdate; 31 u32 limit; 32 u32 alpha; 33 u32 beta; 34 u8 ecn; 35 u8 bytemode; 36 u8 dq_rate_estimator; 37 }; 38 39 /** 40 * struct pie_vars - contains pie variables 41 * @qdelay: current queue delay 42 * @qdelay_old: queue delay in previous qdelay calculation 43 * @burst_time: burst time allowance 44 * @dq_tstamp: timestamp at which dq rate was last calculated 45 * @prob: drop probability 46 * @accu_prob: accumulated drop probability 47 * @dq_count: number of bytes dequeued in a measurement cycle 48 * @avg_dq_rate: calculated average dq rate 49 * @qlen_old: queue length during previous qdelay calculation 50 * @accu_prob_overflows: number of times accu_prob overflows 51 */ 52 struct pie_vars { 53 psched_time_t qdelay; 54 psched_time_t qdelay_old; 55 psched_time_t burst_time; 56 psched_time_t dq_tstamp; 57 u64 prob; 58 u64 accu_prob; 59 u64 dq_count; 60 u32 avg_dq_rate; 61 u32 qlen_old; 62 u8 accu_prob_overflows; 63 }; 64 65 /** 66 * struct pie_stats - contains pie stats 67 * @packets_in: total number of packets enqueued 68 * @dropped: packets dropped due to pie action 69 * @overlimit: packets dropped due to lack of space in queue 70 * @ecn_mark: packets marked with ECN 71 * @maxq: maximum queue size 72 */ 73 struct pie_stats { 74 u32 packets_in; 75 u32 dropped; 76 u32 overlimit; 77 u32 ecn_mark; 78 u32 maxq; 79 }; 80 81 /** 82 * struct pie_skb_cb - contains private skb vars 83 * @enqueue_time: timestamp when the packet is enqueued 84 * @mem_usage: size of the skb during enqueue 85 */ 86 struct pie_skb_cb { 87 psched_time_t enqueue_time; 88 u32 mem_usage; 89 }; 90 91 static inline void pie_params_init(struct pie_params *params) 92 { 93 params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ 94 params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ 95 params->limit = 1000; 96 params->alpha = 2; 97 params->beta = 20; 98 params->ecn = false; 99 params->bytemode = false; 100 params->dq_rate_estimator = false; 101 } 102 103 static inline void pie_vars_init(struct pie_vars *vars) 104 { 105 vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */ 106 vars->dq_tstamp = DTIME_INVALID; 107 vars->accu_prob = 0; 108 vars->dq_count = DQCOUNT_INVALID; 109 vars->avg_dq_rate = 0; 110 vars->accu_prob_overflows = 0; 111 } 112 113 static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb) 114 { 115 qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb)); 116 return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data; 117 } 118 119 static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb) 120 { 121 return get_pie_cb(skb)->enqueue_time; 122 } 123 124 static inline void pie_set_enqueue_time(struct sk_buff *skb) 125 { 126 get_pie_cb(skb)->enqueue_time = psched_get_time(); 127 } 128 129 bool pie_drop_early(struct Qdisc *sch, struct pie_params *params, 130 struct pie_vars *vars, u32 qlen, u32 packet_size); 131 132 void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params, 133 struct pie_vars *vars, u32 qlen); 134 135 void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars, 136 u32 qlen); 137 138 #endif 139