1
0
mirror of https://git.FreeBSD.org/src.git synced 2025-01-11 14:10:34 +00:00

Implement -D (do not fragment) and -z (TOS) options.

PR:		bin/29164
Reviewed by:	silence of -net
Obtained from:	OpenBSD
This commit is contained in:
Maxim Konovalov 2003-01-23 12:48:12 +00:00
parent cb75aca7cd
commit 0b2f8b3f68
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=109731
2 changed files with 63 additions and 8 deletions

View File

@ -42,7 +42,7 @@
packets to network hosts packets to network hosts
.Sh SYNOPSIS .Sh SYNOPSIS
.Nm .Nm
.Op Fl AQRadfnoqrv .Op Fl ADQRadfnoqrv
.Op Fl c Ar count .Op Fl c Ar count
.Op Fl i Ar wait .Op Fl i Ar wait
.Op Fl l Ar preload .Op Fl l Ar preload
@ -52,6 +52,7 @@ packets to network hosts
.Op Fl s Ar packetsize .Op Fl s Ar packetsize
.Op Fl S Ar src_addr .Op Fl S Ar src_addr
.Op Fl t Ar timeout .Op Fl t Ar timeout
.Op Fl z Ar tos
.Bo .Bo
.Ar host | .Ar host |
.Op Fl L .Op Fl L
@ -111,6 +112,8 @@ will operate until interrupted.
Set the Set the
.Dv SO_DEBUG .Dv SO_DEBUG
option on the socket being used. option on the socket being used.
.It Fl D
Set the Don't Fragment bit.
.It Fl f .It Fl f
Flood ping. Flood ping.
Outputs packets as fast as they come back or one hundred times per second, Outputs packets as fast as they come back or one hundred times per second,
@ -252,6 +255,8 @@ Verbose output.
packets other than packets other than
.Tn ECHO_RESPONSE .Tn ECHO_RESPONSE
that are received are listed. that are received are listed.
.It Fl z Ar tos
Use the specified type of service.
.El .El
.Pp .Pp
When using When using

View File

@ -67,6 +67,7 @@ static const char rcsid[] =
*/ */
#include <sys/param.h> /* NB: we rely on this for <sys/types.h> */ #include <sys/param.h> /* NB: we rely on this for <sys/types.h> */
#include <sys/sysctl.h>
#include <ctype.h> #include <ctype.h>
#include <err.h> #include <err.h>
@ -107,6 +108,7 @@ static const char rcsid[] =
#define MAXPAYLOAD (IP_MAXPACKET - MAXIPLEN - MINICMPLEN) #define MAXPAYLOAD (IP_MAXPACKET - MAXIPLEN - MINICMPLEN)
#define MAXWAIT 10 /* max seconds to wait for response */ #define MAXWAIT 10 /* max seconds to wait for response */
#define MAXALARM (60 * 60) /* max seconds for alarm timeout */ #define MAXALARM (60 * 60) /* max seconds for alarm timeout */
#define MAXTOS 255
#define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */ #define A(bit) rcvd_tbl[(bit)>>3] /* identify byte in array */
#define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */ #define B(bit) (1 << ((bit) & 0x07)) /* identify bit in byte */
@ -138,6 +140,7 @@ int options;
#define F_TTL 0x8000 #define F_TTL 0x8000
#define F_MISSED 0x10000 #define F_MISSED 0x10000
#define F_ONCE 0x20000 #define F_ONCE 0x20000
#define F_HDRINCL 0x40000
/* /*
* MAX_DUP_CHK is the number of bits in received table, i.e. the maximum * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum
@ -151,7 +154,7 @@ char rcvd_tbl[MAX_DUP_CHK / 8];
struct sockaddr_in whereto; /* who to ping */ struct sockaddr_in whereto; /* who to ping */
int datalen = DEFDATALEN; int datalen = DEFDATALEN;
int s; /* socket file descriptor */ int s; /* socket file descriptor */
u_char outpack[MINICMPLEN + MAXPAYLOAD]; u_char outpackhdr[IP_MAXPACKET], *outpack;
char BSPACE = '\b'; /* characters written for flood */ char BSPACE = '\b'; /* characters written for flood */
char BBELL = '\a'; /* characters written for MISSED and AUDIBLE */ char BBELL = '\a'; /* characters written for MISSED and AUDIBLE */
char DOT = '.'; char DOT = '.';
@ -201,6 +204,7 @@ main(argc, argv)
{ {
struct in_addr ifaddr; struct in_addr ifaddr;
struct iovec iov; struct iovec iov;
struct ip *ip;
struct msghdr msg; struct msghdr msg;
struct sigaction si_sa; struct sigaction si_sa;
struct sockaddr_in from, sin; struct sockaddr_in from, sin;
@ -209,13 +213,15 @@ main(argc, argv)
struct hostent *hp; struct hostent *hp;
struct sockaddr_in *to; struct sockaddr_in *to;
double t; double t;
size_t sz;
u_char *datap, packet[IP_MAXPACKET]; u_char *datap, packet[IP_MAXPACKET];
char *ep, *source, *target; char *ep, *source, *target;
#ifdef IPSEC_POLICY_IPSEC #ifdef IPSEC_POLICY_IPSEC
char *policy_in, *policy_out; char *policy_in, *policy_out;
#endif #endif
u_long alarmtimeout, ultmp; u_long alarmtimeout, ultmp;
int ch, hold, i, packlen, preload, sockerrno, almost_done = 0, ttl; int ch, df, hold, i, mib[4], packlen, preload, sockerrno,
almost_done = 0, tos, ttl;
char ctrl[CMSG_SPACE(sizeof(struct timeval))]; char ctrl[CMSG_SPACE(sizeof(struct timeval))];
char hnamebuf[MAXHOSTNAMELEN], snamebuf[MAXHOSTNAMELEN]; char hnamebuf[MAXHOSTNAMELEN], snamebuf[MAXHOSTNAMELEN];
#ifdef IP_OPTIONS #ifdef IP_OPTIONS
@ -239,11 +245,12 @@ main(argc, argv)
setuid(getuid()); setuid(getuid());
uid = getuid(); uid = getuid();
alarmtimeout = preload = 0; alarmtimeout = df = preload = tos = 0;
outpack = outpackhdr + sizeof(struct ip);
datap = &outpack[MINICMPLEN + PHDR_LEN]; datap = &outpack[MINICMPLEN + PHDR_LEN];
while ((ch = getopt(argc, argv, while ((ch = getopt(argc, argv,
"AI:LQRS:T:c:adfi:l:m:nop:qrs:t:v" "ADI:LQRS:T:c:adfi:l:m:nop:qrs:t:vz:"
#ifdef IPSEC #ifdef IPSEC
#ifdef IPSEC_POLICY_IPSEC #ifdef IPSEC_POLICY_IPSEC
"P:" "P:"
@ -266,6 +273,10 @@ main(argc, argv)
optarg); optarg);
npackets = ultmp; npackets = ultmp;
break; break;
case 'D':
options |= F_HDRINCL;
df = 1;
break;
case 'd': case 'd':
options |= F_SO_DEBUG; options |= F_SO_DEBUG;
break; break;
@ -390,6 +401,13 @@ main(argc, argv)
else else
errx(1, "invalid security policy"); errx(1, "invalid security policy");
break; break;
case 'z':
options |= F_HDRINCL;
ultmp = strtoul(optarg, &ep, 0);
if (*ep || ep == optarg || ultmp > MAXTOS)
errx(EX_USAGE, "invalid TOS: `%s'", optarg);
tos = ultmp;
break;
#endif /*IPSEC_POLICY_IPSEC*/ #endif /*IPSEC_POLICY_IPSEC*/
#endif /*IPSEC*/ #endif /*IPSEC*/
default: default:
@ -509,6 +527,28 @@ main(argc, argv)
#endif /*IPSEC_POLICY_IPSEC*/ #endif /*IPSEC_POLICY_IPSEC*/
#endif /*IPSEC*/ #endif /*IPSEC*/
if (options & F_HDRINCL) {
ip = (struct ip*)outpackhdr;
if (!(options & (F_TTL | F_MTTL))) {
mib[0] = CTL_NET;
mib[1] = PF_INET;
mib[2] = IPPROTO_IP;
mib[3] = IPCTL_DEFTTL;
sz = sizeof(ttl);
if (sysctl(mib, 4, &ttl, &sz, NULL, 0) == -1)
err(1, "sysctl(net.inet.ip.ttl)");
}
setsockopt(s, IPPROTO_IP, IP_HDRINCL, &hold, sizeof(hold));
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(struct ip) >> 2;
ip->ip_tos = tos;
ip->ip_id = 0;
ip->ip_off = df ? IP_DF : 0;
ip->ip_ttl = ttl;
ip->ip_p = IPPROTO_ICMP;
ip->ip_src.s_addr = source ? sin.sin_addr.s_addr : INADDR_ANY;
ip->ip_dst = to->sin_addr;
}
/* record route option */ /* record route option */
if (options & F_RROUTE) { if (options & F_RROUTE) {
#ifdef IP_OPTIONS #ifdef IP_OPTIONS
@ -758,9 +798,12 @@ stopit(sig)
static void static void
pinger(void) pinger(void)
{ {
struct ip *ip;
struct icmp *icp; struct icmp *icp;
int cc, i; int cc, i;
u_char *packet;
packet = outpack;
icp = (struct icmp *)outpack; icp = (struct icmp *)outpack;
icp->icmp_type = ICMP_ECHO; icp->icmp_type = ICMP_ECHO;
icp->icmp_code = 0; icp->icmp_code = 0;
@ -779,7 +822,14 @@ pinger(void)
/* compute ICMP checksum here */ /* compute ICMP checksum here */
icp->icmp_cksum = in_cksum((u_short *)icp, cc); icp->icmp_cksum = in_cksum((u_short *)icp, cc);
i = sendto(s, (char *)outpack, cc, 0, (struct sockaddr *)&whereto, if (options & F_HDRINCL) {
cc += sizeof(struct ip);
ip = (struct ip *)outpackhdr;
ip->ip_len = cc;
ip->ip_sum = in_cksum((u_short *)outpackhdr, cc);
packet = outpackhdr;
}
i = sendto(s, (char *)packet, cc, 0, (struct sockaddr *)&whereto,
sizeof(whereto)); sizeof(whereto));
if (i < 0 || i != cc) { if (i < 0 || i != cc) {
@ -1449,7 +1499,7 @@ static void
usage() usage()
{ {
(void)fprintf(stderr, "%s\n%s\n%s\n", (void)fprintf(stderr, "%s\n%s\n%s\n",
"usage: ping [-AQRadfnoqrv] [-c count] [-i wait] [-l preload] [-m ttl]", "usage: ping [-ADQRadfnoqrv] [-c count] [-i wait] [-l preload] [-m ttl]",
" [-p pattern] " " [-p pattern] "
#ifdef IPSEC #ifdef IPSEC
#ifdef IPSEC_POLICY_IPSEC #ifdef IPSEC_POLICY_IPSEC
@ -1457,6 +1507,6 @@ usage()
#endif #endif
#endif #endif
"[-s packetsize] [-S src_addr] [-t timeout]", "[-s packetsize] [-S src_addr] [-t timeout]",
" [host | [-L] [-I iface] [-T ttl] mcast-group]"); " [-z tos ] [host | [-L] [-I iface] [-T ttl] mcast-group]");
exit(EX_USAGE); exit(EX_USAGE);
} }