[From nobody Thu Jun 25 05:54:39 2020
Received: from mail-he1eur01on0050.outbound.protection.outlook.com
 ([104.47.0.50] helo=EUR01-HE1-obe.outbound.protection.outlook.com)
 by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux))
 id 1fLB9d-0007EC-MJ
 for openwrt-devel@lists.openwrt.org; Tue, 22 May 2018 17:33:38 +0000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
 d=darbyshire-bryant.me.uk; s=selector1;
 h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;
 bh=v/x7YcTRgB7y4DKi9OdzkKGSTXlm75OhHx/T0l0XDyE=;
 b=M4f3F5GgQ1gkclYxoeskKlZI8YOj+nDSRJ8MKncpremmh6H2hywJL1gTmbZU1fgydV0MEY+eAHohCyf+tqtt2bAhltwBnpQ26sAI667nZiqfksOATrysLcgd5zdNZ/XmTkV50tSyjoKHF+xY3tmA+LKCa2ViMR/uxeIyedVn1Gc=
Received: from Kevins-MBP.lan.darbyshire-bryant.me.uk (94.9.93.163) by
 VI1PR07MB4256.eurprd07.prod.outlook.com (2603:10a6:802:65::21) with Microsoft
 SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id
 15.20.797.8; Tue, 22 May 2018 17:32:28 +0000
From: Kevin Darbyshire-Bryant &lt;ldir@darbyshire-bryant.me.uk&gt;
To: openwrt-devel@lists.openwrt.org
Cc: Kevin Darbyshire-Bryant &lt;ldir@darbyshire-bryant.me.uk&gt;
Subject: [PATCH 1/2] iproute2: RFC update cake support
Date: Tue, 22 May 2018 18:32:20 +0100
Message-Id: &lt;20180522173221.82744-2-ldir@darbyshire-bryant.me.uk&gt;
X-Mailer: git-send-email 2.15.1 (Apple Git-101)
In-Reply-To: &lt;20180522173221.82744-1-ldir@darbyshire-bryant.me.uk&gt;
References: &lt;20180522173221.82744-1-ldir@darbyshire-bryant.me.uk&gt;
MIME-Version: 1.0
Content-Type: text/plain
X-Originating-IP: [94.9.93.163]
X-ClientProxiedBy: CWLP265CA0082.GBRP265.PROD.OUTLOOK.COM
 (2603:10a6:401:50::22) To VI1PR07MB4256.eurprd07.prod.outlook.com
 (2603:10a6:802:65::21)
X-MS-PublicTrafficType: Email
X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0;
 RULEID:(7020095)(4652020)(7021125)(5600026)(4534165)(7022125)(4603075)(4627221)(201702281549075)(7048125)(7024125)(7027125)(7028125)(7023125)(2017052603328)(7153060)(7193020);
 SRVR:VI1PR07MB4256; 
X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB4256;
 3:IOrTqYIF7OHmnke+yJXdQoAiKEg4ZESOrZBURw4Qr60q+1SmqJDnCddlQpv0cckXDIcggAxfSBXyRGUaUXNvun/43bslJjfN9adn+iQBOzCnDAe/drMPKp81E0FCHVMbZ46u/HU8oZ6u4KW2rr1a8vV/z4cYN6xjr3WrVNaOwJg55AMRXaacN2f478YgOgEtNq79s0EKjrQbcyrcP6XxX7HUt/O69u50APmy/wnK3CvK9WcIubvy9zlCDcw14WR0;
 25:4moDSftLi2kTvEHc8HPqfDVcq5oD6uWSaGv1Rx0pqFv0+ni78t/ezUZw4nvmSvIBIcxqUfM9Jfs8HQO6m1DSO1Q62Jqj4kzepQfV3Jmy74wavEyliWKJnjb/iyW2valHvP0Vq41Ldi60viU+mkI9nI8vwFH8QSpnZJEiJBd6mHaLuhnP4esxmPtjnEz9uhwAIggSVg4LbftRohkiYAvo/LgPrY9u6D30EsH/oqhbNK4u6DtxecNXtaRq7IgAnFaZPpUnsDc8t5oy18XynHiAu46m3+90ZNsQFzSgc7shNXdcYGFLAx0hc0yMrFcgUybOkI0nuycP0wRZCeQhhuw5RA==;
 31:zdgB0ww0mIPKbv8x2xeY/958NjlTc/A9+R/ZJ2HCgL2YfvphefD0dk7/+ErZLAgjokVerSuzInVkY/MhBMW9In3QcbV6cG3jc6kw0i3iaLWZmSZIKvSToV3yr5EfcvkmSLxt02h+Re8+geoLUzGQ84jQOfZzidbVXgTRU1ghgyFC4Rh4HPvH3an8BeMldoQYrfPmPro6Vjn3oHDJnMXUZw0gCCe0lxC7lVhZiyIu/K0=
X-MS-TrafficTypeDiagnostic: VI1PR07MB4256:
Authentication-Results: spf=none (sender IP is )
 smtp.mailfrom=kevin@darbyshire-bryant.me.uk; 
X-Microsoft-Antispam-PRVS: &lt;VI1PR07MB42569FBE6D3C52D0FE830E67A5940@VI1PR07MB4256.eurprd07.prod.outlook.com&gt;
X-Exchange-Antispam-Report-Test: UriScan:(278428928389397);
X-MS-Exchange-SenderADCheck: 1
X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0;
 RULEID:(6040522)(2401047)(5005006)(8121501046)(10201501046)(3002001)(93006095)(93001095)(3231254)(944501410)(52105095)(149027)(150027)(6041310)(20161123560045)(2016111802025)(20161123562045)(20161123558120)(20161123564045)(6043046)(6072148)(201708071742011)(7699016);
 SRVR:VI1PR07MB4256; BCL:0; PCL:0; RULEID:; SRVR:VI1PR07MB4256; 
X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB4256;
 4:EViov3Xo9hwZQnf+emvUt+mZBcfpwr2BwRnz6YiBUudTHFG32N+PzJYsNdK/fVSKGgds1zyFW/q4JTjPj+PZPDM903zfC92bUVF62hU2bPsz8ctA72VrI74LWM8cO0LwD9+XfR0HFLcybakdDwRw2pbVcfwE5v+0bJpExowGazIs21WBL4pbFp5FWCGMs03qHO9FxuMJdreLjcN6nWf+Sk6IxEkU5btRvpRUvBorenXHdaaCe8HwJaL1E0LKCf0H/qsXsBqgXtU7LB99PUbtW4mvwQgw3DDI9e9Gg8RaJ15MmvNRKR/bNTJXwHa4jBED
X-Forefront-PRVS: 0680FADD48
X-Forefront-Antispam-Report: SFV:NSPM;
 SFS:(10009020)(396003)(39380400002)(39830400003)(346002)(376002)(366004)(189003)(199004)(6666003)(74482002)(5660300001)(53936002)(7696005)(52116002)(66066001)(2351001)(6916009)(26005)(2361001)(4326008)(956004)(486006)(11346002)(476003)(2616005)(6486002)(446003)(51416003)(47776003)(76176011)(107886003)(2906002)(36756003)(59450400001)(8676002)(16526019)(386003)(186003)(106356001)(316002)(7736002)(50466002)(305945005)(81156014)(48376002)(50226002)(8936002)(81166006)(6116002)(3846002)(1076002)(68736007)(25786009)(16586007)(105586002)(478600001)(97736004)(46800400004);
 DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR07MB4256;
 H:Kevins-MBP.lan.darbyshire-bryant.me.uk; FPR:; SPF:None; LANG:en;
 PTR:InfoNoRecords; MX:1; A:1; 
Received-SPF: None (protection.outlook.com: darbyshire-bryant.me.uk does not
 designate permitted sender hosts)
X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR07MB4256;
 23:fOldysQQWQ58K3gofxpku2P2tPe+ihKLRcaJ3OCA6?=
 =?us-ascii?Q?O/5JQu7q9DLraDBPD/E8BHe5Y/D89R0HKibU2YNUg2D7hN2juidFF8SdcUeE?=
 =?us-ascii?Q?6tBheEWqcd6esJZ2cxJaC3tLzKWwd05KNp561ken6SY9NOL4eeA/5fIgE5b2?=
 =?us-ascii?Q?oyoomtt1f6K/fGytd+1LnBxK84k7adGtrUBlY5tfqmOieH2nidINCCWGEQ92?=
 =?us-ascii?Q?Q02LnnHdXBuiocKSlWixsYNyQTRx4rplSIvDQc9JQxD4BIF6CkZkMuK8zHs2?=
 =?us-ascii?Q?8y8Dr03HHvPKjMK16WxSWQdIVSt97VE0hasGEtN5qYOkfBUmbjdDlf0YooBm?=
 =?us-ascii?Q?ho4ut7pf4Gssg53bbMoqnRLwh9AW+VQRegEg2ZAQcn83UeSbNbQv/zsJBVI9?=
 =?us-ascii?Q?x1ibduX0cs3V5qmxS5pQP+A/PRG+MVfStzKTvIewZ5uMp/V8xQq5pmk8RVbY?=
 =?us-ascii?Q?dc8UUNyAdzKO6/uM6Du5nU3tZQgbICJqyf8GlvU0e9UAPo07EZGOuSamUel5?=
 =?us-ascii?Q?qVdFeyU13Khyktpd9ZWv36KOuqPSWBsxwKDsjPt5aYjjO74urKM12h8HMwVu?=
 =?us-ascii?Q?KMtjlmvsZcsAeL4NhHVRr4cTG/lzV0kJhSQhcP46JGM+d82l8tz3d5ooGW5G?=
 =?us-ascii?Q?RnqnyVVnC9AagZMUs5zPjGwKwzjtMFOwS9Q7Xva5cD80sP1w7oHOGNcOTYd0?=
 =?us-ascii?Q?kIw352ir2wuSHi1YV18yuwMUZBeN8eSnWH7CkiZFH5yN+902nHPjbhKgNXsT?=
 =?us-ascii?Q?GLF3GcpuC6JvYhKXay9YEw/5AKwnT3CGl+12pcmNbQTtiyAIBMQKo8DMdnK4?=
 =?us-ascii?Q?/9BljbC53h7VgPUpBnZl0/v+OcZbOUHePukQ/v3kWVTJBqToQNGFOryvs2cW?=
 =?us-ascii?Q?AbZRZ6IleleurSaTtcJzFzxFe2xTVnLRHP3TD/rXhNaIocUpmgEg5Y/xTm+M?=
 =?us-ascii?Q?tsyLpvchujIm6fxL1Wdki6Gtq+vbOW04TNl0Kqg3kYbtjN6Kuntzi/wGxcA7?=
 =?us-ascii?Q?6O1TRj74HerDmcL0Q3eKMcV81NhsGJSJPnnexaL0F3Hweol/Xwl0no/SsxKi?=
 =?us-ascii?Q?42vK877NJuZvoVgfjpNMi/KlIXuvq9dfOo/6Jko7jKD7S8YCR7BA7YX8W8Qa?=
 =?us-ascii?Q?fKQUymhhK4J6ayY8zfDCH0pImFYXNUanNGLudHQmoDC08oU21tx8sX/RPFIv?=
 =?us-ascii?Q?N0Sj5pAyTcgS9IBMUDXuX2ul9PwtVmzF18nqJEk5Al8SE9gYzTayM4IEkouX?=
 =?us-ascii?Q?9NfiUnk87IqFiF68odKrsfE1RNn84jCo8qZERh2ZpCB1KI5YzE02bjXw/kq7?=
 =?us-ascii?B?Zz09?=
X-Microsoft-Antispam-Message-Info: 7qv/9Bqqh1WgDg9T7wPNyBnsdGKd6uW/HPXR0VmbfyLdvQ8KhTsYHVgETWaF7KTRh9FbZ0070/dWYzghQWBNFqnk12jS30ORpHROl9lQHxFhzt8IXusD5HsyXMX3/GStw9h+CNaM02OEwUK+GXiGmANg1UBkxlGTepvMQMEderssAI4QtEUHQkCcdk2zwftd
X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB4256;
 6:1BJneuB0o2ztkTARk7Y4tiVqzbljcEbagH7HZ59kNFxNoeArVBJbXldVjNhKI+8/039AIx9pqJPYhoj3bbIvzNqjrC7syGcGVQ099wYBLLXsNcedNprlge9raoQVSPE866AcpV7kUB+ylxox8PuvM9mZgtMOTcoYQFskqVubl+JmZi5+LYgJVJKyyIN5mR+Ykv3bpcu+s3tc/bmtptOwvOaRee93vADFT0XPEZpz0z1ieln+rUWSy8794YOFfn7vet77BTeof8xY3pHyuLOeVIk/Q16hNaUE2+3OOAtm6KknWSEUwpfby6oj6YtJjfIEdzbOW/Mhluntc4elnLeDOuTayg8+8Vsev4mIR6jp8rSgd2yYnLbc4Jm4d6UAUPNJ4mROcUrJ5Tbq7fV1XGEc6El+1W7uCsOuar2aXPkkbgglGCWHbU7ZxlNAlKgzOLOmRNMes4kiRdEHq5UYlsL3yQ==;
 5:jHsnqVyYVocYFan2zuuyJOPV2jcySq0jZcwuIbWnFWhTNCGCWgX/4zFQhRuuJrvBrI5Mxu/hlSQHty2xTQPJ9J7ZErvkMOpZEGWKXVU/SdUZz6cLU5YgjfmrAFKPazJnDi/tF2t/1IeRCVs3P70f3bMtj/weA738z/pJ3zu/hPY=;
 24:uAiAWj7RUZkZL4iB59rRLSoYfun1IDj7qblszvkl5XL5hGvSH14DyPdUIbk7fVx1gJ6jwiwLF/sk3StZXCuSuytTZJC+O4vO5MKxWejYBBw=
SpamDiagnosticOutput: 1:99
SpamDiagnosticMetadata: NSPM
X-Microsoft-Exchange-Diagnostics: 1; VI1PR07MB4256;
 7:Gd+ff0ZPn7zRX9dqRRm4794TS18KN0cT+NHykzdE0Gu4ake8DOHBJJMNRdVeOM9KoLKE494hsuOIY/S8sYwfpe7pu9PEqlLqufHrxAxNjUnT8zveOGbrNYtCjbeXnEc8zCbonRyeIYbK/Vp33C8fF6CeZDfy1vy3vNFSDljcg3yMiNNYg4dQfjPutVKGEgxES7oBCU3k+Lfr5XXT6pyhGBq9yIniSJOFQWFPcqqU/ejPuxGZ/w5lPl+83b0HJBlU
X-MS-Office365-Filtering-Correlation-Id: ab8603b0-394c-4664-5e53-08d5c009fda2
X-OriginatorOrg: darbyshire-bryant.me.uk
X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 May 2018 17:32:28.3746 (UTC)
X-MS-Exchange-CrossTenant-Network-Message-Id: ab8603b0-394c-4664-5e53-08d5c009fda2
X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted
X-MS-Exchange-CrossTenant-Id: 9151708b-c553-406f-8e56-694f435154a4
X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR07MB4256
X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 
X-CRM114-CacheID: sfid-20180522_103257_934031_A9660B2C 
X-CRM114-Status: GOOD (  13.29  )
X-Spam-Score: -0.1 (/)
X-Spam-Report: SpamAssassin version 3.4.1 on bombadil.infradead.org summary:
 Content analysis details:   (-0.1 points)
 pts rule name              description
 ---- ---------------------- --------------------------------------------------
 -0.0 RCVD_IN_DNSWL_NONE     RBL: Sender listed at http://www.dnswl.org/, no
 trust [104.47.0.50 listed in list.dnswl.org]
 -0.0 SPF_HELO_PASS          SPF: HELO matches SPF record
 -0.0 SPF_PASS               SPF: sender matches SPF record
 -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature
 0.1 DKIM_SIGNED            Message has a DKIM or DK signature,
 not necessarily valid
 -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from author's
 domain

This bumps to the latest &amp; possibly greatest cake support for tc.
It's not without problems, the netlink api is used to transfer data
between userspace (tc) and kernel space (sch_cake kmod) and we've
started sending 64bit values across it.

For reasons we don't understand, this is fine on some platforms and not
so good on others. e.g. tc -s qdisc show dev net_device_running_cake
won't return all the tin stats on some archs (MIPS r32 BE).

Assistance required!  Bug in openwrt?  Bug in our code?  Endian issue?

Signed-off-by: Kevin Darbyshire-Bryant &lt;ldir@darbyshire-bryant.me.uk&gt;
---
 .../iproute2/patches/950-add-cake-to-tc.patch      | 111 +++++++++++++++------
 1 file changed, 83 insertions(+), 28 deletions(-)

diff --git a/package/network/utils/iproute2/patches/950-add-cake-to-tc.patch b/package/network/utils/iproute2/patches/950-add-cake-to-tc.patch
index 3c2cdaaac3..f453af9d2e 100644
--- a/package/network/utils/iproute2/patches/950-add-cake-to-tc.patch
+++ b/package/network/utils/iproute2/patches/950-add-cake-to-tc.patch
@@ -1,13 +1,14 @@
 --- a/include/uapi/linux/pkt_sched.h
 +++ b/include/uapi/linux/pkt_sched.h
-@@ -934,4 +934,110 @@ enum {
+@@ -934,4 +934,118 @@ enum {
  
  #define TCA_CBS_MAX (__TCA_CBS_MAX - 1)
  
 +/* CAKE */
 +enum {
 +	TCA_CAKE_UNSPEC,
-+	TCA_CAKE_BASE_RATE,
++	TCA_CAKE_PAD,
++	TCA_CAKE_BASE_RATE64,
 +	TCA_CAKE_DIFFSERV_MODE,
 +	TCA_CAKE_ATM,
 +	TCA_CAKE_FLOW_MODE,
@@ -29,7 +30,8 @@
 +
 +enum {
 +	__TCA_CAKE_STATS_INVALID,
-+	TCA_CAKE_STATS_CAPACITY_ESTIMATE,
++	TCA_CAKE_STATS_PAD,
++	TCA_CAKE_STATS_CAPACITY_ESTIMATE64,
 +	TCA_CAKE_STATS_MEMORY_LIMIT,
 +	TCA_CAKE_STATS_MEMORY_USED,
 +	TCA_CAKE_STATS_AVG_NETOFF,
@@ -38,6 +40,12 @@
 +	TCA_CAKE_STATS_MIN_ADJLEN,
 +	TCA_CAKE_STATS_MAX_ADJLEN,
 +	TCA_CAKE_STATS_TIN_STATS,
++	TCA_CAKE_STATS_DEFICIT,
++	TCA_CAKE_STATS_COBALT_COUNT,
++	TCA_CAKE_STATS_DROPPING,
++	TCA_CAKE_STATS_DROP_NEXT_US,
++	TCA_CAKE_STATS_P_DROP,
++	TCA_CAKE_STATS_BLUE_TIMER_US,
 +	__TCA_CAKE_STATS_MAX
 +};
 +#define TCA_CAKE_STATS_MAX (__TCA_CAKE_STATS_MAX - 1)
@@ -54,8 +62,8 @@
 +	TCA_CAKE_TIN_STATS_ECN_MARKED_PACKETS,
 +	TCA_CAKE_TIN_STATS_ECN_MARKED_BYTES64,
 +	TCA_CAKE_TIN_STATS_BACKLOG_PACKETS,
-+	TCA_CAKE_TIN_STATS_BACKLOG_BYTES64,
-+	TCA_CAKE_TIN_STATS_THRESHOLD_RATE,
++	TCA_CAKE_TIN_STATS_BACKLOG_BYTES,
++	TCA_CAKE_TIN_STATS_THRESHOLD_RATE64,
 +	TCA_CAKE_TIN_STATS_TARGET_US,
 +	TCA_CAKE_TIN_STATS_INTERVAL_US,
 +	TCA_CAKE_TIN_STATS_WAY_INDIRECT_HITS,
@@ -758,7 +766,7 @@
  TCMODULES += q_hhf.o
 --- /dev/null
 +++ b/tc/q_cake.c
-@@ -0,0 +1,749 @@
+@@ -0,0 +1,796 @@
 +/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause) */
 +/*
 + * Common Applications Kept Enhanced  --  CAKE
@@ -831,7 +839,7 @@
 +			  struct nlmsghdr *n, const char *dev)
 +{
 +	int unlimited = 0;
-+	unsigned bandwidth = 0;
++	__u64 bandwidth = 0;
 +	unsigned interval = 0;
 +	unsigned target = 0;
 +	unsigned diffserv = 0;
@@ -853,7 +861,7 @@
 +	while (argc &gt; 0) {
 +		if (strcmp(*argv, &quot;bandwidth&quot;) == 0) {
 +			NEXT_ARG();
-+			if (get_rate(&amp;bandwidth, *argv)) {
++			if (get_rate64(&amp;bandwidth, *argv)) {
 +				fprintf(stderr, &quot;Illegal \&quot;bandwidth\&quot;\n&quot;);
 +				return -1;
 +			}
@@ -1088,7 +1096,7 @@
 +	tail = NLMSG_TAIL(n);
 +	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
 +	if (bandwidth || unlimited)
-+		addattr_l(n, 1024, TCA_CAKE_BASE_RATE, &amp;bandwidth, sizeof(bandwidth));
++		addattr_l(n, 1024, TCA_CAKE_BASE_RATE64, &amp;bandwidth, sizeof(bandwidth));
 +	if (diffserv)
 +		addattr_l(n, 1024, TCA_CAKE_DIFFSERV_MODE, &amp;diffserv, sizeof(diffserv));
 +	if (atm != -1)
@@ -1128,7 +1136,7 @@
 +static int cake_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
 +{
 +	struct rtattr *tb[TCA_CAKE_MAX + 1];
-+	unsigned bandwidth = 0;
++	__u64 bandwidth = 0;
 +	unsigned diffserv = 0;
 +	unsigned flowmode = 0;
 +	unsigned interval = 0;
@@ -1151,9 +1159,9 @@
 +
 +	parse_rtattr_nested(tb, TCA_CAKE_MAX, opt);
 +
-+	if (tb[TCA_CAKE_BASE_RATE] &amp;&amp;
-+	    RTA_PAYLOAD(tb[TCA_CAKE_BASE_RATE]) &gt;= sizeof(__u32)) {
-+		bandwidth = rta_getattr_u32(tb[TCA_CAKE_BASE_RATE]);
++	if (tb[TCA_CAKE_BASE_RATE64] &amp;&amp;
++	    RTA_PAYLOAD(tb[TCA_CAKE_BASE_RATE64]) &gt;= sizeof(bandwidth)) {
++		bandwidth = rta_getattr_u64(tb[TCA_CAKE_BASE_RATE64]);
 +		if(bandwidth) {
 +			print_uint(PRINT_JSON, &quot;bandwidth&quot;, NULL, bandwidth);
 +			print_string(PRINT_FP, NULL, &quot;bandwidth %s &quot;, sprint_rate(bandwidth, b1));
@@ -1306,7 +1314,7 @@
 +	else if (!raw)
 +		print_string(PRINT_ANY, &quot;atm&quot;, &quot;%s &quot;, &quot;noatm&quot;);
 +
-+	print_uint(PRINT_ANY, &quot;overhead&quot;, &quot;overhead %d &quot;, overhead);
++	print_int(PRINT_ANY, &quot;overhead&quot;, &quot;overhead %d &quot;, overhead);
 +
 +	if (mpu)
 +		print_uint(PRINT_ANY, &quot;mpu&quot;, &quot;mpu %u &quot;, mpu);
@@ -1322,18 +1330,19 @@
 +static void cake_print_json_tin(struct rtattr **tstat)
 +{
 +#define PRINT_TSTAT_JSON(type, name, attr) if (tstat[TCA_CAKE_TIN_STATS_ ## attr]) \
-+		print_uint(PRINT_JSON, name, NULL,			\
++		print_u64(PRINT_JSON, name, NULL,			\
 +			rta_getattr_ ## type((struct rtattr *)tstat[TCA_CAKE_TIN_STATS_ ## attr]))
 +
 +	open_json_object(NULL);
-+	PRINT_TSTAT_JSON(u32, &quot;threshold_rate&quot;, THRESHOLD_RATE);
++	PRINT_TSTAT_JSON(u64, &quot;threshold_rate&quot;, THRESHOLD_RATE64);
++	PRINT_TSTAT_JSON(u64, &quot;sent_bytes&quot;, SENT_BYTES64);
++	PRINT_TSTAT_JSON(u32, &quot;backlog_bytes&quot;, BACKLOG_BYTES);
 +	PRINT_TSTAT_JSON(u32, &quot;target_us&quot;, TARGET_US);
 +	PRINT_TSTAT_JSON(u32, &quot;interval_us&quot;, INTERVAL_US);
 +	PRINT_TSTAT_JSON(u32, &quot;peak_delay_us&quot;, PEAK_DELAY_US);
 +	PRINT_TSTAT_JSON(u32, &quot;avg_delay_us&quot;, AVG_DELAY_US);
 +	PRINT_TSTAT_JSON(u32, &quot;base_delay_us&quot;, BASE_DELAY_US);
 +	PRINT_TSTAT_JSON(u32, &quot;sent_packets&quot;, SENT_PACKETS);
-+	PRINT_TSTAT_JSON(u64, &quot;sent_bytes&quot;, SENT_BYTES64);
 +	PRINT_TSTAT_JSON(u32, &quot;way_indirect_hits&quot;, WAY_INDIRECT_HITS);
 +	PRINT_TSTAT_JSON(u32, &quot;way_misses&quot;, WAY_MISSES);
 +	PRINT_TSTAT_JSON(u32, &quot;way_collisions&quot;, WAY_COLLISIONS);
@@ -1361,6 +1370,8 @@
 +		return 0;
 +
 +#define GET_STAT_U32(attr) rta_getattr_u32(st[TCA_CAKE_STATS_ ## attr])
++#define GET_STAT_S32(attr) (*(__s32*)RTA_DATA(st[TCA_CAKE_STATS_ ## attr]))
++#define GET_STAT_U64(attr) rta_getattr_u64(st[TCA_CAKE_STATS_ ## attr])
 +
 +	parse_rtattr_nested(st, TCA_CAKE_STATS_MAX, xstats);
 +
@@ -1378,11 +1389,11 @@
 +			GET_STAT_U32(MEMORY_LIMIT));
 +	}
 +
-+	if (st[TCA_CAKE_STATS_CAPACITY_ESTIMATE]) {
++	if (st[TCA_CAKE_STATS_CAPACITY_ESTIMATE64]) {
 +		print_string(PRINT_FP, NULL, &quot; capacity estimate: %s\n&quot;,
-+			sprint_rate(GET_STAT_U32(CAPACITY_ESTIMATE), b1));
++			sprint_rate(GET_STAT_U64(CAPACITY_ESTIMATE64), b1));
 +		print_uint(PRINT_JSON, &quot;capacity_estimate&quot;, NULL,
-+			GET_STAT_U32(CAPACITY_ESTIMATE));
++			GET_STAT_U64(CAPACITY_ESTIMATE64));
 +	}
 +
 +	if (st[TCA_CAKE_STATS_MIN_NETLEN] &amp;&amp;
@@ -1408,7 +1419,50 @@
 +			   &quot; average network hdr offset:     %8u\n\n&quot;,
 +			   GET_STAT_U32(AVG_NETOFF));
 +
++	/* class stats */
++	if (st[TCA_CAKE_STATS_DEFICIT])
++		print_int(PRINT_ANY, &quot;deficit&quot;, &quot;  deficit %u&quot;,
++			  GET_STAT_S32(DEFICIT));
++	if (st[TCA_CAKE_STATS_COBALT_COUNT])
++		print_uint(PRINT_ANY, &quot;count&quot;, &quot; count %u&quot;,
++			   GET_STAT_U32(COBALT_COUNT));
++
++	if (st[TCA_CAKE_STATS_DROPPING] &amp;&amp; GET_STAT_U32(DROPPING)) {
++		print_bool(PRINT_ANY, &quot;dropping&quot;, &quot; dropping&quot;, true);
++		if (st[TCA_CAKE_STATS_DROP_NEXT_US]) {
++			int drop_next = GET_STAT_S32(DROP_NEXT_US);
++			if (drop_next &lt; 0) {
++				print_string(PRINT_FP, NULL, &quot; drop_next -%s&quot;,
++					sprint_time(drop_next, b1));
++			} else {
++				print_uint(PRINT_JSON, &quot;drop_next&quot;, NULL,
++					drop_next);
++				print_string(PRINT_FP, NULL, &quot; drop_next %s&quot;,
++					sprint_time(drop_next, b1));
++			}
++		}
++	}
++
++	if (st[TCA_CAKE_STATS_P_DROP]) {
++		print_uint(PRINT_ANY, &quot;blue_prob&quot;, &quot; blue_prob %u&quot;,
++			   GET_STAT_U32(P_DROP));
++		if (st[TCA_CAKE_STATS_BLUE_TIMER_US]) {
++			int blue_timer = GET_STAT_S32(BLUE_TIMER_US);
++			if (blue_timer &lt; 0) {
++				print_string(PRINT_FP, NULL, &quot; blue_timer -%s&quot;,
++					sprint_time(blue_timer, b1));
++			} else {
++				print_uint(PRINT_JSON, &quot;blue_timer&quot;, NULL,
++					blue_timer);
++				print_string(PRINT_FP, NULL, &quot; blue_timer %s&quot;,
++					sprint_time(blue_timer, b1));
++			}
++		}
++	}
++
 +#undef GET_STAT_U32
++#undef GET_STAT_S32
++#undef GET_STAT_U64
 +
 +	if (st[TCA_CAKE_STATS_TIN_STATS]) {
 +		struct rtattr *tins[TC_CAKE_MAX_TINS + 1];
@@ -1461,9 +1515,9 @@
 +			}						\
 +		} while (0)
 +
-+#define SPRINT_TSTAT(pfunc, name, attr) PRINT_TSTAT(		\
++#define SPRINT_TSTAT(pfunc, type, name, attr) PRINT_TSTAT(		\
 +			name, attr, &quot;s&quot;, sprint_ ## pfunc(		\
-+				rta_getattr_u32(GET_TSTAT(i, attr)), b1))
++				rta_getattr_ ## type(GET_TSTAT(i, attr)), b1))
 +
 +#define PRINT_TSTAT_U32(name, attr)	PRINT_TSTAT(			\
 +			name, attr, &quot;u&quot;, rta_getattr_u32(GET_TSTAT(i, attr)))
@@ -1471,12 +1525,13 @@
 +#define PRINT_TSTAT_U64(name, attr)	PRINT_TSTAT(			\
 +			name, attr, &quot;llu&quot;, rta_getattr_u64(GET_TSTAT(i, attr)))
 +
-+		SPRINT_TSTAT(rate, &quot;  thresh  &quot;, THRESHOLD_RATE);
-+		SPRINT_TSTAT(time, &quot;  target  &quot;, TARGET_US);
-+		SPRINT_TSTAT(time, &quot;  interval&quot;, INTERVAL_US);
-+		SPRINT_TSTAT(time, &quot;  pk_delay&quot;, PEAK_DELAY_US);
-+		SPRINT_TSTAT(time, &quot;  av_delay&quot;, AVG_DELAY_US);
-+		SPRINT_TSTAT(time, &quot;  sp_delay&quot;, BASE_DELAY_US);
++		SPRINT_TSTAT(rate, u64, &quot;  thresh  &quot;, THRESHOLD_RATE64);
++		SPRINT_TSTAT(time, u32, &quot;  target  &quot;, TARGET_US);
++		SPRINT_TSTAT(time, u32, &quot;  interval&quot;, INTERVAL_US);
++		SPRINT_TSTAT(time, u32, &quot;  pk_delay&quot;, PEAK_DELAY_US);
++		SPRINT_TSTAT(time, u32, &quot;  av_delay&quot;, AVG_DELAY_US);
++		SPRINT_TSTAT(time, u32, &quot;  sp_delay&quot;, BASE_DELAY_US);
++		SPRINT_TSTAT(size, u32, &quot;  backlog &quot;, BACKLOG_BYTES);
 +
 +		PRINT_TSTAT_U32(&quot;  pkts    &quot;, SENT_PACKETS);
 +		PRINT_TSTAT_U64(&quot;  bytes   &quot;, SENT_BYTES64);
-- 
2.15.1 (Apple Git-101)


]