lwIP port to Genode - lwip_recv()
Amadeo Casas Cuadrado
amadeo.c at ...60...
Wed Dec 7 18:38:21 CET 2011
It is all clear now, Stefan. Thanks for your thorough answer.
Amadeo
On 12/07/2011 02:10 AM, Stefan Kalkowski wrote:
> Hello Amadeo,
>
> On 07.12.2011 03:20, Amadeo Casas Cuadrado wrote:
>> Hello,
>>
>> Question about the lwIP port to Genode. Is it possible to receive a
>> large amount of data with lwip_recv()? A quick test shows me the maximum
>> amount of data that is received is 1460 bytes (properly matching TCP_MSS
>> in lwipopts.h). What if I am expecting a larger amount of data? Do I
>> need to perform the defragmentation explicitly in my program?
>
> Yes you're right. In general, when using LwIP receive operations it's
> impossible to be blocked until the whole provided buffer is filled. You
> can find a related section in the LwIP documentation:
>
> http://lwip.wikia.com/wiki/Receiving_data_with_LWIP
>
> "... LWIP may choose to return a fewer number of bytes for a variety of
> reasons. This is true even if you do a blocking receive operation. There
> is no option to make lwip_recv() block until a certain minimum number of
> bytes have been received. ..."
>
> In fact, the Genode-specific part of the LwIP stack mainly is the
> ethernet-driver implementation. This driver executes a designated
> receiver-thread, which blocks on Genode's NIC-session interface.
> Whenever, a new packet from the NIC is on-line, this thread puts it into
> the higher layers of LwIP which is platform-independent code. The driver
> can't accumulate packets, as it has no knowledge how much data the
> application is going to receive. It would block an application endlessly
> in the worst case. The only layer, where this accumulation can be done
> is the socket-layer, or the application itself.
>
> But, this policy isn't particular to the LwIP stack. The glibc of my
> Linux system works similar. It doesn't block until all data is received.
> An excerpt from the man page:
>
> "... The receive calls normally return any data available, up to the
> requested amount, rather than waiting for receipt of the full amount
> requested. ..."
>
> Nevertheless, if for some reason you definitely need this hard-blocking
> behaviour, you can wrap the 'lwip_' socket functions, and implement an
> adequate loop in the 'recv()' wrapper. You can have a look at our
> libc-lwip plugin in 'libports/src/lib/libc_lwip/plugin.cc'. Here we
> already wrapped LwIP's socket-layer to integrate LwIP' functionality
> conveniently in our libc. You can simply extend the recv() function in
> there.
>
>>
>> My apologies beforehand for posting to this list if this is a limitation
>> of lwIP stack, and not of its port to Genode.
>
> No matter.
>
> Regards
> Stefan
>
>>
>> Thanks,
>> Amadeo
>>
>> ------------------------------------------------------------------------------
>> Cloud Services Checklist: Pricing and Packaging Optimization
>> This white paper is intended to serve as a reference, checklist and point of
>> discussion for anyone considering optimizing the pricing and packaging model
>> of a cloud services business. Read Now!
>> http://www.accelacomm.com/jaw/sfnl/114/51491232/
>> _______________________________________________
>> Genode-main mailing list
>> Genode-main at lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/genode-main
>>
>
More information about the users
mailing list