Re: getsockopt/setsockopt with SO_RCVBUF and SO_SNDBUF "non-standard" behaviour
From: Eric Dumazet <hidden>
Date: 2012-07-18 16:11:22
Also in:
lkml
On Wed, 2012-07-18 at 17:59 +0200, Eugen Dedu wrote:
Any idea? On 17/07/12 11:27, Eugen Dedu wrote:quoted
Hi all, I looked on Internet and at the old thread http://lkml.indiana.edu/hypermail/linux/kernel/0108.0/0275.html, but the issue is still not settled as far as I see. I need to have the highest memory available for snd/rcv buffer and I need to know/confirm how much it allocated for my process (how much I can use). So with Linux we need to do something like: setsockopt (..., SO_RCVBUF, 256000, ...) getsockopt (..., SO_RCVBUF, &i, ...) i /= 2; where i is the size I am looking for. Now, to make this code work for other OSes it should be changed to: setsockopt (..., SO_RCVBUF, 256000, ...) getsockopt (..., SO_RCVBUF, &i, ...) #ifdef LINUX i /= 2; #endif First question, is this code correct? If not, what code gives the amount of memory useable for my process? Second, it seems to me that linux is definitely "non-standard" here. Saying that linux uses twice as memory has nothing to do with that, since getsockopt should return what the application can count on, not what is the internal use. It is like a hypothetical malloc (10) would return not 10, but 20 (including meta-information). Is that right? Cheers,
That the way it's done on linux since day 0 You can probably find a lot of pages on the web explaining the rationale. If your application handles UDP frames, what SO_RCVBUF should count ? If its the amount of payload bytes, you could have a pathological situation where an attacker sends 1-byte UDP frames fast enough and could consume a lot of kernel memory. Each frame consumes a fair amount of kernel memory (between 512 bytes and 8 Kbytes depending on the driver). So linux says : If user expect to receive XXXX bytes, set a limit of _kernel_ memory used to store these bytes, and use an estimation of 100% of overhead. That is : allow 2*XXXX bytes to be allocated for socket receive buffers.