fix broken loopback code for ddp (again)

Submitted by: Stefan Bethke <stb@hanse.de>
This commit is contained in:
Julian Elischer 1998-08-04 23:17:05 +00:00
parent 5e91a8ac91
commit 84dd0fd0bb
2 changed files with 43 additions and 7 deletions

View File

@ -31,7 +31,7 @@
* SUCH DAMAGE.
*
* @(#)if_ethersubr.c 8.1 (Berkeley) 6/10/93
* $Id: if_ethersubr.c,v 1.50 1998/06/13 02:27:10 julian Exp $
* $Id: if_ethersubr.c,v 1.51 1998/06/14 20:58:14 julian Exp $
*/
#include "opt_atalk.h"
@ -132,6 +132,7 @@ ether_output(ifp, m0, dst, rt0)
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 @@ ether_output(ifp, m0, dst, rt0)
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 @@ ether_output(ifp, m0, dst, rt0)
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 @@ ether_output(ifp, m0, dst, rt0)
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 */
}
}

View File

@ -72,6 +72,11 @@ ddp_output( struct mbuf *m, struct socket *so)
}
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 @@ ddp_route( struct mbuf *m, struct route *ro)
}
} 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 @@ printf( "ddp_route: oops\n" );
}
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 */
}