Date: Fri, 13 Dec 2002 20:21:48 -0800 (PST) From: Kelly Yancey <kbyanc@posi.net> To: net@FreeBSD.org Subject: Re: Raw sockets and splnet() Message-ID: <20021213201926.A33726-200000@gateway.posi.net> In-Reply-To: <20021213194809.N33726-100000@gateway.posi.net>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
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/
[-- Attachment #2 --]
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
};
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021213201926.A33726-200000>
