mirror of
https://github.com/reactos/reactos.git
synced 2024-12-29 10:35:28 +00:00
250 lines
9 KiB
C
250 lines
9 KiB
C
/*
|
|
* 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 */
|