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@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main