Author: cgutman
Date: Sun Nov  9 12:17:00 2008
New Revision: 37267
URL: 
http://svn.reactos.org/svn/reactos?rev=37267&view=rev
Log:
 - Merge aicom-network-fixes up to r37266
Modified:
    trunk/reactos/drivers/network/afd/afd/info.c
    trunk/reactos/drivers/network/afd/afd/lock.c
    trunk/reactos/drivers/network/afd/afd/read.c
    trunk/reactos/drivers/network/afd/afd/tdi.c
    trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c
    trunk/reactos/lib/drivers/ip/ip.rbuild
    trunk/reactos/lib/drivers/ip/network/icmp.c
    trunk/reactos/lib/drivers/ip/network/ip.c
    trunk/reactos/lib/drivers/ip/network/loopback.c
    trunk/reactos/lib/drivers/ip/network/neighbor.c
    trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
    trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
Modified: trunk/reactos/drivers/network/afd/afd/info.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/in…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -83,11 +83,6 @@
     if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
-    if( FCB->AddressFile.Object == NULL) {
-       return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
-                                      NULL );
-    }
-
     Mdl = IoAllocateMdl
        ( Irp->UserBuffer,
          IrpSp->Parameters.DeviceIoControl.OutputBufferLength,
@@ -105,11 +100,21 @@
        if( NT_SUCCESS(Status) ) {
             if( Local ) {
+                if( FCB->AddressFile.Object == NULL ) {
+                   return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
+                                                  NULL );
+                }
+
                 Status = TdiQueryInformation
                     ( FCB->AddressFile.Object,
                       TDI_QUERY_ADDRESS_INFO,
                       Mdl );
             } else {
+                if( FCB->Connection.Object == NULL ) {
+                   return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0,
+                                                  NULL );
+                }
+
                 if( NT_SUCCESS
                     ( Status = TdiBuildNullConnectionInfo
                       ( &ConnInfo,
Modified: trunk/reactos/drivers/network/afd/afd/lock.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/lo…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -25,7 +25,7 @@
                       NULL );
     if( Irp->MdlAddress ) {
        _SEH_TRY {
-           MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess );
+           MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess
);
        } _SEH_HANDLE {
            LockFailed = TRUE;
        } _SEH_END;
Modified: trunk/reactos/drivers/network/afd/afd/read.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/re…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -425,7 +425,7 @@
         *TotalBytesCopied = BytesToCopy;
-        if (!RecvReq->TdiFlags & TDI_RECEIVE_PEEK) {
+        if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK)) {
             FCB->Recv.BytesUsed = 0;
         }
     }
Modified: trunk/reactos/drivers/network/afd/afd/tdi.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/td…
==============================================================================
--- trunk/reactos/drivers/network/afd/afd/tdi.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/afd/afd/tdi.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -74,7 +74,7 @@
         KeWaitForSingleObject(
           Event,
           Executive,
-          UserMode,
+          KernelMode,
           FALSE,
           NULL);
         Status = Iosb->Status;
@@ -853,7 +853,7 @@
                         BufferLength,   /* Length of buffer */
                         FALSE,          /* Not secondary */
                         FALSE,          /* Don't charge quota */
-                        *Irp);          /* use IRP */
+                        *Irp);          /* Use IRP */
     if (!Mdl) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
         IoFreeIrp(*Irp);
@@ -862,7 +862,7 @@
     }
     _SEH_TRY {
-        MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
     } _SEH_HANDLE {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
        IoFreeMdl(Mdl);
@@ -934,7 +934,7 @@
                         BufferLength,   /* Length of buffer */
                         FALSE,          /* Not secondary */
                         FALSE,          /* Don't charge quota */
-                        *Irp);          /* Don't use IRP */
+                        *Irp);          /* Use IRP */
     if (!Mdl) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
         IoFreeIrp(*Irp);
@@ -944,7 +944,7 @@
     _SEH_TRY {
         AFD_DbgPrint(MIN_TRACE, ("probe and lock\n"));
-        MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
         AFD_DbgPrint(MIN_TRACE, ("probe and lock done\n"));
     } _SEH_HANDLE {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
@@ -1034,7 +1034,7 @@
                         BufferLength,   /* Length of buffer */
                         FALSE,          /* Not secondary */
                         FALSE,          /* Don't charge quota */
-                        *Irp);          /* Don't use IRP */
+                        *Irp);          /* Use IRP */
     if (!Mdl) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
         IoFreeIrp(*Irp);
@@ -1043,7 +1043,7 @@
     }
     _SEH_TRY {
-        MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
     } _SEH_HANDLE {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
        IoFreeMdl(Mdl);
@@ -1132,7 +1132,7 @@
                         BufferLength,   /* Length of buffer */
                         FALSE,          /* Not secondary */
                         FALSE,          /* Don't charge quota */
-                        *Irp);          /* Don't use IRP */
+                        *Irp);          /* Use IRP */
     if (!Mdl) {
         AFD_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
@@ -1142,7 +1142,7 @@
     }
     _SEH_TRY {
-        MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
     } _SEH_HANDLE {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
        IoFreeMdl(Mdl);
Modified: trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/tcpip/tcpi…
==============================================================================
--- trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/network/tcpip/tcpip/fileobjs.c [iso-8859-1] Sun Nov  9 12:17:00
2008
@@ -220,7 +220,7 @@
   RemoveEntryList(&Connection->ListEntry);
   TcpipReleaseSpinLock(&ConnectionEndpointListLock, OldIrql);
-  ExFreePool(Connection);
+  TCPFreeConnectionEndpoint(Connection);
   TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
 }
@@ -387,8 +387,10 @@
   switch (AddrFile->Protocol) {
   case IPPROTO_TCP:
     TCPFreePort( AddrFile->Port );
-    if( AddrFile->Listener )
-       TCPClose( AddrFile->Listener );
+    if( AddrFile->Listener ) {
+           TCPClose( AddrFile->Listener );
+           ExFreePool( AddrFile->Listener );
+    }
     break;
   case IPPROTO_UDP:
@@ -488,20 +490,18 @@
   PTDI_REQUEST Request)
 {
   PCONNECTION_ENDPOINT Connection;
-  NTSTATUS Status = STATUS_SUCCESS;
   TI_DbgPrint(MID_TRACE, ("Called.\n"));
   Connection = Request->Handle.ConnectionContext;
   TcpipRecursiveMutexEnter( &TCPLock, TRUE );
-  TCPClose(Connection);
   DeleteConnectionEndpoint(Connection);
   TcpipRecursiveMutexLeave( &TCPLock );
   TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-  return Status;
+  return STATUS_SUCCESS;
 }
Modified: trunk/reactos/lib/drivers/ip/ip.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/ip.rbuild?r…
==============================================================================
--- trunk/reactos/lib/drivers/ip/ip.rbuild [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/ip.rbuild [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -1,6 +1,6 @@
 <?xml version="1.0"?>
 <!DOCTYPE module SYSTEM "../../../tools/rbuild/project.dtd">
-<module name="ip" type="staticlibrary"
allowwarnings="true">
+<module name="ip" type="staticlibrary">
        <define name="__NTDRIVER__"/>
        <include base="tcpip">include</include>
        <include base="oskittcp">include</include>
Modified: trunk/reactos/lib/drivers/ip/network/icmp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/icm…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/icmp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/icmp.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -181,6 +181,7 @@
  */
 {
     PNEIGHBOR_CACHE_ENTRY NCE;
+    NTSTATUS Status;
     TI_DbgPrint(DEBUG_ICMP, ("Called.\n"));
@@ -191,7 +192,11 @@
     /* Get a route to the destination address */
     if ((NCE = RouteGetRouteToDestination(&IPPacket->DstAddr))) {
         /* Send the packet */
-       IPSendDatagram(IPPacket, NCE, Complete, Context);
+       Status = IPSendDatagram(IPPacket, NCE, Complete, Context);
+       if (!NT_SUCCESS(Status))
+       {
+               Complete(Context, IPPacket->NdisPacket, Status);
+       }
     } else {
         /* No route to destination (or no free resources) */
         TI_DbgPrint(DEBUG_ICMP, ("No route to destination address 0x%X.\n",
Modified: trunk/reactos/lib/drivers/ip/network/ip.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/ip.…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/ip.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -150,12 +150,17 @@
         Protocol = 0;
     }
-    /* Call the appropriate protocol handler */
-    (*ProtocolTable[Protocol])(Interface, IPPacket);
-    /* Special case for ICMP -- ICMP can be caught by a SOCK_RAW but also
-     * must be handled here. */
-    if( Protocol == IPPROTO_ICMP )
-        ICMPReceive( Interface, IPPacket );
+    if (Protocol < IP_PROTOCOL_TABLE_SIZE &&
+        Protocol >= 0)
+    {
+       /* Call the appropriate protocol handler */
+       (*ProtocolTable[Protocol])(Interface, IPPacket);
+
+       /* Special case for ICMP -- ICMP can be caught by a SOCK_RAW but also
+        * must be handled here. */
+        if( Protocol == IPPROTO_ICMP )
+            ICMPReceive( Interface, IPPacket );
+    }
 }
Modified: trunk/reactos/lib/drivers/ip/network/loopback.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/loo…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/loopback.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -196,6 +196,7 @@
   AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4);
   AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4);
+  AddrInitIPv4(&Loopback->Broadcast, LOOPBACK_BCASTADDR_IPv4);
   IPRegisterInterface(Loopback);
Modified: trunk/reactos/lib/drivers/ip/network/neighbor.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/network/nei…
==============================================================================
--- trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/network/neighbor.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -28,13 +28,20 @@
 VOID NBSendPackets( PNEIGHBOR_CACHE_ENTRY NCE ) {
     PLIST_ENTRY PacketEntry;
     PNEIGHBOR_PACKET Packet;
+    UINT HashValue;
     if(!(NCE->State & NUD_CONNECTED))
        return;
+    HashValue  = *(PULONG)(&NCE->Address.Address);
+    HashValue ^= HashValue >> 16;
+    HashValue ^= HashValue >> 8;
+    HashValue ^= HashValue >> 4;
+    HashValue &= NB_HASHMASK;
+
     /* Send any waiting packets */
     PacketEntry = ExInterlockedRemoveHeadList(&NCE->PacketQueue,
-                                              &NCE->Table->Lock);
+                                              &NeighborCache[HashValue].Lock);
     if( PacketEntry != NULL ) {
        Packet = CONTAINING_RECORD( PacketEntry, NEIGHBOR_PACKET, Next );
@@ -333,15 +340,22 @@
  */
 {
     KIRQL OldIrql;
+    UINT HashValue;
     TI_DbgPrint(DEBUG_NCACHE, ("Called. NCE (0x%X)  LinkAddress (0x%X)  State
(0x%X).\n", NCE, LinkAddress, State));
-    TcpipAcquireSpinLock(&NCE->Table->Lock, &OldIrql);
+    HashValue  = *(PULONG)(&NCE->Address.Address);
+    HashValue ^= HashValue >> 16;
+    HashValue ^= HashValue >> 8;
+    HashValue ^= HashValue >> 4;
+    HashValue &= NB_HASHMASK;
+
+    TcpipAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql);
     RtlCopyMemory(NCE->LinkAddress, LinkAddress, NCE->LinkAddressLength);
     NCE->State = State;
-    TcpipReleaseSpinLock(&NCE->Table->Lock, OldIrql);
+    TcpipReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql);
     if( NCE->State & NUD_CONNECTED )
        NBSendPackets( NCE );
@@ -444,9 +458,9 @@
  *   TRUE if the packet was successfully queued, FALSE if not
  */
 {
-  PKSPIN_LOCK Lock;
   KIRQL OldIrql;
   PNEIGHBOR_PACKET Packet;
+  UINT HashValue;
   TI_DbgPrint
       (DEBUG_NCACHE,
@@ -457,16 +471,20 @@
   /* FIXME: Should we limit the number of queued packets? */
-  Lock = &NCE->Table->Lock;
-
-  TcpipAcquireSpinLock(Lock, &OldIrql);
+  HashValue  = *(PULONG)(&NCE->Address.Address);
+  HashValue ^= HashValue >> 16;
+  HashValue ^= HashValue >> 8;
+  HashValue ^= HashValue >> 4;
+  HashValue &= NB_HASHMASK;
+
+  TcpipAcquireSpinLock(&NeighborCache[HashValue].Lock, &OldIrql);
   Packet->Complete = PacketComplete;
   Packet->Context = PacketContext;
   Packet->Packet = NdisPacket;
   InsertTailList( &NCE->PacketQueue, &Packet->Next );
-  TcpipReleaseSpinLock(Lock, OldIrql);
+  TcpipReleaseSpinLock(&NeighborCache[HashValue].Lock, OldIrql);
   if( NCE->State & NUD_CONNECTED )
       NBSendPackets( NCE );
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Sun Nov  9 12:17:00
2008
@@ -112,13 +112,14 @@
     ListEntry = Listener->ListenRequest.Flink;
     while ( ListEntry != &Listener->ListenRequest ) {
        Bucket = CONTAINING_RECORD(ListEntry, TDI_BUCKET, Entry);
-       ListEntry = ListEntry->Flink;
        if( Bucket->AssociatedEndpoint == Connection ) {
-           RemoveEntryList( ListEntry->Blink );
+           RemoveEntryList( &Bucket->Entry );
            ExFreePool( Bucket );
            break;
        }
+
+       ListEntry = ListEntry->Flink;
     }
    TcpipRecursiveMutexLeave( &TCPLock );
Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/t…
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Sun Nov  9 12:17:00 2008
@@ -36,7 +36,6 @@
     /* Things that can happen when we try the initial connection */
     if( NewState & SEL_CONNECT ) {
        while( !IsListEmpty( &Connection->ConnectRequest ) ) {
-            Connection->State |= NewState;
             Entry = RemoveHeadList( &Connection->ConnectRequest );
             TI_DbgPrint(DEBUG_TCP, ("Connect Event\n"));
@@ -283,8 +282,7 @@
 }
 VOID TCPFreeConnectionEndpoint( PCONNECTION_ENDPOINT Connection ) {
-    TI_DbgPrint(MAX_TRACE,("FIXME: Cancel all pending requests\n"));
-    /* XXX Cancel all pending requests */
+    TCPClose( Connection );
     ExFreePool( Connection );
 }
@@ -839,7 +837,7 @@
     TcpipAcquireSpinLock( &Endpoint->Lock, &OldIrql );
-    for( i = 0; i < sizeof( ListHead ) / sizeof( ListHead[0] ); i++ ) {
+    for( i = 0; i < 4; i++ ) {
        for( Entry = ListHead[i]->Flink;
             Entry != ListHead[i];
             Entry = Entry->Flink ) {