Lines Matching +full:short +full:- +full:ping
1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
39 * measure round-trip-delays and packet loss across network paths.
41 * Author -
46 * Status -
48 * Bugs -
89 #include "ping.h"
94 #define MASK_LEN (ICMP_MASKLEN - ICMP_MINLEN)
95 #define TS_LEN (ICMP_TSLEN - ICMP_MINLEN)
155 static struct sockaddr_in whereto; /* who to ping */
168 static int uid; /* cached uid for micro-optimization */
175 static long nmissedmax; /* max value of ntransmitted - nreceived - 1 */
197 ping(int argc, char *const *argv) in ping() function
237 * Historicaly ping was using one socket 's' for sending and for in ping()
239 * sockets. It was done for special ping use case - when user in ping()
240 * issue ping on multicast or broadcast address replies come in ping()
267 while ((ch = getopt(argc, argv, PING4OPTS)) != -1) { in ping()
287 ltmp = strtonum(optarg, -1, 7, &errstr); in ping()
310 err(EX_NOPERM, "-f flag"); in ping()
316 case 'G': /* Maximum payload size for ping sweep */ in ping()
330 case 'g': /* Minimum payload size for ping sweep */ in ping()
347 case 'h': /* Payload size increment for ping sweep */ in ping()
377 err(EX_NOPERM, "-i interval too short"); in ping()
391 err(EX_NOPERM, "-l flag"); in ping()
517 if (argc - optind != 1) in ping()
544 maxpayload = IP_MAXPACKET - icmp_len; in ping()
566 if ((unsigned)hp->h_length > sizeof(sock_in.sin_addr) || in ping()
567 hp->h_length < 0) in ping()
569 memcpy(&sock_in.sin_addr, hp->h_addr_list[0], in ping()
571 (void)strncpy(snamebuf, hp->h_name, in ping()
572 sizeof(snamebuf) - 1); in ping()
573 snamebuf[sizeof(snamebuf) - 1] = '\0'; in ping()
577 -1) in ping()
583 to->sin_family = AF_INET; in ping()
584 to->sin_len = sizeof *to; in ping()
585 if (inet_aton(target, &to->sin_addr) != 0) { in ping()
593 if ((unsigned)hp->h_length > sizeof(to->sin_addr)) in ping()
595 memcpy(&to->sin_addr, hp->h_addr_list[0], sizeof to->sin_addr); in ping()
596 (void)strncpy(hnamebuf, hp->h_name, sizeof(hnamebuf) - 1); in ping()
597 hnamebuf[sizeof(hnamebuf) - 1] = '\0'; in ping()
615 errx(EX_USAGE, "-f and -i: incompatible options"); in ping()
617 if (options & F_FLOOD && IN_MULTICAST(ntohl(to->sin_addr.s_addr))) in ping()
619 "-f flag cannot be used with multicast destination"); in ping()
621 && !IN_MULTICAST(ntohl(to->sin_addr.s_addr))) in ping()
623 "-I, -L, -T flags cannot be used with unicast destination"); in ping()
687 if (sysctl(mib, 4, &ttl, &sz, NULL, 0) == -1) in ping()
699 ip.ip_dst = to->sin_addr; in ping()
724 rspace[IPOPT_OLEN] = sizeof(rspace) - 1; in ping()
726 rspace[sizeof(rspace) - 1] = IPOPT_EOL; in ping()
777 if (sweepmax > maxpayload - TIMEVAL_LEN) in ping()
782 "Packet size and ping sweep are mutually exclusive"); in ping()
822 if (to->sin_family == AF_INET) { in ping()
823 (void)printf("PING %s (%s)", hostname, in ping()
824 inet_ntoa(to->sin_addr)); in ping()
835 (void)printf("PING %s: (%d ... %d) data bytes\n", in ping()
838 (void)printf("PING %s: %d data bytes\n", hostname, datalen); in ping()
849 if (sigaction(SIGINT, &si_sa, 0) == -1) in ping()
852 if (sigaction(SIGINFO, &si_sa, 0) == -1) in ping()
856 if (sigaction(SIGALRM, &si_sa, 0) == -1) in ping()
872 pinger(); /* send the first ping */ in ping()
876 while (preload--) /* fire off them quickies */ in ping()
932 cmsg->cmsg_level == SOL_SOCKET && in ping()
933 cmsg->cmsg_type == SCM_TIMESTAMP && in ping()
934 cmsg->cmsg_len == CMSG_LEN(sizeof *tv)) { in ping()
967 * change the timer to wait two round-trip times in ping()
983 if (ntransmitted - nreceived - 1 > nmissedmax) { in ping()
984 nmissedmax = ntransmitted - nreceived - 1; in ping()
996 * pinger --
1001 * host byte-order, to compute the round-trip time.
1085 * pr_pack --
1122 /* Reject IP packets with a short header */ in pr_pack()
1125 warn("IHL too short (%d bytes) from %s", hlen, in pr_pack()
1126 inet_ntoa(from->sin_addr)); in pr_pack()
1136 warn("packet too short (%zd bytes) from %s", cc, in pr_pack()
1137 inet_ntoa(from->sin_addr)); in pr_pack()
1141 icmp_data_raw_len = cc - (hlen + offsetof(struct icmp, icmp_data)); in pr_pack()
1145 cc -= hlen; in pr_pack()
1159 if ((size_t)(cc - ICMP_MINLEN - phdr_len) >= in pr_pack()
1166 triptime = ((double)tv->tv_sec) * 1000.0 + in pr_pack()
1167 ((double)tv->tv_nsec) / 1000000.0; in pr_pack()
1188 --nreceived; in pr_pack()
1207 pr_addr(from->sin_addr), seq); in pr_pack()
1234 cc -= ICMP_MINLEN + phdr_len; in pr_pack()
1239 cc -= TIMEVAL_LEN; in pr_pack()
1242 for (; i < datalen && cc > 0; ++i, ++cp, ++dp, --cc) { in pr_pack()
1284 warnx("quoted data too short (%zd bytes) from %s", in pr_pack()
1285 icmp_data_raw_len, inet_ntoa(from->sin_addr)); in pr_pack()
1292 /* Reject IP packets with a short header */ in pr_pack()
1295 warnx("inner IHL too short (%d bytes) from %s", in pr_pack()
1296 oip_header_len, inet_ntoa(from->sin_addr)); in pr_pack()
1307 warnx("inner packet too short (%zd bytes) from %s", in pr_pack()
1308 icmp_data_raw_len, inet_ntoa(from->sin_addr)); in pr_pack()
1323 pr_addr(from->sin_addr)); in pr_pack()
1332 for (; hlen > (int)sizeof(struct ip); --hlen, ++cp) in pr_pack()
1341 j = cp[IPOPT_OLEN] - IPOPT_MINOFF + 1; in pr_pack()
1342 hlen -= 2; in pr_pack()
1345 j <= hlen - (int)sizeof(struct ip)) { in pr_pack()
1353 hlen -= INADDR_LEN; in pr_pack()
1354 cp += INADDR_LEN - 1; in pr_pack()
1355 j -= INADDR_LEN; in pr_pack()
1366 hlen -= 2; in pr_pack()
1370 i = i - IPOPT_MINOFF + 1; in pr_pack()
1371 if (i < 0 || i > (hlen - (int)sizeof(struct ip))) { in pr_pack()
1379 hlen -= i; in pr_pack()
1387 i <= hlen - (int)sizeof(struct ip)) { in pr_pack()
1395 hlen -= INADDR_LEN; in pr_pack()
1396 cp += INADDR_LEN - 1; in pr_pack()
1397 i -= INADDR_LEN; in pr_pack()
1419 * pr_icmph --
1426 switch(icp->icmp_type) { in pr_icmph()
1432 switch(icp->icmp_code) { in pr_icmph()
1447 ntohs(icp->icmp_nextmtu)); in pr_icmph()
1457 icp->icmp_code); in pr_icmph()
1468 switch(icp->icmp_code) { in pr_icmph()
1482 (void)printf("Redirect, Bad Code: %d", icp->icmp_code); in pr_icmph()
1485 (void)printf("(New addr: %s)\n", inet_ntoa(icp->icmp_gwaddr)); in pr_icmph()
1493 switch(icp->icmp_code) { in pr_icmph()
1502 icp->icmp_code); in pr_icmph()
1509 icp->icmp_hun.ih_pptr); in pr_icmph()
1541 (void)printf("Bad ICMP type: %d\n", icp->icmp_type); in pr_icmph()
1546 * pr_iph --
1555 hlen = ip->ip_hl << 2; in pr_iph()
1558 memcpy(&src_ina, &ip->ip_src.s_addr, sizeof(src_ina)); in pr_iph()
1559 memcpy(&dst_ina, &ip->ip_dst.s_addr, sizeof(dst_ina)); in pr_iph()
1568 ip->ip_v, ip->ip_hl, ip->ip_tos, ntohs(ip->ip_len), in pr_iph()
1569 ntohs(ip->ip_id)); in pr_iph()
1571 (ntohs(ip->ip_off) & 0xe000) >> 13, in pr_iph()
1572 ntohs(ip->ip_off) & 0x1fff); in pr_iph()
1573 (void)printf(" %02x %02x %04x", ip->ip_ttl, ip->ip_p, in pr_iph()
1574 ntohs(ip->ip_sum)); in pr_iph()
1580 while (hlen-- > (int)sizeof(struct ip)) { in pr_iph()
1588 * pr_addr --
1606 (void)snprintf(buf, sizeof(buf), "%s (%s)", hp->h_name, in pr_addr()
1647 for (kk = 0; kk <= maxpayload - (TIMEVAL_LEN + ii); kk += ii) in fill()