On Fri, 13 Dec 2002, Kelly Yancey wrote: > Actually, as a follow-up to my own question, I don't see how the > splnet()/splx() calls in rtsock.c are necessary at all as all of the pru_* > hooks are called at splnet(). Being that rtsock's pru_* hooks are called at > splnet(), is there any reason not to just extern the various raw_* pru hooks > and reference them directly from route_usrreqs? > > Kelly
For a better idea of what I am talking about, a diff against 4.7 is attached. I've confirmed that it compiles and will leave a machine running with this patch up over the weekend. Any comments would be appreciated, Kelly -- Kelly Yancey -- kbyanc@{posi.net,FreeBSD.org} FreeBSD, The Power To Serve: http://www.freebsd.org/
Index: raw_cb.h =================================================================== RCS file: /home/cvs/acs/base/src/sys/net/raw_cb.h,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 raw_cb.h --- raw_cb.h 22 Mar 2002 04:11:00 -0000 1.1.1.1 +++ raw_cb.h 14 Dec 2002 04:17:55 -0000 @@ -71,6 +71,19 @@ void raw_input __P((struct mbuf *, struct sockproto *, struct sockaddr *, struct sockaddr *)); extern struct pr_usrreqs raw_usrreqs; + +int raw_uabort __P((struct socket *)); +int raw_uattach __P((struct socket *, int, struct proc *)); +int raw_ubind __P((struct socket *, struct sockaddr *, struct proc *)); +int raw_uconnect __P((struct socket *, struct sockaddr *, struct proc *)); +int raw_udetach __P((struct socket *)); +int raw_udisconnect __P((struct socket *)); +int raw_upeeraddr __P((struct socket *, struct sockaddr **)); +int raw_usend __P((struct socket *, int, struct mbuf *, struct sockaddr *, + struct mbuf *, struct proc *)); +int raw_ushutdown __P((struct socket *)); +int raw_usockaddr __P((struct socket *, struct sockaddr **)); + #endif #endif Index: raw_usrreq.c =================================================================== RCS file: /home/cvs/acs/base/src/sys/net/raw_usrreq.c,v retrieving revision 1.1.1.1 diff -u -p -r1.1.1.1 raw_usrreq.c --- raw_usrreq.c 22 Mar 2002 04:11:00 -0000 1.1.1.1 +++ raw_usrreq.c 14 Dec 2002 04:17:55 -0000 @@ -135,7 +135,7 @@ raw_ctlinput(cmd, arg, dummy) /* INCOMPLETE */ } -static int +int raw_uabort(struct socket *so) { struct rawcb *rp = sotorawcb(so); @@ -150,7 +150,7 @@ raw_uabort(struct socket *so) /* pru_accept is EOPNOTSUPP */ -static int +int raw_uattach(struct socket *so, int proto, struct proc *p) { struct rawcb *rp = sotorawcb(so); @@ -163,13 +163,13 @@ raw_uattach(struct socket *so, int proto return raw_attach(so, proto); } -static int +int raw_ubind(struct socket *so, struct sockaddr *nam, struct proc *p) { return EINVAL; } -static int +int raw_uconnect(struct socket *so, struct sockaddr *nam, struct proc *p) { return EINVAL; @@ -178,7 +178,7 @@ raw_uconnect(struct socket *so, struct s /* pru_connect2 is EOPNOTSUPP */ /* pru_control is EOPNOTSUPP */ -static int +int raw_udetach(struct socket *so) { struct rawcb *rp = sotorawcb(so); @@ -190,7 +190,7 @@ raw_udetach(struct socket *so) return 0; } -static int +int raw_udisconnect(struct socket *so) { struct rawcb *rp = sotorawcb(so); @@ -207,7 +207,7 @@ raw_udisconnect(struct socket *so) /* pru_listen is EOPNOTSUPP */ -static int +int raw_upeeraddr(struct socket *so, struct sockaddr **nam) { struct rawcb *rp = sotorawcb(so); @@ -224,7 +224,7 @@ raw_upeeraddr(struct socket *so, struct /* pru_rcvd is EOPNOTSUPP */ /* pru_rcvoob is EOPNOTSUPP */ -static int +int raw_usend(struct socket *so, int flags, struct mbuf *m, struct sockaddr *nam, struct mbuf *control, struct proc *p) { @@ -267,7 +267,7 @@ release: /* pru_sense is null */ -static int +int raw_ushutdown(struct socket *so) { struct rawcb *rp = sotorawcb(so); @@ -278,7 +278,7 @@ raw_ushutdown(struct socket *so) return 0; } -static int +int raw_usockaddr(struct socket *so, struct sockaddr **nam) { struct rawcb *rp = sotorawcb(so); Index: rtsock.c =================================================================== RCS file: /home/cvs/acs/base/src/sys/net/rtsock.c,v retrieving revision 1.1.1.2 diff -u -p -r1.1.1.2 rtsock.c --- rtsock.c 23 Aug 2002 04:10:27 -0000 1.1.1.2 +++ rtsock.c 14 Dec 2002 04:17:55 -0000 @@ -88,15 +88,6 @@ static void rt_setmetrics __P((u_long, * 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 */ @@ -150,26 +141,6 @@ rts_attach(struct socket *so, int proto, return 0; } -static int -rts_bind(struct socket *so, struct sockaddr *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 sockaddr *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 */ @@ -202,69 +173,16 @@ rts_detach(struct socket *so) return error; } -static int -rts_disconnect(struct socket *so) -{ - int s, error; - s = splnet(); - error = raw_usrreqs.pru_disconnect(so); - splx(s); - return error; -} - /* pru_listen is EOPNOTSUPP */ - -static int -rts_peeraddr(struct socket *so, struct sockaddr **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 sockaddr *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 sockaddr **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, + raw_uabort, pru_accept_notsupp, rts_attach, raw_ubind, raw_uconnect, + pru_connect2_notsupp, pru_control_notsupp, rts_detach, raw_udisconnect, + pru_listen_notsupp, raw_upeeraddr, pru_rcvd_notsupp, pru_rcvoob_notsupp, + raw_usend, pru_sense_null, raw_ushutdown, raw_usockaddr, sosend, soreceive, sopoll };