From patchwork Thu Dec 1 22:56:34 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mahesh Bandewar X-Patchwork-Id: 701732 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3tVCMh5Btkz9vFc for ; Fri, 2 Dec 2016 09:56:48 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=bandewar-net.20150623.gappssmtp.com header.i=@bandewar-net.20150623.gappssmtp.com header.b="SVARiUNG"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754848AbcLAW4p (ORCPT ); Thu, 1 Dec 2016 17:56:45 -0500 Received: from mail-pf0-f193.google.com ([209.85.192.193]:33038 "EHLO mail-pf0-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751510AbcLAW4o (ORCPT ); Thu, 1 Dec 2016 17:56:44 -0500 Received: by mail-pf0-f193.google.com with SMTP id 144so12497145pfv.0 for ; Thu, 01 Dec 2016 14:56:43 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bandewar-net.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id; bh=jfhbtR4LNCRGdKQIjfQkWAbSMTKVF/nl2tuyZq+3xNY=; b=SVARiUNGmgW3wC7eDL0eevBEW2iUOrrKOpjCmCszKdkDK1gk8/BqbHW3RxvlB5NmK6 uaJVn/PnMOOE/nZW7bOy7yd8xUQF3JNNDYMfX3i/cTzsTGx/hvuhsjbUxGEUXrAAW+VE vcS+rNInUK657CD/FRbtz1+6Gq7zK1H2WcNb/KHmfKjKEKGbegHwx501KOOJJs7ZzgXG uEF2uq3r/fDGVyzRy9r9XCtaBpJEdnnPZu1pRvagKsn/0JFfwNrrX3qlwSFuOYNt+nfz sIqaMIQGo4j52JuYzajRAcWahU1uuH0zCFLoq8Na3NN2nfKryNSpvJFzkjEpXVHESZHb Op8A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=jfhbtR4LNCRGdKQIjfQkWAbSMTKVF/nl2tuyZq+3xNY=; b=AvQ0HptK/a/pAzaIF/6JsnpV6HNA2MlS/1L8rAmYvaHNoDXIkYNtI943ddm9Dl7YAF X0DdtTGp6dzjRffp7R3VMBod8/4pmB4sncj4ZSLRxfeZfHtBSHOXADYd0YXhfHG6Df8v ZSORpTpFbvLHp/hefUTlhRPtmBLlZNvO5l5vDZS9CzJw3lK3u35WDVHCMROU5y2fLI3V X0e2lVUfjL349oL42YQYcgU//WhSwSpKpEYBj0/pexO+3MRo7ZDGahlFRpP3yLmK4+bR rrc1/dhNb+o5+mSKNMmWdnUHTklJ6ZioJI6xwco/GCG9PLJggy4B5ax8LHlkME0Iy4Ky aS0A== X-Gm-Message-State: AKaTC03EHVJ1oxoCiIVpibxQDaSGqF/b4H2MyQM7k5ulsC1Cj0o+xzrBzDMhNIUAV73aYQ== X-Received: by 10.84.218.136 with SMTP id r8mr89645391pli.23.1480633003438; Thu, 01 Dec 2016 14:56:43 -0800 (PST) Received: from localhost ([2620:0:1000:3012:5855:5a64:181c:2529]) by smtp.gmail.com with ESMTPSA id a66sm2446368pfa.64.2016.12.01.14.56.42 (version=TLS1_2 cipher=AES128-SHA bits=128/128); Thu, 01 Dec 2016 14:56:42 -0800 (PST) From: Mahesh Bandewar To: netdev , Eric Dumazet , David Miller Cc: Mahesh Bandewar Subject: [PATCH next] arp: avoid sending ucast probes to 00:00:00:00:00:00 Date: Thu, 1 Dec 2016 14:56:34 -0800 Message-Id: <1480632994-12128-1-git-send-email-mahesh@bandewar.net> X-Mailer: git-send-email 2.8.0.rc3.226.g39d4020 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Mahesh Bandewar If initial broadcast probe(s) is/are lost, the neigh entry wont have valid address of the neighbour. In a situation like this, the fall back should be to send a broadcast probe, however the code logic continues sending ucast probes to 00:00:00:00:00:00. The default value of ucast probes is 3 so system usually recovers after three such probes but if the value configured is larger it takes those many probes (a probe is sent every second in default config) / seconds to recover making machine not-available on the network. This patch just ensures that the unicast address is not NULL otherwise falls back to sending broadcast probe. Signed-off-by: Mahesh Bandewar --- net/ipv4/arp.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 89a8cac4726a..56fb33d5ed31 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c @@ -330,6 +330,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) { __be32 saddr = 0; u8 dst_ha[MAX_ADDR_LEN], *dst_hw = NULL; + u8 null_dev_hw_addr[MAX_ADDR_LEN]; struct net_device *dev = neigh->dev; __be32 target = *(__be32 *)neigh->primary_key; int probes = atomic_read(&neigh->probes); @@ -371,10 +372,12 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) probes -= NEIGH_VAR(neigh->parms, UCAST_PROBES); if (probes < 0) { + memset(&null_dev_hw_addr, 0, dev->addr_len); if (!(neigh->nud_state & NUD_VALID)) pr_debug("trying to ucast probe in NUD_INVALID\n"); neigh_ha_snapshot(dst_ha, neigh, dev); - dst_hw = dst_ha; + if (memcmp(&dst_ha, &null_dev_hw_addr, dev->addr_len) != 0) + dst_hw = dst_ha; } else { probes -= NEIGH_VAR(neigh->parms, APP_PROBES); if (probes < 0) {