Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 3 Sep 2002 07:37:17 +0400 (MSD)
From:      "vfom" <vfom@narod.ru>
To:        FreeBSD-gnats-submit@FreeBSD.org
Subject:   kern/42352: Impossible to set RCV timeout on a socket to 33 sec, with "option HZ=1000" in ke
Message-ID:  <3D742E6D.00000A.02440@soapbox.yandex.ru>

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

>Number:         42352
>Category:       kern
>Synopsis:       Impossible to set RCV timeout on a socket to 33 sec, with "option HZ=1000" in kernel
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Mon Sep 02 20:40:01 PDT 2002
>Closed-Date:
>Last-Modified:
>Originator:     Viktor Fomichev
>Release:        FreeBSD 4.6.2-RELEASE i386
>Organization:
home-user
>Environment:
System: FreeBSD shark.office.sice.ru 4.6.2-RELEASE FreeBSD 4.6.2-RELEASE #0: Wed Aug 28 12:20:43 NOVST 2002 root@gog:/usr/src/sys/compile/GROM.ipsec.tap i386

	
>Description:
	
Impossible to set receive and send timeout on a socket to more then 33 secs.
when kernel compiled with  "option	HZ=1000"
It recomended for network device polling. (man 4 polling)  
"Setsockopt" returns with error: Numerical argument out of domain.

>How-To-Repeat:
Compile new kernel with  "option HZ=1000". Install new kernel and reboot.
Compile and run following program. Output looks like:    

# ./test_sockopt                                              
recv 32...                                                    
test_sockopt: recv: Resource temporarily unavailable          
test_sockopt: setsockopt: Numerical argument out of domain        
#

test_sockopt.c:

# include <sys/types.h>
# include <sys/socket.h>
# include <sys/time.h>
# include <stdio.h>
# include <errno.h>
# include <string.h>
# include <err.h>
# include <netinet/in.h>

int
main(int argc, char *argv[])
{
	int s;
	struct timeval tv;
	struct sockaddr_in sin;
	u_char buf[1000];

	if ((s = socket(PF_INET, SOCK_DGRAM, 0)) == -1)
		err(1, "socket");

	sin.sin_len = sizeof(sin);
	sin.sin_family = AF_INET;
	sin.sin_port = htons(10000);
	sin.sin_addr.s_addr = INADDR_ANY;
	if (bind(s, (struct sockaddr *)&sin, sizeof(sin)) == -1)
		err(1, "bind");

	tv.tv_sec = 32;
	tv.tv_usec = 0;
	if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1)
		err(1, "setsockopt");

	printf("recv 32...\n");
	if (recv(s, buf, sizeof(buf), 0) == -1)
		warn("recv");

	tv.tv_sec = 33;
	tv.tv_usec = 0;
	if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) == -1)
		err(1, "setsockopt");

	printf("recv 33...\n");
	if (recv(s, buf, sizeof(buf), 0) == -1)
		warn("recv");

	return (0);
}
	
>Fix:
Not known.
It seems to me, we have to change  "socket" structure definition
in "sys/socketvar.h", in substructure  "sockbuf" - sb_timeo must be
at least 4 byte integer, or long - to forget the problem forever.
	


>Release-Note:
>Audit-Trail:
>Unformatted:
 X-send-pr-version: 3.113
 X-GNATS-Notify: 
 
 

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3D742E6D.00000A.02440>