aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/ndisc.c
diff options
context:
space:
mode:
authorYOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>2006-03-20 20:04:53 -0500
committerDavid S. Miller <davem@davemloft.net>2006-03-20 20:04:53 -0500
commitebacaaa0fdf4402cdf4c8e569f54af36b6f0aa2d (patch)
tree5d1cc0c6d94b5226507434bb86e6e2a69fdd4204 /net/ipv6/ndisc.c
parent8238dd0698b480e432acd955c45f9f907b8d27de (diff)
[IPV6]: ROUTE: Add support for Router Preference (RFC4191).
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/ndisc.c')
-rw-r--r--net/ipv6/ndisc.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index 3b56be85234e..966ab6b3022e 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1023,6 +1023,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1023 int lifetime; 1023 int lifetime;
1024 struct ndisc_options ndopts; 1024 struct ndisc_options ndopts;
1025 int optlen; 1025 int optlen;
1026 unsigned int pref = 0;
1026 1027
1027 __u8 * opt = (__u8 *)(ra_msg + 1); 1028 __u8 * opt = (__u8 *)(ra_msg + 1);
1028 1029
@@ -1086,6 +1087,13 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1086 1087
1087 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); 1088 lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime);
1088 1089
1090#ifdef CONFIG_IPV6_ROUTER_PREF
1091 pref = ra_msg->icmph.icmp6_router_pref;
1092 /* 10b is handled as if it were 00b (medium) */
1093 if (pref == ICMPV6_ROUTER_PREF_INVALID)
1094 pref = ICMPV6_ROUTER_PREF_MEDIUM;
1095#endif
1096
1089 rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); 1097 rt = rt6_get_dflt_router(&skb->nh.ipv6h->saddr, skb->dev);
1090 1098
1091 if (rt) 1099 if (rt)
@@ -1101,7 +1109,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1101 ND_PRINTK3(KERN_DEBUG 1109 ND_PRINTK3(KERN_DEBUG
1102 "ICMPv6 RA: adding default router.\n"); 1110 "ICMPv6 RA: adding default router.\n");
1103 1111
1104 rt = rt6_add_dflt_router(&skb->nh.ipv6h->saddr, skb->dev); 1112 rt = rt6_add_dflt_router(&skb->nh.ipv6h->saddr, skb->dev, pref);
1105 if (rt == NULL) { 1113 if (rt == NULL) {
1106 ND_PRINTK0(KERN_ERR 1114 ND_PRINTK0(KERN_ERR
1107 "ICMPv6 RA: %s() failed to add default route.\n", 1115 "ICMPv6 RA: %s() failed to add default route.\n",
@@ -1120,6 +1128,8 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1120 return; 1128 return;
1121 } 1129 }
1122 neigh->flags |= NTF_ROUTER; 1130 neigh->flags |= NTF_ROUTER;
1131 } else if (rt) {
1132 rt->rt6i_flags |= (rt->rt6i_flags & ~RTF_PREF_MASK) | RTF_PREF(pref);
1123 } 1133 }
1124 1134
1125 if (rt) 1135 if (rt)