Hi, TcpIoReceive() library function is defined to receive required amount of data in a specified period, see the function description in TcpIoLib.h:
@retval EFI_TIMEOUT Failed to receive the required amount of data in the specified time period. When you set the required data length to 1024 bytes, this function will first receive the packet less than 1024 bytes then wait for the next packet. If this function cannot receive 1024 bytes data in total, it will return EFI_TIMEOUT. In your case, if you want to receive the packet with less than 1024 bytes length only, please use Tcp4->Receive () directly. Take TcpIoReceive() function as reference: RxData->DataLength = 1024; Status = Tcp4->Receive (Tcp4, &TcpIo->RxToken.Tcp4Token); For instance, when a packet with 1000 bytes length is received during this call, the ‘Status’ field will be set to EFI_SUCCESS and RxData->DataLength will be set to 1000, and also, the TcpIoCommonNotify() will be signaled thus TcpIo->IsRxDone will be set to TRUE. Best Regards, Ye Ting From: Ye, Ting [mailto:ting...@intel.com] Sent: Monday, August 18, 2014 3:33 PM To: edk2-devel@lists.sourceforge.net Subject: Re: [edk2] TcpIoReceive question Hi, Thanks for reporting this. We will check whether we can reproduce the issue. Best Regards, Ye Ting From: Thomas Rognon [mailto:tcrog...@gmail.com] Sent: Sunday, August 17, 2014 8:21 AM To: edk2-devel Subject: [edk2] TcpIoReceive question I'm receiving a packet of unknown length and it is less than 1024 bytes. I'm using TcpIoReceive. I'm expecting it to receive the packet and then update the NET_FRAGMENT.Len to the number of bytes received. Instead, it times out. I know the packet is being sent (I can see it on wireshark). Also, if the actual packet size and my buffer size match, then everything works fine. It only times out when the actual packet size is smaller than my buffer. Here is example code. What am I doing wrong? EFI_STATUS ExampleReceive ( IN EXAMPLE_PRIVATE *Private, IN OUT UINT32 *DataSize, IN OUT UINT8 *Data ) { EFI_STATUS Status; NET_FRAGMENT Fragment; NET_BUF *Packet; Fragment.Len = *DataSize; Fragment.Bulk = Data; Packet = NetbufFromExt ( &Fragment, 1, 0, 0, ExampleNbufExtFree, NULL ); if (Packet == NULL) { return EFI_OUT_OF_RESOURCES; } Status = gBS->SetTimer ( Private->RxTimeoutEvent, TimerRelative, 5 * TICKS_PER_SECOND ); if (EFI_ERROR (Status)) { NetbufFree (Packet); return Status; } Status = TcpIoReceive ( &Private->TcpIo, Packet, FALSE, Private->RxTimeoutEvent ); gBS->SetTimer (Private->RxTimeoutEvent, TimerCancel, 0); NetbufFree (Packet); if (!EFI_ERROR (Status)) { *DataSize = Fragment.Len; } return Status; } If the incoming packet is 1024 bytes, then the following code will work as expected. If the incoming packet is less than 1024 bytes, then it will return EFI_TIMEOUT after 5 seconds. DataSize = 1024; // this number is arbitrary Data = AllocatePool (DataSize); ExampleReceive (Private, &DataSize, Data); If I'm doing something wrong, then how would I receive a packet where I know the maximum size, but I don't know the exact size? I'm using UDK2010.SR1.UP1.P1. Thank you for any insight. Thomas Rognon
------------------------------------------------------------------------------
_______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel