Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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);
};

/*
+14 −1
Original line number Diff line number Diff line
@@ -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);