1 /*
2  * COPYRIGHT:   See COPYING in the top level directory
3  * PROJECT:     ReactOS TCP/IP protocol driver
4  * FILE:        include/receive.h
5  * PURPOSE:     Internet Protocol receive prototypes
6  */
7 
8 #pragma once
9 
10 #include <ip.h>
11 
12 /* Number of seconds before destroying the IPDR */
13 #define MAX_TIMEOUT_COUNT 3
14 
15 /* IP datagram fragment descriptor. Used to store IP datagram fragments */
16 typedef struct IP_FRAGMENT {
17     LIST_ENTRY ListEntry; /* Entry on list */
18     PNDIS_PACKET Packet;  /* NDIS packet containing fragment data */
19     BOOLEAN ReturnPacket; /* States whether to call NdisReturnPackets */
20     UINT PacketOffset;    /* Offset into NDIS packet where data is */
21     UINT Offset;          /* Offset into datagram where this fragment is */
22     UINT Size;            /* Size of this fragment */
23 } IP_FRAGMENT, *PIP_FRAGMENT;
24 
25 /* IP datagram hole descriptor. Used to reassemble IP datagrams */
26 typedef struct IPDATAGRAM_HOLE {
27     LIST_ENTRY ListEntry; /* Entry on list */
28     UINT First;           /* Offset of first octet of the hole */
29     UINT Last;            /* Offset of last octet of the hole */
30 } IPDATAGRAM_HOLE, *PIPDATAGRAM_HOLE;
31 
32 /* IP datagram reassembly information */
33 typedef struct IPDATAGRAM_REASSEMBLY {
34     LIST_ENTRY ListEntry;        /* Entry on list */
35     KSPIN_LOCK Lock;             /* Protecting spin lock */
36     UINT DataSize;               /* Size of datagram data area */
37     IP_ADDRESS SrcAddr;          /* Source address */
38     IP_ADDRESS DstAddr;          /* Destination address */
39     UCHAR Protocol;              /* Internet Protocol number */
40     USHORT Id;                   /* Identification number */
41     PIP_HEADER IPv4Header;       /* Pointer to IP header */
42     UINT HeaderSize;             /* Length of IP header */
43     LIST_ENTRY FragmentListHead; /* IP fragment list */
44     LIST_ENTRY HoleListHead;     /* IP datagram hole list */
45     UINT TimeoutCount;           /* Timeout counter */
46 } IPDATAGRAM_REASSEMBLY, *PIPDATAGRAM_REASSEMBLY;
47 
48 
49 extern LIST_ENTRY ReassemblyListHead;
50 extern KSPIN_LOCK ReassemblyListLock;
51 extern NPAGED_LOOKASIDE_LIST IPDRList;
52 extern NPAGED_LOOKASIDE_LIST IPFragmentList;
53 extern NPAGED_LOOKASIDE_LIST IPHoleList;
54 
55 
56 VOID IPFreeReassemblyList(
57     VOID);
58 
59 VOID IPDatagramReassemblyTimeout(
60     VOID);
61 
62 VOID IPReceive(
63     PIP_INTERFACE IF,
64     PIP_PACKET IPPacket);
65 
66 /* EOF */
67