bin/145759: [patch] Add do-not-fragment option support to ping6

pluknet pluknet at gmail.com
Fri Apr 16 14:00:08 UTC 2010


>Number:         145759
>Category:       bin
>Synopsis:       [patch] Add do-not-fragment option support to ping6
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          change-request
>Submitter-Id:   current-users
>Arrival-Date:   Fri Apr 16 14:00:08 UTC 2010
>Closed-Date:
>Last-Modified:
>Originator:     pluknet
>Release:        HEAD r206338
>Organization:
>Environment:
>Description:
There's a conversation that fully disclose the subject.
http://lists.freebsd.org/pipermail/freebsd-net/2009-December/023948.html

Some tests inline:

1. size < lo0 mtu, w/ frag
$ ping6 -s 10000 -b 32000 ::1
PING6(10048=40+8+10000 bytes) ::1 --> ::1
10008 bytes from ::1, icmp_seq=0 hlim=64 time=0.139 ms

17:37:56.521150 IP6 localhost > localhost: frag (0|1232) ICMP6, echo request, seq 0, length 1232
17:37:56.521160 IP6 localhost > localhost: frag (1232|1232)
17:37:56.521164 IP6 localhost > localhost: frag (2464|1232)
17:37:56.521168 IP6 localhost > localhost: frag (3696|1232)
17:37:56.521172 IP6 localhost > localhost: frag (4928|1232)
17:37:56.521175 IP6 localhost > localhost: frag (6160|1232)
17:37:56.521179 IP6 localhost > localhost: frag (7392|1232)
17:37:56.521183 IP6 localhost > localhost: frag (8624|1232)
17:37:56.521186 IP6 localhost > localhost: frag (9856|152)
17:37:56.521203 IP6 localhost > localhost: ICMP6, echo reply, seq 0, length 10008

2. size < lo0 mtu, w/o frag
$ ping6 -s 10000 -b 32000 -D ::1
PING6(10048=40+8+10000 bytes) ::1 --> ::1
10008 bytes from ::1, icmp_seq=0 hlim=64 time=0.080 ms

17:39:52.182947 IP6 localhost > localhost: ICMP6, echo request, seq 0, length 10008
17:39:52.182962 IP6 localhost > localhost: ICMP6, echo reply, seq 0, length 10008

3. size > lo0 mtu, w/ frag
$ ping6 -s 20000 -b 32000 ::1
PING6(20048=40+8+20000 bytes) ::1 --> ::1
20008 bytes from ::1, icmp_seq=0 hlim=64 time=0.234 ms

17:46:22.080945 IP6 localhost > localhost: frag (0|1232) ICMP6, echo request, seq 0, length 1232
17:46:22.080955 IP6 localhost > localhost: frag (1232|1232)
17:46:22.080959 IP6 localhost > localhost: frag (2464|1232)
17:46:22.080962 IP6 localhost > localhost: frag (3696|1232)
17:46:22.080966 IP6 localhost > localhost: frag (4928|1232)
17:46:22.080970 IP6 localhost > localhost: frag (6160|1232)
17:46:22.080973 IP6 localhost > localhost: frag (7392|1232)
17:46:22.080977 IP6 localhost > localhost: frag (8624|1232)
17:46:22.080980 IP6 localhost > localhost: frag (9856|1232)
17:46:22.080984 IP6 localhost > localhost: frag (11088|1232)
17:46:22.080987 IP6 localhost > localhost: frag (12320|1232)
17:46:22.080991 IP6 localhost > localhost: frag (13552|1232)
17:46:22.080994 IP6 localhost > localhost: frag (14784|1232)
17:46:22.080998 IP6 localhost > localhost: frag (16016|1232)
17:46:22.081002 IP6 localhost > localhost: frag (17248|1232)
17:46:22.081005 IP6 localhost > localhost: frag (18480|1232)
17:46:22.081009 IP6 localhost > localhost: frag (19712|296)
17:46:22.081047 IP6 localhost > localhost: frag (0|16336) ICMP6, echo reply, seq 0, length 16336
17:46:22.081048 IP6 localhost > localhost: frag (16336|3672)

4. size > lo0 mtu, w/o frag
$ ping6 -s 20000 -b 32000 -D ::1
PING6(20048=40+8+20000 bytes) ::1 --> ::1
ping6: sendmsg: Message too long
ping6: wrote ::1 20008 chars, ret=-1

>How-To-Repeat:

>Fix:
Patch against HEAD r206338, applicable down to 7.

Patch attached with submission follows:

Index: sbin/ping6/ping6.c
===================================================================
--- sbin/ping6/ping6.c	(revision 206338)
+++ sbin/ping6/ping6.c	(working copy)
@@ -191,6 +191,7 @@
 #define F_ONCE		0x200000
 #define F_AUDIBLE	0x400000
 #define F_MISSED	0x800000
+#define F_DONTFRAG	0x1000000
 #define F_NOUSERDATA	(F_NODEADDR | F_FQDN | F_FQDNOLD | F_SUPTYPES)
 u_int options;
 
@@ -349,7 +350,7 @@
 #endif /*IPSEC_POLICY_IPSEC*/
 #endif
 	while ((ch = getopt(argc, argv,
-	    "a:b:c:dfHg:h:I:i:l:mnNop:qrRS:s:tvwW" ADDOPTS)) != -1) {
+	    "a:b:c:DdfHg:h:I:i:l:mnNop:qrRS:s:tvwW" ADDOPTS)) != -1) {
 #undef ADDOPTS
 		switch (ch) {
 		case 'a':
@@ -415,6 +416,9 @@
 				errx(1,
 				    "illegal number of packets -- %s", optarg);
 			break;
+		case 'D':
+			options |= F_DONTFRAG;
+			break;
 		case 'd':
 			options |= F_SO_DEBUG;
 			break;
@@ -743,8 +747,12 @@
 		*((u_int32_t *)&nonce[i]) = arc4random();
 #endif
 
+	optval = 1;
+	if (options & F_DONTFRAG)
+		if (setsockopt(s, IPPROTO_IPV6, IPV6_DONTFRAG,
+		    &optval, sizeof(optval)) == -1)
+			err(1, "IPV6_DONTFRAG");
 	hold = 1;
-
 	if (options & F_SO_DEBUG)
 		(void)setsockopt(s, SOL_SOCKET, SO_DEBUG, (char *)&hold,
 		    sizeof(hold));
@@ -2780,7 +2788,7 @@
 	    "A"
 #endif
 	    "usage: ping6 [-"
-	    "d"
+	    "Dd"
 #if defined(IPSEC) && !defined(IPSEC_POLICY_IPSEC)
 	    "E"
 #endif
Index: sbin/ping6/ping6.8
===================================================================
--- sbin/ping6/ping6.8	(revision 206338)
+++ sbin/ping6/ping6.8	(working copy)
@@ -40,9 +40,9 @@
 .Sh SYNOPSIS
 .Nm
 .\" without ipsec, or new ipsec
-.Op Fl dfHmnNoqrRtvwW
+.Op Fl DdfHmnNoqrRtvwW
 .\" old ipsec
-.\" .Op Fl AdEfmnNqRtvwW
+.\" .Op Fl ADdEfmnNqRtvwW
 .Bk -words
 .Op Fl a Ar addrtype
 .Ek
@@ -141,6 +141,8 @@
 .Ar count
 .Tn ECHO_RESPONSE
 packets.
+.It Fl D
+Disable IPv6 fragmentation.
 .It Fl d
 Set the
 .Dv SO_DEBUG


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list