aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/ip_fib.h3
-rw-r--r--net/ipv4/fib_trie.c7
-rw-r--r--net/ipv4/route.c4
3 files changed, 12 insertions, 2 deletions
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index 514627f56339..10422ef14e28 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -160,7 +160,8 @@ struct fib_table {
160 struct hlist_node tb_hlist; 160 struct hlist_node tb_hlist;
161 u32 tb_id; 161 u32 tb_id;
162 int tb_default; 162 int tb_default;
163 unsigned char tb_data[0]; 163 int tb_num_default;
164 unsigned long tb_data[0];
164}; 165};
165 166
166extern int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, 167extern int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index bde80c450b52..9ac481a10d37 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -1332,6 +1332,9 @@ int fib_table_insert(struct fib_table *tb, struct fib_config *cfg)
1332 } 1332 }
1333 } 1333 }
1334 1334
1335 if (!plen)
1336 tb->tb_num_default++;
1337
1335 list_add_tail_rcu(&new_fa->fa_list, 1338 list_add_tail_rcu(&new_fa->fa_list,
1336 (fa ? &fa->fa_list : fa_head)); 1339 (fa ? &fa->fa_list : fa_head));
1337 1340
@@ -1697,6 +1700,9 @@ int fib_table_delete(struct fib_table *tb, struct fib_config *cfg)
1697 1700
1698 list_del_rcu(&fa->fa_list); 1701 list_del_rcu(&fa->fa_list);
1699 1702
1703 if (!plen)
1704 tb->tb_num_default--;
1705
1700 if (list_empty(fa_head)) { 1706 if (list_empty(fa_head)) {
1701 hlist_del_rcu(&li->hlist); 1707 hlist_del_rcu(&li->hlist);
1702 free_leaf_info(li); 1708 free_leaf_info(li);
@@ -1987,6 +1993,7 @@ struct fib_table *fib_trie_table(u32 id)
1987 1993
1988 tb->tb_id = id; 1994 tb->tb_id = id;
1989 tb->tb_default = -1; 1995 tb->tb_default = -1;
1996 tb->tb_num_default = 0;
1990 1997
1991 t = (struct trie *) tb->tb_data; 1998 t = (struct trie *) tb->tb_data;
1992 memset(t, 0, sizeof(*t)); 1999 memset(t, 0, sizeof(*t));
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 0e7430c327a7..e9aee81de3e3 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -2615,7 +2615,9 @@ static struct rtable *ip_route_output_slow(struct net *net,
2615 fib_select_multipath(&res); 2615 fib_select_multipath(&res);
2616 else 2616 else
2617#endif 2617#endif
2618 if (!res.prefixlen && res.type == RTN_UNICAST && !fl4.flowi4_oif) 2618 if (!res.prefixlen &&
2619 res.table->tb_num_default > 1 &&
2620 res.type == RTN_UNICAST && !fl4.flowi4_oif)
2619 fib_select_default(&res); 2621 fib_select_default(&res);
2620 2622
2621 if (!fl4.saddr) 2623 if (!fl4.saddr)