diff options
author | David S. Miller <davem@davemloft.net> | 2008-06-12 01:33:59 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-06-12 01:33:59 -0400 |
commit | e6e30add6bd8115af108de2a13ec82d997a55777 (patch) | |
tree | 558b4d1c3ac369805aa9c57abca710bdf52aff75 /net/ipv6/addrconf.c | |
parent | d4c3c0753594adaafbcb77a086f013f1d847b3f0 (diff) | |
parent | 9501f9722922f2e80e1f9dc6682311d65c2b5690 (diff) |
Merge branch 'net-next-2.6-misc-20080612a' of git://git.linux-ipv6.org/gitroot/yoshfuji/linux-2.6-next
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index deb38bf03376..9be6be3a7ff3 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -229,6 +229,12 @@ static inline int addrconf_qdisc_ok(struct net_device *dev) | |||
229 | return (dev->qdisc != &noop_qdisc); | 229 | return (dev->qdisc != &noop_qdisc); |
230 | } | 230 | } |
231 | 231 | ||
232 | /* Check if a route is valid prefix route */ | ||
233 | static inline int addrconf_is_prefix_route(const struct rt6_info *rt) | ||
234 | { | ||
235 | return ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0); | ||
236 | } | ||
237 | |||
232 | static void addrconf_del_timer(struct inet6_ifaddr *ifp) | 238 | static void addrconf_del_timer(struct inet6_ifaddr *ifp) |
233 | { | 239 | { |
234 | if (del_timer(&ifp->timer)) | 240 | if (del_timer(&ifp->timer)) |
@@ -775,7 +781,7 @@ static void ipv6_del_addr(struct inet6_ifaddr *ifp) | |||
775 | ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len); | 781 | ipv6_addr_prefix(&prefix, &ifp->addr, ifp->prefix_len); |
776 | rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1); | 782 | rt = rt6_lookup(net, &prefix, NULL, ifp->idev->dev->ifindex, 1); |
777 | 783 | ||
778 | if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) { | 784 | if (rt && addrconf_is_prefix_route(rt)) { |
779 | if (onlink == 0) { | 785 | if (onlink == 0) { |
780 | ip6_del_rt(rt); | 786 | ip6_del_rt(rt); |
781 | rt = NULL; | 787 | rt = NULL; |
@@ -956,7 +962,8 @@ static inline int ipv6_saddr_preferred(int type) | |||
956 | return 0; | 962 | return 0; |
957 | } | 963 | } |
958 | 964 | ||
959 | static int ipv6_get_saddr_eval(struct ipv6_saddr_score *score, | 965 | static int ipv6_get_saddr_eval(struct net *net, |
966 | struct ipv6_saddr_score *score, | ||
960 | struct ipv6_saddr_dst *dst, | 967 | struct ipv6_saddr_dst *dst, |
961 | int i) | 968 | int i) |
962 | { | 969 | { |
@@ -1035,7 +1042,8 @@ static int ipv6_get_saddr_eval(struct ipv6_saddr_score *score, | |||
1035 | break; | 1042 | break; |
1036 | case IPV6_SADDR_RULE_LABEL: | 1043 | case IPV6_SADDR_RULE_LABEL: |
1037 | /* Rule 6: Prefer matching label */ | 1044 | /* Rule 6: Prefer matching label */ |
1038 | ret = ipv6_addr_label(&score->ifa->addr, score->addr_type, | 1045 | ret = ipv6_addr_label(net, |
1046 | &score->ifa->addr, score->addr_type, | ||
1039 | score->ifa->idev->dev->ifindex) == dst->label; | 1047 | score->ifa->idev->dev->ifindex) == dst->label; |
1040 | break; | 1048 | break; |
1041 | #ifdef CONFIG_IPV6_PRIVACY | 1049 | #ifdef CONFIG_IPV6_PRIVACY |
@@ -1089,7 +1097,7 @@ int ipv6_dev_get_saddr(struct net_device *dst_dev, | |||
1089 | dst.addr = daddr; | 1097 | dst.addr = daddr; |
1090 | dst.ifindex = dst_dev ? dst_dev->ifindex : 0; | 1098 | dst.ifindex = dst_dev ? dst_dev->ifindex : 0; |
1091 | dst.scope = __ipv6_addr_src_scope(dst_type); | 1099 | dst.scope = __ipv6_addr_src_scope(dst_type); |
1092 | dst.label = ipv6_addr_label(daddr, dst_type, dst.ifindex); | 1100 | dst.label = ipv6_addr_label(net, daddr, dst_type, dst.ifindex); |
1093 | dst.prefs = prefs; | 1101 | dst.prefs = prefs; |
1094 | 1102 | ||
1095 | hiscore->rule = -1; | 1103 | hiscore->rule = -1; |
@@ -1157,8 +1165,8 @@ int ipv6_dev_get_saddr(struct net_device *dst_dev, | |||
1157 | for (i = 0; i < IPV6_SADDR_RULE_MAX; i++) { | 1165 | for (i = 0; i < IPV6_SADDR_RULE_MAX; i++) { |
1158 | int minihiscore, miniscore; | 1166 | int minihiscore, miniscore; |
1159 | 1167 | ||
1160 | minihiscore = ipv6_get_saddr_eval(hiscore, &dst, i); | 1168 | minihiscore = ipv6_get_saddr_eval(net, hiscore, &dst, i); |
1161 | miniscore = ipv6_get_saddr_eval(score, &dst, i); | 1169 | miniscore = ipv6_get_saddr_eval(net, score, &dst, i); |
1162 | 1170 | ||
1163 | if (minihiscore > miniscore) { | 1171 | if (minihiscore > miniscore) { |
1164 | if (i == IPV6_SADDR_RULE_SCOPE && | 1172 | if (i == IPV6_SADDR_RULE_SCOPE && |
@@ -1786,7 +1794,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len) | |||
1786 | rt = rt6_lookup(dev_net(dev), &pinfo->prefix, NULL, | 1794 | rt = rt6_lookup(dev_net(dev), &pinfo->prefix, NULL, |
1787 | dev->ifindex, 1); | 1795 | dev->ifindex, 1); |
1788 | 1796 | ||
1789 | if (rt && ((rt->rt6i_flags & (RTF_GATEWAY | RTF_DEFAULT)) == 0)) { | 1797 | if (rt && addrconf_is_prefix_route(rt)) { |
1790 | /* Autoconf prefix route */ | 1798 | /* Autoconf prefix route */ |
1791 | if (valid_lft == 0) { | 1799 | if (valid_lft == 0) { |
1792 | ip6_del_rt(rt); | 1800 | ip6_del_rt(rt); |