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_ */

Reply via email to