diff options
Diffstat (limited to 'net/core/dev.c')
| -rw-r--r-- | net/core/dev.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index a4f3b0a9aeaf..b92d63bfde7a 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
| @@ -6087,6 +6087,50 @@ void netdev_lower_state_changed(struct net_device *lower_dev, | |||
| 6087 | } | 6087 | } |
| 6088 | EXPORT_SYMBOL(netdev_lower_state_changed); | 6088 | EXPORT_SYMBOL(netdev_lower_state_changed); |
| 6089 | 6089 | ||
| 6090 | int netdev_default_l2upper_neigh_construct(struct net_device *dev, | ||
| 6091 | struct neighbour *n) | ||
| 6092 | { | ||
| 6093 | struct net_device *lower_dev, *stop_dev; | ||
| 6094 | struct list_head *iter; | ||
| 6095 | int err; | ||
| 6096 | |||
| 6097 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
| 6098 | if (!lower_dev->netdev_ops->ndo_neigh_construct) | ||
| 6099 | continue; | ||
| 6100 | err = lower_dev->netdev_ops->ndo_neigh_construct(lower_dev, n); | ||
| 6101 | if (err) { | ||
| 6102 | stop_dev = lower_dev; | ||
| 6103 | goto rollback; | ||
| 6104 | } | ||
| 6105 | } | ||
| 6106 | return 0; | ||
| 6107 | |||
| 6108 | rollback: | ||
| 6109 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
| 6110 | if (lower_dev == stop_dev) | ||
| 6111 | break; | ||
| 6112 | if (!lower_dev->netdev_ops->ndo_neigh_destroy) | ||
| 6113 | continue; | ||
| 6114 | lower_dev->netdev_ops->ndo_neigh_destroy(lower_dev, n); | ||
| 6115 | } | ||
| 6116 | return err; | ||
| 6117 | } | ||
| 6118 | EXPORT_SYMBOL_GPL(netdev_default_l2upper_neigh_construct); | ||
| 6119 | |||
| 6120 | void netdev_default_l2upper_neigh_destroy(struct net_device *dev, | ||
| 6121 | struct neighbour *n) | ||
| 6122 | { | ||
| 6123 | struct net_device *lower_dev; | ||
| 6124 | struct list_head *iter; | ||
| 6125 | |||
| 6126 | netdev_for_each_lower_dev(dev, lower_dev, iter) { | ||
| 6127 | if (!lower_dev->netdev_ops->ndo_neigh_destroy) | ||
| 6128 | continue; | ||
| 6129 | lower_dev->netdev_ops->ndo_neigh_destroy(lower_dev, n); | ||
| 6130 | } | ||
| 6131 | } | ||
| 6132 | EXPORT_SYMBOL_GPL(netdev_default_l2upper_neigh_destroy); | ||
| 6133 | |||
| 6090 | static void dev_change_rx_flags(struct net_device *dev, int flags) | 6134 | static void dev_change_rx_flags(struct net_device *dev, int flags) |
| 6091 | { | 6135 | { |
| 6092 | const struct net_device_ops *ops = dev->netdev_ops; | 6136 | const struct net_device_ops *ops = dev->netdev_ops; |
