pie.h 3.6 KB

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