Commit 596b9b68 authored by David Miller's avatar David Miller Committed by David S. Miller

neigh: Add infrastructure for allocating device neigh privates.

netdev->neigh_priv_len records the private area length.

This will trigger for neigh_table objects which set tbl->entry_size
to zero, and the first instances of this will be forthcoming.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5b8b0060
...@@ -1218,6 +1218,8 @@ static struct net_device *ipoib_add_port(const char *format, ...@@ -1218,6 +1218,8 @@ static struct net_device *ipoib_add_port(const char *format,
priv->dev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu); priv->dev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu);
priv->mcast_mtu = priv->admin_mtu = priv->dev->mtu; priv->mcast_mtu = priv->admin_mtu = priv->dev->mtu;
priv->dev->neigh_priv_len = sizeof(struct ipoib_neigh);
result = ib_query_pkey(hca, port, 0, &priv->pkey); result = ib_query_pkey(hca, port, 0, &priv->pkey);
if (result) { if (result) {
printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n", printk(KERN_WARNING "%s: ib_query_pkey port %d failed (ret = %d)\n",
......
...@@ -1080,6 +1080,7 @@ struct net_device { ...@@ -1080,6 +1080,7 @@ struct net_device {
unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */ unsigned char perm_addr[MAX_ADDR_LEN]; /* permanent hw address */
unsigned char addr_assign_type; /* hw address assignment type */ unsigned char addr_assign_type; /* hw address assignment type */
unsigned char addr_len; /* hardware address length */ unsigned char addr_len; /* hardware address length */
unsigned char neigh_priv_len;
unsigned short dev_id; /* for shared network cards */ unsigned short dev_id; /* for shared network cards */
spinlock_t addr_list_lock; spinlock_t addr_list_lock;
......
...@@ -535,6 +535,7 @@ static void clip_setup(struct net_device *dev) ...@@ -535,6 +535,7 @@ static void clip_setup(struct net_device *dev)
{ {
dev->netdev_ops = &clip_netdev_ops; dev->netdev_ops = &clip_netdev_ops;
dev->type = ARPHRD_ATM; dev->type = ARPHRD_ATM;
dev->neigh_priv_len = sizeof(struct atmarp_entry);
dev->hard_header_len = RFC1483LLC_LEN; dev->hard_header_len = RFC1483LLC_LEN;
dev->mtu = RFC1626_MTU; dev->mtu = RFC1626_MTU;
dev->tx_queue_len = 100; /* "normal" queue (packets) */ dev->tx_queue_len = 100; /* "normal" queue (packets) */
......
...@@ -273,7 +273,7 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev) ...@@ -273,7 +273,7 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
} }
EXPORT_SYMBOL(neigh_ifdown); 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; struct neighbour *n = NULL;
unsigned long now = jiffies; unsigned long now = jiffies;
...@@ -288,7 +288,15 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl) ...@@ -288,7 +288,15 @@ static struct neighbour *neigh_alloc(struct neigh_table *tbl)
goto out_entries; 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) if (!n)
goto out_entries; goto out_entries;
...@@ -463,7 +471,7 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey, ...@@ -463,7 +471,7 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
u32 hash_val; u32 hash_val;
int key_len = tbl->key_len; int key_len = tbl->key_len;
int error; int error;
struct neighbour *n1, *rc, *n = neigh_alloc(tbl); struct neighbour *n1, *rc, *n = neigh_alloc(tbl, dev);
struct neigh_hash_table *nht; struct neigh_hash_table *nht;
if (!n) { if (!n) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment