Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys route: RTM_MISS now puts the message source address in R...
details: https://anonhg.NetBSD.org/src/rev/5171147c8cee
branches: trunk
changeset: 745733:5171147c8cee
user: roy <roy%NetBSD.org@localhost>
date: Mon Mar 09 21:20:55 2020 +0000
description:
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.
diffstat:
sys/net/route.h | 6 +++---
sys/net/rtsock.c | 9 +++++----
sys/netinet/icmp6.h | 5 +++--
sys/netinet/if_arp.c | 33 +++++++++++++++++++++++++--------
sys/netinet6/icmp6.c | 7 ++++---
sys/netinet6/nd6.c | 24 ++++++++++++++++--------
sys/netinet6/nd6_nbr.c | 6 +++---
7 files changed, 59 insertions(+), 31 deletions(-)
diffs (287 lines):
diff -r 680bb669a4a1 -r 5171147c8cee sys/net/route.h
--- a/sys/net/route.h Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/net/route.h Mon Mar 09 21:20:55 2020 +0000
@@ -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 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 *);
diff -r 680bb669a4a1 -r 5171147c8cee sys/net/rtsock.c
--- a/sys/net/rtsock.c Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/net/rtsock.c Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
* 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 @@
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);
diff -r 680bb669a4a1 -r 5171147c8cee sys/netinet/icmp6.h
--- a/sys/netinet/icmp6.h Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/netinet/icmp6.h Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
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 *);
diff -r 680bb669a4a1 -r 5171147c8cee sys/netinet/if_arp.c
--- a/sys/netinet/if_arp.c Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/netinet/if_arp.c Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
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 @@
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 @@
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) {
diff -r 680bb669a4a1 -r 5171147c8cee sys/netinet6/icmp6.c
--- a/sys/netinet6/icmp6.c Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/netinet6/icmp6.c Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
*/
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 @@
if (in6_setscope(&ip6->ip6_dst, ifp, NULL) != 0)
goto out;
+ *src = ip6->ip6_src;
icmp6_error(m, type, code, param);
return;
diff -r 680bb669a4a1 -r 5171147c8cee sys/netinet6/nd6.c
--- a/sys/netinet6/nd6.c Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/netinet6/nd6.c Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
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 @@
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 @@
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 @@
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) {
diff -r 680bb669a4a1 -r 5171147c8cee sys/netinet6/nd6_nbr.c
--- a/sys/netinet6/nd6_nbr.c Mon Mar 09 20:34:52 2020 +0000
+++ b/sys/netinet6/nd6_nbr.c Mon Mar 09 21:20:55 2020 +0000
@@ -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 @@
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);
}
Home |
Main Index |
Thread Index |
Old Index