diff options
| author | Linus Torvalds <torvalds@g5.osdl.org> | 2006-05-26 18:13:33 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-05-26 18:13:33 -0400 |
| commit | ecd68853b852cdafb138f9c437f3a751fe7dc381 (patch) | |
| tree | 6b3a3468d0d3dca7f226de7e3551913d907b17a2 /net/ipv6/route.c | |
| parent | 087377a4307e18225f6452af5e71fe763c088c4e (diff) | |
| parent | 3041a069090224462e27da1bc9483b463eb40841 (diff) | |
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6:
[NET]: dev.c comment fixes
[IPV6] ROUTE: Don't try less preferred routes for on-link routes.
[IRDA]: *_DONGLE should depend on IRTTY_SIR
[MAINTAINERS]: Add entry for netem
Diffstat (limited to 'net/ipv6/route.c')
| -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 | } |
