aboutsummaryrefslogtreecommitdiff
path: root/networking/ping6.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/ping6.c')
-rw-r--r--networking/ping6.c45
1 files changed, 24 insertions, 21 deletions
diff --git a/networking/ping6.c b/networking/ping6.c
index 5cb02f51a..dec3b426a 100644
--- a/networking/ping6.c
+++ b/networking/ping6.c
@@ -1,6 +1,5 @@
1/* vi: set sw=4 ts=4: */ 1/* vi: set sw=4 ts=4: */
2/* 2/*
3 * $Id: ping6.c,v 1.6 2004/03/15 08:28:48 andersen Exp $
4 * Mini ping implementation for busybox 3 * Mini ping implementation for busybox
5 * 4 *
6 * Copyright (C) 1999 by Randolph Chung <tausq@debian.org> 5 * Copyright (C) 1999 by Randolph Chung <tausq@debian.org>
@@ -67,7 +66,7 @@ static void ping(const char *host)
67 66
68 pingsock = create_icmp6_socket(); 67 pingsock = create_icmp6_socket();
69 68
70 memset(&pingaddr, 0, sizeof(struct sockaddr_in)); 69 memset(&pingaddr, 0, sizeof(pingaddr));
71 70
72 pingaddr.sin6_family = AF_INET6; 71 pingaddr.sin6_family = AF_INET6;
73 h = xgethostbyname2(host, AF_INET6); 72 h = xgethostbyname2(host, AF_INET6);
@@ -196,7 +195,7 @@ static void sendping(int junk)
196 pkt->icmp6_cksum = 0; 195 pkt->icmp6_cksum = 0;
197 pkt->icmp6_seq = htons(ntransmitted); /* don't ++ here, it can be a macro */ 196 pkt->icmp6_seq = htons(ntransmitted); /* don't ++ here, it can be a macro */
198 pkt->icmp6_id = myid; 197 pkt->icmp6_id = myid;
199 CLR(pkt->icmp6_seq % MAX_DUP_CHK); 198 CLR((uint16_t)ntransmitted % MAX_DUP_CHK);
200 ntransmitted++; 199 ntransmitted++;
201 200
202 gettimeofday((struct timeval *) &pkt->icmp6_data8[4], NULL); 201 gettimeofday((struct timeval *) &pkt->icmp6_data8[4], NULL);
@@ -220,7 +219,7 @@ static void sendping(int junk)
220 } 219 }
221} 220}
222 221
223/* RFC3542 changed some definitions from RFC2292 for no good reason, whee ! 222/* RFC3542 changed some definitions from RFC2292 for no good reason, whee!
224 * the newer 3542 uses a MLD_ prefix where as 2292 uses ICMP6_ prefix */ 223 * the newer 3542 uses a MLD_ prefix where as 2292 uses ICMP6_ prefix */
225#ifndef MLD_LISTENER_QUERY 224#ifndef MLD_LISTENER_QUERY
226# define MLD_LISTENER_QUERY ICMP6_MEMBERSHIP_QUERY 225# define MLD_LISTENER_QUERY ICMP6_MEMBERSHIP_QUERY
@@ -234,16 +233,16 @@ static void sendping(int junk)
234static char *icmp6_type_name(int id) 233static char *icmp6_type_name(int id)
235{ 234{
236 switch (id) { 235 switch (id) {
237 case ICMP6_DST_UNREACH: return "Destination Unreachable"; 236 case ICMP6_DST_UNREACH: return "Destination Unreachable";
238 case ICMP6_PACKET_TOO_BIG: return "Packet too big"; 237 case ICMP6_PACKET_TOO_BIG: return "Packet too big";
239 case ICMP6_TIME_EXCEEDED: return "Time Exceeded"; 238 case ICMP6_TIME_EXCEEDED: return "Time Exceeded";
240 case ICMP6_PARAM_PROB: return "Parameter Problem"; 239 case ICMP6_PARAM_PROB: return "Parameter Problem";
241 case ICMP6_ECHO_REPLY: return "Echo Reply"; 240 case ICMP6_ECHO_REPLY: return "Echo Reply";
242 case ICMP6_ECHO_REQUEST: return "Echo Request"; 241 case ICMP6_ECHO_REQUEST: return "Echo Request";
243 case MLD_LISTENER_QUERY: return "Listener Query"; 242 case MLD_LISTENER_QUERY: return "Listener Query";
244 case MLD_LISTENER_REPORT: return "Listener Report"; 243 case MLD_LISTENER_REPORT: return "Listener Report";
245 case MLD_LISTENER_REDUCTION: return "Listener Reduction"; 244 case MLD_LISTENER_REDUCTION: return "Listener Reduction";
246 default: return "unknown ICMP type"; 245 default: return "unknown ICMP type";
247 } 246 }
248} 247}
249 248
@@ -266,6 +265,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit
266 return; /* not our ping */ 265 return; /* not our ping */
267 266
268 if (icmppkt->icmp6_type == ICMP6_ECHO_REPLY) { 267 if (icmppkt->icmp6_type == ICMP6_ECHO_REPLY) {
268 uint16_t recv_seq = ntohs(icmppkt->icmp6_seq);
269 ++nreceived; 269 ++nreceived;
270 tp = (struct timeval *) &icmppkt->icmp6_data8[4]; 270 tp = (struct timeval *) &icmppkt->icmp6_data8[4];
271 271
@@ -282,12 +282,12 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit
282 if (triptime > tmax) 282 if (triptime > tmax)
283 tmax = triptime; 283 tmax = triptime;
284 284
285 if (TST(icmppkt->icmp6_seq % MAX_DUP_CHK)) { 285 if (TST(recv_seq % MAX_DUP_CHK)) {
286 ++nrepeats; 286 ++nrepeats;
287 --nreceived; 287 --nreceived;
288 dupflag = 1; 288 dupflag = 1;
289 } else { 289 } else {
290 SET(icmppkt->icmp6_seq % MAX_DUP_CHK); 290 SET(recv_seq % MAX_DUP_CHK);
291 dupflag = 0; 291 dupflag = 0;
292 } 292 }
293 293
@@ -297,16 +297,19 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit
297 printf("%d bytes from %s: icmp6_seq=%u", sz, 297 printf("%d bytes from %s: icmp6_seq=%u", sz,
298 inet_ntop(AF_INET6, &pingaddr.sin6_addr, 298 inet_ntop(AF_INET6, &pingaddr.sin6_addr,
299 buf, sizeof(buf)), 299 buf, sizeof(buf)),
300 ntohs(icmppkt->icmp6_seq)); 300 recv_seq);
301 printf(" ttl=%d time=%lu.%lu ms", hoplimit, 301 printf(" ttl=%d time=%lu.%lu ms", hoplimit,
302 triptime / 10, triptime % 10); 302 triptime / 10, triptime % 10);
303 if (dupflag) 303 if (dupflag)
304 printf(" (DUP!)"); 304 printf(" (DUP!)");
305 puts(""); 305 puts("");
306 } else 306 } else {
307 if (icmppkt->icmp6_type != ICMP6_ECHO_REQUEST) 307 if (icmppkt->icmp6_type != ICMP6_ECHO_REQUEST)
308 bb_error_msg("warning: got ICMP %d (%s)", 308 bb_error_msg("warning: got ICMP %d (%s)",
309 icmppkt->icmp6_type, icmp6_type_name(icmppkt->icmp6_type)); 309 icmppkt->icmp6_type,
310 icmp6_type_name(icmppkt->icmp6_type));
311 }
312 fflush(stdout);
310} 313}
311 314
312static void ping(const char *host) 315static void ping(const char *host)
@@ -321,7 +324,7 @@ static void ping(const char *host)
321 324
322 pingsock = create_icmp6_socket(); 325 pingsock = create_icmp6_socket();
323 326
324 memset(&pingaddr, 0, sizeof(struct sockaddr_in)); 327 memset(&pingaddr, 0, sizeof(pingaddr));
325 328
326 pingaddr.sin6_family = AF_INET6; 329 pingaddr.sin6_family = AF_INET6;
327 hostent = xgethostbyname2(host, AF_INET6); 330 hostent = xgethostbyname2(host, AF_INET6);
@@ -431,7 +434,7 @@ int ping6_main(int argc, char **argv)
431 "%s: invalid interface name", opt_I); 434 "%s: invalid interface name", opt_I);
432 } 435 }
433 436
434 myid = (int16_t)getpid(); 437 myid = (int16_t) getpid();
435 ping(argv[optind]); 438 ping(argv[optind]);
436 return EXIT_SUCCESS; 439 return EXIT_SUCCESS;
437} 440}