NPAGED_LOOKASIDE_LIST IPFragmentList;
NPAGED_LOOKASIDE_LIST IPHoleList;
+VOID ReflectPacketComplete(
+ PVOID Context,
+ PNDIS_PACKET Packet,
+ NDIS_STATUS Status ) {
+}
PIPDATAGRAM_HOLE CreateHoleDescriptor(
ULONG First,
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;
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;
}
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);
}
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);
}
TI_DbgPrint(DEBUG_IP, ("Searching for IPDR for IP packet at (0x%X).\n", IPPacket));
- KeAcquireSpinLock(&ReassemblyListLock, &OldIrql);
+ TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql);
/* FIXME: Assume IPv4 */
(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;
}
}
/* 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 */
{
TI_DbgPrint(MIN_TRACE, ("Insufficient resources.\n"));
- KeReleaseSpinLock(Lock, OldIrql);
+ TcpipReleaseSpinLock(Lock, OldIrql);
RemoveIPDR(IPDR);
FreeIPDR(IPDR);
if (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
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;
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;
/* 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);
/* 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);
- KeReleaseSpinLock(&IPDR->Lock, OldIrql);
-
RemoveIPDR(IPDR);
+ TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
+
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);
TI_DbgPrint(MAX_TRACE, ("Freeing datagram at (0x%X).\n", Datagram));
(*Datagram->Free)(Datagram);
} else
- KeReleaseSpinLock(&IPDR->Lock, OldIrql);
+ TcpipReleaseSpinLock(&IPDR->Lock, OldIrql);
}
PLIST_ENTRY CurrentEntry;
PIPDATAGRAM_REASSEMBLY Current;
- KeAcquireSpinLock(&ReassemblyListLock, &OldIrql);
+ TcpipAcquireSpinLock(&ReassemblyListLock, &OldIrql);
CurrentEntry = ReassemblyListHead.Flink;
while (CurrentEntry != &ReassemblyListHead) {
CurrentEntry = CurrentEntry->Flink;
}
- KeReleaseSpinLock(&ReassemblyListLock, OldIrql);
+ TcpipReleaseSpinLock(&ReassemblyListLock, OldIrql);
}
* 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
}