svn commit: r194905 - head/sys/netipx

Robert Watson rwatson at FreeBSD.org
Wed Jun 24 20:57:51 UTC 2009


Author: rwatson
Date: Wed Jun 24 20:57:50 2009
New Revision: 194905
URL: http://svn.freebsd.org/changeset/base/194905

Log:
  Use queue(9) instead of hand-crafted link lists for the global IPX
  address list (ipx_ifaddr -> ipx_ifaddrhead), and generally adopt the
  naming and usage conventions found in netinet.
  
  MFC after:	6 weeks

Modified:
  head/sys/netipx/ipx.c
  head/sys/netipx/ipx_if.h
  head/sys/netipx/ipx_input.c
  head/sys/netipx/ipx_outputfl.c
  head/sys/netipx/ipx_pcb.c

Modified: head/sys/netipx/ipx.c
==============================================================================
--- head/sys/netipx/ipx.c	Wed Jun 24 20:56:06 2009	(r194904)
+++ head/sys/netipx/ipx.c	Wed Jun 24 20:57:50 2009	(r194905)
@@ -85,7 +85,7 @@ __FBSDID("$FreeBSD$");
  * The IPX-layer address list is protected by ipx_ifaddr_rw.
  */
 struct rwlock		 ipx_ifaddr_rw;
-struct ipx_ifaddr	*ipx_ifaddr;
+struct ipx_ifaddrhead	 ipx_ifaddrhead;
 
 static void	ipx_ifscrub(struct ifnet *ifp, struct ipx_ifaddr *ia);
 static int	ipx_ifinit(struct ifnet *ifp, struct ipx_ifaddr *ia,
@@ -100,7 +100,7 @@ ipx_control(struct socket *so, u_long cm
 {
 	struct ifreq *ifr = (struct ifreq *)data;
 	struct ipx_aliasreq *ifra = (struct ipx_aliasreq *)data;
-	struct ipx_ifaddr *ia, *ia_temp, *oia;
+	struct ipx_ifaddr *ia;
 	struct ifaddr *ifa;
 	int dstIsNew, hostIsNew;
 	int error, priv;
@@ -112,9 +112,10 @@ ipx_control(struct socket *so, u_long cm
 		return (EADDRNOTAVAIL);
 
 	IPX_IFADDR_RLOCK();
-	for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
+	TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
 		if (ia->ia_ifp == ifp)
 			break;
+	}
 	if (ia != NULL)
 		ifa_ref(&ia->ia_ifa);
 	IPX_IFADDR_RUNLOCK();
@@ -164,7 +165,9 @@ ipx_control(struct socket *so, u_long cm
 
 		IPX_IFADDR_RLOCK();
 		if (ifra->ifra_addr.sipx_family == AF_IPX) {
-			for (oia = ia; ia != NULL; ia = ia->ia_next) {
+			struct ipx_ifaddr *oia;
+
+			for (oia = ia; ia; ia = TAILQ_NEXT(ia, ia_link)) {
 				if (ia->ia_ifp == ifp  &&
 				    ipx_neteq(ia->ia_addr.sipx_addr,
 				    ifra->ifra_addr.sipx_addr))
@@ -205,15 +208,9 @@ ipx_control(struct socket *so, u_long cm
 				ia->ia_broadaddr.sipx_addr.x_host =
 				    ipx_broadhost;
 			}
-			ifa_ref(&ia->ia_ifa);		/* ipx_ifaddr */
+			ifa_ref(&ia->ia_ifa);		/* ipx_ifaddrhead */
 			IPX_IFADDR_WLOCK();
-			if ((ia_temp = ipx_ifaddr) != NULL) {
-				for (; ia_temp->ia_next != NULL;
-				    ia_temp = ia_temp->ia_next)
-					;
-				ia_temp->ia_next = ia;
-			} else
-				ipx_ifaddr = ia;
+			TAILQ_INSERT_TAIL(&ipx_ifaddrhead, ia, ia_link);
 			IPX_IFADDR_WUNLOCK();
 
 			ifa_ref(&ia->ia_ifa);		/* if_addrhead */
@@ -262,18 +259,9 @@ ipx_control(struct socket *so, u_long cm
 		ifa_free(ifa);				/* if_addrhead */
 
 		IPX_IFADDR_WLOCK();
-		if (ia == (ia_temp = ipx_ifaddr)) {
-			ipx_ifaddr = ia->ia_next;
-		} else {
-			while (ia_temp->ia_next && (ia_temp->ia_next != ia))
-				ia_temp = ia_temp->ia_next;
-			if (ia_temp->ia_next)
-			    ia_temp->ia_next = ia->ia_next;
-			else
-				panic("Didn't unlink ipxifadr from list\n");
-		}
+		TAILQ_REMOVE(&ipx_ifaddrhead, ia, ia_link);
 		IPX_IFADDR_WUNLOCK();
-		ifa_free(&ia->ia_ifa);			/* ipx_ifaddr */
+		ifa_free(&ia->ia_ifa);			/* ipx_ifaddrhead */
 		goto out;
 
 	case SIOCAIFADDR:
@@ -395,7 +383,7 @@ ipx_iaonnetof(struct ipx_addr *dst)
 
 	IPX_IFADDR_LOCK_ASSERT();
 
-	for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next) {
+	TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
 		if ((ifp = ia->ia_ifp) != NULL) {
 			if (ifp->if_flags & IFF_POINTOPOINT) {
 				compare = &satoipx_addr(ia->ia_dstaddr);

Modified: head/sys/netipx/ipx_if.h
==============================================================================
--- head/sys/netipx/ipx_if.h	Wed Jun 24 20:56:06 2009	(r194904)
+++ head/sys/netipx/ipx_if.h	Wed Jun 24 20:57:50 2009	(r194905)
@@ -75,7 +75,7 @@ struct ipx_ifaddr {
 	struct	ifaddr ia_ifa;		/* protocol-independent info */
 #define	ia_ifp		ia_ifa.ifa_ifp
 #define	ia_flags	ia_ifa.ifa_flags
-	struct	ipx_ifaddr *ia_next;	/* next in list of ipx addresses */
+	TAILQ_ENTRY(ipx_ifaddr)	ia_link;	/* list of IPv6 addresses */
 	struct	sockaddr_ipx ia_addr;	/* reserve space for my address */
 	struct	sockaddr_ipx ia_dstaddr;	/* space for my broadcast address */
 #define ia_broadaddr	ia_dstaddr
@@ -88,6 +88,12 @@ struct	ipx_aliasreq {
 	struct	sockaddr_ipx ifra_broadaddr;
 #define ifra_dstaddr ifra_broadaddr
 };
+
+/*
+ * List of ipx_ifaddr's.
+ */
+TAILQ_HEAD(ipx_ifaddrhead, ipx_ifaddr);
+
 /*
  * Given a pointer to an ipx_ifaddr (ifaddr),
  * return a pointer to the addr as a sockadd_ipx.
@@ -106,7 +112,7 @@ struct	ipx_aliasreq {
 
 #ifdef	_KERNEL
 extern struct rwlock		 ipx_ifaddr_rw;
-extern struct ipx_ifaddr	*ipx_ifaddr;
+extern struct ipx_ifaddrhead	 ipx_ifaddrhead;
 
 #define	IPX_IFADDR_LOCK_INIT()		rw_init(&ipx_ifaddr_rw, "ipx_ifaddr_rw")
 #define	IPX_IFADDR_LOCK_ASSERT()	rw_assert(&ipx_ifaddr_rw, RA_LOCKED)

Modified: head/sys/netipx/ipx_input.c
==============================================================================
--- head/sys/netipx/ipx_input.c	Wed Jun 24 20:56:06 2009	(r194904)
+++ head/sys/netipx/ipx_input.c	Wed Jun 24 20:57:50 2009	(r194905)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 1984, 1985, 1986, 1987, 1993
  *	The Regents of the University of California.
- * Copyright (c) 2004-2005 Robert N. M. Watson
+ * Copyright (c) 2004-2009 Robert N. M. Watson
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -146,6 +146,7 @@ ipx_init(void)
 
 	LIST_INIT(&ipxpcb_list);
 	LIST_INIT(&ipxrawpcb_list);
+	TAILQ_INIT(&ipx_ifaddrhead);
 
 	IPX_LIST_LOCK_INIT();
 	IPX_IFADDR_LOCK_INIT();
@@ -175,7 +176,7 @@ ipxintr(struct mbuf *m)
 	 * If no IPX addresses have been set yet but the interfaces
 	 * are receiving, can't do anything with incoming packets yet.
 	 */
-	if (ipx_ifaddr == NULL) {
+	if (TAILQ_EMPTY(&ipx_ifaddrhead)) {
 		m_freem(m);
 		return;
 	}
@@ -257,13 +258,14 @@ ipxintr(struct mbuf *m)
 			 * received from, treat it as ours.
 			 */
 			IPX_IFADDR_RLOCK();
-			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->ipx_dna)) {
+			TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
+				if ((ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif)
+				    && ipx_neteq(ia->ia_addr.sipx_addr,
+				    ipx->ipx_dna)) {
 					IPX_IFADDR_RUNLOCK();
 					goto ours;
 				}
+			}
 			IPX_IFADDR_RUNLOCK();
 
 			/*
@@ -286,11 +288,12 @@ ipxintr(struct mbuf *m)
 	 */
 	} else {
 		IPX_IFADDR_RLOCK();
-		for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
+		TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
 			if (ipx_hosteq(ipx->ipx_dna, ia->ia_addr.sipx_addr) &&
 			    (ipx_neteq(ipx->ipx_dna, ia->ia_addr.sipx_addr) ||
 			     ipx_neteqnn(ipx->ipx_dna.x_net, ipx_zeronet)))
 				break;
+		}
 		IPX_IFADDR_RUNLOCK();
 		if (ia == NULL) {
 			ipx_forward(m);

Modified: head/sys/netipx/ipx_outputfl.c
==============================================================================
--- head/sys/netipx/ipx_outputfl.c	Wed Jun 24 20:56:06 2009	(r194904)
+++ head/sys/netipx/ipx_outputfl.c	Wed Jun 24 20:57:50 2009	(r194905)
@@ -179,7 +179,7 @@ ipx_output_type20(struct mbuf *m)
 {
 	struct ipx *ipx;
 	union ipx_net *nbnet;
-	struct ipx_ifaddr *ia, *tia = NULL;
+	struct ipx_ifaddr *ia, *tia;
 	int error = 0;
 	struct mbuf *m1;
 	int i;
@@ -204,19 +204,21 @@ ipx_output_type20(struct mbuf *m)
 	/*
 	 * Now see if we have already seen this.
 	 */
+	tia = NULL;
 	IPX_IFADDR_RLOCK();
-	for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
-		if(ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif) {
-			if(tia == NULL)
+	TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
+		if (ia->ia_ifa.ifa_ifp == m->m_pkthdr.rcvif) {
+			if (tia == NULL)
 				tia = ia;
-
-			for (i=0;i<ipx->ipx_tc;i++,nbnet++)
-				if(ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
-							*nbnet)) {
+			for (i=0; i < ipx->ipx_tc; i++, nbnet++) {
+				if (ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
+				    *nbnet)) {
 					IPX_IFADDR_RUNLOCK();
 					goto bad;
 				}
+			}
 		}
+	}
 
 	/*
 	 * Don't route the packet if the interface where it come from
@@ -250,12 +252,12 @@ ipx_output_type20(struct mbuf *m)
 	dst.sipx_len = 12;
 	dst.sipx_addr.x_host = ipx_broadhost;
 
-	for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
-		if(ia->ia_ifa.ifa_ifp != m->m_pkthdr.rcvif) {
+	TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
+		if (ia->ia_ifa.ifa_ifp != m->m_pkthdr.rcvif) {
         		nbnet = (union ipx_net *)(ipx + 1);
-			for (i=0;i<ipx->ipx_tc;i++,nbnet++)
-				if(ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
-							*nbnet))
+			for (i=0; i < ipx->ipx_tc; i++, nbnet++)
+				if (ipx_neteqnn(ia->ia_addr.sipx_addr.x_net,
+				    *nbnet))
 					goto skip_this;
 
 			/*
@@ -276,6 +278,7 @@ ipx_output_type20(struct mbuf *m)
 			}
 skip_this: ;
 		}
+	}
 	IPX_IFADDR_RUNLOCK();
 
 bad:

Modified: head/sys/netipx/ipx_pcb.c
==============================================================================
--- head/sys/netipx/ipx_pcb.c	Wed Jun 24 20:56:06 2009	(r194904)
+++ head/sys/netipx/ipx_pcb.c	Wed Jun 24 20:57:50 2009	(r194905)
@@ -1,7 +1,7 @@
 /*-
  * Copyright (c) 1984, 1985, 1986, 1987, 1993
  *	The Regents of the University of California.
- * Copyright (c) 2004-2006 Robert N. M. Watson
+ * Copyright (c) 2004-2009 Robert N. M. Watson
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -223,11 +223,12 @@ ipx_pcbconnect(struct ipxpcb *ipxp, stru
 		 */
 		if (ro->ro_rt != NULL && (ifp = ro->ro_rt->rt_ifp) != NULL) {
 			IPX_IFADDR_RLOCK();
-			for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
+			TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
 				if (ia->ia_ifp == ifp) {
 					ifa_ref(&ia->ia_ifa);
 					break;
 				}
+			}
 			IPX_IFADDR_RUNLOCK();
 		}
 		if (ia == NULL) {
@@ -245,7 +246,7 @@ ipx_pcbconnect(struct ipxpcb *ipxp, stru
 			}
 			if (ia == NULL) {
 				IPX_IFADDR_RLOCK();
-				ia = ipx_ifaddr;
+				ia = TAILQ_FIRST(&ipx_ifaddrhead);
 				if (ia != NULL)
 					ifa_ref(&ia->ia_ifa);
 				IPX_IFADDR_RUNLOCK();
@@ -269,11 +270,12 @@ ipx_pcbconnect(struct ipxpcb *ipxp, stru
 		 */
 		if (ro->ro_rt != NULL && (ifp = ro->ro_rt->rt_ifp) != NULL) {
 			IPX_IFADDR_RLOCK();
-			for (ia = ipx_ifaddr; ia != NULL; ia = ia->ia_next)
+			TAILQ_FOREACH(ia, &ipx_ifaddrhead, ia_link) {
 				if (ia->ia_ifp == ifp) {
 					ifa_ref(&ia->ia_ifa);
 					break;
 				}
+			}
 			IPX_IFADDR_RUNLOCK();
 		}
 		if (ia == NULL) {
@@ -291,7 +293,7 @@ ipx_pcbconnect(struct ipxpcb *ipxp, stru
 			}
 			if (ia == NULL) {
 				IPX_IFADDR_RLOCK();
-				ia = ipx_ifaddr;
+				ia = TAILQ_FIRST(&ipx_ifaddrhead);
 				if (ia != NULL)
 					ifa_ref(&ia->ia_ifa);
 				IPX_IFADDR_RUNLOCK();


More information about the svn-src-head mailing list