1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS TCP/IP protocol driver 4 * FILE: include/ip.h 5 * PURPOSE: Internet Protocol related definitions 6 */ 7 8 #pragma once 9 10 typedef VOID (*OBJECT_FREE_ROUTINE)(PVOID Object); 11 12 #define FOURCC(a,b,c,d) (((a)<<24)|((b)<<16)|((c)<<8)|(d)) 13 14 /* Raw IPv4 style address */ 15 typedef ULONG IPv4_RAW_ADDRESS; 16 typedef IPv4_RAW_ADDRESS *PIPv4_RAW_ADDRESS; 17 18 /* Raw IPv6 style address */ 19 typedef USHORT IPv6_RAW_ADDRESS[8]; 20 typedef IPv6_RAW_ADDRESS *PIPv6_RAW_ADDRESS; 21 22 /* IP style address */ 23 typedef struct IP_ADDRESS { 24 UCHAR Type; /* Type of IP address */ 25 union { 26 IPv4_RAW_ADDRESS IPv4Address;/* IPv4 address (in network byte order) */ 27 IPv6_RAW_ADDRESS IPv6Address;/* IPv6 address (in network byte order) */ 28 } Address; 29 } IP_ADDRESS, *PIP_ADDRESS; 30 31 /* IP type constants */ 32 #define IP_ADDRESS_V4 0x04 /* IPv4 style address */ 33 #define IP_ADDRESS_V6 0x06 /* IPv6 style address */ 34 35 36 /* IPv4 header format */ 37 typedef struct IPv4_HEADER { 38 UCHAR VerIHL; /* 4-bit version, 4-bit Internet Header Length */ 39 UCHAR Tos; /* Type of Service */ 40 USHORT TotalLength; /* Total Length */ 41 USHORT Id; /* Identification */ 42 USHORT FlagsFragOfs; /* 3-bit Flags, 13-bit Fragment Offset */ 43 UCHAR Ttl; /* Time to Live */ 44 UCHAR Protocol; /* Protocol */ 45 USHORT Checksum; /* Header Checksum */ 46 IPv4_RAW_ADDRESS SrcAddr; /* Source Address */ 47 IPv4_RAW_ADDRESS DstAddr; /* Destination Address */ 48 } IPv4_HEADER, *PIPv4_HEADER; 49 50 /* IPv6 header format */ 51 typedef struct IPv6_HEADER { 52 ULONG VTF; /* Version, Traffic Class, Flow Label */ 53 USHORT PayloadLength; 54 UCHAR NextHeader; /* Same as Protocol in IPv4 */ 55 UCHAR HopLimit; /* Same as Ttl in IPv4 */ 56 IPv6_RAW_ADDRESS SrcAddr; 57 IPv6_RAW_ADDRESS DstAddr; 58 } IPv6_HEADER, *PIPv6_HEADER; 59 60 typedef union _IP_HEADER { 61 IPv4_HEADER v4; 62 IPv6_HEADER v6; 63 } IP_HEADER, *PIP_HEADER; 64 65 #define IPv4_FRAGOFS_MASK 0x1FFF /* Fragment offset mask (host byte order) */ 66 #define IPv4_MF_MASK 0x2000 /* More fragments (host byte order) */ 67 #define IPv4_DF_MASK 0x4000 /* Don't fragment (host byte order) */ 68 #define IPv4_MAX_HEADER_SIZE 60 69 70 /* Packet completion handler prototype */ 71 typedef VOID (*PACKET_COMPLETION_ROUTINE)( 72 PVOID Context, 73 PNDIS_PACKET NdisPacket, 74 NDIS_STATUS NdisStatus); 75 76 /* Structure for an IP packet */ 77 typedef struct _IP_PACKET { 78 OBJECT_FREE_ROUTINE Free; /* Routine used to free resources for the object */ 79 UCHAR Type; /* Type of IP packet (see IP_ADDRESS_xx above) */ 80 UCHAR Flags; /* Flags for packet (see IP_PACKET_FLAG_xx below)*/ 81 BOOLEAN MappedHeader; /* States whether Header is from an MDL or allocated from pool */ 82 BOOLEAN ReturnPacket; /* States whether NdisPacket should be passed to NdisReturnPackets */ 83 PVOID Header; /* Pointer to IP header for this packet */ 84 UINT HeaderSize; /* Size of IP header */ 85 PVOID Data; /* Current pointer into packet data */ 86 UINT TotalSize; /* Total amount of data in packet (IP header and data) */ 87 UINT Position; /* Current logical offset into packet */ 88 PNDIS_PACKET NdisPacket; /* Pointer to NDIS packet */ 89 IP_ADDRESS SrcAddr; /* Source address */ 90 IP_ADDRESS DstAddr; /* Destination address */ 91 } IP_PACKET, *PIP_PACKET; 92 93 #define IP_PACKET_FLAG_RAW 0x01 /* Raw IP packet */ 94 95 96 /* Packet context */ 97 typedef struct _PACKET_CONTEXT { 98 PACKET_COMPLETION_ROUTINE DLComplete; /* Data link level completion handler 99 * Also used to link to next packet 100 * in a queue */ 101 PVOID Context; /* Context information for handler */ 102 UINT PacketType; /* Type of packet */ 103 } PACKET_CONTEXT, *PPACKET_CONTEXT; 104 105 /* The ProtocolReserved field is structured as a PACKET_CONTEXT */ 106 #define PC(Packet) ((PPACKET_CONTEXT)(&Packet->ProtocolReserved)) 107 108 /* Values for address type -- also the interface flags */ 109 /* These values are mean to overlap meaningfully with the BSD ones */ 110 #define ADE_UNICAST 0x01 111 #define ADE_BROADCAST 0x02 112 #define ADE_ADDRMASK 0x04 113 #define ADE_POINTOPOINT 0x10 114 #define ADE_MULTICAST 0x8000 115 116 /* There is one NTE for each source (unicast) address assigned to an interface */ 117 /* Link layer transmit prototype */ 118 typedef VOID (*LL_TRANSMIT_ROUTINE)( 119 PVOID Context, 120 PNDIS_PACKET NdisPacket, 121 UINT Offset, 122 PVOID LinkAddress, 123 USHORT Type); 124 125 /* Link layer to IP binding information */ 126 typedef struct _LLIP_BIND_INFO { 127 PVOID Context; /* Pointer to link layer context information */ 128 UINT HeaderSize; /* Size of link level header */ 129 UINT MinFrameSize; /* Minimum frame size in bytes */ 130 PUCHAR Address; /* Pointer to interface address */ 131 UINT AddressLength; /* Length of address in bytes */ 132 LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */ 133 } LLIP_BIND_INFO, *PLLIP_BIND_INFO; 134 135 typedef struct _SEND_RECV_STATS { 136 UINT InBytes; 137 UINT InUnicast; 138 UINT InNUnicast; 139 UINT InDiscarded; 140 UINT InErrors; 141 UINT InDiscardedUnknownProto; 142 UINT OutBytes; 143 UINT OutUnicast; 144 UINT OutNUnicast; 145 UINT OutDiscarded; 146 UINT OutErrors; 147 } SEND_RECV_STATS, *PSEND_RECV_STATS; 148 149 /* Information about an IP interface */ 150 typedef struct _IP_INTERFACE { 151 LIST_ENTRY ListEntry; /* Entry on list */ 152 OBJECT_FREE_ROUTINE Free; /* Routine used to free resources used by the object */ 153 KSPIN_LOCK Lock; /* Spin lock for this object */ 154 PVOID Context; /* Pointer to link layer context information */ 155 UINT HeaderSize; /* Size of link level header */ 156 UINT MinFrameSize; /* Minimum frame size in bytes */ 157 UINT MTU; /* Maximum transmission unit */ 158 UINT Speed; /* Link speed */ 159 IP_ADDRESS Unicast; /* Unicast address */ 160 IP_ADDRESS PointToPoint; /* Point to point address */ 161 IP_ADDRESS Netmask; /* Netmask */ 162 IP_ADDRESS Broadcast; /* Broadcast */ 163 UNICODE_STRING Name; /* Adapter name (GUID) */ 164 UNICODE_STRING Description; /* Adapter description (Human readable) */ 165 PUCHAR Address; /* Pointer to interface address */ 166 UINT AddressLength; /* Length of address in bytes */ 167 UINT Index; /* Index of adapter (used to add ip addr) */ 168 LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */ 169 PVOID TCPContext; /* TCP Content for this interface */ 170 SEND_RECV_STATS Stats; /* Send/Receive statistics */ 171 } IP_INTERFACE, *PIP_INTERFACE; 172 173 typedef struct _IP_SET_ADDRESS { 174 ULONG NteIndex; 175 IPv4_RAW_ADDRESS Address; 176 IPv4_RAW_ADDRESS Netmask; 177 } IP_SET_ADDRESS, *PIP_SET_ADDRESS; 178 179 #define IP_PROTOCOL_TABLE_SIZE 0x100 180 181 typedef VOID (*IP_PROTOCOL_HANDLER)( 182 PIP_INTERFACE Interface, 183 PIP_PACKET IPPacket); 184 185 /* Loopback adapter address information (network byte order) */ 186 #define LOOPBACK_ADDRESS_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0x7F000001)) 187 #define LOOPBACK_BCASTADDR_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0x7FFFFFFF)) 188 #define LOOPBACK_ADDRMASK_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0xFF000000)) 189 190 /* Protocol definitions */ 191 #ifndef IPPROTO_RAW 192 #define IPPROTO_RAW 0 /* Raw IP */ 193 #endif 194 #define IPPROTO_ICMP 1 /* Internet Control Message Protocol */ 195 #define IPPROTO_IGMP 2 /* Internet Group Management Protocol */ 196 #define IPPROTO_TCP 6 /* Transmission Control Protocol */ 197 #define IPPROTO_UDP 17 /* User Datagram Protocol */ 198 199 /* Timeout timer constants */ 200 #define IP_TIMEOUT 1000 /* Timeout in milliseconds */ 201 #define IP_DEFAULT_LINK_SPEED 10000 202 203 extern LIST_ENTRY InterfaceListHead; 204 extern KSPIN_LOCK InterfaceListLock; 205 extern LIST_ENTRY NetTableListHead; 206 extern KSPIN_LOCK NetTableListLock; 207 208 PIP_PACKET IPCreatePacket( 209 ULONG Type); 210 211 PIP_PACKET IPInitializePacket( 212 PIP_PACKET IPPacket, 213 ULONG Type); 214 215 PIP_INTERFACE IPCreateInterface( 216 PLLIP_BIND_INFO BindInfo); 217 218 VOID IPAddInterfaceRoute( 219 PIP_INTERFACE IF); 220 221 VOID IPRemoveInterfaceRoute( 222 PIP_INTERFACE IF); 223 224 VOID IPDestroyInterface( 225 PIP_INTERFACE IF); 226 227 BOOLEAN IPRegisterInterface( 228 PIP_INTERFACE IF); 229 230 VOID IPUnregisterInterface( 231 PIP_INTERFACE IF); 232 233 VOID NTAPI IPTimeoutDpcFn(PKDPC Dpc, 234 PVOID DeferredContext, 235 PVOID SystemArgument1, 236 PVOID SystemArgument2); 237 238 VOID IPDispatchProtocol( 239 PIP_INTERFACE Interface, 240 PIP_PACKET IPPacket); 241 242 VOID IPRegisterProtocol( 243 UINT ProtocolNumber, 244 IP_PROTOCOL_HANDLER Handler); 245 246 NTSTATUS IPStartup(PUNICODE_STRING RegistryPath); 247 248 NTSTATUS IPShutdown(VOID); 249 250 /* EOF */ 251