Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Nov 2020 04:29:31 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r368045 - in head: . etc/mtree rescue/rescue sbin sbin/ping sbin/ping/tests sbin/ping6 sbin/ping6/tests tools/build/mk
Message-ID:  <202011260429.0AQ4TV2B023801@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Thu Nov 26 04:29:30 2020
New Revision: 368045
URL: https://svnweb.freebsd.org/changeset/base/368045

Log:
  Merge ping6 to ping
  
  There is now a single ping binary, which chooses to use ICMP or ICMPv4
  based on the -4 and -6 options, and the format of the address.
  
  Submitted by:	Ján Sučan <sucanjan@gmail.com>
  Sponsored by:	Google LLC (Google Summer of Code 2019)
  MFC after:	Never
  Differential Revision:	https://reviews.freebsd.org/D21377

Added:
  head/sbin/ping/main.c   (contents, props changed)
  head/sbin/ping/main.h   (contents, props changed)
  head/sbin/ping/ping.h   (contents, props changed)
  head/sbin/ping/ping6.c
     - copied, changed from r368010, head/sbin/ping6/ping6.c
  head/sbin/ping/ping6.h   (contents, props changed)
  head/sbin/ping/tests/ping_6_c1_s8_t1.out
     - copied unchanged from r368010, head/sbin/ping6/tests/ping6_c1_s8_t1.out
Deleted:
  head/sbin/ping6/Makefile
  head/sbin/ping6/Makefile.depend
  head/sbin/ping6/ping6.8
  head/sbin/ping6/ping6.c
  head/sbin/ping6/tests/Makefile
  head/sbin/ping6/tests/ping6_c1_s8_t1.out
  head/sbin/ping6/tests/ping6_test.sh
Modified:
  head/ObsoleteFiles.inc
  head/UPDATING
  head/etc/mtree/BSD.tests.dist
  head/rescue/rescue/Makefile
  head/sbin/Makefile
  head/sbin/ping/Makefile
  head/sbin/ping/ping.8
  head/sbin/ping/ping.c
  head/sbin/ping/tests/Makefile
  head/sbin/ping/tests/ping_test.sh
  head/tools/build/mk/OptionalObsoleteFiles.inc

Modified: head/ObsoleteFiles.inc
==============================================================================
--- head/ObsoleteFiles.inc	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/ObsoleteFiles.inc	Thu Nov 26 04:29:30 2020	(r368045)
@@ -36,6 +36,16 @@
 #   xargs -n1 | sort | uniq -d;
 # done
 
+# 20201124: ping6(8) was merged into ping(8)
+OLD_FILES+=sbin/ping6
+OLD_FILES+=rescue/ping6
+OLD_FILES+=usr/lib/debug/sbin/ping6.debug
+OLD_FILES+=usr/share/man/man8/ping6.8.gz
+OLD_FILES+=usr/tests/sbin/ping6/Kyuafile
+OLD_FILES+=usr/tests/sbin/ping6/ping6_c1_s8_t1.out
+OLD_FILES+=usr/tests/sbin/ping6/ping6_test
+OLD_DIRS+=usr/tests/sbin/ping6
+
 # 20201025: Remove cal data files
 OLD_FILES+=usr/share/calendar/calendar.all
 OLD_FILES+=usr/share/calendar/calendar.australia

Modified: head/UPDATING
==============================================================================
--- head/UPDATING	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/UPDATING	Thu Nov 26 04:29:30 2020	(r368045)
@@ -26,6 +26,10 @@ NOTE TO PEOPLE WHO THINK THAT FreeBSD 13.x IS SLOW:
 	world, or to merely disable the most expensive debugging functionality
 	at runtime, run "ln -s 'abort:false,junk:false' /etc/malloc.conf".)
 
+20201124:
+	ping6 has been merged into ping.  It can now be called as "ping -6".
+	See ping(8) for details.
+
 20201108:
 	Default value of net.add_addr_allfibs has been changed to 0.
 	If you have multi-fib configuration and rely on existence of all

Modified: head/etc/mtree/BSD.tests.dist
==============================================================================
--- head/etc/mtree/BSD.tests.dist	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/etc/mtree/BSD.tests.dist	Thu Nov 26 04:29:30 2020	(r368045)
@@ -448,8 +448,6 @@
         ..
         ping
         ..
-        ping6
-        ..
         route
         ..
     ..

Modified: head/rescue/rescue/Makefile
==============================================================================
--- head/rescue/rescue/Makefile	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/rescue/rescue/Makefile	Thu Nov 26 04:29:30 2020	(r368045)
@@ -103,7 +103,6 @@ CRUNCH_PROGS_sbin+= ccdconfig
 .endif
 
 .if ${MK_INET6_SUPPORT} != "no"
-CRUNCH_PROGS_sbin+= ping6
 CRUNCH_PROGS_sbin+= rtsol
 .endif
 

Modified: head/sbin/Makefile
==============================================================================
--- head/sbin/Makefile	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/sbin/Makefile	Thu Nov 26 04:29:30 2020	(r368045)
@@ -73,7 +73,6 @@ SUBDIR.${MK_CCD}+=	ccdconfig
 SUBDIR.${MK_CXX}+=	devd
 SUBDIR.${MK_HAST}+=	hastctl
 SUBDIR.${MK_HAST}+=	hastd
-SUBDIR.${MK_INET6}+=	ping6
 SUBDIR.${MK_INET6}+=	rtsol
 SUBDIR.${MK_IPFILTER}+=	ipf
 SUBDIR.${MK_IPFW}+=	ipfw

Modified: head/sbin/ping/Makefile
==============================================================================
--- head/sbin/ping/Makefile	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/sbin/ping/Makefile	Thu Nov 26 04:29:30 2020	(r368045)
@@ -5,11 +5,17 @@
 
 PACKAGE=runtime
 PROG=	ping
-SRCS=	ping.c utils.c
+SRCS=	main.c ping.c utils.c
 MAN=	ping.8
 BINOWN=	root
 BINMODE=4555
 LIBADD=	m
+
+.if ${MK_INET6_SUPPORT} != "no"
+CFLAGS+= -DINET6 -DKAME_SCOPEID
+SRCS+=	ping6.c
+LIBADD+= md
+.endif
 
 .if ${MK_DYNAMICROOT} == "no"
 .warning ${PROG} built without libcasper support

Added: head/sbin/ping/main.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sbin/ping/main.c	Thu Nov 26 04:29:30 2020	(r368045)
@@ -0,0 +1,191 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (C) 2019 Jan Sucan <jansucan@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/socket.h>
+
+#include <arpa/inet.h>
+#include <netdb.h>
+#include <netinet/in.h>
+
+#include <err.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#include "main.h"
+#include "ping.h"
+#ifdef INET6
+#include "ping6.h"
+#endif
+
+#ifdef INET6
+#define	OPTSTR ":46"
+#else
+#define OPTSTR ":4"
+#endif
+
+int
+main(int argc, char *argv[])
+{
+	struct in_addr a;
+	struct addrinfo hints;
+	int ch;
+	bool ipv4;
+#ifdef INET6
+	struct in6_addr a6;
+	bool ipv6;
+
+	ipv6 = false;
+#endif
+	ipv4 = false;
+
+	while ((ch = getopt(argc, argv, OPTSTR)) != -1) {
+		switch(ch) {
+		case '4':
+			ipv4 = true;
+			break;
+#ifdef INET6
+		case '6':
+			ipv6 = true;
+			break;
+#endif
+		default:
+			break;
+		}
+	}
+
+	if (optind >= argc)
+		usage();
+
+	optreset = 1;
+	optind = 1;
+#ifdef INET6
+	if (ipv4 && ipv6)
+		errx(1, "-4 and -6 cannot be used simultaneously");
+#endif
+
+	if (inet_pton(AF_INET, argv[argc - 1], &a) == 1) {
+#ifdef INET6
+		if (ipv6)
+			errx(1, "IPv6 requested but IPv4 target address "
+			    "provided");
+#endif
+		hints.ai_family = AF_INET;
+	}
+#ifdef INET6
+	else if (inet_pton(AF_INET6, argv[argc - 1], &a6) == 1) {
+		if (ipv4)
+			errx(1, "IPv4 requested but IPv6 target address "
+			    "provided");
+		hints.ai_family = AF_INET6;
+	} else if (ipv6)
+		hints.ai_family = AF_INET6;
+#endif
+	else if (ipv4)
+		hints.ai_family = AF_INET;
+	else {
+		struct addrinfo *res;
+
+		memset(&hints, 0, sizeof(hints));
+		hints.ai_socktype = SOCK_RAW;
+		hints.ai_family = AF_UNSPEC;
+		getaddrinfo(argv[argc - 1], NULL, &hints, &res);
+		if (res != NULL) {
+			hints.ai_family = res[0].ai_family;
+			freeaddrinfo(res);
+		}
+	}
+
+	if (hints.ai_family == AF_INET)
+		return ping(argc, argv);
+#ifdef INET6
+	else if (hints.ai_family == AF_INET6)
+		return ping6(argc, argv);
+#endif
+	else
+		errx(1, "Unknown host");
+}
+
+void
+usage(void)
+{
+	(void)fprintf(stderr,
+	    "usage: ping [-4AaDdfHnoQqRrv] [-C pcp] [-c count] "
+	    "[-G sweepmaxsize]\n"
+	    "	    [-g sweepminsize] [-h sweepincrsize] [-i wait] "
+	    "[-l preload]\n"
+	    "	    [-M mask | time] [-m ttl]" 
+#ifdef IPSEC
+	    "[-P policy] "
+#endif
+	    "[-p pattern] [-S src_addr] \n"
+	    "	    [-s packetsize] [-t timeout] [-W waittime] [-z tos] "
+	    "IPv4-host\n"
+	    "       ping [-4AaDdfHLnoQqRrv] [-C pcp] [-c count] [-I iface] "
+	    "[-i wait]\n"
+	    "	    [-l preload] [-M mask | time] [-m ttl] "
+#ifdef IPSEC
+	    "[-P policy] "
+#endif
+	    "[-p pattern]\n"
+	    "	    [-S src_addr] [-s packetsize] [-T ttl] [-t timeout] [-W waittime]\n"
+	    "            [-z tos] IPv4-mcast-group\n"
+#ifdef INET6
+            "       ping [-6aADd"
+#if defined(IPSEC) && !defined(IPSEC_POLICY_IPSEC)
+            "E"
+#endif
+            "fHnNoOq"
+#ifdef IPV6_USE_MIN_MTU
+            "u"
+#endif
+            "vyY"
+#if defined(IPSEC) && !defined(IPSEC_POLICY_IPSEC)
+            "Z"
+#endif
+	    "] "
+            "[-b bufsiz] [-c count] [-e gateway]\n"
+            "            [-I interface] [-i wait] [-k addrtype] [-l preload] "
+            "[-m hoplimit]\n"
+            "            [-p pattern]"
+#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
+            " [-P policy]"
+#endif
+            " [-S sourceaddr] [-s packetsize] [-t timeout]\n"
+	    "	    [-W waittime] [-z tclass] [IPv6-hops ...] IPv6-host\n"
+#endif	/* INET6 */
+	    );
+
+	exit(1);
+}

Added: head/sbin/ping/main.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sbin/ping/main.h	Thu Nov 26 04:29:30 2020	(r368045)
@@ -0,0 +1,36 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (C) 2019 Jan Sucan <jansucan@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef MAIN_H
+#define MAIN_H 1
+
+void usage(void) __dead2;
+
+#endif

Modified: head/sbin/ping/ping.8
==============================================================================
--- head/sbin/ping/ping.8	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/sbin/ping/ping.8	Thu Nov 26 04:29:30 2020	(r368045)
@@ -28,17 +28,19 @@
 .\"     @(#)ping.8	8.2 (Berkeley) 12/11/93
 .\" $FreeBSD$
 .\"
-.Dd October 2, 2020
+.Dd November 24, 2020
 .Dt PING 8
 .Os
 .Sh NAME
 .Nm ping
 .Nd send
-.Tn ICMP ECHO_REQUEST
+.Tn ICMP
+or
+.Tn ICMPv6 ECHO_REQUEST
 packets to network hosts
 .Sh SYNOPSIS
 .Nm
-.Op Fl AaDdfHnoQqRrv
+.Op Fl 4AaDdfHnoQqRrv
 .Op Fl C Ar pcp
 .Op Fl c Ar count
 .Op Fl G Ar sweepmaxsize
@@ -55,9 +57,9 @@ packets to network hosts
 .Op Fl t Ar timeout
 .Op Fl W Ar waittime
 .Op Fl z Ar tos
-.Ar host
+.Ar IPv4-host
 .Nm
-.Op Fl AaDdfHLnoQqRrv
+.Op Fl 4AaDdfHLnoQqRrv
 .Op Fl C Ar pcp
 .Op Fl c Ar count
 .Op Fl I Ar iface
@@ -73,11 +75,31 @@ packets to network hosts
 .Op Fl t Ar timeout
 .Op Fl W Ar waittime
 .Op Fl z Ar tos
-.Ar mcast-group
+.Ar IPv4-mcast-group
+.Nm
+.Op Fl 6AaDdEfHNnOoquvYyZ
+.Op Fl b Ar bufsiz
+.Op Fl c Ar count
+.Op Fl e Ar gateway
+.Op Fl I Ar interface
+.Op Fl i Ar wait
+.Op Fl k Ar addrtype
+.Op Fl l Ar preload
+.Op Fl m Ar hoplimit
+.Op Fl P Ar policy
+.Op Fl p Ar pattern
+.Op Fl S Ar sourceaddr
+.Op Fl s Ar packetsize
+.Op Fl t Ar timeout
+.Op Fl W Ar waittime
+.Op Ar IPv6-hops ...
+.Ar IPv6-host
 .Sh DESCRIPTION
 The
 .Nm
-utility uses the
+utility invoked with an IPv4 target
+.Ns ( Ar IPv4-host No or Ar IPv4-mcast-group Ns )
+uses the
 .Tn ICMP
 .No protocol Ap s mandatory
 .Tn ECHO_REQUEST
@@ -94,7 +116,32 @@ header, followed by a
 and then an arbitrary number of
 .Dq pad
 bytes used to fill out the packet.
-The options are as follows:
+.Pp
+When invoked with an IPv6 target
+.Ns ( Ar IPv6-host Ns ) Ns ,
+it uses the
+.Tn ICMPv6
+protocol's mandatory
+.Tn ICMP6_ECHO_REQUEST
+datagram to elicit an
+.Tn ICMP6_ECHO_REPLY
+.Ns .
+.Tn ICMP6_ECHO_REQUEST
+datagrams have an IPv6 header and
+.Tn ICMPv6
+header formatted as documented in RFC 2463.
+.Pp
+When invoked with a hostname, the version to which the target is
+resolved first is used. In that case, the options and arguments used
+must be valid for the specific IP version, otherwise
+.Nm
+exits with an error. If the target is resolved to both IPv4 and IPv6,
+the specific IP version can be requested by
+.Fl 4
+or
+.Fl 6
+options, respectively.
+.Ss Options common to both IPv4 and IPv6 targets
 .Bl -tag -width indent
 .It Fl A
 Audible.
@@ -112,8 +159,6 @@ Include a bell
 .Tn ( ASCII
 0x07)
 character in the output when any packet is received.
-This option is ignored
-if other format options are present.
 .It Fl C Ar pcp
 Add an 802.1p Ethernet Priority Code Point when sending a packet.
 0..7 uses that specific PCP, -1 uses the interface default PCP (or none).
@@ -126,12 +171,13 @@ packets.
 If this option is not specified,
 .Nm
 will operate until interrupted.
-If this option is specified in conjunction with ping sweeps,
+.Pp
+For an IPv4 target, if this option is specified in conjunction with ping sweeps,
 each sweep will consist of
 .Ar count
 packets.
 .It Fl D
-Set the Don't Fragment bit.
+Disable fragmentation.
 .It Fl d
 Set the
 .Dv SO_DEBUG
@@ -152,31 +198,24 @@ Only the super-user may use this option.
 .Bf -emphasis
 This can be very hard on a network and should be used with caution.
 .Ef
-.It Fl G Ar sweepmaxsize
-Specify the maximum size of
-.Tn ICMP
-payload when sending sweeping pings.
-This option is required for ping sweeps.
-.It Fl g Ar sweepminsize
-Specify the size of
-.Tn ICMP
-payload to start with when sending sweeping pings.
-The default value is 0.
 .It Fl H
 Hostname output.
 Try to do a reverse DNS lookup when displaying addresses.
 This is the opposite of the
 .Fl n
 option.
-.It Fl h Ar sweepincrsize
-Specify the number of bytes to increment the size of
-.Tn ICMP
-payload after
-each sweep when sending sweeping pings.
-The default value is 1.
 .It Fl I Ar iface
-Source multicast packets with the given interface address.
-This flag only applies if the ping destination is a multicast address.
+For an IPv4 target,
+.Ar iface
+is an IP address indentifying an interface from which the packets will
+be sent. This flag applies only if the ping target is a multicast
+address.
+.Pp
+For an IPv6 target,
+.Ar iface
+is a name of an interface (e.g. `em0') from which the packets will be
+sent. This flag applies if the ping target is a multicast address, or
+link-local/site-local unicast address.
 .It Fl i Ar wait
 Wait
 .Ar wait
@@ -188,9 +227,6 @@ values less than 1 second.
 This option is incompatible with the
 .Fl f
 option.
-.It Fl L
-Suppress loopback of multicast packets.
-This flag only applies if the ping destination is a multicast address.
 .It Fl l Ar preload
 If
 .Ar preload
@@ -199,35 +235,13 @@ is specified,
 sends that many packets as fast as possible before falling into its normal
 mode of behavior.
 Only the super-user may use this option.
-.It Fl M Cm mask | time
-Use
-.Dv ICMP_MASKREQ
-or
-.Dv ICMP_TSTAMP
-instead of
-.Dv ICMP_ECHO .
-For
-.Cm mask ,
-print the netmask of the remote machine.
-Set the
-.Va net.inet.icmp.maskrepl
-MIB variable to enable
-.Dv ICMP_MASKREPLY
-and
-.Va net.inet.icmp.maskfake
-if you want to override the netmask in the response.
-For
-.Cm time ,
-print the origination, reception and transmission timestamps.
-Set the
-.Va net.inet.icmp.tstamprepl
-MIB variable to enable or disable
-.Dv ICMP_TSTAMPREPLY .
 .It Fl m Ar ttl
-Set the IP Time To Live for outgoing packets.
+For an IPv4 target, set the IP Time To Live for outgoing packets.
 If not specified, the kernel uses the value of the
 .Va net.inet.ip.ttl
 MIB variable.
+.Pp
+For an IPv6 target, set the IPv6 hoplimit.
 .It Fl n
 Numeric output only.
 No attempt will be made to lookup symbolic names for host addresses.
@@ -252,6 +266,97 @@ For example,
 .Dq Li \-p ff
 will cause the sent packet to be filled with all
 ones.
+.It Fl q
+Quiet output.
+Nothing is displayed except the summary lines at startup time and
+when finished.
+.It Fl S Ar src_addr
+Use the following IP address as the source address in outgoing packets.
+On hosts with more than one IP address, this option can be used to
+force the source address to be something other than the IP address
+of the interface the probe packet is sent on.
+.Pp
+For IPv4, if the IP address is not one of this machine's interface
+addresses, an error is returned and nothing is sent.
+.Pp
+For IPv6, the source address must be one of the unicast addresses of
+the sending node, and must be numeric.
+.It Fl s Ar packetsize
+Specify the number of data bytes to be sent.
+The default is 56, which translates into 64
+.Tn ICMP
+data bytes when combined
+with the 8 bytes of
+.Tn ICMP
+header data.
+.Pp
+For IPv4, only the super-user may specify values more than default.
+This option cannot be used with ping sweeps.
+.Pp
+For IPv6, you may need to specify
+.Fl b
+as well to extend socket buffer size.
+.It Fl t Ar timeout
+Specify a timeout, in seconds, before ping exits regardless of how
+many packets have been received.
+.It Fl v
+Verbose output.
+.Tn ICMP
+packets other than
+.Tn ECHO_RESPONSE
+that are received are listed.
+.It Fl W Ar waittime
+Time in milliseconds to wait for a reply for each packet sent.
+If a reply arrives later, the packet is not printed as replied, but
+considered as replied when calculating statistics.
+.El
+.Ss Options only for IPv4 targets
+.Bl -tag -width indent
+.It Fl 4
+Use IPv4 regardless of how the target is resolved.
+.It Fl G Ar sweepmaxsize
+Specify the maximum size of
+.Tn ICMP
+payload when sending sweeping pings.
+This option is required for ping sweeps.
+.It Fl g Ar sweepminsize
+Specify the size of
+.Tn ICMP
+payload to start with when sending sweeping pings.
+The default value is 0.
+.It Fl h Ar sweepincrsize
+Specify the number of bytes to increment the size of
+.Tn ICMP
+payload after
+each sweep when sending sweeping pings.
+The default value is 1.
+.It Fl L
+Suppress loopback of multicast packets.
+This flag only applies if the ping destination is a multicast address.
+.It Fl M Cm mask | time
+Use
+.Dv ICMP_MASKREQ
+or
+.Dv ICMP_TSTAMP
+instead of
+.Dv ICMP_ECHO .
+For
+.Cm mask ,
+print the netmask of the remote machine.
+Set the
+.Va net.inet.icmp.maskrepl
+MIB variable to enable
+.Dv ICMP_MASKREPLY
+and
+.Va net.inet.icmp.maskfake
+if you want to override the netmask in the response.
+For
+.Cm time ,
+print the origination, reception and transmission timestamps.
+Set the
+.Va net.inet.icmp.tstamprepl
+MIB variable to enable or disable
+.Dv ICMP_TSTAMPREPLY .
 .It Fl Q
 Somewhat quiet output.
 .No Don Ap t
@@ -268,10 +373,6 @@ flag,
 .Nm
 prints out any ICMP error messages caused by its own ECHO_REQUEST
 messages.
-.It Fl q
-Quiet output.
-Nothing is displayed except the summary lines at startup time and
-when finished.
 .It Fl R
 Record route.
 Includes the
@@ -299,44 +400,123 @@ This option can be used to ping a local host through a
 that has no route through it
 (e.g., after the interface was dropped by
 .Xr routed 8 ) .
-.It Fl S Ar src_addr
-Use the following IP address as the source address in outgoing packets.
-On hosts with more than one IP address, this option can be used to
-force the source address to be something other than the IP address
-of the interface the probe packet is sent on.
-If the IP address
-is not one of this machine's interface addresses, an error is
-returned and nothing is sent.
-.It Fl s Ar packetsize
-Specify the number of data bytes to be sent.
-The default is 56, which translates into 64
-.Tn ICMP
-data bytes when combined
-with the 8 bytes of
-.Tn ICMP
-header data.
-Only the super-user may specify values more than default.
-This option cannot be used with ping sweeps.
 .It Fl T Ar ttl
 Set the IP Time To Live for multicasted packets.
 This flag only applies if the ping destination is a multicast address.
-.It Fl t Ar timeout
-Specify a timeout, in seconds, before ping exits regardless of how
-many packets have been received.
-.It Fl v
-Verbose output.
-.Tn ICMP
-packets other than
-.Tn ECHO_RESPONSE
-that are received are listed.
-.It Fl W Ar waittime
-Time in milliseconds to wait for a reply for each packet sent.
-If a reply arrives later, the packet is not printed as replied, but
-considered as replied when calculating statistics.
 .It Fl z Ar tos
 Use the specified type of service.
+.It Ar IPv4-host
+hostname or IPv4 address of the final destination node.
+.It Ar IPv4-mcast-group
+IPv4 multicast address of the final destination nodes.
 .El
+.Ss Options only for IPv6 targets
+.Bl -tag -width indent
+.It Fl 6
+Use IPv6 regardless of how the target is resolved.
+.It Fl b Ar bufsiz
+Set socket buffer size.
+.It Fl e Ar gateway
+Specifies to use
+.Ar gateway
+as the next hop to the destination.
+The gateway must be a neighbor of the sending node.
+.It Fl k Ar addrtype
+Generate ICMPv6 Node Information Node Addresses query, rather than echo-request.
+.Ar addrtype
+must be a string constructed of the following characters.
+.Bl -tag -width Ds -compact
+.It Ic a
+requests unicast addresses from all of the responder's interfaces.
+If the character is omitted,
+only those addresses which belong to the interface which has the
+responder's address are requests.
+.It Ic c
+requests responder's IPv4-compatible and IPv4-mapped addresses.
+.It Ic g
+requests responder's global-scope addresses.
+.It Ic s
+requests responder's site-local addresses.
+.It Ic l
+requests responder's link-local addresses.
+.It Ic A
+requests responder's anycast addresses.
+Without this character, the responder will return unicast addresses only.
+With this character, the responder will return anycast addresses only.
+Note that the specification does not specify how to get responder's
+anycast addresses.
+This is an experimental option.
+.El
+.It Fl N
+Probe node information multicast group address
+.Pq Li ff02::2:ffxx:xxxx .
+.Ar host
+must be string hostname of the target
+(must not be a numeric IPv6 address).
+Node information multicast group will be computed based on given
+.Ar host ,
+and will be used as the final destination.
+Since node information multicast group is a link-local multicast group,
+outgoing interface needs to be specified by
+.Fl I
+option.
 .Pp
+When specified twice, the address
+.Pq Li ff02::2:xxxx:xxxx
+is used instead.
+The former is in RFC 4620, the latter is in an old Internet Draft
+draft-ietf-ipngwg-icmp-name-lookup.
+Note that KAME-derived implementations including
+.Fx
+use the latter.
+.It Fl O
+Generate ICMPv6 Node Information supported query types query,
+rather than echo-request.
+.Fl s
+has no effect if
+.Fl O
+is specified.
+.It Fl u
+By default,
+.Nm
+asks the kernel to fragment packets to fit into the minimum IPv6 MTU.
+The
+.Fl u
+option
+will suppress the behavior in the following two levels:
+when the option is specified once, the behavior will be disabled for
+unicast packets.
+When the option is more than once, it will be disabled for both
+unicast and multicast packets.
+.It Fl Y
+Same as
+.Fl y ,
+but with old packet format based on 03 draft.
+This option is present for backward compatibility.
+.Fl s
+has no effect if
+.Fl y
+is specified.
+.It Fl y
+Generate ICMPv6 Node Information DNS Name query, rather than echo-request.
+.Fl s
+has no effect if
+.Fl y
+is specified.
+.It Ar IPv6-hops
+IPv6 addresses for intermediate nodes,
+which will be put into type 0 routing header.
+.It Ar IPv6-host
+IPv6 address of the final destination node.
+.El
+.Ss Experimental options only for IPv6 target
+.Bl -tag -width indent
+.It Fl E
+Enables transport-mode IPsec encapsulated security payload.
+.It Fl Z
+Enables transport-mode IPsec authentication header.
+.El
+.Pp
 When using
 .Nm
 for fault isolation, it should first be run on the local host, to verify
@@ -364,8 +544,8 @@ receives a
 argument for
 .Xr stty 1 )
 signal, the current number of packets sent and received, and the
-minimum, mean, and maximum of the round-trip times will be written to
-the standard error output.
+minimum, mean, maximum, and standard deviation of the round-trip times
+will be written to the standard output.
 .Pp
 This program is intended for use in network testing, measurement and
 management.
@@ -446,7 +626,7 @@ using the
 .Fl p
 option of
 .Nm .
-.Sh TTL DETAILS
+.Sh IPv4 TTL DETAILS
 The
 .Tn TTL
 value of an IP packet represents the maximum number of IP routers
@@ -536,20 +716,74 @@ At least one response was heard from the specified
 The transmission was successful but no responses were received.
 .It any other value
 An error occurred.
-These values are defined in
-.In sysexits.h .
 .El
+.Sh EXAMPLES
+The following will send ICMPv6 echo request to
+.Li dst.foo.com .
+.Bd -literal -offset indent
+ping -6 -n dst.foo.com
+.Ed
+.Pp
+The following will probe hostnames for all nodes on the network link attached to
+.Li wi0
+interface.
+The address
+.Li ff02::1
+is named the link-local all-node multicast address, and the packet would
+reach every node on the network link.
+.Bd -literal -offset indent
+ping -6 -y ff02::1%wi0
+.Ed
+.Pp
+The following will probe addresses assigned to the destination node,
+.Li dst.foo.com .
+.Bd -literal -offset indent
+ping -6 -k agl dst.foo.com
+.Ed
 .Sh SEE ALSO
 .Xr netstat 1 ,
 .Xr icmp 4 ,
+.Xr icmp6 4 ,
+.Xr inet6 4 ,
+.Xr ip6 4 ,
 .Xr ifconfig 8 ,
 .Xr routed 8 ,
 .Xr traceroute 8
+.Xr traceroute6 8
+.Rs
+.%A A. Conta
+.%A S. Deering
+.%T "Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification"
+.%N RFC 2463
+.%D December 1998
+.Re
+.Rs
+.%A Matt Crawford
+.%T "IPv6 Node Information Queries"
+.%N draft-ietf-ipngwg-icmp-name-lookups-09.txt
+.%D May 2002
+.%O work in progress material
+.Re
 .Sh HISTORY
 The
 .Nm
 utility appeared in
 .Bx 4.3 .
+The
+.Nm ping6
+utility with IPv6 support first appeared in the WIDE Hydrangea IPv6
+protocol stack kit.
+.Pp
+IPv6 and IPsec support based on the KAME Project
+.Pq Pa http://www.kame.net/
+stack was initially integrated into
+.Fx 4.0 .
+.Pp
+The
+.Nm ping6
+utility was merged to
+.Nm
+in Google Summer of Code 2019.
 .Sh AUTHORS
 The original
 .Nm
@@ -558,7 +792,7 @@ utility was written by
 while at the US Army Ballistics
 Research Laboratory.
 .Sh BUGS
-Many Hosts and Gateways ignore the
+Many Hosts and Gateways ignore the IPv4
 .Tn RECORD_ROUTE
 option.
 .Pp

Modified: head/sbin/ping/ping.c
==============================================================================
--- head/sbin/ping/ping.c	Thu Nov 26 02:14:52 2020	(r368044)
+++ head/sbin/ping/ping.c	Thu Nov 26 04:29:30 2020	(r368045)
@@ -100,6 +100,8 @@ __FBSDID("$FreeBSD$");
 #include <time.h>
 #include <unistd.h>
 
+#include "main.h"
+#include "ping.h"
 #include "utils.h"
 
 #define	INADDR_LEN	((int)sizeof(in_addr_t))
@@ -225,10 +227,9 @@ static void pr_pack(char *, ssize_t, struct sockaddr_i
 static void pr_retip(struct ip *, const u_char *);
 static void status(int);
 static void stopit(int);
-static void usage(void) __dead2;
 
 int
-main(int argc, char *const *argv)
+ping(int argc, char *const *argv)
 {
 	struct sockaddr_in from, sock_in;
 	struct in_addr ifaddr;
@@ -301,7 +302,7 @@ main(int argc, char *const *argv)
 
 	outpack = outpackhdr + sizeof(struct ip);
 	while ((ch = getopt(argc, argv,
-		"AaC:c:DdfG:g:Hh:I:i:Ll:M:m:nop:QqRrS:s:T:t:vW:z:"
+		"4AaC:c:DdfG:g:Hh:I:i:Ll:M:m:nop:QqRrS:s:T:t:vW:z:"
 #ifdef IPSEC
 #ifdef IPSEC_POLICY_IPSEC
 		"P:"
@@ -310,6 +311,9 @@ main(int argc, char *const *argv)
 		)) != -1)
 	{
 		switch(ch) {
+		case '4':
+			/* This option is processed in main(). */
+			break;
 		case 'A':
 			options |= F_MISSED;
 			break;
@@ -1768,25 +1772,4 @@ capdns_setup(void)
 		err(1, "unable to limit access to system.dns service");
 #endif
 	return (capdnsloc);
-}
-
-#if defined(IPSEC) && defined(IPSEC_POLICY_IPSEC)
-#define	SECOPT		" [-P policy]"
-#else
-#define	SECOPT		""
-#endif
-static void
-usage(void)
-{
-
-	(void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
-"usage: ping [-AaDdfHnoQqRrv] [-C pcp] [-c count] [-G sweepmaxsize] [-g sweepminsize]",
-"            [-h sweepincrsize] [-i wait] [-l preload] [-M mask | time] [-m ttl]",
-"           " SECOPT " [-p pattern] [-S src_addr] [-s packetsize] [-t timeout]",
-"            [-W waittime] [-z tos] host",
-"       ping [-AaDdfHLnoQqRrv] [-C pcp] [-c count] [-I iface] [-i wait] [-l preload]",
-"            [-M mask | time] [-m ttl]" SECOPT " [-p pattern] [-S src_addr]",
-"            [-s packetsize] [-T ttl] [-t timeout] [-W waittime]",
-"            [-z tos] mcast-group");
-	exit(EX_USAGE);
 }

Added: head/sbin/ping/ping.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sbin/ping/ping.h	Thu Nov 26 04:29:30 2020	(r368045)
@@ -0,0 +1,36 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (C) 2019 Jan Sucan <jansucan@FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202011260429.0AQ4TV2B023801>