Module Name: src
Committed By: bouyer
Date: Sat Jun 18 16:42:04 UTC 2011
Modified Files:
src/sys/kern [netbsd-5]: uipc_domain.c uipc_proto.c uipc_usrreq.c
Log Message:
Pull up following revision(s) (requested by manu in ticket #1633):
sys/kern/uipc_domain.c: revision 1.86
sys/kern/uipc_usrreq.c: revision 1.134
sys/kern/uipc_proto.c: revision 1.22
Add SOCK_SEQPACKET to PL_LOCAL sockets. Based on patch from Jesse Off,
submitted 8 years ago:
http://mail-index.netbsd.org/tech-kern/2003/04/14/0006.html
To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.76.12.1 src/sys/kern/uipc_domain.c
cvs rdiff -u -r1.21 -r1.21.12.1 src/sys/kern/uipc_proto.c
cvs rdiff -u -r1.119.4.3 -r1.119.4.4 src/sys/kern/uipc_usrreq.c
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_domain.c
diff -u src/sys/kern/uipc_domain.c:1.76 src/sys/kern/uipc_domain.c:1.76.12.1
--- src/sys/kern/uipc_domain.c:1.76 Thu Apr 24 11:38:36 2008
+++ src/sys/kern/uipc_domain.c Sat Jun 18 16:42:03 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_domain.c,v 1.76 2008/04/24 11:38:36 ad Exp $ */
+/* $NetBSD: uipc_domain.c,v 1.76.12.1 2011/06/18 16:42:03 bouyer Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.76 2008/04/24 11:38:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_domain.c,v 1.76.12.1 2011/06/18 16:42:03 bouyer Exp $");
#include <sys/param.h>
#include <sys/socket.h>
@@ -492,6 +492,12 @@
CTL_NET, PF_LOCAL, SOCK_STREAM, CTL_EOL);
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT,
+ CTLTYPE_NODE, "seqpacket",
+ SYSCTL_DESCR("SOCK_SEQPACKET settings"),
+ NULL, 0, NULL, 0,
+ CTL_NET, PF_LOCAL, SOCK_SEQPACKET, CTL_EOL);
+ sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
CTLTYPE_NODE, "dgram",
SYSCTL_DESCR("SOCK_DGRAM settings"),
NULL, 0, NULL, 0,
@@ -506,6 +512,13 @@
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT,
CTLTYPE_STRUCT, "pcblist",
+ SYSCTL_DESCR("SOCK_SEQPACKET protocol control "
+ "block list"),
+ sysctl_unpcblist, 0, NULL, 0,
+ CTL_NET, PF_LOCAL, SOCK_SEQPACKET, CTL_CREATE, CTL_EOL);
+ sysctl_createv(&domain_sysctllog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT,
+ CTLTYPE_STRUCT, "pcblist",
SYSCTL_DESCR("SOCK_DGRAM protocol control block list"),
sysctl_unpcblist, 0, NULL, 0,
CTL_NET, PF_LOCAL, SOCK_DGRAM, CTL_CREATE, CTL_EOL);
Index: src/sys/kern/uipc_proto.c
diff -u src/sys/kern/uipc_proto.c:1.21 src/sys/kern/uipc_proto.c:1.21.12.1
--- src/sys/kern/uipc_proto.c:1.21 Thu Apr 24 11:38:36 2008
+++ src/sys/kern/uipc_proto.c Sat Jun 18 16:42:04 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_proto.c,v 1.21 2008/04/24 11:38:36 ad Exp $ */
+/* $NetBSD: uipc_proto.c,v 1.21.12.1 2011/06/18 16:42:04 bouyer Exp $ */
/*-
* Copyright (c) 1982, 1986, 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_proto.c,v 1.21 2008/04/24 11:38:36 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_proto.c,v 1.21.12.1 2011/06/18 16:42:04 bouyer Exp $");
#include <sys/param.h>
#include <sys/socket.h>
@@ -65,6 +65,13 @@
.pr_ctloutput = uipc_ctloutput,
.pr_usrreq = uipc_usrreq,
}, {
+ .pr_type = SOCK_SEQPACKET,
+ .pr_domain = &unixdomain,
+ .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS|PR_LISTEN|
+ PR_ATOMIC,
+ .pr_ctloutput = uipc_ctloutput,
+ .pr_usrreq = uipc_usrreq,
+ }, {
.pr_input = raw_input,
.pr_ctlinput = raw_ctlinput,
.pr_usrreq = raw_usrreq,
Index: src/sys/kern/uipc_usrreq.c
diff -u src/sys/kern/uipc_usrreq.c:1.119.4.3 src/sys/kern/uipc_usrreq.c:1.119.4.4
--- src/sys/kern/uipc_usrreq.c:1.119.4.3 Sun Nov 8 21:47:45 2009
+++ src/sys/kern/uipc_usrreq.c Sat Jun 18 16:42:04 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: uipc_usrreq.c,v 1.119.4.3 2009/11/08 21:47:45 snj Exp $ */
+/* $NetBSD: uipc_usrreq.c,v 1.119.4.4 2011/06/18 16:42:04 bouyer Exp $ */
/*-
* Copyright (c) 1998, 2000, 2004, 2008, 2009 The NetBSD Foundation, Inc.
@@ -96,7 +96,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.119.4.3 2009/11/08 21:47:45 snj Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uipc_usrreq.c,v 1.119.4.4 2011/06/18 16:42:04 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -124,7 +124,7 @@
* Unix communications domain.
*
* TODO:
- * SEQPACKET, RDM
+ * RDM
* rethink name space problems
* need a proper out-of-band
*
@@ -486,6 +486,7 @@
panic("uipc 1");
/*NOTREACHED*/
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
case SOCK_STREAM:
#define rcv (&so->so_rcv)
#define snd (&so2->so_snd)
@@ -566,6 +567,7 @@
break;
}
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
case SOCK_STREAM:
#define rcv (&so2->so_rcv)
#define snd (&so->so_snd)
@@ -578,7 +580,7 @@
if (unp->unp_conn->unp_flags & UNP_WANTCRED) {
/*
* Credentials are passed only once on
- * SOCK_STREAM.
+ * SOCK_STREAM and SOCK_SEQPACKET.
*/
unp->unp_conn->unp_flags &= ~UNP_WANTCRED;
control = unp_addsockcred(l, control);
@@ -591,8 +593,19 @@
if (control) {
if (sbappendcontrol(rcv, m, control) != 0)
control = NULL;
- } else
- sbappend(rcv, m);
+ } else {
+ switch(so->so_type) {
+ case SOCK_SEQPACKET:
+ sbappendrecord(rcv, m);
+ break;
+ case SOCK_STREAM:
+ sbappend(rcv, m);
+ break;
+ default:
+ panic("uipc_usrreq");
+ break;
+ }
+ }
snd->sb_mbmax -=
rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt;
unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt;
@@ -628,10 +641,18 @@
case PRU_SENSE:
((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat;
- if (so->so_type == SOCK_STREAM && unp->unp_conn != 0) {
+ switch (so->so_type) {
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
+ case SOCK_STREAM:
+ if (unp->unp_conn == 0)
+ break;
+
so2 = unp->unp_conn->unp_socket;
KASSERT(solocked2(so, so2));
((struct stat *) m)->st_blksize += so2->so_rcv.sb_cc;
+ break;
+ default:
+ break;
}
((struct stat *) m)->st_dev = NODEV;
if (unp->unp_ino == 0)
@@ -766,6 +787,7 @@
int error;
switch (so->so_type) {
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
case SOCK_STREAM:
if (so->so_lock == NULL) {
/*
@@ -1071,6 +1093,7 @@
soisconnected(so);
break;
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
case SOCK_STREAM:
unp2->unp_conn = unp;
if (req == PRU_CONNECT &&
@@ -1126,6 +1149,7 @@
so->so_state &= ~SS_ISCONNECTED;
break;
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
case SOCK_STREAM:
KASSERT(solocked2(so, unp2->unp_socket));
soisdisconnected(so);
@@ -1147,9 +1171,15 @@
{
struct socket *so;
- if (unp->unp_socket->so_type == SOCK_STREAM && unp->unp_conn &&
- (so = unp->unp_conn->unp_socket))
- socantrcvmore(so);
+ switch(unp->unp_socket->so_type) {
+ case SOCK_SEQPACKET: /* FALLTHROUGH */
+ case SOCK_STREAM:
+ if (unp->unp_conn && (so = unp->unp_conn->unp_socket))
+ socantrcvmore(so);
+ break;
+ default:
+ break;
+ }
}
bool