Module Name: src
Committed By: knakahara
Date: Mon Aug 29 09:14:02 UTC 2022
Modified Files:
src/share/man/man7: sysctl.7
src/sys/net: route.c route.h
src/sys/netinet: icmp6.h icmp_var.h in_pcb.c ip_icmp.c
src/sys/netinet6: icmp6.c in6_pcb.c
Log Message:
Add sysctl entry to control to send routing message for RTM_DYNAMIC.
Some routing daemons require such routing message to keep coherency.
If we want to let kernel send such message, set net.inet.icmp.dynamic_rt_msg=1
for IPv4, net.inet6.icmp6.dynamic_rt_msg=1 for IPv6.
Default(=0) is the same as before, that is, not send such routing message.
To generate a diff of this commit:
cvs rdiff -u -r1.160 -r1.161 src/share/man/man7/sysctl.7
cvs rdiff -u -r1.231 -r1.232 src/sys/net/route.c
cvs rdiff -u -r1.130 -r1.131 src/sys/net/route.h
cvs rdiff -u -r1.58 -r1.59 src/sys/netinet/icmp6.h
cvs rdiff -u -r1.31 -r1.32 src/sys/netinet/icmp_var.h
cvs rdiff -u -r1.189 -r1.190 src/sys/netinet/in_pcb.c
cvs rdiff -u -r1.177 -r1.178 src/sys/netinet/ip_icmp.c
cvs rdiff -u -r1.251 -r1.252 src/sys/netinet6/icmp6.c
cvs rdiff -u -r1.169 -r1.170 src/sys/netinet6/in6_pcb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/share/man/man7/sysctl.7
diff -u src/share/man/man7/sysctl.7:1.160 src/share/man/man7/sysctl.7:1.161
--- src/share/man/man7/sysctl.7:1.160 Mon Aug 22 09:25:55 2022
+++ src/share/man/man7/sysctl.7 Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-.\" $NetBSD: sysctl.7,v 1.160 2022/08/22 09:25:55 knakahara Exp $
+.\" $NetBSD: sysctl.7,v 1.161 2022/08/29 09:14:02 knakahara Exp $
.\"
.\" Copyright (c) 1993
.\" The Regents of the University of California. All rights reserved.
@@ -29,7 +29,7 @@
.\"
.\" @(#)sysctl.3 8.4 (Berkeley) 5/9/95
.\"
-.Dd August 9, 2022
+.Dd August 29, 2022
.Dt SYSCTL 7
.Os
.Sh NAME
@@ -1457,6 +1457,7 @@ The currently defined protocols and name
.It icmp rediraccept integer yes
.It icmp redirtimeout integer yes
.It icmp bmcastecho integer yes
+.It icmp dynamic_rt_msg boolean yes
.It ip allowsrcrt integer yes
.It ip anonportalgo.selected string yes
.It ip anonportalgo.available string yes
@@ -1703,6 +1704,9 @@ Number of bytes to return in an ICMP err
.It Li icmp.bmcastecho
If set to 1, enables responding to ICMP echo or timestamp request to the
broadcast address.
+.It Li icmp.dynamic_rt_msg
+A boolean that the kernel sends routing message for RTM_DYNAMIC or not.
+If set to true, sends such routing message.
.It Li tcp.ack_on_push
If set to 1, TCP is to immediately transmit an ACK upon reception of
a packet with PUSH set.
@@ -1856,6 +1860,7 @@ The currently defined protocols and name
.It icmp6 rediraccept integer yes
.It icmp6 redirtimeout integer yes
.It icmp6 reflect_pmtu boolean yes
+.It icmp6 dynamic_rt_msg boolean yes
.It ip6 accept_rtadv integer yes
.It ip6 addctlpolicy struct in6_addrpolicy no
.It ip6 anonportalgo.selected string yes
@@ -2120,7 +2125,9 @@ ICMPv6 redirect.
.It Li icmp6.reflect_pmtu
A boolean that icmpv6 reflecting uses path MTU discovery or not.
When not, icmpv6 reflecting uses IPV6_MINMTU.
-ICMPv6 redirect.
+.It Li icmp6.dynamic_rt_msg
+A boolean that the kernel sends routing message for RTM_DYNAMIC or not.
+If set to true, sends such routing message.
.It Li udp6.do_loopback_cksum
Perform UDP checksum on loopback.
.It Li udp6.recvspace
Index: src/sys/net/route.c
diff -u src/sys/net/route.c:1.231 src/sys/net/route.c:1.232
--- src/sys/net/route.c:1.231 Fri Aug 26 08:32:22 2022
+++ src/sys/net/route.c Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: route.c,v 1.231 2022/08/26 08:32:22 knakahara Exp $ */
+/* $NetBSD: route.c,v 1.232 2022/08/29 09:14:02 knakahara Exp $ */
/*-
* Copyright (c) 1998, 2008 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
#endif
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.231 2022/08/26 08:32:22 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: route.c,v 1.232 2022/08/29 09:14:02 knakahara Exp $");
#include <sys/param.h>
#ifdef RTFLUSH_DEBUG
@@ -884,6 +884,8 @@ rtredirect(const struct sockaddr *dst, c
error = rtrequest1(RTM_ADD, &info, &rt);
if (rt != NULL)
flags = rt->rt_flags;
+ if (error == 0)
+ rt_newmsg_dynamic(RTM_ADD, rt);
stat = &rtstat.rts_dynamic;
} else {
/*
@@ -1546,6 +1548,45 @@ rt_newmsg(const int cmd, const struct rt
}
/*
+ * Inform the routing socket of a route change for RTF_DYNAMIC.
+ */
+void
+rt_newmsg_dynamic(const int cmd, const struct rtentry *rt)
+{
+ extern bool icmp_dynamic_rt_msg;
+ extern bool icmp6_dynamic_rt_msg;
+ struct rt_addrinfo info;
+ struct sockaddr *gateway = rt->rt_gateway;
+
+ if (gateway == NULL)
+ return;
+
+ switch(gateway->sa_family){
+ case AF_INET:
+ if (!icmp_dynamic_rt_msg)
+ return;
+ break;
+ case AF_INET6:
+ if (!icmp6_dynamic_rt_msg)
+ return;
+ break;
+ default:
+ return;
+ }
+
+ memset((void *)&info, 0, sizeof(info));
+ info.rti_info[RTAX_DST] = rt_getkey(rt);
+ info.rti_info[RTAX_GATEWAY] = gateway;
+ info.rti_info[RTAX_NETMASK] = rt_mask(rt);
+ if (rt->rt_ifp) {
+ info.rti_info[RTAX_IFP] = rt->rt_ifp->if_dl->ifa_addr;
+ info.rti_info[RTAX_IFA] = rt->rt_ifa->ifa_addr;
+ }
+
+ rt_missmsg(cmd, &info, rt->rt_flags, 0);
+}
+
+/*
* Set up or tear down a routing table entry, normally
* for an interface.
*/
Index: src/sys/net/route.h
diff -u src/sys/net/route.h:1.130 src/sys/net/route.h:1.131
--- src/sys/net/route.h:1.130 Fri Aug 26 08:32:22 2022
+++ src/sys/net/route.h Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: route.h,v 1.130 2022/08/26 08:32:22 knakahara Exp $ */
+/* $NetBSD: route.h,v 1.131 2022/08/29 09:14:02 knakahara Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -437,6 +437,7 @@ int rt_update_prepare(struct rtentry *);
void rt_update_finish(struct rtentry *);
void rt_newmsg(const int, const struct rtentry *);
+void rt_newmsg_dynamic(const int, const struct rtentry *);
struct rtentry *
rtalloc1(const struct sockaddr *, int);
int rtinit(struct ifaddr *, int, int);
Index: src/sys/netinet/icmp6.h
diff -u src/sys/netinet/icmp6.h:1.58 src/sys/netinet/icmp6.h:1.59
--- src/sys/netinet/icmp6.h:1.58 Mon Aug 22 09:25:55 2022
+++ src/sys/netinet/icmp6.h Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: icmp6.h,v 1.58 2022/08/22 09:25:55 knakahara Exp $ */
+/* $NetBSD: icmp6.h,v 1.59 2022/08/29 09:14:02 knakahara Exp $ */
/* $KAME: icmp6.h,v 1.84 2003/04/23 10:26:51 itojun Exp $ */
@@ -641,6 +641,7 @@ struct icmp6_filter {
#endif
#define ICMPV6CTL_ND6_MAXQLEN 24
#define ICMPV6CTL_REFLECT_PMTU 25
+#define ICMPV6CTL_DYNAMIC_RT_MSG 26
#ifdef _KERNEL
struct rtentry;
Index: src/sys/netinet/icmp_var.h
diff -u src/sys/netinet/icmp_var.h:1.31 src/sys/netinet/icmp_var.h:1.32
--- src/sys/netinet/icmp_var.h:1.31 Wed Aug 22 01:05:24 2018
+++ src/sys/netinet/icmp_var.h Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: icmp_var.h,v 1.31 2018/08/22 01:05:24 msaitoh Exp $ */
+/* $NetBSD: icmp_var.h,v 1.32 2022/08/29 09:14:02 knakahara Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -72,6 +72,7 @@
#define ICMPCTL_REDIRTIMEOUT 6 /* Remove routes added via redirects */
#define ICMPCTL_STATS 7 /* ICMP statistics */
#define ICMPCTL_BMCASTECHO 8 /* allow broad/mult-cast echo */
+#define ICMPCTL_DYNAMIC_RT_MSG 9 /* send routing message for RTM_DYNAMIC */
#ifdef _KERNEL
Index: src/sys/netinet/in_pcb.c
diff -u src/sys/netinet/in_pcb.c:1.189 src/sys/netinet/in_pcb.c:1.190
--- src/sys/netinet/in_pcb.c:1.189 Fri Jul 29 07:35:16 2022
+++ src/sys/netinet/in_pcb.c Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: in_pcb.c,v 1.189 2022/07/29 07:35:16 knakahara Exp $ */
+/* $NetBSD: in_pcb.c,v 1.190 2022/08/29 09:14:02 knakahara Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -93,7 +93,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.189 2022/07/29 07:35:16 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in_pcb.c,v 1.190 2022/08/29 09:14:02 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -841,8 +841,10 @@ in_losing(struct inpcb *inp)
error = rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &nrt);
rtcache_unref(rt, &inp->inp_route);
- if (error == 0)
+ if (error == 0) {
+ rt_newmsg_dynamic(RTM_DELETE, nrt);
rt_free(nrt);
+ }
} else
rtcache_unref(rt, &inp->inp_route);
/*
Index: src/sys/netinet/ip_icmp.c
diff -u src/sys/netinet/ip_icmp.c:1.177 src/sys/netinet/ip_icmp.c:1.178
--- src/sys/netinet/ip_icmp.c:1.177 Sat Dec 22 14:28:57 2018
+++ src/sys/netinet/ip_icmp.c Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: ip_icmp.c,v 1.177 2018/12/22 14:28:57 maxv Exp $ */
+/* $NetBSD: ip_icmp.c,v 1.178 2022/08/29 09:14:02 knakahara Exp $ */
/*
* Copyright (c) 1998, 2000 The NetBSD Foundation, Inc.
@@ -94,7 +94,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.177 2018/12/22 14:28:57 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ip_icmp.c,v 1.178 2022/08/29 09:14:02 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_ipsec.h"
@@ -158,6 +158,8 @@ LIST_HEAD(, icmp_mtudisc_callback) icmp_
/* unused... */
u_int ip_next_mtu(u_int, int);
+bool icmp_dynamic_rt_msg = false;
+
static int icmperrppslim = 100; /* 100pps */
static int icmperrpps_count = 0;
static struct timeval icmperrppslim_last;
@@ -1118,6 +1120,13 @@ sysctl_netinet_icmp_setup(struct sysctll
NULL, 0, &icmpbmcastecho, 0,
CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_BMCASTECHO,
CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_BOOL, "dynamic_rt_msg",
+ SYSCTL_DESCR("Send routing message for RTF_DYNAMIC"),
+ NULL, 0, &icmp_dynamic_rt_msg, 0,
+ CTL_NET, PF_INET, IPPROTO_ICMP, ICMPCTL_DYNAMIC_RT_MSG,
+ CTL_EOL);
}
void
@@ -1158,6 +1167,7 @@ icmp_mtudisc(struct icmp *icp, struct in
return;
}
nrt->rt_rmx = rt->rt_rmx;
+ rt_newmsg_dynamic(RTM_ADD, nrt);
rt_unref(rt);
rt = nrt;
}
@@ -1271,6 +1281,7 @@ icmp_mtudisc_timeout(struct rtentry *rt,
(RTF_DYNAMIC | RTF_HOST)) {
rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &retrt);
+ rt_newmsg_dynamic(RTM_DELETE, retrt);
rt_unref(rt);
rt_free(retrt);
} else {
@@ -1292,6 +1303,7 @@ icmp_redirect_timeout(struct rtentry *rt
(RTF_DYNAMIC | RTF_HOST)) {
rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &retrt);
+ rt_newmsg_dynamic(RTM_DELETE, retrt);
rt_unref(rt);
rt_free(retrt);
}
Index: src/sys/netinet6/icmp6.c
diff -u src/sys/netinet6/icmp6.c:1.251 src/sys/netinet6/icmp6.c:1.252
--- src/sys/netinet6/icmp6.c:1.251 Mon Aug 22 09:25:55 2022
+++ src/sys/netinet6/icmp6.c Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: icmp6.c,v 1.251 2022/08/22 09:25:55 knakahara Exp $ */
+/* $NetBSD: icmp6.c,v 1.252 2022/08/29 09:14:02 knakahara 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.251 2022/08/22 09:25:55 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.252 2022/08/29 09:14:02 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -151,6 +151,8 @@ static int icmp6errpps_count = 0;
static struct timeval icmp6errppslim_last;
extern int icmp6_nodeinfo;
+bool icmp6_dynamic_rt_msg = false;
+
/*
* List of callbacks to notify when Path MTU changes are made.
*/
@@ -2838,6 +2840,7 @@ icmp6_mtudisc_clone(struct sockaddr *dst
return NULL;
}
nrt->rt_rmx = rt->rt_rmx;
+ rt_newmsg_dynamic(RTM_ADD, nrt);
rt_unref(rt);
rt = nrt;
}
@@ -2867,6 +2870,7 @@ icmp6_mtudisc_timeout(struct rtentry *rt
(RTF_DYNAMIC | RTF_HOST)) {
rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &retrt);
+ rt_newmsg_dynamic(RTM_DELETE, retrt);
rt_unref(rt);
rt_free(retrt);
} else {
@@ -2887,6 +2891,7 @@ icmp6_redirect_timeout(struct rtentry *r
(RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) {
rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &retrt);
+ rt_newmsg_dynamic(RTM_DELETE, retrt);
rt_unref(rt);
rt_free(retrt);
}
@@ -3117,6 +3122,13 @@ sysctl_net_inet6_icmp6_setup(struct sysc
NULL, 0, &icmp6_reflect_pmtu, 0,
CTL_NET, PF_INET6, IPPROTO_ICMPV6,
ICMPV6CTL_REFLECT_PMTU, CTL_EOL);
+ sysctl_createv(clog, 0, NULL, NULL,
+ CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
+ CTLTYPE_BOOL, "dynamic_rt_msg",
+ SYSCTL_DESCR("Send routing message for RTF_DYNAMIC"),
+ NULL, 0, &icmp6_dynamic_rt_msg, 0,
+ CTL_NET, PF_INET6, IPPROTO_ICMPV6,
+ ICMPV6CTL_DYNAMIC_RT_MSG, CTL_EOL);
}
void
Index: src/sys/netinet6/in6_pcb.c
diff -u src/sys/netinet6/in6_pcb.c:1.169 src/sys/netinet6/in6_pcb.c:1.170
--- src/sys/netinet6/in6_pcb.c:1.169 Fri Jul 29 07:35:16 2022
+++ src/sys/netinet6/in6_pcb.c Mon Aug 29 09:14:02 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: in6_pcb.c,v 1.169 2022/07/29 07:35:16 knakahara Exp $ */
+/* $NetBSD: in6_pcb.c,v 1.170 2022/08/29 09:14:02 knakahara Exp $ */
/* $KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $ */
/*
@@ -62,7 +62,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.169 2022/07/29 07:35:16 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.170 2022/08/29 09:14:02 knakahara Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -940,8 +940,10 @@ in6_losing(struct in6pcb *in6p)
error = rtrequest(RTM_DELETE, rt_getkey(rt),
rt->rt_gateway, rt_mask(rt), rt->rt_flags, &nrt);
rtcache_unref(rt, &in6p->in6p_route);
- if (error == 0)
+ if (error == 0) {
+ rt_newmsg_dynamic(RTM_DELETE, nrt);
rt_free(nrt);
+ }
} else
rtcache_unref(rt, &in6p->in6p_route);
/*