setsockopt / SO_RCVTIMEO

Eric Norum eric.norum at usask.ca
Tue Jan 22 14:38:20 UTC 2002


Erwin Rol wrote:
> 
> Hello All,
> 
> I have a small problem with RTEMS 4.0.0. I changed my ticks from 100/sec to
> 1000/sec, everything is fine. But now i wanted to use setsockopt to set a recv
> timeout on a socket and i ran into a problem, it returns with an error EDOM
> error.
> 
> When lookign at the source i found the place where i think it goes wrong,
> namely in
> ..../c/src/lib/libnetworking/kern/uipc_socket.c there is tested if the seconds
> value is within range.
> 
>                 case SO_RCVTIMEO:
>                     {
>                         struct timeval *tv;
>                         short val;
> 
>                         if (m == NULL || m->m_len < sizeof (*tv)) {
>                                 error = EINVAL;
>                                 goto bad;
>                         }
>                         tv = mtod(m, struct timeval *);
>                         if (tv->tv_sec > SHRT_MAX / hz - hz) {
>                                 error = EDOM;
>                                 goto bad;
>                         }
>                         val = tv->tv_sec * hz + tv->tv_usec / tick;
> 
> SRT_MAX = 65535
> hz = 1000
> tick = 1000
> 
> so the number of seconds may not be larger than 65535/1000 - 1000 = -934 sec
> of course this works fine for hz = 100 -> 65535/100 - 100 = 555 sec
> but thats still wrong, it should be (correct me if i am wrong)
> (SRT_MAX - hz) / hz   or  SRT_MAX / hz - 1 than it would like this
> (65535-1000) / 1000  = 64 sec.  or (65535-100)/100 = 654 sec.
> 
> Maybe it is already fixed in new release , but i don't have the sources of
> them here so i couldn't check.
> 

This has been fixed for quite a while.

-- 
Eric Norum                                 eric.norum at usask.ca
Department of Electrical Engineering       Phone: (306) 966-5394
University of Saskatchewan                 FAX:   (306) 966-5407
Saskatoon, Canada.



More information about the users mailing list