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); }