Hi Joe, On Tue, Mar 27, 2012 at 4:43 PM, Joe Hershberger <joe.hershber...@ni.com> wrote: > Cisco's arp-proxy feature fails to ignore the link-local address range > This means that a link-local device on a network with this Cisco > equipment will reply to ARP requests for our device (in addition to > our reply). > If we happen to reply first, the requester's ARP table will be > populated with our MAC address, and one packet will be sent to us... > shortly following this, the requester will get an ARP reply from the > Cisco equipment telling the requester to send packets their way > instead of to our device from now on. > This work-around detects this link-local condition and will delay > replying to the ARP request for 5ms so that the first packet is sent > to the Cisco equipment and all following packets are sent to our > device. > > Signed-off-by: Joe Hershberger <joe.hershber...@ni.com> > Cc: Joe Hershberger <joe.hershber...@gmail.com> > Cc: Simon Glass <s...@chromium.org> > Cc: Mike Frysinger <vap...@gentoo.org> > --- > Changes for v2: > - Guard with #ifdef CONFIG_CMD_LINK_LOCAL > > net/arp.c | 14 ++++++++++++++ > 1 files changed, 14 insertions(+), 0 deletions(-) > > diff --git a/net/arp.c b/net/arp.c > index 7599d30..56c5da8 100644 > --- a/net/arp.c > +++ b/net/arp.c > @@ -169,6 +169,20 @@ void ArpReceive(struct Ethernet_hdr *et, struct > IP_UDP_hdr *ip, int len) > NetCopyIP(&arp->ar_tpa, &arp->ar_spa); > memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN); > NetCopyIP(&arp->ar_spa, &NetOurIP); > + > +#ifdef CONFIG_CMD_LINK_LOCAL > + /* > + * Work-around for brain-damaged Cisco equipment with > + * arp-proxy enabled. > + * > + * If the requesting IP is not on our subnet, wait 5ms to > + * reply to ARP request so that our reply will overwrite > + * the arp-proxy's instead of the other way around. > + */ > + if ((NetReadIP(&arp->ar_tpa) & NetOurSubnetMask) != > + (NetReadIP(&arp->ar_spa) & NetOurSubnetMask)) > + udelay(5000); > +#endif
I'm sure this solves the problem, but is 5ms enough, and should we make this a CONFIG option so it can be turned off if needed? > NetSendPacket((uchar *)et, eth_hdr_size + ARP_HDR_SIZE); > return; > > -- > 1.6.0.2 > Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot