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.
This commit is contained in:
roy 2020-03-09 21:20:55 +00:00
parent ee43138c68
commit 5ff17943ef
7 changed files with 59 additions and 31 deletions

View File

@ -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 *, int, struct rtentry *);
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 *);

View File

@ -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 sockaddr *dst, const uint8_t *lladdr,
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);

View File

@ -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 *);

View File

@ -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) {

View File

@ -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 (*func)(struct in6_addr *))
*/
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, int code, int param,
if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0)
goto out;
*src = ip6->ip6_src;
icmp6_error(m, type, code, param);
return;

View File

@ -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) {

View File

@ -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, int icmp6len)
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);
}