diff options
Diffstat (limited to 'networking/ping6.c')
-rw-r--r-- | networking/ping6.c | 45 |
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) | |||
234 | static char *icmp6_type_name(int id) | 233 | static 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 | ||
312 | static void ping(const char *host) | 315 | static 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 | } |