linux/include/net/pie.h
<<
>>
Prefs
   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 >> BITS_PER_BYTE)
  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 */
  28struct 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 * @backlog_old:        queue backlog during previous qdelay calculation
  50 */
  51struct pie_vars {
  52        psched_time_t qdelay;
  53        psched_time_t qdelay_old;
  54        psched_time_t burst_time;
  55        psched_time_t dq_tstamp;
  56        u64 prob;
  57        u64 accu_prob;
  58        u64 dq_count;
  59        u32 avg_dq_rate;
  60        u32 backlog_old;
  61};
  62
  63/**
  64 * struct pie_stats - contains pie stats
  65 * @packets_in: total number of packets enqueued
  66 * @dropped:    packets dropped due to pie action
  67 * @overlimit:  packets dropped due to lack of space in queue
  68 * @ecn_mark:   packets marked with ECN
  69 * @maxq:       maximum queue size
  70 */
  71struct pie_stats {
  72        u32 packets_in;
  73        u32 dropped;
  74        u32 overlimit;
  75        u32 ecn_mark;
  76        u32 maxq;
  77};
  78
  79/**
  80 * struct pie_skb_cb - contains private skb vars
  81 * @enqueue_time:       timestamp when the packet is enqueued
  82 * @mem_usage:          size of the skb during enqueue
  83 */
  84struct pie_skb_cb {
  85        psched_time_t enqueue_time;
  86        u32 mem_usage;
  87};
  88
  89static inline void pie_params_init(struct pie_params *params)
  90{
  91        params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC);   /* 15 ms */
  92        params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */
  93        params->limit = 1000;
  94        params->alpha = 2;
  95        params->beta = 20;
  96        params->ecn = false;
  97        params->bytemode = false;
  98        params->dq_rate_estimator = false;
  99}
 100
 101static inline void pie_vars_init(struct pie_vars *vars)
 102{
 103        vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */
 104        vars->dq_tstamp = DTIME_INVALID;
 105        vars->accu_prob = 0;
 106        vars->dq_count = DQCOUNT_INVALID;
 107        vars->avg_dq_rate = 0;
 108}
 109
 110static inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb)
 111{
 112        qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb));
 113        return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data;
 114}
 115
 116static inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb)
 117{
 118        return get_pie_cb(skb)->enqueue_time;
 119}
 120
 121static inline void pie_set_enqueue_time(struct sk_buff *skb)
 122{
 123        get_pie_cb(skb)->enqueue_time = psched_get_time();
 124}
 125
 126bool pie_drop_early(struct Qdisc *sch, struct pie_params *params,
 127                    struct pie_vars *vars, u32 backlog, u32 packet_size);
 128
 129void pie_process_dequeue(struct sk_buff *skb, struct pie_params *params,
 130                         struct pie_vars *vars, u32 backlog);
 131
 132void pie_calculate_probability(struct pie_params *params, struct pie_vars *vars,
 133                               u32 backlog);
 134
 135#endif
 136