Discussion:
setsockopt() and kern.ipc.maxsockbuf
Cameron Sparr
2015-11-09 23:32:46 UTC
Permalink
Hello,

I'm not sure if this is the correct place to do it, but I'd like to put out
a proposal for changing the way that the setsockopt() function handles the
max socket buffer setting.

Currently, it's a bit unintuitive that SO_RCVBUF & SO_SNDBUF can not
actually be set to the kern.ipc.maxsockbuf value, even though it is
described as being possible in the man page:
https://www.freebsd.org/cgi/man.cgi?query=setsockopt&sektion=2

This is because setsockopt() will error out if the value passed is over the
_adjusted_ maximum, which on my system (amd64) turns out to be something
like kern.ipc.maxsockbuf * 0.889 (kern.ipc.maxsockbuf * (1 << 11) / (256 +
(1 << 11)) = kern.ipc.maxsockbuf * (2048) / (2304)).

see here:
https://github.com/freebsd/freebsd/blob/master/sys/kern/uipc_sockbuf.c#L420
and here:
https://github.com/freebsd/freebsd/blob/master/sys/kern/uipc_sockbuf.c#L63-L64

I believe that the behavior could be made more intuitive by checking if the
value passed is under the _actual_ max before erroring out, and if it is
under the actual max, then set it to the adjusted max and continue the
function, this would be a simple change and would look something like this
(apologies for the whitespace diffs):

https://github.com/sparrc/freebsd/commit/157f90c55d1d54d33f41c6f7517de1a9c5f5e229

Also, I'm a newb to the freebsd mailing lists, so please let me know if
this sort of request should go elsewhere.

Thanks all,
Cameron

Loading...