Some applications/devices seem to forget their MAC address when
performing some kind of a failover which triggers (something that
looks like) a gratuities arp.

The ARP packet looks something like this:

  Address Resolution Protocol (reply)
      Hardware type: Ethernet (1)
      Protocol type: IPv4 (0x0800)
      Hardware size: 6
      Protocol size: 4
      Opcode: reply (2)
      Sender MAC address: 00:00:00:00:00:00
      Sender IP address: 10.0.0.1
      Target MAC address: 00:00:00:00:00:00
      Target IP address: 255.255.255.255

This will result in existing arp entries being overwritten with an all
zero mac address. Until the arp entry times out this host can no
longer initiate a connection to this device.

Checking for and ignoring invalid mac addresses will solve this
problem.

Signed-off-by: Eelco Chaudron <echau...@redhat.com>
---
 net/ipv4/arp.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index a8d7c5a9fb05..e60c88b203e9 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -750,6 +750,16 @@ static int arp_process(struct net *net, struct sock *sk, 
struct sk_buff *skb)
        case ARPHRD_IEEE1394:
                break;
 #endif
+       case ARPHRD_ETHER:
+       case ARPHRD_FDDI:
+       case ARPHRD_IEEE802:
+               /*
+                * Check for bad sender hardware addresses. An all zero MAC
+                * address is not valid for Ethernet, FDDI or IEEE802.
+                */
+               if (is_zero_ether_addr(sha))
+                       goto out_free_skb;
+               break;
        default:
                tha = arp_ptr;
                arp_ptr += dev->addr_len;
-- 
2.13.6

Reply via email to