123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /* SPDX-License-Identifier: GPL-2.0-only */
- #ifndef __NET_SCHED_PIE_H
- #define __NET_SCHED_PIE_H
- #include <linux/ktime.h>
- #include <linux/skbuff.h>
- #include <linux/types.h>
- #include <net/inet_ecn.h>
- #include <net/pkt_sched.h>
- #define MAX_PROB (U64_MAX >> BITS_PER_BYTE)
- #define DTIME_INVALID U64_MAX
- #define QUEUE_THRESHOLD 16384
- #define DQCOUNT_INVALID -1
- #define PIE_SCALE 8
- /**
- * struct pie_params - contains pie parameters
- * @target: target delay in pschedtime
- * @tudpate: interval at which drop probability is calculated
- * @limit: total number of packets that can be in the queue
- * @alpha: parameter to control drop probability
- * @beta: parameter to control drop probability
- * @ecn: is ECN marking of packets enabled
- * @bytemode: is drop probability scaled based on pkt size
- * @dq_rate_estimator: is Little's law used for qdelay calculation
- */
- struct pie_params {
- psched_time_t target;
- u32 tupdate;
- u32 limit;
- u32 alpha;
- u32 beta;
- u8 ecn;
- u8 bytemode;
- u8 dq_rate_estimator;
- };
- /**
- * struct pie_vars - contains pie variables
- * @qdelay: current queue delay
- * @qdelay_old: queue delay in previous qdelay calculation
- * @burst_time: burst time allowance
- * @dq_tstamp: timestamp at which dq rate was last calculated
- * @prob: drop probability
- * @accu_prob: accumulated drop probability
- * @dq_count: number of bytes dequeued in a measurement cycle
- * @avg_dq_rate: calculated average dq rate
- * @backlog_old: queue backlog during previous qdelay calculation
- */
- struct pie_vars {
- psched_time_t qdelay;
- psched_time_t qdelay_old;
- psched_time_t burst_time;
- psched_time_t dq_tstamp;
- u64 prob;
- u64 accu_prob;
- u64 dq_count;
- u32 avg_dq_rate;
- u32 backlog_old;
- };
- /**
- * struct pie_stats - contains pie stats
- * @packets_in: total number of packets enqueued
- * @dropped: packets dropped due to pie action
- * @overlimit: packets dropped due to lack of space in queue
- * @ecn_mark: packets marked with ECN
- * @maxq: maximum queue size
- */
- struct pie_stats {
- u32 packets_in;
- u32 dropped;
- u32 overlimit;
- u32 ecn_mark;
- u32 maxq;
- };
- /**
- * struct pie_skb_cb - contains private skb vars
- * @enqueue_time: timestamp when the packet is enqueued
- * @mem_usage: size of the skb during enqueue
- */
- struct pie_skb_cb {
- psched_time_t enqueue_time;
- u32 mem_usage;
- };
- static inline void pie_params_init(struct pie_params *params)
- {
- params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */
- params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */
- params->limit = 1000;
- params->alpha = 2;
- params->beta = 20;
- params->ecn = false;
- params->bytemode = false;
- params->dq_rate_estimator = false;
- }
- static inline void pie_vars_init(struct pie_vars *vars)
- {
- vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */
- vars->dq_tstamp = DTIME_INVALID;
- vars->accu_prob = 0;
- vars->dq_count = DQCOUNT_INVALID;
- vars->avg_dq_rate = 0;
- }
- static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb)
- {
- qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb));
- return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data;
- }
- static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb)
- {
- return get_pie_cb(skb)->enqueue_time;
- }
- static inline void pie_set_enqueue_time(struct sk_buff *skb)
- {
- get_pie_cb(skb)->enqueue_time = psched_get_time();
- }
- bool pie_drop_early(struct Qdisc *sch, struct pie_params *params,
- struct pie_vars *vars, u32 backlog, u32 packet_size);
- void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params,
- struct pie_vars *vars, u32 backlog);
- void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars,
- u32 backlog);
- #endif
|