Hi,

The following diff adds the option -e to ndp(8), which resolved printed
hostnames via /etc/ethers.  You are able to recognise hosts with IPv6
auto privacy extension addresses on local IPv6 routers.  Also hosts
inside of a yp(8) domain are able to lookup their neighbors via the
shared /etc/ethers database.  (Yes, I run a yp domain :-)

This helps me, to keep track of known and unknown IPv6 hosts in my
network.

The ndp(8) implementations of FreeBSD, NetBSD and Linux don't have an
option named -e or a feature like this.  Thus, there shouldn't be any
problem or misbehavior by existing scripts around ndp(8) with this new
option.

What's your opinion about this feature?

Bye,
Jan

Index: ndp.8
===================================================================
RCS file: /cvs/src/usr.sbin/ndp/ndp.8,v
retrieving revision 1.45
diff -u -p -r1.45 ndp.8
--- ndp.8       9 Aug 2017 14:36:00 -0000       1.45
+++ ndp.8       22 Oct 2018 21:32:46 -0000
@@ -36,7 +36,7 @@
 .Nd control/diagnose IPv6 Neighbor Discovery Protocol (NDP)
 .Sh SYNOPSIS
 .Nm ndp
-.Op Fl acnt
+.Op Fl acent
 .Op Fl A Ar wait
 .Op Fl d Ar hostname
 .Op Fl f Ar filename
@@ -112,6 +112,12 @@ the node has sent during the current sta
 Erase all the NDP entries.
 .It Fl d Ar hostname
 Delete the specified NDP entry.
+.It Fl e
+Use the mappings of ethernet addresses in
+.Pa /etc/ethers
+to resolve hostnames.
+This is useful to resolve hostnames of privacy externsion addresses on local
+routers.
 .It Fl f Ar filename
 Parse entries from
 .Ar file
Index: ndp.c
===================================================================
RCS file: /cvs/src/usr.sbin/ndp/ndp.c,v
retrieving revision 1.90
diff -u -p -r1.90 ndp.c
--- ndp.c       13 Jul 2018 09:03:44 -0000      1.90
+++ ndp.c       22 Oct 2018 21:38:54 -0000
@@ -86,6 +86,7 @@
 #include <net/route.h>
 
 #include <netinet/in.h>
+#include <netinet/if_ether.h>
 
 #include <netinet/icmp6.h>
 #include <netinet6/in6_var.h>
@@ -110,6 +111,7 @@
        ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
 
 static pid_t pid;
+static int eflag;
 static int nflag;
 static int tflag;
 static int32_t thiszone;       /* time difference with gmt */
@@ -148,7 +150,7 @@ main(int argc, char *argv[])
        pid = getpid();
        thiszone = gmt2local(0);
        rdomain = getrtable();
-       while ((ch = getopt(argc, argv, "acd:f:i:nstA:V:")) != -1) {
+       while ((ch = getopt(argc, argv, "acd:ef:i:nstA:V:")) != -1) {
                switch (ch) {
                case 'a':
                case 'c':
@@ -173,6 +175,9 @@ main(int argc, char *argv[])
                        mode = ch;
                        arg = optarg;
                        break;
+               case 'e':
+                       eflag = 1;
+                       break;
                case 'n':
                        nflag = 1;
                        break;
@@ -612,6 +617,17 @@ again:;
                                delete(host_buf);
                        continue;
                }
+
+               if (eflag && sdl->sdl_alen) {
+                       u_char *cp = (u_char *)LLADDR(sdl);
+                       struct ether_addr eaddr;
+                       char nhost[NI_MAXHOST];
+
+                       memcpy(eaddr.ether_addr_octet, cp, ETHER_ADDR_LEN);
+                       if (ether_ntohost(nhost, &eaddr) == 0)
+                               strlcpy(host_buf, nhost, sizeof(host_buf));
+               }
+
                gettimeofday(&now, 0);
                if (tflag)
                        ts_print(&now);
@@ -753,7 +769,7 @@ ndp_ether_aton(char *a, u_char *n)
 void
 usage(void)
 {
-       printf("usage: ndp [-acnt] ");
+       printf("usage: ndp [-acent] ");
        printf("[-A wait] [-d hostname] [-f filename] [-i interface]\n");
        printf("\t[-s nodename ether_addr [temp] [proxy]] ");
        printf("[-V rdomain] [hostname]\n");

Reply via email to