neigh: Add infrastructure for allocating device neigh privates.
[~shefty/rdma-dev.git] / net / core / neighbour.c
index 661ad12..ef750ff 100644 (file)
@@ -273,7 +273,7 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
 }
 EXPORT_SYMBOL(neigh_ifdown);
 
-static struct neighbour *neigh_alloc(struct neigh_table *tbl)
+static struct neighbour *neigh_alloc(struct neigh_table *tbl, struct net_device *dev)
 {
        struct neighbour *n = NULL;
        unsigned long now = jiffies;
@@ -288,7 +288,15 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl)
                        goto out_entries;
        }
 
-       n = kzalloc(tbl->entry_size, GFP_ATOMIC);
+       if (tbl->entry_size)
+               n = kzalloc(tbl->entry_size, GFP_ATOMIC);
+       else {
+               int sz = sizeof(*n) + tbl->key_len;
+
+               sz = ALIGN(sz, NEIGH_PRIV_ALIGN);
+               sz += dev->neigh_priv_len;
+               n = kzalloc(sz, GFP_ATOMIC);
+       }
        if (!n)
                goto out_entries;
 
@@ -463,7 +471,7 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
        u32 hash_val;
        int key_len = tbl->key_len;
        int error;
-       struct neighbour *n1, *rc, *n = neigh_alloc(tbl);
+       struct neighbour *n1, *rc, *n = neigh_alloc(tbl, dev);
        struct neigh_hash_table *nht;
 
        if (!n) {