18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci#ifndef __NET_SCHED_PIE_H 38c2ecf20Sopenharmony_ci#define __NET_SCHED_PIE_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#include <linux/ktime.h> 68c2ecf20Sopenharmony_ci#include <linux/skbuff.h> 78c2ecf20Sopenharmony_ci#include <linux/types.h> 88c2ecf20Sopenharmony_ci#include <net/inet_ecn.h> 98c2ecf20Sopenharmony_ci#include <net/pkt_sched.h> 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#define MAX_PROB (U64_MAX >> BITS_PER_BYTE) 128c2ecf20Sopenharmony_ci#define DTIME_INVALID U64_MAX 138c2ecf20Sopenharmony_ci#define QUEUE_THRESHOLD 16384 148c2ecf20Sopenharmony_ci#define DQCOUNT_INVALID -1 158c2ecf20Sopenharmony_ci#define PIE_SCALE 8 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci/** 188c2ecf20Sopenharmony_ci * struct pie_params - contains pie parameters 198c2ecf20Sopenharmony_ci * @target: target delay in pschedtime 208c2ecf20Sopenharmony_ci * @tudpate: interval at which drop probability is calculated 218c2ecf20Sopenharmony_ci * @limit: total number of packets that can be in the queue 228c2ecf20Sopenharmony_ci * @alpha: parameter to control drop probability 238c2ecf20Sopenharmony_ci * @beta: parameter to control drop probability 248c2ecf20Sopenharmony_ci * @ecn: is ECN marking of packets enabled 258c2ecf20Sopenharmony_ci * @bytemode: is drop probability scaled based on pkt size 268c2ecf20Sopenharmony_ci * @dq_rate_estimator: is Little's law used for qdelay calculation 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_cistruct pie_params { 298c2ecf20Sopenharmony_ci psched_time_t target; 308c2ecf20Sopenharmony_ci u32 tupdate; 318c2ecf20Sopenharmony_ci u32 limit; 328c2ecf20Sopenharmony_ci u32 alpha; 338c2ecf20Sopenharmony_ci u32 beta; 348c2ecf20Sopenharmony_ci u8 ecn; 358c2ecf20Sopenharmony_ci u8 bytemode; 368c2ecf20Sopenharmony_ci u8 dq_rate_estimator; 378c2ecf20Sopenharmony_ci}; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci/** 408c2ecf20Sopenharmony_ci * struct pie_vars - contains pie variables 418c2ecf20Sopenharmony_ci * @qdelay: current queue delay 428c2ecf20Sopenharmony_ci * @qdelay_old: queue delay in previous qdelay calculation 438c2ecf20Sopenharmony_ci * @burst_time: burst time allowance 448c2ecf20Sopenharmony_ci * @dq_tstamp: timestamp at which dq rate was last calculated 458c2ecf20Sopenharmony_ci * @prob: drop probability 468c2ecf20Sopenharmony_ci * @accu_prob: accumulated drop probability 478c2ecf20Sopenharmony_ci * @dq_count: number of bytes dequeued in a measurement cycle 488c2ecf20Sopenharmony_ci * @avg_dq_rate: calculated average dq rate 498c2ecf20Sopenharmony_ci * @backlog_old: queue backlog during previous qdelay calculation 508c2ecf20Sopenharmony_ci */ 518c2ecf20Sopenharmony_cistruct pie_vars { 528c2ecf20Sopenharmony_ci psched_time_t qdelay; 538c2ecf20Sopenharmony_ci psched_time_t qdelay_old; 548c2ecf20Sopenharmony_ci psched_time_t burst_time; 558c2ecf20Sopenharmony_ci psched_time_t dq_tstamp; 568c2ecf20Sopenharmony_ci u64 prob; 578c2ecf20Sopenharmony_ci u64 accu_prob; 588c2ecf20Sopenharmony_ci u64 dq_count; 598c2ecf20Sopenharmony_ci u32 avg_dq_rate; 608c2ecf20Sopenharmony_ci u32 backlog_old; 618c2ecf20Sopenharmony_ci}; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci/** 648c2ecf20Sopenharmony_ci * struct pie_stats - contains pie stats 658c2ecf20Sopenharmony_ci * @packets_in: total number of packets enqueued 668c2ecf20Sopenharmony_ci * @dropped: packets dropped due to pie action 678c2ecf20Sopenharmony_ci * @overlimit: packets dropped due to lack of space in queue 688c2ecf20Sopenharmony_ci * @ecn_mark: packets marked with ECN 698c2ecf20Sopenharmony_ci * @maxq: maximum queue size 708c2ecf20Sopenharmony_ci */ 718c2ecf20Sopenharmony_cistruct pie_stats { 728c2ecf20Sopenharmony_ci u32 packets_in; 738c2ecf20Sopenharmony_ci u32 dropped; 748c2ecf20Sopenharmony_ci u32 overlimit; 758c2ecf20Sopenharmony_ci u32 ecn_mark; 768c2ecf20Sopenharmony_ci u32 maxq; 778c2ecf20Sopenharmony_ci}; 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci/** 808c2ecf20Sopenharmony_ci * struct pie_skb_cb - contains private skb vars 818c2ecf20Sopenharmony_ci * @enqueue_time: timestamp when the packet is enqueued 828c2ecf20Sopenharmony_ci * @mem_usage: size of the skb during enqueue 838c2ecf20Sopenharmony_ci */ 848c2ecf20Sopenharmony_cistruct pie_skb_cb { 858c2ecf20Sopenharmony_ci psched_time_t enqueue_time; 868c2ecf20Sopenharmony_ci u32 mem_usage; 878c2ecf20Sopenharmony_ci}; 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_cistatic inline void pie_params_init(struct pie_params *params) 908c2ecf20Sopenharmony_ci{ 918c2ecf20Sopenharmony_ci params->target = PSCHED_NS2TICKS(15 * NSEC_PER_MSEC); /* 15 ms */ 928c2ecf20Sopenharmony_ci params->tupdate = usecs_to_jiffies(15 * USEC_PER_MSEC); /* 15 ms */ 938c2ecf20Sopenharmony_ci params->limit = 1000; 948c2ecf20Sopenharmony_ci params->alpha = 2; 958c2ecf20Sopenharmony_ci params->beta = 20; 968c2ecf20Sopenharmony_ci params->ecn = false; 978c2ecf20Sopenharmony_ci params->bytemode = false; 988c2ecf20Sopenharmony_ci params->dq_rate_estimator = false; 998c2ecf20Sopenharmony_ci} 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistatic inline void pie_vars_init(struct pie_vars *vars) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci vars->burst_time = PSCHED_NS2TICKS(150 * NSEC_PER_MSEC); /* 150 ms */ 1048c2ecf20Sopenharmony_ci vars->dq_tstamp = DTIME_INVALID; 1058c2ecf20Sopenharmony_ci vars->accu_prob = 0; 1068c2ecf20Sopenharmony_ci vars->dq_count = DQCOUNT_INVALID; 1078c2ecf20Sopenharmony_ci vars->avg_dq_rate = 0; 1088c2ecf20Sopenharmony_ci} 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_cistatic inline struct pie_skb_cb *get_pie_cb(const struct sk_buff *skb) 1118c2ecf20Sopenharmony_ci{ 1128c2ecf20Sopenharmony_ci qdisc_cb_private_validate(skb, sizeof(struct pie_skb_cb)); 1138c2ecf20Sopenharmony_ci return (struct pie_skb_cb *)qdisc_skb_cb(skb)->data; 1148c2ecf20Sopenharmony_ci} 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic inline psched_time_t pie_get_enqueue_time(const struct sk_buff *skb) 1178c2ecf20Sopenharmony_ci{ 1188c2ecf20Sopenharmony_ci return get_pie_cb(skb)->enqueue_time; 1198c2ecf20Sopenharmony_ci} 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_cistatic inline void pie_set_enqueue_time(struct sk_buff *skb) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci get_pie_cb(skb)->enqueue_time = psched_get_time(); 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cibool pie_drop_early(struct Qdisc *sch, struct pie_params *params, 1278c2ecf20Sopenharmony_ci struct pie_vars *vars, u32 backlog, u32 packet_size); 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_civoid pie_process_dequeue(struct sk_buff *skb, struct pie_params *params, 1308c2ecf20Sopenharmony_ci struct pie_vars *vars, u32 backlog); 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_civoid pie_calculate_probability(struct pie_params *params, struct pie_vars *vars, 1338c2ecf20Sopenharmony_ci u32 backlog); 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci#endif 136