diff options
author | ae <ae@FreeBSD.org> | 2013-12-10 14:17:07 +0000 |
---|---|---|
committer | ae <ae@FreeBSD.org> | 2013-12-10 14:17:07 +0000 |
commit | 46dd1a1645c2ec6a4cb16da884655a33bc64bf64 (patch) | |
tree | c70e74d8d57981db5f7057dde98a0deb99a249ac /usr.sbin/ndp | |
parent | 531c51f388ae302e37f8fb4b3d6d1338537d9257 (diff) | |
download | FreeBSD-src-46dd1a1645c2ec6a4cb16da884655a33bc64bf64.zip FreeBSD-src-46dd1a1645c2ec6a4cb16da884655a33bc64bf64.tar.gz |
Change the type of addr argument in dump() function to be able
disambiguate link-local addresses from different zones.
Diffstat (limited to 'usr.sbin/ndp')
-rw-r--r-- | usr.sbin/ndp/ndp.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/usr.sbin/ndp/ndp.c b/usr.sbin/ndp/ndp.c index 2f9e2f6..3888b05 100644 --- a/usr.sbin/ndp/ndp.c +++ b/usr.sbin/ndp/ndp.c @@ -131,7 +131,7 @@ void getsocket(void); int set(int, char **); void get(char *); int delete(char *); -void dump(struct in6_addr *, int); +void dump(struct sockaddr_in6 *, int); static struct in6_nbrinfo *getnbrinfo(struct in6_addr *, int, int); static char *ether_str(struct sockaddr_dl *); int ndp_ether_aton(char *, u_char *); @@ -461,7 +461,9 @@ get(char *host) return; } sin->sin6_addr = ((struct sockaddr_in6 *)res->ai_addr)->sin6_addr; - dump(&sin->sin6_addr, 0); + sin->sin6_scope_id = + ((struct sockaddr_in6 *)res->ai_addr)->sin6_scope_id; + dump(sin, 0); if (found_entry == 0) { getnameinfo((struct sockaddr *)sin, sin->sin6_len, host_buf, sizeof(host_buf), NULL ,0, @@ -543,7 +545,7 @@ delete: * Dump the entire neighbor cache */ void -dump(struct in6_addr *addr, int cflag) +dump(struct sockaddr_in6 *addr, int cflag) { int mib[6]; size_t needed; @@ -615,7 +617,9 @@ again:; continue; if (addr) { - if (!IN6_ARE_ADDR_EQUAL(addr, &sin->sin6_addr)) + if (IN6_ARE_ADDR_EQUAL(&addr->sin6_addr, + &sin->sin6_addr) == 0 || + addr->sin6_scope_id != sin->sin6_scope_id) continue; found_entry = 1; } else if (IN6_IS_ADDR_MULTICAST(&sin->sin6_addr)) |