++ * New upstream version (closes: Bug#63701)
++ * Remove /etc/iproute2 on purge (closes: Bug#72743)
++ * Fixed Lintian warnings (no-priority-field and no-section-field)
++
++ -- Juan Cespedes <cespedes@debian.org> Sat, 14 Oct 2000 19:27:12 +0200
++
++iproute (991023-2) unstable; urgency=low
++
++ * 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)
++
++ -- Juan Cespedes <cespedes@debian.org> Sun, 19 Dec 1999 04:00:21 +0100
++
++iproute (991023-1) unstable; urgency=low
++
++ * New upstream version (closes: Bug#48733)
++
++ -- Juan Cespedes <cespedes@debian.org> Tue, 2 Nov 1999 16:29:37 +0100
++
++iproute (990824-1) unstable; urgency=low
++
++ * 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
++
++ -- Juan Cespedes <cespedes@debian.org> Sun, 24 Oct 1999 19:02:56 +0200
++
++iproute (990630-1) unstable; urgency=low
++
++ * New upstream version.
++ * FHS and standards 3.0.1.0.
++
++ -- Roberto Lumbreras <rover@debian.org> Tue, 3 Aug 1999 02:49:28 +0200
++
++iproute (990530-1) unstable; urgency=low
++
++ * 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.
++
++ -- Roberto Lumbreras <rover@debian.org> Tue, 22 Jun 1999 02:28:53 +0200
++
++iproute (990329-1) unstable; urgency=low
++
++ * New upstream version.
++ * Build with 2.2.5 kernel headers.
++
++ -- 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)