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