|
@@ -1031,70 +1031,72 @@ nla_put_failure:
|
|
|
referring to it.
|
|
|
- device went down -> we must shutdown all nexthops going via it.
|
|
|
*/
|
|
|
-
|
|
|
-int fib_sync_down(__be32 local, struct net_device *dev, int force)
|
|
|
+int fib_sync_down_addr(__be32 local)
|
|
|
{
|
|
|
int ret = 0;
|
|
|
- int scope = RT_SCOPE_NOWHERE;
|
|
|
-
|
|
|
- if (force)
|
|
|
- scope = -1;
|
|
|
+ unsigned int hash = fib_laddr_hashfn(local);
|
|
|
+ struct hlist_head *head = &fib_info_laddrhash[hash];
|
|
|
+ struct hlist_node *node;
|
|
|
+ struct fib_info *fi;
|
|
|
|
|
|
- if (local && fib_info_laddrhash) {
|
|
|
- unsigned int hash = fib_laddr_hashfn(local);
|
|
|
- struct hlist_head *head = &fib_info_laddrhash[hash];
|
|
|
- struct hlist_node *node;
|
|
|
- struct fib_info *fi;
|
|
|
+ if (fib_info_laddrhash == NULL || local == 0)
|
|
|
+ return 0;
|
|
|
|
|
|
- hlist_for_each_entry(fi, node, head, fib_lhash) {
|
|
|
- if (fi->fib_prefsrc == local) {
|
|
|
- fi->fib_flags |= RTNH_F_DEAD;
|
|
|
- ret++;
|
|
|
- }
|
|
|
+ hlist_for_each_entry(fi, node, head, fib_lhash) {
|
|
|
+ if (fi->fib_prefsrc == local) {
|
|
|
+ fi->fib_flags |= RTNH_F_DEAD;
|
|
|
+ ret++;
|
|
|
}
|
|
|
}
|
|
|
+ return ret;
|
|
|
+}
|
|
|
|
|
|
- if (dev) {
|
|
|
- struct fib_info *prev_fi = NULL;
|
|
|
- unsigned int hash = fib_devindex_hashfn(dev->ifindex);
|
|
|
- struct hlist_head *head = &fib_info_devhash[hash];
|
|
|
- struct hlist_node *node;
|
|
|
- struct fib_nh *nh;
|
|
|
+int fib_sync_down_dev(struct net_device *dev, int force)
|
|
|
+{
|
|
|
+ int ret = 0;
|
|
|
+ int scope = RT_SCOPE_NOWHERE;
|
|
|
+ struct fib_info *prev_fi = NULL;
|
|
|
+ unsigned int hash = fib_devindex_hashfn(dev->ifindex);
|
|
|
+ struct hlist_head *head = &fib_info_devhash[hash];
|
|
|
+ struct hlist_node *node;
|
|
|
+ struct fib_nh *nh;
|
|
|
|
|
|
- hlist_for_each_entry(nh, node, head, nh_hash) {
|
|
|
- struct fib_info *fi = nh->nh_parent;
|
|
|
- int dead;
|
|
|
+ if (force)
|
|
|
+ scope = -1;
|
|
|
|
|
|
- BUG_ON(!fi->fib_nhs);
|
|
|
- if (nh->nh_dev != dev || fi == prev_fi)
|
|
|
- continue;
|
|
|
- prev_fi = fi;
|
|
|
- dead = 0;
|
|
|
- change_nexthops(fi) {
|
|
|
- if (nh->nh_flags&RTNH_F_DEAD)
|
|
|
- dead++;
|
|
|
- else if (nh->nh_dev == dev &&
|
|
|
- nh->nh_scope != scope) {
|
|
|
- nh->nh_flags |= RTNH_F_DEAD;
|
|
|
+ hlist_for_each_entry(nh, node, head, nh_hash) {
|
|
|
+ struct fib_info *fi = nh->nh_parent;
|
|
|
+ int dead;
|
|
|
+
|
|
|
+ BUG_ON(!fi->fib_nhs);
|
|
|
+ if (nh->nh_dev != dev || fi == prev_fi)
|
|
|
+ continue;
|
|
|
+ prev_fi = fi;
|
|
|
+ dead = 0;
|
|
|
+ change_nexthops(fi) {
|
|
|
+ if (nh->nh_flags&RTNH_F_DEAD)
|
|
|
+ dead++;
|
|
|
+ else if (nh->nh_dev == dev &&
|
|
|
+ nh->nh_scope != scope) {
|
|
|
+ nh->nh_flags |= RTNH_F_DEAD;
|
|
|
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
|
|
- spin_lock_bh(&fib_multipath_lock);
|
|
|
- fi->fib_power -= nh->nh_power;
|
|
|
- nh->nh_power = 0;
|
|
|
- spin_unlock_bh(&fib_multipath_lock);
|
|
|
+ spin_lock_bh(&fib_multipath_lock);
|
|
|
+ fi->fib_power -= nh->nh_power;
|
|
|
+ nh->nh_power = 0;
|
|
|
+ spin_unlock_bh(&fib_multipath_lock);
|
|
|
#endif
|
|
|
- dead++;
|
|
|
- }
|
|
|
+ dead++;
|
|
|
+ }
|
|
|
#ifdef CONFIG_IP_ROUTE_MULTIPATH
|
|
|
- if (force > 1 && nh->nh_dev == dev) {
|
|
|
- dead = fi->fib_nhs;
|
|
|
- break;
|
|
|
- }
|
|
|
-#endif
|
|
|
- } endfor_nexthops(fi)
|
|
|
- if (dead == fi->fib_nhs) {
|
|
|
- fi->fib_flags |= RTNH_F_DEAD;
|
|
|
- ret++;
|
|
|
+ if (force > 1 && nh->nh_dev == dev) {
|
|
|
+ dead = fi->fib_nhs;
|
|
|
+ break;
|
|
|
}
|
|
|
+#endif
|
|
|
+ } endfor_nexthops(fi)
|
|
|
+ if (dead == fi->fib_nhs) {
|
|
|
+ fi->fib_flags |= RTNH_F_DEAD;
|
|
|
+ ret++;
|
|
|
}
|
|
|
}
|
|
|
|