0001
0002 #ifndef __NET_SCHED_PIE_H
0003 #define __NET_SCHED_PIE_H
0004
0005 #include <linux/ktime.h>
0006 #include <linux/skbuff.h>
0007 #include <linux/types.h>
0008 #include <net/inet_ecn.h>
0009 #include <net/pkt_sched.h>
0010
0011 #define MAX_PROB (U64_MAX >> BITS_PER_BYTE)
0012 #define DTIME_INVALID U64_MAX
0013 #define QUEUE_THRESHOLD 16384
0014 #define DQCOUNT_INVALID -1
0015 #define PIE_SCALE 8
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 struct pie_params {
0029 psched_time_t target;
0030 u32 tupdate;
0031 u32 limit;
0032 u32 alpha;
0033 u32 beta;
0034 u8 ecn;
0035 u8 bytemode;
0036 u8 dq_rate_estimator;
0037 };
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051 struct pie_vars {
0052 psched_time_t qdelay;
0053 psched_time_t qdelay_old;
0054 psched_time_t burst_time;
0055 psched_time_t dq_tstamp;
0056 u64 prob;
0057 u64 accu_prob;
0058 u64 dq_count;
0059 u32 avg_dq_rate;
0060 u32 backlog_old;
0061 };
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071 struct pie_stats {
0072 u32 packets_in;
0073 u32 dropped;
0074 u32 overlimit;
0075 u32 ecn_mark;
0076 u32 maxq;
0077 };
0078
0079
0080
0081
0082
0083
0084 struct pie_skb_cb {
0085 psched_time_t enqueue_time;
0086 u32 mem_usage;
0087 };
0088
0089 static inline void pie_params_init(struct pie_params *params)
0090 {
0091 params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC);
0092 params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC);
0093 params->limit = 1000;
0094 params->alpha = 2;
0095 params->beta = 20;
0096 params->ecn = false;
0097 params->bytemode = false;
0098 params->dq_rate_estimator = false;
0099 }
0100
0101 static inline void pie_vars_init(struct pie_vars *vars)
0102 {
0103 vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC);
0104 vars->dq_tstamp = DTIME_INVALID;
0105 vars->accu_prob = 0;
0106 vars->dq_count = DQCOUNT_INVALID;
0107 vars->avg_dq_rate = 0;
0108 }
0109
0110 static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb)
0111 {
0112 qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb));
0113 return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data;
0114 }
0115
0116 static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb)
0117 {
0118 return get_pie_cb(skb)->enqueue_time;
0119 }
0120
0121 static inline void pie_set_enqueue_time(struct sk_buff *skb)
0122 {
0123 get_pie_cb(skb)->enqueue_time = psched_get_time();
0124 }
0125
0126 bool pie_drop_early(struct Qdisc *sch, struct pie_params *params,
0127 struct pie_vars *vars, u32 backlog, u32 packet_size);
0128
0129 void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params,
0130 struct pie_vars *vars, u32 backlog);
0131
0132 void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars,
0133 u32 backlog);
0134
0135 #endif