Date: Tue, 06 Nov 2012 11:57:06 +0400 From: Andrey Zonov <zont@FreeBSD.org> To: Alfred Perlstein <alfred@FreeBSD.org> Cc: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: Re: svn commit: r242637 - in user/alfred/so_discard/sys: kern sys Message-ID: <5098C2D2.5060002@FreeBSD.org> In-Reply-To: <201211060008.qA6089AQ024990@svn.freebsd.org> References: <201211060008.qA6089AQ024990@svn.freebsd.org>
index | next in thread | previous in thread | raw e-mail
[-- Attachment #1 --] On 11/6/12 4:08 AM, Alfred Perlstein wrote: > Author: alfred > Date: Tue Nov 6 00:08:09 2012 > New Revision: 242637 > URL: http://svnweb.freebsd.org/changeset/base/242637 > > Log: > Implement a socket option SO_DISCARD_RECV, this will discard any > data that arrives. I've found this very useful for testing streaming > services and want to share it with community as a whole as well as > stash it someplace I can pull up if needed for benching. > > Modified: > user/alfred/so_discard/sys/kern/uipc_socket.c > user/alfred/so_discard/sys/sys/socket.h > > Modified: user/alfred/so_discard/sys/kern/uipc_socket.c > ============================================================================== > --- user/alfred/so_discard/sys/kern/uipc_socket.c Tue Nov 6 00:03:53 2012 (r242636) > +++ user/alfred/so_discard/sys/kern/uipc_socket.c Tue Nov 6 00:08:09 2012 (r242637) > @@ -2479,6 +2479,26 @@ so_setsockopt(struct socket *so, int lev > return (sosetopt(so, &sopt)); > } > > +static int so_discard_rcv_calls; > + > +SYSCTL_INT(_kern_ipc, OID_AUTO, so_discard_rcv_calls, CTLFLAG_RD, > + &so_discard_rcv_calls, 0, "Number of open sockets"); ^^^^^^^^^^^^^^^^^^^^^^ Is the comment correct? > + > + > + > + > +static int > +so_discard_rcv(struct socket *so, void *arg, int waitflag) > +{ > + struct sockbuf *sb; > + > + so_discard_rcv_calls++; It seems this incrementing is not safe in multi-threaded world. > + sb = &so->so_rcv; > + SOCKBUF_LOCK_ASSERT(sb); > + sbflush_locked(sb); > + return (SU_OK); > +} > + > int > sosetopt(struct socket *so, struct sockopt *sopt) > { > @@ -2681,7 +2701,31 @@ sosetopt(struct socket *so, struct socko > error = EOPNOTSUPP; > #endif > break; > - > + case SO_DISCARD_RECV: { > + struct sockbuf *sb = &so->so_rcv; > + error = sooptcopyin(sopt, &optval, sizeof optval, > + sizeof optval); > + if (error) > + goto bad; > + SOCKBUF_LOCK(&so->so_rcv); > + if (optval == 1) { > + if (sb->sb_upcall != NULL) { > + error = EBUSY; > + } else { > + soupcall_set(so, SO_RCV, > + &so_discard_rcv, NULL); > + } > + } else if (optval == 0) { > + if (sb->sb_upcall == so_discard_rcv) > + soupcall_clear(so, SO_RCV); > + else > + error = EINVAL; > + } else { > + error = ENOPROTOOPT; > + } > + SOCKBUF_UNLOCK(&so->so_rcv); > + } > + break; > default: > error = ENOPROTOOPT; > break; > @@ -2869,6 +2913,10 @@ integer: > optval = so->so_incqlen; > goto integer; > > + case SO_DISCARD_RECV: > + optval = (so->so_rcv.sb_upcall == so_discard_rcv) ? 1 : 0; > + goto integer; > + > default: > error = ENOPROTOOPT; > break; > > Modified: user/alfred/so_discard/sys/sys/socket.h > ============================================================================== > --- user/alfred/so_discard/sys/sys/socket.h Tue Nov 6 00:03:53 2012 (r242636) > +++ user/alfred/so_discard/sys/sys/socket.h Tue Nov 6 00:08:09 2012 (r242637) > @@ -140,6 +140,7 @@ typedef __uid_t uid_t; > #define SO_USER_COOKIE 0x1015 /* user cookie (dummynet etc.) */ > #define SO_PROTOCOL 0x1016 /* get socket protocol (Linux name) */ > #define SO_PROTOTYPE SO_PROTOCOL /* alias for SO_PROTOCOL (SunOS name) */ > +#define SO_DISCARD_RECV 0x1017 /* discard recieved data */ > #endif > > /* > -- Andrey Zonov [-- Attachment #2 --] -----BEGIN PGP SIGNATURE----- Version: GnuPG/MacGPG2 v2.0.18 (Darwin) Comment: GPGTools - http://gpgtools.org iQEcBAEBAgAGBQJQmMLWAAoJEBWLemxX/CvTAp0H/jMsQUZNZoDmkI3p4eYUZCH6 w0cP2jRZfzx4jfgqujr2uOlIQNkhaF8LxnMYKWVLqyjA9W9anSILhO7xTQIcNzuU qFQy+27s5p3J0oeTxnQfj9OYE9jwCuSzKmnvTkM50AQ1o4Ay34DCHv/YOR27m99A 7DcDlJbfVn3377rLZ0wWXURTOrnu3nJCCit+XugK1UoJAHK6eJGoH0SMzDNZhhds 7RKIIZO+QfkXm1qSjLrMubLMMd7W+sCYlTmoYNSuPLzgJHvB+fGns9psa/7H0V3G RR8+ECxvJ9LSVESHghIIoWItPMwJrWvC+hoJys8RiCyS1DW/5zXbH9VYSq+pCS4= =3aaM -----END PGP SIGNATURE-----help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5098C2D2.5060002>
