From 9d488d550b4e1597e5f87f7392c38393686c9f54 Mon Sep 17 00:00:00 2001 From: David Miller Date: Mon, 25 Jul 2011 00:01:38 +0000 Subject: [PATCH] --- yaml --- r: 278302 b: refs/heads/master c: da6a8fa0275e2178c44a875374cae80d057538d1 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/include/linux/netdevice.h | 2 ++ trunk/net/core/neighbour.c | 15 ++++++++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index 8e3a98d7af6c..99b470e53b35 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 869759b9e4160fb8a8d25bc3b4ce3b658523aebb +refs/heads/master: da6a8fa0275e2178c44a875374cae80d057538d1 diff --git a/trunk/include/linux/netdevice.h b/trunk/include/linux/netdevice.h index 5462c2cd5eab..1c4ddb37f2b5 100644 --- a/trunk/include/linux/netdevice.h +++ b/trunk/include/linux/netdevice.h @@ -974,6 +974,8 @@ struct net_device_ops { netdev_features_t features); int (*ndo_set_features)(struct net_device *dev, netdev_features_t features); + int (*ndo_neigh_construct)(struct neighbour *n); + int (*ndo_neigh_destroy)(struct neighbour *n); }; /* diff --git a/trunk/net/core/neighbour.c b/trunk/net/core/neighbour.c index ef750ff7497e..cdf8dc34f0ba 100644 --- a/trunk/net/core/neighbour.c +++ b/trunk/net/core/neighbour.c @@ -489,6 +489,14 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey, goto out_neigh_release; } + if (dev->netdev_ops->ndo_neigh_construct) { + error = dev->netdev_ops->ndo_neigh_construct(n); + if (error < 0) { + rc = ERR_PTR(error); + goto out_neigh_release; + } + } + /* Device specific setup. */ if (n->parms->neigh_setup && (error = n->parms->neigh_setup(n)) < 0) { @@ -692,6 +700,8 @@ static inline void neigh_parms_put(struct neigh_parms *parms) */ void neigh_destroy(struct neighbour *neigh) { + struct net_device *dev = neigh->dev; + NEIGH_CACHE_STAT_INC(neigh->tbl, destroys); if (!neigh->dead) { @@ -707,7 +717,10 @@ void neigh_destroy(struct neighbour *neigh) skb_queue_purge(&neigh->arp_queue); neigh->arp_queue_len_bytes = 0; - dev_put(neigh->dev); + if (dev->netdev_ops->ndo_neigh_destroy) + dev->netdev_ops->ndo_neigh_destroy(neigh); + + dev_put(dev); neigh_parms_put(neigh->parms); NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh);