Sean Chittenden sean at
Tue Jun 29 10:36:42 PDT 2004

> Is there any way to change its value according to the connection's uid 
> or port?

Not with sysctl(8).  You can by hacking the application and adding a 
few setsockopt(2) calls, specifically the SO_RCVBUF and SO_SNDBUF 
options.  Here's a sample snippit you could follow:

/* Add these #includes if they aren't already there */
#include <err.h>
#include <sysexits.h>

/* Add this to the top of the function that calls listen(2) */
int rcvbuf = 4096;
int sndbuf = 4096;

/* And add these calls before the application makes its listen(2) call. 
  You may find that some applications are already setting their send and 
receive buffer sizes. */
if (setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &rcvbuf, sizeof(rcvbuf)) != 0)
   err(EX_OSERR, "setsockopt(2) for SO_RCVBUF failed");

if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &sndbuf, sizeof(sndbuf)) != 0)
   err(EX_OSERR, "setsockopt(2) for SO_SNDBUF failed");

> I need small sendspaces to ircd and bigger ones to apache..

Add the above to each of the applications before they make their 
listen(2) calls.  It's a shame more applications don't let you tweak 
this value via a config file.


Sean Chittenden

More information about the freebsd-performance mailing list