Module Name: src
Committed By: roy
Date: Fri Sep 11 15:22:13 UTC 2020
Modified Files:
src/sys/netinet: in.c in_var.h
src/sys/sys: sockio.h
Log Message:
inet: Add SIOCGNBRINFO to retrieve neighbor state about an address
To generate a diff of this commit:
cvs rdiff -u -r1.239 -r1.240 src/sys/netinet/in.c
cvs rdiff -u -r1.97 -r1.98 src/sys/netinet/in_var.h
cvs rdiff -u -r1.38 -r1.39 src/sys/sys/sockio.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/netinet/in.c
diff -u src/sys/netinet/in.c:1.239 src/sys/netinet/in.c:1.240
--- src/sys/netinet/in.c:1.239 Fri Sep 11 15:19:31 2020
+++ src/sys/netinet/in.c Fri Sep 11 15:22:12 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: in.c,v 1.239 2020/09/11 15:19:31 roy Exp $ */
+/* $NetBSD: in.c,v 1.240 2020/09/11 15:22:12 roy Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -91,7 +91,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.239 2020/09/11 15:19:31 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in.c,v 1.240 2020/09/11 15:22:12 roy Exp $");
#include "arp.h"
@@ -424,6 +424,24 @@ in_control0(struct socket *so, u_long cm
if (ifp == NULL)
return EINVAL;
return ifaddrpref_ioctl(so, cmd, data, ifp);
+#if NARP > 0
+ case SIOCGNBRINFO:
+ {
+ struct in_nbrinfo *nbi = (struct in_nbrinfo *)data;
+ struct llentry *ln;
+ struct in_addr nb_addr = nbi->addr; /* make local for safety */
+
+ ln = arplookup(ifp, &nb_addr, NULL, 0);
+ if (ln == NULL)
+ return EINVAL;
+ nbi->state = ln->ln_state;
+ nbi->asked = ln->ln_asked;
+ nbi->expire = ln->ln_expire ?
+ time_mono_to_wall(ln->ln_expire) : 0;
+ LLE_RUNLOCK(ln);
+ return 0;
+ }
+#endif
}
bound = curlwp_bind();
Index: src/sys/netinet/in_var.h
diff -u src/sys/netinet/in_var.h:1.97 src/sys/netinet/in_var.h:1.98
--- src/sys/netinet/in_var.h:1.97 Thu Nov 29 09:51:20 2018
+++ src/sys/netinet/in_var.h Fri Sep 11 15:22:12 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: in_var.h,v 1.97 2018/11/29 09:51:20 ozaki-r Exp $ */
+/* $NetBSD: in_var.h,v 1.98 2020/09/11 15:22:12 roy Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -115,6 +115,14 @@ struct in_ifaddr {
#endif
};
+struct in_nbrinfo {
+ char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */
+ struct in_addr addr; /* IPv4 address of the neighbor */
+ long asked; /* number of queries already sent for this addr */
+ int state; /* reachability state */
+ int expire; /* lifetime for NDP state transition */
+};
+
#ifdef _KERNEL
static __inline void
ia4_acquire(struct in_ifaddr *ia, struct psref *psref)
Index: src/sys/sys/sockio.h
diff -u src/sys/sys/sockio.h:1.38 src/sys/sys/sockio.h:1.39
--- src/sys/sys/sockio.h:1.38 Thu Jul 4 02:44:25 2019
+++ src/sys/sys/sockio.h Fri Sep 11 15:22:12 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: sockio.h,v 1.38 2019/07/04 02:44:25 ozaki-r Exp $ */
+/* $NetBSD: sockio.h,v 1.39 2020/09/11 15:22:12 roy Exp $ */
/*-
* Copyright (c) 1982, 1986, 1990, 1993, 1994
@@ -153,4 +153,6 @@
#define SIOCSETPFSYNC _IOW('i', 247, struct ifreq)
#define SIOCGETPFSYNC _IOWR('i', 248, struct ifreq)
+#define SIOCGNBRINFO _IOWR('i', 249, struct in_nbrinfo) /* get IA ND info */
+
#endif /* !_SYS_SOCKIO_H_ */