diff options
Diffstat (limited to 'sys')
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 */ |