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);
}