summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwollman <wollman@FreeBSD.org>1997-04-27 20:01:29 +0000
committerwollman <wollman@FreeBSD.org>1997-04-27 20:01:29 +0000
commit6afbf203bd570424ecf3f9d9d9ced17f82c81adc (patch)
tree41103dcf8addc8e73880fc79975713ce1e6ba14c
parentced78602fea5284de7f4cb1673405ad3f3ad57ce (diff)
downloadFreeBSD-src-6afbf203bd570424ecf3f9d9d9ced17f82c81adc.zip
FreeBSD-src-6afbf203bd570424ecf3f9d9d9ced17f82c81adc.tar.gz
The long-awaited mega-massive-network-code- cleanup. Part I.
This commit includes the following changes: 1) Old-style (pr_usrreq()) protocols are no longer supported, the compatibility glue for them is deleted, and the kernel will panic on boot if any are compiled in. 2) Certain protocol entry points are modified to take a process structure, so they they can easily tell whether or not it is possible to sleep, and also to access credentials. 3) SS_PRIV is no more, and with it goes the SO_PRIVSTATE setsockopt() call. Protocols should use the process pointer they are now passed. 4) The PF_LOCAL and PF_ROUTE families have been updated to use the new style, as has the `raw' skeleton family. 5) PF_LOCAL sockets now obey the process's umask when creating a socket in the filesystem. As a result, LINT is now broken. I'm hoping that some enterprising hacker with a bit more time will either make the broken bits work (should be easy for netipx) or dike them out.
-rw-r--r--sys/kern/sys_socket.c50
-rw-r--r--sys/kern/uipc_domain.c7
-rw-r--r--sys/kern/uipc_proto.c11
-rw-r--r--sys/kern/uipc_sockbuf.c13
-rw-r--r--sys/kern/uipc_socket.c83
-rw-r--r--sys/kern/uipc_socket2.c13
-rw-r--r--sys/kern/uipc_syscalls.c22
-rw-r--r--sys/kern/uipc_usrreq.c517
-rw-r--r--sys/net/if.c4
-rw-r--r--sys/net/raw_cb.c2
-rw-r--r--sys/net/raw_cb.h6
-rw-r--r--sys/net/raw_usrreq.c306
-rw-r--r--sys/net/rtsock.c227
-rw-r--r--sys/netinet/in.c14
-rw-r--r--sys/netinet/in_pcb.c19
-rw-r--r--sys/netinet/in_pcb.h8
-rw-r--r--sys/netinet/in_proto.c6
-rw-r--r--sys/netinet/in_var.h5
-rw-r--r--sys/netinet/ip_output.c5
-rw-r--r--sys/netinet/ip_var.h8
-rw-r--r--sys/netinet/raw_ip.c24
-rw-r--r--sys/netinet/tcp_input.c5
-rw-r--r--sys/netinet/tcp_reass.c5
-rw-r--r--sys/netinet/tcp_usrreq.c46
-rw-r--r--sys/netinet/tcp_var.h5
-rw-r--r--sys/netinet/udp_usrreq.c27
-rw-r--r--sys/nfs/nfs_socket.c46
-rw-r--r--sys/nfs/nfs_syscalls.c14
-rw-r--r--sys/nfsclient/nfs_nfsiod.c14
-rw-r--r--sys/nfsclient/nfs_socket.c46
-rw-r--r--sys/nfsserver/nfs_srvsock.c46
-rw-r--r--sys/nfsserver/nfs_syscalls.c14
-rw-r--r--sys/sys/protosw.h50
-rw-r--r--sys/sys/socketvar.h15
-rw-r--r--sys/sys/un.h3
35 files changed, 985 insertions, 701 deletions
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c
index c3e6615..0c3b495 100644
--- a/sys/kern/sys_socket.c
+++ b/sys/kern/sys_socket.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)sys_socket.c 8.1 (Berkeley) 6/10/93
- * $Id: sys_socket.c,v 1.11 1997/03/23 03:36:25 bde Exp $
+ * $Id: sys_socket.c,v 1.12 1997/03/24 11:52:26 bde Exp $
*/
#include <sys/param.h>
@@ -68,9 +68,8 @@ soo_read(fp, uio, cred)
struct uio *uio;
struct ucred *cred;
{
-
- return (soreceive((struct socket *)fp->f_data, (struct mbuf **)0,
- uio, (struct mbuf **)0, (struct mbuf **)0, (int *)0));
+ struct socket *so = (struct socket *)fp->f_data;
+ return so->so_proto->pr_usrreqs->pru_soreceive(so, 0, uio, 0, 0, 0);
}
/* ARGSUSED */
@@ -80,9 +79,8 @@ soo_write(fp, uio, cred)
struct uio *uio;
struct ucred *cred;
{
-
- return (sosend((struct socket *)fp->f_data, (struct mbuf *)0,
- uio, (struct mbuf *)0, (struct mbuf *)0, 0));
+ struct socket *so = (struct socket *)fp->f_data;
+ return so->so_proto->pr_usrreqs->pru_sosend(so, 0, uio, 0, 0, 0);
}
int
@@ -140,7 +138,7 @@ soo_ioctl(fp, cmd, data, p)
return (ifioctl(so, cmd, data, p));
if (IOCGROUP(cmd) == 'r')
return (rtioctl(cmd, data, p));
- return ((*so->so_proto->pr_usrreqs->pru_control)(so, cmd, data, 0));
+ return ((*so->so_proto->pr_usrreqs->pru_control)(so, cmd, data, 0, p));
}
int
@@ -149,40 +147,8 @@ soo_select(fp, which, p)
int which;
struct proc *p;
{
- register struct socket *so = (struct socket *)fp->f_data;
- register int s = splnet();
-
- switch (which) {
-
- case FREAD:
- if (soreadable(so)) {
- splx(s);
- return (1);
- }
- selrecord(p, &so->so_rcv.sb_sel);
- so->so_rcv.sb_flags |= SB_SEL;
- break;
-
- case FWRITE:
- if (sowriteable(so)) {
- splx(s);
- return (1);
- }
- selrecord(p, &so->so_snd.sb_sel);
- so->so_snd.sb_flags |= SB_SEL;
- break;
-
- case 0:
- if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) {
- splx(s);
- return (1);
- }
- selrecord(p, &so->so_rcv.sb_sel);
- so->so_rcv.sb_flags |= SB_SEL;
- break;
- }
- splx(s);
- return (0);
+ struct socket *so = (struct socket *)fp->f_data;
+ return so->so_proto->pr_usrreqs->pru_soselect(so, which, p);
}
int
diff --git a/sys/kern/uipc_domain.c b/sys/kern/uipc_domain.c
index a2c3477..c2ec35f 100644
--- a/sys/kern/uipc_domain.c
+++ b/sys/kern/uipc_domain.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_domain.c 8.2 (Berkeley) 10/18/93
- * $Id$
+ * $Id: uipc_domain.c,v 1.16 1997/02/22 09:39:27 peter Exp $
*/
#include <sys/param.h>
@@ -108,6 +108,11 @@ domaininit(dummy)
/* See comments in uipc_socket2.c. */
if (pr->pr_usrreqs == 0 && pr->pr_ousrreq)
pr->pr_usrreqs = &pru_oldstyle;
+#else
+ if (pr->pr_usrreqs == 0)
+ panic("domaininit: %ssw[%d] has no usrreqs!",
+ dp->dom_name,
+ (int)(pr - dp->dom_protosw));
#endif
if (pr->pr_init)
(*pr->pr_init)();
diff --git a/sys/kern/uipc_proto.c b/sys/kern/uipc_proto.c
index 664373c..bcd918c 100644
--- a/sys/kern/uipc_proto.c
+++ b/sys/kern/uipc_proto.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_proto.c 8.1 (Berkeley) 6/10/93
- * $Id: uipc_proto.c,v 1.10 1997/02/24 20:30:55 wollman Exp $
+ * $Id: uipc_proto.c,v 1.11 1997/04/14 18:23:48 phk Exp $
*/
#include <sys/param.h>
@@ -53,18 +53,21 @@
static struct protosw localsw[] = {
{ SOCK_STREAM, &localdomain, 0, PR_CONNREQUIRED|PR_WANTRCVD|PR_RIGHTS,
0, 0, 0, 0,
- uipc_usrreq,
+ 0,
0, 0, 0, 0,
+ &uipc_usrreqs
},
{ SOCK_DGRAM, &localdomain, 0, PR_ATOMIC|PR_ADDR|PR_RIGHTS,
0, 0, 0, 0,
- uipc_usrreq,
+ 0,
0, 0, 0, 0,
+ &uipc_usrreqs
},
{ 0, 0, 0, 0,
0, 0, raw_ctlinput, 0,
- raw_usrreq,
+ 0,
raw_init, 0, 0, 0,
+ &raw_usrreqs
}
};
diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c
index 4bddd1a..f31cc98 100644
--- a/sys/kern/uipc_sockbuf.c
+++ b/sys/kern/uipc_sockbuf.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93
- * $Id: uipc_socket2.c,v 1.22 1997/02/24 20:30:57 wollman Exp $
+ * $Id: uipc_socket2.c,v 1.23 1997/03/31 12:29:59 davidg Exp $
*/
#include <sys/param.h>
@@ -220,7 +220,7 @@ sonewconn1(head, connstatus)
so->so_pgid = head->so_pgid;
(void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat);
- if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0)) {
+ if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, curproc)) { /*XXX*/
(void) free((caddr_t)so, M_SOCKET);
return ((struct socket *)0);
}
@@ -975,7 +975,14 @@ pru_connect2_notsupp(struct socket *so1, struct socket *so2)
}
int
-pru_listen_notsupp(struct socket *so)
+pru_control_notsupp(struct socket *so, int cmd, caddr_t data,
+ struct ifnet *ifp, struct proc *p)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_listen_notsupp(struct socket *so, struct proc *p)
{
return EOPNOTSUPP;
}
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 9f70207..095f764 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_socket.c 8.3 (Berkeley) 4/15/94
- * $Id: uipc_socket.c,v 1.24 1997/02/24 20:30:56 wollman Exp $
+ * $Id: uipc_socket.c,v 1.25 1997/03/23 03:36:31 bde Exp $
*/
#include <sys/param.h>
@@ -78,7 +78,7 @@ socreate(dom, aso, type, proto, p)
prp = pffindproto(dom, proto, type);
else
prp = pffindtype(dom, type);
- if (prp == 0 || prp->pr_usrreqs == 0)
+ if (prp == 0 || prp->pr_usrreqs->pru_attach == 0)
return (EPROTONOSUPPORT);
if (prp->pr_type != type)
return (EPROTOTYPE);
@@ -87,10 +87,8 @@ socreate(dom, aso, type, proto, p)
TAILQ_INIT(&so->so_incomp);
TAILQ_INIT(&so->so_comp);
so->so_type = type;
- if (p->p_ucred->cr_uid == 0)
- so->so_state = SS_PRIV;
so->so_proto = prp;
- error = (*prp->pr_usrreqs->pru_attach)(so, proto);
+ error = (*prp->pr_usrreqs->pru_attach)(so, proto, p);
if (error) {
so->so_state |= SS_NOFDREF;
sofree(so);
@@ -101,26 +99,28 @@ socreate(dom, aso, type, proto, p)
}
int
-sobind(so, nam)
+sobind(so, nam, p)
struct socket *so;
struct mbuf *nam;
+ struct proc *p;
{
int s = splnet();
int error;
- error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam);
+ error = (*so->so_proto->pr_usrreqs->pru_bind)(so, nam, p);
splx(s);
return (error);
}
int
-solisten(so, backlog)
+solisten(so, backlog, p)
register struct socket *so;
int backlog;
+ struct proc *p;
{
int s = splnet(), error;
- error = (*so->so_proto->pr_usrreqs->pru_listen)(so);
+ error = (*so->so_proto->pr_usrreqs->pru_listen)(so, p);
if (error) {
splx(s);
return (error);
@@ -247,9 +247,10 @@ soaccept(so, nam)
}
int
-soconnect(so, nam)
+soconnect(so, nam, p)
register struct socket *so;
struct mbuf *nam;
+ struct proc *p;
{
int s;
int error;
@@ -268,7 +269,7 @@ soconnect(so, nam)
(error = sodisconnect(so))))
error = EISCONN;
else
- error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam);
+ error = (*so->so_proto->pr_usrreqs->pru_connect)(so, nam, p);
splx(s);
return (error);
}
@@ -471,7 +472,7 @@ nopages:
(so->so_proto->pr_flags & PR_IMPLOPCL) &&
(resid <= 0)) ?
PRUS_EOF : 0,
- top, addr, control);
+ top, addr, control, p);
splx(s);
if (dontroute)
so->so_options &= ~SO_DONTROUTE;
@@ -847,10 +848,11 @@ sorflush(so)
}
int
-sosetopt(so, level, optname, m0)
+sosetopt(so, level, optname, m0, p)
register struct socket *so;
int level, optname;
struct mbuf *m0;
+ struct proc *p;
{
int error = 0;
register struct mbuf *m = m0;
@@ -858,7 +860,7 @@ sosetopt(so, level, optname, m0)
if (level != SOL_SOCKET) {
if (so->so_proto && so->so_proto->pr_ctloutput)
return ((*so->so_proto->pr_ctloutput)
- (PRCO_SETOPT, so, level, optname, &m0));
+ (PRCO_SETOPT, so, level, optname, &m0, p));
error = ENOPROTOOPT;
} else {
switch (optname) {
@@ -948,18 +950,13 @@ sosetopt(so, level, optname, m0)
break;
}
- case SO_PRIVSTATE:
- /* we don't care what the parameter is... */
- so->so_state &= ~SS_PRIV;
- break;
-
default:
error = ENOPROTOOPT;
break;
}
if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) {
(void) ((*so->so_proto->pr_ctloutput)
- (PRCO_SETOPT, so, level, optname, &m0));
+ (PRCO_SETOPT, so, level, optname, &m0, p));
m = NULL; /* freed by protocol */
}
}
@@ -970,17 +967,18 @@ bad:
}
int
-sogetopt(so, level, optname, mp)
+sogetopt(so, level, optname, mp, p)
register struct socket *so;
int level, optname;
struct mbuf **mp;
+ struct proc *p;
{
register struct mbuf *m;
if (level != SOL_SOCKET) {
if (so->so_proto && so->so_proto->pr_ctloutput) {
return ((*so->so_proto->pr_ctloutput)
- (PRCO_GETOPT, so, level, optname, mp));
+ (PRCO_GETOPT, so, level, optname, mp, p));
} else
return (ENOPROTOOPT);
} else {
@@ -1008,10 +1006,6 @@ sogetopt(so, level, optname, mp)
*mtod(m, int *) = so->so_options & optname;
break;
- case SO_PRIVSTATE:
- *mtod(m, int *) = so->so_state & SS_PRIV;
- break;
-
case SO_TYPE:
*mtod(m, int *) = so->so_type;
break;
@@ -1071,3 +1065,40 @@ sohasoutofband(so)
psignal(p, SIGURG);
selwakeup(&so->so_rcv.sb_sel);
}
+
+int
+soselect(struct socket *so, int which, struct proc *p)
+{
+ int s = splnet();
+ switch (which) {
+
+ case FREAD:
+ if (soreadable(so)) {
+ splx(s);
+ return (1);
+ }
+ selrecord(p, &so->so_rcv.sb_sel);
+ so->so_rcv.sb_flags |= SB_SEL;
+ break;
+
+ case FWRITE:
+ if (sowriteable(so)) {
+ splx(s);
+ return (1);
+ }
+ selrecord(p, &so->so_snd.sb_sel);
+ so->so_snd.sb_flags |= SB_SEL;
+ break;
+
+ case 0:
+ if (so->so_oobmark || (so->so_state & SS_RCVATMARK)) {
+ splx(s);
+ return (1);
+ }
+ selrecord(p, &so->so_rcv.sb_sel);
+ so->so_rcv.sb_flags |= SB_SEL;
+ break;
+ }
+ splx(s);
+ return (0);
+}
diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c
index 4bddd1a..f31cc98 100644
--- a/sys/kern/uipc_socket2.c
+++ b/sys/kern/uipc_socket2.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_socket2.c 8.1 (Berkeley) 6/10/93
- * $Id: uipc_socket2.c,v 1.22 1997/02/24 20:30:57 wollman Exp $
+ * $Id: uipc_socket2.c,v 1.23 1997/03/31 12:29:59 davidg Exp $
*/
#include <sys/param.h>
@@ -220,7 +220,7 @@ sonewconn1(head, connstatus)
so->so_pgid = head->so_pgid;
(void) soreserve(so, head->so_snd.sb_hiwat, head->so_rcv.sb_hiwat);
- if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0)) {
+ if ((*so->so_proto->pr_usrreqs->pru_attach)(so, 0, curproc)) { /*XXX*/
(void) free((caddr_t)so, M_SOCKET);
return ((struct socket *)0);
}
@@ -975,7 +975,14 @@ pru_connect2_notsupp(struct socket *so1, struct socket *so2)
}
int
-pru_listen_notsupp(struct socket *so)
+pru_control_notsupp(struct socket *so, int cmd, caddr_t data,
+ struct ifnet *ifp, struct proc *p)
+{
+ return EOPNOTSUPP;
+}
+
+int
+pru_listen_notsupp(struct socket *so, struct proc *p)
{
return EOPNOTSUPP;
}
diff --git a/sys/kern/uipc_syscalls.c b/sys/kern/uipc_syscalls.c
index 09156f0..fb8f428 100644
--- a/sys/kern/uipc_syscalls.c
+++ b/sys/kern/uipc_syscalls.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94
- * $Id: uipc_syscalls.c,v 1.24 1997/03/31 12:30:01 davidg Exp $
+ * $Id: uipc_syscalls.c,v 1.25 1997/04/09 16:53:40 bde Exp $
*/
#include "opt_ktrace.h"
@@ -130,7 +130,7 @@ bind(p, uap, retval)
error = sockargs(&nam, uap->name, uap->namelen, MT_SONAME);
if (error)
return (error);
- error = sobind((struct socket *)fp->f_data, nam);
+ error = sobind((struct socket *)fp->f_data, nam, p);
m_freem(nam);
return (error);
}
@@ -151,7 +151,7 @@ listen(p, uap, retval)
error = getsock(p->p_fd, uap->s, &fp);
if (error)
return (error);
- return (solisten((struct socket *)fp->f_data, uap->backlog));
+ return (solisten((struct socket *)fp->f_data, uap->backlog, p));
}
static int
@@ -312,7 +312,7 @@ connect(p, uap, retval)
error = sockargs(&nam, uap->name, uap->namelen, MT_SONAME);
if (error)
return (error);
- error = soconnect(so, nam);
+ error = soconnect(so, nam, p);
if (error)
goto bad;
if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
@@ -420,6 +420,7 @@ sendit(p, s, mp, flags, retsize)
register int i;
struct mbuf *to, *control;
int len, error;
+ struct socket *so;
#ifdef KTRACE
struct iovec *ktriov = NULL;
#endif
@@ -485,8 +486,9 @@ sendit(p, s, mp, flags, retsize)
}
#endif
len = auio.uio_resid;
- error = sosend((struct socket *)fp->f_data, to, &auio,
- (struct mbuf *)0, control, flags);
+ so = (struct socket *)fp->f_data;
+ error = so->so_proto->pr_usrreqs->pru_sosend(so, to, &auio, 0, control,
+ flags);
if (error) {
if (auio.uio_resid != len && (error == ERESTART ||
error == EINTR || error == EWOULDBLOCK))
@@ -659,6 +661,7 @@ recvit(p, s, mp, namelenp, retsize)
int len, error;
struct mbuf *m, *from = 0, *control = 0;
caddr_t ctlbuf;
+ struct socket *so;
#ifdef KTRACE
struct iovec *ktriov = NULL;
#endif
@@ -687,7 +690,8 @@ recvit(p, s, mp, namelenp, retsize)
}
#endif
len = auio.uio_resid;
- error = soreceive((struct socket *)fp->f_data, &from, &auio,
+ so = (struct socket *)fp->f_data;
+ error = so->so_proto->pr_usrreqs->pru_soreceive(so, &from, &auio,
(struct mbuf **)0, mp->msg_control ? &control : (struct mbuf **)0,
&mp->msg_flags);
if (error) {
@@ -1012,7 +1016,7 @@ setsockopt(p, uap, retval)
m->m_len = uap->valsize;
}
return (sosetopt((struct socket *)fp->f_data, uap->level,
- uap->name, m));
+ uap->name, m, p));
}
/* ARGSUSED */
@@ -1043,7 +1047,7 @@ getsockopt(p, uap, retval)
} else
valsize = 0;
if ((error = sogetopt((struct socket *)fp->f_data, uap->level,
- uap->name, &m)) == 0 && uap->val && valsize && m != NULL) {
+ uap->name, &m, p)) == 0 && uap->val && valsize && m != NULL) {
op = 0;
while (m && !error && op < valsize) {
i = min(m->m_len, (valsize - op));
diff --git a/sys/kern/uipc_usrreq.c b/sys/kern/uipc_usrreq.c
index 0a47414..2734778d 100644
--- a/sys/kern/uipc_usrreq.c
+++ b/sys/kern/uipc_usrreq.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* From: @(#)uipc_usrreq.c 8.3 (Berkeley) 1/4/94
- * $Id: uipc_usrreq.c,v 1.21 1997/03/21 16:12:32 wpaul Exp $
+ * $Id: uipc_usrreq.c,v 1.22 1997/03/23 03:36:33 bde Exp $
*/
#include <sys/param.h>
@@ -78,270 +78,353 @@ static void unp_mark __P((struct file *));
static void unp_discard __P((struct file *));
static int unp_internalize __P((struct mbuf *, struct proc *));
+static int
+uipc_abort(struct socket *so)
+{
+ struct unpcb *unp = sotounpcb(so);
-/*ARGSUSED*/
-int
-uipc_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+ if (unp == 0)
+ return EINVAL;
+ unp_drop(unp, ECONNABORTED);
+ return 0;
+}
+
+static int
+uipc_accept(struct socket *so, struct mbuf *nam)
{
struct unpcb *unp = sotounpcb(so);
- register struct socket *so2;
- register int error = 0;
- struct proc *p = curproc; /* XXX */
- if (req == PRU_CONTROL)
- return (EOPNOTSUPP);
- if (req != PRU_SEND && control && control->m_len) {
- error = EOPNOTSUPP;
- goto release;
- }
- if (unp == 0 && req != PRU_ATTACH) {
- error = EINVAL;
- goto release;
+ if (unp == 0)
+ return EINVAL;
+
+ /*
+ * Pass back name of connected socket,
+ * if it was bound and we are still connected
+ * (our peer may have closed already!).
+ */
+ if (unp->unp_conn && unp->unp_conn->unp_addr) {
+ nam->m_len = unp->unp_conn->unp_addr->m_len;
+ bcopy(mtod(unp->unp_conn->unp_addr, caddr_t),
+ mtod(nam, caddr_t), (unsigned)nam->m_len);
+ } else {
+ nam->m_len = sizeof(sun_noname);
+ *(mtod(nam, struct sockaddr *)) = sun_noname;
}
- switch (req) {
+ return 0;
+}
- case PRU_ATTACH:
- if (unp) {
- error = EISCONN;
- break;
- }
- error = unp_attach(so);
- break;
+static int
+uipc_attach(struct socket *so, int proto, struct proc *p)
+{
+ struct unpcb *unp = sotounpcb(so);
- case PRU_DETACH:
- unp_detach(unp);
- break;
+ if (unp != 0)
+ return EISCONN;
+ return unp_attach(so);
+}
- case PRU_BIND:
- error = unp_bind(unp, nam, p);
- break;
+static int
+uipc_bind(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ struct unpcb *unp = sotounpcb(so);
- case PRU_LISTEN:
- if (unp->unp_vnode == 0)
- error = EINVAL;
- break;
+ if (unp == 0)
+ return EINVAL;
- case PRU_CONNECT:
- error = unp_connect(so, nam, p);
- break;
+ return unp_bind(unp, nam, p);
+}
- case PRU_CONNECT2:
- error = unp_connect2(so, (struct socket *)nam);
- break;
+static int
+uipc_connect(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ struct unpcb *unp = sotounpcb(so);
- case PRU_DISCONNECT:
- unp_disconnect(unp);
- break;
+ if (unp == 0)
+ return EINVAL;
+ return unp_connect(so, nam, curproc);
+}
- case PRU_ACCEPT:
- /*
- * Pass back name of connected socket,
- * if it was bound and we are still connected
- * (our peer may have closed already!).
- */
- if (unp->unp_conn && unp->unp_conn->unp_addr) {
- nam->m_len = unp->unp_conn->unp_addr->m_len;
- bcopy(mtod(unp->unp_conn->unp_addr, caddr_t),
- mtod(nam, caddr_t), (unsigned)nam->m_len);
- } else {
- nam->m_len = sizeof(sun_noname);
- *(mtod(nam, struct sockaddr *)) = sun_noname;
- }
- break;
+static int
+uipc_connect2(struct socket *so1, struct socket *so2)
+{
+ struct unpcb *unp = sotounpcb(so1);
- case PRU_SHUTDOWN:
- socantsendmore(so);
- unp_shutdown(unp);
- break;
+ if (unp == 0)
+ return EINVAL;
- case PRU_RCVD:
- switch (so->so_type) {
+ return unp_connect2(so1, so2);
+}
- case SOCK_DGRAM:
- panic("uipc 1");
- /*NOTREACHED*/
+/* control is EOPNOTSUPP */
- case SOCK_STREAM:
+static int
+uipc_detach(struct socket *so)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0)
+ return EINVAL;
+
+ unp_detach(unp);
+ return 0;
+}
+
+static int
+uipc_disconnect(struct socket *so)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0)
+ return EINVAL;
+ unp_disconnect(unp);
+ return 0;
+}
+
+static int
+uipc_listen(struct socket *so, struct proc *p)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0 || unp->unp_vnode == 0)
+ return EINVAL;
+ return 0;
+}
+
+static int
+uipc_peeraddr(struct socket *so, struct mbuf *nam)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0)
+ return EINVAL;
+ if (unp->unp_conn && unp->unp_conn->unp_addr) {
+ nam->m_len = unp->unp_conn->unp_addr->m_len;
+ bcopy(mtod(unp->unp_conn->unp_addr, caddr_t),
+ mtod(nam, caddr_t), (unsigned)nam->m_len);
+ } else
+ nam->m_len = 0;
+ return 0;
+}
+
+static int
+uipc_rcvd(struct socket *so, int flags)
+{
+ struct unpcb *unp = sotounpcb(so);
+ struct socket *so2;
+
+ if (unp == 0)
+ return EINVAL;
+ switch (so->so_type) {
+ case SOCK_DGRAM:
+ panic("uipc_rcvd DGRAM?");
+ /*NOTREACHED*/
+
+ case SOCK_STREAM:
#define rcv (&so->so_rcv)
#define snd (&so2->so_snd)
- if (unp->unp_conn == 0)
- break;
- so2 = unp->unp_conn->unp_socket;
- /*
- * Adjust backpressure on sender
- * and wakeup any waiting to write.
- */
- snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt;
- unp->unp_mbcnt = rcv->sb_mbcnt;
- snd->sb_hiwat += unp->unp_cc - rcv->sb_cc;
- unp->unp_cc = rcv->sb_cc;
- sowwakeup(so2);
+ if (unp->unp_conn == 0)
+ break;
+ so2 = unp->unp_conn->unp_socket;
+ /*
+ * Adjust backpressure on sender
+ * and wakeup any waiting to write.
+ */
+ snd->sb_mbmax += unp->unp_mbcnt - rcv->sb_mbcnt;
+ unp->unp_mbcnt = rcv->sb_mbcnt;
+ snd->sb_hiwat += unp->unp_cc - rcv->sb_cc;
+ unp->unp_cc = rcv->sb_cc;
+ sowwakeup(so2);
#undef snd
#undef rcv
- break;
-
- default:
- panic("uipc 2");
- }
break;
- case PRU_SEND:
- case PRU_SEND_EOF:
- if (control && (error = unp_internalize(control, p)))
- break;
- switch (so->so_type) {
+ default:
+ panic("uipc_rcvd unknown socktype");
+ }
+ return 0;
+}
- case SOCK_DGRAM: {
- struct sockaddr *from;
+/* pru_rcvoob is EOPNOTSUPP */
- if (nam) {
- if (unp->unp_conn) {
- error = EISCONN;
- break;
- }
- error = unp_connect(so, nam, p);
- if (error)
- break;
- } else {
- if (unp->unp_conn == 0) {
- error = ENOTCONN;
- break;
- }
- }
- so2 = unp->unp_conn->unp_socket;
- if (unp->unp_addr)
- from = mtod(unp->unp_addr, struct sockaddr *);
- else
- from = &sun_noname;
- if (sbappendaddr(&so2->so_rcv, from, m, control)) {
- sorwakeup(so2);
- m = 0;
- control = 0;
- } else
- error = ENOBUFS;
- if (nam)
- unp_disconnect(unp);
- break;
- }
+static int
+uipc_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct proc *p)
+{
+ int error = 0;
+ struct unpcb *unp = sotounpcb(so);
+ struct socket *so2;
- case SOCK_STREAM:
-#define rcv (&so2->so_rcv)
-#define snd (&so->so_snd)
- /* Connect if not connected yet. */
- /*
- * Note: A better implementation would complain
- * if not equal to the peer's address.
- */
- if ((so->so_state & SS_ISCONNECTED) == 0) {
- if (nam) {
- error = unp_connect(so, nam, p);
- if (error)
- break; /* XXX */
- } else {
- error = ENOTCONN;
- break;
- }
- }
+ if (unp == 0) {
+ error = EINVAL;
+ goto release;
+ }
+ if (flags & PRUS_OOB) {
+ error = EOPNOTSUPP;
+ goto release;
+ }
+
+ if (control && (error = unp_internalize(control, p)))
+ goto release;
- if (so->so_state & SS_CANTSENDMORE) {
- error = EPIPE;
+ switch (so->so_type) {
+ case SOCK_DGRAM:
+ {
+ struct sockaddr *from;
+
+ if (nam) {
+ if (unp->unp_conn) {
+ error = EISCONN;
break;
}
- if (unp->unp_conn == 0)
- panic("uipc 3");
- so2 = unp->unp_conn->unp_socket;
- /*
- * Send to paired receive port, and then reduce
- * send buffer hiwater marks to maintain backpressure.
- * Wake up readers.
- */
- if (control) {
- if (sbappendcontrol(rcv, m, control))
- control = 0;
- } else
- sbappend(rcv, m);
- snd->sb_mbmax -=
- rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt;
- unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt;
- snd->sb_hiwat -= rcv->sb_cc - unp->unp_conn->unp_cc;
- unp->unp_conn->unp_cc = rcv->sb_cc;
+ error = unp_connect(so, nam, p);
+ if (error)
+ break;
+ } else {
+ if (unp->unp_conn == 0) {
+ error = ENOTCONN;
+ break;
+ }
+ }
+ so2 = unp->unp_conn->unp_socket;
+ if (unp->unp_addr)
+ from = mtod(unp->unp_addr, struct sockaddr *);
+ else
+ from = &sun_noname;
+ if (sbappendaddr(&so2->so_rcv, from, m, control)) {
sorwakeup(so2);
m = 0;
-#undef snd
-#undef rcv
- break;
+ control = 0;
+ } else
+ error = ENOBUFS;
+ if (nam)
+ unp_disconnect(unp);
+ break;
+ }
- default:
- panic("uipc 4");
- }
+ case SOCK_STREAM:
+#define rcv (&so2->so_rcv)
+#define snd (&so->so_snd)
+ /* Connect if not connected yet. */
/*
- * SEND_EOF is equivalent to a SEND followed by
- * a SHUTDOWN.
+ * Note: A better implementation would complain
+ * if not equal to the peer's address.
*/
- if (req == PRU_SEND_EOF) {
- socantsendmore(so);
- unp_shutdown(unp);
+ if ((so->so_state & SS_ISCONNECTED) == 0) {
+ if (nam) {
+ error = unp_connect(so, nam, p);
+ if (error)
+ break; /* XXX */
+ } else {
+ error = ENOTCONN;
+ break;
+ }
}
- break;
- case PRU_ABORT:
- unp_drop(unp, ECONNABORTED);
- break;
-
- case PRU_SENSE:
- ((struct stat *) m)->st_blksize = so->so_snd.sb_hiwat;
- if (so->so_type == SOCK_STREAM && unp->unp_conn != 0) {
- so2 = unp->unp_conn->unp_socket;
- ((struct stat *) m)->st_blksize += so2->so_rcv.sb_cc;
+ if (so->so_state & SS_CANTSENDMORE) {
+ error = EPIPE;
+ break;
}
- ((struct stat *) m)->st_dev = NODEV;
- if (unp->unp_ino == 0)
- unp->unp_ino = unp_ino++;
- ((struct stat *) m)->st_ino = unp->unp_ino;
- return (0);
-
- case PRU_RCVOOB:
- return (EOPNOTSUPP);
-
- case PRU_SENDOOB:
- error = EOPNOTSUPP;
- break;
-
- case PRU_SOCKADDR:
- if (unp->unp_addr) {
- nam->m_len = unp->unp_addr->m_len;
- bcopy(mtod(unp->unp_addr, caddr_t),
- mtod(nam, caddr_t), (unsigned)nam->m_len);
- } else
- nam->m_len = 0;
- break;
-
- case PRU_PEERADDR:
- if (unp->unp_conn && unp->unp_conn->unp_addr) {
- nam->m_len = unp->unp_conn->unp_addr->m_len;
- bcopy(mtod(unp->unp_conn->unp_addr, caddr_t),
- mtod(nam, caddr_t), (unsigned)nam->m_len);
+ if (unp->unp_conn == 0)
+ panic("uipc_send connected but no connection?");
+ so2 = unp->unp_conn->unp_socket;
+ /*
+ * Send to paired receive port, and then reduce
+ * send buffer hiwater marks to maintain backpressure.
+ * Wake up readers.
+ */
+ if (control) {
+ if (sbappendcontrol(rcv, m, control))
+ control = 0;
} else
- nam->m_len = 0;
- break;
-
- case PRU_SLOWTIMO:
+ sbappend(rcv, m);
+ snd->sb_mbmax -=
+ rcv->sb_mbcnt - unp->unp_conn->unp_mbcnt;
+ unp->unp_conn->unp_mbcnt = rcv->sb_mbcnt;
+ snd->sb_hiwat -= rcv->sb_cc - unp->unp_conn->unp_cc;
+ unp->unp_conn->unp_cc = rcv->sb_cc;
+ sorwakeup(so2);
+ m = 0;
+#undef snd
+#undef rcv
break;
default:
- panic("piusrreq");
+ panic("uipc_send unknown socktype");
+ }
+
+ /*
+ * SEND_EOF is equivalent to a SEND followed by
+ * a SHUTDOWN.
+ */
+ if (flags & PRUS_EOF) {
+ socantsendmore(so);
+ unp_shutdown(unp);
}
+
release:
if (control)
m_freem(control);
if (m)
m_freem(m);
- return (error);
+ return error;
+}
+
+static int
+uipc_sense(struct socket *so, struct stat *sb)
+{
+ struct unpcb *unp = sotounpcb(so);
+ struct socket *so2;
+
+ if (unp == 0)
+ return EINVAL;
+ sb->st_blksize = so->so_snd.sb_hiwat;
+ if (so->so_type == SOCK_STREAM && unp->unp_conn != 0) {
+ so2 = unp->unp_conn->unp_socket;
+ sb->st_blksize += so2->so_rcv.sb_cc;
+ }
+ sb->st_dev = NODEV;
+ if (unp->unp_ino == 0)
+ unp->unp_ino = unp_ino++;
+ sb->st_ino = unp->unp_ino;
+ return (0);
+}
+
+static int
+uipc_shutdown(struct socket *so)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0)
+ return EINVAL;
+ socantsendmore(so);
+ unp_shutdown(unp);
+ return 0;
+}
+
+static int
+uipc_sockaddr(struct socket *so, struct mbuf *nam)
+{
+ struct unpcb *unp = sotounpcb(so);
+
+ if (unp == 0)
+ return EINVAL;
+ if (unp->unp_addr) {
+ nam->m_len = unp->unp_addr->m_len;
+ bcopy(mtod(unp->unp_addr, caddr_t),
+ mtod(nam, caddr_t), (unsigned)nam->m_len);
+ } else
+ nam->m_len = 0;
+ return 0;
}
+struct pr_usrreqs uipc_usrreqs = {
+ uipc_abort, uipc_accept, uipc_attach, uipc_bind, uipc_connect,
+ uipc_connect2, pru_control_notsupp, uipc_detach, uipc_disconnect,
+ uipc_listen, uipc_peeraddr, uipc_rcvd, pru_rcvoob_notsupp,
+ uipc_send, uipc_sense, uipc_shutdown, uipc_sockaddr,
+ sosend, soreceive, soselect
+};
+
/*
* Both send and receive buffers are allocated PIPSIZ bytes of buffering
* for stream sockets, although the total for sender and receiver is
@@ -472,7 +555,7 @@ unp_bind(unp, nam, p)
}
VATTR_NULL(&vattr);
vattr.va_type = VSOCK;
- vattr.va_mode = ACCESSPERMS;
+ vattr.va_mode = (ACCESSPERMS & ~p->p_fd->fd_cmask);
VOP_LEASE(nd.ni_dvp, p, p->p_ucred, LEASE_WRITE);
if (error = VOP_CREATE(nd.ni_dvp, &nd.ni_vp, &nd.ni_cnd, &vattr))
return (error);
diff --git a/sys/net/if.c b/sys/net/if.c
index b1f7087..115cd64 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)if.c 8.3 (Berkeley) 1/4/94
- * $Id: if.c,v 1.45 1997/02/14 15:30:54 wollman Exp $
+ * $Id: if.c,v 1.46 1997/03/24 11:33:08 bde Exp $
*/
#include <sys/param.h>
@@ -640,7 +640,7 @@ ifioctl(so, cmd, data, p)
error = ((*so->so_proto->pr_usrreqs->pru_control)(so,
cmd,
data,
- ifp));
+ ifp, p));
switch (ocmd) {
case OSIOCGIFADDR:
diff --git a/sys/net/raw_cb.c b/sys/net/raw_cb.c
index 5b39bc0..9db18a3 100644
--- a/sys/net/raw_cb.c
+++ b/sys/net/raw_cb.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_cb.c 8.1 (Berkeley) 6/10/93
- * $Id: raw_cb.c,v 1.10 1997/02/22 09:41:13 peter Exp $
+ * $Id: raw_cb.c,v 1.11 1997/04/14 18:23:22 phk Exp $
*/
#include <sys/param.h>
diff --git a/sys/net/raw_cb.h b/sys/net/raw_cb.h
index bff3989..2cc5ccc 100644
--- a/sys/net/raw_cb.h
+++ b/sys/net/raw_cb.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_cb.h 8.1 (Berkeley) 6/10/93
- * $Id: raw_cb.h,v 1.7 1997/02/22 09:41:13 peter Exp $
+ * $Id: raw_cb.h,v 1.8 1997/04/14 18:23:23 phk Exp $
*/
#ifndef _NET_RAW_CB_H_
@@ -67,8 +67,8 @@ void raw_disconnect __P((struct rawcb *));
void raw_init __P((void));
void raw_input __P((struct mbuf *,
struct sockproto *, struct sockaddr *, struct sockaddr *));
-int raw_usrreq __P((struct socket *,
- int, struct mbuf *, struct mbuf *, struct mbuf *));
+
+extern struct pr_usrreqs raw_usrreqs;
#endif
#endif
diff --git a/sys/net/raw_usrreq.c b/sys/net/raw_usrreq.c
index ae7729f..9ec02fb 100644
--- a/sys/net/raw_usrreq.c
+++ b/sys/net/raw_usrreq.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_usrreq.c 8.1 (Berkeley) 6/10/93
- * $Id: raw_usrreq.c,v 1.10 1997/02/22 09:41:14 peter Exp $
+ * $Id: raw_usrreq.c,v 1.11 1997/04/14 18:23:25 phk Exp $
*/
#include <sys/param.h>
@@ -39,6 +39,7 @@
#include <sys/systm.h>
#include <sys/mbuf.h>
#include <sys/domain.h>
+#include <sys/proc.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
@@ -140,175 +141,172 @@ raw_ctlinput(cmd, arg, dummy)
/* INCOMPLETE */
}
-/*ARGSUSED*/
-int
-raw_usrreq(so, req, m, nam, control)
- struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+static int
+raw_uabort(struct socket *so)
{
- register struct rawcb *rp = sotorawcb(so);
- register int error = 0;
- int len;
+ struct rawcb *rp = sotorawcb(so);
- if (req == PRU_CONTROL)
- return (EOPNOTSUPP);
- if (control && control->m_len) {
- error = EOPNOTSUPP;
- goto release;
+ if (rp == 0)
+ return EINVAL;
+ raw_disconnect(rp);
+ sofree(so);
+ soisdisconnected(so);
+ return 0;
+}
+
+/* pru_accept is EOPNOTSUPP */
+
+static int
+raw_uattach(struct socket *so, int proto, struct proc *p)
+{
+ struct rawcb *rp = sotorawcb(so);
+ int error;
+
+ if (rp == 0)
+ return EINVAL;
+ if (p && (error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return error;
+ return raw_attach(so, proto);
+}
+
+static int
+raw_ubind(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ return EINVAL;
+}
+
+static int
+raw_uconnect(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ return EINVAL;
+}
+
+/* pru_connect2 is EOPNOTSUPP */
+/* pru_control is EOPNOTSUPP */
+
+static int
+raw_udetach(struct socket *so)
+{
+ struct rawcb *rp = sotorawcb(so);
+
+ if (rp == 0)
+ return EINVAL;
+
+ raw_detach(rp);
+ return 0;
+}
+
+static int
+raw_udisconnect(struct socket *so)
+{
+ struct rawcb *rp = sotorawcb(so);
+
+ if (rp == 0)
+ return EINVAL;
+ if (rp->rcb_faddr == 0) {
+ return ENOTCONN;
+ }
+ raw_disconnect(rp);
+ soisdisconnected(so);
+ return 0;
+}
+
+/* pru_listen is EOPNOTSUPP */
+
+static int
+raw_upeeraddr(struct socket *so, struct mbuf *nam)
+{
+ struct rawcb *rp = sotorawcb(so);
+ unsigned len;
+
+ if (rp == 0)
+ return EINVAL;
+ if (rp->rcb_faddr == 0) {
+ return ENOTCONN;
}
+ len = rp->rcb_faddr->sa_len;
+ bcopy((caddr_t)rp->rcb_faddr, mtod(nam, caddr_t), len);
+ nam->m_len = len;
+ return 0;
+}
+
+/* pru_rcvd is EOPNOTSUPP */
+/* pru_rcvoob is EOPNOTSUPP */
+
+static int
+raw_usend(struct socket *so, int flags, struct mbuf *m,
+ struct mbuf *nam, struct mbuf *control, struct proc *p)
+{
+ int error;
+ struct rawcb *rp = sotorawcb(so);
+
if (rp == 0) {
error = EINVAL;
goto release;
}
- switch (req) {
-
- /*
- * Allocate a raw control block and fill in the
- * necessary info to allow packets to be routed to
- * the appropriate raw interface routine.
- */
- case PRU_ATTACH:
- if ((so->so_state & SS_PRIV) == 0) {
- error = EACCES;
- break;
- }
- error = raw_attach(so, (int)nam);
- break;
-
- /*
- * Destroy state just before socket deallocation.
- * Flush data or not depending on the options.
- */
- case PRU_DETACH:
- if (rp == 0) {
- error = ENOTCONN;
- break;
- }
- raw_detach(rp);
- break;
-
- /*
- * If a socket isn't bound to a single address,
- * the raw input routine will hand it anything
- * within that protocol family (assuming there's
- * nothing else around it should go to).
- */
- case PRU_CONNECT:
- error = EINVAL;
-#if 0
- if (rp->rcb_faddr) {
- error = EISCONN;
- break;
- }
- nam = m_copym(nam, 0, M_COPYALL, M_WAIT);
- rp->rcb_faddr = mtod(nam, struct sockaddr *);
- soisconnected(so);
-#endif
- break;
-
- case PRU_BIND:
- error = EINVAL;
-#if 0
- if (rp->rcb_laddr) {
- error = EINVAL; /* XXX */
- break;
- }
- error = raw_bind(so, nam);
-#endif
- break;
- case PRU_CONNECT2:
+ if (flags & PRUS_OOB) {
error = EOPNOTSUPP;
goto release;
+ }
- case PRU_DISCONNECT:
- if (rp->rcb_faddr == 0) {
- error = ENOTCONN;
- break;
- }
- raw_disconnect(rp);
- soisdisconnected(so);
- break;
-
- /*
- * Mark the connection as being incapable of further input.
- */
- case PRU_SHUTDOWN:
- socantsendmore(so);
- break;
-
- /*
- * Ship a packet out. The appropriate raw output
- * routine handles any massaging necessary.
- */
- case PRU_SEND:
- if (nam) {
- if (rp->rcb_faddr) {
- error = EISCONN;
- break;
- }
- rp->rcb_faddr = mtod(nam, struct sockaddr *);
- } else if (rp->rcb_faddr == 0) {
- error = ENOTCONN;
- break;
- }
- error = (*so->so_proto->pr_output)(m, so);
- m = NULL;
- if (nam)
- rp->rcb_faddr = 0;
- break;
-
- case PRU_ABORT:
- raw_disconnect(rp);
- sofree(so);
- soisdisconnected(so);
- break;
-
- case PRU_SENSE:
- /*
- * stat: don't bother with a blocksize.
- */
- return (0);
-
- /*
- * Not supported.
- */
- case PRU_RCVOOB:
- case PRU_RCVD:
- return(EOPNOTSUPP);
-
- case PRU_LISTEN:
- case PRU_ACCEPT:
- case PRU_SENDOOB:
+ if (control && control->m_len) {
error = EOPNOTSUPP;
- break;
-
- case PRU_SOCKADDR:
- if (rp->rcb_laddr == 0) {
- error = EINVAL;
- break;
- }
- len = rp->rcb_laddr->sa_len;
- bcopy((caddr_t)rp->rcb_laddr, mtod(nam, caddr_t), (unsigned)len);
- nam->m_len = len;
- break;
-
- case PRU_PEERADDR:
- if (rp->rcb_faddr == 0) {
- error = ENOTCONN;
- break;
+ goto release;
+ }
+ if (nam) {
+ if (rp->rcb_faddr) {
+ error = EISCONN;
+ goto release;
}
- len = rp->rcb_faddr->sa_len;
- bcopy((caddr_t)rp->rcb_faddr, mtod(nam, caddr_t), (unsigned)len);
- nam->m_len = len;
- break;
-
- default:
- panic("raw_usrreq");
+ rp->rcb_faddr = mtod(nam, struct sockaddr *);
+ } else if (rp->rcb_faddr == 0) {
+ error = ENOTCONN;
+ goto release;
}
+ error = (*so->so_proto->pr_output)(m, so);
+ m = NULL;
+ if (nam)
+ rp->rcb_faddr = 0;
release:
if (m != NULL)
m_freem(m);
return (error);
}
+
+/* pru_sense is null */
+
+static int
+raw_ushutdown(struct socket *so)
+{
+ struct rawcb *rp = sotorawcb(so);
+
+ if (rp == 0)
+ return EINVAL;
+ socantsendmore(so);
+ return 0;
+}
+
+static int
+raw_usockaddr(struct socket *so, struct mbuf *nam)
+{
+ struct rawcb *rp = sotorawcb(so);
+ unsigned len;
+
+ if (rp == 0)
+ return EINVAL;
+ if (rp->rcb_laddr == 0)
+ return EINVAL;
+ len = rp->rcb_laddr->sa_len;
+ bcopy((caddr_t)rp->rcb_laddr, mtod(nam, caddr_t), len);
+ nam->m_len = len;
+ return 0;
+}
+
+struct pr_usrreqs raw_usrreqs = {
+ raw_uabort, pru_accept_notsupp, raw_uattach, raw_ubind, raw_uconnect,
+ pru_connect2_notsupp, pru_control_notsupp, raw_udetach,
+ raw_udisconnect, pru_listen_notsupp, raw_upeeraddr, pru_rcvd_notsupp,
+ pru_rcvoob_notsupp, raw_usend, pru_sense_null, raw_ushutdown,
+ raw_usockaddr, sosend, soreceive, soselect
+};
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index 36afca9..ae1a900 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -31,9 +31,10 @@
* SUCH DAMAGE.
*
* @(#)rtsock.c 8.5 (Berkeley) 11/2/94
- * $Id$
+ * $Id: rtsock.c,v 1.26 1997/02/22 09:41:15 peter Exp $
*/
+
#include <sys/param.h>
#include <sys/queue.h>
#include <sys/systm.h>
@@ -69,8 +70,6 @@ static void rt_xaddrs __P((caddr_t, caddr_t, struct rt_addrinfo *));
static int sysctl_dumpentry __P((struct radix_node *rn, void *vw));
static int sysctl_iflist __P((int af, struct walkarg *w));
static int route_output __P((struct mbuf *, struct socket *));
-static int route_usrreq __P((struct socket *,
- int, struct mbuf *, struct mbuf *, struct mbuf *));
static void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *));
/* Sleazy use of local variables throughout file, warning!!!! */
@@ -82,62 +81,191 @@ static void rt_setmetrics __P((u_long, struct rt_metrics *, struct rt_metrics *
#define ifaaddr info.rti_info[RTAX_IFA]
#define brdaddr info.rti_info[RTAX_BRD]
-/*ARGSUSED*/
+/*
+ * It really doesn't make any sense at all for this code to share much
+ * with raw_usrreq.c, since its functionality is so restricted. XXX
+ */
+static int
+rts_abort(struct socket *so)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_abort(so);
+ splx(s);
+ return error;
+}
+
+/* pru_accept is EOPNOTSUPP */
+
static int
-route_usrreq(so, req, m, nam, control)
- register struct socket *so;
- int req;
- struct mbuf *m, *nam, *control;
+rts_attach(struct socket *so, int proto, struct proc *p)
{
- register int error = 0;
- register struct rawcb *rp = sotorawcb(so);
- int s;
-
- if (req == PRU_ATTACH) {
- MALLOC(rp, struct rawcb *, sizeof(*rp), M_PCB, M_WAITOK);
- so->so_pcb = (caddr_t)rp;
- if (so->so_pcb)
- bzero(so->so_pcb, sizeof(*rp));
+ struct rawcb *rp;
+ int s, error;
+
+ if (sotorawcb(so) != 0)
+ return EISCONN; /* XXX panic? */
+ MALLOC(rp, struct rawcb *, sizeof *rp, M_PCB, M_WAITOK); /* XXX */
+ if (rp == 0)
+ return ENOBUFS;
+ bzero(rp, sizeof *rp);
+
+ /*
+ * The splnet() is necessary to block protocols from sending
+ * error notifications (like RTM_REDIRECT or RTM_LOSING) while
+ * this PCB is extant but incompletely initialized.
+ * Probably we should try to do more of this work beforehand and
+ * eliminate the spl.
+ */
+ s = splnet();
+ so->so_pcb = (caddr_t)rp;
+ error = raw_usrreqs.pru_attach(so, proto, p);
+ rp = sotorawcb(so);
+ if (error) {
+ splx(s);
+ free(rp, M_PCB);
+ return error;
+ }
+ switch(rp->rcb_proto.sp_protocol) {
+ case AF_INET:
+ route_cb.ip_count++;
+ break;
+ case AF_IPX:
+ route_cb.ipx_count++;
+ break;
+ case AF_NS:
+ route_cb.ns_count++;
+ break;
+ case AF_ISO:
+ route_cb.iso_count++;
+ break;
}
- if (req == PRU_DETACH && rp) {
- int af = rp->rcb_proto.sp_protocol;
- if (af == AF_INET)
+ rp->rcb_faddr = &route_src;
+ route_cb.any_count++;
+ soisconnected(so);
+ so->so_options |= SO_USELOOPBACK;
+ splx(s);
+ return 0;
+}
+
+static int
+rts_bind(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_bind(so, nam, p); /* xxx just EINVAL */
+ splx(s);
+ return error;
+}
+
+static int
+rts_connect(struct socket *so, struct mbuf *nam, struct proc *p)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_connect(so, nam, p); /* XXX just EINVAL */
+ splx(s);
+ return error;
+}
+
+/* pru_connect2 is EOPNOTSUPP */
+/* pru_control is EOPNOTSUPP */
+
+static int
+rts_detach(struct socket *so)
+{
+ struct rawcb *rp = sotorawcb(so);
+ int s, error;
+
+ s = splnet();
+ if (rp != 0) {
+ switch(rp->rcb_proto.sp_protocol) {
+ case AF_INET:
route_cb.ip_count--;
- else if (af == AF_IPX)
+ break;
+ case AF_IPX:
route_cb.ipx_count--;
- else if (af == AF_NS)
+ break;
+ case AF_NS:
route_cb.ns_count--;
- else if (af == AF_ISO)
+ break;
+ case AF_ISO:
route_cb.iso_count--;
+ break;
+ }
route_cb.any_count--;
}
+ error = raw_usrreqs.pru_detach(so);
+ splx(s);
+ return error;
+}
+
+static int
+rts_disconnect(struct socket *so)
+{
+ int s, error;
s = splnet();
- error = raw_usrreq(so, req, m, nam, control);
- rp = sotorawcb(so);
- if (req == PRU_ATTACH && rp) {
- int af = rp->rcb_proto.sp_protocol;
- if (error) {
- free((caddr_t)rp, M_PCB);
- splx(s);
- return (error);
- }
- if (af == AF_INET)
- route_cb.ip_count++;
- else if (af == AF_IPX)
- route_cb.ipx_count++;
- else if (af == AF_NS)
- route_cb.ns_count++;
- else if (af == AF_ISO)
- route_cb.iso_count++;
- rp->rcb_faddr = &route_src;
- route_cb.any_count++;
- soisconnected(so);
- so->so_options |= SO_USELOOPBACK;
- }
+ error = raw_usrreqs.pru_disconnect(so);
splx(s);
- return (error);
+ return error;
}
+/* pru_listen is EOPNOTSUPP */
+
+static int
+rts_peeraddr(struct socket *so, struct mbuf *nam)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_peeraddr(so, nam);
+ splx(s);
+ return error;
+}
+
+/* pru_rcvd is EOPNOTSUPP */
+/* pru_rcvoob is EOPNOTSUPP */
+
+static int
+rts_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
+ struct mbuf *control, struct proc *p)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_send(so, flags, m, nam, control, p);
+ splx(s);
+ return error;
+}
+
+/* pru_sense is null */
+
+static int
+rts_shutdown(struct socket *so)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_shutdown(so);
+ splx(s);
+ return error;
+}
+
+static int
+rts_sockaddr(struct socket *so, struct mbuf *nam)
+{
+ int s, error;
+ s = splnet();
+ error = raw_usrreqs.pru_sockaddr(so, nam);
+ splx(s);
+ return error;
+}
+
+static struct pr_usrreqs route_usrreqs = {
+ rts_abort, pru_accept_notsupp, rts_attach, rts_bind, rts_connect,
+ pru_connect2_notsupp, pru_control_notsupp, rts_detach, rts_disconnect,
+ pru_listen_notsupp, rts_peeraddr, pru_rcvd_notsupp, pru_rcvoob_notsupp,
+ rts_send, pru_sense_null, rts_shutdown, rts_sockaddr,
+ sosend, soreceive, soselect
+};
+
/*ARGSUSED*/
static int
route_output(m, so)
@@ -811,7 +939,7 @@ sysctl_rtsock SYSCTL_HANDLER_ARGS
return (error);
}
-SYSCTL_NODE(_net, PF_ROUTE, routetable, CTLFLAG_RD, sysctl_rtsock,"");
+SYSCTL_NODE(_net, PF_ROUTE, routetable, CTLFLAG_RD, sysctl_rtsock, "");
/*
* Definitions of protocols supported in the ROUTE domain.
@@ -822,8 +950,9 @@ extern struct domain routedomain; /* or at least forward */
static struct protosw routesw[] = {
{ SOCK_RAW, &routedomain, 0, PR_ATOMIC|PR_ADDR,
0, route_output, raw_ctlinput, 0,
- route_usrreq,
- raw_init
+ 0,
+ raw_init, 0, 0, 0,
+ &route_usrreqs
}
};
diff --git a/sys/netinet/in.c b/sys/netinet/in.c
index 17e8a88..4586c22 100644
--- a/sys/netinet/in.c
+++ b/sys/netinet/in.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in.c 8.4 (Berkeley) 1/9/95
- * $Id: in.c,v 1.32 1997/02/22 09:41:27 peter Exp $
+ * $Id: in.c,v 1.33 1997/03/24 11:33:25 bde Exp $
*/
#include <sys/param.h>
@@ -40,6 +40,7 @@
#include <sys/sockio.h>
#include <sys/errno.h>
#include <sys/malloc.h>
+#include <sys/proc.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/kernel.h>
@@ -140,11 +141,12 @@ static int in_interfaces; /* number of external internet interfaces */
*/
/* ARGSUSED */
int
-in_control(so, cmd, data, ifp)
+in_control(so, cmd, data, ifp, p)
struct socket *so;
int cmd;
caddr_t data;
register struct ifnet *ifp;
+ struct proc *p;
{
register struct ifreq *ifr = (struct ifreq *)data;
register struct in_ifaddr *ia = 0, *iap;
@@ -200,8 +202,8 @@ in_control(so, cmd, data, ifp)
case SIOCSIFADDR:
case SIOCSIFNETMASK:
case SIOCSIFDSTADDR:
- if ((so->so_state & SS_PRIV) == 0)
- return (EPERM);
+ if (p && (error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return error;
if (ifp == 0)
panic("in_control");
@@ -237,8 +239,8 @@ in_control(so, cmd, data, ifp)
break;
case SIOCSIFBRDADDR:
- if ((so->so_state & SS_PRIV) == 0)
- return (EPERM);
+ if (p && (error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return error;
/* FALLTHROUGH */
case SIOCGIFADDR:
diff --git a/sys/netinet/in_pcb.c b/sys/netinet/in_pcb.c
index d7136aa..6ae7e85 100644
--- a/sys/netinet/in_pcb.c
+++ b/sys/netinet/in_pcb.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in_pcb.c 8.4 (Berkeley) 5/24/95
- * $Id: in_pcb.c,v 1.29 1997/03/24 11:24:50 bde Exp $
+ * $Id: in_pcb.c,v 1.30 1997/04/03 05:14:40 davidg Exp $
*/
#include <sys/param.h>
@@ -112,14 +112,16 @@ SYSCTL_PROC(_net_inet_ip_portrange, OID_AUTO, hilast, CTLTYPE_INT|CTLFLAG_RW,
&ipport_hilastauto, 0, &sysctl_net_ipport_check, "I", "");
int
-in_pcballoc(so, pcbinfo)
+in_pcballoc(so, pcbinfo, p)
struct socket *so;
struct inpcbinfo *pcbinfo;
+ struct proc *p;
{
register struct inpcb *inp;
int s;
- MALLOC(inp, struct inpcb *, sizeof(*inp), M_PCB, M_NOWAIT);
+ MALLOC(inp, struct inpcb *, sizeof(*inp), M_PCB,
+ p ? M_WAITOK : M_NOWAIT);
if (inp == NULL)
return (ENOBUFS);
bzero((caddr_t)inp, sizeof(*inp));
@@ -134,14 +136,14 @@ in_pcballoc(so, pcbinfo)
}
int
-in_pcbbind(inp, nam)
+in_pcbbind(inp, nam, p)
register struct inpcb *inp;
struct mbuf *nam;
+ struct proc *p;
{
register struct socket *so = inp->inp_socket;
unsigned short *lastport;
struct sockaddr_in *sin;
- struct proc *p = curproc; /* XXX */
u_short lport = 0;
int wild = 0, reuseport = (so->so_options & SO_REUSEPORT);
int error;
@@ -208,7 +210,7 @@ in_pcbbind(inp, nam)
lastport = &inp->inp_pcbinfo->lasthi;
} else if (inp->inp_flags & INP_LOWPORT) {
if (error = suser(p->p_ucred, &p->p_acflag))
- return (EACCES);
+ return error;
first = ipport_lowfirstauto; /* 1023 */
last = ipport_lowlastauto; /* 600 */
lastport = &inp->inp_pcbinfo->lastlow;
@@ -391,9 +393,10 @@ in_pcbladdr(inp, nam, plocal_sin)
* then pick one.
*/
int
-in_pcbconnect(inp, nam)
+in_pcbconnect(inp, nam, p)
register struct inpcb *inp;
struct mbuf *nam;
+ struct proc *p;
{
struct sockaddr_in *ifaddr;
register struct sockaddr_in *sin = mtod(nam, struct sockaddr_in *);
@@ -411,7 +414,7 @@ in_pcbconnect(inp, nam)
return (EADDRINUSE);
if (inp->inp_laddr.s_addr == INADDR_ANY) {
if (inp->inp_lport == 0)
- (void)in_pcbbind(inp, (struct mbuf *)0);
+ (void)in_pcbbind(inp, (struct mbuf *)0, p);
inp->inp_laddr = ifaddr->sin_addr;
}
inp->inp_faddr = sin->sin_addr;
diff --git a/sys/netinet/in_pcb.h b/sys/netinet/in_pcb.h
index 5a5d69d..6d6cdc6 100644
--- a/sys/netinet/in_pcb.h
+++ b/sys/netinet/in_pcb.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in_pcb.h 8.1 (Berkeley) 6/10/93
- * $Id: in_pcb.h,v 1.19 1997/03/03 09:23:34 davidg Exp $
+ * $Id: in_pcb.h,v 1.20 1997/04/03 05:14:41 davidg Exp $
*/
#ifndef _NETINET_IN_PCB_H_
@@ -101,9 +101,9 @@ struct inpcbinfo {
#ifdef KERNEL
void in_losing __P((struct inpcb *));
-int in_pcballoc __P((struct socket *, struct inpcbinfo *));
-int in_pcbbind __P((struct inpcb *, struct mbuf *));
-int in_pcbconnect __P((struct inpcb *, struct mbuf *));
+int in_pcballoc __P((struct socket *, struct inpcbinfo *, struct proc *));
+int in_pcbbind __P((struct inpcb *, struct mbuf *, struct proc *));
+int in_pcbconnect __P((struct inpcb *, struct mbuf *, struct proc *));
void in_pcbdetach __P((struct inpcb *));
void in_pcbdisconnect __P((struct inpcb *));
int in_pcbladdr __P((struct inpcb *, struct mbuf *,
diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c
index b07d8a5..eeaf2f4 100644
--- a/sys/netinet/in_proto.c
+++ b/sys/netinet/in_proto.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in_proto.c 8.2 (Berkeley) 2/9/95
- * $Id$
+ * $Id: in_proto.c,v 1.38 1997/02/18 20:46:22 wollman Exp $
*/
#include <sys/param.h>
@@ -96,12 +96,14 @@ void iplinit();
extern struct domain inetdomain;
+static struct pr_usrreqs nousrreqs;
struct protosw inetsw[] = {
{ 0, &inetdomain, 0, 0,
0, 0, 0, 0,
0,
- ip_init, 0, ip_slowtimo, ip_drain
+ ip_init, 0, ip_slowtimo, ip_drain,
+ &nousrreqs
},
{ SOCK_DGRAM, &inetdomain, IPPROTO_UDP, PR_ATOMIC|PR_ADDR,
udp_input, 0, udp_ctlinput, ip_ctloutput,
diff --git a/sys/netinet/in_var.h b/sys/netinet/in_var.h
index 516a875..f61a26d 100644
--- a/sys/netinet/in_var.h
+++ b/sys/netinet/in_var.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)in_var.h 8.2 (Berkeley) 1/9/95
- * $Id$
+ * $Id: in_var.h,v 1.25 1997/02/22 09:41:30 peter Exp $
*/
#ifndef _NETINET_IN_VAR_H_
@@ -216,7 +216,8 @@ do { \
struct in_multi *in_addmulti __P((struct in_addr *, struct ifnet *));
void in_delmulti __P((struct in_multi *));
-int in_control __P((struct socket *, int, caddr_t, struct ifnet *));
+int in_control __P((struct socket *, int, caddr_t, struct ifnet *,
+ struct proc *));
void in_rtqdrain __P((void));
void ip_input __P((struct mbuf *));
int in_ifadown __P((struct ifaddr *ifa));
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 40a1b4a..4b989fc 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_output.c 8.3 (Berkeley) 1/21/94
- * $Id: ip_output.c,v 1.1.1.2 1997/04/03 10:39:32 darrenr Exp $
+ * $Id: ip_output.c,v 1.54 1997/04/03 10:47:12 darrenr Exp $
*/
#define _IP_VHL
@@ -623,11 +623,12 @@ ip_optcopy(ip, jp)
* IP socket option processing.
*/
int
-ip_ctloutput(op, so, level, optname, mp)
+ip_ctloutput(op, so, level, optname, mp, p)
int op;
struct socket *so;
int level, optname;
struct mbuf **mp;
+ struct proc *p;
{
register struct inpcb *inp = sotoinpcb(so);
register struct mbuf *m = *mp;
diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h
index 8875197..e71c0d2 100644
--- a/sys/netinet/ip_var.h
+++ b/sys/netinet/ip_var.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)ip_var.h 8.2 (Berkeley) 1/9/95
- * $Id$
+ * $Id: ip_var.h,v 1.31 1997/02/22 09:41:36 peter Exp $
*/
#ifndef _NETINET_IP_VAR_H_
@@ -172,7 +172,8 @@ extern u_long (*ip_mcast_src) __P((int));
extern int rsvp_on;
extern struct pr_usrreqs rip_usrreqs;
-int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
+int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **,
+ struct proc *));
void ip_drain __P((void));
void ip_freemoptions __P((struct ip_moptions *));
void ip_init __P((void));
@@ -186,7 +187,8 @@ void ip_slowtimo __P((void));
struct mbuf *
ip_srcroute __P((void));
void ip_stripoptions __P((struct mbuf *, struct mbuf *));
-int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
+int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **,
+ struct proc *p));
void rip_ctlinput __P((int, struct sockaddr *, void *));
void rip_init __P((void));
void rip_input __P((struct mbuf *, int));
diff --git a/sys/netinet/raw_ip.c b/sys/netinet/raw_ip.c
index 1e3a35d..1320913 100644
--- a/sys/netinet/raw_ip.c
+++ b/sys/netinet/raw_ip.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)raw_ip.c 8.7 (Berkeley) 5/15/95
- * $Id: raw_ip.c,v 1.43 1997/03/03 09:23:35 davidg Exp $
+ * $Id: raw_ip.c,v 1.44 1997/04/03 05:14:43 davidg Exp $
*/
#include <sys/param.h>
@@ -40,6 +40,7 @@
#include <sys/errno.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
+#include <sys/proc.h>
#include <sys/protosw.h>
#include <sys/queue.h>
#include <sys/socket.h>
@@ -220,11 +221,12 @@ rip_output(m, so, dst)
* Raw IP socket option processing.
*/
int
-rip_ctloutput(op, so, level, optname, m)
+rip_ctloutput(op, so, level, optname, m, p)
int op;
struct socket *so;
int level, optname;
struct mbuf **m;
+ struct proc *p;
{
register struct inpcb *inp = sotoinpcb(so);
register int error;
@@ -313,7 +315,7 @@ rip_ctloutput(op, so, level, optname, m)
error = EINVAL;
return (error);
}
- return (ip_ctloutput(op, so, level, optname, m));
+ return (ip_ctloutput(op, so, level, optname, m, p));
}
/*
@@ -387,7 +389,7 @@ SYSCTL_INT(_net_inet_raw, OID_AUTO, recvspace, CTLFLAG_RW, &rip_recvspace,
0, "");
static int
-rip_attach(struct socket *so, int proto)
+rip_attach(struct socket *so, int proto, struct proc *p)
{
struct inpcb *inp;
int error;
@@ -395,11 +397,11 @@ rip_attach(struct socket *so, int proto)
inp = sotoinpcb(so);
if (inp)
panic("rip_attach");
- if ((so->so_state & SS_PRIV) == 0)
- return EACCES;
+ if (p && (error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return error;
if ((error = soreserve(so, rip_sendspace, rip_recvspace)) ||
- (error = in_pcballoc(so, &ripcbinfo)))
+ (error = in_pcballoc(so, &ripcbinfo, p)))
return error;
inp = (struct inpcb *)so->so_pcb;
inp->inp_ip_p = proto;
@@ -439,7 +441,7 @@ rip_disconnect(struct socket *so)
}
static int
-rip_bind(struct socket *so, struct mbuf *nam)
+rip_bind(struct socket *so, struct mbuf *nam, struct proc *p)
{
struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
@@ -457,7 +459,7 @@ rip_bind(struct socket *so, struct mbuf *nam)
}
static int
-rip_connect(struct socket *so, struct mbuf *nam)
+rip_connect(struct socket *so, struct mbuf *nam, struct proc *p)
{
struct inpcb *inp = sotoinpcb(so);
struct sockaddr_in *addr = mtod(nam, struct sockaddr_in *);
@@ -483,7 +485,7 @@ rip_shutdown(struct socket *so)
static int
rip_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
- struct mbuf *control)
+ struct mbuf *control, struct proc *p)
{
struct inpcb *inp = sotoinpcb(so);
register u_long dst;
@@ -509,5 +511,5 @@ struct pr_usrreqs rip_usrreqs = {
pru_connect2_notsupp, in_control, rip_detach, rip_disconnect,
pru_listen_notsupp, in_setpeeraddr, pru_rcvd_notsupp,
pru_rcvoob_notsupp, rip_send, pru_sense_null, rip_shutdown,
- in_setsockaddr
+ in_setsockaddr, sosend, soreceive, soselect
};
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
index 0aefb25..f76526e 100644
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $Id$
+ * $Id: tcp_input.c,v 1.57 1997/02/22 09:41:40 peter Exp $
*/
#ifndef TUBA_INCLUDE
@@ -42,6 +42,7 @@
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
+#include <sys/proc.h> /* for proc0 declaration */
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
@@ -652,7 +653,7 @@ findpcb:
laddr = inp->inp_laddr;
if (inp->inp_laddr.s_addr == INADDR_ANY)
inp->inp_laddr = ti->ti_dst;
- if (in_pcbconnect(inp, am)) {
+ if (in_pcbconnect(inp, am, &proc0)) { /* XXX creds */
inp->inp_laddr = laddr;
(void) m_free(am);
goto drop;
diff --git a/sys/netinet/tcp_reass.c b/sys/netinet/tcp_reass.c
index 0aefb25..f76526e 100644
--- a/sys/netinet/tcp_reass.c
+++ b/sys/netinet/tcp_reass.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_input.c 8.12 (Berkeley) 5/24/95
- * $Id$
+ * $Id: tcp_input.c,v 1.57 1997/02/22 09:41:40 peter Exp $
*/
#ifndef TUBA_INCLUDE
@@ -42,6 +42,7 @@
#include <sys/sysctl.h>
#include <sys/malloc.h>
#include <sys/mbuf.h>
+#include <sys/proc.h> /* for proc0 declaration */
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
@@ -652,7 +653,7 @@ findpcb:
laddr = inp->inp_laddr;
if (inp->inp_laddr.s_addr == INADDR_ANY)
inp->inp_laddr = ti->ti_dst;
- if (in_pcbconnect(inp, am)) {
+ if (in_pcbconnect(inp, am, &proc0)) { /* XXX creds */
inp->inp_laddr = laddr;
(void) m_free(am);
goto drop;
diff --git a/sys/netinet/tcp_usrreq.c b/sys/netinet/tcp_usrreq.c
index fbed6af..6946c08 100644
--- a/sys/netinet/tcp_usrreq.c
+++ b/sys/netinet/tcp_usrreq.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* From: @(#)tcp_usrreq.c 8.2 (Berkeley) 1/3/94
- * $Id$
+ * $Id: tcp_usrreq.c,v 1.30 1997/02/21 16:30:31 wollman Exp $
*/
#include <sys/param.h>
@@ -71,8 +71,9 @@
*/
extern char *tcpstates[]; /* XXX ??? */
-static int tcp_attach __P((struct socket *));
-static int tcp_connect __P((struct tcpcb *, struct mbuf *));
+static int tcp_attach __P((struct socket *, struct proc *));
+static int tcp_connect __P((struct tcpcb *, struct mbuf *,
+ struct proc *));
static struct tcpcb *
tcp_disconnect __P((struct tcpcb *));
static struct tcpcb *
@@ -94,7 +95,7 @@ static struct tcpcb *
* and an internet control block.
*/
static int
-tcp_usr_attach(struct socket *so, int proto)
+tcp_usr_attach(struct socket *so, int proto, struct proc *p)
{
int s = splnet();
int error;
@@ -108,7 +109,7 @@ tcp_usr_attach(struct socket *so, int proto)
goto out;
}
- error = tcp_attach(so);
+ error = tcp_attach(so, p);
if (error)
goto out;
@@ -170,7 +171,7 @@ tcp_usr_detach(struct socket *so)
* Give the socket an address.
*/
static int
-tcp_usr_bind(struct socket *so, struct mbuf *nam)
+tcp_usr_bind(struct socket *so, struct mbuf *nam, struct proc *p)
{
int s = splnet();
int error = 0;
@@ -190,7 +191,7 @@ tcp_usr_bind(struct socket *so, struct mbuf *nam)
error = EAFNOSUPPORT;
goto out;
}
- error = in_pcbbind(inp, nam);
+ error = in_pcbbind(inp, nam, p);
if (error)
goto out;
COMMON_END(PRU_BIND);
@@ -201,7 +202,7 @@ tcp_usr_bind(struct socket *so, struct mbuf *nam)
* Prepare to accept connections.
*/
static int
-tcp_usr_listen(struct socket *so)
+tcp_usr_listen(struct socket *so, struct proc *p)
{
int s = splnet();
int error = 0;
@@ -210,7 +211,7 @@ tcp_usr_listen(struct socket *so)
COMMON_START();
if (inp->inp_lport == 0)
- error = in_pcbbind(inp, NULL);
+ error = in_pcbbind(inp, (struct mbuf *)0, p);
if (error == 0)
tp->t_state = TCPS_LISTEN;
COMMON_END(PRU_LISTEN);
@@ -224,7 +225,7 @@ tcp_usr_listen(struct socket *so)
* Send initial segment on connection.
*/
static int
-tcp_usr_connect(struct socket *so, struct mbuf *nam)
+tcp_usr_connect(struct socket *so, struct mbuf *nam, struct proc *p)
{
int s = splnet();
int error = 0;
@@ -244,7 +245,7 @@ tcp_usr_connect(struct socket *so, struct mbuf *nam)
goto out;
}
- if ((error = tcp_connect(tp, nam)) != 0)
+ if ((error = tcp_connect(tp, nam, p)) != 0)
goto out;
error = tcp_output(tp);
COMMON_END(PRU_CONNECT);
@@ -333,7 +334,7 @@ tcp_usr_rcvd(struct socket *so, int flags)
*/
static int
tcp_usr_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
- struct mbuf *control)
+ struct mbuf *control, struct proc *p)
{
int s = splnet();
int error = 0;
@@ -357,7 +358,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
* initialize maxseg/maxopd using peer's cached
* MSS.
*/
- error = tcp_connect(tp, nam);
+ error = tcp_connect(tp, nam, p);
if (error)
goto out;
tp->snd_wnd = TTCP_CLIENT_SND_WND;
@@ -396,7 +397,7 @@ tcp_usr_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *nam,
* initialize maxseg/maxopd using peer's cached
* MSS.
*/
- error = tcp_connect(tp, nam);
+ error = tcp_connect(tp, nam, p);
if (error)
goto out;
tp->snd_wnd = TTCP_CLIENT_SND_WND;
@@ -463,7 +464,7 @@ struct pr_usrreqs tcp_usrreqs = {
tcp_usr_connect, pru_connect2_notsupp, in_control, tcp_usr_detach,
tcp_usr_disconnect, tcp_usr_listen, in_setpeeraddr, tcp_usr_rcvd,
tcp_usr_rcvoob, tcp_usr_send, pru_sense_null, tcp_usr_shutdown,
- in_setsockaddr
+ in_setsockaddr, sosend, soreceive, soselect
};
/*
@@ -477,9 +478,10 @@ struct pr_usrreqs tcp_usrreqs = {
* Initialize connection parameters and enter SYN-SENT state.
*/
static int
-tcp_connect(tp, nam)
+tcp_connect(tp, nam, p)
register struct tcpcb *tp;
struct mbuf *nam;
+ struct proc *p;
{
struct inpcb *inp = tp->t_inpcb, *oinp;
struct socket *so = inp->inp_socket;
@@ -491,7 +493,7 @@ tcp_connect(tp, nam)
struct rmxp_tao tao_noncached;
if (inp->inp_lport == 0) {
- error = in_pcbbind(inp, NULL);
+ error = in_pcbbind(inp, (struct mbuf *)0, p);
if (error)
return error;
}
@@ -564,11 +566,12 @@ tcp_connect(tp, nam)
}
int
-tcp_ctloutput(op, so, level, optname, mp)
+tcp_ctloutput(op, so, level, optname, mp, p)
int op;
struct socket *so;
int level, optname;
struct mbuf **mp;
+ struct proc *p;
{
int error = 0, s;
struct inpcb *inp;
@@ -585,7 +588,7 @@ tcp_ctloutput(op, so, level, optname, mp)
return (ECONNRESET);
}
if (level != IPPROTO_TCP) {
- error = ip_ctloutput(op, so, level, optname, mp);
+ error = ip_ctloutput(op, so, level, optname, mp, p);
splx(s);
return (error);
}
@@ -684,8 +687,9 @@ SYSCTL_INT(_net_inet_tcp, TCPCTL_RECVSPACE, recvspace,
* bufer space, and entering LISTEN state if to accept connections.
*/
static int
-tcp_attach(so)
+tcp_attach(so, p)
struct socket *so;
+ struct proc *p;
{
register struct tcpcb *tp;
struct inpcb *inp;
@@ -696,7 +700,7 @@ tcp_attach(so)
if (error)
return (error);
}
- error = in_pcballoc(so, &tcbinfo);
+ error = in_pcballoc(so, &tcbinfo, p);
if (error)
return (error);
inp = sotoinpcb(so);
diff --git a/sys/netinet/tcp_var.h b/sys/netinet/tcp_var.h
index 8e63a2c..a9a9b36 100644
--- a/sys/netinet/tcp_var.h
+++ b/sys/netinet/tcp_var.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)tcp_var.h 8.4 (Berkeley) 5/24/95
- * $Id$
+ * $Id: tcp_var.h,v 1.38 1997/02/22 09:41:43 peter Exp $
*/
#ifndef _NETINET_TCP_VAR_H_
@@ -337,7 +337,8 @@ void tcp_canceltimers __P((struct tcpcb *));
struct tcpcb *
tcp_close __P((struct tcpcb *));
void tcp_ctlinput __P((int, struct sockaddr *, void *));
-int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **));
+int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **,
+ struct proc *));
struct tcpcb *
tcp_drop __P((struct tcpcb *, int));
void tcp_drain __P((void));
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index fe1a8fc..108bea5 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)udp_usrreq.c 8.6 (Berkeley) 5/23/95
- * $Id: udp_usrreq.c,v 1.36 1997/03/03 09:23:37 davidg Exp $
+ * $Id: udp_usrreq.c,v 1.37 1997/04/03 05:14:45 davidg Exp $
*/
#include <sys/param.h>
@@ -91,7 +91,7 @@ SYSCTL_STRUCT(_net_inet_udp, UDPCTL_STATS, stats, CTLFLAG_RD,
static struct sockaddr_in udp_in = { sizeof(udp_in), AF_INET };
static int udp_output __P((struct inpcb *, struct mbuf *, struct mbuf *,
- struct mbuf *));
+ struct mbuf *, struct proc *));
static void udp_notify __P((struct inpcb *, int));
void
@@ -360,10 +360,11 @@ udp_ctlinput(cmd, sa, vip)
}
static int
-udp_output(inp, m, addr, control)
+udp_output(inp, m, addr, control, p)
register struct inpcb *inp;
register struct mbuf *m;
struct mbuf *addr, *control;
+ struct proc *p;
{
register struct udpiphdr *ui;
register int len = m->m_pkthdr.len;
@@ -388,7 +389,7 @@ udp_output(inp, m, addr, control)
* Must block input while temporarily connected.
*/
s = splnet();
- error = in_pcbconnect(inp, addr);
+ error = in_pcbconnect(inp, addr, p);
if (error) {
splx(s);
goto release;
@@ -480,7 +481,7 @@ udp_abort(struct socket *so)
}
static int
-udp_attach(struct socket *so, int proto)
+udp_attach(struct socket *so, int proto, struct proc *p)
{
struct inpcb *inp;
int s, error;
@@ -490,7 +491,7 @@ udp_attach(struct socket *so, int proto)
return EINVAL;
s = splnet();
- error = in_pcballoc(so, &udbinfo);
+ error = in_pcballoc(so, &udbinfo, p);
splx(s);
if (error)
return error;
@@ -502,7 +503,7 @@ udp_attach(struct socket *so, int proto)
}
static int
-udp_bind(struct socket *so, struct mbuf *nam)
+udp_bind(struct socket *so, struct mbuf *nam, struct proc *p)
{
struct inpcb *inp;
int s, error;
@@ -511,13 +512,13 @@ udp_bind(struct socket *so, struct mbuf *nam)
if (inp == 0)
return EINVAL;
s = splnet();
- error = in_pcbbind(inp, nam);
+ error = in_pcbbind(inp, nam, p);
splx(s);
return error;
}
static int
-udp_connect(struct socket *so, struct mbuf *nam)
+udp_connect(struct socket *so, struct mbuf *nam, struct proc *p)
{
struct inpcb *inp;
int s, error;
@@ -528,7 +529,7 @@ udp_connect(struct socket *so, struct mbuf *nam)
if (inp->inp_faddr.s_addr != INADDR_ANY)
return EISCONN;
s = splnet();
- error = in_pcbconnect(inp, nam);
+ error = in_pcbconnect(inp, nam, p);
splx(s);
if (error == 0)
soisconnected(so);
@@ -572,7 +573,7 @@ udp_disconnect(struct socket *so)
static int
udp_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *addr,
- struct mbuf *control)
+ struct mbuf *control, struct proc *p)
{
struct inpcb *inp;
@@ -581,7 +582,7 @@ udp_send(struct socket *so, int flags, struct mbuf *m, struct mbuf *addr,
m_freem(m);
return EINVAL;
}
- return udp_output(inp, m, addr, control);
+ return udp_output(inp, m, addr, control, p);
}
static int
@@ -601,5 +602,5 @@ struct pr_usrreqs udp_usrreqs = {
pru_connect2_notsupp, in_control, udp_detach, udp_disconnect,
pru_listen_notsupp, in_setpeeraddr, pru_rcvd_notsupp,
pru_rcvoob_notsupp, udp_send, pru_sense_null, udp_shutdown,
- in_setsockaddr
+ in_setsockaddr, sosend, soreceive, soselect
};
diff --git a/sys/nfs/nfs_socket.c b/sys/nfs/nfs_socket.c
index 86ac106..78a5773 100644
--- a/sys/nfs/nfs_socket.c
+++ b/sys/nfs/nfs_socket.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_socket.c,v 1.22 1997/03/22 06:53:08 bde Exp $
+ * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $
*/
/*
@@ -192,7 +192,7 @@ nfs_connect(nmp, rep)
struct sockaddr_in *sin;
struct mbuf *m;
u_short tport;
- struct proc *p = &proc0; /* only used for socreate */
+ struct proc *p = &proc0; /* only used for socreate and sobind */
nmp->nm_so = (struct socket *)0;
saddr = mtod(nmp->nm_nam, struct sockaddr *);
@@ -201,7 +201,6 @@ nfs_connect(nmp, rep)
if (error)
goto bad;
so = nmp->nm_so;
- so->so_state &= ~SS_PRIV; /* don't need it */
nmp->nm_soflags = so->so_proto->pr_flags;
/*
@@ -215,7 +214,7 @@ nfs_connect(nmp, rep)
sin->sin_addr.s_addr = INADDR_ANY;
tport = IPPORT_RESERVED - 1;
sin->sin_port = htons(tport);
- while ((error = sobind(so, m)) == EADDRINUSE &&
+ while ((error = sobind(so, m, p)) == EADDRINUSE &&
--tport > IPPORT_RESERVED / 2)
sin->sin_port = htons(tport);
m_freem(m);
@@ -233,7 +232,7 @@ nfs_connect(nmp, rep)
goto bad;
}
} else {
- error = soconnect(so, nmp->nm_nam);
+ error = soconnect(so, nmp->nm_nam, p);
if (error)
goto bad;
@@ -282,13 +281,13 @@ nfs_connect(nmp, rep)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR + sizeof (u_long))
* 2;
@@ -414,8 +413,8 @@ nfs_send(so, nam, top, rep)
else
flags = 0;
- error = sosend(so, sendnam, (struct uio *)0, top,
- (struct mbuf *)0, flags);
+ error = so->so_proto->pr_usrreqs->pru_sosend(so, sendnam, 0, top, 0,
+ flags);
if (error) {
if (rep) {
log(LOG_INFO, "nfs send error %d for server %s\n",error,
@@ -533,8 +532,10 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0, &auio,
- (struct mbuf **)0, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0, &auio,
+ (struct mbuf **)0, (struct mbuf **)0,
+ &rcvflg);
if (error == EWOULDBLOCK && rep) {
if (rep->r_flags & R_SOFTTERM)
return (EINTR);
@@ -566,8 +567,9 @@ tryagain:
auio.uio_resid = len;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0,
- &auio, mp, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
+ &auio, mp, (struct mbuf **)0, &rcvflg);
} while (error == EWOULDBLOCK || error == EINTR ||
error == ERESTART);
if (!error && auio.uio_resid > 0) {
@@ -590,7 +592,8 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, (struct mbuf **)0,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
&auio, mp, &control, &rcvflg);
if (control)
m_freem(control);
@@ -632,7 +635,8 @@ errout:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, getnam, &auio, mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, getnam, &auio, mp,
(struct mbuf **)0, &rcvflg);
if (error == EWOULDBLOCK &&
(rep->r_flags & R_SOFTTERM))
@@ -1291,6 +1295,7 @@ nfs_timer(arg)
register struct nfssvc_sock *slp;
u_quad_t cur_usec;
#endif /* NFS_NOSERVER */
+ struct proc *p = &proc0; /* XXX for credentials, will break if sleep */
s = splnet();
for (rep = nfs_reqq.tqh_first; rep != 0; rep = rep->r_chain.tqe_next) {
@@ -1351,10 +1356,11 @@ nfs_timer(arg)
if ((nmp->nm_flag & NFSMNT_NOCONN) == 0)
error = (*so->so_proto->pr_usrreqs->pru_send)
(so, 0, m, (struct mbuf *)0,
- (struct mbuf *)0);
+ (struct mbuf *)0, p);
else
error = (*so->so_proto->pr_usrreqs->pru_send)
- (so, 0, m, nmp->nm_nam, (struct mbuf *)0);
+ (so, 0, m, nmp->nm_nam, (struct mbuf *)0,
+ p);
if (error) {
if (NFSIGNORE_SOERROR(nmp->nm_soflags, error))
so->so_error = 0;
@@ -1666,7 +1672,8 @@ nfsrv_rcv(so, arg, waitflag)
*/
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
if (error || mp == (struct mbuf *)0) {
if (error == EWOULDBLOCK)
slp->ns_flag |= SLP_NEEDQ;
@@ -1700,7 +1707,8 @@ nfsrv_rcv(so, arg, waitflag)
do {
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp,
(struct mbuf **)0, &flags);
if (mp) {
nfs_realign(mp, 10 * NFSX_UNSIGNED);
diff --git a/sys/nfs/nfs_syscalls.c b/sys/nfs/nfs_syscalls.c
index 396dff8..75d43c2 100644
--- a/sys/nfs/nfs_syscalls.c
+++ b/sys/nfs/nfs_syscalls.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_syscalls.c,v 1.19 1997/03/22 06:53:11 bde Exp $
+ * $Id: nfs_syscalls.c,v 1.20 1997/03/27 20:01:07 guido Exp $
*/
#include <sys/param.h>
@@ -105,7 +105,8 @@ static int notstarted = 1;
static int modify_flag = 0;
static void nfsd_rt __P((int sotype, struct nfsrv_descript *nd,
int cacherep));
-static int nfssvc_addsock __P((struct file *,struct mbuf *));
+static int nfssvc_addsock __P((struct file *, struct mbuf *,
+ struct proc *));
static int nfssvc_nfsd __P((struct nfsd_srvargs *,caddr_t,struct proc *));
static int nfs_privport = 0;
@@ -246,7 +247,7 @@ nfssvc(p, uap, retval)
if (error)
return (error);
}
- error = nfssvc_addsock(fp, nam);
+ error = nfssvc_addsock(fp, nam, p);
} else {
error = copyin(uap->argp, (caddr_t)nsd, sizeof (*nsd));
if (error)
@@ -350,9 +351,10 @@ nfssvc(p, uap, retval)
* Adds a socket to the list for servicing by nfsds.
*/
static int
-nfssvc_addsock(fp, mynam)
+nfssvc_addsock(fp, mynam, p)
struct file *fp;
struct mbuf *mynam;
+ struct proc *p;
{
register struct mbuf *m;
register int siz;
@@ -400,14 +402,14 @@ nfssvc_addsock(fp, mynam)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_domain->dom_family == AF_INET &&
so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
so->so_rcv.sb_flags &= ~SB_NOINTR;
so->so_rcv.sb_timeo = 0;
diff --git a/sys/nfsclient/nfs_nfsiod.c b/sys/nfsclient/nfs_nfsiod.c
index 396dff8..75d43c2 100644
--- a/sys/nfsclient/nfs_nfsiod.c
+++ b/sys/nfsclient/nfs_nfsiod.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_syscalls.c,v 1.19 1997/03/22 06:53:11 bde Exp $
+ * $Id: nfs_syscalls.c,v 1.20 1997/03/27 20:01:07 guido Exp $
*/
#include <sys/param.h>
@@ -105,7 +105,8 @@ static int notstarted = 1;
static int modify_flag = 0;
static void nfsd_rt __P((int sotype, struct nfsrv_descript *nd,
int cacherep));
-static int nfssvc_addsock __P((struct file *,struct mbuf *));
+static int nfssvc_addsock __P((struct file *, struct mbuf *,
+ struct proc *));
static int nfssvc_nfsd __P((struct nfsd_srvargs *,caddr_t,struct proc *));
static int nfs_privport = 0;
@@ -246,7 +247,7 @@ nfssvc(p, uap, retval)
if (error)
return (error);
}
- error = nfssvc_addsock(fp, nam);
+ error = nfssvc_addsock(fp, nam, p);
} else {
error = copyin(uap->argp, (caddr_t)nsd, sizeof (*nsd));
if (error)
@@ -350,9 +351,10 @@ nfssvc(p, uap, retval)
* Adds a socket to the list for servicing by nfsds.
*/
static int
-nfssvc_addsock(fp, mynam)
+nfssvc_addsock(fp, mynam, p)
struct file *fp;
struct mbuf *mynam;
+ struct proc *p;
{
register struct mbuf *m;
register int siz;
@@ -400,14 +402,14 @@ nfssvc_addsock(fp, mynam)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_domain->dom_family == AF_INET &&
so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
so->so_rcv.sb_flags &= ~SB_NOINTR;
so->so_rcv.sb_timeo = 0;
diff --git a/sys/nfsclient/nfs_socket.c b/sys/nfsclient/nfs_socket.c
index 86ac106..78a5773 100644
--- a/sys/nfsclient/nfs_socket.c
+++ b/sys/nfsclient/nfs_socket.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_socket.c,v 1.22 1997/03/22 06:53:08 bde Exp $
+ * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $
*/
/*
@@ -192,7 +192,7 @@ nfs_connect(nmp, rep)
struct sockaddr_in *sin;
struct mbuf *m;
u_short tport;
- struct proc *p = &proc0; /* only used for socreate */
+ struct proc *p = &proc0; /* only used for socreate and sobind */
nmp->nm_so = (struct socket *)0;
saddr = mtod(nmp->nm_nam, struct sockaddr *);
@@ -201,7 +201,6 @@ nfs_connect(nmp, rep)
if (error)
goto bad;
so = nmp->nm_so;
- so->so_state &= ~SS_PRIV; /* don't need it */
nmp->nm_soflags = so->so_proto->pr_flags;
/*
@@ -215,7 +214,7 @@ nfs_connect(nmp, rep)
sin->sin_addr.s_addr = INADDR_ANY;
tport = IPPORT_RESERVED - 1;
sin->sin_port = htons(tport);
- while ((error = sobind(so, m)) == EADDRINUSE &&
+ while ((error = sobind(so, m, p)) == EADDRINUSE &&
--tport > IPPORT_RESERVED / 2)
sin->sin_port = htons(tport);
m_freem(m);
@@ -233,7 +232,7 @@ nfs_connect(nmp, rep)
goto bad;
}
} else {
- error = soconnect(so, nmp->nm_nam);
+ error = soconnect(so, nmp->nm_nam, p);
if (error)
goto bad;
@@ -282,13 +281,13 @@ nfs_connect(nmp, rep)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR + sizeof (u_long))
* 2;
@@ -414,8 +413,8 @@ nfs_send(so, nam, top, rep)
else
flags = 0;
- error = sosend(so, sendnam, (struct uio *)0, top,
- (struct mbuf *)0, flags);
+ error = so->so_proto->pr_usrreqs->pru_sosend(so, sendnam, 0, top, 0,
+ flags);
if (error) {
if (rep) {
log(LOG_INFO, "nfs send error %d for server %s\n",error,
@@ -533,8 +532,10 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0, &auio,
- (struct mbuf **)0, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0, &auio,
+ (struct mbuf **)0, (struct mbuf **)0,
+ &rcvflg);
if (error == EWOULDBLOCK && rep) {
if (rep->r_flags & R_SOFTTERM)
return (EINTR);
@@ -566,8 +567,9 @@ tryagain:
auio.uio_resid = len;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0,
- &auio, mp, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
+ &auio, mp, (struct mbuf **)0, &rcvflg);
} while (error == EWOULDBLOCK || error == EINTR ||
error == ERESTART);
if (!error && auio.uio_resid > 0) {
@@ -590,7 +592,8 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, (struct mbuf **)0,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
&auio, mp, &control, &rcvflg);
if (control)
m_freem(control);
@@ -632,7 +635,8 @@ errout:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, getnam, &auio, mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, getnam, &auio, mp,
(struct mbuf **)0, &rcvflg);
if (error == EWOULDBLOCK &&
(rep->r_flags & R_SOFTTERM))
@@ -1291,6 +1295,7 @@ nfs_timer(arg)
register struct nfssvc_sock *slp;
u_quad_t cur_usec;
#endif /* NFS_NOSERVER */
+ struct proc *p = &proc0; /* XXX for credentials, will break if sleep */
s = splnet();
for (rep = nfs_reqq.tqh_first; rep != 0; rep = rep->r_chain.tqe_next) {
@@ -1351,10 +1356,11 @@ nfs_timer(arg)
if ((nmp->nm_flag & NFSMNT_NOCONN) == 0)
error = (*so->so_proto->pr_usrreqs->pru_send)
(so, 0, m, (struct mbuf *)0,
- (struct mbuf *)0);
+ (struct mbuf *)0, p);
else
error = (*so->so_proto->pr_usrreqs->pru_send)
- (so, 0, m, nmp->nm_nam, (struct mbuf *)0);
+ (so, 0, m, nmp->nm_nam, (struct mbuf *)0,
+ p);
if (error) {
if (NFSIGNORE_SOERROR(nmp->nm_soflags, error))
so->so_error = 0;
@@ -1666,7 +1672,8 @@ nfsrv_rcv(so, arg, waitflag)
*/
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
if (error || mp == (struct mbuf *)0) {
if (error == EWOULDBLOCK)
slp->ns_flag |= SLP_NEEDQ;
@@ -1700,7 +1707,8 @@ nfsrv_rcv(so, arg, waitflag)
do {
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp,
(struct mbuf **)0, &flags);
if (mp) {
nfs_realign(mp, 10 * NFSX_UNSIGNED);
diff --git a/sys/nfsserver/nfs_srvsock.c b/sys/nfsserver/nfs_srvsock.c
index 86ac106..78a5773 100644
--- a/sys/nfsserver/nfs_srvsock.c
+++ b/sys/nfsserver/nfs_srvsock.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_socket.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_socket.c,v 1.22 1997/03/22 06:53:08 bde Exp $
+ * $Id: nfs_socket.c,v 1.23 1997/04/22 17:38:01 dfr Exp $
*/
/*
@@ -192,7 +192,7 @@ nfs_connect(nmp, rep)
struct sockaddr_in *sin;
struct mbuf *m;
u_short tport;
- struct proc *p = &proc0; /* only used for socreate */
+ struct proc *p = &proc0; /* only used for socreate and sobind */
nmp->nm_so = (struct socket *)0;
saddr = mtod(nmp->nm_nam, struct sockaddr *);
@@ -201,7 +201,6 @@ nfs_connect(nmp, rep)
if (error)
goto bad;
so = nmp->nm_so;
- so->so_state &= ~SS_PRIV; /* don't need it */
nmp->nm_soflags = so->so_proto->pr_flags;
/*
@@ -215,7 +214,7 @@ nfs_connect(nmp, rep)
sin->sin_addr.s_addr = INADDR_ANY;
tport = IPPORT_RESERVED - 1;
sin->sin_port = htons(tport);
- while ((error = sobind(so, m)) == EADDRINUSE &&
+ while ((error = sobind(so, m, p)) == EADDRINUSE &&
--tport > IPPORT_RESERVED / 2)
sin->sin_port = htons(tport);
m_freem(m);
@@ -233,7 +232,7 @@ nfs_connect(nmp, rep)
goto bad;
}
} else {
- error = soconnect(so, nmp->nm_nam);
+ error = soconnect(so, nmp->nm_nam, p);
if (error)
goto bad;
@@ -282,13 +281,13 @@ nfs_connect(nmp, rep)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
sndreserve = (nmp->nm_wsize + NFS_MAXPKTHDR + sizeof (u_long))
* 2;
@@ -414,8 +413,8 @@ nfs_send(so, nam, top, rep)
else
flags = 0;
- error = sosend(so, sendnam, (struct uio *)0, top,
- (struct mbuf *)0, flags);
+ error = so->so_proto->pr_usrreqs->pru_sosend(so, sendnam, 0, top, 0,
+ flags);
if (error) {
if (rep) {
log(LOG_INFO, "nfs send error %d for server %s\n",error,
@@ -533,8 +532,10 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0, &auio,
- (struct mbuf **)0, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0, &auio,
+ (struct mbuf **)0, (struct mbuf **)0,
+ &rcvflg);
if (error == EWOULDBLOCK && rep) {
if (rep->r_flags & R_SOFTTERM)
return (EINTR);
@@ -566,8 +567,9 @@ tryagain:
auio.uio_resid = len;
do {
rcvflg = MSG_WAITALL;
- error = soreceive(so, (struct mbuf **)0,
- &auio, mp, (struct mbuf **)0, &rcvflg);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
+ &auio, mp, (struct mbuf **)0, &rcvflg);
} while (error == EWOULDBLOCK || error == EINTR ||
error == ERESTART);
if (!error && auio.uio_resid > 0) {
@@ -590,7 +592,8 @@ tryagain:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, (struct mbuf **)0,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, (struct mbuf **)0,
&auio, mp, &control, &rcvflg);
if (control)
m_freem(control);
@@ -632,7 +635,8 @@ errout:
auio.uio_procp = p;
do {
rcvflg = 0;
- error = soreceive(so, getnam, &auio, mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, getnam, &auio, mp,
(struct mbuf **)0, &rcvflg);
if (error == EWOULDBLOCK &&
(rep->r_flags & R_SOFTTERM))
@@ -1291,6 +1295,7 @@ nfs_timer(arg)
register struct nfssvc_sock *slp;
u_quad_t cur_usec;
#endif /* NFS_NOSERVER */
+ struct proc *p = &proc0; /* XXX for credentials, will break if sleep */
s = splnet();
for (rep = nfs_reqq.tqh_first; rep != 0; rep = rep->r_chain.tqe_next) {
@@ -1351,10 +1356,11 @@ nfs_timer(arg)
if ((nmp->nm_flag & NFSMNT_NOCONN) == 0)
error = (*so->so_proto->pr_usrreqs->pru_send)
(so, 0, m, (struct mbuf *)0,
- (struct mbuf *)0);
+ (struct mbuf *)0, p);
else
error = (*so->so_proto->pr_usrreqs->pru_send)
- (so, 0, m, nmp->nm_nam, (struct mbuf *)0);
+ (so, 0, m, nmp->nm_nam, (struct mbuf *)0,
+ p);
if (error) {
if (NFSIGNORE_SOERROR(nmp->nm_soflags, error))
so->so_error = 0;
@@ -1666,7 +1672,8 @@ nfsrv_rcv(so, arg, waitflag)
*/
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp, (struct mbuf **)0, &flags);
if (error || mp == (struct mbuf *)0) {
if (error == EWOULDBLOCK)
slp->ns_flag |= SLP_NEEDQ;
@@ -1700,7 +1707,8 @@ nfsrv_rcv(so, arg, waitflag)
do {
auio.uio_resid = 1000000000;
flags = MSG_DONTWAIT;
- error = soreceive(so, &nam, &auio, &mp,
+ error = so->so_proto->pr_usrreqs->pru_soreceive
+ (so, &nam, &auio, &mp,
(struct mbuf **)0, &flags);
if (mp) {
nfs_realign(mp, 10 * NFSX_UNSIGNED);
diff --git a/sys/nfsserver/nfs_syscalls.c b/sys/nfsserver/nfs_syscalls.c
index 396dff8..75d43c2 100644
--- a/sys/nfsserver/nfs_syscalls.c
+++ b/sys/nfsserver/nfs_syscalls.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* @(#)nfs_syscalls.c 8.5 (Berkeley) 3/30/95
- * $Id: nfs_syscalls.c,v 1.19 1997/03/22 06:53:11 bde Exp $
+ * $Id: nfs_syscalls.c,v 1.20 1997/03/27 20:01:07 guido Exp $
*/
#include <sys/param.h>
@@ -105,7 +105,8 @@ static int notstarted = 1;
static int modify_flag = 0;
static void nfsd_rt __P((int sotype, struct nfsrv_descript *nd,
int cacherep));
-static int nfssvc_addsock __P((struct file *,struct mbuf *));
+static int nfssvc_addsock __P((struct file *, struct mbuf *,
+ struct proc *));
static int nfssvc_nfsd __P((struct nfsd_srvargs *,caddr_t,struct proc *));
static int nfs_privport = 0;
@@ -246,7 +247,7 @@ nfssvc(p, uap, retval)
if (error)
return (error);
}
- error = nfssvc_addsock(fp, nam);
+ error = nfssvc_addsock(fp, nam, p);
} else {
error = copyin(uap->argp, (caddr_t)nsd, sizeof (*nsd));
if (error)
@@ -350,9 +351,10 @@ nfssvc(p, uap, retval)
* Adds a socket to the list for servicing by nfsds.
*/
static int
-nfssvc_addsock(fp, mynam)
+nfssvc_addsock(fp, mynam, p)
struct file *fp;
struct mbuf *mynam;
+ struct proc *p;
{
register struct mbuf *m;
register int siz;
@@ -400,14 +402,14 @@ nfssvc_addsock(fp, mynam)
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m);
+ sosetopt(so, SOL_SOCKET, SO_KEEPALIVE, m, p);
}
if (so->so_proto->pr_domain->dom_family == AF_INET &&
so->so_proto->pr_protocol == IPPROTO_TCP) {
MGET(m, M_WAIT, MT_SOOPTS);
*mtod(m, int *) = 1;
m->m_len = sizeof(int);
- sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m);
+ sosetopt(so, IPPROTO_TCP, TCP_NODELAY, m, p);
}
so->so_rcv.sb_flags &= ~SB_NOINTR;
so->so_rcv.sb_timeo = 0;
diff --git a/sys/sys/protosw.h b/sys/sys/protosw.h
index ab4590c..39879e5 100644
--- a/sys/sys/protosw.h
+++ b/sys/sys/protosw.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)protosw.h 8.1 (Berkeley) 6/2/93
- * $Id: protosw.h,v 1.15 1997/02/22 09:45:42 peter Exp $
+ * $Id: protosw.h,v 1.16 1997/03/14 16:51:28 wollman Exp $
*/
#ifndef _SYS_PROTOSW_H_
@@ -81,12 +81,10 @@ struct protosw {
void (*pr_ctlinput)__P((int, struct sockaddr *, void *));
/* control input (from below) */
int (*pr_ctloutput)__P((int, struct socket *, int, int,
- struct mbuf **));
+ struct mbuf **, struct proc *));
/* control output (from above) */
/* user-protocol hook */
- int (*pr_ousrreq) __P((struct socket *, int, struct mbuf *,
- struct mbuf *, struct mbuf *));
- /* user request: see list below */
+ void *pr_ousrreq;
/* utility hooks */
void (*pr_init) __P((void)); /* initialization hook */
void (*pr_fasttimo) __P((void));
@@ -172,28 +170,32 @@ char *prurequests[] = {
/*
* If the ordering here looks odd, that's because it's alphabetical.
- * Having this structure separated out from the main protoswitch is actually
+ * Having this structure separated out from the main protoswitch is allegedly
* a big (12 cycles per call) lose on high-end CPUs. We will eventually
* migrate this stuff back into the main structure.
*/
struct pr_usrreqs {
int (*pru_abort) __P((struct socket *so));
int (*pru_accept) __P((struct socket *so, struct mbuf *nam));
- int (*pru_attach) __P((struct socket *so, int proto));
- int (*pru_bind) __P((struct socket *so, struct mbuf *nam));
- int (*pru_connect) __P((struct socket *so, struct mbuf *nam));
+ int (*pru_attach) __P((struct socket *so, int proto,
+ struct proc *p));
+ int (*pru_bind) __P((struct socket *so, struct mbuf *nam,
+ struct proc *p));
+ int (*pru_connect) __P((struct socket *so, struct mbuf *nam,
+ struct proc *p));
int (*pru_connect2) __P((struct socket *so1, struct socket *so2));
int (*pru_control) __P((struct socket *so, int cmd, caddr_t data,
- struct ifnet *ifp));
+ struct ifnet *ifp, struct proc *p));
int (*pru_detach) __P((struct socket *so));
int (*pru_disconnect) __P((struct socket *so));
- int (*pru_listen) __P((struct socket *so));
+ int (*pru_listen) __P((struct socket *so, struct proc *p));
int (*pru_peeraddr) __P((struct socket *so, struct mbuf *nam));
int (*pru_rcvd) __P((struct socket *so, int flags));
int (*pru_rcvoob) __P((struct socket *so, struct mbuf *m,
int flags));
int (*pru_send) __P((struct socket *so, int flags, struct mbuf *m,
- struct mbuf *addr, struct mbuf *control));
+ struct mbuf *addr, struct mbuf *control,
+ struct proc *p));
#define PRUS_OOB 0x1
#define PRUS_EOF 0x2
int (*pru_sense) __P((struct socket *so, struct stat *sb));
@@ -201,9 +203,12 @@ struct pr_usrreqs {
int (*pru_sockaddr) __P((struct socket *so, struct mbuf *nam));
/*
- * These two added later, so they are out of order. They are used
+ * These three added later, so they are out of order. They are used
* for shortcutting (fast path input/output) in some protocols.
* XXX - that's a lie, they are not implemented yet
+ * Rather than calling sosend() etc. directly, calls are made
+ * through these entry points. For protocols which still use
+ * the generic code, these just point to those routines.
*/
int (*pru_sosend) __P((struct socket *so, struct mbuf *addr,
struct uio *uio, struct mbuf *top,
@@ -211,26 +216,19 @@ struct pr_usrreqs {
int (*pru_soreceive) __P((struct socket *so, struct mbuf **paddr,
struct uio *uio, struct mbuf **mp0,
struct mbuf **controlp, int *flagsp));
+ int (*pru_soselect) __P((struct socket *so, int which,
+ struct proc *p));
};
int pru_accept_notsupp __P((struct socket *so, struct mbuf *nam));
int pru_connect2_notsupp __P((struct socket *so1, struct socket *so2));
-int pru_listen_notsupp __P((struct socket *so));
+int pru_control_notsupp __P((struct socket *so, int cmd, caddr_t data,
+ struct ifnet *ifp, struct proc *p));
+int pru_listen_notsupp __P((struct socket *so, struct proc *p));
int pru_rcvd_notsupp __P((struct socket *so, int flags));
int pru_rcvoob_notsupp __P((struct socket *so, struct mbuf *m, int flags));
int pru_sense_null __P((struct socket *so, struct stat *sb));
-#define PRU_OLDSTYLE
-
-#ifdef PRU_OLDSTYLE
-/*
- * Protocols which don't yet implement pr_usrreqs can point it to this
- * structure, which will call the old pr_usrreq() entry point with the
- * appropriate arguments.
- */
-extern struct pr_usrreqs pru_oldstyle;
-#endif /* PRU_OLDSTYLE */
-
#endif /* KERNEL */
/*
@@ -279,7 +277,7 @@ char *prcrequests[] = {
/*
* The arguments to ctloutput are:
- * (*protosw[].pr_ctloutput)(req, so, level, optname, optval);
+ * (*protosw[].pr_ctloutput)(req, so, level, optname, optval, p);
* req is one of the actions listed below, so is a (struct socket *),
* level is an indication of which protocol layer the option is intended.
* optname is a protocol dependent socket option request,
diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h
index 6287013..39aab67 100644
--- a/sys/sys/socketvar.h
+++ b/sys/sys/socketvar.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)socketvar.h 8.3 (Berkeley) 2/19/95
- * $Id$
+ * $Id: socketvar.h,v 1.18 1997/02/22 09:45:56 peter Exp $
*/
#ifndef _SYS_SOCKETVAR_H_
@@ -115,7 +115,7 @@ struct socket {
#define SS_CANTRCVMORE 0x0020 /* can't receive more data from peer */
#define SS_RCVATMARK 0x0040 /* at mark on input */
-#define SS_PRIV 0x0080 /* privileged for broadcast, raw... */
+/*efine SS_PRIV 0x0080 privileged for broadcast, raw... */
#define SS_NBIO 0x0100 /* non-blocking ops */
#define SS_ASYNC 0x0200 /* async i/o notify */
#define SS_ISCONFIRMING 0x0400 /* deciding to accept connection req */
@@ -241,24 +241,24 @@ int sbwait __P((struct sockbuf *sb));
int sb_lock __P((struct sockbuf *sb));
int soabort __P((struct socket *so));
int soaccept __P((struct socket *so, struct mbuf *nam));
-int sobind __P((struct socket *so, struct mbuf *nam));
+int sobind __P((struct socket *so, struct mbuf *nam, struct proc *p));
void socantrcvmore __P((struct socket *so));
void socantsendmore __P((struct socket *so));
int soclose __P((struct socket *so));
-int soconnect __P((struct socket *so, struct mbuf *nam));
+int soconnect __P((struct socket *so, struct mbuf *nam, struct proc *p));
int soconnect2 __P((struct socket *so1, struct socket *so2));
int socreate __P((int dom, struct socket **aso, int type, int proto,
struct proc *p));
int sodisconnect __P((struct socket *so));
void sofree __P((struct socket *so));
int sogetopt __P((struct socket *so, int level, int optname,
- struct mbuf **mp));
+ struct mbuf **mp, struct proc *p));
void sohasoutofband __P((struct socket *so));
void soisconnected __P((struct socket *so));
void soisconnecting __P((struct socket *so));
void soisdisconnected __P((struct socket *so));
void soisdisconnecting __P((struct socket *so));
-int solisten __P((struct socket *so, int backlog));
+int solisten __P((struct socket *so, int backlog, struct proc *p));
struct socket *
sodropablereq __P((struct socket *head));
struct socket *
@@ -267,10 +267,11 @@ int soreceive __P((struct socket *so, struct mbuf **paddr, struct uio *uio,
struct mbuf **mp0, struct mbuf **controlp, int *flagsp));
int soreserve __P((struct socket *so, u_long sndcc, u_long rcvcc));
void sorflush __P((struct socket *so));
+int soselect __P((struct socket *so, int which, struct proc *p));
int sosend __P((struct socket *so, struct mbuf *addr, struct uio *uio,
struct mbuf *top, struct mbuf *control, int flags));
int sosetopt __P((struct socket *so, int level, int optname,
- struct mbuf *m0));
+ struct mbuf *m0, struct proc *p));
int soshutdown __P((struct socket *so, int how));
void sowakeup __P((struct socket *so, struct sockbuf *sb));
#endif /* KERNEL */
diff --git a/sys/sys/un.h b/sys/sys/un.h
index 53bfcb9..74870a3 100644
--- a/sys/sys/un.h
+++ b/sys/sys/un.h
@@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)un.h 8.3 (Berkeley) 2/19/95
- * $Id$
+ * $Id: un.h,v 1.11 1997/02/22 09:46:20 peter Exp $
*/
#ifndef _SYS_UN_H_
@@ -58,6 +58,7 @@ int uipc_usrreq __P((struct socket *so, int req, struct mbuf *m,
int unp_connect2 __P((struct socket *so, struct socket *so2));
void unp_dispose __P((struct mbuf *m));
int unp_externalize __P((struct mbuf *rights));
+extern struct pr_usrreqs uipc_usrreqs;
#else /* !KERNEL */
/* actual length of an initialized sockaddr_un */
OpenPOWER on IntegriCloud