- Merge aicom-network-fixes up to r37266
authorCameron Gutman <aicommander@gmail.com>
Sun, 9 Nov 2008 18:17:00 +0000 (18:17 +0000)
committerCameron Gutman <aicommander@gmail.com>
Sun, 9 Nov 2008 18:17:00 +0000 (18:17 +0000)
svn path=/trunk/; revision=37267

12 files changed:
reactos/drivers/network/afd/afd/info.c
reactos/drivers/network/afd/afd/lock.c
reactos/drivers/network/afd/afd/read.c
reactos/drivers/network/afd/afd/tdi.c
reactos/drivers/network/tcpip/tcpip/fileobjs.c
reactos/lib/drivers/ip/ip.rbuild
reactos/lib/drivers/ip/network/icmp.c
reactos/lib/drivers/ip/network/ip.c
reactos/lib/drivers/ip/network/loopback.c
reactos/lib/drivers/ip/network/neighbor.c
reactos/lib/drivers/ip/transport/tcp/accept.c
reactos/lib/drivers/ip/transport/tcp/tcp.c

index f2833af..12c76aa 100644 (file)
@@ -83,11 +83,6 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
     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 @@ AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp,
 
        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,
index 4f7f947..b5178c1 100644 (file)
@@ -25,7 +25,7 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) {
                       NULL );
     if( Irp->MdlAddress ) {
        _SEH_TRY {
-           MmProbeAndLockPages( Irp->MdlAddress, KernelMode, IoModifyAccess );
+           MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess );
        } _SEH_HANDLE {
            LockFailed = TRUE;
        } _SEH_END;
index 365eafc..c5604b2 100644 (file)
@@ -425,7 +425,7 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
 
         *TotalBytesCopied = BytesToCopy;
 
-        if (!RecvReq->TdiFlags & TDI_RECEIVE_PEEK) {
+        if (!(RecvReq->TdiFlags & TDI_RECEIVE_PEEK)) {
             FCB->Recv.BytesUsed = 0;
         }
     }
index dbe74ce..c910293 100644 (file)
@@ -74,7 +74,7 @@ static NTSTATUS TdiCall(
         KeWaitForSingleObject(
           Event,
           Executive,
-          UserMode,
+          KernelMode,
           FALSE,
           NULL);
         Status = Iosb->Status;
@@ -853,7 +853,7 @@ NTSTATUS TdiSend
                         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 @@ NTSTATUS TdiSend
     }
 
     _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 @@ NTSTATUS TdiReceive(
                         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 @@ NTSTATUS TdiReceive(
 
     _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 @@ NTSTATUS TdiReceiveDatagram(
                         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 @@ NTSTATUS TdiReceiveDatagram(
     }
 
     _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 @@ NTSTATUS TdiSendDatagram(
                         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 @@ NTSTATUS TdiSendDatagram(
     }
 
     _SEH_TRY {
-        MmProbeAndLockPages(Mdl, KernelMode, IoModifyAccess);
+        MmProbeAndLockPages(Mdl, (*Irp)->RequestorMode, IoModifyAccess);
     } _SEH_HANDLE {
         AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
        IoFreeMdl(Mdl);
index da337e8..414cf5d 100644 (file)
@@ -220,7 +220,7 @@ VOID DeleteConnectionEndpoint(
   RemoveEntryList(&Connection->ListEntry);
   TcpipReleaseSpinLock(&ConnectionEndpointListLock, OldIrql);
 
-  ExFreePool(Connection);
+  TCPFreeConnectionEndpoint(Connection);
 
   TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
 }
@@ -387,8 +387,10 @@ NTSTATUS FileCloseAddress(
   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 @@ NTSTATUS FileCloseConnection(
   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;
 }
 
 
index ac51d80..d6ee690 100644 (file)
@@ -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>
index 3eeb98c..eda6ccb 100644 (file)
@@ -181,6 +181,7 @@ VOID ICMPTransmit(
  */
 {
     PNEIGHBOR_CACHE_ENTRY NCE;
+    NTSTATUS Status;
 
     TI_DbgPrint(DEBUG_ICMP, ("Called.\n"));
 
@@ -191,7 +192,11 @@ VOID ICMPTransmit(
     /* 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",
index d49f15d..2ea6796 100644 (file)
@@ -150,12 +150,17 @@ VOID IPDispatchProtocol(
         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 );
+    }
 }
 
 
index cd142b1..acb227d 100644 (file)
@@ -196,6 +196,7 @@ NDIS_STATUS LoopRegisterAdapter(
 
   AddrInitIPv4(&Loopback->Unicast, LOOPBACK_ADDRESS_IPv4);
   AddrInitIPv4(&Loopback->Netmask, LOOPBACK_ADDRMASK_IPv4);
+  AddrInitIPv4(&Loopback->Broadcast, LOOPBACK_BCASTADDR_IPv4);
 
   IPRegisterInterface(Loopback);
 
index e9f13ff..3e87ee5 100644 (file)
@@ -28,13 +28,20 @@ VOID NBCompleteSend( PVOID Context,
 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 @@ VOID NBUpdateNeighbor(
  */
 {
     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 @@ BOOLEAN NBQueuePacket(
  *   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 @@ BOOLEAN NBQueuePacket(
 
   /* FIXME: Should we limit the number of queued packets? */
 
-  Lock = &NCE->Table->Lock;
+  HashValue  = *(PULONG)(&NCE->Address.Address);
+  HashValue ^= HashValue >> 16;
+  HashValue ^= HashValue >> 8;
+  HashValue ^= HashValue >> 4;
+  HashValue &= NB_HASHMASK;
 
-  TcpipAcquireSpinLock(Lock, &OldIrql);
+  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 );
index 2132b17..b588b7d 100644 (file)
@@ -112,13 +112,14 @@ VOID TCPAbortListenForSocket( PCONNECTION_ENDPOINT Listener,
     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 );
index bdf7fd5..5579813 100644 (file)
@@ -36,7 +36,6 @@ static VOID HandleSignalledConnection( PCONNECTION_ENDPOINT Connection,
     /* 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 @@ PCONNECTION_ENDPOINT TCPAllocateConnectionEndpoint( PVOID ClientContext ) {
 }
 
 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 @@ VOID TCPRemoveIRP( PCONNECTION_ENDPOINT Endpoint, PIRP Irp ) {
 
     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 ) {