From owner-freebsd-current Tue Aug 4 16:17:41 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id QAA13862 for freebsd-current-outgoing; Tue, 4 Aug 1998 16:17:41 -0700 (PDT) (envelope-from owner-freebsd-current@FreeBSD.ORG) Received: from rrz.Hanse.DE (rrz.Hanse.DE [193.174.9.3]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id QAA13856 for ; Tue, 4 Aug 1998 16:17:36 -0700 (PDT) (envelope-from stb@hanse.de) Received: from daemon.Hanse.DE (daemon.Hanse.DE [193.174.9.17]) by rrz.Hanse.DE (8.8.8/8.8.8) with ESMTP id AAA28917; Wed, 5 Aug 1998 00:40:02 +0200 (CEST) (envelope-from stb@hanse.de) Received: from transit.hanse.de (transit.Hanse.DE [193.174.9.161]) by daemon.Hanse.DE (8.8.8/8.8.8) with ESMTP id AAA10897; Wed, 5 Aug 1998 00:46:25 +0200 (CEST) (envelope-from stb@hanse.de) Received: from localhost (stb@localhost) by transit.hanse.de (8.8.8/8.8.8) with SMTP id AAA02134; Wed, 5 Aug 1998 00:43:55 +0200 (CEST) X-Authentication-Warning: transit.hanse.de: stb owned process doing -bs Date: Wed, 5 Aug 1998 00:43:55 +0200 (CEST) From: Stefan Bethke To: Julian Elischer cc: Parag Patel , current@FreeBSD.ORG Subject: Re: Netatalk name-registering problem with -current In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-current@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Tue, 4 Aug 1998, Stefan Bethke wrote: > On Sat, 1 Aug 1998, Julian Elischer wrote: > > > yes there is a problem with -current and netatalk name registration. > > > > it's on my list of things to look at.. > > there are two suspicious areas.. > > I've delved a bit into this and think I've found the problem. > > In net/ether_output, around line 365, if_simloop() is called with a fixed > LLC header length of ETHER_HDR_LEN, instead of whatever length the header > has (in case of a SNAP frame [Phase 2], its a LLC header). There's a second problem: because packets for our own address are handed to ether_output, an aarpresolve() is tried. As it seems to me, our own MAC address isn't in the table, so a request goes out and is received by aarp_input(). aarp_input() however doesn't respond to requests coming from the address of the interface it was received from; so the packet is never delivered. The quick workaround is to call if_simloop() from ddp_output. The right thing to do would be to integrate AARP into the routing tables (as for ARP). If I could only figure out how this whole stuff works... Enought muttering: please test the following patch. At least you can successfully register, deregister, and query NBPs again; because my oldish IIcx went up in smoke the last night I have nothing to really test it against. --------- snip ---------- Index: src/sys/net/if_ethersubr.c =================================================================== RCS file: /home/ncvs/src/sys/net/if_ethersubr.c,v retrieving revision 1.51 diff -u -r1.51 if_ethersubr.c --- if_ethersubr.c 1998/06/14 20:58:14 1.51 +++ if_ethersubr.c 1998/08/04 20:13:12 @@ -132,6 +132,7 @@ register struct rtentry *rt; register struct ether_header *eh; int off, len = m->m_pkthdr.len, loop_copy = 0; + int hlen; /* link layer header lenght */ struct arpcom *ac = (struct arpcom *)ifp; if ((ifp->if_flags & (IFF_UP|IFF_RUNNING)) != (IFF_UP|IFF_RUNNING)) @@ -161,6 +162,7 @@ time_second < rt->rt_rmx.rmx_expire) senderr(rt == rt0 ? EHOSTDOWN : EHOSTUNREACH); } + hlen = ETHER_HDR_LEN; switch (dst->sa_family) { #ifdef INET case AF_INET: @@ -203,6 +205,7 @@ llc.llc_snap_ether_type = htons( ETHERTYPE_AT ); bcopy(&llc, mtod(m, caddr_t), sizeof(struct llc)); type = htons(m->m_pkthdr.len); + hlen = sizeof(struct llc) + ETHER_HDR_LEN; } else { type = htons(ETHERTYPE_AT); } @@ -362,10 +365,10 @@ if ((m->m_flags & M_BCAST) || (loop_copy > 0)) { struct mbuf *n = m_copy(m, 0, (int)M_COPYALL); - (void) if_simloop(ifp, n, dst, ETHER_HDR_LEN); + (void) if_simloop(ifp, n, dst, hlen); } else if (bcmp(eh->ether_dhost, eh->ether_shost, ETHER_ADDR_LEN) == 0) { - (void) if_simloop(ifp, m, dst, ETHER_HDR_LEN); + (void) if_simloop(ifp, m, dst, hlen); return(0); /* XXX */ } } Index: src/sys/netatalk/ddp_output.c =================================================================== RCS file: /home/ncvs/src/sys/netatalk/ddp_output.c,v retrieving revision 1.12 diff -u -r1.12 ddp_output.c --- ddp_output.c 1998/07/13 06:34:02 1.12 +++ ddp_output.c 1998/08/04 22:29:06 @@ -72,6 +72,11 @@ } deh->deh_bytes = htonl( deh->deh_bytes ); +#ifdef NETATALK_DEBUG + printf ("ddp_output: from %d.%d:%d to %d.%d:%d\n", + ntohs(deh->deh_snet), deh->deh_snode, deh->deh_sport, + ntohs(deh->deh_dnet), deh->deh_dnode, deh->deh_dport); +#endif return( ddp_route( m, &ddp->ddp_route )); } @@ -142,13 +147,24 @@ } } else { m_freem( m ); - return( EINVAL ); +#ifdef NETATALK_DEBUG + if (ro->ro_rt == NULL) + printf ("ddp_route: no ro_rt.\n"); + else if (ro->ro_rt->rt_ifa == NULL) + printf ("ddp_route: no ro_rt->rt_ifa\n"); + else + printf ("ddp_route: no ro_rt->rt_ifa->ifa_ifp\n"); +#endif + return( ENETUNREACH ); } if ( aa == NULL ) { -printf( "ddp_route: oops\n" ); +#ifdef NETATALK_DEBUG + printf( "ddp_route: no atalk address found for %s%d\n", + ifp->if_name, ifp->if_unit); +#endif m_freem( m ); - return( EINVAL ); + return( ENETUNREACH ); } /* @@ -189,7 +205,24 @@ } ro->ro_rt->rt_use++; +#ifdef NETATALK_DEBUG + printf ("ddp_route: from %d.%d to %d.%d, via %d.%d (%s%d)\n", + ntohs(satosat(&aa->aa_addr)->sat_addr.s_net), + satosat(&aa->aa_addr)->sat_addr.s_node, + ntohs(satosat(&ro->ro_dst)->sat_addr.s_net), + satosat(&ro->ro_dst)->sat_addr.s_node, + ntohs(gate.sat_addr.s_net), + gate.sat_addr.s_node, + ifp->if_name, ifp->if_unit); +#endif + + /* short-circuit the output if we're sending this to ourself */ + if ((satosat(&aa->aa_addr)->sat_addr.s_net == satosat(&ro->ro_dst)->sat_addr.s_net) && + (satosat(&aa->aa_addr)->sat_addr.s_node == satosat(&ro->ro_dst)->sat_addr.s_node)) + { + return (if_simloop(ifp, m, (struct sockaddr *)&gate, 0)); + } + return((*ifp->if_output)( ifp, m, (struct sockaddr *)&gate, NULL)); /* XXX */ } - ---------- snip ----------- Cheers, Stefan -- Stefan Bethke Muehlendamm 12 Phone: +49-40-256848, +49-177-3504009 D-22087 Hamburg Hamburg, Germany To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-current" in the body of the message