[TCPIP]
authorClaudiu Mihail <claudiu.bogdan.mihail@gmail.com>
Tue, 14 Jun 2011 15:40:18 +0000 (15:40 +0000)
committerClaudiu Mihail <claudiu.bogdan.mihail@gmail.com>
Tue, 14 Jun 2011 15:40:18 +0000 (15:40 +0000)
- Fix a bug on line 191, where the pending send requests for datagrams weren't canceled (the receive list was being used instead
- Also added some formatting

svn path=/branches/GSoC_2011/TcpIpDriver/; revision=52229

drivers/network/tcpip/tcpip/fileobjs.c

index 54a53ad..30ae120 100644 (file)
@@ -112,7 +112,8 @@ PADDRESS_FILE AddrSearchNext(
 
     TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
 
-    while (CurrentEntry != &AddressFileListHead) {
+    while (CurrentEntry != &AddressFileListHead)
+    {
         Current = CONTAINING_RECORD(CurrentEntry, ADDRESS_FILE, ListEntry);
 
         IPAddress = &Current->Address;
@@ -153,58 +154,63 @@ VOID AddrFileFree(
  *     Object = Pointer to address file object to free
  */
 {
-  PADDRESS_FILE AddrFile = Object;
-  KIRQL OldIrql;
-  PDATAGRAM_RECEIVE_REQUEST ReceiveRequest;
-  PDATAGRAM_SEND_REQUEST SendRequest;
-  PLIST_ENTRY CurrentEntry;
+    PADDRESS_FILE AddrFile = Object;
+    KIRQL OldIrql;
+    PDATAGRAM_RECEIVE_REQUEST ReceiveRequest;
+    PDATAGRAM_SEND_REQUEST SendRequest;
+    PLIST_ENTRY CurrentEntry;
 
-  TI_DbgPrint(MID_TRACE, ("Called.\n"));
+    TI_DbgPrint(MID_TRACE, ("Called.\n"));
+    DbgPrint("[TCPIP, AddrFileFree] Called\n");
 
-  /* We should not be associated with a connection here */
-  ASSERT(!AddrFile->Connection);
+    /* We should not be associated with a connection here */
+    ASSERT(!AddrFile->Connection);
 
-  /* Remove address file from the global list */
-  TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
-  RemoveEntryList(&AddrFile->ListEntry);
-  TcpipReleaseSpinLock(&AddressFileListLock, OldIrql);
+    /* Remove address file from the global list */
+    TcpipAcquireSpinLock(&AddressFileListLock, &OldIrql);
+    RemoveEntryList(&AddrFile->ListEntry);
+    TcpipReleaseSpinLock(&AddressFileListLock, OldIrql);
 
-  /* FIXME: Kill TCP connections on this address file object */
+    /* FIXME: Kill TCP connections on this address file object */
 
-  /* Return pending requests with error */
+    /* Return pending requests with error */
 
-  TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting receive requests on AddrFile at (0x%X).\n", AddrFile));
+    TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting receive requests on AddrFile at (0x%X).\n", AddrFile));
 
-  /* Go through pending receive request list and cancel them all */
-  while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) {
-    ReceiveRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry);
-    (*ReceiveRequest->Complete)(ReceiveRequest->Context, STATUS_CANCELLED, 0);
-    /* ExFreePoolWithTag(ReceiveRequest, DATAGRAM_RECV_TAG); FIXME: WTF? */
-  }
+    /* Go through pending receive request list and cancel them all */
+    while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock)))
+    {
+        ReceiveRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_RECEIVE_REQUEST, ListEntry);
+        (*ReceiveRequest->Complete)(ReceiveRequest->Context, STATUS_CANCELLED, 0);
+        /* ExFreePoolWithTag(ReceiveRequest, DATAGRAM_RECV_TAG); FIXME: WTF? */
+    }
 
-  TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting send requests on address file at (0x%X).\n", AddrFile));
+    TI_DbgPrint(DEBUG_ADDRFILE, ("Aborting send requests on address file at (0x%X).\n", AddrFile));
 
-  /* Go through pending send request list and cancel them all */
-  while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->ReceiveQueue, &AddrFile->Lock))) {
-    SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry);
-    (*SendRequest->Complete)(SendRequest->Context, STATUS_CANCELLED, 0);
-    ExFreePoolWithTag(SendRequest, DATAGRAM_SEND_TAG);
-  }
+    /* Go through pending send request list and cancel them all */
+    while ((CurrentEntry = ExInterlockedRemoveHeadList(&AddrFile->TransmitQueue, &AddrFile->Lock)))
+    {
+        SendRequest = CONTAINING_RECORD(CurrentEntry, DATAGRAM_SEND_REQUEST, ListEntry);
+        (*SendRequest->Complete)(SendRequest->Context, STATUS_CANCELLED, 0);
+        ExFreePoolWithTag(SendRequest, DATAGRAM_SEND_TAG);
+    }
 
-  /* Protocol specific handling */
-  switch (AddrFile->Protocol) {
-  case IPPROTO_TCP:
-    TCPFreePort( AddrFile->Port );
-    break;
+    /* Protocol specific handling */
+    switch (AddrFile->Protocol)
+    {
+        case IPPROTO_TCP:
+            TCPFreePort( AddrFile->Port );
+            break;
 
-  case IPPROTO_UDP:
-    UDPFreePort( AddrFile->Port );
-    break;
-  }
+        case IPPROTO_UDP:
+            UDPFreePort( AddrFile->Port );
+            break;
+    }
 
-  RemoveEntityByContext(AddrFile);
+    RemoveEntityByContext(AddrFile);
 
-  ExFreePoolWithTag(Object, ADDR_FILE_TAG);
+    ExFreePoolWithTag(Object, ADDR_FILE_TAG);
+    DbgPrint("[TCPIP, AddrFileFree] Leaving\n");
 }
 
 
@@ -236,133 +242,136 @@ NTSTATUS FileOpenAddress(
   USHORT Protocol,
   PVOID Options)
 {
-  PADDRESS_FILE AddrFile;
+    PADDRESS_FILE AddrFile;
 
-  TI_DbgPrint(MID_TRACE, ("Called (Proto %d).\n", Protocol));
-  DbgPrint("[TCPIP, FileOpenAddress] Called. Proto %d\n", Protocol);
+    TI_DbgPrint(MID_TRACE, ("Called (Proto %d).\n", Protocol));
+    DbgPrint("[TCPIP, FileOpenAddress] Called. Proto %d\n", Protocol);
 
-  AddrFile = ExAllocatePoolWithTag(NonPagedPool, sizeof(ADDRESS_FILE),
-                                   ADDR_FILE_TAG);
-  if (!AddrFile) {
-    TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
-    return STATUS_INSUFFICIENT_RESOURCES;
-  }
+    AddrFile = ExAllocatePoolWithTag(NonPagedPool, sizeof(ADDRESS_FILE),
+                                    ADDR_FILE_TAG);
+    if (!AddrFile)
+    {
+        TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    RtlZeroMemory(AddrFile, sizeof(ADDRESS_FILE));
+
+    AddrFile->RefCount = 1;
+    AddrFile->Free = AddrFileFree;
+
+    /* Set our default options */
+    AddrFile->TTL = 128;
+    AddrFile->DF = 0;
+    AddrFile->BCast = 1;
+    AddrFile->HeaderIncl = 1;
+
+    /* Make sure address is a local unicast address or 0 */
+    /* FIXME: IPv4 only */
+    AddrFile->Family = Address->Address[0].AddressType;
+    AddrFile->Address.Address.IPv4Address = Address->Address[0].Address[0].in_addr;
+    AddrFile->Address.Type = IP_ADDRESS_V4;
+
+    if (!AddrIsUnspecified(&AddrFile->Address) &&
+        !AddrLocateInterface(&AddrFile->Address))
+    {
+           ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
+           TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", A2S(&AddrFile->Address)));
+           return STATUS_INVALID_ADDRESS;
+    }
 
-  RtlZeroMemory(AddrFile, sizeof(ADDRESS_FILE));
+    TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
+    A2S(&AddrFile->Address), Protocol, IPPROTO_UDP));
 
-  AddrFile->RefCount = 1;
-  AddrFile->Free = AddrFileFree;
+    /* Protocol specific handling */
+    switch (Protocol)
+    {
+        case IPPROTO_TCP:
+            AddrFile->Port =
+                TCPAllocatePort(Address->Address[0].Address[0].sin_port);
 
-  /* Set our default options */
-  AddrFile->TTL = 128;
-  AddrFile->DF = 0;
-  AddrFile->BCast = 1;
-  AddrFile->HeaderIncl = 1;
+            if ((Address->Address[0].Address[0].sin_port &&
+                AddrFile->Port != Address->Address[0].Address[0].sin_port) ||
+                AddrFile->Port == 0xffff)
+            {
+                ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
+                return STATUS_ADDRESS_ALREADY_EXISTS;
+            }
 
-  /* Make sure address is a local unicast address or 0 */
-  /* FIXME: IPv4 only */
-  AddrFile->Family = Address->Address[0].AddressType;
-  AddrFile->Address.Address.IPv4Address = Address->Address[0].Address[0].in_addr;
-  AddrFile->Address.Type = IP_ADDRESS_V4;
-
-  if (!AddrIsUnspecified(&AddrFile->Address) &&
-      !AddrLocateInterface(&AddrFile->Address)) {
-         ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
-         TI_DbgPrint(MIN_TRACE, ("Non-local address given (0x%X).\n", A2S(&AddrFile->Address)));
-         return STATUS_INVALID_ADDRESS;
-  }
+            AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
 
-  TI_DbgPrint(MID_TRACE, ("Opening address %s for communication (P=%d U=%d).\n",
-    A2S(&AddrFile->Address), Protocol, IPPROTO_UDP));
+            AddrFile->Send = NULL; /* TCPSendData */
+            break;
 
-  /* Protocol specific handling */
-  switch (Protocol) {
-  case IPPROTO_TCP:
-      AddrFile->Port =
-          TCPAllocatePort(Address->Address[0].Address[0].sin_port);
-
-      if ((Address->Address[0].Address[0].sin_port &&
-           AddrFile->Port != Address->Address[0].Address[0].sin_port) ||
-           AddrFile->Port == 0xffff)
-      {
-          ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
-          return STATUS_ADDRESS_ALREADY_EXISTS;
-      }
-
-      AddEntity(CO_TL_ENTITY, AddrFile, CO_TL_TCP);
-
-      AddrFile->Send = NULL; /* TCPSendData */
-      break;
-
-  case IPPROTO_UDP:
-      TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
-      AddrFile->Port =
-         UDPAllocatePort(Address->Address[0].Address[0].sin_port);
-
-      if ((Address->Address[0].Address[0].sin_port &&
-           AddrFile->Port != Address->Address[0].Address[0].sin_port) ||
-           AddrFile->Port == 0xffff)
-      {
-          ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
-          return STATUS_ADDRESS_ALREADY_EXISTS;
-      }
-
-      TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
-                             AddrFile->Port,
-                             Address->Address[0].Address[0].sin_port));
-
-      AddEntity(CL_TL_ENTITY, AddrFile, CL_TL_UDP);
-
-      AddrFile->Send = UDPSendDatagram;
-      break;
-
-  case IPPROTO_ICMP:
-    AddrFile->Port = 0;
-    AddrFile->Send = ICMPSendDatagram;
-
-    /* FIXME: Verify this */
-    AddEntity(ER_ENTITY, AddrFile, ER_ICMP);
-    break;
-
-  default:
-    /* Use raw IP for all other protocols */
-    AddrFile->Port = 0;
-    AddrFile->Send = RawIPSendDatagram;
-
-    /* FIXME: Verify this */
-    AddEntity(CL_TL_ENTITY, AddrFile, 0);
-    break;
-  }
+        case IPPROTO_UDP:
+            TI_DbgPrint(MID_TRACE,("Allocating udp port\n"));
+            AddrFile->Port =
+               UDPAllocatePort(Address->Address[0].Address[0].sin_port);
 
-  TI_DbgPrint(MID_TRACE, ("IP protocol number for address file object is %d.\n",
+            if ((Address->Address[0].Address[0].sin_port &&
+                AddrFile->Port != Address->Address[0].Address[0].sin_port) ||
+                AddrFile->Port == 0xffff)
+            {
+                ExFreePoolWithTag(AddrFile, ADDR_FILE_TAG);
+                return STATUS_ADDRESS_ALREADY_EXISTS;
+            }
+
+            TI_DbgPrint(MID_TRACE,("Setting port %d (wanted %d)\n",
+                                    AddrFile->Port,
+                                    Address->Address[0].Address[0].sin_port));
+
+            AddEntity(CL_TL_ENTITY, AddrFile, CL_TL_UDP);
+
+            AddrFile->Send = UDPSendDatagram;
+            break;
+
+        case IPPROTO_ICMP:
+            AddrFile->Port = 0;
+            AddrFile->Send = ICMPSendDatagram;
+
+            /* FIXME: Verify this */
+            AddEntity(ER_ENTITY, AddrFile, ER_ICMP);
+            break;
+
+            default:
+            /* Use raw IP for all other protocols */
+            AddrFile->Port = 0;
+            AddrFile->Send = RawIPSendDatagram;
+
+            /* FIXME: Verify this */
+            AddEntity(CL_TL_ENTITY, AddrFile, 0);
+            break;
+    }
+
+    TI_DbgPrint(MID_TRACE, ("IP protocol number for address file object is %d.\n",
     Protocol));
 
-  TI_DbgPrint(MID_TRACE, ("Port number for address file object is %d.\n",
+    TI_DbgPrint(MID_TRACE, ("Port number for address file object is %d.\n",
     WN2H(AddrFile->Port)));
 
-  /* Set protocol */
-  AddrFile->Protocol = Protocol;
+    /* Set protocol */
+    AddrFile->Protocol = Protocol;
 
-  /* Initialize receive and transmit queues */
-  InitializeListHead(&AddrFile->ReceiveQueue);
-  InitializeListHead(&AddrFile->TransmitQueue);
+    /* Initialize receive and transmit queues */
+    InitializeListHead(&AddrFile->ReceiveQueue);
+    InitializeListHead(&AddrFile->TransmitQueue);
 
-  /* Initialize spin lock that protects the address file object */
-  KeInitializeSpinLock(&AddrFile->Lock);
+    /* Initialize spin lock that protects the address file object */
+    KeInitializeSpinLock(&AddrFile->Lock);
 
-  /* Return address file object */
-  Request->Handle.AddressHandle = AddrFile;
+    /* Return address file object */
+    Request->Handle.AddressHandle = AddrFile;
 
-  /* Add address file to global list */
-  ExInterlockedInsertTailList(
-    &AddressFileListHead,
-    &AddrFile->ListEntry,
-    &AddressFileListLock);
+    /* Add address file to global list */
+    ExInterlockedInsertTailList(
+        &AddressFileListHead,
+        &AddrFile->ListEntry,
+        &AddressFileListLock);
 
-  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-  DbgPrint("[TCPIP, FileOpenAddress] Leaving\n");
+    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+    DbgPrint("[TCPIP, FileOpenAddress] Leaving\n");
 
-  return STATUS_SUCCESS;
+    return STATUS_SUCCESS;
 }
 
 
@@ -376,30 +385,33 @@ NTSTATUS FileOpenAddress(
 NTSTATUS FileCloseAddress(
   PTDI_REQUEST Request)
 {
-  PADDRESS_FILE AddrFile = Request->Handle.AddressHandle;
-  KIRQL OldIrql;
+    PADDRESS_FILE AddrFile = Request->Handle.AddressHandle;
+    KIRQL OldIrql;
 
-  DbgPrint("[TCPIP, FileCloseAddress] Called\n");
+    DbgPrint("[TCPIP, FileCloseAddress] Called\n");
 
-  if (!Request->Handle.AddressHandle) return STATUS_INVALID_PARAMETER;
+    if (!Request->Handle.AddressHandle)
+        return STATUS_INVALID_PARAMETER;
 
-  LockObject(AddrFile, &OldIrql);
+    LockObject(AddrFile, &OldIrql);
 
-  /* We have to close this listener because we started it */
-  if( AddrFile->Listener )
-  {
-      AddrFile->Listener->AddressFile = NULL;
-      TCPClose( AddrFile->Listener );
-  }
+    /* We have to close this listener because we started it */
+    if ( AddrFile->Listener )
+    {
+        AddrFile->Listener->AddressFile = NULL;
+        TCPClose( AddrFile->Listener );
+    }
 
-  DereferenceObject(AddrFile);
+    DbgPrint("[TCPIP, FileCloseAddress] AddrFile->RefCount = %d\n", AddrFile->RefCount);
 
-  UnlockObject(AddrFile, OldIrql);
+    UnlockObject(AddrFile, OldIrql);
 
-  TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
-  DbgPrint("[TCPIP, FileCloseAddress] Leaving\n");
+    DereferenceObject(AddrFile);
 
-  return STATUS_SUCCESS;
+    TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
+    DbgPrint("[TCPIP, FileCloseAddress] Leaving\n");
+
+    return STATUS_SUCCESS;
 }
 
 
@@ -459,7 +471,8 @@ NTSTATUS FileCloseConnection(
 
   Connection = Request->Handle.ConnectionContext;
 
-  if (!Connection) return STATUS_INVALID_PARAMETER;
+  if (!Connection)
+      return STATUS_INVALID_PARAMETER;
 
   TCPClose( Connection );