Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 09 Oct 2015 15:23:31 +0800
From:      White Knight <white_knight@2ch.net>
To:        freebsd-current@freebsd.org
Subject:   The kern.ipc.somaxconn limit revisited.
Message-ID:  <ddc130c96b7b76ed22fb582b701a86f4@2ch.net>

next in thread | raw e-mail | index | archive | help
Hi,

Back in 2012, raising the limit of kern.ipc.somaxcann was discussed (now 
properly called kern.ipc.acceptqueue) but nothing came of it.  The old 
discussion is here:

   
https://lists.freebsd.org/pipermail/freebsd-current/2012-January/030970.html

We are running into problems with the limit capped to 16 bits.  I am 
prepared to write the patch and do all the necessary testing.

A few things concern me.  The original patch(*) only changed the data 
types in usr/src/sys/sys/socketvar.h but neglected to update struct 
xsctp_inpcb in usr/src/sys/netinet/sctp_uio.h.

First, what are the consequences of changing struct xsctp_inpcb?  Is ok 
to change the type from u_short to u_int, or is it better to deprecate 
these fields and use the padding?  If I understand the code correctly, 
this is part of the userland ABI.

Second, if there is no arbitrary limit, this line in 
usr/src/sys/kern/uipc_socket.c can overflow.

   over = (head->so_qlen > 3 * head->so_qlimit / 2);

Should there be some arbitrary limit?

Third, the original patch changed the arbitrary limit from USHRT_MAX to 
UINT_MAX, but does that make any sense?  As written, it'll require the 
u_int to overflow for the test to ever be true.  Plus, the value is 
passed in as an int, so is it at all possible to give system call 
anything higher than INT_MAX?

Fourth, the snprintf() fields in usr/src/usr.bin/netstat/inet.c and 
usr/src/usr.bin/netstat/unix.c were not changed to account for larger 
than 16 bit numbers.  Is there really a need for a fixed length buffer 
to be formatted with snprintf() and then passed to printf()?

Fifth, is there any need to change the formatting string in 
usr/src/sys/kern/uipc_debug.c?

Sixth, in usr/src/sys/kern/uipc_socket.c, we have code like this, where 
optval is signed.

   optval = so->so_qlimit;

Does that mean the fields in struct socket are better off as signed than 
unsigned integers?


(*) 
https://lists.freebsd.org/pipermail/freebsd-current/2012-January/031003.html


Thank you,

-- 
White Knight

I'm not from 2ch.net, I just work there.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ddc130c96b7b76ed22fb582b701a86f4>