Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Jan 2002 13:26:21 -0500 (EST)
From:      sandeepj@research.bell-labs.com (Sandeep Joshi)
To:        freebsd-net@freebsd.org
Subject:   soreceive error handling question
Message-ID:  <200201221826.NAA15250@aura.research.bell-labs.com>

next in thread | raw e-mail | index | archive | help
I am seeing some unexplained behaviour while calling
TCP "soreceive" directly within some kernel code.
Can someone (or someone else..) tell me if this is
a bug/feature.

(This is seen on 4.3REL & 4.4 REL)

The (abbreviated) code does as follows:
 ---------------------------- (Fig 1)
 do {
   /* SS_NBIO is not set, rcv_timeo is non-zero */
   err = soreceive(so, 0, &uio, 0, 0, MSG_WAITALL);
   ..process uio data appropriate..
 } while (err == 0);
 ----------------------------

This works fine... until the thing at the other end
of the socket goes down and sends us a FIN.  At
this point, the above code fragment hangs in an
infinite loop, since soreceive keeps returning a
zero error code but no data.

so->so_state has changed to 0x34, which is SS_CANTRCVMORE 
and SS_ISCONNECTED.  This is due to tcp_input() calling 
socantrcvmore() on TH_FIN.  And there is no read data 
pending (so_rcv.sb_mb) in the socket. 

I suspect that soreceive() enters the code path below
and returns from "release:" without having the error set.
 ----------------------------(Fig 2)
     > if (so->so_state & SS_CANTRCVMORE) {
     >   if (m)
     >       goto dontblock;
     >   else
     >       goto release;
     > }
 ----------------------------

The code calling soreceive (Fig 1) was enhanced to break
if (so_state & SS_CANTRCVMORE).  This prevented the 
infinite loop.

Is this extra check required OR is there a problem in
soreceive ?   I am unable to determine why read(socket_fd)
(i.e. soo_read) does not exhibit similar error behaviour.

Any clarifications welcome..

Thanks
-Sandeep

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?200201221826.NAA15250>