From 577071558802573119ad5e0695dc6263d81a06fb Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Sun, 24 Aug 2008 00:02:18 +0000 Subject: ping: SO_RCVBUF must be bigger than packet size, otherwise large ping packets might fail to be received. --- networking/ping.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/networking/ping.c b/networking/ping.c index 5def8c335..7cccfbfdc 100644 --- a/networking/ping.c +++ b/networking/ping.c @@ -576,8 +576,9 @@ static void ping4(len_and_sockaddr *lsa) /* enable broadcast pings */ setsockopt_broadcast(pingsock); - /* set recv buf for broadcast pings */ - sockopt = 48 * 1024; /* explain why 48k? */ + /* set recv buf (needed if we can get lots of responses: flood ping, + * broadcast ping etc) */ + sockopt = (datalen * 2) + 7 * 1024; /* giving it a bit of extra room */ setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt)); signal(SIGINT, print_stats_and_exit); @@ -640,8 +641,9 @@ static void ping6(len_and_sockaddr *lsa) /* enable broadcast pings */ setsockopt_broadcast(pingsock); - /* set recv buf for broadcast pings */ - sockopt = 48 * 1024; /* explain why 48k? */ + /* set recv buf (needed if we can get lots of responses: flood ping, + * broadcast ping etc) */ + sockopt = (datalen * 2) + 7 * 1024; /* giving it a bit of extra room */ setsockopt(pingsock, SOL_SOCKET, SO_RCVBUF, &sockopt, sizeof(sockopt)); sockopt = offsetof(struct icmp6_hdr, icmp6_cksum); -- cgit v1.2.3