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/mknod minix-sys
|
||||||
./sbin/newfs_ext2fs minix-sys
|
./sbin/newfs_ext2fs minix-sys
|
||||||
./sbin/nologin minix-sys
|
./sbin/nologin minix-sys
|
||||||
|
./sbin/ping minix-sys
|
||||||
./sbin/poweroff minix-sys
|
./sbin/poweroff minix-sys
|
||||||
./sbin/reboot minix-sys
|
./sbin/reboot minix-sys
|
||||||
./sbin/shutdown minix-sys
|
./sbin/shutdown minix-sys
|
||||||
|
@ -435,7 +436,7 @@
|
||||||
./usr/bin/paste minix-sys
|
./usr/bin/paste minix-sys
|
||||||
./usr/bin/patch minix-sys
|
./usr/bin/patch minix-sys
|
||||||
./usr/bin/pathchk 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_all minix-sys
|
||||||
./usr/bin/pkgin_cd minix-sys
|
./usr/bin/pkgin_cd minix-sys
|
||||||
./usr/bin/pkgin_sets minix-sys
|
./usr/bin/pkgin_sets minix-sys
|
||||||
|
@ -1441,6 +1442,8 @@
|
||||||
./usr/include/net/if_ether.h minix-sys
|
./usr/include/net/if_ether.h minix-sys
|
||||||
./usr/include/net/if.h minix-sys
|
./usr/include/net/if.h minix-sys
|
||||||
./usr/include/net/netlib.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/netconfig.h minix-sys
|
||||||
./usr/include/netdb.h minix-sys
|
./usr/include/netdb.h minix-sys
|
||||||
./usr/include/netgroup.h minix-sys
|
./usr/include/netgroup.h minix-sys
|
||||||
|
@ -1448,7 +1451,11 @@
|
||||||
./usr/include/netinet/in.h minix-sys
|
./usr/include/netinet/in.h minix-sys
|
||||||
./usr/include/netinet/in_systm.h minix-sys
|
./usr/include/netinet/in_systm.h minix-sys
|
||||||
./usr/include/netinet/ip.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/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 minix-sys
|
||||||
./usr/include/netinet6/in6.h minix-sys
|
./usr/include/netinet6/in6.h minix-sys
|
||||||
./usr/include/nlist.h minix-sys
|
./usr/include/nlist.h minix-sys
|
||||||
|
@ -2429,7 +2436,7 @@
|
||||||
./usr/man/man1/patch.1 minix-sys
|
./usr/man/man1/patch.1 minix-sys
|
||||||
./usr/man/man1/pathchk.1 minix-sys
|
./usr/man/man1/pathchk.1 minix-sys
|
||||||
./usr/man/man1/pax.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/pkg_view.1 minix-sys
|
||||||
./usr/man/man1/playwave.1 minix-sys
|
./usr/man/man1/playwave.1 minix-sys
|
||||||
./usr/man/man1/pr.1 minix-sys
|
./usr/man/man1/pr.1 minix-sys
|
||||||
|
@ -5083,6 +5090,7 @@
|
||||||
./usr/man/man8/ossdevlinks.8 minix-sys
|
./usr/man/man8/ossdevlinks.8 minix-sys
|
||||||
./usr/man/man8/part.8 minix-sys
|
./usr/man/man8/part.8 minix-sys
|
||||||
./usr/man/man8/partition.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/postinstall.8 minix-sys
|
||||||
./usr/man/man8/poweroff.8 minix-sys
|
./usr/man/man8/poweroff.8 minix-sys
|
||||||
./usr/man/man8/printroot.8 minix-sys
|
./usr/man/man8/printroot.8 minix-sys
|
||||||
|
@ -5107,6 +5115,7 @@
|
||||||
./usr/man/man8/sync.8 minix-sys
|
./usr/man/man8/sync.8 minix-sys
|
||||||
./usr/man/man8/syslogd.8 minix-sys
|
./usr/man/man8/syslogd.8 minix-sys
|
||||||
./usr/man/man8/tcpd.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/unix.8 minix-sys
|
||||||
./usr/man/man8/unlink.8 minix-sys
|
./usr/man/man8/unlink.8 minix-sys
|
||||||
./usr/man/man8/unstr.8 minix-sys
|
./usr/man/man8/unstr.8 minix-sys
|
||||||
|
@ -5156,6 +5165,7 @@
|
||||||
./usr/sbin/postinstall minix-sys
|
./usr/sbin/postinstall minix-sys
|
||||||
./usr/sbin/pwd_mkdb minix-sys
|
./usr/sbin/pwd_mkdb minix-sys
|
||||||
./usr/sbin/rdate minix-sys
|
./usr/sbin/rdate minix-sys
|
||||||
|
./usr/sbin/traceroute minix-sys
|
||||||
./usr/sbin/unlink minix-sys
|
./usr/sbin/unlink minix-sys
|
||||||
./usr/sbin/user minix-sys
|
./usr/sbin/user minix-sys
|
||||||
./usr/sbin/useradd minix-sys
|
./usr/sbin/useradd minix-sys
|
||||||
|
|
|
@ -18,7 +18,7 @@ SUBDIR= add_route arp ash at backup btrace \
|
||||||
mined \
|
mined \
|
||||||
mount mt netconf \
|
mount mt netconf \
|
||||||
nonamed \
|
nonamed \
|
||||||
ping postinstall prep printroot \
|
postinstall prep printroot \
|
||||||
profile progressbar pr_routes ps pwdauth \
|
profile progressbar pr_routes ps pwdauth \
|
||||||
ramdisk rarpd rawspeed rcp readclock \
|
ramdisk rarpd rawspeed rcp readclock \
|
||||||
remsync rget rlogin \
|
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_addr( const char *addr );
|
||||||
ipaddr_t inet_network( 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__ */
|
#endif /* __SERVER__IP__GEN__INET_H__ */
|
||||||
|
|
|
@ -20,6 +20,9 @@
|
||||||
#include <net/gen/udp_hdr.h>
|
#include <net/gen/udp_hdr.h>
|
||||||
#include <net/gen/udp_io.h>
|
#include <net/gen/udp_io.h>
|
||||||
|
|
||||||
|
#include <net/gen/ip_hdr.h>
|
||||||
|
#include <net/gen/icmp_hdr.h>
|
||||||
|
|
||||||
#define DEBUG 0
|
#define DEBUG 0
|
||||||
|
|
||||||
static ssize_t _tcp_recvfrom(int sock, void *__restrict buffer, size_t length,
|
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
|
#if DEBUG
|
||||||
fprintf(stderr, "recvfrom: not implemented for fd %d\n", sock);
|
fprintf(stderr, "recvfrom: not implemented for fd %d\n", sock);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#include <net/gen/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.h>
|
||||||
#include <net/gen/tcp_io.h>
|
#include <net/gen/tcp_io.h>
|
||||||
#include <net/gen/udp.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
|
#if DEBUG
|
||||||
fprintf(stderr, "sendto: not implemented for fd %d\n", sock);
|
fprintf(stderr, "sendto: not implemented for fd %d\n", sock);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -11,7 +11,19 @@ __weak_alias(socket, __socket30)
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
|
|
||||||
#include <sys/ioc_net.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 <net/netlib.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
@ -21,6 +33,7 @@ __weak_alias(socket, __socket30)
|
||||||
static int _tcp_socket(int type, int protocol);
|
static int _tcp_socket(int type, int protocol);
|
||||||
static int _udp_socket(int type, int protocol);
|
static int _udp_socket(int type, int protocol);
|
||||||
static int _uds_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);
|
static void _socket_flags(int type, int *result);
|
||||||
|
|
||||||
int socket(int domain, int type, int protocol)
|
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)
|
if (domain == AF_INET && sock_type == SOCK_DGRAM)
|
||||||
return _udp_socket(type, protocol);
|
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
|
#if DEBUG
|
||||||
fprintf(stderr, "socket: nothing for domain %d, type %d, protocol %d\n",
|
fprintf(stderr, "socket: nothing for domain %d, type %d, protocol %d\n",
|
||||||
domain, type, protocol);
|
domain, type, protocol);
|
||||||
|
@ -127,6 +146,50 @@ static int _udp_socket(int type, int protocol)
|
||||||
return fd;
|
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)
|
static int _uds_socket(int type, int protocol)
|
||||||
{
|
{
|
||||||
int fd, r, flags = O_RDWR, sock_type;
|
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 \
|
look.1 lp.1 lspci.1 mail.1 \
|
||||||
mixer.1 \
|
mixer.1 \
|
||||||
mkproto.1 mount.1 mt.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 \
|
profile.1 ps.1 rcp.1 recwave.1 \
|
||||||
remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
|
remsync.1 rget.1 rlogin.1 rsh.1 rz.1 \
|
||||||
spell.1 svc.1 svrctl.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;
|
int status;
|
||||||
|
|
||||||
/* try to ping minix3.org */
|
/* 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)
|
if (status == 127)
|
||||||
{
|
{
|
||||||
printf("cannot execute ping\n");
|
printf("cannot execute ping\n");
|
||||||
|
|
|
@ -10,10 +10,10 @@ SUBDIR= \
|
||||||
chown \
|
chown \
|
||||||
fsck init \
|
fsck init \
|
||||||
mknod nologin \
|
mknod nologin \
|
||||||
|
ping \
|
||||||
reboot \
|
reboot \
|
||||||
shutdown \
|
shutdown \
|
||||||
|
|
||||||
|
|
||||||
# support for various file systems
|
# support for various file systems
|
||||||
SUBDIR+= newfs_ext2fs fsck_ext2fs
|
SUBDIR+= newfs_ext2fs fsck_ext2fs
|
||||||
.if !defined(__MINIX)
|
.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 \
|
INCS= ethertypes.h \
|
||||||
if_ether.h \
|
if_ether.h \
|
||||||
|
radix.h \
|
||||||
|
route.h \
|
||||||
\
|
\
|
||||||
\
|
\
|
||||||
\
|
\
|
||||||
|
|
|
@ -7,8 +7,10 @@ INCS= \
|
||||||
in_systm.h \
|
in_systm.h \
|
||||||
\
|
\
|
||||||
ip.h \
|
ip.h \
|
||||||
|
ip_icmp.h \
|
||||||
|
ip_var.h \
|
||||||
tcp.h \
|
tcp.h \
|
||||||
\
|
udp.h udp_var.h \
|
||||||
|
|
||||||
|
|
||||||
.if !defined(__MINIX)
|
.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 \
|
rdate \
|
||||||
\
|
\
|
||||||
\
|
traceroute \
|
||||||
\
|
\
|
||||||
\
|
\
|
||||||
unlink user \
|
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