Module Name: src Committed By: riz Date: Sat Apr 21 16:03:27 UTC 2012
Modified Files: src/sys/netatalk [netbsd-5]: aarp.c ddp_output.c Log Message: Pull up following revision(s) (requested by hauke in ticket #1749): sys/netatalk/aarp.c: revision 1.36 sys/netatalk/ddp_output.c: revision 1.16 Fix AppleTalk name registration, as discussed on the port-macppc list <http://mail-index.netbsd.org/port-macppc/2010/07/09/msg001119.html> and in PR kern/44412, by looping back ddp broadcasts. Patch submitted by David Riley against netbsd-5, adaptation for -current and minor KNF touchup by me. Needs to be pulled up to netbsd-5. To generate a diff of this commit: cvs rdiff -u -r1.27.12.1 -r1.27.12.2 src/sys/netatalk/aarp.c cvs rdiff -u -r1.14 -r1.14.14.1 src/sys/netatalk/ddp_output.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netatalk/aarp.c diff -u src/sys/netatalk/aarp.c:1.27.12.1 src/sys/netatalk/aarp.c:1.27.12.2 --- src/sys/netatalk/aarp.c:1.27.12.1 Thu Jun 30 09:31:15 2011 +++ src/sys/netatalk/aarp.c Sat Apr 21 16:03:27 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: aarp.c,v 1.27.12.1 2011/06/30 09:31:15 sborrill Exp $ */ +/* $NetBSD: aarp.c,v 1.27.12.2 2012/04/21 16:03:27 riz Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: aarp.c,v 1.27.12.1 2011/06/30 09:31:15 sborrill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: aarp.c,v 1.27.12.2 2012/04/21 16:03:27 riz Exp $"); #include "opt_mbuftrace.h" @@ -226,11 +226,19 @@ aarpwhohas(ifp, sat) ea->aarp_tpa = sat->sat_addr.s_node; } + /* If we are talking to ourselves, use the loopback interface. */ + if (AA_SAT(aa)->sat_addr.s_net == sat->sat_addr.s_net && + AA_SAT(aa)->sat_addr.s_node == sat->sat_addr.s_node) + ifp = lo0ifp; + #ifdef NETATALKDEBUG - printf("aarp: sending request via %u.%u seaking %u.%u\n", - ntohs(AA_SAT(aa)->sat_addr.s_net), AA_SAT(aa)->sat_addr.s_node, - ntohs(sat->sat_addr.s_net), sat->sat_addr.s_node); -#endif /* NETATALKDEBUG */ + printf("aarp: sending request via %u.%u through %s seeking %u.%u\n", + ntohs(AA_SAT(aa)->sat_addr.s_net), + AA_SAT(aa)->sat_addr.s_node, + ifp->if_xname, + ntohs(sat->sat_addr.s_net), + sat->sat_addr.s_node); +#endif /* NETATALKDEBUG */ sa.sa_len = sizeof(struct sockaddr); sa.sa_family = AF_UNSPEC; Index: src/sys/netatalk/ddp_output.c diff -u src/sys/netatalk/ddp_output.c:1.14 src/sys/netatalk/ddp_output.c:1.14.14.1 --- src/sys/netatalk/ddp_output.c:1.14 Sun Apr 6 18:46:56 2008 +++ src/sys/netatalk/ddp_output.c Sat Apr 21 16:03:27 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_output.c,v 1.14 2008/04/06 18:46:56 dyoung Exp $ */ +/* $NetBSD: ddp_output.c,v 1.14.14.1 2012/04/21 16:03:27 riz Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ddp_output.c,v 1.14 2008/04/06 18:46:56 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_output.c,v 1.14.14.1 2012/04/21 16:03:27 riz Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -128,20 +128,40 @@ ddp_route(struct mbuf *m, struct route * struct elaphdr *elh; struct at_ifaddr *aa = NULL; struct ifnet *ifp = NULL; - u_short net; + uint16_t net; + uint8_t node; + uint8_t loopback = 0; if ((rt = rtcache_validate(ro)) != NULL && (ifp = rt->rt_ifp) != NULL) { + const struct sockaddr_at *dst = satocsat(rtcache_getdst(ro)); + uint16_t dnet = dst->sat_addr.s_net; + uint8_t dnode = dst->sat_addr.s_node; net = satosat(rt->rt_gateway)->sat_addr.s_net; + node = satosat(rt->rt_gateway)->sat_addr.s_node; + TAILQ_FOREACH(aa, &at_ifaddr, aa_list) { - if (aa->aa_ifp == ifp && - ntohs(net) >= ntohs(aa->aa_firstnet) && + if (ntohs(net) >= ntohs(aa->aa_firstnet) && ntohs(net) <= ntohs(aa->aa_lastnet)) { + /* Are we talking to ourselves? */ + if (dnet == aa->aa_addr.sat_addr.s_net && + dnode == aa->aa_addr.sat_addr.s_node) { + /* If to us, redirect to lo0. */ + ifp = lo0ifp; + } + /* Or is it a broadcast? */ + else if (dnet == aa->aa_addr.sat_addr.s_net && + dnode == 255) { + /* If broadcast, loop back a copy. */ + loopback = 1; + } break; } } } if (aa == NULL) { +#ifdef NETATALKDEBUG printf("%s: no address found\n", __func__); +#endif m_freem(m); return EINVAL; } @@ -163,7 +183,8 @@ ddp_route(struct mbuf *m, struct route * ntohs(aa->aa_firstnet) && ntohs(satocsat(rtcache_getdst(ro))->sat_addr.s_net) <= ntohs(aa->aa_lastnet)) { - elh->el_dnode = satocsat(rtcache_getdst(ro))->sat_addr.s_node; + elh->el_dnode = + satocsat(rtcache_getdst(ro))->sat_addr.s_node; } else { elh->el_dnode = satosat(rt->rt_gateway)->sat_addr.s_node; @@ -184,5 +205,13 @@ ddp_route(struct mbuf *m, struct route * #endif /* XXX */ + if (loopback && rtcache_getdst(ro)->sa_family == AF_APPLETALK) { + struct mbuf *copym = m_copypacket(m, M_DONTWAIT); + +#ifdef NETATALKDEBUG + printf("Looping back (not AARP).\n"); +#endif + looutput(lo0ifp, copym, rtcache_getdst(ro), NULL); + } return (*ifp->if_output)(ifp, m, (struct sockaddr *)&gate, NULL); }