diff options
Diffstat (limited to 'net/ipv6/ndisc.c')
| -rw-r--r-- | net/ipv6/ndisc.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 3b56be85234..966ab6b3022 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1023,6 +1023,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)  	int lifetime;  	struct ndisc_options ndopts;  	int optlen; +	unsigned int pref = 0;  	__u8 * opt = (__u8 *)(ra_msg + 1); @@ -1086,6 +1087,13 @@ static void ndisc_router_discovery(struct sk_buff *skb)  	lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); +#ifdef CONFIG_IPV6_ROUTER_PREF +	pref = ra_msg->icmph.icmp6_router_pref; +	/* 10b is handled as if it were 00b (medium) */ +	if (pref == ICMPV6_ROUTER_PREF_INVALID) +		pref = ICMPV6_ROUTER_PREF_MEDIUM; +#endif +  	rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev);  	if (rt) @@ -1101,7 +1109,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)  		ND_PRINTK3(KERN_DEBUG  			   "ICMPv6 RA: adding default router.\n"); -		rt = rt6_add_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); +		rt = rt6_add_dflt_router(&skb->nh.ipv6h->saddr, skb->dev, pref);  		if (rt == NULL) {  			ND_PRINTK0(KERN_ERR  				   "ICMPv6 RA: %s() failed to add default route.\n", @@ -1120,6 +1128,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)  			return;  		}  		neigh->flags |= NTF_ROUTER; +	} else if (rt) { +		rt->rt6i_flags |= (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);  	}  	if (rt)  |