Fix firefox exit. Implement a simple work queue for possibly dispatch level
[reactos.git] / reactos / drivers / lib / ip / network / receive.c
index c5eb24f..f53a2e0 100644 (file)
@@ -18,9 +18,9 @@ NPAGED_LOOKASIDE_LIST IPDRList;
 NPAGED_LOOKASIDE_LIST IPFragmentList;
 NPAGED_LOOKASIDE_LIST IPHoleList;
 
-VOID ReflectPacketComplete( 
-    PVOID Context, 
-    PNDIS_PACKET Packet, 
+VOID ReflectPacketComplete(
+    PVOID Context,
+    PNDIS_PACKET Packet,
     NDIS_STATUS Status ) {
 }
 
@@ -107,12 +107,6 @@ VOID FreeIPDR(
     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));
 
   TcpipFreeToNPagedLookasideList(&IPDRList, IPDR);
@@ -229,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 */
@@ -279,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
@@ -337,7 +329,6 @@ VOID ProcessFragment(
     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);
@@ -403,17 +394,10 @@ VOID ProcessFragment(
 
     /* 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;
     }
 
@@ -440,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;
@@ -467,9 +451,9 @@ VOID ProcessFragment(
 
     Datagram = ReassembleDatagram(IPDR);
 
+    RemoveIPDR(IPDR);
     TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
 
-    RemoveIPDR(IPDR);
     FreeIPDR(IPDR);
 
     if (!Datagram)
@@ -479,7 +463,7 @@ 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);
@@ -537,59 +521,64 @@ VOID IPv4Receive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
  *     IPPacket = Pointer to IP packet
  */
 {
-    PNEIGHBOR_CACHE_ENTRY NCE;
-    PNET_TABLE_ENTRY NTE;
-    UINT AddressType;
-    
+    IP_ADDRESS Address;
+
     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);
+    /* XXX Find out if this packet is destined for us */
+
+    if( AddrLocateADEv4( IPPacket->DstAddr.Address.IPv4Address, &Address ) ) {
+       ProcessFragment( IF, IPPacket );
+    } else {
+       PNEIGHBOR_CACHE_ENTRY NCE;
+
+       if((NCE = RouteGetRouteToDestination( &IPPacket->DstAddr ))) {
+           IPSendDatagram( IPPacket, NCE, NULL, NULL );
+       }
+    }
+#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) {
@@ -602,10 +591,11 @@ VOID IPv4Receive(PIP_INTERFACE IF, PIP_PACKET IPPacket)
        } else {
            TI_DbgPrint(MIN_TRACE, ("No route to destination (0x%X).\n",
                                    IPPacket->DstAddr.Address.IPv4Address));
-           
+
            /* FIXME: Send ICMP error code */
        }
     }
+#endif
 }