From nobody@FreeBSD.org  Fri Oct  7 14:08:27 2011
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id D374C1065672
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  7 Oct 2011 14:08:27 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from red.freebsd.org (red.freebsd.org [IPv6:2001:4f8:fff6::22])
	by mx1.freebsd.org (Postfix) with ESMTP id B89238FC0C
	for <freebsd-gnats-submit@FreeBSD.org>; Fri,  7 Oct 2011 14:08:27 +0000 (UTC)
Received: from red.freebsd.org (localhost [127.0.0.1])
	by red.freebsd.org (8.14.4/8.14.4) with ESMTP id p97E8ReS091238
	for <freebsd-gnats-submit@FreeBSD.org>; Fri, 7 Oct 2011 14:08:27 GMT
	(envelope-from nobody@red.freebsd.org)
Received: (from nobody@localhost)
	by red.freebsd.org (8.14.4/8.14.4/Submit) id p97E8R6O091237;
	Fri, 7 Oct 2011 14:08:27 GMT
	(envelope-from nobody)
Message-Id: <201110071408.p97E8R6O091237@red.freebsd.org>
Date: Fri, 7 Oct 2011 14:08:27 GMT
From: Olivier Cochard-Labbe <olivier@cochard.me>
To: freebsd-gnats-submit@FreeBSD.org
Subject: [netrate] IPv6 patches for netblast/netsend/netreceive
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         161368
>Category:       bin
>Synopsis:       [netrate] [patch] IPv6 patches for netblast/netsend/netreceive
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          closed
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Fri Oct 07 14:10:07 UTC 2011
>Closed-Date:    Wed Nov 09 14:07:00 UTC 2011
>Last-Modified:  Wed Nov 09 14:07:00 UTC 2011
>Originator:     Olivier Cochard-Labbe
>Release:        -current
>Organization:
BSD Router Project
>Environment:
>Description:
Here are some patches that brings IPv6 support to netrate/[netblast|netsend|netreceive].
There are based on the -current (Revision 226095) code source.

>How-To-Repeat:

>Fix:


Patch attached with submission follows:

diff -ruN netrate.orig/netblast/netblast.c netrate/netblast/netblast.c
--- netrate.orig/netblast/netblast.c	2011-10-07 11:28:43.000000000 +0200
+++ netrate/netblast/netblast.c	2011-10-07 14:55:49.000000000 +0200
@@ -143,8 +143,9 @@
 {
 	long payloadsize, port, duration;
 	struct sockaddr_in sin;
+	struct sockaddr_in6 sin6;
 	char *dummy, *packet;
-	int s;
+	int s, ipv6;
 
 	if (argc != 5)
 		usage();
@@ -152,15 +153,38 @@
 	bzero(&sin, sizeof(sin));
 	sin.sin_len = sizeof(sin);
 	sin.sin_family = AF_INET;
-	if (inet_aton(argv[1], &sin.sin_addr) == 0) {
+
+	bzero(&sin6, sizeof(sin6));
+    sin6.sin6_len = sizeof(sin6);
+    sin6.sin6_family = AF_INET6;
+
+	if (inet_aton(argv[1], &sin.sin_addr) == 1) {
+		ipv6 = 0;
+	} else if (inet_pton(AF_INET6, argv[1], &sin6.sin6_addr) == 1) {
+		ipv6 = 1;
+		char *i;
+
+		i = strchr(argv[1], '%');
+		if (i != NULL) {
+			sin6.sin6_scope_id = if_nametoindex(i + 1);
+		}
+	} else {
 		perror(argv[1]);
+		fprintf(stderr, "Can't determine IP address type\n");
 		return (-1);
 	}
 
 	port = strtoul(argv[2], &dummy, 10);
-	if (port < 1 || port > 65535 || *dummy != '\0')
+	if (port < 1 || port > 65535 || *dummy != '\0') {
+		fprintf(stderr, "bad port number\n");
 		usage();
-	sin.sin_port = htons(port);
+	}
+
+	if (ipv6) {
+		sin6.sin6_port = htons(port);
+	} else {
+		sin.sin_port = htons(port);
+	}
 
 	payloadsize = strtoul(argv[3], &dummy, 10);
 	if (payloadsize < 0 || *dummy != '\0')
@@ -171,25 +195,39 @@
 	}
 
 	duration = strtoul(argv[4], &dummy, 10);
-	if (duration < 0 || *dummy != '\0')
+	if (duration < 0 || *dummy != '\0') {
+		fprintf(stderr, "bad duration\n");
 		usage();
+	}
 
 	packet = malloc(payloadsize);
 	if (packet == NULL) {
 		perror("malloc");
 		return (-1);
 	}
+
 	bzero(packet, payloadsize);
+	if (ipv6) {
+		s = socket(PF_INET6, SOCK_DGRAM, 0);
+	} else {
+		s = socket(PF_INET, SOCK_DGRAM, 0);
+	}
 
-	s = socket(PF_INET, SOCK_DGRAM, 0);
 	if (s == -1) {
 		perror("socket");
 		return (-1);
 	}
 
-	if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-		perror("connect");
-		return (-1);
+	if (ipv6) {
+		if (connect(s, (struct sockaddr *)&sin6, sizeof(sin6)) < 0) {
+            perror("ipv6 connect");
+            return (-1);
+        }
+	} else {
+		if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+			perror("ipv4 connect");
+			return (-1);
+		}
 	}
 
 	return (blast_loop(s, duration, packet, payloadsize));
diff -ruN netrate.orig/netreceive/netreceive.c netrate/netreceive/netreceive.c
--- netrate.orig/netreceive/netreceive.c	2011-10-07 15:18:48.000000000 +0200
+++ netrate/netreceive/netreceive.c	2011-10-07 15:45:28.000000000 +0200
@@ -50,9 +50,10 @@
 main(int argc, char *argv[])
 {
 	struct sockaddr_in sin;
+	struct sockaddr_in6 sin6;
 	char *dummy, *packet;
 	long port;
-	int s, v;
+	int s, s6, v;
 
 	if (argc != 2)
 		usage();
@@ -62,10 +63,16 @@
 	sin.sin_family = AF_INET;
 	sin.sin_addr.s_addr = htonl(INADDR_ANY);
 
+	bzero(&sin6, sizeof(sin6));
+    sin6.sin6_len = sizeof(sin6);
+    sin6.sin6_family = AF_INET6;
+    sin6.sin6_addr = in6addr_any;
+	
 	port = strtoul(argv[1], &dummy, 10);
 	if (port < 1 || port > 65535 || *dummy != '\0')
 		usage();
 	sin.sin_port = htons(port);
+	sin6.sin6_port = htons(port);
 
 	packet = malloc(65536);
 	if (packet == NULL) {
@@ -76,26 +83,43 @@
 
 	s = socket(PF_INET, SOCK_DGRAM, 0);
 	if (s == -1) {
-		perror("socket");
+		perror("socket (ipv4)");
 		return (-1);
 	}
 
+	s6 = socket(PF_INET6, SOCK_DGRAM, 0);
+    if (s == -1) {
+        perror("socket (ipv6)");
+        return (-1);
+    }
+
 	v = 128 * 1024;
 	if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)) < 0) {
-		perror("SO_RCVBUF");
+		perror("SO_RCVBUF (ipv4)");
 		return (-1);
 	}
+	if (setsockopt(s6, SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)) < 0) {
+        perror("SO_RCVBUF (ipv6)");
+        return (-1);
+    }
 
 	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
-		perror("bind");
+		perror("bind (ipv4)");
 		return (-1);
 	}
 
+	if (bind(s6, (struct sockaddr *)&sin6, sizeof(sin6)) < 0) {
+        perror("bind (ipv6)");
+        return (-1);
+    }
+
 	printf("netreceive listening on UDP port %d\n", (u_short)port);
 
 	while (1) {
 		if (recv(s, packet, 65536, 0) < 0)
-			perror("recv");
+			perror("recv (ipv4)");
+		if (recv(s6, packet, 65536, 0) < 0)
+            perror("recv (ipv6)");
 	}
 }
 
Files netrate.orig/netsend/netsend and netrate/netsend/netsend differ
diff -ruN netrate.orig/netsend/netsend.c netrate/netsend/netsend.c
--- netrate.orig/netsend/netsend.c	2011-10-07 14:48:07.000000000 +0200
+++ netrate/netsend/netsend.c	2011-10-07 15:12:49.000000000 +0200
@@ -43,10 +43,12 @@
 /* program arguments */
 struct _a {
 	int s;
+	int ipv6;
 	struct timespec interval;
 	int port, port_max;
 	long duration;
 	struct sockaddr_in sin;
+	struct sockaddr_in6 sin6;
 	int packet_len;
 	void *packet;
 };
@@ -179,9 +181,16 @@
 	ic = gettimeofday_cycles;
 	cur_port = a->port;
 	if (a->port == a->port_max) {
-		if (connect(a->s, (struct sockaddr *)&a->sin, sizeof(a->sin))) {
-			perror("connect");
-			return (-1);
+		if (a->ipv6) {
+			if (connect(a->s, (struct sockaddr *)&a->sin6, sizeof(a->sin6))) {
+                perror("connect (ipv6)");
+                return (-1);
+            }
+		} else {
+			if (connect(a->s, (struct sockaddr *)&a->sin, sizeof(a->sin))) {
+				perror("connect (ipv4)");
+				return (-1);
+			}
 		}
 	}
 	while (1) {
@@ -215,8 +224,13 @@
 			a->sin.sin_port = htons(cur_port++);
 			if (cur_port > a->port_max)
 				cur_port = a->port;
+			if (a->ipv6) {
+			ret = sendto(a->s, a->packet, a->packet_len, 0,
+                (struct sockaddr *)&a->sin6, sizeof(a->sin6));
+			} else {
 			ret = sendto(a->s, a->packet, a->packet_len, 0,
 				(struct sockaddr *)&a->sin, sizeof(a->sin));
+			}
 		}
 		if (ret < 0)
 			send_errors++;
@@ -262,8 +276,24 @@
 
 	a.sin.sin_len = sizeof(a.sin);
 	a.sin.sin_family = AF_INET;
-	if (inet_aton(argv[1], &a.sin.sin_addr) == 0) {
+
+	a.sin6.sin6_len = sizeof(a.sin6);
+    a.sin6.sin6_family = AF_INET6;
+
+	if (inet_aton(argv[1], &a.sin.sin_addr) == 1) {
+		a.ipv6 = 0;
+	} else if (inet_pton(AF_INET6, argv[1], &a.sin6.sin6_addr) == 1) {
+		a.ipv6 = 1;
+		char *i;
+
+        i = strchr(argv[1], '%');
+        if (i != NULL) {
+            a.sin6.sin6_scope_id = if_nametoindex(i + 1);
+        }
+
+	} else {
 		perror(argv[1]);
+		fprintf(stderr, "Can't determine IP address type\n");
 		return (-1);
 	}
 
@@ -272,7 +302,11 @@
 		usage();
 	if (*dummy != '\0' && *dummy != '-')
 		usage();
-	a.sin.sin_port = htons(port);
+	if (a.ipv6) {
+		a.sin6.sin6_port = htons(port);
+	} else {
+		a.sin.sin_port = htons(port);
+	}
 	a.port = a.port_max = port;
 	if (*dummy == '-') {	/* set high port */
 		port = strtoul(dummy + 1, &dummy, 10);
@@ -328,7 +362,11 @@
 	    "seconds\n", payloadsize, (intmax_t)a.interval.tv_sec,
 	    a.interval.tv_nsec, a.duration);
 
-	a.s = socket(PF_INET, SOCK_DGRAM, 0);
+	if (a.ipv6) {
+		a.s = socket(PF_INET6, SOCK_DGRAM, 0);
+	} else {
+		a.s = socket(PF_INET, SOCK_DGRAM, 0);
+	}
 	if (a.s == -1) {
 		perror("socket");
 		return (-1);


>Release-Note:
>Audit-Trail:

From: =?ISO-8859-1?Q?Olivier_Cochard=2DLabb=E9?= <olivier@cochard.me>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/161368: [netrate] IPv6 patches for netblast/netsend/netreceive
Date: Mon, 10 Oct 2011 02:03:38 +0200

 --0016364ee56409ba9d04aee68777
 Content-Type: text/plain; charset=ISO-8859-1
 
 Here is a new improvement for netblast that use getaddrinfo in place
 of sockaddr_in.
 I will modify netsend for using getaddrinfo too, but it's more complex.
 
 Regards,
 
 Olivier
 
 --0016364ee56409ba9d04aee68777
 Content-Type: text/plain; charset=US-ASCII; name="netblast.patch.diff.txt"
 Content-Disposition: attachment; filename="netblast.patch.diff.txt"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_gtkp43850
 
 LS0tIG5ldHJhdGUub3JpZy9uZXRibGFzdC9uZXRibGFzdC5jCTIwMTEtMTAtMDcgMTE6Mjg6NDMu
 MDAwMDAwMDAwICswMjAwCisrKyBuZXRyYXRlL25ldGJsYXN0L25ldGJsYXN0LmMJMjAxMS0xMC0x
 MCAwMTozNToxMS4wMDAwMDAwMDAgKzAyMDAKQEAgLTMyLDEzICszMiwxMyBAQAogI2luY2x1ZGUg
 PHN5cy90aW1lLmg+CiAKICNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLSNpbmNsdWRlIDxhcnBh
 L2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgkJCS8qIGdldGFkZHJpbmZvICovCiAKICNpbmNs
 dWRlIDxzaWduYWwuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgog
 I2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgkJCS8qIGNsb3NlICovCiAK
 IHN0YXRpYyB2b2lkCiB1c2FnZSh2b2lkKQpAQCAtMTQxLDI2ICsxNDEsMjYgQEAKIGludAogbWFp
 bihpbnQgYXJnYywgY2hhciAqYXJndltdKQogewotCWxvbmcgcGF5bG9hZHNpemUsIHBvcnQsIGR1
 cmF0aW9uOwotCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJbG9uZyBwYXlsb2Fkc2l6ZSwgZHVy
 YXRpb247CisJc3RydWN0IGFkZHJpbmZvIGhpbnRzLCAqcmVzLCAqcmVzMDsKIAljaGFyICpkdW1t
 eSwgKnBhY2tldDsKLQlpbnQgczsKKwlpbnQgcG9ydCwgcywgZXJyb3I7CisJY29uc3QgY2hhciAq
 Y2F1c2UgPSBOVUxMOwogCiAJaWYgKGFyZ2MgIT0gNSkKIAkJdXNhZ2UoKTsKIAotCWJ6ZXJvKCZz
 aW4sIHNpemVvZihzaW4pKTsKLQlzaW4uc2luX2xlbiA9IHNpemVvZihzaW4pOwotCXNpbi5zaW5f
 ZmFtaWx5ID0gQUZfSU5FVDsKLQlpZiAoaW5ldF9hdG9uKGFyZ3ZbMV0sICZzaW4uc2luX2FkZHIp
 ID09IDApIHsKLQkJcGVycm9yKGFyZ3ZbMV0pOwotCQlyZXR1cm4gKC0xKTsKLQl9CisJbWVtc2V0
 KCZoaW50cywgMCwgc2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVD
 OworCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19ER1JBTTsKKwloaW50cy5haV9wcm90b2NvbCA9
 IElQUFJPVE9fVURQOwogCiAJcG9ydCA9IHN0cnRvdWwoYXJndlsyXSwgJmR1bW15LCAxMCk7Ci0J
 aWYgKHBvcnQgPCAxIHx8IHBvcnQgPiA2NTUzNSB8fCAqZHVtbXkgIT0gJ1wwJykKKwlpZiAocG9y
 dCA8IDEgfHwgcG9ydCA+IDY1NTM1IHx8ICpkdW1teSAhPSAnXDAnKSB7CisJCWZwcmludGYoc3Rk
 ZXJyLCAiSW52YWxpZCBwb3J0IG51bWJlcjogJXNcbiIsIGFyZ3ZbMl0pOwogCQl1c2FnZSgpOwot
 CXNpbi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCQkvKk5PVFJFQUNIRUQqLworCX0KIAogCXBh
 eWxvYWRzaXplID0gc3RydG91bChhcmd2WzNdLCAmZHVtbXksIDEwKTsKIAlpZiAocGF5bG9hZHNp
 emUgPCAwIHx8ICpkdW1teSAhPSAnXDAnKQpAQCAtMTY4LDMwICsxNjgsNTQgQEAKIAlpZiAocGF5
 bG9hZHNpemUgPiAzMjc2OCkgewogCQlmcHJpbnRmKHN0ZGVyciwgInBheWxvYWRzaXplID4gMzI3
 NjhcbiIpOwogCQlyZXR1cm4gKC0xKTsKKwkJLypOT1RSRUFDSEVEKi8KIAl9CiAKIAlkdXJhdGlv
 biA9IHN0cnRvdWwoYXJndls0XSwgJmR1bW15LCAxMCk7Ci0JaWYgKGR1cmF0aW9uIDwgMCB8fCAq
 ZHVtbXkgIT0gJ1wwJykKKwlpZiAoZHVyYXRpb24gPCAwIHx8ICpkdW1teSAhPSAnXDAnKSB7CisJ
 CWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBkdXJhdGlvbiB0aW1lOiAlc1xuIiwgYXJndls0XSk7
 CiAJCXVzYWdlKCk7CisJCS8qTk9UUkVBQ0hFRCovCisJfQogCiAJcGFja2V0ID0gbWFsbG9jKHBh
 eWxvYWRzaXplKTsKIAlpZiAocGFja2V0ID09IE5VTEwpIHsKIAkJcGVycm9yKCJtYWxsb2MiKTsK
 IAkJcmV0dXJuICgtMSk7CisJCS8qTk9UUkVBQ0hFRCovCiAJfQorCiAJYnplcm8ocGFja2V0LCBw
 YXlsb2Fkc2l6ZSk7CisJZXJyb3IgPSBnZXRhZGRyaW5mbyhhcmd2WzFdLGFyZ3ZbMl0sICZoaW50
 cywgJnJlczApOworCWlmIChlcnJvcikgeworCQlwZXJyb3IoImdldGFkZHJpbmZvIik7CisJCXJl
 dHVybiAoLTEpOworCQkvKk5PVFJFQUNIRUQqLworCX0KKwlzID0gLTE7CisJZm9yIChyZXMgPSBy
 ZXMwOyByZXM7IHJlcyA9IHJlcy0+YWlfbmV4dCkgeworCQlzID0gc29ja2V0KHJlcy0+YWlfZmFt
 aWx5LCByZXMtPmFpX3NvY2t0eXBlLCAwKTsKKwkJaWYgKHMgPCAwKSB7CisJCQljYXVzZSA9ICJz
 b2NrZXQiOworCQkJY29udGludWU7CisJCX0KIAotCXMgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19E
 R1JBTSwgMCk7Ci0JaWYgKHMgPT0gLTEpIHsKLQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJcmV0dXJu
 ICgtMSk7Ci0JfQorCQlpZiAoY29ubmVjdChzLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxl
 bikgPCAwKSB7CisJCQljYXVzZSA9ICJjb25uZWN0IjsKKwkJCWNsb3NlKHMpOworCQkJcyA9IC0x
 OworCQkJY29udGludWU7CisJCX0KIAotCWlmIChjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIg
 Kikmc2luLCBzaXplb2Yoc2luKSkgPCAwKSB7Ci0JCXBlcnJvcigiY29ubmVjdCIpOworCQlicmVh
 azsgIC8qIG9rYXkgd2UgZ290IG9uZSAqLworCX0KKwlpZiAocyA8IDApIHsKKwkJcGVycm9yKGNh
 dXNlKTsKIAkJcmV0dXJuICgtMSk7CisJCS8qTk9UUkVBQ0hFRCovCiAJfQogCiAJcmV0dXJuIChi
 bGFzdF9sb29wKHMsIGR1cmF0aW9uLCBwYWNrZXQsIHBheWxvYWRzaXplKSk7CisKIH0KIAo=
 --0016364ee56409ba9d04aee68777--

From: =?ISO-8859-1?Q?Olivier_Cochard=2DLabb=E9?= <olivier@cochard.me>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: bin/161368: [netrate] IPv6 patches for netblast/netsend/netreceive
Date: Mon, 17 Oct 2011 14:15:16 +0200

 --001636499b7785d46104af7d9057
 Content-Type: text/plain; charset=ISO-8859-1
 
 OK here are the last version of my patches.
 About netsend.c: I can't use getaddrinfo because it changes the port
 number without creating a new socket.
 
 Regards,
 
 Olivier
 
 --001636499b7785d46104af7d9057
 Content-Type: text/plain; charset=US-ASCII; name="netrate.ipv6.patch.txt"
 Content-Disposition: attachment; filename="netrate.ipv6.patch.txt"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_gtvfdf8q0
 
 ZGlmZiAtcnVOIG5ldHJhdGUub3JpZy9uZXRibGFzdC9uZXRibGFzdC5jIG5ldHJhdGUvbmV0Ymxh
 c3QvbmV0Ymxhc3QuYwotLS0gbmV0cmF0ZS5vcmlnL25ldGJsYXN0L25ldGJsYXN0LmMJMjAxMS0x
 MC0wNyAxMToyODo0My4wMDAwMDAwMDAgKzAyMDAKKysrIG5ldHJhdGUvbmV0Ymxhc3QvbmV0Ymxh
 c3QuYwkyMDExLTEwLTEyIDIyOjI2OjUxLjAwMDAwMDAwMCArMDIwMApAQCAtMzIsMTMgKzMyLDEz
 IEBACiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KLQot
 I2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGRiLmg+CQkJLyogZ2V0YWRkcmlu
 Zm8gKi8KIAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVk
 ZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CQkJ
 LyogY2xvc2UgKi8KIAogc3RhdGljIHZvaWQKIHVzYWdlKHZvaWQpCkBAIC0xNDEsMjYgKzE0MSwy
 NSBAQAogaW50CiBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiB7Ci0JbG9uZyBwYXlsb2Fk
 c2l6ZSwgcG9ydCwgZHVyYXRpb247Ci0Jc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlsb25nIHBh
 eWxvYWRzaXplLCBkdXJhdGlvbjsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICpyZXMsICpyZXMw
 OwogCWNoYXIgKmR1bW15LCAqcGFja2V0OwotCWludCBzOworCWludCBwb3J0LCBzLCBlcnJvcjsK
 Kwljb25zdCBjaGFyICpjYXVzZSA9IE5VTEw7CiAKIAlpZiAoYXJnYyAhPSA1KQogCQl1c2FnZSgp
 OwogCi0JYnplcm8oJnNpbiwgc2l6ZW9mKHNpbikpOwotCXNpbi5zaW5fbGVuID0gc2l6ZW9mKHNp
 bik7Ci0Jc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWlmIChpbmV0X2F0b24oYXJndlsxXSwg
 JnNpbi5zaW5fYWRkcikgPT0gMCkgewotCQlwZXJyb3IoYXJndlsxXSk7Ci0JCXJldHVybiAoLTEp
 OwotCX0KKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YoaGludHMpKTsKKwloaW50cy5haV9mYW1p
 bHkgPSBQRl9VTlNQRUM7CisJaGludHMuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwogCiAJcG9y
 dCA9IHN0cnRvdWwoYXJndlsyXSwgJmR1bW15LCAxMCk7Ci0JaWYgKHBvcnQgPCAxIHx8IHBvcnQg
 PiA2NTUzNSB8fCAqZHVtbXkgIT0gJ1wwJykKKwlpZiAocG9ydCA8IDEgfHwgcG9ydCA+IDY1NTM1
 IHx8ICpkdW1teSAhPSAnXDAnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwb3J0IG51
 bWJlcjogJXNcbiIsIGFyZ3ZbMl0pOwogCQl1c2FnZSgpOwotCXNpbi5zaW5fcG9ydCA9IGh0b25z
 KHBvcnQpOworCQkvKk5PVFJFQUNIRUQqLworCX0KIAogCXBheWxvYWRzaXplID0gc3RydG91bChh
 cmd2WzNdLCAmZHVtbXksIDEwKTsKIAlpZiAocGF5bG9hZHNpemUgPCAwIHx8ICpkdW1teSAhPSAn
 XDAnKQpAQCAtMTY4LDMwICsxNjcsNTYgQEAKIAlpZiAocGF5bG9hZHNpemUgPiAzMjc2OCkgewog
 CQlmcHJpbnRmKHN0ZGVyciwgInBheWxvYWRzaXplID4gMzI3NjhcbiIpOwogCQlyZXR1cm4gKC0x
 KTsKKwkJLypOT1RSRUFDSEVEKi8KIAl9CiAKIAlkdXJhdGlvbiA9IHN0cnRvdWwoYXJndls0XSwg
 JmR1bW15LCAxMCk7Ci0JaWYgKGR1cmF0aW9uIDwgMCB8fCAqZHVtbXkgIT0gJ1wwJykKKwlpZiAo
 ZHVyYXRpb24gPCAwIHx8ICpkdW1teSAhPSAnXDAnKSB7CisJCWZwcmludGYoc3RkZXJyLCAiSW52
 YWxpZCBkdXJhdGlvbiB0aW1lOiAlc1xuIiwgYXJndls0XSk7CiAJCXVzYWdlKCk7CisJCS8qTk9U
 UkVBQ0hFRCovCisJfQogCiAJcGFja2V0ID0gbWFsbG9jKHBheWxvYWRzaXplKTsKIAlpZiAocGFj
 a2V0ID09IE5VTEwpIHsKIAkJcGVycm9yKCJtYWxsb2MiKTsKIAkJcmV0dXJuICgtMSk7CisJCS8q
 Tk9UUkVBQ0hFRCovCiAJfQorCiAJYnplcm8ocGFja2V0LCBwYXlsb2Fkc2l6ZSk7CisJZXJyb3Ig
 PSBnZXRhZGRyaW5mbyhhcmd2WzFdLGFyZ3ZbMl0sICZoaW50cywgJnJlczApOworCWlmIChlcnJv
 cikgeworCQlwZXJyb3IoZ2FpX3N0cmVycm9yKGVycm9yKSk7CisJCXJldHVybiAoLTEpOworCQkv
 Kk5PVFJFQUNIRUQqLworCX0KKwlzID0gLTE7CisJZm9yIChyZXMgPSByZXMwOyByZXM7IHJlcyA9
 IHJlcy0+YWlfbmV4dCkgeworCQlzID0gc29ja2V0KHJlcy0+YWlfZmFtaWx5LCByZXMtPmFpX3Nv
 Y2t0eXBlLCAwKTsKKwkJaWYgKHMgPCAwKSB7CisJCQljYXVzZSA9ICJzb2NrZXQiOworCQkJY29u
 dGludWU7CisJCX0KIAotCXMgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0JaWYg
 KHMgPT0gLTEpIHsKLQkJcGVycm9yKCJzb2NrZXQiKTsKLQkJcmV0dXJuICgtMSk7Ci0JfQorCQlp
 ZiAoY29ubmVjdChzLCByZXMtPmFpX2FkZHIsIHJlcy0+YWlfYWRkcmxlbikgPCAwKSB7CisJCQlj
 YXVzZSA9ICJjb25uZWN0IjsKKwkJCWNsb3NlKHMpOworCQkJcyA9IC0xOworCQkJY29udGludWU7
 CisJCX0KIAotCWlmIChjb25uZWN0KHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yo
 c2luKSkgPCAwKSB7Ci0JCXBlcnJvcigiY29ubmVjdCIpOworCQlicmVhazsgIC8qIG9rYXkgd2Ug
 Z290IG9uZSAqLworCX0KKwlpZiAocyA8IDApIHsKKwkJcGVycm9yKGNhdXNlKTsKIAkJcmV0dXJu
 ICgtMSk7CisJCS8qTk9UUkVBQ0hFRCovCiAJfQogCisJLyogQSBjbGVhbiBjb2RlIHNob3VsZCBp
 bmNsdWRlIGEgZnJlZWFkZHJpbmZvKHJlczApIGJlZm9yZSB0aGUgcmV0dXJuICovCisKIAlyZXR1
 cm4gKGJsYXN0X2xvb3AocywgZHVyYXRpb24sIHBhY2tldCwgcGF5bG9hZHNpemUpKTsKKwogfQog
 CmRpZmYgLXJ1TiBuZXRyYXRlLm9yaWcvbmV0cmVjZWl2ZS9uZXRyZWNlaXZlLmMgbmV0cmF0ZS9u
 ZXRyZWNlaXZlL25ldHJlY2VpdmUuYwotLS0gbmV0cmF0ZS5vcmlnL25ldHJlY2VpdmUvbmV0cmVj
 ZWl2ZS5jCTIwMTEtMTAtMDcgMTU6MTg6NDguMDAwMDAwMDAwICswMjAwCisrKyBuZXRyYXRlL25l
 dHJlY2VpdmUvbmV0cmVjZWl2ZS5jCTIwMTEtMTAtMTEgMTY6Mzk6MTUuMDAwMDAwMDAwICswMjAw
 CkBAIC0zMSwxMiArMzEsMTYgQEAKICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCiAjaW5jbHVkZSA8
 bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGRiLmg+ICAgICAgICAgIC8qIGdldGFkZHJpbmZv
 ICovCiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5j
 bHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+
 ICAgICAgICAgLyogY2xvc2UgKi8KKworI2RlZmluZSBNQVhTT0NLIDIwCiAKIHN0YXRpYyB2b2lk
 CiB1c2FnZSh2b2lkKQpAQCAtNDksMjMgKzUzLDI1IEBACiBpbnQKIG1haW4oaW50IGFyZ2MsIGNo
 YXIgKmFyZ3ZbXSkKIHsKLQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCXN0cnVjdCBhZGRyaW5m
 byBoaW50cywgKnJlcywgKnJlczA7CiAJY2hhciAqZHVtbXksICpwYWNrZXQ7Ci0JbG9uZyBwb3J0
 OwotCWludCBzLCB2OworCWludCBwb3J0OworCWludCBlcnJvciwgdiwgaTsKKwljb25zdCBjaGFy
 ICpjYXVzZSA9IE5VTEw7CisJaW50IHNbTUFYU09DS107CisJaW50IG5zb2NrOwogCiAJaWYgKGFy
 Z2MgIT0gMikKIAkJdXNhZ2UoKTsKIAotCWJ6ZXJvKCZzaW4sIHNpemVvZihzaW4pKTsKLQlzaW4u
 c2luX2xlbiA9IHNpemVvZihzaW4pOwotCXNpbi5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKLQlzaW4u
 c2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7CisJbWVtc2V0KCZoaW50cywgMCwg
 c2l6ZW9mKGhpbnRzKSk7CisJaGludHMuYWlfZmFtaWx5ID0gUEZfVU5TUEVDOworCWhpbnRzLmFp
 X3NvY2t0eXBlID0gU09DS19ER1JBTTsKKwloaW50cy5haV9mbGFncyA9IEFJX1BBU1NJVkU7CiAK
 IAlwb3J0ID0gc3RydG91bChhcmd2WzFdLCAmZHVtbXksIDEwKTsKIAlpZiAocG9ydCA8IDEgfHwg
 cG9ydCA+IDY1NTM1IHx8ICpkdW1teSAhPSAnXDAnKQogCQl1c2FnZSgpOwotCXNpbi5zaW5fcG9y
 dCA9IGh0b25zKHBvcnQpOwogCiAJcGFja2V0ID0gbWFsbG9jKDY1NTM2KTsKIAlpZiAocGFja2V0
 ID09IE5VTEwpIHsKQEAgLTc0LDI4ICs4MCw1MyBAQAogCX0KIAliemVybyhwYWNrZXQsIDY1NTM2
 KTsKIAotCXMgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7Ci0JaWYgKHMgPT0gLTEp
 IHsKLQkJcGVycm9yKCJzb2NrZXQiKTsKKwllcnJvciA9IGdldGFkZHJpbmZvKE5VTEwsIGFyZ3Zb
 MV0sICZoaW50cywgJnJlczApOworCWlmIChlcnJvcikgeworCQlwZXJyb3IoZ2FpX3N0cmVycm9y
 KGVycm9yKSk7CiAJCXJldHVybiAoLTEpOworCQkvKk5PVFJFQUNIRUQqLwogCX0KIAotCXYgPSAx
 MjggKiAxMDI0OwotCWlmIChzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnYs
 IHNpemVvZih2KSkgPCAwKSB7Ci0JCXBlcnJvcigiU09fUkNWQlVGIik7Ci0JCXJldHVybiAoLTEp
 OwotCX0KKwluc29jayA9IDA7CisJZm9yIChyZXMgPSByZXMwOyByZXMgJiYgbnNvY2sgPCBNQVhT
 T0NLOyByZXMgPSByZXMtPmFpX25leHQpIHsKKwkJc1tuc29ja10gPSBzb2NrZXQocmVzLT5haV9m
 YW1pbHksIHJlcy0+YWlfc29ja3R5cGUsCisJCXJlcy0+YWlfcHJvdG9jb2wpOworCQlpZiAoc1tu
 c29ja10gPCAwKSB7CisJCQljYXVzZSA9ICJzb2NrZXQiOworCQkJY29udGludWU7CisJCX0KKwor
 CQl2ID0gMTI4ICogMTAyNDsKKwkJaWYgKHNldHNvY2tvcHQoc1tuc29ja10sIFNPTF9TT0NLRVQs
 IFNPX1JDVkJVRiwgJnYsIHNpemVvZih2KSkgPCAwKSB7CisgICAgICAgIAljYXVzZSA9ICJTT19S
 Q1ZCVUYiOworICAgICAgICAgICAgY2xvc2Uoc1tuc29ja10pOworICAgICAgICAJY29udGludWU7
 CisJCX0KKwkJaWYgKGJpbmQoc1tuc29ja10sIHJlcy0+YWlfYWRkciwgcmVzLT5haV9hZGRybGVu
 KSA8IDApIHsKKwkJCWNhdXNlID0gImJpbmQiOworCQkJY2xvc2Uoc1tuc29ja10pOworCQkJY29u
 dGludWU7CisJCX0KKwkJKHZvaWQpIGxpc3RlbihzW25zb2NrXSwgNSk7CiAKLQlpZiAoYmluZChz
 LCAoc3RydWN0IHNvY2thZGRyICopJnNpbiwgc2l6ZW9mKHNpbikpIDwgMCkgewotCQlwZXJyb3Io
 ImJpbmQiKTsKKwkJbnNvY2srKzsKKwl9CisJaWYgKG5zb2NrID09IDApIHsKKwkJcGVycm9yKGNh
 dXNlKTsKIAkJcmV0dXJuICgtMSk7CisJCS8qTk9UUkVBQ0hFRCovCiAJfQogCiAJcHJpbnRmKCJu
 ZXRyZWNlaXZlIGxpc3RlbmluZyBvbiBVRFAgcG9ydCAlZFxuIiwgKHVfc2hvcnQpcG9ydCk7CiAK
 IAl3aGlsZSAoMSkgewotCQlpZiAocmVjdihzLCBwYWNrZXQsIDY1NTM2LCAwKSA8IDApCi0JCQlw
 ZXJyb3IoInJlY3YiKTsKKwkJZm9yIChpID0gMDsgaSA+IG5zb2NrOyBpKyspIHsKKwkJCWlmIChy
 ZWN2KHNbaV0sIHBhY2tldCwgNjU1MzYsIDApIDwgMCkKKwkJCQlwZXJyb3IoInJlY3YiKTsKKwkJ
 fQogCX0KKwkKKwkvKk5PVFJFQUNIRUQqLworCWZyZWVhZGRyaW5mbyhyZXMwKTsKIH0KIApkaWZm
 IC1ydU4gbmV0cmF0ZS5vcmlnL25ldHNlbmQvbmV0c2VuZC5jIG5ldHJhdGUvbmV0c2VuZC9uZXRz
 ZW5kLmMKLS0tIG5ldHJhdGUub3JpZy9uZXRzZW5kL25ldHNlbmQuYwkyMDExLTEwLTA3IDE0OjQ4
 OjA3LjAwMDAwMDAwMCArMDIwMAorKysgbmV0cmF0ZS9uZXRzZW5kL25ldHNlbmQuYwkyMDExLTEw
 LTE3IDEyOjM2OjEzLjAwMDAwMDAwMCArMDIwMApAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUg
 PHN5cy9lbmRpYW4uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc29j
 a2V0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CQkvKiBpZl9uYW1ldG9pbmRleCgpICovCiAjaW5j
 bHVkZSA8c3lzL3RpbWUuaD4KIAogI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KQEAgLTQzLDEwICs0
 NCwxMiBAQAogLyogcHJvZ3JhbSBhcmd1bWVudHMgKi8KIHN0cnVjdCBfYSB7CiAJaW50IHM7CisJ
 aW50IGlwdjY7CiAJc3RydWN0IHRpbWVzcGVjIGludGVydmFsOwogCWludCBwb3J0LCBwb3J0X21h
 eDsKIAlsb25nIGR1cmF0aW9uOwogCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJc3RydWN0IHNv
 Y2thZGRyX2luNiBzaW42OwogCWludCBwYWNrZXRfbGVuOwogCXZvaWQgKnBhY2tldDsKIH07CkBA
 IC0xNzksOSArMTgyLDE2IEBACiAJaWMgPSBnZXR0aW1lb2ZkYXlfY3ljbGVzOwogCWN1cl9wb3J0
 ID0gYS0+cG9ydDsKIAlpZiAoYS0+cG9ydCA9PSBhLT5wb3J0X21heCkgewotCQlpZiAoY29ubmVj
 dChhLT5zLCAoc3RydWN0IHNvY2thZGRyICopJmEtPnNpbiwgc2l6ZW9mKGEtPnNpbikpKSB7Ci0J
 CQlwZXJyb3IoImNvbm5lY3QiKTsKLQkJCXJldHVybiAoLTEpOworCQlpZiAoYS0+aXB2Nikgewor
 CQkJaWYgKGNvbm5lY3QoYS0+cywgKHN0cnVjdCBzb2NrYWRkciAqKSZhLT5zaW42LCBzaXplb2Yo
 YS0+c2luNikpKSB7CisgICAgICAgICAgICAgICAgcGVycm9yKCJjb25uZWN0IChpcHY2KSIpOwor
 ICAgICAgICAgICAgICAgIHJldHVybiAoLTEpOworICAgICAgICAgICAgfQorCQl9IGVsc2Ugewor
 CQkJaWYgKGNvbm5lY3QoYS0+cywgKHN0cnVjdCBzb2NrYWRkciAqKSZhLT5zaW4sIHNpemVvZihh
 LT5zaW4pKSkgeworCQkJCXBlcnJvcigiY29ubmVjdCAoaXB2NCkiKTsKKwkJCQlyZXR1cm4gKC0x
 KTsKKwkJCX0KIAkJfQogCX0KIAl3aGlsZSAoMSkgewpAQCAtMjE1LDggKzIyNSwxMyBAQAogCQkJ
 YS0+c2luLnNpbl9wb3J0ID0gaHRvbnMoY3VyX3BvcnQrKyk7CiAJCQlpZiAoY3VyX3BvcnQgPiBh
 LT5wb3J0X21heCkKIAkJCQljdXJfcG9ydCA9IGEtPnBvcnQ7CisJCQlpZiAoYS0+aXB2Nikgewor
 CQkJcmV0ID0gc2VuZHRvKGEtPnMsIGEtPnBhY2tldCwgYS0+cGFja2V0X2xlbiwgMCwKKyAgICAg
 ICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJmEtPnNpbjYsIHNpemVvZihhLT5zaW42KSk7
 CisJCQl9IGVsc2UgewogCQkJcmV0ID0gc2VuZHRvKGEtPnMsIGEtPnBhY2tldCwgYS0+cGFja2V0
 X2xlbiwgMCwKIAkJCQkoc3RydWN0IHNvY2thZGRyICopJmEtPnNpbiwgc2l6ZW9mKGEtPnNpbikp
 OworCQkJfQogCQl9CiAJCWlmIChyZXQgPCAwKQogCQkJc2VuZF9lcnJvcnMrKzsKQEAgLTI1Myw2
 ICsyNjgsNyBAQAogewogCWxvbmcgcmF0ZSwgcGF5bG9hZHNpemUsIHBvcnQ7CiAJY2hhciAqZHVt
 bXk7CisJY2hhciAqaTsKIAlzdHJ1Y3QgX2EgYTsJLyogYXJndW1lbnRzICovCiAKIAliemVybygm
 YSwgc2l6ZW9mKGEpKTsKQEAgLTI2Miw4ICsyNzgsMjUgQEAKIAogCWEuc2luLnNpbl9sZW4gPSBz
 aXplb2YoYS5zaW4pOwogCWEuc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCWlmIChpbmV0X2F0
 b24oYXJndlsxXSwgJmEuc2luLnNpbl9hZGRyKSA9PSAwKSB7CisKKwlhLnNpbjYuc2luNl9sZW4g
 PSBzaXplb2YoYS5zaW42KTsKKyAgICBhLnNpbjYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwor
 CS8qIFRyeSB0byBkZXRlY3QgaWYgaXQncyBhbiBJUHY0IG9uIElQdjYgYWRkcmVzcyAqLworCWkg
 PSBzdHJjaHIoYXJndlsxXSwgJyUnKTsKKwlpZiAoaSAhPSBOVUxMKSB7CisJCWEuc2luNi5zaW42
 X3Njb3BlX2lkID0gaWZfbmFtZXRvaW5kZXgoaSsxKTsKKwkJY2hhciAqaXA7CisJCWlwID0gIHN0
 cmR1cChhcmd2WzFdKTsKKwkJYXJndlsxXSA9IHN0cnNlcCgmaXAsICIlIik7CisJfQorCWlmIChp
 bmV0X2F0b24oYXJndlsxXSwgJmEuc2luLnNpbl9hZGRyKSA9PSAxKSB7CisJCWEuaXB2NiA9IDA7
 CisJfSBlbHNlIGlmIChpbmV0X3B0b24oQUZfSU5FVDYsIGFyZ3ZbMV0sICZhLnNpbjYuc2luNl9h
 ZGRyKSA9PSAxKSB7CisJCWEuaXB2NiA9IDE7CisJfSBlbHNlIHsKIAkJcGVycm9yKGFyZ3ZbMV0p
 OworCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGRldGVybWluZSBJUCBhZGRyZXNzIHR5cGVcbiIp
 OwogCQlyZXR1cm4gKC0xKTsKIAl9CiAKQEAgLTI3Miw3ICszMDUsMTEgQEAKIAkJdXNhZ2UoKTsK
 IAlpZiAoKmR1bW15ICE9ICdcMCcgJiYgKmR1bW15ICE9ICctJykKIAkJdXNhZ2UoKTsKLQlhLnNp
 bi5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOworCWlmIChhLmlwdjYpIHsKKwkJYS5zaW42LnNpbjZf
 cG9ydCA9IGh0b25zKHBvcnQpOworCX0gZWxzZSB7CisJCWEuc2luLnNpbl9wb3J0ID0gaHRvbnMo
 cG9ydCk7CisJfQogCWEucG9ydCA9IGEucG9ydF9tYXggPSBwb3J0OwogCWlmICgqZHVtbXkgPT0g
 Jy0nKSB7CS8qIHNldCBoaWdoIHBvcnQgKi8KIAkJcG9ydCA9IHN0cnRvdWwoZHVtbXkgKyAxLCAm
 ZHVtbXksIDEwKTsKQEAgLTMyOCw3ICszNjUsMTEgQEAKIAkgICAgInNlY29uZHNcbiIsIHBheWxv
 YWRzaXplLCAoaW50bWF4X3QpYS5pbnRlcnZhbC50dl9zZWMsCiAJICAgIGEuaW50ZXJ2YWwudHZf
 bnNlYywgYS5kdXJhdGlvbik7CiAKLQlhLnMgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwg
 MCk7CisJaWYgKGEuaXB2NikgeworCQlhLnMgPSBzb2NrZXQoUEZfSU5FVDYsIFNPQ0tfREdSQU0s
 IDApOworCX0gZWxzZSB7CisJCWEucyA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsK
 Kwl9CiAJaWYgKGEucyA9PSAtMSkgewogCQlwZXJyb3IoInNvY2tldCIpOwogCQlyZXR1cm4gKC0x
 KTsK
 --001636499b7785d46104af7d9057--

From: dfilter@FreeBSD.ORG (dfilter service)
To: bug-followup@FreeBSD.org
Cc:  
Subject: Re: bin/161368: commit references a PR
Date: Tue,  8 Nov 2011 17:23:54 +0000 (UTC)

 Author: cognet
 Date: Tue Nov  8 17:23:43 2011
 New Revision: 227345
 URL: http://svn.freebsd.org/changeset/base/227345
 
 Log:
   Add IPv6 support to netblast/netsend/netreceive
   
   PR:		bin/161368
   Submitted by:	Olivier Cochard-Labbe <olivier AT cochard doT me>
 
 Modified:
   head/tools/tools/netrate/netblast/netblast.c
   head/tools/tools/netrate/netreceive/netreceive.c
   head/tools/tools/netrate/netsend/netsend.c
 
 Modified: head/tools/tools/netrate/netblast/netblast.c
 ==============================================================================
 --- head/tools/tools/netrate/netblast/netblast.c	Tue Nov  8 17:08:12 2011	(r227344)
 +++ head/tools/tools/netrate/netblast/netblast.c	Tue Nov  8 17:23:43 2011	(r227345)
 @@ -32,13 +32,13 @@
  #include <sys/time.h>
  
  #include <netinet/in.h>
 -
 -#include <arpa/inet.h>
 +#include <netdb.h>			/* getaddrinfo */
  
  #include <signal.h>
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <unistd.h>			/* close */
  
  static void
  usage(void)
 @@ -141,26 +141,25 @@ blast_loop(int s, long duration, u_char 
  int
  main(int argc, char *argv[])
  {
 -	long payloadsize, port, duration;
 -	struct sockaddr_in sin;
 +	long payloadsize, duration;
 +	struct addrinfo hints, *res, *res0;
  	char *dummy, *packet;
 -	int s;
 +	int port, s, error;
 +	const char *cause = NULL;
  
  	if (argc != 5)
  		usage();
  
 -	bzero(&sin, sizeof(sin));
 -	sin.sin_len = sizeof(sin);
 -	sin.sin_family = AF_INET;
 -	if (inet_aton(argv[1], &sin.sin_addr) == 0) {
 -		perror(argv[1]);
 -		return (-1);
 -	}
 +	memset(&hints, 0, sizeof(hints));
 +	hints.ai_family = PF_UNSPEC;
 +	hints.ai_socktype = SOCK_DGRAM;
  
  	port = strtoul(argv[2], &dummy, 10);
 -	if (port < 1 || port > 65535 || *dummy != '\0')
 +	if (port < 1 || port > 65535 || *dummy != '\0') {
 +		fprintf(stderr, "Invalid port number: %s\n", argv[2]);
  		usage();
 -	sin.sin_port = htons(port);
 +		/*NOTREACHED*/
 +	}
  
  	payloadsize = strtoul(argv[3], &dummy, 10);
  	if (payloadsize < 0 || *dummy != '\0')
 @@ -168,29 +167,55 @@ main(int argc, char *argv[])
  	if (payloadsize > 32768) {
  		fprintf(stderr, "payloadsize > 32768\n");
  		return (-1);
 +		/*NOTREACHED*/
  	}
  
  	duration = strtoul(argv[4], &dummy, 10);
 -	if (duration < 0 || *dummy != '\0')
 +	if (duration < 0 || *dummy != '\0') {
 +		fprintf(stderr, "Invalid duration time: %s\n", argv[4]);
  		usage();
 +		/*NOTREACHED*/
 +	}
  
  	packet = malloc(payloadsize);
  	if (packet == NULL) {
  		perror("malloc");
  		return (-1);
 +		/*NOTREACHED*/
  	}
 +
  	bzero(packet, payloadsize);
 +	error = getaddrinfo(argv[1],argv[2], &hints, &res0);
 +	if (error) {
 +		perror(gai_strerror(error));
 +		return (-1);
 +		/*NOTREACHED*/
 +	}
 +	s = -1;
 +	for (res = res0; res; res = res->ai_next) {
 +		s = socket(res->ai_family, res->ai_socktype, 0);
 +		if (s < 0) {
 +			cause = "socket";
 +			continue;
 +		}
  
 -	s = socket(PF_INET, SOCK_DGRAM, 0);
 -	if (s == -1) {
 -		perror("socket");
 -		return (-1);
 -	}
 +		if (connect(s, res->ai_addr, res->ai_addrlen) < 0) {
 +			cause = "connect";
 +			close(s);
 +			s = -1;
 +			continue;
 +		}
  
 -	if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
 -		perror("connect");
 +		break;  /* okay we got one */
 +	}
 +	if (s < 0) {
 +		perror(cause);
  		return (-1);
 +		/*NOTREACHED*/
  	}
  
 +	freeaddrinfo(res0);
 +
  	return (blast_loop(s, duration, packet, payloadsize));
 +
  }
 
 Modified: head/tools/tools/netrate/netreceive/netreceive.c
 ==============================================================================
 --- head/tools/tools/netrate/netreceive/netreceive.c	Tue Nov  8 17:08:12 2011	(r227344)
 +++ head/tools/tools/netrate/netreceive/netreceive.c	Tue Nov  8 17:23:43 2011	(r227345)
 @@ -29,14 +29,19 @@
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <sys/time.h>
 +#include <sys/poll.h>
  
  #include <netinet/in.h>
 +#include <netdb.h>          /* getaddrinfo */
  
  #include <arpa/inet.h>
  
  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
 +#include <unistd.h>         /* close */
 +
 +#define MAXSOCK 20
  
  static void
  usage(void)
 @@ -49,23 +54,26 @@ usage(void)
  int
  main(int argc, char *argv[])
  {
 -	struct sockaddr_in sin;
 +	struct addrinfo hints, *res, *res0;
  	char *dummy, *packet;
 -	long port;
 -	int s, v;
 +	int port;
 +	int error, v, i;
 +	const char *cause = NULL;
 +	int s[MAXSOCK];
 +	struct pollfd fds[MAXSOCK];
 +	int nsock;
  
  	if (argc != 2)
  		usage();
  
 -	bzero(&sin, sizeof(sin));
 -	sin.sin_len = sizeof(sin);
 -	sin.sin_family = AF_INET;
 -	sin.sin_addr.s_addr = htonl(INADDR_ANY);
 +	memset(&hints, 0, sizeof(hints));
 +	hints.ai_family = PF_UNSPEC;
 +	hints.ai_socktype = SOCK_DGRAM;
 +	hints.ai_flags = AI_PASSIVE;
  
  	port = strtoul(argv[1], &dummy, 10);
  	if (port < 1 || port > 65535 || *dummy != '\0')
  		usage();
 -	sin.sin_port = htons(port);
  
  	packet = malloc(65536);
  	if (packet == NULL) {
 @@ -74,27 +82,60 @@ main(int argc, char *argv[])
  	}
  	bzero(packet, 65536);
  
 -	s = socket(PF_INET, SOCK_DGRAM, 0);
 -	if (s == -1) {
 -		perror("socket");
 +	error = getaddrinfo(NULL, argv[1], &hints, &res0);
 +	if (error) {
 +		perror(gai_strerror(error));
  		return (-1);
 +		/*NOTREACHED*/
  	}
  
 -	v = 128 * 1024;
 -	if (setsockopt(s, SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)) < 0) {
 -		perror("SO_RCVBUF");
 -		return (-1);
 -	}
 +	nsock = 0;
 +	for (res = res0; res && nsock < MAXSOCK; res = res->ai_next) {
 +		s[nsock] = socket(res->ai_family, res->ai_socktype,
 +		res->ai_protocol);
 +		if (s[nsock] < 0) {
 +			cause = "socket";
 +			continue;
 +		}
 +
 +		v = 128 * 1024;
 +		if (setsockopt(s[nsock], SOL_SOCKET, SO_RCVBUF, &v, sizeof(v)) < 0) {
 +			cause = "SO_RCVBUF";
 +			close(s[nsock]);
 +			continue;
 +		}
 +		if (bind(s[nsock], res->ai_addr, res->ai_addrlen) < 0) {
 +			cause = "bind";
 +			close(s[nsock]);
 +			continue;
 +		}
 +		(void) listen(s[nsock], 5);
 +		fds[nsock].fd = s[nsock];
 +		fds[nsock].events = POLLIN;
  
 -	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
 -		perror("bind");
 +		nsock++;
 +	}
 +	if (nsock == 0) {
 +		perror(cause);
  		return (-1);
 +		/*NOTREACHED*/
  	}
  
  	printf("netreceive listening on UDP port %d\n", (u_short)port);
  
  	while (1) {
 -		if (recv(s, packet, 65536, 0) < 0)
 -			perror("recv");
 +		if (poll(fds, nsock, -1) < 0) 
 +			perror("poll");
 +		for (i = 0; i > nsock; i++) {
 +			if (fds[i].revents & POLLIN) {
 +				if (recv(s[i], packet, 65536, 0) < 0)
 +					perror("recv");
 +			}
 +			if ((fds[i].revents &~ POLLIN) != 0)
 +				perror("poll");
 +		}
  	}
 +	
 +	/*NOTREACHED*/
 +	freeaddrinfo(res0);
  }
 
 Modified: head/tools/tools/netrate/netsend/netsend.c
 ==============================================================================
 --- head/tools/tools/netrate/netsend/netsend.c	Tue Nov  8 17:08:12 2011	(r227344)
 +++ head/tools/tools/netrate/netsend/netsend.c	Tue Nov  8 17:23:43 2011	(r227345)
 @@ -29,6 +29,7 @@
  #include <sys/endian.h>
  #include <sys/types.h>
  #include <sys/socket.h>
 +#include <net/if.h>		/* if_nametoindex() */
  #include <sys/time.h>
  
  #include <netinet/in.h>
 @@ -40,13 +41,17 @@
  #include <stdlib.h>
  #include <string.h>
  
 +#include <netdb.h>
 +
  /* program arguments */
  struct _a {
  	int s;
 +	int ipv6;
  	struct timespec interval;
  	int port, port_max;
  	long duration;
  	struct sockaddr_in sin;
 +	struct sockaddr_in6 sin6;
  	int packet_len;
  	void *packet;
  };
 @@ -179,9 +184,16 @@ timing_loop(struct _a *a)
  	ic = gettimeofday_cycles;
  	cur_port = a->port;
  	if (a->port == a->port_max) {
 -		if (connect(a->s, (struct sockaddr *)&a->sin, sizeof(a->sin))) {
 -			perror("connect");
 -			return (-1);
 +		if (a->ipv6) {
 +			if (connect(a->s, (struct sockaddr *)&a->sin6, sizeof(a->sin6))) {
 +				perror("connect (ipv6)");
 +				return (-1);
 +			}
 +		} else {
 +			if (connect(a->s, (struct sockaddr *)&a->sin, sizeof(a->sin))) {
 +				perror("connect (ipv4)");
 +				return (-1);
 +			}
  		}
  	}
  	while (1) {
 @@ -215,8 +227,13 @@ timing_loop(struct _a *a)
  			a->sin.sin_port = htons(cur_port++);
  			if (cur_port > a->port_max)
  				cur_port = a->port;
 +			if (a->ipv6) {
 +			ret = sendto(a->s, a->packet, a->packet_len, 0,
 +			    (struct sockaddr *)&a->sin6, sizeof(a->sin6));
 +			} else {
  			ret = sendto(a->s, a->packet, a->packet_len, 0,
  				(struct sockaddr *)&a->sin, sizeof(a->sin));
 +			}
  		}
  		if (ret < 0)
  			send_errors++;
 @@ -254,25 +271,48 @@ main(int argc, char *argv[])
  	long rate, payloadsize, port;
  	char *dummy;
  	struct _a a;	/* arguments */
 +	struct addrinfo hints, *res, *ressave;
  
  	bzero(&a, sizeof(a));
  
  	if (argc != 6)
  		usage();
  
 -	a.sin.sin_len = sizeof(a.sin);
 -	a.sin.sin_family = AF_INET;
 -	if (inet_aton(argv[1], &a.sin.sin_addr) == 0) {
 -		perror(argv[1]);
 +	memset(&hints, 0, sizeof(hints));
 +	hints.ai_family = AF_UNSPEC;
 +
 +	if (getaddrinfo(argv[1], NULL, &hints, &res) != 0) {
 +		fprintf(stderr, "Couldn't resolv %s\n", argv[1]);
  		return (-1);
  	}
 +	ressave = res;
 +	while (res) {
 +		if (res->ai_family == AF_INET) {
 +			memcpy(&a.sin, res->ai_addr, res->ai_addrlen);
 +			a.ipv6 = 0;
 +			break;
 +		} else if (res->ai_family == AF_INET6) {
 +			memcpy(&a.sin6, res->ai_addr, res->ai_addrlen);
 +			a.ipv6 = 1;
 +			break;
 +		} 
 +		res = res->ai_next;
 +	}
 +	if (!res) {
 +		fprintf(stderr, "Couldn't resolv %s\n", argv[1]);
 +		exit(1);
 +	}
 +	freeaddrinfo(ressave);
  
  	port = strtoul(argv[2], &dummy, 10);
  	if (port < 1 || port > 65535)
  		usage();
  	if (*dummy != '\0' && *dummy != '-')
  		usage();
 -	a.sin.sin_port = htons(port);
 +	if (a.ipv6)
 +		a.sin6.sin6_port = htons(port);
 +	else
 +		a.sin.sin_port = htons(port);
  	a.port = a.port_max = port;
  	if (*dummy == '-') {	/* set high port */
  		port = strtoul(dummy + 1, &dummy, 10);
 @@ -328,7 +368,10 @@ main(int argc, char *argv[])
  	    "seconds\n", payloadsize, (intmax_t)a.interval.tv_sec,
  	    a.interval.tv_nsec, a.duration);
  
 -	a.s = socket(PF_INET, SOCK_DGRAM, 0);
 +	if (a.ipv6)
 +		a.s = socket(PF_INET6, SOCK_DGRAM, 0);
 +	else
 +		a.s = socket(PF_INET, SOCK_DGRAM, 0);
  	if (a.s == -1) {
  		perror("socket");
  		return (-1);
 _______________________________________________
 svn-src-all@freebsd.org mailing list
 http://lists.freebsd.org/mailman/listinfo/svn-src-all
 To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
 
State-Changed-From-To: open->closed 
State-Changed-By: cognet 
State-Changed-When: Wed Nov 9 14:06:59 UTC 2011 
State-Changed-Why:  
Committed, with minor changes. Thanks! 

http://www.freebsd.org/cgi/query-pr.cgi?pr=161368 
>Unformatted:
