Index: arp.c =================================================================== --- arp.c (revision 253) +++ arp.c (working copy) @@ -190,17 +190,24 @@ continue; if (reply->ar_pln != sizeof (struct in_addr)) continue; - - if (reply->ar_hln != ETHER_ADDR_LEN) - continue; if ((unsigned) bytes < sizeof (reply) + 2 * (4 + reply->ar_hln)) continue; + /* Ensure the ARP reply is for the address we asked for */ + if (rp.a->s_addr != address.s_addr) + continue; + + /* Some systems send a reply back from our hwaddress - weird */ + if (reply->ar_hln == iface->hwlen && + memcmp (rh.c, iface->hwaddr, iface->hwlen) == 0) + continue; + rp.c = (unsigned char *) ar_spa (reply); rh.c = (unsigned char *) ar_sha (reply); logger (LOG_ERR, "ARPOP_REPLY received from %s (%s)", - inet_ntoa (*rp.a), ether_ntoa (rh.a)); + inet_ntoa (*rp.a), + hwaddr_ntoa (rh.c, reply->ar_hln)); retval = -1; goto eexit; }