aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJuha-Matti Tapio <jmtapio@verkkotelakka.net>2008-02-28 23:55:46 -0500
committerDavid S. Miller <davem@davemloft.net>2008-02-28 23:55:46 -0500
commit99cd07a537bf4c7c954f31611e30064407104410 (patch)
tree4abc67b2f95b3220bfa467cb9c85156cd17e3ab7
parent5fe47b8a65f8b4104e41dc46092dfcf942ce0758 (diff)
[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>
-rw-r--r--include/net/ipv6.h10
-rw-r--r--net/ipv6/addrconf.c5
2 files changed, 15 insertions, 0 deletions
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index c0c019f72ba9..8b05c65415cb 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -384,6 +384,16 @@ static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
384} 384}
385 385
386/* 386/*
387 * Check for a RFC 4843 ORCHID address
388 * (Overlay Routable Cryptographic Hash Identifiers)
389 */
390static inline int ipv6_addr_orchid(const struct in6_addr *a)
391{
392 return ((a->s6_addr32[0] & htonl(0xfffffff0))
393 == htonl(0x20010010));
394}
395
396/*
387 * find the first different bit between two addresses 397 * find the first different bit between two addresses
388 * length of address must be a multiple of 32bits 398 * length of address must be a multiple of 32bits
389 */ 399 */
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,
1125 if (hiscore.rule < 7) 1125 if (hiscore.rule < 7)
1126 hiscore.rule++; 1126 hiscore.rule++;
1127#endif 1127#endif
1128
1129 /* Skip rule 8 for orchid -> non-orchid address pairs. */
1130 if (ipv6_addr_orchid(&ifa->addr) && !ipv6_addr_orchid(daddr))
1131 continue;
1132
1128 /* Rule 8: Use longest matching prefix */ 1133 /* Rule 8: Use longest matching prefix */
1129 if (hiscore.rule < 8) { 1134 if (hiscore.rule < 8) {
1130 hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr); 1135 hiscore.matchlen = ipv6_addr_diff(&ifa_result->addr, daddr);