summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2004-04-20 19:31:27 +0000
committerMike Frysinger <vapier@gentoo.org>2004-04-20 19:31:27 +0000
commit370ffed30c5859a1b3e0ce3edb70b28da3fd86b2 (patch)
tree68d432918c3f274ac65a3f6178624944f1009cf3 /sys-apps/iproute2/files
parentAdded to ~ppc (Manifest recommit) (diff)
downloadgentoo-2-370ffed30c5859a1b3e0ce3edb70b28da3fd86b2.tar.gz
gentoo-2-370ffed30c5859a1b3e0ce3edb70b28da3fd86b2.tar.bz2
gentoo-2-370ffed30c5859a1b3e0ce3edb70b28da3fd86b2.zip
goodbye iproute ; hello iproute2
Diffstat (limited to 'sys-apps/iproute2/files')
-rw-r--r--sys-apps/iproute2/files/2.4.7.20010824-hfsc.patch416
-rw-r--r--sys-apps/iproute2/files/2.4.7.20010824-local-exploit-fix.patch22
-rw-r--r--sys-apps/iproute2/files/2.4.7.20020116-hfsc.patch416
-rw-r--r--sys-apps/iproute2/files/2.4.7.20020116-htb.patch319
-rw-r--r--sys-apps/iproute2/files/2.4.7.20020116-local-exploit-fix.patch22
-rw-r--r--sys-apps/iproute2/files/2.4.7.20020116-manpages.patch3812
-rw-r--r--sys-apps/iproute2/files/2.4.7.20020116-misc-deb-fixes.patch34
-rw-r--r--sys-apps/iproute2/files/digest-iproute2-2.4.7.20010824-r52
-rw-r--r--sys-apps/iproute2/files/digest-iproute2-2.4.7.200201161
9 files changed, 5044 insertions, 0 deletions
diff --git a/sys-apps/iproute2/files/2.4.7.20010824-hfsc.patch b/sys-apps/iproute2/files/2.4.7.20010824-hfsc.patch
new file mode 100644
index 000000000000..c36dd069c685
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20010824-hfsc.patch
@@ -0,0 +1,416 @@
+diff -urN a/tc/Makefile b/tc/Makefile
+--- a/tc/Makefile 2000-04-16 19:42:53.000000000 +0200
++++ b/tc/Makefile 2004-01-04 23:24:39.000000000 +0100
+@@ -26,7 +26,7 @@
+
+ #TCMODULES += q_csz.o
+ #TCMODULES += q_hpfq.o
+-#TCMODULES += q_hfsc.o
++TCMODULES += q_hfsc.o
+
+ TCOBJ += $(TCMODULES)
+
+diff -urN a/tc/q_hfsc.c b/tc/q_hfsc.c
+--- a/tc/q_hfsc.c 2000-04-16 19:42:54.000000000 +0200
++++ b/tc/q_hfsc.c 2004-01-25 14:42:43.000000000 +0100
+@@ -1,12 +1,12 @@
+ /*
+- * q_hfsc.c HFSC.
++ * q_hfsc.c HFSC.
+ *
+ * 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>
++ * Authors: Patrick McHardy, <kaber@trash.ner>
+ *
+ */
+
+@@ -19,36 +19,247 @@
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ #include <string.h>
++#include <math.h>
+
+ #include "utils.h"
+ #include "tc_util.h"
+
+-static void explain()
++static int hfsc_get_sc(int *, char ***, struct tc_service_curve *);
++
++
++static void
++explain_qdisc(void)
++{
++ fprintf(stderr,
++ "Usage: ... hfsc [ default CLASSID ]\n"
++ "\n"
++ " default: default class for unclassified packets\n"
++ );
++}
++
++static void
++explain_class(void)
+ {
+- fprintf(stderr, "Usage: ... hfsc \n");
++ fprintf(stderr,
++ "Usage: ... hfsc [ rt SC ] [ ls SC ] [ ul SC ]\n"
++ "\n"
++ "SC := [ [ m1 BPS ] [ d SEC ] m2 BPS\n"
++ "\n"
++ " m1 : slope of first segment\n"
++ " d : x-coordinate of intersection\n"
++ " m2 : slope of second segment\n"
++ "\n"
++ "Alternative format:\n"
++ "\n"
++ "SC := [ [ umax BYTE ] dmax SEC ] rate BPS\n"
++ "\n"
++ " umax : maximum unit of work\n"
++ " dmax : maximum delay\n"
++ " rate : rate\n"
++ "\n"
++ );
+ }
+
+-static void explain1(char *arg)
++static void
++explain1(char *arg)
+ {
+- fprintf(stderr, "Illegal \"%s\"\n", arg);
++ fprintf(stderr, "HFSC: Illegal \"%s\"\n", arg);
+ }
+
++static int
++hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++ struct tc_hfsc_qopt qopt;
++
++ memset(&qopt, 0, sizeof(qopt));
++
++ while (argc > 0) {
++ if (matches(*argv, "default") == 0) {
++ NEXT_ARG();
++ if (qopt.defcls != 0) {
++ fprintf(stderr, "HFSC: Double \"default\"\n");
++ return -1;
++ }
++ if (get_u16(&qopt.defcls, *argv, 16) < 0) {
++ explain1("default");
++ return -1;
++ }
++ } else if (matches(*argv, "help") == 0) {
++ explain_qdisc();
++ return -1;
++ } else {
++ fprintf(stderr, "HFSC: What is \"%s\" ?\n", *argv);
++ explain_qdisc();
++ return -1;
++ }
++ argc--, argv++;
++ }
+
+-#define usage() return(-1)
++ addattr_l(n, 1024, TCA_OPTIONS, &qopt, sizeof(qopt));
++ return 0;
++}
+
+-static int hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++static int
++hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+ {
+- return -1;
++ struct tc_hfsc_qopt *qopt;
++
++ if (opt == NULL)
++ return 0;
++ if (RTA_PAYLOAD(opt) < sizeof(*qopt))
++ return -1;
++ qopt = RTA_DATA(opt);
++
++ if (qopt->defcls != 0)
++ fprintf(f, "default %x ", qopt->defcls);
++
++ return 0;
+ }
+
+-static int hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++static int
++hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
+ {
+- return -1;
++ struct tc_hfsc_stats *st;
++
++ if (xstats == NULL)
++ return 0;
++ if (RTA_PAYLOAD(xstats) < sizeof(*st))
++ return -1;
++ st = RTA_DATA(xstats);
++
++ fprintf(f, " period %u ", st->period);
++ if (st->work != 0)
++ fprintf(f, "work %llu bytes ", st->work);
++ if (st->rtwork != 0)
++ fprintf(f, "rtwork %llu bytes ", st->rtwork);
++ fprintf(f, "level %u ", st->level);
++ fprintf(f, "\n");
++
++ return 0;
+ }
+
+-static int hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++static int
++hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
++ struct nlmsghdr *n)
+ {
+- return -1;
++ struct tc_service_curve rsc, fsc, usc;
++ int rsc_ok, fsc_ok, usc_ok;
++ struct rtattr *tail;
++
++ memset(&rsc, 0, sizeof(rsc));
++ memset(&fsc, 0, sizeof(fsc));
++ memset(&usc, 0, sizeof(usc));
++ rsc_ok = fsc_ok = usc_ok = 0;
++
++ while (argc > 0) {
++ if (matches(*argv, "rt") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &rsc) < 0) {
++ explain1("rt");
++ return -1;
++ }
++ rsc_ok = 1;
++ } else if (matches(*argv, "ls") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &fsc) < 0) {
++ explain1("ls");
++ return -1;
++ }
++ fsc_ok = 1;
++ } else if (matches(*argv, "ul") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &usc) < 0) {
++ explain1("ul");
++ return -1;
++ }
++ usc_ok = 1;
++ } else if (matches(*argv, "help") == 0) {
++ explain_class();
++ return -1;
++ } else {
++ fprintf(stderr, "HFSC: What is \"%s\" ?\n", *argv);
++ explain_class();
++ return -1;
++ }
++ argc--, argv++;
++ }
++
++ if (!(rsc_ok || fsc_ok || usc_ok)) {
++ fprintf(stderr, "HFSC: no parameters given\n");
++ explain_class();
++ return -1;
++ }
++ if (usc_ok && !fsc_ok) {
++ fprintf(stderr, "HFSC: Upper-limit Service Curve without "
++ "Link-Share Service Curve\n");
++ explain_class();
++ return -1;
++ }
++
++ tail = (struct rtattr*)(((void*)n) + NLMSG_ALIGN(n->nlmsg_len));
++
++ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++ if (rsc_ok)
++ addattr_l(n, 1024, TCA_HFSC_RSC, &rsc, sizeof(rsc));
++ if (fsc_ok)
++ addattr_l(n, 1024, TCA_HFSC_FSC, &fsc, sizeof(fsc));
++ if (usc_ok)
++ addattr_l(n, 1024, TCA_HFSC_USC, &usc, sizeof(usc));
++
++ tail->rta_len = (((void*)n) + NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++ return 0;
++}
++
++static void
++hfsc_print_sc(FILE *f, char *name, struct tc_service_curve *sc)
++{
++ SPRINT_BUF(b1);
++
++ fprintf(f, "%s ", name);
++ fprintf(f, "m1 %s ", sprint_rate(sc->m1, b1));
++ fprintf(f, "d %s ", sprint_usecs(sc->d, b1));
++ fprintf(f, "m2 %s ", sprint_rate(sc->m2, b1));
++}
++
++static int
++hfsc_print_class_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++ struct rtattr *tb[TCA_HFSC_MAX+1];
++ struct tc_service_curve *rsc = NULL, *fsc = NULL, *usc = NULL;
++
++ if (opt == NULL)
++ return 0;
++
++ memset(tb, 0, sizeof(tb));
++ parse_rtattr(tb, TCA_HFSC_MAX, RTA_DATA(opt), RTA_PAYLOAD(opt));
++
++ if (tb[TCA_HFSC_RSC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_RSC]) < sizeof(*rsc))
++ fprintf(stderr, "HFSC: truncated realtime option\n");
++ else
++ rsc = RTA_DATA(tb[TCA_HFSC_RSC]);
++ }
++ if (tb[TCA_HFSC_FSC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_FSC]) < sizeof(*fsc))
++ fprintf(stderr, "HFSC: truncated linkshare option\n");
++ else
++ fsc = RTA_DATA(tb[TCA_HFSC_FSC]);
++ }
++ if (tb[TCA_HFSC_USC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_USC]) < sizeof(*usc))
++ fprintf(stderr, "HFSC: truncated upperlimit option\n");
++ else
++ usc = RTA_DATA(tb[TCA_HFSC_USC]);
++ }
++
++ if (rsc != NULL)
++ hfsc_print_sc(f, "rt", rsc);
++ if (fsc != NULL)
++ hfsc_print_sc(f, "ls", fsc);
++ if (usc != NULL)
++ hfsc_print_sc(f, "ul", usc);
++
++ return 0;
+ }
+
+ struct qdisc_util hfsc_util = {
+@@ -57,5 +268,126 @@
+ hfsc_parse_opt,
+ hfsc_print_opt,
+ hfsc_print_xstats,
++ hfsc_parse_class_opt,
++ hfsc_print_class_opt,
+ };
+
++static int
++hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ char **argv = *argvp;
++ int argc = *argcp;
++ unsigned int m1 = 0, d = 0, m2 = 0;
++
++ if (matches(*argv, "m1") == 0) {
++ NEXT_ARG();
++ if (get_rate(&m1, *argv) < 0) {
++ explain1("m1");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "d") == 0) {
++ NEXT_ARG();
++ if (get_usecs(&d, *argv) < 0) {
++ explain1("d");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "m2") == 0) {
++ NEXT_ARG();
++ if (get_rate(&m2, *argv) < 0) {
++ explain1("m2");
++ return -1;
++ }
++ } else
++ return -1;
++
++ sc->m1 = m1;
++ sc->d = d;
++ sc->m2 = m2;
++
++ *argvp = argv;
++ *argcp = argc;
++ return 0;
++}
++
++static int
++hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ char **argv = *argvp;
++ int argc = *argcp;
++ unsigned int umax = 0, dmax = 0, rate = 0;
++
++ if (matches(*argv, "umax") == 0) {
++ NEXT_ARG();
++ if (get_size(&umax, *argv) < 0) {
++ explain1("umax");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "dmax") == 0) {
++ NEXT_ARG();
++ if (get_usecs(&dmax, *argv) < 0) {
++ explain1("dmax");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "rate") == 0) {
++ NEXT_ARG();
++ if (get_rate(&rate, *argv) < 0) {
++ explain1("rate");
++ return -1;
++ }
++ } else
++ return -1;
++
++ if (umax != 0 && dmax == 0) {
++ fprintf(stderr, "HFSC: umax given but dmax is zero.\n");
++ return -1;
++ }
++
++ if (dmax != 0 && ceil(umax * 1000000.0 / dmax) > rate) {
++ /*
++ * concave curve, slope of first segment is umax/dmax,
++ * intersection is at dmax
++ */
++ sc->m1 = ceil(umax * 1000000.0 / dmax); /* in bps */
++ sc->d = dmax;
++ sc->m2 = rate;
++ } else {
++ /*
++ * convex curve, slope of first segment is 0, intersection
++ * is at dmax - umax / rate
++ */
++ sc->m1 = 0;
++ sc->d = ceil(dmax - umax * 1000000.0 / rate); /* in usec */
++ sc->m2 = rate;
++ }
++
++ *argvp = argv;
++ *argcp = argc;
++ return 0;
++}
++
++static int
++hfsc_get_sc(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ if (hfsc_get_sc1(argcp, argvp, sc) < 0 &&
++ hfsc_get_sc2(argcp, argvp, sc) < 0)
++ return -1;
++
++ if (sc->m1 == 0 && sc->m2 == 0) {
++ fprintf(stderr, "HFSC: Service Curve has two zero slopes\n");
++ return -1;
++ }
++
++ return 0;
++}
diff --git a/sys-apps/iproute2/files/2.4.7.20010824-local-exploit-fix.patch b/sys-apps/iproute2/files/2.4.7.20010824-local-exploit-fix.patch
new file mode 100644
index 000000000000..c66b9cbdc99c
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20010824-local-exploit-fix.patch
@@ -0,0 +1,22 @@
+--- iproute2/lib/libnetlink.c.orig 2003-08-10 15:02:10.000000000 +1000
++++ iproute2/lib/libnetlink.c 2003-10-13 19:36:41.000000000 +1000
+@@ -169,7 +169,8 @@
+ while (NLMSG_OK(h, status)) {
+ int err;
+
+- if (h->nlmsg_pid != rth->local.nl_pid ||
++ if (nladdr.nl_pid != 0 ||
++ h->nlmsg_pid != rth->local.nl_pid ||
+ h->nlmsg_seq != rth->dump) {
+ if (junk) {
+ err = junk(&nladdr, h, arg2);
+@@ -277,7 +278,8 @@
+ exit(1);
+ }
+
+- if (h->nlmsg_pid != rtnl->local.nl_pid ||
++ if (nladdr.nl_pid != peer ||
++ h->nlmsg_pid != rtnl->local.nl_pid ||
+ h->nlmsg_seq != seq) {
+ if (junk) {
+ err = junk(&nladdr, h, jarg);
diff --git a/sys-apps/iproute2/files/2.4.7.20020116-hfsc.patch b/sys-apps/iproute2/files/2.4.7.20020116-hfsc.patch
new file mode 100644
index 000000000000..6c9e669673ef
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20020116-hfsc.patch
@@ -0,0 +1,416 @@
+diff -urN a/tc/Makefile b/tc/Makefile
+--- a/tc/Makefile 2000-04-16 19:42:53.000000000 +0200
++++ b/tc/Makefile 2004-01-04 23:24:39.000000000 +0100
+@@ -26,7 +26,7 @@
+
+ #TCMODULES += q_csz.o
+ #TCMODULES += q_hpfq.o
+-#TCMODULES += q_hfsc.o
++TCMODULES += q_hfsc.o
+
+ TCOBJ += $(TCMODULES)
+
+diff -urN a/tc/q_hfsc.c b/tc/q_hfsc.c
+--- a/tc/q_hfsc.c 2000-04-16 19:42:54.000000000 +0200
++++ b/tc/q_hfsc.c 2004-01-25 14:42:43.000000000 +0100
+@@ -1,12 +1,12 @@
+ /*
+- * q_hfsc.c HFSC.
++ * q_hfsc.c HFSC.
+ *
+ * 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>
++ * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>; Patrick McHardy, <kaber@trash.ner>
+ *
+ */
+
+@@ -19,36 +19,247 @@
+ #include <netinet/in.h>
+ #include <arpa/inet.h>
+ #include <string.h>
++#include <math.h>
+
+ #include "utils.h"
+ #include "tc_util.h"
+
+-static void explain()
++static int hfsc_get_sc(int *, char ***, struct tc_service_curve *);
++
++
++static void
++explain_qdisc(void)
++{
++ fprintf(stderr,
++ "Usage: ... hfsc [ default CLASSID ]\n"
++ "\n"
++ " default: default class for unclassified packets\n"
++ );
++}
++
++static void
++explain_class(void)
+ {
+- fprintf(stderr, "Usage: ... hfsc \n");
++ fprintf(stderr,
++ "Usage: ... hfsc [ rt SC ] [ ls SC ] [ ul SC ]\n"
++ "\n"
++ "SC := [ [ m1 BPS ] [ d SEC ] m2 BPS\n"
++ "\n"
++ " m1 : slope of first segment\n"
++ " d : x-coordinate of intersection\n"
++ " m2 : slope of second segment\n"
++ "\n"
++ "Alternative format:\n"
++ "\n"
++ "SC := [ [ umax BYTE ] dmax SEC ] rate BPS\n"
++ "\n"
++ " umax : maximum unit of work\n"
++ " dmax : maximum delay\n"
++ " rate : rate\n"
++ "\n"
++ );
+ }
+
+-static void explain1(char *arg)
++static void
++explain1(char *arg)
+ {
+- fprintf(stderr, "Illegal \"%s\"\n", arg);
++ fprintf(stderr, "HFSC: Illegal \"%s\"\n", arg);
+ }
+
++static int
++hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++{
++ struct tc_hfsc_qopt qopt;
++
++ memset(&qopt, 0, sizeof(qopt));
++
++ while (argc > 0) {
++ if (matches(*argv, "default") == 0) {
++ NEXT_ARG();
++ if (qopt.defcls != 0) {
++ fprintf(stderr, "HFSC: Double \"default\"\n");
++ return -1;
++ }
++ if (get_u16(&qopt.defcls, *argv, 16) < 0) {
++ explain1("default");
++ return -1;
++ }
++ } else if (matches(*argv, "help") == 0) {
++ explain_qdisc();
++ return -1;
++ } else {
++ fprintf(stderr, "HFSC: What is \"%s\" ?\n", *argv);
++ explain_qdisc();
++ return -1;
++ }
++ argc--, argv++;
++ }
+
+-#define usage() return(-1)
++ addattr_l(n, 1024, TCA_OPTIONS, &qopt, sizeof(qopt));
++ return 0;
++}
+
+-static int hfsc_parse_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n)
++static int
++hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+ {
+- return -1;
++ struct tc_hfsc_qopt *qopt;
++
++ if (opt == NULL)
++ return 0;
++ if (RTA_PAYLOAD(opt) < sizeof(*qopt))
++ return -1;
++ qopt = RTA_DATA(opt);
++
++ if (qopt->defcls != 0)
++ fprintf(f, "default %x ", qopt->defcls);
++
++ return 0;
+ }
+
+-static int hfsc_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++static int
++hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
+ {
+- return -1;
++ struct tc_hfsc_stats *st;
++
++ if (xstats == NULL)
++ return 0;
++ if (RTA_PAYLOAD(xstats) < sizeof(*st))
++ return -1;
++ st = RTA_DATA(xstats);
++
++ fprintf(f, " period %u ", st->period);
++ if (st->work != 0)
++ fprintf(f, "work %llu bytes ", st->work);
++ if (st->rtwork != 0)
++ fprintf(f, "rtwork %llu bytes ", st->rtwork);
++ fprintf(f, "level %u ", st->level);
++ fprintf(f, "\n");
++
++ return 0;
+ }
+
+-static int hfsc_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++static int
++hfsc_parse_class_opt(struct qdisc_util *qu, int argc, char **argv,
++ struct nlmsghdr *n)
+ {
+- return -1;
++ struct tc_service_curve rsc, fsc, usc;
++ int rsc_ok, fsc_ok, usc_ok;
++ struct rtattr *tail;
++
++ memset(&rsc, 0, sizeof(rsc));
++ memset(&fsc, 0, sizeof(fsc));
++ memset(&usc, 0, sizeof(usc));
++ rsc_ok = fsc_ok = usc_ok = 0;
++
++ while (argc > 0) {
++ if (matches(*argv, "rt") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &rsc) < 0) {
++ explain1("rt");
++ return -1;
++ }
++ rsc_ok = 1;
++ } else if (matches(*argv, "ls") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &fsc) < 0) {
++ explain1("ls");
++ return -1;
++ }
++ fsc_ok = 1;
++ } else if (matches(*argv, "ul") == 0) {
++ NEXT_ARG();
++ if (hfsc_get_sc(&argc, &argv, &usc) < 0) {
++ explain1("ul");
++ return -1;
++ }
++ usc_ok = 1;
++ } else if (matches(*argv, "help") == 0) {
++ explain_class();
++ return -1;
++ } else {
++ fprintf(stderr, "HFSC: What is \"%s\" ?\n", *argv);
++ explain_class();
++ return -1;
++ }
++ argc--, argv++;
++ }
++
++ if (!(rsc_ok || fsc_ok || usc_ok)) {
++ fprintf(stderr, "HFSC: no parameters given\n");
++ explain_class();
++ return -1;
++ }
++ if (usc_ok && !fsc_ok) {
++ fprintf(stderr, "HFSC: Upper-limit Service Curve without "
++ "Link-Share Service Curve\n");
++ explain_class();
++ return -1;
++ }
++
++ tail = (struct rtattr*)(((void*)n) + NLMSG_ALIGN(n->nlmsg_len));
++
++ addattr_l(n, 1024, TCA_OPTIONS, NULL, 0);
++ if (rsc_ok)
++ addattr_l(n, 1024, TCA_HFSC_RSC, &rsc, sizeof(rsc));
++ if (fsc_ok)
++ addattr_l(n, 1024, TCA_HFSC_FSC, &fsc, sizeof(fsc));
++ if (usc_ok)
++ addattr_l(n, 1024, TCA_HFSC_USC, &usc, sizeof(usc));
++
++ tail->rta_len = (((void*)n) + NLMSG_ALIGN(n->nlmsg_len)) - (void*)tail;
++ return 0;
++}
++
++static void
++hfsc_print_sc(FILE *f, char *name, struct tc_service_curve *sc)
++{
++ SPRINT_BUF(b1);
++
++ fprintf(f, "%s ", name);
++ fprintf(f, "m1 %s ", sprint_rate(sc->m1, b1));
++ fprintf(f, "d %s ", sprint_usecs(sc->d, b1));
++ fprintf(f, "m2 %s ", sprint_rate(sc->m2, b1));
++}
++
++static int
++hfsc_print_class_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
++{
++ struct rtattr *tb[TCA_HFSC_MAX+1];
++ struct tc_service_curve *rsc = NULL, *fsc = NULL, *usc = NULL;
++
++ if (opt == NULL)
++ return 0;
++
++ memset(tb, 0, sizeof(tb));
++ parse_rtattr(tb, TCA_HFSC_MAX, RTA_DATA(opt), RTA_PAYLOAD(opt));
++
++ if (tb[TCA_HFSC_RSC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_RSC]) < sizeof(*rsc))
++ fprintf(stderr, "HFSC: truncated realtime option\n");
++ else
++ rsc = RTA_DATA(tb[TCA_HFSC_RSC]);
++ }
++ if (tb[TCA_HFSC_FSC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_FSC]) < sizeof(*fsc))
++ fprintf(stderr, "HFSC: truncated linkshare option\n");
++ else
++ fsc = RTA_DATA(tb[TCA_HFSC_FSC]);
++ }
++ if (tb[TCA_HFSC_USC]) {
++ if (RTA_PAYLOAD(tb[TCA_HFSC_USC]) < sizeof(*usc))
++ fprintf(stderr, "HFSC: truncated upperlimit option\n");
++ else
++ usc = RTA_DATA(tb[TCA_HFSC_USC]);
++ }
++
++ if (rsc != NULL)
++ hfsc_print_sc(f, "rt", rsc);
++ if (fsc != NULL)
++ hfsc_print_sc(f, "ls", fsc);
++ if (usc != NULL)
++ hfsc_print_sc(f, "ul", usc);
++
++ return 0;
+ }
+
+ struct qdisc_util hfsc_util = {
+@@ -57,5 +268,126 @@
+ hfsc_parse_opt,
+ hfsc_print_opt,
+ hfsc_print_xstats,
++ hfsc_parse_class_opt,
++ hfsc_print_class_opt,
+ };
+
++static int
++hfsc_get_sc1(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ char **argv = *argvp;
++ int argc = *argcp;
++ unsigned int m1 = 0, d = 0, m2 = 0;
++
++ if (matches(*argv, "m1") == 0) {
++ NEXT_ARG();
++ if (get_rate(&m1, *argv) < 0) {
++ explain1("m1");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "d") == 0) {
++ NEXT_ARG();
++ if (get_usecs(&d, *argv) < 0) {
++ explain1("d");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "m2") == 0) {
++ NEXT_ARG();
++ if (get_rate(&m2, *argv) < 0) {
++ explain1("m2");
++ return -1;
++ }
++ } else
++ return -1;
++
++ sc->m1 = m1;
++ sc->d = d;
++ sc->m2 = m2;
++
++ *argvp = argv;
++ *argcp = argc;
++ return 0;
++}
++
++static int
++hfsc_get_sc2(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ char **argv = *argvp;
++ int argc = *argcp;
++ unsigned int umax = 0, dmax = 0, rate = 0;
++
++ if (matches(*argv, "umax") == 0) {
++ NEXT_ARG();
++ if (get_size(&umax, *argv) < 0) {
++ explain1("umax");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "dmax") == 0) {
++ NEXT_ARG();
++ if (get_usecs(&dmax, *argv) < 0) {
++ explain1("dmax");
++ return -1;
++ }
++ NEXT_ARG();
++ }
++
++ if (matches(*argv, "rate") == 0) {
++ NEXT_ARG();
++ if (get_rate(&rate, *argv) < 0) {
++ explain1("rate");
++ return -1;
++ }
++ } else
++ return -1;
++
++ if (umax != 0 && dmax == 0) {
++ fprintf(stderr, "HFSC: umax given but dmax is zero.\n");
++ return -1;
++ }
++
++ if (dmax != 0 && ceil(umax * 1000000.0 / dmax) > rate) {
++ /*
++ * concave curve, slope of first segment is umax/dmax,
++ * intersection is at dmax
++ */
++ sc->m1 = ceil(umax * 1000000.0 / dmax); /* in bps */
++ sc->d = dmax;
++ sc->m2 = rate;
++ } else {
++ /*
++ * convex curve, slope of first segment is 0, intersection
++ * is at dmax - umax / rate
++ */
++ sc->m1 = 0;
++ sc->d = ceil(dmax - umax * 1000000.0 / rate); /* in usec */
++ sc->m2 = rate;
++ }
++
++ *argvp = argv;
++ *argcp = argc;
++ return 0;
++}
++
++static int
++hfsc_get_sc(int *argcp, char ***argvp, struct tc_service_curve *sc)
++{
++ if (hfsc_get_sc1(argcp, argvp, sc) < 0 &&
++ hfsc_get_sc2(argcp, argvp, sc) < 0)
++ return -1;
++
++ if (sc->m1 == 0 && sc->m2 == 0) {
++ fprintf(stderr, "HFSC: Service Curve has two zero slopes\n");
++ return -1;
++ }
++
++ return 0;
++}
diff --git a/sys-apps/iproute2/files/2.4.7.20020116-htb.patch b/sys-apps/iproute2/files/2.4.7.20020116-htb.patch
new file mode 100644
index 000000000000..1e4b591faf14
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20020116-htb.patch
@@ -0,0 +1,319 @@
+--- iproute-20010824.orig/tc/Makefile
++++ iproute-20010824/tc/Makefile
+@@ -25,6 +25,7 @@
+ endif
+
+ #TCMODULES += q_csz.o
++TCMODULES += q_htb.o
+ #TCMODULES += q_hpfq.o
+ #TCMODULES += q_hfsc.o
+
+--- iproute-20010824.orig/tc/q_htb.c
++++ iproute-20010824/tc/q_htb.c
+@@ -0,0 +1,306 @@
++/*
++ * 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
++
++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
++ );
++}
++
++static void explain1(char *arg)
++{
++ fprintf(stderr, "Illegal \"%s\"\n", arg);
++ explain();
++}
++
++
++#define usage() return(-1)
++
++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;
++}
++
++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;
++
++ memset(&opt, 0, sizeof(opt)); mtu = 1600; /* eth packet len */
++
++ 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++;
++ }
++
++/* if (!ok)
++ return 0;*/
++
++ 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;
++
++ /* 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;
++
++ 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;
++}
++
++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;
++
++ 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;
++}
++
++static int htb_print_xstats(struct qdisc_util *qu, FILE *f, struct rtattr *xstats)
++{
++ struct tc_htb_xstats *st;
++ if (xstats == NULL)
++ return 0;
++
++ if (RTA_PAYLOAD(xstats) < sizeof(*st))
++ return -1;
++
++ 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;
++}
++
++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,
++};
diff --git a/sys-apps/iproute2/files/2.4.7.20020116-local-exploit-fix.patch b/sys-apps/iproute2/files/2.4.7.20020116-local-exploit-fix.patch
new file mode 100644
index 000000000000..bea31558be8b
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20020116-local-exploit-fix.patch
@@ -0,0 +1,22 @@
+--- iproute2/lib/libnetlink.c.orig 2003-08-10 15:02:10.000000000 +1000
++++ iproute2/lib/libnetlink.c 2003-10-13 19:36:41.000000000 +1000
+@@ -164,7 +164,8 @@
+ while (NLMSG_OK(h, status)) {
+ int err;
+
+- if (h->nlmsg_pid != rth->local.nl_pid ||
++ if (nladdr.nl_pid != 0 ||
++ h->nlmsg_pid != rth->local.nl_pid ||
+ h->nlmsg_seq != rth->dump) {
+ if (junk) {
+ err = junk(&nladdr, h, arg2);
+@@ -272,7 +273,8 @@
+ exit(1);
+ }
+
+- if (h->nlmsg_pid != rtnl->local.nl_pid ||
++ if (nladdr.nl_pid != peer ||
++ h->nlmsg_pid != rtnl->local.nl_pid ||
+ h->nlmsg_seq != seq) {
+ if (junk) {
+ err = junk(&nladdr, h, jarg);
diff --git a/sys-apps/iproute2/files/2.4.7.20020116-manpages.patch b/sys-apps/iproute2/files/2.4.7.20020116-manpages.patch
new file mode 100644
index 000000000000..966d3703119e
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20020116-manpages.patch
@@ -0,0 +1,3812 @@
+--- debian/manpages/ip.8
++++ debian/manpages/ip.8
+@@ -0,0 +1,1809 @@
++.TH IP 8 "17 January 2002" "iproute2" "Linux"
++.SH NAME
++ip \- show / manipulate routing, devices, policy routing and tunnels
++.SH SYNOPSIS
++
++.ad l
++.in +8
++.ti -8
++.B ip
++.RI "[ " OPTIONS " ] " OBJECT " { " COMMAND " | "
++.BR help " }"
++.sp
++
++.ti -8
++.IR OBJECT " := { "
++.BR link " | " addr " | " route " | " rule " | " neigh " | " tunnel " | "\
++maddr " | " mroute " | " monitor " }"
++.sp
++
++.ti -8
++.IR OPTIONS " := { "
++\fB\-V\fR[\fIersion\fR] |
++\fB\-s\fR[\fItatistics\fR] |
++\fB\-r\fR[\fIesolve\fR] |
++\fB\-f\fR[\fIamily\fR] {
++.BR inet " | " inet6 " | " ipx " | " dnet " | " link " } | "
++\fB\-o\fR[\fIneline\fR] }
++
++.ti -8
++.BI "ip link set " DEVICE
++.RB "{ " up " | " down " | " arp " { " on " | " off " } |"
++.br
++.BR promisc " { " on " | " off " } |"
++.br
++.BR allmulti " { " on " | " off " } |"
++.br
++.BR dynamic " { " on " | " off " } |"
++.br
++.BR multicast " { " on " | " off " } |"
++.br
++.B txqueuelen
++.IR PACKETS " |"
++.br
++.B name
++.IR NEWNAME " |"
++.br
++.B address
++.IR LLADDR " |"
++.B broadcast
++.IR LLADDR " |"
++.br
++.B mtu
++.IR MTU " }"
++
++.ti -8
++.B ip link show
++.RI "[ " DEVICE " ]"
++
++.ti -8
++.BR "ip addr" " { " add " | " del " } "
++.IB IFADDR " dev " STRING
++
++.ti -8
++.BR "ip addr" " { " show " | " flush " } [ " dev
++.IR STRING " ] [ "
++.B scope
++.IR SCOPE-ID " ] [ "
++.B to
++.IR PREFIX " ] [ " FLAG-LIST " ] [ "
++.B label
++.IR PATTERN " ]"
++
++.ti -8
++.IR IFADDR " := " PREFIX " | " ADDR
++.B peer
++.IR PREFIX " [ "
++.B broadcast
++.IR ADDR " ] [ "
++.B anycast
++.IR ADDR " ] [ "
++.B label
++.IR STRING " ] [ "
++.B scope
++.IR SCOPE-ID " ]"
++
++.ti -8
++.IR SCOPE-ID " := "
++.RB "[ " host " | " link " | " global " | "
++.IR NUMBER " ]"
++
++.ti -8
++.IR FLAG-LIST " := [ " FLAG-LIST " ] " FLAG
++
++.ti -8
++.IR FLAG " := "
++.RB "[ " permanent " | " dynamic " | " secondary " | " primary " | "\
++tentative " | " deprecated " ]"
++
++.ti -8
++.BR "ip route" " { "
++.BR list " | " flush " } "
++.I SELECTOR
++
++.ti -8
++.B ip route get
++.IR ADDRESS " [ "
++.BI from " ADDRESS " iif " STRING"
++.RB " ] [ " oif
++.IR STRING " ] [ "
++.B tos
++.IR TOS " ]"
++
++.ti -8
++.BR "ip route" " { " add " | " del " | " change " | " append " | "\
++replace " | " monitor " } "
++.I ROUTE
++
++.ti -8
++.IR SELECTOR " := "
++.RB "[ " root
++.IR PREFIX " ] [ "
++.B match
++.IR PREFIX " ] [ "
++.B exact
++.IR PREFIX " ] [ "
++.B table
++.IR TABLE_ID " ] [ "
++.B proto
++.IR RTPROTO " ] [ "
++.B type
++.IR TYPE " ] [ "
++.B scope
++.IR SCOPE " ]"
++
++.ti -8
++.IR ROUTE " := " NODE_SPEC " [ " INFO_SPEC " ]"
++
++.ti -8
++.IR NODE_SPEC " := [ " TYPE " ] " PREFIX " ["
++.B tos
++.IR TOS " ] [ "
++.B table
++.IR TABLE_ID " ] [ "
++.B proto
++.IR RTPROTO " ] [ "
++.B scope
++.IR SCOPE " ] [ "
++.B metric
++.IR METRIC " ]"
++
++.ti -8
++.IR INFO_SPEC " := " "NH OPTIONS FLAGS" " ["
++.B nexthop
++.IR NH " ] ..."
++
++.ti -8
++.IR NH " := [ "
++.B via
++.IR ADDRESS " ] [ "
++.B dev
++.IR STRING " ] [ "
++.B weight
++.IR NUMBER " ] " NHFLAGS
++
++.ti -8
++.IR OPTIONS " := " FLAGS " [ "
++.B mtu
++.IR NUMBER " ] [ "
++.B advmss
++.IR NUMBER " ] [ "
++.B rtt
++.IR NUMBER " ] [ "
++.B rttvar
++.IR NUMBER " ] [ "
++.B window
++.IR NUMBER " ] [ "
++.B cwnd
++.IR NUMBER " ] [ "
++.B ssthresh
++.IR REALM " ] [ "
++.B realms
++.IR REALM " ]"
++
++.ti -8
++.IR TYPE " := [ "
++.BR unicast " | " local " | " broadcast " | " multicast " | "\
++throw " | " unreachable " | " prohibit " | " blackhole " | " nat " ]"
++
++.ti -8
++.IR TABLE_ID " := [ "
++.BR local "| " main " | " default " | " all " |"
++.IR NUMBER " ]"
++
++.ti -8
++.IR SCOPE " := [ "
++.BR host " | " link " | " global " |"
++.IR NUMBER " ]"
++
++.ti -8
++.IR FLAGS " := [ "
++.BR equalize " ]"
++
++.ti -8
++.IR NHFLAGS " := [ "
++.BR onlink " | " pervasive " ]"
++
++.ti -8
++.IR RTPROTO " := [ "
++.BR kernel " | " boot " | " static " |"
++.IR NUMBER " ]"
++
++.ti -8
++.B ip rule
++.RB " [ " list " | " add " | " del " ]"
++.I SELECTOR ACTION
++
++.ti -8
++.IR SELECTOR " := [ "
++.B from
++.IR PREFIX " ] [ "
++.B to
++.IR PREFIX " ] [ "
++.B tos
++.IR TOS " ] [ "
++.B fwmark
++.IR FWMARK " ] [ "
++.B dev
++.IR STRING " ] [ "
++.B pref
++.IR NUMBER " ]"
++
++.ti -8
++.IR ACTION " := [ "
++.B table
++.IR TABLE_ID " ] [ "
++.B nat
++.IR ADDRESS " ] [ "
++.BR prohibit " | " reject " | " unreachable " ] [ " realms
++.RI "[" SRCREALM "/]" DSTREALM " ]"
++
++.ti -8
++.IR TABLE_ID " := [ "
++.BR local " | " main " | " default " |"
++.IR NUMBER " ]"
++
++.ti -8
++.BR "ip neigh" " { " add " | " del " | " change " | " replace " } { "
++.IR ADDR " [ "
++.B lladdr
++.IR LLADDR " ] [ "
++.BR nud " { " permanent " | " noarp " | " stale " | " reachable " } ] | " proxy
++.IR ADDR " } [ "
++.B dev
++.IR DEV " ]"
++
++.ti -8
++.BR "ip neigh" " { " show " | " flush " } [ " to
++.IR PREFIX " ] [ "
++.B dev
++.IR DEV " ] [ "
++.B nud
++.IR STATE " ]"
++
++.ti -8
++.BR "ip tunnel" " { " add " | " change " | " del " | " show " }"
++.RI "[ " NAME " ]"
++.br
++.RB "[ " mode " { " ipip " | " gre " | " sit " } ]"
++.br
++.RB "[ " remote
++.IR ADDR " ] [ "
++.B local
++.IR ADDR " ]"
++.br
++.RB "[ [" i "|" o "]" seq " ] [ [" i "|" o "]" key
++.IR KEY " ] [ "
++.RB "[" i "|" o "]" csum " ] ]"
++.br
++.RB "[ " ttl
++.IR TTL " ] [ "
++.B tos
++.IR TOS " ] [ "
++.RB "[" no "]" pmtudisc " ]"
++.br
++.RB "[ " dev
++.IR PHYS_DEV " ]"
++
++.ti -8
++.IR ADDR " := { " IP_ADDRESS " |"
++.BR any " }"
++
++.ti -8
++.IR TOS " := { " NUMBER " |"
++.BR inherit " }"
++
++.ti -8
++.IR TTL " := { " 1 ".." 255 " | "
++.BR inherit " }"
++
++.ti -8
++.IR KEY " := { " DOTTED_QUAD " | " NUMBER " }"
++
++.ti -8
++.BR "ip maddr" " [ " add " | " del " ]"
++.IB MULTIADDR " dev " STRING
++
++.ti -8
++.BR "ip maddr show" " [ " dev
++.IR STRING " ]"
++
++.ti -8
++.BR "ip mroute show" " ["
++.IR PREFIX " ] [ "
++.B from
++.IR PREFIX " ] [ "
++.B iif
++.IR DEVICE " ]"
++
++.ti -8
++.BR "ip monitor" " [ " all " |"
++.IR LISTofOBJECTS " ]"
++.in -8
++.ad b
++
++.SH OPTIONS
++
++.TP
++.BR "\-V" , " -Version"
++print the version of the
++.B ip
++utility and exit.
++
++.TP
++.BR "\-s" , " \-stats", " \-statistics"
++output more information. If the option
++appears twice or more, the amount of information increases.
++As a rule, the information is statistics or some time values.
++
++.TP
++.BR "\-f" , " \-family"
++followed by protocol family identifier:
++.BR "inet" , " inet6"
++or
++.B link
++,enforce the protocol family to use. If the option is not present,
++the protocol family is guessed from other arguments. If the rest
++of the command line does not give enough information to guess the
++family,
++.B ip
++falls back to the default one, usually
++.B inet
++or
++.BR "any" .
++.B link
++is a special family identifier meaning that no networking protocol
++is involved.
++
++.TP
++.B \-4
++shortcut for
++.BR "-family inet" .
++
++.TP
++.B \-6
++shortcut for
++.BR "\-family inet6" .
++
++.TP
++.B \-0
++shortcut for
++.BR "\-family link" .
++
++.TP
++.BR "\-o" , " \-oneline"
++output each record on a single line, replacing line feeds
++with the
++.B '\'
++character. This is convenient when you want to count records
++with
++.BR wc (1)
++ or to
++.BR grep (1)
++the output.
++
++.TP
++.BR "\-r" , " \-resolve"
++use the system's name resolver to print DNS names instead of
++host addresses.
++
++.SH IP - COMMAND SYNTAX
++
++.SS
++.I OBJECT
++
++.TP
++.B link
++- network device.
++
++.TP
++.B address
++- protocol (IP or IPv6) address on a device.
++.TP
++.B neighbour
++- ARP or NDISC cache entry.
++
++.TP
++.B route
++- routing table entry.
++
++.TP
++.B rule
++- rule in routing policy database.
++
++.TP
++.B maddress
++- multicast address.
++
++.TP
++.B mroute
++- multicast routing cache entry.
++
++.TP
++.B tunnel
++- tunnel over IP.
++
++.PP
++The names of all objects may be written in full or
++abbreviated form, f.e.
++.B address
++is abbreviated as
++.B addr
++or just
++.B a.
++
++.SS
++.I COMMAND
++
++Specifies the action to perform on the object.
++The set of possible actions depends on the object type.
++As a rule, it is possible to
++.BR "add" , " delete"
++and
++.B show
++(or
++.B list
++) objects, but some objects do not allow all of these operations
++or have some additional commands. The
++.B help
++command is available for all objects. It prints
++out a list of available commands and argument syntax conventions.
++.sp
++If no command is given, some default command is assumed.
++Usually it is
++.B list
++or, if the objects of this class cannot be listed,
++.BR "help" .
++
++.SH ip link - network device configuration
++
++.B link
++is a network device and the corresponding commands
++display and change the state of devices.
++
++.SS ip link set - change device attributes
++
++.TP
++.BI dev " NAME " (default)
++.I NAME
++specifies network device to operate on.
++
++.TP
++.BR up " and " down
++change the state of the device to
++.B UP
++or
++.BR "DOWN" .
++
++.TP
++.BR "arp on " or " arp off"
++change the
++.B NOARP
++flag on the device.
++
++.TP
++.BR "multicast on " or " multicast off"
++change the
++.B MULTICAST
++flag on the device.
++
++.TP
++.BR "dynamic on " or " dynamic off"
++change the
++.B DYNAMIC
++flag on the device.
++
++.TP
++.BI name " NAME"
++change the name of the device. This operation is not
++recommended if the device is running or has some addresses
++already configured.
++
++.TP
++.BI txqueuelen " NUMBER"
++.TP
++.BI txqlen " NUMBER"
++change the transmit queue length of the device.
++
++.TP
++.BI mtu " NUMBER"
++change the
++.I MTU
++of the device.
++
++.TP
++.BI address " LLADDRESS"
++change the station address of the interface.
++
++.TP
++.BI broadcast " LLADDRESS"
++.TP
++.BI brd " LLADDRESS"
++.TP
++.BI peer " LLADDRESS"
++change the link layer broadcast address or the peer address when
++the interface is
++.IR "POINTOPOINT" .
++
++.PP
++.B Warning:
++If multiple parameter changes are requested,
++.B ip
++aborts immediately after any of the changes have failed.
++This is the only case when
++.B ip
++can move the system to an unpredictable state. The solution
++is to avoid changing several parameters with one
++.B ip link set
++call.
++
++.SS ip link show - display device attributes
++
++.TP
++.BI dev " NAME " (default)
++.I NAME
++specifies the network device to show.
++If this argument is omitted all devices are listed.
++
++.TP
++.B up
++only display running interfaces.
++
++.SH ip address - protocol address management.
++
++The
++.B address
++is a protocol (IP or IPv6) address attached
++to a network device. Each device must have at least one address
++to use the corresponding protocol. It is possible to have several
++different addresses attached to one device. These addresses are not
++discriminated, so that the term
++.B alias
++is not quite appropriate for them and we do not use it in this document.
++.sp
++The
++.B ip addr
++command displays addresses and their properties, adds new addresses
++and deletes old ones.
++
++.SS ip address add - add new protocol address.
++
++.TP
++.BI dev " NAME"
++the name of the device to add the address to.
++
++.TP
++.BI local " ADDRESS " (default)
++the address of the interface. The format of the address depends
++on the protocol. It is a dotted quad for IP and a sequence of
++hexadecimal halfwords separated by colons for IPv6. The
++.I ADDRESS
++may be followed by a slash and a decimal number which encodes
++the network prefix length.
++
++.TP
++.BI peer " ADDRESS"
++the address of the remote endpoint for pointopoint interfaces.
++Again, the
++.I ADDRESS
++may be followed by a slash and a decimal number, encoding the network
++prefix length. If a peer address is specified, the local address
++cannot have a prefix length. The network prefix is associated
++with the peer rather than with the local address.
++
++.TP
++.BI broadcast " ADDRESS"
++the broadcast address on the interface.
++.sp
++It is possible to use the special symbols
++.B '+'
++and
++.B '-'
++instead of the broadcast address. In this case, the broadcast address
++is derived by setting/resetting the host bits of the interface prefix.
++
++.TP
++.BI label " NAME"
++Each address may be tagged with a label string.
++In order to preserve compatibility with Linux-2.0 net aliases,
++this string must coincide with the name of the device or must be prefixed
++with the device name followed by colon.
++
++.TP
++.BI scope " SCOPE_VALUE"
++the scope of the area where this address is valid.
++The available scopes are listed in file
++.BR "/etc/iproute2/rt_scopes" .
++Predefined scope values are:
++
++.in +8
++.B global
++- the address is globally valid.
++.sp
++.B site
++- (IPv6 only) the address is site local, i.e. it is
++valid inside this site.
++.sp
++.B link
++- the address is link local, i.e. it is valid only on this device.
++.sp
++.B host
++- the address is valid only inside this host.
++.in -8
++
++.SS ip address delete - delete protocol address
++.B Arguments:
++coincide with the arguments of
++.B ip addr add.
++The device name is a required argument. The rest are optional.
++If no arguments are given, the first address is deleted.
++
++.SS ip address show - look at protocol addresses
++
++.TP
++.BI dev " NAME " (default)
++name of device.
++
++.TP
++.BI scope " SCOPE_VAL"
++only list addresses with this scope.
++
++.TP
++.BI to " PREFIX"
++only list addresses matching this prefix.
++
++.TP
++.BI label " PATTERN"
++only list addresses with labels matching the
++.IR "PATTERN" .
++.I PATTERN
++is a usual shell style pattern.
++
++.TP
++.BR dynamic " and " permanent
++(IPv6 only) only list addresses installed due to stateless
++address configuration or only list permanent (not dynamic)
++addresses.
++
++.TP
++.B tentative
++(IPv6 only) only list addresses which did not pass duplicate
++address detection.
++
++.TP
++.B deprecated
++(IPv6 only) only list deprecated addresses.
++
++.TP
++.BR primary " and " secondary
++only list primary (or secondary) addresses.
++
++.SS ip address flush - flush protocol addresses
++This command flushes the protocol addresses selected by some criteria.
++
++.PP
++This command has the same arguments as
++.B show.
++The difference is that it does not run when no arguments are given.
++
++.PP
++.B Warning:
++This command (and other
++.B flush
++commands described below) is pretty dangerous. If you make a mistake,
++it will not forgive it, but will cruelly purge all the addresses.
++
++.PP
++With the
++.B -statistics
++option, the command becomes verbose. It prints out the number of deleted
++addresses and the number of rounds made to flush the address list. If
++this option is given twice,
++.B ip addr flush
++also dumps all the deleted addresses in the format described in the
++previous subsection.
++
++.SH ip neighbour - neighbour/arp tables management.
++
++.B neighbour
++objects establish bindings between protocol addresses and
++link layer addresses for hosts sharing the same link.
++Neighbour entries are organized into tables. The IPv4 neighbour table
++is known by another name - the ARP table.
++
++.P
++The corresponding commands display neighbour bindings
++and their properties, add new neighbour entries and delete old ones.
++
++.SS ip neighbour add - add a new neighbour entry
++.SS ip neighbour change - change an existing entry
++.SS ip neighbour replace - add a new entry or change an existing one
++
++These commands create new neighbour records or update existing ones.
++
++.TP
++.BI to " ADDRESS " (default)
++the protocol address of the neighbour. It is either an IPv4 or IPv6 address.
++
++.TP
++.BI dev " NAME"
++the interface to which this neighbour is attached.
++
++.TP
++.BI lladdr " LLADDRESS"
++the link layer address of the neighbour.
++.I LLADDRESS
++can also be
++.BR "null" .
++
++.TP
++.BI nud " NUD_STATE"
++the state of the neighbour entry.
++.B nud
++is an abbreviation for 'Neigh bour Unreachability Detection'.
++The state can take one of the following values:
++
++.in +8
++.B permanent
++- the neighbour entry is valid forever and can be only
++be removed administratively.
++.sp
++
++.B noarp
++- the neighbour entry is valid. No attempts to validate
++this entry will be made but it can be removed when its lifetime expires.
++.sp
++
++.B reachable
++- the neighbour entry is valid until the reachability
++timeout expires.
++.sp
++
++.B stale
++- the neighbour entry is valid but suspicious.
++This option to
++.B ip neigh
++does not change the neighbour state if it was valid and the address
++is not changed by this command.
++.in -8
++
++.SS ip neighbour delete - delete a neighbour entry
++This command invalidates a neighbour entry.
++
++.PP
++The arguments are the same as with
++.BR "ip neigh add" ,
++except that
++.B lladdr
++and
++.B nud
++are ignored.
++
++.PP
++.B Warning:
++Attempts to delete or manually change a
++.B noarp
++entry created by the kernel may result in unpredictable behaviour.
++Particularly, the kernel may try to resolve this address even
++on a
++.B NOARP
++interface or if the address is multicast or broadcast.
++
++.SS ip neighbour show - list neighbour entries
++
++This commands displays neighbour tables.
++
++.TP
++.BI to " ADDRESS " (default)
++the prefix selecting the neighbours to list.
++
++.TP
++.BI dev " NAME"
++only list the neighbours attached to this device.
++
++.TP
++.B unused
++only list neighbours which are not currently in use.
++
++.TP
++.BI nud " NUD_STATE"
++only list neighbour entries in this state.
++.I NUD_STATE
++takes values listed below or the special value
++.B all
++which means all states. This option may occur more than once.
++If this option is absent,
++.B ip
++lists all entries except for
++.B none
++and
++.BR "noarp" .
++
++.SS ip neighbour flush - flush neighbour entries
++This command flushes neighbour tables, selecting
++entries to flush by some criteria.
++
++.PP
++This command has the same arguments as
++.B show.
++The differences are that it does not run when no arguments are given,
++and that the default neighbour states to be flushed do not include
++.B permanent
++and
++.BR "noarp" .
++
++.PP
++With the
++.B -statistics
++option, the command becomes verbose. It prints out the number of
++deleted neighbours and the number of rounds made to flush the
++neighbour table. If the option is given
++twice,
++.B ip neigh flush
++also dumps all the deleted neighbours.
++
++.SH ip route - routing table management
++Manipulate route entries in the kernel routing tables keep
++information about paths to other networked nodes.
++.sp
++.B Route types:
++
++.in +8
++.B unicast
++- the route entry describes real paths to the destinations covered
++by the route prefix.
++
++.sp
++.B unreachable
++- these destinations are unreachable. Packets are discarded and the
++ICMP message
++.I host unreachable
++is generated.
++The local senders get an
++.I EHOSTUNREACH
++error.
++
++.sp
++.B blackhole
++- these destinations are unreachable. Packets are discarded silently.
++The local senders get an
++.I EINVAL
++error.
++
++.sp
++.B prohibit
++- these destinations are unreachable. Packets are discarded and the
++ICMP message
++.I communication administratively prohibited
++is generated. The local senders get an
++.I EACCES
++error.
++
++.sp
++.B local
++- the destinations are assigned to this host. The packets are looped
++back and delivered locally.
++
++.sp
++.B broadcast
++- the destinations are broadcast addresses. The packets are sent as
++link broadcasts.
++
++.sp
++.B throw
++- a special control route used together with policy rules. If such a
++route is selected, lookup in this table is terminated pretending that
++no route was found. Without policy routing it is equivalent to the
++absence of the route in the routing table. The packets are dropped
++and the ICMP message
++.I net unreachable
++is generated. The local senders get an
++.I ENETUNREACH
++error.
++
++.sp
++.B nat
++- a special NAT route. Destinations covered by the prefix
++are considered to be dummy (or external) addresses which require translation
++to real (or internal) ones before forwarding. The addresses to translate to
++are selected with the attribute
++.BR "via" .
++
++.sp
++.B anycast
++.RI "- " "not implemented"
++the destinations are
++.I anycast
++addresses assigned to this host. They are mainly equivalent
++to
++.B local
++with one difference: such addresses are invalid when used
++as the source address of any packet.
++
++.sp
++.B multicast
++- a special type used for multicast routing. It is not present in
++normal routing tables.
++.in -8
++
++.P
++.B Route tables:
++Linux-2.x can pack routes into several routing
++tables identified by a number in the range from 1 to 255 or by
++name from the file
++.B /etc/iproute2/rt_tables
++. By default all normal routes are inserted into the
++.B main
++table (ID 254) and the kernel only uses this table when calculating routes.
++
++.sp
++Actually, one other table always exists, which is invisible but
++even more important. It is the
++.B local
++table (ID 255). This table
++consists of routes for local and broadcast addresses. The kernel maintains
++this table automatically and the administrator usually need not modify it
++or even look at it.
++
++The multiple routing tables enter the game when
++.I policy routing
++is used.
++
++.SS ip route add - add new route
++.SS ip route change - change route
++.SS ip route replace - change or add new one
++
++.TP
++.BI to " TYPE PREFIX " (default)
++the destination prefix of the route. If
++.I TYPE
++is omitted,
++.B ip
++assumes type
++.BR "unicast" .
++Other values of
++.I TYPE
++are listed above.
++.I PREFIX
++is an IP or IPv6 address optionally followed by a slash and the
++prefix length. If the length of the prefix is missing,
++.B ip
++assumes a full-length host route. There is also a special
++.I PREFIX
++.B default
++- which is equivalent to IP
++.B 0/0
++or to IPv6
++.BR "::/0" .
++
++.TP
++.BI tos " TOS"
++.TP
++.BI dsfield " TOS"
++the Type Of Service (TOS) key. This key has no associated mask and
++the longest match is understood as: First, compare the TOS
++of the route and of the packet. If they are not equal, then the packet
++may still match a route with a zero TOS.
++.I TOS
++is either an 8 bit hexadecimal number or an identifier
++from
++.BR "/etc/iproute2/rt_dsfield" .
++
++.TP
++.BI metric " NUMBER"
++.TP
++.BI preference " NUMBER"
++the preference value of the route.
++.I NUMBER
++is an arbitrary 32bit number.
++
++.TP
++.BI table " TABLEID"
++the table to add this route to.
++.I TABLEID
++may be a number or a string from the file
++.BR "/etc/iproute2/rt_tables" .
++If this parameter is omitted,
++.B ip
++assumes the
++.B main
++table, with the exception of
++.BR local " , " broadcast " and " nat
++routes, which are put into the
++.B local
++table by default.
++
++.TP
++.BI dev " NAME"
++the output device name.
++
++.TP
++.BI via " ADDRESS"
++the address of the nexthop router. Actually, the sense of this field
++depends on the route type. For normal
++.B unicast
++routes it is either the true next hop router or, if it is a direct
++route installed in BSD compatibility mode, it can be a local address
++of the interface. For NAT routes it is the first address of the block
++of translated IP destinations.
++
++.TP
++.BI src " ADDRESS"
++the source address to prefer when sending to the destinations
++covered by the route prefix.
++
++.TP
++.BI realm " REALMID"
++the realm to which this route is assigned.
++.I REALMID
++may be a number or a string from the file
++.BR "/etc/iproute2/rt_realms" .
++
++.TP
++.BI mtu " MTU"
++.TP
++.BI "mtu lock" " MTU"
++the MTU along the path to the destination. If the modifier
++.B lock
++is not used, the MTU may be updated by the kernel due to
++Path MTU Discovery. If the modifier
++.B lock
++is used, no path MTU discovery will be tried, all packets
++will be sent without the DF bit in IPv4 case or fragmented
++to MTU for IPv6.
++
++.TP
++.BI window " NUMBER"
++the maximal window for TCP to advertise to these destinations,
++measured in bytes. It limits maximal data bursts that our TCP
++peers are allowed to send to us.
++
++.TP
++.BI rtt " NUMBER"
++the initial RTT ('Round Trip Time') estimate.
++
++.TP
++.BI rttvar " NUMBER " "(2.3.15+ only)"
++the initial RTT variance estimate.
++
++.TP
++.BI ssthresh " NUMBER " "(2.3.15+ only)"
++an estimate for the initial slow start threshold.
++
++.TP
++.BI cwnd " NUMBER " "(2.3.15+ only)"
++the clamp for congestion window. It is ignored if the
++.B lock
++flag is not used.
++
++.TP
++.BI advmss " NUMBER " "(2.3.15+ only)"
++the MSS ('Maximal Segment Size') to advertise to these
++destinations when establishing TCP connections. If it is not given,
++Linux uses a default value calculated from the first hop device MTU.
++(If the path to these destination is asymmetric, this guess may be wrong.)
++
++.TP
++.BI reordering " NUMBER " "(2.3.15+ only)"
++Maximal reordering on the path to this destination.
++If it is not given, Linux uses the value selected with
++.B sysctl
++variable
++.BR "net/ipv4/tcp_reordering" .
++
++.TP
++.BI nexthop " NEXTHOP"
++the nexthop of a multipath route.
++.I NEXTHOP
++is a complex value with its own syntax similar to the top level
++argument lists:
++
++.in +8
++.BI via " ADDRESS"
++- is the nexthop router.
++.sp
++
++.BI dev " NAME"
++- is the output device.
++.sp
++
++.BI weight " NUMBER"
++- is a weight for this element of a multipath
++route reflecting its relative bandwidth or quality.
++.in -8
++
++.TP
++.BI scope " SCOPE_VAL"
++the scope of the destinations covered by the route prefix.
++.I SCOPE_VAL
++may be a number or a string from the file
++.BR "/etc/iproute2/rt_scopes" .
++If this parameter is omitted,
++.B ip
++assumes scope
++.B global
++for all gatewayed
++.B unicast
++routes, scope
++.B link
++for direct
++.BR unicast " and " broadcast
++routes and scope
++.BR host " for " local
++routes.
++
++.TP
++.BI protocol " RTPROTO"
++the routing protocol identifier of this route.
++.I RTPROTO
++may be a number or a string from the file
++.BR "/etc/iproute2/rt_protos" .
++If the routing protocol ID is not given,
++.B ip assumes protocol
++.B boot
++(i.e. it assumes the route was added by someone who doesn't
++understand what they are doing). Several protocol values have
++a fixed interpretation.
++Namely:
++
++.in +8
++.B redirect
++- the route was installed due to an ICMP redirect.
++.sp
++
++.B kernel
++- the route was installed by the kernel during autoconfiguration.
++.sp
++
++.B boot
++- the route was installed during the bootup sequence.
++If a routing daemon starts, it will purge all of them.
++.sp
++
++.B static
++- the route was installed by the administrator
++to override dynamic routing. Routing daemon will respect them
++and, probably, even advertise them to its peers.
++.sp
++
++.B ra
++- the route was installed by Router Discovery protocol.
++.in -8
++
++.sp
++The rest of the values are not reserved and the administrator is free
++to assign (or not to assign) protocol tags.
++
++.TP
++.B onlink
++pretend that the nexthop is directly attached to this link,
++even if it does not match any interface prefix.
++
++.TP
++.B equalize
++allow packet by packet randomization on multipath routes.
++Without this modifier, the route will be frozen to one selected
++nexthop, so that load splitting will only occur on per-flow base.
++.B equalize
++only works if the kernel is patched.
++
++.SS ip route delete - delete route
++
++.B ip route del
++has the same arguments as
++.BR "ip route add" ,
++but their semantics are a bit different.
++
++Key values
++.RB "(" to ", " tos ", " preference " and " table ")"
++select the route to delete. If optional attributes are present,
++.B ip
++verifies that they coincide with the attributes of the route to delete.
++If no route with the given key and attributes was found,
++.B ip route del
++fails.
++
++.SS ip route show - list routes
++the command displays the contents of the routing tables or the route(s)
++selected by some criteria.
++
++.TP
++.BI to " SELECTOR " (default)
++only select routes from the given range of destinations.
++.I SELECTOR
++consists of an optional modifier
++.RB "(" root ", " match " or " exact ")"
++and a prefix.
++.BI root " PREFIX"
++selects routes with prefixes not shorter than
++.IR PREFIX "."
++F.e.
++.BI root " 0/0"
++selects the entire routing table.
++.BI match " PREFIX"
++selects routes with prefixes not longer than
++.IR PREFIX "."
++F.e.
++.BI match " 10.0/16"
++selects
++.IR 10.0/16 ","
++.IR 10/8 " and " 0/0 ,
++but it does not select
++.IR 10.1/16 " and " 10.0.0/24 .
++And
++.BI exact " PREFIX"
++(or just
++.IR PREFIX ")"
++selects routes with this exact prefix. If neither of these options
++are present,
++.B ip
++assumes
++.BI root " 0/0"
++i.e. it lists the entire table.
++
++.TP
++.BI tos " TOS"
++.BI dsfield " TOS"
++only select routes with the given TOS.
++
++.TP
++.BI table " TABLEID"
++show the routes from this table(s). The default setting is to show
++.BR table main "."
++.I TABLEID
++may either be the ID of a real table or one of the special values:
++.sp
++.in +8
++.B all
++- list all of the tables.
++.sp
++.B cache
++- dump the routing cache.
++.in -8
++
++.TP
++.B cloned
++.TP
++.B cached
++list cloned routes i.e. routes which were dynamically forked from
++other routes because some route attribute (f.e. MTU) was updated.
++Actually, it is equivalent to
++.BR "table cache" "."
++
++.TP
++.BI from " SELECTOR"
++the same syntax as for
++.BR to ","
++but it binds the source address range rather than destinations.
++Note that the
++.B from
++option only works with cloned routes.
++
++.TP
++.BI protocol " RTPROTO"
++only list routes of this protocol.
++
++.TP
++.BI scope " SCOPE_VAL"
++only list routes with this scope.
++
++.TP
++.BI type " TYPE"
++only list routes of this type.
++
++.TP
++.BI dev " NAME"
++only list routes going via this device.
++
++.TP
++.BI via " PREFIX"
++only list routes going via the nexthop routers selected by
++.IR PREFIX "."
++
++.TP
++.BI src " PREFIX"
++only list routes with preferred source addresses selected
++by
++.IR PREFIX "."
++
++.TP
++.BI realm " REALMID"
++.TP
++.BI realms " FROMREALM/TOREALM"
++only list routes with these realms.
++
++.SS ip route flush - flush routing tables
++this command flushes routes selected by some criteria.
++
++.sp
++The arguments have the same syntax and semantics as the arguments of
++.BR "ip route show" ,
++but routing tables are not listed but purged. The only difference is
++the default action:
++.B show
++dumps all the IP main routing table but
++.B flush
++prints the helper page.
++
++.sp
++With the
++.B -statistics
++option, the command becomes verbose. It prints out the number of
++deleted routes and the number of rounds made to flush the routing
++table. If the option is given
++twice,
++.B ip route flush
++also dumps all the deleted routes in the format described in the
++previous subsection.
++
++.SS ip route get - get a single route
++this command gets a single route to a destination and prints its
++contents exactly as the kernel sees it.
++
++.TP
++.BI to " ADDRESS " (default)
++the destination address.
++
++.TP
++.BI from " ADDRESS"
++the source address.
++
++.TP
++.BI tos " TOS"
++.TP
++.BI dsfield " TOS"
++the Type Of Service.
++
++.TP
++.BI iif " NAME"
++the device from which this packet is expected to arrive.
++
++.TP
++.BI oif " NAME"
++force the output device on which this packet will be routed.
++
++.TP
++.B connected
++if no source address
++.RB "(option " from ")"
++was given, relookup the route with the source set to the preferred
++address received from the first lookup.
++If policy routing is used, it may be a different route.
++
++.P
++Note that this operation is not equivalent to
++.BR "ip route show" .
++.B show
++shows existing routes.
++.B get
++resolves them and creates new clones if necessary. Essentially,
++.B get
++is equivalent to sending a packet along this path.
++If the
++.B iif
++argument is not given, the kernel creates a route
++to output packets towards the requested destination.
++This is equivalent to pinging the destination
++with a subsequent
++.BR "ip route ls cache" ,
++however, no packets are actually sent. With the
++.B iif
++argument, the kernel pretends that a packet arrived from this interface
++and searches for a path to forward the packet.
++
++.SH ip rule - routing policy database management
++
++.BR "Rule" s
++in the routing policy database control the route selection algorithm.
++
++.P
++Classic routing algorithms used in the Internet make routing decisions
++based only on the destination address of packets (and in theory,
++but not in practice, on the TOS field).
++
++.P
++In some circumstances we want to route packets differently depending not only
++on destination addresses, but also on other packet fields: source address,
++IP protocol, transport protocol ports or even packet payload.
++This task is called 'policy routing'.
++
++.P
++To solve this task, the conventional destination based routing table, ordered
++according to the longest match rule, is replaced with a 'routing policy
++database' (or RPDB), which selects routes by executing some set of rules.
++
++.P
++Each policy routing rule consists of a
++.B selector
++and an
++.B action predicate.
++The RPDB is scanned in the order of increasing priority. The selector
++of each rule is applied to {source address, destination address, incoming
++interface, tos, fwmark} and, if the selector matches the packet,
++the action is performed. The action predicate may return with success.
++In this case, it will either give a route or failure indication
++and the RPDB lookup is terminated. Otherwise, the RPDB program
++continues on the next rule.
++
++.P
++Semantically, natural action is to select the nexthop and the output device.
++
++.P
++At startup time the kernel configures the default RPDB consisting of three
++rules:
++
++.TP
++1.
++Priority: 0, Selector: match anything, Action: lookup routing
++table
++.B local
++(ID 255).
++The
++.B local
++table is a special routing table containing
++high priority control routes for local and broadcast addresses.
++.sp
++Rule 0 is special. It cannot be deleted or overridden.
++
++.TP
++2.
++Priority: 32766, Selector: match anything, Action: lookup routing
++table
++.B main
++(ID 254).
++The
++.B main
++table is the normal routing table containing all non-policy
++routes. This rule may be deleted and/or overridden with other
++ones by the administrator.
++
++.TP
++3.
++Priority: 32767, Selector: match anything, Action: lookup routing
++table
++.B default
++(ID 253).
++The
++.B default
++table is empty. It is reserved for some post-processing if no previous
++default rules selected the packet.
++This rule may also be deleted.
++
++.P
++Each RPDB entry has additional
++attributes. F.e. each rule has a pointer to some routing
++table. NAT and masquerading rules have an attribute to select new IP
++address to translate/masquerade. Besides that, rules have some
++optional attributes, which routes have, namely
++.BR "realms" .
++These values do not override those contained in the routing tables. They
++are only used if the route did not select any attributes.
++
++.sp
++The RPDB may contain rules of the following types:
++
++.in +8
++.B unicast
++- the rule prescribes to return the route found
++in the routing table referenced by the rule.
++
++.B blackhole
++- the rule prescribes to silently drop the packet.
++
++.B unreachable
++- the rule prescribes to generate a 'Network is unreachable' error.
++
++.B prohibit
++- the rule prescribes to generate 'Communication is administratively
++prohibited' error.
++
++.B nat
++- the rule prescribes to translate the source address
++of the IP packet into some other value.
++.in -8
++
++.SS ip rule add - insert a new rule
++.SS ip rule delete - delete a rule
++
++.TP
++.BI type " TYPE " (default)
++the type of this rule. The list of valid types was given in the previous
++subsection.
++
++.TP
++.BI from " PREFIX"
++select the source prefix to match.
++
++.TP
++.BI to " PREFIX"
++select the destination prefix to match.
++
++.TP
++.BI iif " NAME"
++select the incoming device to match. If the interface is loopback,
++the rule only matches packets originating from this host. This means
++that you may create separate routing tables for forwarded and local
++packets and, hence, completely segregate them.
++
++.TP
++.BI tos " TOS"
++.TP
++.BI dsfield " TOS"
++select the TOS value to match.
++
++.TP
++.BI fwmark " MARK"
++select the
++.B fwmark
++value to match.
++
++.TP
++.BI priority " PREFERENCE"
++the priority of this rule. Each rule should have an explicitly
++set
++.I unique
++priority value.
++
++.TP
++.BI table " TABLEID"
++the routing table identifier to lookup if the rule selector matches.
++
++.TP
++.BI realms " FROM/TO"
++Realms to select if the rule matched and the routing table lookup
++succeeded. Realm
++.I TO
++is only used if the route did not select any realm.
++
++.TP
++.BI nat " ADDRESS"
++The base of the IP address block to translate (for source addresses).
++The
++.I ADDRESS
++may be either the start of the block of NAT addresses (selected by NAT
++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.
++
++.B Warning:
++Changes to the RPDB made with these commands do not become active
++immediately. It is assumed that after a script finishes a batch of
++updates, it flushes the routing cache with
++.BR "ip route flush cache" .
++
++.SS ip rule show - list rules
++This command has no arguments.
++
++.SH ip maddress - multicast addresses management
++
++.B maddress
++objects are multicast addresses.
++
++.SS ip maddress show - list multicast addresses
++
++.TP
++.BI dev " NAME " (default)
++the device name.
++
++.SS ip maddress add - add a multicast address
++.SS ip maddress delete - delete a multicast address
++these commands attach/detach a static link layer multicast address
++to listen on the interface.
++Note that it is impossible to join protocol multicast groups
++statically. This command only manages link layer addresses.
++
++.TP
++.BI address " LLADDRESS " (default)
++the link layer multicast address.
++
++.TP
++.BI dev " NAME"
++the device to join/leave this multicast address.
++
++.SH ip mroute - multicast routing cache management
++.B mroute
++objects are multicast routing cache entries created by a user level
++mrouting daemon (f.e.
++.B pimd
++or
++.B mrouted
++).
++
++Due to the limitations of the current interface to the multicast routing
++engine, it is impossible to change
++.B mroute
++objects administratively, so we may only display them. This limitation
++will be removed in the future.
++
++.SS ip mroute show - list mroute cache entries
++
++.TP
++.BI to " PREFIX " (default)
++the prefix selecting the destination multicast addresses to list.
++
++.TP
++.BI iif " NAME"
++the interface on which multicast packets are received.
++
++.TP
++.BI from " PREFIX"
++the prefix selecting the IP source addresses of the multicast route.
++
++.SH ip tunnel - tunnel configuration
++.B tunnel
++objects are tunnels, encapsulating packets in IPv4 packets and then
++sending them over the IP infrastructure.
++
++.SS ip tunnel add - add a new tunnel
++.SS ip tunnel change - change an existing tunnel
++.SS ip tunnel delete - destroy a tunnel
++
++.TP
++.BI name " NAME " (default)
++select the tunnel device name.
++
++.TP
++.BI mode " MODE"
++set the tunnel mode. Three modes are currently available:
++.BR ipip ", " sit " and " gre "."
++
++.TP
++.BI remote " ADDRESS"
++set the remote endpoint of the tunnel.
++
++.TP
++.BI local " ADDRESS"
++set the fixed local address for tunneled packets.
++It must be an address on another interface of this host.
++
++.TP
++.BI ttl " N"
++set a fixed TTL
++.I N
++on tunneled packets.
++.I N
++is a number in the range 1--255. 0 is a special value
++meaning that packets inherit the TTL value.
++The default value is:
++.BR "inherit" .
++
++.TP
++.BI tos " T"
++.TP
++.BI dsfield " T"
++set a fixed TOS
++.I T
++on tunneled packets.
++The default value is:
++.BR "inherit" .
++
++.TP
++.BI dev " NAME"
++bind the tunnel to the device
++.I NAME
++so that tunneled packets will only be routed via this device and will
++not be able to escape to another device when the route to endpoint
++changes.
++
++.TP
++.B nopmtudisc
++disable Path MTU Discovery on this tunnel.
++It is enabled by default. Note that a fixed ttl is incompatible
++with this option: tunnelling with a fixed ttl always makes pmtu
++discovery.
++
++.TP
++.BI key " K"
++.TP
++.BI ikey " K"
++.TP
++.BI okey " K"
++.RB ( " only GRE tunnels " )
++use keyed GRE with key
++.IR K ". " K
++is either a number or an IP address-like dotted quad.
++The
++.B key
++parameter sets the key to use in both directions.
++The
++.BR ikey " and " okey
++parameters set different keys for input and output.
++
++.TP
++.BR csum ", " icsum ", " ocsum
++.RB ( " only GRE tunnels " )
++generate/require checksums for tunneled packets.
++The
++.B ocsum
++flag calculates checksums for outgoing packets.
++The
++.B icsum
++flag requires that all input packets have the correct
++checksum. The
++.B csum
++flag is equivalent to the combination
++.BR "icsum ocsum" .
++
++.TP
++.BR seq ", " iseq ", " oseq
++.RB ( " only GRE tunnels " )
++serialize packets.
++The
++.B oseq
++flag enables sequencing of outgoing packets.
++The
++.B iseq
++flag requires that all input packets are serialized.
++The
++.B seq
++flag is equivalent to the combination
++.BR "iseq oseq" .
++.B It isn't work. Don't use it.
++
++.SS ip tunnel show - list tunnels
++This command has no arguments.
++
++.SH ip monitor and rtmon - state monitoring
++
++The
++.B ip
++utility can monitor the state of devices, addresses
++and routes continuously. This option has a slightly different format.
++Namely, the
++.B monitor
++command is the first in the command line and then the object list follows:
++
++.BR "ip monitor" " [ " all " |"
++.IR LISTofOBJECTS " ]"
++
++.I OBJECT-LIST
++is the list of object types that we want to monitor.
++It may contain
++.BR link ", " address " and " route "."
++If no
++.B file
++argument is given,
++.B ip
++opens RTNETLINK, listens on it and dumps state changes in the format
++described in previous sections.
++
++.P
++If a file name is given, it does not listen on RTNETLINK,
++but opens the file containing RTNETLINK messages saved in binary format
++and dumps them. Such a history file can be generated with the
++.B rtmon
++utility. This utility has a command line syntax similar to
++.BR "ip monitor" .
++Ideally,
++.B rtmon
++should be started before the first network configuration command
++is issued. F.e. if you insert:
++.sp
++.in +8
++rtmon file /var/log/rtmon.log
++.in -8
++.sp
++in a startup script, you will be able to view the full history
++later.
++
++.P
++Certainly, it is possible to start
++.B rtmon
++at any time.
++It prepends the history with the state snapshot dumped at the moment
++of starting.
++
++.SH HISTORY
++
++.B ip
++was written by Alexey N. Kuznetsov and added in Linux 2.2.
++.SH SEE ALSO
++.BR tc (8)
++.br
++.RB "IP Command reference " ip-cref.ps
++.br
++.RB "IP tunnels " ip-cref.ps
++
++.SH AUTHOR
++
++Manpage maintained by Michail Litvak <mci@owl.openwall.com>
+--- debian/manpages/tc.8
++++ debian/manpages/tc.8
+@@ -0,0 +1,348 @@
++.TH TC 8 "16 December 2001" "iproute2" "Linux"
++.SH NAME
++tc \- show / manipulate traffic control settings
++.SH SYNOPSIS
++.B tc qdisc [ add | change | replace | link ] dev
++DEV
++.B
++[ parent
++qdisc-id
++.B | root ]
++.B [ handle
++qdisc-id ] qdisc
++[ qdisc specific parameters ]
++.P
++
++.B tc class [ add | change | replace ] dev
++DEV
++.B parent
++qdisc-id
++.B [ classid
++class-id ] qdisc
++[ qdisc specific parameters ]
++.P
++
++.B tc filter [ add | change | replace ] dev
++DEV
++.B [ parent
++qdisc-id
++.B | root ] protocol
++protocol
++.B prio
++priority filtertype
++[ filtertype specific parameters ]
++.B flowid
++flow-id
++
++.B tc [-s | -d ] qdisc show [ dev
++DEV
++.B ]
++.P
++.B tc [-s | -d ] class show dev
++DEV
++.P
++.B tc filter show dev
++DEV
++
++.SH DESCRIPTION
++.B Tc
++is used to configure Traffic Control in the Linux kernel. Traffic Control consists
++of the following:
++
++.TP
++SHAPING
++When traffic is shaped, its rate of transmission is under control. Shaping may
++be more than lowering the available bandwidth - it is also used to smooth out
++bursts in traffic for better network behaviour. Shaping occurs on egress.
++
++.TP
++SCHEDULING
++By scheduling the transmission of packets it is possible to improve interactivity
++for traffic that needs it while still guaranteeing bandwidth to bulk transfers. Reordering
++is also called prioritizing, and happens only on egress.
++
++.TP
++POLICING
++Where shaping deals with transmission of traffic, policing pertains to traffic
++arriving. Policing thus occurs on ingress.
++
++.TP
++DROPPING
++Traffic exceeding a set bandwidth may also be dropped forthwith, both on
++ingress and on egress.
++
++.P
++Processing of traffic is controlled by three kinds of objects: qdiscs,
++classes and filters.
++
++.SH QDISCS
++.B qdisc
++is short for 'queueing discipline' and it is elementary to
++understanding traffic control. Whenever the kernel needs to send a
++packet to an interface, it is
++.B enqueued
++to the qdisc configured for that interface. Immediately afterwards, the kernel
++tries to get as many packets as possible from the qdisc, for giving them
++to the network adaptor driver.
++
++A simple QDISC is the 'pfifo' one, which does no processing at all and is a pure
++First In, First Out queue. It does however store traffic when the network interface
++can't handle it momentarily.
++
++.SH CLASSES
++Some qdiscs can contain classes, which contain further qdiscs - traffic may
++then be enqueued in any of the inner qdiscs, which are within the
++.B classes.
++When the kernel tries to dequeue a packet from such a
++.B classful qdisc
++it can come from any of the classes. A qdisc may for example prioritize
++certain kinds of traffic by trying to dequeue from certain classes
++before others.
++
++.SH FILTERS
++A
++.B filter
++is used by a classful qdisc to determine in which class a packet will
++be enqueued. Whenever traffic arrives at a class with subclasses, it needs
++to be classified. Various methods may be employed to do so, one of these
++are the filters. All filters attached to the class are called, until one of
++them returns with a verdict. If no verdict was made, other criteria may be
++available. This differs per qdisc.
++
++It is important to notice that filters reside
++.B within
++qdiscs - they are not masters of what happens.
++
++.SH CLASSLESS QDISCS
++The classless qdiscs are:
++.TP
++[p|b]fifo
++Simplest usable qdisc, pure First In, First Out behaviour. Limited in
++packets or in bytes.
++.TP
++pfifo_fast
++Standard qdisc for 'Advanced Router' enabled kernels. Consists of a three-band
++queue which honors Type of Service flags, as well as the priority that may be
++assigned to a packet.
++.TP
++red
++Random Early Detection simulates physical congestion by randomly dropping
++packets when nearing configured bandwidth allocation. Well suited to very
++large bandwidth applications.
++.TP
++sfq
++Stochastic Fairness Queueing reorders queued traffic so each 'session'
++gets to send a packet in turn.
++.TP
++tbf
++The Token Bucket Filter is suited for slowing traffic down to a precisely
++configured rate. Scales well to large bandwidths.
++.SH CONFIGURING CLASSLESS QDISCS
++In the absence of classful qdiscs, classless qdiscs can only be attached at
++the root of a device. Full syntax:
++.P
++.B tc qdisc add dev
++DEV
++.B root
++QDISC QDISC-PARAMETERS
++
++To remove, issue
++.P
++.B tc qdisc del dev
++DEV
++.B root
++
++The
++.B pfifo_fast
++qdisc is the automatic default in the absence of a configured qdisc.
++
++.SH CLASSFUL QDISCS
++The classful qdiscs are:
++.TP
++CBQ
++Class Based Queueing implements a rich linksharing hierarchy of classes.
++It contains shaping elements as well as prioritizing capabilities. Shaping is
++performed using link idle time calculations based on average packet size and
++underlying link bandwidth. The latter may be ill-defined for some interfaces.
++.TP
++HTB
++The Hierarchy Token Bucket implements a rich linksharing hierarchy of
++classes with an emphasis on conforming to existing practices. HTB facilitates
++guaranteeing bandwidth to classes, while also allowing specification of upper
++limits to inter-class sharing. It contains shaping elements, based on TBF and
++can prioritize classes.
++.TP
++PRIO
++The PRIO qdisc is a non-shaping container for a configurable number of
++classes which are dequeued in order. This allows for easy prioritization
++of traffic, where lower classes are only able to send if higher ones have
++no packets available. To facilitate configuration, Type Of Service bits are
++honored by default.
++.SH THEORY OF OPERATION
++Classes form a tree, where each class has a single parent.
++A class may have multiple children. Some qdiscs allow for runtime addition
++of classes (CBQ, HTB) while others (PRIO) are created with a static number of
++children.
++
++Qdiscs which allow dynamic addition of classes can have zero or more
++subclasses to which traffic may be enqueued.
++
++Furthermore, each class contains a
++.B leaf qdisc
++which by default has
++.B pfifo
++behaviour though another qdisc can be attached in place. This qdisc may again
++contain classes, but each class can have only one leaf qdisc.
++
++When a packet enters a classful qdisc it can be
++.B classified
++to one of the classes within. Three criteria are available, although not all
++qdiscs will use all three:
++.TP
++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).
++.TP
++Type of Service
++Some qdiscs have built in rules for classifying packets based on the TOS field.
++.TP
++skb->priority
++Userspace programs can encode a class-id in the 'skb->priority' field using
++the SO_PRIORITY option.
++.P
++Each node within the tree can have its own filters but higher level filters
++may also point directly to lower classes.
++
++If classification did not succeed, packets are enqueued to the leaf qdisc
++attached to that class. Check qdisc specific manpages for details, however.
++
++.SH NAMING
++All qdiscs, classes and filters have IDs, which can either be specified
++or be automatically assigned.
++
++IDs consist of a major number and a minor number, separated by a colon.
++
++.TP
++QDISCS
++A qdisc, which potentially can have children,
++gets assigned a major number, called a 'handle', leaving the minor
++number namespace available for classes. The handle is expressed as '10:'.
++It is customary to explicitly assign a handle to qdiscs expected to have
++children.
++
++.TP
++CLASSES
++Classes residing under a qdisc share their qdisc major number, but each have
++a separate minor number called a 'classid' that has no relation to their
++parent classes, only to their parent qdisc. The same naming custom as for
++qdiscs applies.
++
++.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).
++.SH UNITS
++All parameters accept a floating point number, possibly followed by a unit.
++.P
++Bandwidths or rates can be specified in:
++.TP
++kbps
++Kilobytes per second
++.TP
++mbps
++Megabytes per second
++.TP
++kbit
++Kilobits per second
++.TP
++mbit
++Megabits per second
++.TP
++bps or a bare number
++Bytes per second
++.P
++Amounts of data can be specified in:
++.TP
++kb or k
++Kilobytes
++.TP
++mb or m
++Megabytes
++.TP
++mbit
++Megabits
++.TP
++kbit
++Kilobits
++.TP
++b or a bare number
++Bytes.
++.P
++Lengths of time can be specified in:
++.TP
++s, sec or secs
++Whole seconds
++.TP
++ms, msec or msecs
++Milliseconds
++.TP
++us, usec, usecs or a bare number
++Microseconds.
++
++.SH TC COMMANDS
++The following commands are available for qdiscs, classes and filter:
++.TP
++add
++Add a qdisc, class or filter to a node. For all entities, a
++.B parent
++must be passed, either by passing its ID or by attaching directly to the root of a device.
++When creating a qdisc or a filter, it can be named with the
++.B handle
++parameter. A class is named with the
++.B classid
++parameter.
++
++.TP
++remove
++A qdisc can be removed by specifying its handle, which may also be 'root'. All subclasses and their leaf qdiscs
++are automatically deleted, as well as any filters attached to them.
++
++.TP
++change
++Some entities can be modified 'in place'. Shares the syntax of 'add', with the exception
++that the handle cannot be changed and neither can the parent. In other words,
++.B
++change
++cannot move a node.
++
++.TP
++replace
++Performs a nearly atomic remove/add on an existing node id. If the node does not exist yet
++it is created.
++
++.TP
++link
++Only available for qdiscs and performs a replace where the node
++must exist already.
++
++
++.SH HISTORY
++.B tc
++was written by Alexey N. Kuznetsov and added in Linux 2.2.
++.SH SEE ALSO
++.BR tc-cbq (8),
++.BR tc-htb (8),
++.BR tc-sfq (8),
++.BR tc-red (8),
++.BR tc-tbf (8),
++.BR tc-pfifo (8),
++.BR tc-bfifo (8),
++.BR tc-pfifo_fast (8),
++.BR tc-filters (8)
++
++.SH AUTHOR
++Manpage maintained by bert hubert (ahu@ds9a.nl)
++
+--- debian/manpages/tc-cbq.8
++++ debian/manpages/tc-cbq.8
+@@ -0,0 +1,353 @@
++.TH CBQ 8 "16 December 2001" "iproute2" "Linux"
++.SH NAME
++CBQ \- Class Based Queueing
++.SH SYNOPSIS
++.B tc qdisc ... dev
++dev
++.B ( parent
++classid
++.B | root) [ handle
++major:
++.B ] cbq [ allot
++bytes
++.B ] avpkt
++bytes
++.B bandwidth
++rate
++.B [ cell
++bytes
++.B ] [ ewma
++log
++.B ] [ mpu
++bytes
++.B ]
++
++.B tc class ... dev
++dev
++.B parent
++major:[minor]
++.B [ classid
++major:minor
++.B ] cbq allot
++bytes
++.B [ bandwidth
++rate
++.B ] [ rate
++rate
++.B ] prio
++priority
++.B [ weight
++weight
++.B ] [ minburst
++packets
++.B ] [ maxburst
++packets
++.B ] [ ewma
++log
++.B ] [ cell
++bytes
++.B ] avpkt
++bytes
++.B [ mpu
++bytes
++.B ] [ bounded isolated ] [ split
++handle
++.B & defmap
++defmap
++.B ] [ estimator
++interval timeconstant
++.B ]
++
++.SH DESCRIPTION
++Class Based Queueing is a classful qdisc that implements a rich
++linksharing hierarchy of classes. It contains shaping elements as
++well as prioritizing capabilities. Shaping is performed using link
++idle time calculations based on the timing of dequeue events and
++underlying link bandwidth.
++
++.SH SHAPING ALGORITHM
++When shaping a 10mbit/s connection to 1mbit/s, the link will
++be idle 90% of the time. If it isn't, it needs to be throttled so that it
++IS idle 90% of the time.
++
++During operations, the effective idletime is measured using an
++exponential weighted moving average (EWMA), which considers recent
++packets to be exponentially more important than past ones. The Unix
++loadaverage is calculated in the same way.
++
++The calculated idle time is subtracted from the EWMA measured one,
++the resulting number is called 'avgidle'. A perfectly loaded link has
++an avgidle of zero: packets arrive exactly at the calculated
++interval.
++
++An overloaded link has a negative avgidle and if it gets too negative,
++CBQ throttles and is then 'overlimit'.
++
++Conversely, an idle link might amass a huge avgidle, which would then
++allow infinite bandwidths after a few hours of silence. To prevent
++this, avgidle is capped at
++.B maxidle.
++
++If overlimit, in theory, the CBQ could throttle itself for exactly the
++amount of time that was calculated to pass between packets, and then
++pass one packet, and throttle again. Due to timer resolution constraints,
++this may not be feasible, see the
++.B minburst
++parameter below.
++
++.SH CLASSIFICATION
++Within the one CBQ instance many classes may exist. Each of these classes
++contains another qdisc, by default
++.BR tc-pfifo (8).
++
++When enqueueing a packet, CBQ starts at the root and uses various methods to
++determine which class should receive the data.
++
++In the absence of uncommon configuration options, the process is rather easy.
++At each node we look for an instruction, and then go to the class the
++instruction refers us to. If the class found is a barren leaf-node (without
++children), we enqueue the packet there. If it is not yet a leaf node, we do
++the whole thing over again starting from that node.
++
++The following actions are performed, in order at each node we visit, until one
++sends us to another node, or terminates the process.
++.TP
++(i)
++Consult filters attached to the class. If sent to a leafnode, we are done.
++Otherwise, restart.
++.TP
++(ii)
++Consult the defmap for the priority assigned to this packet, which depends
++on the TOS bits. Check if the referral is leafless, otherwise restart.
++.TP
++(iii)
++Ask the defmap for instructions for the 'best effort' priority. Check the
++answer for leafness, otherwise restart.
++.TP
++(iv)
++If none of the above returned with an instruction, enqueue at this node.
++.P
++This algorithm makes sure that a packet always ends up somewhere, even while
++you are busy building your configuration.
++
++For more details, see
++.BR tc-cbq-details(8).
++
++.SH LINK SHARING ALGORITHM
++When dequeuing for sending to the network device, CBQ decides which of its
++classes will be allowed to send. It does so with a Weighted Round Robin process
++in which each class with packets gets a chance to send in turn. The WRR process
++starts by asking the highest priority classes (lowest numerically -
++highest semantically) for packets, and will continue to do so until they
++have no more data to offer, in which case the process repeats for lower
++priorities.
++
++Classes by default borrow bandwidth from their siblings. A class can be
++prevented from doing so by declaring it 'bounded'. A class can also indicate
++its unwillingness to lend out bandwidth by being 'isolated'.
++
++.SH QDISC
++The root of a CBQ qdisc class tree has the following parameters:
++
++.TP
++parent major:minor | root
++This mandatory parameter determines the place of the CBQ instance, either at the
++.B root
++of an interface or within an existing class.
++.TP
++handle major:
++Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
++of a major number, followed by a colon. Optional, but very useful if classes
++will be generated within this qdisc.
++.TP
++allot bytes
++This allotment is the 'chunkiness' of link sharing and is used for determining packet
++transmission time tables. The qdisc allot differs slightly from the class allot discussed
++below. Optional. Defaults to a reasonable value, related to avpkt.
++.TP
++avpkt bytes
++The average size of a packet is needed for calculating maxidle, and is also used
++for making sure 'allot' has a safe value. Mandatory.
++.TP
++bandwidth rate
++To determine the idle time, CBQ must know the bandwidth of your underlying
++physical interface, or parent qdisc. This is a vital parameter, more about it
++later. Mandatory.
++.TP
++cell
++The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
++.TP
++mpu
++A zero sized packet may still take time to transmit. This value is the lower
++cap for packet transmission time calculations - packets smaller than this value
++are still deemed to have this size. Defaults to zero.
++.TP
++ewma log
++When CBQ needs to measure the average idle time, it does so using an
++Exponentially Weighted Moving Average which smoothes out measurements into
++a moving average. The EWMA LOG determines how much smoothing occurs. Lower
++values imply greater sensitivity. Must be between 0 and 31. Defaults
++to 5.
++.P
++A CBQ qdisc does not shape out of its own accord. It only needs to know certain
++parameters about the underlying link. Actual shaping is done in classes.
++
++.SH CLASSES
++Classes have a host of parameters to configure their operation.
++
++.TP
++parent major:minor
++Place of this class within the hierarchy. If attached directly to a qdisc
++and not to another class, minor can be omitted. Mandatory.
++.TP
++classid major:minor
++Like qdiscs, classes can be named. The major number must be equal to the
++major number of the qdisc to which it belongs. Optional, but needed if this
++class is going to have children.
++.TP
++weight weight
++When dequeuing to the interface, classes are tried for traffic in a
++round-robin fashion. Classes with a higher configured qdisc will generally
++have more traffic to offer during each round, so it makes sense to allow
++it to dequeue more traffic. All weights under a class are normalized, so
++only the ratios matter. Defaults to the configured rate, unless the priority
++of this class is maximal, in which case it is set to 1.
++.TP
++allot bytes
++Allot specifies how many bytes a qdisc can dequeue
++during each round of the process. This parameter is weighted using the
++renormalized class weight described above. Silently capped at a minimum of
++3/2 avpkt. Mandatory.
++
++.TP
++prio priority
++In the round-robin process, classes with the lowest priority field are tried
++for packets first. Mandatory.
++
++.TP
++avpkt
++See the QDISC section.
++
++.TP
++rate rate
++Maximum rate this class and all its children combined can send at. Mandatory.
++
++.TP
++bandwidth rate
++This is different from the bandwidth specified when creating a CBQ disc! Only
++used to determine maxidle and offtime, which are only calculated when
++specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
++
++.TP
++maxburst
++This number of packets is used to calculate maxidle so that when
++avgidle is at maxidle, this number of average packets can be burst
++before avgidle drops to 0. Set it higher to be more tolerant of
++bursts. You can't set maxidle directly, only via this parameter.
++
++.TP
++minburst
++As mentioned before, CBQ needs to throttle in case of
++overlimit. The ideal solution is to do so for exactly the calculated
++idle time, and pass 1 packet. However, Unix kernels generally have a
++hard time scheduling events shorter than 10ms, so it is better to
++throttle for a longer period, and then pass minburst packets in one
++go, and then sleep minburst times longer.
++
++The time to wait is called the offtime. Higher values of minburst lead
++to more accurate shaping in the long term, but to bigger bursts at
++millisecond timescales. Optional.
++
++.TP
++minidle
++If avgidle is below 0, we are overlimits and need to wait until
++avgidle will be big enough to send one packet. To prevent a sudden
++burst from shutting down the link for a prolonged period of time,
++avgidle is reset to minidle if it gets too low.
++
++Minidle is specified in negative microseconds, so 10 means that
++avgidle is capped at -10us. Optional.
++
++.TP
++bounded
++Signifies that this class will not borrow bandwidth from its siblings.
++.TP
++isolated
++Means that this class will not borrow bandwidth to its siblings
++
++.TP
++split major:minor & defmap bitmap[/bitmap]
++If consulting filters attached to a class did not give a verdict,
++CBQ can also classify based on the packet's priority. There are 16
++priorities available, numbered from 0 to 15.
++
++The defmap specifies which priorities this class wants to receive,
++specified as a bitmap. The Least Significant Bit corresponds to priority
++zero. The
++.B split
++parameter tells CBQ at which class the decision must be made, which should
++be a (grand)parent of the class you are adding.
++
++As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
++configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
++
++The complimentary configuration would then
++be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
++Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
++.TP
++estimator interval timeconstant
++CBQ can measure how much bandwidth each class is using, which tc filters
++can use to classify packets with. In order to determine the bandwidth
++it uses a very simple estimator that measures once every
++.B interval
++microseconds how much traffic has passed. This again is a EWMA, for which
++the time constant can be specified, also in microseconds. The
++.B time constant
++corresponds to the sluggishness of the measurement or, conversely, to the
++sensitivity of the average to short bursts. Higher values mean less
++sensitivity.
++
++.SH BUGS
++The actual bandwidth of the underlying link may not be known, for example
++in the case of PPoE or PPTP connections which in fact may send over a
++pipe, instead of over a physical device. CBQ is quite resilient to major
++errors in the configured bandwidth, probably a the cost of coarser shaping.
++
++Default kernels rely on coarse timing information for making decisions. These
++may make shaping precise in the long term, but inaccurate on second long scales.
++
++See
++.BR tc-cbq-details(8)
++for hints on how to improve this.
++
++.SH SOURCES
++.TP
++o
++Sally Floyd and Van Jacobson, "Link-sharing and Resource
++Management Models for Packet Networks",
++IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
++
++.TP
++o
++Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
++
++.TP
++o
++Sally Floyd, "Notes on Class-Based Queueing: Setting
++Parameters", 1996
++
++.TP
++o
++Sally Floyd and Michael Speer, "Experimental Results
++for Class-Based Queueing", 1998, not published.
++
++
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHOR
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
++bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-htb.8
++++ debian/manpages/tc-htb.8
+@@ -0,0 +1,150 @@
++.TH HTB 8 "10 January 2002" "iproute2" "Linux"
++.SH NAME
++HTB \- Hierarchy Token Bucket
++.SH SYNOPSIS
++.B tc qdisc ... dev
++dev
++.B ( parent
++classid
++.B | root) [ handle
++major:
++.B ] htb [ default
++minor-id
++.B ]
++
++.B tc class ... dev
++dev
++.B parent
++major:[minor]
++.B [ classid
++major:minor
++.B ] htb rate
++rate
++.B [ ceil
++rate
++.B ] burst
++bytes
++.B [ cburst
++bytes
++.B ] [ prio
++priority
++.B ]
++
++.SH DESCRIPTION
++HTB is meant as a more understandable and intuitive 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.
++
++Unlike CBQ, HTB shapes traffic based on the Token Bucket Filter algorithm
++which does not depend on interface characteristics and so does not need to
++know the underlying bandwidth of the outgoing interface.
++
++.SH SHAPING ALGORITHM
++Shaping works as documented in
++.B tc-tbf (8).
++
++.SH CLASSIFICATION
++Within the one HRB instance many classes may exist. Each of these classes
++contains another qdisc, by default
++.BR tc-pfifo (8).
++
++When enqueueing a packet, HTB starts at the root and uses various methods to
++determine which class should receive the data.
++
++In the absence of uncommon configuration options, the process is rather easy.
++At each node we look for an instruction, and then go to the class the
++instruction refers us to. If the class found is a barren leaf-node (without
++children), we enqueue the packet there. If it is not yet a leaf node, we do
++the whole thing over again starting from that node.
++
++The following actions are performed, in order at each node we visit, until one
++sends us to another node, or terminates the process.
++.TP
++(i)
++Consult filters attached to the class. If sent to a leafnode, we are done.
++Otherwise, restart.
++.TP
++(ii)
++If none of the above returned with an instruction, enqueue at this node.
++.P
++This algorithm makes sure that a packet always ends up somewhere, even while
++you are busy building your configuration.
++
++.SH LINK SHARING ALGORITHM
++FIXME
++
++.SH QDISC
++The root of a HTB qdisc class tree has the following parameters:
++
++.TP
++parent major:minor | root
++This mandatory parameter determines the place of the HTB instance, either at the
++.B root
++of an interface or within an existing class.
++.TP
++handle major:
++Like all other qdiscs, the HTB can be assigned a handle. Should consist only
++of a major number, followed by a colon. Optional, but very useful if classes
++will be generated within this qdisc.
++.TP
++default minor-id
++Unclassified traffic gets sent to the class with this minor-id.
++
++.SH CLASSES
++Classes have a host of parameters to configure their operation.
++
++.TP
++parent major:minor
++Place of this class within the hierarchy. If attached directly to a qdisc
++and not to another class, minor can be omitted. Mandatory.
++.TP
++classid major:minor
++Like qdiscs, classes can be named. The major number must be equal to the
++major number of the qdisc to which it belongs. Optional, but needed if this
++class is going to have children.
++.TP
++prio priority
++In the round-robin process, classes with the lowest priority field are tried
++for packets first. Mandatory.
++
++.TP
++rate rate
++Maximum rate this class and all its children are guaranteed. Mandatory.
++
++.TP
++ceil rate
++Maximum rate at which a class can send, if its parent has bandwidth to spare.
++Defaults to the configured rate, which implies no borrowing
++
++.TP
++burst bytes
++Amount of bytes that can be burst at
++.B ceil
++speed, in excess of the configured
++.B rate.
++Should be at least as high as the highest burst of all children.
++
++.TP
++cburst bytes
++Amount of bytes that can be burst at 'infinite' speed, in other words, as fast
++as the interface can transmit them. For perfect evening out, should be equal to at most one average
++packet. Should be at least as high as the highest cburst of all children.
++
++.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
++burst as 100*12kb*8 equals 10mbit.
++
++.SH SEE ALSO
++.BR tc (8)
++.P
++HTB website: http://luxik.cdi.cz/~devik/qos/htb/
++.SH AUTHOR
++Martin Devera <devik@cdi.cz>. This manpage maintained by bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-red.8
++++ debian/manpages/tc-red.8
+@@ -0,0 +1,131 @@
++.TH RED 8 "13 December 2001" "iproute2" "Linux"
++.SH NAME
++red \- Random Early Detection
++.SH SYNOPSIS
++.B tc qdisc ... red
++.B limit
++bytes
++.B min
++bytes
++.B max
++bytes
++.B avpkt
++bytes
++.B burst
++packets
++.B [ ecn ] [ bandwidth
++rate
++.B ] probability
++chance
++
++.SH DESCRIPTION
++Random Early Detection is a classless qdisc which manages its queue size
++smartly. Regular queues simply drop packets from the tail when they are
++full, which may not be the optimal behaviour. RED also performs tail drop,
++but does so in a more gradual way.
++
++Once the queue hits a certain average length, packets enqueued have a
++configurable chance of being marked (which may mean dropped). This chance
++increases linearly up to a point called the
++.B max
++average queue length, although the queue might get bigger.
++
++This has a host of benefits over simple taildrop, while not being processor
++intensive. It prevents synchronous retransmits after a burst in traffic,
++which cause further retransmits, etc.
++
++The goal is the have a small queue size, which is good for interactivity
++while not disturbing TCP/IP traffic with too many sudden drops after a burst
++of traffic.
++
++Depending on if ECN is configured, marking either means dropping or
++purely marking a packet as overlimit.
++.SH ALGORITHM
++The average queue size is used for determining the marking
++probability. This is calculated using an Exponential Weighted Moving
++Average, which can be more or less sensitive to bursts.
++
++When the average queue size is below
++.B min
++bytes, no packet will ever be marked. When it exceeds
++.B min,
++the probability of doing so climbs linearly up
++to
++.B probability,
++until the average queue size hits
++.B max
++bytes. Because
++.B probability
++is normally not set to 100%, the queue size might
++conceivably rise above
++.B max
++bytes, so the
++.B limit
++parameter is provided to set a hard maximum for the size of the queue.
++
++.SH PARAMETERS
++.TP
++min
++Average queue size at which marking becomes a possibility.
++.TP
++max
++At this average queue size, the marking probability is maximal. Should be at
++least twice
++.B min
++to prevent synchronous retransmits, higher for low
++.B min.
++.TP
++probability
++Maximum probability for marking, specified as a floating point
++number from 0.0 to 1.0. Suggested values are 0.01 or 0.02 (1 or 2%,
++respectively).
++.TP
++limit
++Hard limit on the real (not average) queue size in bytes. Further packets
++are dropped. Should be set higher than max+burst. It is advised to set this
++a few times higher than
++.B max.
++.TP
++burst
++Used for determining how fast the average queue size is influenced by the
++real queue size. Larger values make the calculation more sluggish, allowing
++longer bursts of traffic before marking starts. Real life experiments
++support the following guideline: (min+min+max)/(3*avpkt).
++.TP
++avpkt
++Specified in bytes. Used with burst to determine the time constant for
++average queue size calculations. 1000 is a good value.
++.TP
++bandwidth
++This rate is used for calculating the average queue size after some
++idle time. Should be set to the bandwidth of your interface. Does not mean
++that RED will shape for you! Optional.
++.TP
++ecn
++As mentioned before, RED can either 'mark' or 'drop'. Explicit Congestion
++Notification allows RED to notify remote hosts that their rate exceeds the
++amount of bandwidth available. Non-ECN capable hosts can only be notified by
++dropping a packet. If this parameter is specified, packets which indicate
++that their hosts honor ECN will only be marked and not dropped, unless the
++queue size hits
++.B limit
++bytes. Needs a tc binary with RED support compiled in. Recommended.
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH SOURCES
++.TP
++o
++Floyd, S., and Jacobson, V., Random Early Detection gateways for
++Congestion Avoidance. http://www.aciri.org/floyd/papers/red/red.html
++.TP
++o
++Some changes to the algorithm by Alexey N. Kuznetsov.
++
++.SH AUTHORS
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, Alexey Makarenko
++<makar@phoenix.kharkov.ua>, J Hadi Salim <hadi@nortelnetworks.com>.
++This manpage maintained by bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-sfq.8
++++ debian/manpages/tc-sfq.8
+@@ -0,0 +1,107 @@
++.TH TC 8 "8 December 2001" "iproute2" "Linux"
++.SH NAME
++sfq \- Stochastic Fairness Queueing
++.SH SYNOPSIS
++.B tc qdisc ... perturb
++seconds
++.B quantum
++bytes
++
++.SH DESCRIPTION
++
++Stochastic Fairness Queueing is a classless queueing discipline available for
++traffic control with the
++.BR tc (8)
++command.
++
++SFQ does not shape traffic but only schedules the transmission of packets, based on 'flows'.
++The goal is to ensure fairness so that each flow is able to send data in turn, thus preventing
++any single flow from drowning out the rest.
++
++This may in fact have some effect in mitigating a Denial of Service attempt.
++
++SFQ is work-conserving and therefore always delivers a packet if it has one available.
++.SH ALGORITHM
++On enqueueing, each packet is assigned to a hash bucket, based on
++.TP
++(i)
++Source address
++.TP
++(ii)
++Destination address
++.TP
++(iii)
++Source port
++.P
++If these are available. SFQ knows about ipv4 and ipv6 and also UDP, TCP and ESP.
++Packets with other protocols are hashed based on the 32bits representation of their
++destination and the socket they belong to. A flow corresponds mostly to a TCP/IP
++connection.
++
++Each of these buckets should represent a unique flow. Because multiple flows may
++get hashed to the same bucket, the hashing algorithm is perturbed at configurable
++intervals so that the unfairness lasts only for a short while. Perturbation may
++however cause some inadvertent packet reordering to occur.
++
++When dequeuing, each hashbucket with data is queried in a round robin fashion.
++
++The compile time maximum length of the SFQ is 128 packets, which can be spread over
++at most 128 buckets of 1024 available. In case of overflow, tail-drop is performed
++on the fullest bucket, thus maintaining fairness.
++
++.SH PARAMETERS
++.TP
++perturb
++Interval in seconds for queue algorithm perturbation. Defaults to 0, which means that
++no perturbation occurs. Do not set too low for each perturbation may cause some packet
++reordering. Advised value: 10
++.TP
++quantum
++Amount of bytes a flow is allowed to dequeue during a round of the round robin process.
++Defaults to the MTU of the interface which is also the advised value and the minimum value.
++
++.SH EXAMPLE & USAGE
++
++To attach to device ppp0:
++.P
++# tc qdisc add dev ppp0 root sfq perturb 10
++.P
++Please note that SFQ, like all non-shaping (work-conserving) qdiscs, is only useful
++if it owns the queue.
++This is the case when the link speed equals the actually available bandwidth. This holds
++for regular phone modems, ISDN connections and direct non-switched ethernet links.
++.P
++Most often, cable modems and DSL devices do not fall into this category. The same holds
++for when connected to a switch and trying to send data to a congested segment also
++connected to the switch.
++.P
++In this case, the effective queue does not reside within Linux and is therefore not
++available for scheduling.
++.P
++Embed SFQ in a classful qdisc to make sure it owns the queue.
++
++.SH SOURCE
++.TP
++o
++Paul E. McKenney "Stochastic Fairness Queuing",
++IEEE INFOCOMM'90 Proceedings, San Francisco, 1990.
++
++.TP
++o
++Paul E. McKenney "Stochastic Fairness Queuing",
++"Interworking: Research and Experience", v.2, 1991, p.113-131.
++
++.TP
++o
++See also:
++M. Shreedhar and George Varghese "Efficient Fair
++Queuing using Deficit Round Robin", Proc. SIGCOMM 95.
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHOR
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
++bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-tbf.8
++++ debian/manpages/tc-tbf.8
+@@ -0,0 +1,138 @@
++.TH TC 8 "13 December 2001" "iproute2" "Linux"
++.SH NAME
++tbf \- Token Bucket Filter
++.SH SYNOPSIS
++.B tc qdisc ... tbf rate
++rate
++.B burst
++bytes/cell
++.B ( latency
++ms
++.B | limit
++bytes
++.B ) [ mpu
++bytes
++.B [ peakrate
++rate
++.B mtu
++bytes/cell
++.B ] ]
++.P
++burst is also known as buffer and maxburst. mtu is also known as minburst.
++.SH DESCRIPTION
++
++The Token Bucket Filter is a classless queueing discipline available for
++traffic control with the
++.BR tc (8)
++command.
++
++TBF is a pure shaper and never schedules traffic. It is non-work-conserving and may throttle
++itself, although packets are available, to ensure that the configured rate is not exceeded.
++On all platforms except for Alpha,
++it is able to shape up to 1mbit/s of normal traffic with ideal minimal burstiness,
++sending out data exactly at the configured rates.
++
++Much higher rates are possible but at the cost of losing the minimal burstiness. In that
++case, data is on average dequeued at the configured rate but may be sent much faster at millisecond
++timescales. Because of further queues living in network adaptors, this is often not a problem.
++
++Kernels with a higher 'HZ' can achieve higher rates with perfect burstiness. On Alpha, HZ is ten
++times higher, leading to a 10mbit/s limit to perfection. These calculations hold for packets of on
++average 1000 bytes.
++
++.SH ALGORITHM
++As the name implies, traffic is filtered based on the expenditure of
++.B tokens.
++Tokens roughly correspond to bytes, with the additional constraint that each packet consumes
++some tokens, no matter how small it is. This reflects the fact that even a zero-sized packet occupies
++the link for some time.
++
++On creation, the TBF is stocked with tokens which correspond to the amount of traffic that can be burst
++in one go. Tokens arrive at a steady rate, until the bucket is full.
++
++If no tokens are available, packets are queued, up to a configured limit. The TBF now
++calculates the token deficit, and throttles until the first packet in the queue can be sent.
++
++If it is not acceptable to burst out packets at maximum speed, a peakrate can be configured
++to limit the speed at which the bucket empties. This peakrate is implemented as a second TBF
++with a very small bucket, so that it doesn't burst.
++
++To achieve perfection, the second bucket may contain only a single packet, which leads to
++the earlier mentioned 1mbit/s limit.
++
++This limit is caused by the fact that the kernel can only throttle for at minimum 1 'jiffy', which depends
++on HZ as 1/HZ. For perfect shaping, only a single packet can get sent per jiffy - for HZ=100, this means 100
++packets of on average 1000 bytes each, which roughly corresponds to 1mbit/s.
++
++.SH PARAMETERS
++See
++.BR tc (8)
++for how to specify the units of these values.
++.TP
++limit or latency
++Limit is the number of bytes that can be queued waiting for tokens to become
++available. You can also specify this the other way around by setting the
++latency parameter, which specifies the maximum amount of time a packet can
++sit in the TBF. The latter calculation takes into account the size of the
++bucket, the rate and possibly the peakrate (if set). These two parameters
++are mutually exclusive.
++.TP
++burst
++Also known as buffer or maxburst.
++Size of the bucket, in bytes. This is the maximum amount of bytes that tokens can be available for instantaneously.
++In general, larger shaping rates require a larger buffer. For 10mbit/s on Intel, you need at least 10kbyte buffer
++if you want to reach your configured rate!
++
++If your buffer is too small, packets may be dropped because more tokens arrive per timer tick than fit in your bucket.
++The minimum buffer size can be calculated by dividing the rate by HZ.
++
++Token usage calculations are performed using a table which by default has a resolution of 8 packets.
++This resolution can be changed by specifying the
++.B cell
++size with the burst. For example, to specify a 6000 byte buffer with a 16
++byte cell size, set a burst of 6000/16. You will probably never have to set
++this. Must be an integral power of 2.
++.TP
++mpu
++A zero-sized packet does not use zero bandwidth. For ethernet, no packet uses less than 64 bytes. The Minimum Packet Unit
++determines the minimal token usage (specified in bytes) for a packet. Defaults to zero.
++.TP
++rate
++The speed knob. See remarks above about limits! See
++.BR tc (8)
++for units.
++.PP
++Furthermore, if a peakrate is desired, the following parameters are available:
++
++.TP
++peakrate
++Maximum depletion rate of the bucket. Limited to 1mbit/s on Intel, 10mbit/s on Alpha. The peakrate does
++not need to be set, it is only necessary if perfect millisecond timescale shaping is required.
++
++.TP
++mtu/minburst
++Specifies the size of the peakrate bucket. For perfect accuracy, should be set to the MTU of the interface.
++If a peakrate is needed, but some burstiness is acceptable, this size can be raised. A 3000 byte minburst
++allows around 3mbit/s of peakrate, given 1000 byte packets.
++
++Like the regular burstsize you can also specify a
++.B cell
++size.
++.SH EXAMPLE & USAGE
++
++To attach a TBF with a sustained maximum rate of 0.5mbit/s, a peakrate of 1.0mbit/s,
++a 5kilobyte buffer, with a pre-bucket queue size limit calculated so the TBF causes
++at most 70ms of latency, with perfect peakrate behaviour, issue:
++.P
++# tc qdisc add dev eth0 root tbf rate 0.5mbit \\
++ burst 5kb latency 70ms peakrate 1mbit \\
++ minburst 1540
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHOR
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
++bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-prio.8
++++ debian/manpages/tc-prio.8
+@@ -0,0 +1,187 @@
++.TH PRIO 8 "16 December 2001" "iproute2" "Linux"
++.SH NAME
++PRIO \- Priority qdisc
++.SH SYNOPSIS
++.B tc qdisc ... dev
++dev
++.B ( parent
++classid
++.B | root) [ handle
++major:
++.B ] prio [ bands
++bands
++.B ] [ priomap
++band,band,band...
++.B ] [ estimator
++interval timeconstant
++.B ]
++
++.SH DESCRIPTION
++The PRIO qdisc is a simple classful queueing discipline that contains
++an arbitrary number of classes of differing priority. The classes are
++dequeued in numerical descending order of priority. PRIO is a scheduler
++and never delays packets - it is a work-conserving qdisc, though the qdiscs
++contained in the classes may not be.
++
++Very useful for lowering latency when there is no need for slowing down
++traffic.
++
++.SH ALGORITHM
++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.
++
++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
++should therefore go to band 0, minimum delay to band 1 and the rest to band
++2.
++
++As the PRIO qdisc itself will have minor number 0, band 0 is actually
++major:1, band 1 is major:2, etc. For major, substitute the major number
++assigned to the qdisc on 'tc qdisc add' with the
++.B handle
++parameter.
++
++.SH CLASSIFICATION
++Three methods are available to PRIO to determine in which band a packet will
++be enqueued.
++.TP
++From userspace
++A process with sufficient privileges can encode the destination class
++directly with SO_PRIORITY, see
++.BR tc(7).
++.TP
++with a tc filter
++A tc filter attached to the root qdisc can point traffic directly to a class
++.TP
++with the priomap
++Based on the packet priority, which in turn is derived from the Type of
++Service assigned to the packet.
++.P
++Only the priomap is specific to this qdisc.
++.SH QDISC PARAMETERS
++.TP
++bands
++Number of bands. If changed from the default of 3,
++.B priomap
++must be updated as well.
++.TP
++priomap
++The priomap maps the priority of
++a packet to a class. The priority can either be set directly from userspace,
++or be derived from the Type of Service of the packet.
++
++Determines how packet priorities, as assigned by the kernel, map to
++bands. Mapping occurs based on the TOS octet of the packet, which looks like
++this:
++
++.nf
++0 1 2 3 4 5 6 7
+++---+---+---+---+---+---+---+---+
++| | | |
++|PRECEDENCE | TOS |MBZ|
++| | | |
+++---+---+---+---+---+---+---+---+
++.fi
++
++The four TOS bits (the 'TOS field') are defined as:
++
++.nf
++Binary Decimcal Meaning
++-----------------------------------------
++1000 8 Minimize delay (md)
++0100 4 Maximize throughput (mt)
++0010 2 Maximize reliability (mr)
++0001 1 Minimize monetary cost (mmc)
++0000 0 Normal Service
++.fi
++
++As there is 1 bit to the right of these four bits, the actual value of the
++TOS field is double the value of the TOS bits. Tcpdump -v -v shows you the
++value of the entire TOS field, not just the four bits. It is the value you
++see in the first column of this table:
++
++.nf
++TOS Bits Means Linux Priority Band
++------------------------------------------------------------
++0x0 0 Normal Service 0 Best Effort 1
++0x2 1 Minimize Monetary Cost 1 Filler 2
++0x4 2 Maximize Reliability 0 Best Effort 1
++0x6 3 mmc+mr 0 Best Effort 1
++0x8 4 Maximize Throughput 2 Bulk 2
++0xa 5 mmc+mt 2 Bulk 2
++0xc 6 mr+mt 2 Bulk 2
++0xe 7 mmc+mr+mt 2 Bulk 2
++0x10 8 Minimize Delay 6 Interactive 0
++0x12 9 mmc+md 6 Interactive 0
++0x14 10 mr+md 6 Interactive 0
++0x16 11 mmc+mr+md 6 Interactive 0
++0x18 12 mt+md 4 Int. Bulk 1
++0x1a 13 mmc+mt+md 4 Int. Bulk 1
++0x1c 14 mr+mt+md 4 Int. Bulk 1
++0x1e 15 mmc+mr+mt+md 4 Int. Bulk 1
++.fi
++
++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
++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 default priomap looks like this:
++
++ 1, 2, 2, 2, 1, 2, 0, 0 , 1, 1, 1, 1, 1, 1, 1, 1
++
++This means that priority 4, for example, gets mapped to band number 1.
++The priomap also allows you to list higher priorities (> 7) which do not
++correspond to TOS mappings, but which are set by other means.
++
++This table from RFC 1349 (read it for more details) explains how
++applications might very well set their TOS bits:
++
++.nf
++TELNET 1000 (minimize delay)
++FTP
++ Control 1000 (minimize delay)
++ Data 0100 (maximize throughput)
++
++TFTP 1000 (minimize delay)
++
++SMTP
++ Command phase 1000 (minimize delay)
++ DATA phase 0100 (maximize throughput)
++
++Domain Name Service
++ UDP Query 1000 (minimize delay)
++ TCP Query 0000
++ Zone Transfer 0100 (maximize throughput)
++
++NNTP 0001 (minimize monetary cost)
++
++ICMP
++ Errors 0000
++ Requests 0000 (mostly)
++ Responses <same as request> (mostly)
++.fi
++
++
++.SH CLASSES
++PRIO classes cannot be configured further - they are automatically created
++when the PRIO qdisc is attached. Each class however can contain yet a
++further qdisc.
++
++.SH BUGS
++Large amounts of traffic in the lower bands can cause starvation of higher
++bands. Can be prevented by attaching a shaper (for example,
++.BR tc-tbf(8)
++to these bands to make sure they cannot dominate the link.
++
++.SH AUTHORS
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>, J Hadi Salim
++<hadi@cyberus.ca>. This manpage maintained by bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-pfifo_fast.8
++++ debian/manpages/tc-pfifo_fast.8
+@@ -0,0 +1,59 @@
++.TH PFIFO_FAST 8 "10 January 2002" "iproute2" "Linux"
++.SH NAME
++pfifo_fast \- three-band first in, first out queue
++
++.SH DESCRIPTION
++pfifo_fast is the default qdisc of each interface.
++
++Whenever an interface is created, the pfifo_fast qdisc is automatically used
++as a queue. If another qdisc is attached, it preempts the default
++pfifo_fast, which automatically returns to function when an existing qdisc
++is detached.
++
++In this sense this qdisc is magic, and unlike other qdiscs.
++
++.SH ALGORITHM
++The algorithm is very similar to that of the classful
++.BR tc-prio (8)
++qdisc.
++.B pfifo_fast
++is like three
++.BR tc-pfifo (8)
++queues side by side, where packets can be enqueued in any of the three bands
++based on their Type of Service bits or assigned priority.
++
++Not all three bands are dequeued simultaneously - as long as lower bands
++have traffic, higher bands are never dequeued. This can be used to
++prioritize interactive traffic or penalize 'lowest cost' traffic.
++
++Each band can be txqueuelen packets long, as configured with
++.BR ifconfig (8)
++or
++.BR ip (8).
++Additional packets coming in are not enqueued but are instead dropped.
++
++See
++.BR tc-prio (8)
++for complete details on how TOS bits are translated into bands.
++.SH PARAMETERS
++.TP
++txqueuelen
++The length of the three bands depends on the interface txqueuelen, as
++specified with
++.BR ifconfig (8)
++or
++.BR ip (8).
++
++.SH BUGS
++Does not maintain statistics and does not show up in tc qdisc ls. This is because
++it is the automatic default in the absence of a configured qdisc.
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHORS
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
++
++This manpage maintained by bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-cbq-details.8
++++ debian/manpages/tc-cbq-details.8
+@@ -0,0 +1,425 @@
++.TH CBQ 8 "8 December 2001" "iproute2" "Linux"
++.SH NAME
++CBQ \- Class Based Queueing
++.SH SYNOPSIS
++.B tc qdisc ... dev
++dev
++.B ( parent
++classid
++.B | root) [ handle
++major:
++.B ] cbq avpkt
++bytes
++.B bandwidth
++rate
++.B [ cell
++bytes
++.B ] [ ewma
++log
++.B ] [ mpu
++bytes
++.B ]
++
++.B tc class ... dev
++dev
++.B parent
++major:[minor]
++.B [ classid
++major:minor
++.B ] cbq allot
++bytes
++.B [ bandwidth
++rate
++.B ] [ rate
++rate
++.B ] prio
++priority
++.B [ weight
++weight
++.B ] [ minburst
++packets
++.B ] [ maxburst
++packets
++.B ] [ ewma
++log
++.B ] [ cell
++bytes
++.B ] avpkt
++bytes
++.B [ mpu
++bytes
++.B ] [ bounded isolated ] [ split
++handle
++.B & defmap
++defmap
++.B ] [ estimator
++interval timeconstant
++.B ]
++
++.SH DESCRIPTION
++Class Based Queueing is a classful qdisc that implements a rich
++linksharing hierarchy of classes. It contains shaping elements as
++well as prioritizing capabilities. Shaping is performed using link
++idle time calculations based on the timing of dequeue events and
++underlying link bandwidth.
++
++.SH SHAPING ALGORITHM
++Shaping is done using link idle time calculations, and actions taken if
++these calculations deviate from set limits.
++
++When shaping a 10mbit/s connection to 1mbit/s, the link will
++be idle 90% of the time. If it isn't, it needs to be throttled so that it
++IS idle 90% of the time.
++
++From the kernel's perspective, this is hard to measure, so CBQ instead
++derives the idle time from the number of microseconds (in fact, jiffies)
++that elapse between requests from the device driver for more data. Combined
++with the knowledge of packet sizes, this is used to approximate how full or
++empty the link is.
++
++This is rather circumspect and doesn't always arrive at proper
++results. For example, what is the actual link speed of an interface
++that is not really able to transmit the full 100mbit/s of data,
++perhaps because of a badly implemented driver? A PCMCIA network card
++will also never achieve 100mbit/s because of the way the bus is
++designed - again, how do we calculate the idle time?
++
++The physical link bandwidth may be ill defined in case of not-quite-real
++network devices like PPP over Ethernet or PPTP over TCP/IP. The effective
++bandwidth in that case is probably determined by the efficiency of pipes
++to userspace - which not defined.
++
++During operations, the effective idletime is measured using an
++exponential weighted moving average (EWMA), which considers recent
++packets to be exponentially more important than past ones. The Unix
++loadaverage is calculated in the same way.
++
++The calculated idle time is subtracted from the EWMA measured one,
++the resulting number is called 'avgidle'. A perfectly loaded link has
++an avgidle of zero: packets arrive exactly at the calculated
++interval.
++
++An overloaded link has a negative avgidle and if it gets too negative,
++CBQ throttles and is then 'overlimit'.
++
++Conversely, an idle link might amass a huge avgidle, which would then
++allow infinite bandwidths after a few hours of silence. To prevent
++this, avgidle is capped at
++.B maxidle.
++
++If overlimit, in theory, the CBQ could throttle itself for exactly the
++amount of time that was calculated to pass between packets, and then
++pass one packet, and throttle again. Due to timer resolution constraints,
++this may not be feasible, see the
++.B minburst
++parameter below.
++
++.SH CLASSIFICATION
++Within the one CBQ instance many classes may exist. Each of these classes
++contains another qdisc, by default
++.BR tc-pfifo (8).
++
++When enqueueing a packet, CBQ starts at the root and uses various methods to
++determine which class should receive the data. If a verdict is reached, this
++process is repeated for the recipient class which might have further
++means of classifying traffic to its children, if any.
++
++CBQ has the following methods available to classify a packet to any child
++classes.
++.TP
++(i)
++.B skb->priority class encoding.
++Can be set from userspace by an application with the
++.B SO_PRIORITY
++setsockopt.
++The
++.B skb->priority class encoding
++only applies if the skb->priority holds a major:minor handle of an existing
++class within this qdisc.
++.TP
++(ii)
++tc filters attached to the class.
++.TP
++(iii)
++The defmap of a class, as set with the
++.B split & defmap
++parameters. The defmap may contain instructions for each possible Linux packet
++priority.
++
++.P
++Each class also has a
++.B level.
++Leaf nodes, attached to the bottom of the class hierarchy, have a level of 0.
++.SH CLASSIFICATION ALGORITHM
++
++Classification is a loop, which terminates when a leaf class is found. At any
++point the loop may jump to the fallback algorithm.
++
++The loop consists of the following steps:
++.TP
++(i)
++If the packet is generated locally and has a valid classid encoded within its
++.B skb->priority,
++choose it and terminate.
++
++.TP
++(ii)
++Consult the tc filters, if any, attached to this child. If these return
++a class which is not a leaf class, restart loop from the class returned.
++If it is a leaf, choose it and terminate.
++.TP
++(iii)
++If the tc filters did not return a class, but did return a classid,
++try to find a class with that id within this qdisc.
++Check if the found class is of a lower
++.B level
++than the current class. If so, and the returned class is not a leaf node,
++restart the loop at the found class. If it is a leaf node, terminate.
++If we found an upward reference to a higher level, enter the fallback
++algorithm.
++.TP
++(iv)
++If the tc filters did not return a class, nor a valid reference to one,
++consider the minor number of the reference to be the priority. Retrieve
++a class from the defmap of this class for the priority. If this did not
++contain a class, consult the defmap of this class for the
++.B BEST_EFFORT
++class. If this is an upward reference, or no
++.B BEST_EFFORT
++class was defined,
++enter the fallback algorithm. If a valid class was found, and it is not a
++leaf node, restart the loop at this class. If it is a leaf, choose it and
++terminate. If
++neither the priority distilled from the classid, nor the
++.B BEST_EFFORT
++priority yielded a class, enter the fallback algorithm.
++.P
++The fallback algorithm resides outside of the loop and is as follows.
++.TP
++(i)
++Consult the defmap of the class at which the jump to fallback occured. If
++the defmap contains a class for the
++.B
++priority
++of the class (which is related to the TOS field), choose this class and
++terminate.
++.TP
++(ii)
++Consult the map for a class for the
++.B BEST_EFFORT
++priority. If found, choose it, and terminate.
++.TP
++(iii)
++Choose the class at which break out to the fallback algorithm occured. 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
++leaf node, but in the middle of the hierarchy.
++
++.SH LINK SHARING ALGORITHM
++When dequeuing for sending to the network device, CBQ decides which of its
++classes will be allowed to send. It does so with a Weighted Round Robin process
++in which each class with packets gets a chance to send in turn. The WRR process
++starts by asking the highest priority classes (lowest numerically -
++highest semantically) for packets, and will continue to do so until they
++have no more data to offer, in which case the process repeats for lower
++priorities.
++
++.B CERTAINTY ENDS HERE, ANK PLEASE HELP
++
++Each class is not allowed to send at length though - they can only dequeue a
++configurable amount of data during each round.
++
++If a class is about to go overlimit, and it is not
++.B bounded
++it will try to borrow avgidle from siblings that are not
++.B isolated.
++This process is repeated from the bottom upwards. If a class is unable
++to borrow enough avgidle to send a packet, it is throttled and not asked
++for a packet for enough time for the avgidle to increase above zero.
++
++.B I REALLY NEED HELP FIGURING THIS OUT. REST OF DOCUMENT IS PRETTY CERTAIN
++.B AGAIN.
++
++.SH QDISC
++The root qdisc of a CBQ class tree has the following parameters:
++
++.TP
++parent major:minor | root
++This mandatory parameter determines the place of the CBQ instance, either at the
++.B root
++of an interface or within an existing class.
++.TP
++handle major:
++Like all other qdiscs, the CBQ can be assigned a handle. Should consist only
++of a major number, followed by a colon. Optional.
++.TP
++avpkt bytes
++For calculations, the average packet size must be known. It is silently capped
++at a minimum of 2/3 of the interface MTU. Mandatory.
++.TP
++bandwidth rate
++To determine the idle time, CBQ must know the bandwidth of your underlying
++physical interface, or parent qdisc. This is a vital parameter, more about it
++later. Mandatory.
++.TP
++cell
++The cell size determines he granularity of packet transmission time calculations. Has a sensible default.
++.TP
++mpu
++A zero sized packet may still take time to transmit. This value is the lower
++cap for packet transmission time calculations - packets smaller than this value
++are still deemed to have this size. Defaults to zero.
++.TP
++ewma log
++When CBQ needs to measure the average idle time, it does so using an
++Exponentially Weighted Moving Average which smoothes out measurements into
++a moving average. The EWMA LOG determines how much smoothing occurs. Defaults
++to 5. Lower values imply greater sensitivity. Must be between 0 and 31.
++.P
++A CBQ qdisc does not shape out of its own accord. It only needs to know certain
++parameters about the underlying link. Actual shaping is done in classes.
++
++.SH CLASSES
++Classes have a host of parameters to configure their operation.
++
++.TP
++parent major:minor
++Place of this class within the hierarchy. If attached directly to a qdisc
++and not to another class, minor can be omitted. Mandatory.
++.TP
++classid major:minor
++Like qdiscs, classes can be named. The major number must be equal to the
++major number of the qdisc to which it belongs. Optional, but needed if this
++class is going to have children.
++.TP
++weight weight
++When dequeuing to the interface, classes are tried for traffic in a
++round-robin fashion. Classes with a higher configured qdisc will generally
++have more traffic to offer during each round, so it makes sense to allow
++it to dequeue more traffic. All weights under a class are normalized, so
++only the ratios matter. Defaults to the configured rate, unless the priority
++of this class is maximal, in which case it is set to 1.
++.TP
++allot bytes
++Allot specifies how many bytes a qdisc can dequeue
++during each round of the process. This parameter is weighted using the
++renormalized class weight described above.
++
++.TP
++priority priority
++In the round-robin process, classes with the lowest priority field are tried
++for packets first. Mandatory.
++
++.TP
++rate rate
++Maximum rate this class and all its children combined can send at. Mandatory.
++
++.TP
++bandwidth rate
++This is different from the bandwidth specified when creating a CBQ disc. Only
++used to determine maxidle and offtime, which are only calculated when
++specifying maxburst or minburst. Mandatory if specifying maxburst or minburst.
++
++.TP
++maxburst
++This number of packets is used to calculate maxidle so that when
++avgidle is at maxidle, this number of average packets can be burst
++before avgidle drops to 0. Set it higher to be more tolerant of
++bursts. You can't set maxidle directly, only via this parameter.
++
++.TP
++minburst
++As mentioned before, CBQ needs to throttle in case of
++overlimit. The ideal solution is to do so for exactly the calculated
++idle time, and pass 1 packet. However, Unix kernels generally have a
++hard time scheduling events shorter than 10ms, so it is better to
++throttle for a longer period, and then pass minburst packets in one
++go, and then sleep minburst times longer.
++
++The time to wait is called the offtime. Higher values of minburst lead
++to more accurate shaping in the long term, but to bigger bursts at
++millisecond timescales.
++
++.TP
++minidle
++If avgidle is below 0, we are overlimits and need to wait until
++avgidle will be big enough to send one packet. To prevent a sudden
++burst from shutting down the link for a prolonged period of time,
++avgidle is reset to minidle if it gets too low.
++
++Minidle is specified in negative microseconds, so 10 means that
++avgidle is capped at -10us.
++
++.TP
++bounded
++Signifies that this class will not borrow bandwidth from its siblings.
++.TP
++isolated
++Means that this class will not borrow bandwidth to its siblings
++
++.TP
++split major:minor & defmap bitmap[/bitmap]
++If consulting filters attached to a class did not give a verdict,
++CBQ can also classify based on the packet's priority. There are 16
++priorities available, numbered from 0 to 15.
++
++The defmap specifies which priorities this class wants to receive,
++specified as a bitmap. The Least Significant Bit corresponds to priority
++zero. The
++.B split
++parameter tells CBQ at which class the decision must be made, which should
++be a (grand)parent of the class you are adding.
++
++As an example, 'tc class add ... classid 10:1 cbq .. split 10:0 defmap c0'
++configures class 10:0 to send packets with priorities 6 and 7 to 10:1.
++
++The complimentary configuration would then
++be: 'tc class add ... classid 10:2 cbq ... split 10:0 defmap 3f'
++Which would send all packets 0, 1, 2, 3, 4 and 5 to 10:1.
++.TP
++estimator interval timeconstant
++CBQ can measure how much bandwidth each class is using, which tc filters
++can use to classify packets with. In order to determine the bandwidth
++it uses a very simple estimator that measures once every
++.B interval
++microseconds how much traffic has passed. This again is a EWMA, for which
++the time constant can be specified, also in microseconds. The
++.B time constant
++corresponds to the sluggishness of the measurement or, conversely, to the
++sensitivity of the average to short bursts. Higher values mean less
++sensitivity.
++
++
++
++.SH SOURCES
++.TP
++o
++Sally Floyd and Van Jacobson, "Link-sharing and Resource
++Management Models for Packet Networks",
++IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
++
++.TP
++o
++Sally Floyd, "Notes on CBQ and Guarantee Service", 1995
++
++.TP
++o
++Sally Floyd, "Notes on Class-Based Queueing: Setting
++Parameters", 1996
++
++.TP
++o
++Sally Floyd and Michael Speer, "Experimental Results
++for Class-Based Queueing", 1998, not published.
++
++
++
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHOR
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>. This manpage maintained by
++bert hubert <ahu@ds9a.nl>
++
++
+--- debian/manpages/tc-pbfifo.8
++++ debian/manpages/tc-pbfifo.8
+@@ -0,0 +1,72 @@
++.TH PBFIFO 8 "10 January 2002" "iproute2" "Linux"
++.SH NAME
++pfifo \- Packet limited First In, First Out queue
++.P
++bfifo \- Byte limited First In, First Out queue
++
++.SH SYNOPSIS
++.B tc qdisc ... add pfifo
++.B [ limit
++packets
++.B ]
++.P
++.B tc qdisc ... add bfifo
++.B [ limit
++bytes
++.B ]
++
++.SH DESCRIPTION
++The pfifo and bfifo qdiscs are unadorned First In, First Out queues. They are the
++simplest queues possible and therefore have no overhead.
++.B pfifo
++constrains the queue size as measured in packets.
++.B bfifo
++does so as measured in bytes.
++
++Like all non-default qdiscs, they maintain statistics. This might be a reason to prefer
++pfifo or bfifo over the default.
++
++.SH ALGORITHM
++A list of packets is maintained, when a packet is enqueued it gets inserted at the tail of
++a list. When a packet needs to be sent out to the network, it is taken from the head of the list.
++
++If the list is too long, no further packets are allowed on. This is called 'tail drop'.
++
++.SH PARAMETERS
++.TP
++limit
++Maximum queue size. Specified in bytes for bfifo, in packets for pfifo. For pfifo, defaults
++to the interface txqueuelen, as specified with
++.BR ifconfig (8)
++or
++.BR ip (8).
++
++For bfifo, it defaults to the txqueuelen multiplied by the interface MTU.
++
++.SH OUTPUT
++The output of
++.B tc -s qdisc ls
++contains the limit, either in packets or in bytes, and the number of bytes
++and packets actually sent. An unsent and dropped packet only appears between braces
++and is not counted as 'Sent'.
++
++In this example, the queue length is 100 packets, 45894 bytes were sent over 681 packets.
++No packets were dropped, and as the pfifo queue does not slow down packets, there were also no
++overlimits:
++.P
++.nf
++# tc -s qdisc ls dev eth0
++qdisc pfifo 8001: dev eth0 limit 100p
++ Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)
++.fi
++
++If a backlog occurs, this is displayed as well.
++.SH SEE ALSO
++.BR tc (8)
++
++.SH AUTHORS
++Alexey N. Kuznetsov, <kuznet@ms2.inr.ac.ru>
++
++This manpage maintained by bert hubert <ahu@ds9a.nl>
++
++
diff --git a/sys-apps/iproute2/files/2.4.7.20020116-misc-deb-fixes.patch b/sys-apps/iproute2/files/2.4.7.20020116-misc-deb-fixes.patch
new file mode 100644
index 000000000000..960cb760685c
--- /dev/null
+++ b/sys-apps/iproute2/files/2.4.7.20020116-misc-deb-fixes.patch
@@ -0,0 +1,34 @@
+--- iproute-20010824.orig/tc/tc_qdisc.c
++++ iproute-20010824/tc/tc_qdisc.c
+@@ -245,7 +245,7 @@
+ fprintf(fp, "\n");
+ if (show_stats) {
+ if (tb[TCA_STATS]) {
+- if (RTA_PAYLOAD(tb[TCA_STATS]) < sizeof(struct tc_stats))
++ if (RTA_PAYLOAD(tb[TCA_STATS]) < offsetof(struct tc_stats,backlog)+sizeof(((struct tc_stats*)0)->backlog))
+ fprintf(fp, "statistics truncated");
+ else {
+ struct tc_stats st;
+--- iproute-20010824.orig/Makefile
++++ iproute-20010824/Makefile
+@@ -35,7 +35,7 @@
+
+ CC = gcc
+ CCOPTS = -D_GNU_SOURCE -O2 -Wstrict-prototypes -Wall -g
+-CFLAGS = $(CCOPTS) $(GLIBCFIX) -I$(KERNEL_INCLUDE) -I../include $(DEFINES)
++CFLAGS = $(CCOPTS) -I../include $(GLIBCFIX) -I$(KERNEL_INCLUDE) $(DEFINES)
+
+ LDLIBS += -L../lib -lnetlink -lutil
+
+--- iproute-20010824.orig/include-glibc/glibc-bugs.h
++++ iproute-20010824/include-glibc/glibc-bugs.h
+@@ -12,9 +12,6 @@
+
+ #include <linux/types.h>
+
+-typedef __u16 in_port_t;
+-typedef __u32 in_addr_t;
+-
+ #endif
+
+ #endif
diff --git a/sys-apps/iproute2/files/digest-iproute2-2.4.7.20010824-r5 b/sys-apps/iproute2/files/digest-iproute2-2.4.7.20010824-r5
new file mode 100644
index 000000000000..0019edbd44cc
--- /dev/null
+++ b/sys-apps/iproute2/files/digest-iproute2-2.4.7.20010824-r5
@@ -0,0 +1,2 @@
+MD5 b05a4e375d9468be3a1dd3f0e83daee8 iproute2-2.4.7-now-ss010824.tar.gz 140139
+MD5 60585e8f7d11173ca80591cc9f5fb833 iproute_20010824-13.diff.gz 91751
diff --git a/sys-apps/iproute2/files/digest-iproute2-2.4.7.20020116 b/sys-apps/iproute2/files/digest-iproute2-2.4.7.20020116
new file mode 100644
index 000000000000..b8202beb385e
--- /dev/null
+++ b/sys-apps/iproute2/files/digest-iproute2-2.4.7.20020116
@@ -0,0 +1 @@
+MD5 2c7e5f3a10e703745ecdc613f7a7d187 iproute2-2.4.7-now-ss020116-try.tar.gz 197008