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