Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/arp arp: Use SIOCGNBRINFO to display neighbor state...



details:   https://anonhg.NetBSD.org/src/rev/4b29b7d2c8ca
branches:  trunk
changeset: 954822:4b29b7d2c8ca
user:      roy <roy%NetBSD.org@localhost>
date:      Fri Sep 11 15:28:29 2020 +0000

description:
arp: Use SIOCGNBRINFO to display neighbor state information

diffstat:

 usr.sbin/arp/arp.8         |   25 ++++++++-
 usr.sbin/arp/arp.c         |  116 ++++++++++++++++++++++++++++++++++++++++++++-
 usr.sbin/arp/arp_hostops.c |    6 +-
 usr.sbin/arp/arp_rumpops.c |    5 +-
 usr.sbin/arp/prog_ops.h    |    5 +-
 5 files changed, 148 insertions(+), 9 deletions(-)

diffs (298 lines):

diff -r 06b2fb14c627 -r 4b29b7d2c8ca usr.sbin/arp/arp.8
--- a/usr.sbin/arp/arp.8        Fri Sep 11 15:22:12 2020 +0000
+++ b/usr.sbin/arp/arp.8        Fri Sep 11 15:28:29 2020 +0000
@@ -1,4 +1,4 @@
-.\"    $NetBSD: arp.8,v 1.24 2018/07/06 00:50:05 christos Exp $
+.\"    $NetBSD: arp.8,v 1.25 2020/09/11 15:28:29 roy Exp $
 .\"
 .\" Copyright (c) 1985, 1991, 1993
 .\"    The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"    from: @(#)arp.8 8.2 (Berkeley) 4/27/95
 .\"
-.Dd July 5, 2018
+.Dd September 11, 2020
 .Dt ARP 8
 .Os
 .Sh NAME
@@ -69,6 +69,27 @@
 The host may be specified by name or by number,
 using Internet dot notation.
 .Pp
+The state of the arp entry is shown as a single letter preceeded by the
+time the state is applicable for:
+.Bl -tag -width indent -compact
+.It D
+Delay
+.It I
+Incomplete
+.It N
+Nostate
+.It P
+Probe
+.It R
+Reachable
+.It S
+Stale
+.It W
+Waitdelete
+.It ?
+Unknown state (should never happen).
+.El
+.Pp
 Available options:
 .Bl -tag -width Ds
 .It Fl a
diff -r 06b2fb14c627 -r 4b29b7d2c8ca usr.sbin/arp/arp.c
--- a/usr.sbin/arp/arp.c        Fri Sep 11 15:22:12 2020 +0000
+++ b/usr.sbin/arp/arp.c        Fri Sep 11 15:28:29 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: arp.c,v 1.65 2019/02/28 01:20:25 nonaka Exp $ */
+/*     $NetBSD: arp.c,v 1.66 2020/09/11 15:28:29 roy Exp $ */
 
 /*
  * Copyright (c) 1984, 1993
@@ -42,7 +42,7 @@
 #if 0
 static char sccsid[] = "@(#)arp.c      8.3 (Berkeley) 4/28/95";
 #else
-__RCSID("$NetBSD: arp.c,v 1.65 2019/02/28 01:20:25 nonaka Exp $");
+__RCSID("$NetBSD: arp.c,v 1.66 2020/09/11 15:28:29 roy Exp $");
 #endif
 #endif /* not lint */
 
@@ -60,8 +60,10 @@
 #include <net/if_dl.h>
 #include <net/if_ether.h>
 #include <net/if_types.h>
+#include <net/nd.h>
 #include <net/route.h>
 #include <netinet/in.h>
+#include <netinet/in_var.h>
 #include <netinet/if_inarp.h>
 #include <arpa/inet.h>
 
@@ -92,6 +94,8 @@
 static int getetheraddr(struct in_addr, struct sockaddr_dl *);
 static struct rt_msghdr * rtmsg(const int, const int,  struct rt_msghdr *,
        const struct sockaddr_inarp *, const struct sockaddr_dl *);
+static struct in_nbrinfo * getnbrinfo(const char *, struct in_addr *);
+static const char * sec2str(time_t);
 static int set(int, char **);
 static void usage(void) __dead;
 
@@ -439,6 +443,8 @@
        struct sockaddr_inarp *sina;
        struct sockaddr_dl *sdl;
        struct hostent *hp;
+       struct timeval tim;
+       struct in_nbrinfo *nbi;
 
        mib[0] = CTL_NET;
        mib[1] = PF_ROUTE;
@@ -497,6 +503,49 @@
                        if (sina->sin_len != 8)
                                (void)printf("(weird)");
                }
+
+               if (sdl->sdl_index == 0)
+                       goto done;
+               (void)gettimeofday(&tim, 0);
+               nbi = getnbrinfo(ifname, &sina->sin_addr);
+               if (nbi != NULL) {
+                       if (nbi->expire > tim.tv_sec) {
+                               (void)printf(" %s",
+                                   sec2str(nbi->expire - tim.tv_sec));
+                       } else if (nbi->expire == 0)
+                               (void)printf(" %s", "permanent");
+                       else
+                               (void)printf(" %s", "expired");
+
+                       switch (nbi->state) {
+                       case ND_LLINFO_NOSTATE:
+                               (void)printf(" N");
+                               break;
+                       case ND_LLINFO_WAITDELETE:
+                               (void)printf(" W");
+                               break;
+                       case ND_LLINFO_INCOMPLETE:
+                               (void)printf(" I");
+                               break;
+                       case ND_LLINFO_REACHABLE:
+                               (void)printf(" R");
+                               break;
+                       case ND_LLINFO_STALE:
+                               (void)printf(" S");
+                               break;
+                       case ND_LLINFO_DELAY:
+                               (void)printf(" D");
+                               break;
+                       case ND_LLINFO_PROBE:
+                               (void)printf(" P");
+                               break;
+                       default:
+                               (void)printf(" ?");
+                               break;
+                       }
+               }
+
+done:
                (void)printf("\n");
        }
        free(buf);
@@ -800,3 +849,66 @@
        freeifaddrs(ifaddrs);
        return -1;
 }
+
+static struct in_nbrinfo *
+getnbrinfo(const char *ifname, struct in_addr *addr)
+{
+       static struct in_nbrinfo nbi, *nbip;
+       int s;
+
+       if ((s = prog_socket(AF_INET, SOCK_DGRAM, 0)) == -1)
+               err(1, "socket");
+
+       (void)memset(&nbi, 0, sizeof(nbi));
+       (void)strlcpy(nbi.ifname, ifname, sizeof(nbi.ifname));
+       nbi.addr = *addr;
+       if (prog_ioctl(s, SIOCGNBRINFO, &nbi) == -1) {
+               warn("ioctl(SIOCGNBRINFO)");
+               nbip = NULL;
+       } else
+               nbip = &nbi;
+       (void)prog_close(s);
+
+       return nbip;
+}
+
+static const char *
+sec2str(time_t total)
+{
+       static char result[256];
+       int days, hours, mins, secs;
+       int first = 1;
+       char *p = result;
+       char *ep = &result[sizeof(result)];
+       int n;
+
+       days = total / 3600 / 24;
+       hours = (total / 3600) % 24;
+       mins = (total / 60) % 60;
+       secs = total % 60;
+
+       if (days) {
+               first = 0;
+               n = snprintf(p, (size_t)(ep - p), "%dd", days);
+               if (n < 0 || n >= ep - p)
+                       return "?";
+               p += n;
+       }
+       if (!first || hours) {
+               first = 0;
+               n = snprintf(p, (size_t)(ep - p), "%dh", hours);
+               if (n < 0 || n >= ep - p)
+                       return "?";
+               p += n;
+       }
+       if (!first || mins) {
+               first = 0;
+               n = snprintf(p, (size_t)(ep - p), "%dm", mins);
+               if (n < 0 || n >= ep - p)
+                       return "?";
+               p += n;
+       }
+       (void)snprintf(p, (size_t)(ep - p), "%ds", secs);
+
+       return(result);
+}
diff -r 06b2fb14c627 -r 4b29b7d2c8ca usr.sbin/arp/arp_hostops.c
--- a/usr.sbin/arp/arp_hostops.c        Fri Sep 11 15:22:12 2020 +0000
+++ b/usr.sbin/arp/arp_hostops.c        Fri Sep 11 15:28:29 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: arp_hostops.c,v 1.2 2019/02/27 23:29:50 dholland Exp $ */
+/*     $NetBSD: arp_hostops.c,v 1.3 2020/09/11 15:28:29 roy Exp $      */
 
 /*
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -28,9 +28,10 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: arp_hostops.c,v 1.2 2019/02/27 23:29:50 dholland Exp $");
+__RCSID("$NetBSD: arp_hostops.c,v 1.3 2020/09/11 15:28:29 roy Exp $");
 #endif /* !lint */
 
+#include <sys/ioctl.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/sysctl.h>
@@ -45,6 +46,7 @@
        .op_open = open,
        .op_getpid = getpid,
 
+       .op_ioctl = ioctl,
        .op_read = read,
        .op_write = write,
        .op_close = close,
diff -r 06b2fb14c627 -r 4b29b7d2c8ca usr.sbin/arp/arp_rumpops.c
--- a/usr.sbin/arp/arp_rumpops.c        Fri Sep 11 15:22:12 2020 +0000
+++ b/usr.sbin/arp/arp_rumpops.c        Fri Sep 11 15:28:29 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: arp_rumpops.c,v 1.2 2019/02/27 23:29:50 dholland Exp $ */
+/*     $NetBSD: arp_rumpops.c,v 1.3 2020/09/11 15:28:29 roy Exp $      */
 
 /*
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: arp_rumpops.c,v 1.2 2019/02/27 23:29:50 dholland Exp $");
+__RCSID("$NetBSD: arp_rumpops.c,v 1.3 2020/09/11 15:28:29 roy Exp $");
 #endif /* !lint */
 
 #include <sys/types.h>
@@ -49,6 +49,7 @@
        .op_open =      rump_sys_open,
        .op_getpid =    rump_sys_getpid,
 
+       .op_ioctl =     rump_sys_ioctl,
        .op_read =      rump_sys_read,
        .op_write =     rump_sys_write,
        .op_close =     rump_sys_close,
diff -r 06b2fb14c627 -r 4b29b7d2c8ca usr.sbin/arp/prog_ops.h
--- a/usr.sbin/arp/prog_ops.h   Fri Sep 11 15:22:12 2020 +0000
+++ b/usr.sbin/arp/prog_ops.h   Fri Sep 11 15:28:29 2020 +0000
@@ -1,4 +1,4 @@
-/*      $NetBSD: prog_ops.h,v 1.2 2019/02/27 23:29:50 dholland Exp $   */
+/*      $NetBSD: prog_ops.h,v 1.3 2020/09/11 15:28:29 roy Exp $        */
 
 /*
  * Copyright (c) 2015 The NetBSD Foundation, Inc.
@@ -43,6 +43,7 @@
        int (*op_open)(const char *, int, ...);
        pid_t (*op_getpid)(void);
 
+       int (*op_ioctl)(int, unsigned long, ...);
        ssize_t (*op_read)(int, void *, size_t);
        ssize_t (*op_write)(int, const void *, size_t);
 
@@ -54,6 +55,7 @@
 #define prog_socket prog_ops.op_socket
 #define prog_open prog_ops.op_open
 #define prog_getpid prog_ops.op_getpid
+#define prog_ioctl prog_ops.op_ioctl
 #define prog_read prog_ops.op_read
 #define prog_write prog_ops.op_write
 #define prog_close prog_ops.op_close
@@ -63,6 +65,7 @@
 #define prog_socket socket
 #define prog_open open
 #define prog_getpid getpid
+#define prog_ioctl ioctl
 #define prog_read read
 #define prog_write write
 #define prog_close close



Home | Main Index | Thread Index | Old Index