patch-2.4.20 linux-2.4.20/net/ipv6/ip6_fib.c
Next file: linux-2.4.20/net/ipv6/ip6_output.c
Previous file: linux-2.4.20/net/ipv6/icmp.c
Back to the patch index
Back to the overall index
- Lines: 98
- Date:
Thu Nov 28 15:53:15 2002
- Orig file:
linux-2.4.19/net/ipv6/ip6_fib.c
- Orig date:
Fri Dec 21 09:42:05 2001
diff -urN linux-2.4.19/net/ipv6/ip6_fib.c linux-2.4.20/net/ipv6/ip6_fib.c
@@ -13,6 +13,12 @@
* 2 of the License, or (at your option) any later version.
*/
+/*
+ * Changes:
+ * Yuji SEKIYA @USAGI: Support default route on router node;
+ * remove ip6_null_entry from the top of
+ * routing table.
+ */
#include <linux/config.h>
#include <linux/errno.h>
#include <linux/types.h>
@@ -248,9 +254,6 @@
fn = root;
- if (plen == 0)
- return fn;
-
do {
key = (struct rt6key *)((u8 *)fn->leaf + offset);
@@ -427,6 +430,17 @@
ins = &fn->leaf;
+ if (fn->fn_flags&RTN_TL_ROOT &&
+ fn->leaf == &ip6_null_entry &&
+ !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF | RTF_ALLONLINK)) ){
+ /*
+ * The top fib of ip6 routing table includes ip6_null_entry.
+ */
+ fn->leaf = rt;
+ rt->u.next = NULL;
+ goto out;
+ }
+
for (iter = fn->leaf; iter; iter=iter->u.next) {
/*
* Search for duplicates
@@ -462,6 +476,7 @@
* insert node
*/
+out:
rt->u.next = iter;
*ins = rt;
rt->rt6i_node = fn;
@@ -675,7 +690,7 @@
fn = fib6_lookup_1(root, args);
- if (fn == NULL)
+ if (fn == NULL || fn->fn_flags & RTN_TL_ROOT)
fn = root;
return fn;
@@ -897,6 +912,9 @@
rt->u.next = NULL;
+ if (fn->leaf == NULL && fn->fn_flags&RTN_TL_ROOT)
+ fn->leaf = &ip6_null_entry;
+
/* If it was last route, expunge its radix tree node */
if (fn->leaf == NULL) {
fn->fn_flags &= ~RTN_RTINFO;
@@ -1155,15 +1173,6 @@
only if they are not in use now.
*/
- if (rt->rt6i_flags & RTF_CACHE) {
- if (atomic_read(&rt->u.dst.__refcnt) == 0 &&
- (long)(now - rt->u.dst.lastuse) >= gc_args.timeout) {
- RT6_TRACE("aging clone %p\n", rt);
- return -1;
- }
- gc_args.more++;
- }
-
/*
* check addrconf expiration here.
* They are expired even if they are in use.
@@ -1175,6 +1184,13 @@
return -1;
}
gc_args.more++;
+ } else if (rt->rt6i_flags & RTF_CACHE) {
+ if (atomic_read(&rt->u.dst.__refcnt) == 0 &&
+ (long)(now - rt->u.dst.lastuse) >= gc_args.timeout) {
+ RT6_TRACE("aging clone %p\n", rt);
+ return -1;
+ }
+ gc_args.more++;
}
return 0;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)