diff options
| author | Jeff Garzik <jeff@garzik.org> | 2006-05-26 21:30:38 -0400 |
|---|---|---|
| committer | Jeff Garzik <jeff@garzik.org> | 2006-05-26 21:30:38 -0400 |
| commit | 835d39fcb56cba00b78c60634d6bb0f046ef601c (patch) | |
| tree | 235cecc646bada5c0b76836d42e44e7a5d93c0f8 /net/ipv6 | |
| parent | 89bad5892abca55f56d0ea713c7306d1f845ac8e (diff) | |
| parent | ecd68853b852cdafb138f9c437f3a751fe7dc381 (diff) | |
Merge branch 'master' into upstream
Diffstat (limited to 'net/ipv6')
| -rw-r--r-- | net/ipv6/route.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 0190e39096b9..8a777932786d 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -280,10 +280,13 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
| 280 | { | 280 | { |
| 281 | struct neighbour *neigh = rt->rt6i_nexthop; | 281 | struct neighbour *neigh = rt->rt6i_nexthop; |
| 282 | int m = 0; | 282 | int m = 0; |
| 283 | if (neigh) { | 283 | if (rt->rt6i_flags & RTF_NONEXTHOP || |
| 284 | !(rt->rt6i_flags & RTF_GATEWAY)) | ||
| 285 | m = 1; | ||
| 286 | else if (neigh) { | ||
| 284 | read_lock_bh(&neigh->lock); | 287 | read_lock_bh(&neigh->lock); |
| 285 | if (neigh->nud_state & NUD_VALID) | 288 | if (neigh->nud_state & NUD_VALID) |
| 286 | m = 1; | 289 | m = 2; |
| 287 | read_unlock_bh(&neigh->lock); | 290 | read_unlock_bh(&neigh->lock); |
| 288 | } | 291 | } |
| 289 | return m; | 292 | return m; |
| @@ -292,15 +295,18 @@ static int inline rt6_check_neigh(struct rt6_info *rt) | |||
| 292 | static int rt6_score_route(struct rt6_info *rt, int oif, | 295 | static int rt6_score_route(struct rt6_info *rt, int oif, |
| 293 | int strict) | 296 | int strict) |
| 294 | { | 297 | { |
| 295 | int m = rt6_check_dev(rt, oif); | 298 | int m, n; |
| 299 | |||
| 300 | m = rt6_check_dev(rt, oif); | ||
| 296 | if (!m && (strict & RT6_SELECT_F_IFACE)) | 301 | if (!m && (strict & RT6_SELECT_F_IFACE)) |
| 297 | return -1; | 302 | return -1; |
| 298 | #ifdef CONFIG_IPV6_ROUTER_PREF | 303 | #ifdef CONFIG_IPV6_ROUTER_PREF |
| 299 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; | 304 | m |= IPV6_DECODE_PREF(IPV6_EXTRACT_PREF(rt->rt6i_flags)) << 2; |
| 300 | #endif | 305 | #endif |
| 301 | if (rt6_check_neigh(rt)) | 306 | n = rt6_check_neigh(rt); |
| 307 | if (n > 1) | ||
| 302 | m |= 16; | 308 | m |= 16; |
| 303 | else if (strict & RT6_SELECT_F_REACHABLE) | 309 | else if (!n && strict & RT6_SELECT_F_REACHABLE) |
| 304 | return -1; | 310 | return -1; |
| 305 | return m; | 311 | return m; |
| 306 | } | 312 | } |
