summaryrefslogtreecommitdiffstats
path: root/net/ipv6/addrconf.c
diff options
context:
space:
mode:
authorJuha-Matti Tapio <jmtapio@verkkotelakka.net>2008-02-29 05:55:46 +0100
committerDavid S. Miller <davem@davemloft.net>2008-02-29 05:55:46 +0100
commit99cd07a537bf4c7c954f31611e30064407104410 (patch)
tree4abc67b2f95b3220bfa467cb9c85156cd17e3ab7 /net/ipv6/addrconf.c
parent[IPV6]: Add ORCHID prefix to address label table (diff)
downloadlinux-99cd07a537bf4c7c954f31611e30064407104410.tar.xz
linux-99cd07a537bf4c7c954f31611e30064407104410.zip
[IPV6]: Fix source address selection for ORCHID addresses
Skip the prefix length matching in source address selection for orchid -> non-orchid addresses. Overlay Routable Cryptographic Hash IDentifiers (RFC 4843, 2001:10::/28) are currenty not globally reachable. Without this check a host with an ORCHID address can end up preferring those over regular addresses when talking to other regular hosts in the 2001::/16 range thus breaking non-orchid connections. Signed-off-by: Juha-Matti Tapio <jmtapio@verkkotelakka.net> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r--net/ipv6/addrconf.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 101e0e70ba27..18e3a9825d81 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -1125,6 +1125,11 @@ int ipv6_dev_get_saddr(struct net_device *daddr_dev,
if (hiscore.rule < 7)
hiscore.rule++;
#endif
+
+ /* Skip rule 8 for orchid -> non-orchid address pairs. */
+ if (ipv6_addr_orchid(&ifa->addr) && !ipv6_addr_orchid(daddr))
+ continue;
+
/* Rule 8: Use longest matching prefix */
if (hiscore.rule < 8) {
hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr);