ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

NTSTATUS SendFragments ( PIP_PACKET  IPPacket,
PNEIGHBOR_CACHE_ENTRY  NCE,
UINT  PathMTU 
)

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;
}

Generated on Sat May 26 2012 05:58:02 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.