BOOLEAN MoreFragments;
USHORT FragOfs;
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("Called. IFC (0x%X)\n", IFC));
if (IFC->BytesLeft != 0) {
NDIS_STATUS NdisStatus;
PVOID Data;
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X) PathMTU (%d).\n",
+ IPPacket, NCE, PathMTU));
- IFC = PoolAllocateBuffer(sizeof(IPFRAGMENT_CONTEXT));
+ IFC = ExAllocatePool(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT));
if (!IFC)
return STATUS_INSUFFICIENT_RESOURCES;
it for all fragments */
Data = ExAllocatePool(NonPagedPool, MaxLLHeaderSize + PathMTU);
if (!IFC->Header) {
- PoolFreeBuffer(IFC);
+ ExFreePool(IFC);
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Allocate NDIS packet */
NdisAllocatePacket(&NdisStatus, &IFC->NdisPacket, GlobalPacketPool);
if (NdisStatus != NDIS_STATUS_SUCCESS) {
- ExFreePool(Data);
- PoolFreeBuffer(IFC);
+ //ExFreePool(Data); // RobD - why are we trying to free this here?, not allocated yet!
+ ExFreePool(IFC);
return STATUS_INSUFFICIENT_RESOURCES;
}
if (NdisStatus != NDIS_STATUS_SUCCESS) {
NdisFreePacket(IFC->NdisPacket);
ExFreePool(Data);
- PoolFreeBuffer(IFC);
+ ExFreePool(IFC);
return STATUS_INSUFFICIENT_RESOURCES;
}
* This routine is called when an IP datagram fragment has been sent
*/
{
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("Called. Context (0x%X) NdisPacket (0x%X) NdisStatus (0x%X)\n",
+ Context, NdisPacket, NdisStatus));
/* FIXME: Stop sending fragments and cleanup datagram buffers if
there was an error */
/* There are no more fragments to transmit, so call completion handler */
NdisPacket = IFC->Datagram;
FreeNdisPacket(IFC->NdisPacket);
- PoolFreeBuffer(IFC);
+ ExFreePool(IFC);
(*PC(NdisPacket)->Complete)(PC(NdisPacket)->Context, NdisPacket, NdisStatus);
}
}
* Lowest level IP send routine
*/
{
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("Called. NdisPacket (0x%X) NCE (0x%X).\n", NdisPacket, NCE));
TI_DbgPrint(MAX_TRACE, ("NCE->State = %d.\n", NCE->State));
}
PC(NdisPacket)->DLComplete = IPSendComplete;
- (*NCE->Interface->Transmit)(NCE->Interface->Context, NdisPacket,
- MaxLLHeaderSize, NCE->LinkAddress, LAN_PROTO_IPv4);
+ (*NCE->Interface->Transmit)(NCE->Interface->Context,
+ NdisPacket,
+ MaxLLHeaderSize,
+ NCE->LinkAddress,
+ LAN_PROTO_IPv4);
return STATUS_SUCCESS;
}
PNEIGHBOR_CACHE_ENTRY NCE;
UINT PathMTU;
- TI_DbgPrint(MAX_TRACE, ("Called.\n"));
+ TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) RCN (0x%X)\n", IPPacket, RCN));
+
+ DISPLAY_IP_PACKET(IPPacket);
NCE = RCN->NCE;
/* Fetch path MTU now, because it may change */
PathMTU = RCN->PathMTU;
+
if (IPPacket->TotalSize > PathMTU) {
return SendFragments(IPPacket, NCE, PathMTU);
} else {
- /* Calculate checksum of IP header */
- ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
+ if ((IPPacket->Flags & IP_PACKET_FLAG_RAW) == 0) {
+ /* Calculate checksum of IP header */
+ ((PIPv4_HEADER)IPPacket->Header)->Checksum = 0;
- ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
- IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
+ ((PIPv4_HEADER)IPPacket->Header)->Checksum = (USHORT)
+ IPv4Checksum(IPPacket->Header, IPPacket->HeaderSize, 0);
- TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n", WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength)));
+ TI_DbgPrint(MAX_TRACE, ("Sending packet (length is %d).\n",
+ WN2H(((PIPv4_HEADER)IPPacket->Header)->TotalLength)));
+ } else {
+ TI_DbgPrint(MAX_TRACE, ("Sending raw packet (flags are 0x%X).\n",
+ IPPacket->Flags));
+ }
return IPSendFragment(IPPacket->NdisPacket, NCE);
}