summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ndp
diff options
context:
space:
mode:
authorae <ae@FreeBSD.org>2013-12-10 14:17:07 +0000
committerae <ae@FreeBSD.org>2013-12-10 14:17:07 +0000
commit46dd1a1645c2ec6a4cb16da884655a33bc64bf64 (patch)
treec70e74d8d57981db5f7057dde98a0deb99a249ac /usr.sbin/ndp
parent531c51f388ae302e37f8fb4b3d6d1338537d9257 (diff)
downloadFreeBSD-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.c12
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))
OpenPOWER on IntegriCloud