xref: /reactos/drivers/network/tcpip/include/ip.h (revision c2c66aff)
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