ping: SO_RCVBUF must be bigger than packet size,
authorDenis Vlasenko <vda.linux@googlemail.com>
Sun, 24 Aug 2008 00:02:18 +0000 (00:02 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Sun, 24 Aug 2008 00:02:18 +0000 (00:02 -0000)
 otherwise large ping packets might fail to be received.

networking/ping.c

index 5def8c33563b51f2f542f8148bf77eb193b0622b..7cccfbfdc84b86f73e3fdbb15ce5dd20d49daaea 100644 (file)
@@ -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);