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

Reply via email to