Date: Sun, 14 Jul 2002 07:57:06 -0700 From: Luigi Rizzo <rizzo@icir.org> To: David Miller <dmiller@sparks.net> Cc: hackers@FreeBSD.ORG Subject: Re: setsockopt() weirdness Message-ID: <20020714075706.A74633@iguana.icir.org> In-Reply-To: <Pine.BSF.4.21.0207141037280.13872-100000@search.sparks.net>; from dmiller@sparks.net on Sun, Jul 14, 2002 at 10:49:56AM -0400 References: <Pine.BSF.4.21.0207141037280.13872-100000@search.sparks.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jul 14, 2002 at 10:49:56AM -0400, David Miller wrote: > I'm probably doing something basic wrong, but I'm getting a very > inconsistent response when using setsockopt to set the SO_RCVTIMEO to > seven seconds or more. i would suspect some overflow of 16-bit fields used to store the timeout value (scaled by HZ) . What value of "HZ" are you using ? And what is the exact threshold where it fails (i'd bet it is between 6.5 and 6.6 sec.) ? cheers luigi > > The program included works on a 4.3R system, a 4.4R and a 4.6stable system > SUPd June 24. The systems are a 486, 800 MHz P-III, and 1.1 GHz t-bird > respectively. > > The program fails to work on a 1 GHz t-bird with 4.6S SUPd last night, and > an XP1700+ SUP'd several days ago. > > "Works" is defined as: > > bash-2.05$ ./x > Successfully set timeout to 6 > Successfully set timeout to 7 > > "Not works" is defined as: > > alex:c$ ./x > Successfully set timeout to 6 > Error 33 trying to set socket timeout to 7 > > > Clue greatly appreciated. > > --- David > > The program: > > #include <sys/types.h> > #include <sys/socket.h> > #include <sys/errno.h> > #include <netinet/in.h> > #include <stdio.h> > #include <arpa/inet.h> > #include <netdb.h> > #include <sys/time.h> > > > extern int errno; > > main() { > > int sock, timeout ; > struct itimerval s_timeout; > > if ((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { > printf("Couldn't get a socket, err %d\n",sock); > exit(-1); > } > > s_timeout.it_interval.tv_usec = 0; > s_timeout.it_value.tv_usec = 0; > > s_timeout.it_value.tv_sec = 0; > s_timeout.it_interval.tv_sec = 6; > > if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, > &s_timeout, sizeof(s_timeout))) { > printf("Error %d trying to set socket timeout\n",errno); > } > else { > printf("Successfully set timeout to %d\n", > s_timeout.it_interval.tv_sec); > } > > s_timeout.it_interval.tv_sec = 7; > > if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, > &s_timeout, sizeof(s_timeout))) { > printf("Error %d trying to set socket timeout to %d\n", > errno, s_timeout.it_interval.tv_sec); > } > else { > printf("Successfully set timeout to %d\n", > s_timeout.it_interval.tv_sec); > } > } > > > > To Unsubscribe: send mail to majordomo@FreeBSD.org > with "unsubscribe freebsd-hackers" in the body of the message To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020714075706.A74633>