svn commit: r194913 - head/sys/netatalk

Robert Watson rwatson at FreeBSD.org
Wed Jun 24 21:36:09 UTC 2009


Author: rwatson
Date: Wed Jun 24 21:36:09 2009
New Revision: 194913
URL: http://svn.freebsd.org/changeset/base/194913

Log:
  Use queue(9) instead of hand-crafted link lists for the global netatalk
  address list.  Generally follow the style and convention of similar parts
  in netinet.
  
  MFC after:	6 weeks

Modified:
  head/sys/netatalk/aarp.c
  head/sys/netatalk/at_control.c
  head/sys/netatalk/at_var.h
  head/sys/netatalk/ddp_input.c
  head/sys/netatalk/ddp_output.c
  head/sys/netatalk/ddp_pcb.c
  head/sys/netatalk/ddp_usrreq.c

Modified: head/sys/netatalk/aarp.c
==============================================================================
--- head/sys/netatalk/aarp.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/aarp.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -154,7 +154,7 @@ at_ifawithnet_locked(struct sockaddr_at 
 
 	AT_IFADDR_LOCK_ASSERT();
 
-	for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+	TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 		sat2 = &(aa->aa_addr);
 		if (sat2->sat_addr.s_net == sat->sat_addr.s_net)
 			break;

Modified: head/sys/netatalk/at_control.c
==============================================================================
--- head/sys/netatalk/at_control.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/at_control.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <netatalk/at_extern.h>
 
 struct rwlock		 at_ifaddr_rw;
-struct at_ifaddr	*at_ifaddr_list;
+struct at_ifaddrhead	 at_ifaddrhead;
 
 RW_SYSINIT(at_ifaddr_rw, &at_ifaddr_rw, "at_ifaddr_rw");
 
@@ -79,9 +79,8 @@ at_control(struct socket *so, u_long cmd
 	struct sockaddr_at *sat;
 	struct netrange	*nr;
 	struct at_aliasreq *ifra = (struct at_aliasreq *)data;
-	struct at_ifaddr *aa_temp;
 	struct at_ifaddr *aa;
-	struct ifaddr *ifa, *ifa0;
+	struct ifaddr *ifa;
 	int error;
 
 	/*
@@ -90,7 +89,7 @@ at_control(struct socket *so, u_long cmd
 	aa = NULL;
 	AT_IFADDR_RLOCK();
 	if (ifp != NULL) {
-		for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+		TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 			if (aa->aa_ifp == ifp)
 				break;
 		}
@@ -118,7 +117,7 @@ at_control(struct socket *so, u_long cmd
 			struct at_ifaddr *oaa;
 
 			AT_IFADDR_RLOCK();
-			for (oaa = aa; aa; aa = aa->aa_next) {
+			for (oaa = aa; aa; aa = TAILQ_NEXT(aa, aa_link)) {
 				if (aa->aa_ifp == ifp &&
 				    sateqaddr(&aa->aa_addr, &ifra->ifra_addr))
 					break;
@@ -161,7 +160,7 @@ at_control(struct socket *so, u_long cmd
 			 * the NEXT interface!
 			 */
 			AT_IFADDR_RLOCK();
-			for (oaa = aa; aa; aa = aa->aa_next) {
+			for (oaa = aa; aa; aa = TAILQ_NEXT(aa, aa_link)) {
 				if (aa->aa_ifp == ifp &&
 				    (aa->aa_flags & AFA_PHASE2) == 0)
 					break;
@@ -180,7 +179,7 @@ at_control(struct socket *so, u_long cmd
 			 * the NEXT interface!
 			 */
 			AT_IFADDR_RLOCK();
-			for (oaa = aa; aa; aa = aa->aa_next) {
+			for (oaa = aa; aa; aa = TAILQ_NEXT(aa, aa_link)) {
 				if (aa->aa_ifp == ifp && (aa->aa_flags &
 				    AFA_PHASE2))
 					break;
@@ -228,9 +227,9 @@ at_control(struct socket *so, u_long cmd
 			else
 				aa->aa_flags |= AFA_PHASE2;
 
-			ifa_ref(&aa->aa_ifa);		/* at_ifaddr_list */
+			ifa_ref(&aa->aa_ifa);		/* at_ifaddrhead */
 			AT_IFADDR_WLOCK();
-			if ((aa_temp = at_ifaddr_list) != NULL) {
+			if (!TAILQ_EMPTY(&at_ifaddrhead)) {
 				/*
 				 * Don't let the loopback be first, since the
 				 * first address is the machine's default
@@ -238,18 +237,16 @@ at_control(struct socket *so, u_long cmd
 				 * ourself in front, otherwise go to the back
 				 * of the list.
 				 */
-				if (at_ifaddr_list->aa_ifp->if_flags &
-				    IFF_LOOPBACK) {
-					aa->aa_next = at_ifaddr_list;
-					at_ifaddr_list = aa;
-				} else {
-					for (; aa_temp->aa_next; aa_temp =
-					    aa_temp->aa_next)
-						;
-					aa_temp->aa_next = aa;
-				}
+				if (TAILQ_FIRST(&at_ifaddrhead)->aa_ifp->
+				    if_flags & IFF_LOOPBACK)
+					TAILQ_INSERT_HEAD(&at_ifaddrhead, aa,
+					    aa_link);
+				else
+					TAILQ_INSERT_TAIL(&at_ifaddrhead, aa,
+					    aa_link);
 			} else
-				at_ifaddr_list = aa;
+				TAILQ_INSERT_HEAD(&at_ifaddrhead, aa,
+				    aa_link);
 			AT_IFADDR_WUNLOCK();
 
 			/*
@@ -280,7 +277,7 @@ at_control(struct socket *so, u_long cmd
 			 * only look at a phase one address
 			 */
 			AT_IFADDR_RUNLOCK();
-			for (oaa = aa; aa; aa = aa->aa_next) {
+			for (oaa = aa; aa; aa = TAILQ_NEXT(aa, aa_link)) {
 				if (aa->aa_ifp == ifp &&
 				    (aa->aa_flags & AFA_PHASE2) == 0)
 					break;
@@ -297,7 +294,7 @@ at_control(struct socket *so, u_long cmd
 			 * default to phase 2
 			 */
 			AT_IFADDR_RLOCK();
-			for (oaa = aa; aa; aa = aa->aa_next) {
+			for (oaa = aa; aa; aa = TAILQ_NEXT(aa, aa_link)) {
 				if (aa->aa_ifp == ifp && (aa->aa_flags &
 				    AFA_PHASE2))
 					break;
@@ -359,11 +356,11 @@ at_control(struct socket *so, u_long cmd
 		/*
 		 * remove the ifaddr from the interface
 		 */
-		ifa0 = (struct ifaddr *)aa;
+		ifa = (struct ifaddr *)aa;
 		IF_ADDR_LOCK(ifp);
-		TAILQ_REMOVE(&ifp->if_addrhead, ifa0, ifa_link);
+		TAILQ_REMOVE(&ifp->if_addrhead, ifa, ifa_link);
 		IF_ADDR_UNLOCK(ifp);
-		ifa_free(ifa0);			/* if_addrhead */
+		ifa_free(ifa);				/* if_addrhead */
 
 		/*
 		 * Now remove the at_ifaddr from the parallel structure
@@ -371,24 +368,9 @@ at_control(struct socket *so, u_long cmd
 		 */
 
 		AT_IFADDR_WLOCK();
-		if (aa == (aa_temp = at_ifaddr_list)) {
-			at_ifaddr_list = aa->aa_next;
-		} else {
-			while (aa_temp->aa_next && (aa_temp->aa_next != aa))
-				aa_temp = aa_temp->aa_next;
-
-			/*
-			 * if we found it, remove it, otherwise we
-			 * screwed up.
-			 */
-			if (aa_temp->aa_next)
-				aa_temp->aa_next = aa->aa_next;
-			else
-				panic("at_control");
-		}
+		TAILQ_REMOVE(&at_ifaddrhead, aa, aa_link);
 		AT_IFADDR_WUNLOCK();
-		ifa_free(ifa0);				/* at_ifaddr_list */
-		aa = aa_temp;
+		ifa_free(ifa);				/* at_ifaddrhead */
 		break;
 
 	default:
@@ -760,7 +742,7 @@ at_broadcast(struct sockaddr_at *sat)
 	/*
 	 * failing that, if the net is one we have, it's a broadcast as well.
 	 */
-	for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+	TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 		if ((aa->aa_ifp->if_flags & IFF_BROADCAST)
 		    && (ntohs(sat->sat_addr.s_net) >= ntohs(aa->aa_firstnet)
 		    && ntohs(sat->sat_addr.s_net) <= ntohs(aa->aa_lastnet)))

Modified: head/sys/netatalk/at_var.h
==============================================================================
--- head/sys/netatalk/at_var.h	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/at_var.h	Wed Jun 24 21:36:09 2009	(r194913)
@@ -40,11 +40,13 @@ struct at_ifaddr {
 	u_short			 aa_lastnet;
 	int			 aa_probcnt;
 	struct callout		 aa_callout;
-	struct at_ifaddr	*aa_next;
+	TAILQ_ENTRY(at_ifaddr)	 aa_link;
 };
 #define	aa_ifp		aa_ifa.ifa_ifp
 #define	aa_dstaddr	aa_broadaddr;
 
+TAILQ_HEAD(at_ifaddrhead, at_ifaddr);
+
 struct at_aliasreq {
 	char			ifra_name[IFNAMSIZ];
 	struct sockaddr_at	ifra_addr;
@@ -61,8 +63,8 @@ struct at_aliasreq {
 #define	AFA_PHASE2	0x0004
 
 #ifdef _KERNEL
-extern struct rwlock	 at_ifaddr_rw;
-extern struct at_ifaddr	*at_ifaddr_list;
+extern struct rwlock		at_ifaddr_rw;
+extern struct at_ifaddrhead	at_ifaddrhead;
 
 #define	AT_IFADDR_LOCK_INIT()	rw_init(&at_ifaddr_rw, "at_ifaddr_rw")
 #define	AT_IFADDR_LOCK_ASSERT()	rw_assert(&at_ifaddr_rw, RA_LOCKED)

Modified: head/sys/netatalk/ddp_input.c
==============================================================================
--- head/sys/netatalk/ddp_input.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/ddp_input.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -162,7 +162,7 @@ ddp_input(struct mbuf *m, struct ifnet *
 		 * it's valid for this packet.
 		 */
 		AT_IFADDR_RLOCK();
-		for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+		TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 			if ((aa->aa_ifp == ifp)
 			    && ((aa->aa_flags & AFA_PHASE2) == 0)
 			    && ((to.sat_addr.s_node ==
@@ -224,8 +224,7 @@ ddp_input(struct mbuf *m, struct ifnet *
 			 * what we want, but it's probably safe in 99.999% of
 			 * cases.
 			 */
-			for (aa = at_ifaddr_list; aa != NULL;
-			    aa = aa->aa_next) {
+			TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 				if (phase == 1 && (aa->aa_flags &
 				    AFA_PHASE2))
 					continue;
@@ -244,8 +243,7 @@ ddp_input(struct mbuf *m, struct ifnet *
 			 * A destination network was given.  We just try to
 			 * find which ifaddr info matches it.
 	    		 */
-			for (aa = at_ifaddr_list; aa != NULL;
-			    aa = aa->aa_next) {
+			TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 				/*
 				 * This is a kludge. Accept packets that are
 				 * for any router on a local netrange.

Modified: head/sys/netatalk/ddp_output.c
==============================================================================
--- head/sys/netatalk/ddp_output.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/ddp_output.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -143,7 +143,7 @@ ddp_route(struct mbuf *m, struct route *
 	    (ifp = ro->ro_rt->rt_ifa->ifa_ifp)) {
 		net = ntohs(satosat(ro->ro_rt->rt_gateway)->sat_addr.s_net);
 		AT_IFADDR_RLOCK();
-		for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+		TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 			if (((net == 0) || (aa->aa_ifp == ifp)) &&
 			    net >= ntohs(aa->aa_firstnet) &&
 			    net <= ntohs(aa->aa_lastnet))

Modified: head/sys/netatalk/ddp_pcb.c
==============================================================================
--- head/sys/netatalk/ddp_pcb.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/ddp_pcb.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -113,8 +113,7 @@ at_pcbsetaddr(struct ddpcb *ddp, struct 
 		if (sat->sat_addr.s_node != ATADDR_ANYNODE ||
 		    sat->sat_addr.s_net != ATADDR_ANYNET) {
 			AT_IFADDR_RLOCK();
-			for (aa = at_ifaddr_list; aa != NULL;
-			    aa = aa->aa_next) {
+			TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 				if ((sat->sat_addr.s_net ==
 				    AA_SAT(aa)->sat_addr.s_net) &&
 				    (sat->sat_addr.s_node ==
@@ -146,11 +145,11 @@ at_pcbsetaddr(struct ddpcb *ddp, struct 
 	if (sat->sat_addr.s_node == ATADDR_ANYNODE &&
 	    sat->sat_addr.s_net == ATADDR_ANYNET) {
 		AT_IFADDR_RLOCK();
-		if (at_ifaddr_list == NULL) {
+		if (TAILQ_EMPTY(&at_ifaddrhead)) {
 			AT_IFADDR_RUNLOCK();
 			return (EADDRNOTAVAIL);
 		}
-		sat->sat_addr = AA_SAT(at_ifaddr_list)->sat_addr;
+		sat->sat_addr = AA_SAT(TAILQ_FIRST(&at_ifaddrhead))->sat_addr;
 		AT_IFADDR_RUNLOCK();
 	}
 	ddp->ddp_lsat = *sat;
@@ -229,8 +228,7 @@ at_pcbconnect(struct ddpcb *ddp, struct 
 		aa = NULL;
 		AT_IFADDR_RLOCK();
 		if ((ifp = ro->ro_rt->rt_ifp) != NULL) {
-			for (aa = at_ifaddr_list; aa != NULL;
-			    aa = aa->aa_next) {
+			TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 				if (aa->aa_ifp == ifp &&
 				    ntohs(net) >= ntohs(aa->aa_firstnet) &&
 				    ntohs(net) <= ntohs(aa->aa_lastnet))
@@ -268,7 +266,7 @@ at_pcbconnect(struct ddpcb *ddp, struct 
 	aa = NULL;
 	if (ro->ro_rt && (ifp = ro->ro_rt->rt_ifp)) {
 		AT_IFADDR_RLOCK();
-		for (aa = at_ifaddr_list; aa != NULL; aa = aa->aa_next) {
+		TAILQ_FOREACH(aa, &at_ifaddrhead, aa_link) {
 			if (aa->aa_ifp == ifp)
 				break;
 		}

Modified: head/sys/netatalk/ddp_usrreq.c
==============================================================================
--- head/sys/netatalk/ddp_usrreq.c	Wed Jun 24 21:34:38 2009	(r194912)
+++ head/sys/netatalk/ddp_usrreq.c	Wed Jun 24 21:36:09 2009	(r194913)
@@ -276,6 +276,7 @@ ddp_init(void)
 {
 
 	DDP_LIST_LOCK_INIT();
+	TAILQ_INIT(&at_ifaddrhead);
 	netisr_register(&atalk1_nh);
 	netisr_register(&atalk2_nh);
 	netisr_register(&aarp_nh);


More information about the svn-src-all mailing list