diff options
author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2006-03-20 20:04:53 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-20 20:04:53 -0500 |
commit | ebacaaa0fdf4402cdf4c8e569f54af36b6f0aa2d (patch) | |
tree | 5d1cc0c6d94b5226507434bb86e6e2a69fdd4204 /net/ipv6/ndisc.c | |
parent | 8238dd0698b480e432acd955c45f9f907b8d27de (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.c | 12 |
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) |