The attached patch updates iproute2 to 3.5.1, cleans out unnecessary CoDeL 
patches.

Signed-off-by: Oliver Smith <oli...@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa>

Regards,
Oliver
>From c5c64c2a02f77d9c800a9e025f9b242f5c8792c1 Mon Sep 17 00:00:00 2001
From: Oliver <oli...@8.c.9.b.0.7.4.0.1.0.0.2.ip6.arpa>
Date: Sun, 30 Sep 2012 03:00:18 +0200
Subject: [PATCH 1/2] iproute2: updated package to version 3.5.1

Fixed up netem removal patch and removed codel code as this is already
present since iproute2 v3.5.0
---
 package/iproute2/Makefile                          |   4 +-
 .../iproute2/patches/000-sync_pkt_sched_h.patch    |  85 ----
 package/iproute2/patches/008-no_netem.patch        |   8 +-
 package/iproute2/patches/110-extra-ccopts.patch    |  14 +-
 package/iproute2/patches/210-add_codel.patch       | 437 ---------------------
 5 files changed, 13 insertions(+), 535 deletions(-)
 delete mode 100644 package/iproute2/patches/210-add_codel.patch

diff --git a/package/iproute2/Makefile b/package/iproute2/Makefile
index 8e89617..bbde484 100644
--- a/package/iproute2/Makefile
+++ b/package/iproute2/Makefile
@@ -8,12 +8,12 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iproute2
-PKG_VERSION:=3.3.0
+PKG_VERSION:=3.5.1
 PKG_RELEASE:=1
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
 PKG_SOURCE_URL:=http://kernel.org/pub/linux/utils/net/iproute2/
-PKG_MD5SUM:=308e7145218dd552c2766fe527e239e1
+PKG_MD5SUM:=732fcbf2bedf3555e3e2ae54df191588
 PKG_BUILD_PARALLEL:=1
 
 PKG_BUILD_DIR:=$(BUILD_DIR)/iproute2-$(PKG_VERSION)
diff --git a/package/iproute2/patches/000-sync_pkt_sched_h.patch b/package/iproute2/patches/000-sync_pkt_sched_h.patch
index d3315a0..89a2682 100644
--- a/package/iproute2/patches/000-sync_pkt_sched_h.patch
+++ b/package/iproute2/patches/000-sync_pkt_sched_h.patch
@@ -34,88 +34,3 @@
  /* RED section */
  
  enum {
-@@ -633,4 +660,84 @@ struct tc_qfq_stats {
- 	__u32 lmax;
- };
- 
-+/* CODEL */
-+
-+enum {
-+	TCA_CODEL_UNSPEC,
-+	TCA_CODEL_TARGET,
-+	TCA_CODEL_LIMIT,
-+	TCA_CODEL_INTERVAL,
-+	TCA_CODEL_ECN,
-+	__TCA_CODEL_MAX
-+};
-+
-+#define TCA_CODEL_MAX	(__TCA_CODEL_MAX - 1)
-+
-+struct tc_codel_xstats {
-+	__u32	maxpacket; /* largest packet we've seen so far */
-+	__u32	count;	   /* how many drops we've done since the last time we
-+			    * entered dropping state
-+			    */
-+	__u32	lastcount; /* count at entry to dropping state */
-+	__u32	ldelay;    /* in-queue delay seen by most recently dequeued packet */
-+	__s32	drop_next; /* time to drop next packet */
-+	__u32	drop_overlimit; /* number of time max qdisc packet limit was hit */
-+	__u32	ecn_mark;  /* number of packets we ECN marked instead of dropped */
-+	__u32	dropping;  /* are we in dropping state ? */
-+};
-+
-+/* FQ_CODEL */
-+
-+enum {
-+	TCA_FQ_CODEL_UNSPEC,
-+	TCA_FQ_CODEL_TARGET,
-+	TCA_FQ_CODEL_LIMIT,
-+	TCA_FQ_CODEL_INTERVAL,
-+	TCA_FQ_CODEL_ECN,
-+	TCA_FQ_CODEL_FLOWS,
-+	TCA_FQ_CODEL_QUANTUM,
-+	__TCA_FQ_CODEL_MAX
-+};
-+
-+#define TCA_FQ_CODEL_MAX	(__TCA_FQ_CODEL_MAX - 1)
-+
-+enum {
-+	TCA_FQ_CODEL_XSTATS_QDISC,
-+	TCA_FQ_CODEL_XSTATS_CLASS,
-+};
-+
-+struct tc_fq_codel_qd_stats {
-+	__u32	maxpacket;	/* largest packet we've seen so far */
-+	__u32	drop_overlimit; /* number of time max qdisc
-+				 * packet limit was hit
-+				 */
-+	__u32	ecn_mark;	/* number of packets we ECN marked
-+				 * instead of being dropped
-+				 */
-+	__u32	new_flow_count; /* number of time packets
-+				 * created a 'new flow'
-+				 */
-+	__u32	new_flows_len;	/* count of flows in new list */
-+	__u32	old_flows_len;	/* count of flows in old list */
-+};
-+
-+struct tc_fq_codel_cl_stats {
-+	__s32	deficit;
-+	__u32	ldelay;		/* in-queue delay seen by most recently
-+				 * dequeued packet
-+				 */
-+	__u32	count;
-+	__u32	lastcount;
-+	__u32	dropping;
-+	__s32	drop_next;
-+};
-+
-+struct tc_fq_codel_xstats {
-+	__u32	type;
-+	union {
-+		struct tc_fq_codel_qd_stats qdisc_stats;
-+		struct tc_fq_codel_cl_stats class_stats;
-+	};
-+};
-+
- #endif
diff --git a/package/iproute2/patches/008-no_netem.patch b/package/iproute2/patches/008-no_netem.patch
index c804b14..e60231b 100644
--- a/package/iproute2/patches/008-no_netem.patch
+++ b/package/iproute2/patches/008-no_netem.patch
@@ -1,11 +1,11 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -33,7 +33,7 @@ CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prot
- CFLAGS = $(CCOPTS) -I../include $(DEFINES)
+@@ -38,7 +38,7 @@ WFLAGS = -Wall -Wstrict-prototypes
+ CFLAGS = $(WFLAGS) $(CCOPTS) -I../include $(DEFINES)
  YACCFLAGS = -d -t -v
  
--SUBDIRS=lib ip tc misc netem genl
-+SUBDIRS=lib ip tc misc genl
+-SUBDIRS=lib ip tc bridge misc netem genl man
++SUBDIRS=lib ip tc bridge misc genl
  
  LIBNETLINK=../lib/libnetlink.a ../lib/libutil.a
  LDLIBS += $(LIBNETLINK)
diff --git a/package/iproute2/patches/110-extra-ccopts.patch b/package/iproute2/patches/110-extra-ccopts.patch
index 0bf822f..ee16f7c 100644
--- a/package/iproute2/patches/110-extra-ccopts.patch
+++ b/package/iproute2/patches/110-extra-ccopts.patch
@@ -1,11 +1,11 @@
 --- a/Makefile
 +++ b/Makefile
-@@ -29,7 +29,7 @@ ADDLIB+=ipx_ntop.o ipx_pton.o
- 
- CC = gcc
- HOSTCC = gcc
--CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall
-+CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall $(EXTRA_CCOPTS)
- CFLAGS = $(CCOPTS) -I../include $(DEFINES)
+@@ -35,7 +35,7 @@ HOSTCC = gcc
+ DEFINES += -D_GNU_SOURCE
+ CCOPTS = -O2
+ WFLAGS = -Wall -Wstrict-prototypes
+-CFLAGS = $(WFLAGS) $(CCOPTS) -I../include $(DEFINES)
++CFLAGS = $(WFLAGS) $(CCOPTS) $(EXTRA_CCOPTS) -I../include $(DEFINES)
  YACCFLAGS = -d -t -v
  
+ SUBDIRS=lib ip tc bridge misc genl
diff --git a/package/iproute2/patches/210-add_codel.patch b/package/iproute2/patches/210-add_codel.patch
deleted file mode 100644
index a14e276..0000000
--- a/package/iproute2/patches/210-add_codel.patch
+++ /dev/null
@@ -1,437 +0,0 @@
---- a/tc/Makefile
-+++ b/tc/Makefile
-@@ -49,6 +49,8 @@ TCMODULES += em_cmp.o
- TCMODULES += em_u32.o
- TCMODULES += em_meta.o
- TCMODULES += q_mqprio.o
-+TCMODULES += q_codel.o
-+TCMODULES += q_fq_codel.o
- 
- TCSO :=
- ifeq ($(TC_CONFIG_ATM),y)
---- /dev/null
-+++ b/tc/q_codel.c
-@@ -0,0 +1,188 @@
-+/*
-+ * Codel - The Controlled-Delay Active Queue Management algorithm
-+ *
-+ *  Copyright (C) 2011-2012 Kathleen Nichols <nich...@pollere.com>
-+ *  Copyright (C) 2011-2012 Van Jacobson <v...@pollere.com>
-+ *  Copyright (C) 2012 Michael D. Taht <dave.t...@bufferbloat.net>
-+ *  Copyright (C) 2012 Eric Dumazet <eduma...@google.com>
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ *    notice, this list of conditions, and the following disclaimer,
-+ *    without modification.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ *    notice, this list of conditions and the following disclaimer in the
-+ *    documentation and/or other materials provided with the distribution.
-+ * 3. The names of the authors may not be used to endorse or promote products
-+ *    derived from this software without specific prior written permission.
-+ *
-+ * Alternatively, provided that this notice is retained in full, this
-+ * software may be distributed under the terms of the GNU General
-+ * Public License ("GPL") version 2, in which case the provisions of the
-+ * GPL apply INSTEAD OF those given above.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-+ * DAMAGE.
-+ *
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <syslog.h>
-+#include <fcntl.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <string.h>
-+
-+#include "utils.h"
-+#include "tc_util.h"
-+
-+static void explain(void)
-+{
-+	fprintf(stderr, "Usage: ... codel [ limit PACKETS ] [ target TIME]\n");
-+	fprintf(stderr, "                 [ interval TIME ] [ ecn ]\n");
-+}
-+
-+static int codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
-+			   struct nlmsghdr *n)
-+{
-+	unsigned limit = 0;
-+	unsigned target = 0;
-+	unsigned interval = 0;
-+	int ecn = -1;
-+	struct rtattr *tail;
-+
-+	while (argc > 0) {
-+		if (strcmp(*argv, "limit") == 0) {
-+			NEXT_ARG();
-+			if (get_unsigned(&limit, *argv, 0)) {
-+				fprintf(stderr, "Illegal \"limit\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "target") == 0) {
-+			NEXT_ARG();
-+			if (get_time(&target, *argv)) {
-+				fprintf(stderr, "Illegal \"target\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "interval") == 0) {
-+			NEXT_ARG();
-+			if (get_time(&interval, *argv)) {
-+				fprintf(stderr, "Illegal \"interval\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "ecn") == 0) {
-+			ecn = 1;
-+		} else if (strcmp(*argv, "noecn") == 0) {
-+			ecn = 0;
-+		} else if (strcmp(*argv, "help") == 0) {
-+			explain();
-+			return -1;
-+		} else {
-+			fprintf(stderr, "What is \"%s\"?\n", *argv);
-+			explain();
-+			return -1;
-+		}
-+		argc--; argv++;
-+	}
-+
-+	tail = NLMSG_TAIL(n);
-+	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
-+	if (limit)
-+		addattr_l(n, 1024, TCA_CODEL_LIMIT, &limit, sizeof(limit));
-+	if (interval)
-+		addattr_l(n, 1024, TCA_CODEL_INTERVAL, &interval, sizeof(interval));
-+	if (target)
-+		addattr_l(n, 1024, TCA_CODEL_TARGET, &target, sizeof(target));
-+	if (ecn != -1)
-+		addattr_l(n, 1024, TCA_CODEL_ECN, &ecn, sizeof(ecn));
-+	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
-+	return 0;
-+}
-+
-+static int codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
-+{
-+	struct rtattr *tb[TCA_CODEL_MAX + 1];
-+	unsigned limit;
-+	unsigned interval;
-+	unsigned target;
-+	unsigned ecn;
-+	SPRINT_BUF(b1);
-+
-+	if (opt == NULL)
-+		return 0;
-+
-+	parse_rtattr_nested(tb, TCA_CODEL_MAX, opt);
-+
-+	if (tb[TCA_CODEL_LIMIT] &&
-+	    RTA_PAYLOAD(tb[TCA_CODEL_LIMIT]) >= sizeof(__u32)) {
-+		limit = rta_getattr_u32(tb[TCA_CODEL_LIMIT]);
-+		fprintf(f, "limit %up ", limit);
-+	}
-+	if (tb[TCA_CODEL_TARGET] &&
-+	    RTA_PAYLOAD(tb[TCA_CODEL_TARGET]) >= sizeof(__u32)) {
-+		target = rta_getattr_u32(tb[TCA_CODEL_TARGET]);
-+		fprintf(f, "target %s ", sprint_time(target, b1));
-+	}
-+	if (tb[TCA_CODEL_INTERVAL] &&
-+	    RTA_PAYLOAD(tb[TCA_CODEL_INTERVAL]) >= sizeof(__u32)) {
-+		interval = rta_getattr_u32(tb[TCA_CODEL_INTERVAL]);
-+		fprintf(f, "interval %s ", sprint_time(interval, b1));
-+	}
-+	if (tb[TCA_CODEL_ECN] &&
-+	    RTA_PAYLOAD(tb[TCA_CODEL_ECN]) >= sizeof(__u32)) {
-+		ecn = rta_getattr_u32(tb[TCA_CODEL_ECN]);
-+		if (ecn)
-+			fprintf(f, "ecn ");
-+	}
-+
-+	return 0;
-+}
-+
-+static int codel_print_xstats(struct qdisc_util *qu, FILE *f,
-+			      struct rtattr *xstats)
-+{
-+	struct tc_codel_xstats *st;
-+	SPRINT_BUF(b1);
-+
-+	if (xstats == NULL)
-+		return 0;
-+
-+	if (RTA_PAYLOAD(xstats) < sizeof(*st))
-+		return -1;
-+
-+	st = RTA_DATA(xstats);
-+	fprintf(f, "  count %u lastcount %u ldelay %s",
-+		st->count, st->lastcount, sprint_time(st->ldelay, b1));
-+	if (st->dropping)
-+		fprintf(f, " dropping");
-+	if (st->drop_next < 0)
-+		fprintf(f, " drop_next -%s", sprint_time(-st->drop_next, b1));
-+	else
-+		fprintf(f, " drop_next %s", sprint_time(st->drop_next, b1));
-+	fprintf(f, "\n  maxpacket %u ecn_mark %u drop_overlimit %u",
-+		st->maxpacket, st->ecn_mark, st->drop_overlimit);
-+	return 0;
-+
-+}
-+
-+struct qdisc_util codel_qdisc_util = {
-+	.id		= "codel",
-+	.parse_qopt	= codel_parse_opt,
-+	.print_qopt	= codel_print_opt,
-+	.print_xstats	= codel_print_xstats,
-+};
---- /dev/null
-+++ b/tc/q_fq_codel.c
-@@ -0,0 +1,232 @@
-+/*
-+ * Fair Queue Codel
-+ *
-+ *  Copyright (C) 2012 Eric Dumazet <eduma...@google.com>
-+ *
-+ * Redistribution and use in source and binary forms, with or without
-+ * modification, are permitted provided that the following conditions
-+ * are met:
-+ * 1. Redistributions of source code must retain the above copyright
-+ *    notice, this list of conditions, and the following disclaimer,
-+ *    without modification.
-+ * 2. Redistributions in binary form must reproduce the above copyright
-+ *    notice, this list of conditions and the following disclaimer in the
-+ *    documentation and/or other materials provided with the distribution.
-+ * 3. The names of the authors may not be used to endorse or promote products
-+ *    derived from this software without specific prior written permission.
-+ *
-+ * Alternatively, provided that this notice is retained in full, this
-+ * software may be distributed under the terms of the GNU General
-+ * Public License ("GPL") version 2, in which case the provisions of the
-+ * GPL apply INSTEAD OF those given above.
-+ *
-+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
-+ * DAMAGE.
-+ *
-+ */
-+
-+#include <stdio.h>
-+#include <stdlib.h>
-+#include <unistd.h>
-+#include <syslog.h>
-+#include <fcntl.h>
-+#include <sys/socket.h>
-+#include <netinet/in.h>
-+#include <arpa/inet.h>
-+#include <string.h>
-+
-+#include "utils.h"
-+#include "tc_util.h"
-+
-+static void explain(void)
-+{
-+	fprintf(stderr, "Usage: ... fq_codel [ limit PACKETS ] [ flows NUMBER ]\n");
-+	fprintf(stderr, "                    [ target TIME] [ interval TIME ]\n");
-+	fprintf(stderr, "                    [ quantum BYTES ] [ [no]ecn ]\n");
-+}
-+
-+static int fq_codel_parse_opt(struct qdisc_util *qu, int argc, char **argv,
-+			      struct nlmsghdr *n)
-+{
-+	unsigned limit = 0;
-+	unsigned flows = 0;
-+	unsigned target = 0;
-+	unsigned interval = 0;
-+	unsigned quantum = 0;
-+	int ecn = -1;
-+	struct rtattr *tail;
-+
-+	while (argc > 0) {
-+		if (strcmp(*argv, "limit") == 0) {
-+			NEXT_ARG();
-+			if (get_unsigned(&limit, *argv, 0)) {
-+				fprintf(stderr, "Illegal \"limit\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "flows") == 0) {
-+			NEXT_ARG();
-+			if (get_unsigned(&flows, *argv, 0)) {
-+				fprintf(stderr, "Illegal \"flows\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "quantum") == 0) {
-+			NEXT_ARG();
-+			if (get_unsigned(&quantum, *argv, 0)) {
-+				fprintf(stderr, "Illegal \"quantum\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "target") == 0) {
-+			NEXT_ARG();
-+			if (get_time(&target, *argv)) {
-+				fprintf(stderr, "Illegal \"target\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "interval") == 0) {
-+			NEXT_ARG();
-+			if (get_time(&interval, *argv)) {
-+				fprintf(stderr, "Illegal \"interval\"\n");
-+				return -1;
-+			}
-+		} else if (strcmp(*argv, "ecn") == 0) {
-+			ecn = 1;
-+		} else if (strcmp(*argv, "noecn") == 0) {
-+			ecn = 0;
-+		} else if (strcmp(*argv, "help") == 0) {
-+			explain();
-+			return -1;
-+		} else {
-+			fprintf(stderr, "What is \"%s\"?\n", *argv);
-+			explain();
-+			return -1;
-+		}
-+		argc--; argv++;
-+	}
-+
-+	tail = NLMSG_TAIL(n);
-+	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
-+	if (limit)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_LIMIT, &limit, sizeof(limit));
-+	if (flows)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_FLOWS, &flows, sizeof(flows));
-+	if (quantum)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_QUANTUM, &quantum, sizeof(quantum));
-+	if (interval)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_INTERVAL, &interval, sizeof(interval));
-+	if (target)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_TARGET, &target, sizeof(target));
-+	if (ecn != -1)
-+		addattr_l(n, 1024, TCA_FQ_CODEL_ECN, &ecn, sizeof(ecn));
-+	tail->rta_len = (void *) NLMSG_TAIL(n) - (void *) tail;
-+	return 0;
-+}
-+
-+static int fq_codel_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
-+{
-+	struct rtattr *tb[TCA_FQ_CODEL_MAX + 1];
-+	unsigned limit;
-+	unsigned flows;
-+	unsigned interval;
-+	unsigned target;
-+	unsigned ecn;
-+	unsigned quantum;
-+	SPRINT_BUF(b1);
-+
-+	if (opt == NULL)
-+		return 0;
-+
-+	parse_rtattr_nested(tb, TCA_FQ_CODEL_MAX, opt);
-+
-+	if (tb[TCA_FQ_CODEL_LIMIT] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_LIMIT]) >= sizeof(__u32)) {
-+		limit = rta_getattr_u32(tb[TCA_FQ_CODEL_LIMIT]);
-+		fprintf(f, "limit %up ", limit);
-+	}
-+	if (tb[TCA_FQ_CODEL_FLOWS] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_FLOWS]) >= sizeof(__u32)) {
-+		flows = rta_getattr_u32(tb[TCA_FQ_CODEL_FLOWS]);
-+		fprintf(f, "flows %u ", flows);
-+	}
-+	if (tb[TCA_FQ_CODEL_QUANTUM] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_QUANTUM]) >= sizeof(__u32)) {
-+		quantum = rta_getattr_u32(tb[TCA_FQ_CODEL_QUANTUM]);
-+		fprintf(f, "quantum %u ", quantum);
-+	}
-+	if (tb[TCA_FQ_CODEL_TARGET] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_TARGET]) >= sizeof(__u32)) {
-+		target = rta_getattr_u32(tb[TCA_FQ_CODEL_TARGET]);
-+		fprintf(f, "target %s ", sprint_time(target, b1));
-+	}
-+	if (tb[TCA_FQ_CODEL_INTERVAL] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_INTERVAL]) >= sizeof(__u32)) {
-+		interval = rta_getattr_u32(tb[TCA_FQ_CODEL_INTERVAL]);
-+		fprintf(f, "interval %s ", sprint_time(interval, b1));
-+	}
-+	if (tb[TCA_FQ_CODEL_ECN] &&
-+	    RTA_PAYLOAD(tb[TCA_FQ_CODEL_ECN]) >= sizeof(__u32)) {
-+		ecn = rta_getattr_u32(tb[TCA_FQ_CODEL_ECN]);
-+		if (ecn)
-+			fprintf(f, "ecn ");
-+	}
-+
-+	return 0;
-+}
-+
-+static int fq_codel_print_xstats(struct qdisc_util *qu, FILE *f,
-+				 struct rtattr *xstats)
-+{
-+	struct tc_fq_codel_xstats *st;
-+	SPRINT_BUF(b1);
-+
-+	if (xstats == NULL)
-+		return 0;
-+
-+	if (RTA_PAYLOAD(xstats) < sizeof(*st))
-+		return -1;
-+
-+	st = RTA_DATA(xstats);
-+	if (st->type == TCA_FQ_CODEL_XSTATS_QDISC) {
-+		fprintf(f, "  maxpacket %u drop_overlimit %u new_flow_count %u ecn_mark %u",
-+			st->qdisc_stats.maxpacket,
-+			st->qdisc_stats.drop_overlimit,
-+			st->qdisc_stats.new_flow_count,
-+			st->qdisc_stats.ecn_mark);
-+		fprintf(f, "\n  new_flows_len %u old_flows_len %u",
-+			st->qdisc_stats.new_flows_len,
-+			st->qdisc_stats.old_flows_len);
-+	}
-+	if (st->type == TCA_FQ_CODEL_XSTATS_CLASS) {
-+		fprintf(f, "  deficit %d count %u lastcount %u ldelay %s",
-+			st->class_stats.deficit,
-+			st->class_stats.count,
-+			st->class_stats.lastcount,
-+			sprint_time(st->class_stats.ldelay, b1));
-+		if (st->class_stats.dropping) {
-+			fprintf(f, " dropping");
-+			if (st->class_stats.drop_next < 0)
-+				fprintf(f, " drop_next -%s",
-+					sprint_time(-st->class_stats.drop_next, b1));
-+			else
-+				fprintf(f, " drop_next %s",
-+					sprint_time(st->class_stats.drop_next, b1));
-+		}
-+	}
-+	return 0;
-+
-+}
-+
-+struct qdisc_util fq_codel_qdisc_util = {
-+	.id		= "fq_codel",
-+	.parse_qopt	= fq_codel_parse_opt,
-+	.print_qopt	= fq_codel_print_opt,
-+	.print_xstats	= fq_codel_print_xstats,
-+};
-- 
1.7.12

Attachment: signature.asc
Description: This is a digitally signed message part.

_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to