netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/3] IPROUTE: add support for multiq qdisc
@ 2008-08-28  1:13 Jeff Kirsher
  2008-08-28  1:13 ` [PATCH 2/3] IPROUTE: add support for skbedit action Jeff Kirsher
  2008-08-28  1:13 ` [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat Jeff Kirsher
  0 siblings, 2 replies; 8+ messages in thread
From: Jeff Kirsher @ 2008-08-28  1:13 UTC (permalink / raw)
  To: jeff, tgraf; +Cc: netdev, davem, Alexander Duyck, Jeff Kirsher

From: Alexander Duyck <alexander.h.duyck@intel.com>

Add support for multiq qdisc
	This patch adds the ability to configure the multiq qdisc.

usage: tc qdisc add dev <DEV> root handle <HANDLE> multiq bands <BANDS>
	BANDS:=0 to auto select, or number of bands on device.
	       if not 0 must match the number of bands on the device.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---

 include/linux/pkt_sched.h |    6 +++
 tc/Makefile               |    1 +
 tc/q_multiq.c             |   88 +++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 95 insertions(+), 0 deletions(-)
 create mode 100644 tc/q_multiq.c

diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
index dbb7ac3..8e31e79 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
@@ -112,6 +112,12 @@ enum
 
 #define TCA_PRIO_MAX    (__TCA_PRIO_MAX - 1)
 
+/* MULTIQ section */
+
+struct tc_multiq_qopt {
+	int	bands;			/* Number of bands */
+};
+
 /* TBF section */
 
 struct tc_tbf_qopt
diff --git a/tc/Makefile b/tc/Makefile
index 4116983..2f3c1ea 100644
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -12,6 +12,7 @@ TCMODULES += q_prio.o
 TCMODULES += q_tbf.o
 TCMODULES += q_cbq.o
 TCMODULES += q_rr.o
+TCMODULES += q_multiq.o
 TCMODULES += q_netem.o
 TCMODULES += f_rsvp.o
 TCMODULES += f_u32.o
diff --git a/tc/q_multiq.c b/tc/q_multiq.c
new file mode 100644
index 0000000..4dc2826
--- /dev/null
+++ b/tc/q_multiq.c
@@ -0,0 +1,88 @@
+/*
+ * q_multiq.c		MULTIQ.
+ *
+ *		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.
+ *
+ * Author: Alexander Duyck <alexander.h.duyck@intel.com>
+ *
+ * Original Authors:	PJ Waskiewicz, <peter.p.waskiewicz.jr@intel.com> (RR)
+ * 			Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> (from PRIO)
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <syslog.h>
+#include <fcntl.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+
+#include "utils.h"
+#include "tc_util.h"
+
+static void explain(void)
+{
+	fprintf(stderr, "Usage: ... multiq bands NUMBER\n");
+}
+
+#define usage() return(-1)
+
+static int multiq_parse_opt(struct qdisc_util *qu, int argc, char **argv,
+			    struct nlmsghdr *n)
+{
+	int ok = 0;
+	struct rtattr *nest;
+	struct tc_multiq_qopt opt;
+
+	while (argc > 0) {
+		if (strcmp(*argv, "bands") == 0) {
+			NEXT_ARG();
+			if (get_integer(&opt.bands, *argv, 10)) {
+				fprintf(stderr, "Illegal \"bands\"\n");
+				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++;
+	}
+
+	nest = addattr_nest_compat(n, 1024, TCA_OPTIONS, &opt, sizeof(opt));
+	addattr_nest_compat_end(n, nest);
+	return 0;
+}
+
+int multiq_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
+{
+	struct tc_multiq_qopt *qopt;
+	struct rtattr *tb[TCA_PRIO_MAX + 1];
+
+	if (opt == NULL)
+		return 0;
+
+	if (parse_rtattr_nested_compat(tb, TCA_PRIO_MAX, opt, qopt,
+						sizeof(*qopt)))
+		return -1;
+
+	fprintf(f, "bands %u ", qopt->bands);
+
+	return 0;
+}
+
+struct qdisc_util multiq_qdisc_util = {
+	.id	 	= "multiq",
+	.parse_qopt	= multiq_parse_opt,
+	.print_qopt	= multiq_print_opt,
+};


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/3] IPROUTE: add support for skbedit action
  2008-08-28  1:13 [PATCH 1/3] IPROUTE: add support for multiq qdisc Jeff Kirsher
@ 2008-08-28  1:13 ` Jeff Kirsher
  2008-08-28  1:13 ` [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat Jeff Kirsher
  1 sibling, 0 replies; 8+ messages in thread
From: Jeff Kirsher @ 2008-08-28  1:13 UTC (permalink / raw)
  To: jeff, tgraf; +Cc: netdev, davem, Alexander Duyck, Jeff Kirsher

From: Alexander Duyck <alexander.h.duyck@intel.com>

Add support for skbedit action.
	Provides ability to edit queue_mapping field
	Provides ability to edit priority field

usage: action skbedit [queue_mapping QUEUE_MAPPING] [priority PRIORITY]
	at least one option must be select, or both at the same time

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---

 include/linux/tc_act/tc_skbedit.h |   23 +++++
 tc/Makefile                       |    1 
 tc/m_skbedit.c                    |  186 +++++++++++++++++++++++++++++++++++++
 3 files changed, 210 insertions(+), 0 deletions(-)
 create mode 100644 include/linux/tc_act/tc_skbedit.h
 create mode 100644 tc/m_skbedit.c

diff --git a/include/linux/tc_act/tc_skbedit.h b/include/linux/tc_act/tc_skbedit.h
new file mode 100644
index 0000000..3965636
--- /dev/null
+++ b/include/linux/tc_act/tc_skbedit.h
@@ -0,0 +1,23 @@
+#ifndef __LINUX_TC_SKBEDIT_H
+#define __LINUX_TC_SKBEDIT_H
+
+#include <linux/pkt_cls.h>
+
+#define SKBEDIT_F_PRIORITY		0x1
+#define SKBEDIT_F_QUEUE_MAPPING		0x2
+
+struct tc_skbedit {
+	tc_gen;
+};
+
+enum {
+	TCA_SKBEDIT_UNSPEC,
+	TCA_SKBEDIT_TM,
+	TCA_SKBEDIT_PARMS,
+	TCA_SKBEDIT_PRIORITY,
+	TCA_SKBEDIT_QUEUE_MAPPING,
+	__TCA_SKBEDIT_MAX
+};
+#define TCA_SKBEDIT_MAX (__TCA_SKBEDIT_MAX - 1)
+
+#endif
diff --git a/tc/Makefile b/tc/Makefile
index 2f3c1ea..743a946 100644
--- a/tc/Makefile
+++ b/tc/Makefile
@@ -31,6 +31,7 @@ TCMODULES += m_mirred.o
 TCMODULES += m_ipt.o
 TCMODULES += m_nat.o
 TCMODULES += m_pedit.o
+TCMODULES += m_skbedit.o
 TCMODULES += p_ip.o
 TCMODULES += p_icmp.o
 TCMODULES += p_tcp.o
diff --git a/tc/m_skbedit.c b/tc/m_skbedit.c
new file mode 100644
index 0000000..a889e34
--- /dev/null
+++ b/tc/m_skbedit.c
@@ -0,0 +1,186 @@
+/*
+ * m_skbedit.c		SKB Editing module
+ *
+ *		This program is free software; you can distribute 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:	Alexander Duyck <alexander.h.duyck@intel.com>
+ *
+ */
+
+#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 <dlfcn.h>
+#include "utils.h"
+#include "tc_util.h"
+#include <linux/tc_act/tc_skbedit.h>
+
+static void
+explain(void)
+{
+	fprintf(stderr, "Usage: ... skbedit "
+			"queue_mapping QUEUE_MAPPING | priority PRIORITY \n"
+			"QUEUE_MAPPING = device transmit queue to use\n"
+			"PRIORITY = classID to assign to priority field\n");
+}
+
+static void
+usage(void)
+{
+	explain();
+	exit(-1);
+}
+
+static int
+parse_skbedit(struct action_util *a, int *argc_p, char ***argv_p, int tca_id,
+	      struct nlmsghdr *n)
+{
+	struct tc_skbedit sel;
+	int argc = *argc_p;
+	char **argv = *argv_p;
+	int ok = 0;
+	struct rtattr *tail;
+	unsigned int tmp;
+	__u16 queue_mapping;
+	__u32 flags = 0, priority;
+
+
+	while (argc > 0) {
+		if (matches(*argv, "skbedit") == 0) {
+			NEXT_ARG();
+		} else if (matches(*argv, "queue_mapping") == 0) {
+			flags |= SKBEDIT_F_QUEUE_MAPPING;
+			NEXT_ARG();
+			if (get_unsigned(&tmp, *argv, 10) || tmp > 65535) {
+				fprintf(stderr, "Illegal queue_mapping\n");
+				return -1;
+			}
+			queue_mapping = tmp;
+			ok++;
+		} else if (matches(*argv, "priority") == 0) {
+			flags |= SKBEDIT_F_PRIORITY;
+			NEXT_ARG();
+			if (get_tc_classid(&priority, *argv)) {
+				fprintf(stderr, "Illegal priority\n");
+				return -1;
+			}
+			ok++;
+		} else if (matches(*argv, "help") == 0) {
+			usage();
+		} else {
+			break;
+		}
+		argc--;
+		argv++;
+	}
+
+	if (argc) {
+		if (matches(*argv, "reclassify") == 0) {
+			sel.action = TC_ACT_RECLASSIFY;
+			NEXT_ARG();
+		} else if (matches(*argv, "pipe") == 0) {
+			sel.action = TC_ACT_PIPE;
+			NEXT_ARG();
+		} else if (matches(*argv, "drop") == 0 ||
+			matches(*argv, "shot") == 0) {
+			sel.action = TC_ACT_SHOT;
+			NEXT_ARG();
+		} else if (matches(*argv, "continue") == 0) {
+			sel.action = TC_ACT_UNSPEC;
+			NEXT_ARG();
+		} else if (matches(*argv, "pass") == 0) {
+			sel.action = TC_ACT_OK;
+			NEXT_ARG();
+		}
+	}
+
+	if (argc) {
+		if (matches(*argv, "index") == 0) {
+			NEXT_ARG();
+			if (get_u32(&sel.index, *argv, 10)) {
+				fprintf(stderr, "Pedit: Illegal \"index\"\n");
+				return -1;
+			}
+			argc--;
+			argv++;
+			ok++;
+		}
+	}
+
+	if (!ok) {
+		explain();
+		return -1;
+	}
+
+
+	tail = NLMSG_TAIL(n);
+	addattr_l(n, MAX_MSG, tca_id, NULL, 0);
+	addattr_l(n, MAX_MSG, TCA_SKBEDIT_PARMS, &sel, sizeof(sel));
+	if (flags & SKBEDIT_F_QUEUE_MAPPING)
+		addattr_l(n, MAX_MSG, TCA_SKBEDIT_QUEUE_MAPPING,
+			  &queue_mapping, sizeof(queue_mapping));
+	if (flags & SKBEDIT_F_PRIORITY)
+		addattr_l(n, MAX_MSG, TCA_SKBEDIT_PRIORITY,
+			  &priority, sizeof(priority));
+	tail->rta_len = (char *)NLMSG_TAIL(n) - (char *)tail;
+
+	*argc_p = argc;
+	*argv_p = argv;
+	return 0;
+}
+
+static int print_skbedit(struct action_util *au, FILE *f, struct rtattr *arg)
+{
+	struct tc_skbedit *sel;
+	struct rtattr *tb[TCA_SKBEDIT_MAX + 1];
+	SPRINT_BUF(b1);
+	__u32 *priority;
+	__u16 *queue_mapping;
+
+	if (arg == NULL)
+		return -1;
+
+	parse_rtattr_nested(tb, TCA_SKBEDIT_MAX, arg);
+
+	if (tb[TCA_SKBEDIT_PARMS] == NULL) {
+		fprintf(f, "[NULL skbedit parameters]");
+		return -1;
+	}
+
+	sel = RTA_DATA(tb[TCA_SKBEDIT_PARMS]);
+
+	fprintf(f, " skbedit");
+
+	if (tb[TCA_SKBEDIT_QUEUE_MAPPING] != NULL) {
+		queue_mapping = RTA_DATA(tb[TCA_SKBEDIT_QUEUE_MAPPING]);
+		fprintf(f, " queue_mapping %u", *queue_mapping);
+	}
+	if (tb[TCA_SKBEDIT_PRIORITY] != NULL) {
+		priority = RTA_DATA(tb[TCA_SKBEDIT_PRIORITY]);
+		fprintf(f, " priority %s", sprint_tc_classid(*priority, b1));
+	}
+
+	if (show_stats) {
+		if (tb[TCA_SKBEDIT_TM]) {
+			struct tcf_t *tm = RTA_DATA(tb[TCA_SKBEDIT_TM]);
+			print_tm(f, tm);
+		}
+	}
+
+	return 0;
+}
+
+struct action_util skbedit_action_util = {
+	.id = "skbedit",
+	.parse_aopt = parse_skbedit,
+	.print_aopt = print_skbedit,
+};


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  1:13 [PATCH 1/3] IPROUTE: add support for multiq qdisc Jeff Kirsher
  2008-08-28  1:13 ` [PATCH 2/3] IPROUTE: add support for skbedit action Jeff Kirsher
@ 2008-08-28  1:13 ` Jeff Kirsher
  2008-08-28  8:16   ` David Miller
  2008-08-28  9:51   ` Thomas Graf
  1 sibling, 2 replies; 8+ messages in thread
From: Jeff Kirsher @ 2008-08-28  1:13 UTC (permalink / raw)
  To: jeff, tgraf; +Cc: netdev, davem, Alexander Duyck, Jeff Kirsher

From: Alexander Duyck <alexander.h.duyck@intel.com>

This patch updates libnetlink.c to generate nested compat netlink
attributes in the same format that is parsed by the kernels 2.6.26
and newer.

This patch will fix the prio multiqueue option for 2.6.26 kernels,
but will break compatibility with all kernels prior to 2.6.26.

Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
---

 lib/libnetlink.c |    2 --
 1 files changed, 0 insertions(+), 2 deletions(-)

diff --git a/lib/libnetlink.c b/lib/libnetlink.c
index 5ae64f7..5f42ec1 100644
--- a/lib/libnetlink.c
+++ b/lib/libnetlink.c
@@ -573,7 +573,6 @@ struct rtattr *addattr_nest_compat(struct nlmsghdr *n, int maxlen, int type,
 	struct rtattr *start = NLMSG_TAIL(n);
 
 	addattr_l(n, maxlen, type, data, len);
-	addattr_nest(n, maxlen, type);
 	return start;
 }
 
@@ -582,7 +581,6 @@ int addattr_nest_compat_end(struct nlmsghdr *n, struct rtattr *start)
 	struct rtattr *nest = (void *)start + NLMSG_ALIGN(start->rta_len);
 
 	start->rta_len = (void *)NLMSG_TAIL(n) - (void *)start;
-	addattr_nest_end(n, nest);
 	return n->nlmsg_len;
 }
 


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  1:13 ` [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat Jeff Kirsher
@ 2008-08-28  8:16   ` David Miller
  2008-08-28  9:51   ` Thomas Graf
  1 sibling, 0 replies; 8+ messages in thread
From: David Miller @ 2008-08-28  8:16 UTC (permalink / raw)
  To: jeffrey.t.kirsher; +Cc: jeff, tgraf, netdev, alexander.h.duyck

From: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Date: Wed, 27 Aug 2008 18:13:47 -0700

> This patch updates libnetlink.c to generate nested compat netlink
> attributes in the same format that is parsed by the kernels 2.6.26
> and newer.
> 
> This patch will fix the prio multiqueue option for 2.6.26 kernels,
> but will break compatibility with all kernels prior to 2.6.26.
> 
> Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com>
> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>

This is on hold because my research indicates that some kernel
changes should be used to fix this instead.

See the most recent postings in the thread:

"[PATCH] IPROUTE: correct nla nested message generated by netem_parse_opt"


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  1:13 ` [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat Jeff Kirsher
  2008-08-28  8:16   ` David Miller
@ 2008-08-28  9:51   ` Thomas Graf
  2008-08-28  9:55     ` David Miller
  1 sibling, 1 reply; 8+ messages in thread
From: Thomas Graf @ 2008-08-28  9:51 UTC (permalink / raw)
  To: Jeff Kirsher; +Cc: jeff, netdev, davem, Alexander Duyck

* Jeff Kirsher <jeffrey.t.kirsher@intel.com> 2008-08-27 18:13
> From: Alexander Duyck <alexander.h.duyck@intel.com>
> 
> This patch updates libnetlink.c to generate nested compat netlink
> attributes in the same format that is parsed by the kernels 2.6.26
> and newer.
> 
> This patch will fix the prio multiqueue option for 2.6.26 kernels,
> but will break compatibility with all kernels prior to 2.6.26.

I'm not sure what you mean by fix, I can't find any nested attributes
being parsed in the proposed sch_multiq.c.

Wouldn't it be simpler to have q_multiq.c use addattr_nest() instead of
addattr_nest_compat() instead of changing addattr_nest_compat() to be
equivalent to addattr_nest()?

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  9:51   ` Thomas Graf
@ 2008-08-28  9:55     ` David Miller
  2008-08-28  9:59       ` Thomas Graf
  0 siblings, 1 reply; 8+ messages in thread
From: David Miller @ 2008-08-28  9:55 UTC (permalink / raw)
  To: tgraf; +Cc: jeffrey.t.kirsher, jeff, netdev, alexander.h.duyck

From: Thomas Graf <tgraf@suug.ch>
Date: Thu, 28 Aug 2008 11:51:31 +0200

> * Jeff Kirsher <jeffrey.t.kirsher@intel.com> 2008-08-27 18:13
> > From: Alexander Duyck <alexander.h.duyck@intel.com>
> > 
> > This patch updates libnetlink.c to generate nested compat netlink
> > attributes in the same format that is parsed by the kernels 2.6.26
> > and newer.
> > 
> > This patch will fix the prio multiqueue option for 2.6.26 kernels,
> > but will break compatibility with all kernels prior to 2.6.26.
> 
> I'm not sure what you mean by fix, I can't find any nested attributes
> being parsed in the proposed sch_multiq.c.

He's doing the bogus iproute2 alternative to curing the regression
in PRIO and RR that was added to 2.6.26 and 2.6.25.7

That's what this is for.

But see my other email, we'll likely fix this in the kernel.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  9:55     ` David Miller
@ 2008-08-28  9:59       ` Thomas Graf
  2008-08-28 10:02         ` David Miller
  0 siblings, 1 reply; 8+ messages in thread
From: Thomas Graf @ 2008-08-28  9:59 UTC (permalink / raw)
  To: David Miller; +Cc: jeffrey.t.kirsher, jeff, netdev, alexander.h.duyck

* David Miller <davem@davemloft.net> 2008-08-28 02:55
> He's doing the bogus iproute2 alternative to curing the regression
> in PRIO and RR that was added to 2.6.26 and 2.6.25.7
> 
> That's what this is for.
> 
> But see my other email, we'll likely fix this in the kernel.

The prio scheduler also no longer parses nested attributes, you have
removed that piece of code when you removed RR. There is nothing to
fix really.  multiq is currently the only "real" user of
addattr_nest_compat().


^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat
  2008-08-28  9:59       ` Thomas Graf
@ 2008-08-28 10:02         ` David Miller
  0 siblings, 0 replies; 8+ messages in thread
From: David Miller @ 2008-08-28 10:02 UTC (permalink / raw)
  To: tgraf; +Cc: jeffrey.t.kirsher, jeff, netdev, alexander.h.duyck

From: Thomas Graf <tgraf@suug.ch>
Date: Thu, 28 Aug 2008 11:59:48 +0200

> * David Miller <davem@davemloft.net> 2008-08-28 02:55
> > He's doing the bogus iproute2 alternative to curing the regression
> > in PRIO and RR that was added to 2.6.26 and 2.6.25.7
> > 
> > That's what this is for.
> > 
> > But see my other email, we'll likely fix this in the kernel.
> 
> The prio scheduler also no longer parses nested attributes, you have
> removed that piece of code when you removed RR. There is nothing to
> fix really.  multiq is currently the only "real" user of
> addattr_nest_compat().

2.6.26 and 2.6.25.7 still have the prio and RR scheduler multiqueue
parts, and we broke them.

See my other reply in the other thread where this discussion
was taking place.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2008-08-28 10:02 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-28  1:13 [PATCH 1/3] IPROUTE: add support for multiq qdisc Jeff Kirsher
2008-08-28  1:13 ` [PATCH 2/3] IPROUTE: add support for skbedit action Jeff Kirsher
2008-08-28  1:13 ` [PATCH 3/3] IPROUTE: generate compat messages that match nla_parse_nested_compat Jeff Kirsher
2008-08-28  8:16   ` David Miller
2008-08-28  9:51   ` Thomas Graf
2008-08-28  9:55     ` David Miller
2008-08-28  9:59       ` Thomas Graf
2008-08-28 10:02         ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).