svn commit: r242637 - in user/alfred/so_discard/sys: kern sys

Andrey Zonov zont at FreeBSD.org
Tue Nov 6 07:57:13 UTC 2012


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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 535 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-user/attachments/20121106/b9e90f84/attachment.sig>


More information about the svn-src-user mailing list