Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251/* * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS TCP/IP protocol driver * FILE: include/ip.h * PURPOSE: Internet Protocol related definitions */
#pragma once
typedef VOID (*OBJECT_FREE_ROUTINE)(PVOID Object);
#define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d))
/* Raw IPv4 style address */typedef ULONG IPv4_RAW_ADDRESS;typedef IPv4_RAW_ADDRESS *PIPv4_RAW_ADDRESS;
/* Raw IPv6 style address */typedef USHORT IPv6_RAW_ADDRESS[8];typedef IPv6_RAW_ADDRESS *PIPv6_RAW_ADDRESS;
/* IP style address */typedef struct IP_ADDRESS { UCHAR Type; /* Type of IP address */ union { IPv4_RAW_ADDRESS IPv4Address;/* IPv4 address (in network byte order) */ IPv6_RAW_ADDRESS IPv6Address;/* IPv6 address (in network byte order) */ } Address;} IP_ADDRESS, *PIP_ADDRESS;
/* IP type constants */#define IP_ADDRESS_V4 0x04 /* IPv4 style address */#define IP_ADDRESS_V6 0x06 /* IPv6 style address */
/* IPv4 header format */typedef struct IPv4_HEADER { UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */ UCHAR Tos; /* Type of Service */ USHORT TotalLength; /* Total Length */ USHORT Id; /* Identification */ USHORT FlagsFragOfs; /* 3-bit Flags, 13-bit Fragment Offset */ UCHAR Ttl; /* Time to Live */ UCHAR Protocol; /* Protocol */ USHORT Checksum; /* Header Checksum */ IPv4_RAW_ADDRESS SrcAddr; /* Source Address */ IPv4_RAW_ADDRESS DstAddr; /* Destination Address */} IPv4_HEADER, *PIPv4_HEADER;
/* IPv6 header format */typedef struct IPv6_HEADER { ULONG VTF; /* Version, Traffic Class, Flow Label */ USHORT PayloadLength; UCHAR NextHeader; /* Same as Protocol in IPv4 */ UCHAR HopLimit; /* Same as Ttl in IPv4 */ IPv6_RAW_ADDRESS SrcAddr; IPv6_RAW_ADDRESS DstAddr;} IPv6_HEADER, *PIPv6_HEADER;
typedef union _IP_HEADER { IPv4_HEADER v4; IPv6_HEADER v6;} IP_HEADER, *PIP_HEADER;
#define IPv4_FRAGOFS_MASK 0x1FFF /* Fragment offset mask (host byte order) */#define IPv4_MF_MASK 0x2000 /* More fragments (host byte order) */#define IPv4_DF_MASK 0x4000 /* Don't fragment (host byte order) */#define IPv4_MAX_HEADER_SIZE 60
/* Packet completion handler prototype */typedef VOID (*PACKET_COMPLETION_ROUTINE)( PVOID Context, PNDIS_PACKET NdisPacket, NDIS_STATUS NdisStatus);
/* Structure for an IP packet */typedef struct _IP_PACKET { OBJECT_FREE_ROUTINE Free; /* Routine used to free resources for the object */ UCHAR Type; /* Type of IP packet (see IP_ADDRESS_xx above) */ UCHAR Flags; /* Flags for packet (see IP_PACKET_FLAG_xx below)*/ BOOLEAN MappedHeader; /* States whether Header is from an MDL or allocated from pool */ BOOLEAN ReturnPacket; /* States whether NdisPacket should be passed to NdisReturnPackets */ PVOID Header; /* Pointer to IP header for this packet */ UINT HeaderSize; /* Size of IP header */ PVOID Data; /* Current pointer into packet data */ UINT TotalSize; /* Total amount of data in packet (IP header and data) */ UINT Position; /* Current logical offset into packet */ PNDIS_PACKET NdisPacket; /* Pointer to NDIS packet */ IP_ADDRESS SrcAddr; /* Source address */ IP_ADDRESS DstAddr; /* Destination address */} IP_PACKET, *PIP_PACKET;
#define IP_PACKET_FLAG_RAW 0x01 /* Raw IP packet */
/* Packet context */typedef struct _PACKET_CONTEXT { PACKET_COMPLETION_ROUTINE DLComplete; /* Data link level completion handler * Also used to link to next packet * in a queue */ PVOID Context; /* Context information for handler */ UINT PacketType; /* Type of packet */} PACKET_CONTEXT, *PPACKET_CONTEXT;
/* The ProtocolReserved field is structured as a PACKET_CONTEXT */#define PC(Packet) ((PPACKET_CONTEXT)(&Packet->ProtocolReserved))
/* Values for address type -- also the interface flags *//* These values are mean to overlap meaningfully with the BSD ones */#define ADE_UNICAST 0x01#define ADE_BROADCAST 0x02#define ADE_ADDRMASK 0x04#define ADE_POINTOPOINT 0x10#define ADE_MULTICAST 0x8000
/* There is one NTE for each source (unicast) address assigned to an interface *//* Link layer transmit prototype */typedef VOID (*LL_TRANSMIT_ROUTINE)( PVOID Context, PNDIS_PACKET NdisPacket, UINT Offset, PVOID LinkAddress, USHORT Type);
/* Link layer to IP binding information */typedef struct _LLIP_BIND_INFO { PVOID Context; /* Pointer to link layer context information */ UINT HeaderSize; /* Size of link level header */ UINT MinFrameSize; /* Minimum frame size in bytes */ PUCHAR Address; /* Pointer to interface address */ UINT AddressLength; /* Length of address in bytes */ LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */} LLIP_BIND_INFO, *PLLIP_BIND_INFO;
typedef struct _SEND_RECV_STATS { UINT InBytes; UINT InUnicast; UINT InNUnicast; UINT InDiscarded; UINT InErrors; UINT InDiscardedUnknownProto; UINT OutBytes; UINT OutUnicast; UINT OutNUnicast; UINT OutDiscarded; UINT OutErrors;} SEND_RECV_STATS, *PSEND_RECV_STATS;
/* Information about an IP interface */typedef struct _IP_INTERFACE { LIST_ENTRY ListEntry; /* Entry on list */ OBJECT_FREE_ROUTINE Free; /* Routine used to free resources used by the object */ KSPIN_LOCK Lock; /* Spin lock for this object */ PVOID Context; /* Pointer to link layer context information */ UINT HeaderSize; /* Size of link level header */ UINT MinFrameSize; /* Minimum frame size in bytes */ UINT MTU; /* Maximum transmission unit */ UINT Speed; /* Link speed */ IP_ADDRESS Unicast; /* Unicast address */ IP_ADDRESS PointToPoint; /* Point to point address */ IP_ADDRESS Netmask; /* Netmask */ IP_ADDRESS Broadcast; /* Broadcast */ UNICODE_STRING Name; /* Adapter name (GUID) */ UNICODE_STRING Description; /* Adapter description (Human readable) */ PUCHAR Address; /* Pointer to interface address */ UINT AddressLength; /* Length of address in bytes */ UINT Index; /* Index of adapter (used to add ip addr) */ LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */ PVOID TCPContext; /* TCP Content for this interface */ SEND_RECV_STATS Stats; /* Send/Receive statistics */} IP_INTERFACE, *PIP_INTERFACE;
typedef struct _IP_SET_ADDRESS { ULONG NteIndex; IPv4_RAW_ADDRESS Address; IPv4_RAW_ADDRESS Netmask;} IP_SET_ADDRESS, *PIP_SET_ADDRESS;
#define IP_PROTOCOL_TABLE_SIZE 0x100
typedef VOID (*IP_PROTOCOL_HANDLER)( PIP_INTERFACE Interface, PIP_PACKET IPPacket);
/* Loopback adapter address information (network byte order) */#define LOOPBACK_ADDRESS_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0x7F000001))#define LOOPBACK_BCASTADDR_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0x7FFFFFFF))#define LOOPBACK_ADDRMASK_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0xFF000000))
/* Protocol definitions */#ifndef IPPROTO_RAW#define IPPROTO_RAW 0 /* Raw IP */#endif#define IPPROTO_ICMP 1 /* Internet Control Message Protocol */#define IPPROTO_IGMP 2 /* Internet Group Management Protocol */#define IPPROTO_TCP 6 /* Transmission Control Protocol */#define IPPROTO_UDP 17 /* User Datagram Protocol */
/* Timeout timer constants */#define IP_TIMEOUT 1000 /* Timeout in milliseconds */#define IP_DEFAULT_LINK_SPEED 10000
extern LIST_ENTRY InterfaceListHead;extern KSPIN_LOCK InterfaceListLock;extern LIST_ENTRY NetTableListHead;extern KSPIN_LOCK NetTableListLock;
PIP_PACKET IPCreatePacket( ULONG Type);
PIP_PACKET IPInitializePacket( PIP_PACKET IPPacket, ULONG Type);
PIP_INTERFACE IPCreateInterface( PLLIP_BIND_INFO BindInfo);
VOID IPAddInterfaceRoute( PIP_INTERFACE IF);
VOID IPRemoveInterfaceRoute( PIP_INTERFACE IF);
VOID IPDestroyInterface( PIP_INTERFACE IF);
BOOLEAN IPRegisterInterface( PIP_INTERFACE IF);
VOID IPUnregisterInterface( PIP_INTERFACE IF);
VOID NTAPI IPTimeoutDpcFn(PKDPC Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2);
VOID IPDispatchProtocol( PIP_INTERFACE Interface, PIP_PACKET IPPacket);
VOID IPRegisterProtocol( UINT ProtocolNumber, IP_PROTOCOL_HANDLER Handler);
NTSTATUS IPStartup(PUNICODE_STRING RegistryPath);
NTSTATUS IPShutdown(VOID);
/* EOF */