Re: 2.4.28(+?): Strange ARP problem

From: Scott Doty
Date: Thu Jan 13 2005 - 19:24:15 EST


On Fri, Jan 14, 2005 at 08:01:42AM +1100, Herbert Xu wrote:
> On Thu, Jan 13, 2005 at 10:09:00AM -0200, Marcelo Tosatti wrote:
> >
> > Maybe you can try earlier v2.4.28's (-rc1 for one) to check where
> > the problem starts to happen?
>
> The symptom sounds like the bug in the 2.4 backport of the neighbour
> hash updates. In neigh_create, hash_val needs to be computed inside
> the lock (and after the growing), not outside.
>
> Someone even posted a patch for it. I'll dig it up tonight if it
> doesn't show up by then.

I just built a patch from your description -- it's attached.

-Scott
--- linux-2.4.29-rc2/net/core/neighbour.c 2005/01/13 21:55:06 1.1
+++ linux-2.4.29-rc2/net/core/neighbour.c 2005/01/13 21:56:32
@@ -427,11 +427,12 @@

n->confirmed = jiffies - (n->parms->base_reachable_time<<1);

- hash_val = tbl->hash(pkey, dev) & tbl->hash_mask;
-
write_lock_bh(&tbl->lock);
if (atomic_read(&tbl->entries) > (tbl->hash_mask + 1))
neigh_hash_grow(tbl, (tbl->hash_mask + 1) << 1);
+
+ hash_val = tbl->hash(pkey, dev) & tbl->hash_mask;
+
for (n1 = tbl->hash_buckets[hash_val]; n1; n1 = n1->next) {
if (dev == n1->dev &&
memcmp(n1->primary_key, pkey, key_len) == 0) {