Date: Fri, 28 Feb 2003 13:06:21 +0200
From: Alexey Zelkin <phantom@FreeBSD.org.ua>
To: freebsd-net@freebsd.org
Subject: maxsockbuf is useless value {?|:-(}
Message-ID: <20030228130621.A16504@phantom.cris.net>
next in thread | raw e-mail | index | archive | help
Folks,
Working with Sun JDK network code I have realized a need to provide some
range checking wrapper for setsockopt() in SO_{SND,RCV}BUF cases. Short
walk over documentation shown that maximum buffer size is exported via
kern.ipc.maxsockbuf sysctl. But attempt to use this value as maximum
buffer size was not successful -- it is too large for kernel.
Short analyzis of kernel code shown that failing checks (around sbreserve())
are done against $sb_max_adj instead of $sb_max which is reflected to sysctl.
$sb_max_adj is always less then $sb_max, therefore we will _always_
fail in attempt to use $sb_max. Testcase is below.
Any suggestions how to workaround this case ? Additionally, I think that
such behaviour is incorrect and should be fixed in kernel as well.
----------------------------------------------------------------------------
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/sysctl.h>
#include <sys/errno.h>
#include <stdio.h>
/*
* Demonstrates problem with attempt to set documented (i.e. exported via
* kern.ipc.maxsockbuf sysctl) maximum SO_SNDBUF buffer size.
* Same applied to SO_RCVBUF.
*/
int
main()
{
int mib[3] = { CTL_KERN, KERN_IPC, KIPC_MAXSOCKBUF };
size_t rlen;
int s;
socklen_t sz;
int maxsockbuf;
int status;
rlen = sizeof(maxsockbuf);
if (sysctl(mib, 3, &maxsockbuf, &rlen, NULL, 0) < 0)
perror("sysctl");
printf("kern.ipc.maxsockbuf = %d\n", maxsockbuf);
if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
perror("socket");
sz = sizeof(maxsockbuf);
status = setsockopt(s, SOL_SOCKET, SO_SNDBUF, &maxsockbuf, sz);
if (status == 0) {
printf("setsockopt: OK\n");
} else if (errno == ENOBUFS) {
printf("setsockopt: KABOOM (ENOBUFS returned)\n");
} else {
perror("getsockopt");
}
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-net" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030228130621.A16504>
