aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQing Li <qingli@FreeBSD.org>2009-09-05 16:50:55 +0000
committerQing Li <qingli@FreeBSD.org>2009-09-05 16:50:55 +0000
commit7dcdecb107a5c86c4d9837dbda0b9485c947b583 (patch)
treef66e9b571279d22fb441c177cee4cabfb48b365f
parent9452b0d2de668433f9929010426b2e505f03ce08 (diff)
downloadsrc-7dcdecb107a5c86c4d9837dbda0b9485c947b583.tar.gz
src-7dcdecb107a5c86c4d9837dbda0b9485c947b583.zip
This patch fixes an address scope violation. Considering the
scenario where an anycast address is assigned on one interface, and a global address with the same scope is assigned on another interface. In other words, the interface owns the anycast address has only the link-local address as one other address. Without this patch, "ping6" the anycast address from another station will observe the source address of the returned ICMP6 echo reply has the link-local address, not the global address that exists on the other interface in the same node. Reviewed by: bz MFC after: immediately
Notes
Notes: svn path=/head/; revision=196865
-rw-r--r--sys/netinet6/icmp6.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/netinet6/icmp6.c b/sys/netinet6/icmp6.c
index 6f13c692d0cc..04810c362739 100644
--- a/sys/netinet6/icmp6.c
+++ b/sys/netinet6/icmp6.c
@@ -2170,6 +2170,10 @@ icmp6_reflect(struct mbuf *m, size_t off)
}
}
+ if ((srcp != NULL) &&
+ (in6_addrscope(srcp) != in6_addrscope(&ip6->ip6_src)))
+ srcp = NULL;
+
if (srcp == NULL) {
int e;
struct sockaddr_in6 sin6;