|
@@ -118,7 +118,7 @@ static void mr6_netlink_event(struct mr6_table *mrt, struct mfc6_cache *mfc,
|
|
|
int cmd);
|
|
|
static int ip6mr_rtm_dumproute(struct sk_buff *skb,
|
|
|
struct netlink_callback *cb);
|
|
|
-static void mroute_clean_tables(struct mr6_table *mrt);
|
|
|
+static void mroute_clean_tables(struct mr6_table *mrt, bool all);
|
|
|
static void ipmr_expire_process(unsigned long arg);
|
|
|
|
|
|
#ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
|
|
@@ -334,7 +334,7 @@ static struct mr6_table *ip6mr_new_table(struct net *net, u32 id)
|
|
|
static void ip6mr_free_table(struct mr6_table *mrt)
|
|
|
{
|
|
|
del_timer_sync(&mrt->ipmr_expire_timer);
|
|
|
- mroute_clean_tables(mrt);
|
|
|
+ mroute_clean_tables(mrt, true);
|
|
|
kfree(mrt);
|
|
|
}
|
|
|
|
|
@@ -1542,7 +1542,7 @@ static int ip6mr_mfc_add(struct net *net, struct mr6_table *mrt,
|
|
|
* Close the multicast socket, and clear the vif tables etc
|
|
|
*/
|
|
|
|
|
|
-static void mroute_clean_tables(struct mr6_table *mrt)
|
|
|
+static void mroute_clean_tables(struct mr6_table *mrt, bool all)
|
|
|
{
|
|
|
int i;
|
|
|
LIST_HEAD(list);
|
|
@@ -1552,8 +1552,9 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
|
|
* Shut down all active vif entries
|
|
|
*/
|
|
|
for (i = 0; i < mrt->maxvif; i++) {
|
|
|
- if (!(mrt->vif6_table[i].flags & VIFF_STATIC))
|
|
|
- mif6_delete(mrt, i, &list);
|
|
|
+ if (!all && (mrt->vif6_table[i].flags & VIFF_STATIC))
|
|
|
+ continue;
|
|
|
+ mif6_delete(mrt, i, &list);
|
|
|
}
|
|
|
unregister_netdevice_many(&list);
|
|
|
|
|
@@ -1562,7 +1563,7 @@ static void mroute_clean_tables(struct mr6_table *mrt)
|
|
|
*/
|
|
|
for (i = 0; i < MFC6_LINES; i++) {
|
|
|
list_for_each_entry_safe(c, next, &mrt->mfc6_cache_array[i], list) {
|
|
|
- if (c->mfc_flags & MFC_STATIC)
|
|
|
+ if (!all && (c->mfc_flags & MFC_STATIC))
|
|
|
continue;
|
|
|
write_lock_bh(&mrt_lock);
|
|
|
list_del(&c->list);
|
|
@@ -1625,7 +1626,7 @@ int ip6mr_sk_done(struct sock *sk)
|
|
|
net->ipv6.devconf_all);
|
|
|
write_unlock_bh(&mrt_lock);
|
|
|
|
|
|
- mroute_clean_tables(mrt);
|
|
|
+ mroute_clean_tables(mrt, false);
|
|
|
err = 0;
|
|
|
break;
|
|
|
}
|