[ros-diffs] [cgutman] 45129: - Fix calculation of the maximum data size (it previously calculated 65519 (0xFFFF - sizeof(ICMPv4Header) - sizeof(LARGE_INTEGER)) which was wrong because the real maximum was 65499 (0xFFFF - sizeof(IPv4Header) - sizeof(ICMPv4Header) - sizeof(LARGE_INTEGER))) - Implement -f and -i options - Note: This raises our max ping data size to 65507 (0xFFFF - sizeof(IPv4Header) - sizeof(ICMPv4Header)) so we match linux's (iputils) ping max size but Windows' max is 65500 and I'm not sure if we should change our code to match Windows or not
cgutman at svn.reactos.org
cgutman at svn.reactos.org
Mon Jan 18 01:52:31 CET 2010
Author: cgutman
Date: Mon Jan 18 01:52:31 2010
New Revision: 45129
URL: http://svn.reactos.org/svn/reactos?rev=45129&view=rev
Log:
- Fix calculation of the maximum data size (it previously calculated 65519 (0xFFFF - sizeof(ICMPv4Header) - sizeof(LARGE_INTEGER)) which was wrong because the real maximum was 65499 (0xFFFF - sizeof(IPv4Header) - sizeof(ICMPv4Header) - sizeof(LARGE_INTEGER)))
- Implement -f and -i options
- Note: This raises our max ping data size to 65507 (0xFFFF - sizeof(IPv4Header) - sizeof(ICMPv4Header)) so we match linux's (iputils) ping max size but Windows' max is 65500 and I'm not sure if we should change our code to match Windows or not
Modified:
branches/aicom-network-branch/base/applications/network/ping/ping.c
Modified: branches/aicom-network-branch/base/applications/network/ping/ping.c
URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-branch/base/applications/network/ping/ping.c?rev=45129&r1=45128&r2=45129&view=diff
==============================================================================
--- branches/aicom-network-branch/base/applications/network/ping/ping.c [iso-8859-1] (original)
+++ branches/aicom-network-branch/base/applications/network/ping/ping.c [iso-8859-1] Mon Jan 18 01:52:31 2010
@@ -7,6 +7,7 @@
*/
#include <winsock2.h>
+#include <ws2tcpip.h>
#include <tchar.h>
#include <stdarg.h>
#include <string.h>
@@ -53,7 +54,6 @@
typedef struct _ICMP_ECHO_PACKET
{
ICMP_HEADER Icmp;
- LARGE_INTEGER Timestamp;
} ICMP_ECHO_PACKET, *PICMP_ECHO_PACKET;
#pragma pack(1)
@@ -83,6 +83,7 @@
LARGE_INTEGER AvgRTT;
LARGE_INTEGER TicksPerMs; /* Ticks per millisecond */
LARGE_INTEGER TicksPerUs; /* Ticks per microsecond */
+LARGE_INTEGER SentTime;
BOOL UsePerformanceCounter;
#ifndef NDEBUG
@@ -218,10 +219,10 @@
case 'n': PingCount = GetULONG2(&argv[i][2], argv[i + 1], &i); break;
case 'l':
DataSize = GetULONG2(&argv[i][2], argv[i + 1], &i);
- if (DataSize > ICMP_MAXSIZE - sizeof(ICMP_ECHO_PACKET))
+ if (DataSize > ICMP_MAXSIZE - sizeof(ICMP_ECHO_PACKET) - sizeof(IPv4_HEADER))
{
printf("Bad value for option -l, valid range is from 0 to %d.\n",
- ICMP_MAXSIZE - (int)sizeof(ICMP_ECHO_PACKET));
+ ICMP_MAXSIZE - (int)sizeof(ICMP_ECHO_PACKET) - (int)sizeof(IPv4_HEADER));
return FALSE;
}
break;
@@ -314,6 +315,27 @@
return FALSE;
}
+ if (setsockopt(IcmpSock,
+ IPPROTO_IP,
+ IP_DONTFRAGMENT,
+ (const char *)&DontFragment,
+ sizeof(DontFragment)) == SOCKET_ERROR)
+ {
+ printf("setsockopt failed (%d).\n", WSAGetLastError());
+ return FALSE;
+ }
+
+ if (setsockopt(IcmpSock,
+ IPPROTO_IP,
+ IP_TTL,
+ (const char *)&TTLValue,
+ sizeof(TTLValue)) == SOCKET_ERROR)
+ {
+ printf("setsockopt failed (%d).\n", WSAGetLastError());
+ return FALSE;
+ }
+
+
ZeroMemory(&Target, sizeof(Target));
phe = NULL;
Addr = inet_addr(TargetName);
@@ -447,7 +469,7 @@
QueryTime(&LargeTime);
- RelativeTime.QuadPart = (LargeTime.QuadPart - Icmp->Timestamp.QuadPart);
+ RelativeTime.QuadPart = (LargeTime.QuadPart - SentTime.QuadPart);
if ((RelativeTime.QuadPart / TicksPerMs.QuadPart) < 1)
{
@@ -505,10 +527,6 @@
Packet->Icmp.SeqNum = htons((USHORT)CurrentSeqNum);
Packet->Icmp.Checksum = 0;
- /* Timestamp is part of data area */
- QueryTime(&Packet->Timestamp);
-
- CopyMemory(Buffer, &Packet->Icmp, sizeof(ICMP_ECHO_PACKET) + DataSize);
/* Calculate checksum for ICMP header and data area */
Packet->Icmp.Checksum = Checksum((PUSHORT)&Packet->Icmp, sizeof(ICMP_ECHO_PACKET) + DataSize);
@@ -532,6 +550,7 @@
Status = sendto(IcmpSock, Buffer, sizeof(ICMP_ECHO_PACKET) + DataSize,
0, (SOCKADDR*)&Target, sizeof(Target));
+ QueryTime(&SentTime);
SentCount++;
}
if (Status == SOCKET_ERROR)
More information about the Ros-diffs
mailing list