Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 2 Jan 2005 16:06:54 GMT
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 68159 for review
Message-ID:  <200501021606.j02G6scf019454@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=68159

Change 68159 by rwatson@rwatson_zoo on 2005/01/02 16:06:37

	Integrate netperf_socket from FreeBSD CVS HEAD:
	
	Loop back towards rwatson_netperf:
	
	- Whitespace/style fixes for netipx.
	- Use M_WAITOK in ipx_setpeeraddr() so that it can't fail.
	- Remove extraneous ipxpcb list head extern left over from the
	  previous world order.
	- Clean up ipx_input() return case for sbappendaddr() failing.
	- Use __packed for SPX packet headers.
	- Use KASSERT() in preference to if()panic(). 
	- Compare pointers with NULL, not 0.
	- Hold the socket buffer locks over longer periods of time in various   
	  SPX routines, increasing atomicity and reducing the number of
	  locking operations.  Particularly, in spx_reass() and spx_rcvoob().
	- Clearly mark the call to spx_close() in spx_reass() as broken.
	- Don't cast NULL.
	- Fix bug relating to spx_timers() returning NULL due to an SPX
	  connection timing out.

Affected files ...

.. //depot/projects/netperf_socket/sys/netipx/README#2 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx.c#3 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_cksum.c#3 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_if.h#2 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_input.c#4 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_ip.c#3 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_pcb.c#8 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_pcb.h#3 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_proto.c#2 integrate
.. //depot/projects/netperf_socket/sys/netipx/ipx_usrreq.c#7 integrate
.. //depot/projects/netperf_socket/sys/netipx/spx.h#2 integrate
.. //depot/projects/netperf_socket/sys/netipx/spx_usrreq.c#11 integrate

Differences ...

==== //depot/projects/netperf_socket/sys/netipx/README#2 (text+ko) ====

@@ -1,4 +1,4 @@
-$FreeBSD: src/sys/netipx/README,v 1.2 2000/05/01 20:14:29 peter Exp $
+$FreeBSD: src/sys/netipx/README,v 1.3 2005/01/02 15:10:02 rwatson Exp $
 
 This protocol implements IPX/SPX over Ethernet_II frame type 0x8137.
 Please note: the SPX implementation may require further work and testing
@@ -19,5 +19,6 @@
 Copyright (c) 1984, 1985, 1986, 1987, 1993
 The Regents of the University of California.  All rights reserved.
 
+Modifications Copyright (c) 2004, Robert N. M. Watson
 Modifications Copyright (c) 1995, Mike Mitchell
 Modifications Copyright (c) 1995, John Hay

==== //depot/projects/netperf_socket/sys/netipx/ipx.c#3 (text+ko) ====

@@ -30,12 +30,12 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- * 
+ *
  *	@(#)ipx.c
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx.c,v 1.27 2004/08/28 15:24:53 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx.c,v 1.28 2005/01/02 15:13:59 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -204,7 +204,7 @@
 		}
 		IFAFREE((&oia->ia_ifa));
 		return (0);
-	
+
 	case SIOCAIFADDR:
 		dstIsNew = 0;
 		hostIsNew = 1;
@@ -241,7 +241,7 @@
 static void
 ipx_ifscrub(ifp, ia)
 	register struct ifnet *ifp;
-	register struct ipx_ifaddr *ia; 
+	register struct ipx_ifaddr *ia;
 {
 	if (ia->ia_flags & IFA_ROUTE) {
 		if (ifp->if_flags & IFF_POINTOPOINT) {

==== //depot/projects/netperf_socket/sys/netipx/ipx_cksum.c#3 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_cksum.c,v 1.11 2004/07/28 06:58:23 kan Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_cksum.c,v 1.12 2005/01/02 15:13:59 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/mbuf.h>
@@ -100,7 +100,7 @@
 			w++;
 			if (--len == 0)
 				break;
-		} 
+		}
 	}
 
 	ipx->ipx_tc = oldtc;

==== //depot/projects/netperf_socket/sys/netipx/ipx_if.h#2 (text+ko) ====

@@ -30,10 +30,10 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- * 
+ *
  *	@(#)ipx_if.h
  *
- * $FreeBSD: src/sys/netipx/ipx_if.h,v 1.13 2003/03/04 23:19:53 jlemon Exp $
+ * $FreeBSD: src/sys/netipx/ipx_if.h,v 1.14 2005/01/02 15:13:59 rwatson Exp $
  */
 
 #ifndef _NETIPX_IPX_IF_H_

==== //depot/projects/netperf_socket/sys/netipx/ipx_input.c#4 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_input.c,v 1.40 2005/01/02 01:39:37 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_input.c,v 1.41 2005/01/02 15:13:59 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -215,7 +215,7 @@
 			 */
 			for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
 				if((ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif) &&
-				   ipx_neteq(ia->ia_addr.sipx_addr, 
+				   ipx_neteq(ia->ia_addr.sipx_addr,
 					     ipx->ipx_dna))
 					goto ours;
 
@@ -484,8 +484,8 @@
 				if (ifp == ia->ia_ifp)
 					break;
 			if (ia == NULL)
-				ipx->ipx_sna.x_host = ipx_zerohost;  
-			else 
+				ipx->ipx_sna.x_host = ipx_zerohost;
+			else
 				ipx->ipx_sna.x_host =
 				    ia->ia_addr.sipx_addr.x_host;
 

==== //depot/projects/netperf_socket/sys/netipx/ipx_ip.c#3 (text+ko) ====

@@ -30,12 +30,12 @@
  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
- * 
+ *
  *	@(#)ipx_ip.c
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_ip.c,v 1.37 2005/01/02 01:39:38 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_ip.c,v 1.38 2005/01/02 15:13:59 rwatson Exp $");
 
 /*
  * Software interface driver for encapsulating IPX in IP.
@@ -346,7 +346,7 @@
 		register struct in_ifaddr *ia;
 		struct ifnet *ifp = ro.ro_rt->rt_ifp;
 
-		for (ia = TAILQ_FIRST(&in_ifaddrhead); ia != NULL; 
+		for (ia = TAILQ_FIRST(&in_ifaddrhead); ia != NULL;
 		     ia = TAILQ_NEXT(ia, ia_link))
 			if (ia->ia_ifp == ifp)
 				break;
@@ -385,7 +385,7 @@
 			(struct ifnet *)ifn, sopt->sopt_td);
 
 	/* use any of our addresses */
-	satoipx_addr(ifr_ipxip.ifr_addr).x_host = 
+	satoipx_addr(ifr_ipxip.ifr_addr).x_host =
 			ipx_ifaddr->ia_addr.sipx_addr.x_host;
 
 	return (ipx_control(so, (int)SIOCSIFADDR, (caddr_t)&ifr_ipxip,

==== //depot/projects/netperf_socket/sys/netipx/ipx_pcb.c#8 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_pcb.c,v 1.37 2005/01/02 01:51:18 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_pcb.c,v 1.39 2005/01/02 15:25:59 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -53,7 +53,7 @@
 #include <netipx/ipx_var.h>
 
 static struct	ipx_addr zeroipx_addr;
-static u_short	ipxpcb_lport_cache;  
+static u_short	ipxpcb_lport_cache;
 
 int
 ipx_pcballoc(so, head, td)
@@ -73,7 +73,7 @@
 	so->so_pcb = (caddr_t)ipxp;
 	return (0);
 }
-	
+
 int
 ipx_pcbbind(ipxp, nam, td)
 	register struct ipxpcb *ipxp;
@@ -185,7 +185,7 @@
 		    rtalloc_ign(ro, 0);
 	}
 	if (ipx_neteqnn(ipxp->ipxp_laddr.x_net, ipx_zeronet)) {
-		/* 
+		/*
 		 * If route is known or can be allocated now,
 		 * our src addr is taken from the i/f, else punt.
 		 */
@@ -214,7 +214,7 @@
 		ipxp->ipxp_laddr.x_net = satoipx_addr(ia->ia_addr).x_net;
 	}
 	if (ipx_nullhost(ipxp->ipxp_laddr)) {
-		/* 
+		/*
 		 * If route is known or can be allocated now,
 		 * our src addr is taken from the i/f, else punt.
 		 */
@@ -286,7 +286,7 @@
 	struct sockaddr **nam;
 {
 	struct sockaddr_ipx *sipx, ssipx;
-	
+
 	sipx = &ssipx;
 	bzero((caddr_t)sipx, sizeof(*sipx));
 	sipx->sipx_len = sizeof(*sipx);
@@ -303,11 +303,11 @@
 	struct sockaddr_ipx *sipx, ssipx;
 	
 	sipx = &ssipx;
-	bzero((caddr_t)sipx, sizeof(*sipx));
+	bzero(sipx, sizeof(*sipx));
 	sipx->sipx_len = sizeof(*sipx);
 	sipx->sipx_family = AF_IPX;
 	sipx->sipx_addr = ipxp->ipxp_faddr;
-	*nam = sodupsockaddr((struct sockaddr *)sipx, M_NOWAIT);
+	*nam = sodupsockaddr((struct sockaddr *)sipx, M_WAITOK);
 }
 
 struct ipxpcb *

==== //depot/projects/netperf_socket/sys/netipx/ipx_pcb.h#3 (text+ko) ====

@@ -34,7 +34,7 @@
  *
  *	@(#)ipx_pcb.h
  *
- * $FreeBSD: src/sys/netipx/ipx_pcb.h,v 1.20 2004/12/30 17:49:40 rwatson Exp $
+ * $FreeBSD: src/sys/netipx/ipx_pcb.h,v 1.21 2005/01/02 15:16:35 rwatson Exp $
  */
 
 #ifndef _NETIPX_IPX_PCB_H_
@@ -85,8 +85,6 @@
 #define	IPXRCVQ		40960
 
 #ifdef _KERNEL
-extern struct ipxpcb ipxpcb;			/* head of list */
-
 int	ipx_pcballoc(struct socket *so, struct ipxpcbhead *head,
 			  struct thread *p);
 int	ipx_pcbbind(struct ipxpcb *ipxp, struct sockaddr *nam,

==== //depot/projects/netperf_socket/sys/netipx/ipx_proto.c#2 (text+ko) ====

@@ -35,7 +35,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_proto.c,v 1.17 2003/06/11 05:25:14 obrien Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_proto.c,v 1.18 2005/01/02 15:13:59 rwatson Exp $");
 
 #include "opt_ipx.h"
 
@@ -94,7 +94,7 @@
 };
 
 static struct	domain ipxdomain =
-    { AF_IPX, "network systems", 0, 0, 0, 
+    { AF_IPX, "network systems", 0, 0, 0,
       ipxsw, &ipxsw[sizeof(ipxsw)/sizeof(ipxsw[0])], 0,
       rn_inithead, 16, sizeof(struct sockaddr_ipx)};
 

==== //depot/projects/netperf_socket/sys/netipx/ipx_usrreq.c#7 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/ipx_usrreq.c,v 1.44 2004/12/31 17:05:37 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/ipx_usrreq.c,v 1.48 2005/01/02 15:29:29 rwatson Exp $");
 
 #include "opt_ipx.h"
 
@@ -82,7 +82,7 @@
 static	int ipx_detach(struct socket *so);
 static	int ipx_disconnect(struct socket *so);
 static	int ipx_send(struct socket *so, int flags, struct mbuf *m,
-		     struct sockaddr *addr, struct mbuf *control, 
+		     struct sockaddr *addr, struct mbuf *control,
 		     struct thread *td);
 static	int ipx_shutdown(struct socket *so);
 static	int ripx_attach(struct socket *so, int proto, struct thread *td);
@@ -128,8 +128,7 @@
 	struct ifnet *ifp = m->m_pkthdr.rcvif;
 	struct sockaddr_ipx ipx_ipx;
 
-	if (ipxp == NULL)
-		panic("No ipxpcb");
+	KASSERT(ipxp != NULL, ("ipx_input: NUL ipxpcb"));
 	/*
 	 * Construct sockaddr format source address.
 	 * Stuff source address and datagram in user buffer.
@@ -142,7 +141,7 @@
 	if (ipx_neteqnn(ipx->ipx_sna.x_net, ipx_zeronet) && ifp != NULL) {
 		register struct ifaddr *ifa;
 
-		for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa != NULL; 
+		for (ifa = TAILQ_FIRST(&ifp->if_addrhead); ifa != NULL;
 		     ifa = TAILQ_NEXT(ifa, ifa_link)) {
 			if (ifa->ifa_addr->sa_family == AF_IPX) {
 				ipx_ipx.sipx_addr.x_net =
@@ -152,18 +151,16 @@
 		}
 	}
 	ipxp->ipxp_rpt = ipx->ipx_pt;
-	if (!(ipxp->ipxp_flags & IPXP_RAWIN) ) {
+	if ((ipxp->ipxp_flags & IPXP_RAWIN) == 0) {
 		m->m_len -= sizeof(struct ipx);
 		m->m_pkthdr.len -= sizeof(struct ipx);
 		m->m_data += sizeof(struct ipx);
 	}
-	if (sbappendaddr(&ipxp->ipxp_socket->so_rcv, (struct sockaddr *)&ipx_ipx,
-	    m, (struct mbuf *)NULL) == 0)
-		goto bad;
-	sorwakeup(ipxp->ipxp_socket);
-	return;
-bad:
-	m_freem(m);
+	if (sbappendaddr(&ipxp->ipxp_socket->so_rcv,
+	    (struct sockaddr *)&ipx_ipx, m, NULL) == 0)
+		m_freem(m);
+	else
+		sorwakeup(ipxp->ipxp_socket);
 }
 
 void
@@ -225,7 +222,7 @@
 	/*
 	 * Make sure packet is actually of even length.
 	 */
-	
+
 	if (len & 1) {
 		m = mprev;
 		if ((m->m_flags & M_EXT) == 0 &&
@@ -308,7 +305,7 @@
 						&satoipx_addr(ro->ro_dst);
 				dst->x_host = ipx->ipx_dna.x_host;
 			}
-			/* 
+			/*
 			 * Otherwise, we go through the same gateway
 			 * and dst is already set up.
 			 */
@@ -351,7 +348,7 @@
 		case SO_IPX_CHECKSUM:
 			mask = IPXP_CHECKSUM;
 			goto get_flags;
-			
+
 		case SO_HEADERS_ON_OUTPUT:
 			mask = IPXP_RAWOUT;
 		get_flags:
@@ -370,7 +367,7 @@
 			break;
 
 		case SO_SEQNO:
-			error = sooptcopyout(sopt, &ipx_pexseq, 
+			error = sooptcopyout(sopt, &ipx_pexseq,
 					     sizeof ipx_pexseq);
 			ipx_pexseq++;
 			break;
@@ -532,7 +529,7 @@
 {
 	struct ipxpcb *ipxp = sotoipxpcb(so);
 
-	ipx_setpeeraddr(ipxp, nam); /* XXX what if alloc fails? */
+	ipx_setpeeraddr(ipxp, nam);
 	return (0);
 }
 
@@ -600,7 +597,7 @@
 {
 	struct ipxpcb *ipxp = sotoipxpcb(so);
 
-	ipx_setsockaddr(ipxp, nam); /* XXX what if alloc fails? */
+	ipx_setsockaddr(ipxp, nam);
 	return (0);
 }
 

==== //depot/projects/netperf_socket/sys/netipx/spx.h#2 (text+ko) ====

@@ -33,7 +33,7 @@
  *
  *	@(#)spx.h
  *
- * $FreeBSD: src/sys/netipx/spx.h,v 1.17 2002/03/20 02:39:13 alfred Exp $
+ * $FreeBSD: src/sys/netipx/spx.h,v 1.18 2005/01/02 15:06:47 rwatson Exp $
  */
 
 #ifndef _NETIPX_SPX_H_
@@ -55,7 +55,7 @@
 	u_short	spx_seq;	/* sequence number */
 	u_short	spx_ack;	/* acknowledge number */
 	u_short	spx_alo;	/* allocation number */
-};
+} __packed;
 
 /*
  * Definitions for NS(tm) Internet Datagram Protocol
@@ -64,7 +64,7 @@
 struct spx {
 	struct ipx	si_i;
 	struct spxhdr 	si_s;
-};
+} __packed;
 struct spx_q {
 	struct spx_q	*si_next;
 	struct spx_q	*si_prev;

==== //depot/projects/netperf_socket/sys/netipx/spx_usrreq.c#11 (text+ko) ====

@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/netipx/spx_usrreq.c,v 1.50 2004/12/31 17:05:37 rwatson Exp $");
+__FBSDID("$FreeBSD: src/sys/netipx/spx_usrreq.c,v 1.58 2005/01/02 15:38:47 rwatson Exp $");
 
 #include <sys/param.h>
 #include <sys/lock.h>
@@ -74,9 +74,9 @@
 static struct	spx_istat spx_istat;
 
 /* Following was struct spxstat spxstat; */
-#ifndef spxstat 
+#ifndef spxstat
 #define spxstat spx_istat.newstats
-#endif  
+#endif
 
 static const int spx_backoff[SPX_MAXRXTSHIFT+1] =
     { 1, 2, 4, 8, 16, 32, 64, 64, 64, 64, 64, 64, 64 };
@@ -103,7 +103,7 @@
 static	int spx_rcvd(struct socket *so, int flags);
 static	int spx_rcvoob(struct socket *so, struct mbuf *m, int flags);
 static	int spx_send(struct socket *so, int flags, struct mbuf *m,
-		     struct sockaddr *addr, struct mbuf *control, 
+		     struct sockaddr *addr, struct mbuf *control,
 		     struct thread *td);
 static	int spx_shutdown(struct socket *so);
 static	int spx_sp_attach(struct socket *so, int proto, struct thread *td);
@@ -163,10 +163,7 @@
 	short ostate = 0;
 
 	spxstat.spxs_rcvtotal++;
-	if (ipxp == NULL) {
-		panic("No ipxpcb in spx_input\n");
-		return;
-	}
+	KASSERT(ipxp != NULL, ("spx_input: NULL ipxpcb"));
 
 	cb = ipxtospxpcb(ipxp);
 	if (cb == NULL)
@@ -330,7 +327,7 @@
 		m_freem(m);
 	}
 	if (cb->s_force || (cb->s_flags & (SF_ACKNOW|SF_WIN|SF_RXT)))
-		spx_output(cb, (struct mbuf *)NULL);
+		spx_output(cb, NULL);
 	cb->s_flags &= ~(SF_WIN|SF_RXT);
 	return;
 
@@ -358,7 +355,7 @@
 
 drop:
 bad:
-	if (cb == 0 || cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG ||
+	if (cb == NULL || cb->s_ipxpcb->ipxp_socket->so_options & SO_DEBUG ||
             traceallspxs)
 		spx_trace(SA_DROP, (u_char)ostate, cb, &spx_savesi, 0);
 	m_freem(m);
@@ -411,7 +408,7 @@
 				cb->s_snxt = si->si_ack;
 				cb->s_cwnd = CUNIT;
 				cb->s_force = 1 + SPXT_REXMT;
-				spx_output(cb, (struct mbuf *)NULL);
+				spx_output(cb, NULL);
 				cb->s_timer[SPXT_REXMT] = cb->s_rxtcur;
 				cb->s_rtt = 0;
 				if (cwnd >= 4 * CUNIT)
@@ -489,13 +486,14 @@
 	/*
 	 * Trim Acked data from output queue.
 	 */
+	SOCKBUF_LOCK(&so->so_snd);
 	while ((m = so->so_snd.sb_mb) != NULL) {
 		if (SSEQ_LT((mtod(m, struct spx *))->si_seq, si->si_ack))
-			sbdroprecord(&so->so_snd);
+			sbdroprecord_locked(&so->so_snd);
 		else
 			break;
 	}
-	sowwakeup(so);
+	sowwakeup_locked(so);
 	cb->s_rack = si->si_ack;
 update_window:
 	if (SSEQ_LT(cb->s_snxt, cb->s_rack))
@@ -533,11 +531,19 @@
 				return (0);
 			} /* else queue this packet; */
 		} else {
+#ifdef BROKEN
+			/*
+			 * XXXRW: This is broken on at least one count:
+			 * spx_close() will free the ipxp and related parts,
+			 * which are then touched by spx_input() after the
+			 * return from spx_reass().
+			 */
 			/*register struct socket *so = cb->s_ipxpcb->ipxp_socket;
 			if (so->so_state && SS_NOFDREF) {
 				spx_close(cb);
 			} else
 				       would crash system*/
+#endif
 			spx_istat.notyet++;
 			m_freem(dtom(si));
 			return (0);
@@ -585,6 +591,7 @@
 	}
 present:
 #define SPINC sizeof(struct spxhdr)
+	SOCKBUF_LOCK(&so->so_rcv);
 	/*
 	 * Loop through all packets queued up to update acknowledge
 	 * number, and present all acknowledged data to user;
@@ -596,12 +603,10 @@
 			m = dtom(q);
 			if (SI(q)->si_cc & SPX_OB) {
 				cb->s_oobflags &= ~SF_IOOB;
-				SOCKBUF_LOCK(&so->so_rcv);
 				if (so->so_rcv.sb_cc)
 					so->so_oobmark = so->so_rcv.sb_cc;
 				else
 					so->so_rcv.sb_state |= SBS_RCVATMARK;
-				SOCKBUF_UNLOCK(&so->so_rcv);
 			}
 			q = q->si_prev;
 			remque(q->si_next);
@@ -624,16 +629,14 @@
 						s[0] = 5;
 						s[1] = 1;
 						*(u_char *)(&s[2]) = dt;
-						sbappend(&so->so_rcv, mm);
+						sbappend_locked(&so->so_rcv, mm);
 					}
 				}
 				if (sp->spx_cc & SPX_OB) {
 					MCHTYPE(m, MT_OOBDATA);
 					spx_newchecks[1]++;
-					SOCKBUF_LOCK(&so->so_rcv);
 					so->so_oobmark = 0;
 					so->so_rcv.sb_state &= ~SBS_RCVATMARK;
-					SOCKBUF_UNLOCK(&so->so_rcv);
 				}
 				if (packetp == 0) {
 					m->m_data += SPINC;
@@ -641,26 +644,28 @@
 					m->m_pkthdr.len -= SPINC;
 				}
 				if ((sp->spx_cc & SPX_EM) || packetp) {
-					sbappendrecord(&so->so_rcv, m);
+					sbappendrecord_locked(&so->so_rcv, m);
 					spx_newchecks[9]++;
 				} else
-					sbappend(&so->so_rcv, m);
+					sbappend_locked(&so->so_rcv, m);
 			} else
 #endif
 			if (packetp) {
-				sbappendrecord(&so->so_rcv, m);
+				sbappendrecord_locked(&so->so_rcv, m);
 			} else {
 				cb->s_rhdr = *mtod(m, struct spxhdr *);
 				m->m_data += SPINC;
 				m->m_len -= SPINC;
 				m->m_pkthdr.len -= SPINC;
-				sbappend(&so->so_rcv, m);
+				sbappend_locked(&so->so_rcv, m);
 			}
 		  } else
 			break;
 	}
 	if (wakeup)
-		sorwakeup(so);
+		sorwakeup_locked(so);
+	else
+		SOCKBUF_UNLOCK(&so->so_rcv);
 	return (0);
 }
 
@@ -703,7 +708,7 @@
 {
 	struct socket *so = cb->s_ipxpcb->ipxp_socket;
 	register struct mbuf *m;
-	register struct spx *si = (struct spx *)NULL;
+	register struct spx *si = NULL;
 	register struct sockbuf *sb = &so->so_snd;
 	int len = 0, win, rcv_win;
 	short span, off, recordp = 0;
@@ -916,7 +921,7 @@
 	if (rcv_win > 0) {
 		u_short delta =  1 + cb->s_alo - cb->s_ack;
 		int adv = rcv_win - (delta * cb->s_mtu);
-		
+
 		if ((so->so_rcv.sb_cc == 0 && adv >= (2 * cb->s_mtu)) ||
 		    (100 * adv / so->so_rcv.sb_hiwat >= 35)) {
 			spxstat.spxs_sndwinup++;
@@ -971,7 +976,7 @@
 	if (rcv_win < 0)
 		rcv_win = 0;
 	alo = cb->s_ack - 1 + (rcv_win / ((short)cb->s_mtu));
-	if (SSEQ_LT(alo, cb->s_alo)) 
+	if (SSEQ_LT(alo, cb->s_alo))
 		alo = cb->s_alo;
 
 	if (si != NULL) {
@@ -1025,7 +1030,7 @@
 		if (cb->s_force != (1 + SPXT_PERSIST) ||
 		    cb->s_timer[SPXT_PERSIST] == 0) {
 			/*
-			 * If this is a new packet and we are not currently 
+			 * If this is a new packet and we are not currently
 			 * timing anything, time this one.
 			 */
 			if (SSEQ_LT(cb->s_smax, si->si_seq)) {
@@ -1081,7 +1086,7 @@
 			spx_trace(SA_OUTPUT, cb->s_state, cb, si, 0);
 
 		if (so->so_options & SO_DONTROUTE)
-			error = ipx_outputfl(m, (struct route *)NULL, IPX_ROUTETOIF);
+			error = ipx_outputfl(m, NULL, IPX_ROUTETOIF);
 		else
 			error = ipx_outputfl(m, &cb->s_ipxpcb->ipxp_route, 0);
 	}
@@ -1169,12 +1174,12 @@
 			break;
 
 		case SO_LAST_HEADER:
-			error = sooptcopyout(sopt, &cb->s_rhdr, 
+			error = sooptcopyout(sopt, &cb->s_rhdr,
 					     sizeof cb->s_rhdr);
 			break;
 
 		case SO_DEFAULT_HEADERS:
-			error = sooptcopyout(sopt, &cb->s_shdr, 
+			error = sooptcopyout(sopt, &cb->s_shdr,
 					     sizeof cb->s_shdr);
 			break;
 
@@ -1352,7 +1357,7 @@
 	SPXT_RANGESET(cb->s_rxtcur,
 	    ((SPXTV_SRTTBASE >> 2) + (SPXTV_SRTTDFLT << 2)) >> 1,
 	    SPXTV_MIN, SPXTV_REXMTMAX);
-	ipxp->ipxp_pcb = (caddr_t)cb; 
+	ipxp->ipxp_pcb = (caddr_t)cb;
 spx_attach_end:
 	splx(s);
 	return (error);
@@ -1363,14 +1368,14 @@
 	struct socket *so;
 	struct sockaddr *nam;
 	struct thread *td;
-{  
+{
 	struct ipxpcb *ipxp;
 
 	ipxp = sotoipxpcb(so);
 
 	return (ipx_pcbbind(ipxp, nam, td));
-}  
-   
+}
+
 /*
  * Initiate connection to peer.
  * Enter SYN_SENT state, and mark socket as connecting.
@@ -1393,7 +1398,7 @@
 
 	s = splnet();
 	if (ipxp->ipxp_lport == 0) {
-		error = ipx_pcbbind(ipxp, (struct sockaddr *)NULL, td);
+		error = ipx_pcbbind(ipxp, NULL, td);
 		if (error)
 			goto spx_connect_end;
 	}
@@ -1416,7 +1421,7 @@
 	 * cb->s_dport.
 	 */
 	ipxp->ipxp_fport = 0;
-	error = spx_output(cb, (struct mbuf *)NULL);
+	error = spx_output(cb, NULL);
 spx_connect_end:
 	splx(s);
 	return (error);
@@ -1480,7 +1485,7 @@
 	cb = ipxtospxpcb(ipxp);
 
 	if (ipxp->ipxp_lport == 0)
-		error = ipx_pcbbind(ipxp, (struct sockaddr *)NULL, td);
+		error = ipx_pcbbind(ipxp, NULL, td);
 	if (error == 0)
 		cb->s_state = TCPS_LISTEN;
 	return (error);
@@ -1504,7 +1509,7 @@
 
 	s = splnet();
 	cb->s_flags |= SF_RVD;
-	spx_output(cb, (struct mbuf *)NULL);
+	spx_output(cb, NULL);
 	cb->s_flags &= ~SF_RVD;
 	splx(s);
 	return (0);
@@ -1522,12 +1527,15 @@
 	ipxp = sotoipxpcb(so);
 	cb = ipxtospxpcb(ipxp);
 
+	SOCKBUF_LOCK(&so->so_rcv);
 	if ((cb->s_oobflags & SF_IOOB) || so->so_oobmark ||
 	    (so->so_rcv.sb_state & SBS_RCVATMARK)) {
+		SOCKBUF_UNLOCK(&so->so_rcv);
 		m->m_len = 1;
 		*mtod(m, caddr_t) = cb->s_iobc;
 		return (0);
 	}
+	SOCKBUF_UNLOCK(&so->so_rcv);
 	return (EINVAL);
 }
 
@@ -1580,7 +1588,7 @@
 
 static int
 spx_shutdown(so)
-	struct socket *so;            
+	struct socket *so;
 {
 	int error;
 	int s;
@@ -1595,7 +1603,7 @@
 	socantsendmore(so);
 	cb = spx_usrclosed(cb);
 	if (cb != NULL)
-		error = spx_output(cb, (struct mbuf *)NULL);
+		error = spx_output(cb, NULL);
 	splx(s);
 	return (error);
 }
@@ -1670,11 +1678,11 @@
 	}
 	m_free(dtom(cb->s_ipx));
 	FREE(cb, M_PCB);
-	ipxp->ipxp_pcb = 0;
+	ipxp->ipxp_pcb = NULL;
 	soisdisconnected(so);
 	ipx_pcbdetach(ipxp);
 	spxstat.spxs_closed++;
-	return ((struct spxpcb *)NULL);
+	return (NULL);
 }
 
 /*
@@ -1738,7 +1746,7 @@
 			cb->s_flags &= ~SF_DELACK;
 			cb->s_flags |= SF_ACKNOW;
 			spxstat.spxs_delack++;
-			spx_output(cb, (struct mbuf *)NULL);
+			spx_output(cb, NULL);
 		}
 	}
 
@@ -1772,13 +1780,16 @@
 				 * spx_timers() returns (NULL) if it free'd
 				 * the pcb.
 				 */
-				if (spx_timers(cb, i) == NULL)
-					continue;
+				cb = spx_timers(cb, i);
+				if (cb == NULL)
+					break;
 			}
 		}
-		cb->s_idle++;
-		if (cb->s_rtt)
-			cb->s_rtt++;
+		if (cb != NULL) {
+			cb->s_idle++;
+			if (cb->s_rtt)
+				cb->s_rtt++;
+		}
 	}
 	spx_iss += SPX_ISSINCR/PR_SLOWHZ;		/* increment iss */
 	splx(s);
@@ -1849,7 +1860,7 @@
 			win = 2;
 		cb->s_cwnd = CUNIT;
 		cb->s_ssthresh = win * CUNIT;
-		spx_output(cb, (struct mbuf *)NULL);
+		spx_output(cb, NULL);
 		break;
 
 	/*
@@ -1859,7 +1870,7 @@
 	case SPXT_PERSIST:
 		spxstat.spxs_persisttimeo++;
 		spx_setpersist(cb);
-		spx_output(cb, (struct mbuf *)NULL);
+		spx_output(cb, NULL);
 		break;
 
 	/*
@@ -1874,7 +1885,7 @@
 		    	if (cb->s_idle >= SPXTV_MAXIDLE)
 				goto dropit;
 			spxstat.spxs_keepprobe++;
-			spx_output(cb, (struct mbuf *)NULL);
+			spx_output(cb, NULL);
 		} else
 			cb->s_idle = 0;
 		cb->s_timer[SPXT_KEEP] = SPXTV_KEEP;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200501021606.j02G6scf019454>