Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
   1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
   2
   3/* COMMON Applications Kept Enhanced (CAKE) discipline
   4 *
   5 * Copyright (C) 2014-2018 Jonathan Morton <chromatix99@gmail.com>
   6 * Copyright (C) 2015-2018 Toke Høiland-Jørgensen <toke@toke.dk>
   7 * Copyright (C) 2014-2018 Dave Täht <dave.taht@gmail.com>
   8 * Copyright (C) 2015-2018 Sebastian Moeller <moeller0@gmx.de>
   9 * (C) 2015-2018 Kevin Darbyshire-Bryant <kevin@darbyshire-bryant.me.uk>
  10 * Copyright (C) 2017-2018 Ryan Mounce <ryan@mounce.com.au>
  11 *
  12 * The CAKE Principles:
  13 *		   (or, how to have your cake and eat it too)
  14 *
  15 * This is a combination of several shaping, AQM and FQ techniques into one
  16 * easy-to-use package:
  17 *
  18 * - An overall bandwidth shaper, to move the bottleneck away from dumb CPE
  19 *   equipment and bloated MACs.  This operates in deficit mode (as in sch_fq),
  20 *   eliminating the need for any sort of burst parameter (eg. token bucket
  21 *   depth).  Burst support is limited to that necessary to overcome scheduling
  22 *   latency.
  23 *
  24 * - A Diffserv-aware priority queue, giving more priority to certain classes,
  25 *   up to a specified fraction of bandwidth.  Above that bandwidth threshold,
  26 *   the priority is reduced to avoid starving other tins.
  27 *
  28 * - Each priority tin has a separate Flow Queue system, to isolate traffic
  29 *   flows from each other.  This prevents a burst on one flow from increasing
  30 *   the delay to another.  Flows are distributed to queues using a
  31 *   set-associative hash function.
  32 *
  33 * - Each queue is actively managed by Cobalt, which is a combination of the
  34 *   Codel and Blue AQM algorithms.  This serves flows fairly, and signals
  35 *   congestion early via ECN (if available) and/or packet drops, to keep
  36 *   latency low.  The codel parameters are auto-tuned based on the bandwidth
  37 *   setting, as is necessary at low bandwidths.
  38 *
  39 * The configuration parameters are kept deliberately simple for ease of use.
  40 * Everything has sane defaults.  Complete generality of configuration is *not*
  41 * a goal.
  42 *
  43 * The priority queue operates according to a weighted DRR scheme, combined with
  44 * a bandwidth tracker which reuses the shaper logic to detect which side of the
  45 * bandwidth sharing threshold the tin is operating.  This determines whether a
  46 * priority-based weight (high) or a bandwidth-based weight (low) is used for
  47 * that tin in the current pass.
  48 *
  49 * This qdisc was inspired by Eric Dumazet's fq_codel code, which he kindly
  50 * granted us permission to leverage.
  51 */
  52
  53#include <linux/module.h>
  54#include <linux/types.h>
  55#include <linux/kernel.h>
  56#include <linux/jiffies.h>
  57#include <linux/string.h>
  58#include <linux/in.h>
  59#include <linux/errno.h>
  60#include <linux/init.h>
  61#include <linux/skbuff.h>
  62#include <linux/jhash.h>
  63#include <linux/slab.h>
  64#include <linux/vmalloc.h>
  65#include <linux/reciprocal_div.h>
  66#include <net/netlink.h>
  67#include <linux/if_vlan.h>
  68#include <net/pkt_sched.h>
  69#include <net/pkt_cls.h>
  70#include <net/tcp.h>
  71#include <net/flow_dissector.h>
  72
  73#if IS_ENABLED(CONFIG_NF_CONNTRACK)
  74#include <net/netfilter/nf_conntrack_core.h>
  75#endif
  76
  77#define CAKE_SET_WAYS (8)
  78#define CAKE_MAX_TINS (8)
  79#define CAKE_QUEUES (1024)
  80#define CAKE_FLOW_MASK 63
  81#define CAKE_FLOW_NAT_FLAG 64
  82
  83/* struct cobalt_params - contains codel and blue parameters
  84 * @interval:	codel initial drop rate
  85 * @target:     maximum persistent sojourn time & blue update rate
  86 * @mtu_time:   serialisation delay of maximum-size packet
  87 * @p_inc:      increment of blue drop probability (0.32 fxp)
  88 * @p_dec:      decrement of blue drop probability (0.32 fxp)
  89 */
  90struct cobalt_params {
  91	u64	interval;
  92	u64	target;
  93	u64	mtu_time;
  94	u32	p_inc;
  95	u32	p_dec;
  96};
  97
  98/* struct cobalt_vars - contains codel and blue variables
  99 * @count:		codel dropping frequency
 100 * @rec_inv_sqrt:	reciprocal value of sqrt(count) >> 1
 101 * @drop_next:		time to drop next packet, or when we dropped last
 102 * @blue_timer:		Blue time to next drop
 103 * @p_drop:		BLUE drop probability (0.32 fxp)
 104 * @dropping:		set if in dropping state
 105 * @ecn_marked:		set if marked
 106 */
 107struct cobalt_vars {
 108	u32	count;
 109	u32	rec_inv_sqrt;
 110	ktime_t	drop_next;
 111	ktime_t	blue_timer;
 112	u32     p_drop;
 113	bool	dropping;
 114	bool    ecn_marked;
 115};
 116
 117enum {
 118	CAKE_SET_NONE = 0,
 119	CAKE_SET_SPARSE,
 120	CAKE_SET_SPARSE_WAIT, /* counted in SPARSE, actually in BULK */
 121	CAKE_SET_BULK,
 122	CAKE_SET_DECAYING
 123};
 124
 125struct cake_flow {
 126	/* this stuff is all needed per-flow at dequeue time */
 127	struct sk_buff	  *head;
 128	struct sk_buff	  *tail;
 129	struct list_head  flowchain;
 130	s32		  deficit;
 131	u32		  dropped;
 132	struct cobalt_vars cvars;
 133	u16		  srchost; /* index into cake_host table */
 134	u16		  dsthost;
 135	u8		  set;
 136}; /* please try to keep this structure <= 64 bytes */
 137
 138struct cake_host {
 139	u32 srchost_tag;
 140	u32 dsthost_tag;
 141	u16 srchost_bulk_flow_count;
 142	u16 dsthost_bulk_flow_count;
 143};
 144
 145struct cake_heap_entry {
 146	u16 t:3, b:10;
 147};
 148
 149struct cake_tin_data {
 150	struct cake_flow flows[CAKE_QUEUES];
 151	u32	backlogs[CAKE_QUEUES];
 152	u32	tags[CAKE_QUEUES]; /* for set association */
 153	u16	overflow_idx[CAKE_QUEUES];
 154	struct cake_host hosts[CAKE_QUEUES]; /* for triple isolation */
 155	u16	flow_quantum;
 156
 157	struct cobalt_params cparams;
 158	u32	drop_overlimit;
 159	u16	bulk_flow_count;
 160	u16	sparse_flow_count;
 161	u16	decaying_flow_count;
 162	u16	unresponsive_flow_count;
 163
 164	u32	max_skblen;
 165
 166	struct list_head new_flows;
 167	struct list_head old_flows;
 168	struct list_head decaying_flows;
 169
 170	/* time_next = time_this + ((len * rate_ns) >> rate_shft) */
 171	ktime_t	time_next_packet;
 172	u64	tin_rate_ns;
 173	u64	tin_rate_bps;
 174	u16	tin_rate_shft;
 175
 176	u16	tin_quantum_prio;
 177	u16	tin_quantum_band;
 178	s32	tin_deficit;
 179	u32	tin_backlog;
 180	u32	tin_dropped;
 181	u32	tin_ecn_mark;
 182
 183	u32	packets;
 184	u64	bytes;
 185
 186	u32	ack_drops;
 187
 188	/* moving averages */
 189	u64 avge_delay;
 190	u64 peak_delay;
 191	u64 base_delay;
 192
 193	/* hash function stats */
 194	u32	way_directs;
 195	u32	way_hits;
 196	u32	way_misses;
 197	u32	way_collisions;
 198}; /* number of tins is small, so size of this struct doesn't matter much */
 199
 200struct cake_sched_data {
 201	struct tcf_proto __rcu *filter_list; /* optional external classifier */
 202	struct tcf_block *block;
 203	struct cake_tin_data *tins;
 204
 205	struct cake_heap_entry overflow_heap[CAKE_QUEUES * CAKE_MAX_TINS];
 206	u16		overflow_timeout;
 207
 208	u16		tin_cnt;
 209	u8		tin_mode;
 210	u8		flow_mode;
 211	u8		ack_filter;
 212	u8		atm_mode;
 213
 214	u32		fwmark_mask;
 215	u16		fwmark_shft;
 216
 217	/* time_next = time_this + ((len * rate_ns) >> rate_shft) */
 218	u16		rate_shft;
 219	ktime_t		time_next_packet;
 220	ktime_t		failsafe_next_packet;
 221	u64		rate_ns;
 222	u64		rate_bps;
 223	u16		rate_flags;
 224	s16		rate_overhead;
 225	u16		rate_mpu;
 226	u64		interval;
 227	u64		target;
 228
 229	/* resource tracking */
 230	u32		buffer_used;
 231	u32		buffer_max_used;
 232	u32		buffer_limit;
 233	u32		buffer_config_limit;
 234
 235	/* indices for dequeue */
 236	u16		cur_tin;
 237	u16		cur_flow;
 238
 239	struct qdisc_watchdog watchdog;
 240	const u8	*tin_index;
 241	const u8	*tin_order;
 242
 243	/* bandwidth capacity estimate */
 244	ktime_t		last_packet_time;
 245	ktime_t		avg_window_begin;
 246	u64		avg_packet_interval;
 247	u64		avg_window_bytes;
 248	u64		avg_peak_bandwidth;
 249	ktime_t		last_reconfig_time;
 250
 251	/* packet length stats */
 252	u32		avg_netoff;
 253	u16		max_netlen;
 254	u16		max_adjlen;
 255	u16		min_netlen;
 256	u16		min_adjlen;
 257};
 258
 259enum {
 260	CAKE_FLAG_OVERHEAD	   = BIT(0),
 261	CAKE_FLAG_AUTORATE_INGRESS = BIT(1),
 262	CAKE_FLAG_INGRESS	   = BIT(2),
 263	CAKE_FLAG_WASH		   = BIT(3),
 264	CAKE_FLAG_SPLIT_GSO	   = BIT(4)
 265};
 266
 267/* COBALT operates the Codel and BLUE algorithms in parallel, in order to
 268 * obtain the best features of each.  Codel is excellent on flows which
 269 * respond to congestion signals in a TCP-like way.  BLUE is more effective on
 270 * unresponsive flows.
 271 */
 272
 273struct cobalt_skb_cb {
 274	ktime_t enqueue_time;
 275	u32     adjusted_len;
 276};
 277
 278static u64 us_to_ns(u64 us)
 279{
 280	return us * NSEC_PER_USEC;
 281}
 282
 283static struct cobalt_skb_cb *get_cobalt_cb(const struct sk_buff *skb)
 284{
 285	qdisc_cb_private_validate(skb, sizeof(struct cobalt_skb_cb));
 286	return (struct cobalt_skb_cb *)qdisc_skb_cb(skb)->data;
 287}
 288
 289static ktime_t cobalt_get_enqueue_time(const struct sk_buff *skb)
 290{
 291	return get_cobalt_cb(skb)->enqueue_time;
 292}
 293
 294static void cobalt_set_enqueue_time(struct sk_buff *skb,
 295				    ktime_t now)
 296{
 297	get_cobalt_cb(skb)->enqueue_time = now;
 298}
 299
 300static u16 quantum_div[CAKE_QUEUES + 1] = {0};
 301
 302/* Diffserv lookup tables */
 303
 304static const u8 precedence[] = {
 305	0, 0, 0, 0, 0, 0, 0, 0,
 306	1, 1, 1, 1, 1, 1, 1, 1,
 307	2, 2, 2, 2, 2, 2, 2, 2,
 308	3, 3, 3, 3, 3, 3, 3, 3,
 309	4, 4, 4, 4, 4, 4, 4, 4,
 310	5, 5, 5, 5, 5, 5, 5, 5,
 311	6, 6, 6, 6, 6, 6, 6, 6,
 312	7, 7, 7, 7, 7, 7, 7, 7,
 313};
 314
 315static const u8 diffserv8[] = {
 316	2, 5, 1, 2, 4, 2, 2, 2,
 317	0, 2, 1, 2, 1, 2, 1, 2,
 318	5, 2, 4, 2, 4, 2, 4, 2,
 319	3, 2, 3, 2, 3, 2, 3, 2,
 320	6, 2, 3, 2, 3, 2, 3, 2,
 321	6, 2, 2, 2, 6, 2, 6, 2,
 322	7, 2, 2, 2, 2, 2, 2, 2,
 323	7, 2, 2, 2, 2, 2, 2, 2,
 324};
 325
 326static const u8 diffserv4[] = {
 327	0, 2, 0, 0, 2, 0, 0, 0,
 328	1, 0, 0, 0, 0, 0, 0, 0,
 329	2, 0, 2, 0, 2, 0, 2, 0,
 330	2, 0, 2, 0, 2, 0, 2, 0,
 331	3, 0, 2, 0, 2, 0, 2, 0,
 332	3, 0, 0, 0, 3, 0, 3, 0,
 333	3, 0, 0, 0, 0, 0, 0, 0,
 334	3, 0, 0, 0, 0, 0, 0, 0,
 335};
 336
 337static const u8 diffserv3[] = {
 338	0, 0, 0, 0, 2, 0, 0, 0,
 339	1, 0, 0, 0, 0, 0, 0, 0,
 340	0, 0, 0, 0, 0, 0, 0, 0,
 341	0, 0, 0, 0, 0, 0, 0, 0,
 342	0, 0, 0, 0, 0, 0, 0, 0,
 343	0, 0, 0, 0, 2, 0, 2, 0,
 344	2, 0, 0, 0, 0, 0, 0, 0,
 345	2, 0, 0, 0, 0, 0, 0, 0,
 346};
 347
 348static const u8 besteffort[] = {
 349	0, 0, 0, 0, 0, 0, 0, 0,
 350	0, 0, 0, 0, 0, 0, 0, 0,
 351	0, 0, 0, 0, 0, 0, 0, 0,
 352	0, 0, 0, 0, 0, 0, 0, 0,
 353	0, 0, 0, 0, 0, 0, 0, 0,
 354	0, 0, 0, 0, 0, 0, 0, 0,
 355	0, 0, 0, 0, 0, 0, 0, 0,
 356	0, 0, 0, 0, 0, 0, 0, 0,
 357};
 358
 359/* tin priority order for stats dumping */
 360
 361static const u8 normal_order[] = {0, 1, 2, 3, 4, 5, 6, 7};
 362static const u8 bulk_order[] = {1, 0, 2, 3};
 363
 364#define REC_INV_SQRT_CACHE (16)
 365static u32 cobalt_rec_inv_sqrt_cache[REC_INV_SQRT_CACHE] = {0};
 366
 367/* http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
 368 * new_invsqrt = (invsqrt / 2) * (3 - count * invsqrt^2)
 369 *
 370 * Here, invsqrt is a fixed point number (< 1.0), 32bit mantissa, aka Q0.32
 371 */
 372
 373static void cobalt_newton_step(struct cobalt_vars *vars)
 374{
 375	u32 invsqrt, invsqrt2;
 376	u64 val;
 377
 378	invsqrt = vars->rec_inv_sqrt;
 379	invsqrt2 = ((u64)invsqrt * invsqrt) >> 32;
 380	val = (3LL << 32) - ((u64)vars->count * invsqrt2);
 381
 382	val >>= 2; /* avoid overflow in following multiply */
 383	val = (val * invsqrt) >> (32 - 2 + 1);
 384
 385	vars->rec_inv_sqrt = val;
 386}
 387
 388static void cobalt_invsqrt(struct cobalt_vars *vars)
 389{
 390	if (vars->count < REC_INV_SQRT_CACHE)
 391		vars->rec_inv_sqrt = cobalt_rec_inv_sqrt_cache[vars->count];
 392	else
 393		cobalt_newton_step(vars);
 394}
 395
 396/* There is a big difference in timing between the accurate values placed in
 397 * the cache and the approximations given by a single Newton step for small
 398 * count values, particularly when stepping from count 1 to 2 or vice versa.
 399 * Above 16, a single Newton step gives sufficient accuracy in either
 400 * direction, given the precision stored.
 401 *
 402 * The magnitude of the error when stepping up to count 2 is such as to give
 403 * the value that *should* have been produced at count 4.
 404 */
 405
 406static void cobalt_cache_init(void)
 407{
 408	struct cobalt_vars v;
 409
 410	memset(&v, 0, sizeof(v));
 411	v.rec_inv_sqrt = ~0U;
 412	cobalt_rec_inv_sqrt_cache[0] = v.rec_inv_sqrt;
 413
 414	for (v.count = 1; v.count < REC_INV_SQRT_CACHE; v.count++) {
 415		cobalt_newton_step(&v);
 416		cobalt_newton_step(&v);
 417		cobalt_newton_step(&v);
 418		cobalt_newton_step(&v);
 419
 420		cobalt_rec_inv_sqrt_cache[v.count] = v.rec_inv_sqrt;
 421	}
 422}
 423
 424static void cobalt_vars_init(struct cobalt_vars *vars)
 425{
 426	memset(vars, 0, sizeof(*vars));
 427
 428	if (!cobalt_rec_inv_sqrt_cache[0]) {
 429		cobalt_cache_init();
 430		cobalt_rec_inv_sqrt_cache[0] = ~0;
 431	}
 432}
 433
 434/* CoDel control_law is t + interval/sqrt(count)
 435 * We maintain in rec_inv_sqrt the reciprocal value of sqrt(count) to avoid
 436 * both sqrt() and divide operation.
 437 */
 438static ktime_t cobalt_control(ktime_t t,
 439			      u64 interval,
 440			      u32 rec_inv_sqrt)
 441{
 442	return ktime_add_ns(t, reciprocal_scale(interval,
 443						rec_inv_sqrt));
 444}
 445
 446/* Call this when a packet had to be dropped due to queue overflow.  Returns
 447 * true if the BLUE state was quiescent before but active after this call.
 448 */
 449static bool cobalt_queue_full(struct cobalt_vars *vars,
 450			      struct cobalt_params *p,
 451			      ktime_t now)
 452{
 453	bool up = false;
 454
 455	if (ktime_to_ns(ktime_sub(now, vars->blue_timer)) > p->target) {
 456		up = !vars->p_drop;
 457		vars->p_drop += p->p_inc;
 458		if (vars->p_drop < p->p_inc)
 459			vars->p_drop = ~0;
 460		vars->blue_timer = now;
 461	}
 462	vars->dropping = true;
 463	vars->drop_next = now;
 464	if (!vars->count)
 465		vars->count = 1;
 466
 467	return up;
 468}
 469
 470/* Call this when the queue was serviced but turned out to be empty.  Returns
 471 * true if the BLUE state was active before but quiescent after this call.
 472 */
 473static bool cobalt_queue_empty(struct cobalt_vars *vars,
 474			       struct cobalt_params *p,
 475			       ktime_t now)
 476{
 477	bool down = false;
 478
 479	if (vars->p_drop &&
 480	    ktime_to_ns(ktime_sub(now, vars->blue_timer)) > p->target) {
 481		if (vars->p_drop < p->p_dec)
 482			vars->p_drop = 0;
 483		else
 484			vars->p_drop -= p->p_dec;
 485		vars->blue_timer = now;
 486		down = !vars->p_drop;
 487	}
 488	vars->dropping = false;
 489
 490	if (vars->count && ktime_to_ns(ktime_sub(now, vars->drop_next)) >= 0) {
 491		vars->count--;
 492		cobalt_invsqrt(vars);
 493		vars->drop_next = cobalt_control(vars->drop_next,
 494						 p->interval,
 495						 vars->rec_inv_sqrt);
 496	}
 497
 498	return down;
 499}
 500
 501/* Call this with a freshly dequeued packet for possible congestion marking.
 502 * Returns true as an instruction to drop the packet, false for delivery.
 503 */
 504static bool cobalt_should_drop(struct cobalt_vars *vars,
 505			       struct cobalt_params *p,
 506			       ktime_t now,
 507			       struct sk_buff *skb,
 508			       u32 bulk_flows)
 509{
 510	bool next_due, over_target, drop = false;
 511	ktime_t schedule;
 512	u64 sojourn;
 513
 514/* The 'schedule' variable records, in its sign, whether 'now' is before or
 515 * after 'drop_next'.  This allows 'drop_next' to be updated before the next
 516 * scheduling decision is actually branched, without destroying that
 517 * information.  Similarly, the first 'schedule' value calculated is preserved
 518 * in the boolean 'next_due'.
 519 *
 520 * As for 'drop_next', we take advantage of the fact that 'interval' is both
 521 * the delay between first exceeding 'target' and the first signalling event,
 522 * *and* the scaling factor for the signalling frequency.  It's therefore very
 523 * natural to use a single mechanism for both purposes, and eliminates a
 524 * significant amount of reference Codel's spaghetti code.  To help with this,
 525 * both the '0' and '1' entries in the invsqrt cache are 0xFFFFFFFF, as close
 526 * as possible to 1.0 in fixed-point.
 527 */
 528
 529	sojourn = ktime_to_ns(ktime_sub(now, cobalt_get_enqueue_time(skb)));
 530	schedule = ktime_sub(now, vars->drop_next);
 531	over_target = sojourn > p->target &&
 532		      sojourn > p->mtu_time * bulk_flows * 2 &&
 533		      sojourn > p->mtu_time * 4;
 534	next_due = vars->count && ktime_to_ns(schedule) >= 0;
 535
 536	vars->ecn_marked = false;
 537
 538	if (over_target) {
 539		if (!vars->dropping) {
 540			vars->dropping = true;
 541			vars->drop_next = cobalt_control(now,
 542							 p->interval,
 543							 vars->rec_inv_sqrt);
 544		}
 545		if (!vars->count)
 546			vars->count = 1;
 547	} else if (vars->dropping) {
 548		vars->dropping = false;
 549	}
 550
 551	if (next_due && vars->dropping) {
 552		/* Use ECN mark if possible, otherwise drop */
 553		drop = !(vars->ecn_marked = INET_ECN_set_ce(skb));
 554
 555		vars->count++;
 556		if (!vars->count)
 557			vars->count--;
 558		cobalt_invsqrt(vars);
 559		vars->drop_next = cobalt_control(vars->drop_next,
 560						 p->interval,
 561						 vars->rec_inv_sqrt);
 562		schedule = ktime_sub(now, vars->drop_next);
 563	} else {
 564		while (next_due) {
 565			vars->count--;
 566			cobalt_invsqrt(vars);
 567			vars->drop_next = cobalt_control(vars->drop_next,
 568							 p->interval,
 569							 vars->rec_inv_sqrt);
 570			schedule = ktime_sub(now, vars->drop_next);
 571			next_due = vars->count && ktime_to_ns(schedule) >= 0;
 572		}
 573	}
 574
 575	/* Simple BLUE implementation.  Lack of ECN is deliberate. */
 576	if (vars->p_drop)
 577		drop |= (prandom_u32() < vars->p_drop);
 578
 579	/* Overload the drop_next field as an activity timeout */
 580	if (!vars->count)
 581		vars->drop_next = ktime_add_ns(now, p->interval);
 582	else if (ktime_to_ns(schedule) > 0 && !drop)
 583		vars->drop_next = now;
 584
 585	return drop;
 586}
 587
 588static void cake_update_flowkeys(struct flow_keys *keys,
 589				 const struct sk_buff *skb)
 590{
 591#if IS_ENABLED(CONFIG_NF_CONNTRACK)
 592	struct nf_conntrack_tuple tuple = {};
 593	bool rev = !skb->_nfct;
 594
 595	if (tc_skb_protocol(skb) != htons(ETH_P_IP))
 596		return;
 597
 598	if (!nf_ct_get_tuple_skb(&tuple, skb))
 599		return;
 600
 601	keys->addrs.v4addrs.src = rev ? tuple.dst.u3.ip : tuple.src.u3.ip;
 602	keys->addrs.v4addrs.dst = rev ? tuple.src.u3.ip : tuple.dst.u3.ip;
 603
 604	if (keys->ports.ports) {
 605		keys->ports.src = rev ? tuple.dst.u.all : tuple.src.u.all;
 606		keys->ports.dst = rev ? tuple.src.u.all : tuple.dst.u.all;
 607	}
 608#endif
 609}
 610
 611/* Cake has several subtle multiple bit settings. In these cases you
 612 *  would be matching triple isolate mode as well.
 613 */
 614
 615static bool cake_dsrc(int flow_mode)
 616{
 617	return (flow_mode & CAKE_FLOW_DUAL_SRC) == CAKE_FLOW_DUAL_SRC;
 618}
 619
 620static bool cake_ddst(int flow_mode)
 621{
 622	return (flow_mode & CAKE_FLOW_DUAL_DST) == CAKE_FLOW_DUAL_DST;
 623}
 624
 625static u32 cake_hash(struct cake_tin_data *q, const struct sk_buff *skb,
 626		     int flow_mode, u16 flow_override, u16 host_override)
 627{
 628	u32 flow_hash = 0, srchost_hash = 0, dsthost_hash = 0;
 629	u16 reduced_hash, srchost_idx, dsthost_idx;
 630	struct flow_keys keys, host_keys;
 631
 632	if (unlikely(flow_mode == CAKE_FLOW_NONE))
 633		return 0;
 634
 635	/* If both overrides are set we can skip packet dissection entirely */
 636	if ((flow_override || !(flow_mode & CAKE_FLOW_FLOWS)) &&
 637	    (host_override || !(flow_mode & CAKE_FLOW_HOSTS)))
 638		goto skip_hash;
 639
 640	skb_flow_dissect_flow_keys(skb, &keys,
 641				   FLOW_DISSECTOR_F_STOP_AT_FLOW_LABEL);
 642
 643	if (flow_mode & CAKE_FLOW_NAT_FLAG)
 644		cake_update_flowkeys(&keys, skb);
 645
 646	/* flow_hash_from_keys() sorts the addresses by value, so we have
 647	 * to preserve their order in a separate data structure to treat
 648	 * src and dst host addresses as independently selectable.
 649	 */
 650	host_keys = keys;
 651	host_keys.ports.ports     = 0;
 652	host_keys.basic.ip_proto  = 0;
 653	host_keys.keyid.keyid     = 0;
 654	host_keys.tags.flow_label = 0;
 655
 656	switch (host_keys.control.addr_type) {
 657	case FLOW_DISSECTOR_KEY_IPV4_ADDRS:
 658		host_keys.addrs.v4addrs.src = 0;
 659		dsthost_hash = flow_hash_from_keys(&host_keys);
 660		host_keys.addrs.v4addrs.src = keys.addrs.v4addrs.src;
 661		host_keys.addrs.v4addrs.dst = 0;
 662		srchost_hash = flow_hash_from_keys(&host_keys);
 663		break;
 664
 665	case FLOW_DISSECTOR_KEY_IPV6_ADDRS:
 666		memset(&host_keys.addrs.v6addrs.src, 0,
 667		       sizeof(host_keys.addrs.v6addrs.src));
 668		dsthost_hash = flow_hash_from_keys(&host_keys);
 669		host_keys.addrs.v6addrs.src = keys.addrs.v6addrs.src;
 670		memset(&host_keys.addrs.v6addrs.dst, 0,
 671		       sizeof(host_keys.addrs.v6addrs.dst));
 672		srchost_hash = flow_hash_from_keys(&host_keys);
 673		break;
 674
 675	default:
 676		dsthost_hash = 0;
 677		srchost_hash = 0;
 678	}
 679
 680	/* This *must* be after the above switch, since as a
 681	 * side-effect it sorts the src and dst addresses.
 682	 */
 683	if (flow_mode & CAKE_FLOW_FLOWS)
 684		flow_hash = flow_hash_from_keys(&keys);
 685
 686skip_hash:
 687	if (flow_override)
 688		flow_hash = flow_override - 1;
 689	if (host_override) {
 690		dsthost_hash = host_override - 1;
 691		srchost_hash = host_override - 1;
 692	}
 693
 694	if (!(flow_mode & CAKE_FLOW_FLOWS)) {
 695		if (flow_mode & CAKE_FLOW_SRC_IP)
 696			flow_hash ^= srchost_hash;
 697
 698		if (flow_mode & CAKE_FLOW_DST_IP)
 699			flow_hash ^= dsthost_hash;
 700	}
 701
 702	reduced_hash = flow_hash % CAKE_QUEUES;
 703
 704	/* set-associative hashing */
 705	/* fast path if no hash collision (direct lookup succeeds) */
 706	if (likely(q->tags[reduced_hash] == flow_hash &&
 707		   q->flows[reduced_hash].set)) {
 708		q->way_directs++;
 709	} else {
 710		u32 inner_hash = reduced_hash % CAKE_SET_WAYS;
 711		u32 outer_hash = reduced_hash - inner_hash;
 712		bool allocate_src = false;
 713		bool allocate_dst = false;
 714		u32 i, k;
 715
 716		/* check if any active queue in the set is reserved for
 717		 * this flow.
 718		 */
 719		for (i = 0, k = inner_hash; i < CAKE_SET_WAYS;
 720		     i++, k = (k + 1) % CAKE_SET_WAYS) {
 721			if (q->tags[outer_hash + k] == flow_hash) {
 722				if (i)
 723					q->way_hits++;
 724
 725				if (!q->flows[outer_hash + k].set) {
 726					/* need to increment host refcnts */
 727					allocate_src = cake_dsrc(flow_mode);
 728					allocate_dst = cake_ddst(flow_mode);
 729				}
 730
 731				goto found;
 732			}
 733		}
 734
 735		/* no queue is reserved for this flow, look for an
 736		 * empty one.
 737		 */
 738		for (i = 0; i < CAKE_SET_WAYS;
 739			 i++, k = (k + 1) % CAKE_SET_WAYS) {
 740			if (!q->flows[outer_hash + k].set) {
 741				q->way_misses++;
 742				allocate_src = cake_dsrc(flow_mode);
 743				allocate_dst = cake_ddst(flow_mode);
 744				goto found;
 745			}
 746		}
 747
 748		/* With no empty queues, default to the original
 749		 * queue, accept the collision, update the host tags.
 750		 */
 751		q->way_collisions++;
 752		if (q->flows[outer_hash + k].set == CAKE_SET_BULK) {
 753			q->hosts[q->flows[reduced_hash].srchost].srchost_bulk_flow_count--;
 754			q->hosts[q->flows[reduced_hash].dsthost].dsthost_bulk_flow_count--;
 755		}
 756		allocate_src = cake_dsrc(flow_mode);
 757		allocate_dst = cake_ddst(flow_mode);
 758found:
 759		/* reserve queue for future packets in same flow */
 760		reduced_hash = outer_hash + k;
 761		q->tags[reduced_hash] = flow_hash;
 762
 763		if (allocate_src) {
 764			srchost_idx = srchost_hash % CAKE_QUEUES;
 765			inner_hash = srchost_idx % CAKE_SET_WAYS;
 766			outer_hash = srchost_idx - inner_hash;
 767			for (i = 0, k = inner_hash; i < CAKE_SET_WAYS;
 768				i++, k = (k + 1) % CAKE_SET_WAYS) {
 769				if (q->hosts[outer_hash + k].srchost_tag ==
 770				    srchost_hash)
 771					goto found_src;
 772			}
 773			for (i = 0; i < CAKE_SET_WAYS;
 774				i++, k = (k + 1) % CAKE_SET_WAYS) {
 775				if (!q->hosts[outer_hash + k].srchost_bulk_flow_count)
 776					break;
 777			}
 778			q->hosts[outer_hash + k].srchost_tag = srchost_hash;
 779found_src:
 780			srchost_idx = outer_hash + k;
 781			if (q->flows[reduced_hash].set == CAKE_SET_BULK)
 782				q->hosts[srchost_idx].srchost_bulk_flow_count++;
 783			q->flows[reduced_hash].srchost = srchost_idx;
 784		}
 785
 786		if (allocate_dst) {
 787			dsthost_idx = dsthost_hash % CAKE_QUEUES;
 788			inner_hash = dsthost_idx % CAKE_SET_WAYS;
 789			outer_hash = dsthost_idx - inner_hash;
 790			for (i = 0, k = inner_hash; i < CAKE_SET_WAYS;
 791			     i++, k = (k + 1) % CAKE_SET_WAYS) {
 792				if (q->hosts[outer_hash + k].dsthost_tag ==
 793				    dsthost_hash)
 794					goto found_dst;
 795			}
 796			for (i = 0; i < CAKE_SET_WAYS;
 797			     i++, k = (k + 1) % CAKE_SET_WAYS) {
 798				if (!q->hosts[outer_hash + k].dsthost_bulk_flow_count)
 799					break;
 800			}
 801			q->hosts[outer_hash + k].dsthost_tag = dsthost_hash;
 802found_dst:
 803			dsthost_idx = outer_hash + k;
 804			if (q->flows[reduced_hash].set == CAKE_SET_BULK)
 805				q->hosts[dsthost_idx].dsthost_bulk_flow_count++;
 806			q->flows[reduced_hash].dsthost = dsthost_idx;
 807		}
 808	}
 809
 810	return reduced_hash;
 811}
 812
 813/* helper functions : might be changed when/if skb use a standard list_head */
 814/* remove one skb from head of slot queue */
 815
 816static struct sk_buff *dequeue_head(struct cake_flow *flow)
 817{
 818	struct sk_buff *skb = flow->head;
 819
 820	if (skb) {
 821		flow->head = skb->next;
 822		skb_mark_not_on_list(skb);
 823	}
 824
 825	return skb;
 826}
 827
 828/* add skb to flow queue (tail add) */
 829
 830static void flow_queue_add(struct cake_flow *flow, struct sk_buff *skb)
 831{
 832	if (!flow->head)
 833		flow->head = skb;
 834	else
 835		flow->tail->next = skb;
 836	flow->tail = skb;
 837	skb->next = NULL;
 838}
 839
 840static struct iphdr *cake_get_iphdr(const struct sk_buff *skb,
 841				    struct ipv6hdr *buf)
 842{
 843	unsigned int offset = skb_network_offset(skb);
 844	struct iphdr *iph;
 845
 846	iph = skb_header_pointer(skb, offset, sizeof(struct iphdr), buf);
 847
 848	if (!iph)
 849		return NULL;
 850
 851	if (iph->version == 4 && iph->protocol == IPPROTO_IPV6)
 852		return skb_header_pointer(skb, offset + iph->ihl * 4,
 853					  sizeof(struct ipv6hdr), buf);
 854
 855	else if (iph->version == 4)
 856		return iph;
 857
 858	else if (iph->version == 6)
 859		return skb_header_pointer(skb, offset, sizeof(struct ipv6hdr),
 860					  buf);
 861
 862	return NULL;
 863}
 864
 865static struct tcphdr *cake_get_tcphdr(const struct sk_buff *skb,
 866				      void *buf, unsigned int bufsize)
 867{
 868	unsigned int offset = skb_network_offset(skb);
 869	const struct ipv6hdr *ipv6h;
 870	const struct tcphdr *tcph;
 871	const struct iphdr *iph;
 872	struct ipv6hdr _ipv6h;
 873	struct tcphdr _tcph;
 874
 875	ipv6h = skb_header_pointer(skb, offset, sizeof(_ipv6h), &_ipv6h);
 876
 877	if (!ipv6h)
 878		return NULL;
 879
 880	if (ipv6h->version == 4) {
 881		iph = (struct iphdr *)ipv6h;
 882		offset += iph->ihl * 4;
 883
 884		/* special-case 6in4 tunnelling, as that is a common way to get
 885		 * v6 connectivity in the home
 886		 */
 887		if (iph->protocol == IPPROTO_IPV6) {
 888			ipv6h = skb_header_pointer(skb, offset,
 889						   sizeof(_ipv6h), &_ipv6h);
 890
 891			if (!ipv6h || ipv6h->nexthdr != IPPROTO_TCP)
 892				return NULL;
 893
 894			offset += sizeof(struct ipv6hdr);
 895
 896		} else if (iph->protocol != IPPROTO_TCP) {
 897			return NULL;
 898		}
 899
 900	} else if (ipv6h->version == 6) {
 901		if (ipv6h->nexthdr != IPPROTO_TCP)
 902			return NULL;
 903
 904		offset += sizeof(struct ipv6hdr);
 905	} else {
 906		return NULL;
 907	}
 908
 909	tcph = skb_header_pointer(skb, offset, sizeof(_tcph), &_tcph);
 910	if (!tcph)
 911		return NULL;
 912
 913	return skb_header_pointer(skb, offset,
 914				  min(__tcp_hdrlen(tcph), bufsize), buf);
 915}
 916
 917static const void *cake_get_tcpopt(const struct tcphdr *tcph,
 918				   int code, int *oplen)
 919{
 920	/* inspired by tcp_parse_options in tcp_input.c */
 921	int length = __tcp_hdrlen(tcph) - sizeof(struct tcphdr);
 922	const u8 *ptr = (const u8 *)(tcph + 1);
 923
 924	while (length > 0) {
 925		int opcode = *ptr++;
 926		int opsize;
 927
 928		if (opcode == TCPOPT_EOL)
 929			break;
 930		if (opcode == TCPOPT_NOP) {
 931			length--;
 932			continue;
 933		}
 934		opsize = *ptr++;
 935		if (opsize < 2 || opsize > length)
 936			break;
 937
 938		if (opcode == code) {
 939			*oplen = opsize;
 940			return ptr;
 941		}
 942
 943		ptr += opsize - 2;
 944		length -= opsize;
 945	}
 946
 947	return NULL;
 948}
 949
 950/* Compare two SACK sequences. A sequence is considered greater if it SACKs more
 951 * bytes than the other. In the case where both sequences ACKs bytes that the
 952 * other doesn't, A is considered greater. DSACKs in A also makes A be
 953 * considered greater.
 954 *
 955 * @return -1, 0 or 1 as normal compare functions
 956 */
 957static int cake_tcph_sack_compare(const struct tcphdr *tcph_a,
 958				  const struct tcphdr *tcph_b)
 959{
 960	const struct tcp_sack_block_wire *sack_a, *sack_b;
 961	u32 ack_seq_a = ntohl(tcph_a->ack_seq);
 962	u32 bytes_a = 0, bytes_b = 0;
 963	int oplen_a, oplen_b;
 964	bool first = true;
 965
 966	sack_a = cake_get_tcpopt(tcph_a, TCPOPT_SACK, &oplen_a);
 967	sack_b = cake_get_tcpopt(tcph_b, TCPOPT_SACK, &oplen_b);
 968
 969	/* pointers point to option contents */
 970	oplen_a -= TCPOLEN_SACK_BASE;
 971	oplen_b -= TCPOLEN_SACK_BASE;
 972
 973	if (sack_a && oplen_a >= sizeof(*sack_a) &&
 974	    (!sack_b || oplen_b < sizeof(*sack_b)))
 975		return -1;
 976	else if (sack_b && oplen_b >= sizeof(*sack_b) &&
 977		 (!sack_a || oplen_a < sizeof(*sack_a)))
 978		return 1;
 979	else if ((!sack_a || oplen_a < sizeof(*sack_a)) &&
 980		 (!sack_b || oplen_b < sizeof(*sack_b)))
 981		return 0;
 982
 983	while (oplen_a >= sizeof(*sack_a)) {
 984		const struct tcp_sack_block_wire *sack_tmp = sack_b;
 985		u32 start_a = get_unaligned_be32(&sack_a->start_seq);
 986		u32 end_a = get_unaligned_be32(&sack_a->end_seq);
 987		int oplen_tmp = oplen_b;
 988		bool found = false;
 989
 990		/* DSACK; always considered greater to prevent dropping */
 991		if (before(start_a, ack_seq_a))
 992			return -1;
 993
 994		bytes_a += end_a - start_a;
 995
 996		while (oplen_tmp >= sizeof(*sack_tmp)) {
 997			u32 start_b = get_unaligned_be32(&sack_tmp->start_seq);
 998			u32 end_b = get_unaligned_be32(&sack_tmp->end_seq);
 999
1000			/* first time through we count the total size */
1001			if (first)
1002				bytes_b += end_b - start_b;
1003
1004			if (!after(start_b, start_a) && !before(end_b, end_a)) {
1005				found = true;
1006				if (!first)
1007					break;
1008			}
1009			oplen_tmp -= sizeof(*sack_tmp);
1010			sack_tmp++;
1011		}
1012
1013		if (!found)
1014			return -1;
1015
1016		oplen_a -= sizeof(*sack_a);
1017		sack_a++;
1018		first = false;
1019	}
1020
1021	/* If we made it this far, all ranges SACKed by A are covered by B, so
1022	 * either the SACKs are equal, or B SACKs more bytes.
1023	 */
1024	return bytes_b > bytes_a ? 1 : 0;
1025}
1026
1027static void cake_tcph_get_tstamp(const struct tcphdr *tcph,
1028				 u32 *tsval, u32 *tsecr)
1029{
1030	const u8 *ptr;
1031	int opsize;
1032
1033	ptr = cake_get_tcpopt(tcph, TCPOPT_TIMESTAMP, &opsize);
1034
1035	if (ptr && opsize == TCPOLEN_TIMESTAMP) {
1036		*tsval = get_unaligned_be32(ptr);
1037		*tsecr = get_unaligned_be32(ptr + 4);
1038	}
1039}
1040
1041static bool cake_tcph_may_drop(const struct tcphdr *tcph,
1042			       u32 tstamp_new, u32 tsecr_new)
1043{
1044	/* inspired by tcp_parse_options in tcp_input.c */
1045	int length = __tcp_hdrlen(tcph) - sizeof(struct tcphdr);
1046	const u8 *ptr = (const u8 *)(tcph + 1);
1047	u32 tstamp, tsecr;
1048
1049	/* 3 reserved flags must be unset to avoid future breakage
1050	 * ACK must be set
1051	 * ECE/CWR are handled separately
1052	 * All other flags URG/PSH/RST/SYN/FIN must be unset
1053	 * 0x0FFF0000 = all TCP flags (confirm ACK=1, others zero)
1054	 * 0x00C00000 = CWR/ECE (handled separately)
1055	 * 0x0F3F0000 = 0x0FFF0000 & ~0x00C00000
1056	 */
1057	if (((tcp_flag_word(tcph) &
1058	      cpu_to_be32(0x0F3F0000)) != TCP_FLAG_ACK))
1059		return false;
1060
1061	while (length > 0) {
1062		int opcode = *ptr++;
1063		int opsize;
1064
1065		if (opcode == TCPOPT_EOL)
1066			break;
1067		if (opcode == TCPOPT_NOP) {
1068			length--;
1069			continue;
1070		}
1071		opsize = *ptr++;
1072		if (opsize < 2 || opsize > length)
1073			break;
1074
1075		switch (opcode) {
1076		case TCPOPT_MD5SIG: /* doesn't influence state */
1077			break;
1078
1079		case TCPOPT_SACK: /* stricter checking performed later */
1080			if (opsize % 8 != 2)
1081				return false;
1082			break;
1083
1084		case TCPOPT_TIMESTAMP:
1085			/* only drop timestamps lower than new */
1086			if (opsize != TCPOLEN_TIMESTAMP)
1087				return false;
1088			tstamp = get_unaligned_be32(ptr);
1089			tsecr = get_unaligned_be32(ptr + 4);
1090			if (after(tstamp, tstamp_new) ||
1091			    after(tsecr, tsecr_new))
1092				return false;
1093			break;
1094
1095		case TCPOPT_MSS:  /* these should only be set on SYN */
1096		case TCPOPT_WINDOW:
1097		case TCPOPT_SACK_PERM:
1098		case TCPOPT_FASTOPEN:
1099		case TCPOPT_EXP:
1100		default: /* don't drop if any unknown options are present */
1101			return false;
1102		}
1103
1104		ptr += opsize - 2;
1105		length -= opsize;
1106	}
1107
1108	return true;
1109}
1110
1111static struct sk_buff *cake_ack_filter(struct cake_sched_data *q,
1112				       struct cake_flow *flow)
1113{
1114	bool aggressive = q->ack_filter == CAKE_ACK_AGGRESSIVE;
1115	struct sk_buff *elig_ack = NULL, *elig_ack_prev = NULL;
1116	struct sk_buff *skb_check, *skb_prev = NULL;
1117	const struct ipv6hdr *ipv6h, *ipv6h_check;
1118	unsigned char _tcph[64], _tcph_check[64];
1119	const struct tcphdr *tcph, *tcph_check;
1120	const struct iphdr *iph, *iph_check;
1121	struct ipv6hdr _iph, _iph_check;
1122	const struct sk_buff *skb;
1123	int seglen, num_found = 0;
1124	u32 tstamp = 0, tsecr = 0;
1125	__be32 elig_flags = 0;
1126	int sack_comp;
1127
1128	/* no other possible ACKs to filter */
1129	if (flow->head == flow->tail)
1130		return NULL;
1131
1132	skb = flow->tail;
1133	tcph = cake_get_tcphdr(skb, _tcph, sizeof(_tcph));
1134	iph = cake_get_iphdr(skb, &_iph);
1135	if (!tcph)
1136		return NULL;
1137
1138	cake_tcph_get_tstamp(tcph, &tstamp, &tsecr);
1139
1140	/* the 'triggering' packet need only have the ACK flag set.
1141	 * also check that SYN is not set, as there won't be any previous ACKs.
1142	 */
1143	if ((tcp_flag_word(tcph) &
1144	     (TCP_FLAG_ACK | TCP_FLAG_SYN)) != TCP_FLAG_ACK)
1145		return NULL;
1146
1147	/* the 'triggering' ACK is at the tail of the queue, we have already
1148	 * returned if it is the only packet in the flow. loop through the rest
1149	 * of the queue looking for pure ACKs with the same 5-tuple as the
1150	 * triggering one.
1151	 */
1152	for (skb_check = flow->head;
1153	     skb_check && skb_check != skb;
1154	     skb_prev = skb_check, skb_check = skb_check->next) {
1155		iph_check = cake_get_iphdr(skb_check, &_iph_check);
1156		tcph_check = cake_get_tcphdr(skb_check, &_tcph_check,
1157					     sizeof(_tcph_check));
1158
1159		/* only TCP packets with matching 5-tuple are eligible, and only
1160		 * drop safe headers
1161		 */
1162		if (!tcph_check || iph->version != iph_check->version ||
1163		    tcph_check->source != tcph->source ||
1164		    tcph_check->dest != tcph->dest)
1165			continue;
1166
1167		if (iph_check->version == 4) {
1168			if (iph_check->saddr != iph->saddr ||
1169			    iph_check->daddr != iph->daddr)
1170				continue;
1171
1172			seglen = ntohs(iph_check->tot_len) -
1173				       (4 * iph_check->ihl);
1174		} else if (iph_check->version == 6) {
1175			ipv6h = (struct ipv6hdr *)iph;
1176			ipv6h_check = (struct ipv6hdr *)iph_check;
1177
1178			if (ipv6_addr_cmp(&ipv6h_check->saddr, &ipv6h->saddr) ||
1179			    ipv6_addr_cmp(&ipv6h_check->daddr, &ipv6h->daddr))
1180				continue;
1181
1182			seglen = ntohs(ipv6h_check->payload_len);
1183		} else {
1184			WARN_ON(1);  /* shouldn't happen */
1185			continue;
1186		}
1187
1188		/* If the ECE/CWR flags changed from the previous eligible
1189		 * packet in the same flow, we should no longer be dropping that
1190		 * previous packet as this would lose information.
1191		 */
1192		if (elig_ack && (tcp_flag_word(tcph_check) &
1193				 (TCP_FLAG_ECE | TCP_FLAG_CWR)) != elig_flags) {
1194			elig_ack = NULL;
1195			elig_ack_prev = NULL;
1196			num_found--;
1197		}
1198
1199		/* Check TCP options and flags, don't drop ACKs with segment
1200		 * data, and don't drop ACKs with a higher cumulative ACK
1201		 * counter than the triggering packet. Check ACK seqno here to
1202		 * avoid parsing SACK options of packets we are going to exclude
1203		 * anyway.
1204		 */
1205		if (!cake_tcph_may_drop(tcph_check, tstamp, tsecr) ||
1206		    (seglen - __tcp_hdrlen(tcph_check)) != 0 ||
1207		    after(ntohl(tcph_check->ack_seq), ntohl(tcph->ack_seq)))
1208			continue;
1209
1210		/* Check SACK options. The triggering packet must SACK more data
1211		 * than the ACK under consideration, or SACK the same range but
1212		 * have a larger cumulative ACK counter. The latter is a
1213		 * pathological case, but is contained in the following check
1214		 * anyway, just to be safe.
1215		 */
1216		sack_comp = cake_tcph_sack_compare(tcph_check, tcph);
1217
1218		if (sack_comp < 0 ||
1219		    (ntohl(tcph_check->ack_seq) == ntohl(tcph->ack_seq) &&
1220		     sack_comp == 0))
1221			continue;
1222
1223		/* At this point we have found an eligible pure ACK to drop; if
1224		 * we are in aggressive mode, we are done. Otherwise, keep
1225		 * searching unless this is the second eligible ACK we
1226		 * found.
1227		 *
1228		 * Since we want to drop ACK closest to the head of the queue,
1229		 * save the first eligible ACK we find, even if we need to loop
1230		 * again.
1231		 */
1232		if (!elig_ack) {
1233			elig_ack = skb_check;
1234			elig_ack_prev = skb_prev;
1235			elig_flags = (tcp_flag_word(tcph_check)
1236				      & (TCP_FLAG_ECE | TCP_FLAG_CWR));
1237		}
1238
1239		if (num_found++ > 0)
1240			goto found;
1241	}
1242
1243	/* We made it through the queue without finding two eligible ACKs . If
1244	 * we found a single eligible ACK we can drop it in aggressive mode if
1245	 * we can guarantee that this does not interfere with ECN flag
1246	 * information. We ensure this by dropping it only if the enqueued
1247	 * packet is consecutive with the eligible ACK, and their flags match.
1248	 */
1249	if (elig_ack && aggressive && elig_ack->next == skb &&
1250	    (elig_flags == (tcp_flag_word(tcph) &
1251			    (TCP_FLAG_ECE | TCP_FLAG_CWR))))
1252		goto found;
1253
1254	return NULL;
1255
1256found:
1257	if (elig_ack_prev)
1258		elig_ack_prev->next = elig_ack->next;
1259	else
1260		flow->head = elig_ack->next;
1261
1262	skb_mark_not_on_list(elig_ack);
1263
1264	return elig_ack;
1265}
1266
1267static u64 cake_ewma(u64 avg, u64 sample, u32 shift)
1268{
1269	avg -= avg >> shift;
1270	avg += sample >> shift;
1271	return avg;
1272}
1273
1274static u32 cake_calc_overhead(struct cake_sched_data *q, u32 len, u32 off)
1275{
1276	if (q->rate_flags & CAKE_FLAG_OVERHEAD)
1277		len -= off;
1278
1279	if (q->max_netlen < len)
1280		q->max_netlen = len;
1281	if (q->min_netlen > len)
1282		q->min_netlen = len;
1283
1284	len += q->rate_overhead;
1285
1286	if (len < q->rate_mpu)
1287		len = q->rate_mpu;
1288
1289	if (q->atm_mode == CAKE_ATM_ATM) {
1290		len += 47;
1291		len /= 48;
1292		len *= 53;
1293	} else if (q->atm_mode == CAKE_ATM_PTM) {
1294		/* Add one byte per 64 bytes or part thereof.
1295		 * This is conservative and easier to calculate than the
1296		 * precise value.
1297		 */
1298		len += (len + 63) / 64;
1299	}
1300
1301	if (q->max_adjlen < len)
1302		q->max_adjlen = len;
1303	if (q->min_adjlen > len)
1304		q->min_adjlen = len;
1305
1306	return len;
1307}
1308
1309static u32 cake_overhead(struct cake_sched_data *q, const struct sk_buff *skb)
1310{
1311	const struct skb_shared_info *shinfo = skb_shinfo(skb);
1312	unsigned int hdr_len, last_len = 0;
1313	u32 off = skb_network_offset(skb);
1314	u32 len = qdisc_pkt_len(skb);
1315	u16 segs = 1;
1316
1317	q->avg_netoff = cake_ewma(q->avg_netoff, off << 16, 8);
1318
1319	if (!shinfo->gso_size)
1320		return cake_calc_overhead(q, len, off);
1321
1322	/* borrowed from qdisc_pkt_len_init() */
1323	hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
1324
1325	/* + transport layer */
1326	if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 |
1327						SKB_GSO_TCPV6))) {
1328		const struct tcphdr *th;
1329		struct tcphdr _tcphdr;
1330
1331		th = skb_header_pointer(skb, skb_transport_offset(skb),
1332					sizeof(_tcphdr), &_tcphdr);
1333		if (likely(th))
1334			hdr_len += __tcp_hdrlen(th);
1335	} else {
1336		struct udphdr _udphdr;
1337
1338		if (skb_header_pointer(skb, skb_transport_offset(skb),
1339				       sizeof(_udphdr), &_udphdr))
1340			hdr_len += sizeof(struct udphdr);
1341	}
1342
1343	if (unlikely(shinfo->gso_type & SKB_GSO_DODGY))
1344		segs = DIV_ROUND_UP(skb->len - hdr_len,
1345				    shinfo->gso_size);
1346	else
1347		segs = shinfo->gso_segs;
1348
1349	len = shinfo->gso_size + hdr_len;
1350	last_len = skb->len - shinfo->gso_size * (segs - 1);
1351
1352	return (cake_calc_overhead(q, len, off) * (segs - 1) +
1353		cake_calc_overhead(q, last_len, off));
1354}
1355
1356static void cake_heap_swap(struct cake_sched_data *q, u16 i, u16 j)
1357{
1358	struct cake_heap_entry ii = q->overflow_heap[i];
1359	struct cake_heap_entry jj = q->overflow_heap[j];
1360
1361	q->overflow_heap[i] = jj;
1362	q->overflow_heap[j] = ii;
1363
1364	q->tins[ii.t].overflow_idx[ii.b] = j;
1365	q->tins[jj.t].overflow_idx[jj.b] = i;
1366}
1367
1368static u32 cake_heap_get_backlog(const struct cake_sched_data *q, u16 i)
1369{
1370	struct cake_heap_entry ii = q->overflow_heap[i];
1371
1372	return q->tins[ii.t].backlogs[ii.b];
1373}
1374
1375static void cake_heapify(struct cake_sched_data *q, u16 i)
1376{
1377	static const u32 a = CAKE_MAX_TINS * CAKE_QUEUES;
1378	u32 mb = cake_heap_get_backlog(q, i);
1379	u32 m = i;
1380
1381	while (m < a) {
1382		u32 l = m + m + 1;
1383		u32 r = l + 1;
1384
1385		if (l < a) {
1386			u32 lb = cake_heap_get_backlog(q, l);
1387
1388			if (lb > mb) {
1389				m  = l;
1390				mb = lb;
1391			}
1392		}
1393
1394		if (r < a) {
1395			u32 rb = cake_heap_get_backlog(q, r);
1396
1397			if (rb > mb) {
1398				m  = r;
1399				mb = rb;
1400			}
1401		}
1402
1403		if (m != i) {
1404			cake_heap_swap(q, i, m);
1405			i = m;
1406		} else {
1407			break;
1408		}
1409	}
1410}
1411
1412static void cake_heapify_up(struct cake_sched_data *q, u16 i)
1413{
1414	while (i > 0 && i < CAKE_MAX_TINS * CAKE_QUEUES) {
1415		u16 p = (i - 1) >> 1;
1416		u32 ib = cake_heap_get_backlog(q, i);
1417		u32 pb = cake_heap_get_backlog(q, p);
1418
1419		if (ib > pb) {
1420			cake_heap_swap(q, i, p);
1421			i = p;
1422		} else {
1423			break;
1424		}
1425	}
1426}
1427
1428static int cake_advance_shaper(struct cake_sched_data *q,
1429			       struct cake_tin_data *b,
1430			       struct sk_buff *skb,
1431			       ktime_t now, bool drop)
1432{
1433	u32 len = get_cobalt_cb(skb)->adjusted_len;
1434
1435	/* charge packet bandwidth to this tin
1436	 * and to the global shaper.
1437	 */
1438	if (q->rate_ns) {
1439		u64 tin_dur = (len * b->tin_rate_ns) >> b->tin_rate_shft;
1440		u64 global_dur = (len * q->rate_ns) >> q->rate_shft;
1441		u64 failsafe_dur = global_dur + (global_dur >> 1);
1442
1443		if (ktime_before(b->time_next_packet, now))
1444			b->time_next_packet = ktime_add_ns(b->time_next_packet,
1445							   tin_dur);
1446
1447		else if (ktime_before(b->time_next_packet,
1448				      ktime_add_ns(now, tin_dur)))
1449			b->time_next_packet = ktime_add_ns(now, tin_dur);
1450
1451		q->time_next_packet = ktime_add_ns(q->time_next_packet,
1452						   global_dur);
1453		if (!drop)
1454			q->failsafe_next_packet = \
1455				ktime_add_ns(q->failsafe_next_packet,
1456					     failsafe_dur);
1457	}
1458	return len;
1459}
1460
1461static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free)
1462{
1463	struct cake_sched_data *q = qdisc_priv(sch);
1464	ktime_t now = ktime_get();
1465	u32 idx = 0, tin = 0, len;
1466	struct cake_heap_entry qq;
1467	struct cake_tin_data *b;
1468	struct cake_flow *flow;
1469	struct sk_buff *skb;
1470
1471	if (!q->overflow_timeout) {
1472		int i;
1473		/* Build fresh max-heap */
1474		for (i = CAKE_MAX_TINS * CAKE_QUEUES / 2; i >= 0; i--)
1475			cake_heapify(q, i);
1476	}
1477	q->overflow_timeout = 65535;
1478
1479	/* select longest queue for pruning */
1480	qq  = q->overflow_heap[0];
1481	tin = qq.t;
1482	idx = qq.b;
1483
1484	b = &q->tins[tin];
1485	flow = &b->flows[idx];
1486	skb = dequeue_head(flow);
1487	if (unlikely(!skb)) {
1488		/* heap has gone wrong, rebuild it next time */
1489		q->overflow_timeout = 0;
1490		return idx + (tin << 16);
1491	}
1492
1493	if (cobalt_queue_full(&flow->cvars, &b->cparams, now))
1494		b->unresponsive_flow_count++;
1495
1496	len = qdisc_pkt_len(skb);
1497	q->buffer_used      -= skb->truesize;
1498	b->backlogs[idx]    -= len;
1499	b->tin_backlog      -= len;
1500	sch->qstats.backlog -= len;
1501	qdisc_tree_reduce_backlog(sch, 1, len);
1502
1503	flow->dropped++;
1504	b->tin_dropped++;
1505	sch->qstats.drops++;
1506
1507	if (q->rate_flags & CAKE_FLAG_INGRESS)
1508		cake_advance_shaper(q, b, skb, now, true);
1509
1510	__qdisc_drop(skb, to_free);
1511	sch->q.qlen--;
1512
1513	cake_heapify(q, 0);
1514
1515	return idx + (tin << 16);
1516}
1517
1518static u8 cake_handle_diffserv(struct sk_buff *skb, u16 wash)
1519{
1520	int wlen = skb_network_offset(skb);
1521	u8 dscp;
1522
1523	switch (tc_skb_protocol(skb)) {
1524	case htons(ETH_P_IP):
1525		wlen += sizeof(struct iphdr);
1526		if (!pskb_may_pull(skb, wlen) ||
1527		    skb_try_make_writable(skb, wlen))
1528			return 0;
1529
1530		dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2;
1531		if (wash && dscp)
1532			ipv4_change_dsfield(ip_hdr(skb), INET_ECN_MASK, 0);
1533		return dscp;
1534
1535	case htons(ETH_P_IPV6):
1536		wlen += sizeof(struct ipv6hdr);
1537		if (!pskb_may_pull(skb, wlen) ||
1538		    skb_try_make_writable(skb, wlen))
1539			return 0;
1540
1541		dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2;
1542		if (wash && dscp)
1543			ipv6_change_dsfield(ipv6_hdr(skb), INET_ECN_MASK, 0);
1544		return dscp;
1545
1546	case htons(ETH_P_ARP):
1547		return 0x38;  /* CS7 - Net Control */
1548
1549	default:
1550		/* If there is no Diffserv field, treat as best-effort */
1551		return 0;
1552	}
1553}
1554
1555static struct cake_tin_data *cake_select_tin(struct Qdisc *sch,
1556					     struct sk_buff *skb)
1557{
1558	struct cake_sched_data *q = qdisc_priv(sch);
1559	u32 tin, mark;
1560	u8 dscp;
1561
1562	/* Tin selection: Default to diffserv-based selection, allow overriding
1563	 * using firewall marks or skb->priority.
1564	 */
1565	dscp = cake_handle_diffserv(skb,
1566				    q->rate_flags & CAKE_FLAG_WASH);
1567	mark = (skb->mark & q->fwmark_mask) >> q->fwmark_shft;
1568
1569	if (q->tin_mode == CAKE_DIFFSERV_BESTEFFORT)
1570		tin = 0;
1571
1572	else if (mark && mark <= q->tin_cnt)
1573		tin = q->tin_order[mark - 1];
1574
1575	else if (TC_H_MAJ(skb->priority) == sch->handle &&
1576		 TC_H_MIN(skb->priority) > 0 &&
1577		 TC_H_MIN(skb->priority) <= q->tin_cnt)
1578		tin = q->tin_order[TC_H_MIN(skb->priority) - 1];
1579
1580	else {
1581		tin = q->tin_index[dscp];
1582
1583		if (unlikely(tin >= q->tin_cnt))
1584			tin = 0;
1585	}
1586
1587	return &q->tins[tin];
1588}
1589
1590static u32 cake_classify(struct Qdisc *sch, struct cake_tin_data **t,
1591			 struct sk_buff *skb, int flow_mode, int *qerr)
1592{
1593	struct cake_sched_data *q = qdisc_priv(sch);
1594	struct tcf_proto *filter;
1595	struct tcf_result res;
1596	u16 flow = 0, host = 0;
1597	int result;
1598
1599	filter = rcu_dereference_bh(q->filter_list);
1600	if (!filter)
1601		goto hash;
1602
1603	*qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
1604	result = tcf_classify(skb, filter, &res, false);
1605
1606	if (result >= 0) {
1607#ifdef CONFIG_NET_CLS_ACT
1608		switch (result) {
1609		case TC_ACT_STOLEN:
1610		case TC_ACT_QUEUED:
1611		case TC_ACT_TRAP:
1612			*qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
1613			/* fall through */
1614		case TC_ACT_SHOT:
1615			return 0;
1616		}
1617#endif
1618		if (TC_H_MIN(res.classid) <= CAKE_QUEUES)
1619			flow = TC_H_MIN(res.classid);
1620		if (TC_H_MAJ(res.classid) <= (CAKE_QUEUES << 16))
1621			host = TC_H_MAJ(res.classid) >> 16;
1622	}
1623hash:
1624	*t = cake_select_tin(sch, skb);
1625	return cake_hash(*t, skb, flow_mode, flow, host) + 1;
1626}
1627
1628static void cake_reconfigure(struct Qdisc *sch);
1629
1630static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,
1631			struct sk_buff **to_free)
1632{
1633	struct cake_sched_data *q = qdisc_priv(sch);
1634	int len = qdisc_pkt_len(skb);
1635	int uninitialized_var(ret);
1636	struct sk_buff *ack = NULL;
1637	ktime_t now = ktime_get();
1638	struct cake_tin_data *b;
1639	struct cake_flow *flow;
1640	u32 idx;
1641
1642	/* choose flow to insert into */
1643	idx = cake_classify(sch, &b, skb, q->flow_mode, &ret);
1644	if (idx == 0) {
1645		if (ret & __NET_XMIT_BYPASS)
1646			qdisc_qstats_drop(sch);
1647		__qdisc_drop(skb, to_free);
1648		return ret;
1649	}
1650	idx--;
1651	flow = &b->flows[idx];
1652
1653	/* ensure shaper state isn't stale */
1654	if (!b->tin_backlog) {
1655		if (ktime_before(b->time_next_packet, now))
1656			b->time_next_packet = now;
1657
1658		if (!sch->q.qlen) {
1659			if (ktime_before(q->time_next_packet, now)) {
1660				q->failsafe_next_packet = now;
1661				q->time_next_packet = now;
1662			} else if (ktime_after(q->time_next_packet, now) &&
1663				   ktime_after(q->failsafe_next_packet, now)) {
1664				u64 next = \
1665					min(ktime_to_ns(q->time_next_packet),
1666					    ktime_to_ns(
1667						   q->failsafe_next_packet));
1668				sch->qstats.overlimits++;
1669				qdisc_watchdog_schedule_ns(&q->watchdog, next);
1670			}
1671		}
1672	}
1673
1674	if (unlikely(len > b->max_skblen))
1675		b->max_skblen = len;
1676
1677	if (skb_is_gso(skb) && q->rate_flags & CAKE_FLAG_SPLIT_GSO) {
1678		struct sk_buff *segs, *nskb;
1679		netdev_features_t features = netif_skb_features(skb);
1680		unsigned int slen = 0, numsegs = 0;
1681
1682		segs = skb_gso_segment(skb, features & ~NETIF_F_GSO_MASK);
1683		if (IS_ERR_OR_NULL(segs))
1684			return qdisc_drop(skb, sch, to_free);
1685
1686		while (segs) {
1687			nskb = segs->next;
1688			skb_mark_not_on_list(segs);
1689			qdisc_skb_cb(segs)->pkt_len = segs->len;
1690			cobalt_set_enqueue_time(segs, now);
1691			get_cobalt_cb(segs)->adjusted_len = cake_overhead(q,
1692									  segs);
1693			flow_queue_add(flow, segs);
1694
1695			sch->q.qlen++;
1696			numsegs++;
1697			slen += segs->len;
1698			q->buffer_used += segs->truesize;
1699			b->packets++;
1700			segs = nskb;
1701		}
1702
1703		/* stats */
1704		b->bytes	    += slen;
1705		b->backlogs[idx]    += slen;
1706		b->tin_backlog      += slen;
1707		sch->qstats.backlog += slen;
1708		q->avg_window_bytes += slen;
1709
1710		qdisc_tree_reduce_backlog(sch, 1-numsegs, len-slen);
1711		consume_skb(skb);
1712	} else {
1713		/* not splitting */
1714		cobalt_set_enqueue_time(skb, now);
1715		get_cobalt_cb(skb)->adjusted_len = cake_overhead(q, skb);
1716		flow_queue_add(flow, skb);
1717
1718		if (q->ack_filter)
1719			ack = cake_ack_filter(q, flow);
1720
1721		if (ack) {
1722			b->ack_drops++;
1723			sch->qstats.drops++;
1724			b->bytes += qdisc_pkt_len(ack);
1725			len -= qdisc_pkt_len(ack);
1726			q->buffer_used += skb->truesize - ack->truesize;
1727			if (q->rate_flags & CAKE_FLAG_INGRESS)
1728				cake_advance_shaper(q, b, ack, now, true);
1729
1730			qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(ack));
1731			consume_skb(ack);
1732		} else {
1733			sch->q.qlen++;
1734			q->buffer_used      += skb->truesize;
1735		}
1736
1737		/* stats */
1738		b->packets++;
1739		b->bytes	    += len;
1740		b->backlogs[idx]    += len;
1741		b->tin_backlog      += len;
1742		sch->qstats.backlog += len;
1743		q->avg_window_bytes += len;
1744	}
1745
1746	if (q->overflow_timeout)
1747		cake_heapify_up(q, b->overflow_idx[idx]);
1748
1749	/* incoming bandwidth capacity estimate */
1750	if (q->rate_flags & CAKE_FLAG_AUTORATE_INGRESS) {
1751		u64 packet_interval = \
1752			ktime_to_ns(ktime_sub(now, q->last_packet_time));
1753
1754		if (packet_interval > NSEC_PER_SEC)
1755			packet_interval = NSEC_PER_SEC;
1756
1757		/* filter out short-term bursts, eg. wifi aggregation */
1758		q->avg_packet_interval = \
1759			cake_ewma(q->avg_packet_interval,
1760				  packet_interval,
1761				  (packet_interval > q->avg_packet_interval ?
1762					  2 : 8));
1763
1764		q->last_packet_time = now;
1765
1766		if (packet_interval > q->avg_packet_interval) {
1767			u64 window_interval = \
1768				ktime_to_ns(ktime_sub(now,
1769						      q->avg_window_begin));
1770			u64 b = q->avg_window_bytes * (u64)NSEC_PER_SEC;
1771
1772			do_div(b, window_interval);
1773			q->avg_peak_bandwidth =
1774				cake_ewma(q->avg_peak_bandwidth, b,
1775					  b > q->avg_peak_bandwidth ? 2 : 8);
1776			q->avg_window_bytes = 0;
1777			q->avg_window_begin = now;
1778
1779			if (ktime_after(now,
1780					ktime_add_ms(q->last_reconfig_time,
1781						     250))) {
1782				q->rate_bps = (q->avg_peak_bandwidth * 15) >> 4;
1783				cake_reconfigure(sch);
1784			}
1785		}
1786	} else {
1787		q->avg_window_bytes = 0;
1788		q->last_packet_time = now;
1789	}
1790
1791	/* flowchain */
1792	if (!flow->set || flow->set == CAKE_SET_DECAYING) {
1793		struct cake_host *srchost = &b->hosts[flow->srchost];
1794		struct cake_host *dsthost = &b->hosts[flow->dsthost];
1795		u16 host_load = 1;
1796
1797		if (!flow->set) {
1798			list_add_tail(&flow->flowchain, &b->new_flows);
1799		} else {
1800			b->decaying_flow_count--;
1801			list_move_tail(&flow->flowchain, &b->new_flows);
1802		}
1803		flow->set = CAKE_SET_SPARSE;
1804		b->sparse_flow_count++;
1805
1806		if (cake_dsrc(q->flow_mode))
1807			host_load = max(host_load, srchost->srchost_bulk_flow_count);
1808
1809		if (cake_ddst(q->flow_mode))
1810			host_load = max(host_load, dsthost->dsthost_bulk_flow_count);
1811
1812		flow->deficit = (b->flow_quantum *
1813				 quantum_div[host_load]) >> 16;
1814	} else if (flow->set == CAKE_SET_SPARSE_WAIT) {
1815		struct cake_host *srchost = &b->hosts[flow->srchost];
1816		struct cake_host *dsthost = &b->hosts[flow->dsthost];
1817
1818		/* this flow was empty, accounted as a sparse flow, but actually
1819		 * in the bulk rotation.
1820		 */
1821		flow->set = CAKE_SET_BULK;
1822		b->sparse_flow_count--;
1823		b->bulk_flow_count++;
1824
1825		if (cake_dsrc(q->flow_mode))
1826			srchost->srchost_bulk_flow_count++;
1827
1828		if (cake_ddst(q->flow_mode))
1829			dsthost->dsthost_bulk_flow_count++;
1830
1831	}
1832
1833	if (q->buffer_used > q->buffer_max_used)
1834		q->buffer_max_used = q->buffer_used;
1835
1836	if (q->buffer_used > q->buffer_limit) {
1837		u32 dropped = 0;
1838
1839		while (q->buffer_used > q->buffer_limit) {
1840			dropped++;
1841			cake_drop(sch, to_free);
1842		}
1843		b->drop_overlimit += dropped;
1844	}
1845	return NET_XMIT_SUCCESS;
1846}
1847
1848static struct sk_buff *cake_dequeue_one(struct Qdisc *sch)
1849{
1850	struct cake_sched_data *q = qdisc_priv(sch);
1851	struct cake_tin_data *b = &q->tins[q->cur_tin];
1852	struct cake_flow *flow = &b->flows[q->cur_flow];
1853	struct sk_buff *skb = NULL;
1854	u32 len;
1855
1856	if (flow->head) {
1857		skb = dequeue_head(flow);
1858		len = qdisc_pkt_len(skb);
1859		b->backlogs[q->cur_flow] -= len;
1860		b->tin_backlog		 -= len;
1861		sch->qstats.backlog      -= len;
1862		q->buffer_used		 -= skb->truesize;
1863		sch->q.qlen--;
1864
1865		if (q->overflow_timeout)
1866			cake_heapify(q, b->overflow_idx[q->cur_flow]);
1867	}
1868	return skb;
1869}
1870
1871/* Discard leftover packets from a tin no longer in use. */
1872static void cake_clear_tin(struct Qdisc *sch, u16 tin)
1873{
1874	struct cake_sched_data *q = qdisc_priv(sch);
1875	struct sk_buff *skb;
1876
1877	q->cur_tin = tin;
1878	for (q->cur_flow = 0; q->cur_flow < CAKE_QUEUES; q->cur_flow++)
1879		while (!!(skb = cake_dequeue_one(sch)))
1880			kfree_skb(skb);
1881}
1882
1883static struct sk_buff *cake_dequeue(struct Qdisc *sch)
1884{
1885	struct cake_sched_data *q = qdisc_priv(sch);
1886	struct cake_tin_data *b = &q->tins[q->cur_tin];
1887	struct cake_host *srchost, *dsthost;
1888	ktime_t now = ktime_get();
1889	struct cake_flow *flow;
1890	struct list_head *head;
1891	bool first_flow = true;
1892	struct sk_buff *skb;
1893	u16 host_load;
1894	u64 delay;
1895	u32 len;
1896
1897begin:
1898	if (!sch->q.qlen)
1899		return NULL;
1900
1901	/* global hard shaper */
1902	if (ktime_after(q->time_next_packet, now) &&
1903	    ktime_after(q->failsafe_next_packet, now)) {
1904		u64 next = min(ktime_to_ns(q->time_next_packet),
1905			       ktime_to_ns(q->failsafe_next_packet));
1906
1907		sch->qstats.overlimits++;
1908		qdisc_watchdog_schedule_ns(&q->watchdog, next);
1909		return NULL;
1910	}
1911
1912	/* Choose a class to work on. */
1913	if (!q->rate_ns) {
1914		/* In unlimited mode, can't rely on shaper timings, just balance
1915		 * with DRR
1916		 */
1917		bool wrapped = false, empty = true;
1918
1919		while (b->tin_deficit < 0 ||
1920		       !(b->sparse_flow_count + b->bulk_flow_count)) {
1921			if (b->tin_deficit <= 0)
1922				b->tin_deficit += b->tin_quantum_band;
1923			if (b->sparse_flow_count + b->bulk_flow_count)
1924				empty = false;
1925
1926			q->cur_tin++;
1927			b++;
1928			if (q->cur_tin >= q->tin_cnt) {
1929				q->cur_tin = 0;
1930				b = q->tins;
1931
1932				if (wrapped) {
1933					/* It's possible for q->qlen to be
1934					 * nonzero when we actually have no
1935					 * packets anywhere.
1936					 */
1937					if (empty)
1938						return NULL;
1939				} else {
1940					wrapped = true;
1941				}
1942			}
1943		}
1944	} else {
1945		/* In shaped mode, choose:
1946		 * - Highest-priority tin with queue and meeting schedule, or
1947		 * - The earliest-scheduled tin with queue.
1948		 */
1949		ktime_t best_time = KTIME_MAX;
1950		int tin, best_tin = 0;
1951
1952		for (tin = 0; tin < q->tin_cnt; tin++) {
1953			b = q->tins + tin;
1954			if ((b->sparse_flow_count + b->bulk_flow_count) > 0) {
1955				ktime_t time_to_pkt = \
1956					ktime_sub(b->time_next_packet, now);
1957
1958				if (ktime_to_ns(time_to_pkt) <= 0 ||
1959				    ktime_compare(time_to_pkt,
1960						  best_time) <= 0) {
1961					best_time = time_to_pkt;
1962					best_tin = tin;
1963				}
1964			}
1965		}
1966
1967		q->cur_tin = best_tin;
1968		b = q->tins + best_tin;
1969
1970		/* No point in going further if no packets to deliver. */
1971		if (unlikely(!(b->sparse_flow_count + b->bulk_flow_count)))
1972			return NULL;
1973	}
1974
1975retry:
1976	/* service this class */
1977	head = &b->decaying_flows;
1978	if (!first_flow || list_empty(head)) {
1979		head = &b->new_flows;
1980		if (list_empty(head)) {
1981			head = &b->old_flows;
1982			if (unlikely(list_empty(head))) {
1983				head = &b->decaying_flows;
1984				if (unlikely(list_empty(head)))
1985					goto begin;
1986			}
1987		}
1988	}
1989	flow = list_first_entry(head, struct cake_flow, flowchain);
1990	q->cur_flow = flow - b->flows;
1991	first_flow = false;
1992
1993	/* triple isolation (modified DRR++) */
1994	srchost = &b->hosts[flow->srchost];
1995	dsthost = &b->hosts[flow->dsthost];
1996	host_load = 1;
1997
1998	/* flow isolation (DRR++) */
1999	if (flow->deficit <= 0) {
2000		/* Keep all flows with deficits out of the sparse and decaying
2001		 * rotations.  No non-empty flow can go into the decaying
2002		 * rotation, so they can't get deficits
2003		 */
2004		if (flow->set == CAKE_SET_SPARSE) {
2005			if (flow->head) {
2006				b->sparse_flow_count--;
2007				b->bulk_flow_count++;
2008
2009				if (cake_dsrc(q->flow_mode))
2010					srchost->srchost_bulk_flow_count++;
2011
2012				if (cake_ddst(q->flow_mode))
2013					dsthost->dsthost_bulk_flow_count++;
2014
2015				flow->set = CAKE_SET_BULK;
2016			} else {
2017				/* we've moved it to the bulk rotation for
2018				 * correct deficit accounting but we still want
2019				 * to count it as a sparse flow, not a bulk one.
2020				 */
2021				flow->set = CAKE_SET_SPARSE_WAIT;
2022			}
2023		}
2024
2025		if (cake_dsrc(q->flow_mode))
2026			host_load = max(host_load, srchost->srchost_bulk_flow_count);
2027
2028		if (cake_ddst(q->flow_mode))
2029			host_load = max(host_load, dsthost->dsthost_bulk_flow_count);
2030
2031		WARN_ON(host_load > CAKE_QUEUES);
2032
2033		/* The shifted prandom_u32() is a way to apply dithering to
2034		 * avoid accumulating roundoff errors
2035		 */
2036		flow->deficit += (b->flow_quantum * quantum_div[host_load] +
2037				  (prandom_u32() >> 16)) >> 16;
2038		list_move_tail(&flow->flowchain, &b->old_flows);
2039
2040		goto retry;
2041	}
2042
2043	/* Retrieve a packet via the AQM */
2044	while (1) {
2045		skb = cake_dequeue_one(sch);
2046		if (!skb) {
2047			/* this queue was actually empty */
2048			if (cobalt_queue_empty(&flow->cvars, &b->cparams, now))
2049				b->unresponsive_flow_count--;
2050
2051			if (flow->cvars.p_drop || flow->cvars.count ||
2052			    ktime_before(now, flow->cvars.drop_next)) {
2053				/* keep in the flowchain until the state has
2054				 * decayed to rest
2055				 */
2056				list_move_tail(&flow->flowchain,
2057					       &b->decaying_flows);
2058				if (flow->set == CAKE_SET_BULK) {
2059					b->bulk_flow_count--;
2060
2061					if (cake_dsrc(q->flow_mode))
2062						srchost->srchost_bulk_flow_count--;
2063
2064					if (cake_ddst(q->flow_mode))
2065						dsthost->dsthost_bulk_flow_count--;
2066
2067					b->decaying_flow_count++;
2068				} else if (flow->set == CAKE_SET_SPARSE ||
2069					   flow->set == CAKE_SET_SPARSE_WAIT) {
2070					b->sparse_flow_count--;
2071					b->decaying_flow_count++;
2072				}
2073				flow->set = CAKE_SET_DECAYING;
2074			} else {
2075				/* remove empty queue from the flowchain */
2076				list_del_init(&flow->flowchain);
2077				if (flow->set == CAKE_SET_SPARSE ||
2078				    flow->set == CAKE_SET_SPARSE_WAIT)
2079					b->sparse_flow_count--;
2080				else if (flow->set == CAKE_SET_BULK) {
2081					b->bulk_flow_count--;
2082
2083					if (cake_dsrc(q->flow_mode))
2084						srchost->srchost_bulk_flow_count--;
2085
2086					if (cake_ddst(q->flow_mode))
2087						dsthost->dsthost_bulk_flow_count--;
2088
2089				} else
2090					b->decaying_flow_count--;
2091
2092				flow->set = CAKE_SET_NONE;
2093			}
2094			goto begin;
2095		}
2096
2097		/* Last packet in queue may be marked, shouldn't be dropped */
2098		if (!cobalt_should_drop(&flow->cvars, &b->cparams, now, skb,
2099					(b->bulk_flow_count *
2100					 !!(q->rate_flags &
2101					    CAKE_FLAG_INGRESS))) ||
2102		    !flow->head)
2103			break;
2104
2105		/* drop this packet, get another one */
2106		if (q->rate_flags & CAKE_FLAG_INGRESS) {
2107			len = cake_advance_shaper(q, b, skb,
2108						  now, true);
2109			flow->deficit -= len;
2110			b->tin_deficit -= len;
2111		}
2112		flow->dropped++;
2113		b->tin_dropped++;
2114		qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(skb));
2115		qdisc_qstats_drop(sch);
2116		kfree_skb(skb);
2117		if (q->rate_flags & CAKE_FLAG_INGRESS)
2118			goto retry;
2119	}
2120
2121	b->tin_ecn_mark += !!flow->cvars.ecn_marked;
2122	qdisc_bstats_update(sch, skb);
2123
2124	/* collect delay stats */
2125	delay = ktime_to_ns(ktime_sub(now, cobalt_get_enqueue_time(skb)));
2126	b->avge_delay = cake_ewma(b->avge_delay, delay, 8);
2127	b->peak_delay = cake_ewma(b->peak_delay, delay,
2128				  delay > b->peak_delay ? 2 : 8);
2129	b->base_delay = cake_ewma(b->base_delay, delay,
2130				  delay < b->base_delay ? 2 : 8);
2131
2132	len = cake_advance_shaper(q, b, skb, now, false);
2133	flow->deficit -= len;
2134	b->tin_deficit -= len;
2135
2136	if (ktime_after(q->time_next_packet, now) && sch->q.qlen) {
2137		u64 next = min(ktime_to_ns(q->time_next_packet),
2138			       ktime_to_ns(q->failsafe_next_packet));
2139
2140		qdisc_watchdog_schedule_ns(&q->watchdog, next);
2141	} else if (!sch->q.qlen) {
2142		int i;
2143
2144		for (i = 0; i < q->tin_cnt; i++) {
2145			if (q->tins[i].decaying_flow_count) {
2146				ktime_t next = \
2147					ktime_add_ns(now,
2148						     q->tins[i].cparams.target);
2149
2150				qdisc_watchdog_schedule_ns(&q->watchdog,
2151							   ktime_to_ns(next));
2152				break;
2153			}
2154		}
2155	}
2156
2157	if (q->overflow_timeout)
2158		q->overflow_timeout--;
2159
2160	return skb;
2161}
2162
2163static void cake_reset(struct Qdisc *sch)
2164{
2165	u32 c;
2166
2167	for (c = 0; c < CAKE_MAX_TINS; c++)
2168		cake_clear_tin(sch, c);
2169}
2170
2171static const struct nla_policy cake_policy[TCA_CAKE_MAX + 1] = {
2172	[TCA_CAKE_BASE_RATE64]   = { .type = NLA_U64 },
2173	[TCA_CAKE_DIFFSERV_MODE] = { .type = NLA_U32 },
2174	[TCA_CAKE_ATM]		 = { .type = NLA_U32 },
2175	[TCA_CAKE_FLOW_MODE]     = { .type = NLA_U32 },
2176	[TCA_CAKE_OVERHEAD]      = { .type = NLA_S32 },
2177	[TCA_CAKE_RTT]		 = { .type = NLA_U32 },
2178	[TCA_CAKE_TARGET]	 = { .type = NLA_U32 },
2179	[TCA_CAKE_AUTORATE]      = { .type = NLA_U32 },
2180	[TCA_CAKE_MEMORY]	 = { .type = NLA_U32 },
2181	[TCA_CAKE_NAT]		 = { .type = NLA_U32 },
2182	[TCA_CAKE_RAW]		 = { .type = NLA_U32 },
2183	[TCA_CAKE_WASH]		 = { .type = NLA_U32 },
2184	[TCA_CAKE_MPU]		 = { .type = NLA_U32 },
2185	[TCA_CAKE_INGRESS]	 = { .type = NLA_U32 },
2186	[TCA_CAKE_ACK_FILTER]	 = { .type = NLA_U32 },
2187	[TCA_CAKE_FWMARK]	 = { .type = NLA_U32 },
2188};
2189
2190static void cake_set_rate(struct cake_tin_data *b, u64 rate, u32 mtu,
2191			  u64 target_ns, u64 rtt_est_ns)
2192{
2193	/* convert byte-rate into time-per-byte
2194	 * so it will always unwedge in reasonable time.
2195	 */
2196	static const u64 MIN_RATE = 64;
2197	u32 byte_target = mtu;
2198	u64 byte_target_ns;
2199	u8  rate_shft = 0;
2200	u64 rate_ns = 0;
2201
2202	b->flow_quantum = 1514;
2203	if (rate) {
2204		b->flow_quantum = max(min(rate >> 12, 1514ULL), 300ULL);
2205		rate_shft = 34;
2206		rate_ns = ((u64)NSEC_PER_SEC) << rate_shft;
2207		rate_ns = div64_u64(rate_ns, max(MIN_RATE, rate));
2208		while (!!(rate_ns >> 34)) {
2209			rate_ns >>= 1;
2210			rate_shft--;
2211		}
2212	} /* else unlimited, ie. zero delay */
2213
2214	b->tin_rate_bps  = rate;
2215	b->tin_rate_ns   = rate_ns;
2216	b->tin_rate_shft = rate_shft;
2217
2218	byte_target_ns = (byte_target * rate_ns) >> rate_shft;
2219
2220	b->cparams.target = max((byte_target_ns * 3) / 2, target_ns);
2221	b->cparams.interval = max(rtt_est_ns +
2222				     b->cparams.target - target_ns,
2223				     b->cparams.target * 2);
2224	b->cparams.mtu_time = byte_target_ns;
2225	b->cparams.p_inc = 1 << 24; /* 1/256 */
2226	b->cparams.p_dec = 1 << 20; /* 1/4096 */
2227}
2228
2229static int cake_config_besteffort(struct Qdisc *sch)
2230{
2231	struct cake_sched_data *q = qdisc_priv(sch);
2232	struct cake_tin_data *b = &q->tins[0];
2233	u32 mtu = psched_mtu(qdisc_dev(sch));
2234	u64 rate = q->rate_bps;
2235
2236	q->tin_cnt = 1;
2237
2238	q->tin_index = besteffort;
2239	q->tin_order = normal_order;
2240
2241	cake_set_rate(b, rate, mtu,
2242		      us_to_ns(q->target), us_to_ns(q->interval));
2243	b->tin_quantum_band = 65535;
2244	b->tin_quantum_prio = 65535;
2245
2246	return 0;
2247}
2248
2249static int cake_config_precedence(struct Qdisc *sch)
2250{
2251	/* convert high-level (user visible) parameters into internal format */
2252	struct cake_sched_data *q = qdisc_priv(sch);
2253	u32 mtu = psched_mtu(qdisc_dev(sch));
2254	u64 rate = q->rate_bps;
2255	u32 quantum1 = 256;
2256	u32 quantum2 = 256;
2257	u32 i;
2258
2259	q->tin_cnt = 8;
2260	q->tin_index = precedence;
2261	q->tin_order = normal_order;
2262
2263	for (i = 0; i < q->tin_cnt; i++) {
2264		struct cake_tin_data *b = &q->tins[i];
2265
2266		cake_set_rate(b, rate, mtu, us_to_ns(q->target),
2267			      us_to_ns(q->interval));
2268
2269		b->tin_quantum_prio = max_t(u16, 1U, quantum1);
2270		b->tin_quantum_band = max_t(u16, 1U, quantum2);
2271
2272		/* calculate next class's parameters */
2273		rate  *= 7;
2274		rate >>= 3;
2275
2276		quantum1  *= 3;
2277		quantum1 >>= 1;
2278
2279		quantum2  *= 7;
2280		quantum2 >>= 3;
2281	}
2282
2283	return 0;
2284}
2285
2286/*	List of known Diffserv codepoints:
2287 *
2288 *	Least Effort (CS1)
2289 *	Best Effort (CS0)
2290 *	Max Reliability & LLT "Lo" (TOS1)
2291 *	Max Throughput (TOS2)
2292 *	Min Delay (TOS4)
2293 *	LLT "La" (TOS5)
2294 *	Assured Forwarding 1 (AF1x) - x3
2295 *	Assured Forwarding 2 (AF2x) - x3
2296 *	Assured Forwarding 3 (AF3x) - x3
2297 *	Assured Forwarding 4 (AF4x) - x3
2298 *	Precedence Class 2 (CS2)
2299 *	Precedence Class 3 (CS3)
2300 *	Precedence Class 4 (CS4)
2301 *	Precedence Class 5 (CS5)
2302 *	Precedence Class 6 (CS6)
2303 *	Precedence Class 7 (CS7)
2304 *	Voice Admit (VA)
2305 *	Expedited Forwarding (EF)
2306
2307 *	Total 25 codepoints.
2308 */
2309
2310/*	List of traffic classes in RFC 4594:
2311 *		(roughly descending order of contended priority)
2312 *		(roughly ascending order of uncontended throughput)
2313 *
2314 *	Network Control (CS6,CS7)      - routing traffic
2315 *	Telephony (EF,VA)         - aka. VoIP streams
2316 *	Signalling (CS5)               - VoIP setup
2317 *	Multimedia Conferencing (AF4x) - aka. video calls
2318 *	Realtime Interactive (CS4)     - eg. games
2319 *	Multimedia Streaming (AF3x)    - eg. YouTube, NetFlix, Twitch
2320 *	Broadcast Video (CS3)
2321 *	Low Latency Data (AF2x,TOS4)      - eg. database
2322 *	Ops, Admin, Management (CS2,TOS1) - eg. ssh
2323 *	Standard Service (CS0 & unrecognised codepoints)
2324 *	High Throughput Data (AF1x,TOS2)  - eg. web traffic
2325 *	Low Priority Data (CS1)           - eg. BitTorrent
2326
2327 *	Total 12 traffic classes.
2328 */
2329
2330static int cake_config_diffserv8(struct Qdisc *sch)
2331{
2332/*	Pruned list of traffic classes for typical applications:
2333 *
2334 *		Network Control          (CS6, CS7)
2335 *		Minimum Latency          (EF, VA, CS5, CS4)
2336 *		Interactive Shell        (CS2, TOS1)
2337 *		Low Latency Transactions (AF2x, TOS4)
2338 *		Video Streaming          (AF4x, AF3x, CS3)
2339 *		Bog Standard             (CS0 etc.)
2340 *		High Throughput          (AF1x, TOS2)
2341 *		Background Traffic       (CS1)
2342 *
2343 *		Total 8 traffic classes.
2344 */
2345
2346	struct cake_sched_data *q = qdisc_priv(sch);
2347	u32 mtu = psched_mtu(qdisc_dev(sch));
2348	u64 rate = q->rate_bps;
2349	u32 quantum1 = 256;
2350	u32 quantum2 = 256;
2351	u32 i;
2352
2353	q->tin_cnt = 8;
2354
2355	/* codepoint to class mapping */
2356	q->tin_index = diffserv8;
2357	q->tin_order = normal_order;
2358
2359	/* class characteristics */
2360	for (i = 0; i < q->tin_cnt; i++) {
2361		struct cake_tin_data *b = &q->tins[i];
2362
2363		cake_set_rate(b, rate, mtu, us_to_ns(q->target),
2364			      us_to_ns(q->interval));
2365
2366		b->tin_quantum_prio = max_t(u16, 1U, quantum1);
2367		b->tin_quantum_band = max_t(u16, 1U, quantum2);
2368
2369		/* calculate next class's parameters */
2370		rate  *= 7;
2371		rate >>= 3;
2372
2373		quantum1  *= 3;
2374		quantum1 >>= 1;
2375
2376		quantum2  *= 7;
2377		quantum2 >>= 3;
2378	}
2379
2380	return 0;
2381}
2382
2383static int cake_config_diffserv4(struct Qdisc *sch)
2384{
2385/*  Further pruned list of traffic classes for four-class system:
2386 *
2387 *	    Latency Sensitive  (CS7, CS6, EF, VA, CS5, CS4)
2388 *	    Streaming Media    (AF4x, AF3x, CS3, AF2x, TOS4, CS2, TOS1)
2389 *	    Best Effort        (CS0, AF1x, TOS2, and those not specified)
2390 *	    Background Traffic (CS1)
2391 *
2392 *		Total 4 traffic classes.
2393 */
2394
2395	struct cake_sched_data *q = qdisc_priv(sch);
2396	u32 mtu = psched_mtu(qdisc_dev(sch));
2397	u64 rate = q->rate_bps;
2398	u32 quantum = 1024;
2399
2400	q->tin_cnt = 4;
2401
2402	/* codepoint to class mapping */
2403	q->tin_index = diffserv4;
2404	q->tin_order = bulk_order;
2405
2406	/* class characteristics */
2407	cake_set_rate(&q->tins[0], rate, mtu,
2408		      us_to_ns(q->target), us_to_ns(q->interval));
2409	cake_set_rate(&q->tins[1], rate >> 4, mtu,
2410		      us_to_ns(q->target), us_to_ns(q->interval));
2411	cake_set_rate(&q->tins[2], rate >> 1, mtu,
2412		      us_to_ns(q->target), us_to_ns(q->interval));
2413	cake_set_rate(&q->tins[3], rate >> 2, mtu,
2414		      us_to_ns(q->target), us_to_ns(q->interval));
2415
2416	/* priority weights */
2417	q->tins[0].tin_quantum_prio = quantum;
2418	q->tins[1].tin_quantum_prio = quantum >> 4;
2419	q->tins[2].tin_quantum_prio = quantum << 2;
2420	q->tins[3].tin_quantum_prio = quantum << 4;
2421
2422	/* bandwidth-sharing weights */
2423	q->tins[0].tin_quantum_band = quantum;
2424	q->tins[1].tin_quantum_band = quantum >> 4;
2425	q->tins[2].tin_quantum_band = quantum >> 1;
2426	q->tins[3].tin_quantum_band = quantum >> 2;
2427
2428	return 0;
2429}
2430
2431static int cake_config_diffserv3(struct Qdisc *sch)
2432{
2433/*  Simplified Diffserv structure with 3 tins.
2434 *		Low Priority		(CS1)
2435 *		Best Effort
2436 *		Latency Sensitive	(TOS4, VA, EF, CS6, CS7)
2437 */
2438	struct cake_sched_data *q = qdisc_priv(sch);
2439	u32 mtu = psched_mtu(qdisc_dev(sch));
2440	u64 rate = q->rate_bps;
2441	u32 quantum = 1024;
2442
2443	q->tin_cnt = 3;
2444
2445	/* codepoint to class mapping */
2446	q->tin_index = diffserv3;
2447	q->tin_order = bulk_order;
2448
2449	/* class characteristics */
2450	cake_set_rate(&q->tins[0], rate, mtu,
2451		      us_to_ns(q->target), us_to_ns(q->interval));
2452	cake_set_rate(&q->tins[1], rate >> 4, mtu,
2453		      us_to_ns(q->target), us_to_ns(q->interval));
2454	cake_set_rate(&q->tins[2], rate >> 2, mtu,
2455		      us_to_ns(q->target), us_to_ns(q->interval));
2456
2457	/* priority weights */
2458	q->tins[0].tin_quantum_prio = quantum;
2459	q->tins[1].tin_quantum_prio = quantum >> 4;
2460	q->tins[2].tin_quantum_prio = quantum << 4;
2461
2462	/* bandwidth-sharing weights */
2463	q->tins[0].tin_quantum_band = quantum;
2464	q->tins[1].tin_quantum_band = quantum >> 4;
2465	q->tins[2].tin_quantum_band = quantum >> 2;
2466
2467	return 0;
2468}
2469
2470static void cake_reconfigure(struct Qdisc *sch)
2471{
2472	struct cake_sched_data *q = qdisc_priv(sch);
2473	int c, ft;
2474
2475	switch (q->tin_mode) {
2476	case CAKE_DIFFSERV_BESTEFFORT:
2477		ft = cake_config_besteffort(sch);
2478		break;
2479
2480	case CAKE_DIFFSERV_PRECEDENCE:
2481		ft = cake_config_precedence(sch);
2482		break;
2483
2484	case CAKE_DIFFSERV_DIFFSERV8:
2485		ft = cake_config_diffserv8(sch);
2486		break;
2487
2488	case CAKE_DIFFSERV_DIFFSERV4:
2489		ft = cake_config_diffserv4(sch);
2490		break;
2491
2492	case CAKE_DIFFSERV_DIFFSERV3:
2493	default:
2494		ft = cake_config_diffserv3(sch);
2495		break;
2496	}
2497
2498	for (c = q->tin_cnt; c < CAKE_MAX_TINS; c++) {
2499		cake_clear_tin(sch, c);
2500		q->tins[c].cparams.mtu_time = q->tins[ft].cparams.mtu_time;
2501	}
2502
2503	q->rate_ns   = q->tins[ft].tin_rate_ns;
2504	q->rate_shft = q->tins[ft].tin_rate_shft;
2505
2506	if (q->buffer_config_limit) {
2507		q->buffer_limit = q->buffer_config_limit;
2508	} else if (q->rate_bps) {
2509		u64 t = q->rate_bps * q->interval;
2510
2511		do_div(t, USEC_PER_SEC / 4);
2512		q->buffer_limit = max_t(u32, t, 4U << 20);
2513	} else {
2514		q->buffer_limit = ~0;
2515	}
2516
2517	sch->flags &= ~TCQ_F_CAN_BYPASS;
2518
2519	q->buffer_limit = min(q->buffer_limit,
2520			      max(sch->limit * psched_mtu(qdisc_dev(sch)),
2521				  q->buffer_config_limit));
2522}
2523
2524static int cake_change(struct Qdisc *sch, struct nlattr *opt,
2525		       struct netlink_ext_ack *extack)
2526{
2527	struct cake_sched_data *q = qdisc_priv(sch);
2528	struct nlattr *tb[TCA_CAKE_MAX + 1];
2529	int err;
2530
2531	if (!opt)
2532		return -EINVAL;
2533
2534	err = nla_parse_nested_deprecated(tb, TCA_CAKE_MAX, opt, cake_policy,
2535					  extack);
2536	if (err < 0)
2537		return err;
2538
2539	if (tb[TCA_CAKE_NAT]) {
2540#if IS_ENABLED(CONFIG_NF_CONNTRACK)
2541		q->flow_mode &= ~CAKE_FLOW_NAT_FLAG;
2542		q->flow_mode |= CAKE_FLOW_NAT_FLAG *
2543			!!nla_get_u32(tb[TCA_CAKE_NAT]);
2544#else
2545		NL_SET_ERR_MSG_ATTR(extack, tb[TCA_CAKE_NAT],
2546				    "No conntrack support in kernel");
2547		return -EOPNOTSUPP;
2548#endif
2549	}
2550
2551	if (tb[TCA_CAKE_BASE_RATE64])
2552		q->rate_bps = nla_get_u64(tb[TCA_CAKE_BASE_RATE64]);
2553
2554	if (tb[TCA_CAKE_DIFFSERV_MODE])
2555		q->tin_mode = nla_get_u32(tb[TCA_CAKE_DIFFSERV_MODE]);
2556
2557	if (tb[TCA_CAKE_WASH]) {
2558		if (!!nla_get_u32(tb[TCA_CAKE_WASH]))
2559			q->rate_flags |= CAKE_FLAG_WASH;
2560		else
2561			q->rate_flags &= ~CAKE_FLAG_WASH;
2562	}
2563
2564	if (tb[TCA_CAKE_FLOW_MODE])
2565		q->flow_mode = ((q->flow_mode & CAKE_FLOW_NAT_FLAG) |
2566				(nla_get_u32(tb[TCA_CAKE_FLOW_MODE]) &
2567					CAKE_FLOW_MASK));
2568
2569	if (tb[TCA_CAKE_ATM])
2570		q->atm_mode = nla_get_u32(tb[TCA_CAKE_ATM]);
2571
2572	if (tb[TCA_CAKE_OVERHEAD]) {
2573		q->rate_overhead = nla_get_s32(tb[TCA_CAKE_OVERHEAD]);
2574		q->rate_flags |= CAKE_FLAG_OVERHEAD;
2575
2576		q->max_netlen = 0;
2577		q->max_adjlen = 0;
2578		q->min_netlen = ~0;
2579		q->min_adjlen = ~0;
2580	}
2581
2582	if (tb[TCA_CAKE_RAW]) {
2583		q->rate_flags &= ~CAKE_FLAG_OVERHEAD;
2584
2585		q->max_netlen = 0;
2586		q->max_adjlen = 0;
2587		q->min_netlen = ~0;
2588		q->min_adjlen = ~0;
2589	}
2590
2591	if (tb[TCA_CAKE_MPU])
2592		q->rate_mpu = nla_get_u32(tb[TCA_CAKE_MPU]);
2593
2594	if (tb[TCA_CAKE_RTT]) {
2595		q->interval = nla_get_u32(tb[TCA_CAKE_RTT]);
2596
2597		if (!q->interval)
2598			q->interval = 1;
2599	}
2600
2601	if (tb[TCA_CAKE_TARGET]) {
2602		q->target = nla_get_u32(tb[TCA_CAKE_TARGET]);
2603
2604		if (!q->target)
2605			q->target = 1;
2606	}
2607
2608	if (tb[TCA_CAKE_AUTORATE]) {
2609		if (!!nla_get_u32(tb[TCA_CAKE_AUTORATE]))
2610			q->rate_flags |= CAKE_FLAG_AUTORATE_INGRESS;
2611		else
2612			q->rate_flags &= ~CAKE_FLAG_AUTORATE_INGRESS;
2613	}
2614
2615	if (tb[TCA_CAKE_INGRESS]) {
2616		if (!!nla_get_u32(tb[TCA_CAKE_INGRESS]))
2617			q->rate_flags |= CAKE_FLAG_INGRESS;
2618		else
2619			q->rate_flags &= ~CAKE_FLAG_INGRESS;
2620	}
2621
2622	if (tb[TCA_CAKE_ACK_FILTER])
2623		q->ack_filter = nla_get_u32(tb[TCA_CAKE_ACK_FILTER]);
2624
2625	if (tb[TCA_CAKE_MEMORY])
2626		q->buffer_config_limit = nla_get_u32(tb[TCA_CAKE_MEMORY]);
2627
2628	if (tb[TCA_CAKE_SPLIT_GSO]) {
2629		if (!!nla_get_u32(tb[TCA_CAKE_SPLIT_GSO]))
2630			q->rate_flags |= CAKE_FLAG_SPLIT_GSO;
2631		else
2632			q->rate_flags &= ~CAKE_FLAG_SPLIT_GSO;
2633	}
2634
2635	if (tb[TCA_CAKE_FWMARK]) {
2636		q->fwmark_mask = nla_get_u32(tb[TCA_CAKE_FWMARK]);
2637		q->fwmark_shft = q->fwmark_mask ? __ffs(q->fwmark_mask) : 0;
2638	}
2639
2640	if (q->tins) {
2641		sch_tree_lock(sch);
2642		cake_reconfigure(sch);
2643		sch_tree_unlock(sch);
2644	}
2645
2646	return 0;
2647}
2648
2649static void cake_destroy(struct Qdisc *sch)
2650{
2651	struct cake_sched_data *q = qdisc_priv(sch);
2652
2653	qdisc_watchdog_cancel(&q->watchdog);
2654	tcf_block_put(q->block);
2655	kvfree(q->tins);
2656}
2657
2658static int cake_init(struct Qdisc *sch, struct nlattr *opt,
2659		     struct netlink_ext_ack *extack)
2660{
2661	struct cake_sched_data *q = qdisc_priv(sch);
2662	int i, j, err;
2663
2664	sch->limit = 10240;
2665	q->tin_mode = CAKE_DIFFSERV_DIFFSERV3;
2666	q->flow_mode  = CAKE_FLOW_TRIPLE;
2667
2668	q->rate_bps = 0; /* unlimited by default */
2669
2670	q->interval = 100000; /* 100ms default */
2671	q->target   =   5000; /* 5ms: codel RFC argues
2672			       * for 5 to 10% of interval
2673			       */
2674	q->rate_flags |= CAKE_FLAG_SPLIT_GSO;
2675	q->cur_tin = 0;
2676	q->cur_flow  = 0;
2677
2678	qdisc_watchdog_init(&q->watchdog, sch);
2679
2680	if (opt) {
2681		int err = cake_change(sch, opt, extack);
2682
2683		if (err)
2684			return err;
2685	}
2686
2687	err = tcf_block_get(&q->block, &q->filter_list, sch, extack);
2688	if (err)
2689		return err;
2690
2691	quantum_div[0] = ~0;
2692	for (i = 1; i <= CAKE_QUEUES; i++)
2693		quantum_div[i] = 65535 / i;
2694
2695	q->tins = kvcalloc(CAKE_MAX_TINS, sizeof(struct cake_tin_data),
2696			   GFP_KERNEL);
2697	if (!q->tins)
2698		goto nomem;
2699
2700	for (i = 0; i < CAKE_MAX_TINS; i++) {
2701		struct cake_tin_data *b = q->tins + i;
2702
2703		INIT_LIST_HEAD(&b->new_flows);
2704		INIT_LIST_HEAD(&b->old_flows);
2705		INIT_LIST_HEAD(&b->decaying_flows);
2706		b->sparse_flow_count = 0;
2707		b->bulk_flow_count = 0;
2708		b->decaying_flow_count = 0;
2709
2710		for (j = 0; j < CAKE_QUEUES; j++) {
2711			struct cake_flow *flow = b->flows + j;
2712			u32 k = j * CAKE_MAX_TINS + i;
2713
2714			INIT_LIST_HEAD(&flow->flowchain);
2715			cobalt_vars_init(&flow->cvars);
2716
2717			q->overflow_heap[k].t = i;
2718			q->overflow_heap[k].b = j;
2719			b->overflow_idx[j] = k;
2720		}
2721	}
2722
2723	cake_reconfigure(sch);
2724	q->avg_peak_bandwidth = q->rate_bps;
2725	q->min_netlen = ~0;
2726	q->min_adjlen = ~0;
2727	return 0;
2728
2729nomem:
2730	cake_destroy(sch);
2731	return -ENOMEM;
2732}
2733
2734static int cake_dump(struct Qdisc *sch, struct sk_buff *skb)
2735{
2736	struct cake_sched_data *q = qdisc_priv(sch);
2737	struct nlattr *opts;
2738
2739	opts = nla_nest_start_noflag(skb, TCA_OPTIONS);
2740	if (!opts)
2741		goto nla_put_failure;
2742
2743	if (nla_put_u64_64bit(skb, TCA_CAKE_BASE_RATE64, q->rate_bps,
2744			      TCA_CAKE_PAD))
2745		goto nla_put_failure;
2746
2747	if (nla_put_u32(skb, TCA_CAKE_FLOW_MODE,
2748			q->flow_mode & CAKE_FLOW_MASK))
2749		goto nla_put_failure;
2750
2751	if (nla_put_u32(skb, TCA_CAKE_RTT, q->interval))
2752		goto nla_put_failure;
2753
2754	if (nla_put_u32(skb, TCA_CAKE_TARGET, q->target))
2755		goto nla_put_failure;
2756
2757	if (nla_put_u32(skb, TCA_CAKE_MEMORY, q->buffer_config_limit))
2758		goto nla_put_failure;
2759
2760	if (nla_put_u32(skb, TCA_CAKE_AUTORATE,
2761			!!(q->rate_flags & CAKE_FLAG_AUTORATE_INGRESS)))
2762		goto nla_put_failure;
2763
2764	if (nla_put_u32(skb, TCA_CAKE_INGRESS,
2765			!!(q->rate_flags & CAKE_FLAG_INGRESS)))
2766		goto nla_put_failure;
2767
2768	if (nla_put_u32(skb, TCA_CAKE_ACK_FILTER, q->ack_filter))
2769		goto nla_put_failure;
2770
2771	if (nla_put_u32(skb, TCA_CAKE_NAT,
2772			!!(q->flow_mode & CAKE_FLOW_NAT_FLAG)))
2773		goto nla_put_failure;
2774
2775	if (nla_put_u32(skb, TCA_CAKE_DIFFSERV_MODE, q->tin_mode))
2776		goto nla_put_failure;
2777
2778	if (nla_put_u32(skb, TCA_CAKE_WASH,
2779			!!(q->rate_flags & CAKE_FLAG_WASH)))
2780		goto nla_put_failure;
2781
2782	if (nla_put_u32(skb, TCA_CAKE_OVERHEAD, q->rate_overhead))
2783		goto nla_put_failure;
2784
2785	if (!(q->rate_flags & CAKE_FLAG_OVERHEAD))
2786		if (nla_put_u32(skb, TCA_CAKE_RAW, 0))
2787			goto nla_put_failure;
2788
2789	if (nla_put_u32(skb, TCA_CAKE_ATM, q->atm_mode))
2790		goto nla_put_failure;
2791
2792	if (nla_put_u32(skb, TCA_CAKE_MPU, q->rate_mpu))
2793		goto nla_put_failure;
2794
2795	if (nla_put_u32(skb, TCA_CAKE_SPLIT_GSO,
2796			!!(q->rate_flags & CAKE_FLAG_SPLIT_GSO)))
2797		goto nla_put_failure;
2798
2799	if (nla_put_u32(skb, TCA_CAKE_FWMARK, q->fwmark_mask))
2800		goto nla_put_failure;
2801
2802	return nla_nest_end(skb, opts);
2803
2804nla_put_failure:
2805	return -1;
2806}
2807
2808static int cake_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
2809{
2810	struct nlattr *stats = nla_nest_start_noflag(d->skb, TCA_STATS_APP);
2811	struct cake_sched_data *q = qdisc_priv(sch);
2812	struct nlattr *tstats, *ts;
2813	int i;
2814
2815	if (!stats)
2816		return -1;
2817
2818#define PUT_STAT_U32(attr, data) do {				       \
2819		if (nla_put_u32(d->skb, TCA_CAKE_STATS_ ## attr, data)) \
2820			goto nla_put_failure;			       \
2821	} while (0)
2822#define PUT_STAT_U64(attr, data) do {				       \
2823		if (nla_put_u64_64bit(d->skb, TCA_CAKE_STATS_ ## attr, \
2824					data, TCA_CAKE_STATS_PAD)) \
2825			goto nla_put_failure;			       \
2826	} while (0)
2827
2828	PUT_STAT_U64(CAPACITY_ESTIMATE64, q->avg_peak_bandwidth);
2829	PUT_STAT_U32(MEMORY_LIMIT, q->buffer_limit);
2830	PUT_STAT_U32(MEMORY_USED, q->buffer_max_used);
2831	PUT_STAT_U32(AVG_NETOFF, ((q->avg_netoff + 0x8000) >> 16));
2832	PUT_STAT_U32(MAX_NETLEN, q->max_netlen);
2833	PUT_STAT_U32(MAX_ADJLEN, q->max_adjlen);
2834	PUT_STAT_U32(MIN_NETLEN, q->min_netlen);
2835	PUT_STAT_U32(MIN_ADJLEN, q->min_adjlen);
2836
2837#undef PUT_STAT_U32
2838#undef PUT_STAT_U64
2839
2840	tstats = nla_nest_start_noflag(d->skb, TCA_CAKE_STATS_TIN_STATS);
2841	if (!tstats)
2842		goto nla_put_failure;
2843
2844#define PUT_TSTAT_U32(attr, data) do {					\
2845		if (nla_put_u32(d->skb, TCA_CAKE_TIN_STATS_ ## attr, data)) \
2846			goto nla_put_failure;				\
2847	} while (0)
2848#define PUT_TSTAT_U64(attr, data) do {					\
2849		if (nla_put_u64_64bit(d->skb, TCA_CAKE_TIN_STATS_ ## attr, \
2850					data, TCA_CAKE_TIN_STATS_PAD))	\
2851			goto nla_put_failure;				\
2852	} while (0)
2853
2854	for (i = 0; i < q->tin_cnt; i++) {
2855		struct cake_tin_data *b = &q->tins[q->tin_order[i]];
2856
2857		ts = nla_nest_start_noflag(d->skb, i + 1);
2858		if (!ts)
2859			goto nla_put_failure;
2860
2861		PUT_TSTAT_U64(THRESHOLD_RATE64, b->tin_rate_bps);
2862		PUT_TSTAT_U64(SENT_BYTES64, b->bytes);
2863		PUT_TSTAT_U32(BACKLOG_BYTES, b->tin_backlog);
2864
2865		PUT_TSTAT_U32(TARGET_US,
2866			      ktime_to_us(ns_to_ktime(b->cparams.target)));
2867		PUT_TSTAT_U32(INTERVAL_US,
2868			      ktime_to_us(ns_to_ktime(b->cparams.interval)));
2869
2870		PUT_TSTAT_U32(SENT_PACKETS, b->packets);
2871		PUT_TSTAT_U32(DROPPED_PACKETS, b->tin_dropped);
2872		PUT_TSTAT_U32(ECN_MARKED_PACKETS, b->tin_ecn_mark);
2873		PUT_TSTAT_U32(ACKS_DROPPED_PACKETS, b->ack_drops);
2874
2875		PUT_TSTAT_U32(PEAK_DELAY_US,
2876			      ktime_to_us(ns_to_ktime(b->peak_delay)));
2877		PUT_TSTAT_U32(AVG_DELAY_US,
2878			      ktime_to_us(ns_to_ktime(b->avge_delay)));
2879		PUT_TSTAT_U32(BASE_DELAY_US,
2880			      ktime_to_us(ns_to_ktime(b->base_delay)));
2881
2882		PUT_TSTAT_U32(WAY_INDIRECT_HITS, b->way_hits);
2883		PUT_TSTAT_U32(WAY_MISSES, b->way_misses);
2884		PUT_TSTAT_U32(WAY_COLLISIONS, b->way_collisions);
2885
2886		PUT_TSTAT_U32(SPARSE_FLOWS, b->sparse_flow_count +
2887					    b->decaying_flow_count);
2888		PUT_TSTAT_U32(BULK_FLOWS, b->bulk_flow_count);
2889		PUT_TSTAT_U32(UNRESPONSIVE_FLOWS, b->unresponsive_flow_count);
2890		PUT_TSTAT_U32(MAX_SKBLEN, b->max_skblen);
2891
2892		PUT_TSTAT_U32(FLOW_QUANTUM, b->flow_quantum);
2893		nla_nest_end(d->skb, ts);
2894	}
2895
2896#undef PUT_TSTAT_U32
2897#undef PUT_TSTAT_U64
2898
2899	nla_nest_end(d->skb, tstats);
2900	return nla_nest_end(d->skb, stats);
2901
2902nla_put_failure:
2903	nla_nest_cancel(d->skb, stats);
2904	return -1;
2905}
2906
2907static struct Qdisc *cake_leaf(struct Qdisc *sch, unsigned long arg)
2908{
2909	return NULL;
2910}
2911
2912static unsigned long cake_find(struct Qdisc *sch, u32 classid)
2913{
2914	return 0;
2915}
2916
2917static unsigned long cake_bind(struct Qdisc *sch, unsigned long parent,
2918			       u32 classid)
2919{
2920	return 0;
2921}
2922
2923static void cake_unbind(struct Qdisc *q, unsigned long cl)
2924{
2925}
2926
2927static struct tcf_block *cake_tcf_block(struct Qdisc *sch, unsigned long cl,
2928					struct netlink_ext_ack *extack)
2929{
2930	struct cake_sched_data *q = qdisc_priv(sch);
2931
2932	if (cl)
2933		return NULL;
2934	return q->block;
2935}
2936
2937static int cake_dump_class(struct Qdisc *sch, unsigned long cl,
2938			   struct sk_buff *skb, struct tcmsg *tcm)
2939{
2940	tcm->tcm_handle |= TC_H_MIN(cl);
2941	return 0;
2942}
2943
2944static int cake_dump_class_stats(struct Qdisc *sch, unsigned long cl,
2945				 struct gnet_dump *d)
2946{
2947	struct cake_sched_data *q = qdisc_priv(sch);
2948	const struct cake_flow *flow = NULL;
2949	struct gnet_stats_queue qs = { 0 };
2950	struct nlattr *stats;
2951	u32 idx = cl - 1;
2952
2953	if (idx < CAKE_QUEUES * q->tin_cnt) {
2954		const struct cake_tin_data *b = \
2955			&q->tins[q->tin_order[idx / CAKE_QUEUES]];
2956		const struct sk_buff *skb;
2957
2958		flow = &b->flows[idx % CAKE_QUEUES];
2959
2960		if (flow->head) {
2961			sch_tree_lock(sch);
2962			skb = flow->head;
2963			while (skb) {
2964				qs.qlen++;
2965				skb = skb->next;
2966			}
2967			sch_tree_unlock(sch);
2968		}
2969		qs.backlog = b->backlogs[idx % CAKE_QUEUES];
2970		qs.drops = flow->dropped;
2971	}
2972	if (gnet_stats_copy_queue(d, NULL, &qs, qs.qlen) < 0)
2973		return -1;
2974	if (flow) {
2975		ktime_t now = ktime_get();
2976
2977		stats = nla_nest_start_noflag(d->skb, TCA_STATS_APP);
2978		if (!stats)
2979			return -1;
2980
2981#define PUT_STAT_U32(attr, data) do {				       \
2982		if (nla_put_u32(d->skb, TCA_CAKE_STATS_ ## attr, data)) \
2983			goto nla_put_failure;			       \
2984	} while (0)
2985#define PUT_STAT_S32(attr, data) do {				       \
2986		if (nla_put_s32(d->skb, TCA_CAKE_STATS_ ## attr, data)) \
2987			goto nla_put_failure;			       \
2988	} while (0)
2989
2990		PUT_STAT_S32(DEFICIT, flow->deficit);
2991		PUT_STAT_U32(DROPPING, flow->cvars.dropping);
2992		PUT_STAT_U32(COBALT_COUNT, flow->cvars.count);
2993		PUT_STAT_U32(P_DROP, flow->cvars.p_drop);
2994		if (flow->cvars.p_drop) {
2995			PUT_STAT_S32(BLUE_TIMER_US,
2996				     ktime_to_us(
2997					     ktime_sub(now,
2998						     flow->cvars.blue_timer)));
2999		}
3000		if (flow->cvars.dropping) {
3001			PUT_STAT_S32(DROP_NEXT_US,
3002				     ktime_to_us(
3003					     ktime_sub(now,
3004						       flow->cvars.drop_next)));
3005		}
3006
3007		if (nla_nest_end(d->skb, stats) < 0)
3008			return -1;
3009	}
3010
3011	return 0;
3012
3013nla_put_failure:
3014	nla_nest_cancel(d->skb, stats);
3015	return -1;
3016}
3017
3018static void cake_walk(struct Qdisc *sch, struct qdisc_walker *arg)
3019{
3020	struct cake_sched_data *q = qdisc_priv(sch);
3021	unsigned int i, j;
3022
3023	if (arg->stop)
3024		return;
3025
3026	for (i = 0; i < q->tin_cnt; i++) {
3027		struct cake_tin_data *b = &q->tins[q->tin_order[i]];
3028
3029		for (j = 0; j < CAKE_QUEUES; j++) {
3030			if (list_empty(&b->flows[j].flowchain) ||
3031			    arg->count < arg->skip) {
3032				arg->count++;
3033				continue;
3034			}
3035			if (arg->fn(sch, i * CAKE_QUEUES + j + 1, arg) < 0) {
3036				arg->stop = 1;
3037				break;
3038			}
3039			arg->count++;
3040		}
3041	}
3042}
3043
3044static const struct Qdisc_class_ops cake_class_ops = {
3045	.leaf		=	cake_leaf,
3046	.find		=	cake_find,
3047	.tcf_block	=	cake_tcf_block,
3048	.bind_tcf	=	cake_bind,
3049	.unbind_tcf	=	cake_unbind,
3050	.dump		=	cake_dump_class,
3051	.dump_stats	=	cake_dump_class_stats,
3052	.walk		=	cake_walk,
3053};
3054
3055static struct Qdisc_ops cake_qdisc_ops __read_mostly = {
3056	.cl_ops		=	&cake_class_ops,
3057	.id		=	"cake",
3058	.priv_size	=	sizeof(struct cake_sched_data),
3059	.enqueue	=	cake_enqueue,
3060	.dequeue	=	cake_dequeue,
3061	.peek		=	qdisc_peek_dequeued,
3062	.init		=	cake_init,
3063	.reset		=	cake_reset,
3064	.destroy	=	cake_destroy,
3065	.change		=	cake_change,
3066	.dump		=	cake_dump,
3067	.dump_stats	=	cake_dump_stats,
3068	.owner		=	THIS_MODULE,
3069};
3070
3071static int __init cake_module_init(void)
3072{
3073	return register_qdisc(&cake_qdisc_ops);
3074}
3075
3076static void __exit cake_module_exit(void)
3077{
3078	unregister_qdisc(&cake_qdisc_ops);
3079}
3080
3081module_init(cake_module_init)
3082module_exit(cake_module_exit)
3083MODULE_AUTHOR("Jonathan Morton");
3084MODULE_LICENSE("Dual BSD/GPL");
3085MODULE_DESCRIPTION("The CAKE shaper.");