svn commit: r242637 - in user/alfred/so_discard/sys: kern sys
Alfred Perlstein
alfred at FreeBSD.org
Tue Nov 6 00:08:09 UTC 2012
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");
+
+
+
+
+static int
+so_discard_rcv(struct socket *so, void *arg, int waitflag)
+{
+ struct sockbuf *sb;
+
+ so_discard_rcv_calls++;
+ 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
/*
More information about the svn-src-user
mailing list