summaryrefslogtreecommitdiffstats
path: root/sbin/ping
diff options
context:
space:
mode:
authormaxim <maxim@FreeBSD.org>2003-07-14 12:37:03 +0000
committermaxim <maxim@FreeBSD.org>2003-07-14 12:37:03 +0000
commit3fd6e6089ef932650afd167b24fb0db588db8e33 (patch)
treeb74cca8a84851fd7e12d0ba47153c8244975043c /sbin/ping
parent661c94feb057803a0510d13305c3b7f016d46fa1 (diff)
downloadFreeBSD-src-3fd6e6089ef932650afd167b24fb0db588db8e33.zip
FreeBSD-src-3fd6e6089ef932650afd167b24fb0db588db8e33.tar.gz
o Be ready to get a reply with length up to IP_MAXPACKET.
o Warn when recieved packet length is not equal to length of the packet we sent out. Idea from NetBSD. o Fit the dump of packet with wrong data to 80 columns (from NetBSD). Comments from: bde
Diffstat (limited to 'sbin/ping')
-rw-r--r--sbin/ping/ping.c29
1 files changed, 18 insertions, 11 deletions
diff --git a/sbin/ping/ping.c b/sbin/ping/ping.c
index 750f74a..b62e635 100644
--- a/sbin/ping/ping.c
+++ b/sbin/ping/ping.c
@@ -168,6 +168,7 @@ int uid; /* cached uid for micro-optimization */
u_char icmp_type = ICMP_ECHO;
u_char icmp_type_rsp = ICMP_ECHOREPLY;
int phdr_len = 0;
+int send_len;
/* counters */
long nmissedmax; /* max value of ntransmitted - nreceived - 1 */
@@ -227,7 +228,7 @@ main(argc, argv)
struct sockaddr_in *to;
double t;
u_long alarmtimeout, ultmp;
- int almost_done, ch, df, hold, i, mib[4], packlen, preload, sockerrno,
+ int almost_done, ch, df, hold, i, icmp_len, mib[4], preload, sockerrno,
tos, ttl;
char ctrl[CMSG_SPACE(sizeof(struct timeval))];
char hnamebuf[MAXHOSTNAMELEN], snamebuf[MAXHOSTNAMELEN];
@@ -458,12 +459,14 @@ main(argc, argv)
errx(EX_USAGE, "ICMP_TSTAMP and ICMP_MASKREQ are exclusive.");
break;
}
- maxpayload = IP_MAXPACKET - sizeof(struct ip) - MINICMPLEN - phdr_len;
+ icmp_len = sizeof(struct ip) + MINICMPLEN + phdr_len;
if (options & F_RROUTE)
- maxpayload -= MAX_IPOPTLEN;
+ icmp_len += MAX_IPOPTLEN;
+ maxpayload = IP_MAXPACKET - icmp_len;
if (datalen > maxpayload)
errx(EX_USAGE, "packet size too large: %d > %d", datalen,
maxpayload);
+ send_len = icmp_len + datalen;
datap = &outpack[MINICMPLEN + phdr_len + TIMEVAL_LEN];
if (options & F_PINGFILLED) {
fill((char *)datap, payload);
@@ -527,8 +530,6 @@ main(argc, argv)
if (datalen >= TIMEVAL_LEN) /* can we time transfer */
timing = 1;
- packlen = MAXIPLEN + MAXICMPLEN + datalen;
- packlen = packlen > IP_MAXPACKET ? IP_MAXPACKET : packlen;
if (!(options & F_PINGFILLED))
for (i = TIMEVAL_LEN; i < datalen; ++i)
@@ -706,7 +707,7 @@ main(argc, argv)
msg.msg_control = (caddr_t)ctrl;
#endif
iov.iov_base = packet;
- iov.iov_len = packlen;
+ iov.iov_len = IP_MAXPACKET;
if (tcgetattr(STDOUT_FILENO, &ts) != -1) {
reset_kerninfo = !(ts.c_lflag & NOKERNINFO);
@@ -924,13 +925,14 @@ pr_pack(buf, cc, from, tv)
struct ip *ip;
const void *tp;
double triptime;
- int dupflag, hlen, i, j, seq;
+ int dupflag, hlen, i, j, recv_len, seq;
static int old_rrlen;
static char old_rr[MAX_IPOPTLEN];
/* Check the IP header */
ip = (struct ip *)buf;
hlen = ip->ip_hl << 2;
+ recv_len = cc;
if (cc < hlen + ICMP_MINLEN) {
if (options & F_VERBOSE)
warn("packet too short (%d bytes) from %s", cc,
@@ -1008,6 +1010,11 @@ pr_pack(buf, cc, from, tv)
(void)printf(" tsr=%s", pr_ntime(icp->icmp_rtime));
(void)printf(" tst=%s", pr_ntime(icp->icmp_ttime));
}
+ if (recv_len != send_len) {
+ (void)printf(
+ "\nwrong total length %d instead of %d",
+ recv_len, send_len);
+ }
/* check the data */
cp = (u_char*)&icp->icmp_data[phdr_len];
dp = &outpack[MINICMPLEN + phdr_len];
@@ -1026,16 +1033,16 @@ pr_pack(buf, cc, from, tv)
(void)printf("\ncp:");
cp = (u_char*)&icp->icmp_data[0];
for (i = 0; i < datalen; ++i, ++cp) {
- if ((i % 32) == 8)
+ if ((i % 16) == 8)
(void)printf("\n\t");
- (void)printf("%x ", *cp);
+ (void)printf("%2x ", *cp);
}
(void)printf("\ndp:");
cp = &outpack[MINICMPLEN];
for (i = 0; i < datalen; ++i, ++cp) {
- if ((i % 32) == 8)
+ if ((i % 16) == 8)
(void)printf("\n\t");
- (void)printf("%x ", *cp);
+ (void)printf("%2x ", *cp);
}
break;
}
OpenPOWER on IntegriCloud