Module Name:    src
Committed By:   kefren
Date:           Fri May 15 08:02:39 UTC 2015

Modified Files:
        src/sbin/ping6: ping6.8 ping6.c

Log Message:
Add options -X for deadline and -x for reply maxwait (flag names matching
FreeBSD). Unline FreeBSD, currently -x doesn't count late packets to statistics.
After discussion with, and help from ozaki-r@
Should fix PR/49896


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sbin/ping6/ping6.8
cvs rdiff -u -r1.86 -r1.87 src/sbin/ping6/ping6.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/ping6/ping6.8
diff -u src/sbin/ping6/ping6.8:1.29 src/sbin/ping6/ping6.8:1.30
--- src/sbin/ping6/ping6.8:1.29	Fri Apr 24 00:42:56 2015
+++ src/sbin/ping6/ping6.8	Fri May 15 08:02:39 2015
@@ -1,4 +1,4 @@
-.\"	$NetBSD: ping6.8,v 1.29 2015/04/24 00:42:56 christos Exp $
+.\"	$NetBSD: ping6.8,v 1.30 2015/05/15 08:02:39 kefren Exp $
 .\"	$KAME: ping6.8,v 1.57 2002/05/26 13:18:25 itojun Exp $
 .\"
 .\" Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -55,6 +55,8 @@ packets to network hosts
 .Op Fl P Ar policy
 .Op Fl S Ar sourceaddr
 .Op Fl s Ar packetsize
+.Op Fl x Ar maxwait
+.Op Fl X Ar deadline
 .Op Ar hops ...
 .Ar host
 .Sh DESCRIPTION
@@ -269,6 +271,11 @@ This option is present for backward comp
 has no effect if
 .Fl w
 is specified.
+.It Fl x Ar maxwait
+Time in milliseconds to wait for a reply for each packet sent.
+.It Fl X Ar deadline
+Specify a timeout, in seconds, before ping exits regardless of
+how many packets have been received.
 .It Ar hops
 IPv6 addresses for intermediate nodes,
 which will be put into type 0 routing header.

Index: src/sbin/ping6/ping6.c
diff -u src/sbin/ping6/ping6.c:1.86 src/sbin/ping6/ping6.c:1.87
--- src/sbin/ping6/ping6.c:1.86	Fri Apr 24 00:42:56 2015
+++ src/sbin/ping6/ping6.c	Fri May 15 08:02:39 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ping6.c,v 1.86 2015/04/24 00:42:56 christos Exp $	*/
+/*	$NetBSD: ping6.c,v 1.87 2015/05/15 08:02:39 kefren Exp $	*/
 /*	$KAME: ping6.c,v 1.164 2002/11/16 14:05:37 itojun Exp $	*/
 
 /*
@@ -77,7 +77,7 @@ static char sccsid[] = "@(#)ping.c	8.1 (
 #else
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ping6.c,v 1.86 2015/04/24 00:42:56 christos Exp $");
+__RCSID("$NetBSD: ping6.c,v 1.87 2015/05/15 08:02:39 kefren Exp $");
 #endif
 #endif
 
@@ -235,6 +235,8 @@ static double tmin = 999999999.0;	/* min
 static double tmax = 0.0;		/* maximum round trip time */
 static double tsum = 0.0;		/* sum of all times, for doing average */
 static double tsumsq = 0.0;		/* sum of all times squared, for std. dev. */
+static double maxwait = 0.0;		/* maxwait for reply in ms */
+static double deadline = 0.0;		/* max running time in seconds */
 
 /* for node addresses */
 static u_short naflags;
@@ -278,6 +280,7 @@ static void	 summary(void);
 static void	 tvsub(struct timeval *, struct timeval *);
 static int	 setpolicy(int, char *);
 static char	*nigroup(char *);
+static double	timespec_to_sec(const struct timespec *tp);
 __dead static void	 usage(void);
 
 int
@@ -311,6 +314,8 @@ main(int argc, char *argv[])
 #ifdef IPV6_USE_MIN_MTU
 	int mflag = 0;
 #endif
+	struct timespec now;
+	double exitat = 0.0;
 
 	/* just to be sure */
 	memset(&smsghdr, 0, sizeof(smsghdr));
@@ -328,7 +333,7 @@ main(int argc, char *argv[])
 #endif /*IPSEC_POLICY_IPSEC*/
 #endif
 	while ((ch = getopt(argc, argv,
-	    "a:b:c:dfHg:h:I:i:l:mnNop:qRS:s:tvwW" ADDOPTS)) != -1) {
+	    "a:b:c:dfHg:h:I:i:l:mnNop:qRS:s:tvwWx:X:" ADDOPTS)) != -1) {
 #undef ADDOPTS
 		switch (ch) {
 		case 'a':
@@ -532,6 +537,18 @@ main(int argc, char *argv[])
 			options &= ~F_NOUSERDATA;
 			options |= F_FQDNOLD;
 			break;
+		case 'x':
+			maxwait = strtod(optarg, &e);
+			if (*e != '\0' || maxwait <= 0)
+				errx(EXIT_FAILURE, "Bad/invalid maxwait time: "
+				    "%s", optarg);
+			break;
+		case 'X':
+			deadline = strtod(optarg, &e);
+			if (*e != '\0' || deadline <= 0)
+				errx(EXIT_FAILURE, "Bad/invalid deadline time: "
+				    "%s", optarg);
+                        break;
 #ifdef IPSEC
 #ifdef IPSEC_POLICY_IPSEC
 		case 'P':
@@ -790,7 +807,7 @@ main(int argc, char *argv[])
     }
 #endif /*ICMP6_FILTER*/
 
-	/* let the kerel pass extension headers of incoming packets */
+	/* let the kernel pass extension headers of incoming packets */
 	if ((options & F_VERBOSE) != 0) {
 		int opton = 1;
 
@@ -1019,6 +1036,11 @@ main(int argc, char *argv[])
 			retransmit();
 	}
 
+	if (deadline > 0) {
+		clock_gettime(CLOCK_MONOTONIC, &now);
+		exitat = timespec_to_sec(&now) + deadline;
+	}
+
 	seenalrm = seenint = 0;
 #ifdef SIGINFO
 	seeninfo = 0;
@@ -1029,6 +1051,13 @@ main(int argc, char *argv[])
 		u_char buf[1024];
 		struct iovec iov[2];
 
+		/* check deadline */
+		if (exitat > 0) {
+			clock_gettime(CLOCK_MONOTONIC, &now);
+			if (exitat <= timespec_to_sec(&now))
+				break;
+		}
+
 		/* signal handling */
 		if (seenalrm) {
 			retransmit();
@@ -1047,10 +1076,11 @@ main(int argc, char *argv[])
 			continue;
 		}
 #endif
-
 		if (options & F_FLOOD) {
 			(void)pinger();
 			timeout = 10;
+		} else if (deadline > 0) {
+			timeout = (int)floor(deadline * 1000);
 		} else {
 			timeout = INFTIM;
 		}
@@ -1442,6 +1472,10 @@ pr_pack(u_char *buf, int cc, struct msgh
 			tvsub(&tv, &tp);
 			triptime = ((double)tv.tv_sec) * 1000.0 +
 			    ((double)tv.tv_usec) / 1000.0;
+			if (maxwait > 0 && triptime > maxwait) {
+				nreceived--;
+				return;	/* DISCARD */
+			}
 			tsum += triptime;
 			tsumsq += triptime * triptime;
 			if (triptime < tmin)
@@ -2589,6 +2623,12 @@ nigroup(char *name)
 	return strdup(hbuf);
 }
 
+static double
+timespec_to_sec(const struct timespec *tp)
+{
+	return tp->tv_sec + tp->tv_nsec / 1000000000.0;
+}
+
 static void
 usage(void)
 {
@@ -2608,9 +2648,11 @@ usage(void)
 	    "AE"
 #endif
 #endif
-	    "] [-a [aAclsg]] [-b sockbufsiz] [-c count] \n"
+	    "] [-a [aAclsg]] [-b sockbufsiz] [-c count]\n"
             "\t[-I interface] [-i wait] [-l preload] [-p pattern] "
-	    "[-S sourceaddr]\n"
-            "\t[-s packetsize] [-h hoplimit] [-g gateway] [hops...] host\n");
+	    "[-X deadline]\n"
+	    "\t[-x maxwait] [-S sourceaddr] "
+            "[-s packetsize] [-h hoplimit]\n"
+	    "\t[-g gateway] [hops...] host\n");
 	exit(1);
 }

Reply via email to