Revert my patch from yesterday. Need to take more time to work on it.
[reactos.git] / reactos / drivers / lib / ip / network / receive.c
index 4c8c9f3..d6c0587 100644 (file)
@@ -18,6 +18,11 @@ NPAGED_LOOKASIDE_LIST IPDRList;
 NPAGED_LOOKASIDE_LIST IPFragmentList;
 NPAGED_LOOKASIDE_LIST IPHoleList;
 
+VOID ReflectPacketComplete(
+    PVOID Context,
+    PNDIS_PACKET Packet,
+    NDIS_STATUS Status ) {
+}
 
 PIPDATAGRAM_HOLE CreateHoleDescriptor(
   ULONG First,
@@ -36,7 +41,7 @@ PIPDATAGRAM_HOLE CreateHoleDescriptor(
 
        TI_DbgPrint(DEBUG_IP, ("Called. First (%d)  Last (%d).\n", First, Last));
 
-       Hole = ExAllocateFromNPagedLookasideList(&IPHoleList);
+       Hole = TcpipAllocateFromNPagedLookasideList(&IPHoleList);
        if (!Hole) {
            TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
            return NULL;
@@ -77,7 +82,7 @@ VOID FreeIPDR(
     TI_DbgPrint(DEBUG_IP, ("Freeing hole descriptor at (0x%X).\n", CurrentH));
 
     /* And free the hole descriptor */
-    ExFreeToNPagedLookasideList(&IPHoleList, CurrentH);
+    TcpipFreeToNPagedLookasideList(&IPHoleList, CurrentH);
 
     CurrentEntry = NextEntry;
   }
@@ -98,19 +103,13 @@ VOID FreeIPDR(
     TI_DbgPrint(DEBUG_IP, ("Freeing fragment at (0x%X).\n", CurrentF));
 
     /* And free the fragment descriptor */
-    ExFreeToNPagedLookasideList(&IPFragmentList, CurrentF);
+    TcpipFreeToNPagedLookasideList(&IPFragmentList, CurrentF);
     CurrentEntry = NextEntry;
   }
 
-  /* Free resources for the header, if it exists */
-  if (IPDR->IPv4Header) {
-    TI_DbgPrint(DEBUG_IP, ("Freeing IPv4 header data at (0x%X).\n", IPDR->IPv4Header));
-    exFreePool(IPDR->IPv4Header);
-  }
-
   TI_DbgPrint(DEBUG_IP, ("Freeing IPDR data at (0x%X).\n", IPDR));
 
-  ExFreeToNPagedLookasideList(&IPDRList, IPDR);
+  TcpipFreeToNPagedLookasideList(&IPDRList, IPDR);
 }
 
 
@@ -126,9 +125,9 @@ VOID RemoveIPDR(
 
   TI_DbgPrint(DEBUG_IP, ("Removing IPDR at (0x%X).\n", IPDR));
 
-  KeAcquireSpinLock(&ReassemblyListLock, &OldIrql);
+  TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql);
   RemoveEntryList(&IPDR->ListEntry);
-  KeReleaseSpinLock(&ReassemblyListLock, OldIrql);
+  TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql);
 }
 
 
@@ -151,7 +150,7 @@ PIPDATAGRAM_REASSEMBLY GetReassemblyInfo(
 
   TI_DbgPrint(DEBUG_IP, ("Searching for IPDR for IP packet at (0x%X).\n", IPPacket));
 
-  KeAcquireSpinLock(&ReassemblyListLock, &OldIrql);
+  TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql);
 
   /* FIXME: Assume IPv4 */
 
@@ -162,14 +161,14 @@ PIPDATAGRAM_REASSEMBLY GetReassemblyInfo(
       (Header->Id == Current->Id) &&
       (Header->Protocol == Current->Protocol) &&
       (AddrIsEqual(&IPPacket->DstAddr, &Current->DstAddr))) {
-      KeReleaseSpinLock(&ReassemblyListLock, OldIrql);
+      TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql);
 
       return Current;
     }
     CurrentEntry = CurrentEntry->Flink;
   }
 
-  KeReleaseSpinLock(&ReassemblyListLock, OldIrql);
+  TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql);
 
   return NULL;
 }
@@ -224,9 +223,9 @@ PIP_PACKET ReassembleDatagram(
   }
 
   /* Copy the header into the buffer */
-  RtlCopyMemory(IPPacket->Header, IPDR->IPv4Header, IPDR->HeaderSize);  
-  
-  Data = IPPacket->Header + IPDR->HeaderSize;
+  RtlCopyMemory(IPPacket->Header, &IPDR->IPv4Header, IPDR->HeaderSize);
+
+  Data = (PVOID)((ULONG_PTR)IPPacket->Header + IPDR->HeaderSize);
   IPPacket->Data = Data;
 
   /* Copy data from all fragments into buffer */
@@ -264,7 +263,7 @@ __inline VOID Cleanup(
 {
   TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
 
-  KeReleaseSpinLock(Lock, OldIrql);
+  TcpipReleaseSpinLock(Lock, OldIrql);
   RemoveIPDR(IPDR);
   FreeIPDR(IPDR);
   if (Buffer)
@@ -274,14 +273,12 @@ __inline VOID Cleanup(
 
 VOID ProcessFragment(
   PIP_INTERFACE IF,
-  PIP_PACKET IPPacket,
-  PNET_TABLE_ENTRY NTE)
+  PIP_PACKET IPPacket)
 /*
  * FUNCTION: Processes an IP datagram or fragment
  * ARGUMENTS:
  *     IF       = Pointer to IP interface packet was receive on
  *     IPPacket = Pointer to IP packet
- *     NTE      = Pointer to NTE packet was received on
  * NOTES:
  *     This routine reassembles fragments and, if a whole datagram can
  *     be assembled, passes the datagram on to the IP protocol dispatcher
@@ -307,14 +304,14 @@ VOID ProcessFragment(
   if (IPDR) {
     TI_DbgPrint(DEBUG_IP, ("Continueing assembly.\n"));
     /* We have a reassembly structure */
-    KeAcquireSpinLock(&IPDR->Lock, &OldIrql);
+    TcpipAcquireSpinLock(&IPDR->Lock, &OldIrql);
     CurrentEntry = IPDR->HoleListHead.Flink;
     Hole = CONTAINING_RECORD(CurrentEntry, IPDATAGRAM_HOLE, ListEntry);
   } else {
     TI_DbgPrint(DEBUG_IP, ("Starting new assembly.\n"));
 
     /* We don't have a reassembly structure, create one */
-    IPDR = ExAllocateFromNPagedLookasideList(&IPDRList);
+    IPDR = TcpipAllocateFromNPagedLookasideList(&IPDRList);
     if (!IPDR)
       /* We don't have the resources to process this packet, discard it */
       return;
@@ -325,28 +322,27 @@ VOID ProcessFragment(
     Hole = CreateHoleDescriptor(0, 65536);
     if (!Hole) {
       /* We don't have the resources to process this packet, discard it */
-      ExFreeToNPagedLookasideList(&IPDRList, IPDR);
+      TcpipFreeToNPagedLookasideList(&IPDRList, IPDR);
       return;
     }
     AddrInitIPv4(&IPDR->SrcAddr, IPv4Header->SrcAddr);
     AddrInitIPv4(&IPDR->DstAddr, IPv4Header->DstAddr);
     IPDR->Id         = IPv4Header->Id;
     IPDR->Protocol   = IPv4Header->Protocol;
-    IPDR->IPv4Header = NULL;
     InitializeListHead(&IPDR->FragmentListHead);
     InitializeListHead(&IPDR->HoleListHead);
     InsertTailList(&IPDR->HoleListHead, &Hole->ListEntry);
     CurrentEntry = IPDR->HoleListHead.Flink;
 
-    KeInitializeSpinLock(&IPDR->Lock);
+    TcpipInitializeSpinLock(&IPDR->Lock);
 
-    KeAcquireSpinLock(&IPDR->Lock, &OldIrql);
+    TcpipAcquireSpinLock(&IPDR->Lock, &OldIrql);
 
     /* Update the reassembly list */
-    ExInterlockedInsertTailList(
-                 &ReassemblyListHead,
-      &IPDR->ListEntry,
-      &ReassemblyListLock);
+    TcpipInterlockedInsertTailList(
+       &ReassemblyListHead,
+       &IPDR->ListEntry,
+       &ReassemblyListLock);
   }
 
   FragFirst     = (WN2H(IPv4Header->FlagsFragOfs) & IPv4_FRAGOFS_MASK) << 3;
@@ -394,28 +390,21 @@ VOID ProcessFragment(
                  /* Put the new hole descriptor in the list */
       InsertTailList(&IPDR->HoleListHead, &Hole->ListEntry);
     } else
-      ExFreeToNPagedLookasideList(&IPHoleList, Hole);
+      TcpipFreeToNPagedLookasideList(&IPHoleList, Hole);
 
     /* If this is the first fragment, save the IP header */
     if (FragFirst == 0) {
-       IPDR->IPv4Header = exAllocatePool(NonPagedPool, IPPacket->HeaderSize);
-      if (!IPDR->IPv4Header) {
-        /* We don't have the resources to process this packet, discard it */
-        Cleanup(&IPDR->Lock, OldIrql, IPDR, NULL);
-        return;
-      }
-
       TI_DbgPrint(DEBUG_IP, ("First fragment found. Header buffer is at (0x%X). "
-        "Header size is (%d).\n", IPDR->IPv4Header, IPPacket->HeaderSize));
+        "Header size is (%d).\n", &IPDR->IPv4Header, IPPacket->HeaderSize));
 
-      RtlCopyMemory(IPDR->IPv4Header, IPPacket->Header, IPPacket->HeaderSize);
+      RtlCopyMemory(&IPDR->IPv4Header, IPPacket->Header, IPPacket->HeaderSize);
       IPDR->HeaderSize = IPPacket->HeaderSize;
     }
 
     /* Create a buffer, copy the data into it and put it
        in the fragment list */
 
-    Fragment = ExAllocateFromNPagedLookasideList(&IPFragmentList);
+    Fragment = TcpipAllocateFromNPagedLookasideList(&IPFragmentList);
     if (!Fragment) {
       /* We don't have the resources to process this packet, discard it */
       Cleanup(&IPDR->Lock, OldIrql, IPDR, NULL);
@@ -435,14 +424,14 @@ VOID ProcessFragment(
     /* Position here is an offset from the NdisPacket start, not the header */
     TI_DbgPrint(DEBUG_IP, ("Fragment data buffer allocated at (0x%X)  Size (%d) Pos (%d).\n",
                           Fragment->Data, Fragment->Size, IPPacket->Position));
-    
+
     /* Copy datagram data into fragment buffer */
     CopyPacketToBuffer(Fragment->Data,
                       IPPacket->NdisPacket,
                       IPPacket->Position,
                       Fragment->Size);
     Fragment->Offset = FragFirst;
-    
+
     /* If this is the last fragment, compute and save the datagram data size */
     if (!MoreFragments)
       IPDR->DataSize = FragFirst + Fragment->Size;
@@ -462,9 +451,9 @@ VOID ProcessFragment(
 
     Datagram = ReassembleDatagram(IPDR);
 
-    KeReleaseSpinLock(&IPDR->Lock, OldIrql);
-
     RemoveIPDR(IPDR);
+    TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
+
     FreeIPDR(IPDR);
 
     if (!Datagram)
@@ -474,14 +463,14 @@ VOID ProcessFragment(
     DISPLAY_IP_PACKET(Datagram);
 
     /* Give the packet to the protocol dispatcher */
-    IPDispatchProtocol(NTE, Datagram);
+    IPDispatchProtocol(IF, Datagram);
 
     /* We're done with this datagram */
     exFreePool(Datagram->Header);
     TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram));
     (*Datagram->Free)(Datagram);
   } else
-    KeReleaseSpinLock(&IPDR->Lock, OldIrql);
+    TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
 }
 
 
@@ -495,7 +484,7 @@ VOID IPFreeReassemblyList(
   PLIST_ENTRY CurrentEntry;
   PIPDATAGRAM_REASSEMBLY Current;
 
-  KeAcquireSpinLock(&ReassemblyListLock, &OldIrql);
+  TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql);
 
   CurrentEntry = ReassemblyListHead.Flink;
   while (CurrentEntry != &ReassemblyListHead) {
@@ -509,7 +498,7 @@ VOID IPFreeReassemblyList(
     CurrentEntry = CurrentEntry->Flink;
   }
 
-  KeReleaseSpinLock(&ReassemblyListLock, OldIrql);
+  TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql);
 }
 
 
@@ -532,75 +521,70 @@ VOID IPv4Receive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
  *     IPPacket = Pointer to IP packet
  */
 {
-    PNEIGHBOR_CACHE_ENTRY NCE;
-    PNET_TABLE_ENTRY NTE;
-    UINT AddressType;
-    
     TI_DbgPrint(DEBUG_IP, ("Received IPv4 datagram.\n"));
-    
+
     IPPacket->HeaderSize = (((PIPv4_HEADER)IPPacket->Header)->VerIHL & 0x0F) << 2;
     TI_DbgPrint(DEBUG_IP, ("IPPacket->HeaderSize = %d\n", IPPacket->HeaderSize));
 
     if (IPPacket->HeaderSize > IPv4_MAX_HEADER_SIZE) {
        TI_DbgPrint
-           (MIN_TRACE, 
+           (MIN_TRACE,
             ("Datagram received with incorrect header size (%d).\n",
              IPPacket->HeaderSize));
        /* Discard packet */
        return;
     }
-    
+
     /* Checksum IPv4 header */
     if (!IPv4CorrectChecksum(IPPacket->Header, IPPacket->HeaderSize)) {
        TI_DbgPrint
-           (MIN_TRACE, 
+           (MIN_TRACE,
             ("Datagram received with bad checksum. Checksum field (0x%X)\n",
              WN2H(((PIPv4_HEADER)IPPacket->Header)->Checksum)));
        /* Discard packet */
        return;
     }
-    
+
     IPPacket->TotalSize = WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength);
-    
+
     AddrInitIPv4(&IPPacket->SrcAddr, ((PIPv4_HEADER)IPPacket->Header)->SrcAddr);
     AddrInitIPv4(&IPPacket->DstAddr, ((PIPv4_HEADER)IPPacket->Header)->DstAddr);
-    
+
     IPPacket->Position += IPPacket->HeaderSize;
     IPPacket->Data     = (PVOID)((ULONG_PTR)IPPacket->Header + IPPacket->HeaderSize);
-    
+
     TI_DbgPrint(MID_TRACE,("IPPacket->Position = %d\n",
                           IPPacket->Position));
 
     //OskitDumpBuffer(IPPacket->Header, IPPacket->TotalSize);
 
     /* FIXME: Possibly forward packets with multicast addresses */
-    
+
     /* FIXME: Should we allow packets to be received on the wrong interface? */
-    NTE = IPLocateNTEOnInterface(IF, &IPPacket->DstAddr, &AddressType);
-    
-    if (NTE) {
-       /* This packet is destined for us */
-       ProcessFragment(IF, IPPacket, NTE);
-       
-       /* Done with this NTE */
-       DereferenceObject(NTE);
+    /* XXX Find out if this packet is destined for us */
+    ProcessFragment(IF, IPPacket);
+#if 0
     } else {
        /* This packet is not destined for us. If we are a router,
           try to find a route and forward the packet */
-       
+
        /* FIXME: Check if acting as a router */
        NCE = NULL;
        if (NCE) {
+           PROUTE_CACHE_NODE RCN;
+
            /* FIXME: Possibly fragment datagram */
            /* Forward the packet */
-           IPSendFragment(IPPacket->NdisPacket, NCE);
+           if(!RouteGetRouteToDestination( &IPPacket->DstAddr, NULL, &RCN ))
+               IPSendDatagram(IPPacket, RCN, ReflectPacketComplete, IPPacket);
        } else {
            TI_DbgPrint(MIN_TRACE, ("No route to destination (0x%X).\n",
                                    IPPacket->DstAddr.Address.IPv4Address));
-           
+
            /* FIXME: Send ICMP error code */
        }
     }
+#endif
 }