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