mirror of
https://github.com/reactos/reactos.git
synced 2024-08-16 08:29:38 +00:00
Import and merge Wine-20041201
svn path=/trunk/; revision=12533
This commit is contained in:
parent
3d47600ac9
commit
811db616d2
13
reactos/lib/icmp/Makefile.in
Normal file
13
reactos/lib/icmp/Makefile.in
Normal file
|
@ -0,0 +1,13 @@
|
|||
TOPSRCDIR = @top_srcdir@
|
||||
TOPOBJDIR = ../..
|
||||
SRCDIR = @srcdir@
|
||||
VPATH = @srcdir@
|
||||
MODULE = icmp.dll
|
||||
IMPORTS = kernel32
|
||||
EXTRALIBS = @SOCKETLIBS@
|
||||
|
||||
C_SRCS = icmp_main.c
|
||||
|
||||
@MAKE_DLL_RULES@
|
||||
|
||||
### Dependencies:
|
21
reactos/lib/icmp/Makefile.ros-template
Normal file
21
reactos/lib/icmp/Makefile.ros-template
Normal file
|
@ -0,0 +1,21 @@
|
|||
# $Id: Makefile.ros-template 11910 2004-12-03 23:37:44Z blight $
|
||||
|
||||
TARGET_NAME = icmp
|
||||
|
||||
TARGET_OBJECTS = @C_SRCS@
|
||||
|
||||
TARGET_CFLAGS = @EXTRADEFS@ -D__REACTOS__
|
||||
|
||||
TARGET_SDKLIBS = @IMPORTS@ ws2_32.a wine.a wine_uuid.a ntdll.a
|
||||
|
||||
TARGET_BASE = $(TARGET_BASE_LIB_COMCTL32)
|
||||
|
||||
#TARGET_RC_SRCS = @RC_SRCS@
|
||||
#TARGET_RC_BINSRC = @RC_BINSRC@
|
||||
#TARGET_RC_BINARIES = @RC_BINARIES@
|
||||
|
||||
default: all
|
||||
|
||||
DEP_OBJECTS = $(TARGET_OBJECTS)
|
||||
|
||||
include $(TOOLS_PATH)/depend.mk
|
96
reactos/lib/icmp/icmp.dsp
Normal file
96
reactos/lib/icmp/icmp.dsp
Normal file
|
@ -0,0 +1,96 @@
|
|||
# Microsoft Developer Studio Project File - Name="icmp" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
||||
|
||||
CFG=icmp - Win32
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "icmp.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "icmp.mak" CFG="icmp - Win32"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "icmp - Win32" (based on "Win32 (x86) Dynamic-Link Library")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Output\Win32"
|
||||
# PROP BASE Intermediate_Dir "Output\Win32"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Output\Win32"
|
||||
# PROP Intermediate_Dir "Output\Win32"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "ICMP_EXPORTS" /FD /GZ /c
|
||||
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ..\..\include /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "_ICMP_" /D "__WINESRC__" /D __WINETEST_OUTPUT_DIR=\"Output\\Win32\" /D "__i386__" /D "_X86_" /D inline=__inline /FR /FD /GZ /c
|
||||
# SUBTRACT CPP /X /YX
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
||||
# ADD BASE RSC /l 0x41d /d "_DEBUG"
|
||||
# ADD RSC /l 0x41d /i "..\..\include" /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 /nologo /dll /debug /machine:I386 /def:"icmp.def" /pdbtype:sept
|
||||
# Begin Target
|
||||
|
||||
# Name "icmp - Win32"
|
||||
# Begin Group "Source Files"
|
||||
|
||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icmp.dll.dbg.c
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icmp.spec
|
||||
# Begin Custom Build
|
||||
InputPath=.\icmp.spec
|
||||
|
||||
BuildCmds= \
|
||||
..\..\tools\winebuild\Output\\Win32\winebuild.exe --def .\icmp.spec > .\icmp.def \
|
||||
..\..\tools\winebuild\Output\\Win32\winebuild.exe -o .\icmp.dll.dbg.c --debug -C. icmp_main.c \
|
||||
|
||||
|
||||
".\icmp.def" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
|
||||
".\icmp.dll.dbg.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
|
||||
$(BuildCmds)
|
||||
# End Custom Build
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\icmp_main.c
|
||||
# End Source File
|
||||
# End Group
|
||||
# Begin Group "Header Files"
|
||||
|
||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
||||
# End Group
|
||||
# Begin Group "Resource Files"
|
||||
|
||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
||||
# End Group
|
||||
# End Target
|
||||
# End Project
|
1
reactos/lib/icmp/icmp.rc
Normal file
1
reactos/lib/icmp/icmp.rc
Normal file
|
@ -0,0 +1 @@
|
|||
#include "wine/wine_common_ver.rc"
|
8
reactos/lib/icmp/icmp.spec
Normal file
8
reactos/lib/icmp/icmp.spec
Normal file
|
@ -0,0 +1,8 @@
|
|||
@ stdcall IcmpCloseHandle(ptr)
|
||||
@ stdcall IcmpCreateFile()
|
||||
@ stub IcmpParseReplies
|
||||
@ stdcall IcmpSendEcho(ptr long ptr long ptr ptr long long)
|
||||
@ stub IcmpSendEcho2
|
||||
@ stub do_echo_rep
|
||||
@ stub do_echo_req
|
||||
@ stub register_icmp
|
511
reactos/lib/icmp/icmp_main.c
Normal file
511
reactos/lib/icmp/icmp_main.c
Normal file
|
@ -0,0 +1,511 @@
|
|||
/*
|
||||
* ICMP
|
||||
*
|
||||
* Francois Gouget, 1999, based on the work of
|
||||
* RW Hall, 1999, based on public domain code PING.C by Mike Muus (1983)
|
||||
* and later works (c) 1989 Regents of Univ. of California - see copyright
|
||||
* notice at end of source-code.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* Future work:
|
||||
* - Systems like FreeBSD don't seem to support the IP_TTL option and maybe others.
|
||||
* But using IP_HDRINCL and building the IP header by hand might work.
|
||||
* - Not all IP options are supported.
|
||||
* - Are ICMP handles real handles, i.e. inheritable and all? There might be some
|
||||
* more work to do here, including server side stuff with synchronization.
|
||||
* - Is it correct to use malloc for the internal buffer, for allocating the
|
||||
* handle's structure?
|
||||
* - This API should probably be thread safe. Is it really?
|
||||
* - Using the winsock functions has not been tested.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <sys/types.h>
|
||||
#ifdef HAVE_SYS_SOCKET_H
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETDB_H
|
||||
# include <netdb.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_SYSTM_H
|
||||
# include <netinet/in_systm.h>
|
||||
#endif
|
||||
#ifdef HAVE_NETINET_IN_H
|
||||
# include <netinet/in.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_TIME_H
|
||||
# include <sys/time.h>
|
||||
#endif
|
||||
#include <stdarg.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_ARPA_INET_H
|
||||
# include <arpa/inet.h>
|
||||
#endif
|
||||
|
||||
#include "windef.h"
|
||||
#include "winbase.h"
|
||||
#include "winerror.h"
|
||||
#include "ipexport.h"
|
||||
#include "icmpapi.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
/* Set up endiannes macros for the ip and ip_icmp BSD headers */
|
||||
#ifndef BIG_ENDIAN
|
||||
#define BIG_ENDIAN 4321
|
||||
#endif
|
||||
#ifndef LITTLE_ENDIAN
|
||||
#define LITTLE_ENDIAN 1234
|
||||
#endif
|
||||
#ifndef BYTE_ORDER
|
||||
#ifdef WORDS_BIGENDIAN
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#else
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
#define u_int16_t WORD
|
||||
#define u_int32_t DWORD
|
||||
|
||||
/* These are BSD headers. We use these here because they are needed on
|
||||
* libc5 Linux systems. On other platforms they are usually simply more
|
||||
* complete than the native stuff, and cause less portability problems
|
||||
* so we use them anyway.
|
||||
*/
|
||||
#include "ip.h"
|
||||
#include "ip_icmp.h"
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(icmp);
|
||||
|
||||
|
||||
typedef struct {
|
||||
int sid;
|
||||
IP_OPTION_INFORMATION default_opts;
|
||||
} icmp_t;
|
||||
|
||||
#define IP_OPTS_UNKNOWN 0
|
||||
#define IP_OPTS_DEFAULT 1
|
||||
#define IP_OPTS_CUSTOM 2
|
||||
|
||||
/* The sequence number is unique process wide, so that all threads
|
||||
* have a distinct sequence number.
|
||||
*/
|
||||
static LONG icmp_sequence=0;
|
||||
|
||||
static int in_cksum(u_short *addr, int len)
|
||||
{
|
||||
int nleft=len;
|
||||
u_short *w = addr;
|
||||
int sum = 0;
|
||||
u_short answer = 0;
|
||||
|
||||
while (nleft > 1) {
|
||||
sum += *w++;
|
||||
nleft -= 2;
|
||||
}
|
||||
|
||||
if (nleft == 1) {
|
||||
*(u_char *)(&answer) = *(u_char *)w;
|
||||
sum += answer;
|
||||
}
|
||||
|
||||
sum = (sum >> 16) + (sum & 0xffff);
|
||||
sum += (sum >> 16);
|
||||
answer = ~sum;
|
||||
return(answer);
|
||||
}
|
||||
|
||||
/*
|
||||
* Exported Routines.
|
||||
*/
|
||||
|
||||
/***********************************************************************
|
||||
* IcmpCreateFile (ICMP.@)
|
||||
*/
|
||||
HANDLE WINAPI IcmpCreateFile(VOID)
|
||||
{
|
||||
icmp_t* icp;
|
||||
|
||||
int sid=socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
|
||||
if (sid < 0) {
|
||||
MESSAGE("WARNING: Trying to use ICMP (network ping) will fail unless running as root\n");
|
||||
SetLastError(ERROR_ACCESS_DENIED);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
|
||||
icp=HeapAlloc(GetProcessHeap(), 0, sizeof(*icp));
|
||||
if (icp==NULL) {
|
||||
SetLastError(IP_NO_RESOURCES);
|
||||
return INVALID_HANDLE_VALUE;
|
||||
}
|
||||
icp->sid=sid;
|
||||
icp->default_opts.OptionsSize=IP_OPTS_UNKNOWN;
|
||||
return (HANDLE)icp;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* IcmpCloseHandle (ICMP.@)
|
||||
*/
|
||||
BOOL WINAPI IcmpCloseHandle(HANDLE IcmpHandle)
|
||||
{
|
||||
icmp_t* icp=(icmp_t*)IcmpHandle;
|
||||
if (IcmpHandle==INVALID_HANDLE_VALUE) {
|
||||
/* FIXME: in fact win98 seems to ignore the handle value !!! */
|
||||
SetLastError(ERROR_INVALID_HANDLE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
shutdown(icp->sid,2);
|
||||
HeapFree(GetProcessHeap (), 0, icp);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* IcmpSendEcho (ICMP.@)
|
||||
*/
|
||||
DWORD WINAPI IcmpSendEcho(
|
||||
HANDLE IcmpHandle,
|
||||
IPAddr DestinationAddress,
|
||||
LPVOID RequestData,
|
||||
WORD RequestSize,
|
||||
PIP_OPTION_INFORMATION RequestOptions,
|
||||
LPVOID ReplyBuffer,
|
||||
DWORD ReplySize,
|
||||
DWORD Timeout
|
||||
)
|
||||
{
|
||||
icmp_t* icp=(icmp_t*)IcmpHandle;
|
||||
unsigned char* reqbuf;
|
||||
int reqsize;
|
||||
|
||||
struct icmp_echo_reply* ier;
|
||||
struct ip* ip_header;
|
||||
struct icmp* icmp_header;
|
||||
char* endbuf;
|
||||
int ip_header_len;
|
||||
int maxlen;
|
||||
fd_set fdr;
|
||||
struct timeval timeout;
|
||||
DWORD send_time,recv_time;
|
||||
struct sockaddr_in addr;
|
||||
int addrlen;
|
||||
unsigned short id,seq,cksum;
|
||||
int res;
|
||||
|
||||
if (IcmpHandle==INVALID_HANDLE_VALUE) {
|
||||
/* FIXME: in fact win98 seems to ignore the handle value !!! */
|
||||
SetLastError(ERROR_INVALID_HANDLE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ReplySize<sizeof(ICMP_ECHO_REPLY)+ICMP_MINLEN) {
|
||||
SetLastError(IP_BUF_TOO_SMALL);
|
||||
return 0;
|
||||
}
|
||||
/* check the request size against SO_MAX_MSG_SIZE using getsockopt */
|
||||
|
||||
/* Prepare the request */
|
||||
id=getpid() & 0xFFFF;
|
||||
seq=InterlockedIncrement(&icmp_sequence) & 0xFFFF;
|
||||
|
||||
reqsize=ICMP_MINLEN+RequestSize;
|
||||
reqbuf=HeapAlloc(GetProcessHeap(), 0, reqsize);
|
||||
if (reqbuf==NULL) {
|
||||
SetLastError(ERROR_OUTOFMEMORY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
icmp_header=(struct icmp*)reqbuf;
|
||||
icmp_header->icmp_type=ICMP_ECHO;
|
||||
icmp_header->icmp_code=0;
|
||||
icmp_header->icmp_cksum=0;
|
||||
icmp_header->icmp_id=id;
|
||||
icmp_header->icmp_seq=seq;
|
||||
memcpy(reqbuf+ICMP_MINLEN, RequestData, RequestSize);
|
||||
icmp_header->icmp_cksum=cksum=in_cksum((u_short*)reqbuf,reqsize);
|
||||
|
||||
addr.sin_family=AF_INET;
|
||||
addr.sin_addr.s_addr=DestinationAddress;
|
||||
addr.sin_port=0;
|
||||
|
||||
if (RequestOptions!=NULL) {
|
||||
int val;
|
||||
if (icp->default_opts.OptionsSize==IP_OPTS_UNKNOWN) {
|
||||
int len;
|
||||
/* Before we mess with the options, get the default values */
|
||||
len=sizeof(val);
|
||||
getsockopt(icp->sid,IPPROTO_IP,IP_TTL,(char *)&val,&len);
|
||||
icp->default_opts.Ttl=val;
|
||||
|
||||
len=sizeof(val);
|
||||
getsockopt(icp->sid,IPPROTO_IP,IP_TOS,(char *)&val,&len);
|
||||
icp->default_opts.Tos=val;
|
||||
/* FIXME: missing: handling of IP 'flags', and all the other options */
|
||||
}
|
||||
|
||||
val=RequestOptions->Ttl;
|
||||
setsockopt(icp->sid,IPPROTO_IP,IP_TTL,(char *)&val,sizeof(val));
|
||||
val=RequestOptions->Tos;
|
||||
setsockopt(icp->sid,IPPROTO_IP,IP_TOS,(char *)&val,sizeof(val));
|
||||
/* FIXME: missing: handling of IP 'flags', and all the other options */
|
||||
|
||||
icp->default_opts.OptionsSize=IP_OPTS_CUSTOM;
|
||||
} else if (icp->default_opts.OptionsSize==IP_OPTS_CUSTOM) {
|
||||
int val;
|
||||
|
||||
/* Restore the default options */
|
||||
val=icp->default_opts.Ttl;
|
||||
setsockopt(icp->sid,IPPROTO_IP,IP_TTL,(char *)&val,sizeof(val));
|
||||
val=icp->default_opts.Tos;
|
||||
setsockopt(icp->sid,IPPROTO_IP,IP_TOS,(char *)&val,sizeof(val));
|
||||
/* FIXME: missing: handling of IP 'flags', and all the other options */
|
||||
|
||||
icp->default_opts.OptionsSize=IP_OPTS_DEFAULT;
|
||||
}
|
||||
|
||||
/* Get ready for receiving the reply
|
||||
* Do it before we send the request to minimize the risk of introducing delays
|
||||
*/
|
||||
FD_ZERO(&fdr);
|
||||
FD_SET(icp->sid,&fdr);
|
||||
timeout.tv_sec=Timeout/1000;
|
||||
timeout.tv_usec=(Timeout % 1000)*1000;
|
||||
addrlen=sizeof(addr);
|
||||
ier=ReplyBuffer;
|
||||
ip_header=(struct ip *) ((char *) ReplyBuffer+sizeof(ICMP_ECHO_REPLY));
|
||||
endbuf=(char *) ReplyBuffer+ReplySize;
|
||||
maxlen=ReplySize-sizeof(ICMP_ECHO_REPLY);
|
||||
|
||||
/* Send the packet */
|
||||
TRACE("Sending %d bytes (RequestSize=%d) to %s\n", reqsize, RequestSize, inet_ntoa(addr.sin_addr));
|
||||
#if 0
|
||||
if (TRACE_ON(icmp)){
|
||||
unsigned char* buf=(unsigned char*)reqbuf;
|
||||
int i;
|
||||
printf("Output buffer:\n");
|
||||
for (i=0;i<reqsize;i++)
|
||||
printf("%2x,", buf[i]);
|
||||
printf("\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
send_time = GetTickCount();
|
||||
res=sendto(icp->sid, reqbuf, reqsize, 0, (struct sockaddr*)&addr, sizeof(addr));
|
||||
HeapFree(GetProcessHeap (), 0, reqbuf);
|
||||
if (res<0) {
|
||||
if (errno==EMSGSIZE)
|
||||
SetLastError(IP_PACKET_TOO_BIG);
|
||||
else {
|
||||
switch (errno) {
|
||||
case ENETUNREACH:
|
||||
SetLastError(IP_DEST_NET_UNREACHABLE);
|
||||
break;
|
||||
case EHOSTUNREACH:
|
||||
SetLastError(IP_DEST_HOST_UNREACHABLE);
|
||||
break;
|
||||
default:
|
||||
TRACE("unknown error: errno=%d\n",errno);
|
||||
SetLastError(IP_GENERAL_FAILURE);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Get the reply */
|
||||
ip_header_len=0; /* because gcc was complaining */
|
||||
while ((res=select(icp->sid+1,&fdr,NULL,NULL,&timeout))>0) {
|
||||
recv_time = GetTickCount();
|
||||
res=recvfrom(icp->sid, (char*)ip_header, maxlen, 0, (struct sockaddr*)&addr,&addrlen);
|
||||
TRACE("received %d bytes from %s\n",res, inet_ntoa(addr.sin_addr));
|
||||
ier->Status=IP_REQ_TIMED_OUT;
|
||||
|
||||
/* Check whether we should ignore this packet */
|
||||
if ((ip_header->ip_p==IPPROTO_ICMP) && (res>=sizeof(struct ip)+ICMP_MINLEN)) {
|
||||
ip_header_len=ip_header->ip_hl << 2;
|
||||
icmp_header=(struct icmp*)(((char*)ip_header)+ip_header_len);
|
||||
TRACE("received an ICMP packet of type,code=%d,%d\n",icmp_header->icmp_type,icmp_header->icmp_code);
|
||||
if (icmp_header->icmp_type==ICMP_ECHOREPLY) {
|
||||
if ((icmp_header->icmp_id==id) && (icmp_header->icmp_seq==seq))
|
||||
ier->Status=IP_SUCCESS;
|
||||
} else {
|
||||
switch (icmp_header->icmp_type) {
|
||||
case ICMP_UNREACH:
|
||||
switch (icmp_header->icmp_code) {
|
||||
case ICMP_UNREACH_HOST:
|
||||
#ifdef ICMP_UNREACH_HOST_UNKNOWN
|
||||
case ICMP_UNREACH_HOST_UNKNOWN:
|
||||
#endif
|
||||
#ifdef ICMP_UNREACH_ISOLATED
|
||||
case ICMP_UNREACH_ISOLATED:
|
||||
#endif
|
||||
#ifdef ICMP_UNREACH_HOST_PROHIB
|
||||
case ICMP_UNREACH_HOST_PROHIB:
|
||||
#endif
|
||||
#ifdef ICMP_UNREACH_TOSHOST
|
||||
case ICMP_UNREACH_TOSHOST:
|
||||
#endif
|
||||
ier->Status=IP_DEST_HOST_UNREACHABLE;
|
||||
break;
|
||||
case ICMP_UNREACH_PORT:
|
||||
ier->Status=IP_DEST_PORT_UNREACHABLE;
|
||||
break;
|
||||
case ICMP_UNREACH_PROTOCOL:
|
||||
ier->Status=IP_DEST_PROT_UNREACHABLE;
|
||||
break;
|
||||
case ICMP_UNREACH_SRCFAIL:
|
||||
ier->Status=IP_BAD_ROUTE;
|
||||
break;
|
||||
default:
|
||||
ier->Status=IP_DEST_NET_UNREACHABLE;
|
||||
}
|
||||
break;
|
||||
case ICMP_TIMXCEED:
|
||||
if (icmp_header->icmp_code==ICMP_TIMXCEED_REASS)
|
||||
ier->Status=IP_TTL_EXPIRED_REASSEM;
|
||||
else
|
||||
ier->Status=IP_TTL_EXPIRED_TRANSIT;
|
||||
break;
|
||||
case ICMP_PARAMPROB:
|
||||
ier->Status=IP_PARAM_PROBLEM;
|
||||
break;
|
||||
case ICMP_SOURCEQUENCH:
|
||||
ier->Status=IP_SOURCE_QUENCH;
|
||||
break;
|
||||
}
|
||||
if (ier->Status!=IP_REQ_TIMED_OUT) {
|
||||
struct ip* rep_ip_header;
|
||||
struct icmp* rep_icmp_header;
|
||||
/* The ICMP header size of all the packets we accept is the same */
|
||||
rep_ip_header=(struct ip*)(((char*)icmp_header)+ICMP_MINLEN);
|
||||
rep_icmp_header=(struct icmp*)(((char*)rep_ip_header)+(rep_ip_header->ip_hl << 2));
|
||||
|
||||
/* Make sure that this is really a reply to our packet */
|
||||
if (ip_header_len+ICMP_MINLEN+(rep_ip_header->ip_hl << 2)+ICMP_MINLEN>ip_header->ip_len) {
|
||||
ier->Status=IP_REQ_TIMED_OUT;
|
||||
} else if ((rep_icmp_header->icmp_type!=ICMP_ECHO) ||
|
||||
(rep_icmp_header->icmp_code!=0) ||
|
||||
(rep_icmp_header->icmp_id!=id) ||
|
||||
/* windows doesn't check this checksum, else tracert */
|
||||
/* behind a Linux 2.2 masquerading firewall would fail*/
|
||||
/* (rep_icmp_header->icmp_cksum!=cksum) || */
|
||||
(rep_icmp_header->icmp_seq!=seq)) {
|
||||
/* This was not a reply to one of our packets after all */
|
||||
TRACE("skipping type,code=%d,%d id,seq=%d,%d cksum=%d\n",
|
||||
rep_icmp_header->icmp_type,rep_icmp_header->icmp_code,
|
||||
rep_icmp_header->icmp_id,rep_icmp_header->icmp_seq,
|
||||
rep_icmp_header->icmp_cksum);
|
||||
TRACE("expected type,code=8,0 id,seq=%d,%d cksum=%d\n",
|
||||
id,seq,
|
||||
cksum);
|
||||
ier->Status=IP_REQ_TIMED_OUT;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (ier->Status==IP_REQ_TIMED_OUT) {
|
||||
/* This packet was not for us.
|
||||
* Decrease the timeout so that we don't enter an endless loop even
|
||||
* if we get flooded with ICMP packets that are not for us.
|
||||
*/
|
||||
int t = Timeout - (recv_time - send_time);
|
||||
if (t < 0) t = 0;
|
||||
timeout.tv_sec = t / 1000;
|
||||
timeout.tv_usec = (t % 1000) * 1000;
|
||||
continue;
|
||||
} else {
|
||||
/* This is a reply to our packet */
|
||||
memcpy(&ier->Address,&ip_header->ip_src,sizeof(IPAddr));
|
||||
/* Status is already set */
|
||||
ier->RoundTripTime= recv_time - send_time;
|
||||
ier->DataSize=res-ip_header_len-ICMP_MINLEN;
|
||||
ier->Reserved=0;
|
||||
ier->Data=endbuf-ier->DataSize;
|
||||
memmove(ier->Data,((char*)ip_header)+ip_header_len+ICMP_MINLEN,ier->DataSize);
|
||||
ier->Options.Ttl=ip_header->ip_ttl;
|
||||
ier->Options.Tos=ip_header->ip_tos;
|
||||
ier->Options.Flags=ip_header->ip_off >> 13;
|
||||
ier->Options.OptionsSize=ip_header_len-sizeof(struct ip);
|
||||
if (ier->Options.OptionsSize!=0) {
|
||||
ier->Options.OptionsData=(unsigned char *) ier->Data-ier->Options.OptionsSize;
|
||||
/* FIXME: We are supposed to rearrange the option's 'source route' data */
|
||||
memmove(ier->Options.OptionsData,((char*)ip_header)+ip_header_len,ier->Options.OptionsSize);
|
||||
endbuf=ier->Options.OptionsData;
|
||||
} else {
|
||||
ier->Options.OptionsData=NULL;
|
||||
endbuf=ier->Data;
|
||||
}
|
||||
|
||||
/* Prepare for the next packet */
|
||||
ier++;
|
||||
ip_header=(struct ip*)(((char*)ip_header)+sizeof(ICMP_ECHO_REPLY));
|
||||
maxlen=endbuf-(char*)ip_header;
|
||||
|
||||
/* Check out whether there is more but don't wait this time */
|
||||
timeout.tv_sec=0;
|
||||
timeout.tv_usec=0;
|
||||
}
|
||||
FD_ZERO(&fdr);
|
||||
FD_SET(icp->sid,&fdr);
|
||||
}
|
||||
res=ier-(ICMP_ECHO_REPLY*)ReplyBuffer;
|
||||
if (res==0)
|
||||
SetLastError(IP_REQ_TIMED_OUT);
|
||||
TRACE("received %d replies\n",res);
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright (c) 1989 The Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Mike Muuss.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
*/
|
195
reactos/lib/icmp/ip.h
Normal file
195
reactos/lib/icmp/ip.h
Normal file
|
@ -0,0 +1,195 @@
|
|||
/*
|
||||
* Copyright (c) 1982, 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ip.h 8.2 (Berkeley) 6/1/94
|
||||
* $FreeBSD: src/sys/netinet/ip.h,v 1.16 1999/08/28 00:49:19 peter Exp $
|
||||
*/
|
||||
|
||||
#ifndef _NETINET_IP_H_
|
||||
#define _NETINET_IP_H_
|
||||
|
||||
/*
|
||||
* Definitions for internet protocol version 4.
|
||||
* Per RFC 791, September 1981.
|
||||
*/
|
||||
#define IPVERSION 4
|
||||
|
||||
/* A little magic to make the Windows build happy. */
|
||||
#if defined(_MSC_VER) || defined(__MINGW32__)
|
||||
#include <winsock2.h>
|
||||
#include <ws2tcpip.h>
|
||||
#include <time.h>
|
||||
|
||||
typedef u_short n_short;
|
||||
typedef u_int n_long;
|
||||
typedef u_int n_time;
|
||||
|
||||
#define EMSGSIZE WSAEMSGSIZE
|
||||
#define ENETUNREACH WSAENETUNREACH
|
||||
#define EHOSTUNREACH WSAEHOSTUNREACH
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Structure of an internet header, naked of options.
|
||||
*/
|
||||
struct ip {
|
||||
#ifdef _IP_VHL
|
||||
u_char ip_vhl; /* version << 4 | header length >> 2 */
|
||||
#else
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
u_int ip_hl:4, /* header length */
|
||||
ip_v:4; /* version */
|
||||
#endif
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
u_int ip_v:4, /* version */
|
||||
ip_hl:4; /* header length */
|
||||
#endif
|
||||
#endif /* not _IP_VHL */
|
||||
u_char ip_tos; /* type of service */
|
||||
u_short ip_len; /* total length */
|
||||
u_short ip_id; /* identification */
|
||||
u_short ip_off; /* fragment offset field */
|
||||
#define IP_RF 0x8000 /* reserved fragment flag */
|
||||
#define IP_DF 0x4000 /* don't fragment flag */
|
||||
#define IP_MF 0x2000 /* more fragments flag */
|
||||
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
|
||||
u_char ip_ttl; /* time to live */
|
||||
u_char ip_p; /* protocol */
|
||||
u_short ip_sum; /* checksum */
|
||||
struct in_addr ip_src,ip_dst; /* source and dest address */
|
||||
};
|
||||
|
||||
#ifdef _IP_VHL
|
||||
#define IP_MAKE_VHL(v, hl) ((v) << 4 | (hl))
|
||||
#define IP_VHL_HL(vhl) ((vhl) & 0x0f)
|
||||
#define IP_VHL_V(vhl) ((vhl) >> 4)
|
||||
#define IP_VHL_BORING 0x45
|
||||
#endif
|
||||
|
||||
#define IP_MAXPACKET 65535 /* maximum packet size */
|
||||
|
||||
/*
|
||||
* Definitions for IP type of service (ip_tos)
|
||||
*/
|
||||
#define IPTOS_LOWDELAY 0x10
|
||||
#define IPTOS_THROUGHPUT 0x08
|
||||
#define IPTOS_RELIABILITY 0x04
|
||||
#define IPTOS_MINCOST 0x02
|
||||
|
||||
/*
|
||||
* Definitions for IP precedence (also in ip_tos) (hopefully unused)
|
||||
*/
|
||||
#define IPTOS_PREC_NETCONTROL 0xe0
|
||||
#define IPTOS_PREC_INTERNETCONTROL 0xc0
|
||||
#define IPTOS_PREC_CRITIC_ECP 0xa0
|
||||
#define IPTOS_PREC_FLASHOVERRIDE 0x80
|
||||
#define IPTOS_PREC_FLASH 0x60
|
||||
#define IPTOS_PREC_IMMEDIATE 0x40
|
||||
#define IPTOS_PREC_PRIORITY 0x20
|
||||
#define IPTOS_PREC_ROUTINE 0x00
|
||||
|
||||
/*
|
||||
* Definitions for options.
|
||||
*/
|
||||
#define IPOPT_COPIED(o) ((o)&0x80)
|
||||
#define IPOPT_CLASS(o) ((o)&0x60)
|
||||
#define IPOPT_NUMBER(o) ((o)&0x1f)
|
||||
|
||||
#define IPOPT_CONTROL 0x00
|
||||
#define IPOPT_RESERVED1 0x20
|
||||
#define IPOPT_DEBMEAS 0x40
|
||||
#define IPOPT_RESERVED2 0x60
|
||||
|
||||
#define IPOPT_EOL 0 /* end of option list */
|
||||
#define IPOPT_NOP 1 /* no operation */
|
||||
|
||||
#define IPOPT_RR 7 /* record packet route */
|
||||
#define IPOPT_TS 68 /* timestamp */
|
||||
#define IPOPT_SECURITY 130 /* provide s,c,h,tcc */
|
||||
#define IPOPT_LSRR 131 /* loose source route */
|
||||
#define IPOPT_SATID 136 /* satnet id */
|
||||
#define IPOPT_SSRR 137 /* strict source route */
|
||||
#define IPOPT_RA 148 /* router alert */
|
||||
|
||||
/*
|
||||
* Offsets to fields in options other than EOL and NOP.
|
||||
*/
|
||||
#define IPOPT_OPTVAL 0 /* option ID */
|
||||
#define IPOPT_OLEN 1 /* option length */
|
||||
#define IPOPT_OFFSET 2 /* offset within option */
|
||||
#define IPOPT_MINOFF 4 /* min value of above */
|
||||
|
||||
/*
|
||||
* Time stamp option structure.
|
||||
*/
|
||||
struct ip_timestamp {
|
||||
u_char ipt_code; /* IPOPT_TS */
|
||||
u_char ipt_len; /* size of structure (variable) */
|
||||
u_char ipt_ptr; /* index of current entry */
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||
u_int ipt_flg:4, /* flags, see below */
|
||||
ipt_oflw:4; /* overflow counter */
|
||||
#endif
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
u_int ipt_oflw:4, /* overflow counter */
|
||||
ipt_flg:4; /* flags, see below */
|
||||
#endif
|
||||
union ipt_timestamp {
|
||||
n_long ipt_time[1];
|
||||
struct ipt_ta {
|
||||
struct in_addr ipt_addr;
|
||||
n_long ipt_time;
|
||||
} ipt_ta[1];
|
||||
} ipt_timestamp;
|
||||
};
|
||||
|
||||
/* flag bits for ipt_flg */
|
||||
#define IPOPT_TS_TSONLY 0 /* timestamps only */
|
||||
#define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */
|
||||
#define IPOPT_TS_PRESPEC 3 /* specified modules only */
|
||||
|
||||
/* bits for security (not byte swapped) */
|
||||
#define IPOPT_SECUR_UNCLASS 0x0000
|
||||
#define IPOPT_SECUR_CONFID 0xf135
|
||||
#define IPOPT_SECUR_EFTO 0x789a
|
||||
#define IPOPT_SECUR_MMMM 0xbc4d
|
||||
#define IPOPT_SECUR_RESTR 0xaf13
|
||||
#define IPOPT_SECUR_SECRET 0xd788
|
||||
#define IPOPT_SECUR_TOPSECRET 0x6bc5
|
||||
|
||||
/*
|
||||
* Internet implementation parameters.
|
||||
*/
|
||||
#define MAXTTL 255 /* maximum time to live (seconds) */
|
||||
#define IPDEFTTL 64 /* default ttl, from RFC 1340 */
|
||||
#define IPFRAGTTL 60 /* time to live for frags, slowhz */
|
||||
#define IPTTLDEC 1 /* subtracted when forwarding */
|
||||
|
||||
#define IP_MSS 576 /* default maximum segment size */
|
||||
|
||||
#endif
|
186
reactos/lib/icmp/ip_icmp.h
Normal file
186
reactos/lib/icmp/ip_icmp.h
Normal file
|
@ -0,0 +1,186 @@
|
|||
/*
|
||||
* Copyright (c) 1982, 1986, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93
|
||||
* $FreeBSD: src/sys/netinet/ip_icmp.h,v 1.13 1999/08/28 00:49:24 peter Exp $
|
||||
*/
|
||||
|
||||
#ifndef _NETINET_IP_ICMP_H_
|
||||
#define _NETINET_IP_ICMP_H_
|
||||
|
||||
/*
|
||||
* Interface Control Message Protocol Definitions.
|
||||
* Per RFC 792, September 1981.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Internal of an ICMP Router Advertisement
|
||||
*/
|
||||
struct icmp_ra_addr {
|
||||
u_int32_t ira_addr;
|
||||
u_int32_t ira_preference;
|
||||
};
|
||||
|
||||
/*
|
||||
* Structure of an icmp header.
|
||||
*/
|
||||
struct icmp {
|
||||
u_char icmp_type; /* type of message, see below */
|
||||
u_char icmp_code; /* type sub code */
|
||||
u_short icmp_cksum; /* ones complement cksum of struct */
|
||||
union {
|
||||
u_char ih_pptr; /* ICMP_PARAMPROB */
|
||||
struct in_addr ih_gwaddr; /* ICMP_REDIRECT */
|
||||
struct ih_idseq {
|
||||
n_short icd_id;
|
||||
n_short icd_seq;
|
||||
} ih_idseq;
|
||||
int ih_void;
|
||||
|
||||
/* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */
|
||||
struct ih_pmtu {
|
||||
n_short ipm_void;
|
||||
n_short ipm_nextmtu;
|
||||
} ih_pmtu;
|
||||
|
||||
struct ih_rtradv {
|
||||
u_char irt_num_addrs;
|
||||
u_char irt_wpa;
|
||||
u_int16_t irt_lifetime;
|
||||
} ih_rtradv;
|
||||
} icmp_hun;
|
||||
#define icmp_pptr icmp_hun.ih_pptr
|
||||
#define icmp_gwaddr icmp_hun.ih_gwaddr
|
||||
#define icmp_id icmp_hun.ih_idseq.icd_id
|
||||
#define icmp_seq icmp_hun.ih_idseq.icd_seq
|
||||
#define icmp_void icmp_hun.ih_void
|
||||
#define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void
|
||||
#define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu
|
||||
#define icmp_num_addrs icmp_hun.ih_rtradv.irt_num_addrs
|
||||
#define icmp_wpa icmp_hun.ih_rtradv.irt_wpa
|
||||
#define icmp_lifetime icmp_hun.ih_rtradv.irt_lifetime
|
||||
union {
|
||||
struct id_ts {
|
||||
n_time its_otime;
|
||||
n_time its_rtime;
|
||||
n_time its_ttime;
|
||||
} id_ts;
|
||||
struct id_ip {
|
||||
struct ip idi_ip;
|
||||
/* options and then 64 bits of data */
|
||||
} id_ip;
|
||||
struct icmp_ra_addr id_radv;
|
||||
u_int32_t id_mask;
|
||||
char id_data[1];
|
||||
} icmp_dun;
|
||||
#define icmp_otime icmp_dun.id_ts.its_otime
|
||||
#define icmp_rtime icmp_dun.id_ts.its_rtime
|
||||
#define icmp_ttime icmp_dun.id_ts.its_ttime
|
||||
#define icmp_ip icmp_dun.id_ip.idi_ip
|
||||
#define icmp_radv icmp_dun.id_radv
|
||||
#define icmp_mask icmp_dun.id_mask
|
||||
#define icmp_data icmp_dun.id_data
|
||||
};
|
||||
|
||||
/*
|
||||
* Lower bounds on packet lengths for various types.
|
||||
* For the error advice packets must first insure that the
|
||||
* packet is large enough to contain the returned ip header.
|
||||
* Only then can we do the check to see if 64 bits of packet
|
||||
* data have been returned, since we need to check the returned
|
||||
* ip header length.
|
||||
*/
|
||||
#define ICMP_MINLEN 8 /* abs minimum */
|
||||
#define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */
|
||||
#define ICMP_MASKLEN 12 /* address mask */
|
||||
#define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */
|
||||
#ifndef _IP_VHL
|
||||
#define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8)
|
||||
/* N.B.: must separately check that ip_hl >= 5 */
|
||||
#else
|
||||
#define ICMP_ADVLEN(p) (8 + (IP_VHL_HL((p)->icmp_ip.ip_vhl) << 2) + 8)
|
||||
/* N.B.: must separately check that header length >= 5 */
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Definition of type and code field values.
|
||||
*/
|
||||
#define ICMP_ECHOREPLY 0 /* echo reply */
|
||||
#define ICMP_UNREACH 3 /* dest unreachable, codes: */
|
||||
#define ICMP_UNREACH_NET 0 /* bad net */
|
||||
#define ICMP_UNREACH_HOST 1 /* bad host */
|
||||
#define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */
|
||||
#define ICMP_UNREACH_PORT 3 /* bad port */
|
||||
#define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */
|
||||
#define ICMP_UNREACH_SRCFAIL 5 /* src route failed */
|
||||
#define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */
|
||||
#define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */
|
||||
#define ICMP_UNREACH_ISOLATED 8 /* src host isolated */
|
||||
#define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */
|
||||
#define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */
|
||||
#define ICMP_UNREACH_TOSNET 11 /* bad tos for net */
|
||||
#define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */
|
||||
#define ICMP_UNREACH_FILTER_PROHIB 13 /* admin prohib */
|
||||
#define ICMP_UNREACH_HOST_PRECEDENCE 14 /* host prec vio. */
|
||||
#define ICMP_UNREACH_PRECEDENCE_CUTOFF 15 /* prec cutoff */
|
||||
#define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */
|
||||
#define ICMP_REDIRECT 5 /* shorter route, codes: */
|
||||
#define ICMP_REDIRECT_NET 0 /* for network */
|
||||
#define ICMP_REDIRECT_HOST 1 /* for host */
|
||||
#define ICMP_REDIRECT_TOSNET 2 /* for tos and net */
|
||||
#define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */
|
||||
#define ICMP_ECHO 8 /* echo service */
|
||||
#define ICMP_ROUTERADVERT 9 /* router advertisement */
|
||||
#define ICMP_ROUTERSOLICIT 10 /* router solicitation */
|
||||
#define ICMP_TIMXCEED 11 /* time exceeded, code: */
|
||||
#define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */
|
||||
#define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */
|
||||
#define ICMP_PARAMPROB 12 /* ip header bad */
|
||||
#define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */
|
||||
#define ICMP_TSTAMP 13 /* timestamp request */
|
||||
#define ICMP_TSTAMPREPLY 14 /* timestamp reply */
|
||||
#define ICMP_IREQ 15 /* information request */
|
||||
#define ICMP_IREQREPLY 16 /* information reply */
|
||||
#define ICMP_MASKREQ 17 /* address mask request */
|
||||
#define ICMP_MASKREPLY 18 /* address mask reply */
|
||||
|
||||
#define ICMP_MAXTYPE 18
|
||||
|
||||
#define ICMP_INFOTYPE(type) \
|
||||
((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \
|
||||
(type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \
|
||||
(type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \
|
||||
(type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \
|
||||
(type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY)
|
||||
|
||||
#ifdef KERNEL
|
||||
void icmp_error __P((struct mbuf *, int, int, n_long, struct ifnet *));
|
||||
void icmp_input __P((struct mbuf *, int));
|
||||
#endif
|
||||
|
||||
#endif
|
9
reactos/lib/icmp/makefile
Normal file
9
reactos/lib/icmp/makefile
Normal file
|
@ -0,0 +1,9 @@
|
|||
# $Id: makefile 11108 2004-09-28 19:07:56Z sedwards $
|
||||
|
||||
PATH_TO_TOP = ../..
|
||||
|
||||
TARGET_TYPE = winedll
|
||||
|
||||
include $(PATH_TO_TOP)/rules.mak
|
||||
|
||||
include $(TOOLS_PATH)/helper.mk
|
Loading…
Reference in a new issue