Module Name:    src
Committed By:   roy
Date:           Mon Mar  9 21:20:56 UTC 2020

Modified Files:
        src/sys/net: route.h rtsock.c
        src/sys/netinet: icmp6.h if_arp.c
        src/sys/netinet6: icmp6.c nd6.c nd6_nbr.c

Log Message:
route: RTM_MISS now puts the message source address in RTA_AUTHOR

route(8) also reports this.
A userland app could use this to blacklist nodes who probe for machines
that doesn't exist on a subnet / prefix.


To generate a diff of this commit:
cvs rdiff -u -r1.126 -r1.127 src/sys/net/route.h
cvs rdiff -u -r1.254 -r1.255 src/sys/net/rtsock.c
cvs rdiff -u -r1.52 -r1.53 src/sys/netinet/icmp6.h
cvs rdiff -u -r1.293 -r1.294 src/sys/netinet/if_arp.c
cvs rdiff -u -r1.243 -r1.244 src/sys/netinet6/icmp6.c
cvs rdiff -u -r1.266 -r1.267 src/sys/netinet6/nd6.c
cvs rdiff -u -r1.176 -r1.177 src/sys/netinet6/nd6_nbr.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/net/route.h
diff -u src/sys/net/route.h:1.126 src/sys/net/route.h:1.127
--- src/sys/net/route.h:1.126	Sat Feb  8 14:17:30 2020
+++ src/sys/net/route.h	Mon Mar  9 21:20:55 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: route.h,v 1.126 2020/02/08 14:17:30 roy Exp $	*/
+/*	$NetBSD: route.h,v 1.127 2020/03/09 21:20:55 roy Exp $	*/
 
 /*
  * Copyright (c) 1980, 1986, 1993
@@ -543,8 +543,8 @@ void	rt_addrmsg_rt(int, struct ifaddr *,
 void	route_enqueue(struct mbuf *, int);
 
 struct llentry;
-void	rt_clonedmsg(int, const struct sockaddr *, const uint8_t *,
-            const struct ifnet *);
+void	rt_clonedmsg(int, const struct sockaddr *, const struct sockaddr *,
+	    const uint8_t *, const struct ifnet *);
 
 void	rt_setmetrics(void *, struct rtentry *);
 

Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.254 src/sys/net/rtsock.c:1.255
--- src/sys/net/rtsock.c:1.254	Mon Feb  3 20:34:13 2020
+++ src/sys/net/rtsock.c	Mon Mar  9 21:20:55 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtsock.c,v 1.254 2020/02/03 20:34:13 roy Exp $	*/
+/*	$NetBSD: rtsock.c,v 1.255 2020/03/09 21:20:55 roy Exp $	*/
 
 /*
  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.254 2020/02/03 20:34:13 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.255 2020/03/09 21:20:55 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -145,8 +145,8 @@ if_addrflags(struct ifaddr *ifa)
  * Send a routing message as mimicing that a cloned route is added.
  */
 void
-rt_clonedmsg(int type, const struct sockaddr *dst, const uint8_t *lladdr,
-    const struct ifnet *ifp)
+rt_clonedmsg(int type, const struct sockaddr *src, const struct sockaddr *dst,
+    const uint8_t *lladdr, const struct ifnet *ifp)
 {
 	struct rt_addrinfo info;
 	/* Mimic flags exactly */
@@ -164,6 +164,7 @@ rt_clonedmsg(int type, const struct sock
 	if (type == RTM_ADD || type == RTM_CHANGE)
 		flags |= RTF_UP;
 	memset(&info, 0, sizeof(info));
+	info.rti_info[RTAX_AUTHOR] = src;
 	info.rti_info[RTAX_DST] = dst;
 	sockaddr_dl_init(&u.sdl, sizeof(u.ss), ifp->if_index, ifp->if_type,
 	    NULL, 0, lladdr, ifp->if_addrlen);

Index: src/sys/netinet/icmp6.h
diff -u src/sys/netinet/icmp6.h:1.52 src/sys/netinet/icmp6.h:1.53
--- src/sys/netinet/icmp6.h:1.52	Wed Aug 22 01:05:24 2018
+++ src/sys/netinet/icmp6.h	Mon Mar  9 21:20:55 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: icmp6.h,v 1.52 2018/08/22 01:05:24 msaitoh Exp $	*/
+/*	$NetBSD: icmp6.h,v 1.53 2020/03/09 21:20:55 roy Exp $	*/
 /*	$KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $	*/
 
 
@@ -643,7 +643,8 @@ struct	rtentry;
 void	icmp6_init(void);
 void	icmp6_paramerror(struct mbuf *, int);
 void	icmp6_error(struct mbuf *, int, int, int);
-void	icmp6_error2(struct mbuf *, int, int, int, struct ifnet *);
+void	icmp6_error2(struct mbuf *, int, int, int, struct ifnet *,
+	    struct in6_addr *);
 int	icmp6_input(struct mbuf **, int *, int);
 void	icmp6_fasttimo(void);
 void	icmp6_prepare(struct mbuf *);

Index: src/sys/netinet/if_arp.c
diff -u src/sys/netinet/if_arp.c:1.293 src/sys/netinet/if_arp.c:1.294
--- src/sys/netinet/if_arp.c:1.293	Mon Mar  9 17:57:19 2020
+++ src/sys/netinet/if_arp.c	Mon Mar  9 21:20:55 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_arp.c,v 1.293 2020/03/09 17:57:19 roy Exp $	*/
+/*	$NetBSD: if_arp.c,v 1.294 2020/03/09 21:20:55 roy Exp $	*/
 
 /*
  * Copyright (c) 1998, 2000, 2008 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.293 2020/03/09 17:57:19 roy Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_arp.c,v 1.294 2020/03/09 21:20:55 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -309,20 +309,31 @@ arptimer(void *arg)
 	if (lle->la_flags & LLE_LINKED) {
 		int rt_cmd;
 		struct in_addr *in;
-		struct sockaddr_in sin;
+		struct sockaddr_in dsin, ssin;
+		struct sockaddr *sa;
 		const char *lladdr;
 		size_t pkts_dropped;
 
 		in = &lle->r_l3addr.addr4;
-		sockaddr_in_init(&sin, in, 0);
+		sockaddr_in_init(&dsin, in, 0);
 		if (lle->la_flags & LLE_VALID) {
 			rt_cmd = RTM_DELETE;
+			sa = NULL;
 			lladdr = (const char *)&lle->ll_addr;
 		} else {
+			if (lle->la_hold != NULL) {
+				struct mbuf *m = lle->la_hold;
+				const struct ip *ip = mtod(m, const struct ip *);
+
+				sockaddr_in_init(&ssin, &ip->ip_src, 0);
+				sa = sintosa(&ssin);
+			} else
+				sa = NULL;
 			rt_cmd = RTM_MISS;
 			lladdr = NULL;
+
 		}
-		rt_clonedmsg(rt_cmd, sintosa(&sin), lladdr, ifp);
+		rt_clonedmsg(rt_cmd, sa, sintosa(&dsin), lladdr, ifp);
 
 		LLE_REMREF(lle);
 		pkts_dropped = llentry_free(lle);
@@ -834,8 +845,14 @@ notfound:
 		la->la_asked++;
 
 		sockaddr_in_init(&sin, &la->r_l3addr.addr4, 0);
-		if (error != EWOULDBLOCK)
-			rt_clonedmsg(RTM_MISS, sintosa(&sin), NULL, ifp);
+		if (error != EWOULDBLOCK) {
+			const struct ip *ip = mtod(m, const struct ip *);
+			struct sockaddr_in ssin;
+
+			sockaddr_in_init(&ssin, &ip->ip_src, 0);
+			rt_clonedmsg(RTM_MISS, sintosa(&ssin), sintosa(&sin),
+			    NULL, ifp);
+		}
 
 		LLE_WUNLOCK(la);
 
@@ -1236,7 +1253,7 @@ again:
 		struct sockaddr_in sin;
 
 		sockaddr_in_init(&sin, &la->r_l3addr.addr4, 0);
-		rt_clonedmsg(rt_cmd, sintosa(&sin), ar_sha(ah), ifp);
+		rt_clonedmsg(rt_cmd, NULL, sintosa(&sin), ar_sha(ah), ifp);
 	}
 
 	if (la->la_hold != NULL) {

Index: src/sys/netinet6/icmp6.c
diff -u src/sys/netinet6/icmp6.c:1.243 src/sys/netinet6/icmp6.c:1.244
--- src/sys/netinet6/icmp6.c:1.243	Sun Oct  6 02:30:58 2019
+++ src/sys/netinet6/icmp6.c	Mon Mar  9 21:20:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: icmp6.c,v 1.243 2019/10/06 02:30:58 uwe Exp $	*/
+/*	$NetBSD: icmp6.c,v 1.244 2020/03/09 21:20:56 roy Exp $	*/
 /*	$KAME: icmp6.c,v 1.217 2001/06/20 15:03:29 jinmei Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.243 2019/10/06 02:30:58 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.244 2020/03/09 21:20:56 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -285,7 +285,7 @@ icmp6_mtudisc_callback_register(void (*f
  */
 void
 icmp6_error2(struct mbuf *m, int type, int code, int param,
-	struct ifnet *ifp)
+	struct ifnet *ifp, struct in6_addr *src)
 {
 	struct ip6_hdr *ip6;
 
@@ -304,6 +304,7 @@ icmp6_error2(struct mbuf *m, int type, i
 	if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0)
 		goto out;
 
+	*src = ip6->ip6_src;
 	icmp6_error(m, type, code, param);
 	return;
 

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.266 src/sys/netinet6/nd6.c:1.267
--- src/sys/netinet6/nd6.c:1.266	Mon Jan 20 18:38:22 2020
+++ src/sys/netinet6/nd6.c	Mon Mar  9 21:20:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.266 2020/01/20 18:38:22 thorpej Exp $	*/
+/*	$NetBSD: nd6.c,v 1.267 2020/03/09 21:20:56 roy Exp $	*/
 /*	$KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.266 2020/01/20 18:38:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.267 2020/03/09 21:20:56 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_net_mpsafe.h"
@@ -458,9 +458,11 @@ nd6_llinfo_timer(void *arg)
 	struct ifnet *ifp;
 	struct nd_ifinfo *ndi = NULL;
 	bool send_ns = false;
+	struct in6_addr mdaddr6 = zeroin6_addr;
 	const struct in6_addr *daddr6 = NULL;
 	const struct in6_addr *taddr6 = &ln->r_l3addr.addr6;
-	struct sockaddr_in6 sin6;
+	struct sockaddr_in6 dsin6, tsin6;
+	struct sockaddr *sa;
 
 	SOFTNET_KERNEL_LOCK_UNLESS_NET_MPSAFE();
 
@@ -503,11 +505,17 @@ nd6_llinfo_timer(void *arg)
 			clear_llinfo_pqueue(ln);
 
 			icmp6_error2(m, ICMP6_DST_UNREACH,
-			    ICMP6_DST_UNREACH_ADDR, 0, ifp);
+			    ICMP6_DST_UNREACH_ADDR, 0, ifp, &mdaddr6);
 		}
 
-		sockaddr_in6_init(&sin6, taddr6, 0, 0, 0);
-		rt_clonedmsg(RTM_MISS, sin6tosa(&sin6), NULL, ifp);
+		sockaddr_in6_init(&tsin6, taddr6, 0, 0, 0);
+		if (!IN6_IS_ADDR_UNSPECIFIED(&mdaddr6)) {
+			sockaddr_in6_init(&dsin6, &mdaddr6, 0, 0, 0);
+			sa = sin6tosa(&dsin6);
+		} else
+			sa = NULL;
+
+		rt_clonedmsg(RTM_MISS, sa, sin6tosa(&tsin6), NULL, ifp);
 
 		/*
 		 * Move to the ND6_LLINFO_WAITDELETE state for another
@@ -1304,7 +1312,7 @@ nd6_free(struct llentry *ln, int gc)
 		sockaddr_in6_init(&sin6, in6, 0, 0, 0);
 		lladdr = ln->la_flags & LLE_VALID ?
 		    (const char *)&ln->ll_addr : NULL;
-		rt_clonedmsg(RTM_DELETE, sin6tosa(&sin6), lladdr, ifp);
+		rt_clonedmsg(RTM_DELETE, NULL, sin6tosa(&sin6), lladdr, ifp);
 	}
 
 	/*
@@ -2245,7 +2253,7 @@ nd6_cache_lladdr(
 
 		sockaddr_in6_init(&sin6, from, 0, 0, 0);
 		rt_clonedmsg(is_newentry ? RTM_ADD : RTM_CHANGE,
-		    sin6tosa(&sin6), lladdr, ifp);
+		    NULL, sin6tosa(&sin6), lladdr, ifp);
 	}
 
 	if (ln != NULL) {

Index: src/sys/netinet6/nd6_nbr.c
diff -u src/sys/netinet6/nd6_nbr.c:1.176 src/sys/netinet6/nd6_nbr.c:1.177
--- src/sys/netinet6/nd6_nbr.c:1.176	Mon Jan 20 18:38:22 2020
+++ src/sys/netinet6/nd6_nbr.c	Mon Mar  9 21:20:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6_nbr.c,v 1.176 2020/01/20 18:38:22 thorpej Exp $	*/
+/*	$NetBSD: nd6_nbr.c,v 1.177 2020/03/09 21:20:56 roy Exp $	*/
 /*	$KAME: nd6_nbr.c,v 1.61 2001/02/10 16:06:14 jinmei Exp $	*/
 
 /*
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.176 2020/01/20 18:38:22 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6_nbr.c,v 1.177 2020/03/09 21:20:56 roy Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -887,7 +887,7 @@ nd6_na_input(struct mbuf *m, int off, in
 		struct sockaddr_in6 sin6;
 
 		sockaddr_in6_init(&sin6, &ln->r_l3addr.addr6, 0, 0, 0);
-		rt_clonedmsg(rt_cmd, sin6tosa(&sin6),
+		rt_clonedmsg(rt_cmd, sin6tosa(&ssin6), sin6tosa(&sin6),
 		    (char *)&ln->ll_addr, ln->lle_tbl->llt_ifp);
 	}
 

Reply via email to