Commit da6a8fa0 authored by David Miller's avatar David Miller Committed by David S. Miller

neigh: Add device constructor/destructor capability.

If the neigh entry has device private state, it will need
constructor/destructor ops.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 869759b9
...@@ -974,6 +974,8 @@ struct net_device_ops { ...@@ -974,6 +974,8 @@ struct net_device_ops {
netdev_features_t features); netdev_features_t features);
int (*ndo_set_features)(struct net_device *dev, int (*ndo_set_features)(struct net_device *dev,
netdev_features_t features); netdev_features_t features);
int (*ndo_neigh_construct)(struct neighbour *n);
int (*ndo_neigh_destroy)(struct neighbour *n);
}; };
/* /*
......
...@@ -489,6 +489,14 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey, ...@@ -489,6 +489,14 @@ struct neighbour *neigh_create(struct neigh_table *tbl, const void *pkey,
goto out_neigh_release; 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. */ /* Device specific setup. */
if (n->parms->neigh_setup && if (n->parms->neigh_setup &&
(error = n->parms->neigh_setup(n)) < 0) { (error = n->parms->neigh_setup(n)) < 0) {
...@@ -692,6 +700,8 @@ static inline void neigh_parms_put(struct neigh_parms *parms) ...@@ -692,6 +700,8 @@ static inline void neigh_parms_put(struct neigh_parms *parms)
*/ */
void neigh_destroy(struct neighbour *neigh) void neigh_destroy(struct neighbour *neigh)
{ {
struct net_device *dev = neigh->dev;
NEIGH_CACHE_STAT_INC(neigh->tbl, destroys); NEIGH_CACHE_STAT_INC(neigh->tbl, destroys);
if (!neigh->dead) { if (!neigh->dead) {
...@@ -707,7 +717,10 @@ void neigh_destroy(struct neighbour *neigh) ...@@ -707,7 +717,10 @@ void neigh_destroy(struct neighbour *neigh)
skb_queue_purge(&neigh->arp_queue); skb_queue_purge(&neigh->arp_queue);
neigh->arp_queue_len_bytes = 0; 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_parms_put(neigh->parms);
NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh); NEIGH_PRINTK2("neigh %p is destroyed.\n", neigh);
......
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