diff --git a/sys/netatalk/aarp.c b/sys/netatalk/aarp.c index 95322986384c..24dc7a111bc2 100644 --- a/sys/netatalk/aarp.c +++ b/sys/netatalk/aarp.c @@ -154,7 +154,7 @@ at_ifawithnet_locked(struct sockaddr_at *sat) 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; diff --git a/sys/netatalk/at_control.c b/sys/netatalk/at_control.c index 6332697cf8e0..5193d668efef 100644 --- a/sys/netatalk/at_control.c +++ b/sys/netatalk/at_control.c @@ -48,7 +48,7 @@ __FBSDID("$FreeBSD$"); #include 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, caddr_t data, struct ifnet *ifp, 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, caddr_t data, struct ifnet *ifp, 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, caddr_t data, struct ifnet *ifp, 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, caddr_t data, struct ifnet *ifp, * 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, caddr_t data, struct ifnet *ifp, * 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, caddr_t data, struct ifnet *ifp, 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, caddr_t data, struct ifnet *ifp, * 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, caddr_t data, struct ifnet *ifp, * 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, caddr_t data, struct ifnet *ifp, * 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, caddr_t data, struct ifnet *ifp, /* * 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, caddr_t data, struct ifnet *ifp, */ 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))) diff --git a/sys/netatalk/at_var.h b/sys/netatalk/at_var.h index 3ab73a2501a3..39b12c77ca67 100644 --- a/sys/netatalk/at_var.h +++ b/sys/netatalk/at_var.h @@ -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) diff --git a/sys/netatalk/ddp_input.c b/sys/netatalk/ddp_input.c index 49a1908ec7c0..f78fc86e8477 100644 --- a/sys/netatalk/ddp_input.c +++ b/sys/netatalk/ddp_input.c @@ -162,7 +162,7 @@ ddp_input(struct mbuf *m, struct ifnet *ifp, struct elaphdr *elh, int phase) * 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 *ifp, struct elaphdr *elh, int phase) * 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 *ifp, struct elaphdr *elh, int phase) * 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. diff --git a/sys/netatalk/ddp_output.c b/sys/netatalk/ddp_output.c index a820f243607d..1b178be49b8c 100644 --- a/sys/netatalk/ddp_output.c +++ b/sys/netatalk/ddp_output.c @@ -143,7 +143,7 @@ ddp_route(struct mbuf *m, struct route *ro) (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)) diff --git a/sys/netatalk/ddp_pcb.c b/sys/netatalk/ddp_pcb.c index a793a4f676f4..6be8f4e1364e 100644 --- a/sys/netatalk/ddp_pcb.c +++ b/sys/netatalk/ddp_pcb.c @@ -113,8 +113,7 @@ at_pcbsetaddr(struct ddpcb *ddp, struct sockaddr *addr, struct thread *td) 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 sockaddr *addr, struct thread *td) 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 sockaddr *addr, struct thread *td) 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 sockaddr *addr, struct thread *td) 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; } diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index 1c2f601fd8f9..2e541588b9b9 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -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);