From 854569350fde3ca5107f253e730f258341eb6fd3 Mon Sep 17 00:00:00 2001 From: Bill Fenner Date: Sun, 15 Dec 1996 23:41:29 +0000 Subject: [PATCH] Add multicast options -I (source interface), -T (set ttl), -L (no loopback). They were all lowercase in the original, but our ping already uses -i and -l so I made them all uppercase. Obtained from: Multicast release 3.5 --- sbin/ping/ping.8 | 22 +++++++++++++-- sbin/ping/ping.c | 73 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 80 insertions(+), 15 deletions(-) diff --git a/sbin/ping/ping.8 b/sbin/ping/ping.8 index 8ec5bc1fa5b8..0b8f673e9c39 100644 --- a/sbin/ping/ping.8 +++ b/sbin/ping/ping.8 @@ -30,7 +30,7 @@ .\" SUCH DAMAGE. .\" .\" @(#)ping.8 8.2 (Berkeley) 12/11/93 -.\" $Id$ +.\" $Id: ping.8,v 1.3 1996/10/05 22:27:04 wosch Exp $ .\" .Dd December 11, 1993 .Dt PING 8 @@ -42,12 +42,15 @@ packets to network hosts .Sh SYNOPSIS .Nm ping -.Op Fl dfnqrvRQ +.Op Fl dfnqrvLRQ .Op Fl c Ar count .Op Fl i Ar wait +.Op Fl I Ar interface .Op Fl l Ar preload .Op Fl p Ar pattern .Op Fl s Ar packetsize +.Op Fl T Ar ttl +.Ar host .Sh DESCRIPTION .Nm Ping uses the @@ -99,6 +102,9 @@ The default is to wait for one second between each packet. This option is incompatible with the .Fl f option. +.It Fl I Ar interface +Source multicast packets with the given interface address. +This flag only applies if the ping destination is a multicast address. .It Fl l Ar preload If .Ar preload @@ -106,6 +112,9 @@ is specified, .Nm ping sends that many packets as fast as possible before falling into its normal mode of behavior. +.It Fl L +Suppress loopback of multicast packets. +This flag only applies if the ping destination is a multicast address. .It Fl n Numeric output only. No attempt will be made to lookup symbolic names for host addresses. @@ -159,6 +168,9 @@ data bytes when combined with the 8 bytes of .Tn ICMP header data. +.It Fl T Ar ttl +Set the IP Time To Live for multicasted packets. +This flag only applies if the ping destination is a multicast address. .It Fl v Verbose output. .Tn ICMP @@ -216,11 +228,15 @@ given. .Sh DUPLICATE AND DAMAGED PACKETS .Nm Ping will report duplicate and damaged packets. -Duplicate packets should never occur, and seem to be caused by +Duplicate packets should never occur when pinging a unicast address, +and seem to be caused by inappropriate link-level retransmissions. Duplicates may occur in many situations and are rarely (if ever) a good sign, although the presence of low levels of duplicates may not always be cause for alarm. +Duplicates are expected when pinging a broadcast or multicast address, +since they are not really duplicates but replies from different hosts +to the same request. .Pp Damaged packets are obviously serious cause for alarm and often indicate broken hardware somewhere in the diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c index 81ef4490c5f5..bfbf254236c9 100644 --- a/sbin/ping/ping.c +++ b/sbin/ping/ping.c @@ -96,16 +96,19 @@ static char sccsid[] = "@(#)ping.c 8.1 (Berkeley) 6/5/93"; /* various options */ int options; -#define F_FLOOD 0x001 -#define F_INTERVAL 0x002 -#define F_NUMERIC 0x004 -#define F_PINGFILLED 0x008 -#define F_QUIET 0x010 -#define F_RROUTE 0x020 -#define F_SO_DEBUG 0x040 -#define F_SO_DONTROUTE 0x080 -#define F_VERBOSE 0x100 -#define F_QUIET2 0x200 +#define F_FLOOD 0x0001 +#define F_INTERVAL 0x0002 +#define F_NUMERIC 0x0004 +#define F_PINGFILLED 0x0008 +#define F_QUIET 0x0010 +#define F_RROUTE 0x0020 +#define F_SO_DEBUG 0x0040 +#define F_SO_DONTROUTE 0x0080 +#define F_VERBOSE 0x0100 +#define F_QUIET2 0x0200 +#define F_NOLOOP 0x0400 +#define F_MTTL 0x0800 +#define F_MIF 0x1000 /* * MAX_DUP_CHK is the number of bits in received table, i.e. the maximum @@ -157,6 +160,8 @@ main(argc, argv) struct termios ts; register int i; int ch, fdmask, hold, packlen, preload, sockerrno; + struct in_addr ifaddr; + unsigned char ttl, loop; u_char *datap, *packet; char *target, hnamebuf[MAXHOSTNAMELEN], *malloc(); #ifdef IP_OPTIONS @@ -180,7 +185,7 @@ main(argc, argv) preload = 0; datap = &outpack[8 + sizeof(struct timeval)]; - while ((ch = getopt(argc, argv, "QRc:dfh:i:l:np:qrs:v")) != EOF) + while ((ch = getopt(argc, argv, "I:LQRT:c:dfh:i:l:np:qrs:v")) != EOF) switch(ch) { case 'c': npackets = atoi(optarg); @@ -211,6 +216,14 @@ main(argc, argv) } options |= F_INTERVAL; break; + case 'I': /* multicast interface */ + if (inet_aton(optarg, &ifaddr) == 0) { + (void)fprintf(stderr, + "ping: bad multicast interface.\n"); + exit(1); + } + options |= F_MIF; + break; case 'l': preload = atoi(optarg); if (preload < 0) { @@ -219,6 +232,10 @@ main(argc, argv) exit(1); } break; + case 'L': + options |= F_NOLOOP; + loop = 0; + break; case 'n': options |= F_NUMERIC; break; @@ -251,6 +268,16 @@ main(argc, argv) exit(1); } break; + case 'T': /* multicast TTL */ + i = atoi(optarg); + if (i < 0 || i > 255) { + (void)fprintf(stderr, + "ping: illegal multicast TTL.\n"); + exit(1); + } + ttl = i; + options |= F_MTTL; + break; case 'v': options |= F_VERBOSE; break; @@ -337,6 +364,28 @@ main(argc, argv) #endif /* IP_OPTIONS */ } + if (options & F_NOLOOP) { + if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_LOOP, &loop, + sizeof(loop)) < 0) { + perror("ping: IP_MULTICAST_LOOP"); + exit(1); + } + } + if (options & F_MTTL) { + if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, + sizeof(ttl)) < 0) { + perror("ping: IP_MULTICAST_TTL"); + exit(1); + } + } + if (options & F_MIF) { + if (setsockopt(s, IPPROTO_IP, IP_MULTICAST_IF, &ifaddr, + sizeof(ifaddr)) < 0) { + perror("ping: IP_MULTICAST_IF"); + exit(1); + } + } + /* * When pinging the broadcast address, you can get a lot of answers. * Doing something so evil is useful if you are trying to stress the @@ -1085,6 +1134,6 @@ fill(bp, patp) usage() { (void)fprintf(stderr, - "usage: ping [-Rdfnqrv] [-c count] [-i wait] [-l preload]\n\t[-p pattern] [-s packetsize] host\n"); + "usage: ping [-LQRdfnqrv] [-c count] [-i wait] [-I interface]\n\t[-l preload] [-p pattern] [-s packetsize] [-T ttl] host\n"); exit(1); }