|
@@ -1003,6 +1003,25 @@ int icmp6_dst_gc(void)
|
|
return more;
|
|
return more;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void icmp6_clean_all(int (*func)(struct rt6_info *rt, void *arg),
|
|
|
|
+ void *arg)
|
|
|
|
+{
|
|
|
|
+ struct dst_entry *dst, **pprev;
|
|
|
|
+
|
|
|
|
+ spin_lock_bh(&icmp6_dst_lock);
|
|
|
|
+ pprev = &icmp6_dst_gc_list;
|
|
|
|
+ while ((dst = *pprev) != NULL) {
|
|
|
|
+ struct rt6_info *rt = (struct rt6_info *) dst;
|
|
|
|
+ if (func(rt, arg)) {
|
|
|
|
+ *pprev = dst->next;
|
|
|
|
+ dst_free(dst);
|
|
|
|
+ } else {
|
|
|
|
+ pprev = &dst->next;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ spin_unlock_bh(&icmp6_dst_lock);
|
|
|
|
+}
|
|
|
|
+
|
|
static int ip6_dst_gc(struct dst_ops *ops)
|
|
static int ip6_dst_gc(struct dst_ops *ops)
|
|
{
|
|
{
|
|
unsigned long now = jiffies;
|
|
unsigned long now = jiffies;
|
|
@@ -1930,6 +1949,7 @@ void rt6_ifdown(struct net *net, struct net_device *dev)
|
|
};
|
|
};
|
|
|
|
|
|
fib6_clean_all(net, fib6_ifdown, 0, &adn);
|
|
fib6_clean_all(net, fib6_ifdown, 0, &adn);
|
|
|
|
+ icmp6_clean_all(fib6_ifdown, &adn);
|
|
}
|
|
}
|
|
|
|
|
|
struct rt6_mtu_change_arg
|
|
struct rt6_mtu_change_arg
|