diff options
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 | } | 
