Re: [Patch] arp: fix a regression in arp_solicit()
From: Sedat Dilek <hidden>
Date: 2012-12-23 14:58:53
On Sun, Dec 23, 2012 at 3:49 PM, Sedat Dilek [off-list ref] wrote:
On Sun, Dec 23, 2012 at 3:42 PM, Cong Wang [off-list ref] wrote:quoted
From: Cong Wang <redacted> Sedat reported the following commit caused a regression: commit 9650388b5c56578fdccc79c57a8c82fb92b8e7f1 Author: Eric Dumazet [off-list ref] Date: Fri Dec 21 07:32:10 2012 +0000 ipv4: arp: fix a lockdep splat in arp_solicit This is due to the 6th parameter of arp_send() needs to be NULL for broatcase case, the above commit changed it to all-zero non-NULL hw addr.s/broatcase/broadcast ?
While at it you might enhance the label with "ipv4"? ipv4: arp: fix a regression in arp_solicit()
- Sedat -quoted
Reported-by: Sedat Dilek <redacted> Tested-by: Sedat Dilek <redacted> Cc: Sedat Dilek <redacted> Cc: Eric Dumazet <edumazet@google.com> Cc: David S. Miller <davem@davemloft.net> Cc: Julian Anastasov <ja@ssi.bg> Signed-off-by: Cong Wang <redacted> ---diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 1169ed4..9547a273 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c@@ -321,7 +321,7 @@ static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb) static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) { __be32 saddr = 0; - u8 dst_ha[MAX_ADDR_LEN]; + u8 dst_ha[MAX_ADDR_LEN], *dst_hw = NULL; struct net_device *dev = neigh->dev; __be32 target = *(__be32 *)neigh->primary_key; int probes = atomic_read(&neigh->probes);@@ -364,8 +364,8 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) 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; } else { - memset(dst_ha, 0, dev->addr_len); probes -= neigh->parms->app_probes; if (probes < 0) { #ifdef CONFIG_ARPD@@ -376,7 +376,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb) } arp_send(ARPOP_REQUEST, ETH_P_ARP, target, dev, saddr, - dst_ha, dev->dev_addr, NULL); + dst_hw, dev->dev_addr, NULL); } static int arp_ignore(struct in_device *in_dev, __be32 sip, __be32 tip)