From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 6 Apr 2008 17:13:00 +0000 (+0000)
Subject: revert iproute2 to the old version until the new one is fixed (#3026)
X-Git-Url: http://git.cdn.openwrt.org/?a=commitdiff_plain;h=88cb2e91d6f432f87c7792fd0b67b5906d67f5b3;p=openwrt%2Fstaging%2Fdangole.git

revert iproute2 to the old version until the new one is fixed (#3026)

SVN-Revision: 10744
---

diff --git a/package/iproute2/Makefile b/package/iproute2/Makefile
index 7cbc903da7..65557f274b 100644
--- a/package/iproute2/Makefile
+++ b/package/iproute2/Makefile
@@ -9,14 +9,14 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=iproute2
-PKG_VERSION:=2.6.23
+PKG_VERSION:=2.6.20-070313
 PKG_RELEASE:=1
 
-PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
+PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
 PKG_SOURCE_URL:=http://developer.osdl.org/dev/iproute2/download/
-PKG_MD5SUM:=2e59da739ef19990408cf0a5cb0cae3e
+PKG_MD5SUM:=7bc5883aadf740761fa2dd70b661e8cc
 
-PKG_BUILD_DIR:=$(BUILD_DIR)/iproute2-$(PKG_VERSION)
+PKG_BUILD_DIR:=$(BUILD_DIR)/iproute-$(PKG_VERSION)
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/package/iproute2/patches/000-debian_patches_3.patch b/package/iproute2/patches/000-debian_patches_3.patch
index 81981dd4d4..58660388d8 100644
--- a/package/iproute2/patches/000-debian_patches_3.patch
+++ b/package/iproute2/patches/000-debian_patches_3.patch
@@ -1,5 +1,7 @@
---- iproute-20071016.orig/doc/ip-cref.tex
-+++ iproute-20071016/doc/ip-cref.tex
+Index: iproute-2.6.20-070313/doc/ip-cref.tex
+===================================================================
+--- iproute-2.6.20-070313.orig/doc/ip-cref.tex	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/doc/ip-cref.tex	2007-06-09 13:53:57.000000000 +0100
 @@ -1322,6 +1322,19 @@
      If it is not given, Linux uses the value selected with \verb|sysctl|
      variable \verb|net/ipv4/tcp_reordering|.
@@ -30,8 +32,10 @@
  \end{thebibliography}
  
  
---- iproute-20071016.orig/doc/Makefile
-+++ iproute-20071016/doc/Makefile
+Index: iproute-2.6.20-070313/doc/Makefile
+===================================================================
+--- iproute-2.6.20-070313.orig/doc/Makefile	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/doc/Makefile	2007-06-09 13:53:57.000000000 +0100
 @@ -14,6 +14,7 @@
  PAGESPERPAGE=2
  
@@ -40,22 +44,21 @@
  DVIFILES=$(subst .ps,.dvi,$(PSFILES))
  
  
-@@ -25,6 +26,8 @@
+@@ -23,6 +24,8 @@
  
- dvi: $(DVIFILES)
+ html: $(HTMLFILES)
  
 +txt: $(TXTFILES)
 +
- print: $(PSFILES)
- 	$(LPR) $(PSFILES)
+ dvi: $(DVIFILES)
  
-@@ -47,9 +50,13 @@
+ print: $(PSFILES)
+@@ -47,9 +50,12 @@
  %.html: %.sgml
  	$(SGML2HTML) $<
  
 +%.txt: %.html
 +	lynx -nolist -dump $< > $@
-+		
 +
  install:
  	install -m 0644 $(shell echo *.tex) $(DESTDIR)$(DOCDIR)
@@ -64,2998 +67,1354 @@
  clean:
 -	rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html
 +	rm -f *.aux *.log *.toc $(PSFILES) $(DVIFILES) *.html $(TXTFILES)
---- iproute-20071016.orig/misc/Makefile
-+++ iproute-20071016/misc/Makefile
-@@ -1,7 +1,8 @@
- SSOBJ=ss.o ssfilter.o
- LNSTATOBJ=lnstat.o lnstat_util.o
- 
--TARGETS=ss nstat ifstat rtacct arpd lnstat
-+#TARGETS=ss nstat ifstat rtacct arpd lnstat
-+TARGETS=ss nstat rtacct lnstat arpd
- 
- include ../Config
- 
---- iproute-20071016.orig/lib/utils.c
-+++ iproute-20071016/lib/utils.c
-@@ -47,6 +47,48 @@
- 	return 0;
- }
- 
-+/* a valid netmask must be 2^n - 1 */
-+static int is_valid_netmask(const inet_prefix *addr)
-+{
-+        uint32_t host;
-+
-+        if (addr->family != AF_INET)
-+                return 0;
-+
-+        host = ~ntohl(addr->data[0]);
-+
-+        return (host & (host + 1)) == 0;
-+}
-+
-+static unsigned cidr(const inet_prefix *addr)
+Index: iproute-2.6.20-070313/include/linux/pkt_sched.h
+===================================================================
+--- iproute-2.6.20-070313.orig/include/linux/pkt_sched.h	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/include/linux/pkt_sched.h	2007-06-09 13:53:57.000000000 +0100
+@@ -1,3 +1,409 @@
++#if 0
++#ifndef __LINUX_PKT_SCHED_H
++#define __LINUX_PKT_SCHED_H
++
++/* Logical priority bands not depending on specific packet scheduler.
++   Every scheduler will map them to real traffic classes, if it has
++   no more precise mechanism to classify packets.
++
++   These numbers have no special meaning, though their coincidence
++   with obsolete IPv6 values is not occasional :-). New IPv6 drafts
++   preferred full anarchy inspired by diffserv group.
++
++   Note: TC_PRIO_BESTEFFORT does not mean that it is the most unhappy
++   class, actually, as rule it will be handled with more care than
++   filler or even bulk.
++ */
++
++#define TC_PRIO_BESTEFFORT		0
++#define TC_PRIO_FILLER			1
++#define TC_PRIO_BULK			2
++#define TC_PRIO_INTERACTIVE_BULK	4
++#define TC_PRIO_INTERACTIVE		6
++#define TC_PRIO_CONTROL			7
++
++#define TC_PRIO_MAX			15
++
++/* Generic queue statistics, available for all the elements.
++   Particular schedulers may have also their private records.
++ */
++
++struct tc_stats
 +{
-+	unsigned bits = 0;
-+	u_int32_t mask;
-+
-+	for (mask = ntohl(addr->data[0]); mask; mask <<= 1)
-+		++bits;
-+
-+	return bits;
-+}
++	__u64	bytes;			/* NUmber of enqueues bytes */
++	__u32	packets;		/* Number of enqueued packets	*/
++	__u32	drops;			/* Packets dropped because of lack of resources */
++	__u32	overlimits;		/* Number of throttle events when this
++					 * flow goes out of allocated bandwidth */
++	__u32	bps;			/* Current flow byte rate */
++	__u32	pps;			/* Current flow packet rate */
++	__u32	qlen;
++	__u32	backlog;
++#ifdef __KERNEL__
++	spinlock_t *lock;
++#endif
++};
 +
-+static int get_netmask(unsigned *val, const char *arg, int base)
++struct tc_estimator
 +{
-+	inet_prefix addr;
-+
-+	if (!get_unsigned(val, arg, base))
-+		return 0;
-+
-+	/* try coverting dotted quad to CIDR */
-+	if (!get_addr_1(&addr, arg, AF_INET)) {
-+		if (is_valid_netmask(&addr))
-+			return 0;
-+
-+	        *val = cidr(&addr);
-+	}
-+
-+	return -1;
-+}
-+
- int get_unsigned(unsigned *val, const char *arg, int base)
- {
- 	unsigned long res;
-@@ -304,7 +346,8 @@
- 				dst->bitlen = 32;
- 		}
- 		if (slash) {
--			if (get_unsigned(&plen, slash+1, 0) || plen > dst->bitlen) {
-+			if (get_netmask(&plen, slash+1, 0)
-+					|| plen > dst->bitlen) {
- 				err = -1;
- 				goto done;
- 			}
-@@ -642,9 +685,9 @@
- int cmdlineno;
- 
- /* Like glibc getline but handle continuation lines and comments */
--size_t getcmdline(char **linep, size_t *lenp, FILE *in)
-+ssize_t getcmdline(char **linep, size_t *lenp, FILE *in)
- {
--	size_t cc;
-+	ssize_t cc;
- 	char *cp;
- 
- 	if ((cc = getline(linep, lenp, in)) < 0)
-@@ -672,9 +715,11 @@
- 		if (cp)
- 			*cp = '\0';
- 
--		*linep = realloc(*linep, strlen(*linep) + strlen(line1) + 1);
-+		*lenp = strlen(*linep) + strlen(line1) + 1;
-+		*linep = realloc(*linep, *lenp);
- 		if (!*linep) {
- 			fprintf(stderr, "Out of memory\n");
-+			*lenp = 0;
- 			return -1;
- 		}
- 		cc += cc1 - 2;
---- iproute-20071016.orig/include/utils.h
-+++ iproute-20071016/include/utils.h
-@@ -144,7 +144,7 @@
- #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
- 
- extern int cmdlineno;
--extern size_t getcmdline(char **line, size_t *len, FILE *in);
-+extern ssize_t getcmdline(char **line, size_t *len, FILE *in);
- extern int makeargs(char *line, char *argv[], int maxargs);
- 
- #endif /* __UTILS_H__ */
---- iproute-20071016.orig/tc/m_police.c
-+++ iproute-20071016/tc/m_police.c
-@@ -37,7 +37,7 @@
- 	fprintf(stderr, "Usage: ... police rate BPS burst BYTES[/BYTES] [ mtu BYTES[/BYTES] ]\n");
- 	fprintf(stderr, "                [ peakrate BPS ] [ avrate BPS ]\n");
- 	fprintf(stderr, "                [ ACTIONTERM ]\n");
--	fprintf(stderr, "Old Syntax ACTIONTERM := <EXCEEDACT>[/NOTEXCEEDACT] \n");
-+	fprintf(stderr, "Old Syntax ACTIONTERM := action <EXCEEDACT>[/NOTEXCEEDACT] \n");
- 	fprintf(stderr, "New Syntax ACTIONTERM := conform-exceed <EXCEEDACT>[/NOTEXCEEDACT] \n");
- 	fprintf(stderr, "Where: *EXCEEDACT := pipe | ok | reclassify | drop | continue \n");
- 	fprintf(stderr, "Where:  pipe is only valid for new syntax \n");
-@@ -237,8 +237,7 @@
- 		} else if (strcmp(*argv, "help") == 0) {
- 			usage();
- 		} else {
--			fprintf(stderr, "What is \"%s\"?\n", *argv);
--			return -1;
-+			break;
- 		}
- 		ok++;
- 		argc--; argv++;
---- iproute-20071016.orig/debian/doc/htb/htbfaq.htm
-+++ iproute-20071016/debian/doc/htb/htbfaq.htm
-@@ -0,0 +1,141 @@
-+<html><head><title>HTB FAQ</title></head>
-+<body>
-+<h1><center>HTB FAQ</center></h1>
-+<center><address>
-+Martin Devera aka devik (devik@cdi.cz)<br>
-+Last updated: 7.7.2003
-+</address></center>
-+<br>
-+<b>How to set single HTB up for more interfaces or for incoming packets</b>
-+<p>
-+You need IMQ for this because all qdisc can handle only outgoing
-+traffic on single interface. See 
-+<a href="http://www.linuximq.net/">http://www.linuximq.net/</a>.
-+<p>
-+<b>When HTB is used on machine with Apache (FTP, Samba, ...) server running
-+   then downloading from it can't be limited precisely</b>
-+<p>
-+Try to add PFIFO with limit 10 under HTB classes. When you use default
-+(much larger PFIFO) or SFQ then TCP stack will back off itself as it
-+see too large memory used for outgoing packets. You can also play
-+with /proc/sys/net/ipv4/tcp_wmem.
-+<p>
-+<b>"HTB: mindelay=500, report it please !" messages in syslog</b>
-+<p>
-+This means that all indicated that some class should be ready
-+soon but when we looked for it we haven't found one which will
-+be ready in 5 seconds.
-+<br>
-+After this message you can see lines like
-+<pre>
-+kernel: htb*g j=154480191
-+kernel: htb*r7 m=0
-+kernel: htb*r6 m=0
-+kernel: htb*r5 m=0
-+kernel: htb*r4 m=0
-+kernel: htb*r3 m=0
-+kernel: htb*r2 m=0
-+kernel: htb*r1 m=0
-+kernel: htb*r0 m=0
-+kernel: htb*c20110 m=2 t=636487 c=17888 pq=0 df=483328 ql=0 pa=0 f:
-+kernel: htb*c20220 m=1 t=-59999999 c=42404 pq=154487461 df=450560 ql=14 pa=40 f:
-+kernel: htb*c20001 m=2 t=5131 c=6439 pq=0 df=8192 ql=0 pa=0 f:
-+</pre>
-+If you decide to treat is as real bug then I'll need all of these. They
-+are logged under kernel.debug facility so often you need to add it so
-+your syslog.conf. These "htb*" are dump of internal state of all classes.
-+c20110 means class 2:110. *r lines are states of row activity bitsmasks.
-+*c indicates stet of all classes. You are interested in classes
-+with m=1 resp. m=0. These will become ready after time -c resp. -t whatever
-+is negative and smaller.
-+It is 59999999 us for class 2:110 above which is 59sec. It is way too much
-+and HTB will spill that error because it is &gt; 5 sec.
-+<p>
-+<i>So what is the problem ?</i> Probably you have too small rate or ceil
-+for such class - you should use at least 4kbit for realiable operation
-+of HTB - it leads to max 3sec of delay for 1500 byte packets which seems
-+as reasonable value.
-+<br>
-+Also try <a href=v3/htb_3.7_delay_bug.patch>this</a> patch against 2.4.20.
-+(works against older too with one reject). It increases timeout to
-+10secs and makes errors more readable. 
-+<i>I'm interested in your experiences (good or bad) with the patch !</i>
-+<br>
-+If you think it is not the case and you still get weird errors, contact
-+me with syslog data above and output of commands
-+<pre>
-+tc -s -d qdisc
-+tc -s -d class show dev your_htb_device1_here
-+tc -s -d class show dev your_htb_device2_here
-+...
-+</pre>
-+
-+<p>
-+<b>Why HTB sharing setup works with eth0 but on lo (loopback) 
-+	it exhibits weird rates ?
-+</b>
-+<p>Try to execute 
-+<pre>
-+ifconfig lo mtu 1500
-+</pre>
-+or use parameter mtu 16400 on "tc qdisc add" line. It is because
-+HTB reserves rate table for 1500 bytes long packets and loopback
-+uses 16384 as default.
-+<p>
-+<b>What's difference between kbps and kbit ?
-+</b>
-+<p>
-+1kbps=8kbit. Don't forget it !
-+<p>
-+<b>What if sum of child rates is smaller than parent rate ?
-+</b>
-+<p>
-+It is like if you create unused child with remaining rate - the
-+rate difference is divided between other children.
-+<p>
-+<b>What if sum of child rates is greater than parent rate ?
-+</b>
-+<p>
-+Then interesting things can happen. Total rate delivered
-+by children can be higher that parent's rate (thus its rate
-+is not respected). However when sum of actual child rates are
-+under parent's rate then borrowing will occur like in regular case.
-+<p>
-+I use setup with 4 classes, parent has rate=ceil=6kbps, child
-+"mail" has rate=1kbps ceil=4kbps, "web" has rate=ceil=15kbps
-+and "other" has rate=2kbps ceil=4kbps.
-+HTB is attached to an PPP interface with compressed multilink pair
-+of modems which can go from 6kbps to cca 16kbps (depends on compresability
-+of data). When "web" traffic is present it can go as high as compression
-+allows while still allowing mail 1kbps and other 2kbps.
-+<br>
-+When "web" traffic is smaller than 6kbps then "mail" and "other" 
-+can borrow more bw up to 4k each.
-+Parent's class it not set to 18k because then "mail" and "other"
-+could get as much as 8k which is more that link's minimum and
-+would saturate the link. Thus I set parent to 6k so that 
-+"mail"+"other" are limited to 6k while "web" can go over.
-+<p>
-+You can do similar setup by using one more class and deeper hierarchy
-+but this is just to show you the possibility.
-+<p>
-+<b>"RTNETLINK answers: Invalid argument" and tc parameters are correct
-+</b>
-+<p>
-+Probably you use tc tool not suited for HTB in kernel. Reread
-+main HTB page section Downloads.
-+<p>
-+<b>All packets are dropped when "default" is set to nonleaf
-+</b>
-+<p>
-+Yes. Default kwyword must point to leaf or be 0 (so unclassified
-+packets go thru directly). If you want to "direct" other packets
-+to non-leaf do it by catch all filter with the largest "pref".
-+<p>
-+<b>What tool was used to create graphs in HTB manual ?
-+</b>
-+<p>
-+It is proprietary tool called ethloop 
-+(<a href=http://luxik.cdi.cz/~devik/qos/ethloop/>luxik.cdi.cz/~devik/qos/ethloop/</a>).
-+
-+</body></html>
---- iproute-20071016.orig/debian/doc/htb/userg.htm
-+++ iproute-20071016/debian/doc/htb/userg.htm
-@@ -0,0 +1,449 @@
-+<html><head><title>HTB manual - user guide</title></head>
-+<body>
-+<h1><center>HTB Linux queuing discipline manual - user guide</center></h1>
-+<center><address>
-+Martin Devera aka devik (devik@cdi.cz)<br>
-+Manual: devik and Don Cohen<br>
-+Last updated: 5.5.2002
-+</address></center>
-+<br>
-+New text is in red color. Coloring is removed on new text
-+after 3 months. Currently they depicts HTB3 changes<p>
-+<p>
-+<ul>
-+<li><a href=#intro>1. Introduction</a>
-+<li><a href=#sharing>2. Link sharing</a>
-+<li><a href=#hsharing>3. Sharing hierarchy</a>
-+<li><a href=#ceiling>4. Rate ceiling</a>
-+<li><a href=#burst>5. Burst</a>
-+<li><a href=#prio>6. Priorizing bandwidth share</a>
-+<li><a href=#stats>7. Understanding statistics</a>
-+<li><a href=#err>8. Making, debugging and sending error reports</a>
-+</ul>
-+<a name=intro><h2>1. Introduction</h2>
-+
-+HTB is meant as a more understandable, intuitive and faster replacement for the
-+CBQ qdisc in Linux.  Both CBQ and HTB help you to control the
-+use of the outbound bandwidth on a given link.  Both allow you to use
-+one physical link to simulate several slower links and to send different 
-+kinds of traffic on different simulated links.  In both cases, you have
-+to specify how to divide the physical link into simulated links and how
-+to decide which simulated link to use for a given packet to be sent.
-+<p>
-+This document shows you how to use HTB. 
-+Most sections have examples, charts (with measured data) and
-+discussion of particular problems.
-+<p>
-+This release of HTB should be also much more scalable. See
-+comparison at HTB home page.
-+<p>
-+<b>Please read:</b> tc tool (not only HTB) uses shortcuts to denote units
-+of rate. <b>kbps</b> means kilo<b>bytes</b> and <b>kbit</b> means 
-+<b>kilobits</b> ! This is the most FAQ about tc in linux.
-+<p>
-+
-+<a name=sharing><h2>2. Link sharing</h2>
-+<img src=Ag2Leaf3flat.gif align=right>
-+
-+<i>Problem: We have two customers, A and B, both connected to the
-+internet via eth0.  We want to allocate 60 kbps to B and 40 kbps to A.
-+Next we want to subdivide A's bandwidth 30kbps for WWW and 10kbps
-+for everything else.  Any unused bandwidth can be used by any class 
-+which needs it (in proportion of its allocated share).</i>
-+<p>
-+HTB ensures that <b> the amount of service provided to each class is
-+at least the minimum of the amount it requests and the amount assigned
-+to it</b>.  When a class requests less than the amount assigned, the 
-+remaining (excess) bandwidth is distributed to other classes which request 
-+service.<p>
-+Also see document about HTB internals - it
-+describes goal above in greater details.
-+<p>
-+<i>Note: In the literature this is called "borrowing" the excess bandwidth.
-+We use that term below to conform with the literature.  We mention, however,
-+that this seems like a bad term since there is no obligation to repay the
-+resource that was "borrowed".
-+</i>
-+<p>
-+The different kinds of traffic above are represented by classes in
-+HTB.  The simplest approach is shown in the picture at the right. 
-+<br>
-+Let's see what commands to use:
-+<pre>
-+tc qdisc add dev eth0 root handle 1: htb default 12
-+</pre>
-+This command attaches queue discipline HTB to eth0 and gives it the 
-+"handle" <b>1:</b>.
-+This is just a name or identifier with which to refer to it below. 
-+The <b>default 12</b>
-+means that any traffic that is not otherwise classified will be assigned 
-+to class 1:12. 
-+<p>
-+<i>Note: 
-+In general (not just for HTB but for all qdiscs and classes in tc),
-+handles are written x:y where x is an integer identifying a qdisc and
-+y is an integer identifying a class belonging to that qdisc.  The handle 
-+for a qdisc must have zero for its y value and the handle for a class
-+must have a non-zero value for its y value.  The "1:" above is treated
-+as "1:0".
-+</i>
-+<p>
-+<pre>
-+tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps 
-+tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps
-+tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps
-+tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps
-+</pre>
-+<p>
-+The first line creates a "root" class, 1:1 under the qdisc 1:. 
-+The definition of a root class is one with the htb qdisc as its parent.
-+A root class, like other classes under an htb qdisc allows its children
-+to borrow from each other, but one root class cannot borrow from another.  
-+We could have created the other three classes directly under the htb qdisc, 
-+but then the excess bandwidth from one would not be available to the others.
-+In this case we do want to allow borrowing, so we have to create an extra
-+class to serve as the root and put the classes that will carry the real data
-+under that.  These are defined by the next three lines.
-+The <b>ceil</b> parameter is described below. 
-+<p><i>Note: Sometimes people ask me why they have to repeat <b>dev eth0</b> 
-+when they have already used <b>handle</b> or <b>parent</b>.  The reason 
-+is that handles are local to an interface, e.g., eth0 and eth1 could each 
-+have classes with handle 1:1.</i>
-+<p>
-+We also have to describe which packets belong in which class.
-+This is really not related to the HTB qdisc.  See the tc filter
-+documentation for details.  The commands will look something like this:
-+<pre>
-+tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
-+   match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10
-+tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 \
-+   match ip src 1.2.3.4 flowid 1:11
-+</pre>
-+(We identify A by its IP address which we imagine here to be 1.2.3.4.)
-+<p><i>Note: The U32 classifier has an undocumented design bug which causes 
-+duplicate entries to be listed by "tc filter show" when you use U32 
-+classifiers with different prio values.</i>
-+<img src=flatnp.gif align=right>
-+<p>
-+You may notice that we didn't create a filter for the 1:12 class. 
-+It might be more clear to do so, but this illustrates the use of the default.
-+Any packet not classified by the two rules above (any packet
-+not from source address 1.2.3.4) will be put in class 1:12.
-+<p>
-+Now we can optionally attach queuing disciplines to the leaf classes.
-+If none is specified the default is pfifo.
-+<pre>
-+tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
-+tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
-+tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10
-+</pre>
-+That's all the commands we need.  Let's see what happens if we send
-+packets of each class at 90kbps and then stop sending packets of one
-+class at a time.  Along the bottom of the graph are annotations 
-+like "0:90k".  The horizontal position at the center of the label 
-+(in this case near the 9, also marked with a red "1") indicates the
-+time at which the rate of some traffic class changes.  
-+Before the colon is an identifier for
-+the class (0 for class 1:10, 1 for class 1:11, 2 for class 1:12) and
-+after the colon is the new rate starting at the time where the 
-+annotation appears.  For example, the rate of class 0 is changed to
-+90k at time 0, 0 (= 0k) at time 3, and back to 90k at time 6.
-+<p>
-+Initially all classes generate 90kb.  Since this is higher than any
-+of the rates specified, each class is limited to its 
-+specified rate.  At time 3 when we stop sending class 0 packets, the
-+rate allocated to class 0 is reallocated to the other two
-+classes in proportion to their allocations, 1 part class 1 to 6 parts class 2.
-+(The increase in class 1 is hard to see because it's only 4 kbps.)
-+Similarly at time 9 when class 1 traffic stops its bandwidth is
-+reallocated to the other two (and the increase in class 0 is similarly hard
-+to see.)  At time 15 it's easier to see that the allocation to class 2 is
-+divided 3 parts for class 0 to 1 part for class 1.  At time 18 both class 1 and
-+class 2 stop so class 0 gets all 90 kbps it requests.
-+<p>
-+It might be good time to touch concept of <b>quantums</b> now. In fact when
-+more classes want to borrow bandwidth they are each given some number of
-+bytes before serving other competing class. This number is called quantum.
-+You should see that if several classes are competing for parent's bandwidth
-+then they get it in proportion of their quantums. It is important to know
-+that for precise operation quantums need to be as small as possible and
-+larger than MTU.
-+<br>
-+Normaly you don't need to specify quantums manualy as HTB chooses precomputed
-+values. It computes classe's quantum (when you add or change it) as its
-+rate divided by <b>r2q</b> global parameter. Its default value is 10
-+and because typical MTU is 1500 the default is good for rates from
-+15 kBps (120 kbit). For smaller minimal rates specify r2q 1 when
-+creating qdisc - it is good from 12 kbit which should be enough. If
-+you will need you can specify quantum manualy when adding or changing
-+the class. You can avoid warnings in log if precomputed value would be
-+bad. When you specify quantum on command line the r2q is ignored for
-+that class.
-+<p>
-+This might seem like a good solution if A and B were not different
-+customers.  However, if A is paying for 40kbps then he would probably
-+prefer his unused WWW bandwidth to go to his own other service rather 
-+than to B.  This requirement is represented in HTB by the class hierarchy.
-+
-+<img src=Ag2Leaf3hier.gif align=right>
-+<a name=hsharing><h2>3. Sharing hierarchy</h2>
-+The problem from the previous chapter is solved by the class hierarchy
-+in this picture.  Customer A is now explicitly represented by its own
-+class.  Recall from above that
-+<b> the amount of service provided to each class is at least the 
-+minimum of the amount it requests and the amount assigned to it</b>.  
-+This applies to htb classes that are not parents of other htb classes.
-+We call these leaf classes.
-+For htb classes that are parents of other htb classes, which we call
-+interior classes, the rule is that
-+<b> the amount of service is at least the minumum of the amount assigned 
-+to it and the sum of the amount requested by its children</b>.
-+In this case we assign 40kbps to customer A.  That means that if A 
-+requests less than the allocated rate for WWW, the excess will be used 
-+for A's other traffic (if there is demand for it), at least until the sum is
-+40kbps.
-+<p>
-+<i>Notes: Packet classification rules can assign to inner nodes too. Then
-+you have to attach other filter list to inner node. Finally you should
-+reach leaf or special 1:0 class. The rate supplied for a parent should be the sum
-+of the rates of its children. </i>
-+<p>The commands are now as follows:
-+<pre>
-+tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
-+tc class add dev eth0 parent 1:1 classid 1:2 htb rate 40kbps ceil 100kbps
-+tc class add dev eth0 parent 1:2 classid 1:10 htb rate 30kbps ceil 100kbps
-+tc class add dev eth0 parent 1:2 classid 1:11 htb rate 10kbps ceil 100kbps
-+tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps
-+</pre>
-+<img src=hiernp.gif align=right>
-+<p>
-+We now turn to the graph showing the results of the hierarchical solution.
-+When A's WWW traffic stops, its assigned bandwidth is reallocated to A's 
-+other traffic so that A's total bandwidth is still the assigned 40kbps.<br>
-+If A were to request less than 40kbs in total then the excess would be given to B.
-+
-+<a name=ceiling><h2>4. Rate ceiling</h2>
-+The <b>ceil</b> argument specifies the maximum bandwidth that a class
-+can use.  This limits how much bandwidth that class can borrow.
-+The default ceil is the same as the rate.  (That's why we had to specify 
-+it in the examples above to show borrowing.)
-+We now change the <b>ceil 100kbps</b> for classes 1:2 (A) and 1:11 
-+(A's other) from the previous chapter to <b>ceil 60kbps</b> and 
-+<b>ceil 20kbps</b>.
-+<p>
-+The graph at right differs from the previous one at time 3 (when WWW 
-+traffic stops) because A/other is limited to 20kbps.  Therefore customer 
-+A gets only 20kbps in total and the unused 20kbps is allocated to B.<br>  
-+The second difference is at time 15 when B stops.  Without the ceil, 
-+all of its bandwidth was given to A, but now A is only allowed to use 
-+60kbps, so the remaining 40kbps goes unused.
-+<img src=hiernpceil.gif align=right>
-+<p>
-+This feature should be useful for ISPs because they probably want to
-+limit the amount of service a given customer gets even when other 
-+customers are not requesting service.  (ISPs probably want customers 
-+to pay more money for better service.)
-+Note that root classes are not allowed to borrow, so there's really no
-+point in specifying a ceil for them.
-+<p>
-+<i>Notes: The ceil for a class should always be at least as high as the rate. 
-+Also, the ceil for a class should always be at least as high as the ceil of
-+any of its children.</i>
-+
-+<a name=burst><h2>5. Burst</h2>
-+
-+Networking hardware can only send one packet at a time and only at 
-+a hardware dependent rate.  Link sharing software can only use this
-+ability to approximate the effects of multiple links running at 
-+different (lower) speeds.  Therefore the rate and ceil are not really 
-+instantaneous measures but averages over the time that it takes to send 
-+many packets.  What really happens is that the traffic from one class
-+is sent a few packets at a time at the maximum speed and then other
-+classes are served for a while.
-+
-+The <b>burst</b> and <b>cburst</b> parameters control the amount of data
-+that can be sent at the maximum (hardware) speed without trying to serve
-+another class.
-+<p>
-+If <b>cburst</b> is smaller (ideally one packet size) it shapes bursts to not exceed 
-+<b>ceil</b> rate in the same way as TBF's peakrate does.<p>
-+When you set <b>burst</b> for parent class smaller than for some child
-+then you should expect the parent class to get stuck sometimes (because
-+child will drain more than parent can handle). HTB will remember these
-+negative bursts up to 1 minute.
-+<p>
-+You can ask <b>why I want bursts</b>. Well it is cheap and simple way
-+how to improve response times on congested link. For example www traffic
-+is bursty. You ask for page, get it in burst and then read it. During
-+that idle period burst will "charge" again. 
-+<p>
-+<i>Note: The burst and cburst of a class should always be at least
-+as high as that of any of it children.</i>
-+<p>
-+<img src=hiernpburst.gif align=right>
-+On graph you can see case from previous chapter where I changed burst
-+for red and yellow (agency A) class to 20kb but cburst remained
-+default (cca 2 kb).<br>
-+Green hill is at time 13 due to burst setting on SMTP class.
-+A class. It has underlimit since time 9 and accumulated 20 kb of burst.
-+The hill is high up to 20 kbps (limited by ceil because it has cburst
-+near packet size).<br>
-+Clever reader can think why there is not red and yellow hill at time
-+7. It is because yellow is already at ceil limit so it has no space
-+for furtner bursts.<br>
-+There is at least one unwanted artifact - magenta crater at time 4. It
-+is because I intentionaly "forgot" to add burst to root link (1:1) class.
-+It remembered hill from time 1 and when at time 4 blue class wanted to 
-+borrow yellow's rate it denied it and compensated itself.
-+<p>
-+<b>Limitation:</b> when you operate with high rates on computer with low
-+resolution timer you need some minimal <b>burst</b> and <b>cburst</b> to 
-+be set for all classes. Timer resolution on i386 systems is 10ms and
-+1ms on Alphas.
-+The minimal burst can be computed as max_rate*timer_resolution. So that
-+for 10Mbit on plain i386 you needs burst 12kb.<p>
-+If you set too small burst you will encounter smaller rate than you set.
-+Latest tc tool will compute and set the smallest possible burst when it
-+is not specified.
-+
-+<img src=hierprio.gif align=right>
-+<a name=prio><h2>6. Priorizing bandwidth share</h2>
-+Priorizing traffic has two sides. First it affects how the excess bandwidth
-+is distributed among siblings. Up to now we have seen that excess bandwidth
-+was distibuted according to rate ratios. Now I used basic configuration from
-+chapter 3 (hierarchy without ceiling and bursts) and changed priority of all
-+classes to 1 except SMTP (green) which I set to 0 (higher).<br>
-+From sharing view you see that the class got all the excess bandwidth. The
-+rule is that <b>classes with higher priority are offered excess bandwidth
-+first</b>. But rules about guaranted <b>rate</b> and <b>ceil</b> are still
-+met.<p>
-+There is also second face of problem. It is total delay of packet. It is relatively
-+hard to measure on ethernet which is too fast (delay is so neligible). But
-+there is simple help. We can add simple HTB with one class rate limiting to
-+less then 100 kbps and add second HTB (the one we are measuring) as child. Then we
-+can simulate slower link with larger delays.<br>
-+For simplicity sake I use simple two class scenario:
-+<pre>
-+# qdisc for delay simulation
-+tc qdisc add dev eth0 root handle 100: htb
-+tc class add dev eth0 parent 100: classid 100:1 htb rate 90kbps
-+
-+# real measured qdisc
-+tc qdisc add dev eth0 parent 100:1 handle 1: htb
-+AC="tc class add dev eth0 parent"
-+$AC 1: classid 1:1 htb rate 100kbps
-+$AC 1:2 classid 1:10 htb rate 50kbps ceil 100kbps prio 1
-+$AC 1:2 classid 1:11 htb rate 50kbps ceil 100kbps prio 1
-+tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 2
-+tc qdisc add dev eth0 parent 1:11 handle 21: pfifo limit 2
-+</pre>
-+<img src=priotime.gif align=right>
-+<i>Note: HTB as child of another HTB is NOT the same as class under
-+another class within the same HTB. It is because when class in HTB can send
-+it will send as soon as hardware equipment can. So that delay of underlimit
-+class is limited only by equipment and not by ancestors.<br>
-+In HTB under HTB case the outer HTB simulates new hardware equipment with
-+all consequences (larger delay)</i>
-+<p>
-+Simulator is set to generate 50 kbps for both classes and at time 3s it
-+executes command:
-+<pre>
-+tc class change dev eth0 parent 1:2 classid 1:10 htb \
-+ rate 50kbps ceil 100kbps burst 2k prio 0
-+</pre>
-+As you see the delay of WWW class dropped nearly to the zero while
-+SMTP's delay increased. When you priorize to get better delay it always
-+makes other class delays worse.<br>
-+Later (time 7s) the simulator starts to generate WWW at 60 kbps and SMTP at 40 kbps.
-+There you can observe next interesting behaviour. When class is overlimit
-+(WWW) then HTB priorizes underlimit part of bandwidth first.<p>
-+<b>What class should you priorize ?</b> Generaly those classes where
-+you really need low delays. The example could be video or audio
-+traffic (and you will really need to use correct <b>rate</b> here
-+to prevent traffic to kill other ones) or interactive (telnet, SSH)
-+traffic which is bursty in nature and will not negatively affect
-+other flows.<br>
-+Common trick is to priorize ICMP to get nice ping delays even on fully
-+utilized links (but from technical point of view it is not what you want when
-+measuring connectivity).
-+
-+<a name=stats><h2>7. Understanding statistics</h2>
-+The <b>tc</b> tool allows you to gather statistics of queuing disciplines in Linux.
-+Unfortunately statistic results are not explained by authors so that you often can't
-+use them. Here I try to help you to understand HTB's stats.<br>
-+First whole HTB stats. The snippet bellow is taken during simulation from chapter 3.
-+<pre>
-+# tc -s -d qdisc show dev eth0
-+ qdisc pfifo 22: limit 5p
-+ Sent 0 bytes 0 pkts (dropped 0, overlimits 0) 
-+
-+ qdisc pfifo 21: limit 5p
-+ Sent 2891500 bytes 5783 pkts (dropped 820, overlimits 0) 
-+
-+ qdisc pfifo 20: limit 5p
-+ Sent 1760000 bytes 3520 pkts (dropped 3320, overlimits 0) 
-+
-+ qdisc htb 1: r2q 10 default 1 direct_packets_stat 0
-+ Sent 4651500 bytes 9303 pkts (dropped 4140, overlimits 34251) 
-+</pre>
-+First three disciplines are HTB's children. Let's ignore them as PFIFO
-+stats are self explanatory.<br>
-+<i>overlimits</i> tells you how many times the discipline delayed a packet.
-+<i>direct_packets_stat</i> tells you how many packets was sent thru direct queue.
-+Other stats are sefl explanatory. Let's look at class' stats:
-+<pre>
-+tc -s -d class show dev eth0
-+class htb 1:1 root prio 0 rate 800Kbit ceil 800Kbit burst 2Kb/8 mpu 0b 
-+    cburst 2Kb/8 mpu 0b quantum 10240 level 3 
-+ Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0) 
-+ rate 70196bps 141pps 
-+ lended: 6872 borrowed: 0 giants: 0
-+
-+class htb 1:2 parent 1:1 prio 0 rate 320Kbit ceil 4000Kbit burst 2Kb/8 mpu 0b 
-+    cburst 2Kb/8 mpu 0b quantum 4096 level 2 
-+ Sent 5914000 bytes 11828 pkts (dropped 0, overlimits 0) 
-+ rate 70196bps 141pps 
-+ lended: 1017 borrowed: 6872 giants: 0
-+
-+class htb 1:10 parent 1:2 leaf 20: prio 1 rate 224Kbit ceil 800Kbit burst 2Kb/8 mpu 0b 
-+    cburst 2Kb/8 mpu 0b quantum 2867 level 0 
-+ Sent 2269000 bytes 4538 pkts (dropped 4400, overlimits 36358) 
-+ rate 14635bps 29pps 
-+ lended: 2939 borrowed: 1599 giants: 0
-+</pre>
-+I deleted 1:11 and 1:12 class to make output shorter. As you see there
-+are parameters we set. Also there are <i>level</i> and DRR <i>quantum</i>
-+informations.<br>
-+<i>overlimits</i> shows how many times class was asked to send packet
-+but he can't due to rate/ceil constraints (currently counted for leaves only).<br>
-+<i>rate, pps</i> tells you actual (10 sec averaged) rate going thru class. It
-+is the same rate as used by gating.<br>
-+<i>lended</i> is # of packets donated by this class (from its <b>rate</b>) and
-+<i>borrowed</i> are packets for whose we borrowed from parent. Lends are always
-+computed class-local while borrows are transitive (when 1:10 borrows from 1:2 which
-+in turn borrows from 1:1 both 1:10 and 1:2 borrow counters are incremented).<br>
-+<i>giants</i> is number of packets larger than mtu set in tc command. HTB will
-+work with these but rates will not be accurate at all. Add mtu to your tc (defaults
-+to 1600 bytes).<br>
-+
-+<a name=err><h2>8. Making, debugging and sending error reports</h2>
-+<font color=red date=30.12.2002>
-+If you have kernel 2.4.20 or newer you don't need to patch it - all
-+is in vanilla tarball. The only thing you need is <b>tc</b> tool.
-+Download HTB 3.6 tarball and use tc from it.
-+</font><p>
-+You have to patch to make it work with older kernels. Download kernel source and
-+use <b>patch -p1 -i htb3_2.X.X.diff</b> to apply the patch. Then use
-+<b>make menuconfig;make bzImage</b> as before. Don't forget to enable QoS and HTB.<br>
-+Also you will have to use patched <b>tc</b> tool. The patch is also
-+in downloads or you can download precompiled binary.<p>
-+If you think that you found an error I will appreciate error report.
-+For oopses I need ksymoops output. For weird qdisc behaviour add
-+parameter <b>debug 3333333</b> to your <b>tc qdisc add .... htb</b>.
-+It will log many megabytes to syslog facility kern level debug. You
-+will probably want to add line like:<br>
-+<b>kern.debug       -/var/log/debug</b><br>
-+to your /etc/syslog.conf. Then bzip and send me the log via email
-+(up to 10MB after bzipping) along with description of problem and
-+its time.
-+</body></html>
---- iproute-20071016.orig/debian/copyright
-+++ iproute-20071016/debian/copyright
-@@ -0,0 +1,44 @@
-+This is the Debian GNU/Linux's prepackaged version of the
-+Linux Traffic Control engine and related utils, "iproute"
-+
-+The source code was obtained from
-+  http://developer.osdl.org/dev/iproute2
-+The former upstream was
-+  ftp://ftp.inr.ac.ru/ip-routing/iproute2-2.4.7-now-ss010824.tar.gz
-+
-+Copyrights
-+----------
-+Copyright (C) 1996-2001 Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
-+Copyright (C)           Stephen Hemminger <shemminger@osdl.org>
-+and others, including, but not limited to
-+  Copyright (C) 2004    USAGI/WIDE Project
-+  Copyright (C)         J Hadi Salim (hadi@cyberus.ca)
-+
-+Modifications for Debian:
-+  Copyright (C) 1996 Tom Lees <tom@lpsg.demon.co.uk>
-+  Copyright (C) 1998 Christoph Lameter <christoph@lameter.com>
-+  Copyright (C) 1998-1999 Roberto Lumbreras <rover@debian.org>
-+  Copyright (C) 1999-2003 Juan Cespedes <cespedes@debian.org>
-+  Copyright (C) 2005- Alexander Wirt <formorer@debian.org>
-+
-+
-+License
-+-------
-+
-+This program is free software; you can redistribute it and/or modify
-+it under the terms of the GNU General Public License as published by
-+the Free Software Foundation; either version 2, or (at your option)
-+any later version.
-+
-+This program is distributed in the hope that it will be useful, but
-+WITHOUT ANY WARRANTY; without even the implied warranty of
-+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+General Public License for more details.
-+
-+A copy of the GNU General Public License is available as
-+`/usr/share/common-licenses/GPL' in the Debian GNU/Linux distribution
-+or on the World Wide Web at `http://www.gnu.org/copyleft/gpl.html'.
-+You can also obtain it by writing to the Free Software Foundation,
-+Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
-+MA 02110-1301, USA.
-+
---- iproute-20071016.orig/debian/iproute.links
-+++ iproute-20071016/debian/iproute.links
-@@ -0,0 +1,9 @@
-+/usr/bin/lnstat usr/bin/rtstat
-+/usr/bin/lnstat usr/bin/ctstat
-+bin/ip sbin/ip
-+/usr/share/man/man8/tc-pfifo.8.gz /usr/share/man/man8/tc-bfifo.8.gz
-+/usr/share/man/man8/lnstat.8.gz /usr/share/man/man8/rtstat.8.gz
-+/usr/share/man/man8/lnstat.8.gz /usr/share/man/man8/ctstat.8.gz
-+/usr/share/man/man8/rtacct.8.gz /usr/share/man/man8/nstat.8.gz
-+/usr/share/man/man8/routel.8.gz /usr/share/man/man8/routef.8.gz
-+
---- iproute-20071016.orig/debian/README.Debian
-+++ iproute-20071016/debian/README.Debian
-@@ -0,0 +1,6 @@
-+iproute for Debian
-+------------------
-+
-+If you want use tc with the atm based queue you have to install libatm1 first. 
-+
-+ -- Alexander Wirt <formorer@debian.org>  Fri, 28 Dec 2007 11:56:28 +0100
---- iproute-20071016.orig/debian/changelog
-+++ iproute-20071016/debian/changelog
-@@ -0,0 +1,472 @@
-+iproute (20071016-3) unstable; urgency=low
-+
-+  [ Alexander Wirt ]
-+  * Prevent q_atm from being scanned by dh_shlibdeps
-+  * Bump priority to important (Closes: #414086)
-+  * Make iproute-doc architecture all
-+
-+  [ Andreas Henriksson ]
-+  * Revert "fix dotted-quad support patch to work on big-endian",
-+    and cherry-pick official upstream fix.
-+  * Revert "TC action parsing bug fix" (Closes: #458539)
-+  * Add synonyms for ip rule options to ip(8) manpage,
-+    and drop ip_rule_usage.dpatch (Closes: #433507)
-+  * Add routel and routef man page. (Closes: #325290)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Fri, 04 Jan 2008 23:04:36 +0100
-+
-+iproute (20071016-2) unstable; urgency=low
-+
-+  [ Andreas Henriksson ]
-+  * fix incompatibility with older kernels (Closes: #457161)
-+    (Cherry picked from upstream)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Thu, 20 Dec 2007 23:05:25 +0100
-+
-+iproute (20071016-1) unstable; urgency=low
-+
-+  [ Andreas Henriksson ]
-+  * New upstream release (v2.6.23 aka snapshot 071016) (Closes: #445944)
-+    - time2tick overflow patch applied upstream (Closes: #175462)
-+    - tc ematch cmp/nbyte help patch applied upstream (Closes: #438653)
-+    - mpath support dropped upstream (Closes: #428440, #428442)
-+    - new manpages included upstream (Closes: #438994)
-+    - linux header files updated to v2.6.23 (Closes: #409047)
-+  * Drop patches which has been applied upstream or deprecated by
-+    upstream changes.
-+    - debian/patches/lartc applied upstream.
-+    - debian/patches/netbug_fix deprecated, upstream dropped netbug script.
-+    - debian/patches/empty_linkname.dpatch deprecated, fixed upstream.
-+  * Add .dpatch suffix to wrr-qdisc patch to make dpatch-edit-patch work.
-+  * Update patches to apply:
-+    - wrr-qdisc, moo, ip_route_usage
-+  * Don't install removed netbug script.
-+  * Fix corruption when using batch files with comments and broken
-+    lines. (cherry-picked from upstream. Closes: #398912)
-+  * Update build-dependencies:
-+    - libdb4.3-dev -> libdb-dev. (Closes: #442653)
-+    - linux-kernel-headers -> linux-libc-dev.
-+  * Drop debian/patches/ip_address_flush_loop.dpatch,
-+    instead we'll use Daniel Silverstones patch imported from Ubuntu.
-+  * Add Homepage and Vcs-{Browser,Git} fields to debian/control.
-+  * Remove dead/leftover code from tc/q_htb.c, include/linux/pkt_sched.h
-+  * Remove outdated README.Debian.
-+  * Drop our own (buggy) RTAX_INITCWND support, in favor of upstreams.
-+  * fix dotted-quad support patch to work on big-endian.
-+    (upstream applied a broken patch, which we cherry-picked for #357172)
-+
-+  [ Ben Finney ]
-+  * Add dh_md5sums to generate md5sums control file (Closes: #439439)
-+
-+  [ Justin Pryzby ]
-+  * ss(8) manpage formatting breaks EXAMPLE (Closes: #443071)
-+
-+  [ Daniel Silverstone ]
-+  * Avoid infinite loop in ip addr flush.
-+
-+  [ Alexander Wirt ]
-+  * Add Andreas Henriksson to uploaders
-+  * Bump standards version
-+  * Support dotted-quad netmasks in iproute (Closes: #357172) (Cherry picked
-+    from upstream)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun, 16 Dec 2007 14:30:31 +0100
-+
-+iproute (20070313-1) unstable; urgency=low
-+
-+  * New upstream release
-+  * Make iproute-doc a suggest (Closes: #424967)
-+  * Add tc_cbq_details_typo.dpatch (Closes: #387083)
-+  * Add libnetlink_typo.dpatch (Closes: #396124)
-+  * Add tcb_htb_typo.dpatch (Closes: #396317)
-+  * Remove references to non-existing tc-filters manpage (Closes:
-+    #298715)
-+  * Fix bad phrased sentence in ss manpage (Closes: #401552)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun, 10 Jun 2007 19:36:48 +0200
-+
-+iproute (20061002-4) unstable; urgency=low
-+
-+  * Add distribution tables (used by netem). 
-+    (Closes: #408313)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Wed, 24 Jan 2007 22:55:26 +0100
-+
-+iproute (20061002-3) unstable; urgency=low
-+
-+  * Added a patch from Nikolai Kondrashov that fixes unknown
-+    symbols in ip_common.h. (Closes: #397584)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Thu, 14 Dec 2006 20:11:55 +0100
-+
-+iproute (20061002-2) unstable; urgency=medium
-+
-+  * Add manpage for ss, rtmon  and lnstat (Thanks to Michael Prokop for that) 
-+  * Fix metric output of iproute (backported from git)
-+    (http://bugs.archlinux.org/task/5669)
-+  * medium as this bug breaks other packages such as vpnc
-+
-+ -- Alexander Wirt <formorer@debian.org>  Thu, 19 Oct 2006 06:39:05 +0200
-+
-+iproute (20061002-1) unstable; urgency=low
-+
-+  * New upstream release
-+    - This fixes the xfrm monitor mode (Closes: #383133)
-+  * Fix typos in manpages (Closes: #387082, #387083)
-+  * Split docs in a seperate package 
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun, 15 Oct 2006 16:40:34 +0200
-+
-+iproute (20060323-1) unstable; urgency=low
-+
-+  * New upstream release (Closes: #370699)
-+  * Removed reenable_short_matches, tc_sample_fix, f_u32 patches (included
-+    upstream)
-+  * Add manpage for pfifo (Closes: #359971)
-+  * Add moo object (Closes: #312843)
-+  * Add src option to ip_route usage (Closes: #226142)
-+  * Prevent users from renaming an interface to "" (Closes: #241904)
-+  * Added timout for ip a f (Closes: #386288)
-+  
-+ -- Alexander Wirt <formorer@debian.org>  Fri,  8 Sep 2006 16:43:20 +0200
-+
-+iproute (20051007-4) unstable; urgency=low
-+
-+  * Moved *stat binaries to /usr/bin/ (Closes: #350703)
-+  * Fixed some manpage typos 
-+    (Closes: #350671, #350672, #350673, #350674, #350675)
-+  * Conflicts with arpd
-+  * Fixes u32 bucket hashing calucation. (Closes: #351751)
-+    Thanks to Russel Stuart for the patch
-+  * Moved to libdb4.3
-+  * Fixed ip help output (Closes: #354909)
-+  * Fixed hardcoded module paths for tc (Closes: #290315)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun,  5 Feb 2006 09:47:36 +0100
-+
-+iproute (20051007-3) unstable; urgency=low
-+
-+  * New upstream release (Closes: #333643)
-+  * Added a patch for tc that add u32 get parsed correct
-+    Thanks Russell Stuart for the patch (Closes: #347699)
-+  * We now have a manpage for tc-bfifo (Closes: #319871)
-+  * "get" is no longer mentioned in tc's usage (Closes: #167314)
-+  * We now build arpd (Closes: #296200)
-+  * Include htb docs (Closes: #204629)
-+  * Added flex to build-deps (Closes: #340004, #339119)
-+  * Added symlinks for lnstat (Closes: #302589)
-+  * Acknowledge heap correction nmu (Closes: #326961)
-+  * Acknowledge douple free fix nmu (Closes: #338575)
-+  * Fixed allmulticast mention in ip manpage (Closes: #305338)
-+  * Add [ prio NUMBER ] to ip_rule.c (Closes: #213673)
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun,  5 Feb 2006 09:37:01 +0100
-+
-+iproute (20051007-2) experimental; urgency=low
-+
-+  * Added flex to build-deps 
-+
-+ -- Alexander Wirt <formorer@debian.org>  Sun, 20 Nov 2005 10:46:39 +0100
-+
-+iproute (20051007-1) experimental; urgency=low
-+
-+  * The "lets break other peoples networking release"
-+    + New upstream release
-+    + New maintainer
-+    + Fix netbug script
-+    + Reenable short iproute commands 
-+
-+ -- Alexander Wirt <formorer@debian.org>  Tue,  1 Nov 2005 10:22:05 +0100
-+
-+iproute (20041019-4.1) unstable; urgency=low
-+
-+  * Non-maintainer upload.
-+  * Fix size of table allocation (closes: #326961, #338575)
-+
-+ -- Blars Blarson <blarson@blars.org>  Sat, 14 Jan 2006 02:07:18 +0000
-+
-+iproute (20041019-4) unstable; urgency=low
-+
-+  * New maintainer, closes: #295122.
-+  * Included iproute2 homepage in debian/control and updated it in
-+    debian/copyright.
-+  * Updated FSF mail address in debian/copyright.
-+  * Set Standards-Version to 3.6.2 in debian/control.
-+  * Fixed "FTBFS: normal.c heap corrution due to table overflow",
-+    closes: #326961. Patch by LaMont Jones <lamont@debian.org>.
-+  * Fixed "Netbug script gives syntax error", closes: #313540.
-+    Patch by Allard Hoeve <allard@byte.nl>.
-+  * Fixed "Netbug creates uuencoded file with wrong suffix", closes:
-+    #313541. Patch by Allard Hoeve <allard@byte.nl>.
-+  * Fixed "Netbug warns about intended stripping of trailing '/'",
-+    closes: #313544. Patch by Allard Hoeve <allard@byte.nl>.
-+
-+ -- Anibal Monsalve Salazar <anibal@debian.org>  Fri, 11 Nov 2005 13:22:15 +1100
-+
-+iproute (20041019-3) unstable; urgency=medium
-+
-+  * fix insecure file creation in netbug. Closes: #289541
-+  * remove bogus reference to tc-filters from tc's manpage. Closes: #289225
-+  * add support for "hoplimit" and "initcwnd" route metrics. Closes: #221893
-+  * ikey for GRE works. Closes: #200714
-+  * include wrr qdisc. Closes: #198414
-+
-+ -- Andreas Barth <aba@not.so.argh.org>  Sun,  9 Jan 2005 11:51:09 +0000
-+
-+iproute (20041019-2) unstable; urgency=low
-+
-+  * build fails if subdir fails. Closes: #283797
-+  * include q_netem.so. Closes: #283968
-+  * fix typo in man page. Closes: #285507
-+  * removed the 2. and 3. copy of the man pages.
-+  * start using dpatch.
-+  * add reference to Advanced Routing HOWTO. Closes: #150087
-+
-+ -- Andreas Barth <aba@not.so.argh.org>  Wed,  5 Jan 2005 21:20:44 +0000
-+
-+iproute (20041019-1) unstable; urgency=low
-+
-+  * New maintainer.
-+  * packaging changes:
-+    + using debhelper
-+    + add all manpages. Closes: #57829, #138432, #203797, #246521
-+    + add documentation text and html doc, and adding lynx as build-dep.
-+      Closes: #121978, #57828
-+    + include all tex-files in the doc. Closes: #107117
-+  * get straight with the kernel. Closes: #186808
-+  * add header files and libnetlink to new development package.
-+    Closes: #128162, #139309
-+  * build-depend on libatm1-dev | atm-dev instead of atm-dev
-+
-+ -- Andreas Barth <aba@not.so.argh.org>  Sun, 28 Nov 2004 01:07:30 +0000
++	char		interval;
++	unsigned char	ewma_log;
++};
 +
-+iproute (20041019-0.2) unstable; urgency=low
++/* "Handles"
++   ---------
 +
-+  * NMU, uploading to unstable.
++    All the traffic control objects have 32bit identifiers, or "handles".
 +
-+ -- Andreas Barth <aba@not.so.argh.org>  Mon, 22 Nov 2004 19:43:17 +0200
++    They can be considered as opaque numbers from user API viewpoint,
++    but actually they always consist of two fields: major and
++    minor numbers, which are interpreted by kernel specially,
++    that may be used by applications, though not recommended.
 +
-+iproute (20041019-0.1) experimental; urgency=low
++    F.e. qdisc handles always have minor number equal to zero,
++    classes (or flows) have major equal to parent qdisc major, and
++    minor uniquely identifying class inside qdisc.
 +
-+  * NMU, fixing only most urgent issues.
-+  * New upstream package, fixes:
-+    + compatibility with 2.6.7 and above. Closes: #262698
-+    + no longer with netinet/in.h. Closes: #221877
++    Macros to manipulate handles:
++ */
 +
-+ -- Andreas Barth <aba@not.so.argh.org>  Mon,  8 Nov 2004 07:50:35 +0100
++#define TC_H_MAJ_MASK (0xFFFF0000U)
++#define TC_H_MIN_MASK (0x0000FFFFU)
++#define TC_H_MAJ(h) ((h)&TC_H_MAJ_MASK)
++#define TC_H_MIN(h) ((h)&TC_H_MIN_MASK)
++#define TC_H_MAKE(maj,min) (((maj)&TC_H_MAJ_MASK)|((min)&TC_H_MIN_MASK))
 +
-+iproute (20010824-13.1) unstable; urgency=high
++#define TC_H_UNSPEC	(0U)
++#define TC_H_ROOT	(0xFFFFFFFFU)
++#define TC_H_INGRESS    (0xFFFFFFF1U)
 +
-+  * NMU for a security fix.
-+  * [CAN-2003-0856] Fix a local denial of service vulnerability via
-+    spoofed messages to the kernel's Netlink interface. (Closes: #242994)
++struct tc_ratespec
++{
++	unsigned char	cell_log;
++	unsigned char	__reserved;
++	unsigned short	feature;
++	short		addend;
++	unsigned short	mpu;
++	__u32		rate;
++};
 +
-+ -- Joshua Kwan <joshk@triplehelix.org>  Sun, 16 May 2004 20:28:43 -0700
++/* FIFO section */
 +
-+iproute (20010824-13) unstable; urgency=low
++struct tc_fifo_qopt
++{
++	__u32	limit;	/* Queue length: bytes for bfifo, packets for pfifo */
++};
 +
-+  * debian/rules: Run dpkg-shlibdeps with all the executables,
-+    to fix dependency problem                      (closes: Bug#224063)
-+  * Really removed references to obsolete include files
-+    (Bug#223165 was not fixed properly)
++/* PRIO section */
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 25 Jan 2004 23:04:20 +0100
++#define TCQ_PRIO_BANDS	16
 +
-+iproute (20010824-12) unstable; urgency=low
++struct tc_prio_qopt
++{
++	int	bands;			/* Number of bands */
++	__u8	priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> PRIO band */
++};
 +
-+  * Updated README.Debian and copyright file
-+  * Added two new manpages from http://lartc.org/manpages/:
-+    ip(8) and tc-cbq-details(8).
-+  * Removed references to obsolete include files which made
-+    compilation fail (closes: Bug#223165)
++/* CSZ section */
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 14 Dec 2003 00:40:10 +0100
++struct tc_csz_qopt
++{
++	int		flows;		/* Maximal number of guaranteed flows */
++	unsigned char	R_log;		/* Fixed point position for round number */
++	unsigned char	delta_log;	/* Log of maximal managed time interval */
++	__u8		priomap[TC_PRIO_MAX+1];	/* Map: logical priority -> CSZ band */
++};
 +
-+iproute (20010824-11) unstable; urgency=low
++struct tc_csz_copt
++{
++	struct tc_ratespec slice;
++	struct tc_ratespec rate;
++	struct tc_ratespec peakrate;
++	__u32		limit;
++	__u32		buffer;
++	__u32		mtu;
++};
++
++enum
++{
++	TCA_CSZ_UNSPEC,
++	TCA_CSZ_PARMS,
++	TCA_CSZ_RTAB,
++	TCA_CSZ_PTAB,
++};
 +
-+  * Changed priority to "optional"
-+  * Fixed "tc -s qdisc" on sparc (patch by "Nicolas S. Dade"
-+    <ndade@nsd.dyndns.org>) (closes: Bug#194128)
++/* TBF section */
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 17 Aug 2003 00:22:47 +0200
++struct tc_tbf_qopt
++{
++	struct tc_ratespec rate;
++	struct tc_ratespec peakrate;
++	__u32		limit;
++	__u32		buffer;
++	__u32		mtu;
++};
++
++enum
++{
++	TCA_TBF_UNSPEC,
++	TCA_TBF_PARMS,
++	TCA_TBF_RTAB,
++	TCA_TBF_PTAB,
++};
 +
-+iproute (20010824-10) unstable; urgency=low
 +
-+  * Updated manual pages from http://www.lartc.org/manpages/
-+                (closes: Bug#156353, Bug#175313, Bug#176989, Bug#189095)
-+  * New Standards-Version
-+  * Don't "rm -rf /etc/iproute2" on purge (closes: Bug#202862)
-+  * Include "iproute2" in the description (closes: Bug#182999)
++/* TEQL section */
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sat, 16 Aug 2003 18:29:27 +0200
++/* TEQL does not require any parameters */
 +
-+iproute (20010824-9) unstable; urgency=medium
++/* SFQ section */
 +
-+  * Added patch for HTB v3.6 to be able to work with kernel 2.4.20
-+    (from http://luxik.cdi.cz/~devik/qos/htb/v3/htb3.6-020525.tgz)
-+                (closes: Bug#147550, Bug#167149, Bug#167597, Bug#171277)
++struct tc_sfq_qopt
++{
++	unsigned	quantum;	/* Bytes per round allocated to flow */
++	int		perturb_period;	/* Period of hash perturbation */
++	__u32		limit;		/* Maximal packets in queue */
++	unsigned	divisor;	/* Hash divisor  */
++	unsigned	flows;		/* Maximal number of flows  */
++};
++
++/*
++ *  NOTE: limit, divisor and flows are hardwired to code at the moment.
++ *
++ *	limit=flows=128, divisor=1024;
++ *
++ *	The only reason for this is efficiency, it is possible
++ *	to change these parameters in compile time.
++ */
++
++/* RED section */
++
++enum
++{
++	TCA_RED_UNSPEC,
++	TCA_RED_PARMS,
++	TCA_RED_STAB,
++};
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Thu, 05 Dec 2002 13:44:10 +0100
++struct tc_red_qopt
++{
++	__u32		limit;		/* HARD maximal queue length (bytes)	*/
++	__u32		qth_min;	/* Min average length threshold (bytes) */
++	__u32		qth_max;	/* Max average length threshold (bytes) */
++	unsigned char   Wlog;		/* log(W)		*/
++	unsigned char   Plog;		/* log(P_max/(qth_max-qth_min))	*/
++	unsigned char   Scell_log;	/* cell size for idle damping */
++	unsigned char	flags;
++#define TC_RED_ECN	1
++};
++
++struct tc_red_xstats
++{
++	__u32           early;          /* Early drops */
++	__u32           pdrop;          /* Drops due to queue limits */
++	__u32           other;          /* Drops due to drop() calls */
++	__u32           marked;         /* Marked packets */
++};
 +
-+iproute (20010824-8) unstable; urgency=medium
++/* GRED section */
 +
-+  * Added support for HTB queuing discipline        (closes: Bug#133381)
-+    NOTE: you need a patched kernel in order to use it
++#define MAX_DPs 16
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Tue,  2 Apr 2002 20:29:40 +0200
++enum
++{
++       TCA_GRED_UNSPEC,
++       TCA_GRED_PARMS,
++       TCA_GRED_STAB,
++       TCA_GRED_DPS,
++};
++
++#define TCA_SET_OFF TCA_GRED_PARMS
++struct tc_gred_qopt
++{
++       __u32           limit;          /* HARD maximal queue length (bytes)    
++*/
++       __u32           qth_min;        /* Min average length threshold (bytes) 
++*/
++       __u32           qth_max;        /* Max average length threshold (bytes) 
++*/
++       __u32           DP;             /* upto 2^32 DPs */
++       __u32           backlog;        
++       __u32           qave;   
++       __u32           forced; 
++       __u32           early;  
++       __u32           other;  
++       __u32           pdrop;  
++
++       unsigned char   Wlog;           /* log(W)               */
++       unsigned char   Plog;           /* log(P_max/(qth_max-qth_min)) */
++       unsigned char   Scell_log;      /* cell size for idle damping */
++       __u8            prio;		/* prio of this VQ */
++       __u32	packets;
++       __u32	bytesin;
++};
++/* gred setup */
++struct tc_gred_sopt
++{
++       __u32           DPs;
++       __u32           def_DP;
++       __u8            grio;
++};
 +
-+iproute (20010824-7) unstable; urgency=medium
++/* HTB section */
++#define TC_HTB_NUMPRIO		8
++#define TC_HTB_MAXDEPTH		8
++#define TC_HTB_PROTOVER		3 /* the same as HTB and TC's major */
 +
-+  * Move `ip' binary to /bin to fix FHS violation   (closes: Bug#134812)
++struct tc_htb_opt
++{
++	struct tc_ratespec 	rate;
++	struct tc_ratespec 	ceil;
++	__u32	buffer;
++	__u32	cbuffer;
++	__u32	quantum;
++	__u32	level;		/* out only */
++	__u32	prio;
++};
++struct tc_htb_glob
++{
++	__u32 version;		/* to match HTB/TC */
++    	__u32 rate2quantum;	/* bps->quantum divisor */
++    	__u32 defcls;		/* default class number */
++	__u32 debug;		/* debug flags */
++
++	/* stats */
++	__u32 direct_pkts; /* count of non shapped packets */
++};
++enum
++{
++	TCA_HTB_UNSPEC,
++	TCA_HTB_PARMS,
++	TCA_HTB_INIT,
++	TCA_HTB_CTAB,
++	TCA_HTB_RTAB,
++};
++struct tc_htb_xstats
++{
++	__u32 lends;
++	__u32 borrows;
++	__u32 giants;	/* too big packets (rate will not be accurate) */
++	__u32 tokens;
++	__u32 ctokens;
++};
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Mon,  4 Mar 2002 00:20:30 +0100
++/* CBQ section */
 +
-+iproute (20010824-6) unstable; urgency=low
++#define TC_CBQ_MAXPRIO		8
++#define TC_CBQ_MAXLEVEL		8
++#define TC_CBQ_DEF_EWMA		5
 +
-+  * Added a couple of #ifdef's to be able to compile with older
-+    kernel headers (needed for arm)                 (closes: Bug#131695)
++struct tc_cbq_lssopt
++{
++	unsigned char	change;
++	unsigned char	flags;
++#define TCF_CBQ_LSS_BOUNDED	1
++#define TCF_CBQ_LSS_ISOLATED	2
++	unsigned char  	ewma_log;
++	unsigned char  	level;
++#define TCF_CBQ_LSS_FLAGS	1
++#define TCF_CBQ_LSS_EWMA	2
++#define TCF_CBQ_LSS_MAXIDLE	4
++#define TCF_CBQ_LSS_MINIDLE	8
++#define TCF_CBQ_LSS_OFFTIME	0x10
++#define TCF_CBQ_LSS_AVPKT	0x20
++	__u32		maxidle;
++	__u32		minidle;
++	__u32		offtime;
++	__u32		avpkt;
++};
++
++struct tc_cbq_wrropt
++{
++	unsigned char	flags;
++	unsigned char	priority;
++	unsigned char	cpriority;
++	unsigned char	__reserved;
++	__u32		allot;
++	__u32		weight;
++};
++
++struct tc_cbq_ovl
++{
++	unsigned char	strategy;
++#define	TC_CBQ_OVL_CLASSIC	0
++#define	TC_CBQ_OVL_DELAY	1
++#define	TC_CBQ_OVL_LOWPRIO	2
++#define	TC_CBQ_OVL_DROP		3
++#define	TC_CBQ_OVL_RCLASSIC	4
++	unsigned char	priority2;
++	__u32		penalty;
++};
++
++struct tc_cbq_police
++{
++	unsigned char	police;
++	unsigned char	__res1;
++	unsigned short	__res2;
++};
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sat, 16 Feb 2002 19:27:15 +0100
++struct tc_cbq_fopt
++{
++	__u32		split;
++	__u32		defmap;
++	__u32		defchange;
++};
 +
-+iproute (20010824-5) unstable; urgency=low
++struct tc_cbq_xstats
++{
++	__u32		borrows;
++	__u32		overactions;
++	__s32		avgidle;
++	__s32		undertime;
++};
 +
-+  * Really fix Bug#121589 (dead gateway bug); apparently I
-+    forgot to include the patch in 20010824-2
++enum
++{
++	TCA_CBQ_UNSPEC,
++	TCA_CBQ_LSSOPT,
++	TCA_CBQ_WRROPT,
++	TCA_CBQ_FOPT,
++	TCA_CBQ_OVL_STRATEGY,
++	TCA_CBQ_RATE,
++	TCA_CBQ_RTAB,
++	TCA_CBQ_POLICE,
++};
++
++#define TCA_CBQ_MAX	TCA_CBQ_POLICE
++
++/* dsmark section */
++
++enum {
++	TCA_DSMARK_UNSPEC,
++	TCA_DSMARK_INDICES,
++	TCA_DSMARK_DEFAULT_INDEX,
++	TCA_DSMARK_SET_TC_INDEX,
++	TCA_DSMARK_MASK,
++	TCA_DSMARK_VALUE
++};
++
++#define TCA_DSMARK_MAX TCA_DSMARK_VALUE
++
++/* ATM  section */
++
++enum {
++	TCA_ATM_UNSPEC,
++	TCA_ATM_FD,		/* file/socket descriptor */
++	TCA_ATM_PTR,		/* pointer to descriptor - later */
++	TCA_ATM_HDR,		/* LL header */
++	TCA_ATM_EXCESS,		/* excess traffic class (0 for CLP)  */
++	TCA_ATM_ADDR,		/* PVC address (for output only) */
++	TCA_ATM_STATE		/* VC state (ATM_VS_*; for output only) */
++};
++
++#define TCA_ATM_MAX	TCA_ATM_STATE
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Tue, 29 Jan 2002 23:22:24 +0100
++#endif
++#endif
+ #ifndef __LINUX_PKT_SCHED_H
+ #define __LINUX_PKT_SCHED_H
+ 
+@@ -466,4 +872,116 @@
+ 
+ #define NETEM_DIST_SCALE	8192
+ 
++/* WRR section */
++
++/* Other includes */
++#include <linux/if_ether.h>
++
++// A sub weight and of a class
++// All numbers are represented as parts of (2^64-1).
++struct tc_wrr_class_weight {
++	__u64 val;	// Current value			(0 is not valid)
++	__u64 decr;	// Value pr bytes			(2^64-1 is not valid)
++	__u64 incr;	// Value pr seconds			(2^64-1 is not valid)
++	__u64 min;	// Minimal value			(0 is not valid)
++	__u64 max;	// Minimal value			(0 is not valid)
++
++// The time where the above information was correct:
++	time_t tim;
++};
++
++// Packet send when modifying a class:
++struct tc_wrr_class_modf {
++	// Not-valid values are ignored.
++	struct tc_wrr_class_weight weight1;
++	struct tc_wrr_class_weight weight2;
++};
++
++// Packet returned when quering a class:
++struct tc_wrr_class_stats {
++	char used;	// If this is false the information below is invalid
++
++	struct tc_wrr_class_modf class_modf;
++
++	unsigned char addr[ETH_ALEN];
++	char usemac;    // True if addr is a MAC address, else it is an IP address
++			// (this value is only for convience, it is always the same
++			//  value as in the qdisc)
++	int heappos;	// Current heap position or 0 if not in heap
++	__u64 penal_ls;	// Penalty value in heap (ls)
++	__u64 penal_ms;	// Penalty value in heap (ms)
++};
++
++// Qdisc-wide penalty information (boolean values - 2 not valid)
++struct tc_wrr_qdisc_weight {
++	char weight_mode;	// 0=No automatic change to weight
++				// 1=Decrease normally
++				// 2=Also multiply with number of machines
++				// 3=Instead multiply with priority divided
++				//   with priority of the other.
++				// -1=no change
++};
++
++// Packet send when modifing a qdisc:
++struct tc_wrr_qdisc_modf {
++	// Not-valid values are ignored:
++	struct tc_wrr_qdisc_weight weight1;
++	struct tc_wrr_qdisc_weight weight2;
++};
++
++// Packet send when creating a qdisc:
++struct tc_wrr_qdisc_crt {
++	struct tc_wrr_qdisc_modf qdisc_modf;
++
++	char srcaddr;	// 1=lookup source, 0=lookup destination
++	char usemac;	// 1=Classify on MAC addresses, 0=classify on IP
++	char usemasq;	// 1=Classify based on masqgrading - only valid
++			//   if usemac is zero
++	int bands_max;	// Maximal number of bands (i.e.: classes)
++	int proxy_maxconn;// If differnt from 0 then we support proxy remapping
++			// of packets. And this is the number of maximal
++			// concurrent proxy connections.
++};
++
++// Packet returned when quering a qdisc:
++struct tc_wrr_qdisc_stats {
++	struct tc_wrr_qdisc_crt qdisc_crt;
++	int proxy_curconn;
++	int nodes_in_heap;	// Current number of bands wanting to send something
++	int bands_cur;		// Current number of bands used (i.e.: MAC/IP addresses seen)
++	int bands_reused;	// Number of times this band has been reused.
++	int packets_requed;	// Number of times packets have been requeued.
++	__u64 priosum;		// Sum of priorities in heap where 1 is 2^32
++};
++
++struct tc_wrr_qdisc_modf_std {
++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
++	char proxy; // 0=This struct
++
++	// Should we also change a class?
++	char change_class;
++
++	// Only valid if change_class is false
++	struct tc_wrr_qdisc_modf qdisc_modf;
++
++	// Only valid if change_class is true:
++	unsigned char addr[ETH_ALEN]; // Class to change (non-used bytes should be 0)
++	struct tc_wrr_class_modf class_modf; // The change
++};
++
++// Used for proxyrempping:
++struct tc_wrr_qdisc_modf_proxy {
++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
++	char proxy;     // 1=This struct
++
++	// This is 1 if the proxyremap information should be reset
++	char reset;
++
++	// changec is the number of elements in changes.
++	int changec;
++
++	// This is an array of type ProxyRemapBlock:
++	long changes[0];
++};
 +
-+iproute (20010824-4) unstable; urgency=low
+ #endif
+Index: iproute-2.6.20-070313/ip/iproute.c
+===================================================================
+--- iproute-2.6.20-070313.orig/ip/iproute.c	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/ip/iproute.c	2007-06-09 13:53:57.000000000 +0100
+@@ -73,7 +73,7 @@
+ 	fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n");
+ 	fprintf(stderr, "           [ rtt NUMBER ] [ rttvar NUMBER ]\n");
+ 	fprintf(stderr, "           [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ]\n");
+-	fprintf(stderr, "           [ ssthresh NUMBER ] [ realms REALM ]\n");
++	fprintf(stderr, "           [ ssthresh NUMBER ] [ realms REALM ] [ hoplimit NUMBER ]\n");
+ 	fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n");
+ 	fprintf(stderr, "          unreachable | prohibit | blackhole | nat ]\n");
+ 	fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n");
+@@ -789,6 +789,30 @@
+ 				invarg("\"reordering\" value is invalid\n", *argv);
+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_REORDERING, reord);
+ #endif
++#ifdef RTAX_HOPLIMIT
++		} else if (strcmp(*argv, "hoplimit") == 0) {
++			unsigned hoplim;
++			NEXT_ARG();
++			if (strcmp(*argv, "lock") == 0) {
++				mxlock |= (1<<RTAX_HOPLIMIT);
++				NEXT_ARG();
++			}
++			if (get_unsigned(&hoplim, *argv, 0))
++				invarg("\"hoplimit\" value is invalid\n", *argv);
++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_HOPLIMIT, hoplim);
++#endif
++#ifdef RTAX_INITCWND
++		} else if (strcmp(*argv, "initcwnd") == 0) {
++			unsigned initcwnd;
++			NEXT_ARG();
++			if (strcmp(*argv, "lock") == 0) {
++				mxlock |= (1<<RTAX_HOPLIMIT);
++				NEXT_ARG();
++			}
++			if (get_unsigned(&initcwnd, *argv, 0))
++				invarg("\"initcwnd\" value is invalid\n", *argv);
++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_INITCWND, initcwnd);
++#endif
+ 		} else if (strcmp(*argv, "rtt") == 0) {
+ 			unsigned rtt;
+ 			NEXT_ARG();
+Index: iproute-2.6.20-070313/ip/iptunnel.c
+===================================================================
+--- iproute-2.6.20-070313.orig/ip/iptunnel.c	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/ip/iptunnel.c	2007-06-09 13:53:57.000000000 +0100
+@@ -113,7 +113,7 @@
+ 			NEXT_ARG();
+ 			p->i_flags |= GRE_KEY;
+ 			if (strchr(*argv, '.'))
+-				p->o_key = get_addr32(*argv);
++				p->i_key = get_addr32(*argv);
+ 			else {
+ 				if (get_unsigned(&uval, *argv, 0)<0) {
+ 					fprintf(stderr, "invalid value of \"ikey\"\n");
+Index: iproute-2.6.20-070313/Makefile
+===================================================================
+--- iproute-2.6.20-070313.orig/Makefile	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/Makefile	2007-06-09 13:53:57.000000000 +0100
+@@ -48,7 +48,7 @@
+ 		$(DESTDIR)$(DOCDIR)/examples
+ 	install -m 0644 $(shell find examples/diffserv -maxdepth 1 -type f) \
+ 		$(DESTDIR)$(DOCDIR)/examples/diffserv
+-	@for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
++	@set -e; for i in $(SUBDIRS) doc; do $(MAKE) -C $$i install; done
+ 	install -m 0644 $(shell find etc/iproute2 -maxdepth 1 -type f) $(DESTDIR)$(CONFDIR)
+ 	install -m 0755 -d $(DESTDIR)$(MANDIR)/man8
+ 	install -m 0644 $(shell find man/man8 -maxdepth 1 -type f) $(DESTDIR)$(MANDIR)/man8
+@@ -59,7 +59,7 @@
+ 
+ clean:
+ 	rm -f cscope.*
+-	@for i in $(SUBDIRS) doc; \
++	@set -e; for i in $(SUBDIRS) doc; \
+ 	do $(MAKE) $(MFLAGS) -C $$i clean; done
+ 
+ clobber: clean
+Index: iproute-2.6.20-070313/man/man8/ip.8
+===================================================================
+--- iproute-2.6.20-070313.orig/man/man8/ip.8	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/man/man8/ip.8	2007-06-09 13:53:57.000000000 +0100
+@@ -1808,6 +1808,8 @@
+ .RB "IP Command reference " ip-cref.ps
+ .br
+ .RB "IP tunnels " ip-cref.ps
++.br
++.RB http://lartc.org/
+ 
+ .SH AUTHOR
+ Original Manpage  by Michail Litvak <mci@owl.openwall.com>
+Index: iproute-2.6.20-070313/man/man8/tc.8
+===================================================================
+--- iproute-2.6.20-070313.orig/man/man8/tc.8	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/man/man8/tc.8	2007-06-09 13:53:57.000000000 +0100
+@@ -341,7 +341,7 @@
+ .BR tc-pfifo (8),
+ .BR tc-bfifo (8),
+ .BR tc-pfifo_fast (8),
+-.BR tc-filters (8)
++.BR http://lartc.org/
+ 
+ .SH AUTHOR
+ Manpage maintained by bert hubert (ahu@ds9a.nl)
+Index: iproute-2.6.20-070313/misc/Makefile
+===================================================================
+--- iproute-2.6.20-070313.orig/misc/Makefile	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/misc/Makefile	2007-06-09 13:53:57.000000000 +0100
+@@ -1,7 +1,8 @@
+ SSOBJ=ss.o ssfilter.o
+ LNSTATOBJ=lnstat.o lnstat_util.o
+ 
+-TARGETS=ss nstat ifstat rtacct arpd lnstat
++#TARGETS=ss nstat ifstat rtacct arpd lnstat
++TARGETS=ss nstat rtacct lnstat
+ 
+ include ../Config
+ 
+Index: iproute-2.6.20-070313/misc/netbug
+===================================================================
+--- iproute-2.6.20-070313.orig/misc/netbug	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/misc/netbug	2007-06-09 13:53:57.000000000 +0100
+@@ -1,23 +1,16 @@
+ #! /bin/bash
+ 
++set -e
 +
-+  * Added support for DIFFSERV and ATM in tc
+ echo -n "Send network configuration summary to [ENTER means kuznet@ms2.inr.ac.ru] "
+ IFS="" read mail || exit 1
+ [ -z "$mail" ] && mail=kuznet@ms2.inr.ac.ru
+ 
++netbug=`mktemp -d -t netbug.XXXXXX` || {echo "$0: Cannot create temporary directory" >&2; exit 1;  }
++netbugtar=`tempfile -d $netbug --suffix=tar.gz` || {echo "$0: Cannot create temporary file" >&2; exit 1;  }
++tmppath=$netbug
++trap "/bin/rm -rf $netbug $netbugtar" 0 1 2 3 13 15
+ 
+-netbug=""
+-while [ "$netbug" = "" ]; do
+-	netbug=`echo netbug.$$.$RANDOM`
+-	if [ -e /tmp/$netbug ]; then
+-		netbug=""
+-	fi
+-done
+-
+-tmppath=/tmp/$netbug
+-
+-trap "rm -rf $tmppath $tmppath.tar.gz" 0 SIGINT
+-
+-mkdir $tmppath
+ mkdir $tmppath/net
+ 
+ cat /proc/slabinfo > $tmppath/slabinfo
+@@ -44,9 +37,8 @@
+ fi
+ 
+ cd /tmp
+-tar c $netbug | gzip -9c > $netbug.tar.gz
+-
+-uuencode $netbug.tar.gz $netbug.tar.gz | mail -s $netbug "$mail"
++tar c $tmppath | gzip -9c > $netbugtar
++uuencode $netbugtar $netbugtar | mail -s $netbug "$mail"
+ 
+ echo "Sending to <$mail>; subject is $netbug"
+ 
+Index: iproute-2.6.20-070313/tc/Makefile
+===================================================================
+--- iproute-2.6.20-070313.orig/tc/Makefile	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/tc/Makefile	2007-06-09 13:53:57.000000000 +0100
+@@ -11,6 +11,7 @@
+ TCMODULES += q_prio.o
+ TCMODULES += q_tbf.o
+ TCMODULES += q_cbq.o
++TCMODULES += q_wrr.o
+ TCMODULES += f_rsvp.o
+ TCMODULES += f_u32.o
+ TCMODULES += f_route.o
+Index: iproute-2.6.20-070313/tc/q_htb.c
+===================================================================
+--- iproute-2.6.20-070313.orig/tc/q_htb.c	2007-06-09 13:53:56.000000000 +0100
++++ iproute-2.6.20-070313/tc/q_htb.c	2007-06-09 13:53:57.000000000 +0100
+@@ -1,3 +1,311 @@
++#if 0
++/*
++ * q_htb.c		HTB.
++ *
++ *		This program is free software; you can redistribute it and/or
++ *		modify it under the terms of the GNU General Public License
++ *		as published by the Free Software Foundation; either version
++ *		2 of the License, or (at your option) any later version.
++ *
++ * Authors:	Martin Devera, devik@cdi.cz
++ *
++ */
++
++#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"
++
++#define HTB_TC_VER 0x30003
++#if HTB_TC_VER >> 16 != TC_HTB_PROTOVER
++#error "Different kernel and TC HTB versions"
++#endif
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 13 Jan 2002 03:01:47 +0100
++static void explain(void)
++{
++	fprintf(stderr, "Usage: ... qdisc add ... htb [default N] [r2q N]\n"
++		" default  minor id of class to which unclassified packets are sent {0}\n"
++		" r2q      DRR quantums are computed as rate in Bps/r2q {10}\n"
++		" debug    string of 16 numbers each 0-3 {0}\n\n"
++		"... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]\n"
++		"                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n"
++		" rate     rate allocated to this class (class can still borrow)\n"
++		" burst    max bytes burst which can be accumulated during idle period {computed}\n"
++		" ceil     definite upper class rate (no borrows) {rate}\n"
++		" cburst   burst but for ceil {computed}\n"
++		" mtu      max packet size we create rate map for {1600}\n"
++		" prio     priority of leaf; lower are served first {0}\n"
++		" quantum  how much bytes to serve from leaf at once {use r2q}\n"
++		"\nTC HTB version %d.%d\n",HTB_TC_VER>>16,HTB_TC_VER&0xffff
++		);
++}
 +
-+iproute (20010824-3) unstable; urgency=low
++static void explain1(char *arg)
++{
++    fprintf(stderr, "Illegal \"%s\"\n", arg);
++    explain();
++}
 +
-+  * Updated tc* man pages (thanks to bert hubert <ahu@ds9a.nl>)
-+  * Fixed spurious space in `tc -s qdisc' output (closes: Bug#128501)
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Thu, 10 Jan 2002 22:18:25 +0100
++#define usage() return(-1)
 +
-+iproute (20010824-2) unstable; urgency=low
++static int htb_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++	struct tc_htb_glob opt;
++	struct rtattr *tail;
++	unsigned i; char *p;
++	memset(&opt,0,sizeof(opt));
++	opt.rate2quantum = 10;
++	opt.version = 3;
++
++	while (argc > 0) {
++		if (matches(*argv, "r2q") == 0) {
++		    NEXT_ARG();
++		    if (get_u32(&opt.rate2quantum, *argv, 10)) {
++			explain1("r2q"); return -1;
++		    }
++		} else if (matches(*argv, "default") == 0) {
++		    NEXT_ARG();
++		    if (get_u32(&opt.defcls, *argv, 16)) {
++			explain1("default"); return -1;
++		    }
++		} else if (matches(*argv, "debug") == 0) {
++		    NEXT_ARG(); p = *argv;
++		    for (i=0; i<16; i++,p++) {
++			if (*p<'0' || *p>'3') break;
++			opt.debug |= (*p-'0')<<(2*i);
++		    }
++		} else {
++			fprintf(stderr, "What is \"%s\"?\n", *argv);
++			explain();
++			return -1;
++		}
++		argc--; argv++;
++	}
++	tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len));
++	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++	addattr_l(n, 2024, TCA_HTB_INIT, &opt, NLMSG_ALIGN(sizeof(opt)));
++	tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++	return 0;
++}
 +
-+  * Fixed the following important and serious bugs:
-+    + iproute doesn't compile on Alpha (closes: Bug#118113, Bug#123224)
-+    + iproute doesn't compile on MIPS (closes: Bug#118424)
-+    + iproute doesn't compile on powerpc (closes: Bug#119601)
-+  * Added man pages for tc (closes: Bug#124230), tc-cbq, tc-red, tc-tbf,
-+    tc-prio and tc-sfq
-+  * Removed references to old programs from iproute(7) (closes: Bug#99536)
-+  * Fixed bug which presented first hop as dead in equal cost multipath
-+                                                      (closes: Bug#121589)
-+  * Do not process .ps with through `psnup' (closes: Bug#119820)
++static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++	int ok=0;
++	struct tc_htb_opt opt;
++	__u32 rtab[256],ctab[256];
++	unsigned buffer=0,cbuffer=0;
++	int cell_log=-1,ccell_log = -1,mtu;
++	struct rtattr *tail;
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Tue,  8 Jan 2002 16:07:27 +0100
++	memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
 +
-+iproute (20010824-1) unstable; urgency=low
++	while (argc > 0) {
++		if (matches(*argv, "prio") == 0) {
++			NEXT_ARG();
++			if (get_u32(&opt.prio, *argv, 10)) {
++				explain1("prio"); return -1;
++			}
++			ok++;
++		} else if (matches(*argv, "mtu") == 0) {
++			NEXT_ARG();
++			if (get_u32(&mtu, *argv, 10)) {
++				explain1("mtu"); return -1;
++			}
++		} else if (matches(*argv, "quantum") == 0) {
++			NEXT_ARG();
++			if (get_u32(&opt.quantum, *argv, 10)) {
++				explain1("quantum"); return -1;
++			}
++		} else if (matches(*argv, "burst") == 0 ||
++			strcmp(*argv, "buffer") == 0 ||
++			strcmp(*argv, "maxburst") == 0) {
++			NEXT_ARG();
++			if (get_size_and_cell(&buffer, &cell_log, *argv) < 0) {
++				explain1("buffer");
++				return -1;
++			}
++			ok++;
++		} else if (matches(*argv, "cburst") == 0 ||
++			strcmp(*argv, "cbuffer") == 0 ||
++			strcmp(*argv, "cmaxburst") == 0) {
++			NEXT_ARG();
++			if (get_size_and_cell(&cbuffer, &ccell_log, *argv) < 0) {
++				explain1("cbuffer");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "ceil") == 0) {
++			NEXT_ARG();
++			if (opt.ceil.rate) {
++				fprintf(stderr, "Double \"ceil\" spec\n");
++				return -1;
++			}
++			if (get_rate(&opt.ceil.rate, *argv)) {
++				explain1("ceil");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "rate") == 0) {
++			NEXT_ARG();
++			if (opt.rate.rate) {
++				fprintf(stderr, "Double \"rate\" spec\n");
++				return -1;
++			}
++			if (get_rate(&opt.rate.rate, *argv)) {
++				explain1("rate");
++				return -1;
++			}
++			ok++;
++		} else if (strcmp(*argv, "help") == 0) {
++			explain();
++			return -1;
++		} else {
++			fprintf(stderr, "What is \"%s\"?\n", *argv);
++			explain();
++			return -1;
++		}
++		argc--; argv++;
++	}
 +
-+  * New upstream version
-+  * Make ingress qdisc work again with tc           (closes: Bug#84444)
-+  * Make it compile properly with new include files (closes: Bug#113112)
++/*	if (!ok)
++		return 0;*/
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 28 Oct 2001 16:38:00 +0100
++	if (opt.rate.rate == 0) {
++		fprintf(stderr, "\"rate\" is required.\n");
++		return -1;
++	}
++	/* if ceil params are missing, use the same as rate */
++	if (!opt.ceil.rate) opt.ceil = opt.rate;
 +
-+iproute (20001007-1) unstable; urgency=low
++	/* compute minimal allowed burst from rate; mtu is added here to make
++	   sute that buffer is larger than mtu and to have some safeguard space */
++	if (!buffer) buffer = opt.rate.rate / HZ + mtu;
++	if (!cbuffer) cbuffer = opt.ceil.rate / HZ + mtu;
 +
-+  * New upstream version                             (closes: Bug#63701)
-+  * Remove /etc/iproute2 on purge                    (closes: Bug#72743)
-+  * Fixed Lintian warnings (no-priority-field and no-section-field)
++	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, 0)) < 0) {
++		fprintf(stderr, "htb: failed to calculate rate table.\n");
++		return -1;
++	}
++	opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer);
++	opt.rate.cell_log = cell_log;
++	
++	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, 0)) < 0) {
++		fprintf(stderr, "htb: failed to calculate ceil rate table.\n");
++		return -1;
++	}
++	opt.cbuffer = tc_calc_xmittime(opt.ceil.rate, cbuffer);
++	opt.ceil.cell_log = ccell_log;
++
++	tail = (struct rtattr*)(((void*)n)+NLMSG_ALIGN(n->nlmsg_len));
++	addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++	addattr_l(n, 2024, TCA_HTB_PARMS, &opt, sizeof(opt));
++	addattr_l(n, 3024, TCA_HTB_RTAB, rtab, 1024);
++	addattr_l(n, 4024, TCA_HTB_CTAB, ctab, 1024);
++	tail->rta_len = (((void*)n)+NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++	return 0;
++}
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sat, 14 Oct 2000 19:27:12 +0200
++static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++	struct rtattr *tb[TCA_HTB_RTAB+1];
++	struct tc_htb_opt *hopt;
++	struct tc_htb_glob *gopt;
++	double buffer,cbuffer;
++	SPRINT_BUF(b1);
++	SPRINT_BUF(b2);
++
++	if (opt == NULL)
++		return 0;
 +
-+iproute (991023-2) unstable; urgency=low
++	memset(tb, 0, sizeof(tb));
++	parse_rtattr(tb, TCA_HTB_RTAB, RTA_DATA(opt), RTA_PAYLOAD(opt));
++
++	if (tb[TCA_HTB_PARMS]) {
++
++	    hopt = RTA_DATA(tb[TCA_HTB_PARMS]);
++	    if (RTA_PAYLOAD(tb[TCA_HTB_PARMS])  < sizeof(*hopt)) return -1;
++
++		if (!hopt->level) {
++			fprintf(f, "prio %d ", (int)hopt->prio);
++			if (show_details)
++				fprintf(f, "quantum %d ", (int)hopt->quantum);
++		}
++	    fprintf(f, "rate %s ", sprint_rate(hopt->rate.rate, b1));
++	    buffer = ((double)hopt->rate.rate*tc_core_tick2usec(hopt->buffer))/1000000;
++	    fprintf(f, "ceil %s ", sprint_rate(hopt->ceil.rate, b1));
++	    cbuffer = ((double)hopt->ceil.rate*tc_core_tick2usec(hopt->cbuffer))/1000000;
++	    if (show_details) {
++		fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1),
++			1<<hopt->rate.cell_log, sprint_size(hopt->rate.mpu, b2));
++		fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1),
++			1<<hopt->ceil.cell_log, sprint_size(hopt->ceil.mpu, b2));
++		fprintf(f, "level %d ", (int)hopt->level);
++	    } else {
++		fprintf(f, "burst %s ", sprint_size(buffer, b1));
++		fprintf(f, "cburst %s ", sprint_size(cbuffer, b1));
++	    }
++	    if (show_raw)
++		fprintf(f, "buffer [%08x] cbuffer [%08x] ", 
++			hopt->buffer,hopt->cbuffer);
++	}
++	if (tb[TCA_HTB_INIT]) {
++	    gopt = RTA_DATA(tb[TCA_HTB_INIT]);
++	    if (RTA_PAYLOAD(tb[TCA_HTB_INIT])  < sizeof(*gopt)) return -1;
++
++	    fprintf(f, "r2q %d default %x direct_packets_stat %u", 
++		    gopt->rate2quantum,gopt->defcls,gopt->direct_pkts);
++		if (show_details)
++			fprintf(f," ver %d.%d",gopt->version >> 16,gopt->version & 0xffff);
++	}
++	return 0;
++}
 +
-+  * New Standards-Version (3.1.1) (closes: Bug#47923)
-+  * Modified description of package to show which kernel options are
-+    necessary to use the package (closes: Bug#47922)
-+  * Updated manual page to point at /usr/share/doc/iproute (closes: Bug#47924)
++static int htb_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++	struct tc_htb_xstats *st;
++	if (xstats == NULL)
++		return 0;
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 19 Dec 1999 04:00:21 +0100
++	if (RTA_PAYLOAD(xstats) < sizeof(*st))
++		return -1;
 +
-+iproute (991023-1) unstable; urgency=low
++	st = RTA_DATA(xstats);
++	fprintf(f, " lended: %u borrowed: %u giants: %u\n", 
++		st->lends,st->borrows,st->giants);
++	fprintf(f, " tokens: %d ctokens: %d\n", st->tokens,st->ctokens);
++	return 0;
++}
 +
-+  * New upstream version (closes: Bug#48733)
++struct qdisc_util htb_util = {
++	NULL,
++	"htb",
++	htb_parse_opt,
++	htb_print_opt,
++	htb_print_xstats,
++	htb_parse_class_opt,
++	htb_print_opt,
++};
++
++/* for testing of old one */
++struct qdisc_util htb2_util = {
++	NULL,
++	"htb2",
++	htb_parse_opt,
++	htb_print_opt,
++	htb_print_xstats,
++	htb_parse_class_opt,
++	htb_print_opt,
++};
++#endif
+ /*
+  * q_htb.c		HTB.
+  *
+Index: iproute-2.6.20-070313/tc/q_wrr.c
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ iproute-2.6.20-070313/tc/q_wrr.c	2007-06-09 13:53:57.000000000 +0100
+@@ -0,0 +1,322 @@
++#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 <math.h>
++
++#include "utils.h"
++#include "tc_util.h"
++
++#define usage() return(-1)
++
++// Returns -1 on error
++static int wrr_parse_qdisc_weight(int argc, char** argv, 
++                              struct tc_wrr_qdisc_modf* opt) {
++  int i;
++  
++  opt->weight1.weight_mode=-1;
++  opt->weight2.weight_mode=-1;
++  
++  for(i=0; i<argc; i++) {  
++    if(!memcmp(argv[i],"wmode1=",7)) {
++      opt->weight1.weight_mode=atoi(argv[i]+7);            
++    } else if(!memcmp(argv[i],"wmode2=",7)) {
++      opt->weight2.weight_mode=atoi(argv[i]+7);
++    } else {
++      printf("Usage: ... [wmode1=0|1|2|3] [wmode2=0|1|2|3]\n");
++      return -1;
++    }
++  }
++  return 0;
++}
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Tue,  2 Nov 1999 16:29:37 +0100
++static int wrr_parse_class_modf(int argc, char** argv, 
++                                struct tc_wrr_class_modf* modf) {
++  int i;
++  
++  if(argc<1) {
++    fprintf(stderr, "Usage: ... [weight1=val] [decr1=val] [incr1=val] [min1=val] [max1=val] [val2=val] ...\n");
++    fprintf(stderr, "  The values can be floating point like 0.42 or divisions like 42/100\n");
++    return -1;
++  }
++  
++  // Set meaningless values:
++  modf->weight1.val=0;
++  modf->weight1.decr=(__u64)-1;
++  modf->weight1.incr=(__u64)-1;
++  modf->weight1.min=0;
++  modf->weight1.max=0;
++  modf->weight2.val=0;
++  modf->weight2.decr=(__u64)-1;
++  modf->weight2.incr=(__u64)-1;
++  modf->weight2.min=0;
++  modf->weight2.max=0;
++  
++  // And read values:
++  for(i=0; i<argc; i++) {
++    char arg[80];
++    char* name,*value1=0,*value2=0;
++    long double f_val1,f_val2=1,value;
++    if(strlen(argv[i])>=sizeof(arg)) {
++      fprintf(stderr,"Argument too long: %s\n",argv[i]);
++      return -1;
++    }
++    strcpy(arg,argv[i]);
++    
++    name=strtok(arg,"=");
++    if(name) value1=strtok(0,"/");
++    if(value1) value2=strtok(0,"");
++    
++    if(!value1) {
++      fprintf(stderr,"No = found in argument: %s\n",argv[i]);
++      return -1;
++    }
++    
++    f_val1=atof(value1);
++    if(value2) f_val2=atof(value2);    
++    
++    if(f_val2==0)  {
++      fprintf(stderr,"Division by 0\n");
++      return -1;
++    }
++        
++    value=f_val1/f_val2;    
++    if(value>1) value=1;
++    if(value<0) value=0;            
++    value*=((__u64)-1);
++    
++    // And find the value set
++    if(!strcmp(name,"weight1"))    modf->weight1.val=value;
++    else if(!strcmp(name,"decr1")) modf->weight1.decr=value;
++    else if(!strcmp(name,"incr1")) modf->weight1.incr=value;
++    else if(!strcmp(name,"min1"))  modf->weight1.min=value;
++    else if(!strcmp(name,"max1"))  modf->weight1.max=value;
++    else if(!strcmp(name,"weight2")) modf->weight2.val=value;
++    else if(!strcmp(name,"decr2")) modf->weight2.decr=value;
++    else if(!strcmp(name,"incr2")) modf->weight2.incr=value;
++    else if(!strcmp(name,"min2"))  modf->weight2.min=value;
++    else if(!strcmp(name,"max2"))  modf->weight2.max=value;
++    else {
++      fprintf(stderr,"illegal value: %s\n",name);
++      return -1;
++    }
++  }    
++
++  return 0;
++}
 +
-+iproute (990824-1) unstable; urgency=low
++static int wrr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++  if(n->nlmsg_flags & NLM_F_CREATE) {
++    // This is a create request:
++    struct tc_wrr_qdisc_crt opt;
++	
++    int sour,dest,ip,mac,masq;
++
++    if(argc<4) {
++      fprintf(stderr, "Usage: ... wrr sour|dest ip|masq|mac maxclasses proxymaxcon [penalty-setup]\n");
++      return -1;
++    }	  
++  
++    // Read sour/dest:
++    memset(&opt,0,sizeof(opt));
++    sour=!strcmp(argv[0],"sour");
++    dest=!strcmp(argv[0],"dest");	
++	
++    if(!sour && !dest) {
++      fprintf(stderr,"sour or dest must be specified\n");
++      return -1;
++    }	
++
++    // Read ip/mac
++    ip=!strcmp(argv[1],"ip");
++    mac=!strcmp(argv[1],"mac");	
++    masq=!strcmp(argv[1],"masq");	
++
++    if(!ip && !mac && !masq) {
++      fprintf(stderr,"ip, masq or mac must be specified\n");
++      return -1;
++    }	
++
++    opt.srcaddr=sour;		
++    opt.usemac=mac;
++    opt.usemasq=masq;		
++    opt.bands_max=atoi(argv[2]);
++    
++    opt.proxy_maxconn=atoi(argv[3]);
++    
++    // Read weights:
++    if(wrr_parse_qdisc_weight(argc-4,argv+4,&opt.qdisc_modf)<0) return -1;
++    if(opt.qdisc_modf.weight1.weight_mode==-1) opt.qdisc_modf.weight1.weight_mode=0;
++    if(opt.qdisc_modf.weight2.weight_mode==-1) opt.qdisc_modf.weight2.weight_mode=0;
++		
++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  } else {
++    struct tc_wrr_qdisc_modf_std opt;
++    char qdisc,class;
++    
++    // This is a modify request:
++    if(argc<1) {
++      fprintf(stderr,"... qdisc ... or ... class ...\n");
++      return -1;
++    }
++            
++    qdisc=!strcmp(argv[0],"qdisc");
++    class=!strcmp(argv[0],"class");
++
++    if(!qdisc && !class) {
++      fprintf(stderr,"qdisc or class must be specified\n");
++      return -1;
++    }
++      
++    argc--;
++    argv++;
++      
++    opt.proxy=0;
++    
++    if(qdisc) {
++      opt.change_class=0;
++      if(wrr_parse_qdisc_weight(argc, argv, &opt.qdisc_modf)<0) return -1;
++    } else {
++      int a0,a1,a2,a3,a4=0,a5=0;      
++
++      opt.change_class=1;
++      
++      if(argc<1) {
++        fprintf(stderr,"... <mac>|<ip>|<masq> ...\n");
++        return -1;
++      }
++      memset(opt.addr,0,sizeof(opt.addr));
++
++      if((sscanf(argv[0],"%i.%i.%i.%i",&a0,&a1,&a2,&a3)!=4) &&
++         (sscanf(argv[0],"%x:%x:%x:%x:%x:%x",&a0,&a1,&a2,&a3,&a4,&a5)!=6)) {
++	fprintf(stderr,"Wrong format of mac or ip address\n");
++	return -1;
++      }
++      
++      opt.addr[0]=a0; opt.addr[1]=a1; opt.addr[2]=a2;
++      opt.addr[3]=a3; opt.addr[4]=a4; opt.addr[5]=a5;
 +
-+  * New maintainer
-+  * New upstream version
-+  * New Standards-Version: 3.1.0
-+  * Minor fix in "ip rule list": mask in "from" address was not shown
-+    correctly
-+  * Removed obsoleted documentation from "debian/" directory
++      if(wrr_parse_class_modf(argc-1, argv+1, &opt.class_modf)<0) return -1;
++    }  
++  
++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  }
++  return 0;
++}
 +
-+ -- Juan Cespedes <cespedes@debian.org>  Sun, 24 Oct 1999 19:02:56 +0200
++static int wrr_parse_copt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) {
++  struct tc_wrr_class_modf opt;
++  
++  memset(&opt,0,sizeof(opt));
++  if(wrr_parse_class_modf(argc,argv,&opt)<0) return -1;
++  
++  addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
++  return 0;  
++}  
 +
-+iproute (990630-1) unstable; urgency=low
++static int wrr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++	struct tc_wrr_qdisc_stats *qopt;
 +
-+  * New upstream version.
-+  * FHS and standards 3.0.1.0.
++	if (opt == NULL)
++		return 0;
 +
-+ -- Roberto Lumbreras <rover@debian.org>  Tue,  3 Aug 1999 02:49:28 +0200
++	if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
++		return -1;
++	qopt = RTA_DATA(opt);
++	
++	fprintf(f,"\n  (%s/%s) (maxclasses %i) (usedclasses %i) (reused classes %i)\n",
++	  qopt->qdisc_crt.srcaddr ? "sour" : "dest",
++	  qopt->qdisc_crt.usemac  ? "mac"  : (qopt->qdisc_crt.usemasq ? "masq" : "ip"),	  
++	  qopt->qdisc_crt.bands_max,	  	  	  
++	  qopt->bands_cur,
++	  qopt->bands_reused
++	  );
++	  
++	if(qopt->qdisc_crt.proxy_maxconn) {
++	  fprintf(f,"  (proxy maxcon %i) (proxy curcon %i)\n",
++	    qopt->qdisc_crt.proxy_maxconn,qopt->proxy_curconn);
++	}
++	
++	fprintf(f,"  (waiting classes %i) (packets requeued %i) (priosum: %Lg)\n",
++	  qopt->nodes_in_heap,
++	  qopt->packets_requed,
++	  qopt->priosum/((long double)((__u32)-1))
++	  );
++
++	fprintf(f,"  (wmode1 %i) (wmode2 %i) \n",
++	  qopt->qdisc_crt.qdisc_modf.weight1.weight_mode,
++	  qopt->qdisc_crt.qdisc_modf.weight2.weight_mode);
++	  
++	return 0;
++}
 +
-+iproute (990530-1) unstable; urgency=low
++static int wrr_print_copt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) {
++  struct tc_wrr_class_stats *copt;
++  long double d=(__u64)-1;
 +
-+  * New upstream version.
-+  * Build with 2.2.10 kernel headers.
-+  * Install new scripts ip/routef ip/routel, but not ip/ifcfg ip/rtpr by
-+    now, I don't know who/what needs rtpr; ifcfg uses arping, and it isn't
-+    available in debian for now.
++  if (opt == NULL) return 0;
 +
-+ -- Roberto Lumbreras <rover@debian.org>  Tue, 22 Jun 1999 02:28:53 +0200
++  if (RTA_PAYLOAD(opt)  < sizeof(*copt))
++    return -1;
++  copt = RTA_DATA(opt);
 +
-+iproute (990329-1) unstable; urgency=low
++  if(!copt->used) {
++    fprintf(f,"(unused)");
++    return 0;
++  }
++  
++  if(copt->usemac) {
++    fprintf(f,"\n  (address: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X)\n",
++      copt->addr[0],copt->addr[1],copt->addr[2],
++      copt->addr[3],copt->addr[4],copt->addr[5]);
++  } else {     
++    fprintf(f,"\n  (address: %i.%i.%i.%i)\n",copt->addr[0],copt->addr[1],copt->addr[2],copt->addr[3]);
++  }    
++  
++  fprintf(f,"  (total weight: %Lg) (current position: %i) (counters: %u %u : %u %u)\n",
++    (copt->class_modf.weight1.val/d)*(copt->class_modf.weight2.val/d),
++    copt->heappos,
++    (unsigned)(copt->penal_ms>>32),
++    (unsigned)(copt->penal_ms & 0xffffffffU),
++    (unsigned)(copt->penal_ls>>32),
++    (unsigned)(copt->penal_ls & 0xffffffffU)
++    );
++    
++  fprintf(f,"  Pars 1: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)\n",
++    copt->class_modf.weight1.val/d,
++    copt->class_modf.weight1.decr/d,
++    copt->class_modf.weight1.incr/d,
++    copt->class_modf.weight1.min/d,
++    copt->class_modf.weight1.max/d);
++
++  fprintf(f,"  Pars 2: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)",
++    copt->class_modf.weight2.val/d,
++    copt->class_modf.weight2.decr/d,
++    copt->class_modf.weight2.incr/d,
++    copt->class_modf.weight2.min/d,
++    copt->class_modf.weight2.max/d);
++  
++  return 0;
++}
 +
-+  * New upstream version.
-+  * Build with 2.2.5 kernel headers.
++static int wrr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++	return 0;
++}
 +
-+ -- Roberto Lumbreras <rover@debian.org>  Sun,  4 Apr 1999 18:50:39 +0200
 +
-+iproute (980630-1) unstable; urgency=low
-+
-+  * New upstream version.
-+  * Build with 2.1.112 kernel headers.
-+  * Rewrote the rules file.
-+
-+ -- Roberto Lumbreras <rover@debian.org>  Wed, 29 Jul 1998 23:37:52 +0200
-+
-+iproute (980119-1) unstable; urgency=low
-+
-+  * Outdated documentation. Upstream docs are scarce.
-+  * Non-Maintainer release
-+  * This package has no correct copyright file!
-+  * Include all the README.* docs from the upstream site.
-+  * Modified to build under glibc
-+  * Build with 2.1.85 kernel headers.
-+  * produce a correct diff.
-+  * Reworked the rules file to utilize debmake fully
-+  * Newest upstream release
-+  * glibc compilation
-+
-+ -- Christoph Lameter <christoph@lameter.com>  Wed,  4 Feb 1998 13:37:28 -0800
-+
-+iproute (961225-2) unstable frozen; urgency=low
-+
-+  * Added a man page for iproute. (Fixes #8080).
-+  * Removed out-of-date patches.
-+  * Added routing.txt from /usr/src/linux/Documentation/networking/routing.txt
-+  * Newer version of debmake.
-+
-+ -- Tom Lees <tom@lpsg.demon.co.uk>  Mon, 17 Apr 1997 17:00:36 +0100
-+
-+iproute (961225-1) unstable; urgency=low
-+
-+  * Initial Release.
-+
-+ -- Tom Lees <tom@lpsg.demon.co.uk>  Mon, 30 Dec 1996 11:12:23 +0000
-+
-+Local variables:
-+mode: debian-changelog
-+End:
---- iproute-20071016.orig/debian/iproute.install
-+++ iproute-20071016/debian/iproute.install
-@@ -0,0 +1,8 @@
-+ip/ip /bin
-+ip/rtmon tc/tc misc/rtacct misc/ss /sbin
-+misc/lnstat misc/nstat /usr/bin/
-+ip/routef ip/routel /usr/bin
-+etc/* /etc
-+tc/*.so /usr/lib/tc
-+misc/arpd /usr/sbin
-+netem/*.dist /usr/lib/tc
---- iproute-20071016.orig/debian/patches/fix_ss_typo.dpatch
-+++ iproute-20071016/debian/patches/fix_ss_typo.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## fix_ss_typo.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/man/man8/ss.8 iproute-20070313/man/man8/ss.8
-+--- iproute-20070313~/man/man8/ss.8	2007-03-13 22:50:56.000000000 +0100
-++++ iproute-20070313/man/man8/ss.8	2007-06-10 19:36:04.000000000 +0200
-+@@ -9,7 +9,7 @@
-+ is used to dump socket statistics. It allows showing information similar
-+ to
-+ .IR netstat .
-+-It can display more TCP information than state than other tools.
-++It can display more TCP and state informations than other tools.
-+ 
-+ .SH OPTIONS
-+ These programs follow the usual GNU command line syntax, with long
---- iproute-20071016.orig/debian/patches/00list
-+++ iproute-20071016/debian/patches/00list
-@@ -0,0 +1,12 @@
-+ip.8-typo
-+wrr-qdisc.dpatch
-+manpages-typo.dpatch
-+ip_address
-+tc_modules.dpatch
-+moo.dpatch
-+ip_route_usage.dpatch
-+tc_cbq_details_typo.dpatch
-+libnetlink_typo.dpatch
-+tcb_htb_typo.dpatch 
-+fix_ss_typo.dpatch
-+remove_tc_filters_reference.dpatch
---- iproute-20071016.orig/debian/patches/libnetlink_typo.dpatch
-+++ iproute-20071016/debian/patches/libnetlink_typo.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## libnetlink_typo.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/man/man3/libnetlink.3 iproute-20070313/man/man3/libnetlink.3
-+--- iproute-20070313~/man/man3/libnetlink.3	2007-03-13 22:50:56.000000000 +0100
-++++ iproute-20070313/man/man3/libnetlink.3	2007-06-10 19:28:30.000000000 +0200
-+@@ -187,7 +187,7 @@
-+ This library should be named librtnetlink.
-+ 
-+ .SH AUTHORS
-+-netlink/rtnetlink was designed and writen by Alexey Kuznetsov.
-++netlink/rtnetlink was designed and written by Alexey Kuznetsov.
-+ Andi Kleen wrote the man page.
-+ 
-+ .SH SEE ALSO
---- iproute-20071016.orig/debian/patches/add-metrics.diff
-+++ iproute-20071016/debian/patches/add-metrics.diff
-@@ -0,0 +1,97 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: show the \ really, see #285507
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+--- iproute-20010824/ip/iproute.c
-++++ iproute-20010824/ip/iproute.c
-+@@ -57,7 +57,7 @@
-+ 	fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n");
-+ 	fprintf(stderr, "           [ rtt NUMBER ] [ rttvar NUMBER ]\n");
-+ 	fprintf(stderr, "           [ window NUMBER] [ cwnd NUMBER ] [ ssthresh REALM ]\n");
-+-	fprintf(stderr, "           [ realms REALM ]\n");
-++	fprintf(stderr, "           [ realms REALM ] [ hoplimit NUMBER ] [ initcwnd NUMBER ]\n");
-+ 	fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n");
-+ 	fprintf(stderr, "          unreachable | prohibit | blackhole | nat ]\n");
-+ 	fprintf(stderr, "TABLE_ID := [ local | main | default | all | NUMBER ]\n");
-+@@ -481,6 +481,8 @@
-+ 				"cwnd",
-+ 				"advmss",
-+ 				"reordering",
-++				"hoplimit",
-++				"initcwnd",
-+ 			};
-+ 			static int hz;
-+ 			if (mxrta[i] == NULL)
-+@@ -750,6 +752,30 @@
-+ 				invarg("\"reordering\" value is invalid\n", *argv);
-+ 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_REORDERING, reord);
-+ #endif
-++#ifdef RTAX_HOPLIMIT
-++		} else if (strcmp(*argv, "hoplimit") == 0) {
-++			unsigned hoplim;
-++			NEXT_ARG();
-++			if (strcmp(*argv, "lock") == 0) {
-++				mxlock |= (1<<RTAX_HOPLIMIT);
-++				NEXT_ARG();
-++			}
-++			if (get_unsigned(&hoplim, *argv, 0))
-++				invarg("\"hoplimit\" value is invalid\n", *argv);
-++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_HOPLIMIT, hoplim);
-++#endif
-++#ifdef RTAX_INITCWND
-++		} else if (strcmp(*argv, "initcwnd") == 0) {
-++			unsigned initcwnd;
-++			NEXT_ARG();
-++			if (strcmp(*argv, "lock") == 0) {
-++				mxlock |= (1<<RTAX_HOPLIMIT);
-++				NEXT_ARG();
-++			}
-++			if (get_unsigned(&initcwnd, *argv, 0))
-++				invarg("\"initcwnd\" value is invalid\n", *argv);
-++			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_INITCWND, initcwnd);
-++#endif
-+ 		} else if (strcmp(*argv, "rtt") == 0) {
-+ 			unsigned rtt;
-+ 			NEXT_ARG();
-+--- iproute-20010824.orig/doc/ip-cref.tex
-++++ iproute-20010824/doc/ip-cref.tex
-+@@ -1324,2 +1324,15 @@
-+ 
-++\item \verb|hoplimit NUMBER|
-++
-++--- [2.5.74+ only] Hop limit on the path to this destination. If it is not
-++    given, Linux uses the value selected with \verb|sysctl| variable
-++    \verb|net/ipv4/ip_default_ttl|.
-++
-++\item \verb|initcwnd NUMBER|
-++
-++--- [2.5.70+ only] Initial congestion window size when establishing
-++    connections to this destination. This value is multiplied with the
-++    MSS (``Maximal Segment Size'') for the connection to get the actual
-++    window size. If it is not given (or set to zero), Linux uses the
-++    values specified in~\cite{RFC2414}.
-+ 
-+@@ -2653,2 +2666,5 @@
-+ 
-++\bibitem{RFC2414}  M.~Allman, S.~Floyd, C.~Partridge.
-++``Increasing TCP's Initial Window'', RFC-2414.
-++
-+ \end{thebibliography}
---- iproute-20071016.orig/debian/patches/esfq-support.dpatch
-+++ iproute-20071016/debian/patches/esfq-support.dpatch
-@@ -0,0 +1,284 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## esfq-support.dpatch by Alexander Wirt <formorer@debian.org>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20060323~/tc/Makefile iproute-20060323/tc/Makefile
-+--- iproute-20060323~/tc/Makefile	2006-09-08 18:57:26.000000000 +0200
-++++ iproute-20060323/tc/Makefile	2006-09-08 18:57:54.000000000 +0200
-+@@ -7,6 +7,7 @@
-+ TCMODULES :=
-+ TCMODULES += q_fifo.o
-+ TCMODULES += q_sfq.o
-++TCMODULES += q_esfq.o
-+ TCMODULES += q_red.o
-+ TCMODULES += q_prio.o
-+ TCMODULES += q_tbf.o
-+diff -urNad iproute-20060323~/tc/Makefile.orig iproute-20060323/tc/Makefile.orig
-+--- iproute-20060323~/tc/Makefile.orig	1970-01-01 01:00:00.000000000 +0100
-++++ iproute-20060323/tc/Makefile.orig	2006-09-08 18:57:26.000000000 +0200
-+@@ -0,0 +1,89 @@
-++TCOBJ= tc.o tc_qdisc.o tc_class.o tc_filter.o tc_util.o \
-++       m_police.o m_estimator.o m_action.o m_ematch.o \
-++       emp_ematch.yacc.o emp_ematch.lex.o
-++
-++include ../Config
-++
-++TCMODULES :=
-++TCMODULES += q_fifo.o
-++TCMODULES += q_sfq.o
-++TCMODULES += q_red.o
-++TCMODULES += q_prio.o
-++TCMODULES += q_tbf.o
-++TCMODULES += q_cbq.o
-++TCMODULES += f_rsvp.o
-++TCMODULES += f_u32.o
-++TCMODULES += f_route.o
-++TCMODULES += f_fw.o
-++TCMODULES += f_basic.o
-++TCMODULES += q_dsmark.o
-++TCMODULES += q_gred.o
-++TCMODULES += f_tcindex.o
-++TCMODULES += q_ingress.o
-++TCMODULES += q_hfsc.o
-++TCMODULES += q_htb.o
-++TCMODULES += m_gact.o
-++TCMODULES += m_mirred.o
-++TCMODULES += m_ipt.o
-++TCMODULES += m_pedit.o
-++TCMODULES += p_ip.o
-++TCMODULES += p_icmp.o
-++TCMODULES += p_tcp.o
-++TCMODULES += p_udp.o
-++TCMODULES += em_nbyte.o
-++TCMODULES += em_cmp.o
-++TCMODULES += em_u32.o
-++TCMODULES += em_meta.o
-++
-++TCOBJ += $(TCMODULES)
-++
-++TCLIB := tc_core.o
-++TCLIB += tc_red.o
-++TCLIB += tc_cbq.o
-++TCLIB += tc_estimator.o
-++
-++CFLAGS += -DCONFIG_GACT -DCONFIG_GACT_PROB
-++
-++TCSO :=
-++TCSO += q_netem.so
-++ifeq ($(TC_CONFIG_ATM),y)
-++  TCSO += q_atm.so
-++endif
-++
-++LDLIBS += -L. -ltc -lm -ldl
-++
-++LDFLAGS += -Wl,-export-dynamic
-++
-++YACC := bison
-++LEX := flex
-++
-++%.so: %.c
-++	$(CC) $(CFLAGS) -shared -fpic $< -o $@
-++
-++
-++all: libtc.a tc $(TCSO)
-++
-++tc: $(TCOBJ) $(LIBNETLINK) $(LIBUTIL) $(TCLIB)
-++
-++libtc.a: $(TCLIB)
-++	$(AR) rcs $@ $(TCLIB)
-++
-++install: all
-++	mkdir -p $(DESTDIR)/usr/lib/tc
-++	install -m 0755 -s tc $(DESTDIR)$(SBINDIR)
-++	for i in $(TCSO); \
-++	do install -m 755 -s $$i $(DESTDIR)/usr/lib/tc; \
-++	done
-++
-++clean:
-++	rm -f $(TCOBJ) $(TCLIB) libtc.a tc *.so emp_ematch.yacc.h; \
-++	rm -f emp_ematch.yacc.output
-++
-++q_atm.so: q_atm.c
-++	$(CC) $(CFLAGS) -shared -fpic -o q_atm.so q_atm.c -latm
-++
-++%.yacc.c: %.y
-++	$(YACC) $(YACCFLAGS) -o $@ $<
-++
-++%.lex.c: %.l
-++	$(LEX) $(LEXFLAGS) -o$@ $<
-+diff -urNad iproute-20060323~/tc/q_esfq.c iproute-20060323/tc/q_esfq.c
-+--- iproute-20060323~/tc/q_esfq.c	1970-01-01 01:00:00.000000000 +0100
-++++ iproute-20060323/tc/q_esfq.c	2006-09-08 18:57:54.000000000 +0200
-+@@ -0,0 +1,169 @@
-++/*
-++ * q_esfq.c		ESFQ.
-++ *
-++ *		This program is free software; you can redistribute it and/or
-++ *		modify it under the terms of the GNU General Public License
-++ *		as published by the Free Software Foundation; either version
-++ *		2 of the License, or (at your option) any later version.
-++ *
-++ * Authors:	Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-++ *
-++ * Changes:	Alexander Atanasov, <alex@ssi.bg>
-++ *		Added depth,limit,divisor,hash_kind options.
-++ */
-++
-++#include <stdio.h>
-++#include <stdlib.h>
-++#include <unistd.h>
-++#include <syslog.h>
-++#include <fcntl.h>
-++#include <math.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: ... esfq [ perturb SECS ] [ quantum BYTES ] [ depth FLOWS ]\n\t[ divisor HASHBITS ] [ limit PKTS ] [ hash HASHTYPE]\n");
-++	fprintf(stderr,"Where: \n");
-++	fprintf(stderr,"HASHTYPE := { classic | src | dst }\n");
-++}
-++
-++#define usage() return(-1)
-++
-++static int esfq_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
-++{
-++	int ok=0;
-++	struct tc_sfq_qopt opt;
-++
-++	memset(&opt, 0, sizeof(opt));
-++
-++	opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
-++	
-++	while (argc > 0) {
-++		if (strcmp(*argv, "quantum") == 0) {
-++			NEXT_ARG();
-++			if (get_size(&opt.quantum, *argv)) {
-++				fprintf(stderr, "Illegal \"quantum\"\n");
-++				return -1;
-++			}
-++			ok++;
-++		} else if (strcmp(*argv, "perturb") == 0) {
-++			NEXT_ARG();
-++			if (get_integer(&opt.perturb_period, *argv, 0)) {
-++				fprintf(stderr, "Illegal \"perturb\"\n");
-++				return -1;
-++			}
-++			ok++;
-++		} else if (strcmp(*argv, "depth") == 0) {
-++			NEXT_ARG();
-++			if (get_integer(&opt.flows, *argv, 0)) {
-++				fprintf(stderr, "Illegal \"depth\"\n");
-++				return -1;
-++			}
-++			ok++;
-++		} else if (strcmp(*argv, "divisor") == 0) {
-++			NEXT_ARG();
-++			if (get_integer(&opt.divisor, *argv, 0)) {
-++				fprintf(stderr, "Illegal \"divisor\"\n");
-++				return -1;
-++			}
-++			if(opt.divisor >= 15) {
-++				fprintf(stderr, "Illegal \"divisor\" must be < 15\n");
-++				return -1;
-++			}
-++			opt.divisor=pow(2,opt.divisor);
-++			ok++;
-++		} else if (strcmp(*argv, "limit") == 0) {
-++			NEXT_ARG();
-++			if (get_integer(&opt.limit, *argv, 0)) {
-++				fprintf(stderr, "Illegal \"limit\"\n");
-++				return -1;
-++			}
-++			ok++;
-++		} else if (strcmp(*argv, "hash") == 0) {
-++			NEXT_ARG();
-++			if(strcmp(*argv,"classic") == 0) {
-++				opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
-++			} else 
-++			if(strcmp(*argv,"dst") == 0) {
-++				opt.hash_kind= TCA_SFQ_HASH_DST;
-++			} else
-++			if(strcmp(*argv,"src") == 0) {
-++				opt.hash_kind= TCA_SFQ_HASH_SRC;
-++			} else {
-++				fprintf(stderr, "Illegal \"hash\"\n");
-++				explain();
-++				return -1;
-++			}
-++			ok++;
-++		} else if (strcmp(*argv, "help") == 0) {
-++			explain();
-++			return -1;
-++		} else {
-++			fprintf(stderr, "What is \"%s\"?\n", *argv);
-++			explain();
-++			return -1;
-++		}
-++		argc--; argv++;
-++	}
-++
-++	if (ok)
-++		addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
-++	return 0;
-++}
-++
-++static int esfq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
-++{
-++	struct tc_sfq_qopt *qopt;
-++	SPRINT_BUF(b1);
-++
-++	if (opt == NULL)
-++		return 0;
-++
-++	if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
-++		return -1;
-++	qopt = RTA_DATA(opt);
-++	fprintf(f, "quantum %s ", sprint_size(qopt->quantum, b1));
-++	if (show_details) {
-++		fprintf(f, "limit %up flows %u/%u ",
-++			qopt->limit, qopt->flows, qopt->divisor);
-++	}
-++	if (qopt->perturb_period)
-++		fprintf(f, "perturb %dsec ", qopt->perturb_period);
-++
-++		fprintf(f,"hash: ");
-++	switch(qopt->hash_kind)
-++	{
-++	case TCA_SFQ_HASH_CLASSIC:
-++		fprintf(f,"classic");
-++		break;
-++	case TCA_SFQ_HASH_DST:
-++		fprintf(f,"dst");
-++		break;
-++	case TCA_SFQ_HASH_SRC:
-++		fprintf(f,"src");
-++		break;
-++	default:
-++		fprintf(f,"Unknown");
-++	}
-++	return 0;
-++}
-++
-++static int esfq_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
-++{
-++	return 0;
-++}
-++
-++
-++struct qdisc_util esfq_util = {
-++	NULL,
-++	"esfq",
-++	esfq_parse_opt,
-++	esfq_print_opt,
-++	esfq_print_xstats,
-++};
---- iproute-20071016.orig/debian/patches/wrr-qdisc.dpatch
-+++ iproute-20071016/debian/patches/wrr-qdisc.dpatch
-@@ -0,0 +1,479 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: add the wrr qdisc scheduler, see #198414
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+diff -urNad pkg-iproute~/include/linux/pkt_sched.h pkg-iproute/include/linux/pkt_sched.h
-+--- pkg-iproute~/include/linux/pkt_sched.h	2007-10-24 16:36:41.000000000 +0200
-++++ pkg-iproute/include/linux/pkt_sched.h	2007-10-24 16:36:56.000000000 +0200
-+@@ -475,4 +475,116 @@
-+ 
-+ #define NETEM_DIST_SCALE	8192
-+ 
-++/* WRR section */
-++
-++/* Other includes */
-++#include <linux/if_ether.h>
-++
-++// A sub weight and of a class
-++// All numbers are represented as parts of (2^64-1).
-++struct tc_wrr_class_weight {
-++	__u64 val;	// Current value			(0 is not valid)
-++	__u64 decr;	// Value pr bytes			(2^64-1 is not valid)
-++	__u64 incr;	// Value pr seconds			(2^64-1 is not valid)
-++	__u64 min;	// Minimal value			(0 is not valid)
-++	__u64 max;	// Minimal value			(0 is not valid)
-++
-++// The time where the above information was correct:
-++	time_t tim;
-++};
-++
-++// Packet send when modifying a class:
-++struct tc_wrr_class_modf {
-++	// Not-valid values are ignored.
-++	struct tc_wrr_class_weight weight1;
-++	struct tc_wrr_class_weight weight2;
-++};
-++
-++// Packet returned when quering a class:
-++struct tc_wrr_class_stats {
-++	char used;	// If this is false the information below is invalid
-++
-++	struct tc_wrr_class_modf class_modf;
-++
-++	unsigned char addr[ETH_ALEN];
-++	char usemac;    // True if addr is a MAC address, else it is an IP address
-++			// (this value is only for convience, it is always the same
-++			//  value as in the qdisc)
-++	int heappos;	// Current heap position or 0 if not in heap
-++	__u64 penal_ls;	// Penalty value in heap (ls)
-++	__u64 penal_ms;	// Penalty value in heap (ms)
-++};
-++
-++// Qdisc-wide penalty information (boolean values - 2 not valid)
-++struct tc_wrr_qdisc_weight {
-++	char weight_mode;	// 0=No automatic change to weight
-++				// 1=Decrease normally
-++				// 2=Also multiply with number of machines
-++				// 3=Instead multiply with priority divided
-++				//   with priority of the other.
-++				// -1=no change
-++};
-++
-++// Packet send when modifing a qdisc:
-++struct tc_wrr_qdisc_modf {
-++	// Not-valid values are ignored:
-++	struct tc_wrr_qdisc_weight weight1;
-++	struct tc_wrr_qdisc_weight weight2;
-++};
-++
-++// Packet send when creating a qdisc:
-++struct tc_wrr_qdisc_crt {
-++	struct tc_wrr_qdisc_modf qdisc_modf;
-++
-++	char srcaddr;	// 1=lookup source, 0=lookup destination
-++	char usemac;	// 1=Classify on MAC addresses, 0=classify on IP
-++	char usemasq;	// 1=Classify based on masqgrading - only valid
-++			//   if usemac is zero
-++	int bands_max;	// Maximal number of bands (i.e.: classes)
-++	int proxy_maxconn;// If differnt from 0 then we support proxy remapping
-++			// of packets. And this is the number of maximal
-++			// concurrent proxy connections.
-++};
-++
-++// Packet returned when quering a qdisc:
-++struct tc_wrr_qdisc_stats {
-++	struct tc_wrr_qdisc_crt qdisc_crt;
-++	int proxy_curconn;
-++	int nodes_in_heap;	// Current number of bands wanting to send something
-++	int bands_cur;		// Current number of bands used (i.e.: MAC/IP addresses seen)
-++	int bands_reused;	// Number of times this band has been reused.
-++	int packets_requed;	// Number of times packets have been requeued.
-++	__u64 priosum;		// Sum of priorities in heap where 1 is 2^32
-++};
-++
-++struct tc_wrr_qdisc_modf_std {
-++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
-++	char proxy; // 0=This struct
-++
-++	// Should we also change a class?
-++	char change_class;
-++
-++	// Only valid if change_class is false
-++	struct tc_wrr_qdisc_modf qdisc_modf;
-++
-++	// Only valid if change_class is true:
-++	unsigned char addr[ETH_ALEN]; // Class to change (non-used bytes should be 0)
-++	struct tc_wrr_class_modf class_modf; // The change
-++};
-++
-++// Used for proxyrempping:
-++struct tc_wrr_qdisc_modf_proxy {
-++	// This indicates which of the tc_wrr_qdisc_modf structers this is:
-++	char proxy;     // 1=This struct
-++
-++	// This is 1 if the proxyremap information should be reset
-++	char reset;
-++
-++	// changec is the number of elements in changes.
-++	int changec;
-++
-++	// This is an array of type ProxyRemapBlock:
-++	long changes[0];
-++};
-++
-+ #endif
-+diff -urNad pkg-iproute~/tc/Makefile pkg-iproute/tc/Makefile
-+--- pkg-iproute~/tc/Makefile	2007-10-24 16:36:12.000000000 +0200
-++++ pkg-iproute/tc/Makefile	2007-10-24 16:37:24.000000000 +0200
-+@@ -11,6 +11,7 @@
-+ TCMODULES += q_prio.o
-+ TCMODULES += q_tbf.o
-+ TCMODULES += q_cbq.o
-++TCMODULES += q_wrr.o
-+ TCMODULES += q_rr.o
-+ TCMODULES += q_netem.o
-+ TCMODULES += f_rsvp.o
-+diff -urNad pkg-iproute~/tc/q_wrr.c pkg-iproute/tc/q_wrr.c
-+--- pkg-iproute~/tc/q_wrr.c	1970-01-01 01:00:00.000000000 +0100
-++++ pkg-iproute/tc/q_wrr.c	2007-10-24 16:36:56.000000000 +0200
-+@@ -0,0 +1,322 @@
-++#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 <math.h>
-++
-++#include "utils.h"
-++#include "tc_util.h"
-++
-++#define usage() return(-1)
-++
-++// Returns -1 on error
-++static int wrr_parse_qdisc_weight(int argc, char** argv, 
-++                              struct tc_wrr_qdisc_modf* opt) {
-++  int i;
-++  
-++  opt->weight1.weight_mode=-1;
-++  opt->weight2.weight_mode=-1;
-++  
-++  for(i=0; i<argc; i++) {  
-++    if(!memcmp(argv[i],"wmode1=",7)) {
-++      opt->weight1.weight_mode=atoi(argv[i]+7);            
-++    } else if(!memcmp(argv[i],"wmode2=",7)) {
-++      opt->weight2.weight_mode=atoi(argv[i]+7);
-++    } else {
-++      printf("Usage: ... [wmode1=0|1|2|3] [wmode2=0|1|2|3]\n");
-++      return -1;
-++    }
-++  }
-++  return 0;
-++}
-++
-++static int wrr_parse_class_modf(int argc, char** argv, 
-++                                struct tc_wrr_class_modf* modf) {
-++  int i;
-++  
-++  if(argc<1) {
-++    fprintf(stderr, "Usage: ... [weight1=val] [decr1=val] [incr1=val] [min1=val] [max1=val] [val2=val] ...\n");
-++    fprintf(stderr, "  The values can be floating point like 0.42 or divisions like 42/100\n");
-++    return -1;
-++  }
-++  
-++  // Set meaningless values:
-++  modf->weight1.val=0;
-++  modf->weight1.decr=(__u64)-1;
-++  modf->weight1.incr=(__u64)-1;
-++  modf->weight1.min=0;
-++  modf->weight1.max=0;
-++  modf->weight2.val=0;
-++  modf->weight2.decr=(__u64)-1;
-++  modf->weight2.incr=(__u64)-1;
-++  modf->weight2.min=0;
-++  modf->weight2.max=0;
-++  
-++  // And read values:
-++  for(i=0; i<argc; i++) {
-++    char arg[80];
-++    char* name,*value1=0,*value2=0;
-++    long double f_val1,f_val2=1,value;
-++    if(strlen(argv[i])>=sizeof(arg)) {
-++      fprintf(stderr,"Argument too long: %s\n",argv[i]);
-++      return -1;
-++    }
-++    strcpy(arg,argv[i]);
-++    
-++    name=strtok(arg,"=");
-++    if(name) value1=strtok(0,"/");
-++    if(value1) value2=strtok(0,"");
-++    
-++    if(!value1) {
-++      fprintf(stderr,"No = found in argument: %s\n",argv[i]);
-++      return -1;
-++    }
-++    
-++    f_val1=atof(value1);
-++    if(value2) f_val2=atof(value2);    
-++    
-++    if(f_val2==0)  {
-++      fprintf(stderr,"Division by 0\n");
-++      return -1;
-++    }
-++        
-++    value=f_val1/f_val2;    
-++    if(value>1) value=1;
-++    if(value<0) value=0;            
-++    value*=((__u64)-1);
-++    
-++    // And find the value set
-++    if(!strcmp(name,"weight1"))    modf->weight1.val=value;
-++    else if(!strcmp(name,"decr1")) modf->weight1.decr=value;
-++    else if(!strcmp(name,"incr1")) modf->weight1.incr=value;
-++    else if(!strcmp(name,"min1"))  modf->weight1.min=value;
-++    else if(!strcmp(name,"max1"))  modf->weight1.max=value;
-++    else if(!strcmp(name,"weight2")) modf->weight2.val=value;
-++    else if(!strcmp(name,"decr2")) modf->weight2.decr=value;
-++    else if(!strcmp(name,"incr2")) modf->weight2.incr=value;
-++    else if(!strcmp(name,"min2"))  modf->weight2.min=value;
-++    else if(!strcmp(name,"max2"))  modf->weight2.max=value;
-++    else {
-++      fprintf(stderr,"illegal value: %s\n",name);
-++      return -1;
-++    }
-++  }    
-++
-++  return 0;
-++}
-++
-++static int wrr_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
-++{
-++  if(n->nlmsg_flags & NLM_F_CREATE) {
-++    // This is a create request:
-++    struct tc_wrr_qdisc_crt opt;
-++	
-++    int sour,dest,ip,mac,masq;
-++
-++    if(argc<4) {
-++      fprintf(stderr, "Usage: ... wrr sour|dest ip|masq|mac maxclasses proxymaxcon [penalty-setup]\n");
-++      return -1;
-++    }	  
-++  
-++    // Read sour/dest:
-++    memset(&opt,0,sizeof(opt));
-++    sour=!strcmp(argv[0],"sour");
-++    dest=!strcmp(argv[0],"dest");	
-++	
-++    if(!sour && !dest) {
-++      fprintf(stderr,"sour or dest must be specified\n");
-++      return -1;
-++    }	
-++
-++    // Read ip/mac
-++    ip=!strcmp(argv[1],"ip");
-++    mac=!strcmp(argv[1],"mac");	
-++    masq=!strcmp(argv[1],"masq");	
-++
-++    if(!ip && !mac && !masq) {
-++      fprintf(stderr,"ip, masq or mac must be specified\n");
-++      return -1;
-++    }	
-++
-++    opt.srcaddr=sour;		
-++    opt.usemac=mac;
-++    opt.usemasq=masq;		
-++    opt.bands_max=atoi(argv[2]);
-++    
-++    opt.proxy_maxconn=atoi(argv[3]);
-++    
-++    // Read weights:
-++    if(wrr_parse_qdisc_weight(argc-4,argv+4,&opt.qdisc_modf)<0) return -1;
-++    if(opt.qdisc_modf.weight1.weight_mode==-1) opt.qdisc_modf.weight1.weight_mode=0;
-++    if(opt.qdisc_modf.weight2.weight_mode==-1) opt.qdisc_modf.weight2.weight_mode=0;
-++		
-++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
-++  } else {
-++    struct tc_wrr_qdisc_modf_std opt;
-++    char qdisc,class;
-++    
-++    // This is a modify request:
-++    if(argc<1) {
-++      fprintf(stderr,"... qdisc ... or ... class ...\n");
-++      return -1;
-++    }
-++            
-++    qdisc=!strcmp(argv[0],"qdisc");
-++    class=!strcmp(argv[0],"class");
-++
-++    if(!qdisc && !class) {
-++      fprintf(stderr,"qdisc or class must be specified\n");
-++      return -1;
-++    }
-++      
-++    argc--;
-++    argv++;
-++      
-++    opt.proxy=0;
-++    
-++    if(qdisc) {
-++      opt.change_class=0;
-++      if(wrr_parse_qdisc_weight(argc, argv, &opt.qdisc_modf)<0) return -1;
-++    } else {
-++      int a0,a1,a2,a3,a4=0,a5=0;      
-++
-++      opt.change_class=1;
-++      
-++      if(argc<1) {
-++        fprintf(stderr,"... <mac>|<ip>|<masq> ...\n");
-++        return -1;
-++      }
-++      memset(opt.addr,0,sizeof(opt.addr));
-++
-++      if((sscanf(argv[0],"%i.%i.%i.%i",&a0,&a1,&a2,&a3)!=4) &&
-++         (sscanf(argv[0],"%x:%x:%x:%x:%x:%x",&a0,&a1,&a2,&a3,&a4,&a5)!=6)) {
-++	fprintf(stderr,"Wrong format of mac or ip address\n");
-++	return -1;
-++      }
-++      
-++      opt.addr[0]=a0; opt.addr[1]=a1; opt.addr[2]=a2;
-++      opt.addr[3]=a3; opt.addr[4]=a4; opt.addr[5]=a5;
-++
-++      if(wrr_parse_class_modf(argc-1, argv+1, &opt.class_modf)<0) return -1;
-++    }  
-++  
-++    addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
-++  }
-++  return 0;
-++}
-++
-++static int wrr_parse_copt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n) {
-++  struct tc_wrr_class_modf opt;
-++  
-++  memset(&opt,0,sizeof(opt));
-++  if(wrr_parse_class_modf(argc,argv,&opt)<0) return -1;
-++  
-++  addattr_l(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
-++  return 0;  
-++}  
-++
-++static int wrr_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
-++{
-++	struct tc_wrr_qdisc_stats *qopt;
-++
-++	if (opt == NULL)
-++		return 0;
-++
-++	if (RTA_PAYLOAD(opt)  < sizeof(*qopt))
-++		return -1;
-++	qopt = RTA_DATA(opt);
-++	
-++	fprintf(f,"\n  (%s/%s) (maxclasses %i) (usedclasses %i) (reused classes %i)\n",
-++	  qopt->qdisc_crt.srcaddr ? "sour" : "dest",
-++	  qopt->qdisc_crt.usemac  ? "mac"  : (qopt->qdisc_crt.usemasq ? "masq" : "ip"),	  
-++	  qopt->qdisc_crt.bands_max,	  	  	  
-++	  qopt->bands_cur,
-++	  qopt->bands_reused
-++	  );
-++	  
-++	if(qopt->qdisc_crt.proxy_maxconn) {
-++	  fprintf(f,"  (proxy maxcon %i) (proxy curcon %i)\n",
-++	    qopt->qdisc_crt.proxy_maxconn,qopt->proxy_curconn);
-++	}
-++	
-++	fprintf(f,"  (waiting classes %i) (packets requeued %i) (priosum: %Lg)\n",
-++	  qopt->nodes_in_heap,
-++	  qopt->packets_requed,
-++	  qopt->priosum/((long double)((__u32)-1))
-++	  );
-++
-++	fprintf(f,"  (wmode1 %i) (wmode2 %i) \n",
-++	  qopt->qdisc_crt.qdisc_modf.weight1.weight_mode,
-++	  qopt->qdisc_crt.qdisc_modf.weight2.weight_mode);
-++	  
-++	return 0;
-++}
-++
-++static int wrr_print_copt(struct qdisc_util *qu, FILE *f, struct rtattr *opt) {
-++  struct tc_wrr_class_stats *copt;
-++  long double d=(__u64)-1;
-++
-++  if (opt == NULL) return 0;
-++
-++  if (RTA_PAYLOAD(opt)  < sizeof(*copt))
-++    return -1;
-++  copt = RTA_DATA(opt);
-++
-++  if(!copt->used) {
-++    fprintf(f,"(unused)");
-++    return 0;
-++  }
-++  
-++  if(copt->usemac) {
-++    fprintf(f,"\n  (address: %.2X:%.2X:%.2X:%.2X:%.2X:%.2X)\n",
-++      copt->addr[0],copt->addr[1],copt->addr[2],
-++      copt->addr[3],copt->addr[4],copt->addr[5]);
-++  } else {     
-++    fprintf(f,"\n  (address: %i.%i.%i.%i)\n",copt->addr[0],copt->addr[1],copt->addr[2],copt->addr[3]);
-++  }    
-++  
-++  fprintf(f,"  (total weight: %Lg) (current position: %i) (counters: %u %u : %u %u)\n",
-++    (copt->class_modf.weight1.val/d)*(copt->class_modf.weight2.val/d),
-++    copt->heappos,
-++    (unsigned)(copt->penal_ms>>32),
-++    (unsigned)(copt->penal_ms & 0xffffffffU),
-++    (unsigned)(copt->penal_ls>>32),
-++    (unsigned)(copt->penal_ls & 0xffffffffU)
-++    );
-++    
-++  fprintf(f,"  Pars 1: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)\n",
-++    copt->class_modf.weight1.val/d,
-++    copt->class_modf.weight1.decr/d,
-++    copt->class_modf.weight1.incr/d,
-++    copt->class_modf.weight1.min/d,
-++    copt->class_modf.weight1.max/d);
-++
-++  fprintf(f,"  Pars 2: (weight %Lg) (decr: %Lg) (incr: %Lg) (min: %Lg) (max: %Lg)",
-++    copt->class_modf.weight2.val/d,
-++    copt->class_modf.weight2.decr/d,
-++    copt->class_modf.weight2.incr/d,
-++    copt->class_modf.weight2.min/d,
-++    copt->class_modf.weight2.max/d);
-++  
-++  return 0;
-++}
-++
-++static int wrr_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
-++{
-++	return 0;
-++}
-++
-++
-++struct qdisc_util wrr_qdisc_util = {
-++	.id = "wrr",
-++	.parse_qopt = wrr_parse_opt,
-++	.print_qopt = wrr_print_opt,
-++	.print_xstats = wrr_print_xstats,
-++	.parse_copt = wrr_parse_copt,
-++	.print_copt = wrr_print_copt
-++};
---- iproute-20071016.orig/debian/patches/remove_tc_filters_reference.dpatch
-+++ iproute-20071016/debian/patches/remove_tc_filters_reference.dpatch
-@@ -0,0 +1,30 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## remove_tc_filters_reference.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/man/man8/tc.8 iproute-20070313/man/man8/tc.8
-+--- iproute-20070313~/man/man8/tc.8	2007-06-10 20:22:40.000000000 +0200
-++++ iproute-20070313/man/man8/tc.8	2007-06-10 20:23:16.000000000 +0200
-+@@ -202,8 +202,7 @@
-+ tc filters
-+ If tc filters are attached to a class, they are consulted first 
-+ for relevant instructions. Filters can match on all fields of a packet header, 
-+-as well as on the firewall mark applied by ipchains or iptables. See 
-+-.BR tc-filters (8).
-++as well as on the firewall mark applied by ipchains or iptables. 
-+ .TP
-+ Type of Service
-+ Some qdiscs have built in rules for classifying packets based on the TOS field.
-+@@ -242,8 +241,7 @@
-+ .TP 
-+ FILTERS
-+ Filters have a three part ID, which is only needed when using a hashed
-+-filter hierarchy, for which see
-+-.BR tc-filters (8).
-++filter hierarchy.
-+ .SH UNITS
-+ All parameters accept a floating point number, possibly followed by a unit.
-+ .P
---- iproute-20071016.orig/debian/patches/tc_sample_fix
-+++ iproute-20071016/debian/patches/tc_sample_fix
-@@ -0,0 +1,33 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: Fixes #347699 
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+diff -Nur iproute-20051007.keep/tc/f_u32.c iproute-20051007/tc/f_u32.c
-+--- iproute-20051007.keep/tc/f_u32.c	2005-01-19 08:11:58.000000000 +1000
-++++ iproute-20051007/tc/f_u32.c	2006-01-12 17:12:43.000000000 +1000
-+@@ -878,6 +878,7 @@
-+ 				struct tc_u32_sel sel;
-+ 				struct tc_u32_key keys[4];
-+ 			} sel2;
-++			memset(&sel2, 0, sizeof(sel2));
-+ 			NEXT_ARG();
-+ 			if (parse_selector(&argc, &argv, &sel2.sel, n)) {
-+ 				fprintf(stderr, "Illegal \"sample\"\n");
---- iproute-20071016.orig/debian/patches/tcb_htb_typo.dpatch
-+++ iproute-20071016/debian/patches/tcb_htb_typo.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## tcb_htb_typo.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/man/man8/tc-htb.8 iproute-20070313/man/man8/tc-htb.8
-+--- iproute-20070313~/man/man8/tc-htb.8	2007-03-13 22:50:56.000000000 +0100
-++++ iproute-20070313/man/man8/tc-htb.8	2007-06-10 19:30:08.000000000 +0200
-+@@ -137,7 +137,7 @@
-+ .SH NOTES
-+ Due to Unix timing constraints, the maximum ceil rate is not infinite and may in fact be quite low. On Intel, 
-+ there are 100 timer events per second, the maximum rate is that rate at which 'burst' bytes are sent each timer tick.
-+-From this, the mininum burst size for a specified rate can be calculated. For i386, a 10mbit rate requires a 12 kilobyte 
-++From this, the minimum burst size for a specified rate can be calculated. For i386, a 10mbit rate requires a 12 kilobyte 
-+ burst as 100*12kb*8 equals 10mbit.
-+ 
-+ .SH SEE ALSO
---- iproute-20071016.orig/debian/patches/ip_route_usage.dpatch
-+++ iproute-20071016/debian/patches/ip_route_usage.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## ip_route_usage.dpatch by Alexander Wirt <formorer@debian.org>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad pkg-iproute~/ip/iproute.c pkg-iproute/ip/iproute.c
-+--- pkg-iproute~/ip/iproute.c	2007-10-18 14:04:18.000000000 +0200
-++++ pkg-iproute/ip/iproute.c	2007-10-18 14:23:11.000000000 +0200
-+@@ -72,7 +72,7 @@
-+ 	fprintf(stderr, "OPTIONS := FLAGS [ mtu NUMBER ] [ advmss NUMBER ]\n");
-+ 	fprintf(stderr, "           [ rtt TIME ] [ rttvar TIME ]\n");
-+ 	fprintf(stderr, "           [ window NUMBER] [ cwnd NUMBER ] [ initcwnd NUMBER ]\n");
-+-	fprintf(stderr, "           [ ssthresh NUMBER ] [ realms REALM ]\n");
-++	fprintf(stderr, "           [ ssthresh NUMBER ] [ realms REALM ] [ src ADDRESS ]\n");
-+ 	fprintf(stderr, "           [ rto_min TIME ]\n");
-+ 	fprintf(stderr, "TYPE := [ unicast | local | broadcast | multicast | throw |\n");
-+ 	fprintf(stderr, "          unreachable | prohibit | blackhole | nat ]\n");
---- iproute-20071016.orig/debian/patches/manpages-typo.dpatch
-+++ iproute-20071016/debian/patches/manpages-typo.dpatch
-@@ -0,0 +1,44 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## manpages-typo.dpatch by Alexander Wirt <formorer@debian.org>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20061002~/man/man8/tc-prio.8 iproute-20061002/man/man8/tc-prio.8
-+--- iproute-20061002~/man/man8/tc-prio.8	2006-10-15 17:06:41.000000000 +0200
-++++ iproute-20061002/man/man8/tc-prio.8	2006-10-15 17:10:52.000000000 +0200
-+@@ -30,7 +30,7 @@
-+ On creation with 'tc qdisc add', a fixed number of bands is created. Each
-+ band is a class, although is not possible to add classes with 'tc qdisc
-+ add', the number of bands to be created must instead be specified on the
-+-commandline attaching PRIO to its root.
-++command line attaching PRIO to its root.
-+ 
-+ When dequeueing, band 0 is tried first and only if it did not deliver a
-+ packet does PRIO try band 1, and so onwards. Maximum reliability packets
-+@@ -88,7 +88,7 @@
-+ The four TOS bits (the 'TOS field') are defined as:
-+ 
-+ .nf
-+-Binary Decimcal  Meaning
-++Binary Decimal  Meaning
-+ -----------------------------------------
-+ 1000   8         Minimize delay (md)
-+ 0100   4         Maximize throughput (mt)
-+@@ -125,13 +125,13 @@
-+ 
-+ The second column contains the value of the relevant
-+ four TOS bits, followed by their translated meaning. For example, 15 stands
-+-for a packet wanting Minimal Montetary Cost, Maximum Reliability, Maximum
-++for a packet wanting Minimal Monetary Cost, Maximum Reliability, Maximum
-+ Throughput AND Minimum Delay. 
-+ 
-+ The fourth column lists the way the Linux kernel interprets the TOS bits, by
-+ showing to which Priority they are mapped.
-+ 
-+-The last column shows the result of the default priomap. On the commandline,
-++The last column shows the result of the default priomap. On the command line,
-+ the default priomap looks like this:
-+ 
-+     1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
---- iproute-20071016.orig/debian/patches/tc_modules.dpatch
-+++ iproute-20071016/debian/patches/tc_modules.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## tc_modules.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/include/iptables.h iproute-20070313/include/iptables.h
-+--- iproute-20070313~/include/iptables.h	2007-03-13 22:50:56.000000000 +0100
-++++ iproute-20070313/include/iptables.h	2007-06-10 17:56:38.000000000 +0200
-+@@ -5,7 +5,7 @@
-+ #include "libiptc/libiptc.h"
-+ 
-+ #ifndef IPT_LIB_DIR
-+-#define IPT_LIB_DIR "/usr/local/lib/iptables"
-++#define IPT_LIB_DIR "/lib/iptables"
-+ #endif
-+ 
-+ #ifndef IPPROTO_SCTP
---- iproute-20071016.orig/debian/patches/ip_address
-+++ iproute-20071016/debian/patches/ip_address
-@@ -0,0 +1,34 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: Removed mentioning of "ip address" in the ip output 
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+diff -ruN iproute-20051007.orig/ip/ipaddress.c iproute-20051007/ip/ipaddress.c
-+--- iproute-20051007.orig/ip/ipaddress.c	2005-09-21 21:33:18.000000000 +0200
-++++ iproute-20051007/ip/ipaddress.c	2006-03-14 07:26:26.830934712 +0100
-+@@ -901,7 +901,7 @@
-+ 		return ipaddr_list_or_flush(argc-1, argv+1, 1);
-+ 	if (matches(*argv, "help") == 0)
-+ 		usage();
-+-	fprintf(stderr, "Command \"%s\" is unknown, try \"ip address help\".\n", *argv);
-++	fprintf(stderr, "Command \"%s\" is unknown, try \"ip addr help\".\n", *argv);
-+ 	exit(-1);
-+ }
-+ 
---- iproute-20071016.orig/debian/patches/ip.8-typo
-+++ iproute-20071016/debian/patches/ip.8-typo
-@@ -0,0 +1,33 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: show the \ really, see #285507
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+--- orig/man/man8/ip.8	2004-10-19 20:49:02.000000000 +0000
-++++ new/man/man8/ip.8	2005-01-05 22:04:12.000000000 +0000
-+@@ -374,7 +374,7 @@
-+ .BR "\-o" , " \-oneline"
-+ output each record on a single line, replacing line feeds
-+ with the
-+-.B '\'
-++.B '\e\'
-+ character. This is convenient when you want to count records 
-+ with
-+ .BR wc (1)
---- iproute-20071016.orig/debian/patches/f_u32
-+++ iproute-20071016/debian/patches/f_u32
-@@ -0,0 +1,63 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: Fixes the u32 calculation for 2.6 kernel - by Russell Stuart <russell-debian@stuart.id.au> 
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+diff -Nur iproute-20051007.keep/tc/f_u32.c iproute-20051007/tc/f_u32.c
-+--- iproute-20051007.keep/tc/f_u32.c	2006-01-12 17:34:37.000000000 +1000
-++++ iproute-20051007/tc/f_u32.c	2006-02-07 17:10:29.000000000 +1000
-+@@ -17,6 +17,7 @@
-+ #include <syslog.h>
-+ #include <fcntl.h>
-+ #include <sys/socket.h>
-++#include <sys/utsname.h>
-+ #include <netinet/in.h>
-+ #include <arpa/inet.h>
-+ #include <string.h>
-+@@ -874,6 +875,7 @@
-+ 				htid = (handle&0xFFFFF000);
-+ 		} else if (strcmp(*argv, "sample") == 0) {
-+ 			__u32 hash;
-++			struct utsname utsname;
-+ 			struct {
-+ 				struct tc_u32_sel sel;
-+ 				struct tc_u32_key keys[4];
-+@@ -889,8 +891,19 @@
-+ 				return -1;
-+ 			}
-+ 			hash = sel2.sel.keys[0].val&sel2.sel.keys[0].mask;
-+-			hash ^= hash>>16;
-+-			hash ^= hash>>8;
-++			uname(&utsname);
-++			if (strncmp(utsname.release, "2.4.", 4) == 0) {
-++				hash ^= hash>>16;
-++				hash ^= hash>>8;
-++			}
-++			else {
-++				__u32 mask = sel2.sel.keys[0].mask;
-++				while (mask && !(mask & 1)) {
-++				  	mask >>= 1;
-++					hash >>= 1;
-++				}
-++				hash &= 0xFF;
-++			}
-+ 			htid = ((hash<<12)&0xFF000)|(htid&0xFFF00000);
-+ 			sample_ok = 1;
-+ 			continue;
---- iproute-20071016.orig/debian/patches/moo.dpatch
-+++ iproute-20071016/debian/patches/moo.dpatch
-@@ -0,0 +1,39 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## moo.dpatch by Alexander Wirt <formorer@debian.org>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: Add moo feature
-+
-+@DPATCH@
-+diff -urNad pkg-iproute~/ip/ip.c pkg-iproute/ip/ip.c
-+--- pkg-iproute~/ip/ip.c	2007-10-18 11:48:11.000000000 +0200
-++++ pkg-iproute/ip/ip.c	2007-10-18 14:14:20.000000000 +0200
-+@@ -59,6 +59,20 @@
-+ 	usage();
-+ }
-+ 
-++static int do_moo(int argc, char **argv)
-++{
-++	
-++fprintf(stderr,
-++"\n"
-++" _ __ ___   ___   ___\n"
-++"| '_ ` _ \\ / _ \\ / _ \\\n"
-++"| | | | | | (_) | (_) |\n"
-++"|_| |_| |_|\\___/ \\___/\n"
-++"\n\n"
-++"P.S. no real cows were harmed for this moo\n");
-++	exit(1);
-++}
-++                       
-+ static const struct cmd {
-+ 	const char *cmd;
-+ 	int (*func)(int argc, char **argv);
-+@@ -78,6 +92,7 @@
-+ 	{ "xfrm",	do_xfrm },
-+ 	{ "mroute",	do_multiroute },
-+ 	{ "help",	do_help },
-++	{ "moo",	do_moo }, 
-+ 	{ 0 }
-+ };
-+ 
---- iproute-20071016.orig/debian/patches/heap_corruptionfix
-+++ iproute-20071016/debian/patches/heap_corruptionfix
-@@ -0,0 +1,47 @@
-+#! /bin/sh -e
-+## 
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: add references to lartc
-+## DP: also drop bogus reference to tc-filters
-+
-+[ -f debian/patches/00patch-opts ] && . debian/patches/00patch-opts
-+patch_opts="${patch_opts:--f --no-backup-if-mismatch}"
-+
-+if [ $# -ne 1 ]; then
-+    echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+    exit 1
-+fi
-+case "$1" in
-+       -patch) patch $patch_opts -p1 < $0;;
-+       -unpatch) patch $patch_opts -p1 -R < $0;;
-+        *)
-+                echo >&2 "`basename $0`: script expects -patch|-unpatch as argument"
-+                exit 1;;
-+esac
-+
-+exit 0
-+@DPATCH@
-+diff -urNad iproute-20041019/tc/normal.c /tmp/dpep.9YHbob/iproute-20041019/tc/normal.c
-+--- iproute-20041019/tc/normal.c	2004-10-19 14:49:02.000000000 -0600
-++++ /tmp/dpep.9YHbob/iproute-20041019/tc/normal.c	2005-09-06 15:48:45.000000000 -0600
-+@@ -26,7 +26,7 @@
-+ 	double x, *table;
-+ 	int i, n;
-+ 
-+-	table = calloc(sizeof(double), TABLESIZE);
-++	table = calloc(TABLESIZE+1, sizeof(double));
-+ 	if (!table) {
-+ 		fprintf(stderr, "Not enough memory\n");
-+ 		return 1;
-+diff -urNad iproute-20041019/tc/paretonormal.c /tmp/dpep.9YHbob/iproute-20041019/tc/paretonormal.c
-+--- iproute-20041019/tc/paretonormal.c	2004-10-19 14:49:02.000000000 -0600
-++++ /tmp/dpep.9YHbob/iproute-20041019/tc/paretonormal.c	2005-09-06 15:49:01.000000000 -0600
-+@@ -54,7 +54,7 @@
-+ 	double *table;
-+ 	int i,n;
-+ 
-+-	table = calloc(TABLESIZE, sizeof(double));
-++	table = calloc(TABLESIZE+1, sizeof(double));
-+ 	if (!table) {
-+ 		fprintf(stderr, "Out of memory!\n");
-+ 		exit(1);
---- iproute-20071016.orig/debian/patches/tc_cbq_details_typo.dpatch
-+++ iproute-20071016/debian/patches/tc_cbq_details_typo.dpatch
-@@ -0,0 +1,19 @@
-+#! /bin/sh /usr/share/dpatch/dpatch-run
-+## tc_cbq_details_typo.dpatch by  <formorer@lisa.springfield.lan>
-+##
-+## All lines beginning with `## DP:' are a description of the patch.
-+## DP: No description.
-+
-+@DPATCH@
-+diff -urNad iproute-20070313~/man/man8/tc-cbq-details.8 iproute-20070313/man/man8/tc-cbq-details.8
-+--- iproute-20070313~/man/man8/tc-cbq-details.8	2007-06-10 19:25:18.000000000 +0200
-++++ iproute-20070313/man/man8/tc-cbq-details.8	2007-06-10 19:25:58.000000000 +0200
-+@@ -210,7 +210,7 @@
-+ priority. If found, choose it, and terminate.
-+ .TP
-+ (iii)
-+-Choose the class at which break out to the fallback algorithm occured. Terminate.
-++Choose the class at which break out to the fallback algorithm occurred. Terminate.
-+ .P
-+ The packet is enqueued to the class which was chosen when either algorithm 
-+ terminated. It is therefore possible for a packet to be enqueued *not* at a
---- iproute-20071016.orig/debian/iproute.manpages
-+++ iproute-20071016/debian/iproute.manpages
-@@ -0,0 +1,2 @@
-+man/*/*
-+debian/man/*
---- iproute-20071016.orig/debian/iproute-doc.install
-+++ iproute-20071016/debian/iproute-doc.install
-@@ -0,0 +1 @@
-+debian/doc/htb/* /usr/share/doc/iproute-doc/htb
---- iproute-20071016.orig/debian/compat
-+++ iproute-20071016/debian/compat
-@@ -0,0 +1 @@
-+5
---- iproute-20071016.orig/debian/iproute-dev.install
-+++ iproute-20071016/debian/iproute-dev.install
-@@ -0,0 +1,2 @@
-+*/*.h /usr/include/iproute/
-+lib/libnetlink.a /usr/lib
---- iproute-20071016.orig/debian/man/rtmon.8
-+++ iproute-20071016/debian/man/rtmon.8
-@@ -0,0 +1,58 @@
-+.TH RTMON 8
-+.SH NAME
-+rtmon \- listens to and monitors RTnetlink
-+.SH SYNOPSIS
-+.B rtmon
-+.RI "[ options ] file FILE [ all | LISTofOBJECTS ]"
-+.SH DESCRIPTION
-+This manual page documents briefly the
-+.B rtmon
-+command.
-+.PP
-+\fBrtmon\fP is a RTnetlink listener. RTnetlink allows the kernel's routing tables to be read and altered.
-+
-+rtmon should be started before the first network configuration command is issued. For example if you insert:
-+
-+ rtmon file /var/log/rtmon.log
-+
-+in a startup script, you will be able to view the full history later.
-+Certainly, it is possible to start rtmon at any time. It prepends the history with the state snapshot dumped at the moment of starting.
-+.SH OPTIONS
-+rtmon supports the following options:
-+.TP
-+.B \-Version
-+Print version and exit.
-+.TP
-+.B help
-+Show summary of options.
-+.TP
-+.B file FILE [ all | LISTofOBJECTS ]
-+Log output to FILE. LISTofOBJECTS is the list of object types that we want to monitor.
-+It may contain 'link', 'address', 'route' and 'all'. 'link' specifies the network device, 'address'
-+the protocol (IP or IPv6) address on a device, 'route' the routing table entry and 'all' does what the name says.
-+.TP
-+.B \-family [ inet | inet6 | link | help ]
-+Specify protocol family. 'inet' is IPv4, 'inet6' is IPv6, 'link' means that no networking protocol is involved and 'help' prints usage information.
-+.TP
-+.B \-4
-+Use IPv4. Shortcut for -family inet.
-+.TP
-+.B \-6
-+Use IPv6. Shortcut for -family inet6.
-+.TP
-+.B \-0
-+Use a special family identifier meaning that no networking protocol is involved. Shortcut for -family link.
-+.SH USAGE EXAMPLES
-+.TP
-+.B # rtmon file /var/log/rtmon.log
-+Log to file /var/log/rtmon.log, then run:
-+.TP
-+.B # ip monitor file /var/log/rtmon.log
-+to display logged output from file.
-+.SH SEE ALSO
-+.BR ip (8)
-+.SH AUTHOR
-+rtmon was written by Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>.
-+.PP
-+This manual page was written by Michael Prokop <mika@grml.org>,
-+for the Debian project (but may be used by others).
---- iproute-20071016.orig/debian/rules
-+++ iproute-20071016/debian/rules
-@@ -0,0 +1,45 @@
-+#!/usr/bin/make -f
-+
-+# created by Andreas Barth <aba@not.so.argh.org> 2004
-+
-+build: build-arch
-+
-+include /usr/share/dpatch/dpatch.make
-+
-+clean: clean-patched unpatch
-+clean-patched:
-+	-rm stamp-build
-+	dh_testdir
-+	dh_testroot
-+	dh_clean
-+	make clean
-+
-+binary: binary-indep binary-arch
-+
-+binary-indep build-indep:
-+
-+binary-arch: build-arch
-+	dh_testdir
-+	dh_testroot
-+	dh_install --fail-missing
-+	dh_link
-+	dh_installexamples -p iproute-doc examples/*
-+	dh_installman
-+	dh_installdocs
-+	dh_installchangelogs
-+	dh_compress
-+	dh_strip
-+	dh_fixperms
-+	dh_installdeb
-+	dh_shlibdeps -Xq_atm.so
-+	dh_gencontrol
-+	dh_md5sums
-+	dh_builddeb
-+
-+build-arch: stamp-build
-+stamp-build: patch
-+	$(MAKE) KERNEL_INCLUDE=./include
-+	$(MAKE) -C doc all txt
-+	touch stamp-build
-+
-+.PHONY: build binary binary-arch binary-indep clean
---- iproute-20071016.orig/debian/control
-+++ iproute-20071016/debian/control
-@@ -0,0 +1,46 @@
-+Source: iproute
-+Section: net
-+Priority: optional
-+Maintainer: Alexander Wirt <formorer@debian.org>
-+Uploaders: Andreas Barth <aba@not.so.argh.org>, Andreas Henriksson <andreas@fatal.se>
-+Homepage: http://www.linux-foundation.org/en/Net:Iproute2
-+Vcs-Browser: http://git.debian.org/?p=collab-maint/pkg-iproute.git
-+Vcs-Git: git://git.debian.org/git/collab-maint/pkg-iproute.git
-+Standards-Version: 3.7.3
-+Build-Depends: texlive-latex-base, texlive-latex-recommended, libatm1-dev, bison, libdb-dev, linuxdoc-tools, linux-libc-dev, debhelper (>= 5), lynx, dpatch, flex
-+
-+Package: iproute
-+Architecture: any
-+Provides: arpd
-+Conflicts: arpd
-+Depends: ${shlibs:Depends}
-+Recommends: libatm1
-+Suggests: iproute-doc
-+Description: Professional tools to control the networking in Linux kernels
-+ This is `iproute', the professional set of tools to control the
-+ networking behavior in kernels 2.2.x and later.
-+ .
-+ At least, the options CONFIG_NETLINK and CONFIG_NETLINK_DEV (or
-+ CONFIG_RTNETLINK) must be compiled into the running kernel.
-+ .
-+ This package is also known as iproute2 upstream and in some
-+ documentation.
-+
-+Package: iproute-doc
-+Section: doc
-+Architecture: all
-+Description: Professional tools to control the networking in Linux kernels
-+ This package contains the documentation for the iproute package. 
-+ .
-+ iproute is the professional set of tools to control the
-+ networking behavior in kernels 2.2.x and late
-+
-+Package: iproute-dev
-+Section: libdevel
-+Architecture: any
-+Description: Development package for iproute
-+ This package contains the header files and static libs for developing
-+ iproute additions. iproute is the professional set of tools to control the
-+ networking behavior in kernels 2.2.x and later.
-+ .
-+ You don't need this package unless doing development.
---- iproute-20071016.orig/debian/iproute-doc.docs
-+++ iproute-20071016/debian/iproute-doc.docs
-@@ -0,0 +1,4 @@
-+README* doc/Plan RELNOTES
-+doc/*.tex doc/*.dvi doc/*.ps doc/*.sty
-+doc/*.txt doc/*.html
-+debian/htb/* 
---- iproute-20071016.orig/ip/iptunnel.c
-+++ iproute-20071016/ip/iptunnel.c
-@@ -113,7 +113,7 @@
- 			NEXT_ARG();
- 			p->i_flags |= GRE_KEY;
- 			if (strchr(*argv, '.'))
--				p->o_key = get_addr32(*argv);
-+				p->i_key = get_addr32(*argv);
- 			else {
- 				if (get_unsigned(&uval, *argv, 0)<0) {
- 					fprintf(stderr, "invalid value of \"ikey\"\n");
---- iproute-20071016.orig/ip/iproute.c
-+++ iproute-20071016/ip/iproute.c
-@@ -780,6 +780,18 @@
- 				invarg("\"reordering\" value is invalid\n", *argv);
- 			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_REORDERING, reord);
- #endif
-+#ifdef RTAX_HOPLIMIT
-+		} else if (strcmp(*argv, "hoplimit") == 0) {
-+			unsigned hoplim;
-+			NEXT_ARG();
-+			if (strcmp(*argv, "lock") == 0) {
-+				mxlock |= (1<<RTAX_HOPLIMIT);
-+				NEXT_ARG();
-+			}
-+			if (get_unsigned(&hoplim, *argv, 0))
-+				invarg("\"hoplimit\" value is invalid\n", *argv);
-+			rta_addattr32(mxrta, sizeof(mxbuf), RTAX_HOPLIMIT, hoplim);
-+#endif
- 		} else if (strcmp(*argv, "rtt") == 0) {
- 			unsigned rtt;
- 			NEXT_ARG();
---- iproute-20071016.orig/ip/ipaddress.c
-+++ iproute-20071016/ip/ipaddress.c
-@@ -34,6 +34,8 @@
- #include "ll_map.h"
- #include "ip_common.h"
- 
-+#define MAX_ROUNDS 10
-+
- static struct
- {
- 	int ifindex;
-@@ -667,7 +669,7 @@
- 		filter.flushp = 0;
- 		filter.flushe = sizeof(flushb);
- 
--		for (;;) {
-+		while (round < MAX_ROUNDS) {
- 			if (rtnl_wilddump_request(&rth, filter.family, RTM_GETADDR) < 0) {
- 				perror("Cannot send dump request");
- 				exit(1);
-@@ -694,6 +696,8 @@
- 				fflush(stdout);
- 			}
- 		}
-+		fprintf(stderr, "*** Flush remains incomplete after %d rounds. ***\n", MAX_ROUNDS); fflush(stderr);
-+		return 1;
- 	}
- 
- 	if (filter.family != AF_PACKET) {
---- iproute-20071016.orig/ip/iplink.c
-+++ iproute-20071016/ip/iplink.c
-@@ -107,7 +107,8 @@
- {
- 	struct nlmsgerr *err = (struct nlmsgerr *)NLMSG_DATA(n);
- 
--	if (n->nlmsg_type == NLMSG_ERROR && err->error == -EOPNOTSUPP)
-+	if (n->nlmsg_type == NLMSG_ERROR &&
-+	    (err->error == -EOPNOTSUPP || err->error == -EINVAL))
- 		have_rtnl_newlink = 0;
- 	else
- 		have_rtnl_newlink = 1;
---- iproute-20071016.orig/Makefile
-+++ iproute-20071016/Makefile
-@@ -56,6 +56,7 @@
- 	ln -sf lnstat.8  $(DESTDIR)$(MANDIR)/man8/rtstat.8
- 	ln -sf lnstat.8  $(DESTDIR)$(MANDIR)/man8/ctstat.8
- 	ln -sf rtacct.8  $(DESTDIR)$(MANDIR)/man8/nstat.8
-+	ln -sf routel.8  $(DESTDIR)$(MANDIR)/man8/routef.8
- 	install -m 0755 -d $(DESTDIR)$(MANDIR)/man3
- 	install -m 0644 $(shell find man/man3 -maxdepth 1 -type f) $(DESTDIR)$(MANDIR)/man3
- 
---- iproute-20071016.orig/man/man8/ip.8
-+++ iproute-20071016/man/man8/ip.8
-@@ -32,7 +32,7 @@
- .br
- .BR promisc " { " on " | " off " } |"
- .br
--.BR allmulti " { " on " | " off " } |"
-+.BR allmulticast " { " on " | " off " } |"
- .br
- .BR dynamic " { " on " | " off " } |"
- .br
-@@ -1568,10 +1568,12 @@
- set
- .I unique
- priority value.
-+The options preference and order are synonyms with priority.
- 
- .TP
- .BI table " TABLEID"
- the routing table identifier to lookup if the rule selector matches.
-+It is also possible to use lookup instead of table.
- 
- .TP
- .BI realms " FROM/TO"
-@@ -1589,6 +1591,7 @@
- routes) or a local host address (or even zero).
- In the last case the router does not translate the packets, but
- masquerades them to this address.
-+Using map-to instead of nat means the same thing.
- 
- .B Warning:
- Changes to the RPDB made with these commands do not become active
-@@ -1601,6 +1604,7 @@
- 
- .SS ip rule show - list rules
- This command has no arguments.
-+The options list or lst are synonyms with show.
- 
- .SH ip maddress - multicast addresses management
- 
---- iproute-20071016.orig/man/man8/ss.8
-+++ iproute-20071016/man/man8/ss.8
-@@ -107,7 +107,7 @@
- .B ss -o state established '( dport = :ssh or sport = :ssh )'
- Display all established ssh connections.
- .TP
--.B ss -x src \"/tmp/.X11-unix/*\"
-+.B ss -x src /tmp/.X11-unix/*
- Find all local processes connected to X server.
- .TP
- .B ss -o state fin-wait-1 '( sport = :http or sport = :https )' dst 193.233.7/24
---- iproute-20071016.orig/man/man8/routel.8
-+++ iproute-20071016/man/man8/routel.8
-@@ -0,0 +1,32 @@
-+.TH "ROUTEL" "8" "3 Jan, 2008" "iproute2" "Linux"
-+.SH "NAME"
-+.LP 
-+routel \- list routes with pretty output format
-+.br
-+routef \- flush routes
-+.SH "SYNTAX"
-+.LP 
-+routel [\fItablenr\fP [\fIraw ip args...\fP]]
-+.br 
-+routef
-+.SH "DESCRIPTION"
-+.LP 
-+These programs are a set of helper scripts you can use instead of raw iproute2 commands.
-+.br
-+The routel script will list routes in a format that some might consider easier to interpret then the ip route list equivalent.
-+.br
-+The routef script does not take any arguments and will simply flush the routing table down the drain. Beware! This means deleting all routes which will make your network unusable!
-+
-+.SH "FILES"
-+.LP 
-+\fI/usr/bin/routef\fP 
-+.br 
-+\fI/usr/bin/routel\fP 
-+.SH "AUTHORS"
-+.LP 
-+The routel script was written by Stephen R. van den Berg <srb@cuci.nl>, 1999/04/18 and donated to the public domain.
-+.br
-+This manual page was written by Andreas Henriksson  <andreas@fatal.se>, for the Debian GNU/Linux system.
-+.SH "SEE ALSO"
-+.LP 
-+ip(8)
++struct qdisc_util wrr_qdisc_util = {
++	.id = "wrr",
++	.parse_qopt = wrr_parse_opt,
++	.print_qopt = wrr_print_opt,
++	.print_xstats = wrr_print_xstats,
++	.parse_copt = wrr_parse_copt,
++	.print_copt = wrr_print_copt
++};
diff --git a/package/iproute2/patches/001-iproute2-2.6.11_Config.patch b/package/iproute2/patches/001-iproute2-2.6.11_Config.patch
new file mode 100644
index 0000000000..d92cd7918b
--- /dev/null
+++ b/package/iproute2/patches/001-iproute2-2.6.11_Config.patch
@@ -0,0 +1,9 @@
+Index: iproute-2.6.20-070313/Config
+===================================================================
+--- /dev/null	1970-01-01 00:00:00.000000000 +0000
++++ iproute-2.6.20-070313/Config	2007-06-09 13:53:58.000000000 +0100
+@@ -0,0 +1,4 @@
++# Fixed config to disable ATM support even if present on host system
++TC_CONFIG_ATM:=n
++TC_CONFIG_ACTION_GACT=y
++TC_CONFIG_ACTION_PROB=y
diff --git a/package/iproute2/patches/003-iproute2-htb_overhead.patch b/package/iproute2/patches/003-iproute2-htb_overhead.patch
new file mode 100644
index 0000000000..5af1a02cba
--- /dev/null
+++ b/package/iproute2/patches/003-iproute2-htb_overhead.patch
@@ -0,0 +1,98 @@
+Index: iproute-2.6.20-070313/tc/q_htb.c
+===================================================================
+--- iproute-2.6.20-070313.orig/tc/q_htb.c	2007-06-09 13:53:57.000000000 +0100
++++ iproute-2.6.20-070313/tc/q_htb.c	2007-06-09 13:54:00.000000000 +0100
+@@ -35,10 +35,14 @@
+ 		" default  minor id of class to which unclassified packets are sent {0}\n"
+ 		" r2q      DRR quantums are computed as rate in Bps/r2q {10}\n"
+ 		" debug    string of 16 numbers each 0-3 {0}\n\n"
+-		"... class add ... htb rate R1 burst B1 [prio P] [slot S] [pslot PS]\n"
++		"... class add ... htb rate R1 [burst B1] [mpu B] [overhead O]\n"
++		"                      [prio P] [slot S] [pslot PS]\n"
+ 		"                      [ceil R2] [cburst B2] [mtu MTU] [quantum Q]\n"
+ 		" rate     rate allocated to this class (class can still borrow)\n"
+ 		" burst    max bytes burst which can be accumulated during idle period {computed}\n"
++		" mpu      minimum packet size used in rate computations\n"
++		" overhead per-packet size overhead used in rate computations\n"
++
+ 		" ceil     definite upper class rate (no borrows) {rate}\n"
+ 		" cburst   burst but for ceil {computed}\n"
+ 		" mtu      max packet size we create rate map for {1600}\n"
+@@ -103,7 +107,9 @@
+ 	struct tc_htb_opt opt;
+ 	__u32 rtab[256],ctab[256];
+ 	unsigned buffer=0,cbuffer=0;
+-	int cell_log=-1,ccell_log = -1,mtu;
++	int cell_log=-1,ccell_log = -1;
++	unsigned mtu, mpu;
++	unsigned char mpu8 = 0, overhead = 0;
+ 	struct rtattr *tail;
+ 
+ 	memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
+@@ -120,6 +126,16 @@
+ 			if (get_u32(&mtu, *argv, 10)) {
+ 				explain1("mtu"); return -1;
+ 			}
++		} else if (matches(*argv, "mpu") == 0) {
++			NEXT_ARG();
++			if (get_u8(&mpu8, *argv, 10)) {
++				explain1("mpu"); return -1;
++			}
++		} else if (matches(*argv, "overhead") == 0) {
++			NEXT_ARG();
++			if (get_u8(&overhead, *argv, 10)) {
++				explain1("overhead"); return -1;
++			}
+ 		} else if (matches(*argv, "quantum") == 0) {
+ 			NEXT_ARG();
+ 			if (get_u32(&opt.quantum, *argv, 10)) {
+@@ -191,14 +207,18 @@
+ 	if (!buffer) buffer = opt.rate.rate / HZ + mtu;
+ 	if (!cbuffer) cbuffer = opt.ceil.rate / HZ + mtu;
+ 
+-	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, 0)) < 0) {
++/* encode overhead and mpu, 8 bits each, into lower 16 bits */
++	mpu = (unsigned)mpu8 | (unsigned)overhead << 8;
++	opt.ceil.mpu = mpu; opt.rate.mpu = mpu;
++
++	if ((cell_log = tc_calc_rtable(opt.rate.rate, rtab, cell_log, mtu, mpu)) < 0) {
+ 		fprintf(stderr, "htb: failed to calculate rate table.\n");
+ 		return -1;
+ 	}
+ 	opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer);
+ 	opt.rate.cell_log = cell_log;
+ 	
+-	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, 0)) < 0) {
++	if ((ccell_log = tc_calc_rtable(opt.ceil.rate, ctab, cell_log, mtu, mpu)) < 0) {
+ 		fprintf(stderr, "htb: failed to calculate ceil rate table.\n");
+ 		return -1;
+ 	}
+@@ -222,6 +242,7 @@
+ 	double buffer,cbuffer;
+ 	SPRINT_BUF(b1);
+ 	SPRINT_BUF(b2);
++	SPRINT_BUF(b3);
+ 
+ 	if (opt == NULL)
+ 		return 0;
+@@ -244,10 +265,16 @@
+ 	    fprintf(f, "ceil %s ", sprint_rate(hopt->ceil.rate, b1));
+ 	    cbuffer = ((double)hopt->ceil.rate*tc_core_tick2usec(hopt->cbuffer))/1000000;
+ 	    if (show_details) {
+-		fprintf(f, "burst %s/%u mpu %s ", sprint_size(buffer, b1),
+-			1<<hopt->rate.cell_log, sprint_size(hopt->rate.mpu, b2));
+-		fprintf(f, "cburst %s/%u mpu %s ", sprint_size(cbuffer, b1),
+-			1<<hopt->ceil.cell_log, sprint_size(hopt->ceil.mpu, b2));
++		fprintf(f, "burst %s/%u mpu %s overhead %s ",
++			sprint_size(buffer, b1),
++			1<<hopt->rate.cell_log,
++			sprint_size(hopt->rate.mpu&0xFF, b2),
++			sprint_size((hopt->rate.mpu>>8)&0xFF, b3));
++		fprintf(f, "cburst %s/%u mpu %s overhead %s ",
++			sprint_size(cbuffer, b1),
++			1<<hopt->ceil.cell_log,
++			sprint_size(hopt->ceil.mpu&0xFF, b2),
++			sprint_size((hopt->ceil.mpu>>8)&0xFF, b3));
+ 		fprintf(f, "level %d ", (int)hopt->level);
+ 	    } else {
+ 		fprintf(f, "burst %s ", sprint_size(buffer, b1));
diff --git a/package/iproute2/patches/006-iproute2-tc_esfq.patch b/package/iproute2/patches/006-iproute2-tc_esfq.patch
index 7d528cac55..d0347549dd 100644
--- a/package/iproute2/patches/006-iproute2-tc_esfq.patch
+++ b/package/iproute2/patches/006-iproute2-tc_esfq.patch
@@ -1,12 +1,12 @@
-diff -Naur iproute-2.6.20-070313.orig/include/linux/pkt_sched.h iproute-2.6.20-070313/include/linux/pkt_sched.h
---- iproute-2.6.20-070313.orig/include/linux/pkt_sched.h	2007-03-13 14:50:56.000000000 -0700
-+++ iproute-2.6.20-070313/include/linux/pkt_sched.h	2007-06-09 11:32:22.000000000 -0700
-@@ -146,8 +146,37 @@
+diff -urN --exclude=.svn iproute2-2.6.11-050330/include/linux/pkt_sched.h iproute2-2.6.11-050330/include/linux/pkt_sched.h
+--- iproute2-2.6.11-050330/include/linux/pkt_sched.h	2007-05-04 22:21:48.000000000 -0400
++++ iproute2-2.6.11-050330/include/linux/pkt_sched.h	2007-05-04 22:27:12.000000000 -0400
+@@ -174,8 +174,38 @@
   *
   *	The only reason for this is efficiency, it is possible
   *	to change these parameters in compile time.
 + *
-+ *	If you need to play with these values, use esfq instead.
++ *	If you need to play with these values use esfq instead.
   */
  
 +/* ESFQ section */
@@ -17,7 +17,6 @@ diff -Naur iproute-2.6.20-070313.orig/include/linux/pkt_sched.h iproute-2.6.20-0
 +	TCA_SFQ_HASH_CLASSIC,
 +	TCA_SFQ_HASH_DST,
 +	TCA_SFQ_HASH_SRC,
-+	TCA_SFQ_HASH_FWMARK,
 +	/* conntrack */
 +	TCA_SFQ_HASH_CTORIGDST,
 +	TCA_SFQ_HASH_CTORIGSRC,
@@ -35,14 +34,54 @@ diff -Naur iproute-2.6.20-070313.orig/include/linux/pkt_sched.h iproute-2.6.20-0
 +	unsigned	flows;		/* Maximal number of flows  */
 +	unsigned        hash_kind;      /* Hash function to use for flow identification */
 +};
++
++
 +
  /* RED section */
  
  enum
-diff -Naur iproute-2.6.20-070313.orig/tc/Makefile iproute-2.6.20-070313/tc/Makefile
---- iproute-2.6.20-070313.orig/tc/Makefile	2007-03-13 14:50:56.000000000 -0700
-+++ iproute-2.6.20-070313/tc/Makefile	2007-06-09 00:39:44.000000000 -0700
-@@ -7,6 +7,7 @@
+@@ -551,8 +580,37 @@
+  *
+  *	The only reason for this is efficiency, it is possible
+  *	to change these parameters in compile time.
++ *
++ *	If you need to play with these values use esfq instead.
+  */
+ 
++/* ESFQ section */
++
++enum
++{
++	/* traditional */
++	TCA_SFQ_HASH_CLASSIC,
++	TCA_SFQ_HASH_DST,
++	TCA_SFQ_HASH_SRC,
++	/* conntrack */
++	TCA_SFQ_HASH_CTORIGDST,
++	TCA_SFQ_HASH_CTORIGSRC,
++	TCA_SFQ_HASH_CTREPLDST,
++	TCA_SFQ_HASH_CTREPLSRC,
++	TCA_SFQ_HASH_CTNATCHG,
++};
++
++struct tc_esfq_qopt
++{
++	unsigned	quantum;	/* Bytes per round allocated to flow */
++	int		perturb_period;	/* Period of hash perturbation */
++	__u32		limit;		/* Maximal packets in queue */
++	unsigned	divisor;	/* Hash divisor  */
++	unsigned	flows;		/* Maximal number of flows  */
++	unsigned        hash_kind;      /* Hash function to use for flow identification */
++};
++
++
+ /* RED section */
+ 
+ enum
+diff -urN --exclude=.svn iproute2-2.6.11-050330/tc/Makefile iproute2-2.6.11-050330/tc/Makefile
+--- iproute2-2.6.11-050330/tc/Makefile	2007-05-04 22:21:48.000000000 -0400
++++ iproute2-2.6.11-050330/tc/Makefile	2007-05-04 22:27:37.000000000 -0400
+@@ -6,6 +6,7 @@
  TCMODULES :=
  TCMODULES += q_fifo.o
  TCMODULES += q_sfq.o
@@ -50,10 +89,10 @@ diff -Naur iproute-2.6.20-070313.orig/tc/Makefile iproute-2.6.20-070313/tc/Makef
  TCMODULES += q_red.o
  TCMODULES += q_prio.o
  TCMODULES += q_tbf.o
-diff -Naur iproute-2.6.20-070313.orig/tc/q_esfq.c iproute-2.6.20-070313/tc/q_esfq.c
---- iproute-2.6.20-070313.orig/tc/q_esfq.c	1969-12-31 16:00:00.000000000 -0800
-+++ iproute-2.6.20-070313/tc/q_esfq.c	2007-06-09 11:38:59.000000000 -0700
-@@ -0,0 +1,198 @@
+diff -urN --exclude=.svn iproute2-2.6.11-050330/tc/q_esfq.c iproute2-2.6.11-050330/tc/q_esfq.c
+--- iproute2-2.6.11-050330/tc/q_esfq.c	1969-12-31 19:00:00.000000000 -0500
++++ iproute2-2.6.11-050330/tc/q_esfq.c	2007-05-04 22:37:54.000000000 -0400
+@@ -0,0 +1,200 @@
 +/*
 + * q_esfq.c		ESFQ.
 + *
@@ -88,7 +127,7 @@ diff -Naur iproute-2.6.20-070313.orig/tc/q_esfq.c iproute-2.6.20-070313/tc/q_esf
 +{
 +	fprintf(stderr, "Usage: ... esfq [ perturb SECS ] [ quantum BYTES ] [ depth FLOWS ]\n\t[ divisor HASHBITS ] [ limit PKTS ] [ hash HASHTYPE]\n");
 +	fprintf(stderr,"Where: \n");
-+	fprintf(stderr,"HASHTYPE := { classic | src | dst | fwmark | ctorigdst | ctorigsrc | ctrepldst | ctreplsrc | ctnatchg}\n");
++	fprintf(stderr,"HASHTYPE := { classic | src | dst | ctorigdst | ctorigsrc | ctrepldst | ctreplsrc | ctnatchg }\n");
 +}
 +
 +#define usage() return(-1)
@@ -130,8 +169,8 @@ diff -Naur iproute-2.6.20-070313.orig/tc/q_esfq.c iproute-2.6.20-070313/tc/q_esf
 +				fprintf(stderr, "Illegal \"divisor\"\n");
 +				return -1;
 +			}
-+			if(opt.divisor >= 15) {
-+				fprintf(stderr, "Illegal \"divisor\": must be < 15\n");
++			if(opt.divisor >= 14) {
++				fprintf(stderr, "Illegal \"divisor\": must be < 14\n");
 +				return -1;
 +			}
 +			opt.divisor=pow(2,opt.divisor);
@@ -145,24 +184,29 @@ diff -Naur iproute-2.6.20-070313.orig/tc/q_esfq.c iproute-2.6.20-070313/tc/q_esf
 +			ok++;
 +		} else if (strcmp(*argv, "hash") == 0) {
 +			NEXT_ARG();
-+			if (strcmp(*argv, "classic") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CLASSIC;
-+			} else if (strcmp(*argv, "dst") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_DST;
-+			} else if (strcmp(*argv, "src") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_SRC;
-+			} else if (strcmp(*argv, "fwmark") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_FWMARK;
-+			} else if (strcmp(*argv, "ctorigsrc") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CTORIGSRC;
-+			} else if (strcmp(*argv, "ctorigdst") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CTORIGDST;
-+			} else if (strcmp(*argv, "ctreplsrc") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CTREPLSRC;
-+			} else if (strcmp(*argv, "ctrepldst") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CTREPLDST;
-+			} else if (strcmp(*argv, "ctnatchg") == 0) {
-+				opt.hash_kind = TCA_SFQ_HASH_CTNATCHG;
++			if(strcmp(*argv, "classic") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CLASSIC;
++			} else 
++			if(strcmp(*argv, "dst") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_DST;
++			} else
++			if(strcmp(*argv, "src") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_SRC;
++			} else
++			if(strcmp(*argv, "ctorigsrc") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CTORIGSRC;
++			} else
++			if(strcmp(*argv, "ctorigdst") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CTORIGDST;
++			} else
++			if(strcmp(*argv, "ctreplsrc") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CTREPLSRC;
++			} else
++			if(strcmp(*argv, "ctrepldst") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CTREPLDST;
++			} else
++			if(strcmp(*argv, "ctnatchg") == 0) {
++				opt.hash_kind= TCA_SFQ_HASH_CTNATCHG;
 +			} else {
 +				fprintf(stderr, "Illegal \"hash\"\n");
 +				explain();
@@ -216,9 +260,6 @@ diff -Naur iproute-2.6.20-070313.orig/tc/q_esfq.c iproute-2.6.20-070313/tc/q_esf
 +	case TCA_SFQ_HASH_SRC:
 +		fprintf(f,"src");
 +		break;
-+	case TCA_SFQ_HASH_FWMARK:
-+		fprintf(f,"fwmark");
-+		break;
 +	case TCA_SFQ_HASH_CTORIGSRC:
 +		fprintf(f,"ctorigsrc");
 +		break;