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 ) {
}
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);
}
/* 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 */
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
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);
/* 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;
}
/* 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;
Datagram = ReassembleDatagram(IPDR);
+ RemoveIPDR(IPDR);
TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
- RemoveIPDR(IPDR);
FreeIPDR(IPDR);
if (!Datagram)
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);
* 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) {
} else {
TI_DbgPrint(MIN_TRACE, ("No route to destination (0x%X).\n",
IPPacket->DstAddr.Address.IPv4Address));
-
+
/* FIXME: Send ICMP error code */
}
}
+#endif
}