From 0b1064b00fa3ed9c6ac31e2af1fc56c528d7b47d Mon Sep 17 00:00:00 2001 From: asomers Date: Thu, 26 Nov 2020 04:29:30 +0000 Subject: [PATCH] Merge ping6 to ping MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- ObsoleteFiles.inc | 10 + UPDATING | 4 + etc/mtree/BSD.tests.dist | 2 - rescue/rescue/Makefile | 1 - sbin/Makefile | 1 - sbin/ping/Makefile | 8 +- sbin/ping/main.c | 191 ++++++ sbin/ping/main.h | 36 ++ sbin/ping/ping.8 | 432 ++++++++++--- sbin/ping/ping.c | 31 +- sbin/ping/ping.h | 36 ++ sbin/{ping6 => ping}/ping6.c | 42 +- sbin/ping/ping6.h | 36 ++ sbin/ping/tests/Makefile | 1 + .../tests/ping_6_c1_s8_t1.out} | 0 sbin/ping/tests/ping_test.sh | 17 +- sbin/ping6/Makefile | 27 - sbin/ping6/Makefile.depend | 22 - sbin/ping6/ping6.8 | 567 ------------------ sbin/ping6/tests/Makefile | 8 - sbin/ping6/tests/ping6_test.sh | 53 -- tools/build/mk/OptionalObsoleteFiles.inc | 3 - 22 files changed, 685 insertions(+), 843 deletions(-) create mode 100644 sbin/ping/main.c create mode 100644 sbin/ping/main.h create mode 100644 sbin/ping/ping.h rename sbin/{ping6 => ping}/ping6.c (98%) create mode 100644 sbin/ping/ping6.h rename sbin/{ping6/tests/ping6_c1_s8_t1.out => ping/tests/ping_6_c1_s8_t1.out} (100%) delete mode 100644 sbin/ping6/Makefile delete mode 100644 sbin/ping6/Makefile.depend delete mode 100644 sbin/ping6/ping6.8 delete mode 100644 sbin/ping6/tests/Makefile delete mode 100644 sbin/ping6/tests/ping6_test.sh diff --git a/ObsoleteFiles.inc b/ObsoleteFiles.inc index 4ff67426819c..c69e030af1f2 100644 --- a/ObsoleteFiles.inc +++ b/ObsoleteFiles.inc @@ -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 diff --git a/UPDATING b/UPDATING index 28460b14476b..bfd5434b9b4c 100644 --- a/UPDATING +++ b/UPDATING @@ -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 diff --git a/etc/mtree/BSD.tests.dist b/etc/mtree/BSD.tests.dist index e820ff136f0e..884a4e1ead3c 100644 --- a/etc/mtree/BSD.tests.dist +++ b/etc/mtree/BSD.tests.dist @@ -448,8 +448,6 @@ .. ping .. - ping6 - .. route .. .. diff --git a/rescue/rescue/Makefile b/rescue/rescue/Makefile index f1d563d5c8fd..ae828a020e2a 100644 --- a/rescue/rescue/Makefile +++ b/rescue/rescue/Makefile @@ -103,7 +103,6 @@ CRUNCH_PROGS_sbin+= ccdconfig .endif .if ${MK_INET6_SUPPORT} != "no" -CRUNCH_PROGS_sbin+= ping6 CRUNCH_PROGS_sbin+= rtsol .endif diff --git a/sbin/Makefile b/sbin/Makefile index 72da4c5bb058..64840bae82bb 100644 --- a/sbin/Makefile +++ b/sbin/Makefile @@ -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 diff --git a/sbin/ping/Makefile b/sbin/ping/Makefile index 79f5fc2442a3..437d2f6b1b5a 100644 --- a/sbin/ping/Makefile +++ b/sbin/ping/Makefile @@ -5,12 +5,18 @@ 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 .elif ${MK_CASPER} != "no" && !defined(RESCUE) diff --git a/sbin/ping/main.c b/sbin/ping/main.c new file mode 100644 index 000000000000..13891e15da36 --- /dev/null +++ b/sbin/ping/main.c @@ -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); +} diff --git a/sbin/ping/main.h b/sbin/ping/main.h new file mode 100644 index 000000000000..f9707ccfb5ff --- /dev/null +++ b/sbin/ping/main.h @@ -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 diff --git a/sbin/ping/ping.8 b/sbin/ping/ping.8 index c5a1202cae4a..c76a995b3a5b 100644 --- a/sbin/ping/ping.8 +++ b/sbin/ping/ping.8 @@ -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,42 +400,121 @@ This option can be used to ping a local host through an interface 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 @@ -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 diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c index e53e5013a71c..fe197928085e 100644 --- a/sbin/ping/ping.c +++ b/sbin/ping/ping.c @@ -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_in *, struct timespec *); 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; @@ -1769,24 +1773,3 @@ capdns_setup(void) #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); -} diff --git a/sbin/ping/ping.h b/sbin/ping/ping.h new file mode 100644 index 000000000000..36ce3c0b973d --- /dev/null +++ b/sbin/ping/ping.h @@ -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 PING_H +#define PING_H 1 + +int ping(int argc, char *const *argv); + +#endif diff --git a/sbin/ping6/ping6.c b/sbin/ping/ping6.c similarity index 98% rename from sbin/ping6/ping6.c rename to sbin/ping/ping6.c index dba9f81ca87d..4cbeae770372 100644 --- a/sbin/ping6/ping6.c +++ b/sbin/ping/ping6.c @@ -142,6 +142,9 @@ __FBSDID("$FreeBSD$"); #include +#include "main.h" +#include "ping6.h" + struct tv32 { u_int32_t tv32_sec; u_int32_t tv32_nsec; @@ -265,7 +268,6 @@ static volatile sig_atomic_t seenint; static volatile sig_atomic_t seeninfo; #endif -int main(int, char *[]); static cap_channel_t *capdns_setup(void); static void fill(char *, char *); static int get_hoplim(struct msghdr *); @@ -293,10 +295,9 @@ static void pr_retip(struct ip6_hdr *, u_char *); static void summary(void); static int setpolicy(int, char *); static char *nigroup(char *, int); -static void usage(void); int -main(int argc, char *argv[]) +ping6(int argc, char *argv[]) { struct timespec last, intvl; struct sockaddr_in6 from, *sin6; @@ -354,9 +355,12 @@ main(int argc, char *argv[]) #endif /*IPSEC_POLICY_IPSEC*/ #endif while ((ch = getopt(argc, argv, - "k:b:C:c:DdfHe:m:I:i:l:unNop:qaAS:s:OvyYW:t:z:" ADDOPTS)) != -1) { + "6k:b:C:c:DdfHe:m:I:i:l:unNop:qaAS:s:OvyYW:t:z:" ADDOPTS)) != -1) { #undef ADDOPTS switch (ch) { + case '6': + /* This option is processed in main(). */ + break; case 'k': { char *cp; @@ -2843,36 +2847,6 @@ nigroup(char *name, int nig_oldmcprefix) return strdup(hbuf); } -static void -usage(void) -{ - (void)fprintf(stderr, -#if defined(IPSEC) && !defined(IPSEC_POLICY_IPSEC) - "Z" -#endif - "usage: ping6 [-" - "aADd" -#if defined(IPSEC) && !defined(IPSEC_POLICY_IPSEC) - "E" -#endif - "fHnNoOq" -#ifdef IPV6_USE_MIN_MTU - "u" -#endif - "vyY] " - "[-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]\n" - " [-t timeout] [-W waittime] [-z tclass] [hops ...] " - "host\n"); - exit(1); -} - static cap_channel_t * capdns_setup(void) { diff --git a/sbin/ping/ping6.h b/sbin/ping/ping6.h new file mode 100644 index 000000000000..5879b3684f2f --- /dev/null +++ b/sbin/ping/ping6.h @@ -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 PING6_H +#define PING6_H 1 + +int ping6(int argc, char *argv[]); + +#endif diff --git a/sbin/ping/tests/Makefile b/sbin/ping/tests/Makefile index 2d5082ac839b..5eb0b3abc4fa 100644 --- a/sbin/ping/tests/Makefile +++ b/sbin/ping/tests/Makefile @@ -7,5 +7,6 @@ PACKAGE= tests ATF_TESTS_SH+= ping_test ${PACKAGE}FILES+= ping_c1_s56_t1.out +${PACKAGE}FILES+= ping_6_c1_s8_t1.out .include diff --git a/sbin/ping6/tests/ping6_c1_s8_t1.out b/sbin/ping/tests/ping_6_c1_s8_t1.out similarity index 100% rename from sbin/ping6/tests/ping6_c1_s8_t1.out rename to sbin/ping/tests/ping_6_c1_s8_t1.out diff --git a/sbin/ping/tests/ping_test.sh b/sbin/ping/tests/ping_test.sh index 3c792453d4ff..5084b89d5a89 100644 --- a/sbin/ping/tests/ping_test.sh +++ b/sbin/ping/tests/ping_test.sh @@ -36,12 +36,26 @@ ping_c1_s56_t1_body() { atf_skip "IPv4 is not configured" fi atf_check -s exit:0 -o save:std.out -e empty \ - ping -c 1 -s 56 -t 1 localhost + ping -4 -c 1 -s 56 -t 1 localhost check_ping_statistics std.out $(atf_get_srcdir)/ping_c1_s56_t1.out } +atf_test_case ping_6_c1_s8_t1 +ping_6_c1_s8_t1_head() { + atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet" +} +ping_6_c1_s8_t1_body() { + if ! getaddrinfo -f inet6 localhost 1>/dev/null 2>&1; then + atf_skip "IPv6 is not configured" + fi + atf_check -s exit:0 -o save:std.out -e empty \ + ping -6 -c 1 -s 8 -t 1 localhost + check_ping_statistics std.out $(atf_get_srcdir)/ping_6_c1_s8_t1.out +} + atf_init_test_cases() { atf_add_test_case ping_c1_s56_t1 + atf_add_test_case ping_6_c1_s8_t1 } check_ping_statistics() { @@ -50,6 +64,7 @@ check_ping_statistics() { -e 's/localhost ([0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\})/localhost/' \ -e 's/from [0-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{1,3\}/from/' \ -e 's/ttl=[0-9][0-9]*/ttl=/' \ + -e 's/hlim=[0-9][0-9]*/hlim=/' \ "$1" >"$1".filtered atf_check -s exit:0 diff -u "$1".filtered "$2" } diff --git a/sbin/ping6/Makefile b/sbin/ping6/Makefile deleted file mode 100644 index b658f32f06e9..000000000000 --- a/sbin/ping6/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# $FreeBSD$ - -.include - -PACKAGE=runtime -PROG= ping6 -MAN= ping6.8 - -CFLAGS+=-DIPSEC -DKAME_SCOPEID - -BINOWN= root -BINMODE=4555 - -LIBADD= ipsec m md - -.if ${MK_DYNAMICROOT} == "no" -.warning ${PROG} built without libcasper support -.elif ${MK_CASPER} != "no" && !defined(RESCUE) -LIBADD+= casper -LIBADD+= cap_dns -CFLAGS+=-DWITH_CASPER -.endif - -HAS_TESTS= -SUBDIR.${MK_TESTS}+= tests - -.include diff --git a/sbin/ping6/Makefile.depend b/sbin/ping6/Makefile.depend deleted file mode 100644 index 725e99740168..000000000000 --- a/sbin/ping6/Makefile.depend +++ /dev/null @@ -1,22 +0,0 @@ -# $FreeBSD$ -# Autogenerated - do NOT edit! - -DIRDEPS = \ - include \ - include/arpa \ - include/xlocale \ - lib/${CSU_DIR} \ - lib/libc \ - lib/libcapsicum \ - lib/libcompiler_rt \ - lib/libipsec \ - lib/libmd \ - lib/libnv \ - lib/msun \ - - -.include - -.if ${DEP_RELDIR} == ${_DEP_RELDIR} -# local dependencies - needed for -jN in clean tree -.endif diff --git a/sbin/ping6/ping6.8 b/sbin/ping6/ping6.8 deleted file mode 100644 index 0e355e581370..000000000000 --- a/sbin/ping6/ping6.8 +++ /dev/null @@ -1,567 +0,0 @@ -.\" $KAME: ping6.8,v 1.58 2003/06/20 12:00:22 itojun Exp $ -.\" -.\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. -.\" 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. -.\" 3. Neither the name of the project nor the names of its contributors -.\" may be used to endorse or promote products derived from this software -.\" without specific prior written permission. -.\" -.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT 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 PROJECT 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$ -.\" -.Dd October 2, 2020 -.Dt PING6 8 -.Os -.Sh NAME -.Nm ping6 -.Nd send -.Tn ICMPv6 ECHO_REQUEST -packets to network hosts -.Sh SYNOPSIS -.Nm -.\" without ipsec, or new ipsec -.Op Fl aAdDfHnNoOquvyY -.\" old ipsec -.\" .Op Fl ADdEfmnNqRtvwW -.Bk -words -.Op Fl b Ar bufsiz -.Ek -.Bk -words -.Op Fl C Ar pcp -.Ek -.Bk -words -.Op Fl c Ar count -.Ek -.Bk -words -.Op Fl e Ar gateway -.Ek -.Bk -words -.Op Fl I Ar interface -.Ek -.Bk -words -.Op Fl i Ar wait -.Ek -.Bk -words -.Op Fl k Ar addrtype -.Ek -.Bk -words -.Op Fl l Ar preload -.Ek -.Bk -words -.Op Fl m Ar hoplimit -.Ek -.Bk -words -.\" new ipsec -.Op Fl P Ar policy -.Ek -.Bk -words -.Op Fl p Ar pattern -.Ek -.Bk -words -.Op Fl S Ar sourceaddr -.Ek -.Bk -words -.Op Fl s Ar packetsize -.Ek -.Bk -words -.Op Fl t Ar timeout -.Ek -.Bk -words -.Op Fl W Ar waittime -.Ek -.Bk -words -.Op Fl z Ar tclass -.Ek -.Bk -words -.Op Ar hops ... -.Ek -.Bk -words -.Ar host -.Ek -.Sh DESCRIPTION -The -.Nm -utility uses the -.Tn ICMPv6 -protocol's mandatory -.Tn ICMP6_ECHO_REQUEST -datagram to elicit an -.Tn ICMP6_ECHO_REPLY -from a host or gateway. -.Tn ICMP6_ECHO_REQUEST -datagrams (``pings'') have an IPv6 header, -and -.Tn ICMPv6 -header formatted as documented in RFC2463. -The options are as follows: -.Bl -tag -width Ds -.\" old ipsec -.\" .It Fl Z -.\" Enables transport-mode IPsec authentication header -.\" (experimental). -.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 b Ar bufsiz -Set socket buffer size. -.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). -.It Fl c Ar count -Stop after sending -(and receiving) -.Ar count -.Tn ECHO_RESPONSE -packets. -.It Fl D -Disable IPv6 fragmentation. -.It Fl d -Set the -.Dv SO_DEBUG -option on the socket being used. -.\" .It Fl E -.\" Enables transport-mode IPsec encapsulated security payload -.\" (experimental). -.It Fl f -Flood ping. -Outputs packets as fast as they come back or one hundred times per second, -whichever is more. -For every -.Tn ECHO_REQUEST -sent a period -.Dq \&. -is printed, while for every -.Tn ECHO_REPLY -received a backspace is printed. -This provides a rapid display of how many packets are being dropped. -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 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 H -Specifies to try reverse-lookup of IPv6 addresses. -The -.Nm -utility does not try reverse-lookup unless the option is specified. -.It Fl m Ar hoplimit -Set the IPv6 hoplimit. -.It Fl I Ar interface -Source packets with the given interface address. -This flag applies if the ping destination is a multicast address, -or link-local/site-local unicast address. -.It Fl i Ar wait -Wait -.Ar wait -seconds -.Em between sending each packet . -The default is to wait for one second between each packet. -This option is incompatible with the -.Fl f -option. -.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 t Ar timeout -Specify a timeout, -in seconds, -before ping exits regardless of how many packets have been received. -.It Fl l Ar preload -If -.Ar preload -is specified, -.Nm -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 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 n -Numeric output only. -No attempt will be made to lookup symbolic names from addresses in the reply. -.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 -Exit successfully after receiving one reply packet. -.It Fl p Ar pattern -You may specify up to 16 -.Dq pad -bytes to fill out the packet you send. -This is useful for diagnosing data-dependent problems in a network. -For example, -.Dq Li \-p ff -will cause the sent packet to be filled with all -ones. -.\" new ipsec -.It Fl P Ar policy -.Ar policy -specifies IPsec policy to be used for the probe. -.It Fl q -Quiet output. -Nothing is displayed except the summary lines at startup time and -when finished. -.It Fl a -Audible. -Include a bell -.Tn ( ASCII -0x07) -character in the output when any packet is received. -.It Fl A -Audible. -Output a bell -.Tn ( ASCII -0x07) -character when no packet is received before the next packet -is transmitted. -To cater for round-trip times that are longer than the interval -between transmissions, further missing packets cause a bell only -if the maximum number of unreceived packets has increased. -.It Fl S Ar sourceaddr -Specifies the source address of request packets. -The source address must be one of the unicast addresses of the sending node, -and must be numeric. -.It Fl s Ar packetsize -Specifies 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. -You may need to specify -.Fl b -as well to extend socket buffer size. -.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 v -Verbose output. -.Tn ICMP -packets other than -.Tn ECHO_RESPONSE -that are received are listed. -.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 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 z Ar tclass -Use the specified traffic class when sending. -.It Ar hops -IPv6 addresses for intermediate nodes, -which will be put into type 0 routing header. -.It Ar host -IPv6 address of the final destination node. -.El -.Pp -When using -.Nm -for fault isolation, it should first be run on the local host, to verify -that the local network interface is up and running. -Then, hosts and gateways further and further away should be -.Dq pinged . -Round-trip times and packet loss statistics are computed. -If duplicate packets are received, they are not included in the packet -loss calculation, although the round trip time of these packets is used -in calculating the round-trip time statistics. -When the specified number of packets have been sent -(and received) -or if the program is terminated with a -.Dv SIGINT , -a brief summary is displayed, showing the number of packets sent and -received, and the minimum, mean, maximum, and standard deviation of -the round-trip times. -.Pp -If -.Nm -receives a -.Dv SIGINFO -(see the -.Cm status -argument for -.Xr stty 1 ) -signal, the current number of packets sent and received, and the -minimum, mean, maximum, and standard deviation of the round-trip times -will be written to the standard output in the same format as the -standard completion message. -.Pp -This program is intended for use in network testing, measurement and -management. -Because of the load it can impose on the network, it is unwise to use -.Nm -during normal operations or from automated scripts. -.\" .Sh ICMP PACKET DETAILS -.\" An IP header without options is 20 bytes. -.\" An -.\" .Tn ICMP -.\" .Tn ECHO_REQUEST -.\" packet contains an additional 8 bytes worth of -.\" .Tn ICMP -.\" header followed by an arbitrary amount of data. -.\" When a -.\" .Ar packetsize -.\" is given, this indicated the size of this extra piece of data -.\" (the default is 56). -.\" Thus the amount of data received inside of an IP packet of type -.\" .Tn ICMP -.\" .Tn ECHO_REPLY -.\" will always be 8 bytes more than the requested data space -.\" (the -.\" .Tn ICMP -.\" header). -.\" .Pp -.\" If the data space is at least eight bytes large, -.\" .Nm -.\" uses the first eight bytes of this space to include a timestamp which -.\" it uses in the computation of round trip times. -.\" If less than eight bytes of pad are specified, no round trip times are -.\" given. -.Sh DUPLICATE AND DAMAGED PACKETS -The -.Nm -utility will report duplicate and damaged packets. -Duplicate packets should never occur when pinging a unicast address, -and seem to be caused by -inappropriate link-level retransmissions. -Duplicates may occur in many situations and are rarely -(if ever) -a good sign, although the presence of low levels of duplicates may not -always be cause for alarm. -Duplicates are expected when pinging a broadcast or multicast address, -since they are not really duplicates but replies from different hosts -to the same request. -.Pp -Damaged packets are obviously serious cause for alarm and often -indicate broken hardware somewhere in the -.Nm -packet's path -(in the network or in the hosts). -.Sh TRYING DIFFERENT DATA PATTERNS -The -(inter)network -layer should never treat packets differently depending on the data -contained in the data portion. -Unfortunately, data-dependent problems have been known to sneak into -networks and remain undetected for long periods of time. -In many cases the particular pattern that will have problems is something -that does not have sufficient -.Dq transitions , -such as all ones or all zeros, or a pattern right at the edge, such as -almost all zeros. -It is not -necessarily enough to specify a data pattern of all zeros (for example) -on the command line because the pattern that is of interest is -at the data link level, and the relationship between what you type and -what the controllers transmit can be complicated. -.Pp -This means that if you have a data-dependent problem you will probably -have to do a lot of testing to find it. -If you are lucky, you may manage to find a file that either -cannot -be sent across your network or that takes much longer to transfer than -other similar length files. -You can then examine this file for repeated patterns that you can test -using the -.Fl p -option of -.Nm . -.Sh EXIT STATUS -The -.Nm -utility returns 0 on success (the host is alive), -2 if the transmission was successful but no responses were received, -any other non-zero value if the arguments are incorrect or -another error has occurred. -.Sh EXAMPLES -Normally, -.Nm -works just like -.Xr ping 8 -would work; the following will send ICMPv6 echo request to -.Li dst.foo.com . -.Bd -literal -offset indent -ping6 -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 -ping6 -y ff02::1%wi0 -.Ed -.Pp -The following will probe addresses assigned to the destination node, -.Li dst.foo.com . -.Bd -literal -offset indent -ping6 -k agl dst.foo.com -.Ed -.Sh SEE ALSO -.Xr netstat 1 , -.Xr icmp6 4 , -.Xr inet6 4 , -.Xr ip6 4 , -.Xr ifconfig 8 , -.Xr ping 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 RFC2463 -.%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 -.Xr ping 8 -utility appeared in -.Bx 4.3 . -The -.Nm -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 . -.Sh BUGS -The -.Nm -utility -is intentionally separate from -.Xr ping 8 . -.Pp -There have been many discussions on why we separate -.Nm -and -.Xr ping 8 . -Some people argued that it would be more convenient to uniform the -ping command for both IPv4 and IPv6. -The followings are an answer to the request. -.Pp -From a developer's point of view: -since the underling raw sockets API is totally different between IPv4 -and IPv6, we would end up having two types of code base. -There would actually be less benefit to uniform the two commands -into a single command from the developer's standpoint. -.Pp -From an operator's point of view: unlike ordinary network applications -like remote login tools, we are usually aware of address family when using -network management tools. -We do not just want to know the reachability to the host, but want to know the -reachability to the host via a particular network protocol such as -IPv6. -Thus, even if we had a unified -.Xr ping 8 -command for both IPv4 and IPv6, we would usually type a -.Fl 6 -or -.Fl 4 -option (or something like those) to specify the particular address family. -This essentially means that we have two different commands. diff --git a/sbin/ping6/tests/Makefile b/sbin/ping6/tests/Makefile deleted file mode 100644 index f773d23c294a..000000000000 --- a/sbin/ping6/tests/Makefile +++ /dev/null @@ -1,8 +0,0 @@ -# $FreeBSD$ - -PACKAGE= tests - -ATF_TESTS_SH+= ping6_test -${PACKAGE}FILES+= ping6_c1_s8_t1.out - -.include diff --git a/sbin/ping6/tests/ping6_test.sh b/sbin/ping6/tests/ping6_test.sh deleted file mode 100644 index d7721d620614..000000000000 --- a/sbin/ping6/tests/ping6_test.sh +++ /dev/null @@ -1,53 +0,0 @@ -# -# 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$ - -atf_test_case ping6_c1_s8_t1 -ping6_c1_s8_t1_head() { - atf_set "descr" "Stop after receiving 1 ECHO_RESPONSE packet" -} -ping6_c1_s8_t1_body() { - if ! getaddrinfo -f inet6 localhost 1>/dev/null 2>&1; then - atf_skip "IPv6 is not configured" - fi - atf_check -s exit:0 -o save:std.out -e empty \ - ping6 -c 1 -s 8 -t 1 localhost - check_ping_statistics std.out $(atf_get_srcdir)/ping6_c1_s8_t1.out -} - -atf_init_test_cases() { - atf_add_test_case ping6_c1_s8_t1 -} - -check_ping_statistics() { - sed -e 's/0.[0-9]\{3\}//g' \ - -e 's/[1-9][0-9]*.[0-9]\{3\}//g' \ - -e 's/hlim=[0-9][0-9]*/hlim=/' \ - "$1" >"$1".filtered - atf_check -s exit:0 diff -u "$1".filtered "$2" -} diff --git a/tools/build/mk/OptionalObsoleteFiles.inc b/tools/build/mk/OptionalObsoleteFiles.inc index b82a947125c4..658a049603a2 100644 --- a/tools/build/mk/OptionalObsoleteFiles.inc +++ b/tools/build/mk/OptionalObsoleteFiles.inc @@ -2583,7 +2583,6 @@ OLD_DIRS+=usr/share/i18n/csmapper/GB .endif .if ${MK_INET6} == no -OLD_FILES+=sbin/ping6 OLD_FILES+=sbin/rtsol OLD_FILES+=usr/sbin/ip6addrctl OLD_FILES+=usr/sbin/mld6query @@ -2601,7 +2600,6 @@ OLD_FILES+=usr/share/man/man5/rtadvd.conf.5.gz OLD_FILES+=usr/share/man/man8/ip6addrctl.8.gz OLD_FILES+=usr/share/man/man8/mld6query.8.gz OLD_FILES+=usr/share/man/man8/ndp.8.gz -OLD_FILES+=usr/share/man/man8/ping6.8.gz OLD_FILES+=usr/share/man/man8/rip6query.8.gz OLD_FILES+=usr/share/man/man8/route6d.8.gz OLD_FILES+=usr/share/man/man8/rrenumd.8.gz @@ -2613,7 +2611,6 @@ OLD_FILES+=usr/share/man/man8/traceroute6.8.gz .endif .if ${MK_INET6_SUPPORT} == no -OLD_FILES+=rescue/ping6 OLD_FILES+=rescue/rtsol .endif