Home | Info | Community | Development | myReactOS | Contact Us
Definition at line 132 of file transmit.c.
Referenced by IPSendDatagram().
{ PIPFRAGMENT_CONTEXT IFC; NDIS_STATUS NdisStatus; PVOID Data; UINT BufferSize = PathMTU, InSize; PCHAR InData; TI_DbgPrint(MAX_TRACE, ("Called. IPPacket (0x%X) NCE (0x%X) PathMTU (%d).\n", IPPacket, NCE, PathMTU)); /* Make a smaller buffer if we will only send one fragment */ GetDataPtr( IPPacket->NdisPacket, IPPacket->Position, &InData, &InSize ); if( InSize < BufferSize ) BufferSize = InSize; TI_DbgPrint(MAX_TRACE, ("Fragment buffer is %d bytes\n", BufferSize)); IFC = ExAllocatePoolWithTag(NonPagedPool, sizeof(IPFRAGMENT_CONTEXT), IFC_TAG); if (IFC == NULL) { IPPacket->Free(IPPacket); return STATUS_INSUFFICIENT_RESOURCES; } /* Allocate NDIS packet */ NdisStatus = AllocatePacketWithBuffer ( &IFC->NdisPacket, NULL, BufferSize ); if( !NT_SUCCESS(NdisStatus) ) { IPPacket->Free(IPPacket); ExFreePoolWithTag( IFC, IFC_TAG ); return NdisStatus; } GetDataPtr( IFC->NdisPacket, 0, (PCHAR *)&Data, &InSize ); IFC->Header = ((PCHAR)Data); IFC->Datagram = IPPacket->NdisPacket; IFC->DatagramData = ((PCHAR)IPPacket->Header) + IPPacket->HeaderSize; IFC->HeaderSize = IPPacket->HeaderSize; IFC->PathMTU = PathMTU; IFC->NCE = NCE; IFC->Position = 0; IFC->BytesLeft = IPPacket->TotalSize - IPPacket->HeaderSize; IFC->Data = (PVOID)((ULONG_PTR)IFC->Header + IPPacket->HeaderSize); KeInitializeEvent(&IFC->Event, NotificationEvent, FALSE); TI_DbgPrint(MID_TRACE,("Copying header from %x to %x (%d)\n", IPPacket->Header, IFC->Header, IPPacket->HeaderSize)); RtlCopyMemory( IFC->Header, IPPacket->Header, IPPacket->HeaderSize ); while (PrepareNextFragment(IFC)) { NdisStatus = IPSendFragment(IFC->NdisPacket, NCE, IFC); if (NT_SUCCESS(NdisStatus)) { KeWaitForSingleObject(&IFC->Event, Executive, KernelMode, FALSE, NULL); NdisStatus = IFC->Status; } if (!NT_SUCCESS(NdisStatus)) break; } FreeNdisPacket(IFC->NdisPacket); ExFreePoolWithTag(IFC, IFC_TAG); IPPacket->Free(IPPacket); return NdisStatus; }