From owner-svn-src-all@freebsd.org Thu Nov 26 04:29:33 2020 Return-Path: Delivered-To: svn-src-all@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 5CA6747FC50; Thu, 26 Nov 2020 04:29:33 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4ChPt522CLz4v8s; Thu, 26 Nov 2020 04:29:33 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 33C051D61A; Thu, 26 Nov 2020 04:29:33 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 0AQ4TXK8023813; Thu, 26 Nov 2020 04:29:33 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 0AQ4TV2B023801; Thu, 26 Nov 2020 04:29:31 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <202011260429.0AQ4TV2B023801@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Thu, 26 Nov 2020 04:29:31 +0000 (UTC) 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 X-SVN-Group: head X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: in head: . etc/mtree rescue/rescue sbin sbin/ping sbin/ping/tests sbin/ping6 sbin/ping6/tests tools/build/mk X-SVN-Commit-Revision: 368045 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 26 Nov 2020 04:29:33 -0000 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 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 + * 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 +__FBSDID("$FreeBSD$"); + +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#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 + * 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 #include +#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 + * 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 ***