Module Name:    src
Committed By:   tls
Date:           Wed Sep  2 14:56:57 UTC 2009

Modified Files:
        src/sys/kern: uipc_socket2.c
        src/sys/net: if_gre.c
        src/sys/netinet: accf_data.c accf_http.c
        src/sys/sys: socketvar.h

Log Message:
Add a direction argument to socket upcalls, so they can tell why they've
been called when, for example, they're waiting for space to write.  From
Ritesh Agrawal at Coyote Point.


To generate a diff of this commit:
cvs rdiff -u -r1.103 -r1.104 src/sys/kern/uipc_socket2.c
cvs rdiff -u -r1.140 -r1.141 src/sys/net/if_gre.c
cvs rdiff -u -r1.5 -r1.6 src/sys/netinet/accf_data.c
cvs rdiff -u -r1.6 -r1.7 src/sys/netinet/accf_http.c
cvs rdiff -u -r1.119 -r1.120 src/sys/sys/socketvar.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/uipc_socket2.c
diff -u src/sys/kern/uipc_socket2.c:1.103 src/sys/kern/uipc_socket2.c:1.104
--- src/sys/kern/uipc_socket2.c:1.103	Fri Jul 24 01:09:49 2009
+++ src/sys/kern/uipc_socket2.c	Wed Sep  2 14:56:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: uipc_socket2.c,v 1.103 2009/07/24 01:09:49 christos Exp $	*/
+/*	$NetBSD: uipc_socket2.c,v 1.104 2009/09/02 14:56:57 tls Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.103 2009/07/24 01:09:49 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_socket2.c,v 1.104 2009/09/02 14:56:57 tls Exp $");
 
 #include "opt_mbuftrace.h"
 #include "opt_sb_max.h"
@@ -190,7 +190,8 @@
 			so->so_upcallarg = head->so_accf->so_accept_filter_arg;
 			so->so_rcv.sb_flags |= SB_UPCALL;
 			so->so_options &= ~SO_ACCEPTFILTER;
-			(*so->so_upcall)(so, so->so_upcallarg, M_DONTWAIT);
+			(*so->so_upcall)(so, so->so_upcallarg,
+					 POLLIN|POLLRDNORM, M_DONTWAIT);
 		}
 	} else {
 		cv_broadcast(&so->so_cv);
@@ -472,7 +473,7 @@
 	if (sb->sb_flags & SB_ASYNC)
 		fownsignal(so->so_pgid, SIGIO, code, band, so);
 	if (sb->sb_flags & SB_UPCALL)
-		(*so->so_upcall)(so, so->so_upcallarg, M_DONTWAIT);
+		(*so->so_upcall)(so, so->so_upcallarg, band, M_DONTWAIT);
 }
 
 /*

Index: src/sys/net/if_gre.c
diff -u src/sys/net/if_gre.c:1.140 src/sys/net/if_gre.c:1.141
--- src/sys/net/if_gre.c:1.140	Tue Apr 28 23:05:25 2009
+++ src/sys/net/if_gre.c	Wed Sep  2 14:56:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_gre.c,v 1.140 2009/04/28 23:05:25 dyoung Exp $ */
+/*	$NetBSD: if_gre.c,v 1.141 2009/09/02 14:56:57 tls Exp $ */
 
 /*
  * Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -45,7 +45,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.140 2009/04/28 23:05:25 dyoung Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_gre.c,v 1.141 2009/09/02 14:56:57 tls Exp $");
 
 #include "opt_atalk.h"
 #include "opt_gre.h"
@@ -419,7 +419,7 @@
 }
 
 static void
-gre_receive(struct socket *so, void *arg, int waitflag)
+gre_receive(struct socket *so, void *arg, int events, int waitflag)
 {
 	struct gre_softc *sc = (struct gre_softc *)arg;
 	int rc;

Index: src/sys/netinet/accf_data.c
diff -u src/sys/netinet/accf_data.c:1.5 src/sys/netinet/accf_data.c:1.6
--- src/sys/netinet/accf_data.c:1.5	Thu Nov 20 10:22:11 2008
+++ src/sys/netinet/accf_data.c	Wed Sep  2 14:56:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: accf_data.c,v 1.5 2008/11/20 10:22:11 ad Exp $	*/
+/*	$NetBSD: accf_data.c,v 1.6 2009/09/02 14:56:57 tls Exp $	*/
 
 /*-
  * Copyright (c) 2000 Alfred Perlstein <alf...@freebsd.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: accf_data.c,v 1.5 2008/11/20 10:22:11 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: accf_data.c,v 1.6 2009/09/02 14:56:57 tls Exp $");
 
 #define ACCEPT_FILTER_MOD
 
@@ -44,7 +44,7 @@
 
 /* accept filter that holds a socket until data arrives */
 
-static void	sohasdata(struct socket *so, void *arg, int waitflag);
+static void	sohasdata(struct socket *so, void *arg, int events, int waitflag);
 
 static struct accept_filter accf_data_filter = {
 	.accf_name = "dataready",
@@ -77,7 +77,7 @@
 }
 
 static void
-sohasdata(struct socket *so, void *arg, int waitflag)
+sohasdata(struct socket *so, void *arg, int events, int waitflag)
 {
 
 	if (!soreadable(so))

Index: src/sys/netinet/accf_http.c
diff -u src/sys/netinet/accf_http.c:1.6 src/sys/netinet/accf_http.c:1.7
--- src/sys/netinet/accf_http.c:1.6	Fri Nov 21 16:08:57 2008
+++ src/sys/netinet/accf_http.c	Wed Sep  2 14:56:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: accf_http.c,v 1.6 2008/11/21 16:08:57 joerg Exp $	*/
+/*	$NetBSD: accf_http.c,v 1.7 2009/09/02 14:56:57 tls Exp $	*/
 
 /*-
  * Copyright (c) 2000 Paycounter, Inc.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: accf_http.c,v 1.6 2008/11/21 16:08:57 joerg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: accf_http.c,v 1.7 2009/09/02 14:56:57 tls Exp $");
 
 #define ACCEPT_FILTER_MOD
 
@@ -46,11 +46,11 @@
 MODULE(MODULE_CLASS_MISC, accf_httpready, NULL);
 
 /* check for GET/HEAD */
-static void sohashttpget(struct socket *so, void *arg, int waitflag);
+static void sohashttpget(struct socket *so, void *arg, int events, int waitflag);
 /* check for HTTP/1.0 or HTTP/1.1 */
-static void soparsehttpvers(struct socket *so, void *arg, int waitflag);
+static void soparsehttpvers(struct socket *so, void *arg, int events, int waitflag);
 /* check for end of HTTP/1.x request */
-static void soishttpconnected(struct socket *so, void *arg, int waitflag);
+static void soishttpconnected(struct socket *so, void *arg, int events, int waitflag);
 /* strcmp on an mbuf chain */
 static int mbufstrcmp(struct mbuf *m, struct mbuf *npkt, int offset, const char *cmp);
 /* strncmp on an mbuf chain */
@@ -221,7 +221,7 @@
 	} while(0)
 
 static void
-sohashttpget(struct socket *so, void *arg, int waitflag)
+sohashttpget(struct socket *so, void *arg, int events, int waitflag)
 {
 
 	if ((so->so_state & SS_CANTRCVMORE) == 0 && !sbfull(&so->so_rcv)) {
@@ -255,9 +255,9 @@
 		if (mbufstrcmp(m, m->m_nextpkt, 1, cmp) == 1) {
 			DPRINT("mbufstrcmp ok");
 			if (parse_http_version == 0)
-				soishttpconnected(so, arg, waitflag);
+				soishttpconnected(so, arg, events, waitflag);
 			else
-				soparsehttpvers(so, arg, waitflag);
+				soparsehttpvers(so, arg, events, waitflag);
 			return;
 		}
 		DPRINT("mbufstrcmp bad");
@@ -272,7 +272,7 @@
 }
 
 static void
-soparsehttpvers(struct socket *so, void *arg, int waitflag)
+soparsehttpvers(struct socket *so, void *arg, int events, int waitflag)
 {
 	struct mbuf *m, *n;
 	int	i, cc, spaces, inspaces;
@@ -325,7 +325,7 @@
 					    mbufstrcmp(m, n, i, "HTTP/1.1")) {
 						DPRINT("ok");
 						soishttpconnected(so,
-						    arg, waitflag);
+						    arg, events, waitflag);
 						return;
 					} else {
 						DPRINT("bad");
@@ -357,7 +357,7 @@
 #define NCHRS 3
 
 static void
-soishttpconnected(struct socket *so, void *arg, int waitflag)
+soishttpconnected(struct socket *so, void *arg, int events, int waitflag)
 {
 	char a, b, c;
 	struct mbuf *m, *n;

Index: src/sys/sys/socketvar.h
diff -u src/sys/sys/socketvar.h:1.119 src/sys/sys/socketvar.h:1.120
--- src/sys/sys/socketvar.h:1.119	Sat Apr  4 10:12:52 2009
+++ src/sys/sys/socketvar.h	Wed Sep  2 14:56:57 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: socketvar.h,v 1.119 2009/04/04 10:12:52 ad Exp $	*/
+/*	$NetBSD: socketvar.h,v 1.120 2009/09/02 14:56:57 tls Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -159,7 +159,7 @@
 	struct sockbuf	so_rcv;		/* receive buffer */
 
 	void		*so_internal;	/* Space for svr4 stream data */
-	void		(*so_upcall) (struct socket *, void *, int);
+	void		(*so_upcall) (struct socket *, void *, int, int);
 	void *		so_upcallarg;	/* Arg for above */
 	int		(*so_send) (struct socket *, struct mbuf *,
 					struct uio *, struct mbuf *,
@@ -214,11 +214,11 @@
 struct accept_filter {
 	char	accf_name[16];
 	void	(*accf_callback)
-		(struct socket *so, void *arg, int waitflag);
+		(struct socket *, void *, int, int);
 	void *	(*accf_create)
-		(struct socket *so, char *arg);
+		(struct socket *, char *);
 	void	(*accf_destroy)
-		(struct socket *so);
+		(struct socket *);
 	LIST_ENTRY(accept_filter) accf_next;
 	u_int	accf_refcnt;
 };

Reply via email to