Added networking code from Casper Hornstrup
authorDavid Welch <welch@cwcom.net>
Wed, 2 Aug 2000 00:24:26 +0000 (00:24 +0000)
committerDavid Welch <welch@cwcom.net>
Wed, 2 Aug 2000 00:24:26 +0000 (00:24 +0000)
svn path=/trunk/; revision=1283

82 files changed:
reactos/Makefile
reactos/drivers/net/tcpip/DIRS
reactos/drivers/net/tcpip/datalink/Makefile
reactos/drivers/net/tcpip/datalink/SOURCES
reactos/drivers/net/tcpip/datalink/arp.c
reactos/drivers/net/tcpip/datalink/lan.c
reactos/drivers/net/tcpip/datalink/loopback.c
reactos/drivers/net/tcpip/include/address.h
reactos/drivers/net/tcpip/include/arp.h
reactos/drivers/net/tcpip/include/checksum.h
reactos/drivers/net/tcpip/include/datagram.h
reactos/drivers/net/tcpip/include/debug.h
reactos/drivers/net/tcpip/include/dispatch.h
reactos/drivers/net/tcpip/include/fileobjs.h
reactos/drivers/net/tcpip/include/icmp.h
reactos/drivers/net/tcpip/include/info.h
reactos/drivers/net/tcpip/include/ip.h
reactos/drivers/net/tcpip/include/lan.h
reactos/drivers/net/tcpip/include/loopback.h
reactos/drivers/net/tcpip/include/neighbor.h
reactos/drivers/net/tcpip/include/pool.h
reactos/drivers/net/tcpip/include/rawip.h
reactos/drivers/net/tcpip/include/receive.h
reactos/drivers/net/tcpip/include/route.h
reactos/drivers/net/tcpip/include/router.h
reactos/drivers/net/tcpip/include/routines.h
reactos/drivers/net/tcpip/include/tcp.h
reactos/drivers/net/tcpip/include/tcpip.h
reactos/drivers/net/tcpip/include/ticonsts.h
reactos/drivers/net/tcpip/include/titypes.h
reactos/drivers/net/tcpip/include/transmit.h
reactos/drivers/net/tcpip/include/udp.h
reactos/drivers/net/tcpip/makefile
reactos/drivers/net/tcpip/network/Makefile
reactos/drivers/net/tcpip/network/SOURCES
reactos/drivers/net/tcpip/network/icmp.c
reactos/drivers/net/tcpip/network/ip.c
reactos/drivers/net/tcpip/network/neighbor.c
reactos/drivers/net/tcpip/network/receive.c
reactos/drivers/net/tcpip/network/route.c
reactos/drivers/net/tcpip/network/router.c
reactos/drivers/net/tcpip/network/transmit.c
reactos/drivers/net/tcpip/readme.txt
reactos/drivers/net/tcpip/tcpip.def
reactos/drivers/net/tcpip/tcpip.edf
reactos/drivers/net/tcpip/tcpip.rc
reactos/drivers/net/tcpip/tcpip/Copy of info.c
reactos/drivers/net/tcpip/tcpip/Makefile
reactos/drivers/net/tcpip/tcpip/SOURCES
reactos/drivers/net/tcpip/tcpip/address.c
reactos/drivers/net/tcpip/tcpip/checksum.c
reactos/drivers/net/tcpip/tcpip/dispatch.c
reactos/drivers/net/tcpip/tcpip/fileobjs.c
reactos/drivers/net/tcpip/tcpip/info.c
reactos/drivers/net/tcpip/tcpip/main.c
reactos/drivers/net/tcpip/tcpip/pool.c
reactos/drivers/net/tcpip/tcpip/resource.rc
reactos/drivers/net/tcpip/tcpip/routines.c
reactos/drivers/net/tcpip/tcpip/tcpip.def [new file with mode: 0644]
reactos/drivers/net/tcpip/transport/DIRS
reactos/drivers/net/tcpip/transport/datagram/Makefile
reactos/drivers/net/tcpip/transport/datagram/SOURCES
reactos/drivers/net/tcpip/transport/datagram/datagram.c
reactos/drivers/net/tcpip/transport/rawip/Makefile
reactos/drivers/net/tcpip/transport/rawip/SOURCES
reactos/drivers/net/tcpip/transport/rawip/rawip.c
reactos/drivers/net/tcpip/transport/tcp/Makefile
reactos/drivers/net/tcpip/transport/tcp/SOURCES
reactos/drivers/net/tcpip/transport/tcp/tcp.c
reactos/drivers/net/tcpip/transport/udp/Makefile
reactos/drivers/net/tcpip/transport/udp/SOURCES
reactos/drivers/net/tcpip/transport/udp/udp.c
reactos/drivers/net/tditest/DIRS [new file with mode: 0644]
reactos/drivers/net/tditest/include/debug.h [new file with mode: 0644]
reactos/drivers/net/tditest/include/tditest.h [new file with mode: 0644]
reactos/drivers/net/tditest/makefile [new file with mode: 0644]
reactos/drivers/net/tditest/readme.txt [new file with mode: 0644]
reactos/drivers/net/tditest/tditest.def [new file with mode: 0644]
reactos/drivers/net/tditest/tditest.rc [new file with mode: 0644]
reactos/drivers/net/tditest/tditest/Makefile [new file with mode: 0644]
reactos/drivers/net/tditest/tditest/SOURCES [new file with mode: 0644]
reactos/drivers/net/tditest/tditest/tditest.c [new file with mode: 0644]

index 394f718..efaaa56 100644 (file)
@@ -34,11 +34,16 @@ LOADERS = dos
 #
 # Select the device drivers and filesystems you want
 #
-DEVICE_DRIVERS = blue ide keyboard null parallel serial vidport floppy
-# DEVICE_DRIVERS = beep event floppy ide_test mouse sound test test1
-FS_DRIVERS = vfat minix
+DEVICE_DRIVERS = vga blue ide keyboard null parallel serial vidport
+# DEVICE_DRIVERS = beep event floppy ide_test mouse sound test test1\r
+\r
+FS_DRIVERS = vfat
 # FS_DRIVERS = minix ext2 template
-KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS)
+\r
+# ndis tdi tcpip tditest\r
+NET_DRIVERS = ndis tcpip tditest\r
+\r
+KERNEL_SERVICES = $(DEVICE_DRIVERS) $(FS_DRIVERS) $(NET_DRIVERS)\r
 
 APPS = args hello shell test cat bench apc shm lpc thread event file gditest \
        pteb consume
@@ -54,7 +59,7 @@ clean: buildno_clean $(COMPONENTS:%=%_clean) $(DLLS:%=%_clean) $(LOADERS:%=%_cle
        
 .PHONY: clean
 
-install_floppy: make_floppy_dirs autoexec_floppy $(COMPONENTS:%=%_floppy) \
+floppy: make_floppy_dirs autoexec_floppy $(COMPONENTS:%=%_floppy) \
         $(DLLS:%=%_floppy) $(LOADERS:%=%_floppy) \
         $(KERNEL_SERVICES:%=%_floppy) $(SUBSYS:%=%_floppy) \
         $(APPS:%=%_floppy)
@@ -155,6 +160,15 @@ $(FS_DRIVERS:%=%_dist): %_dist:
 
 .PHONY: $(FS_DRIVERS) $(FS_DRIVERS:%=%_clean) $(FS_DRIVERS:%=%_floppy) \
         $(FS_DRIVERS:%=%_dist)
+\r
+$(NET_DRIVERS): %:\r
+       make -C services/net/$*\r
+\r
+$(NET_DRIVERS:%=%_clean): %_clean:\r
+       make -C services/net/$* clean\r
+\r
+.PHONY: $(NET_DRIVERS) $(NET_DRIVERS:%=%_clean)\r
+\r
 
 #
 # Kernel loaders
index a49d00e..de50bbd 100644 (file)
@@ -1,5 +1,5 @@
-DIRS= datalink \\r
-      network \\r
-      transport \\r
-      tcpip\r
-\r
+DIRS= datalink \
+      network \
+      transport \
+      tcpip
+
index 9c985f5..5818975 100644 (file)
@@ -1,7 +1,7 @@
-#\r
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
-# file to this component.  This file merely indirects to the real make file\r
-# that is shared by all the driver components of the Windows NT DDK\r
-#\r
-\r
-!INCLUDE $(NTMAKEENV)\makefile.def\r
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def
index b941923..25571ac 100644 (file)
@@ -1,13 +1,13 @@
-TARGETNAME=datalink\r
-TARGETPATH=..\objects\r
-TARGETTYPE=LIBRARY\r
-\r
-TARGETLIBS=$(DDK_LIB_PATH)\tdi.lib \\r
-           $(DDK_LIB_PATH)\ndis.lib\r
-\r
-INCLUDES=..\include;$(BASEDIR)\INC;..\..\..\..\include\net\r
-SOURCES= arp.c \\r
-                lan.c \\r
-         loopback.c\r
-\r
-MSC_WARNING_LEVEL=/W3 /WX\r
+TARGETNAME=datalink
+TARGETPATH=..\objects
+TARGETTYPE=LIBRARY
+
+TARGETLIBS=$(DDK_LIB_PATH)\tdi.lib \
+           $(DDK_LIB_PATH)\ndis.lib
+
+INCLUDES=..\include;$(BASEDIR)\INC;..\..\..\..\include\net
+SOURCES= arp.c \
+                lan.c \
+         loopback.c
+
+MSC_WARNING_LEVEL=/W3 /WX
index 83d2490..6121918 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        datalink/arp.c\r
- * PURPOSE:     Address Resolution Protocol routines\r
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)\r
- * REVISIONS:\r
- *   CSH 01/08-2000 Created\r
- */\r
-#include <tcpip.h>\r
-#include <arp.h>\r
-#include <routines.h>\r
-#include <neighbor.h>\r
-#include <address.h>\r
-#include <pool.h>\r
-#include <lan.h>\r
-\r
-\r
-PNDIS_PACKET PrepareARPPacket(\r
-    USHORT HardwareType,\r
-    USHORT ProtocolType,\r
-    UCHAR LinkAddressLength,\r
-    UCHAR ProtoAddressLength,\r
-    PVOID SenderLinkAddress,\r
-    PVOID SenderProtoAddress,\r
-    PVOID TargetLinkAddress,\r
-    PVOID TargetProtoAddress,\r
-    USHORT Opcode)\r
-/*\r
- * FUNCTION: Prepares an ARP packet\r
- * ARGUMENTS:\r
- *     HardwareType       = Hardware type (in network byte order)\r
- *     ProtocolType       = Protocol type (in network byte order)\r
- *     LinkAddressLength  = Length of link address fields\r
- *     ProtoAddressLength = Length of protocol address fields\r
- *     SenderLinkAddress  = Sender's link address\r
- *     SenderProtoAddress = Sender's protocol address\r
- *     TargetLinkAddress  = Target's link address (NULL if don't care)\r
- *     TargetProtoAddress = Target's protocol address\r
- *     Opcode             = ARP opcode (in network byte order)\r
- * RETURNS:\r
- *     Pointer to NDIS packet, NULL if there is not enough free resources\r
- */\r
-{\r
-    PNDIS_PACKET NdisPacket;\r
-    PNDIS_BUFFER NdisBuffer;\r
-    NDIS_STATUS NdisStatus;\r
-    PARP_HEADER Header;\r
-    PVOID DataBuffer;\r
-    ULONG Size;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    /* Prepare ARP packet */\r
-    Size = MaxLLHeaderSize + sizeof(ARP_HEADER) + \r
-        2 * LinkAddressLength + /* Hardware address length */\r
-        2 * ProtoAddressLength; /* Protocol address length */\r
-    Size = MAX(Size, MinLLFrameSize);\r
-\r
-    DataBuffer = ExAllocatePool(NonPagedPool, Size);\r
-    if (!DataBuffer)\r
-        return NULL;\r
-\r
-    /* Allocate NDIS packet */\r
-    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        ExFreePool(DataBuffer);\r
-        return NULL;\r
-    }\r
-\r
-    /* Allocate NDIS buffer for maximum link level header and ARP packet */\r
-    NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool,\r
-        DataBuffer, Size);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        NdisFreePacket(NdisPacket);\r
-        ExFreePool(DataBuffer);\r
-        return NULL;\r
-    }\r
-\r
-    /* Link NDIS buffer into packet */\r
-    NdisChainBufferAtFront(NdisPacket, NdisBuffer);\r
-    RtlZeroMemory(DataBuffer, Size);\r
-    Header = (PARP_HEADER)((ULONG_PTR)DataBuffer + MaxLLHeaderSize);\r
-    Header->HWType       = HardwareType;\r
-    Header->ProtoType    = ProtocolType;\r
-    Header->HWAddrLen    = LinkAddressLength;\r
-    Header->ProtoAddrLen = ProtoAddressLength;\r
-    Header->Opcode       = Opcode; /* Already swapped */\r
-    DataBuffer = (PVOID)((ULONG_PTR)Header + sizeof(ARP_HEADER));\r
-\r
-    /* Our hardware address */\r
-    RtlCopyMemory(DataBuffer, SenderLinkAddress, LinkAddressLength);\r
-    (ULONG_PTR)DataBuffer += LinkAddressLength;\r
-\r
-    /* Our protocol address */\r
-    RtlCopyMemory(DataBuffer, SenderProtoAddress, ProtoAddressLength);\r
-\r
-    if (TargetLinkAddress) {\r
-        (ULONG_PTR)DataBuffer += ProtoAddressLength;\r
-        /* Target hardware address */\r
-        RtlCopyMemory(DataBuffer, TargetLinkAddress, LinkAddressLength);\r
-        (ULONG_PTR)DataBuffer += LinkAddressLength;\r
-    } else\r
-        /* Don't care about target hardware address */\r
-        (ULONG_PTR)DataBuffer += (ProtoAddressLength + LinkAddressLength);\r
-\r
-    /* Target protocol address */\r
-    RtlCopyMemory(DataBuffer, TargetProtoAddress, ProtoAddressLength);\r
-\r
-    return NdisPacket;\r
-}\r
-\r
-\r
-VOID ARPTransmitComplete(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    NDIS_STATUS NdisStatus)\r
-/*\r
- * FUNCTION: ARP request transmit completion handler\r
- * ARGUMENTS:\r
- *     Context    = Pointer to context information (IP_INTERFACE)\r
- *     Packet     = Pointer to NDIS packet that was sent\r
- *     NdisStatus = NDIS status of operation\r
- * NOTES:\r
- *    This routine is called when an ARP request has been sent\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    FreeNdisPacket(NdisPacket);\r
-}\r
-\r
-\r
-BOOLEAN ARPTransmit(\r
-    PIP_ADDRESS Address,\r
-    PNET_TABLE_ENTRY NTE)\r
-/*\r
- * FUNCTION: Creates an ARP request and transmits it on a network\r
- * ARGUMENTS:\r
- *     Address = Pointer to IP address to resolve\r
- *     NTE     = Pointer to net table entru to use for transmitting request\r
- * RETURNS:\r
- *     TRUE if the request was successfully sent, FALSE if not\r
- */\r
-{\r
-    PIP_INTERFACE Interface;\r
-    PNDIS_PACKET NdisPacket;\r
-    UCHAR ProtoAddrLen;\r
-    USHORT ProtoType;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    Interface = NTE->Interface;\r
-\r
-    switch (Address->Type) {\r
-        case IP_ADDRESS_V4:\r
-            ProtoType    = (USHORT)ETYPE_IPv4; /* IPv4 */\r
-            ProtoAddrLen = 4;                  /* Length of IPv4 address */\r
-            break;\r
-        case IP_ADDRESS_V6:\r
-            ProtoType    = (USHORT)ETYPE_IPv6; /* IPv6 */\r
-            ProtoAddrLen = 16;                 /* Length of IPv6 address */\r
-            break;\r
-        default:\r
-            /* Should not happen */\r
-            return FALSE;\r
-    }\r
-\r
-    NdisPacket = PrepareARPPacket(\r
-        WN2H(0x0001),                    /* FIXME: Ethernet only */\r
-        ProtoType,                       /* Protocol type */\r
-        (UCHAR)Interface->AddressLength, /* Hardware address length */\r
-        (UCHAR)ProtoAddrLen,             /* Protocol address length */\r
-        Interface->Address,              /* Sender's (local) hardware address */\r
-        &NTE->Address->Address,          /* Sender's (local) protocol address */\r
-        NULL,                            /* Don't care */\r
-        &Address->Address,               /* Target's (remote) protocol address */\r
-        ARP_OPCODE_REQUEST);             /* ARP request */\r
-\r
-    PC(NdisPacket)->DLComplete = ARPTransmitComplete;\r
-\r
-    (*Interface->Transmit)(Interface->Context, NdisPacket,\r
-        MaxLLHeaderSize, NULL, LAN_PROTO_ARP);\r
-\r
-    return TRUE;\r
-}\r
-\r
-\r
-VOID ARPReceive(\r
-    PVOID Context,\r
-    PIP_PACKET Packet)\r
-/*\r
- * FUNCTION: Receives an ARP packet\r
- * ARGUMENTS:\r
- *     Context = Pointer to context information (IP_INTERFACE)\r
- *     Packet  = Pointer to packet\r
- */\r
-{\r
-    PARP_HEADER Header;\r
-    PIP_ADDRESS Address;\r
-    PVOID SenderHWAddress;\r
-    PVOID SenderProtoAddress;\r
-    PVOID TargetProtoAddress;\r
-    PADDRESS_ENTRY ADE;\r
-    PNEIGHBOR_CACHE_ENTRY NCE;\r
-    PNDIS_PACKET NdisPacket;\r
-    PIP_INTERFACE Interface = (PIP_INTERFACE)Context;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    Header = (PARP_HEADER)Packet->Header;\r
-\r
-    /* FIXME: Ethernet only */\r
-    if (WN2H(Header->HWType) != 1)\r
-        return;\r
-\r
-    /* Check protocol type */\r
-    if (Header->ProtoType != ETYPE_IPv4)\r
-        return;\r
-\r
-    SenderHWAddress    = (PVOID)((ULONG_PTR)Header + sizeof(ARP_HEADER));\r
-    SenderProtoAddress = (PVOID)((ULONG_PTR)SenderHWAddress + Header->HWAddrLen);\r
-\r
-    /* Check if we have the target protocol address */\r
-\r
-    TargetProtoAddress = (PVOID)((ULONG_PTR)SenderProtoAddress +\r
-        Header->ProtoAddrLen + Header->HWAddrLen);\r
-\r
-    Address = AddrBuildIPv4(*(PULONG)(TargetProtoAddress));\r
-    ADE = IPLocateADE(Address, ADE_UNICAST);\r
-    if (!ADE) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        return;\r
-    }\r
-\r
-    /* Check if we know the sender */\r
-\r
-    AddrInitIPv4(Address, *(PULONG)(SenderProtoAddress));\r
-    NCE = NBLocateNeighbor(Address);\r
-    if (NCE) {\r
-        DereferenceObject(Address);\r
-        /* We know the sender. Update the hardware address \r
-           and state in our neighbor address cache */\r
-        NBUpdateNeighbor(NCE, SenderHWAddress, NUD_REACHABLE);\r
-    } else {\r
-        /* The packet had our protocol address as target. The sender\r
-           may want to communicate with us soon, so add his address\r
-           to our address cache */\r
-        NCE = NBAddNeighbor(Interface, Address, SenderHWAddress,\r
-            Header->HWAddrLen, NUD_REACHABLE);\r
-    }\r
-    if (NCE)\r
-        DereferenceObject(NCE)\r
-\r
-    if (Header->Opcode != ARP_OPCODE_REQUEST)\r
-        return;\r
-    \r
-    /* This is a request for our address. Swap the addresses and\r
-       send an ARP reply back to the sender */\r
-    NdisPacket = PrepareARPPacket(\r
-        Header->HWType,                  /* Hardware type */\r
-        Header->ProtoType,               /* Protocol type */\r
-        (UCHAR)Interface->AddressLength, /* Hardware address length */\r
-        (UCHAR)Header->ProtoAddrLen,     /* Protocol address length */\r
-        Interface->Address,              /* Sender's (local) hardware address */\r
-        &ADE->Address->Address,          /* Sender's (local) protocol address */\r
-        SenderHWAddress,                 /* Target's (remote) hardware address */\r
-        SenderProtoAddress,              /* Target's (remote) protocol address */\r
-        ARP_OPCODE_REPLY);               /* ARP reply */\r
-    if (NdisPacket) {\r
-        PC(NdisPacket)->DLComplete = ARPTransmitComplete;\r
-        (*Interface->Transmit)(Interface->Context, NdisPacket,\r
-            MaxLLHeaderSize, SenderHWAddress, LAN_PROTO_ARP);\r
-    }\r
-}\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        datalink/arp.c
+ * PURPOSE:     Address Resolution Protocol routines
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * REVISIONS:
+ *   CSH 01/08-2000 Created
+ */
+#include <tcpip.h>
+#include <arp.h>
+#include <routines.h>
+#include <neighbor.h>
+#include <address.h>
+#include <pool.h>
+#include <lan.h>
+
+
+PNDIS_PACKET PrepareARPPacket(
+    USHORT HardwareType,
+    USHORT ProtocolType,
+    UCHAR LinkAddressLength,
+    UCHAR ProtoAddressLength,
+    PVOID SenderLinkAddress,
+    PVOID SenderProtoAddress,
+    PVOID TargetLinkAddress,
+    PVOID TargetProtoAddress,
+    USHORT Opcode)
+/*
+ * FUNCTION: Prepares an ARP packet
+ * ARGUMENTS:
+ *     HardwareType       = Hardware type (in network byte order)
+ *     ProtocolType       = Protocol type (in network byte order)
+ *     LinkAddressLength  = Length of link address fields
+ *     ProtoAddressLength = Length of protocol address fields
+ *     SenderLinkAddress  = Sender's link address
+ *     SenderProtoAddress = Sender's protocol address
+ *     TargetLinkAddress  = Target's link address (NULL if don't care)
+ *     TargetProtoAddress = Target's protocol address
+ *     Opcode             = ARP opcode (in network byte order)
+ * RETURNS:
+ *     Pointer to NDIS packet, NULL if there is not enough free resources
+ */
+{
+    PNDIS_PACKET NdisPacket;
+    PNDIS_BUFFER NdisBuffer;
+    NDIS_STATUS NdisStatus;
+    PARP_HEADER Header;
+    PVOID DataBuffer;
+    ULONG Size;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    /* Prepare ARP packet */
+    Size = MaxLLHeaderSize + sizeof(ARP_HEADER) + 
+        2 * LinkAddressLength + /* Hardware address length */
+        2 * ProtoAddressLength; /* Protocol address length */
+    Size = MAX(Size, MinLLFrameSize);
+
+    DataBuffer = ExAllocatePool(NonPagedPool, Size);
+    if (!DataBuffer)
+        return NULL;
+
+    /* Allocate NDIS packet */
+    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        ExFreePool(DataBuffer);
+        return NULL;
+    }
+
+    /* Allocate NDIS buffer for maximum link level header and ARP packet */
+    NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool,
+        DataBuffer, Size);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        NdisFreePacket(NdisPacket);
+        ExFreePool(DataBuffer);
+        return NULL;
+    }
+
+    /* Link NDIS buffer into packet */
+    NdisChainBufferAtFront(NdisPacket, NdisBuffer);
+    RtlZeroMemory(DataBuffer, Size);
+    Header = (PARP_HEADER)((ULONG_PTR)DataBuffer + MaxLLHeaderSize);
+    Header->HWType       = HardwareType;
+    Header->ProtoType    = ProtocolType;
+    Header->HWAddrLen    = LinkAddressLength;
+    Header->ProtoAddrLen = ProtoAddressLength;
+    Header->Opcode       = Opcode; /* Already swapped */
+    DataBuffer = (PVOID)((ULONG_PTR)Header + sizeof(ARP_HEADER));
+
+    /* Our hardware address */
+    RtlCopyMemory(DataBuffer, SenderLinkAddress, LinkAddressLength);
+    (ULONG_PTR)DataBuffer += LinkAddressLength;
+
+    /* Our protocol address */
+    RtlCopyMemory(DataBuffer, SenderProtoAddress, ProtoAddressLength);
+
+    if (TargetLinkAddress) {
+        (ULONG_PTR)DataBuffer += ProtoAddressLength;
+        /* Target hardware address */
+        RtlCopyMemory(DataBuffer, TargetLinkAddress, LinkAddressLength);
+        (ULONG_PTR)DataBuffer += LinkAddressLength;
+    } else
+        /* Don't care about target hardware address */
+        (ULONG_PTR)DataBuffer += (ProtoAddressLength + LinkAddressLength);
+
+    /* Target protocol address */
+    RtlCopyMemory(DataBuffer, TargetProtoAddress, ProtoAddressLength);
+
+    return NdisPacket;
+}
+
+
+VOID ARPTransmitComplete(
+    PVOID Context,
+    PNDIS_PACKET NdisPacket,
+    NDIS_STATUS NdisStatus)
+/*
+ * FUNCTION: ARP request transmit completion handler
+ * ARGUMENTS:
+ *     Context    = Pointer to context information (IP_INTERFACE)
+ *     Packet     = Pointer to NDIS packet that was sent
+ *     NdisStatus = NDIS status of operation
+ * NOTES:
+ *    This routine is called when an ARP request has been sent
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    FreeNdisPacket(NdisPacket);
+}
+
+
+BOOLEAN ARPTransmit(
+    PIP_ADDRESS Address,
+    PNET_TABLE_ENTRY NTE)
+/*
+ * FUNCTION: Creates an ARP request and transmits it on a network
+ * ARGUMENTS:
+ *     Address = Pointer to IP address to resolve
+ *     NTE     = Pointer to net table entru to use for transmitting request
+ * RETURNS:
+ *     TRUE if the request was successfully sent, FALSE if not
+ */
+{
+    PIP_INTERFACE Interface;
+    PNDIS_PACKET NdisPacket;
+    UCHAR ProtoAddrLen;
+    USHORT ProtoType;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    Interface = NTE->Interface;
+
+    switch (Address->Type) {
+        case IP_ADDRESS_V4:
+            ProtoType    = (USHORT)ETYPE_IPv4; /* IPv4 */
+            ProtoAddrLen = 4;                  /* Length of IPv4 address */
+            break;
+        case IP_ADDRESS_V6:
+            ProtoType    = (USHORT)ETYPE_IPv6; /* IPv6 */
+            ProtoAddrLen = 16;                 /* Length of IPv6 address */
+            break;
+        default:
+            /* Should not happen */
+            return FALSE;
+    }
+
+    NdisPacket = PrepareARPPacket(
+        WN2H(0x0001),                    /* FIXME: Ethernet only */
+        ProtoType,                       /* Protocol type */
+        (UCHAR)Interface->AddressLength, /* Hardware address length */
+        (UCHAR)ProtoAddrLen,             /* Protocol address length */
+        Interface->Address,              /* Sender's (local) hardware address */
+        &NTE->Address->Address,          /* Sender's (local) protocol address */
+        NULL,                            /* Don't care */
+        &Address->Address,               /* Target's (remote) protocol address */
+        ARP_OPCODE_REQUEST);             /* ARP request */
+
+    PC(NdisPacket)->DLComplete = ARPTransmitComplete;
+
+    (*Interface->Transmit)(Interface->Context, NdisPacket,
+        MaxLLHeaderSize, NULL, LAN_PROTO_ARP);
+
+    return TRUE;
+}
+
+
+VOID ARPReceive(
+    PVOID Context,
+    PIP_PACKET Packet)
+/*
+ * FUNCTION: Receives an ARP packet
+ * ARGUMENTS:
+ *     Context = Pointer to context information (IP_INTERFACE)
+ *     Packet  = Pointer to packet
+ */
+{
+    PARP_HEADER Header;
+    PIP_ADDRESS Address;
+    PVOID SenderHWAddress;
+    PVOID SenderProtoAddress;
+    PVOID TargetProtoAddress;
+    PADDRESS_ENTRY ADE;
+    PNEIGHBOR_CACHE_ENTRY NCE;
+    PNDIS_PACKET NdisPacket;
+    PIP_INTERFACE Interface = (PIP_INTERFACE)Context;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    Header = (PARP_HEADER)Packet->Header;
+
+    /* FIXME: Ethernet only */
+    if (WN2H(Header->HWType) != 1)
+        return;
+
+    /* Check protocol type */
+    if (Header->ProtoType != ETYPE_IPv4)
+        return;
+
+    SenderHWAddress    = (PVOID)((ULONG_PTR)Header + sizeof(ARP_HEADER));
+    SenderProtoAddress = (PVOID)((ULONG_PTR)SenderHWAddress + Header->HWAddrLen);
+
+    /* Check if we have the target protocol address */
+
+    TargetProtoAddress = (PVOID)((ULONG_PTR)SenderProtoAddress +
+        Header->ProtoAddrLen + Header->HWAddrLen);
+
+    Address = AddrBuildIPv4(*(PULONG)(TargetProtoAddress));
+    ADE = IPLocateADE(Address, ADE_UNICAST);
+    if (!ADE) {
+        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        return;
+    }
+
+    /* Check if we know the sender */
+
+    AddrInitIPv4(Address, *(PULONG)(SenderProtoAddress));
+    NCE = NBLocateNeighbor(Address);
+    if (NCE) {
+        DereferenceObject(Address);
+        /* We know the sender. Update the hardware address 
+           and state in our neighbor address cache */
+        NBUpdateNeighbor(NCE, SenderHWAddress, NUD_REACHABLE);
+    } else {
+        /* The packet had our protocol address as target. The sender
+           may want to communicate with us soon, so add his address
+           to our address cache */
+        NCE = NBAddNeighbor(Interface, Address, SenderHWAddress,
+            Header->HWAddrLen, NUD_REACHABLE);
+    }
+    if (NCE)
+        DereferenceObject(NCE)
+
+    if (Header->Opcode != ARP_OPCODE_REQUEST)
+        return;
+    
+    /* This is a request for our address. Swap the addresses and
+       send an ARP reply back to the sender */
+    NdisPacket = PrepareARPPacket(
+        Header->HWType,                  /* Hardware type */
+        Header->ProtoType,               /* Protocol type */
+        (UCHAR)Interface->AddressLength, /* Hardware address length */
+        (UCHAR)Header->ProtoAddrLen,     /* Protocol address length */
+        Interface->Address,              /* Sender's (local) hardware address */
+        &ADE->Address->Address,          /* Sender's (local) protocol address */
+        SenderHWAddress,                 /* Target's (remote) hardware address */
+        SenderProtoAddress,              /* Target's (remote) protocol address */
+        ARP_OPCODE_REPLY);               /* ARP reply */
+    if (NdisPacket) {
+        PC(NdisPacket)->DLComplete = ARPTransmitComplete;
+        (*Interface->Transmit)(Interface->Context, NdisPacket,
+            MaxLLHeaderSize, SenderHWAddress, LAN_PROTO_ARP);
+    }
+}
+
+/* EOF */
index 4476922..df15ca9 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        datalink/lan.c\r
- * PURPOSE:     Local Area Network media routines\r
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)\r
- * REVISIONS:\r
- *   CSH 01/08-2000 Created\r
- */\r
-#include <tcpip.h>\r
-#include <lan.h>\r
-#include <address.h>\r
-#include <routines.h>\r
-#include <transmit.h>\r
-#include <receive.h>\r
-#include <arp.h>\r
-\r
-\r
-NDIS_HANDLE NdisProtocolHandle = (NDIS_HANDLE)NULL;\r
-BOOLEAN ProtocolRegistered     = FALSE;\r
-PLAN_ADAPTER Adapters          = NULL;\r
-\r
-\r
-NDIS_STATUS NDISCall(\r
-    PLAN_ADAPTER Adapter,\r
-    NDIS_REQUEST_TYPE Type,\r
-    NDIS_OID OID,\r
-    PVOID Buffer,\r
-    UINT Length)\r
-/*\r
- * FUNCTION: Send a request to NDIS\r
- * ARGUMENTS:\r
- *     Adapter     = Pointer to a LAN_ADAPTER structure\r
- *     Type        = Type of request (Set or Query)\r
- *     OID         = Value to be set/queried for\r
- *     Buffer      = Pointer to a buffer to use\r
- *     Length      = Number of bytes in Buffer\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    NDIS_REQUEST Request;\r
-    NDIS_STATUS NdisStatus;\r
-\r
-    Request.RequestType = Type;\r
-    if (Type == NdisRequestSetInformation) {\r
-        Request.DATA.SET_INFORMATION.Oid                     = OID;\r
-        Request.DATA.SET_INFORMATION.InformationBuffer       = Buffer;\r
-        Request.DATA.SET_INFORMATION.InformationBufferLength = Length;\r
-    } else {\r
-        Request.DATA.QUERY_INFORMATION.Oid                     = OID;\r
-        Request.DATA.QUERY_INFORMATION.InformationBuffer       = Buffer;\r
-        Request.DATA.QUERY_INFORMATION.InformationBufferLength = Length;\r
-    }\r
-\r
-    if (Adapter->State != LAN_STATE_RESETTING) {\r
-        NdisRequest(&NdisStatus, Adapter->NdisHandle, &Request);\r
-    } else\r
-        NdisStatus = NDIS_STATUS_NOT_ACCEPTED;\r
-\r
-    /* Wait for NDIS to complete the request */\r
-    if (NdisStatus == NDIS_STATUS_PENDING) {\r
-        KeWaitForSingleObject(&Adapter->Event, UserRequest, KernelMode, FALSE, NULL);\r
-        NdisStatus = Adapter->NdisStatus;\r
-    }\r
-\r
-    return NdisStatus;\r
-}\r
-\r
-\r
-PNDIS_PACKET AllocateTDPacket(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Allocates an NDIS packet for NdisTransferData\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to LAN_ADAPTER structure\r
- * RETURNS:\r
- *     Pointer to NDIS packet or NULL if there was not enough free\r
- *     non-paged memory\r
- */\r
-{\r
-    NDIS_STATUS NdisStatus;\r
-    PNDIS_PACKET NdisPacket;\r
-    PNDIS_BUFFER Buffer;\r
-    PVOID Data;\r
-\r
-    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS)\r
-        return NULL;\r
-\r
-    Data = ExAllocatePool(NonPagedPool, Adapter->MTU);\r
-    if (!Data) {\r
-        NdisFreePacket(NdisPacket);\r
-        return NULL;\r
-    }\r
-        \r
-    NdisAllocateBuffer(&NdisStatus, &Buffer, GlobalBufferPool, Data, Adapter->MTU);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        NdisFreePacket(NdisPacket);\r
-        ExFreePool(Data);\r
-        return NULL;\r
-    }\r
-\r
-    NdisChainBufferAtFront(NdisPacket, Buffer);\r
-\r
-    PC(NdisPacket)->Context = NULL; /* End of list */\r
-\r
-    return NdisPacket;\r
-}\r
-\r
-\r
-VOID FreeTDPackets(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Frees transfer data packets\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to LAN_ADAPTER structure\r
- */\r
-{\r
-    PNDIS_PACKET NdisPacket, Next;\r
-\r
-    /* Release transfer data packets */\r
-    NdisPacket = Adapter->TDPackets;\r
-    while (NdisPacket) {\r
-        Next = PC(NdisPacket)->Context;\r
-        FreeNdisPacket(NdisPacket);\r
-        NdisPacket = Next;\r
-    }\r
-    Adapter->TDPackets = NULL;\r
-}\r
-\r
-\r
-VOID FreeAdapter(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Frees memory for a LAN_ADAPTER structure\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to LAN_ADAPTER structure to free\r
- */\r
-{\r
-    FreeTDPackets(Adapter);\r
-    ExFreePool(Adapter);\r
-}\r
-\r
-\r
-VOID ProtocolOpenAdapterComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    NDIS_STATUS Status,\r
-    NDIS_STATUS OpenErrorStatus)\r
-/*\r
- * FUNCTION: Called by NDIS to complete opening of an adapter\r
- * ARGUMENTS:\r
- *     BindingContext  = Pointer to a device context (LAN_ADAPTER)\r
- *     Status          = Status of the operation\r
- *     OpenErrorStatus = Additional status information\r
- */\r
-{\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    KeSetEvent(&Adapter->Event, 0, FALSE);\r
-}\r
-\r
-\r
-VOID ProtocolCloseAdapterComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    NDIS_STATUS Status)\r
-/*\r
- * FUNCTION: Called by NDIS to complete closing an adapter\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- *     Status         = Status of the operation\r
- */\r
-{\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    Adapter->NdisStatus = Status;\r
-\r
-    KeSetEvent(&Adapter->Event, 0, FALSE);\r
-}\r
-\r
-\r
-VOID ProtocolResetComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    NDIS_STATUS Status)\r
-/*\r
- * FUNCTION: Called by NDIS to complete resetting an adapter\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- *     Status         = Status of the operation\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-}\r
-\r
-\r
-VOID ProtocolRequestComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    PNDIS_REQUEST NdisRequest,\r
-    NDIS_STATUS Status)\r
-/*\r
- * FUNCTION: Called by NDIS to complete a request\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- *     NdisRequest    = Pointer to an object describing the request\r
- *     Status         = Status of the operation\r
- */\r
-{\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;\r
-\r
-    /* Save status of request and signal an event */\r
-    Adapter->NdisStatus = Status;\r
-\r
-    KeSetEvent(&Adapter->Event, 0, FALSE);\r
-}\r
-\r
-\r
-VOID ProtocolSendComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    PNDIS_PACKET Packet,\r
-    NDIS_STATUS Status)\r
-/*\r
- * FUNCTION: Called by NDIS to complete sending process\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- *     Packet         = Pointer to a packet descriptor\r
- *     Status         = Status of the operation\r
- */\r
-{\r
-       PLAN_ADAPTER Adapter = BindingContext;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    AdjustPacket(Packet, Adapter->HeaderSize, PC(Packet)->DLOffset);\r
-\r
-    (*PC(Packet)->DLComplete)(Adapter->Context, Packet, Status);\r
-}\r
-\r
-\r
-VOID ProtocolTransferDataComplete(\r
-    NDIS_HANDLE BindingContext,\r
-    PNDIS_PACKET Packet,\r
-    NDIS_STATUS Status,\r
-    UINT BytesTransferred)\r
-/*\r
- * FUNCTION: Called by NDIS to complete reception of data\r
- * ARGUMENTS:\r
- *     BindingContext   = Pointer to a device context (LAN_ADAPTER)\r
- *     Packet           = Pointer to a packet descriptor\r
- *     Status           = Status of the operation\r
- *     BytesTransferred = Number of bytes transferred\r
- * NOTES:\r
- *     If the packet was successfully received, determine the protocol\r
- *     type and pass it to the correct receive handler\r
- */\r
-{\r
-    UINT PacketType;\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;\r
-\r
-    if (Status == NDIS_STATUS_SUCCESS) {\r
-        PNDIS_BUFFER NdisBuffer;\r
-        IP_PACKET IPPacket;\r
-\r
-        NdisGetFirstBufferFromPacket(\r
-            Packet, &NdisBuffer, &IPPacket.Header,\r
-            &IPPacket.ContigSize, &IPPacket.TotalSize);\r
-\r
-        /* Determine which upper layer protocol that should receive\r
-           this packet and pass it to the correct receive handler */\r
-        PacketType = ((PETH_HEADER)IPPacket.Header)->EType;\r
-        switch (PacketType) {\r
-            case ETYPE_IPv4:\r
-            case ETYPE_IPv6:\r
-                IPReceive(Adapter->Context, &IPPacket);\r
-                break;\r
-            case ETYPE_ARP:\r
-                ARPReceive(Adapter->Context, &IPPacket);\r
-            default:\r
-                break;\r
-        }\r
-    }\r
-\r
-    /* Release the packet descriptor */\r
-    KeAcquireSpinLockAtDpcLevel(&Adapter->Lock);\r
-\r
-    PC(Packet)->Context = Adapter->TDPackets;\r
-    Adapter->TDPackets  = Packet;\r
-\r
-    KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);\r
-}\r
-\r
-\r
-NDIS_STATUS ProtocolReceive(\r
-    NDIS_HANDLE BindingContext,\r
-    NDIS_HANDLE MacReceiveContext,\r
-    PVOID HeaderBuffer,\r
-    UINT HeaderBufferSize,\r
-    PVOID LookaheadBuffer,\r
-    UINT LookaheadBufferSize,\r
-    UINT PacketSize)\r
-/*\r
- * FUNCTION: Called by NDIS when a packet has been received on the physical link\r
- * ARGUMENTS:\r
- *     BindingContext      = Pointer to a device context (LAN_ADAPTER)\r
- *     MacReceiveContext   = Handle used by underlying NIC driver\r
- *     HeaderBuffer        = Pointer to a buffer containing the packet header\r
- *     HeaderBufferSize    = Number of bytes in HeaderBuffer\r
- *     LookaheadBuffer     = Pointer to a buffer containing buffered packet data\r
- *     LookaheadBufferSize = Size of LookaheadBuffer. May be less than asked for\r
- *     PacketSize          = Overall size of the packet (not including header)\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    USHORT EType;\r
-    UINT PacketType;\r
-    IP_PACKET IPPacket;\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;\r
-    PETH_HEADER EHeader  = (PETH_HEADER)HeaderBuffer;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    if ((Adapter->State != LAN_STATE_STARTED) ||\r
-        HeaderBufferSize < Adapter->HeaderSize)\r
-        /* Adapter is not started or the header was too small */\r
-        return NDIS_STATUS_NOT_ACCEPTED;\r
-\r
-    if (Adapter->Media == NdisMedium802_3) {\r
-        /* Ethernet and IEEE 802.3 frames can be destinguished by\r
-           looking at the IEEE 802.3 length field. This field is\r
-           less than or equal to 1500 for a valid IEEE 802.3 frame\r
-           and larger than 1500 is it's a valid Ether-Type value.\r
-           See RFC 1122, section 2.3.3 for more information */\r
-        if (((EType = EHeader->EType) != ETYPE_IPv4) && (EType != ETYPE_ARP))\r
-            return NDIS_STATUS_NOT_ACCEPTED;\r
-        /* We use Ether-Type constants to destinguish packets */\r
-        PacketType = EType;\r
-    } else\r
-        /* FIXME: Support other medias */\r
-        return NDIS_STATUS_NOT_ACCEPTED;\r
-\r
-    if (LookaheadBufferSize < PacketSize) {\r
-        NDIS_STATUS NdisStatus;\r
-        PNDIS_PACKET NdisPacket;\r
-        UINT BytesTransferred;\r
-        \r
-        /* Get transfer data packet */\r
-\r
-        KeAcquireSpinLockAtDpcLevel(&Adapter->Lock);\r
-\r
-        NdisPacket = Adapter->TDPackets;\r
-        if (NdisPacket == (PNDIS_PACKET)NULL) {\r
-            /* We don't have a free packet descriptor. Drop the packet */\r
-            KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);\r
-            return NDIS_STATUS_SUCCESS;\r
-        }\r
-        Adapter->TDPackets = PC(NdisPacket)->Context;\r
-\r
-        KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);\r
-\r
-        /* Get the data */\r
-        NdisTransferData(&NdisStatus, Adapter->NdisHandle,\r
-            MacReceiveContext, 0, PacketSize,\r
-            NdisPacket, &BytesTransferred);\r
-        if (NdisStatus != NDIS_STATUS_PENDING)\r
-            ProtocolTransferDataComplete(BindingContext,\r
-                NdisPacket, NdisStatus, BytesTransferred);\r
-\r
-        return NDIS_STATUS_SUCCESS;\r
-    }\r
-\r
-    /* We got all the data in the lookahead buffer */\r
-    RtlZeroMemory(&IPPacket, sizeof(IPPacket));\r
-    IPPacket.Header    = LookaheadBuffer;\r
-    IPPacket.TotalSize = PacketSize;\r
-\r
-    switch (PacketType) {\r
-        case ETYPE_IPv4:\r
-        case ETYPE_IPv6:\r
-            IPReceive(Adapter->Context, &IPPacket);\r
-            break;\r
-        case ETYPE_ARP:\r
-            ARPReceive(Adapter->Context, &IPPacket);\r
-            break;\r
-        default:\r
-            break;\r
-    }\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-VOID ProtocolReceiveComplete(\r
-    NDIS_HANDLE BindingContext)\r
-/*\r
- * FUNCTION: Called by NDIS when we're done receiving data\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-}\r
-\r
-\r
-VOID ProtocolStatus(\r
-    NDIS_HANDLE BindingContext,\r
-    NDIS_STATUS GenerelStatus,\r
-    PVOID StatusBuffer,\r
-    UINT StatusBufferSize)\r
-/*\r
- * FUNCTION: Called by NDIS when the underlying driver has changed state\r
- * ARGUMENTS:\r
- *     BindingContext   = Pointer to a device context (LAN_ADAPTER)\r
- *     GenerelStatus    = A generel status code\r
- *     StatusBuffer     = Pointer to a buffer with medium-specific data\r
- *     StatusBufferSize = Number of bytes in StatusBuffer\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-}\r
-\r
-\r
-VOID ProtocolStatusComplete(\r
-    NDIS_HANDLE NdisBindingContext)\r
-/*\r
- * FUNCTION: Called by NDIS when a status-change has occurred\r
- * ARGUMENTS:\r
- *     BindingContext = Pointer to a device context (LAN_ADAPTER)\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-}\r
-\r
-\r
-VOID LANTransmit(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    UINT Offset,\r
-    PVOID LinkAddress,\r
-    USHORT Type)\r
-/*\r
- * FUNCTION: Transmits a packet\r
- * ARGUMENTS:\r
- *     Context     = Pointer to context information (LAN_ADAPTER)\r
- *     NdisPacket  = Pointer to NDIS packet to send\r
- *     Offset      = Offset in packet where data starts\r
- *     LinkAddress = Pointer to link address of destination (NULL = broadcast)\r
- *     Type        = LAN protocol type (LAN_PROTO_*)\r
- */\r
-{\r
-    NDIS_STATUS NdisStatus;\r
-    PETH_HEADER EHeader;\r
-    PVOID Data;\r
-    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)Context;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    /* NDIS send routines don't have an offset argument so we\r
-       must offset the data in upper layers and adjust the\r
-       packet here. We save the offset in the packet context\r
-       area so it can be undone before we release the packet */\r
-    Data = AdjustPacket(NdisPacket, Offset, Adapter->HeaderSize);\r
-    PC(NdisPacket)->DLOffset = Offset;\r
-\r
-    if (Adapter->State == LAN_STATE_STARTED) {\r
-        switch (Adapter->Media) {\r
-        case NdisMedium802_3:\r
-            EHeader = (PETH_HEADER)Data;\r
-    \r
-            if (LinkAddress)\r
-                /* Unicast address */\r
-                RtlCopyMemory(EHeader->DstAddr, LinkAddress, IEEE_802_ADDR_LENGTH);\r
-             else\r
-                /* Broadcast address */\r
-                RtlFillMemory(EHeader->DstAddr, IEEE_802_ADDR_LENGTH, 0xFF);\r
-\r
-            RtlCopyMemory(EHeader->SrcAddr, Adapter->HWAddress, IEEE_802_ADDR_LENGTH);\r
-\r
-            switch (Type) {\r
-                case LAN_PROTO_IPv4:\r
-                    EHeader->EType = ETYPE_IPv4;\r
-                    break;\r
-                case LAN_PROTO_ARP:\r
-                    EHeader->EType = ETYPE_ARP;\r
-                    break;\r
-                case LAN_PROTO_IPv6:\r
-                    EHeader->EType = ETYPE_IPv6;\r
-                    break;\r
-                default:\r
-#if DBG\r
-                    /* Should not happen */\r
-                    TI_DbgPrint(MIN_TRACE, ("Unknown LAN protocol.\n"));\r
-\r
-                    ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NDIS_STATUS_FAILURE);\r
-#endif\r
-                    return;\r
-            }\r
-            break;\r
-\r
-        default:\r
-            /* FIXME: Support other medias */\r
-            break;\r
-        }\r
-       \r
-        NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket);\r
-        if (NdisStatus != NDIS_STATUS_PENDING)\r
-            ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NdisStatus);\r
-    } else\r
-        ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NDIS_STATUS_CLOSED);\r
-}\r
-\r
-\r
-VOID BindAdapter(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Binds a LAN adapter to IP layer\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to LAN_ADAPTER structure\r
- * NOTES:\r
- *    We set the lookahead buffer size, set the packet filter and\r
- *    bind the adapter to IP layer\r
- */\r
-{\r
-    INT i;\r
-    PIP_INTERFACE IF;\r
-    PIP_ADDRESS Address;\r
-    PNDIS_PACKET Packet;\r
-    NDIS_STATUS NdisStatus;\r
-    LLIP_BIND_INFO BindInfo;\r
-    ULONG Lookahead = LOOKAHEAD_SIZE;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    Adapter->State = LAN_STATE_OPENING;\r
-\r
-    NdisStatus = NDISCall(Adapter, NdisRequestSetInformation,\r
-        OID_GEN_CURRENT_LOOKAHEAD, &Lookahead, sizeof(ULONG));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        TI_DbgPrint(MID_TRACE, ("Could not set lookahead buffer size (0x%X).\n", NdisStatus));\r
-        return;\r
-    }\r
-\r
-    /* Allocate packets for NdisTransferData */\r
-    /* FIXME: How many should we allocate? */\r
-    Adapter->TDPackets = NULL;\r
-    for (i = 0; i < 2; i++) {\r
-        Packet              = AllocateTDPacket(Adapter);\r
-        PC(Packet)->Context = Adapter->TDPackets;\r
-        Adapter->TDPackets  = Packet;\r
-        if (!Packet) {\r
-            TI_DbgPrint(MID_TRACE, ("Could not allocate transfer data packet (out of resources).\n"));\r
-            FreeTDPackets(Adapter);\r
-            return;\r
-        }\r
-    }\r
-\r
-    /* Bind the adapter to IP layer */\r
-    BindInfo.Context       = Adapter;\r
-    BindInfo.HeaderSize    = Adapter->HeaderSize;\r
-    BindInfo.MinFrameSize  = Adapter->MinFrameSize;\r
-    BindInfo.MTU           = Adapter->MTU;\r
-    BindInfo.Address       = (PUCHAR)&Adapter->HWAddress;\r
-    BindInfo.AddressLength = Adapter->HWAddressLength;\r
-    BindInfo.Transmit      = LANTransmit;\r
-\r
-    IF = IPCreateInterface(&BindInfo);\r
-    if (!IF) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        FreeTDPackets(Adapter);\r
-        return;\r
-    }\r
-\r
-    /* FIXME: Get address from registry.\r
-       For now just use a private address, eg. 10.0.0.10 */\r
-    Address = AddrBuildIPv4(0x0A00000A);\r
-    if (!Address) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        FreeTDPackets(Adapter);\r
-        IPDestroyInterface(Adapter->Context);\r
-        return;\r
-    }\r
-    /* Create a net table entry for this interface */\r
-    if (!IPCreateNTE(IF, Address, 8)) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        FreeTDPackets(Adapter);\r
-        IPDestroyInterface(IF);\r
-        return;\r
-    }\r
-\r
-    /* Reference the interface for the NTE. The reference for\r
-       the address is just passed on to the NTE */\r
-    ReferenceObject(IF);\r
-\r
-    /* Register interface with IP layer */\r
-    IPRegisterInterface(IF);\r
-\r
-    /* Set packet filter so we can send and receive packets */\r
-    NdisStatus = NDISCall(Adapter, NdisRequestSetInformation,\r
-        OID_GEN_CURRENT_PACKET_FILTER, &Adapter->PacketFilter, sizeof(UINT));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        TI_DbgPrint(MID_TRACE, ("Could not set packet filter (0x%X).\n", NdisStatus));\r
-        FreeTDPackets(Adapter);\r
-        IPDestroyInterface(IF);\r
-        return;\r
-    }\r
-\r
-    Adapter->Context = IF;\r
-\r
-    Adapter->State = LAN_STATE_STARTED;\r
-}\r
-\r
-\r
-VOID UnbindAdapter(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Unbinds a LAN adapter from IP layer\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to LAN_ADAPTER structure\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    if (Adapter->State == LAN_STATE_STARTED) {\r
-        PIP_INTERFACE IF = Adapter->Context;\r
-\r
-        IPUnregisterInterface(IF);\r
-\r
-        IPDestroyInterface(IF);\r
-\r
-        /* Free transfer data packets */\r
-        FreeTDPackets(Adapter);\r
-    }\r
-}\r
-\r
-\r
-NDIS_STATUS LANRegisterAdapter(\r
-    PNDIS_STRING AdapterName,\r
-    PLAN_ADAPTER *Adapter)\r
-/*\r
- * FUNCTION: Registers protocol with an NDIS adapter\r
- * ARGUMENTS:\r
- *     AdapterName = Pointer to string with name of adapter to register\r
- *     Adapter     = Address of pointer to a LAN_ADAPTER structure\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    PLAN_ADAPTER IF;\r
-    NDIS_STATUS NdisStatus;\r
-    NDIS_STATUS OpenStatus;\r
-    UINT MediaIndex;\r
-    NDIS_MEDIUM MediaArray[MAX_MEDIA];\r
-    UINT AddressOID;\r
-    UINT Speed;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    IF = ExAllocatePool(NonPagedPool, sizeof(LAN_ADAPTER));\r
-    if (!IF)\r
-        return NDIS_STATUS_RESOURCES;\r
-\r
-    RtlZeroMemory(IF, sizeof(LAN_ADAPTER));\r
-\r
-    /* Put adapter in stopped state */\r
-    IF->State = LAN_STATE_STOPPED;\r
-\r
-    /* Initialize protecting spin lock */\r
-    KeInitializeSpinLock(&IF->Lock);\r
-\r
-    KeInitializeEvent(&IF->Event, SynchronizationEvent, FALSE);\r
-\r
-    /* Initialize array with media IDs we support */\r
-    MediaArray[MEDIA_ETH] = NdisMedium802_3;\r
-\r
-    /* Open the adapter. */\r
-    NdisOpenAdapter(&NdisStatus, &OpenStatus, &IF->NdisHandle, &MediaIndex,\r
-        MediaArray, MAX_MEDIA, NdisProtocolHandle, IF, AdapterName, 0, NULL);\r
-\r
-    /* Wait until the adapter is opened */\r
-    if (NdisStatus == NDIS_STATUS_PENDING)\r
-        KeWaitForSingleObject(&IF->Event, UserRequest, KernelMode, FALSE, NULL);\r
-    else if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        ExFreePool(IF);\r
-        return NdisStatus;\r
-    }\r
-\r
-    IF->Media = MediaArray[MediaIndex];\r
-\r
-    /* Fill LAN_ADAPTER structure with some adapter specific information */\r
-    switch (IF->Media) {\r
-    case NdisMedium802_3:\r
-        IF->HWAddressLength = IEEE_802_ADDR_LENGTH;\r
-        IF->BCastMask       = BCAST_ETH_MASK;\r
-        IF->BCastCheck      = BCAST_ETH_CHECK;\r
-        IF->BCastOffset     = BCAST_ETH_OFFSET;\r
-        IF->HeaderSize      = sizeof(ETH_HEADER);\r
-        IF->MinFrameSize    = 60;\r
-        AddressOID          = OID_802_3_CURRENT_ADDRESS;\r
-        IF->PacketFilter    = \r
-            NDIS_PACKET_TYPE_BROADCAST |\r
-            NDIS_PACKET_TYPE_DIRECTED  |\r
-            NDIS_PACKET_TYPE_MULTICAST;\r
-        break;\r
-\r
-    default:\r
-        /* Unsupported media */\r
-        TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n"));\r
-        ExFreePool(IF);\r
-        return NDIS_STATUS_NOT_SUPPORTED;\r
-    }\r
-\r
-    /* Get maximum frame size */\r
-    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,\r
-        OID_GEN_MAXIMUM_FRAME_SIZE, &IF->MTU, sizeof(UINT));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        ExFreePool(IF);\r
-        return NdisStatus;\r
-    }\r
-\r
-    /* Get maximum packet size */\r
-    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,\r
-        OID_GEN_MAXIMUM_TOTAL_SIZE, &IF->MaxPacketSize, sizeof(UINT));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        TI_DbgPrint(MIN_TRACE, ("Query for maximum packet size failed.\n"));\r
-        ExFreePool(IF);\r
-        return NdisStatus;\r
-    }\r
-\r
-    /* Get maximum number of packets we can pass to NdisSend(Packets) at one time */\r
-    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,\r
-        OID_GEN_MAXIMUM_SEND_PACKETS, &IF->MaxSendPackets, sizeof(UINT));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS)\r
-        /* Legacy NIC drivers may not support this query, if it fails we\r
-           assume it can send at least one packet per call to NdisSend(Packets) */\r
-        IF->MaxSendPackets = 1;\r
-\r
-    /* Get current hardware address */\r
-    NdisStatus = NDISCall(IF, NdisRequestQueryInformation, AddressOID,\r
-        IF->HWAddress, IF->HWAddressLength);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        TI_DbgPrint(MIN_TRACE, ("Query for current hardware address failed.\n"));\r
-        ExFreePool(IF);\r
-        return NdisStatus;\r
-    }\r
-\r
-    /* Get maximum link speed */\r
-    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,\r
-        OID_GEN_LINK_SPEED, &Speed, sizeof(UINT));\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        TI_DbgPrint(MIN_TRACE, ("Query for maximum link speed failed.\n"));\r
-        ExFreePool(IF);\r
-        return NdisStatus;\r
-    }\r
-\r
-    /* Convert returned link speed to bps (it is in 100bps increments) */\r
-    IF->Speed = Speed * 100L;\r
-\r
-    *Adapter = IF;\r
-\r
-    /* Add adapter to the adapter list */\r
-    IF->Next = Adapters;\r
-    Adapters = IF;\r
-\r
-    /* Bind adapter to IP layer */\r
-    BindAdapter(IF);\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NDIS_STATUS LANUnregisterAdapter(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Unregisters protocol with NDIS adapter\r
- * ARGUMENTS:\r
- *     Adapter = Pointer to a LAN_ADAPTER structure\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    KIRQL OldIrql;\r
-    NDIS_HANDLE NdisHandle;\r
-    PLAN_ADAPTER IF, PrevIF;\r
-    BOOLEAN Found = FALSE;\r
-    NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    /* Search the adapter list for the specified adapter and remove it */\r
-    IF = Adapters;\r
-    if (IF) {\r
-        if (Adapter != Adapters) {\r
-            PrevIF = IF;\r
-            while ((IF) && (!Found)) {\r
-                if (IF == Adapter) {\r
-                    /* We've found the adapter, now remove it from the list */\r
-                    PrevIF->Next = IF->Next;\r
-                    Found = TRUE;\r
-                }\r
-                PrevIF = IF;\r
-                IF = IF->Next;\r
-            }\r
-        } else {\r
-            Adapters = NULL;\r
-            Found    = TRUE;\r
-        }\r
-    }\r
-    if (!Found) {\r
-        TI_DbgPrint(MIN_TRACE, ("Leaving (adapter was not in list).\n"));\r
-        return NDIS_STATUS_ADAPTER_NOT_FOUND;\r
-    }\r
-\r
-    /* Unbind adapter from IP layer */\r
-    UnbindAdapter(Adapter);\r
-\r
-    KeAcquireSpinLock(&Adapter->Lock, &OldIrql);\r
-    NdisHandle = Adapter->NdisHandle;\r
-    if (NdisHandle) {\r
-        Adapter->NdisHandle = NULL;\r
-        KeReleaseSpinLock(&Adapter->Lock, OldIrql);\r
-\r
-        NdisCloseAdapter(&NdisStatus, NdisHandle);\r
-        if (NdisStatus == NDIS_STATUS_PENDING) {\r
-            KeWaitForSingleObject(&Adapter->Event,\r
-                UserRequest, KernelMode, FALSE, NULL);\r
-            NdisStatus = Adapter->NdisStatus;\r
-        }\r
-    } else\r
-        KeReleaseSpinLock(&Adapter->Lock, OldIrql);\r
-\r
-    FreeAdapter(Adapter);\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-\r
-NTSTATUS LANRegisterProtocol(\r
-    PSTRING Name)\r
-/*\r
- * FUNCTION: Registers this protocol driver with NDIS\r
- * ARGUMENTS:\r
- *     Name = Name of this protocol driver\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    NDIS_STATUS NdisStatus;\r
-    NDIS_PROTOCOL_CHARACTERISTICS ProtChars;\r
-\r
-    /* Set up protocol characteristics */\r
-    RtlZeroMemory(&ProtChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));\r
-    ProtChars.MajorNdisVersion            = NDIS_VERSION_MAJOR;\r
-    ProtChars.MinorNdisVersion            = NDIS_VERSION_MINOR;\r
-    ProtChars.Name.Length                 = Name->Length;\r
-    ProtChars.Name.Buffer                 = (PVOID)Name->Buffer;\r
-    ProtChars.OpenAdapterCompleteHandler  = ProtocolOpenAdapterComplete;\r
-    ProtChars.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete;\r
-    ProtChars.ResetCompleteHandler        = ProtocolResetComplete;\r
-    ProtChars.RequestCompleteHandler      = ProtocolRequestComplete;\r
-    ProtChars.SendCompleteHandler         = ProtocolSendComplete;\r
-    ProtChars.TransferDataCompleteHandler = ProtocolTransferDataComplete;\r
-    ProtChars.ReceiveHandler              = ProtocolReceive;\r
-    ProtChars.ReceiveCompleteHandler      = ProtocolReceiveComplete;\r
-    ProtChars.StatusHandler               = ProtocolStatus;\r
-    ProtChars.StatusCompleteHandler       = ProtocolStatusComplete;\r
-\r
-       /* Try to register protocol */\r
-    NdisRegisterProtocol(\r
-        &NdisStatus, &NdisProtocolHandle, &ProtChars,\r
-        sizeof(NDIS_PROTOCOL_CHARACTERISTICS) + Name->Length);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS)\r
-        return (NTSTATUS)NdisStatus;\r
-\r
-    ProtocolRegistered = TRUE;\r
-\r
-    return STATUS_SUCCESS;\r
-}\r
-\r
-\r
-VOID LANUnregisterProtocol(\r
-    VOID)\r
-/*\r
- * FUNCTION: Unregisters this protocol driver with NDIS\r
- * NOTES: Does not care wether we are already registered\r
- */\r
-{\r
-    if (ProtocolRegistered) {\r
-        NDIS_STATUS NdisStatus;\r
-\r
-        while (Adapters)\r
-            NdisStatus = LANUnregisterAdapter(Adapters);\r
-\r
-        NdisDeregisterProtocol(&NdisStatus, NdisProtocolHandle);\r
-        ProtocolRegistered = FALSE;\r
-    }\r
-}\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        datalink/lan.c
+ * PURPOSE:     Local Area Network media routines
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * REVISIONS:
+ *   CSH 01/08-2000 Created
+ */
+#include <tcpip.h>
+#include <lan.h>
+#include <address.h>
+#include <routines.h>
+#include <transmit.h>
+#include <receive.h>
+#include <arp.h>
+
+
+NDIS_HANDLE NdisProtocolHandle = (NDIS_HANDLE)NULL;
+BOOLEAN ProtocolRegistered     = FALSE;
+PLAN_ADAPTER Adapters          = NULL;
+
+
+NDIS_STATUS NDISCall(
+    PLAN_ADAPTER Adapter,
+    NDIS_REQUEST_TYPE Type,
+    NDIS_OID OID,
+    PVOID Buffer,
+    UINT Length)
+/*
+ * FUNCTION: Send a request to NDIS
+ * ARGUMENTS:
+ *     Adapter     = Pointer to a LAN_ADAPTER structure
+ *     Type        = Type of request (Set or Query)
+ *     OID         = Value to be set/queried for
+ *     Buffer      = Pointer to a buffer to use
+ *     Length      = Number of bytes in Buffer
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    NDIS_REQUEST Request;
+    NDIS_STATUS NdisStatus;
+
+    Request.RequestType = Type;
+    if (Type == NdisRequestSetInformation) {
+        Request.DATA.SET_INFORMATION.Oid                     = OID;
+        Request.DATA.SET_INFORMATION.InformationBuffer       = Buffer;
+        Request.DATA.SET_INFORMATION.InformationBufferLength = Length;
+    } else {
+        Request.DATA.QUERY_INFORMATION.Oid                     = OID;
+        Request.DATA.QUERY_INFORMATION.InformationBuffer       = Buffer;
+        Request.DATA.QUERY_INFORMATION.InformationBufferLength = Length;
+    }
+
+    if (Adapter->State != LAN_STATE_RESETTING) {
+        NdisRequest(&NdisStatus, Adapter->NdisHandle, &Request);
+    } else
+        NdisStatus = NDIS_STATUS_NOT_ACCEPTED;
+
+    /* Wait for NDIS to complete the request */
+    if (NdisStatus == NDIS_STATUS_PENDING) {
+        KeWaitForSingleObject(&Adapter->Event, UserRequest, KernelMode, FALSE, NULL);
+        NdisStatus = Adapter->NdisStatus;
+    }
+
+    return NdisStatus;
+}
+
+
+PNDIS_PACKET AllocateTDPacket(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Allocates an NDIS packet for NdisTransferData
+ * ARGUMENTS:
+ *     Adapter = Pointer to LAN_ADAPTER structure
+ * RETURNS:
+ *     Pointer to NDIS packet or NULL if there was not enough free
+ *     non-paged memory
+ */
+{
+    NDIS_STATUS NdisStatus;
+    PNDIS_PACKET NdisPacket;
+    PNDIS_BUFFER Buffer;
+    PVOID Data;
+
+    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);
+    if (NdisStatus != NDIS_STATUS_SUCCESS)
+        return NULL;
+
+    Data = ExAllocatePool(NonPagedPool, Adapter->MTU);
+    if (!Data) {
+        NdisFreePacket(NdisPacket);
+        return NULL;
+    }
+        
+    NdisAllocateBuffer(&NdisStatus, &Buffer, GlobalBufferPool, Data, Adapter->MTU);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        NdisFreePacket(NdisPacket);
+        ExFreePool(Data);
+        return NULL;
+    }
+
+    NdisChainBufferAtFront(NdisPacket, Buffer);
+
+    PC(NdisPacket)->Context = NULL; /* End of list */
+
+    return NdisPacket;
+}
+
+
+VOID FreeTDPackets(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Frees transfer data packets
+ * ARGUMENTS:
+ *     Adapter = Pointer to LAN_ADAPTER structure
+ */
+{
+    PNDIS_PACKET NdisPacket, Next;
+
+    /* Release transfer data packets */
+    NdisPacket = Adapter->TDPackets;
+    while (NdisPacket) {
+        Next = PC(NdisPacket)->Context;
+        FreeNdisPacket(NdisPacket);
+        NdisPacket = Next;
+    }
+    Adapter->TDPackets = NULL;
+}
+
+
+VOID FreeAdapter(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Frees memory for a LAN_ADAPTER structure
+ * ARGUMENTS:
+ *     Adapter = Pointer to LAN_ADAPTER structure to free
+ */
+{
+    FreeTDPackets(Adapter);
+    ExFreePool(Adapter);
+}
+
+
+VOID ProtocolOpenAdapterComplete(
+    NDIS_HANDLE BindingContext,
+    NDIS_STATUS Status,
+    NDIS_STATUS OpenErrorStatus)
+/*
+ * FUNCTION: Called by NDIS to complete opening of an adapter
+ * ARGUMENTS:
+ *     BindingContext  = Pointer to a device context (LAN_ADAPTER)
+ *     Status          = Status of the operation
+ *     OpenErrorStatus = Additional status information
+ */
+{
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    KeSetEvent(&Adapter->Event, 0, FALSE);
+}
+
+
+VOID ProtocolCloseAdapterComplete(
+    NDIS_HANDLE BindingContext,
+    NDIS_STATUS Status)
+/*
+ * FUNCTION: Called by NDIS to complete closing an adapter
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ *     Status         = Status of the operation
+ */
+{
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    Adapter->NdisStatus = Status;
+
+    KeSetEvent(&Adapter->Event, 0, FALSE);
+}
+
+
+VOID ProtocolResetComplete(
+    NDIS_HANDLE BindingContext,
+    NDIS_STATUS Status)
+/*
+ * FUNCTION: Called by NDIS to complete resetting an adapter
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ *     Status         = Status of the operation
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+}
+
+
+VOID ProtocolRequestComplete(
+    NDIS_HANDLE BindingContext,
+    PNDIS_REQUEST NdisRequest,
+    NDIS_STATUS Status)
+/*
+ * FUNCTION: Called by NDIS to complete a request
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ *     NdisRequest    = Pointer to an object describing the request
+ *     Status         = Status of the operation
+ */
+{
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
+
+    /* Save status of request and signal an event */
+    Adapter->NdisStatus = Status;
+
+    KeSetEvent(&Adapter->Event, 0, FALSE);
+}
+
+
+VOID ProtocolSendComplete(
+    NDIS_HANDLE BindingContext,
+    PNDIS_PACKET Packet,
+    NDIS_STATUS Status)
+/*
+ * FUNCTION: Called by NDIS to complete sending process
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ *     Packet         = Pointer to a packet descriptor
+ *     Status         = Status of the operation
+ */
+{
+       PLAN_ADAPTER Adapter = BindingContext;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    AdjustPacket(Packet, Adapter->HeaderSize, PC(Packet)->DLOffset);
+
+    (*PC(Packet)->DLComplete)(Adapter->Context, Packet, Status);
+}
+
+
+VOID ProtocolTransferDataComplete(
+    NDIS_HANDLE BindingContext,
+    PNDIS_PACKET Packet,
+    NDIS_STATUS Status,
+    UINT BytesTransferred)
+/*
+ * FUNCTION: Called by NDIS to complete reception of data
+ * ARGUMENTS:
+ *     BindingContext   = Pointer to a device context (LAN_ADAPTER)
+ *     Packet           = Pointer to a packet descriptor
+ *     Status           = Status of the operation
+ *     BytesTransferred = Number of bytes transferred
+ * NOTES:
+ *     If the packet was successfully received, determine the protocol
+ *     type and pass it to the correct receive handler
+ */
+{
+    UINT PacketType;
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
+
+    if (Status == NDIS_STATUS_SUCCESS) {
+        PNDIS_BUFFER NdisBuffer;
+        IP_PACKET IPPacket;
+
+        NdisGetFirstBufferFromPacket(
+            Packet, &NdisBuffer, &IPPacket.Header,
+            &IPPacket.ContigSize, &IPPacket.TotalSize);
+
+        /* Determine which upper layer protocol that should receive
+           this packet and pass it to the correct receive handler */
+        PacketType = ((PETH_HEADER)IPPacket.Header)->EType;
+        switch (PacketType) {
+            case ETYPE_IPv4:
+            case ETYPE_IPv6:
+                IPReceive(Adapter->Context, &IPPacket);
+                break;
+            case ETYPE_ARP:
+                ARPReceive(Adapter->Context, &IPPacket);
+            default:
+                break;
+        }
+    }
+
+    /* Release the packet descriptor */
+    KeAcquireSpinLockAtDpcLevel(&Adapter->Lock);
+
+    PC(Packet)->Context = Adapter->TDPackets;
+    Adapter->TDPackets  = Packet;
+
+    KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);
+}
+
+
+NDIS_STATUS ProtocolReceive(
+    NDIS_HANDLE BindingContext,
+    NDIS_HANDLE MacReceiveContext,
+    PVOID HeaderBuffer,
+    UINT HeaderBufferSize,
+    PVOID LookaheadBuffer,
+    UINT LookaheadBufferSize,
+    UINT PacketSize)
+/*
+ * FUNCTION: Called by NDIS when a packet has been received on the physical link
+ * ARGUMENTS:
+ *     BindingContext      = Pointer to a device context (LAN_ADAPTER)
+ *     MacReceiveContext   = Handle used by underlying NIC driver
+ *     HeaderBuffer        = Pointer to a buffer containing the packet header
+ *     HeaderBufferSize    = Number of bytes in HeaderBuffer
+ *     LookaheadBuffer     = Pointer to a buffer containing buffered packet data
+ *     LookaheadBufferSize = Size of LookaheadBuffer. May be less than asked for
+ *     PacketSize          = Overall size of the packet (not including header)
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    USHORT EType;
+    UINT PacketType;
+    IP_PACKET IPPacket;
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)BindingContext;
+    PETH_HEADER EHeader  = (PETH_HEADER)HeaderBuffer;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    if ((Adapter->State != LAN_STATE_STARTED) ||
+        HeaderBufferSize < Adapter->HeaderSize)
+        /* Adapter is not started or the header was too small */
+        return NDIS_STATUS_NOT_ACCEPTED;
+
+    if (Adapter->Media == NdisMedium802_3) {
+        /* Ethernet and IEEE 802.3 frames can be destinguished by
+           looking at the IEEE 802.3 length field. This field is
+           less than or equal to 1500 for a valid IEEE 802.3 frame
+           and larger than 1500 is it's a valid Ether-Type value.
+           See RFC 1122, section 2.3.3 for more information */
+        if (((EType = EHeader->EType) != ETYPE_IPv4) && (EType != ETYPE_ARP))
+            return NDIS_STATUS_NOT_ACCEPTED;
+        /* We use Ether-Type constants to destinguish packets */
+        PacketType = EType;
+    } else
+        /* FIXME: Support other medias */
+        return NDIS_STATUS_NOT_ACCEPTED;
+
+    if (LookaheadBufferSize < PacketSize) {
+        NDIS_STATUS NdisStatus;
+        PNDIS_PACKET NdisPacket;
+        UINT BytesTransferred;
+        
+        /* Get transfer data packet */
+
+        KeAcquireSpinLockAtDpcLevel(&Adapter->Lock);
+
+        NdisPacket = Adapter->TDPackets;
+        if (NdisPacket == (PNDIS_PACKET)NULL) {
+            /* We don't have a free packet descriptor. Drop the packet */
+            KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);
+            return NDIS_STATUS_SUCCESS;
+        }
+        Adapter->TDPackets = PC(NdisPacket)->Context;
+
+        KeReleaseSpinLockFromDpcLevel(&Adapter->Lock);
+
+        /* Get the data */
+        NdisTransferData(&NdisStatus, Adapter->NdisHandle,
+            MacReceiveContext, 0, PacketSize,
+            NdisPacket, &BytesTransferred);
+        if (NdisStatus != NDIS_STATUS_PENDING)
+            ProtocolTransferDataComplete(BindingContext,
+                NdisPacket, NdisStatus, BytesTransferred);
+
+        return NDIS_STATUS_SUCCESS;
+    }
+
+    /* We got all the data in the lookahead buffer */
+    RtlZeroMemory(&IPPacket, sizeof(IPPacket));
+    IPPacket.Header    = LookaheadBuffer;
+    IPPacket.TotalSize = PacketSize;
+
+    switch (PacketType) {
+        case ETYPE_IPv4:
+        case ETYPE_IPv6:
+            IPReceive(Adapter->Context, &IPPacket);
+            break;
+        case ETYPE_ARP:
+            ARPReceive(Adapter->Context, &IPPacket);
+            break;
+        default:
+            break;
+    }
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+
+VOID ProtocolReceiveComplete(
+    NDIS_HANDLE BindingContext)
+/*
+ * FUNCTION: Called by NDIS when we're done receiving data
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+}
+
+
+VOID ProtocolStatus(
+    NDIS_HANDLE BindingContext,
+    NDIS_STATUS GenerelStatus,
+    PVOID StatusBuffer,
+    UINT StatusBufferSize)
+/*
+ * FUNCTION: Called by NDIS when the underlying driver has changed state
+ * ARGUMENTS:
+ *     BindingContext   = Pointer to a device context (LAN_ADAPTER)
+ *     GenerelStatus    = A generel status code
+ *     StatusBuffer     = Pointer to a buffer with medium-specific data
+ *     StatusBufferSize = Number of bytes in StatusBuffer
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+}
+
+
+VOID ProtocolStatusComplete(
+    NDIS_HANDLE NdisBindingContext)
+/*
+ * FUNCTION: Called by NDIS when a status-change has occurred
+ * ARGUMENTS:
+ *     BindingContext = Pointer to a device context (LAN_ADAPTER)
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+}
+
+
+VOID LANTransmit(
+    PVOID Context,
+    PNDIS_PACKET NdisPacket,
+    UINT Offset,
+    PVOID LinkAddress,
+    USHORT Type)
+/*
+ * FUNCTION: Transmits a packet
+ * ARGUMENTS:
+ *     Context     = Pointer to context information (LAN_ADAPTER)
+ *     NdisPacket  = Pointer to NDIS packet to send
+ *     Offset      = Offset in packet where data starts
+ *     LinkAddress = Pointer to link address of destination (NULL = broadcast)
+ *     Type        = LAN protocol type (LAN_PROTO_*)
+ */
+{
+    NDIS_STATUS NdisStatus;
+    PETH_HEADER EHeader;
+    PVOID Data;
+    PLAN_ADAPTER Adapter = (PLAN_ADAPTER)Context;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    /* NDIS send routines don't have an offset argument so we
+       must offset the data in upper layers and adjust the
+       packet here. We save the offset in the packet context
+       area so it can be undone before we release the packet */
+    Data = AdjustPacket(NdisPacket, Offset, Adapter->HeaderSize);
+    PC(NdisPacket)->DLOffset = Offset;
+
+    if (Adapter->State == LAN_STATE_STARTED) {
+        switch (Adapter->Media) {
+        case NdisMedium802_3:
+            EHeader = (PETH_HEADER)Data;
+    
+            if (LinkAddress)
+                /* Unicast address */
+                RtlCopyMemory(EHeader->DstAddr, LinkAddress, IEEE_802_ADDR_LENGTH);
+             else
+                /* Broadcast address */
+                RtlFillMemory(EHeader->DstAddr, IEEE_802_ADDR_LENGTH, 0xFF);
+
+            RtlCopyMemory(EHeader->SrcAddr, Adapter->HWAddress, IEEE_802_ADDR_LENGTH);
+
+            switch (Type) {
+                case LAN_PROTO_IPv4:
+                    EHeader->EType = ETYPE_IPv4;
+                    break;
+                case LAN_PROTO_ARP:
+                    EHeader->EType = ETYPE_ARP;
+                    break;
+                case LAN_PROTO_IPv6:
+                    EHeader->EType = ETYPE_IPv6;
+                    break;
+                default:
+#if DBG
+                    /* Should not happen */
+                    TI_DbgPrint(MIN_TRACE, ("Unknown LAN protocol.\n"));
+
+                    ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NDIS_STATUS_FAILURE);
+#endif
+                    return;
+            }
+            break;
+
+        default:
+            /* FIXME: Support other medias */
+            break;
+        }
+       
+        NdisSend(&NdisStatus, Adapter->NdisHandle, NdisPacket);
+        if (NdisStatus != NDIS_STATUS_PENDING)
+            ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NdisStatus);
+    } else
+        ProtocolSendComplete((NDIS_HANDLE)Context, NdisPacket, NDIS_STATUS_CLOSED);
+}
+
+
+VOID BindAdapter(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Binds a LAN adapter to IP layer
+ * ARGUMENTS:
+ *     Adapter = Pointer to LAN_ADAPTER structure
+ * NOTES:
+ *    We set the lookahead buffer size, set the packet filter and
+ *    bind the adapter to IP layer
+ */
+{
+    INT i;
+    PIP_INTERFACE IF;
+    PIP_ADDRESS Address;
+    PNDIS_PACKET Packet;
+    NDIS_STATUS NdisStatus;
+    LLIP_BIND_INFO BindInfo;
+    ULONG Lookahead = LOOKAHEAD_SIZE;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    Adapter->State = LAN_STATE_OPENING;
+
+    NdisStatus = NDISCall(Adapter, NdisRequestSetInformation,
+        OID_GEN_CURRENT_LOOKAHEAD, &Lookahead, sizeof(ULONG));
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        TI_DbgPrint(MID_TRACE, ("Could not set lookahead buffer size (0x%X).\n", NdisStatus));
+        return;
+    }
+
+    /* Allocate packets for NdisTransferData */
+    /* FIXME: How many should we allocate? */
+    Adapter->TDPackets = NULL;
+    for (i = 0; i < 2; i++) {
+        Packet              = AllocateTDPacket(Adapter);
+        PC(Packet)->Context = Adapter->TDPackets;
+        Adapter->TDPackets  = Packet;
+        if (!Packet) {
+            TI_DbgPrint(MID_TRACE, ("Could not allocate transfer data packet (out of resources).\n"));
+            FreeTDPackets(Adapter);
+            return;
+        }
+    }
+
+    /* Bind the adapter to IP layer */
+    BindInfo.Context       = Adapter;
+    BindInfo.HeaderSize    = Adapter->HeaderSize;
+    BindInfo.MinFrameSize  = Adapter->MinFrameSize;
+    BindInfo.MTU           = Adapter->MTU;
+    BindInfo.Address       = (PUCHAR)&Adapter->HWAddress;
+    BindInfo.AddressLength = Adapter->HWAddressLength;
+    BindInfo.Transmit      = LANTransmit;
+
+    IF = IPCreateInterface(&BindInfo);
+    if (!IF) {
+        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        FreeTDPackets(Adapter);
+        return;
+    }
+
+    /* FIXME: Get address from registry.
+       For now just use a private address, eg. 10.0.0.10 */
+    Address = AddrBuildIPv4(0x0A00000A);
+    if (!Address) {
+        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        FreeTDPackets(Adapter);
+        IPDestroyInterface(Adapter->Context);
+        return;
+    }
+    /* Create a net table entry for this interface */
+    if (!IPCreateNTE(IF, Address, 8)) {
+        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        FreeTDPackets(Adapter);
+        IPDestroyInterface(IF);
+        return;
+    }
+
+    /* Reference the interface for the NTE. The reference for
+       the address is just passed on to the NTE */
+    ReferenceObject(IF);
+
+    /* Register interface with IP layer */
+    IPRegisterInterface(IF);
+
+    /* Set packet filter so we can send and receive packets */
+    NdisStatus = NDISCall(Adapter, NdisRequestSetInformation,
+        OID_GEN_CURRENT_PACKET_FILTER, &Adapter->PacketFilter, sizeof(UINT));
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        TI_DbgPrint(MID_TRACE, ("Could not set packet filter (0x%X).\n", NdisStatus));
+        FreeTDPackets(Adapter);
+        IPDestroyInterface(IF);
+        return;
+    }
+
+    Adapter->Context = IF;
+
+    Adapter->State = LAN_STATE_STARTED;
+}
+
+
+VOID UnbindAdapter(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Unbinds a LAN adapter from IP layer
+ * ARGUMENTS:
+ *     Adapter = Pointer to LAN_ADAPTER structure
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    if (Adapter->State == LAN_STATE_STARTED) {
+        PIP_INTERFACE IF = Adapter->Context;
+
+        IPUnregisterInterface(IF);
+
+        IPDestroyInterface(IF);
+
+        /* Free transfer data packets */
+        FreeTDPackets(Adapter);
+    }
+}
+
+
+NDIS_STATUS LANRegisterAdapter(
+    PNDIS_STRING AdapterName,
+    PLAN_ADAPTER *Adapter)
+/*
+ * FUNCTION: Registers protocol with an NDIS adapter
+ * ARGUMENTS:
+ *     AdapterName = Pointer to string with name of adapter to register
+ *     Adapter     = Address of pointer to a LAN_ADAPTER structure
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    PLAN_ADAPTER IF;
+    NDIS_STATUS NdisStatus;
+    NDIS_STATUS OpenStatus;
+    UINT MediaIndex;
+    NDIS_MEDIUM MediaArray[MAX_MEDIA];
+    UINT AddressOID;
+    UINT Speed;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    IF = ExAllocatePool(NonPagedPool, sizeof(LAN_ADAPTER));
+    if (!IF)
+        return NDIS_STATUS_RESOURCES;
+
+    RtlZeroMemory(IF, sizeof(LAN_ADAPTER));
+
+    /* Put adapter in stopped state */
+    IF->State = LAN_STATE_STOPPED;
+
+    /* Initialize protecting spin lock */
+    KeInitializeSpinLock(&IF->Lock);
+
+    KeInitializeEvent(&IF->Event, SynchronizationEvent, FALSE);
+
+    /* Initialize array with media IDs we support */
+    MediaArray[MEDIA_ETH] = NdisMedium802_3;
+
+    /* Open the adapter. */
+    NdisOpenAdapter(&NdisStatus, &OpenStatus, &IF->NdisHandle, &MediaIndex,
+        MediaArray, MAX_MEDIA, NdisProtocolHandle, IF, AdapterName, 0, NULL);
+
+    /* Wait until the adapter is opened */
+    if (NdisStatus == NDIS_STATUS_PENDING)
+        KeWaitForSingleObject(&IF->Event, UserRequest, KernelMode, FALSE, NULL);
+    else if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        ExFreePool(IF);
+        return NdisStatus;
+    }
+
+    IF->Media = MediaArray[MediaIndex];
+
+    /* Fill LAN_ADAPTER structure with some adapter specific information */
+    switch (IF->Media) {
+    case NdisMedium802_3:
+        IF->HWAddressLength = IEEE_802_ADDR_LENGTH;
+        IF->BCastMask       = BCAST_ETH_MASK;
+        IF->BCastCheck      = BCAST_ETH_CHECK;
+        IF->BCastOffset     = BCAST_ETH_OFFSET;
+        IF->HeaderSize      = sizeof(ETH_HEADER);
+        IF->MinFrameSize    = 60;
+        AddressOID          = OID_802_3_CURRENT_ADDRESS;
+        IF->PacketFilter    = 
+            NDIS_PACKET_TYPE_BROADCAST |
+            NDIS_PACKET_TYPE_DIRECTED  |
+            NDIS_PACKET_TYPE_MULTICAST;
+        break;
+
+    default:
+        /* Unsupported media */
+        TI_DbgPrint(MIN_TRACE, ("Unsupported media.\n"));
+        ExFreePool(IF);
+        return NDIS_STATUS_NOT_SUPPORTED;
+    }
+
+    /* Get maximum frame size */
+    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,
+        OID_GEN_MAXIMUM_FRAME_SIZE, &IF->MTU, sizeof(UINT));
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        ExFreePool(IF);
+        return NdisStatus;
+    }
+
+    /* Get maximum packet size */
+    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,
+        OID_GEN_MAXIMUM_TOTAL_SIZE, &IF->MaxPacketSize, sizeof(UINT));
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        TI_DbgPrint(MIN_TRACE, ("Query for maximum packet size failed.\n"));
+        ExFreePool(IF);
+        return NdisStatus;
+    }
+
+    /* Get maximum number of packets we can pass to NdisSend(Packets) at one time */
+    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,
+        OID_GEN_MAXIMUM_SEND_PACKETS, &IF->MaxSendPackets, sizeof(UINT));
+    if (NdisStatus != NDIS_STATUS_SUCCESS)
+        /* Legacy NIC drivers may not support this query, if it fails we
+           assume it can send at least one packet per call to NdisSend(Packets) */
+        IF->MaxSendPackets = 1;
+
+    /* Get current hardware address */
+    NdisStatus = NDISCall(IF, NdisRequestQueryInformation, AddressOID,
+        IF->HWAddress, IF->HWAddressLength);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        TI_DbgPrint(MIN_TRACE, ("Query for current hardware address failed.\n"));
+        ExFreePool(IF);
+        return NdisStatus;
+    }
+
+    /* Get maximum link speed */
+    NdisStatus = NDISCall(IF, NdisRequestQueryInformation,
+        OID_GEN_LINK_SPEED, &Speed, sizeof(UINT));
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        TI_DbgPrint(MIN_TRACE, ("Query for maximum link speed failed.\n"));
+        ExFreePool(IF);
+        return NdisStatus;
+    }
+
+    /* Convert returned link speed to bps (it is in 100bps increments) */
+    IF->Speed = Speed * 100L;
+
+    *Adapter = IF;
+
+    /* Add adapter to the adapter list */
+    IF->Next = Adapters;
+    Adapters = IF;
+
+    /* Bind adapter to IP layer */
+    BindAdapter(IF);
+
+    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+
+NDIS_STATUS LANUnregisterAdapter(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Unregisters protocol with NDIS adapter
+ * ARGUMENTS:
+ *     Adapter = Pointer to a LAN_ADAPTER structure
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    KIRQL OldIrql;
+    NDIS_HANDLE NdisHandle;
+    PLAN_ADAPTER IF, PrevIF;
+    BOOLEAN Found = FALSE;
+    NDIS_STATUS NdisStatus = NDIS_STATUS_SUCCESS;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    /* Search the adapter list for the specified adapter and remove it */
+    IF = Adapters;
+    if (IF) {
+        if (Adapter != Adapters) {
+            PrevIF = IF;
+            while ((IF) && (!Found)) {
+                if (IF == Adapter) {
+                    /* We've found the adapter, now remove it from the list */
+                    PrevIF->Next = IF->Next;
+                    Found = TRUE;
+                }
+                PrevIF = IF;
+                IF = IF->Next;
+            }
+        } else {
+            Adapters = NULL;
+            Found    = TRUE;
+        }
+    }
+    if (!Found) {
+        TI_DbgPrint(MIN_TRACE, ("Leaving (adapter was not in list).\n"));
+        return NDIS_STATUS_ADAPTER_NOT_FOUND;
+    }
+
+    /* Unbind adapter from IP layer */
+    UnbindAdapter(Adapter);
+
+    KeAcquireSpinLock(&Adapter->Lock, &OldIrql);
+    NdisHandle = Adapter->NdisHandle;
+    if (NdisHandle) {
+        Adapter->NdisHandle = NULL;
+        KeReleaseSpinLock(&Adapter->Lock, OldIrql);
+
+        NdisCloseAdapter(&NdisStatus, NdisHandle);
+        if (NdisStatus == NDIS_STATUS_PENDING) {
+            KeWaitForSingleObject(&Adapter->Event,
+                UserRequest, KernelMode, FALSE, NULL);
+            NdisStatus = Adapter->NdisStatus;
+        }
+    } else
+        KeReleaseSpinLock(&Adapter->Lock, OldIrql);
+
+    FreeAdapter(Adapter);
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+
+NTSTATUS LANRegisterProtocol(
+    PSTRING Name)
+/*
+ * FUNCTION: Registers this protocol driver with NDIS
+ * ARGUMENTS:
+ *     Name = Name of this protocol driver
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    NDIS_STATUS NdisStatus;
+    NDIS_PROTOCOL_CHARACTERISTICS ProtChars;
+
+    /* Set up protocol characteristics */
+    RtlZeroMemory(&ProtChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
+    ProtChars.MajorNdisVersion            = NDIS_VERSION_MAJOR;
+    ProtChars.MinorNdisVersion            = NDIS_VERSION_MINOR;
+    ProtChars.Name.Length                 = Name->Length;
+    ProtChars.Name.Buffer                 = (PVOID)Name->Buffer;
+    ProtChars.OpenAdapterCompleteHandler  = ProtocolOpenAdapterComplete;
+    ProtChars.CloseAdapterCompleteHandler = ProtocolCloseAdapterComplete;
+    ProtChars.ResetCompleteHandler        = ProtocolResetComplete;
+    ProtChars.RequestCompleteHandler      = ProtocolRequestComplete;
+    ProtChars.SendCompleteHandler         = ProtocolSendComplete;
+    ProtChars.TransferDataCompleteHandler = ProtocolTransferDataComplete;
+    ProtChars.ReceiveHandler              = ProtocolReceive;
+    ProtChars.ReceiveCompleteHandler      = ProtocolReceiveComplete;
+    ProtChars.StatusHandler               = ProtocolStatus;
+    ProtChars.StatusCompleteHandler       = ProtocolStatusComplete;
+
+       /* Try to register protocol */
+    NdisRegisterProtocol(
+        &NdisStatus, &NdisProtocolHandle, &ProtChars,
+        sizeof(NDIS_PROTOCOL_CHARACTERISTICS) + Name->Length);
+    if (NdisStatus != NDIS_STATUS_SUCCESS)
+        return (NTSTATUS)NdisStatus;
+
+    ProtocolRegistered = TRUE;
+
+    return STATUS_SUCCESS;
+}
+
+
+VOID LANUnregisterProtocol(
+    VOID)
+/*
+ * FUNCTION: Unregisters this protocol driver with NDIS
+ * NOTES: Does not care wether we are already registered
+ */
+{
+    if (ProtocolRegistered) {
+        NDIS_STATUS NdisStatus;
+
+        while (Adapters)
+            NdisStatus = LANUnregisterAdapter(Adapters);
+
+        NdisDeregisterProtocol(&NdisStatus, NdisProtocolHandle);
+        ProtocolRegistered = FALSE;
+    }
+}
+
+/* EOF */
index d42e499..309f98d 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        datalink/loopback.c\r
- * PURPOSE:     Loopback adapter\r
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)\r
- * REVISIONS:\r
- *   CSH 01/08-2000 Created\r
- */\r
-#include <tcpip.h>\r
-#include <loopback.h>\r
-#include <ip.h>\r
-#include <address.h>\r
-#include <receive.h>\r
-#include <transmit.h>\r
-#include <routines.h>\r
-\r
-\r
-WORK_QUEUE_ITEM  LoopWorkItem;\r
-PIP_INTERFACE    Loopback = NULL;\r
-/* Indicates wether the loopback interface is currently transmitting */\r
-BOOLEAN          LoopBusy = FALSE;\r
-/* Loopback transmit queue */\r
-PNDIS_PACKET     LoopQueueHead = (PNDIS_PACKET)NULL;\r
-PNDIS_PACKET     LoopQueueTail = (PNDIS_PACKET)NULL;\r
-/* Spin lock for protecting loopback transmit queue */\r
-KSPIN_LOCK       LoopLock;\r
-\r
-\r
-VOID RealTransmit(\r
-    PVOID Context)\r
-/*\r
- * FUNCTION: Transmits one or more packet(s) in loopback queue to ourselves\r
- * ARGUMENTS:\r
- *     Context = Pointer to context information (loopback interface)\r
- */\r
-{\r
-    KIRQL OldIrql;\r
-    PNDIS_PACKET NdisPacket;\r
-    IP_PACKET IPPacket;\r
-    PNDIS_BUFFER Buffer;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);\r
-\r
-    KeAcquireSpinLockAtDpcLevel(&LoopLock);\r
-\r
-    for (;;) {\r
-        /* Get the next packet from the queue (if any) */\r
-        NdisPacket = LoopQueueHead;\r
-        if (!NdisPacket)\r
-            break;\r
-\r
-        LoopQueueHead = *(PNDIS_PACKET*)NdisPacket->MacReserved;\r
-\r
-        KeReleaseSpinLockFromDpcLevel(&LoopLock);\r
-\r
-        IPPacket.NdisPacket = NdisPacket;\r
-\r
-        NdisGetFirstBufferFromPacket(NdisPacket,\r
-                                    &Buffer,\r
-                                    &IPPacket.Header,\r
-                                    &IPPacket.ContigSize,\r
-                                    &IPPacket.TotalSize);\r
-\r
-        IPReceive(Context, &IPPacket);\r
-\r
-        AdjustPacket(NdisPacket, 0, PC(NdisPacket)->DLOffset);\r
-\r
-        PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS);\r
-\r
-        /* Lower IRQL for a moment to prevent starvation */\r
-        KeLowerIrql(OldIrql);\r
-\r
-        KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);\r
-\r
-        KeAcquireSpinLockAtDpcLevel(&LoopLock);\r
-    }\r
-\r
-    LoopBusy = FALSE;\r
-\r
-    KeReleaseSpinLockFromDpcLevel(&LoopLock);\r
-\r
-    KeLowerIrql(OldIrql);\r
-}\r
-\r
-\r
-VOID LoopTransmit(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    UINT Offset,\r
-    PVOID LinkAddress,\r
-    USHORT Type)\r
-/*\r
- * FUNCTION: Transmits a packet\r
- * ARGUMENTS:\r
- *     Context     = Pointer to context information (NULL)\r
- *     NdisPacket  = Pointer to NDIS packet to send\r
- *     Offset      = Offset in packet where packet data starts\r
- *     LinkAddress = Pointer to link address\r
- *     Type        = LAN protocol type (unused)\r
- */\r
-{\r
-    PNDIS_PACKET *pNdisPacket;\r
-    KIRQL OldIrql;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    /* NDIS send routines don't have an offset argument so we\r
-       must offset the data in upper layers and adjust the\r
-       packet here. We save the offset in the packet context\r
-       area so it can be undone before we release the packet */\r
-    AdjustPacket(NdisPacket, Offset, 0);\r
-    PC(NdisPacket)->DLOffset = Offset;\r
-\r
-    pNdisPacket  = (PNDIS_PACKET*)NdisPacket->MacReserved;\r
-    *pNdisPacket = NULL;\r
-\r
-    KeAcquireSpinLock(&LoopLock, &OldIrql);\r
-\r
-    /* Add packet to transmit queue */\r
-    if (LoopQueueHead) {\r
-        /* Transmit queue is not empty */\r
-        pNdisPacket  = (PNDIS_PACKET*)LoopQueueTail->MacReserved;\r
-        *pNdisPacket = NdisPacket;\r
-    } else\r
-        /* Transmit queue is empty */\r
-        LoopQueueHead = NdisPacket;\r
-\r
-    LoopQueueTail = NdisPacket;\r
-\r
-    /* If LoopTransmit is not running (or scheduled), schedule it to run */\r
-    if (!LoopBusy) {\r
-        ExQueueWorkItem(&LoopWorkItem, CriticalWorkQueue);\r
-        LoopBusy = TRUE;\r
-    }\r
-\r
-    KeReleaseSpinLock(&LoopLock, OldIrql);\r
-}\r
-\r
-\r
-NDIS_STATUS LoopRegisterAdapter(\r
-    PNDIS_STRING AdapterName,\r
-    PLAN_ADAPTER *Adapter)\r
-/*\r
- * FUNCTION: Registers loopback adapter\r
- * ARGUMENTS:\r
- *     AdapterName = Unused\r
- *     Adapter     = Unused\r
- * RETURNS:\r
- *     Status of operation\r
- */\r
-{\r
-    PIP_ADDRESS Address;\r
-    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4);\r
-    if (Address) {\r
-        LLIP_BIND_INFO BindInfo;\r
-\r
-        /* Bind the adapter to IP layer */\r
-        BindInfo.Context       = NULL;\r
-        BindInfo.HeaderSize    = 0;\r
-        BindInfo.MinFrameSize  = 0;\r
-        BindInfo.MTU           = 16384;\r
-        BindInfo.Address       = NULL;\r
-        BindInfo.AddressLength = 0;\r
-        BindInfo.Transmit      = LoopTransmit;\r
-\r
-        Loopback = IPCreateInterface(&BindInfo);\r
-        if ((Loopback) && (IPCreateNTE(Loopback, Address, 8))) {\r
-            /* Reference the interface for the NTE. The reference for\r
-               the address is just passed on to the NTE */\r
-            ReferenceObject(Loopback);\r
-\r
-            IPRegisterInterface(Loopback);\r
-\r
-            ExInitializeWorkItem(&LoopWorkItem, RealTransmit, Loopback);\r
-\r
-            KeInitializeSpinLock(&LoopLock);\r
-            LoopBusy = FALSE;\r
-        } else\r
-            Status = NDIS_STATUS_RESOURCES;\r
-    } else\r
-        Status = NDIS_STATUS_RESOURCES;\r
-\r
-    if (!NT_SUCCESS(Status))\r
-        LoopUnregisterAdapter(NULL);\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));\r
-\r
-    return Status;\r
-}\r
-\r
-\r
-NDIS_STATUS LoopUnregisterAdapter(\r
-    PLAN_ADAPTER Adapter)\r
-/*\r
- * FUNCTION: Unregisters loopback adapter\r
- * ARGUMENTS:\r
- *     Adapter = Unused\r
- * RETURNS:\r
- *     Status of operation\r
- * NOTES:\r
- *     Does not care wether we have registered loopback adapter\r
- */\r
-{\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    if (Loopback) {\r
-        IPUnregisterInterface(Loopback);\r
-        IPDestroyInterface(Loopback);\r
-        Loopback = NULL;\r
-    }\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));\r
-\r
-    return NDIS_STATUS_SUCCESS;\r
-}\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        datalink/loopback.c
+ * PURPOSE:     Loopback adapter
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * REVISIONS:
+ *   CSH 01/08-2000 Created
+ */
+#include <tcpip.h>
+#include <loopback.h>
+#include <ip.h>
+#include <address.h>
+#include <receive.h>
+#include <transmit.h>
+#include <routines.h>
+
+
+WORK_QUEUE_ITEM  LoopWorkItem;
+PIP_INTERFACE    Loopback = NULL;
+/* Indicates wether the loopback interface is currently transmitting */
+BOOLEAN          LoopBusy = FALSE;
+/* Loopback transmit queue */
+PNDIS_PACKET     LoopQueueHead = (PNDIS_PACKET)NULL;
+PNDIS_PACKET     LoopQueueTail = (PNDIS_PACKET)NULL;
+/* Spin lock for protecting loopback transmit queue */
+KSPIN_LOCK       LoopLock;
+
+
+VOID RealTransmit(
+    PVOID Context)
+/*
+ * FUNCTION: Transmits one or more packet(s) in loopback queue to ourselves
+ * ARGUMENTS:
+ *     Context = Pointer to context information (loopback interface)
+ */
+{
+    KIRQL OldIrql;
+    PNDIS_PACKET NdisPacket;
+    IP_PACKET IPPacket;
+    PNDIS_BUFFER Buffer;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+
+    KeAcquireSpinLockAtDpcLevel(&LoopLock);
+
+    for (;;) {
+        /* Get the next packet from the queue (if any) */
+        NdisPacket = LoopQueueHead;
+        if (!NdisPacket)
+            break;
+
+        LoopQueueHead = *(PNDIS_PACKET*)NdisPacket->MacReserved;
+
+        KeReleaseSpinLockFromDpcLevel(&LoopLock);
+
+        IPPacket.NdisPacket = NdisPacket;
+
+        NdisGetFirstBufferFromPacket(NdisPacket,
+                                    &Buffer,
+                                    &IPPacket.Header,
+                                    &IPPacket.ContigSize,
+                                    &IPPacket.TotalSize);
+
+        IPReceive(Context, &IPPacket);
+
+        AdjustPacket(NdisPacket, 0, PC(NdisPacket)->DLOffset);
+
+        PC(NdisPacket)->DLComplete(Context, NdisPacket, NDIS_STATUS_SUCCESS);
+
+        /* Lower IRQL for a moment to prevent starvation */
+        KeLowerIrql(OldIrql);
+
+        KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);
+
+        KeAcquireSpinLockAtDpcLevel(&LoopLock);
+    }
+
+    LoopBusy = FALSE;
+
+    KeReleaseSpinLockFromDpcLevel(&LoopLock);
+
+    KeLowerIrql(OldIrql);
+}
+
+
+VOID LoopTransmit(
+    PVOID Context,
+    PNDIS_PACKET NdisPacket,
+    UINT Offset,
+    PVOID LinkAddress,
+    USHORT Type)
+/*
+ * FUNCTION: Transmits a packet
+ * ARGUMENTS:
+ *     Context     = Pointer to context information (NULL)
+ *     NdisPacket  = Pointer to NDIS packet to send
+ *     Offset      = Offset in packet where packet data starts
+ *     LinkAddress = Pointer to link address
+ *     Type        = LAN protocol type (unused)
+ */
+{
+    PNDIS_PACKET *pNdisPacket;
+    KIRQL OldIrql;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    /* NDIS send routines don't have an offset argument so we
+       must offset the data in upper layers and adjust the
+       packet here. We save the offset in the packet context
+       area so it can be undone before we release the packet */
+    AdjustPacket(NdisPacket, Offset, 0);
+    PC(NdisPacket)->DLOffset = Offset;
+
+    pNdisPacket  = (PNDIS_PACKET*)NdisPacket->MacReserved;
+    *pNdisPacket = NULL;
+
+    KeAcquireSpinLock(&LoopLock, &OldIrql);
+
+    /* Add packet to transmit queue */
+    if (LoopQueueHead) {
+        /* Transmit queue is not empty */
+        pNdisPacket  = (PNDIS_PACKET*)LoopQueueTail->MacReserved;
+        *pNdisPacket = NdisPacket;
+    } else
+        /* Transmit queue is empty */
+        LoopQueueHead = NdisPacket;
+
+    LoopQueueTail = NdisPacket;
+
+    /* If LoopTransmit is not running (or scheduled), schedule it to run */
+    if (!LoopBusy) {
+        ExQueueWorkItem(&LoopWorkItem, CriticalWorkQueue);
+        LoopBusy = TRUE;
+    }
+
+    KeReleaseSpinLock(&LoopLock, OldIrql);
+}
+
+
+NDIS_STATUS LoopRegisterAdapter(
+    PNDIS_STRING AdapterName,
+    PLAN_ADAPTER *Adapter)
+/*
+ * FUNCTION: Registers loopback adapter
+ * ARGUMENTS:
+ *     AdapterName = Unused
+ *     Adapter     = Unused
+ * RETURNS:
+ *     Status of operation
+ */
+{
+    PIP_ADDRESS Address;
+    NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    Address = AddrBuildIPv4(LOOPBACK_ADDRESS_IPv4);
+    if (Address) {
+        LLIP_BIND_INFO BindInfo;
+
+        /* Bind the adapter to IP layer */
+        BindInfo.Context       = NULL;
+        BindInfo.HeaderSize    = 0;
+        BindInfo.MinFrameSize  = 0;
+        BindInfo.MTU           = 16384;
+        BindInfo.Address       = NULL;
+        BindInfo.AddressLength = 0;
+        BindInfo.Transmit      = LoopTransmit;
+
+        Loopback = IPCreateInterface(&BindInfo);
+        if ((Loopback) && (IPCreateNTE(Loopback, Address, 8))) {
+            /* Reference the interface for the NTE. The reference for
+               the address is just passed on to the NTE */
+            ReferenceObject(Loopback);
+
+            IPRegisterInterface(Loopback);
+
+            ExInitializeWorkItem(&LoopWorkItem, RealTransmit, Loopback);
+
+            KeInitializeSpinLock(&LoopLock);
+            LoopBusy = FALSE;
+        } else
+            Status = NDIS_STATUS_RESOURCES;
+    } else
+        Status = NDIS_STATUS_RESOURCES;
+
+    if (!NT_SUCCESS(Status))
+        LoopUnregisterAdapter(NULL);
+
+    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+
+    return Status;
+}
+
+
+NDIS_STATUS LoopUnregisterAdapter(
+    PLAN_ADAPTER Adapter)
+/*
+ * FUNCTION: Unregisters loopback adapter
+ * ARGUMENTS:
+ *     Adapter = Unused
+ * RETURNS:
+ *     Status of operation
+ * NOTES:
+ *     Does not care wether we have registered loopback adapter
+ */
+{
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    if (Loopback) {
+        IPUnregisterInterface(Loopback);
+        IPDestroyInterface(Loopback);
+        Loopback = NULL;
+    }
+
+    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+/* EOF */
index aeb953d..c883591 100644 (file)
@@ -1,63 +1,63 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/address.h\r
- * PURPOSE:     Address manipulation prototypes\r
- */\r
-#ifndef __ADDRESS_H\r
-#define __ADDRESS_H\r
-\r
-\r
-/*\r
- * Initialize an IPv4 style address\r
- * VOID AddrInitIPv4(\r
- *     PIP_ADDRESS IPAddress,\r
- *     IPv4_RAW_ADDRESS RawAddress)\r
- */\r
-#define AddrInitIPv4(IPAddress, RawAddress)           \\r
-{                                                     \\r
-    (IPAddress)->RefCount            = 1;             \\r
-    (IPAddress)->Type                = IP_ADDRESS_V4; \\r
-    (IPAddress)->Address.IPv4Address = (RawAddress);  \\r
-}\r
-\r
-\r
-BOOLEAN AddrIsUnspecified(\r
-    PIP_ADDRESS Address);\r
-\r
-NTSTATUS AddrGetAddress(\r
-    PTRANSPORT_ADDRESS AddrList,\r
-    PIP_ADDRESS *Address,\r
-    PUSHORT Port,\r
-    PIP_ADDRESS *Cache);\r
-\r
-BOOLEAN AddrIsEqual(\r
-    PIP_ADDRESS Address1,\r
-    PIP_ADDRESS Address2);\r
-\r
-INT AddrCompare(\r
-    PIP_ADDRESS Address1,\r
-    PIP_ADDRESS Address2);\r
-\r
-BOOLEAN AddrIsEqualIPv4(\r
-    PIP_ADDRESS Address1,\r
-    IPv4_RAW_ADDRESS Address2);\r
-\r
-PIP_ADDRESS AddrBuildIPv4(\r
-    IPv4_RAW_ADDRESS Address);\r
-\r
-PADDRESS_ENTRY AddrLocateADEv4(\r
-    IPv4_RAW_ADDRESS Address);\r
-\r
-PADDRESS_FILE AddrSearchFirst(\r
-    PIP_ADDRESS Address,\r
-    USHORT Port,\r
-    USHORT Protocol,\r
-    PAF_SEARCH SearchContext);\r
-\r
-PADDRESS_FILE AddrSearchNext(\r
-    PAF_SEARCH SearchContext);\r
-\r
-#endif /* __ADDRESS_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/address.h
+ * PURPOSE:     Address manipulation prototypes
+ */
+#ifndef __ADDRESS_H
+#define __ADDRESS_H
+
+
+/*
+ * Initialize an IPv4 style address
+ * VOID AddrInitIPv4(
+ *     PIP_ADDRESS IPAddress,
+ *     IPv4_RAW_ADDRESS RawAddress)
+ */
+#define AddrInitIPv4(IPAddress, RawAddress)           \
+{                                                     \
+    (IPAddress)->RefCount            = 1;             \
+    (IPAddress)->Type                = IP_ADDRESS_V4; \
+    (IPAddress)->Address.IPv4Address = (RawAddress);  \
+}
+
+
+BOOLEAN AddrIsUnspecified(
+    PIP_ADDRESS Address);
+
+NTSTATUS AddrGetAddress(
+    PTRANSPORT_ADDRESS AddrList,
+    PIP_ADDRESS *Address,
+    PUSHORT Port,
+    PIP_ADDRESS *Cache);
+
+BOOLEAN AddrIsEqual(
+    PIP_ADDRESS Address1,
+    PIP_ADDRESS Address2);
+
+INT AddrCompare(
+    PIP_ADDRESS Address1,
+    PIP_ADDRESS Address2);
+
+BOOLEAN AddrIsEqualIPv4(
+    PIP_ADDRESS Address1,
+    IPv4_RAW_ADDRESS Address2);
+
+PIP_ADDRESS AddrBuildIPv4(
+    IPv4_RAW_ADDRESS Address);
+
+PADDRESS_ENTRY AddrLocateADEv4(
+    IPv4_RAW_ADDRESS Address);
+
+PADDRESS_FILE AddrSearchFirst(
+    PIP_ADDRESS Address,
+    USHORT Port,
+    USHORT Protocol,
+    PAF_SEARCH SearchContext);
+
+PADDRESS_FILE AddrSearchNext(
+    PAF_SEARCH SearchContext);
+
+#endif /* __ADDRESS_H */
+
+/* EOF */
index b33ad14..bd1c6bf 100644 (file)
@@ -1,37 +1,37 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/arp.h\r
- * PURPOSE:     Address Resolution Protocol definitions\r
- */\r
-#ifndef __ARP_H\r
-#define __ARP_H\r
-\r
-typedef struct ARP_HEADER {\r
-    USHORT HWType;       /* Hardware Type */\r
-    USHORT ProtoType;    /* Protocol Type */\r
-    UCHAR  HWAddrLen;    /* Hardware Address Length */\r
-    UCHAR  ProtoAddrLen; /* Protocol Address Length */\r
-    USHORT Opcode;       /* Opcode */\r
-    /* Sender's Hardware Address */\r
-    /* Sender's Protocol Address */\r
-    /* Target's Hardware Address */\r
-    /* Target's Protocol Address */\r
-} ARP_HEADER, *PARP_HEADER;\r
-\r
-/* We swap constants so we can compare values at runtime without swapping them */\r
-#define ARP_OPCODE_REQUEST WH2N(0x0001) /* ARP request */\r
-#define ARP_OPCODE_REPLY   WH2N(0x0002) /* ARP reply */\r
-\r
-\r
-BOOLEAN ARPTransmit(\r
-    PIP_ADDRESS Address,\r
-    PNET_TABLE_ENTRY NTE);\r
-\r
-VOID ARPReceive(\r
-    PVOID Context,\r
-    PIP_PACKET Packet);\r
-\r
-#endif /* __ARP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/arp.h
+ * PURPOSE:     Address Resolution Protocol definitions
+ */
+#ifndef __ARP_H
+#define __ARP_H
+
+typedef struct ARP_HEADER {
+    USHORT HWType;       /* Hardware Type */
+    USHORT ProtoType;    /* Protocol Type */
+    UCHAR  HWAddrLen;    /* Hardware Address Length */
+    UCHAR  ProtoAddrLen; /* Protocol Address Length */
+    USHORT Opcode;       /* Opcode */
+    /* Sender's Hardware Address */
+    /* Sender's Protocol Address */
+    /* Target's Hardware Address */
+    /* Target's Protocol Address */
+} ARP_HEADER, *PARP_HEADER;
+
+/* We swap constants so we can compare values at runtime without swapping them */
+#define ARP_OPCODE_REQUEST WH2N(0x0001) /* ARP request */
+#define ARP_OPCODE_REPLY   WH2N(0x0002) /* ARP reply */
+
+
+BOOLEAN ARPTransmit(
+    PIP_ADDRESS Address,
+    PNET_TABLE_ENTRY NTE);
+
+VOID ARPReceive(
+    PVOID Context,
+    PIP_PACKET Packet);
+
+#endif /* __ARP_H */
+
+/* EOF */
index 5805b51..e23c0a5 100644 (file)
@@ -1,27 +1,27 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/checksum.h\r
- * PURPOSE:     Checksum routine definitions\r
- */\r
-#ifndef __CHECKSUM_H\r
-#define __CHECKSUM_H\r
-\r
-\r
-ULONG ChecksumCompute(\r
-    PVOID Data,\r
-    UINT Count,\r
-    ULONG Seed);\r
-\r
-#define IPv4Checksum(Data, Count, Seed)(ChecksumCompute(Data, Count, Seed))\r
-\r
-/*\r
- * Macro to check for a correct checksum\r
- * BOOLEAN CorrectChecksum(PVOID Data, UINT Count)\r
- */\r
-#define CorrectChecksum(Data, Count) \\r
-    (BOOLEAN)(IPv4Checksum(Data, Count, 0) == DH2N(0x0000FFFF))\r
-\r
-#endif /* __CHECKSUM_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/checksum.h
+ * PURPOSE:     Checksum routine definitions
+ */
+#ifndef __CHECKSUM_H
+#define __CHECKSUM_H
+
+
+ULONG ChecksumCompute(
+    PVOID Data,
+    UINT Count,
+    ULONG Seed);
+
+#define IPv4Checksum(Data, Count, Seed)(ChecksumCompute(Data, Count, Seed))
+
+/*
+ * Macro to check for a correct checksum
+ * BOOLEAN CorrectChecksum(PVOID Data, UINT Count)
+ */
+#define CorrectChecksum(Data, Count) \
+    (BOOLEAN)(IPv4Checksum(Data, Count, 0) == DH2N(0x0000FFFF))
+
+#endif /* __CHECKSUM_H */
+
+/* EOF */
index 3dd3a79..9dc7e65 100644 (file)
@@ -1,49 +1,49 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/datagram.h\r
- * PURPOSE:     Datagram types and constants\r
- */\r
-#ifndef __DATAGRAM_H\r
-#define __DATAGRAM_H\r
-\r
-#include <titypes.h>\r
-\r
-\r
-VOID DGSend(\r
-    PVOID Context,\r
-    PDATAGRAM_SEND_REQUEST SendRequest);\r
-\r
-VOID DGCancelSendRequest(\r
-    PADDRESS_FILE AddrFile,\r
-    PVOID Context);\r
-\r
-VOID DGCancelReceiveRequest(\r
-    PADDRESS_FILE AddrFile,\r
-    PVOID Context);\r
-\r
-NTSTATUS DGSendDatagram(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG DataSize,\r
-    DATAGRAM_BUILD_ROUTINE Build);\r
-\r
-NTSTATUS DGReceiveDatagram(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG ReceiveLength,\r
-    ULONG ReceiveFlags,\r
-    PTDI_CONNECTION_INFORMATION ReturnInfo,\r
-    PULONG BytesReceived);\r
-\r
-NTSTATUS DGStartup(\r
-    VOID);\r
-\r
-NTSTATUS DGShutdown(\r
-    VOID);\r
-\r
-#endif /* __DATAGRAM_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/datagram.h
+ * PURPOSE:     Datagram types and constants
+ */
+#ifndef __DATAGRAM_H
+#define __DATAGRAM_H
+
+#include <titypes.h>
+
+
+VOID DGSend(
+    PVOID Context,
+    PDATAGRAM_SEND_REQUEST SendRequest);
+
+VOID DGCancelSendRequest(
+    PADDRESS_FILE AddrFile,
+    PVOID Context);
+
+VOID DGCancelReceiveRequest(
+    PADDRESS_FILE AddrFile,
+    PVOID Context);
+
+NTSTATUS DGSendDatagram(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG DataSize,
+    DATAGRAM_BUILD_ROUTINE Build);
+
+NTSTATUS DGReceiveDatagram(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG ReceiveLength,
+    ULONG ReceiveFlags,
+    PTDI_CONNECTION_INFORMATION ReturnInfo,
+    PULONG BytesReceived);
+
+NTSTATUS DGStartup(
+    VOID);
+
+NTSTATUS DGShutdown(
+    VOID);
+
+#endif /* __DATAGRAM_H */
+
+/* EOF */
index a296d5f..b86b620 100644 (file)
@@ -1,99 +1,99 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/debug.h\r
- * PURPOSE:     Debugging support macros\r
- * DEFINES:     DBG     - Enable debug output\r
- *              NASSERT - Disable assertions\r
- */\r
-#ifndef __DEBUG_H\r
-#define __DEBUG_H\r
-\r
-#define NORMAL_MASK    0x000000FF\r
-#define SPECIAL_MASK   0xFFFFFF00\r
-#define MIN_TRACE      0x00000001\r
-#define MID_TRACE      0x00000002\r
-#define MAX_TRACE      0x00000003\r
-\r
-#define DEBUG_MEMORY   0x00000100\r
-#define DEBUG_BUFFER   0x00000200\r
-#define DEBUG_IRP      0x00000400\r
-#define DEBUG_REFCOUNT 0x00000800\r
-#define DEBUG_ADDRFILE 0x00001000\r
-#define DEBUG_IP       0x00002000\r
-#define DEBUG_ROUTER   0x00004000\r
-#define DEBUG_RCACHE   0x00008000\r
-#define DEBUG_NCACHE   0x00010000\r
-#define DEBUG_ULTRA    0xFFFFFFFF\r
-\r
-#ifdef DBG\r
-\r
-extern DWORD DebugTraceLevel;\r
-\r
-#ifdef _MSC_VER\r
-\r
-#define TI_DbgPrint(_t_, _x_) \\r
-    if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \\r
-        ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \\r
-        DbgPrint("(%s:%d) ", __FILE__, __LINE__); \\r
-        DbgPrint _x_ ; \\r
-    }\r
-\r
-#else /* _MSC_VER */\r
-\r
-#define TI_DbgPrint(_t_, _x_) \\r
-    if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \\r
-        ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \\r
-        DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \\r
-        DbgPrint _x_ ; \\r
-    }\r
-\r
-#endif /* _MSC_VER */\r
-\r
-#ifdef ASSERT\r
-#undef ASSERT\r
-#endif\r
-\r
-#ifdef NASSERT\r
-#define ASSERT(x)\r
-#else /* NASSERT */\r
-#define ASSERT(x) if (!(x)) { TI_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); }\r
-#endif /* NASSERT */\r
-\r
-#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))\r
-\r
-#else /* DBG */\r
-\r
-#define TI_DbgPrint(_t_, _x_)\r
-\r
-#define ASSERT_IRQL(x)\r
-#define ASSERT(x)\r
-\r
-#endif /* DBG */\r
-\r
-\r
-#define assert(x) ASSERT(x)\r
-#define assert_irql(x) ASSERT_IRQL(x)\r
-\r
-\r
-#ifdef _MSC_VER\r
-\r
-#define UNIMPLEMENTED \\r
-    TI_DbgPrint(MIN_TRACE, ("The function at %s:%d is unimplemented, \\r
-        but come back another day.\n", __FILE__, __LINE__));\r
-\r
-#else /* _MSC_VER */\r
-\r
-#define UNIMPLEMENTED \\r
-    TI_DbgPrint(MIN_TRACE, ("(%s:%d)(%s) is unimplemented, \\r
-        but come back another day.\n", __FILE__, __LINE__, __FUNCTION__));\r
-\r
-#endif /* _MSC_VER */\r
-\r
-\r
-#define CHECKPOINT \\r
-    do { TI_DbgPrint(MIN_TRACE, ("(%s:%d)\n", __FILE__, __LINE__)); } while(0);\r
-\r
-#endif /* __DEBUG_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/debug.h
+ * PURPOSE:     Debugging support macros
+ * DEFINES:     DBG     - Enable debug output
+ *              NASSERT - Disable assertions
+ */
+#ifndef __DEBUG_H
+#define __DEBUG_H
+
+#define NORMAL_MASK    0x000000FF
+#define SPECIAL_MASK   0xFFFFFF00
+#define MIN_TRACE      0x00000001
+#define MID_TRACE      0x00000002
+#define MAX_TRACE      0x00000003
+
+#define DEBUG_MEMORY   0x00000100
+#define DEBUG_BUFFER   0x00000200
+#define DEBUG_IRP      0x00000400
+#define DEBUG_REFCOUNT 0x00000800
+#define DEBUG_ADDRFILE 0x00001000
+#define DEBUG_IP       0x00002000
+#define DEBUG_ROUTER   0x00004000
+#define DEBUG_RCACHE   0x00008000
+#define DEBUG_NCACHE   0x00010000
+#define DEBUG_ULTRA    0xFFFFFFFF
+
+#ifdef DBG
+
+extern DWORD DebugTraceLevel;
+
+#ifdef _MSC_VER
+
+#define TI_DbgPrint(_t_, _x_) \
+    if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
+        ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
+        DbgPrint("(%s:%d) ", __FILE__, __LINE__); \
+        DbgPrint _x_ ; \
+    }
+
+#else /* _MSC_VER */
+
+#define TI_DbgPrint(_t_, _x_) \
+    if (((DebugTraceLevel & NORMAL_MASK) >= _t_) || \
+        ((DebugTraceLevel & _t_) > NORMAL_MASK)) { \
+        DbgPrint("(%s:%d)(%s) ", __FILE__, __LINE__, __FUNCTION__); \
+        DbgPrint _x_ ; \
+    }
+
+#endif /* _MSC_VER */
+
+#ifdef ASSERT
+#undef ASSERT
+#endif
+
+#ifdef NASSERT
+#define ASSERT(x)
+#else /* NASSERT */
+#define ASSERT(x) if (!(x)) { TI_DbgPrint(MIN_TRACE, ("Assertion "#x" failed at %s:%d\n", __FILE__, __LINE__)); KeBugCheck(0); }
+#endif /* NASSERT */
+
+#define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x))
+
+#else /* DBG */
+
+#define TI_DbgPrint(_t_, _x_)
+
+#define ASSERT_IRQL(x)
+#define ASSERT(x)
+
+#endif /* DBG */
+
+
+#define assert(x) ASSERT(x)
+#define assert_irql(x) ASSERT_IRQL(x)
+
+
+#ifdef _MSC_VER
+
+#define UNIMPLEMENTED \
+    TI_DbgPrint(MIN_TRACE, ("The function at %s:%d is unimplemented, \
+        but come back another day.\n", __FILE__, __LINE__));
+
+#else /* _MSC_VER */
+
+#define UNIMPLEMENTED \
+    TI_DbgPrint(MIN_TRACE, ("(%s:%d)(%s) is unimplemented, \
+        but come back another day.\n", __FILE__, __LINE__, __FUNCTION__));
+
+#endif /* _MSC_VER */
+
+
+#define CHECKPOINT \
+    do { TI_DbgPrint(MIN_TRACE, ("(%s:%d)\n", __FILE__, __LINE__)); } while(0);
+
+#endif /* __DEBUG_H */
+
+/* EOF */
index 9f70485..5108ff5 100644 (file)
@@ -1,61 +1,61 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/dispatch.h\r
- * PURPOSE:     Dispatch routine prototypes\r
- */\r
-#ifndef __DISPATCH_H\r
-#define __DISPATCH_H\r
-\r
-\r
-NTSTATUS DispTdiAccept(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiAssociateAddress(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiConnect(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiDisassociateAddress(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiDisconnect(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiListen(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiQueryInformation(\r
-    PDEVICE_OBJECT DeviceObject,\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiReceive(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiReceiveDatagram(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiSend(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiSendDatagram(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiSetEventHandler(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiSetInformation(\r
-    PIRP Irp);\r
-\r
-NTSTATUS DispTdiQueryInformationEx(\r
-    PIRP Irp,\r
-    PIO_STACK_LOCATION IrpSp);\r
-\r
-NTSTATUS DispTdiSetInformationEx(\r
-    PIRP Irp,\r
-    PIO_STACK_LOCATION IrpSp);\r
-\r
-#endif /* __DISPATCH_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/dispatch.h
+ * PURPOSE:     Dispatch routine prototypes
+ */
+#ifndef __DISPATCH_H
+#define __DISPATCH_H
+
+
+NTSTATUS DispTdiAccept(
+    PIRP Irp);
+
+NTSTATUS DispTdiAssociateAddress(
+    PIRP Irp);
+
+NTSTATUS DispTdiConnect(
+    PIRP Irp);
+
+NTSTATUS DispTdiDisassociateAddress(
+    PIRP Irp);
+
+NTSTATUS DispTdiDisconnect(
+    PIRP Irp);
+
+NTSTATUS DispTdiListen(
+    PIRP Irp);
+
+NTSTATUS DispTdiQueryInformation(
+    PDEVICE_OBJECT DeviceObject,
+    PIRP Irp);
+
+NTSTATUS DispTdiReceive(
+    PIRP Irp);
+
+NTSTATUS DispTdiReceiveDatagram(
+    PIRP Irp);
+
+NTSTATUS DispTdiSend(
+    PIRP Irp);
+
+NTSTATUS DispTdiSendDatagram(
+    PIRP Irp);
+
+NTSTATUS DispTdiSetEventHandler(
+    PIRP Irp);
+
+NTSTATUS DispTdiSetInformation(
+    PIRP Irp);
+
+NTSTATUS DispTdiQueryInformationEx(
+    PIRP Irp,
+    PIO_STACK_LOCATION IrpSp);
+
+NTSTATUS DispTdiSetInformationEx(
+    PIRP Irp,
+    PIO_STACK_LOCATION IrpSp);
+
+#endif /* __DISPATCH_H */
+
+/* EOF */
index e69e5fe..caef8e8 100644 (file)
@@ -1,32 +1,32 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/fileobjs.h\r
- * PURPOSE:     File object routine prototypes\r
- */\r
-#ifndef __FILEOBJS_H\r
-#define __FILEOBJS_H\r
-\r
-\r
-extern LIST_ENTRY AddressFileListHead;\r
-extern KSPIN_LOCK AddressFileListLock;\r
-\r
-\r
-NTSTATUS FileOpenAddress(\r
-    PTDI_REQUEST Request,\r
-    PTA_ADDRESS_IP AddrList,\r
-    USHORT Protocol,\r
-    PVOID Options);\r
-\r
-NTSTATUS FileCloseAddress(\r
-    PTDI_REQUEST Request);\r
-\r
-NTSTATUS FileCloseConnection(\r
-    PTDI_REQUEST Request);\r
-\r
-NTSTATUS FileCloseControlChannel(\r
-    PTDI_REQUEST Request);\r
-\r
-#endif /* __FILEOBJS_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/fileobjs.h
+ * PURPOSE:     File object routine prototypes
+ */
+#ifndef __FILEOBJS_H
+#define __FILEOBJS_H
+
+
+extern LIST_ENTRY AddressFileListHead;
+extern KSPIN_LOCK AddressFileListLock;
+
+
+NTSTATUS FileOpenAddress(
+    PTDI_REQUEST Request,
+    PTA_ADDRESS_IP AddrList,
+    USHORT Protocol,
+    PVOID Options);
+
+NTSTATUS FileCloseAddress(
+    PTDI_REQUEST Request);
+
+NTSTATUS FileCloseConnection(
+    PTDI_REQUEST Request);
+
+NTSTATUS FileCloseControlChannel(
+    PTDI_REQUEST Request);
+
+#endif /* __FILEOBJS_H */
+
+/* EOF */
index 225e62d..10bd22c 100644 (file)
@@ -1,68 +1,68 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/icmp.h\r
- * PURPOSE:     Internet Control Message Protocol definitions\r
- */\r
-#ifndef __ICMP_H\r
-#define __ICMP_H\r
-\r
-typedef struct ICMP_HEADER {\r
-    UCHAR Type;      /* ICMP message type */\r
-    UCHAR Code;      /* ICMP message code */\r
-    USHORT Checksum; /* ICMP message checksum */\r
-    ULONG Unused;    /* ICMP unused */\r
-} ICMP_HEADER, *PICMP_HEADER;\r
-\r
-/* ICMP message types */\r
-#define ICMP_TYPE_ECHO_REPLY        0  /* Echo reply */\r
-#define ICMP_TYPE_DEST_UNREACH      3  /* Destination unreachable */\r
-#define ICMP_TYPE_SOURCE_QUENCH     4  /* Source quench */\r
-#define ICMP_TYPE_REDIRECT          5  /* Redirect */\r
-#define ICMP_TYPE_ECHO_REQUEST      8  /* Echo request */\r
-#define ICMP_TYPE_TIME_EXCEEDED     11 /* Time exceeded */\r
-#define ICMP_TYPE_PARAMETER         12 /* Parameter problem */\r
-#define ICMP_TYPE_TIMESTAMP_REQUEST 13 /* Timestamp request */\r
-#define ICMP_TYPE_TIMESTAMP_REPLY   14 /* Timestamp reply */\r
-#define ICMP_TYPE_INFO_REQUEST      15 /* Information request */\r
-#define ICMP_TYPE_INFO_REPLY        16 /* Information reply */\r
-\r
-/* ICMP codes for ICMP_TYPE_DEST_UNREACH */\r
-#define ICMP_CODE_DU_NET_UNREACH         0 /* Network unreachable */\r
-#define ICMP_CODE_DU_HOST_UNREACH        1 /* Host unreachable */\r
-#define ICMP_CODE_DU_PROTOCOL_UNREACH    2 /* Protocol unreachable */\r
-#define ICMP_CODE_DU_PORT_UNREACH        3 /* Port unreachable */\r
-#define ICMP_CODE_DU_FRAG_DF_SET         4 /* Fragmentation needed and DF set */\r
-#define ICMP_CODE_DU_SOURCE_ROUTE_FAILED 5 /* Source route failed */\r
-\r
-/* ICMP codes for ICMP_TYPE_REDIRECT */\r
-#define ICMP_CODE_RD_NET      0 /* Redirect datagrams for the network */\r
-#define ICMP_CODE_RD_HOST     1 /* Redirect datagrams for the host */\r
-#define ICMP_CODE_RD_TOS_NET  2 /* Redirect datagrams for the Type of Service and network */\r
-#define ICMP_CODE_RD_TOS_HOST 3 /* Redirect datagrams for the Type of Service and host */\r
-\r
-/* ICMP codes for ICMP_TYPE_TIME_EXCEEDED */\r
-#define ICMP_CODE_TE_TTL        0 /* Time to live exceeded in transit */\r
-#define ICMP_CODE_TE_REASSEMBLY 1 /* Fragment reassembly time exceeded */\r
-\r
-/* ICMP codes for ICMP_TYPE_PARAMETER */\r
-#define ICMP_CODE_TP_POINTER 1 /* Pointer indicates the error */\r
-\r
-\r
-VOID ICMPReceive(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket);\r
-\r
-VOID ICMPTransmit(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket);\r
-\r
-VOID ICMPReply(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket,\r
-       UCHAR Type,\r
-       UCHAR Code);\r
-\r
-#endif /* __ICMP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/icmp.h
+ * PURPOSE:     Internet Control Message Protocol definitions
+ */
+#ifndef __ICMP_H
+#define __ICMP_H
+
+typedef struct ICMP_HEADER {
+    UCHAR Type;      /* ICMP message type */
+    UCHAR Code;      /* ICMP message code */
+    USHORT Checksum; /* ICMP message checksum */
+    ULONG Unused;    /* ICMP unused */
+} ICMP_HEADER, *PICMP_HEADER;
+
+/* ICMP message types */
+#define ICMP_TYPE_ECHO_REPLY        0  /* Echo reply */
+#define ICMP_TYPE_DEST_UNREACH      3  /* Destination unreachable */
+#define ICMP_TYPE_SOURCE_QUENCH     4  /* Source quench */
+#define ICMP_TYPE_REDIRECT          5  /* Redirect */
+#define ICMP_TYPE_ECHO_REQUEST      8  /* Echo request */
+#define ICMP_TYPE_TIME_EXCEEDED     11 /* Time exceeded */
+#define ICMP_TYPE_PARAMETER         12 /* Parameter problem */
+#define ICMP_TYPE_TIMESTAMP_REQUEST 13 /* Timestamp request */
+#define ICMP_TYPE_TIMESTAMP_REPLY   14 /* Timestamp reply */
+#define ICMP_TYPE_INFO_REQUEST      15 /* Information request */
+#define ICMP_TYPE_INFO_REPLY        16 /* Information reply */
+
+/* ICMP codes for ICMP_TYPE_DEST_UNREACH */
+#define ICMP_CODE_DU_NET_UNREACH         0 /* Network unreachable */
+#define ICMP_CODE_DU_HOST_UNREACH        1 /* Host unreachable */
+#define ICMP_CODE_DU_PROTOCOL_UNREACH    2 /* Protocol unreachable */
+#define ICMP_CODE_DU_PORT_UNREACH        3 /* Port unreachable */
+#define ICMP_CODE_DU_FRAG_DF_SET         4 /* Fragmentation needed and DF set */
+#define ICMP_CODE_DU_SOURCE_ROUTE_FAILED 5 /* Source route failed */
+
+/* ICMP codes for ICMP_TYPE_REDIRECT */
+#define ICMP_CODE_RD_NET      0 /* Redirect datagrams for the network */
+#define ICMP_CODE_RD_HOST     1 /* Redirect datagrams for the host */
+#define ICMP_CODE_RD_TOS_NET  2 /* Redirect datagrams for the Type of Service and network */
+#define ICMP_CODE_RD_TOS_HOST 3 /* Redirect datagrams for the Type of Service and host */
+
+/* ICMP codes for ICMP_TYPE_TIME_EXCEEDED */
+#define ICMP_CODE_TE_TTL        0 /* Time to live exceeded in transit */
+#define ICMP_CODE_TE_REASSEMBLY 1 /* Fragment reassembly time exceeded */
+
+/* ICMP codes for ICMP_TYPE_PARAMETER */
+#define ICMP_CODE_TP_POINTER 1 /* Pointer indicates the error */
+
+
+VOID ICMPReceive(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket);
+
+VOID ICMPTransmit(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket);
+
+VOID ICMPReply(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket,
+       UCHAR Type,
+       UCHAR Code);
+
+#endif /* __ICMP_H */
+
+/* EOF */
index 1fd37d6..a1b4f67 100644 (file)
@@ -1,93 +1,93 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/info.h\r
- * PURPOSE:     TdiQueryInformation definitions\r
- */\r
-#ifndef __INFO_H\r
-#define __INFO_H\r
-\r
-\r
-typedef struct IPSNMP_INFO {\r
-       ULONG Forwarding;\r
-       ULONG DefaultTTL;\r
-       ULONG InReceives;\r
-       ULONG InHdrErrors;\r
-       ULONG InAddrErrors;\r
-       ULONG ForwDatagrams;\r
-       ULONG InUnknownProtos;\r
-       ULONG InDiscards;\r
-       ULONG InDelivers;\r
-       ULONG OutRequests;\r
-       ULONG RoutingDiscards;\r
-       ULONG OutDiscards;\r
-       ULONG OutNoRoutes;\r
-       ULONG ReasmTimeout;\r
-       ULONG ReasmReqds;\r
-       ULONG ReasmOks;\r
-       ULONG ReasmFails;\r
-       ULONG FragOks;\r
-       ULONG FragFails;\r
-       ULONG FragCreates;\r
-       ULONG NumIf;\r
-       ULONG NumAddr;\r
-       ULONG NumRoutes;\r
-} IPSNMP_INFO, *PIPSNMP_INFO;\r
-\r
-typedef struct IPADDR_ENTRY {\r
-       ULONG  Addr;\r
-       ULONG  Index;\r
-       ULONG  Mask;\r
-       ULONG  BcastAddr;\r
-       ULONG  ReasmSize;\r
-       USHORT Context;\r
-       USHORT Pad;\r
-} IPADDR_ENTRY, *PIPADDR_ENTRY;\r
-\r
-#define        IP_MIB_STATS_ID           1\r
-#define        IP_MIB_ADDRTABLE_ENTRY_ID 0x102\r
-\r
-#define        MAX_PHYSADDR_SIZE 8\r
-\r
-\r
-/* Only UDP is supported */\r
-#define TDI_SERVICE_FLAGS (TDI_SERVICE_CONNECTIONLESS_MODE | \\r
-                           TDI_SERVICE_BROADCAST_SUPPORTED)\r
-\r
-#define TCP_MIB_STAT_ID     1\r
-#define UDP_MIB_STAT_ID     1\r
-#define TCP_MIB_TABLE_ID    0x101\r
-#define UDP_MIB_TABLE_ID    0x101\r
-\r
-#define TL_INSTANCE 0\r
-\r
-\r
-typedef struct ADDRESS_INFO {\r
-    ULONG LocalAddress;\r
-    ULONG LocalPort;\r
-} ADDRESS_INFO, *PADDRESS_INFO;\r
-\r
-typedef union TDI_INFO {\r
-    TDI_CONNECTION_INFO ConnInfo;\r
-    TDI_ADDRESS_INFO AddrInfo;\r
-    TDI_PROVIDER_INFO ProviderInfo;\r
-    TDI_PROVIDER_STATISTICS ProviderStats;\r
-} TDI_INFO, *PTDI_INFO;\r
-\r
-\r
-TDI_STATUS InfoTdiQueryInformationEx(\r
-    PTDI_REQUEST Request,\r
-    TDIObjectID *ID,\r
-    PNDIS_BUFFER Buffer,\r
-    PUINT BufferSize,\r
-    PVOID Context);\r
-\r
-TDI_STATUS InfoTdiSetInformationEx(\r
-    PTDI_REQUEST Request,\r
-    TDIObjectID *ID,\r
-    PVOID Buffer,\r
-    UINT BufferSize);\r
-\r
-#endif /* __INFO_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/info.h
+ * PURPOSE:     TdiQueryInformation definitions
+ */
+#ifndef __INFO_H
+#define __INFO_H
+
+
+typedef struct IPSNMP_INFO {
+       ULONG Forwarding;
+       ULONG DefaultTTL;
+       ULONG InReceives;
+       ULONG InHdrErrors;
+       ULONG InAddrErrors;
+       ULONG ForwDatagrams;
+       ULONG InUnknownProtos;
+       ULONG InDiscards;
+       ULONG InDelivers;
+       ULONG OutRequests;
+       ULONG RoutingDiscards;
+       ULONG OutDiscards;
+       ULONG OutNoRoutes;
+       ULONG ReasmTimeout;
+       ULONG ReasmReqds;
+       ULONG ReasmOks;
+       ULONG ReasmFails;
+       ULONG FragOks;
+       ULONG FragFails;
+       ULONG FragCreates;
+       ULONG NumIf;
+       ULONG NumAddr;
+       ULONG NumRoutes;
+} IPSNMP_INFO, *PIPSNMP_INFO;
+
+typedef struct IPADDR_ENTRY {
+       ULONG  Addr;
+       ULONG  Index;
+       ULONG  Mask;
+       ULONG  BcastAddr;
+       ULONG  ReasmSize;
+       USHORT Context;
+       USHORT Pad;
+} IPADDR_ENTRY, *PIPADDR_ENTRY;
+
+#define        IP_MIB_STATS_ID           1
+#define        IP_MIB_ADDRTABLE_ENTRY_ID 0x102
+
+#define        MAX_PHYSADDR_SIZE 8
+
+
+/* Only UDP is supported */
+#define TDI_SERVICE_FLAGS (TDI_SERVICE_CONNECTIONLESS_MODE | \
+                           TDI_SERVICE_BROADCAST_SUPPORTED)
+
+#define TCP_MIB_STAT_ID     1
+#define UDP_MIB_STAT_ID     1
+#define TCP_MIB_TABLE_ID    0x101
+#define UDP_MIB_TABLE_ID    0x101
+
+#define TL_INSTANCE 0
+
+
+typedef struct ADDRESS_INFO {
+    ULONG LocalAddress;
+    ULONG LocalPort;
+} ADDRESS_INFO, *PADDRESS_INFO;
+
+typedef union TDI_INFO {
+    TDI_CONNECTION_INFO ConnInfo;
+    TDI_ADDRESS_INFO AddrInfo;
+    TDI_PROVIDER_INFO ProviderInfo;
+    TDI_PROVIDER_STATISTICS ProviderStats;
+} TDI_INFO, *PTDI_INFO;
+
+
+TDI_STATUS InfoTdiQueryInformationEx(
+    PTDI_REQUEST Request,
+    TDIObjectID *ID,
+    PNDIS_BUFFER Buffer,
+    PUINT BufferSize,
+    PVOID Context);
+
+TDI_STATUS InfoTdiSetInformationEx(
+    PTDI_REQUEST Request,
+    TDIObjectID *ID,
+    PVOID Buffer,
+    UINT BufferSize);
+
+#endif /* __INFO_H */
+
+/* EOF */
index 4cbcd19..3ee693a 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/ip.h\r
- * PURPOSE:     Internet Protocol related definitions\r
- */\r
-#ifndef __IP_H\r
-#define __IP_H\r
-\r
-/* Raw IPv4 style address */\r
-typedef ULONG IPv4_RAW_ADDRESS;\r
-typedef IPv4_RAW_ADDRESS *PIPv4_RAW_ADDRESS;\r
-\r
-/* Raw IPv6 style address */\r
-typedef USHORT IPv6_RAW_ADDRESS[8];\r
-typedef IPv6_RAW_ADDRESS *PIPv6_RAW_ADDRESS;\r
-\r
-/* IP style address */\r
-typedef struct IP_ADDRESS {\r
-    ULONG RefCount;                     /* Number of references to this address */\r
-    UCHAR Type;                         /* Type of IP address */\r
-    union {\r
-        IPv4_RAW_ADDRESS IPv4Address;   /* IPv4 address */\r
-        PIPv6_RAW_ADDRESS IPv6Address;  /* IPv6 address */\r
-    } Address;\r
-} IP_ADDRESS, *PIP_ADDRESS;\r
-\r
-/* IP type constants */\r
-#define IP_ADDRESS_V4   0x00 /* IPv4 style address */\r
-#define IP_ADDRESS_V6   0x01 /* IPv6 style address */\r
-\r
-\r
-/* IPv4 header format */\r
-typedef struct IPv4_HEADER {\r
-    UCHAR VerIHL;                /* 4-bit version, 4-bit Internet Header Length */\r
-    UCHAR Tos;                   /* Type of Service */\r
-    USHORT TotalLength;          /* Total Length */\r
-    USHORT Id;                   /* Identification */\r
-    USHORT FlagsFragOfs;         /* 3-bit Flags, 13-bit Fragment Offset */\r
-    UCHAR Ttl;                   /* Time to Live */\r
-    UCHAR Protocol;              /* Protocol */\r
-    USHORT Checksum;             /* Header Checksum */\r
-    IPv4_RAW_ADDRESS SrcAddr;    /* Source Address */\r
-    IPv4_RAW_ADDRESS DstAddr;    /* Destination Address */\r
-} IPv4_HEADER, *PIPv4_HEADER;\r
-\r
-#define IPv4_FRAGOFS_MASK       0x1FFF\r
-#define IPv4_MF_MASK            0x2000\r
-#define IPv4_MAX_HEADER_SIZE    60\r
-\r
-/* Packet completion handler prototype */\r
-typedef VOID (*PACKET_COMPLETION_ROUTINE)(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    NDIS_STATUS NdisStatus);\r
-\r
-/* Structure for an IP packet */\r
-typedef struct IP_PACKET {\r
-    ULONG RefCount;                     /* Reference count for this object */\r
-    UCHAR Type;                         /* Type of IP packet (see IP_ADDRESS_xx above) */\r
-    PVOID Header;                       /* Pointer to IP header for this packet */\r
-    UINT HeaderSize;                    /* Size of IP header */\r
-    PVOID Data;                         /* Current pointer into packet data */\r
-    UINT TotalSize;                     /* Total amount of data in packet (IP header and data) */\r
-    UINT ContigSize;                    /* Number of contiguous bytes left in current buffer */\r
-    UINT Position;                      /* Current logical offset into packet */\r
-    PNDIS_PACKET NdisPacket;            /* Pointer to NDIS packet */\r
-    IP_ADDRESS SrcAddr;                 /* Source address */\r
-    IP_ADDRESS DstAddr;                 /* Destination address */\r
-} IP_PACKET, *PIP_PACKET;\r
-\r
-/* Packet context */\r
-typedef struct PACKET_CONTEXT {\r
-    PACKET_COMPLETION_ROUTINE Complete;   /* Transport level completion handler */\r
-    PVOID Context;                        /* Context information for handler */\r
-    PACKET_COMPLETION_ROUTINE DLComplete; /* Data link level completion handler. Also\r
-                                             used to link to next packet in a queue */\r
-    UINT DLOffset;                        /* Offset where data (IP header) starts */\r
-} PACKET_CONTEXT, *PPACKET_CONTEXT;\r
-\r
-/* The ProtocolReserved field is structured as a PACKET_CONTEXT */\r
-#define PC(Packet) ((PPACKET_CONTEXT)(&Packet->ProtocolReserved))\r
-\r
-\r
-/* Address information a.k.a ADE */\r
-typedef struct _ADDRESS_ENTRY {\r
-    LIST_ENTRY              ListEntry;  /* Entry on list */\r
-    ULONG                   RefCount;   /* Reference count */\r
-    struct _NET_TABLE_ENTRY *NTE;       /* NTE associated with this address */\r
-    UCHAR                   Type;       /* Address type */\r
-    PIP_ADDRESS             Address;    /* Pointer to address identifying this entry */\r
-} ADDRESS_ENTRY, *PADDRESS_ENTRY;\r
-\r
-/* Values for address type */\r
-#define ADE_UNICAST   0x01\r
-#define ADE_MULTICAST 0x02\r
-#define ADE_ADDRMASK  0x03\r
-\r
-/* There is one NTE for each source (unicast) address assigned to an interface */\r
-typedef struct _NET_TABLE_ENTRY {\r
-    LIST_ENTRY                 IFListEntry; /* Entry on interface list */\r
-    LIST_ENTRY                 NTListEntry; /* Entry on net table list */\r
-    struct _IP_INTERFACE       *Interface;  /* Pointer to interface on this net */\r
-    struct _PREFIX_LIST_ENTRY  *PLE;        /* Pointer to prefix list entry for this net */\r
-    ULONG                      RefCount;    /* Reference count */\r
-    PIP_ADDRESS                Address;     /* Pointer to unicast address for this net */\r
-} NET_TABLE_ENTRY, *PNET_TABLE_ENTRY;\r
-\r
-\r
-/* Link layer transmit prototype */\r
-typedef VOID (*LL_TRANSMIT_ROUTINE)(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    UINT Offset,\r
-    PVOID LinkAddress,\r
-    USHORT Type);\r
-\r
-/* Link layer to IP binding information */\r
-typedef struct _LLIP_BIND_INFO {\r
-    PVOID Context;                /* Pointer to link layer context information */\r
-    UINT  HeaderSize;             /* Size of link level header */\r
-    UINT  MinFrameSize;           /* Minimum frame size in bytes */\r
-    UINT  MTU;                    /* Maximum transmission unit */\r
-    PUCHAR Address;               /* Pointer to interface address */\r
-    UINT  AddressLength;          /* Length of address in bytes */\r
-    LL_TRANSMIT_ROUTINE Transmit; /* Transmit function for this interface */\r
-} LLIP_BIND_INFO, *PLLIP_BIND_INFO;\r
-\r
-\r
-/* Information about an IP interface */\r
-typedef struct _IP_INTERFACE {\r
-    LIST_ENTRY ListEntry;         /* Entry on list */\r
-    ULONG RefCount;               /* Reference count */\r
-    KSPIN_LOCK Lock;              /* Spin lock for this object */\r
-    LIST_ENTRY NTEListHead;       /* List of NTEs on this interface */\r
-    LIST_ENTRY ADEListHead;       /* List of ADEs on this interface */\r
-    PVOID Context;                /* Pointer to link layer context information */\r
-    UINT  HeaderSize;             /* Size of link level header */\r
-    UINT  MinFrameSize;           /* Minimum frame size in bytes */\r
-    UINT  MTU;                    /* Maximum transmission unit */\r
-    PUCHAR Address;               /* Pointer to interface address */\r
-    UINT  AddressLength;          /* Length of address in bytes */\r
-    LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */\r
-} IP_INTERFACE, *PIP_INTERFACE;\r
-\r
-\r
-/* Prefix List Entry */\r
-typedef struct _PREFIX_LIST_ENTRY {\r
-    LIST_ENTRY ListEntry;    /* Entry on list */\r
-    ULONG RefCount;          /* Reference count */\r
-    PIP_INTERFACE Interface; /* Pointer to interface */\r
-    PIP_ADDRESS Prefix;      /* Pointer to prefix */\r
-    UINT PrefixLength;       /* Length of prefix */\r
-} PREFIX_LIST_ENTRY, *PPREFIX_LIST_ENTRY;\r
-\r
-\r
-#define IP_PROTOCOL_TABLE_SIZE 0x100\r
-\r
-typedef VOID (*IP_PROTOCOL_HANDLER)(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket);\r
-\r
-/* Loopback adapter address information (network byte order) */\r
-#define LOOPBACK_ADDRESS_IPv4   ((IPv4_RAW_ADDRESS)DH2N(0x7F000001)) \r
-#define LOOPBACK_BCASTADDR_IPv4 ((IPv4_RAW_ADDRESS)DH2N(0x7F0000FF))\r
-#define LOOPBACK_ADDRMASK_IPv4  ((IPv4_RAW_ADDRESS)DH2N(0xFFFFFF00))\r
-\r
-/* Protocol definitions */\r
-#define IPPROTO_ICMP    1   /* Internet Control Message Protocol */\r
-#define IPPROTO_IGMP    2   /* Internet Group Management Protocol */\r
-#define IPPROTO_TCP     6   /* Transmission Control Protocol */\r
-#define IPPROTO_UDP     17  /* User Datagram Protocol */\r
-\r
-/* Timeout timer constants */\r
-#define IP_TICKS_SECOND 2                   /* Two ticks per second */\r
-#define IP_TIMEOUT (1000 / IP_TICKS_SECOND) /* Timeout in milliseconds */\r
-\r
-\r
-extern LIST_ENTRY InterfaceListHead;\r
-extern KSPIN_LOCK InterfaceListLock;\r
-extern LIST_ENTRY NetTableListHead;\r
-extern KSPIN_LOCK NetTableListLock;\r
-extern LIST_ENTRY PrefixListHead;\r
-extern KSPIN_LOCK PrefixListLock;\r
-extern UINT MaxLLHeaderSize;\r
-extern UINT MinLLFrameSize;\r
-\r
-\r
-PNET_TABLE_ENTRY IPCreateNTE(\r
-    PIP_INTERFACE IF,\r
-    PIP_ADDRESS Address,\r
-    UINT PrefixLength);\r
-\r
-PIP_INTERFACE IPCreateInterface(\r
-    PLLIP_BIND_INFO BindInfo);\r
-\r
-VOID IPDestroyInterface(\r
-    PIP_INTERFACE IF);\r
-\r
-BOOLEAN IPRegisterInterface(\r
-    PIP_INTERFACE IF);\r
-\r
-VOID IPUnregisterInterface(\r
-    PIP_INTERFACE IF);\r
-\r
-PNET_TABLE_ENTRY IPLocateNTEOnInterface(\r
-    PIP_INTERFACE IF,\r
-    PIP_ADDRESS Address,\r
-    PUINT AddressType);\r
-\r
-PNET_TABLE_ENTRY IPLocateNTE(\r
-    PIP_ADDRESS Address,\r
-    PUINT AddressType);\r
-\r
-PADDRESS_ENTRY IPLocateADE(\r
-    PIP_ADDRESS Address,\r
-    UINT AddressType);\r
-\r
-PADDRESS_ENTRY IPGetDefaultADE(\r
-    UINT AddressType);\r
-\r
-VOID IPTimeout(\r
-    PKDPC Dpc,\r
-    PVOID DeferredContext,\r
-    PVOID SystemArgument1,\r
-    PVOID SystemArgument2);\r
-\r
-VOID IPDispatchProtocol(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket);\r
-\r
-VOID IPRegisterProtocol(\r
-    UINT ProtocolNumber,\r
-    IP_PROTOCOL_HANDLER Handler);\r
-\r
-NTSTATUS IPStartup(\r
-    PDRIVER_OBJECT DriverObject,\r
-    PUNICODE_STRING RegistryPath);\r
-\r
-NTSTATUS IPShutdown(\r
-    VOID);\r
-\r
-#endif /* __IP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/ip.h
+ * PURPOSE:     Internet Protocol related definitions
+ */
+#ifndef __IP_H
+#define __IP_H
+
+/* 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 {
+    ULONG RefCount;                     /* Number of references to this address */
+    UCHAR Type;                         /* Type of IP address */
+    union {
+        IPv4_RAW_ADDRESS IPv4Address;   /* IPv4 address */
+        PIPv6_RAW_ADDRESS IPv6Address;  /* IPv6 address */
+    } Address;
+} IP_ADDRESS, *PIP_ADDRESS;
+
+/* IP type constants */
+#define IP_ADDRESS_V4   0x00 /* IPv4 style address */
+#define IP_ADDRESS_V6   0x01 /* 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;
+
+#define IPv4_FRAGOFS_MASK       0x1FFF
+#define IPv4_MF_MASK            0x2000
+#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 {
+    ULONG RefCount;                     /* Reference count for this object */
+    UCHAR Type;                         /* Type of IP packet (see IP_ADDRESS_xx above) */
+    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 ContigSize;                    /* Number of contiguous bytes left in current buffer */
+    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;
+
+/* Packet context */
+typedef struct PACKET_CONTEXT {
+    PACKET_COMPLETION_ROUTINE Complete;   /* Transport level completion handler */
+    PVOID Context;                        /* Context information for handler */
+    PACKET_COMPLETION_ROUTINE DLComplete; /* Data link level completion handler. Also
+                                             used to link to next packet in a queue */
+    UINT DLOffset;                        /* Offset where data (IP header) starts */
+} PACKET_CONTEXT, *PPACKET_CONTEXT;
+
+/* The ProtocolReserved field is structured as a PACKET_CONTEXT */
+#define PC(Packet) ((PPACKET_CONTEXT)(&Packet->ProtocolReserved))
+
+
+/* Address information a.k.a ADE */
+typedef struct _ADDRESS_ENTRY {
+    LIST_ENTRY              ListEntry;  /* Entry on list */
+    ULONG                   RefCount;   /* Reference count */
+    struct _NET_TABLE_ENTRY *NTE;       /* NTE associated with this address */
+    UCHAR                   Type;       /* Address type */
+    PIP_ADDRESS             Address;    /* Pointer to address identifying this entry */
+} ADDRESS_ENTRY, *PADDRESS_ENTRY;
+
+/* Values for address type */
+#define ADE_UNICAST   0x01
+#define ADE_MULTICAST 0x02
+#define ADE_ADDRMASK  0x03
+
+/* There is one NTE for each source (unicast) address assigned to an interface */
+typedef struct _NET_TABLE_ENTRY {
+    LIST_ENTRY                 IFListEntry; /* Entry on interface list */
+    LIST_ENTRY                 NTListEntry; /* Entry on net table list */
+    struct _IP_INTERFACE       *Interface;  /* Pointer to interface on this net */
+    struct _PREFIX_LIST_ENTRY  *PLE;        /* Pointer to prefix list entry for this net */
+    ULONG                      RefCount;    /* Reference count */
+    PIP_ADDRESS                Address;     /* Pointer to unicast address for this net */
+} NET_TABLE_ENTRY, *PNET_TABLE_ENTRY;
+
+
+/* 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 */
+    UINT  MTU;                    /* Maximum transmission unit */
+    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;
+
+
+/* Information about an IP interface */
+typedef struct _IP_INTERFACE {
+    LIST_ENTRY ListEntry;         /* Entry on list */
+    ULONG RefCount;               /* Reference count */
+    KSPIN_LOCK Lock;              /* Spin lock for this object */
+    LIST_ENTRY NTEListHead;       /* List of NTEs on this interface */
+    LIST_ENTRY ADEListHead;       /* List of ADEs on this interface */
+    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 */
+    PUCHAR Address;               /* Pointer to interface address */
+    UINT  AddressLength;          /* Length of address in bytes */
+    LL_TRANSMIT_ROUTINE Transmit; /* Pointer to transmit function */
+} IP_INTERFACE, *PIP_INTERFACE;
+
+
+/* Prefix List Entry */
+typedef struct _PREFIX_LIST_ENTRY {
+    LIST_ENTRY ListEntry;    /* Entry on list */
+    ULONG RefCount;          /* Reference count */
+    PIP_INTERFACE Interface; /* Pointer to interface */
+    PIP_ADDRESS Prefix;      /* Pointer to prefix */
+    UINT PrefixLength;       /* Length of prefix */
+} PREFIX_LIST_ENTRY, *PPREFIX_LIST_ENTRY;
+
+
+#define IP_PROTOCOL_TABLE_SIZE 0x100
+
+typedef VOID (*IP_PROTOCOL_HANDLER)(
+    PNET_TABLE_ENTRY NTE,
+    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(0x7F0000FF))
+#define LOOPBACK_ADDRMASK_IPv4  ((IPv4_RAW_ADDRESS)DH2N(0xFFFFFF00))
+
+/* Protocol definitions */
+#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_TICKS_SECOND 2                   /* Two ticks per second */
+#define IP_TIMEOUT (1000 / IP_TICKS_SECOND) /* Timeout in milliseconds */
+
+
+extern LIST_ENTRY InterfaceListHead;
+extern KSPIN_LOCK InterfaceListLock;
+extern LIST_ENTRY NetTableListHead;
+extern KSPIN_LOCK NetTableListLock;
+extern LIST_ENTRY PrefixListHead;
+extern KSPIN_LOCK PrefixListLock;
+extern UINT MaxLLHeaderSize;
+extern UINT MinLLFrameSize;
+
+
+PNET_TABLE_ENTRY IPCreateNTE(
+    PIP_INTERFACE IF,
+    PIP_ADDRESS Address,
+    UINT PrefixLength);
+
+PIP_INTERFACE IPCreateInterface(
+    PLLIP_BIND_INFO BindInfo);
+
+VOID IPDestroyInterface(
+    PIP_INTERFACE IF);
+
+BOOLEAN IPRegisterInterface(
+    PIP_INTERFACE IF);
+
+VOID IPUnregisterInterface(
+    PIP_INTERFACE IF);
+
+PNET_TABLE_ENTRY IPLocateNTEOnInterface(
+    PIP_INTERFACE IF,
+    PIP_ADDRESS Address,
+    PUINT AddressType);
+
+PNET_TABLE_ENTRY IPLocateNTE(
+    PIP_ADDRESS Address,
+    PUINT AddressType);
+
+PADDRESS_ENTRY IPLocateADE(
+    PIP_ADDRESS Address,
+    UINT AddressType);
+
+PADDRESS_ENTRY IPGetDefaultADE(
+    UINT AddressType);
+
+VOID IPTimeout(
+    PKDPC Dpc,
+    PVOID DeferredContext,
+    PVOID SystemArgument1,
+    PVOID SystemArgument2);
+
+VOID IPDispatchProtocol(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket);
+
+VOID IPRegisterProtocol(
+    UINT ProtocolNumber,
+    IP_PROTOCOL_HANDLER Handler);
+
+NTSTATUS IPStartup(
+    PDRIVER_OBJECT DriverObject,
+    PUNICODE_STRING RegistryPath);
+
+NTSTATUS IPShutdown(
+    VOID);
+
+#endif /* __IP_H */
+
+/* EOF */
index 20799d7..87b06f8 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/lan.h\r
- * PURPOSE:     LAN adapter definitions\r
- */\r
-#ifndef __LAN_H\r
-#define __LAN_H\r
-\r
-\r
-/* Medias we support */\r
-#define MEDIA_ETH 0\r
-\r
-#define MAX_MEDIA 1\r
-\r
-#define IEEE_802_ADDR_LENGTH 6\r
-\r
-/* Ethernet header layout */\r
-typedef struct ETH_HEADER {\r
-    UCHAR DstAddr[IEEE_802_ADDR_LENGTH]; /* Destination MAC address */\r
-    UCHAR SrcAddr[IEEE_802_ADDR_LENGTH]; /* Source MAC address */\r
-    USHORT EType;                        /* Ethernet protocol type */\r
-} ETH_HEADER, *PETH_HEADER;\r
-\r
-#define MAX_MEDIA_ETH sizeof(ETH_HEADER)\r
-\r
-/* Broadcast masks */\r
-#define BCAST_ETH_MASK 0x01\r
-\r
-/* Broadcast values to check against */\r
-#define BCAST_ETH_CHECK 0x01\r
-\r
-/* Offset of broadcast address */\r
-#define BCAST_ETH_OFFSET 0x00\r
-\r
-/* Per adapter information */\r
-typedef struct LAN_ADAPTER {\r
-    struct LAN_ADAPTER *Next;               /* Pointer to next adapter */\r
-    KSPIN_LOCK Lock;                        /* Lock for this structure */\r
-    UCHAR State;                            /* State of the adapter */\r
-    KEVENT Event;                           /* Opening event */\r
-    PVOID Context;                          /* Upper layer context information */\r
-    NDIS_HANDLE NdisHandle;                 /* NDIS binding handle */\r
-    NDIS_STATUS NdisStatus;                 /* NDIS status of last request */\r
-    NDIS_MEDIUM Media;                      /* Media type */\r
-    UCHAR HWAddress[IEEE_802_ADDR_LENGTH];  /* Local HW address */\r
-    UINT HWAddressLength;                   /* Length of HW address */\r
-    UCHAR BCastMask;                        /* Mask for checking broadcast */\r
-    UCHAR BCastCheck;                       /* Value to check against */\r
-    UCHAR BCastOffset;                      /* Offset in frame to check against */\r
-    UCHAR HeaderSize;                       /* Size of link-level header */\r
-    USHORT MTU;                             /* Maximum Transfer Unit */\r
-    UINT MinFrameSize;                      /* Minimum frame size in bytes */\r
-    UINT MaxPacketSize;                     /* Maximum packet size when sending */\r
-    UINT MaxSendPackets;                    /* Maximum number of packets per send */\r
-    UINT MacOptions;                        /* MAC options for NIC driver/adapter */\r
-    UINT Speed;                             /* Link speed */\r
-    UINT PacketFilter;                      /* Packet filter for this adapter */\r
-    PNDIS_PACKET TDPackets;                 /* Transfer Data packets */\r
-} LAN_ADAPTER, *PLAN_ADAPTER;\r
-\r
-/* LAN adapter state constants */\r
-#define LAN_STATE_OPENING   0\r
-#define LAN_STATE_RESETTING 1\r
-#define LAN_STATE_STARTED   2\r
-#define LAN_STATE_STOPPED   3\r
-\r
-/* Size of out lookahead buffer */\r
-#define LOOKAHEAD_SIZE  128\r
-\r
-/* Ethernet types. We swap constants so we can compare values at runtime\r
-   without swapping them */\r
-#define ETYPE_IPv4 WH2N(0x0800)\r
-#define ETYPE_IPv6 WH2N(0x0000) /* FIXME */\r
-#define ETYPE_ARP  WH2N(0x0806)\r
-\r
-/* Protocols */\r
-#define LAN_PROTO_IPv4 0x0000 /* Internet Protocol version 4 */\r
-#define LAN_PROTO_IPv6 0x0001 /* Internet Protocol version 6 */\r
-#define LAN_PROTO_ARP  0x0002 /* Address Resolution Protocol */\r
-\r
-extern PLAN_ADAPTER Adapters;\r
-\r
-\r
-NDIS_STATUS LANRegisterAdapter(\r
-    PNDIS_STRING AdapterName,\r
-    PLAN_ADAPTER *Adapter);\r
-\r
-NDIS_STATUS LANUnregisterAdapter(\r
-    PLAN_ADAPTER Adapter);\r
-\r
-NTSTATUS LANRegisterProtocol(\r
-    STRING *Name);\r
-\r
-VOID LANUnregisterProtocol(\r
-    VOID);\r
-\r
-#endif /* __LAN_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/lan.h
+ * PURPOSE:     LAN adapter definitions
+ */
+#ifndef __LAN_H
+#define __LAN_H
+
+
+/* Medias we support */
+#define MEDIA_ETH 0
+
+#define MAX_MEDIA 1
+
+#define IEEE_802_ADDR_LENGTH 6
+
+/* Ethernet header layout */
+typedef struct ETH_HEADER {
+    UCHAR DstAddr[IEEE_802_ADDR_LENGTH]; /* Destination MAC address */
+    UCHAR SrcAddr[IEEE_802_ADDR_LENGTH]; /* Source MAC address */
+    USHORT EType;                        /* Ethernet protocol type */
+} ETH_HEADER, *PETH_HEADER;
+
+#define MAX_MEDIA_ETH sizeof(ETH_HEADER)
+
+/* Broadcast masks */
+#define BCAST_ETH_MASK 0x01
+
+/* Broadcast values to check against */
+#define BCAST_ETH_CHECK 0x01
+
+/* Offset of broadcast address */
+#define BCAST_ETH_OFFSET 0x00
+
+/* Per adapter information */
+typedef struct LAN_ADAPTER {
+    struct LAN_ADAPTER *Next;               /* Pointer to next adapter */
+    KSPIN_LOCK Lock;                        /* Lock for this structure */
+    UCHAR State;                            /* State of the adapter */
+    KEVENT Event;                           /* Opening event */
+    PVOID Context;                          /* Upper layer context information */
+    NDIS_HANDLE NdisHandle;                 /* NDIS binding handle */
+    NDIS_STATUS NdisStatus;                 /* NDIS status of last request */
+    NDIS_MEDIUM Media;                      /* Media type */
+    UCHAR HWAddress[IEEE_802_ADDR_LENGTH];  /* Local HW address */
+    UINT HWAddressLength;                   /* Length of HW address */
+    UCHAR BCastMask;                        /* Mask for checking broadcast */
+    UCHAR BCastCheck;                       /* Value to check against */
+    UCHAR BCastOffset;                      /* Offset in frame to check against */
+    UCHAR HeaderSize;                       /* Size of link-level header */
+    USHORT MTU;                             /* Maximum Transfer Unit */
+    UINT MinFrameSize;                      /* Minimum frame size in bytes */
+    UINT MaxPacketSize;                     /* Maximum packet size when sending */
+    UINT MaxSendPackets;                    /* Maximum number of packets per send */
+    UINT MacOptions;                        /* MAC options for NIC driver/adapter */
+    UINT Speed;                             /* Link speed */
+    UINT PacketFilter;                      /* Packet filter for this adapter */
+    PNDIS_PACKET TDPackets;                 /* Transfer Data packets */
+} LAN_ADAPTER, *PLAN_ADAPTER;
+
+/* LAN adapter state constants */
+#define LAN_STATE_OPENING   0
+#define LAN_STATE_RESETTING 1
+#define LAN_STATE_STARTED   2
+#define LAN_STATE_STOPPED   3
+
+/* Size of out lookahead buffer */
+#define LOOKAHEAD_SIZE  128
+
+/* Ethernet types. We swap constants so we can compare values at runtime
+   without swapping them */
+#define ETYPE_IPv4 WH2N(0x0800)
+#define ETYPE_IPv6 WH2N(0x0000) /* FIXME */
+#define ETYPE_ARP  WH2N(0x0806)
+
+/* Protocols */
+#define LAN_PROTO_IPv4 0x0000 /* Internet Protocol version 4 */
+#define LAN_PROTO_IPv6 0x0001 /* Internet Protocol version 6 */
+#define LAN_PROTO_ARP  0x0002 /* Address Resolution Protocol */
+
+extern PLAN_ADAPTER Adapters;
+
+
+NDIS_STATUS LANRegisterAdapter(
+    PNDIS_STRING AdapterName,
+    PLAN_ADAPTER *Adapter);
+
+NDIS_STATUS LANUnregisterAdapter(
+    PLAN_ADAPTER Adapter);
+
+NTSTATUS LANRegisterProtocol(
+    STRING *Name);
+
+VOID LANUnregisterProtocol(
+    VOID);
+
+#endif /* __LAN_H */
+
+/* EOF */
index abf3e1d..e5c31c4 100644 (file)
@@ -1,25 +1,25 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/loopback.h\r
- * PURPOSE:     Loopback adapter definitions\r
- */\r
-#ifndef __LOOPBACK_H\r
-#define __LOOPBACK_H\r
-\r
-#include <lan.h>\r
-\r
-\r
-extern PIP_INTERFACE Loopback;\r
-\r
-\r
-NDIS_STATUS LoopRegisterAdapter(\r
-    PNDIS_STRING AdapterName,\r
-    PLAN_ADAPTER *Adapter);\r
-\r
-NDIS_STATUS LoopUnregisterAdapter(\r
-    PLAN_ADAPTER Adapter);\r
-\r
-#endif /* __LOOPBACK_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/loopback.h
+ * PURPOSE:     Loopback adapter definitions
+ */
+#ifndef __LOOPBACK_H
+#define __LOOPBACK_H
+
+#include <lan.h>
+
+
+extern PIP_INTERFACE Loopback;
+
+
+NDIS_STATUS LoopRegisterAdapter(
+    PNDIS_STRING AdapterName,
+    PLAN_ADAPTER *Adapter);
+
+NDIS_STATUS LoopUnregisterAdapter(
+    PLAN_ADAPTER Adapter);
+
+#endif /* __LOOPBACK_H */
+
+/* EOF */
index a2c50fe..460c25e 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/neighbor.h\r
- * PURPOSE:     Neighbor definitions\r
- */\r
-#ifndef __NEIGHBOR_H\r
-#define __NEIGHBOR_H\r
-\r
-\r
-#define NB_HASHMASK 0xF /* Hash mask for neighbor cache */\r
-\r
-typedef struct NEIGHBOR_CACHE_TABLE {\r
-    struct NEIGHBOR_CACHE_ENTRY *Cache; /* Pointer to cache */\r
-    KSPIN_LOCK Lock;                    /* Protecting lock */\r
-} NEIGHBOR_CACHE_TABLE, *PNEIGHBOR_CACHE_TABLE;\r
-\r
-/* Information about a neighbor */\r
-typedef struct NEIGHBOR_CACHE_ENTRY {\r
-    struct NEIGHBOR_CACHE_ENTRY *Next;  /* Pointer to next entry */\r
-    struct NEIGHBOR_CACHE_TABLE *Table; /* Pointer to table */\r
-    ULONG RefCount;                     /* Number of references */\r
-    UCHAR State;                        /* State of NCE */\r
-    UINT EventTimer;                    /* Ticks since last event */\r
-    UINT EventCount;                    /* Number of events */\r
-    PIP_INTERFACE Interface;            /* Pointer to interface */\r
-    PIP_ADDRESS Address;                /* IP address of neighbor */\r
-    UINT LinkAddressLength;             /* Length of link address */\r
-    PVOID LinkAddress;                  /* Pointer to link address */\r
-    PNDIS_PACKET WaitQueue;             /* Pointer to NDIS packets\r
-                                           waiting to be sent */\r
-} NEIGHBOR_CACHE_ENTRY, *PNEIGHBOR_CACHE_ENTRY;\r
-\r
-/* NCE states */\r
-#define NUD_NONE       0x00\r
-#define NUD_INCOMPLETE 0x01\r
-#define NUD_REACHABLE  0x02\r
-#define NUD_STALE      0x04\r
-#define NUD_DELAY      0x08\r
-#define NUD_PROBE      0x10\r
-#define NUD_FAILED     0x20\r
-#define NUD_NOARP      0x40\r
-#define NUD_PERMANENT  0x80\r
-\r
-#define NUD_IN_TIMER  (NUD_INCOMPLETE | NUD_DELAY | NUD_PROBE)\r
-#define NUD_VALID     (NUD_REACHABLE | NUD_NOARP | NUD_STALE | NUD_DELAY | \\r
-                       NUD_PROBE | NUD_PERMANENT)\r
-#define NUD_CONNECTED (NUD_PERMANENT | NUD_NOARP | NUD_REACHABLE)\r
-\r
-\r
-/* Maximum number of retransmissions of multicast solicits */\r
-#define MAX_MULTICAST_SOLICIT 3 /* 3 transmissions */\r
-\r
-/* Number of ticks between address resolution messages */\r
-#define RETRANS_TIMER IP_TICKS_SECOND /* One second */\r
-\r
-\r
-extern NEIGHBOR_CACHE_TABLE NeighborCache[NB_HASHMASK + 1];\r
-\r
-\r
-VOID NBTimeout(\r
-    VOID);\r
-\r
-VOID NBStartup(\r
-    VOID);\r
-\r
-VOID NBShutdown(\r
-    VOID);\r
-\r
-VOID NBSendSolicit(\r
-    PNEIGHBOR_CACHE_ENTRY NCE);\r
-\r
-PNEIGHBOR_CACHE_ENTRY NBAddNeighbor(\r
-    PIP_INTERFACE Interface,\r
-    PIP_ADDRESS Address,\r
-    PVOID LinkAddress,\r
-    UINT LinkAddressLength,\r
-    UCHAR Type);\r
-\r
-VOID NBUpdateNeighbor(\r
-    PNEIGHBOR_CACHE_ENTRY NCE,\r
-    PVOID LinkAddress,\r
-    UCHAR State);\r
-\r
-PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor(\r
-    PIP_ADDRESS Address);\r
-\r
-PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor(\r
-    PIP_INTERFACE Interface,\r
-    PIP_ADDRESS Address);\r
-\r
-BOOLEAN NBQueuePacket(\r
-    PNEIGHBOR_CACHE_ENTRY NCE,\r
-    PNDIS_PACKET NdisPacket);\r
-\r
-VOID NBRemoveNeighbor(\r
-    PNEIGHBOR_CACHE_ENTRY NCE);\r
-\r
-#endif /* __NEIGHBOR_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/neighbor.h
+ * PURPOSE:     Neighbor definitions
+ */
+#ifndef __NEIGHBOR_H
+#define __NEIGHBOR_H
+
+
+#define NB_HASHMASK 0xF /* Hash mask for neighbor cache */
+
+typedef struct NEIGHBOR_CACHE_TABLE {
+    struct NEIGHBOR_CACHE_ENTRY *Cache; /* Pointer to cache */
+    KSPIN_LOCK Lock;                    /* Protecting lock */
+} NEIGHBOR_CACHE_TABLE, *PNEIGHBOR_CACHE_TABLE;
+
+/* Information about a neighbor */
+typedef struct NEIGHBOR_CACHE_ENTRY {
+    struct NEIGHBOR_CACHE_ENTRY *Next;  /* Pointer to next entry */
+    struct NEIGHBOR_CACHE_TABLE *Table; /* Pointer to table */
+    ULONG RefCount;                     /* Number of references */
+    UCHAR State;                        /* State of NCE */
+    UINT EventTimer;                    /* Ticks since last event */
+    UINT EventCount;                    /* Number of events */
+    PIP_INTERFACE Interface;            /* Pointer to interface */
+    PIP_ADDRESS Address;                /* IP address of neighbor */
+    UINT LinkAddressLength;             /* Length of link address */
+    PVOID LinkAddress;                  /* Pointer to link address */
+    PNDIS_PACKET WaitQueue;             /* Pointer to NDIS packets
+                                           waiting to be sent */
+} NEIGHBOR_CACHE_ENTRY, *PNEIGHBOR_CACHE_ENTRY;
+
+/* NCE states */
+#define NUD_NONE       0x00
+#define NUD_INCOMPLETE 0x01
+#define NUD_REACHABLE  0x02
+#define NUD_STALE      0x04
+#define NUD_DELAY      0x08
+#define NUD_PROBE      0x10
+#define NUD_FAILED     0x20
+#define NUD_NOARP      0x40
+#define NUD_PERMANENT  0x80
+
+#define NUD_IN_TIMER  (NUD_INCOMPLETE | NUD_DELAY | NUD_PROBE)
+#define NUD_VALID     (NUD_REACHABLE | NUD_NOARP | NUD_STALE | NUD_DELAY | \
+                       NUD_PROBE | NUD_PERMANENT)
+#define NUD_CONNECTED (NUD_PERMANENT | NUD_NOARP | NUD_REACHABLE)
+
+
+/* Maximum number of retransmissions of multicast solicits */
+#define MAX_MULTICAST_SOLICIT 3 /* 3 transmissions */
+
+/* Number of ticks between address resolution messages */
+#define RETRANS_TIMER IP_TICKS_SECOND /* One second */
+
+
+extern NEIGHBOR_CACHE_TABLE NeighborCache[NB_HASHMASK + 1];
+
+
+VOID NBTimeout(
+    VOID);
+
+VOID NBStartup(
+    VOID);
+
+VOID NBShutdown(
+    VOID);
+
+VOID NBSendSolicit(
+    PNEIGHBOR_CACHE_ENTRY NCE);
+
+PNEIGHBOR_CACHE_ENTRY NBAddNeighbor(
+    PIP_INTERFACE Interface,
+    PIP_ADDRESS Address,
+    PVOID LinkAddress,
+    UINT LinkAddressLength,
+    UCHAR Type);
+
+VOID NBUpdateNeighbor(
+    PNEIGHBOR_CACHE_ENTRY NCE,
+    PVOID LinkAddress,
+    UCHAR State);
+
+PNEIGHBOR_CACHE_ENTRY NBLocateNeighbor(
+    PIP_ADDRESS Address);
+
+PNEIGHBOR_CACHE_ENTRY NBFindOrCreateNeighbor(
+    PIP_INTERFACE Interface,
+    PIP_ADDRESS Address);
+
+BOOLEAN NBQueuePacket(
+    PNEIGHBOR_CACHE_ENTRY NCE,
+    PNDIS_PACKET NdisPacket);
+
+VOID NBRemoveNeighbor(
+    PNEIGHBOR_CACHE_ENTRY NCE);
+
+#endif /* __NEIGHBOR_H */
+
+/* EOF */
index 653b0a4..04b088a 100644 (file)
@@ -1,19 +1,19 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/pool.h\r
- * PURPOSE:     Prototypes for memory pooling\r
- */\r
-#ifndef __POOL_H\r
-#define __POOL_H\r
-\r
-\r
-PVOID PoolAllocateBuffer(\r
-    ULONG Size);\r
-\r
-VOID PoolFreeBuffer(\r
-    PVOID Buffer);\r
-\r
-#endif /* __POOL_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/pool.h
+ * PURPOSE:     Prototypes for memory pooling
+ */
+#ifndef __POOL_H
+#define __POOL_H
+
+
+PVOID PoolAllocateBuffer(
+    ULONG Size);
+
+VOID PoolFreeBuffer(
+    PVOID Buffer);
+
+#endif /* __POOL_H */
+
+/* EOF */
index b132229..0029ef1 100644 (file)
@@ -1,24 +1,24 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/rawip.h\r
- * PURPOSE:     Raw IP types and constants\r
- */\r
-#ifndef __RAWIP_H\r
-#define __RAWIP_H\r
-\r
-NTSTATUS RawIPSendDatagram(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG DataSize);\r
-\r
-NTSTATUS RawIPStartup(\r
-    VOID);\r
-\r
-NTSTATUS RawIPShutdown(\r
-    VOID);\r
-\r
-#endif /* __RAWIP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/rawip.h
+ * PURPOSE:     Raw IP types and constants
+ */
+#ifndef __RAWIP_H
+#define __RAWIP_H
+
+NTSTATUS RawIPSendDatagram(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG DataSize);
+
+NTSTATUS RawIPStartup(
+    VOID);
+
+NTSTATUS RawIPShutdown(
+    VOID);
+
+#endif /* __RAWIP_H */
+
+/* EOF */
index 2dab3d4..36dcac2 100644 (file)
@@ -1,61 +1,61 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/receive.h\r
- * PURPOSE:     Internet Protocol receive prototypes\r
- */\r
-#ifndef __RECEIVE_H\r
-#define __RECEIVE_H\r
-\r
-#include <ip.h>\r
-\r
-\r
-/* IP datagram fragment descriptor. Used to store IP datagram fragments */\r
-typedef struct IP_FRAGMENT {\r
-    LIST_ENTRY ListEntry; /* Entry on list */\r
-    PVOID Data;           /* Pointer to fragment data */\r
-    UINT Offset;          /* Offset into datagram where this fragment is */\r
-    UINT Size;            /* Size of this fragment */\r
-} IP_FRAGMENT, *PIP_FRAGMENT;\r
-\r
-/* IP datagram hole descriptor. Used to reassemble IP datagrams */\r
-typedef struct IPDATAGRAM_HOLE {\r
-    LIST_ENTRY ListEntry; /* Entry on list */\r
-    UINT First;           /* Offset of first octet of the hole */\r
-    UINT Last;            /* Offset of last octet of the hole */\r
-} IPDATAGRAM_HOLE, *PIPDATAGRAM_HOLE;\r
-\r
-/* IP datagram reassembly information */\r
-typedef struct IPDATAGRAM_REASSEMBLY {\r
-    LIST_ENTRY ListEntry;        /* Entry on list */\r
-    KSPIN_LOCK Lock;             /* Protecting spin lock */\r
-    ULONG RefCount;              /* Reference count for this object */\r
-    UINT DataSize;               /* Size of datagram data area */\r
-    IP_ADDRESS SrcAddr;          /* Source address */\r
-    IP_ADDRESS DstAddr;          /* Destination address */\r
-    UCHAR Protocol;              /* Internet Protocol number */\r
-    USHORT Id;                   /* Identification number */\r
-    PIPv4_HEADER IPv4Header;     /* Pointer to IP header */\r
-    UINT HeaderSize;             /* Length of IP header */\r
-    LIST_ENTRY FragmentListHead; /* IP fragment list */\r
-    LIST_ENTRY HoleListHead;     /* IP datagram hole list */\r
-} IPDATAGRAM_REASSEMBLY, *PIPDATAGRAM_REASSEMBLY;\r
-\r
-\r
-extern LIST_ENTRY ReassemblyListHead;\r
-extern KSPIN_LOCK ReassemblyListLock;\r
-\r
-\r
-VOID IPFreeReassemblyList(\r
-    VOID);\r
-\r
-VOID IPDatagramReassemblyTimeout(\r
-    VOID);\r
-\r
-VOID IPReceive(\r
-    PVOID Context,\r
-    PIP_PACKET IPPacket);\r
-\r
-#endif /* __RECEIVE_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/receive.h
+ * PURPOSE:     Internet Protocol receive prototypes
+ */
+#ifndef __RECEIVE_H
+#define __RECEIVE_H
+
+#include <ip.h>
+
+
+/* IP datagram fragment descriptor. Used to store IP datagram fragments */
+typedef struct IP_FRAGMENT {
+    LIST_ENTRY ListEntry; /* Entry on list */
+    PVOID Data;           /* Pointer to fragment data */
+    UINT Offset;          /* Offset into datagram where this fragment is */
+    UINT Size;            /* Size of this fragment */
+} IP_FRAGMENT, *PIP_FRAGMENT;
+
+/* IP datagram hole descriptor. Used to reassemble IP datagrams */
+typedef struct IPDATAGRAM_HOLE {
+    LIST_ENTRY ListEntry; /* Entry on list */
+    UINT First;           /* Offset of first octet of the hole */
+    UINT Last;            /* Offset of last octet of the hole */
+} IPDATAGRAM_HOLE, *PIPDATAGRAM_HOLE;
+
+/* IP datagram reassembly information */
+typedef struct IPDATAGRAM_REASSEMBLY {
+    LIST_ENTRY ListEntry;        /* Entry on list */
+    KSPIN_LOCK Lock;             /* Protecting spin lock */
+    ULONG RefCount;              /* Reference count for this object */
+    UINT DataSize;               /* Size of datagram data area */
+    IP_ADDRESS SrcAddr;          /* Source address */
+    IP_ADDRESS DstAddr;          /* Destination address */
+    UCHAR Protocol;              /* Internet Protocol number */
+    USHORT Id;                   /* Identification number */
+    PIPv4_HEADER IPv4Header;     /* Pointer to IP header */
+    UINT HeaderSize;             /* Length of IP header */
+    LIST_ENTRY FragmentListHead; /* IP fragment list */
+    LIST_ENTRY HoleListHead;     /* IP datagram hole list */
+} IPDATAGRAM_REASSEMBLY, *PIPDATAGRAM_REASSEMBLY;
+
+
+extern LIST_ENTRY ReassemblyListHead;
+extern KSPIN_LOCK ReassemblyListLock;
+
+
+VOID IPFreeReassemblyList(
+    VOID);
+
+VOID IPDatagramReassemblyTimeout(
+    VOID);
+
+VOID IPReceive(
+    PVOID Context,
+    PIP_PACKET IPPacket);
+
+#endif /* __RECEIVE_H */
+
+/* EOF */
index d2c827c..c6c7d2c 100644 (file)
@@ -1,75 +1,75 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/route.h\r
- * PURPOSE:     Routing cache definitions\r
- */\r
-#ifndef __ROUTE_H\r
-#define __ROUTE_H\r
-\r
-#include <neighbor.h>\r
-#include <address.h>\r
-#include <router.h>\r
-#include <pool.h>\r
-#include <arp.h>\r
-\r
-\r
-/* Route Cache Node structure.\r
- * The primary purpose of the RCN is to cache selected source and\r
- * next-hop addresses. The routing cache is implemented as a binary\r
- * search tree to provide fast lookups when many RCNs are in the cache.\r
- */\r
-typedef struct ROUTE_CACHE_NODE {\r
-    struct ROUTE_CACHE_NODE *Parent; /* Pointer to parent */\r
-    struct ROUTE_CACHE_NODE *Left;   /* Pointer to left child */\r
-    struct ROUTE_CACHE_NODE *Right;  /* Pointer to right child */\r
-    /* Memebers above this line must not be moved */\r
-    ULONG RefCount;                  /* Reference count */\r
-    UCHAR State;                     /* RCN state (RCN_STATE_*) */\r
-    IP_ADDRESS Destination;          /* Destination address */\r
-    PNET_TABLE_ENTRY NTE;            /* Preferred NTE */\r
-    PNEIGHBOR_CACHE_ENTRY NCE;       /* Pointer to NCE for first hop (NULL if none) */\r
-    UINT PathMTU;                    /* Path MTU to destination */\r
-} ROUTE_CACHE_NODE, *PROUTE_CACHE_NODE;\r
-\r
-/* RCN states */\r
-#define RCN_STATE_PERMANENT 0x00 /* RCN is permanent (properly local) */\r
-#define RCN_STATE_COMPUTED  0x01 /* RCN is computed */\r
-\r
-\r
-#define IsExternalRCN(RCN) \\r
-    (RCN == ExternalRCN)\r
-\r
-#define IsInternalRCN(RCN) \\r
-    (RCN != ExternalRCN)\r
-\r
-\r
-NTSTATUS RouteStartup(\r
-    VOID);\r
-\r
-NTSTATUS RouteShutdown(\r
-    VOID);\r
-\r
-UINT RouteGetRouteToDestination(\r
-    PIP_ADDRESS Destination,\r
-    PNET_TABLE_ENTRY NTE,\r
-    PROUTE_CACHE_NODE *RCN);\r
-\r
-PROUTE_CACHE_NODE RouteAddRouteToDestination(\r
-    PIP_ADDRESS Destination,\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_INTERFACE IF,\r
-    PNEIGHBOR_CACHE_ENTRY NCE);\r
-\r
-VOID RouteRemoveRouteToDestination(\r
-    PROUTE_CACHE_NODE RCN);\r
-\r
-VOID RouteInvalidateNTE(\r
-    PNET_TABLE_ENTRY NTE);\r
-\r
-VOID RouteInvalidateNCE(\r
-    PNEIGHBOR_CACHE_ENTRY NCE);\r
-\r
-#endif /* __ROUTE_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/route.h
+ * PURPOSE:     Routing cache definitions
+ */
+#ifndef __ROUTE_H
+#define __ROUTE_H
+
+#include <neighbor.h>
+#include <address.h>
+#include <router.h>
+#include <pool.h>
+#include <arp.h>
+
+
+/* Route Cache Node structure.
+ * The primary purpose of the RCN is to cache selected source and
+ * next-hop addresses. The routing cache is implemented as a binary
+ * search tree to provide fast lookups when many RCNs are in the cache.
+ */
+typedef struct ROUTE_CACHE_NODE {
+    struct ROUTE_CACHE_NODE *Parent; /* Pointer to parent */
+    struct ROUTE_CACHE_NODE *Left;   /* Pointer to left child */
+    struct ROUTE_CACHE_NODE *Right;  /* Pointer to right child */
+    /* Memebers above this line must not be moved */
+    ULONG RefCount;                  /* Reference count */
+    UCHAR State;                     /* RCN state (RCN_STATE_*) */
+    IP_ADDRESS Destination;          /* Destination address */
+    PNET_TABLE_ENTRY NTE;            /* Preferred NTE */
+    PNEIGHBOR_CACHE_ENTRY NCE;       /* Pointer to NCE for first hop (NULL if none) */
+    UINT PathMTU;                    /* Path MTU to destination */
+} ROUTE_CACHE_NODE, *PROUTE_CACHE_NODE;
+
+/* RCN states */
+#define RCN_STATE_PERMANENT 0x00 /* RCN is permanent (properly local) */
+#define RCN_STATE_COMPUTED  0x01 /* RCN is computed */
+
+
+#define IsExternalRCN(RCN) \
+    (RCN == ExternalRCN)
+
+#define IsInternalRCN(RCN) \
+    (RCN != ExternalRCN)
+
+
+NTSTATUS RouteStartup(
+    VOID);
+
+NTSTATUS RouteShutdown(
+    VOID);
+
+UINT RouteGetRouteToDestination(
+    PIP_ADDRESS Destination,
+    PNET_TABLE_ENTRY NTE,
+    PROUTE_CACHE_NODE *RCN);
+
+PROUTE_CACHE_NODE RouteAddRouteToDestination(
+    PIP_ADDRESS Destination,
+    PNET_TABLE_ENTRY NTE,
+    PIP_INTERFACE IF,
+    PNEIGHBOR_CACHE_ENTRY NCE);
+
+VOID RouteRemoveRouteToDestination(
+    PROUTE_CACHE_NODE RCN);
+
+VOID RouteInvalidateNTE(
+    PNET_TABLE_ENTRY NTE);
+
+VOID RouteInvalidateNCE(
+    PNEIGHBOR_CACHE_ENTRY NCE);
+
+#endif /* __ROUTE_H */
+
+/* EOF */
index e8d52ef..c585f83 100644 (file)
@@ -1,62 +1,62 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/router.h\r
- * PURPOSE:     IP routing definitions\r
- */\r
-#ifndef __ROUTER_H\r
-#define __ROUTER_H\r
-\r
-#include <neighbor.h>\r
-\r
-\r
-/* Forward Information Base Entry */\r
-typedef struct _FIB_ENTRY {\r
-    LIST_ENTRY ListEntry;         /* Entry on list */\r
-    ULONG RefCount;               /* Reference count */\r
-    PIP_ADDRESS NetworkAddress;   /* Address of network */\r
-    PIP_ADDRESS Netmask;          /* Netmask of network */\r
-    PNET_TABLE_ENTRY NTE;         /* Pointer to NTE to use */\r
-    PNEIGHBOR_CACHE_ENTRY Router; /* Pointer to NCE of router to use */\r
-    UINT Metric;                  /* Cost of this route */\r
-} FIB_ENTRY, *PFIB_ENTRY;\r
-\r
-\r
-PNET_TABLE_ENTRY RouterFindBestNTE(\r
-    PIP_INTERFACE Interface,\r
-    PIP_ADDRESS Destination);\r
-\r
-PIP_INTERFACE RouterFindOnLinkInterface(\r
-    PIP_ADDRESS Address,\r
-    PNET_TABLE_ENTRY NTE);\r
-\r
-PFIB_ENTRY RouterAddRoute(\r
-    PIP_ADDRESS NetworkAddress,\r
-    PIP_ADDRESS Netmask,\r
-    PNET_TABLE_ENTRY NTE,\r
-    PNEIGHBOR_CACHE_ENTRY Router,\r
-    UINT Metric);\r
-\r
-PNEIGHBOR_CACHE_ENTRY RouterGetRoute(\r
-    PIP_ADDRESS Destination,\r
-    PNET_TABLE_ENTRY NTE);\r
-\r
-VOID RouterRemoveRoute(\r
-    PFIB_ENTRY FIBE);\r
-\r
-PFIB_ENTRY RouterCreateRouteIPv4(\r
-    IPv4_RAW_ADDRESS NetworkAddress,\r
-    IPv4_RAW_ADDRESS Netmask,\r
-    IPv4_RAW_ADDRESS RouterAddress,\r
-    PNET_TABLE_ENTRY NTE,\r
-    UINT Metric);\r
-\r
-NTSTATUS RouterStartup(\r
-    VOID);\r
-\r
-NTSTATUS RouterShutdown(\r
-    VOID);\r
-\r
-#endif /* __ROUTER_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/router.h
+ * PURPOSE:     IP routing definitions
+ */
+#ifndef __ROUTER_H
+#define __ROUTER_H
+
+#include <neighbor.h>
+
+
+/* Forward Information Base Entry */
+typedef struct _FIB_ENTRY {
+    LIST_ENTRY ListEntry;         /* Entry on list */
+    ULONG RefCount;               /* Reference count */
+    PIP_ADDRESS NetworkAddress;   /* Address of network */
+    PIP_ADDRESS Netmask;          /* Netmask of network */
+    PNET_TABLE_ENTRY NTE;         /* Pointer to NTE to use */
+    PNEIGHBOR_CACHE_ENTRY Router; /* Pointer to NCE of router to use */
+    UINT Metric;                  /* Cost of this route */
+} FIB_ENTRY, *PFIB_ENTRY;
+
+
+PNET_TABLE_ENTRY RouterFindBestNTE(
+    PIP_INTERFACE Interface,
+    PIP_ADDRESS Destination);
+
+PIP_INTERFACE RouterFindOnLinkInterface(
+    PIP_ADDRESS Address,
+    PNET_TABLE_ENTRY NTE);
+
+PFIB_ENTRY RouterAddRoute(
+    PIP_ADDRESS NetworkAddress,
+    PIP_ADDRESS Netmask,
+    PNET_TABLE_ENTRY NTE,
+    PNEIGHBOR_CACHE_ENTRY Router,
+    UINT Metric);
+
+PNEIGHBOR_CACHE_ENTRY RouterGetRoute(
+    PIP_ADDRESS Destination,
+    PNET_TABLE_ENTRY NTE);
+
+VOID RouterRemoveRoute(
+    PFIB_ENTRY FIBE);
+
+PFIB_ENTRY RouterCreateRouteIPv4(
+    IPv4_RAW_ADDRESS NetworkAddress,
+    IPv4_RAW_ADDRESS Netmask,
+    IPv4_RAW_ADDRESS RouterAddress,
+    PNET_TABLE_ENTRY NTE,
+    UINT Metric);
+
+NTSTATUS RouterStartup(
+    VOID);
+
+NTSTATUS RouterShutdown(
+    VOID);
+
+#endif /* __ROUTER_H */
+
+/* EOF */
index dcd0347..b73f27e 100644 (file)
@@ -1,53 +1,53 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/routines.h\r
- * PURPOSE:     Common routine prototypes\r
- */\r
-#ifndef __ROUTINES_H\r
-#define __ROUTINES_H\r
-\r
-\r
-UINT Random(\r
-    VOID);\r
-\r
-UINT CopyBufferToBufferChain(\r
-    PNDIS_BUFFER DstBuffer,\r
-    UINT DstOffset,\r
-    PUCHAR SrcData,\r
-    UINT Length);\r
-\r
-UINT CopyBufferChainToBuffer(\r
-    PUCHAR DstData,\r
-    PNDIS_BUFFER SrcBuffer,\r
-    UINT SrcOffset,\r
-    UINT Length);\r
-\r
-UINT CopyPacketToBuffer(\r
-    PUCHAR DstData,\r
-    PNDIS_PACKET SrcPacket,\r
-    UINT SrcOffset,\r
-    UINT Length);\r
-\r
-UINT CopyPacketToBufferChain(\r
-    PNDIS_BUFFER DstBuffer,\r
-    UINT DstOffset,\r
-    PNDIS_PACKET SrcPacket,\r
-    UINT SrcOffset,\r
-    UINT Length);\r
-\r
-VOID FreeNdisPacket(\r
-    PNDIS_PACKET Packet);\r
-\r
-PVOID AdjustPacket(\r
-    PNDIS_PACKET Packet,\r
-    UINT Available,\r
-    UINT Needed);\r
-\r
-UINT ResizePacket(\r
-    PNDIS_PACKET Packet,\r
-    UINT Size);\r
-\r
-#endif /* __ROUTINES_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/routines.h
+ * PURPOSE:     Common routine prototypes
+ */
+#ifndef __ROUTINES_H
+#define __ROUTINES_H
+
+
+UINT Random(
+    VOID);
+
+UINT CopyBufferToBufferChain(
+    PNDIS_BUFFER DstBuffer,
+    UINT DstOffset,
+    PUCHAR SrcData,
+    UINT Length);
+
+UINT CopyBufferChainToBuffer(
+    PUCHAR DstData,
+    PNDIS_BUFFER SrcBuffer,
+    UINT SrcOffset,
+    UINT Length);
+
+UINT CopyPacketToBuffer(
+    PUCHAR DstData,
+    PNDIS_PACKET SrcPacket,
+    UINT SrcOffset,
+    UINT Length);
+
+UINT CopyPacketToBufferChain(
+    PNDIS_BUFFER DstBuffer,
+    UINT DstOffset,
+    PNDIS_PACKET SrcPacket,
+    UINT SrcOffset,
+    UINT Length);
+
+VOID FreeNdisPacket(
+    PNDIS_PACKET Packet);
+
+PVOID AdjustPacket(
+    PNDIS_PACKET Packet,
+    UINT Available,
+    UINT Needed);
+
+UINT ResizePacket(
+    PNDIS_PACKET Packet,
+    UINT Size);
+
+#endif /* __ROUTINES_H */
+
+/* EOF */
index d58654a..22e38ef 100644 (file)
@@ -1,18 +1,18 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/tcp.h\r
- * PURPOSE:     Transmission Control Protocol definitions\r
- */\r
-#ifndef __TCP_H\r
-#define __TCP_H\r
-\r
-NTSTATUS TCPStartup(\r
-    VOID);\r
-\r
-NTSTATUS TCPShutdown(\r
-    VOID);\r
-\r
-#endif /* __TCP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/tcp.h
+ * PURPOSE:     Transmission Control Protocol definitions
+ */
+#ifndef __TCP_H
+#define __TCP_H
+
+NTSTATUS TCPStartup(
+    VOID);
+
+NTSTATUS TCPShutdown(
+    VOID);
+
+#endif /* __TCP_H */
+
+/* EOF */
index 7a56e2a..1c3eb02 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/tcpip.h\r
- * PURPOSE:     TCP/IP protocol driver definitions\r
- * NOTES:       Spin lock acquire order:\r
- *                - Net table list lock\r
- *                - Interface lock\r
- *                - Interface list lock\r
- *                - Prefix list lock\r
- *                - Neighbor cache lock\r
- *                - Route cache lock\r
- */\r
-#ifndef __TCPIP_H\r
-#define __TCPIP_H\r
-\r
-#ifdef _MSC_VER\r
-#include <basetsd.h>\r
-#include <ntddk.h>\r
-#include <windef.h>\r
-#include <ndis.h>\r
-#include <tdikrnl.h>\r
-#include <tdiinfo.h>\r
-#else\r
-#include <ddk/ntddk.h>\r
-#include <net/ndis.h>\r
-#include <net/tdikrnl.h>\r
-#include <net/tdiinfo.h>\r
-#endif\r
-\r
-#include <debug.h>\r
-\r
-\r
-/* Define _NTTEST_ to make test version. Device names are prefixed with\r
-   'NT' to allow the driver to run side by side with MS TCP/IP driver */\r
-#define _NTTEST_\r
-\r
-/* FIXME: The following should be moved to ntddk.h or tdi headers */\r
-#ifndef _MSC_VER\r
-\r
-#ifndef IO_NETWORK_INCREMENT\r
-#define IO_NETWORK_INCREMENT 2\r
-#endif\r
-\r
-#endif\r
-\r
-#ifdef _MSC_VER\r
-/* EXPORTED is already defined ddk/defines.h */\r
-#define EXPORTED __declspec(dllexport)\r
-\r
-#endif\r
-\r
-#include <titypes.h>\r
-#include <ticonsts.h>\r
-#include <udp.h>\r
-\r
-\r
-/* Macros */\r
-\r
-#define MIN(value1, value2) \\r
-    ((value1 < value2)? value1 : value2)\r
-\r
-#define MAX(value1, value2) \\r
-    ((value1 > value2)? value1 : value2)\r
-\r
-\r
-#ifdef i386\r
-\r
-/* DWORD network to host byte order conversion for i386 */\r
-#define DN2H(dw) \\r
-    ((((dw) & 0xFF000000L) >> 24) | \\r
-        (((dw) & 0x00FF0000L) >> 8) | \\r
-        (((dw) & 0x0000FF00L) << 8) | \\r
-        (((dw) & 0x000000FFL) << 24))\r
-\r
-/* DWORD host to network byte order conversion for i386 */\r
-#define DH2N(dw) \\r
-       ((((dw) & 0xFF000000L) >> 24) | \\r
-        (((dw) & 0x00FF0000L) >> 8) | \\r
-        (((dw) & 0x0000FF00L) << 8) | \\r
-        (((dw) & 0x000000FFL) << 24))\r
-\r
-/* WORD network to host order conversion for i386 */\r
-#define WN2H(w) \\r
-       ((((w) & 0xFF00) >> 8) | \\r
-        (((w) & 0x00FF) << 8))\r
-\r
-/* WORD host to network byte order conversion for i386 */\r
-#define WH2N(w) \\r
-       ((((w) & 0xFF00) >> 8) | \\r
-        (((w) & 0x00FF) << 8))\r
-\r
-#else /* i386 */\r
-\r
-/* DWORD network to host byte order conversion for other architectures */\r
-#define DN2H(dw) \\r
-    (dw)\r
-\r
-/* DWORD host to network byte order conversion for other architectures */\r
-#define DH2N(dw) \\r
-    (dw)\r
-\r
-/* WORD network to host order conversion for other architectures */\r
-#define WN2H(w) \\r
-    (w)\r
-\r
-/* WORD host to network byte order conversion for other architectures */\r
-#define WH2N(w) \\r
-    (w)\r
-\r
-#endif /* i386 */\r
-\r
-\r
-/* Global variable */\r
-extern PDEVICE_OBJECT TCPDeviceObject;\r
-extern PDEVICE_OBJECT UDPDeviceObject;\r
-extern PDEVICE_OBJECT IPDeviceObject;\r
-extern PDEVICE_OBJECT RawIPDeviceObject;\r
-extern LIST_ENTRY InterfaceListHead;\r
-extern KSPIN_LOCK InterfaceListLock;\r
-extern LIST_ENTRY AddressFileListHead;\r
-extern KSPIN_LOCK AddressFileListLock;\r
-extern NDIS_HANDLE GlobalPacketPool;\r
-extern NDIS_HANDLE GlobalBufferPool;\r
-extern TDIEntityID *EntityList;\r
-extern ULONG EntityCount;\r
-extern UDP_STATISTICS UDPStats;\r
-\r
-#endif /* __TCPIP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/tcpip.h
+ * PURPOSE:     TCP/IP protocol driver definitions
+ * NOTES:       Spin lock acquire order:
+ *                - Net table list lock
+ *                - Interface lock
+ *                - Interface list lock
+ *                - Prefix list lock
+ *                - Neighbor cache lock
+ *                - Route cache lock
+ */
+#ifndef __TCPIP_H
+#define __TCPIP_H
+
+#ifdef _MSC_VER
+#include <basetsd.h>
+#include <ntddk.h>
+#include <windef.h>
+#include <ndis.h>
+#include <tdikrnl.h>
+#include <tdiinfo.h>
+#else
+#include <ddk/ntddk.h>
+#include <net/ndis.h>
+#include <net/tdikrnl.h>
+#include <net/tdiinfo.h>
+#endif
+
+#include <debug.h>
+
+
+/* Define _NTTEST_ to make test version. Device names are prefixed with
+   'NT' to allow the driver to run side by side with MS TCP/IP driver */
+#define _NTTEST_
+
+/* FIXME: The following should be moved to ntddk.h or tdi headers */
+#ifndef _MSC_VER
+
+#ifndef IO_NETWORK_INCREMENT
+#define IO_NETWORK_INCREMENT 2
+#endif
+
+#endif
+
+#ifdef _MSC_VER
+/* EXPORTED is already defined ddk/defines.h */
+#define EXPORTED __declspec(dllexport)
+
+#endif
+
+#include <titypes.h>
+#include <ticonsts.h>
+#include <udp.h>
+
+
+/* Macros */
+
+#define MIN(value1, value2) \
+    ((value1 < value2)? value1 : value2)
+
+#define MAX(value1, value2) \
+    ((value1 > value2)? value1 : value2)
+
+
+#ifdef i386
+
+/* DWORD network to host byte order conversion for i386 */
+#define DN2H(dw) \
+    ((((dw) & 0xFF000000L) >> 24) | \
+        (((dw) & 0x00FF0000L) >> 8) | \
+        (((dw) & 0x0000FF00L) << 8) | \
+        (((dw) & 0x000000FFL) << 24))
+
+/* DWORD host to network byte order conversion for i386 */
+#define DH2N(dw) \
+       ((((dw) & 0xFF000000L) >> 24) | \
+        (((dw) & 0x00FF0000L) >> 8) | \
+        (((dw) & 0x0000FF00L) << 8) | \
+        (((dw) & 0x000000FFL) << 24))
+
+/* WORD network to host order conversion for i386 */
+#define WN2H(w) \
+       ((((w) & 0xFF00) >> 8) | \
+        (((w) & 0x00FF) << 8))
+
+/* WORD host to network byte order conversion for i386 */
+#define WH2N(w) \
+       ((((w) & 0xFF00) >> 8) | \
+        (((w) & 0x00FF) << 8))
+
+#else /* i386 */
+
+/* DWORD network to host byte order conversion for other architectures */
+#define DN2H(dw) \
+    (dw)
+
+/* DWORD host to network byte order conversion for other architectures */
+#define DH2N(dw) \
+    (dw)
+
+/* WORD network to host order conversion for other architectures */
+#define WN2H(w) \
+    (w)
+
+/* WORD host to network byte order conversion for other architectures */
+#define WH2N(w) \
+    (w)
+
+#endif /* i386 */
+
+
+/* Global variable */
+extern PDEVICE_OBJECT TCPDeviceObject;
+extern PDEVICE_OBJECT UDPDeviceObject;
+extern PDEVICE_OBJECT IPDeviceObject;
+extern PDEVICE_OBJECT RawIPDeviceObject;
+extern LIST_ENTRY InterfaceListHead;
+extern KSPIN_LOCK InterfaceListLock;
+extern LIST_ENTRY AddressFileListHead;
+extern KSPIN_LOCK AddressFileListLock;
+extern NDIS_HANDLE GlobalPacketPool;
+extern NDIS_HANDLE GlobalBufferPool;
+extern TDIEntityID *EntityList;
+extern ULONG EntityCount;
+extern UDP_STATISTICS UDPStats;
+
+#endif /* __TCPIP_H */
+
+/* EOF */
index 2ed7246..d73436c 100644 (file)
@@ -1,56 +1,56 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/ticonsts.h\r
- * PURPOSE:     TCP/IP protocol driver constants\r
- */\r
-#ifndef __TICONSTS_H\r
-#define __TICONSTS_H\r
-\r
-/* NDIS version this driver supports */\r
-#define NDIS_VERSION_MAJOR 3\r
-#define NDIS_VERSION_MINOR 0\r
-\r
-#ifdef _NTTEST_\r
-/* Name of devices */\r
-#define DD_TCP_DEVICE_NAME      L"\\Device\\NTTcp"\r
-#define DD_UDP_DEVICE_NAME      L"\\Device\\NTUdp"\r
-#define DD_IP_DEVICE_NAME       L"\\Device\\NTIp"\r
-#define DD_RAWIP_DEVICE_NAME    L"\\Device\\NTRawIp"\r
-\r
-/* For NDIS protocol registration */\r
-#define IP_DEVICE_NAME          "\\Device\\NTIp"\r
-#else\r
-#define DD_TCP_DEVICE_NAME      L"\\Device\\Tcp"\r
-#define DD_UDP_DEVICE_NAME      L"\\Device\\Udp"\r
-#define DD_IP_DEVICE_NAME       L"\\Device\\Ip"\r
-#define DD_RAWIP_DEVICE_NAME    L"\\Device\\RawIp"\r
-\r
-/* For NDIS protocol registration */\r
-#define IP_DEVICE_NAME          "\\Device\\Ip"\r
-#endif /* _NTTEST_ */\r
-\r
-/* TCP/UDP/RawIP IOCTL code definitions */\r
-\r
-#define FSCTL_TCP_BASE     FILE_DEVICE_NETWORK\r
-\r
-#define _TCP_CTL_CODE(Function, Method, Access) \\r
-    CTL_CODE(FSCTL_TCP_BASE, Function, Method, Access)\r
-\r
-#define IOCTL_TCP_QUERY_INFORMATION_EX \\r
-    _TCP_CTL_CODE(0, METHOD_NEITHER, FILE_ANY_ACCESS)\r
-\r
-#define IOCTL_TCP_SET_INFORMATION_EX \\r
-    _TCP_CTL_CODE(1, METHOD_BUFFERED, FILE_WRITE_ACCESS)\r
-\r
-/* Unique error values for log entries */\r
-#define TI_ERROR_DRIVERENTRY 0\r
-\r
-/* Internal status codes */\r
-#define IP_SUCCESS                 0x0000 /* Successful */\r
-#define IP_NO_RESOURCES            0x0001 /* Not enough free resources */\r
-#define IP_NO_ROUTE_TO_DESTINATION 0x0002 /* No route to destination */\r
-\r
-#endif /* __TICONSTS_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/ticonsts.h
+ * PURPOSE:     TCP/IP protocol driver constants
+ */
+#ifndef __TICONSTS_H
+#define __TICONSTS_H
+
+/* NDIS version this driver supports */
+#define NDIS_VERSION_MAJOR 3
+#define NDIS_VERSION_MINOR 0
+
+#ifdef _NTTEST_
+/* Name of devices */
+#define DD_TCP_DEVICE_NAME      L"\\Device\\NTTcp"
+#define DD_UDP_DEVICE_NAME      L"\\Device\\NTUdp"
+#define DD_IP_DEVICE_NAME       L"\\Device\\NTIp"
+#define DD_RAWIP_DEVICE_NAME    L"\\Device\\NTRawIp"
+
+/* For NDIS protocol registration */
+#define IP_DEVICE_NAME          "\\Device\\NTIp"
+#else
+#define DD_TCP_DEVICE_NAME      L"\\Device\\Tcp"
+#define DD_UDP_DEVICE_NAME      L"\\Device\\Udp"
+#define DD_IP_DEVICE_NAME       L"\\Device\\Ip"
+#define DD_RAWIP_DEVICE_NAME    L"\\Device\\RawIp"
+
+/* For NDIS protocol registration */
+#define IP_DEVICE_NAME          "\\Device\\Ip"
+#endif /* _NTTEST_ */
+
+/* TCP/UDP/RawIP IOCTL code definitions */
+
+#define FSCTL_TCP_BASE     FILE_DEVICE_NETWORK
+
+#define _TCP_CTL_CODE(Function, Method, Access) \
+    CTL_CODE(FSCTL_TCP_BASE, Function, Method, Access)
+
+#define IOCTL_TCP_QUERY_INFORMATION_EX \
+    _TCP_CTL_CODE(0, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define IOCTL_TCP_SET_INFORMATION_EX \
+    _TCP_CTL_CODE(1, METHOD_BUFFERED, FILE_WRITE_ACCESS)
+
+/* Unique error values for log entries */
+#define TI_ERROR_DRIVERENTRY 0
+
+/* Internal status codes */
+#define IP_SUCCESS                 0x0000 /* Successful */
+#define IP_NO_RESOURCES            0x0001 /* Not enough free resources */
+#define IP_NO_ROUTE_TO_DESTINATION 0x0002 /* No route to destination */
+
+#endif /* __TICONSTS_H */
+
+/* EOF */
index 833d671..998b90d 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/titypes.h\r
- * PURPOSE:     TCP/IP protocol driver types\r
- */\r
-#ifndef __TITYPES_H\r
-#define __TITYPES_H\r
-\r
-#include <ip.h>\r
-\r
-\r
-#ifdef DBG\r
-\r
-#define DEBUG_REFCHECK(Object) {            \\r
-    if ((Object)->RefCount <= 0) {          \\r
-        TI_DbgPrint(MIN_TRACE, ("Object at (0x%X) has invalid reference count (%d).\n", \\r
-            (Object), (Object)->RefCount)); \\r
-        }                                   \\r
-}\r
-\r
-#else\r
-\r
-#define DEBUG_REFCHECK(Object)\r
-\r
-#endif\r
-\r
-\r
-/*\r
- * VOID ReferenceObject(\r
- *     PVOID Object)\r
- */\r
-#define ReferenceObject(Object)                  \\r
-{                                                \\r
-    DEBUG_REFCHECK(Object);                      \\r
-    TI_DbgPrint(DEBUG_REFCOUNT, ("Referencing object at (0x%X). RefCount (%d).\n", \\r
-        (Object), (Object)->RefCount));          \\r
-                                                 \\r
-    InterlockedIncrement(&((Object)->RefCount)); \\r
-}\r
-\r
-/*\r
- * VOID DereferenceObject(\r
- *     PVOID Object)\r
- */\r
-#define DereferenceObject(Object)                         \\r
-{                                                         \\r
-    DEBUG_REFCHECK(Object);                               \\r
-    TI_DbgPrint(DEBUG_REFCOUNT, ("Dereferencing object at (0x%X). RefCount (%d).\n", \\r
-        (Object), (Object)->RefCount));                   \\r
-                                                          \\r
-    if (InterlockedDecrement(&((Object)->RefCount)) == 0) \\r
-        PoolFreeBuffer(Object);                           \\r
-}\r
-\r
-\r
-typedef NTSTATUS (*DATAGRAM_SEND_ROUTINE)(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG DataSize);\r
-\r
-/* Datagram completion handler prototype */\r
-typedef VOID (*DATAGRAM_COMPLETION_ROUTINE)(\r
-    PVOID Context,\r
-    NDIS_STATUS Status,\r
-    ULONG Count);\r
-\r
-typedef struct _DATAGRAM_RECEIVE_REQUEST {\r
-    LIST_ENTRY ListEntry;                   /* Entry on list */\r
-    PIP_ADDRESS RemoteAddress;              /* Remote address we receive from (NULL means any) */\r
-    USHORT RemotePort;                      /* Remote port we receive from (0 means any) */\r
-    PTDI_CONNECTION_INFORMATION ReturnInfo; /* Return information */\r
-    PNDIS_BUFFER Buffer;                    /* Pointer to receive buffer */\r
-    ULONG BufferSize;                       /* Size of Buffer */\r
-    DATAGRAM_COMPLETION_ROUTINE Complete;   /* Completion routine */\r
-    PVOID Context;                          /* Pointer to context information */\r
-} DATAGRAM_RECEIVE_REQUEST, *PDATAGRAM_RECEIVE_REQUEST;\r
-\r
-/* Datagram build routine prototype */\r
-typedef NTSTATUS (*DATAGRAM_BUILD_ROUTINE)(\r
-    PVOID Context,\r
-    PIP_ADDRESS LocalAddress,\r
-    USHORT LocalPort,\r
-    PIP_PACKET *IPPacket);\r
-\r
-typedef struct _DATAGRAM_SEND_REQUEST {\r
-    LIST_ENTRY ListEntry;                 /* Entry on list */\r
-    PIP_ADDRESS RemoteAddress;            /* Pointer to remote IP address */\r
-    USHORT RemotePort;                    /* Remote port number */\r
-    PNDIS_BUFFER Buffer;                  /* Pointer to NDIS buffer to send */\r
-    DWORD BufferSize;                     /* Size of Buffer */\r
-    DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine */\r
-    PVOID Context;                        /* Pointer to context information */\r
-    DATAGRAM_BUILD_ROUTINE Build;         /* Datagram build routine */\r
-} DATAGRAM_SEND_REQUEST, *PDATAGRAM_SEND_REQUEST;\r
-\r
-\r
-/* Transport (TCP/UDP) endpoint context structure. The FileObject->FsContext\r
-   field holds a pointer to this structure */\r
-typedef struct _TRANSPORT_CONTEXT {\r
-    union {\r
-        HANDLE AddressHandle;\r
-        CONNECTION_CONTEXT ConnectionContext;\r
-        HANDLE ControlChannel;\r
-    } Handle;\r
-    ULONG RefCount;\r
-    BOOL CancelIrps;\r
-    KEVENT CleanupEvent;\r
-} TRANSPORT_CONTEXT, *PTRANSPORT_CONTEXT;\r
-\r
-\r
-typedef struct _ADDRESS_FILE {\r
-    LIST_ENTRY ListEntry;                 /* Entry on list */\r
-    KSPIN_LOCK Lock;                      /* Spin lock to manipulate this structure */\r
-    ULONG RefCount;                       /* Number of references to this object */\r
-    USHORT Flags;                         /* Flags for address file (see below) */\r
-    PADDRESS_ENTRY ADE;                   /* Associated address entry */\r
-    USHORT Protocol;                      /* Protocol number */\r
-    USHORT Port;                          /* Network port (network byte order) */\r
-    WORK_QUEUE_ITEM WorkItem;             /* Work queue item handle */\r
-    DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine for delete request */\r
-    PVOID Context;                        /* Delete request context */\r
-    DATAGRAM_SEND_ROUTINE Send;           /* Routine to send a datagram */\r
-    LIST_ENTRY ReceiveQueue;              /* List of outstanding receive requests */\r
-    LIST_ENTRY TransmitQueue;             /* List of outstanding transmit requests */\r
-    PIP_ADDRESS AddrCache;                /* One entry address cache (destination\r
-                                             address of last packet transmitted) */\r
-\r
-    /* The following members are used to control event notification */\r
-\r
-    /* Connection indication handler */\r
-    PTDI_IND_CONNECT ConnectionHandler;\r
-    PVOID ConnectionHandlerContext;\r
-    BOOL RegisteredConnectionHandler;\r
-    /* Disconnect indication handler */\r
-    PTDI_IND_DISCONNECT DisconnectHandler;\r
-    PVOID DisconnectHandlerContext;\r
-    BOOL RegisteredDisconnectHandler;\r
-    /* Receive indication handler */\r
-    PTDI_IND_RECEIVE ReceiveHandler;\r
-    PVOID ReceiveHandlerContext;\r
-    BOOL RegisteredReceiveHandler;\r
-    /* Expedited receive indication handler */\r
-    PTDI_IND_RECEIVE_EXPEDITED ExpeditedReceiveHandler;\r
-    PVOID ExpeditedReceiveHandlerContext;\r
-    BOOL RegisteredExpeditedReceiveHandler;\r
-    /* Receive datagram indication handler */\r
-    PTDI_IND_RECEIVE_DATAGRAM ReceiveDatagramHandler;\r
-    PVOID ReceiveDatagramHandlerContext;\r
-    BOOL RegisteredReceiveDatagramHandler;\r
-    /* Error indication handler */\r
-    PTDI_IND_ERROR ErrorHandler;\r
-    PVOID ErrorHandlerContext;\r
-    PVOID ErrorHandlerOwner;\r
-    BOOL RegisteredErrorHandler;\r
-} ADDRESS_FILE, *PADDRESS_FILE;\r
-\r
-/* Address File Flag constants */\r
-#define AFF_VALID    0x0001 /* Address file object is valid for use */\r
-#define AFF_BUSY     0x0002 /* Address file object is exclusive to someone */\r
-#define AFF_DELETE   0x0004 /* Address file object is sheduled to be deleted */\r
-#define AFF_SEND     0x0008 /* A send request is pending */\r
-#define AFF_RECEIVE  0x0010 /* A receive request is pending */\r
-#define AFF_PENDING  0x001C /* A request is pending */\r
-\r
-/* Macros for manipulating address file object flags */\r
-\r
-#define AF_IS_VALID(ADF)  ((ADF)->Flags & AFF_VALID)\r
-#define AF_SET_VALID(ADF) ((ADF)->Flags |= AFF_VALID)\r
-#define AF_CLR_VALID(ADF) ((ADF)->Flags &= ~AFF_VALID)\r
-\r
-#define AF_IS_BUSY(ADF)  ((ADF)->Flags & AFF_BUSY)\r
-#define AF_SET_BUSY(ADF) ((ADF)->Flags |= AFF_BUSY)\r
-#define AF_CLR_BUSY(ADF) ((ADF)->Flags &= ~AFF_BUSY)\r
-\r
-#define AF_IS_PENDING(ADF, X)  (ADF->Flags & X)\r
-#define AF_SET_PENDING(ADF, X) (ADF->Flags |= X)\r
-#define AF_CLR_PENDING(ADF, X) (ADF->Flags &= ~X)\r
-\r
-\r
-/* Structure used to search through Address Files */\r
-typedef struct _AF_SEARCH {\r
-    PLIST_ENTRY Next;       /* Next address file to check */\r
-    PIP_ADDRESS Address;    /* Pointer to address to be found */\r
-    USHORT Port;            /* Network port */\r
-    USHORT Protocol;        /* Protocol number */\r
-} AF_SEARCH, *PAF_SEARCH;\r
-\r
-/* Transport connection context structure. The FileObject->FsContext2\r
-   field holds a pointer to this structure */\r
-typedef struct _CONNECTION_ENDPOINT {\r
-    LIST_ENTRY ListEntry;   /* Entry on list */\r
-    KSPIN_LOCK Lock;        /* Spin lock to protect this structure */\r
-    ULONG RefCount;         /* Number of references to this object */\r
-} CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT;\r
-\r
-/* Transport control channel context structure. The FileObject->FsContext2\r
-   field holds a pointer to this structure */\r
-typedef struct _CONTROL_CHANNEL {\r
-    LIST_ENTRY ListEntry;       /* Entry on list */\r
-    KSPIN_LOCK Lock;            /* Spin lock to protect this structure */\r
-    ULONG RefCount;             /* Number of references to this object */\r
-} CONTROL_CHANNEL, *PCONTROL_CHANNEL;\r
-\r
-typedef struct _TI_QUERY_CONTEXT {\r
-    PIRP Irp;\r
-    PMDL InputMdl;\r
-    PMDL OutputMdl;\r
-    TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo;\r
-} TI_QUERY_CONTEXT, *PTI_QUERY_CONTEXT;\r
-\r
-#endif /* __TITYPES_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/titypes.h
+ * PURPOSE:     TCP/IP protocol driver types
+ */
+#ifndef __TITYPES_H
+#define __TITYPES_H
+
+#include <ip.h>
+
+
+#ifdef DBG
+
+#define DEBUG_REFCHECK(Object) {            \
+    if ((Object)->RefCount <= 0) {          \
+        TI_DbgPrint(MIN_TRACE, ("Object at (0x%X) has invalid reference count (%d).\n", \
+            (Object), (Object)->RefCount)); \
+        }                                   \
+}
+
+#else
+
+#define DEBUG_REFCHECK(Object)
+
+#endif
+
+
+/*
+ * VOID ReferenceObject(
+ *     PVOID Object)
+ */
+#define ReferenceObject(Object)                  \
+{                                                \
+    DEBUG_REFCHECK(Object);                      \
+    TI_DbgPrint(DEBUG_REFCOUNT, ("Referencing object at (0x%X). RefCount (%d).\n", \
+        (Object), (Object)->RefCount));          \
+                                                 \
+    InterlockedIncrement(&((Object)->RefCount)); \
+}
+
+/*
+ * VOID DereferenceObject(
+ *     PVOID Object)
+ */
+#define DereferenceObject(Object)                         \
+{                                                         \
+    DEBUG_REFCHECK(Object);                               \
+    TI_DbgPrint(DEBUG_REFCOUNT, ("Dereferencing object at (0x%X). RefCount (%d).\n", \
+        (Object), (Object)->RefCount));                   \
+                                                          \
+    if (InterlockedDecrement(&((Object)->RefCount)) == 0) \
+        PoolFreeBuffer(Object);                           \
+}
+
+
+typedef NTSTATUS (*DATAGRAM_SEND_ROUTINE)(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG DataSize);
+
+/* Datagram completion handler prototype */
+typedef VOID (*DATAGRAM_COMPLETION_ROUTINE)(
+    PVOID Context,
+    NDIS_STATUS Status,
+    ULONG Count);
+
+typedef struct _DATAGRAM_RECEIVE_REQUEST {
+    LIST_ENTRY ListEntry;                   /* Entry on list */
+    PIP_ADDRESS RemoteAddress;              /* Remote address we receive from (NULL means any) */
+    USHORT RemotePort;                      /* Remote port we receive from (0 means any) */
+    PTDI_CONNECTION_INFORMATION ReturnInfo; /* Return information */
+    PNDIS_BUFFER Buffer;                    /* Pointer to receive buffer */
+    ULONG BufferSize;                       /* Size of Buffer */
+    DATAGRAM_COMPLETION_ROUTINE Complete;   /* Completion routine */
+    PVOID Context;                          /* Pointer to context information */
+} DATAGRAM_RECEIVE_REQUEST, *PDATAGRAM_RECEIVE_REQUEST;
+
+/* Datagram build routine prototype */
+typedef NTSTATUS (*DATAGRAM_BUILD_ROUTINE)(
+    PVOID Context,
+    PIP_ADDRESS LocalAddress,
+    USHORT LocalPort,
+    PIP_PACKET *IPPacket);
+
+typedef struct _DATAGRAM_SEND_REQUEST {
+    LIST_ENTRY ListEntry;                 /* Entry on list */
+    PIP_ADDRESS RemoteAddress;            /* Pointer to remote IP address */
+    USHORT RemotePort;                    /* Remote port number */
+    PNDIS_BUFFER Buffer;                  /* Pointer to NDIS buffer to send */
+    DWORD BufferSize;                     /* Size of Buffer */
+    DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine */
+    PVOID Context;                        /* Pointer to context information */
+    DATAGRAM_BUILD_ROUTINE Build;         /* Datagram build routine */
+} DATAGRAM_SEND_REQUEST, *PDATAGRAM_SEND_REQUEST;
+
+
+/* Transport (TCP/UDP) endpoint context structure. The FileObject->FsContext
+   field holds a pointer to this structure */
+typedef struct _TRANSPORT_CONTEXT {
+    union {
+        HANDLE AddressHandle;
+        CONNECTION_CONTEXT ConnectionContext;
+        HANDLE ControlChannel;
+    } Handle;
+    ULONG RefCount;
+    BOOL CancelIrps;
+    KEVENT CleanupEvent;
+} TRANSPORT_CONTEXT, *PTRANSPORT_CONTEXT;
+
+
+typedef struct _ADDRESS_FILE {
+    LIST_ENTRY ListEntry;                 /* Entry on list */
+    KSPIN_LOCK Lock;                      /* Spin lock to manipulate this structure */
+    ULONG RefCount;                       /* Number of references to this object */
+    USHORT Flags;                         /* Flags for address file (see below) */
+    PADDRESS_ENTRY ADE;                   /* Associated address entry */
+    USHORT Protocol;                      /* Protocol number */
+    USHORT Port;                          /* Network port (network byte order) */
+    WORK_QUEUE_ITEM WorkItem;             /* Work queue item handle */
+    DATAGRAM_COMPLETION_ROUTINE Complete; /* Completion routine for delete request */
+    PVOID Context;                        /* Delete request context */
+    DATAGRAM_SEND_ROUTINE Send;           /* Routine to send a datagram */
+    LIST_ENTRY ReceiveQueue;              /* List of outstanding receive requests */
+    LIST_ENTRY TransmitQueue;             /* List of outstanding transmit requests */
+    PIP_ADDRESS AddrCache;                /* One entry address cache (destination
+                                             address of last packet transmitted) */
+
+    /* The following members are used to control event notification */
+
+    /* Connection indication handler */
+    PTDI_IND_CONNECT ConnectionHandler;
+    PVOID ConnectionHandlerContext;
+    BOOL RegisteredConnectionHandler;
+    /* Disconnect indication handler */
+    PTDI_IND_DISCONNECT DisconnectHandler;
+    PVOID DisconnectHandlerContext;
+    BOOL RegisteredDisconnectHandler;
+    /* Receive indication handler */
+    PTDI_IND_RECEIVE ReceiveHandler;
+    PVOID ReceiveHandlerContext;
+    BOOL RegisteredReceiveHandler;
+    /* Expedited receive indication handler */
+    PTDI_IND_RECEIVE_EXPEDITED ExpeditedReceiveHandler;
+    PVOID ExpeditedReceiveHandlerContext;
+    BOOL RegisteredExpeditedReceiveHandler;
+    /* Receive datagram indication handler */
+    PTDI_IND_RECEIVE_DATAGRAM ReceiveDatagramHandler;
+    PVOID ReceiveDatagramHandlerContext;
+    BOOL RegisteredReceiveDatagramHandler;
+    /* Error indication handler */
+    PTDI_IND_ERROR ErrorHandler;
+    PVOID ErrorHandlerContext;
+    PVOID ErrorHandlerOwner;
+    BOOL RegisteredErrorHandler;
+} ADDRESS_FILE, *PADDRESS_FILE;
+
+/* Address File Flag constants */
+#define AFF_VALID    0x0001 /* Address file object is valid for use */
+#define AFF_BUSY     0x0002 /* Address file object is exclusive to someone */
+#define AFF_DELETE   0x0004 /* Address file object is sheduled to be deleted */
+#define AFF_SEND     0x0008 /* A send request is pending */
+#define AFF_RECEIVE  0x0010 /* A receive request is pending */
+#define AFF_PENDING  0x001C /* A request is pending */
+
+/* Macros for manipulating address file object flags */
+
+#define AF_IS_VALID(ADF)  ((ADF)->Flags & AFF_VALID)
+#define AF_SET_VALID(ADF) ((ADF)->Flags |= AFF_VALID)
+#define AF_CLR_VALID(ADF) ((ADF)->Flags &= ~AFF_VALID)
+
+#define AF_IS_BUSY(ADF)  ((ADF)->Flags & AFF_BUSY)
+#define AF_SET_BUSY(ADF) ((ADF)->Flags |= AFF_BUSY)
+#define AF_CLR_BUSY(ADF) ((ADF)->Flags &= ~AFF_BUSY)
+
+#define AF_IS_PENDING(ADF, X)  (ADF->Flags & X)
+#define AF_SET_PENDING(ADF, X) (ADF->Flags |= X)
+#define AF_CLR_PENDING(ADF, X) (ADF->Flags &= ~X)
+
+
+/* Structure used to search through Address Files */
+typedef struct _AF_SEARCH {
+    PLIST_ENTRY Next;       /* Next address file to check */
+    PIP_ADDRESS Address;    /* Pointer to address to be found */
+    USHORT Port;            /* Network port */
+    USHORT Protocol;        /* Protocol number */
+} AF_SEARCH, *PAF_SEARCH;
+
+/* Transport connection context structure. The FileObject->FsContext2
+   field holds a pointer to this structure */
+typedef struct _CONNECTION_ENDPOINT {
+    LIST_ENTRY ListEntry;   /* Entry on list */
+    KSPIN_LOCK Lock;        /* Spin lock to protect this structure */
+    ULONG RefCount;         /* Number of references to this object */
+} CONNECTION_ENDPOINT, *PCONNECTION_ENDPOINT;
+
+/* Transport control channel context structure. The FileObject->FsContext2
+   field holds a pointer to this structure */
+typedef struct _CONTROL_CHANNEL {
+    LIST_ENTRY ListEntry;       /* Entry on list */
+    KSPIN_LOCK Lock;            /* Spin lock to protect this structure */
+    ULONG RefCount;             /* Number of references to this object */
+} CONTROL_CHANNEL, *PCONTROL_CHANNEL;
+
+typedef struct _TI_QUERY_CONTEXT {
+    PIRP Irp;
+    PMDL InputMdl;
+    PMDL OutputMdl;
+    TCP_REQUEST_QUERY_INFORMATION_EX QueryInfo;
+} TI_QUERY_CONTEXT, *PTI_QUERY_CONTEXT;
+
+#endif /* __TITYPES_H */
+
+/* EOF */
index c0f8167..618e632 100644 (file)
@@ -1,47 +1,47 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/transmit.h\r
- * PURPOSE:     Internet Protocol transmit prototypes\r
- */\r
-#ifndef __TRANSMIT_H\r
-#define __TRANSMIT_H\r
-\r
-#include <neighbor.h>\r
-#include <route.h>\r
-#include <ip.h>\r
-\r
-\r
-/* IP fragment context information */\r
-typedef struct IPFRAGMENT_CONTEXT {\r
-    struct IPFRAGMENT_CONTEXT *Next;    /* Pointer to next in list */\r
-    PNDIS_PACKET Datagram;              /* Pointer to original NDIS packet */\r
-    PVOID DatagramData;                 /* Pointer to datagram data */\r
-    UINT HeaderSize;                    /* IP datagram header size */\r
-    PNDIS_PACKET NdisPacket;            /* Pointer to NDIS packet */\r
-    PNDIS_BUFFER NdisBuffer;            /* Pointer to NDIS buffer */\r
-    PVOID Header;                       /* Pointer to IP header in fragment buffer */\r
-    PVOID Data;                         /* Pointer to fragment data */\r
-    UINT Position;                      /* Current fragment offset */\r
-    UINT BytesLeft;                     /* Number of bytes left to send */\r
-    UINT PathMTU;                       /* Path Maximum Transmission Unit */\r
-    PNEIGHBOR_CACHE_ENTRY NCE;          /* Pointer to NCE to use */\r
-} IPFRAGMENT_CONTEXT, *PIPFRAGMENT_CONTEXT;\r
-\r
-\r
-VOID IPSendComplete(\r
-    PVOID Context,\r
-    PNDIS_PACKET NdisPacket,\r
-    NDIS_STATUS NdisStatus);\r
-\r
-NTSTATUS IPSendFragment(\r
-    PNDIS_PACKET NdisPacket,\r
-    PNEIGHBOR_CACHE_ENTRY NCE);\r
-\r
-NTSTATUS IPSendDatagram(\r
-    PIP_PACKET IPPacket,\r
-    PROUTE_CACHE_NODE RCN);\r
-\r
-#endif /* __TRANSMIT_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/transmit.h
+ * PURPOSE:     Internet Protocol transmit prototypes
+ */
+#ifndef __TRANSMIT_H
+#define __TRANSMIT_H
+
+#include <neighbor.h>
+#include <route.h>
+#include <ip.h>
+
+
+/* IP fragment context information */
+typedef struct IPFRAGMENT_CONTEXT {
+    struct IPFRAGMENT_CONTEXT *Next;    /* Pointer to next in list */
+    PNDIS_PACKET Datagram;              /* Pointer to original NDIS packet */
+    PVOID DatagramData;                 /* Pointer to datagram data */
+    UINT HeaderSize;                    /* IP datagram header size */
+    PNDIS_PACKET NdisPacket;            /* Pointer to NDIS packet */
+    PNDIS_BUFFER NdisBuffer;            /* Pointer to NDIS buffer */
+    PVOID Header;                       /* Pointer to IP header in fragment buffer */
+    PVOID Data;                         /* Pointer to fragment data */
+    UINT Position;                      /* Current fragment offset */
+    UINT BytesLeft;                     /* Number of bytes left to send */
+    UINT PathMTU;                       /* Path Maximum Transmission Unit */
+    PNEIGHBOR_CACHE_ENTRY NCE;          /* Pointer to NCE to use */
+} IPFRAGMENT_CONTEXT, *PIPFRAGMENT_CONTEXT;
+
+
+VOID IPSendComplete(
+    PVOID Context,
+    PNDIS_PACKET NdisPacket,
+    NDIS_STATUS NdisStatus);
+
+NTSTATUS IPSendFragment(
+    PNDIS_PACKET NdisPacket,
+    PNEIGHBOR_CACHE_ENTRY NCE);
+
+NTSTATUS IPSendDatagram(
+    PIP_PACKET IPPacket,
+    PROUTE_CACHE_NODE RCN);
+
+#endif /* __TRANSMIT_H */
+
+/* EOF */
index 919a86b..c289575 100644 (file)
@@ -1,68 +1,68 @@
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        include/udp.h\r
- * PURPOSE:     User Datagram Protocol definitions\r
- */\r
-#ifndef __UDP_H\r
-#define __UDP_H\r
-\r
-\r
-/* UDPv4 header structure */\r
-typedef struct UDP_HEADER {\r
-    USHORT SourcePort; /* Source port */\r
-    USHORT DestPort;   /* Destination port */\r
-    USHORT Length;     /* Size of header and data */\r
-    USHORT Checksum;   /* Checksum of datagram */\r
-} UDP_HEADER, *PUDP_HEADER;\r
-\r
-/* UDPv4 pseudo header */\r
-typedef struct UDP_PSEUDO_HEADER {\r
-    ULONG SourceAddress; /* Source address */\r
-    ULONG DestAddress;   /* Destination address */\r
-    UCHAR Zero;          /* Reserved */\r
-    UCHAR Protocol;      /* Protocol */\r
-    USHORT UDPLength;    /* Size of UDP datagram */\r
-} UDP_PSEUDO_HEADER, *PUDP_PSEUDO_HEADER;\r
-\r
-\r
-typedef struct UDP_STATISTICS {\r
-    ULONG InputDatagrams;\r
-    ULONG NumPorts;\r
-    ULONG InputErrors;\r
-    ULONG OutputDatagrams;\r
-    ULONG NumAddresses;\r
-} UDP_STATISTICS, *PUDP_STATISTICS;\r
-\r
-VOID UDPSend(\r
-    PVOID Context,\r
-    PDATAGRAM_SEND_REQUEST SendRequest);\r
-\r
-NTSTATUS UDPSendDatagram(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG DataSize);\r
-\r
-NTSTATUS UDPReceiveDatagram(\r
-    PTDI_REQUEST Request,\r
-    PTDI_CONNECTION_INFORMATION ConnInfo,\r
-    PNDIS_BUFFER Buffer,\r
-    ULONG ReceiveLength,\r
-    ULONG ReceiveFlags,\r
-    PTDI_CONNECTION_INFORMATION ReturnInfo,\r
-    PULONG BytesReceived);\r
-\r
-VOID UDPReceive(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket);\r
-\r
-NTSTATUS UDPStartup(\r
-    VOID);\r
-\r
-NTSTATUS UDPShutdown(\r
-    VOID);\r
-\r
-#endif /* __UDP_H */\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        include/udp.h
+ * PURPOSE:     User Datagram Protocol definitions
+ */
+#ifndef __UDP_H
+#define __UDP_H
+
+
+/* UDPv4 header structure */
+typedef struct UDP_HEADER {
+    USHORT SourcePort; /* Source port */
+    USHORT DestPort;   /* Destination port */
+    USHORT Length;     /* Size of header and data */
+    USHORT Checksum;   /* Checksum of datagram */
+} UDP_HEADER, *PUDP_HEADER;
+
+/* UDPv4 pseudo header */
+typedef struct UDP_PSEUDO_HEADER {
+    ULONG SourceAddress; /* Source address */
+    ULONG DestAddress;   /* Destination address */
+    UCHAR Zero;          /* Reserved */
+    UCHAR Protocol;      /* Protocol */
+    USHORT UDPLength;    /* Size of UDP datagram */
+} UDP_PSEUDO_HEADER, *PUDP_PSEUDO_HEADER;
+
+
+typedef struct UDP_STATISTICS {
+    ULONG InputDatagrams;
+    ULONG NumPorts;
+    ULONG InputErrors;
+    ULONG OutputDatagrams;
+    ULONG NumAddresses;
+} UDP_STATISTICS, *PUDP_STATISTICS;
+
+VOID UDPSend(
+    PVOID Context,
+    PDATAGRAM_SEND_REQUEST SendRequest);
+
+NTSTATUS UDPSendDatagram(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG DataSize);
+
+NTSTATUS UDPReceiveDatagram(
+    PTDI_REQUEST Request,
+    PTDI_CONNECTION_INFORMATION ConnInfo,
+    PNDIS_BUFFER Buffer,
+    ULONG ReceiveLength,
+    ULONG ReceiveFlags,
+    PTDI_CONNECTION_INFORMATION ReturnInfo,
+    PULONG BytesReceived);
+
+VOID UDPReceive(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket);
+
+NTSTATUS UDPStartup(
+    VOID);
+
+NTSTATUS UDPShutdown(
+    VOID);
+
+#endif /* __UDP_H */
+
+/* EOF */
index db914fa..b6e4d7f 100644 (file)
-# TCPIP.SYS - TCP/IP protocol driver\r
-\r
-TARGETNAME=tcpip\r
-\r
-BASE_CFLAGS = -I./include -I../../../include\r
-\r
-RESOURCE_OBJECT  = $(TARGETNAME).coff\r
-TCPIP_OBJECTS    = tcpip/main.o tcpip/address.o tcpip/checksum.o \\r
-                   tcpip/dispatch.o tcpip/fileobjs.o tcpip/info.o \\r
-                   tcpip/pool.o tcpip/routines.o\r
-DATALINK_OBJECTS = datalink/arp.o datalink/lan.o datalink/loopback.o\r
-NETWORK_OBJECTS  = network/icmp.o network/ip.o network/neighbor.o \\r
-                   network/receive.o network/route.o network/router.o \\r
-                   network/transmit.o\r
-DATAGRAM_OBJECTS = transport/datagram/datagram.o\r
-RAWIP_OBJECTS    = transport/rawip/rawip.o\r
-TCP_OBJECTS      = transport/tcp/tcp.o\r
-UDP_OBJECTS      = transport/udp/udp.o\r
-\r
-all: objects $(TARGETNAME).sys\r
-\r
-objects:\r
-       mkdir objects\r
-\r
-objects/tcpip.o: $(TCPIP_OBJECTS)\r
-       $(LD) -r -o objects/tcpip.o $(TCPIP_OBJECTS)\r
-\r
-objects/datalink.o: $(DATALINK_OBJECTS)\r
-       $(LD) -r -o objects/datalink.o $(DATALINK_OBJECTS)\r
-\r
-objects/network.o: $(NETWORK_OBJECTS)\r
-       $(LD) -r -o objects/network.o $(NETWORK_OBJECTS)\r
-\r
-objects/datagram.o: $(DATAGRAM_OBJECTS)\r
-       $(LD) -r -o objects/datagram.o $(DATAGRAM_OBJECTS)\r
-\r
-objects/rawip.o: $(RAWIP_OBJECTS)\r
-       $(LD) -r -o objects/rawip.o $(RAWIP_OBJECTS)\r
-\r
-objects/tcp.o: $(TCP_OBJECTS)\r
-       $(LD) -r -o objects/tcp.o $(TCP_OBJECTS)\r
-\r
-objects/udp.o: $(UDP_OBJECTS)\r
-       $(LD) -r -o objects/udp.o $(UDP_OBJECTS)\r
-\r
-OBJECTS = objects/tcpip.o objects/datalink.o objects/network.o \\r
-          objects/datagram.o objects/rawip.o objects/tcp.o objects/udp.o \\r
-          $(RESOURCE_OBJECT) \\r
-          ../../../ntoskrnl/ntoskrnl.a ../ndis/ndis.a\r
-\r
-$(TARGETNAME).coff: $(TARGETNAME).rc ../../../include/reactos/resource.h\r
-\r
-ifeq ($(DOSCLI),yes)\r
-CLEAN_FILES = \\r
-               *.o objects\*.o tcpip\*.o datalink\*.o network\*.o \\r
-        transport\datagram\*.o transport\rawip\*.o \\r
-        transport\tcp\*.o transport\udp\*.o $(TARGETNAME).coff \\r
-        $(TARGETNAME).a junk.tmp base.tmp temp.exp \\r
-               $(TARGETNAME).sys $(TARGETNAME).sym\r
-else\r
-CLEAN_FILES = \\r
-               *.o objects/*.o tcpip/*.o datalink/*.o network/*.o \\r
-        transport/datagram/*.o transport/rawip/*.o \\r
-        transport/tcp/*.o transport/udp/*.o $(TARGETNAME).coff \\r
-        $(TARGETNAME).a junk.tmp base.tmp temp.exp \\r
-               $(TARGETNAME).sys $(TARGETNAME).sym\r
-endif\r
-\r
-\r
-$(TARGETNAME).sys: $(OBJECTS)\r
-       $(DLLTOOL) \\r
-               --dllname $(TARGETNAME).sys \\r
-               --def $(TARGETNAME).def \\r
-               --kill-at \\r
-               --output-lib $(TARGETNAME).a\r
-       $(CC) \\r
-        -mdll \\r
-        -specs=../../svc_specs \\r
-        -Wl,-e,_DriverEntry@8 \\r
-        -Wl,--base-file,base.tmp \\r
-        -Wl,--defsym,_end=end \\r
-        -Wl,--defsym,_edata=__data_end__ \\r
-        -Wl,--defsym,_etext=etext \\r
-               $(OBJECTS) \\r
-        -o junk.tmp\r
-       - $(RM) junk.tmp\r
-       $(DLLTOOL) \\r
-        --dllname $(TARGETNAME).sys \\r
-        --base-file base.tmp \\r
-        --output-exp temp.exp \\r
-        --def $(TARGETNAME).edf\r
-       - $(RM) base.tmp\r
-       $(CC) \\r
-        -mdll \\r
-        -specs=../../svc_specs \\r
-        -Wl,--image-base,0x10000 \\r
-        -Wl,-e,_DriverEntry@8 \\r
-        -Wl,temp.exp \\r
-               $(OBJECTS) \\r
-        -o $(TARGETNAME).sys\r
-       - $(RM) temp.exp\r
-       $(NM) --numeric-sort $(TARGETNAME).sys > $(TARGETNAME).sym\r
-\r
-clean: $(CLEAN_FILES:%=%_clean)\r
-\r
-$(CLEAN_FILES:%=%_clean): %_clean:\r
-       - $(RM) $*\r
-\r
-.PHONY: clean $(CLEAN_FILES:%=%_clean)\r
-\r
-floppy: $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys\r
-\r
-$(FLOPPY_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys\r
-ifeq ($(DOSCLI),yes)\r
-       $(CP) $(TARGETNAME).sys $(FLOPPY_DIR)\drivers\$(TARGETNAME).sys\r
-else\r
-       $(CP) $(TARGETNAME).sys $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys\r
-endif\r
-\r
-dist: $(DIST_DIR)/drivers/$(TARGETNAME).sys\r
-\r
-$(DIST_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys\r
-ifeq ($(DOSCLI),yes)\r
-       $(CP) $(TARGETNAME).sys ..\..\$(DIST_DIR)\drivers\$(TARGETNAME).sys\r
-else\r
-       $(CP) $(TARGETNAME).sys ../../$(DIST_DIR)/drivers/$(TARGETNAME).sys\r
-endif\r
-\r
-#WITH_DEBUGGING      = yes\r
-#WIN32_LEAN_AND_MEAN = yes\r
-#WARNINGS_ARE_ERRORS = yes\r
-include ../../../rules.mak\r
+# TCPIP.SYS - TCP/IP protocol driver
+
+TARGETNAME=tcpip
+
+BASE_CFLAGS = -I./include -I../../../include
+
+RESOURCE_OBJECT  = $(TARGETNAME).coff
+TCPIP_OBJECTS    = tcpip/main.o tcpip/address.o tcpip/checksum.o \
+                   tcpip/dispatch.o tcpip/fileobjs.o tcpip/info.o \
+                   tcpip/pool.o tcpip/routines.o
+DATALINK_OBJECTS = datalink/arp.o datalink/lan.o datalink/loopback.o
+NETWORK_OBJECTS  = network/icmp.o network/ip.o network/neighbor.o \
+                   network/receive.o network/route.o network/router.o \
+                   network/transmit.o
+DATAGRAM_OBJECTS = transport/datagram/datagram.o
+RAWIP_OBJECTS    = transport/rawip/rawip.o
+TCP_OBJECTS      = transport/tcp/tcp.o
+UDP_OBJECTS      = transport/udp/udp.o
+
+all: objects $(TARGETNAME).sys
+
+objects:
+       mkdir objects
+
+objects/tcpip.o: $(TCPIP_OBJECTS)
+       $(LD) -r -o objects/tcpip.o $(TCPIP_OBJECTS)
+
+objects/datalink.o: $(DATALINK_OBJECTS)
+       $(LD) -r -o objects/datalink.o $(DATALINK_OBJECTS)
+
+objects/network.o: $(NETWORK_OBJECTS)
+       $(LD) -r -o objects/network.o $(NETWORK_OBJECTS)
+
+objects/datagram.o: $(DATAGRAM_OBJECTS)
+       $(LD) -r -o objects/datagram.o $(DATAGRAM_OBJECTS)
+
+objects/rawip.o: $(RAWIP_OBJECTS)
+       $(LD) -r -o objects/rawip.o $(RAWIP_OBJECTS)
+
+objects/tcp.o: $(TCP_OBJECTS)
+       $(LD) -r -o objects/tcp.o $(TCP_OBJECTS)
+
+objects/udp.o: $(UDP_OBJECTS)
+       $(LD) -r -o objects/udp.o $(UDP_OBJECTS)
+
+OBJECTS = objects/tcpip.o objects/datalink.o objects/network.o \
+          objects/datagram.o objects/rawip.o objects/tcp.o objects/udp.o \
+          $(RESOURCE_OBJECT) \
+          ../../../ntoskrnl/ntoskrnl.a ../ndis/ndis.a
+
+$(TARGETNAME).coff: $(TARGETNAME).rc ../../../include/reactos/resource.h
+
+ifeq ($(DOSCLI),yes)
+CLEAN_FILES = \
+               *.o objects\*.o tcpip\*.o datalink\*.o network\*.o \
+        transport\datagram\*.o transport\rawip\*.o \
+        transport\tcp\*.o transport\udp\*.o $(TARGETNAME).coff \
+        $(TARGETNAME).a junk.tmp base.tmp temp.exp \
+               $(TARGETNAME).sys $(TARGETNAME).sym
+else
+CLEAN_FILES = \
+               *.o objects/*.o tcpip/*.o datalink/*.o network/*.o \
+        transport/datagram/*.o transport/rawip/*.o \
+        transport/tcp/*.o transport/udp/*.o $(TARGETNAME).coff \
+        $(TARGETNAME).a junk.tmp base.tmp temp.exp \
+               $(TARGETNAME).sys $(TARGETNAME).sym
+endif
+
+
+$(TARGETNAME).sys: $(OBJECTS)
+       $(DLLTOOL) \
+               --dllname $(TARGETNAME).sys \
+               --def $(TARGETNAME).def \
+               --kill-at \
+               --output-lib $(TARGETNAME).a
+       $(CC) \
+        -mdll \
+        -specs=../../svc_specs \
+        -Wl,-e,_DriverEntry@8 \
+        -Wl,--base-file,base.tmp \
+        -Wl,--defsym,_end=end \
+        -Wl,--defsym,_edata=__data_end__ \
+        -Wl,--defsym,_etext=etext \
+               $(OBJECTS) \
+        -o junk.tmp
+       - $(RM) junk.tmp
+       $(DLLTOOL) \
+        --dllname $(TARGETNAME).sys \
+        --base-file base.tmp \
+        --output-exp temp.exp \
+        --def $(TARGETNAME).edf
+       - $(RM) base.tmp
+       $(CC) \
+        -mdll \
+        -specs=../../svc_specs \
+        -Wl,--image-base,0x10000 \
+        -Wl,-e,_DriverEntry@8 \
+        -Wl,temp.exp \
+               $(OBJECTS) \
+        -o $(TARGETNAME).sys
+       - $(RM) temp.exp
+       $(NM) --numeric-sort $(TARGETNAME).sys > $(TARGETNAME).sym
+
+clean: $(CLEAN_FILES:%=%_clean)
+
+$(CLEAN_FILES:%=%_clean): %_clean:
+       - $(RM) $*
+
+.PHONY: clean $(CLEAN_FILES:%=%_clean)
+
+floppy: $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys
+
+$(FLOPPY_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys
+ifeq ($(DOSCLI),yes)
+       $(CP) $(TARGETNAME).sys $(FLOPPY_DIR)\drivers\$(TARGETNAME).sys
+else
+       $(CP) $(TARGETNAME).sys $(FLOPPY_DIR)/drivers/$(TARGETNAME).sys
+endif
+
+dist: $(DIST_DIR)/drivers/$(TARGETNAME).sys
+
+$(DIST_DIR)/drivers/$(TARGETNAME).sys: $(TARGETNAME).sys
+ifeq ($(DOSCLI),yes)
+       $(CP) $(TARGETNAME).sys ..\..\$(DIST_DIR)\drivers\$(TARGETNAME).sys
+else
+       $(CP) $(TARGETNAME).sys ../../$(DIST_DIR)/drivers/$(TARGETNAME).sys
+endif
+
+#WITH_DEBUGGING      = yes
+#WIN32_LEAN_AND_MEAN = yes
+#WARNINGS_ARE_ERRORS = yes
+include ../../../rules.mak
index 9c985f5..5818975 100644 (file)
@@ -1,7 +1,7 @@
-#\r
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source\r
-# file to this component.  This file merely indirects to the real make file\r
-# that is shared by all the driver components of the Windows NT DDK\r
-#\r
-\r
-!INCLUDE $(NTMAKEENV)\makefile.def\r
+#
+# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
+# file to this component.  This file merely indirects to the real make file
+# that is shared by all the driver components of the Windows NT DDK
+#
+
+!INCLUDE $(NTMAKEENV)\makefile.def
index 0768416..3723ad5 100644 (file)
@@ -1,20 +1,20 @@
-TARGETNAME=network\r
-TARGETPATH=..\objects\r
-TARGETTYPE=LIBRARY\r
-\r
-TARGETLIBS=$(DDK_LIB_PATH)\tdi.lib \\r
-           $(DDK_LIB_PATH)\ndis.lib\r
-\r
-INCLUDES=..\include;$(BASEDIR)\INC;..\..\..\..\include\net\r
-\r
-\r
-SOURCES= icmp.c \\r
-                ip.c \\r
-         neighbor.c \\r
-                receive.c \\r
-         route.c \\r
-         router.c \\r
-                transmit.c\r
-\r
-MSC_WARNING_LEVEL=/W3 /WX\r
-\r
+TARGETNAME=network
+TARGETPATH=..\objects
+TARGETTYPE=LIBRARY
+
+TARGETLIBS=$(DDK_LIB_PATH)\tdi.lib \
+           $(DDK_LIB_PATH)\ndis.lib
+
+INCLUDES=..\include;$(BASEDIR)\INC;..\..\..\..\include\net
+
+
+SOURCES= icmp.c \
+                ip.c \
+         neighbor.c \
+                receive.c \
+         route.c \
+         router.c \
+                transmit.c
+
+MSC_WARNING_LEVEL=/W3 /WX
+
index f75e6b0..297d69d 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        network/icmp.c\r
- * PURPOSE:     Internet Control Message Protocol routines\r
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)\r
- * REVISIONS:\r
- *   CSH 01/08-2000 Created\r
- */\r
-#include <tcpip.h>\r
-#include <icmp.h>\r
-#include <checksum.h>\r
-#include <routines.h>\r
-#include <transmit.h>\r
-#include <pool.h>\r
-\r
-\r
-VOID SendICMPComplete(\r
-    PVOID Context,\r
-    PNDIS_PACKET Packet,\r
-    NDIS_STATUS NdisStatus)\r
-/*\r
- * FUNCTION: ICMP datagram transmit completion handler\r
- * ARGUMENTS:\r
- *     Context    = Pointer to context infomation (IP_PACKET)\r
- *     Packet     = Pointer to NDIS packet\r
- *     NdisStatus = Status of transmit operation\r
- * NOTES:\r
- *     This routine is called by IP when a ICMP send completes\r
- */\r
-{\r
-    PIP_PACKET IPPacket = (PIP_PACKET)Context;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called.\n"));\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Freeing NDIS packet (%X).\n", Packet));\r
-\r
-    /* Free packet */\r
-    FreeNdisPacket(Packet);\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Freeing IP packet at %X.\n", IPPacket));\r
-\r
-    PoolFreeBuffer(IPPacket);\r
-}\r
-\r
-\r
-PIP_PACKET PrepareICMPPacket(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_ADDRESS Destination,\r
-    UINT DataSize)\r
-/*\r
- * FUNCTION: Prepares an ICMP packet\r
- * ARGUMENTS:\r
- *     NTE         = Pointer to net table entry to use\r
- *     Destination = Pointer to destination address\r
- *     DataSize    = Size of dataarea\r
- * RETURNS:\r
- *     Pointer to IP packet, NULL if there is not enough free resources\r
- */\r
-{\r
-    PIP_PACKET IPPacket;\r
-    PNDIS_PACKET NdisPacket;\r
-    PNDIS_BUFFER NdisBuffer;\r
-    NDIS_STATUS NdisStatus;\r
-    PIPv4_HEADER IPHeader;\r
-    PVOID DataBuffer;\r
-    ULONG Size;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Called. DataSize = %d.\n", DataSize));\r
-\r
-    /* Prepare ICMP packet */\r
-    IPPacket = PoolAllocateBuffer(sizeof(IP_PACKET));\r
-    if (!IPPacket)\r
-        return NULL;\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("IPPacket at %X.\n", IPPacket));\r
-\r
-    Size = MaxLLHeaderSize + sizeof(IPv4_HEADER) +\r
-        sizeof(ICMP_HEADER) + DataSize;\r
-    DataBuffer = ExAllocatePool(NonPagedPool, Size);\r
-    if (!DataBuffer) {\r
-        PoolFreeBuffer(IPPacket);\r
-        return NULL;\r
-    }\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("Size = %d, Data at %X.\n", Size, DataBuffer));\r
-\r
-    /* Allocate NDIS packet */\r
-    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        PoolFreeBuffer(IPPacket);\r
-        ExFreePool(DataBuffer);\r
-        return NULL;\r
-    }\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("NdisPacket at %X.\n", NdisPacket));\r
-\r
-    /* Allocate NDIS buffer for maximum link level header and ICMP packet */\r
-    NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool,\r
-        DataBuffer, Size);\r
-    if (NdisStatus != NDIS_STATUS_SUCCESS) {\r
-        PoolFreeBuffer(IPPacket);\r
-        NdisFreePacket(NdisPacket);\r
-        ExFreePool(DataBuffer);\r
-        return NULL;\r
-    }\r
-\r
-    TI_DbgPrint(MAX_TRACE, ("NdisBuffer at %X.\n", NdisBuffer));\r
-\r
-    /* Link NDIS buffer into packet */\r
-    NdisChainBufferAtFront(NdisPacket, NdisBuffer);\r
-    IPPacket->NdisPacket = NdisPacket;\r
-    IPPacket->Header     = (PVOID)((ULONG_PTR)DataBuffer + MaxLLHeaderSize);\r
-    IPPacket->Data       = (PVOID)((ULONG_PTR)DataBuffer + MaxLLHeaderSize + sizeof(IPv4_HEADER));\r
-\r
-    IPPacket->HeaderSize = sizeof(IPv4_HEADER);\r
-    IPPacket->TotalSize  = Size - MaxLLHeaderSize;\r
-    RtlCopyMemory(&IPPacket->DstAddr, Destination, sizeof(IP_ADDRESS));\r
-\r
-    /* Build IPv4 header. FIXME: IPv4 only */\r
-\r
-    IPHeader = (PIPv4_HEADER)IPPacket->Header;\r
-\r
-    /* Version = 4, Length = 5 DWORDs */\r
-    IPHeader->VerIHL = 0x45;\r
-    /* Normal Type-of-Service */\r
-    IPHeader->Tos = 0;\r
-    /* Length of data and header */\r
-    IPHeader->TotalLength = WH2N((USHORT)DataSize +\r
-        sizeof(IPv4_HEADER) + sizeof(ICMP_HEADER));\r
-    /* Identification */\r
-    IPHeader->Id = (USHORT)Random();\r
-    /* One fragment at offset 0 */\r
-    IPHeader->FlagsFragOfs = 0;\r
-    /* Time-to-Live is 128 */\r
-    IPHeader->Ttl = 128;\r
-    /* Internet Control Message Protocol */\r
-    IPHeader->Protocol = IPPROTO_ICMP;\r
-    /* Checksum is 0 (for later calculation of this) */\r
-    IPHeader->Checksum = 0;\r
-    /* Source address */\r
-    IPHeader->SrcAddr = NTE->Address->Address.IPv4Address;\r
-    /* Destination address */\r
-    IPHeader->DstAddr = Destination->Address.IPv4Address;\r
-\r
-    /* Completion handler */\r
-    PC(NdisPacket)->Complete = SendICMPComplete;\r
-    PC(NdisPacket)->Context  = IPPacket;\r
-\r
-    return IPPacket;\r
-}\r
-\r
-\r
-VOID ICMPReceive(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket)\r
-/*\r
- * FUNCTION: Receives an ICMP packet\r
- * ARGUMENTS:\r
- *     NTE      = Pointer to net table entry which the packet was received on\r
- *     IPPacket = Pointer to an IP packet that was received\r
- */\r
-{\r
-    PICMP_HEADER ICMPHeader;\r
-    PIP_PACKET NewPacket;\r
-    UINT DataSize;\r
-    ULONG Checksum;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    ICMPHeader = (PICMP_HEADER)IPPacket->Data;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Size = %d.\n", IPPacket->TotalSize));\r
-\r
-    TI_DbgPrint(MID_TRACE, ("HeaderSize = %d.\n", IPPacket->HeaderSize));\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Type = %d.\n", ICMPHeader->Type));\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Code = %d.\n", ICMPHeader->Code));\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Checksum = %X.\n", ICMPHeader->Checksum));\r
-\r
-    /* Checksum ICMP header and data and compare */\r
-    Checksum = DN2H(IPv4Checksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize, 0));\r
-    if (Checksum != 0xFFFF) {\r
-        TI_DbgPrint(MIN_TRACE, ("Bad ICMP checksum (0x%X).\n", Checksum));\r
-        /* Discard packet */\r
-        return;\r
-    }\r
-\r
-    switch (ICMPHeader->Type) {\r
-    case ICMP_TYPE_ECHO_REQUEST:\r
-        /* Reply with an ICMP echo reply message */\r
-        DataSize  = IPPacket->TotalSize - IPPacket->HeaderSize - sizeof(ICMP_HEADER);\r
-        NewPacket = PrepareICMPPacket(NTE, &IPPacket->SrcAddr, DataSize);\r
-        if (!NewPacket)\r
-            return;\r
-\r
-        /* Copy ICMP header and data into new packet */\r
-        RtlCopyMemory(NewPacket->Data, IPPacket->Data, DataSize  + sizeof(ICMP_HEADER));\r
-        ((PICMP_HEADER)NewPacket->Data)->Type     = ICMP_TYPE_ECHO_REPLY;\r
-        ((PICMP_HEADER)NewPacket->Data)->Code     = 0;\r
-        ((PICMP_HEADER)NewPacket->Data)->Checksum = 0;\r
-\r
-        ICMPTransmit(NTE, NewPacket);\r
-\r
-        TI_DbgPrint(MID_TRACE, ("Echo reply sent.\n"));\r
-\r
-        return;\r
-    default:\r
-        TI_DbgPrint(MID_TRACE, ("Discarded ICMP datagram of unknown type.\n"));\r
-        /* Discard packet */\r
-        break;\r
-    }\r
-}\r
-\r
-\r
-VOID ICMPTransmit(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket)\r
-/*\r
- * FUNCTION: Transmits an ICMP packet\r
- * ARGUMENTS:\r
- *     NTE      = Pointer to net table entry to use (NULL if don't care)\r
- *     IPPacket = Pointer to IP packet to transmit\r
- */\r
-{\r
-    PROUTE_CACHE_NODE RCN;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called.\n"));\r
-\r
-    /* Calculate checksum of ICMP header and data */\r
-    ((PICMP_HEADER)IPPacket->Data)->Checksum = (USHORT)\r
-        IPv4Checksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize, 0);\r
-\r
-    /* Get a route to the destination address */\r
-    if (RouteGetRouteToDestination(&IPPacket->DstAddr, NTE, &RCN) == IP_SUCCESS) {\r
-        /* Send the packet */\r
-        if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) {\r
-            FreeNdisPacket(IPPacket->NdisPacket);\r
-            PoolFreeBuffer(IPPacket);\r
-        }\r
-        /* We're done with the RCN */\r
-        DereferenceObject(RCN);\r
-    } else {\r
-        TI_DbgPrint(MIN_TRACE, ("RCN at 0x%X.\n", RCN));\r
-\r
-        /* No route to destination (or no free resources) */\r
-        TI_DbgPrint(MIN_TRACE, ("No route to destination address 0x%X.\n",\r
-            IPPacket->DstAddr.Address.IPv4Address));\r
-        /* Discard packet */\r
-        FreeNdisPacket(IPPacket->NdisPacket);\r
-        PoolFreeBuffer(IPPacket);\r
-    }\r
-}\r
-\r
-\r
-VOID ICMPReply(\r
-    PNET_TABLE_ENTRY NTE,\r
-    PIP_PACKET IPPacket,\r
-       UCHAR Type,\r
-       UCHAR Code)\r
-/*\r
- * FUNCTION: Transmits an ICMP packet in response to an incoming packet\r
- * ARGUMENTS:\r
- *     NTE      = Pointer to net table entry to use\r
- *     IPPacket = Pointer to IP packet that was received\r
- *     Type     = ICMP message type\r
- *     Code     = ICMP message code\r
- * NOTES:\r
- *     We have received a packet from someone and is unable to\r
- *     process it due to error(s) in the packet or we have run out\r
- *     of resources. We transmit an ICMP message to the host to\r
- *     notify him of the problem\r
- */\r
-{\r
-    UINT DataSize;\r
-    PIP_PACKET NewPacket;\r
-\r
-    TI_DbgPrint(MID_TRACE, ("Called (Type=%d, Code=%d).\n", Type, Code));\r
-\r
-    DataSize = IPPacket->TotalSize;\r
-    if ((DataSize) > (576 - sizeof(IPv4_HEADER) - sizeof(ICMP_HEADER)))\r
-        DataSize = 576;\r
-\r
-    NewPacket = PrepareICMPPacket(NTE, &IPPacket->SrcAddr, DataSize);\r
-    if (!NewPacket)\r
-        return;\r
-\r
-    RtlCopyMemory((PVOID)((ULONG_PTR)NewPacket->Data + sizeof(ICMP_HEADER)),\r
-        IPPacket->Header, DataSize);\r
-    ((PICMP_HEADER)NewPacket->Data)->Type     = Type;\r
-    ((PICMP_HEADER)NewPacket->Data)->Code     = Code;\r
-    ((PICMP_HEADER)NewPacket->Data)->Checksum = 0;\r
-\r
-    ICMPTransmit(NTE, NewPacket);\r
-}\r
-\r
-/* EOF */\r
+/*
+ * COPYRIGHT:   See COPYING in the top level directory
+ * PROJECT:     ReactOS TCP/IP protocol driver
+ * FILE:        network/icmp.c
+ * PURPOSE:     Internet Control Message Protocol routines
+ * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
+ * REVISIONS:
+ *   CSH 01/08-2000 Created
+ */
+#include <tcpip.h>
+#include <icmp.h>
+#include <checksum.h>
+#include <routines.h>
+#include <transmit.h>
+#include <pool.h>
+
+
+VOID SendICMPComplete(
+    PVOID Context,
+    PNDIS_PACKET Packet,
+    NDIS_STATUS NdisStatus)
+/*
+ * FUNCTION: ICMP datagram transmit completion handler
+ * ARGUMENTS:
+ *     Context    = Pointer to context infomation (IP_PACKET)
+ *     Packet     = Pointer to NDIS packet
+ *     NdisStatus = Status of transmit operation
+ * NOTES:
+ *     This routine is called by IP when a ICMP send completes
+ */
+{
+    PIP_PACKET IPPacket = (PIP_PACKET)Context;
+
+    TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+
+    TI_DbgPrint(MAX_TRACE, ("Freeing NDIS packet (%X).\n", Packet));
+
+    /* Free packet */
+    FreeNdisPacket(Packet);
+
+    TI_DbgPrint(MAX_TRACE, ("Freeing IP packet at %X.\n", IPPacket));
+
+    PoolFreeBuffer(IPPacket);
+}
+
+
+PIP_PACKET PrepareICMPPacket(
+    PNET_TABLE_ENTRY NTE,
+    PIP_ADDRESS Destination,
+    UINT DataSize)
+/*
+ * FUNCTION: Prepares an ICMP packet
+ * ARGUMENTS:
+ *     NTE         = Pointer to net table entry to use
+ *     Destination = Pointer to destination address
+ *     DataSize    = Size of dataarea
+ * RETURNS:
+ *     Pointer to IP packet, NULL if there is not enough free resources
+ */
+{
+    PIP_PACKET IPPacket;
+    PNDIS_PACKET NdisPacket;
+    PNDIS_BUFFER NdisBuffer;
+    NDIS_STATUS NdisStatus;
+    PIPv4_HEADER IPHeader;
+    PVOID DataBuffer;
+    ULONG Size;
+
+    TI_DbgPrint(MAX_TRACE, ("Called. DataSize = %d.\n", DataSize));
+
+    /* Prepare ICMP packet */
+    IPPacket = PoolAllocateBuffer(sizeof(IP_PACKET));
+    if (!IPPacket)
+        return NULL;
+
+    TI_DbgPrint(MAX_TRACE, ("IPPacket at %X.\n", IPPacket));
+
+    Size = MaxLLHeaderSize + sizeof(IPv4_HEADER) +
+        sizeof(ICMP_HEADER) + DataSize;
+    DataBuffer = ExAllocatePool(NonPagedPool, Size);
+    if (!DataBuffer) {
+        PoolFreeBuffer(IPPacket);
+        return NULL;
+    }
+
+    TI_DbgPrint(MAX_TRACE, ("Size = %d, Data at %X.\n", Size, DataBuffer));
+
+    /* Allocate NDIS packet */
+    NdisAllocatePacket(&NdisStatus, &NdisPacket, GlobalPacketPool);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        PoolFreeBuffer(IPPacket);
+        ExFreePool(DataBuffer);
+        return NULL;
+    }
+
+    TI_DbgPrint(MAX_TRACE, ("NdisPacket at %X.\n", NdisPacket));
+
+    /* Allocate NDIS buffer for maximum link level header and ICMP packet */
+    NdisAllocateBuffer(&NdisStatus, &NdisBuffer, GlobalBufferPool,
+        DataBuffer, Size);
+    if (NdisStatus != NDIS_STATUS_SUCCESS) {
+        PoolFreeBuffer(IPPacket);
+        NdisFreePacket(NdisPacket);
+        ExFreePool(DataBuffer);
+        return NULL;
+    }
+
+    TI_DbgPrint(MAX_TRACE, ("NdisBuffer at %X.\n", NdisBuffer));
+
+    /* Link NDIS buffer into packet */
+    NdisChainBufferAtFront(NdisPacket, NdisBuffer);
+    IPPacket->NdisPacket = NdisPacket;
+    IPPacket->Header     = (PVOID)((ULONG_PTR)DataBuffer + MaxLLHeaderSize);
+    IPPacket->Data       = (PVOID)((ULONG_PTR)DataBuffer + MaxLLHeaderSize + sizeof(IPv4_HEADER));
+
+    IPPacket->HeaderSize = sizeof(IPv4_HEADER);
+    IPPacket->TotalSize  = Size - MaxLLHeaderSize;
+    RtlCopyMemory(&IPPacket->DstAddr, Destination, sizeof(IP_ADDRESS));
+
+    /* Build IPv4 header. FIXME: IPv4 only */
+
+    IPHeader = (PIPv4_HEADER)IPPacket->Header;
+
+    /* Version = 4, Length = 5 DWORDs */
+    IPHeader->VerIHL = 0x45;
+    /* Normal Type-of-Service */
+    IPHeader->Tos = 0;
+    /* Length of data and header */
+    IPHeader->TotalLength = WH2N((USHORT)DataSize +
+        sizeof(IPv4_HEADER) + sizeof(ICMP_HEADER));
+    /* Identification */
+    IPHeader->Id = (USHORT)Random();
+    /* One fragment at offset 0 */
+    IPHeader->FlagsFragOfs = 0;
+    /* Time-to-Live is 128 */
+    IPHeader->Ttl = 128;
+    /* Internet Control Message Protocol */
+    IPHeader->Protocol = IPPROTO_ICMP;
+    /* Checksum is 0 (for later calculation of this) */
+    IPHeader->Checksum = 0;
+    /* Source address */
+    IPHeader->SrcAddr = NTE->Address->Address.IPv4Address;
+    /* Destination address */
+    IPHeader->DstAddr = Destination->Address.IPv4Address;
+
+    /* Completion handler */
+    PC(NdisPacket)->Complete = SendICMPComplete;
+    PC(NdisPacket)->Context  = IPPacket;
+
+    return IPPacket;
+}
+
+
+VOID ICMPReceive(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket)
+/*
+ * FUNCTION: Receives an ICMP packet
+ * ARGUMENTS:
+ *     NTE      = Pointer to net table entry which the packet was received on
+ *     IPPacket = Pointer to an IP packet that was received
+ */
+{
+    PICMP_HEADER ICMPHeader;
+    PIP_PACKET NewPacket;
+    UINT DataSize;
+    ULONG Checksum;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    ICMPHeader = (PICMP_HEADER)IPPacket->Data;
+
+    TI_DbgPrint(MID_TRACE, ("Size = %d.\n", IPPacket->TotalSize));
+
+    TI_DbgPrint(MID_TRACE, ("HeaderSize = %d.\n", IPPacket->HeaderSize));
+
+    TI_DbgPrint(MID_TRACE, ("Type = %d.\n", ICMPHeader->Type));
+
+    TI_DbgPrint(MID_TRACE, ("Code = %d.\n", ICMPHeader->Code));
+
+    TI_DbgPrint(MID_TRACE, ("Checksum = %X.\n", ICMPHeader->Checksum));
+
+    /* Checksum ICMP header and data and compare */
+    Checksum = DN2H(IPv4Checksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize, 0));
+    if (Checksum != 0xFFFF) {
+        TI_DbgPrint(MIN_TRACE, ("Bad ICMP checksum (0x%X).\n", Checksum));
+        /* Discard packet */
+        return;
+    }
+
+    switch (ICMPHeader->Type) {
+    case ICMP_TYPE_ECHO_REQUEST:
+        /* Reply with an ICMP echo reply message */
+        DataSize  = IPPacket->TotalSize - IPPacket->HeaderSize - sizeof(ICMP_HEADER);
+        NewPacket = PrepareICMPPacket(NTE, &IPPacket->SrcAddr, DataSize);
+        if (!NewPacket)
+            return;
+
+        /* Copy ICMP header and data into new packet */
+        RtlCopyMemory(NewPacket->Data, IPPacket->Data, DataSize  + sizeof(ICMP_HEADER));
+        ((PICMP_HEADER)NewPacket->Data)->Type     = ICMP_TYPE_ECHO_REPLY;
+        ((PICMP_HEADER)NewPacket->Data)->Code     = 0;
+        ((PICMP_HEADER)NewPacket->Data)->Checksum = 0;
+
+        ICMPTransmit(NTE, NewPacket);
+
+        TI_DbgPrint(MID_TRACE, ("Echo reply sent.\n"));
+
+        return;
+    default:
+        TI_DbgPrint(MID_TRACE, ("Discarded ICMP datagram of unknown type.\n"));
+        /* Discard packet */
+        break;
+    }
+}
+
+
+VOID ICMPTransmit(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket)
+/*
+ * FUNCTION: Transmits an ICMP packet
+ * ARGUMENTS:
+ *     NTE      = Pointer to net table entry to use (NULL if don't care)
+ *     IPPacket = Pointer to IP packet to transmit
+ */
+{
+    PROUTE_CACHE_NODE RCN;
+
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+
+    /* Calculate checksum of ICMP header and data */
+    ((PICMP_HEADER)IPPacket->Data)->Checksum = (USHORT)
+        IPv4Checksum(IPPacket->Data, IPPacket->TotalSize - IPPacket->HeaderSize, 0);
+
+    /* Get a route to the destination address */
+    if (RouteGetRouteToDestination(&IPPacket->DstAddr, NTE, &RCN) == IP_SUCCESS) {
+        /* Send the packet */
+        if (IPSendDatagram(IPPacket, RCN) != STATUS_SUCCESS) {
+            FreeNdisPacket(IPPacket->NdisPacket);
+            PoolFreeBuffer(IPPacket);
+        }
+        /* We're done with the RCN */
+        DereferenceObject(RCN);
+    } else {
+        TI_DbgPrint(MIN_TRACE, ("RCN at 0x%X.\n", RCN));
+
+        /* No route to destination (or no free resources) */
+        TI_DbgPrint(MIN_TRACE, ("No route to destination address 0x%X.\n",
+            IPPacket->DstAddr.Address.IPv4Address));
+        /* Discard packet */
+        FreeNdisPacket(IPPacket->NdisPacket);
+        PoolFreeBuffer(IPPacket);
+    }
+}
+
+
+VOID ICMPReply(
+    PNET_TABLE_ENTRY NTE,
+    PIP_PACKET IPPacket,
+       UCHAR Type,
+       UCHAR Code)
+/*
+ * FUNCTION: Transmits an ICMP packet in response to an incoming packet
+ * ARGUMENTS:
+ *     NTE      = Pointer to net table entry to use
+ *     IPPacket = Pointer to IP packet that was received
+ *     Type     = ICMP message type
+ *     Code     = ICMP message code
+ * NOTES:
+ *     We have received a packet from someone and is unable to
+ *     process it due to error(s) in the packet or we have run out
+ *     of resources. We transmit an ICMP message to the host to
+ *     notify him of the problem
+ */
+{
+    UINT DataSize;
+    PIP_PACKET NewPacket;
+
+    TI_DbgPrint(MID_TRACE, ("Called (Type=%d, Code=%d).\n", Type, Code));
+
+    DataSize = IPPacket->TotalSize;
+    if ((DataSize) > (576 - sizeof(IPv4_HEADER) - sizeof(ICMP_HEADER)))
+        DataSize = 576;
+
+    NewPacket = PrepareICMPPacket(NTE, &IPPacket->SrcAddr, DataSize);
+    if (!NewPacket)
+        return;
+
+    RtlCopyMemory((PVOID)((ULONG_PTR)NewPacket->Data + sizeof(ICMP_HEADER)),
+        IPPacket->Header, DataSize);
+    ((PICMP_HEADER)NewPacket->Data)->Type     = Type;
+    ((PICMP_HEADER)NewPacket->Data)->Code     = Code;
+    ((PICMP_HEADER)NewPacket->Data)->Checksum = 0;
+
+    ICMPTransmit(NTE, NewPacket);
+}
+
+/* EOF */
index f15449c..1ea5af9 100644 (file)
-/*\r
- * COPYRIGHT:   See COPYING in the top level directory\r
- * PROJECT:     ReactOS TCP/IP protocol driver\r
- * FILE:        network/ip.c\r
- * PURPOSE:     Internet Protocol module\r
- * PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)\r
- * REVISIONS:\r
- *   CSH 01/08-2000 Created\r
- */\r
-#include <tcpip.h>\r
-#include <ip.h>\r
-#include <loopback.h>\r
-#include <neighbor.h>\r
-#include <receive.h>\r
-#include <address.h>\r
-#include <route.h>\r
-#include <icmp.h>\r
-#include <pool.h>\r
-\r
-\r
-KTIMER IPTimer;\r
-KDPC IPTimeoutDpc;\r
-LIST_ENTRY InterfaceListHead;\r
-KSPIN_LOCK InterfaceListLock;\r
-LIST_ENTRY NetTableListHead;\r
-KSPIN_LOCK NetTableListLock;\r
-LIST_ENTRY PrefixListHead;\r
-KSPIN_LOCK PrefixListLock;\r
-UINT MaxLLHeaderSize; /* Largest maximum header size */\r
-UINT MinLLFrameSize;  /* Largest minimum frame size */\r
-BOOLEAN IPInitialized = FALSE;\r
-\r
-IP_PROTOCOL_HANDLER ProtocolTable[IP_PROTOCOL_TABLE_SIZE];\r
-\r
-\r
-PADDRESS_ENTRY CreateADE(\r
-    PIP_INTERFACE IF,\r
-    PIP_ADDRESS Address,\r
-    UCHAR Type,\r
-    PNET_TABLE_ENTRY NTE)\r
-/*\r
- * FUNCTION: Creates an address entry and binds it to an interface\r
- * ARGUMENTS:\r
- *     IF      = Pointer to interface\r
- *     Address = Pointer to referenced interface address\r
- *     Type    = Type of address (ADE_*)\r
- *     NTE     = Pointer to net table entry\r
- * RETURNS:\r
- *     Pointer to ADE, NULL if there was not enough free resources\r
- * NOTES:\r
- *     The interface lock must be held when called. The address entry\r
- *     retains a reference to the provided address and NTE. The caller\r
- *     is responsible for referencing the these before calling.\r
- *     As long as you have referenced an ADE you can safely use the\r
- *     address and NTE as the ADE references both\r
- */\r
-{\r
-    PADDRESS_ENTRY ADE;\r
-\r
-    TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X)  Address (0x%X)  Type (0x%X)  NTE (0x%X).\n",\r
-        IF, Address, Type, NTE));\r
-\r
-    /* Allocate space for an ADE and set it up */\r
-    ADE = PoolAllocateBuffer(sizeof(ADDRESS_ENTRY));\r
-    if (!ADE) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        return NULL;\r
-    }\r
-\r
-    ADE->RefCount = 1;\r
-    ADE->NTE      = NTE;\r
-    ADE->Type     = Type;\r
-    ADE->Address  = Address;\r
-\r
-    /* Add ADE to the list on the interface */\r
-    InsertTailList(&IF->ADEListHead, &ADE->ListEntry);\r
-\r
-    return ADE;\r
-}\r
-\r
-\r
-VOID DestroyADE(\r
-    PIP_INTERFACE IF,\r
-    PADDRESS_ENTRY ADE)\r
-/*\r
- * FUNCTION: Destroys an address entry\r
- * ARGUMENTS:\r
- *     IF  = Pointer to interface\r
- *     ADE = Pointer to address entry\r
- * NOTES:\r
- *     The interface lock must be held when called\r
- */\r
-{\r
-    TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X)  ADE (0x%X).\n", IF, ADE));\r
-\r
-    /* Unlink the address entry from the list */\r
-    RemoveEntryList(&ADE->ListEntry);\r
-\r
-    /* Dereference the address */\r
-    DereferenceObject(ADE->Address);\r
-\r
-    /* Dereference the NTE */\r
-    DereferenceObject(ADE->NTE);\r
-\r
-#ifdef DBG\r
-    ADE->RefCount--;\r
-\r
-    if (ADE->RefCount != 0) {\r
-        TI_DbgPrint(MIN_TRACE, ("Address entry at (0x%X) has (%d) references (should be 0).\n", ADE, ADE->RefCount));\r
-    }\r
-#endif\r
-\r
-    /* And free the ADE */\r
-    PoolFreeBuffer(ADE);\r
-    TI_DbgPrint(MIN_TRACE, ("Check.\n"));\r
-}\r
-\r
-\r
-VOID DestroyADEs(\r
-    PIP_INTERFACE IF)\r
-/*\r
- * FUNCTION: Destroys all address entries on an interface\r
- * ARGUMENTS:\r
- *     IF  = Pointer to interface\r
- * NOTES:\r
- *     The interface lock must be held when called\r
- */\r
-{\r
-    PLIST_ENTRY CurrentEntry;\r
-    PLIST_ENTRY NextEntry;\r
-    PADDRESS_ENTRY Current;\r
-\r
-    TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X).\n", IF));\r
-\r
-    /* Search the list and remove every ADE we find */\r
-    CurrentEntry = IF->ADEListHead.Flink;\r
-    while (CurrentEntry != &IF->ADEListHead) {\r
-        NextEntry = CurrentEntry->Flink;\r
-           Current = CONTAINING_RECORD(CurrentEntry, ADDRESS_ENTRY, ListEntry);\r
-        /* Destroy the ADE */\r
-        DestroyADE(IF, Current);\r
-        CurrentEntry = NextEntry;\r
-    }\r
-}\r
-\r
-\r
-PPREFIX_LIST_ENTRY CreatePLE(\r
-    PIP_INTERFACE IF,\r
-    PIP_ADDRESS Prefix,\r
-    UINT Length)\r
-/*\r
- * FUNCTION: Creates a prefix list entry and binds it to an interface\r
- * ARGUMENTS:\r
- *     IF     = Pointer to interface\r
- *     Prefix = Pointer to prefix\r
- *     Length = Length of prefix\r
- * RETURNS:\r
- *     Pointer to PLE, NULL if there was not enough free resources\r
- * NOTES:\r
- *     The prefix list entry retains a reference to the interface and\r
- *     the provided address.  The caller is responsible for providing\r
- *     these references\r
- */\r
-{\r
-    PPREFIX_LIST_ENTRY PLE;\r
-\r
-    TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X)  Prefix (0x%X)  Length (%d).\n", IF, Prefix, Length));\r
-\r
-    /* Allocate space for an PLE and set it up */\r
-    PLE = PoolAllocateBuffer(sizeof(PREFIX_LIST_ENTRY));\r
-    if (!PLE) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        return NULL;\r
-    }\r
-\r
-    PLE->RefCount     = 1;\r
-    PLE->Interface    = IF;\r
-    PLE->Prefix       = Prefix;\r
-    PLE->PrefixLength = Length;\r
-\r
-    /* Add PLE to the global prefix list */\r
-    ExInterlockedInsertTailList(&PrefixListHead, &PLE->ListEntry, &PrefixListLock);\r
-\r
-    return PLE;\r
-}\r
-\r
-\r
-VOID DestroyPLE(\r
-    PPREFIX_LIST_ENTRY PLE)\r
-/*\r
- * FUNCTION: Destroys an prefix list entry\r
- * ARGUMENTS:\r
- *     PLE = Pointer to prefix list entry\r
- * NOTES:\r
- *     The prefix list lock must be held when called\r
- */\r
-{\r
-    TI_DbgPrint(DEBUG_IP, ("Called. PLE (0x%X).\n", PLE));\r
-\r
-    /* Unlink the prefix list entry from the list */\r
-    RemoveEntryList(&PLE->ListEntry);\r
-\r
-    /* Dereference the address */\r
-    DereferenceObject(PLE->Prefix);\r
-\r
-    /* Dereference the interface */\r
-    DereferenceObject(PLE->Interface);\r
-\r
-#ifdef DBG\r
-    PLE->RefCount--;\r
-\r
-    if (PLE->RefCount != 0) {\r
-        TI_DbgPrint(MIN_TRACE, ("Prefix list entry at (0x%X) has (%d) references (should be 0).\n", PLE, PLE->RefCount));\r
-    }\r
-#endif\r
-\r
-    /* And free the PLE */\r
-    PoolFreeBuffer(PLE);\r
-}\r
-\r
-\r
-VOID DestroyPLEs(\r
-    VOID)\r
-/*\r
- * FUNCTION: Destroys all prefix list entries\r
- */\r
-{\r
-    KIRQL OldIrql;\r
-    PLIST_ENTRY CurrentEntry;\r
-    PLIST_ENTRY NextEntry;\r
-    PPREFIX_LIST_ENTRY Current;\r
-\r
-    TI_DbgPrint(DEBUG_IP, ("Called.\n"));\r
-\r
-    KeAcquireSpinLock(&PrefixListLock, &OldIrql);\r
-\r
-    /* Search the list and remove every PLE we find */\r
-    CurrentEntry = PrefixListHead.Flink;\r
-    while (CurrentEntry != &PrefixListHead) {\r
-        NextEntry = CurrentEntry->Flink;\r
-           Current = CONTAINING_RECORD(CurrentEntry, PREFIX_LIST_ENTRY, ListEntry);\r
-        /* Destroy the PLE */\r
-        DestroyPLE(Current);\r
-        CurrentEntry = NextEntry;\r
-    }\r
-    KeReleaseSpinLock(&PrefixListLock, OldIrql);\r
-}\r
-\r
-\r
-PNET_TABLE_ENTRY IPCreateNTE(\r
-    PIP_INTERFACE IF,\r
-    PIP_ADDRESS Address,\r
-    UINT PrefixLength)\r
-/*\r
- * FUNCTION: Creates a net table entry and binds it to an interface\r
- * ARGUMENTS:\r
- *     IF           = Pointer to interface\r
- *     Address      = Pointer to interface address\r
- *     PrefixLength = Length of prefix\r
- * RETURNS:\r
- *     Pointer to NTE, NULL if there was not enough free resources\r
- * NOTES:\r
- *     The interface lock must be held when called.\r
- *     The net table entry retains a reference to the interface and\r
- *     the provided address. The caller is responsible for providing\r
- *     these references\r
- */\r
-{\r
-    PNET_TABLE_ENTRY NTE;\r
-    PADDRESS_ENTRY ADE;\r
-\r
-    TI_DbgPrint(DEBUG_IP, ("Called. IF (0x%X)  Address (0x%X)  PrefixLength (%d).\n", IF, Address, PrefixLength));\r
-\r
-    /* Allocate room for an NTE */\r
-    NTE = PoolAllocateBuffer(sizeof(NET_TABLE_ENTRY));\r
-    if (!NTE) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        return NULL;\r
-    }\r
-\r
-    NTE->Interface = IF;\r
-\r
-    /* One reference is for beeing alive and one reference is for the ADE */\r
-    NTE->RefCount = 2;\r
-\r
-    NTE->Address = Address;\r
-    /* One reference is for NTE, one reference is given to the\r
-       address entry, and one reference is given to the prefix\r
-       list entry */\r
-    ReferenceObject(Address);\r
-    ReferenceObject(Address);\r
-    ReferenceObject(Address);\r
-\r
-    /* Create an address entry and add it to the list */\r
-    ADE = CreateADE(IF, NTE->Address, ADE_UNICAST, NTE);\r
-    if (!ADE) {\r
-        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));\r
-        PoolFreeBuffer(NTE);\r
-        return NULL;\r
-    }\r
-\r
-    /* Create a prefix list entry for unicast address */\r
-    NTE->PLE = CreatePLE(IF, NTE->Address, PrefixLength);\r