Date: Wed, 03 Oct 2007 18:51:14 -0400 From: Randall Stewart <rrs@cisco.com> To: Martin Kulas <coolaz@web.de> Cc: current@freebsd.org Subject: Re: [SCTP][patch] socket does not wake up Message-ID: <47041CE2.60603@cisco.com> In-Reply-To: <20071003141412.GA1311@thunderbird.tld> References: <20071003141412.GA1311@thunderbird.tld>
next in thread | previous in thread | raw e-mail | index | archive | help
Martin: Thanks for the patch.. note that I will submit it to re for approval after a minor fix. socantrcvmore(so); assumes you do NOT hold a lock. This code holds the socket lock.. which is the recv sockbuf lock.. So if you turn witness on your kernel and run with this you will have a double lock.. panic. Note to fix this right you should have it be: SOCK_UNLOCK(so); + socantrcvmore(so); Which is what I will submit to release ops.. you may want to change this in what you are working with so you don;t have some other side-effect issue from the double lock.. like leaking sockets. R Martin Kulas wrote: > Hello! > > I patched netcat to support 1to1-SCTP sockets. > Netcat uses the poll() system call to wait for new data > in the socket buffer. The problem is that poll() does not > return when the kernel has closed the SCTP association. > Select() has the same problem. > > I digged around in the SCTP sources and created a patched to remove > that bug. The patch is a one-liner: > > <patch> > --- sctp_pcb.c.orig 2007-10-03 13:27:12.000000000 +0200 > +++ sctp_pcb.c 2007-10-03 15:51:55.286987000 +0200 > @@ -4234,6 +4234,7 @@ > SS_ISCONFIRMING | > SS_ISCONNECTED); > } > + socantrcvmore(so); > SOCK_UNLOCK(so); > sctp_sowwakeup(inp, so); > sctp_sorwakeup(inp, so); > </patch> > > Now I have no problems with the system calls select()/poll() anymore. > Is this patch OK or have I missed anything? > > > Regards, > Martin > -- Randall Stewart NSSTG - Cisco Systems Inc. 803-345-0369 <or> 803-317-4952 (cell)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?47041CE2.60603>