Skip site navigation (1)Skip section navigation (2)
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>