projects
/
linux-2.6-block.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[IPV6]: Restore semantics of Routing Header processing.
[linux-2.6-block.git]
/
net
/
ipv6
/
ip6_fib.c
diff --git
a/net/ipv6/ip6_fib.c
b/net/ipv6/ip6_fib.c
index f4d7be77eb0fefa93446010f9c335655c18fa654..662a7d9681fdb03b4c2a9c089ec4dffdcfb2f4d2 100644
(file)
--- a/
net/ipv6/ip6_fib.c
+++ b/
net/ipv6/ip6_fib.c
@@
-359,7
+359,7
@@
end:
return res;
}
return res;
}
-int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
+
static
int inet6_dump_fib(struct sk_buff *skb, struct netlink_callback *cb)
{
unsigned int h, s_h;
unsigned int e = 0, s_e;
{
unsigned int h, s_h;
unsigned int e = 0, s_e;
@@
-619,14
+619,6
@@
static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
ins = &fn->leaf;
ins = &fn->leaf;
- if (fn->fn_flags&RTN_TL_ROOT &&
- fn->leaf == &ip6_null_entry &&
- !(rt->rt6i_flags & (RTF_DEFAULT | RTF_ADDRCONF)) ){
- fn->leaf = rt;
- rt->u.dst.rt6_next = NULL;
- goto out;
- }
-
for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) {
/*
* Search for duplicates
for (iter = fn->leaf; iter; iter=iter->u.dst.rt6_next) {
/*
* Search for duplicates
@@
-658,11
+650,14
@@
static int fib6_add_rt2node(struct fib6_node *fn, struct rt6_info *rt,
ins = &iter->u.dst.rt6_next;
}
ins = &iter->u.dst.rt6_next;
}
+ /* Reset round-robin state, if necessary */
+ if (ins == &fn->leaf)
+ fn->rr_ptr = NULL;
+
/*
* insert node
*/
/*
* insert node
*/
-out:
rt->u.dst.rt6_next = iter;
*ins = rt;
rt->rt6i_node = fn;
rt->u.dst.rt6_next = iter;
*ins = rt;
rt->rt6i_node = fn;
@@
-1109,6
+1104,10
@@
static void fib6_del_route(struct fib6_node *fn, struct rt6_info **rtp,
rt6_stats.fib_rt_entries--;
rt6_stats.fib_discarded_routes++;
rt6_stats.fib_rt_entries--;
rt6_stats.fib_discarded_routes++;
+ /* Reset round-robin state, if necessary */
+ if (fn->rr_ptr == rt)
+ fn->rr_ptr = NULL;
+
/* Adjust walkers */
read_lock(&fib6_walker_lock);
FOR_WALKERS(w) {
/* Adjust walkers */
read_lock(&fib6_walker_lock);
FOR_WALKERS(w) {
@@
-1478,6
+1477,8
@@
void __init fib6_init(void)
NULL, NULL);
fib6_tables_init();
NULL, NULL);
fib6_tables_init();
+
+ __rtnl_register(PF_INET6, RTM_GETROUTE, NULL, inet6_dump_fib);
}
void fib6_gc_cleanup(void)
}
void fib6_gc_cleanup(void)