diff options
Diffstat (limited to 'networking/ping6.c')
-rw-r--r-- | networking/ping6.c | 17 |
1 files changed, 7 insertions, 10 deletions
diff --git a/networking/ping6.c b/networking/ping6.c index dec3b426a..a92387e79 100644 --- a/networking/ping6.c +++ b/networking/ping6.c | |||
@@ -77,8 +77,7 @@ static void ping(const char *host) | |||
77 | pkt->icmp6_type = ICMP6_ECHO_REQUEST; | 77 | pkt->icmp6_type = ICMP6_ECHO_REQUEST; |
78 | 78 | ||
79 | sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); | 79 | sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); |
80 | setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, (char *) &sockopt, | 80 | setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, &sockopt, sizeof(sockopt)); |
81 | sizeof(sockopt)); | ||
82 | 81 | ||
83 | c = sendto(pingsock, packet, DEFDATALEN + sizeof (struct icmp6_hdr), 0, | 82 | c = sendto(pingsock, packet, DEFDATALEN + sizeof (struct icmp6_hdr), 0, |
84 | (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in6)); | 83 | (struct sockaddr *) &pingaddr, sizeof(struct sockaddr_in6)); |
@@ -312,6 +311,7 @@ static void unpack(char *packet, int sz, struct sockaddr_in6 *from, int hoplimit | |||
312 | fflush(stdout); | 311 | fflush(stdout); |
313 | } | 312 | } |
314 | 313 | ||
314 | extern int BUG_bad_offsetof_icmp6_cksum(void); | ||
315 | static void ping(const char *host) | 315 | static void ping(const char *host) |
316 | { | 316 | { |
317 | char packet[datalen + MAXIPLEN + MAXICMPLEN]; | 317 | char packet[datalen + MAXIPLEN + MAXICMPLEN]; |
@@ -353,18 +353,15 @@ static void ping(const char *host) | |||
353 | 353 | ||
354 | /* set recv buf for broadcast pings */ | 354 | /* set recv buf for broadcast pings */ |
355 | sockopt = 48 * 1024; /* explain why 48k? */ | 355 | sockopt = 48 * 1024; /* explain why 48k? */ |
356 | setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, (char *) &sockopt, | 356 | setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt)); |
357 | sizeof(sockopt)); | ||
358 | 357 | ||
359 | sockopt = 2; /* iputils-ss020927 does this */ | ||
360 | sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); | 358 | sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); |
361 | setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, (char *) &sockopt, | 359 | if (offsetof(struct icmp6_hdr, icmp6_cksum) != 2) |
362 | sizeof(sockopt)); | 360 | BUG_bad_offsetof_icmp6_cksum(); |
361 | setsockopt(pingsock, SOL_RAW, IPV6_CHECKSUM, &sockopt, sizeof(sockopt)); | ||
363 | 362 | ||
364 | /* request ttl info to be returned in ancillary data */ | 363 | /* request ttl info to be returned in ancillary data */ |
365 | sockopt = 1; | 364 | setsockopt(pingsock, SOL_IPV6, IPV6_HOPLIMIT, &const_int_1, sizeof(const_int_1)); |
366 | setsockopt(pingsock, SOL_IPV6, IPV6_HOPLIMIT, (char *) &sockopt, | ||
367 | sizeof(sockopt)); | ||
368 | 365 | ||
369 | if (if_index) | 366 | if (if_index) |
370 | pingaddr.sin6_scope_id = if_index; | 367 | pingaddr.sin6_scope_id = if_index; |