netbsd ping & traceroute
. remove minix ping . add support for socket(AF_INET, SOCK_RAW, {IPPROTO_ICMP,IPPROTO_UDP}) . gives test48 a better chance of detecting network connectivity Change-Id: Ia678546d27ac378642f1160a141e1fc33458cce2
This commit is contained in:
parent
9a718e59fd
commit
7f5f010bbd
38 changed files with 6485 additions and 196 deletions
|
@ -144,6 +144,7 @@
|
|||
./sbin/mknod minix-sys
|
||||
./sbin/newfs_ext2fs minix-sys
|
||||
./sbin/nologin minix-sys
|
||||
./sbin/ping minix-sys
|
||||
./sbin/poweroff minix-sys
|
||||
./sbin/reboot minix-sys
|
||||
./sbin/shutdown minix-sys
|
||||
|
@ -435,7 +436,7 @@
|
|||
./usr/bin/paste minix-sys
|
||||
./usr/bin/patch minix-sys
|
||||
./usr/bin/pathchk minix-sys
|
||||
./usr/bin/ping minix-sys
|
||||
./usr/bin/ping minix-sys obsolete
|
||||
./usr/bin/pkgin_all minix-sys
|
||||
./usr/bin/pkgin_cd minix-sys
|
||||
./usr/bin/pkgin_sets minix-sys
|
||||
|
@ -1441,6 +1442,8 @@
|
|||
./usr/include/net/if_ether.h minix-sys
|
||||
./usr/include/net/if.h minix-sys
|
||||
./usr/include/net/netlib.h minix-sys
|
||||
./usr/include/net/radix.h minix-sys
|
||||
./usr/include/net/route.h minix-sys
|
||||
./usr/include/netconfig.h minix-sys
|
||||
./usr/include/netdb.h minix-sys
|
||||
./usr/include/netgroup.h minix-sys
|
||||
|
@ -1448,7 +1451,11 @@
|
|||
./usr/include/netinet/in.h minix-sys
|
||||
./usr/include/netinet/in_systm.h minix-sys
|
||||
./usr/include/netinet/ip.h minix-sys
|
||||
./usr/include/netinet/ip_icmp.h minix-sys
|
||||
./usr/include/netinet/ip_var.h minix-sys
|
||||
./usr/include/netinet/tcp.h minix-sys
|
||||
./usr/include/netinet/udp.h minix-sys
|
||||
./usr/include/netinet/udp_var.h minix-sys
|
||||
./usr/include/netinet6 minix-sys
|
||||
./usr/include/netinet6/in6.h minix-sys
|
||||
./usr/include/nlist.h minix-sys
|
||||
|
@ -2429,7 +2436,7 @@
|
|||
./usr/man/man1/patch.1 minix-sys
|
||||
./usr/man/man1/pathchk.1 minix-sys
|
||||
./usr/man/man1/pax.1 minix-sys
|
||||
./usr/man/man1/ping.1 minix-sys
|
||||
./usr/man/man1/ping.1 minix-sys obsolete
|
||||
./usr/man/man1/pkg_view.1 minix-sys
|
||||
./usr/man/man1/playwave.1 minix-sys
|
||||
./usr/man/man1/pr.1 minix-sys
|
||||
|
@ -5083,6 +5090,7 @@
|
|||
./usr/man/man8/ossdevlinks.8 minix-sys
|
||||
./usr/man/man8/part.8 minix-sys
|
||||
./usr/man/man8/partition.8 minix-sys
|
||||
./usr/man/man8/ping.8 minix-sys
|
||||
./usr/man/man8/postinstall.8 minix-sys
|
||||
./usr/man/man8/poweroff.8 minix-sys
|
||||
./usr/man/man8/printroot.8 minix-sys
|
||||
|
@ -5107,6 +5115,7 @@
|
|||
./usr/man/man8/sync.8 minix-sys
|
||||
./usr/man/man8/syslogd.8 minix-sys
|
||||
./usr/man/man8/tcpd.8 minix-sys
|
||||
./usr/man/man8/traceroute.8 minix-sys
|
||||
./usr/man/man8/unix.8 minix-sys
|
||||
./usr/man/man8/unlink.8 minix-sys
|
||||
./usr/man/man8/unstr.8 minix-sys
|
||||
|
@ -5156,6 +5165,7 @@
|
|||
./usr/sbin/postinstall minix-sys
|
||||
./usr/sbin/pwd_mkdb minix-sys
|
||||
./usr/sbin/rdate minix-sys
|
||||
./usr/sbin/traceroute minix-sys
|
||||
./usr/sbin/unlink minix-sys
|
||||
./usr/sbin/user minix-sys
|
||||
./usr/sbin/useradd minix-sys
|
||||
|
|
|
@ -18,7 +18,7 @@ SUBDIR= add_route arp ash at backup btrace \
|
|||
mined \
|
||||
mount mt netconf \
|
||||
nonamed \
|
||||
ping postinstall prep printroot \
|
||||
postinstall prep printroot \
|
||||
profile progressbar pr_routes ps pwdauth \
|
||||
ramdisk rarpd rawspeed rcp readclock \
|
||||
remsync rget rlogin \
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
PROG= ping
|
||||
BINMODE= 4755
|
||||
MAN=
|
||||
|
||||
.include <bsd.prog.mk>
|
|
@ -1,150 +0,0 @@
|
|||
/*
|
||||
ping.c
|
||||
*/
|
||||
|
||||
#define DEBUG 1
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
#include <net/gen/netdb.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <net/gen/oneCsum.h>
|
||||
#include <fcntl.h>
|
||||
#include <net/gen/in.h>
|
||||
#include <net/gen/inet.h>
|
||||
#include <net/gen/ip_hdr.h>
|
||||
#include <net/gen/icmp_hdr.h>
|
||||
#include <net/gen/ip_io.h>
|
||||
|
||||
#define WRITE_SIZE 30
|
||||
char buffer[16*1024];
|
||||
|
||||
int main(int argc, char *argv[]);
|
||||
|
||||
#if DEBUG
|
||||
#define where() fprintf(stderr, "%s %d:", __FILE__, __LINE__);
|
||||
#endif
|
||||
|
||||
#if __STDC__
|
||||
#define PROTO(x,y) x y
|
||||
#else
|
||||
#define PROTO(x,y) X ()
|
||||
#endif
|
||||
|
||||
PROTO (int main, (int argc, char *argv[]) );
|
||||
static PROTO (void sig_hand, (int signal) );
|
||||
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
int fd, i;
|
||||
int result, result1;
|
||||
nwio_ipopt_t ipopt;
|
||||
ip_hdr_t *ip_hdr;
|
||||
int ihl;
|
||||
icmp_hdr_t *icmp_hdr;
|
||||
ipaddr_t dst_addr;
|
||||
struct hostent *hostent;
|
||||
int length;
|
||||
|
||||
if (argc<2 || argc>3)
|
||||
{
|
||||
fprintf(stderr, "Usage: %s hostname [length]\n", argv[0]);
|
||||
exit(1);
|
||||
}
|
||||
hostent= gethostbyname(argv[1]);
|
||||
if (!hostent)
|
||||
{
|
||||
dst_addr= inet_addr(argv[1]);
|
||||
if (dst_addr == -1)
|
||||
{
|
||||
fprintf(stderr, "%s: unknown host (%s)\n",
|
||||
argv[0], argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
dst_addr= *(ipaddr_t *)(hostent->h_addr);
|
||||
if (argc == 3)
|
||||
{
|
||||
length= strtol (argv[2], (char **)0, 0);
|
||||
if (length< sizeof(icmp_hdr_t) + IP_MIN_HDR_SIZE)
|
||||
{
|
||||
fprintf(stderr, "%s: length too small (%s)\n",
|
||||
argv[0], argv[2]);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
length= WRITE_SIZE;
|
||||
|
||||
fd= open ("/dev/ip", O_RDWR);
|
||||
if (fd<0)
|
||||
perror("open"), exit(1);
|
||||
|
||||
ipopt.nwio_flags= NWIO_COPY | NWIO_PROTOSPEC;
|
||||
ipopt.nwio_proto= 1;
|
||||
|
||||
result= ioctl (fd, NWIOSIPOPT, &ipopt);
|
||||
if (result<0)
|
||||
perror("ioctl (NWIOSIPOPT)"), exit(1);
|
||||
|
||||
result= ioctl (fd, NWIOGIPOPT, &ipopt);
|
||||
if (result<0)
|
||||
perror("ioctl (NWIOGIPOPT)"), exit(1);
|
||||
|
||||
for (i= 0; i< 20; i++)
|
||||
{
|
||||
ip_hdr= (ip_hdr_t *)buffer;
|
||||
ip_hdr->ih_dst= dst_addr;
|
||||
|
||||
icmp_hdr= (icmp_hdr_t *)(buffer+20);
|
||||
icmp_hdr->ih_type= 8;
|
||||
icmp_hdr->ih_code= 0;
|
||||
icmp_hdr->ih_chksum= 0;
|
||||
icmp_hdr->ih_chksum= ~oneC_sum(0, (u16_t *)icmp_hdr,
|
||||
WRITE_SIZE-20);
|
||||
result= write(fd, buffer, length);
|
||||
if (result<0)
|
||||
{
|
||||
perror("write");
|
||||
exit(1);
|
||||
}
|
||||
if (result != length)
|
||||
{
|
||||
where();
|
||||
fprintf(stderr, "result= %d\n", result);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
alarm(0);
|
||||
signal (SIGALRM, sig_hand);
|
||||
alarm(1);
|
||||
|
||||
result= read(fd, buffer, sizeof(buffer));
|
||||
if (result>= 0 || errno != EINTR)
|
||||
break;
|
||||
}
|
||||
if (i >= 20)
|
||||
{
|
||||
printf("no answer from %s\n", argv[1]);
|
||||
exit(1);
|
||||
}
|
||||
if (result<0)
|
||||
{
|
||||
perror ("read");
|
||||
exit(1);
|
||||
}
|
||||
printf("%s is alive\n", argv[1]);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void sig_hand(signal)
|
||||
int signal;
|
||||
{
|
||||
}
|
|
@ -9,7 +9,5 @@ server/ip/gen/inet.h
|
|||
|
||||
ipaddr_t inet_addr( const char *addr );
|
||||
ipaddr_t inet_network( const char *addr );
|
||||
char *inet_ntoa( ipaddr_t addr );
|
||||
int inet_aton( const char *cp, ipaddr_t *pin );
|
||||
|
||||
#endif /* __SERVER__IP__GEN__INET_H__ */
|
||||
|
|
|
@ -20,6 +20,9 @@
|
|||
#include <net/gen/udp_hdr.h>
|
||||
#include <net/gen/udp_io.h>
|
||||
|
||||
#include <net/gen/ip_hdr.h>
|
||||
#include <net/gen/icmp_hdr.h>
|
||||
|
||||
#define DEBUG 0
|
||||
|
||||
static ssize_t _tcp_recvfrom(int sock, void *__restrict buffer, size_t length,
|
||||
|
@ -85,6 +88,37 @@ ssize_t recvfrom(int sock, void *__restrict buffer, size_t length,
|
|||
}
|
||||
}
|
||||
|
||||
{
|
||||
ip_hdr_t *ip_hdr;
|
||||
int ihl, rd;
|
||||
icmp_hdr_t *icmp_hdr;
|
||||
struct sockaddr_in sin;
|
||||
|
||||
rd = read(sock, buffer, length);
|
||||
|
||||
if(rd < 0) return rd;
|
||||
|
||||
assert(rd >= sizeof(*ip_hdr));
|
||||
|
||||
ip_hdr= buffer;
|
||||
|
||||
if (address != NULL)
|
||||
{
|
||||
int len;
|
||||
memset(&sin, 0, sizeof(sin));
|
||||
sin.sin_family= AF_INET;
|
||||
sin.sin_addr.s_addr= ip_hdr->ih_src;
|
||||
sin.sin_len= sizeof(sin);
|
||||
len= *address_len;
|
||||
if (len > sizeof(sin))
|
||||
len= sizeof(sin);
|
||||
memcpy(address, &sin, len);
|
||||
*address_len= sizeof(sin);
|
||||
}
|
||||
|
||||
return rd;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
fprintf(stderr, "recvfrom: not implemented for fd %d\n", sock);
|
||||
#endif
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <netinet/in.h>
|
||||
|
||||
#include <net/gen/in.h>
|
||||
#include <net/gen/ip_hdr.h>
|
||||
#include <net/gen/icmp_hdr.h>
|
||||
#include <net/gen/tcp.h>
|
||||
#include <net/gen/tcp_io.h>
|
||||
#include <net/gen/udp.h>
|
||||
|
@ -76,6 +78,26 @@ ssize_t sendto(int sock, const void *message, size_t length, int flags,
|
|||
}
|
||||
}
|
||||
|
||||
{
|
||||
ip_hdr_t *ip_hdr;
|
||||
int ihl;
|
||||
icmp_hdr_t *icmp_hdr;
|
||||
struct sockaddr_in *sinp;
|
||||
|
||||
sinp = (struct sockaddr_in *) __UNCONST(dest_addr);
|
||||
if (sinp->sin_family != AF_INET)
|
||||
{
|
||||
errno= EAFNOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* raw */
|
||||
ip_hdr= (ip_hdr_t *)message;
|
||||
ip_hdr->ih_dst= sinp->sin_addr.s_addr;
|
||||
|
||||
return write(sock, message, length);
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
fprintf(stderr, "sendto: not implemented for fd %d\n", sock);
|
||||
#endif
|
||||
|
|
|
@ -11,7 +11,19 @@ __weak_alias(socket, __socket30)
|
|||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <sys/ioc_net.h>
|
||||
#include <net/hton.h>
|
||||
#include <net/gen/in.h>
|
||||
#include <net/gen/ether.h>
|
||||
#include <net/gen/eth_hdr.h>
|
||||
#include <net/gen/eth_io.h>
|
||||
#include <net/gen/ip_hdr.h>
|
||||
#include <net/gen/ip_io.h>
|
||||
#include <net/gen/udp.h>
|
||||
#include <net/gen/udp_hdr.h>
|
||||
#include <net/gen/udp_io.h>
|
||||
#include <net/gen/dhcp.h>
|
||||
|
||||
#include <net/netlib.h>
|
||||
#include <netinet/in.h>
|
||||
|
@ -21,6 +33,7 @@ __weak_alias(socket, __socket30)
|
|||
static int _tcp_socket(int type, int protocol);
|
||||
static int _udp_socket(int type, int protocol);
|
||||
static int _uds_socket(int type, int protocol);
|
||||
static int _raw_socket(int type, int protocol);
|
||||
static void _socket_flags(int type, int *result);
|
||||
|
||||
int socket(int domain, int type, int protocol)
|
||||
|
@ -53,6 +66,12 @@ int socket(int domain, int type, int protocol)
|
|||
if (domain == AF_INET && sock_type == SOCK_DGRAM)
|
||||
return _udp_socket(type, protocol);
|
||||
|
||||
if (domain == AF_INET && sock_type == SOCK_RAW && protocol == IPPROTO_ICMP)
|
||||
return _raw_socket(type, protocol);
|
||||
|
||||
if (domain == AF_INET && sock_type == SOCK_RAW && protocol == IPPROTO_UDP)
|
||||
return _raw_socket(type, protocol);
|
||||
|
||||
#if DEBUG
|
||||
fprintf(stderr, "socket: nothing for domain %d, type %d, protocol %d\n",
|
||||
domain, type, protocol);
|
||||
|
@ -127,6 +146,50 @@ static int _udp_socket(int type, int protocol)
|
|||
return fd;
|
||||
}
|
||||
|
||||
static int _raw_socket(int type, int protocol)
|
||||
{
|
||||
int r, fd, t_errno, flags = O_RDWR;
|
||||
struct sockaddr_in sin;
|
||||
nwio_ipopt_t ipopt;
|
||||
int result;
|
||||
|
||||
if (protocol != IPPROTO_ICMP && protocol != IPPROTO_UDP && protocol != 0)
|
||||
{
|
||||
#if DEBUG
|
||||
fprintf(stderr, "socket(icmp): bad protocol %d\n", protocol);
|
||||
#endif
|
||||
errno= EPROTONOSUPPORT;
|
||||
return -1;
|
||||
}
|
||||
_socket_flags(type, &flags);
|
||||
fd= open(IP_DEVICE, flags);
|
||||
if (fd == -1)
|
||||
return fd;
|
||||
|
||||
memset(&ipopt, 0, sizeof(ipopt));
|
||||
|
||||
ipopt.nwio_flags= NWIO_COPY;
|
||||
|
||||
if(protocol) {
|
||||
ipopt.nwio_flags |= NWIO_PROTOSPEC;
|
||||
ipopt.nwio_proto = protocol;
|
||||
}
|
||||
|
||||
result = ioctl (fd, NWIOSIPOPT, &ipopt);
|
||||
if (result<0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
result = ioctl (fd, NWIOGIPOPT, &ipopt);
|
||||
if (result<0) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
||||
static int _uds_socket(int type, int protocol)
|
||||
{
|
||||
int fd, r, flags = O_RDWR, sock_type;
|
||||
|
|
|
@ -11,7 +11,7 @@ MAN= ash.1 at.1 \
|
|||
look.1 lp.1 lspci.1 mail.1 \
|
||||
mixer.1 \
|
||||
mkproto.1 mount.1 mt.1 \
|
||||
ping.1 playwave.1 prep.1 \
|
||||
playwave.1 prep.1 \
|
||||
profile.1 ps.1 rcp.1 recwave.1 \
|
||||
remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
|
||||
spell.1 svc.1 svrctl.1 \
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
.TH PING 1
|
||||
.SH NAME
|
||||
ping \- send ICMP ECHO_REQUEST packets to network hosts
|
||||
.SH SYNOPSIS
|
||||
.B /usr/bin/ping hostname [length]
|
||||
.de EX
|
||||
.TP 20
|
||||
\\fB\$1\\fR
|
||||
# \\$2
|
||||
..
|
||||
.SH EXAMPLES
|
||||
.TP 20
|
||||
.B ping 192.168.1.1
|
||||
# Ping host 192.168.1.1
|
||||
.TP 20
|
||||
.B ping www.minix3.org 500
|
||||
# Ping www.minix3.org with 500 byte IP packets
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
Sends ICMP ECHO_REQUEST packets to the specified host and waits for a ECHO_REPLY.
|
||||
Optionally, the length (size) of the IP packet can be specified. The default is
|
||||
30 bytes. (Note, the 14 byte Ethernet header will make this a 44 byte packet.)
|
||||
.SH OPTIONS
|
||||
.IP length
|
||||
Size (in bytes) of the transmitted ICMP packet. The default length of the IP
|
||||
packet is 30 bytes. (Adding the ethernet header will result in a 44 byte
|
||||
packet being transmitted.)
|
||||
.SH "SEE ALSO"
|
||||
ifconfig(8)
|
||||
.SH AUTHOR
|
||||
Leith Brandeland <lb.minix@gmail.com>
|
|
@ -580,7 +580,7 @@ static int can_use_network(void)
|
|||
int status;
|
||||
|
||||
/* try to ping minix3.org */
|
||||
status = system("ping www.minix3.org > /dev/null 2>&1");
|
||||
status = system("ping -w 5 www.minix3.org > /dev/null 2>&1");
|
||||
if (status == 127)
|
||||
{
|
||||
printf("cannot execute ping\n");
|
||||
|
|
|
@ -10,10 +10,10 @@ SUBDIR= \
|
|||
chown \
|
||||
fsck init \
|
||||
mknod nologin \
|
||||
ping \
|
||||
reboot \
|
||||
shutdown \
|
||||
|
||||
|
||||
# support for various file systems
|
||||
SUBDIR+= newfs_ext2fs fsck_ext2fs
|
||||
.if !defined(__MINIX)
|
||||
|
|
22
sbin/ping/Makefile
Normal file
22
sbin/ping/Makefile
Normal file
|
@ -0,0 +1,22 @@
|
|||
# $NetBSD: Makefile,v 1.17 2013/11/09 21:39:27 christos Exp $
|
||||
# @(#)Makefile 8.1 (Berkeley) 6/5/93
|
||||
|
||||
USE_FORT?= yes # setuid
|
||||
RUMPPRG=ping
|
||||
MAN= ping.8
|
||||
BINOWN= root
|
||||
BINMODE=4555
|
||||
LDADD= -lm
|
||||
DPADD= ${LIBM}
|
||||
|
||||
# BJG - no ipsec
|
||||
#CPPFLAGS+= -DIPSEC
|
||||
|
||||
#LDADD+= -lipsec
|
||||
#DPADD+= ${LIBIPSEC}
|
||||
|
||||
.if ${MACHINE_ARCH} == "vax"
|
||||
COPTS.ping.c=-O0
|
||||
.endif
|
||||
|
||||
.include <bsd.prog.mk>
|
478
sbin/ping/ping.8
Normal file
478
sbin/ping/ping.8
Normal file
|
@ -0,0 +1,478 @@
|
|||
.\" $NetBSD: ping.8,v 1.50 2011/09/10 20:47:33 wiz Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1985, 1991, 1993
|
||||
.\" The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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.
|
||||
.\"
|
||||
.\" @(#)ping.8 8.2 (Berkeley) 12/11/93
|
||||
.\"
|
||||
.Dd September 10, 2011
|
||||
.Dt PING 8
|
||||
.Os
|
||||
.Sh NAME
|
||||
.Nm ping
|
||||
.Nd send
|
||||
.Tn ICMP ECHO_REQUEST
|
||||
packets to network hosts
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl aCDdfLnoPQqRrv
|
||||
.Op Fl c Ar count
|
||||
.Op Fl E Ar policy
|
||||
.Op Fl g Ar gateway
|
||||
.Op Fl h Ar host
|
||||
.Op Fl I Ar srcaddr
|
||||
.Op Fl i Ar interval
|
||||
.Op Fl l Ar preload
|
||||
.Op Fl p Ar pattern
|
||||
.Op Fl s Ar packetsize
|
||||
.Op Fl T Ar ttl
|
||||
.Op Fl t Ar tos
|
||||
.Op Fl w Ar deadline
|
||||
.Ar host
|
||||
.Sh DESCRIPTION
|
||||
.Nm
|
||||
uses the
|
||||
.Tn ICMP
|
||||
protocol's mandatory
|
||||
.Tn ECHO_REQUEST
|
||||
datagram to elicit an
|
||||
.Tn ICMP ECHO_RESPONSE
|
||||
from a host or gateway.
|
||||
.Tn ECHO_REQUEST
|
||||
datagrams (``pings'') have an IP and
|
||||
.Tn ICMP
|
||||
header,
|
||||
followed by a
|
||||
.Dq struct timespec
|
||||
and then an arbitrary number of ``pad'' bytes used to fill out the
|
||||
packet.
|
||||
The options are as follows:
|
||||
.Bl -tag -width Ds
|
||||
.It Fl a
|
||||
Emit an audible beep (by sending an ascii BEL character to the
|
||||
standard error output) after each non-duplicate response is received.
|
||||
This is disabled for flood pings as it would probably cause temporary
|
||||
insanity.
|
||||
.It Fl C
|
||||
Send timestamps in compat format; two 32 bit words in little endian format,
|
||||
the first one representing seconds, and the second one representing
|
||||
microseconds.
|
||||
.It Fl c Ar count
|
||||
Stop after sending (and waiting the specified delay to receive)
|
||||
.Ar count
|
||||
.Tn ECHO_RESPONSE
|
||||
packets.
|
||||
.It Fl D
|
||||
Set the
|
||||
.Dv Don't Fragment
|
||||
bit in the IP header.
|
||||
This can be used to determine the path MTU.
|
||||
.It Fl d
|
||||
Set the
|
||||
.Dv SO_DEBUG
|
||||
option on the socket being used.
|
||||
.It Fl E Ar policy
|
||||
Use IPsec policy specification string
|
||||
.Ar policy
|
||||
for packets.
|
||||
For the format of specification string, please refer
|
||||
.Xr ipsec_set_policy 3 .
|
||||
Please note that this option is same as
|
||||
.Fl P
|
||||
in KAME/FreeBSD and KAME/BSDI
|
||||
(as
|
||||
.Fl P
|
||||
was already occupied in
|
||||
.Nx ) .
|
||||
.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 ``.'' 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 g Ar gateway
|
||||
Use Loose Source Routing to send the ECHO_REQUEST packets via
|
||||
.Ar gateway .
|
||||
.It Fl h Ar host
|
||||
is an alternate way of specifying the target host instead of as the
|
||||
last argument.
|
||||
.It Fl I Ar srcaddr
|
||||
Set the source IP address to
|
||||
.Ar srcaddr
|
||||
which can be a hostname or an IP number.
|
||||
For multicast datagrams, it also specifies the outgoing interface.
|
||||
.It Fl i Ar interval
|
||||
Wait
|
||||
.Ar interval
|
||||
seconds
|
||||
.Em between sending each packet .
|
||||
The default is to wait for one second between each packet,
|
||||
except when the -f option is used the wait interval is 0.01 seconds.
|
||||
.It Fl L
|
||||
Disable loopback when sending to multicast destinations,
|
||||
so the transmitting host doesn't see the ICMP requests.
|
||||
.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 n
|
||||
Numeric output only.
|
||||
No attempt will be made to look up symbolic names for host addresses.
|
||||
.It Fl o
|
||||
Exit successfully after receiving one reply packet.
|
||||
.It Fl P
|
||||
Use a pseudo-random sequence for the data instead of the default,
|
||||
fixed sequence of incrementing 8-bit integers.
|
||||
This is useful to foil compression on PPP and other links.
|
||||
.It Fl p Ar pattern
|
||||
You may specify up to 16 ``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.
|
||||
.It Fl Q
|
||||
Do not display responses such as Network Unreachable ICMP messages
|
||||
concerning the ECHO_REQUESTs sent.
|
||||
.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
|
||||
.Tn RECORD_ROUTE
|
||||
option in the
|
||||
.Tn ECHO_REQUEST
|
||||
packet and displays the route buffer on returned packets.
|
||||
This should show the path to the target host and back, which is
|
||||
especially useful in the case of asymmetric routing.
|
||||
Note that the IP header is only large enough for nine such addresses,
|
||||
and only seven when using the
|
||||
.Fl g
|
||||
option.
|
||||
This is why it was necessary to invent
|
||||
.Xr traceroute 8 .
|
||||
Many hosts ignore or discard this option.
|
||||
.It Fl r
|
||||
Bypass the normal routing tables and send directly to a host on an attached
|
||||
network.
|
||||
If the host is not on a directly-attached network, an error is returned.
|
||||
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 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.
|
||||
The maximum allowed value is 65467 bytes.
|
||||
.It Fl T Ar ttl
|
||||
Use the specified time-to-live.
|
||||
.It Fl t Ar tos
|
||||
Use the specified hexadecimal type of service.
|
||||
.It Fl v
|
||||
Verbose output.
|
||||
.Tn ICMP
|
||||
packets other than
|
||||
.Tn ECHO_RESPONSE
|
||||
that are received are listed.
|
||||
.It Fl w Ar deadline
|
||||
Specifies a timeout, in seconds, before ping exits regardless of
|
||||
how many packets have been sent or received.
|
||||
.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 ``pinged''.
|
||||
.Pp
|
||||
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 minimum/average/maximum round-trip time numbers.
|
||||
.Pp
|
||||
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.
|
||||
The summary information can be displayed while
|
||||
.Nm
|
||||
is running by sending it a
|
||||
.Dv SIGINFO
|
||||
signal (see the
|
||||
.Dq status
|
||||
argument for
|
||||
.Xr stty 1
|
||||
for more information).
|
||||
.Pp
|
||||
.Nm
|
||||
continually sends one datagram per second, and prints one line of
|
||||
output for every ECHO_RESPONSE returned.
|
||||
On a trusted system with IP
|
||||
Security Options enabled, if the network idiom is not MONO,
|
||||
.Nm
|
||||
also prints a second line containing the hexadecimal representation
|
||||
of the IP security option in the ECHO_RESPONSE.
|
||||
If the
|
||||
.Fl c
|
||||
count option is given, only that number of requests is sent.
|
||||
No output is produced if there is no response.
|
||||
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 minimum/average/maximum round-trip time numbers.
|
||||
When the specified number of packets have been sent (and received) or if
|
||||
the program is terminated with an interrupt (SIGINT), a brief
|
||||
summary is displayed.
|
||||
When not using the
|
||||
.Fl f
|
||||
(flood) option, the first interrupt, usually generated by control-C or DEL,
|
||||
causes
|
||||
.Nm
|
||||
to wait for its outstanding requests to return.
|
||||
It will wait no longer than the longest round trip time
|
||||
encountered by previous, successful pings.
|
||||
The second interrupt stops ping immediately.
|
||||
.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
|
||||
.Dv sizeof(struct timespec)
|
||||
(16) large,
|
||||
.Nm
|
||||
uses the first
|
||||
.Dv sizeof(struct timespec)
|
||||
bytes to include a timestamp to compute round trip times.
|
||||
Otherwise if the data space is at least eight bytes large (or the
|
||||
.Fl C
|
||||
flag is specified),
|
||||
.Nm
|
||||
uses the first eight bytes of this space to include a timestamp to compute
|
||||
round trip times.
|
||||
If there are not enough bytes of pad no round trip times are given.
|
||||
.Sh DUPLICATE AND DAMAGED PACKETS
|
||||
.Nm
|
||||
will report duplicate and damaged packets.
|
||||
Duplicate packets should never occur, 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.
|
||||
.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 doesn't have sufficient ``transitions'', such as all ones or all
|
||||
zeros, or a pattern right at the edge, such as almost all zeros.
|
||||
It isn't 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 can't 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 TTL DETAILS
|
||||
The
|
||||
.Tn TTL
|
||||
value of an IP packet represents the maximum number of IP routers
|
||||
that the packet can go through before being thrown away.
|
||||
In current practice you can expect each router in the Internet to decrement
|
||||
the
|
||||
.Tn TTL
|
||||
field by exactly one.
|
||||
.Pp
|
||||
The
|
||||
.Tn TCP/IP
|
||||
specification states that the
|
||||
.Tn TTL
|
||||
field for
|
||||
.Tn TCP
|
||||
packets should
|
||||
be set to 60, but many systems use smaller values
|
||||
.Po
|
||||
.Bx 4.3
|
||||
uses 30,
|
||||
.Bx 4.2
|
||||
used 15
|
||||
.Pc .
|
||||
.Pp
|
||||
The maximum possible value of this field is 255, and most
|
||||
.Ux
|
||||
systems set the
|
||||
.Tn TTL
|
||||
field of
|
||||
.Tn ICMP ECHO_REQUEST
|
||||
packets to 255.
|
||||
This is why you will find you can ``ping'' some hosts, but not reach them
|
||||
with
|
||||
.Xr telnet 1
|
||||
or
|
||||
.Xr ftp 1 .
|
||||
.Pp
|
||||
In normal operation ping prints the ttl value from the packet it receives.
|
||||
When a remote system receives a ping packet, it can do one of three things
|
||||
with the
|
||||
.Tn TTL
|
||||
field in its response:
|
||||
.Bl -bullet
|
||||
.It
|
||||
Not change it; this is what Berkeley
|
||||
.Ux
|
||||
systems did before the
|
||||
.Bx 4.3 tahoe
|
||||
release.
|
||||
In this case the
|
||||
.Tn TTL
|
||||
value in the received packet will be 255 minus the
|
||||
number of routers in the round-trip path.
|
||||
.It
|
||||
Set it to 255; this is what current Berkeley
|
||||
.Ux
|
||||
systems do.
|
||||
In this case the
|
||||
.Tn TTL
|
||||
value in the received packet will be 255 minus the
|
||||
number of routers in the path
|
||||
.Em from
|
||||
the remote system
|
||||
.Em to
|
||||
the
|
||||
.Nm Ns Em ing
|
||||
host.
|
||||
.It
|
||||
Set it to some other value.
|
||||
Some machines use the same value for
|
||||
.Tn ICMP
|
||||
packets that they use for
|
||||
.Tn TCP
|
||||
packets, for example either 30 or 60.
|
||||
Others may use completely wild values.
|
||||
.El
|
||||
.Sh EXIT STATUS
|
||||
.Nm
|
||||
returns 0 on success (the host is alive),
|
||||
and non-zero if the arguments are incorrect or the host is not responding.
|
||||
.Sh SEE ALSO
|
||||
.Xr netstat 1 ,
|
||||
.Xr icmp 4 ,
|
||||
.Xr inet 4 ,
|
||||
.Xr ip 4 ,
|
||||
.Xr ifconfig 8 ,
|
||||
.Xr routed 8 ,
|
||||
.Xr spray 8 ,
|
||||
.Xr traceroute 8
|
||||
.Sh HISTORY
|
||||
The
|
||||
.Nm
|
||||
command appeared in
|
||||
.Bx 4.3 .
|
||||
IPsec support was added by WIDE/KAME project.
|
||||
.Sh BUGS
|
||||
Flood pinging is not recommended in general, and flood pinging a broadcast
|
||||
or multicast address should only be done under very controlled conditions.
|
||||
.Pp
|
||||
The
|
||||
.Nm
|
||||
program has evolved differently under different operating systems,
|
||||
and in some cases the same flag performs a different function
|
||||
under different operating systems.
|
||||
The
|
||||
.Fl t
|
||||
flag conflicts with
|
||||
.Fx .
|
||||
The
|
||||
.Fl a , c , I , i ,
|
||||
.Fl l , P , p , s ,
|
||||
and
|
||||
.Fl t
|
||||
flags conflict with
|
||||
.Sy Solaris .
|
||||
.Pp
|
||||
Some hosts and gateways ignore the
|
||||
.Tn RECORD_ROUTE
|
||||
option.
|
||||
.Pp
|
||||
The maximum IP header length is too small for options like
|
||||
.Tn RECORD_ROUTE
|
||||
to
|
||||
be completely useful.
|
||||
There's not much that that can be done about this, however.
|
1923
sbin/ping/ping.c
Normal file
1923
sbin/ping/ping.c
Normal file
File diff suppressed because it is too large
Load diff
53
sbin/ping/ping_hostops.c
Normal file
53
sbin/ping/ping_hostops.c
Normal file
|
@ -0,0 +1,53 @@
|
|||
/* $NetBSD: ping_hostops.c,v 1.2 2011/03/11 09:59:56 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: ping_hostops.c,v 1.2 2011/03/11 09:59:56 pooka Exp $");
|
||||
#endif /* !lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "prog_ops.h"
|
||||
|
||||
const struct prog_ops prog_ops = {
|
||||
.op_socket = socket,
|
||||
.op_setsockopt = setsockopt,
|
||||
.op_shutdown = shutdown,
|
||||
.op_poll = poll,
|
||||
.op_recvfrom = recvfrom,
|
||||
.op_sendto = sendto,
|
||||
.op_close = close,
|
||||
.op_getuid = getuid,
|
||||
.op_setuid = setuid,
|
||||
};
|
58
sbin/ping/ping_rumpops.c
Normal file
58
sbin/ping/ping_rumpops.c
Normal file
|
@ -0,0 +1,58 @@
|
|||
/* $NetBSD: ping_rumpops.c,v 1.2 2011/03/11 09:59:56 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: ping_rumpops.c,v 1.2 2011/03/11 09:59:56 pooka Exp $");
|
||||
#endif /* !lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <rump/rump.h>
|
||||
#include <rump/rump_syscalls.h>
|
||||
#include <rump/rumpclient.h>
|
||||
|
||||
#include "prog_ops.h"
|
||||
|
||||
const struct prog_ops prog_ops = {
|
||||
.op_init = rumpclient_init,
|
||||
|
||||
.op_socket = rump_sys_socket,
|
||||
.op_setsockopt= rump_sys_setsockopt,
|
||||
.op_shutdown = rump_sys_shutdown,
|
||||
.op_poll = rump_sys_poll,
|
||||
.op_sendto = rump_sys_sendto,
|
||||
.op_recvfrom = rump_sys_recvfrom,
|
||||
.op_close = rump_sys_close,
|
||||
.op_getuid = rump_sys_getuid,
|
||||
.op_setuid = rump_sys_setuid,
|
||||
};
|
79
sbin/ping/prog_ops.h
Normal file
79
sbin/ping/prog_ops.h
Normal file
|
@ -0,0 +1,79 @@
|
|||
/* $NetBSD: prog_ops.h,v 1.3 2011/03/11 09:59:56 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
||||
*/
|
||||
|
||||
#ifndef _PROG_OPS_H_
|
||||
#define _PROG_OPS_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#ifndef CRUNCHOPS
|
||||
struct prog_ops {
|
||||
int (*op_init)(void);
|
||||
|
||||
int (*op_socket)(int, int, int);
|
||||
int (*op_setsockopt)(int, int, int, const void *, socklen_t);
|
||||
int (*op_shutdown)(int, int);
|
||||
|
||||
int (*op_poll)(struct pollfd *, nfds_t, int);
|
||||
|
||||
ssize_t (*op_recvfrom)(int, void *, size_t, int,
|
||||
struct sockaddr *, socklen_t *);
|
||||
ssize_t (*op_sendto)(int, const void *, size_t, int,
|
||||
const struct sockaddr *, socklen_t);
|
||||
|
||||
int (*op_close)(int);
|
||||
|
||||
uid_t (*op_getuid)(void);
|
||||
int (*op_setuid)(uid_t);
|
||||
};
|
||||
extern const struct prog_ops prog_ops;
|
||||
|
||||
#define prog_init prog_ops.op_init
|
||||
#define prog_socket prog_ops.op_socket
|
||||
#define prog_setsockopt prog_ops.op_setsockopt
|
||||
#define prog_shutdown prog_ops.op_shutdown
|
||||
#define prog_poll prog_ops.op_poll
|
||||
#define prog_recvfrom prog_ops.op_recvfrom
|
||||
#define prog_sendto prog_ops.op_sendto
|
||||
#define prog_close prog_ops.op_close
|
||||
#define prog_getuid prog_ops.op_getuid
|
||||
#define prog_setuid prog_ops.op_setuid
|
||||
#else
|
||||
#define prog_init ((int (*)(void))NULL)
|
||||
#define prog_socket socket
|
||||
#define prog_setsockopt setsockopt
|
||||
#define prog_shutdown shutdown
|
||||
#define prog_poll poll
|
||||
#define prog_recvfrom recvfrom
|
||||
#define prog_sendto sendto
|
||||
#define prog_close close
|
||||
#define prog_getuid getuid
|
||||
#define prog_setuid setuid
|
||||
#endif
|
||||
|
||||
#endif /* _PROG_OPS_H_ */
|
|
@ -6,6 +6,8 @@ INCSDIR= /usr/include/net
|
|||
|
||||
INCS= ethertypes.h \
|
||||
if_ether.h \
|
||||
radix.h \
|
||||
route.h \
|
||||
\
|
||||
\
|
||||
\
|
||||
|
|
|
@ -7,8 +7,10 @@ INCS= \
|
|||
in_systm.h \
|
||||
\
|
||||
ip.h \
|
||||
ip_icmp.h \
|
||||
ip_var.h \
|
||||
tcp.h \
|
||||
\
|
||||
udp.h udp_var.h \
|
||||
|
||||
|
||||
.if !defined(__MINIX)
|
||||
|
|
253
sys/netinet/ip_icmp.h
Normal file
253
sys/netinet/ip_icmp.h
Normal file
|
@ -0,0 +1,253 @@
|
|||
/* $NetBSD: ip_icmp.h,v 1.33 2011/12/24 20:18:54 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1982, 1986, 1993
|
||||
* The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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.
|
||||
*
|
||||
* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
|
||||
*/
|
||||
|
||||
#ifndef _NETINET_IP_ICMP_H_
|
||||
#define _NETINET_IP_ICMP_H_
|
||||
|
||||
|
||||
/*
|
||||
* Interface Control Message Protocol Definitions.
|
||||
* Per RFC 792, September 1981.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Internal of an ICMP Router Advertisement
|
||||
*/
|
||||
struct icmp_ra_addr {
|
||||
u_int32_t ira_addr;
|
||||
u_int32_t ira_preference;
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* Structure of an icmp header.
|
||||
*/
|
||||
struct icmp {
|
||||
u_int8_t icmp_type; /* type of message, see below */
|
||||
u_int8_t icmp_code; /* type sub code */
|
||||
u_int16_t icmp_cksum; /* ones complement cksum of struct */
|
||||
union {
|
||||
u_int8_t ih_pptr; /* ICMP_PARAMPROB */
|
||||
struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
|
||||
struct ih_idseq {
|
||||
n_short icd_id;
|
||||
n_short icd_seq;
|
||||
} ih_idseq __packed;
|
||||
int32_t ih_void;
|
||||
|
||||
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
|
||||
struct ih_pmtu {
|
||||
n_short ipm_void;
|
||||
n_short ipm_nextmtu;
|
||||
} ih_pmtu __packed;
|
||||
struct ih_rtradv {
|
||||
u_int8_t irt_num_addrs;
|
||||
u_int8_t irt_wpa;
|
||||
u_int16_t irt_lifetime;
|
||||
} ih_rtradv __packed;
|
||||
} icmp_hun /* XXX __packed ??? */;
|
||||
#define icmp_pptr icmp_hun.ih_pptr
|
||||
#define icmp_gwaddr icmp_hun.ih_gwaddr
|
||||
#define icmp_id icmp_hun.ih_idseq.icd_id
|
||||
#define icmp_seq icmp_hun.ih_idseq.icd_seq
|
||||
#define icmp_void icmp_hun.ih_void
|
||||
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
|
||||
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
|
||||
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
|
||||
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
|
||||
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
|
||||
union {
|
||||
struct id_ts {
|
||||
n_time its_otime;
|
||||
n_time its_rtime;
|
||||
n_time its_ttime;
|
||||
} id_ts __packed;
|
||||
struct id_ip {
|
||||
struct ip idi_ip;
|
||||
/* options and then 64 bits of data */
|
||||
} id_ip /* XXX: __packed ??? */;
|
||||
struct icmp_ra_addr id_radv;
|
||||
u_int32_t id_mask;
|
||||
int8_t id_data[1];
|
||||
} icmp_dun /* XXX __packed ??? */;
|
||||
#define icmp_otime icmp_dun.id_ts.its_otime
|
||||
#define icmp_rtime icmp_dun.id_ts.its_rtime
|
||||
#define icmp_ttime icmp_dun.id_ts.its_ttime
|
||||
#define icmp_ip icmp_dun.id_ip.idi_ip
|
||||
#define icmp_radv icmp_dun.id_mask
|
||||
#define icmp_mask icmp_dun.id_mask
|
||||
#define icmp_data icmp_dun.id_data
|
||||
};
|
||||
|
||||
/*
|
||||
* Lower bounds on packet lengths for various types.
|
||||
* For the error advice packets must first insure that the
|
||||
* packet is large enought to contain the returned ip header.
|
||||
* Only then can we do the check to see if 64 bits of packet
|
||||
* data have been returned, since we need to check the returned
|
||||
* ip header length.
|
||||
*/
|
||||
#define ICMP_MINLEN 8 /* abs minimum */
|
||||
#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */
|
||||
#define ICMP_MASKLEN 12 /* address mask */
|
||||
#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
|
||||
#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
|
||||
/* N.B.: must separately check that ip_hl >= 5 */
|
||||
|
||||
/*
|
||||
* Definition of type and code field values.
|
||||
*/
|
||||
#define ICMP_ECHOREPLY 0 /* echo reply */
|
||||
#define ICMP_UNREACH 3 /* dest unreachable, codes: */
|
||||
#define ICMP_UNREACH_NET 0 /* bad net */
|
||||
#define ICMP_UNREACH_HOST 1 /* bad host */
|
||||
#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
|
||||
#define ICMP_UNREACH_PORT 3 /* bad port */
|
||||
#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
|
||||
#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
|
||||
#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
|
||||
#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
|
||||
#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
|
||||
#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
|
||||
#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
|
||||
#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
|
||||
#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
|
||||
#define ICMP_UNREACH_ADMIN_PROHIBIT 13 /* communication
|
||||
administratively
|
||||
prohibited */
|
||||
#define ICMP_UNREACH_HOST_PREC 14 /* host precedence
|
||||
violation */
|
||||
#define ICMP_UNREACH_PREC_CUTOFF 15 /* precedence cutoff */
|
||||
#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
|
||||
#define ICMP_REDIRECT 5 /* shorter route, codes: */
|
||||
#define ICMP_REDIRECT_NET 0 /* for network */
|
||||
#define ICMP_REDIRECT_HOST 1 /* for host */
|
||||
#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
|
||||
#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
|
||||
#define ICMP_ALTHOSTADDR 6 /* alternative host address */
|
||||
#define ICMP_ECHO 8 /* echo service */
|
||||
#define ICMP_ROUTERADVERT 9 /* router advertisement */
|
||||
#define ICMP_ROUTERADVERT_NORMAL 0
|
||||
#define ICMP_ROUTERADVERT_NOROUTE 16
|
||||
#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
|
||||
#define ICMP_TIMXCEED 11 /* time exceeded, code: */
|
||||
#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
|
||||
#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
|
||||
#define ICMP_PARAMPROB 12 /* ip header bad */
|
||||
#define ICMP_PARAMPROB_ERRATPTR 0
|
||||
#define ICMP_PARAMPROB_OPTABSENT 1
|
||||
#define ICMP_PARAMPROB_LENGTH 2
|
||||
#define ICMP_TSTAMP 13 /* timestamp request */
|
||||
#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
|
||||
#define ICMP_IREQ 15 /* information request */
|
||||
#define ICMP_IREQREPLY 16 /* information reply */
|
||||
#define ICMP_MASKREQ 17 /* address mask request */
|
||||
#define ICMP_MASKREPLY 18 /* address mask reply */
|
||||
#define ICMP_TRACEROUTE 30 /* traceroute */
|
||||
#define ICMP_DATACONVERR 31 /* data conversion error */
|
||||
#define ICMP_MOBILE_REDIRECT 32 /* mobile redirect */
|
||||
#define ICMP_IPV6_WHEREAREYOU 33 /* ipv6 where are you */
|
||||
#define ICMP_IPV6_IAMHERE 34 /* ipv6 i am here */
|
||||
#define ICMP_MOBILE_REGREQUEST 35 /* mobile registration req */
|
||||
#define ICMP_MOBILE_REGREPLY 36 /* mobile registration reply */
|
||||
#define ICMP_SKIP 39 /* SKIP */
|
||||
#define ICMP_PHOTURIS 40 /* security */
|
||||
#define ICMP_PHOTURIS_UNKNOWN_INDEX 0 /* unknown sec index */
|
||||
#define ICMP_PHOTURIS_AUTH_FAILED 1 /* auth failed */
|
||||
#define ICMP_PHOTURIS_DECOMPRESS_FAILED 2 /* decompress failed */
|
||||
#define ICMP_PHOTURIS_DECRYPT_FAILED 3 /* decrypt failed */
|
||||
#define ICMP_PHOTURIS_NEED_AUTHN 4 /* no authentication */
|
||||
#define ICMP_PHOTURIS_NEED_AUTHZ 5 /* no authorization */
|
||||
|
||||
#define ICMP_MAXTYPE 40
|
||||
|
||||
#ifdef ICMP_STRINGS
|
||||
static const char *icmp_type[] = {
|
||||
"echoreply", "unassigned_1", "unassigned_2", "unreach",
|
||||
"sourcequench", "redirect", "althostaddr", "unassigned_7",
|
||||
"echo", "routeradvert", "routersolicit", "timxceed",
|
||||
"paramprob", "tstamp", "tstampreply", "ireq",
|
||||
"ireqreply", "maskreq", "maskreply", "reserved_19",
|
||||
"reserved_20", "reserved_21", "reserved_22", "reserved_23",
|
||||
"reserved_24", "reserved_25", "reserved_26", "reserved_27",
|
||||
"reserved_28", "reserved_29", "traceroute", "dataconverr",
|
||||
"mobile_redirect", "ipv6_whereareyou", "ipv6_iamhere",
|
||||
"mobile_regrequest", "mobile_regreply", "reserved_37",
|
||||
"reserved_38", "skip", "photuris", NULL
|
||||
};
|
||||
static const char *icmp_code_none[] = { "none", NULL };
|
||||
static const char *icmp_code_unreach[] = {
|
||||
"net", "host", "oprt", "needfrag", "srcfail", "net_unknown",
|
||||
"host_unknown", "isolated", "net_prohib", "host_prohib",
|
||||
"tosnet", "toshost", "admin_prohibit", "host_prec", "prec_cutoff", NULL
|
||||
};
|
||||
static const char *icmp_code_redirect[] = {
|
||||
"net", "host", "tosnet", "toshost", NULL
|
||||
};
|
||||
static const char *icmp_code_routeradvert[] = {
|
||||
"normal", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "",
|
||||
"noroute", NULL
|
||||
};
|
||||
static const char *icmp_code_timxceed[] = {
|
||||
"intrans", "reass", NULL
|
||||
};
|
||||
static const char *icmp_code_paramprob[] = {
|
||||
"erratptr", "optabsent", "length", NULL
|
||||
};
|
||||
static const char *icmp_code_photuris[] = {
|
||||
"unknown_index", "auth_failed", "decompress_failed",
|
||||
"decrypt_failed", "need_authn", "need_authz", NULL
|
||||
};
|
||||
#endif
|
||||
|
||||
#define ICMP_INFOTYPE(type) \
|
||||
((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
|
||||
(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
|
||||
(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
|
||||
(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
|
||||
(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
|
||||
|
||||
#ifdef _KERNEL
|
||||
void icmp_error(struct mbuf *, int, int, n_long, int);
|
||||
void icmp_mtudisc(struct icmp *, struct in_addr);
|
||||
void icmp_input(struct mbuf *, ...);
|
||||
void icmp_init(void);
|
||||
void icmp_reflect(struct mbuf *);
|
||||
void icmp_send(struct mbuf *, struct mbuf *);
|
||||
int icmp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
|
||||
|
||||
void icmp_mtudisc_callback_register(void (*)(struct in_addr));
|
||||
int icmp_ratelimit(const struct in_addr *, const int, const int);
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* !_NETINET_IP_ICMP_H_ */
|
|
@ -24,7 +24,7 @@ SUBDIR= \
|
|||
\
|
||||
rdate \
|
||||
\
|
||||
\
|
||||
traceroute \
|
||||
\
|
||||
\
|
||||
unlink user \
|
||||
|
|
149
usr.sbin/traceroute/CHANGES
Normal file
149
usr.sbin/traceroute/CHANGES
Normal file
|
@ -0,0 +1,149 @@
|
|||
$NetBSD: CHANGES,v 1.2 2011/09/11 01:06:26 christos Exp $
|
||||
@(#) Id: CHANGES,v 1.23 2000/12/14 06:53:11 leres Exp (LBL)
|
||||
|
||||
v1.4 Wed Dec 13 22:50:35 PST 2000
|
||||
|
||||
- Add an option to use icmp echo instead of udp datagrams.
|
||||
|
||||
- Add HPUX and Linux support.
|
||||
|
||||
- Handle hex argument values as suggested by John Hawkinson
|
||||
(jhawk@mit.edu)
|
||||
|
||||
- Added flags to set the first ttl and to set the don't fragment bit.
|
||||
|
||||
- Add a local autoconf macro to check for routines in libraries; the
|
||||
autoconf version is broken (it only puts the library name in the
|
||||
cache variable name). Thanks to John Hawkinson.
|
||||
|
||||
- Add a local autoconf macro to check for types; the autoconf version
|
||||
is broken (it uses grep instead of actually compiling a code fragment).
|
||||
|
||||
- Attempt to detect "egcs" versions of gcc.
|
||||
|
||||
- Fix problems caused by savestr().
|
||||
|
||||
- Detect when there are more interfaces than we can deal with. Thanks
|
||||
to Guy Harris guy@netapp.com.
|
||||
|
||||
- Accommodate changes made to FreeBSD 3.2-RELEASE network headers files.
|
||||
|
||||
- The ip header offset needs to be byte swapped under Solaris on the
|
||||
intel as well. Reported by John McDermott (jjm@jkintl.com) Also byte
|
||||
ip length and offset for linux.
|
||||
|
||||
- In wait_for_reply(), use passed socket instead of global one. Thanks
|
||||
to Richard Kettlewell (richard.kettlewell@kewill.com)
|
||||
|
||||
- Check for IFF_LOOPBACK as a define or an enum (concession to linux).
|
||||
Reported by Robert Bihlmeyer (robbe@orcus.priv.at)
|
||||
|
||||
- Increase size of SIOCGIFCONF buffer to accommodate systems with lots
|
||||
of virtual interfaces. Ignore sun virtual interfaces. Suggested by
|
||||
Ian Donaldson (iand@aone.com.au)
|
||||
|
||||
- Always calculate icmp checksums when using -I. Reported by Soumen
|
||||
(sbiswas@novell.com)
|
||||
|
||||
- Documentation fix for description of -p. Thanks to Jeffrey C Honig
|
||||
(jch@bsdi.com)
|
||||
|
||||
- Enable ip checksums for Solaris 2.6 and higher (since they seem to
|
||||
work correctly now).
|
||||
|
||||
- Avoid problems when broken routers return 0.0.0.0 as their source
|
||||
address. Thanks to John Hawkinson (jhawk@bbnplanet.com)
|
||||
|
||||
- Canonicalize hostname if gethostname() doesn't return a domain.
|
||||
|
||||
- Add -z flag (pause msecs) to allow optional pause between probes.
|
||||
Suggested by Dave Morrison (drmorris@uplanet.com)
|
||||
|
||||
- Fix max packet length test.
|
||||
|
||||
- Use "/dev/null" instead of "." for file descriptor fodder.
|
||||
Suggested by Tim Robbins (fyre@box3n.gumbynet.org)
|
||||
|
||||
- Watch for a NULL argv[0]. Suggested by Tim Robbins.
|
||||
|
||||
- Be careful with hostname legnths.
|
||||
|
||||
- Print RFC1191 Path MTU Discovery value on "needfrag" unreachables.
|
||||
|
||||
- Limit port size to 16 bits. Suggested by Tim Robbins.
|
||||
|
||||
- Limit wait time to 24 hours.
|
||||
|
||||
- Modified linux specific struct ipovly definition to avoid problems
|
||||
with 64 bit systems. Problem reported by Uros Prestor
|
||||
(uros@turbolinux.com)
|
||||
|
||||
- Use kernel routing tables to determine correct source address.
|
||||
Three styles are supported: bsd/socket, solaris/mib and linux.
|
||||
|
||||
- Fix configure to recognize older versions of Solaris.
|
||||
|
||||
v1.3.2 Thu Sep 26 18:06:16 PDT 1996
|
||||
|
||||
- Rewrite source routing code to eliminate a number of problems on
|
||||
systems using raw ip options. Also pad options with a noop so gateway
|
||||
addresses are aligned.
|
||||
|
||||
- Don't call inet_ntoa() twice in the same printf(). Thanks to NetBSD
|
||||
via Bill Fenner (fenner@parc.xerox.com)
|
||||
|
||||
- Decode "administratively prohibited filter" icmp code and print
|
||||
numeric value for unknown codes. Thanks to Bill Fenner.
|
||||
|
||||
v1.3.1 Wed Sep 18 21:08:16 PDT 1996
|
||||
|
||||
- Some systems (e.g. AIX) need sys/select.h. Thanks to Brett Hogden
|
||||
(hogden@rge.com)
|
||||
|
||||
- Byte swap ip header length under Solaris. (This has no effect on the
|
||||
sparc but is required on the i386.)
|
||||
|
||||
- Made optional packet length control total size of packet.
|
||||
|
||||
v1.3 Mon Sep 16 14:55:44 PDT 1996
|
||||
|
||||
- Overrun buffer security fixes. Thanks to Bill Fenner
|
||||
(fenner@parc.xerox.com)
|
||||
|
||||
- Wait for response packet relative to start of probe. Thanks to Bill
|
||||
Fenner.
|
||||
|
||||
- Fix bug that prevented changing the packet size. Thanks to Gregory
|
||||
Decker (gdecker@nate.dcrt.nih.gov)
|
||||
|
||||
- Add support for RAW_OPTIONS (e.g. 4.4 BSD systems such as BSD/OS and
|
||||
FreeBSD) thanks to Jeffrey C Honig (jch@bsdi.com)
|
||||
|
||||
- Remove ip header byte swap fix from v1.2; most kernels swap the ip
|
||||
header length in the kernel (and it causes OSF3 to crash).
|
||||
|
||||
- Fix to not exit when the number of probes is set to 1 (i.e. "-q 1")
|
||||
|
||||
- Improve autoconf configuration.
|
||||
|
||||
v1.2 Tue Oct 17 23:50:05 PDT 1995
|
||||
|
||||
- Convert to autoconf and ansify.
|
||||
|
||||
- Byte swap ip header length for little endian machines. Fix thanks to
|
||||
Y Badri (yb@greybox.demon.co.uk).
|
||||
|
||||
v1.1 Thu Jun 15 02:32:55 PDT 1995
|
||||
|
||||
- Check for too many arguments.
|
||||
|
||||
- Recode to make timing of packet's round trip more obvious and to
|
||||
tighten up code.
|
||||
|
||||
- Ifdef IP_OPTIONS code.
|
||||
|
||||
- Display time in microseconds.
|
||||
|
||||
v1.0 Tue Feb 28 23:50:05 PDT 1989
|
||||
|
||||
- Initial public release.
|
29
usr.sbin/traceroute/Makefile
Normal file
29
usr.sbin/traceroute/Makefile
Normal file
|
@ -0,0 +1,29 @@
|
|||
# $NetBSD: Makefile,v 1.19 2011/09/11 01:06:26 christos Exp $
|
||||
|
||||
USE_FORT?= yes # network client
|
||||
|
||||
RUMPPRG=traceroute
|
||||
MAN= traceroute.8
|
||||
|
||||
CPPFLAGS+=-DHAVE_MALLOC_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SOCKIO_H=1
|
||||
CPPFLAGS+=-DHAVE_STRERROR=1 -DHAVE_SETLINEBUF=1 -DHAVE_SOCKADDR_SA_LEN=1
|
||||
CPPFLAGS+=-DHAVE_RAW_OPTIONS=1
|
||||
CPPFLAGS+=-DHAVE_ICMP_NEXTMTU=1
|
||||
|
||||
#CPPFLAGS+=-DIPSEC
|
||||
#LDADD+= -lipsec
|
||||
#DPADD+= ${LIBIPSEC}
|
||||
|
||||
BINOWN= root
|
||||
BINMODE=4555
|
||||
|
||||
SRCS= traceroute.c ifaddrlist.c
|
||||
SRCS+= version.c as.c
|
||||
|
||||
.PATH: ${.CURDIR}/../../lib/libc/net
|
||||
RUMPSRCS= getifaddrs.c
|
||||
CPPFLAGS+= -DRUMP_ACTION
|
||||
|
||||
AWKS= median.awk mean.awk
|
||||
|
||||
.include <bsd.prog.mk>
|
224
usr.sbin/traceroute/as.c
Normal file
224
usr.sbin/traceroute/as.c
Normal file
|
@ -0,0 +1,224 @@
|
|||
/* $NetBSD: as.c,v 1.4 2011/05/10 01:52:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Andrew Brown.
|
||||
*
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include <netdb.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <errno.h>
|
||||
#include <err.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "as.h"
|
||||
|
||||
#define DEFAULT_AS_SERVER "whois.radb.net"
|
||||
#undef AS_DEBUG_FILE
|
||||
|
||||
struct aslookup {
|
||||
FILE *as_f;
|
||||
#ifdef AS_DEBUG_FILE
|
||||
FILE *as_debug;
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
};
|
||||
|
||||
void *
|
||||
as_setup(const char *server)
|
||||
{
|
||||
struct aslookup *asn;
|
||||
struct addrinfo hints, *res0, *res;
|
||||
FILE *f;
|
||||
int s, error;
|
||||
|
||||
s = -1;
|
||||
if (server == NULL)
|
||||
server = getenv("RA_SERVER");
|
||||
if (server == NULL)
|
||||
server = DEFAULT_AS_SERVER;
|
||||
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = PF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_STREAM;
|
||||
error = getaddrinfo(server, "whois", &hints, &res0);
|
||||
if (error == EAI_SERVICE) {
|
||||
warnx("warning: whois/tcp service not found");
|
||||
error = getaddrinfo(server, "43", &hints, &res0);
|
||||
}
|
||||
|
||||
if (error != 0) {
|
||||
warnx("%s: %s", server, gai_strerror(error));
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
for (res = res0; res; res = res->ai_next) {
|
||||
s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
|
||||
if (s < 0)
|
||||
continue;
|
||||
if (connect(s, res->ai_addr, res->ai_addrlen) >= 0)
|
||||
break;
|
||||
close(s);
|
||||
s = -1;
|
||||
}
|
||||
freeaddrinfo(res0);
|
||||
if (s < 0) {
|
||||
warn("connect");
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
f = fdopen(s, "r+");
|
||||
(void)fprintf(f, "!!\n");
|
||||
(void)fflush(f);
|
||||
|
||||
asn = malloc(sizeof(struct aslookup));
|
||||
if (asn == NULL)
|
||||
(void)fclose(f);
|
||||
else
|
||||
asn->as_f = f;
|
||||
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn) {
|
||||
asn->as_debug = fopen(AS_DEBUG_FILE, "w");
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug, ">> !!\n");
|
||||
(void)fflush(asn->as_debug);
|
||||
}
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
|
||||
return (asn);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
as_lookup(void *_asn, char *addr, sa_family_t family)
|
||||
{
|
||||
struct aslookup *asn = _asn;
|
||||
char buf[1024];
|
||||
unsigned int as;
|
||||
int rc, dlen, plen;
|
||||
|
||||
as = 0;
|
||||
rc = dlen = 0;
|
||||
plen = (family == AF_INET6) ? 128 : 32;
|
||||
(void)fprintf(asn->as_f, "!r%s/%d,l\n", addr, plen);
|
||||
(void)fflush(asn->as_f);
|
||||
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug, ">> !r%s/%d,l\n", addr, plen);
|
||||
(void)fflush(asn->as_debug);
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
|
||||
while (fgets(buf, sizeof(buf), asn->as_f) != NULL) {
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug, "<< %s", buf);
|
||||
(void)fflush(asn->as_debug);
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
|
||||
if (rc == 0) {
|
||||
rc = buf[0];
|
||||
switch (rc) {
|
||||
case 'A':
|
||||
/* A - followed by # bytes of answer */
|
||||
sscanf(buf, "A%d\n", &dlen);
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug,
|
||||
"dlen: %d\n", dlen);
|
||||
(void)fflush(asn->as_debug);
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
break;
|
||||
case 'C':
|
||||
case 'D':
|
||||
case 'E':
|
||||
case 'F':
|
||||
/* C - no data returned */
|
||||
/* D - key not found */
|
||||
/* E - multiple copies of key */
|
||||
/* F - some other error */
|
||||
break;
|
||||
}
|
||||
if (rc == 'A')
|
||||
/* skip to next input line */
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dlen == 0)
|
||||
/* out of data, next char read is end code */
|
||||
rc = buf[0];
|
||||
if (rc != 'A')
|
||||
/* either an error off the bat, or a done code */
|
||||
break;
|
||||
|
||||
/* data received, thank you */
|
||||
dlen -= strlen(buf);
|
||||
|
||||
/* origin line is the interesting bit */
|
||||
if (as == 0 && strncasecmp(buf, "origin:", 7) == 0) {
|
||||
sscanf(buf + 7, " AS%u", &as);
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug, "as: %d\n", as);
|
||||
(void)fflush(asn->as_debug);
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
}
|
||||
}
|
||||
|
||||
return (as);
|
||||
}
|
||||
|
||||
void
|
||||
as_shutdown(void *_asn)
|
||||
{
|
||||
struct aslookup *asn = _asn;
|
||||
|
||||
(void)fprintf(asn->as_f, "!q\n");
|
||||
(void)fclose(asn->as_f);
|
||||
|
||||
#ifdef AS_DEBUG_FILE
|
||||
if (asn->as_debug) {
|
||||
(void)fprintf(asn->as_debug, ">> !q\n");
|
||||
(void)fclose(asn->as_debug);
|
||||
}
|
||||
#endif /* AS_DEBUG_FILE */
|
||||
|
||||
free(asn);
|
||||
}
|
34
usr.sbin/traceroute/as.h
Normal file
34
usr.sbin/traceroute/as.h
Normal file
|
@ -0,0 +1,34 @@
|
|||
/* $NetBSD: as.h,v 1.4 2011/05/10 01:52:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2001 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by Andrew Brown.
|
||||
*
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
||||
*/
|
||||
|
||||
void *as_setup(const char *);
|
||||
unsigned int as_lookup(void *, char *, sa_family_t);
|
||||
void as_shutdown(void *);
|
36
usr.sbin/traceroute/gnuc.h
Normal file
36
usr.sbin/traceroute/gnuc.h
Normal file
|
@ -0,0 +1,36 @@
|
|||
/* $NetBSD: gnuc.h,v 1.2 2002/07/06 21:51:49 wiz Exp $ */
|
||||
|
||||
/* @(#) Header: gnuc.h,v 1.3 95/10/09 02:47:01 leres Exp (LBL) */
|
||||
|
||||
/* inline foo */
|
||||
#ifdef __GNUC__
|
||||
#define inline __inline
|
||||
#else
|
||||
#define inline
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Handle new and old "dead" routine prototypes
|
||||
*
|
||||
* For example:
|
||||
*
|
||||
* __dead void foo(void) __attribute__((volatile));
|
||||
*
|
||||
*/
|
||||
#ifdef __GNUC__
|
||||
#ifndef __dead
|
||||
#define __dead volatile
|
||||
#endif
|
||||
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5)
|
||||
#ifndef __attribute__
|
||||
#define __attribute__(args)
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#ifndef __dead
|
||||
#define __dead
|
||||
#endif
|
||||
#ifndef __attribute__
|
||||
#define __attribute__(args)
|
||||
#endif
|
||||
#endif
|
146
usr.sbin/traceroute/ifaddrlist.c
Normal file
146
usr.sbin/traceroute/ifaddrlist.c
Normal file
|
@ -0,0 +1,146 @@
|
|||
/* $NetBSD: ifaddrlist.c,v 1.10 2011/09/11 01:06:26 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997, 1998, 1999, 2000
|
||||
* The Regents of the University of California. 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. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the Computer Systems
|
||||
* Engineering Group at Lawrence Berkeley Laboratory.
|
||||
* 4. Neither the name of the University nor of the Laboratory may be used
|
||||
* to endorse or promote products derived from this software without
|
||||
* specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static const char rcsid[] =
|
||||
"@(#) Header: ifaddrlist.c,v 1.2 97/04/22 13:31:05 leres Exp (LBL)";
|
||||
"@(#) Id: ifaddrlist.c,v 1.9 2000/11/23 20:01:55 leres Exp (LBL)";
|
||||
#else
|
||||
__RCSID("$NetBSD: ifaddrlist.c,v 1.10 2011/09/11 01:06:26 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/socket.h>
|
||||
#ifdef HAVE_SYS_SOCKIO_H
|
||||
#include <sys/sockio.h>
|
||||
#endif
|
||||
#include <sys/time.h> /* concession to AIX */
|
||||
|
||||
struct mbuf;
|
||||
struct rtentry;
|
||||
|
||||
#include <net/if.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <memory.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <ifaddrs.h>
|
||||
|
||||
#include "gnuc.h"
|
||||
#ifdef HAVE_OS_PROTO_H
|
||||
#include "os-proto.h"
|
||||
#endif
|
||||
|
||||
#include "ifaddrlist.h"
|
||||
|
||||
/* Not all systems have IFF_LOOPBACK */
|
||||
#ifdef IFF_LOOPBACK
|
||||
#define ISLOOPBACK(p) ((p)->ifa_flags & IFF_LOOPBACK)
|
||||
#else
|
||||
#define ISLOOPBACK(p) (strcmp((p)->ifa_name, "lo0") == 0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Return the interface list
|
||||
*/
|
||||
ssize_t
|
||||
ifaddrlist(struct ifaddrlist **ipaddrp, char *errbuf, size_t buflen)
|
||||
{
|
||||
struct sockaddr_in *sin;
|
||||
struct ifaddrs *ifap = NULL, *ifa;
|
||||
struct ifaddrlist *al = NULL, *nal;
|
||||
size_t i = 0, maxal = 10;
|
||||
|
||||
if (getifaddrs(&ifap) != 0)
|
||||
goto out;
|
||||
|
||||
if ((al = malloc(maxal * sizeof(*al))) == NULL)
|
||||
goto out;
|
||||
|
||||
for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
|
||||
if (ifa->ifa_addr->sa_family != AF_INET)
|
||||
continue;
|
||||
|
||||
/* Must be up */
|
||||
if ((ifa->ifa_flags & IFF_UP) == 0)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Must not be a loopback address (127/8)
|
||||
*/
|
||||
sin = (struct sockaddr_in *)ifa->ifa_addr;
|
||||
if (ISLOOPBACK(ifa))
|
||||
if (ntohl(sin->sin_addr.s_addr) == INADDR_LOOPBACK)
|
||||
continue;
|
||||
|
||||
if (i == maxal) {
|
||||
maxal <<= 1;
|
||||
if ((nal = realloc(al, maxal * sizeof(*al))) == NULL)
|
||||
goto out;
|
||||
al = nal;
|
||||
}
|
||||
|
||||
al[i].addr = sin->sin_addr.s_addr;
|
||||
if ((al[i].device = strdup(ifa->ifa_name)) == NULL)
|
||||
goto out;
|
||||
i++;
|
||||
}
|
||||
if ((nal = realloc(al, i * sizeof(*al))) == NULL)
|
||||
goto out;
|
||||
freeifaddrs(ifap);
|
||||
*ipaddrp = nal;
|
||||
return (ssize_t)i;
|
||||
out:
|
||||
if (ifap)
|
||||
freeifaddrs(ifap);
|
||||
if (al) {
|
||||
while (i > 0)
|
||||
free(al[--i].device);
|
||||
free(al);
|
||||
}
|
||||
(void)snprintf(errbuf, buflen, "%s: %s", __func__, strerror(errno));
|
||||
return -1;
|
||||
}
|
31
usr.sbin/traceroute/ifaddrlist.h
Normal file
31
usr.sbin/traceroute/ifaddrlist.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* $NetBSD: ifaddrlist.h,v 1.3 2011/05/11 00:38:28 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1997
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that: (1) source code distributions
|
||||
* retain the above copyright notice and this paragraph in its entirety, (2)
|
||||
* distributions including binary code include the above copyright notice and
|
||||
* this paragraph in its entirety in the documentation or other materials
|
||||
* provided with the distribution, and (3) all advertising materials mentioning
|
||||
* features or use of this software display the following acknowledgement:
|
||||
* ``This product includes software developed by the University of California,
|
||||
* Lawrence Berkeley Laboratory and its contributors.'' Neither the name of
|
||||
* the University 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 ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* @(#) Header: traceroute.h,v 1.1 97/01/04 19:33:33 leres Locked (LBL)
|
||||
*/
|
||||
|
||||
struct ifaddrlist {
|
||||
uint32_t addr;
|
||||
char *device;
|
||||
};
|
||||
|
||||
ssize_t ifaddrlist(struct ifaddrlist **, char *, size_t);
|
14
usr.sbin/traceroute/mean.awk
Normal file
14
usr.sbin/traceroute/mean.awk
Normal file
|
@ -0,0 +1,14 @@
|
|||
#!/bin/awk -f
|
||||
# $NetBSD: mean.awk,v 1.5 1997/10/04 16:31:29 christos Exp $
|
||||
/^ *[0-9]/ {
|
||||
# print out the average time to each hop along a route.
|
||||
tottime = 0; n = 0;
|
||||
for (f = 5; f <= NF; ++f) {
|
||||
if ($f == "ms") {
|
||||
tottime += $(f - 1)
|
||||
++n
|
||||
}
|
||||
}
|
||||
if (n > 0)
|
||||
print $1, tottime/n, median
|
||||
}
|
31
usr.sbin/traceroute/median.awk
Normal file
31
usr.sbin/traceroute/median.awk
Normal file
|
@ -0,0 +1,31 @@
|
|||
#!/bin/awk -f
|
||||
# $NetBSD: median.awk,v 1.5 1997/10/04 16:31:32 christos Exp $
|
||||
/^ *[0-9]/ {
|
||||
# print out the median time to each hop along a route.
|
||||
tottime = 0; n = 0;
|
||||
for (f = 5; f <= NF; ++f) {
|
||||
if ($f == "ms") {
|
||||
++n
|
||||
time[n] = $(f - 1)
|
||||
}
|
||||
}
|
||||
if (n > 0) {
|
||||
# insertion sort the times to find the median
|
||||
for (i = 2; i <= n; ++i) {
|
||||
v = time[i]; j = i - 1;
|
||||
while (time[j] > v) {
|
||||
time[j+1] = time[j];
|
||||
j = j - 1;
|
||||
if (j < 0)
|
||||
break;
|
||||
}
|
||||
time[j+1] = v;
|
||||
}
|
||||
if (n > 1 && (n % 2) == 0)
|
||||
median = (time[n/2] + time[(n/2) + 1]) / 2
|
||||
else
|
||||
median = time[(n+1)/2]
|
||||
|
||||
print $1, median
|
||||
}
|
||||
}
|
72
usr.sbin/traceroute/prog_ops.h
Normal file
72
usr.sbin/traceroute/prog_ops.h
Normal file
|
@ -0,0 +1,72 @@
|
|||
/* $NetBSD: prog_ops.h,v 1.1 2010/12/15 00:09:41 pooka Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
|
||||
*/
|
||||
|
||||
#ifndef _PROG_OPS_H_
|
||||
#define _PROG_OPS_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <poll.h>
|
||||
|
||||
struct prog_ops {
|
||||
int (*op_init)(void);
|
||||
|
||||
int (*op_socket)(int, int, int);
|
||||
int (*op_setsockopt)(int, int, int, const void *, socklen_t);
|
||||
int (*op_shutdown)(int, int);
|
||||
|
||||
int (*op_poll)(struct pollfd *, nfds_t, int);
|
||||
|
||||
ssize_t (*op_recvfrom)(int, void *, size_t, int,
|
||||
struct sockaddr *, socklen_t *);
|
||||
ssize_t (*op_sendto)(int, const void *, size_t, int,
|
||||
const struct sockaddr *, socklen_t);
|
||||
|
||||
int (*op_close)(int);
|
||||
|
||||
int (*op_connect)(int, const struct sockaddr *, socklen_t);
|
||||
int (*op_getsockname)(int, struct sockaddr *, socklen_t *);
|
||||
|
||||
int (*op_sysctl)(const int *, u_int, void *, size_t *,
|
||||
const void *, size_t);
|
||||
};
|
||||
extern const struct prog_ops prog_ops;
|
||||
|
||||
#define prog_init prog_ops.op_init
|
||||
#define prog_socket prog_ops.op_socket
|
||||
#define prog_setsockopt prog_ops.op_setsockopt
|
||||
#define prog_shutdown prog_ops.op_shutdown
|
||||
#define prog_poll prog_ops.op_poll
|
||||
#define prog_recvfrom prog_ops.op_recvfrom
|
||||
#define prog_sendto prog_ops.op_sendto
|
||||
#define prog_close prog_ops.op_close
|
||||
#define prog_connect prog_ops.op_connect
|
||||
#define prog_getsockname prog_ops.op_getsockname
|
||||
#define prog_sysctl prog_ops.op_sysctl
|
||||
|
||||
#endif /* _PROG_OPS_H_ */
|
419
usr.sbin/traceroute/traceroute.8
Normal file
419
usr.sbin/traceroute/traceroute.8
Normal file
|
@ -0,0 +1,419 @@
|
|||
.\" $NetBSD: traceroute.8,v 1.29 2011/09/11 01:06:26 christos Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1989, 1995, 1996, 1997
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms are permitted
|
||||
.\" provided that the above copyright notice and this paragraph are
|
||||
.\" duplicated in all such forms and that any documentation,
|
||||
.\" advertising materials, and other materials related to such
|
||||
.\" distribution and use acknowledge that the software was developed
|
||||
.\" by the University of California, Berkeley. The name of the
|
||||
.\" University may not be used to endorse or promote products derived
|
||||
.\" from this software without specific prior written permission.
|
||||
.\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||
.\" IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
.\"
|
||||
.\" Id: traceroute.8,v 1.19 2000/09/21 08:44:19 leres Exp
|
||||
.\"
|
||||
.TH TRACEROUTE 8 "21 September 2000"
|
||||
.UC 6
|
||||
.SH NAME
|
||||
traceroute \- print the route packets take to network host
|
||||
.SH SYNOPSIS
|
||||
.na
|
||||
.B traceroute
|
||||
[
|
||||
.B \-aDFPIdlMnrvx
|
||||
] [
|
||||
.B \-f
|
||||
.I first_ttl
|
||||
]
|
||||
.br
|
||||
.ti +8
|
||||
[
|
||||
.B \-g
|
||||
.I gateway
|
||||
] [
|
||||
.B \-i
|
||||
.I iface
|
||||
] [
|
||||
.B \-m
|
||||
max_ttl
|
||||
]
|
||||
.br
|
||||
.ti +8
|
||||
[
|
||||
.B \-p
|
||||
.I port
|
||||
] [
|
||||
.B \-q
|
||||
.I nqueries
|
||||
] [
|
||||
.B \-s
|
||||
.I src_addr
|
||||
]
|
||||
.br
|
||||
.ti +8
|
||||
[
|
||||
.B \-t
|
||||
.I tos
|
||||
] [
|
||||
.B \-w
|
||||
.I waittime
|
||||
] [
|
||||
.B \-z
|
||||
.I pausemsecs
|
||||
]
|
||||
] [
|
||||
.B \-A
|
||||
.I as_server
|
||||
]
|
||||
.br
|
||||
.ti +8
|
||||
.I host
|
||||
[
|
||||
.I packetlen
|
||||
]
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
The Internet is a large and complex aggregation of
|
||||
network hardware, connected together by gateways.
|
||||
Tracking the route one's packets follow (or finding the miscreant
|
||||
gateway that's discarding your packets) can be difficult.
|
||||
.I Traceroute
|
||||
uses the IP protocol `time to live' field and attempts to elicit an
|
||||
ICMP TIME_EXCEEDED response from each gateway along the path to some
|
||||
host.
|
||||
.PP
|
||||
The only mandatory parameter is the destination host name or IP number.
|
||||
The default probe datagram length is 40 bytes, but this may be increased
|
||||
by specifying a packet length (in bytes) after the destination host
|
||||
name.
|
||||
.PP
|
||||
Other options are:
|
||||
.TP
|
||||
.B \-a
|
||||
Turn on AS# lookups for each hop encountered.
|
||||
.TP
|
||||
.B \-A
|
||||
Turn on AS# lookups and use the given server instead of the default.
|
||||
.TP
|
||||
.B \-d
|
||||
Turn on socket-level debugging.
|
||||
.TP
|
||||
.B \-D
|
||||
Dump the packet data to standard error before transmitting it.
|
||||
.TP
|
||||
.B \-f
|
||||
Set the initial time-to-live used in the first outgoing probe packet.
|
||||
.TP
|
||||
.B \-F
|
||||
Set the "don't fragment" bit.
|
||||
.TP
|
||||
.B \-g
|
||||
Specify a loose source route gateway (8 maximum).
|
||||
.TP
|
||||
.B \-i
|
||||
Specify a network interface to obtain the source IP address for
|
||||
outgoing probe packets. This is normally only useful on a multi-homed
|
||||
host. (See the
|
||||
.B \-s
|
||||
flag for another way to do this.)
|
||||
.TP
|
||||
.B \-I
|
||||
Use ICMP ECHO instead of UDP datagrams.
|
||||
.TP
|
||||
.B \-l
|
||||
Display the ttl value of the returned packet. This is useful for
|
||||
checking for asymmetric routing.
|
||||
.TP
|
||||
.B \-m
|
||||
Set the max time-to-live (max number of hops) used in outgoing probe
|
||||
packets. The default value is taken from the
|
||||
.I net.inet.ip.ttl
|
||||
sysctl(3) variable.
|
||||
.TP
|
||||
.B \-M
|
||||
If found, show the MPLS Label and the Experimental (EXP) bit for the hop.
|
||||
.TP
|
||||
.B \-n
|
||||
Print hop addresses numerically rather than symbolically and numerically
|
||||
(saves a nameserver address-to-name lookup for each gateway found on the
|
||||
path).
|
||||
.TP
|
||||
.B \-p
|
||||
Set the base UDP port number used in probes (default is 33434).
|
||||
Traceroute hopes that nothing is listening on UDP ports
|
||||
.I base
|
||||
to
|
||||
.I base + nhops \- 1
|
||||
at the destination host (so an ICMP PORT_UNREACHABLE message will
|
||||
be returned to terminate the route tracing). If something is
|
||||
listening on a port in the default range, this option can be used
|
||||
to pick an unused port range.
|
||||
.TP
|
||||
.B \-P
|
||||
Set the "don't fragment" bit, and use the next hop mtu each time we get
|
||||
the "need fragmentation" error, thus probing the path MTU.
|
||||
.TP
|
||||
.B \-q
|
||||
Set the number of probe packets sent for each hop. By default, traceroute
|
||||
sends three probe packets.
|
||||
.TP
|
||||
.B \-r
|
||||
Bypass the normal routing tables and send directly to a host on an attached
|
||||
network.
|
||||
If the host is not on a directly-attached network,
|
||||
an error is returned.
|
||||
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
|
||||
.IR routed (8)).
|
||||
.TP
|
||||
.B \-s
|
||||
Use the following IP address (which usually is given as an IP number, not
|
||||
a hostname) as the source address in outgoing probe packets. On
|
||||
multi-homed hosts (those 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. (See the
|
||||
.B \-i
|
||||
flag for another way to do this.)
|
||||
.TP
|
||||
.B \-t
|
||||
Set the
|
||||
.I type-of-service
|
||||
in probe packets to the following value (default zero). The value must be
|
||||
a decimal integer in the range 0 to 255. This option can be used to
|
||||
see if different types-of-service result in different paths. (If you
|
||||
are not running 4.4BSD, this may be academic since the normal network
|
||||
services like telnet and ftp don't let you control the TOS).
|
||||
Not all values of TOS are legal or
|
||||
meaningful \- see the IP spec for definitions. Useful values are
|
||||
probably
|
||||
.RB ` -t
|
||||
.IR 16 '
|
||||
(low delay) and
|
||||
.RB ` -t
|
||||
.IR 8 '
|
||||
(high throughput).
|
||||
.TP
|
||||
.B \-v
|
||||
Verbose output. Received ICMP packets other than TIME_EXCEEDED and
|
||||
UNREACHABLEs are listed.
|
||||
.TP
|
||||
.B \-w
|
||||
Set the time (in seconds) to wait for a response to a probe (default 5
|
||||
sec.).
|
||||
.TP
|
||||
.B \-x
|
||||
Toggle ip checksums. Normally, this prevents traceroute from calculating
|
||||
ip checksums. In some cases, the operating system can overwrite parts of
|
||||
the outgoing packet but not recalculate the checksum (so in some cases
|
||||
the default is to not calculate checksums and using
|
||||
.B \-x
|
||||
causes them to be calculated). Note that checksums are usually required
|
||||
for the last hop when using ICMP ECHO probes
|
||||
.RB ( \-I ).
|
||||
So they are always calculated when using ICMP.
|
||||
.TP
|
||||
.B \-z
|
||||
Set the time (in milliseconds) to pause between probes (default 0).
|
||||
Some systems such as Solaris and routers such as Ciscos rate limit
|
||||
icmp messages. A good value to use with this this is 500 (e.g. 1/2 second).
|
||||
.PP
|
||||
This program attempts to trace the route an IP packet would follow to some
|
||||
internet host by launching UDP probe
|
||||
packets with a small ttl (time to live) then listening for an
|
||||
ICMP "time exceeded" reply from a gateway. We start our probes
|
||||
with a ttl of one and increase by one until we get an ICMP "port
|
||||
unreachable" (which means we got to "host") or hit a max (which
|
||||
defaults to 30 hops \*[Am] can be changed with the
|
||||
.B \-m
|
||||
flag). Three
|
||||
probes (change with
|
||||
.B \-q
|
||||
flag) are sent at each ttl setting and a
|
||||
line is printed showing the ttl, address of the gateway and
|
||||
round trip time of each probe. If the probe answers come from
|
||||
different gateways, the address of each responding system will
|
||||
be printed. If there is no response within a 5 sec. timeout
|
||||
interval (changed with the
|
||||
.B \-w
|
||||
flag), a "*" is printed for that
|
||||
probe.
|
||||
.PP
|
||||
We don't want the destination
|
||||
host to process the UDP probe packets so the destination port is set to an
|
||||
unlikely value (if some clod on the destination is using that
|
||||
value, it can be changed with the
|
||||
.B \-p
|
||||
flag).
|
||||
.PP
|
||||
A sample use and output might be:
|
||||
|
||||
.RS
|
||||
.nf
|
||||
[yak 71]% traceroute nis.nsf.net.
|
||||
traceroute to nis.nsf.net (35.1.1.48), 30 hops max, 38 byte packet
|
||||
1 helios.ee.lbl.gov (128.3.112.1) 19 ms 19 ms 0 ms
|
||||
2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms
|
||||
3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 39 ms 19 ms
|
||||
4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 39 ms
|
||||
5 ccn-nerif22.Berkeley.EDU (128.32.168.22) 39 ms 39 ms 39 ms
|
||||
6 128.32.197.4 (128.32.197.4) 40 ms 59 ms 59 ms
|
||||
7 131.119.2.5 (131.119.2.5) 59 ms 59 ms 59 ms
|
||||
8 129.140.70.13 (129.140.70.13) 99 ms 99 ms 80 ms
|
||||
9 129.140.71.6 (129.140.71.6) 139 ms 239 ms 319 ms
|
||||
10 129.140.81.7 (129.140.81.7) 220 ms 199 ms 199 ms
|
||||
11 nic.merit.edu (35.1.1.48) 239 ms 239 ms 239 ms
|
||||
.fi
|
||||
.RE
|
||||
|
||||
Note that lines 2 \*[Am] 3 are the same. This is due to a buggy
|
||||
kernel on the 2nd hop system \- lilac-dmc.Berkeley.EDU \- that forwards
|
||||
packets with a zero ttl (a bug in the distributed version
|
||||
of 4.3BSD). Note that you have to guess what path
|
||||
the packets are taking cross-country since the NSFNET (129.140)
|
||||
doesn't supply address-to-name translations for its NSSes.
|
||||
.PP
|
||||
A more interesting example is:
|
||||
|
||||
.RS
|
||||
.nf
|
||||
[yak 72]% traceroute allspice.lcs.mit.edu.
|
||||
traceroute to allspice.lcs.mit.edu (18.26.0.115), 30 hops max
|
||||
1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms
|
||||
2 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 19 ms 19 ms
|
||||
3 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 19 ms 19 ms
|
||||
4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 19 ms 39 ms 39 ms
|
||||
5 ccn-nerif22.Berkeley.EDU (128.32.168.22) 20 ms 39 ms 39 ms
|
||||
6 128.32.197.4 (128.32.197.4) 59 ms 119 ms 39 ms
|
||||
7 131.119.2.5 (131.119.2.5) 59 ms 59 ms 39 ms
|
||||
8 129.140.70.13 (129.140.70.13) 80 ms 79 ms 99 ms
|
||||
9 129.140.71.6 (129.140.71.6) 139 ms 139 ms 159 ms
|
||||
10 129.140.81.7 (129.140.81.7) 199 ms 180 ms 300 ms
|
||||
11 129.140.72.17 (129.140.72.17) 300 ms 239 ms 239 ms
|
||||
12 * * *
|
||||
13 128.121.54.72 (128.121.54.72) 259 ms 499 ms 279 ms
|
||||
14 * * *
|
||||
15 * * *
|
||||
16 * * *
|
||||
17 * * *
|
||||
18 ALLSPICE.LCS.MIT.EDU (18.26.0.115) 339 ms 279 ms 279 ms
|
||||
.fi
|
||||
.RE
|
||||
|
||||
Note that the gateways 12, 14, 15, 16 \*[Am] 17 hops away
|
||||
either don't send ICMP "time exceeded" messages or send them
|
||||
with a ttl too small to reach us. 14 \- 17 are running the
|
||||
MIT C Gateway code that doesn't send "time exceeded"s. God
|
||||
only knows what's going on with 12.
|
||||
.PP
|
||||
The silent gateway 12 in the above may be the result of a bug in
|
||||
the 4.[23]BSD network code (and its derivatives): 4.x (x \(<= 3)
|
||||
sends an unreachable message using whatever ttl remains in the
|
||||
original datagram. Since, for gateways, the remaining ttl is
|
||||
zero, the ICMP "time exceeded" is guaranteed to not make it back
|
||||
to us. The behavior of this bug is slightly more interesting
|
||||
when it appears on the destination system:
|
||||
|
||||
.RS
|
||||
.nf
|
||||
1 helios.ee.lbl.gov (128.3.112.1) 0 ms 0 ms 0 ms
|
||||
2 lilac-dmc.Berkeley.EDU (128.32.216.1) 39 ms 19 ms 39 ms
|
||||
3 lilac-dmc.Berkeley.EDU (128.32.216.1) 19 ms 39 ms 19 ms
|
||||
4 ccngw-ner-cc.Berkeley.EDU (128.32.136.23) 39 ms 40 ms 19 ms
|
||||
5 ccn-nerif35.Berkeley.EDU (128.32.168.35) 39 ms 39 ms 39 ms
|
||||
6 csgw.Berkeley.EDU (128.32.133.254) 39 ms 59 ms 39 ms
|
||||
7 * * *
|
||||
8 * * *
|
||||
9 * * *
|
||||
10 * * *
|
||||
11 * * *
|
||||
12 * * *
|
||||
13 rip.Berkeley.EDU (128.32.131.22) 59 ms ! 39 ms ! 39 ms !
|
||||
.fi
|
||||
.RE
|
||||
|
||||
Notice that there are 12 "gateways" (13 is the final
|
||||
destination) and exactly the last half of them are "missing".
|
||||
What's really happening is that rip (a Sun-3 running Sun OS3.5)
|
||||
is using the ttl from our arriving datagram as the ttl in its
|
||||
ICMP reply. So, the reply will time out on the return path
|
||||
(with no notice sent to anyone since ICMP's aren't sent for
|
||||
ICMP's) until we probe with a ttl that's at least twice the path
|
||||
length. I.e., rip is really only 7 hops away. A reply that
|
||||
returns with a ttl of 1 is a clue this problem exists.
|
||||
Traceroute prints a "!" after the time if the ttl is \(<= 1.
|
||||
Since vendors ship a lot of obsolete (DEC's ULTRIX, Sun 3.x) or
|
||||
non-standard (HP-UX) software, expect to see this problem
|
||||
frequently and/or take care picking the target host of your
|
||||
probes.
|
||||
|
||||
Other possible annotations after the time are
|
||||
.BR !H ,
|
||||
.BR !N ,
|
||||
or
|
||||
.B !P
|
||||
(host, network or protocol unreachable),
|
||||
.B !S
|
||||
(source route failed),
|
||||
.B !F\-<pmtu>
|
||||
(fragmentation needed \- the RFC1191 Path MTU Discovery value is displayed),
|
||||
.B !X
|
||||
(communication administratively prohibited),
|
||||
.B !V
|
||||
(host precedence violation),
|
||||
.B !C
|
||||
(precedence cutoff in effect), or
|
||||
.B !\*[Lt]N\*[Gt]
|
||||
(ICMP unreachable code \*[Lt]num\*[Gt]).
|
||||
These are defined by RFC1812 (which supersedes RFC1716).
|
||||
If almost all the probes result in some kind of unreachable, traceroute
|
||||
will give up and exit.
|
||||
|
||||
.RS
|
||||
.nf
|
||||
traceroute \-g 10.3.0.5 128.182.0.0
|
||||
.fi
|
||||
.RE
|
||||
|
||||
will show the path from the Cambridge Mailbridge to PSC, while
|
||||
|
||||
.RS
|
||||
.nf
|
||||
traceroute \-g 192.5.146.4 \-g 10.3.0.5 35.0.0.0
|
||||
.fi
|
||||
.RE
|
||||
|
||||
will show the path from the Cambridge Mailbridge to Merit, using PSC to
|
||||
reach the Mailbridge.
|
||||
.PP
|
||||
This program is intended for use in network testing, measurement
|
||||
and management.
|
||||
It should be used primarily for manual fault isolation.
|
||||
Because of the load it could impose on the network, it is unwise to use
|
||||
.I traceroute
|
||||
during normal operations or from automated scripts.
|
||||
.SH SEE ALSO
|
||||
netstat(1), ping(8)
|
||||
.SH AUTHOR
|
||||
Implemented by Van Jacobson from a suggestion by Steve Deering. Debugged
|
||||
by a cast of thousands with particularly cogent suggestions or fixes from
|
||||
C. Philip Wood, Tim Seaver and Ken Adelman.
|
||||
.LP
|
||||
The current version is available via anonymous ftp:
|
||||
.LP
|
||||
.RS
|
||||
.I ftp://ftp.ee.lbl.gov/traceroute.tar.gz
|
||||
.RE
|
||||
.SH BUGS
|
||||
Please send bug reports to traceroute@ee.lbl.gov.
|
||||
.PP
|
||||
The AS number capability reports information that may sometimes be
|
||||
inaccurate due to discrepancies between the contents of the routing
|
||||
database server and the current state of the Internet.
|
1905
usr.sbin/traceroute/traceroute.c
Normal file
1905
usr.sbin/traceroute/traceroute.c
Normal file
File diff suppressed because it is too large
Load diff
55
usr.sbin/traceroute/traceroute_hostops.c
Normal file
55
usr.sbin/traceroute/traceroute_hostops.c
Normal file
|
@ -0,0 +1,55 @@
|
|||
/* $NetBSD: traceroute_hostops.c,v 1.1 2010/12/15 00:09:41 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: traceroute_hostops.c,v 1.1 2010/12/15 00:09:41 pooka Exp $");
|
||||
#endif /* !lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <sys/sysctl.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "prog_ops.h"
|
||||
|
||||
const struct prog_ops prog_ops = {
|
||||
.op_socket = socket,
|
||||
.op_setsockopt = setsockopt,
|
||||
.op_shutdown = shutdown,
|
||||
.op_poll = poll,
|
||||
.op_recvfrom = recvfrom,
|
||||
.op_sendto = sendto,
|
||||
.op_close = close,
|
||||
.op_connect = connect,
|
||||
.op_getsockname = getsockname,
|
||||
.op_sysctl = sysctl,
|
||||
};
|
59
usr.sbin/traceroute/traceroute_rumpops.c
Normal file
59
usr.sbin/traceroute/traceroute_rumpops.c
Normal file
|
@ -0,0 +1,59 @@
|
|||
/* $NetBSD: traceroute_rumpops.c,v 1.1 2010/12/15 00:09:42 pooka Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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>
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: traceroute_rumpops.c,v 1.1 2010/12/15 00:09:42 pooka Exp $");
|
||||
#endif /* !lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <poll.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <rump/rump.h>
|
||||
#include <rump/rump_syscalls.h>
|
||||
#include <rump/rumpclient.h>
|
||||
|
||||
#include "prog_ops.h"
|
||||
|
||||
const struct prog_ops prog_ops = {
|
||||
.op_init = rumpclient_init,
|
||||
|
||||
.op_socket = rump_sys_socket,
|
||||
.op_setsockopt= rump_sys_setsockopt,
|
||||
.op_shutdown = rump_sys_shutdown,
|
||||
.op_poll = rump_sys_poll,
|
||||
.op_recvfrom = rump_sys_recvfrom,
|
||||
.op_sendto = rump_sys_sendto,
|
||||
.op_close = rump_sys_close,
|
||||
.op_connect = rump_sys_connect,
|
||||
.op_getsockname=rump_sys_getsockname,
|
||||
.op_sysctl = rump_sys___sysctl,
|
||||
};
|
272
usr.sbin/traceroute/trrt2netbsd
Executable file
272
usr.sbin/traceroute/trrt2netbsd
Executable file
|
@ -0,0 +1,272 @@
|
|||
#!/usr/local/bin/perl
|
||||
#
|
||||
# $NetBSD: trrt2netbsd,v 1.4 1999/06/16 20:47:57 is Exp $
|
||||
#
|
||||
# Perl script to convert a standard distribution directory for traceroute into
|
||||
# a NetBSD source tree.
|
||||
#
|
||||
# This is done as a script so that as each distribution is released,
|
||||
# only changes from the previous one need to be dealt with as
|
||||
# modifications to this script and related files. This should
|
||||
# reduce the cost of updating from a new release of traceroute by an
|
||||
# order of magnitude (or more?)
|
||||
#
|
||||
# This script requires two environment variables set:
|
||||
# SRCDIR - traceroute source directory
|
||||
# TARGETDIR - name of the high level directory to make
|
||||
#
|
||||
# Written by Christos Zoulas Oct 2nd, 1997 for traceroute-1.4a5
|
||||
#
|
||||
|
||||
$version = "1.4a5";
|
||||
|
||||
# definitions ...
|
||||
|
||||
@subdirs = ("usr.sbin/traceroute");
|
||||
|
||||
@trrtf = ("ifaddrlist.c", "savestr.c", "traceroute.c");
|
||||
|
||||
@trrthf = ("gnuc.h", "ifaddrlist.h", "savestr.h");
|
||||
|
||||
@trrtmf = ("traceroute.8");
|
||||
@trrtdf = ("CHANGES", "README");
|
||||
@trrtaf = ("mean.awk", "median.awk");
|
||||
|
||||
|
||||
# sed edit list: file, sed-program
|
||||
%sedlist = ();
|
||||
|
||||
#
|
||||
# Utility Subroutines
|
||||
#
|
||||
|
||||
sub makedir {
|
||||
system("mkdir -p @_");
|
||||
}
|
||||
|
||||
# &fixrcs (fromfile, tofile);
|
||||
sub fixrcs
|
||||
{
|
||||
my ($f, $t) = @_;
|
||||
my @keywords = ("Author", "Date", "Header", "Id", "Locker", "Log",
|
||||
"Name", "RCSfile", "Revision", "Source", "State");
|
||||
my $state = 0;
|
||||
my $hdr = 0;
|
||||
|
||||
open(IFILE, "<$f") || die "Cannot open $f";
|
||||
open(OFILE, ">$t") || die "Cannot create $t";
|
||||
|
||||
if ($t =~ /.*\.[0-9]/) {
|
||||
print OFILE '.\\" $', 'NetBSD', '$', "\n.\\\"", "\n";
|
||||
}
|
||||
elsif ($t =~ /.*\.[ch]/) {
|
||||
print OFILE "/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
|
||||
}
|
||||
elsif ($t =~ /.*\.[yl]/) {
|
||||
$hdr = 1;
|
||||
}
|
||||
else {
|
||||
print OFILE '$', 'NetBSD', '$', "\n";
|
||||
}
|
||||
while (<IFILE>) {
|
||||
if ($hdr == 1) {
|
||||
if (/%{/) {
|
||||
print OFILE "%{\n/*\t", '$', 'NetBSD', '$', "\t*/\n\n";
|
||||
$hdr = 0;
|
||||
next;
|
||||
}
|
||||
}
|
||||
if ($state == 2) {
|
||||
if (/#endif/) {
|
||||
print OFILE "#else\n__RCSID(", '"$', 'NetBSD', '$"',
|
||||
");\n#endif\n";
|
||||
$state = 0;
|
||||
}
|
||||
}
|
||||
if ($state == 1) {
|
||||
print OFILE "#if 0\n";
|
||||
$state = 2;
|
||||
}
|
||||
if (/#ifndef lint/) {
|
||||
print OFILE "#include <sys/cdefs.h>\n";
|
||||
$state = 1;
|
||||
}
|
||||
foreach $key (@keywords) {
|
||||
s/\$$key\$/$key/g;
|
||||
s/\$$key:(.*)\$/$key:$1/g;
|
||||
}
|
||||
print OFILE $_;
|
||||
}
|
||||
close(IFILE) || die "closing input file";
|
||||
close(OFILE) || die "closing output file";
|
||||
}
|
||||
|
||||
# ©files (fromdir, todir, list of files);
|
||||
sub copyfiles {
|
||||
local ($fdir, $tdir, @list) = @_;
|
||||
local ($f);
|
||||
|
||||
foreach $f (@list) {
|
||||
print " $fdir/$f --> $tdir/$f\n";
|
||||
&fixrcs("$fdir/$f", "$tdir/$f");
|
||||
}
|
||||
}
|
||||
|
||||
# ©file (fromfile, tofile);
|
||||
sub copyfile {
|
||||
local ($f, $t) = @_;
|
||||
|
||||
print " $f --> $t\n";
|
||||
system ("cp $f $t");
|
||||
}
|
||||
|
||||
sub uniq {
|
||||
local (@inlist) = @_;
|
||||
local (@outlist);
|
||||
|
||||
@outlist = ($inlist[0]);
|
||||
for ( $i=1; $i < @inlist; $i++ ) {
|
||||
if ($inlist[$i] ne $inlist[$i-1]) {
|
||||
push (@outlist, $inlist[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
@outlist;
|
||||
}
|
||||
|
||||
sub dumpsrcs {
|
||||
local (@names) = @_;
|
||||
local ($count);
|
||||
|
||||
$count = 0;
|
||||
while ($f = pop(@names)) {
|
||||
print ODATA "$f ";
|
||||
if ($count == 5 && @names > 0) {
|
||||
print ODATA "\\\n";
|
||||
$count = 0;
|
||||
} else {
|
||||
$count += 1;
|
||||
}
|
||||
}
|
||||
if ($count != 0) {
|
||||
print ODATA "\n";
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Main program.
|
||||
#
|
||||
|
||||
$srcdir = $ENV{'SRCDIR'};
|
||||
$targetdir = $ENV{'TARGETDIR'};
|
||||
$incdirs = "-I. -I$srcdir/config -I$srcdir";
|
||||
|
||||
if (!$srcdir | !targetdir) {
|
||||
die "You must define the environment variables SRCDIR and TARGETDIR.\n"
|
||||
}
|
||||
print "Making the NetBSD directory tree.\n";
|
||||
foreach $f (@subdirs) {
|
||||
print " -->$f\n";
|
||||
makedir ("$targetdir/$f");
|
||||
}
|
||||
|
||||
print "Populating the usr.sbin/traceroute directory.\n";
|
||||
©files ("$srcdir", "$targetdir/usr.sbin/traceroute", @trrtf, @trrthf, @trrtdf,
|
||||
@trrtmf, @trrtaf);
|
||||
|
||||
#
|
||||
# Build makefiles
|
||||
#
|
||||
|
||||
$first = "True";
|
||||
while ($line = <DATA>) {
|
||||
chop ($line);
|
||||
if (substr($line,0,2) eq "%%") {
|
||||
@cmd = split (/ /,$line);
|
||||
if ($cmd[1] eq "file") {
|
||||
print "Building $targetdir/$cmd[2]\n";
|
||||
if ($first eq "") {
|
||||
close (ODATA);
|
||||
} else {
|
||||
$first = "";
|
||||
}
|
||||
open (ODATA, ">$targetdir/$cmd[2]") ||
|
||||
die "Could not create $targetdir/$cmd[2]";
|
||||
} elsif ($cmd[1] eq "awks") {
|
||||
print " Defining AWKS\n";
|
||||
if ($first) {
|
||||
die "Data file must start with a %% file!";
|
||||
}
|
||||
print ODATA "AWKS=\t";
|
||||
&dumpsrcs (@trrtaf);
|
||||
} elsif ($cmd[1] eq "srcs") {
|
||||
print " Defining SRCS\n";
|
||||
if ($first) {
|
||||
die "Data file must start with a %% file!";
|
||||
}
|
||||
print ODATA "SRCS=\t";
|
||||
&dumpsrcs (@trrtf);
|
||||
} elsif ($cmd[1] eq "man") {
|
||||
print " Defining MAN\n";
|
||||
if ($first) {
|
||||
die "Data file must start with a %% file!";
|
||||
}
|
||||
print ODATA "MAN=\t";
|
||||
&dumpsrcs (@trrtmf);
|
||||
} elsif ($cmd[1] eq "version") {
|
||||
print " Defining VERSION\n";
|
||||
print ODATA "char version[] = \"$version\";";
|
||||
} elsif ($cmd[1] eq "NetBSD") {
|
||||
if ($first) {
|
||||
die "Data section must start with a %% file!";
|
||||
}
|
||||
print ODATA "$cmd[2] \$"."NetBSD".": \$ $cmd[3]\n";
|
||||
}
|
||||
} else {
|
||||
if ($first) {
|
||||
die "Data file must start with a %% file!";
|
||||
}
|
||||
print ODATA "$line\n";
|
||||
}
|
||||
}
|
||||
close (ODATA);
|
||||
|
||||
#
|
||||
# Sed transformations of files
|
||||
#
|
||||
foreach $n (keys(%sedlist)) {
|
||||
print "Modifying $n\n";
|
||||
system ("cd $targetdir; sed $sedlist{$n} $n > tmp; mv -f tmp $n");
|
||||
}
|
||||
|
||||
#
|
||||
# end of the script
|
||||
#
|
||||
|
||||
# what follows is the data for makefiles and other special files
|
||||
# that need to be created.
|
||||
|
||||
__END__
|
||||
%% file usr.sbin/traceroute/Makefile
|
||||
%% NetBSD #
|
||||
|
||||
WARNS?= 1
|
||||
PROG= traceroute
|
||||
%% man
|
||||
|
||||
CPPFLAGS+=-DHAVE_MALLOC_H=1 -DHAVE_SYS_SELECT_H=1 -DHAVE_SYS_SOCKIO_H=1
|
||||
CPPFLAGS+=-DHAVE_STRERROR=1 -DHAVE_SETLINEBUF=1 -DHAVE_SOCKADDR_SA_LEN=1
|
||||
CPPFLAGS+=-DHAVE_RAW_OPTIONS=1
|
||||
|
||||
BINOWN= root
|
||||
BINMODE=4555
|
||||
|
||||
%% srcs
|
||||
SRCS+= version.c
|
||||
|
||||
%% awks
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
%% file usr.sbin/traceroute/version.c
|
||||
%% NetBSD /* */
|
||||
%% version
|
2
usr.sbin/traceroute/version.c
Normal file
2
usr.sbin/traceroute/version.c
Normal file
|
@ -0,0 +1,2 @@
|
|||
/* $NetBSD: version.c,v 1.3 2011/09/11 01:06:26 christos Exp $ */
|
||||
char version[] = "1.4a12";
|
Loading…
Reference in a new issue