[U-Boot] [PATCH 27/28] net: Work-around for brain-damaged Cisco routers with arp-proxy

Joe Hershberger joe.hershberger at ni.com
Fri Jan 20 01:53:30 CET 2012


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.hershberger at ni.com>
Cc: Joe Hershberger <joe.hershberger at gmail.com>
Cc: Wolfgang Denk <wd at denx.de>
---
 net/arp.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/net/arp.c b/net/arp.c
index 9eb4ab0..8a7b4a2 100644
--- a/net/arp.c
+++ b/net/arp.c
@@ -172,6 +172,19 @@ void ArpReceive(struct Ethernet_t *et, struct IP_UDP_t *ip, int len)
 		NetCopyIP(&arp->ar_tpa, &arp->ar_spa);
 		memcpy(&arp->ar_sha, NetOurEther, ARP_HLEN);
 		NetCopyIP(&arp->ar_spa, &NetOurIP);
+
+		/*
+		 * 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);
+
 		NetSendPacket((uchar *)et, eth_hdr_size + ARP_HDR_SIZE);
 		return;
 
-- 
1.6.0.2



More information about the U-Boot mailing list