netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH iproute2 1/2] utils: add s32 parser
@ 2011-11-24 17:40 Hagen Paul Pfeifer
  2011-11-24 17:40 ` [PATCH iproute2 2/2] tc: netem ratelatency and cell extension Hagen Paul Pfeifer
                   ` (2 more replies)
  0 siblings, 3 replies; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-24 17:40 UTC (permalink / raw)
  To: netdev; +Cc: Stephen Hemminger, Hagen Paul Pfeifer

Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>
---
 include/utils.h |    1 +
 lib/utils.c     |   14 ++++++++++++++
 2 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/include/utils.h b/include/utils.h
index 47f8e07..496db68 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -85,6 +85,7 @@ extern int get_time_rtt(unsigned *val, const char *arg, int *raw);
 #define get_short get_s16
 extern int get_u64(__u64 *val, const char *arg, int base);
 extern int get_u32(__u32 *val, const char *arg, int base);
+extern int get_s32(__s32 *val, const char *arg, int base);
 extern int get_u16(__u16 *val, const char *arg, int base);
 extern int get_s16(__s16 *val, const char *arg, int base);
 extern int get_u8(__u8 *val, const char *arg, int base);
diff --git a/lib/utils.c b/lib/utils.c
index efaf377..6788dd9 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -198,6 +198,20 @@ int get_u8(__u8 *val, const char *arg, int base)
 	return 0;
 }
 
+int get_s32(__s32 *val, const char *arg, int base)
+{
+	long res;
+	char *ptr;
+
+	if (!arg || !*arg)
+		return -1;
+	res = strtoul(arg, &ptr, base);
+	if (!ptr || ptr == arg || *ptr || res > INT32_MAX || res < INT32_MIN)
+		return -1;
+	*val = res;
+	return 0;
+}
+
 int get_s16(__s16 *val, const char *arg, int base)
 {
 	long res;
-- 
1.7.7

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

* [PATCH iproute2 2/2] tc: netem ratelatency and cell extension
  2011-11-24 17:40 [PATCH iproute2 1/2] utils: add s32 parser Hagen Paul Pfeifer
@ 2011-11-24 17:40 ` Hagen Paul Pfeifer
  2011-11-25  9:46 ` [PATCH iproute2 1/2] utils: add s32 parser David Laight
  2012-01-19 22:41 ` [PATCH iproute2 1/2] " Stephen Hemminger
  2 siblings, 0 replies; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-24 17:40 UTC (permalink / raw)
  To: netdev; +Cc: Stephen Hemminger, Hagen Paul Pfeifer

This patch add ratelatency as well as cell support. Ratelatency can be
added with ratelatency options. Three optional arguments control the
cell knobs: packet-overhead, cell-size, cell-overhead. To ratelimit eth0
root queue to 5kbit/s, with a 20 byte packet overhead, 100 byte cell
size and a 5 byte per cell overhead:

	tc qdisc add dev eth0 root netem ratelatency 5kbit 20 100 5

Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>
---
 include/linux/pkt_sched.h |    8 ++++++
 tc/q_netem.c              |   53 ++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 60 insertions(+), 1 deletions(-)

diff --git a/include/linux/pkt_sched.h b/include/linux/pkt_sched.h
index c533670..76b26a2 100644
--- a/include/linux/pkt_sched.h
+++ b/include/linux/pkt_sched.h
@@ -465,6 +465,7 @@ enum {
 	TCA_NETEM_REORDER,
 	TCA_NETEM_CORRUPT,
 	TCA_NETEM_LOSS,
+	TCA_NETEM_RATELATENCY,
 	__TCA_NETEM_MAX,
 };
 
@@ -495,6 +496,13 @@ struct tc_netem_corrupt {
 	__u32	correlation;
 };
 
+struct tc_netem_ratelatency {
+	__u32	ratelatency;	 /* byte/s */
+	__s32   packet_overhead;
+	__u32   cell_size;
+	__s32   cell_overhead;
+};
+
 enum {
 	NETEM_LOSS_UNSPEC,
 	NETEM_LOSS_GI,		/* General Intuitive - 4 state model */
diff --git a/tc/q_netem.c b/tc/q_netem.c
index 6dc40bd..d6a3266 100644
--- a/tc/q_netem.c
+++ b/tc/q_netem.c
@@ -34,7 +34,8 @@ static void explain(void)
 "                 [ drop PERCENT [CORRELATION]] \n" \
 "                 [ corrupt PERCENT [CORRELATION]] \n" \
 "                 [ duplicate PERCENT [CORRELATION]]\n" \
-"                 [ reorder PRECENT [CORRELATION] [ gap DISTANCE ]]\n");
+"                 [ reorder PRECENT [CORRELATION] [ gap DISTANCE ]]\n" \
+"                 [ ratelatency RATE [PACKETOVERHEAD] [CELLSIZE] [CELLOVERHEAD]]\n");
 }
 
 static void explain1(const char *arg)
@@ -131,6 +132,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 	struct tc_netem_corr cor;
 	struct tc_netem_reorder reorder;
 	struct tc_netem_corrupt corrupt;
+	struct tc_netem_ratelatency ratelatency;
 	__s16 *dist_data = NULL;
 	int present[__TCA_NETEM_MAX];
 
@@ -139,6 +141,7 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 	memset(&cor, 0, sizeof(cor));
 	memset(&reorder, 0, sizeof(reorder));
 	memset(&corrupt, 0, sizeof(corrupt));
+	memset(&ratelatency, 0, sizeof(ratelatency));
 	memset(present, 0, sizeof(present));
 
 	while (argc > 0) {
@@ -244,6 +247,34 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 				free(dist_data);
 				return -1;
 			}
+		} else if (matches(*argv, "ratelatency") == 0) {
+			++present[TCA_NETEM_RATELATENCY];
+			NEXT_ARG();
+			if (get_rate(&ratelatency.ratelatency, *argv)) {
+				explain1("ratelatency");
+				return -1;
+			}
+			if (NEXT_IS_NUMBER()) {
+				NEXT_ARG();
+				if (get_s32(&ratelatency.packet_overhead, *argv, 0)) {
+					explain1("ratelatency");
+					return -1;
+				}
+			}
+			if (NEXT_IS_NUMBER()) {
+				NEXT_ARG();
+				if (get_u32(&ratelatency.cell_size, *argv, 0)) {
+					explain1("ratelatency");
+					return -1;
+				}
+			}
+			if (NEXT_IS_NUMBER()) {
+				NEXT_ARG();
+				if (get_s32(&ratelatency.cell_overhead, *argv, 0)) {
+					explain1("ratelatency");
+					return -1;
+				}
+			}
 		} else if (strcmp(*argv, "help") == 0) {
 			explain();
 			return -1;
@@ -290,6 +321,10 @@ static int netem_parse_opt(struct qdisc_util *qu, int argc, char **argv,
 	    addattr_l(n, 1024, TCA_NETEM_CORRUPT, &corrupt, sizeof(corrupt)) < 0)
 		return -1;
 
+	if (present[TCA_NETEM_RATELATENCY] &&
+	    addattr_l(n, 1024, TCA_NETEM_RATELATENCY, &ratelatency, sizeof(ratelatency)) < 0)
+		return -1;
+
 	if (dist_data) {
 		if (addattr_l(n, MAX_DIST * sizeof(dist_data[0]),
 			      TCA_NETEM_DELAY_DIST,
@@ -306,6 +341,7 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
 	const struct tc_netem_corr *cor = NULL;
 	const struct tc_netem_reorder *reorder = NULL;
 	const struct tc_netem_corrupt *corrupt = NULL;
+	const struct tc_netem_ratelatency *ratelatency = NULL;
 	struct tc_netem_qopt qopt;
 	int len = RTA_PAYLOAD(opt) - sizeof(qopt);
 	SPRINT_BUF(b1);
@@ -339,6 +375,11 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
 				return -1;
 			corrupt = RTA_DATA(tb[TCA_NETEM_CORRUPT]);
 		}
+		if (tb[TCA_NETEM_RATELATENCY]) {
+			if (RTA_PAYLOAD(tb[TCA_NETEM_RATELATENCY]) < sizeof(*ratelatency))
+				return -1;
+			ratelatency = RTA_DATA(tb[TCA_NETEM_RATELATENCY]);
+		}
 	}
 
 	fprintf(f, "limit %d", qopt.limit);
@@ -382,6 +423,16 @@ static int netem_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
 				sprint_percent(corrupt->correlation, b1));
 	}
 
+	if (ratelatency && ratelatency->ratelatency) {
+		fprintf(f, " ratelatency %s", sprint_rate(ratelatency->ratelatency, b1));
+		if (ratelatency->packet_overhead)
+			fprintf(f, " packetoverhead %d", ratelatency->packet_overhead);
+		if (ratelatency->cell_size)
+			fprintf(f, " cellsize %u", ratelatency->cell_size);
+		if (ratelatency->cell_overhead)
+			fprintf(f, " celloverhead %d", ratelatency->cell_overhead);
+	}
+
 	if (qopt.gap)
 		fprintf(f, " gap %lu", (unsigned long)qopt.gap);
 
-- 
1.7.7

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

* RE: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-24 17:40 [PATCH iproute2 1/2] utils: add s32 parser Hagen Paul Pfeifer
  2011-11-24 17:40 ` [PATCH iproute2 2/2] tc: netem ratelatency and cell extension Hagen Paul Pfeifer
@ 2011-11-25  9:46 ` David Laight
  2011-11-25 11:13   ` Hagen Paul Pfeifer
  2011-11-25 17:24   ` Stephen Hemminger
  2012-01-19 22:41 ` [PATCH iproute2 1/2] " Stephen Hemminger
  2 siblings, 2 replies; 12+ messages in thread
From: David Laight @ 2011-11-25  9:46 UTC (permalink / raw)
  To: Hagen Paul Pfeifer, netdev; +Cc: Stephen Hemminger

> +int get_s32(__s32 *val, const char *arg, int base)
> +{
> +	long res;
> +	char *ptr;
> +
> +	if (!arg || !*arg)
> +		return -1;

No need to check *arg, picked up below.

> +	res = strtoul(arg, &ptr, base);
> +	if (!ptr || ptr == arg || *ptr || res > INT32_MAX || res <
INT32_MIN)

No need to check !ptr.

> +		return -1;
> +	*val = res;
> +	return 0;
> +}

Seems to me this be commoned with get_s16() by using
a function that takes the bounds as parameters.
Or possibly with a wrapper to strtoul() that does all the
validation checks.

	David

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

* Re: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-25  9:46 ` [PATCH iproute2 1/2] utils: add s32 parser David Laight
@ 2011-11-25 11:13   ` Hagen Paul Pfeifer
  2011-11-25 17:24   ` Stephen Hemminger
  1 sibling, 0 replies; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-25 11:13 UTC (permalink / raw)
  To: David Laight; +Cc: netdev, Stephen Hemminger

* David Laight | 2011-11-25 09:46:09 [-0000]:

>> +int get_s32(__s32 *val, const char *arg, int base)
>> +{
>> +	long res;
>> +	char *ptr;
>> +
>> +	if (!arg || !*arg)
>> +		return -1;
>
>No need to check *arg, picked up below.

Yes, it is a little bit explicit/duplicate, but I decided to follow all
get_[su][16 32 64] functions to be consistent. If you want you can send a
separate patch afterwards.

HGN

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

* Re: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-25  9:46 ` [PATCH iproute2 1/2] utils: add s32 parser David Laight
  2011-11-25 11:13   ` Hagen Paul Pfeifer
@ 2011-11-25 17:24   ` Stephen Hemminger
  2011-11-25 17:34     ` David Laight
  1 sibling, 1 reply; 12+ messages in thread
From: Stephen Hemminger @ 2011-11-25 17:24 UTC (permalink / raw)
  To: David Laight; +Cc: Hagen Paul Pfeifer, netdev

On Fri, 25 Nov 2011 09:46:09 -0000
"David Laight" <David.Laight@ACULAB.COM> wrote:

> > +	res = strtoul(arg, &ptr, base);
> > +	if (!ptr || ptr == arg || *ptr || res > INT32_MAX || res <  
> INT32_MIN)
> 
> No need to check !ptr.

Also don't you want signed value?  Reading strtol() man page,
the correct way is:
	errno = 0;
	res = strtol(arg, &ptr, base);
	if (ptr == arg || errno)
		return -1;

"RETURN VALUE
       The strtol() function returns the result of the conversion, unless  the
       value  would  underflow  or overflow.  If an underflow occurs, strtol()
       returns LONG_MIN.  If an overflow occurs,  strtol()  returns  LONG_MAX.
       In  both  cases,  errno is set to ERANGE.  Precisely the same holds for
       strtoll()  (with  LLONG_MIN  and  LLONG_MAX  instead  of  LONG_MIN  and
       LONG_MAX).

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

* RE: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-25 17:24   ` Stephen Hemminger
@ 2011-11-25 17:34     ` David Laight
  2011-11-25 17:47       ` Hagen Paul Pfeifer
  0 siblings, 1 reply; 12+ messages in thread
From: David Laight @ 2011-11-25 17:34 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: Hagen Paul Pfeifer, netdev

> From: Stephen Hemminger [mailto:shemminger@vyatta.com] 
> "David Laight" <David.Laight@ACULAB.COM> wrote:
> 
> > > +	res = strtoul(arg, &ptr, base);
> > > +	if (!ptr || ptr == arg || *ptr || res > INT32_MAX || res <  
> > INT32_MIN)
> > 
> > No need to check !ptr.
> 
> Also don't you want signed value?  Reading strtol() man page,
> the correct way is:
> 	errno = 0;
> 	res = strtol(arg, &ptr, base);
> 	if (ptr == arg || errno)
> 		return -1;
> 
> "RETURN VALUE
>        The strtol() function returns the result of the conversion,
unless  the
>        value  would  underflow  or overflow.  If an underflow occurs,
strtol()
>        returns LONG_MIN.  If an overflow occurs,  strtol() returns
LONG_MAX.
>        In  both  cases,  errno is set to ERANGE.  Precisely the same
holds for
>        strtoll()  (with  LLONG_MIN  and  LLONG_MAX  instead  of
LONG_MIN  and
>        LONG_MAX).

If you are that worried about numeric overflow (IIRC) you have
have to check the result for LONG_MIN/MAX (etc) before looking
at errno.

strtoul() is defined to support -ve values, and I think the
C rules for conversion between signed and unsigned ints
DTRT even for non 2's compliment systems.

Some of these bound checks are a waste of time.
The SUS doesn't require standard utilities to perform them.

	David

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

* Re: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-25 17:34     ` David Laight
@ 2011-11-25 17:47       ` Hagen Paul Pfeifer
  2011-11-25 23:00         ` [PATCH iproute2] " Hagen Paul Pfeifer
  0 siblings, 1 reply; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-25 17:47 UTC (permalink / raw)
  To: David Laight; +Cc: Stephen Hemminger, netdev

* David Laight | 2011-11-25 17:34:21 [-0000]:

>If you are that worried about numeric overflow (IIRC) you have
>have to check the result for LONG_MIN/MAX (etc) before looking
>at errno.
>
>strtoul() is defined to support -ve values, and I think the
>C rules for conversion between signed and unsigned ints
>DTRT even for non 2's compliment systems.
>
>Some of these bound checks are a waste of time.
>The SUS doesn't require standard utilities to perform them.

David: are you able to fix all conversations functions in utils.c (and add
get_s32). If not I will repost get_s32 with strtol() with the same error check
mechanism as get_* (to be consistent).

Stephen, any other ideas?

Hagen

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

* [PATCH iproute2] utils: add s32 parser
  2011-11-25 17:47       ` Hagen Paul Pfeifer
@ 2011-11-25 23:00         ` Hagen Paul Pfeifer
  2011-11-26  0:50           ` Stephen Hemminger
  0 siblings, 1 reply; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-25 23:00 UTC (permalink / raw)
  To: netdev; +Cc: David.Laight, Stephen Hemminger, Hagen Paul Pfeifer

This should be enough "security", tc users have root capabilities
anyway.

Not sure if we should save errno and restore afterwards:

errno_save = errno;
errno = 0;
[...]
errno = errno_save;


Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>
---

 include/utils.h |    1 +
 lib/utils.c     |   19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/include/utils.h b/include/utils.h
index 47f8e07..496db68 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -85,6 +85,7 @@ extern int get_time_rtt(unsigned *val, const char *arg, int *raw);
 #define get_short get_s16
 extern int get_u64(__u64 *val, const char *arg, int base);
 extern int get_u32(__u32 *val, const char *arg, int base);
+extern int get_s32(__s32 *val, const char *arg, int base);
 extern int get_u16(__u16 *val, const char *arg, int base);
 extern int get_s16(__s16 *val, const char *arg, int base);
 extern int get_u8(__u8 *val, const char *arg, int base);
diff --git a/lib/utils.c b/lib/utils.c
index efaf377..9cd45e4 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -25,6 +25,7 @@
 #include <linux/pkt_sched.h>
 #include <time.h>
 #include <sys/time.h>
+#include <errno.h>
 
 
 #include "utils.h"
@@ -198,6 +199,24 @@ int get_u8(__u8 *val, const char *arg, int base)
 	return 0;
 }
 
+int get_s32(__s32 *val, const char *arg, int base)
+{
+	long res;
+	char *ptr;
+
+	errno = 0;
+
+	if (!arg || !*arg)
+		return -1;
+	res = strtol(arg, &ptr, base);
+	if (ptr == arg || *ptr ||
+	    ((res =  LONG_MIN || res == LONG_MAX) && errno == ERANGE) ||
+	    res > INT32_MAX || res < INT32_MIN)
+		return -1;
+	*val = res;
+	return 0;
+}
+
 int get_s16(__s16 *val, const char *arg, int base)
 {
 	long res;
-- 
1.7.7

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

* Re: [PATCH iproute2] utils: add s32 parser
  2011-11-25 23:00         ` [PATCH iproute2] " Hagen Paul Pfeifer
@ 2011-11-26  0:50           ` Stephen Hemminger
  2011-11-26 10:54             ` Hagen Paul Pfeifer
  0 siblings, 1 reply; 12+ messages in thread
From: Stephen Hemminger @ 2011-11-26  0:50 UTC (permalink / raw)
  To: Hagen Paul Pfeifer; +Cc: netdev, David.Laight

On Sat, 26 Nov 2011 00:00:26 +0100
Hagen Paul Pfeifer <hagen@jauu.net> wrote:

> Not sure if we should save errno and restore afterwards:
> 
> errno_save = errno;
> errno = 0;
> [...]
> errno = errno_save;

Not worth it. errno is only meaningful after a failed library or syscall.

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

* [PATCH iproute2] utils: add s32 parser
  2011-11-26  0:50           ` Stephen Hemminger
@ 2011-11-26 10:54             ` Hagen Paul Pfeifer
  0 siblings, 0 replies; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2011-11-26 10:54 UTC (permalink / raw)
  To: netdev; +Cc: David.Laight, Stephen Hemminger, Hagen Paul Pfeifer

Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>
---
 include/utils.h |    1 +
 lib/utils.c     |   19 +++++++++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/include/utils.h b/include/utils.h
index 47f8e07..496db68 100644
--- a/include/utils.h
+++ b/include/utils.h
@@ -85,6 +85,7 @@ extern int get_time_rtt(unsigned *val, const char *arg, int *raw);
 #define get_short get_s16
 extern int get_u64(__u64 *val, const char *arg, int base);
 extern int get_u32(__u32 *val, const char *arg, int base);
+extern int get_s32(__s32 *val, const char *arg, int base);
 extern int get_u16(__u16 *val, const char *arg, int base);
 extern int get_s16(__s16 *val, const char *arg, int base);
 extern int get_u8(__u8 *val, const char *arg, int base);
diff --git a/lib/utils.c b/lib/utils.c
index efaf377..d80f79b 100644
--- a/lib/utils.c
+++ b/lib/utils.c
@@ -25,6 +25,7 @@
 #include <linux/pkt_sched.h>
 #include <time.h>
 #include <sys/time.h>
+#include <errno.h>
 
 
 #include "utils.h"
@@ -198,6 +199,24 @@ int get_u8(__u8 *val, const char *arg, int base)
 	return 0;
 }
 
+int get_s32(__s32 *val, const char *arg, int base)
+{
+	long res;
+	char *ptr;
+
+	errno = 0;
+
+	if (!arg || !*arg)
+		return -1;
+	res = strtol(arg, &ptr, base);
+	if (ptr == arg || *ptr ||
+	    ((res ==  LONG_MIN || res == LONG_MAX) && errno == ERANGE) ||
+	    res > INT32_MAX || res < INT32_MIN)
+		return -1;
+	*val = res;
+	return 0;
+}
+
 int get_s16(__s16 *val, const char *arg, int base)
 {
 	long res;
-- 
1.7.7

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

* Re: [PATCH iproute2 1/2] utils: add s32 parser
  2011-11-24 17:40 [PATCH iproute2 1/2] utils: add s32 parser Hagen Paul Pfeifer
  2011-11-24 17:40 ` [PATCH iproute2 2/2] tc: netem ratelatency and cell extension Hagen Paul Pfeifer
  2011-11-25  9:46 ` [PATCH iproute2 1/2] utils: add s32 parser David Laight
@ 2012-01-19 22:41 ` Stephen Hemminger
  2012-01-19 22:48   ` Hagen Paul Pfeifer
  2 siblings, 1 reply; 12+ messages in thread
From: Stephen Hemminger @ 2012-01-19 22:41 UTC (permalink / raw)
  To: Hagen Paul Pfeifer; +Cc: netdev

On Thu, 24 Nov 2011 18:40:14 +0100
Hagen Paul Pfeifer <hagen@jauu.net> wrote:

> Signed-off-by: Hagen Paul Pfeifer <hagen@jauu.net>

All three patches applied to iproute2 git. Had to fix some merge conflict
and man page formatting issues.

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

* Re: [PATCH iproute2 1/2] utils: add s32 parser
  2012-01-19 22:41 ` [PATCH iproute2 1/2] " Stephen Hemminger
@ 2012-01-19 22:48   ` Hagen Paul Pfeifer
  0 siblings, 0 replies; 12+ messages in thread
From: Hagen Paul Pfeifer @ 2012-01-19 22:48 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: netdev

* Stephen Hemminger | 2012-01-19 14:41:38 [-0800]:

>All three patches applied to iproute2 git. Had to fix some merge conflict
>and man page formatting issues.

Thank you Stephen! I already rebased this patchset in my branch (mainly netem
manpage changes. To late ... ;-)

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

end of thread, other threads:[~2012-01-19 22:49 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-24 17:40 [PATCH iproute2 1/2] utils: add s32 parser Hagen Paul Pfeifer
2011-11-24 17:40 ` [PATCH iproute2 2/2] tc: netem ratelatency and cell extension Hagen Paul Pfeifer
2011-11-25  9:46 ` [PATCH iproute2 1/2] utils: add s32 parser David Laight
2011-11-25 11:13   ` Hagen Paul Pfeifer
2011-11-25 17:24   ` Stephen Hemminger
2011-11-25 17:34     ` David Laight
2011-11-25 17:47       ` Hagen Paul Pfeifer
2011-11-25 23:00         ` [PATCH iproute2] " Hagen Paul Pfeifer
2011-11-26  0:50           ` Stephen Hemminger
2011-11-26 10:54             ` Hagen Paul Pfeifer
2012-01-19 22:41 ` [PATCH iproute2 1/2] " Stephen Hemminger
2012-01-19 22:48   ` Hagen Paul Pfeifer

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).