Module Name:    src
Committed By:   pgoyette
Date:           Sat Dec  9 15:21:02 UTC 2023

Modified Files:
        src/sys/compat/common: compat_90_mod.c compat_mod.h files.common
        src/sys/kern: compat_stub.c
        src/sys/modules/compat_90: Makefile
        src/sys/netinet6: icmp6.c in6.c nd6.c
        src/sys/sys: compat_stub.h
Added Files:
        src/sys/compat/common: net_inet6_nd_90.c

Log Message:
Modularize the COMPAT_90 code that resulted from the removal of
netinet6/nd6 from the kernel.  Now, the minimal compat code can
be successfully loaded and unloaded along with the rest of the
COMPAT_90 code.

XXX  pullup-10 - hopefully before RC2


To generate a diff of this commit:
cvs rdiff -u -r1.4 -r1.5 src/sys/compat/common/compat_90_mod.c
cvs rdiff -u -r1.9 -r1.10 src/sys/compat/common/compat_mod.h
cvs rdiff -u -r1.10 -r1.11 src/sys/compat/common/files.common
cvs rdiff -u -r0 -r1.1 src/sys/compat/common/net_inet6_nd_90.c
cvs rdiff -u -r1.22 -r1.23 src/sys/kern/compat_stub.c
cvs rdiff -u -r1.1 -r1.2 src/sys/modules/compat_90/Makefile
cvs rdiff -u -r1.254 -r1.255 src/sys/netinet6/icmp6.c
cvs rdiff -u -r1.290 -r1.291 src/sys/netinet6/in6.c
cvs rdiff -u -r1.280 -r1.281 src/sys/netinet6/nd6.c
cvs rdiff -u -r1.26 -r1.27 src/sys/sys/compat_stub.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/compat/common/compat_90_mod.c
diff -u src/sys/compat/common/compat_90_mod.c:1.4 src/sys/compat/common/compat_90_mod.c:1.5
--- src/sys/compat/common/compat_90_mod.c:1.4	Mon Dec 19 23:19:51 2022
+++ src/sys/compat/common/compat_90_mod.c	Sat Dec  9 15:21:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_90_mod.c,v 1.4 2022/12/19 23:19:51 pgoyette Exp $	*/
+/*	$NetBSD: compat_90_mod.c,v 1.5 2023/12/09 15:21:01 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
 #endif
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: compat_90_mod.c,v 1.4 2022/12/19 23:19:51 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: compat_90_mod.c,v 1.5 2023/12/09 15:21:01 pgoyette Exp $");
 
 #include <sys/systm.h>
 #include <sys/module.h>
@@ -50,14 +50,21 @@ int
 compat_90_init(void)
 {
 
+	net_inet6_nd_90_init();
 	return vfs_syscalls_90_init();
 }
 
 int
 compat_90_fini(void)
 {
+	int error;
 
-	return vfs_syscalls_90_fini();
+	error = vfs_syscalls_90_fini();
+	if (error != 0)
+		return error;
+
+	net_inet6_nd_90_fini();
+	return error;
 }
 
 MODULE(MODULE_CLASS_EXEC, compat_90, "compat_100");

Index: src/sys/compat/common/compat_mod.h
diff -u src/sys/compat/common/compat_mod.h:1.9 src/sys/compat/common/compat_mod.h:1.10
--- src/sys/compat/common/compat_mod.h:1.9	Fri Aug 18 19:41:18 2023
+++ src/sys/compat/common/compat_mod.h	Sat Dec  9 15:21:01 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_mod.h,v 1.9 2023/08/18 19:41:18 christos Exp $	*/
+/*	$NetBSD: compat_mod.h,v 1.10 2023/12/09 15:21:01 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2013, 2019 The NetBSD Foundation, Inc.
@@ -46,6 +46,8 @@ int compat_90_init(void);
 int compat_90_fini(void);
 int vfs_syscalls_90_init(void);
 int vfs_syscalls_90_fini(void);
+int net_inet6_nd_90_init(void);
+int net_inet6_nd_90_fini(void);
 #endif
 
 #ifdef COMPAT_80

Index: src/sys/compat/common/files.common
diff -u src/sys/compat/common/files.common:1.10 src/sys/compat/common/files.common:1.11
--- src/sys/compat/common/files.common:1.10	Fri Aug 18 19:41:18 2023
+++ src/sys/compat/common/files.common	Sat Dec  9 15:21:01 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: files.common,v 1.10 2023/08/18 19:41:18 christos Exp $
+#	$NetBSD: files.common,v 1.11 2023/12/09 15:21:01 pgoyette Exp $
 
 #
 # Generic utility files, used by various compat options.
@@ -109,6 +109,7 @@ file	compat/common/if_media_80.c		compat
 # Compatibility code for NetBSD 9.0
 file	compat/common/compat_90_mod.c		compat_90
 file	compat/common/vfs_syscalls_90.c		compat_90
+file	compat/common/net_inet6_nd_90.c		compat_90
 
 # Compatibility code for NetBSD 10.0
 file	compat/common/compat_100_mod.c		compat_100

Index: src/sys/kern/compat_stub.c
diff -u src/sys/kern/compat_stub.c:1.22 src/sys/kern/compat_stub.c:1.23
--- src/sys/kern/compat_stub.c:1.22	Mon Aug  9 20:49:10 2021
+++ src/sys/kern/compat_stub.c	Sat Dec  9 15:21:01 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.c,v 1.22 2021/08/09 20:49:10 andvar Exp $	*/
+/* $NetBSD: compat_stub.c,v 1.23 2023/12/09 15:21:01 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -286,4 +286,8 @@ struct coredump_elf64_hook_t coredump_el
 struct uvm_coredump_walkmap_hook_t uvm_coredump_walkmap_hook;
 struct uvm_coredump_count_segs_hook_t uvm_coredump_count_segs_hook;
 
+/*
+ * Hooks for interacting with remnants of netinet6/nd6 removal
+ */
+struct net_inet6_nd_90_hook_t net_inet6_nd_90_hook;
 

Index: src/sys/modules/compat_90/Makefile
diff -u src/sys/modules/compat_90/Makefile:1.1 src/sys/modules/compat_90/Makefile:1.2
--- src/sys/modules/compat_90/Makefile:1.1	Sun Sep 22 22:59:39 2019
+++ src/sys/modules/compat_90/Makefile	Sat Dec  9 15:21:01 2023
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.1 2019/09/22 22:59:39 christos Exp $
+#	$NetBSD: Makefile,v 1.2 2023/12/09 15:21:01 pgoyette Exp $
 
 .include "../Makefile.inc"
 
@@ -9,6 +9,7 @@ KMOD=	compat_90
 CPPFLAGS+=	-DCOMPAT_90
 
 SRCS+=	compat_90_mod.c
+SRCS+=	net_inet6_nd_90.c
 SRCS+=	vfs_syscalls_90.c
 
 .include <bsd.kmodule.mk>

Index: src/sys/netinet6/icmp6.c
diff -u src/sys/netinet6/icmp6.c:1.254 src/sys/netinet6/icmp6.c:1.255
--- src/sys/netinet6/icmp6.c:1.254	Fri Oct 28 05:25:36 2022
+++ src/sys/netinet6/icmp6.c	Sat Dec  9 15:21:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: icmp6.c,v 1.254 2022/10/28 05:25:36 ozaki-r Exp $	*/
+/*	$NetBSD: icmp6.c,v 1.255 2023/12/09 15:21:02 pgoyette 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.254 2022/10/28 05:25:36 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: icmp6.c,v 1.255 2023/12/09 15:21:02 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -2896,26 +2896,6 @@ icmp6_redirect_timeout(struct rtentry *r
 	}
 }
 
-#ifdef COMPAT_90
-/*
- * sysctl helper routine for the net.inet6.icmp6.nd6 nodes.  silly?
- */
-static int
-sysctl_net_inet6_icmp6_nd6(SYSCTLFN_ARGS)
-{
-	(void)&name;
-	(void)&l;
-	(void)&oname;
-
-	if (namelen != 0)
-		return (EINVAL);
-
-	return (nd6_sysctl(rnode->sysctl_num, oldp, oldlenp,
-	    /*XXXUNCONST*/
-	    __UNCONST(newp), newlen));
-}
-#endif
-
 static int
 sysctl_net_inet6_icmp6_stats(SYSCTLFN_ARGS)
 {
@@ -3098,22 +3078,6 @@ sysctl_net_inet6_icmp6_setup(struct sysc
 		       NULL, 0, &nd6_debug, 0,
 		       CTL_NET, PF_INET6, IPPROTO_ICMPV6,
 		       ICMPV6CTL_ND6_DEBUG, CTL_EOL);
-#ifdef COMPAT_90
-	sysctl_createv(clog, 0, NULL, NULL,
-		       CTLFLAG_PERMANENT,
-		       CTLTYPE_STRUCT, "nd6_drlist",
-		       SYSCTL_DESCR("Default router list"),
-		       sysctl_net_inet6_icmp6_nd6, 0, NULL, 0,
-		       CTL_NET, PF_INET6, IPPROTO_ICMPV6,
-		       OICMPV6CTL_ND6_DRLIST, CTL_EOL);
-	sysctl_createv(clog, 0, NULL, NULL,
-		       CTLFLAG_PERMANENT,
-		       CTLTYPE_STRUCT, "nd6_prlist",
-		       SYSCTL_DESCR("Prefix list"),
-		       sysctl_net_inet6_icmp6_nd6, 0, NULL, 0,
-		       CTL_NET, PF_INET6, IPPROTO_ICMPV6,
-		       OICMPV6CTL_ND6_PRLIST, CTL_EOL);
-#endif
 	sysctl_createv(clog, 0, NULL, NULL,
 		       CTLFLAG_PERMANENT|CTLFLAG_READWRITE,
 		       CTLTYPE_BOOL, "reflect_pmtu",

Index: src/sys/netinet6/in6.c
diff -u src/sys/netinet6/in6.c:1.290 src/sys/netinet6/in6.c:1.291
--- src/sys/netinet6/in6.c:1.290	Thu Dec  7 16:47:44 2023
+++ src/sys/netinet6/in6.c	Sat Dec  9 15:21:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: in6.c,v 1.290 2023/12/07 16:47:44 pgoyette Exp $	*/
+/*	$NetBSD: in6.c,v 1.291 2023/12/09 15:21:02 pgoyette Exp $	*/
 /*	$KAME: in6.c,v 1.198 2001/07/18 09:12:38 itojun Exp $	*/
 
 /*
@@ -62,7 +62,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.290 2023/12/07 16:47:44 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.291 2023/12/09 15:21:02 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -105,24 +105,8 @@ __KERNEL_RCSID(0, "$NetBSD: in6.c,v 1.29
 #include <netinet6/in6_ifattach.h>
 #include <netinet6/scope6_var.h>
 
-/* XXX
- *
- * The COMPAT_* code here, along with call-sites in nd6.c and
- * icmp6.c, needs to be reworked to use compat hooks.  As it
- * stands right now, the compat code only gets built if it is
- * iincluded in the kernel at build time;  building and loading
- * compat_* modules will not include this compat code!
- *
- * XXX
- */
-
-#ifdef COMPAT_50
-#include <compat/netinet6/in6_var.h>
-#endif
-#ifdef COMPAT_90
 #include <compat/netinet6/in6_var.h>
 #include <compat/netinet6/nd6.h>
-#endif
 
 MALLOC_DEFINE(M_IP6OPT, "ip6_options", "IPv6 options");
 

Index: src/sys/netinet6/nd6.c
diff -u src/sys/netinet6/nd6.c:1.280 src/sys/netinet6/nd6.c:1.281
--- src/sys/netinet6/nd6.c:1.280	Wed Oct 11 09:13:51 2023
+++ src/sys/netinet6/nd6.c	Sat Dec  9 15:21:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: nd6.c,v 1.280 2023/10/11 09:13:51 msaitoh Exp $	*/
+/*	$NetBSD: nd6.c,v 1.281 2023/12/09 15:21:02 pgoyette 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.280 2023/10/11 09:13:51 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.281 2023/12/09 15:21:02 pgoyette Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -57,6 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.28
 #include <sys/queue.h>
 #include <sys/cprng.h>
 #include <sys/workqueue.h>
+#include <sys/compat_stub.h>
 
 #include <net/if.h>
 #include <net/if_dl.h>
@@ -77,10 +78,8 @@ __KERNEL_RCSID(0, "$NetBSD: nd6.c,v 1.28
 #include <netinet/icmp6.h>
 #include <netinet6/icmp6_private.h>
 
-#ifdef COMPAT_90
 #include <compat/netinet6/in6_var.h>
 #include <compat/netinet6/nd6.h>
-#endif
 
 #define ND6_SLOWTIMER_INTERVAL (60 * 60) /* 1 hour */
 #define ND6_RECALC_REACHTM_INTERVAL (60 * 120) /* 2 hours */
@@ -1673,17 +1672,22 @@ nd6_sysctl(
     size_t newlen
 )
 {
+	int error;
 
 	if (newp)
 		return EPERM;
 
 	switch (name) {
-#ifdef COMPAT_90
+
+/* call the nd6 compat_90 hook to validate the nd6-related names */
 	case OICMPV6CTL_ND6_DRLIST: /* FALLTHROUGH */
 	case OICMPV6CTL_ND6_PRLIST:
-		*oldlenp = 0;
-		return 0;
-#endif
+		MODULE_HOOK_CALL(net_inet6_nd_90_hook, (name), ENOPROTOOPT,
+		    error);
+		if (error == 0)
+			*oldlenp = 0;
+		return error;
+
 	case ICMPV6CTL_ND6_MAXQLEN:
 		return 0;
 	default:

Index: src/sys/sys/compat_stub.h
diff -u src/sys/sys/compat_stub.h:1.26 src/sys/sys/compat_stub.h:1.27
--- src/sys/sys/compat_stub.h:1.26	Mon Jul 31 17:41:18 2023
+++ src/sys/sys/compat_stub.h	Sat Dec  9 15:21:02 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: compat_stub.h,v 1.26 2023/07/31 17:41:18 christos Exp $	*/
+/*	$NetBSD: compat_stub.h,v 1.27 2023/12/09 15:21:02 pgoyette Exp $	*/
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -402,4 +402,9 @@ struct proc;
 struct trapframe;
 MODULE_HOOK(amd64_oosyscall_hook, int, (struct proc *, struct trapframe *));
 
+/*
+ * Hook for compat_90 to deal with removal of nd6 from the kernel
+ */
+MODULE_HOOK(net_inet6_nd_90_hook, int, (int));
+
 #endif	/* _SYS_COMPAT_STUB_H */

Added files:

Index: src/sys/compat/common/net_inet6_nd_90.c
diff -u /dev/null src/sys/compat/common/net_inet6_nd_90.c:1.1
--- /dev/null	Sat Dec  9 15:21:02 2023
+++ src/sys/compat/common/net_inet6_nd_90.c	Sat Dec  9 15:21:01 2023
@@ -0,0 +1,130 @@
+/*	$NetBSD: net_inet6_nd_90.c,v 1.1 2023/12/09 15:21:01 pgoyette Exp $ */
+
+/*      $NetBSD: net_inet6_nd_90.c,v 1.1 2023/12/09 15:21:01 pgoyette Exp $        */
+/*      $KAME: nd6.c,v 1.279 2002/06/08 11:16:51 itojun Exp $   */
+
+/*
+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the project nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+__KERNEL_RCSID(0, "$NetBSD: net_inet6_nd_90.c,v 1.1 2023/12/09 15:21:01 pgoyette Exp $");
+
+#if defined(_KERNEL_OPT)
+#include "opt_compat_netbsd.h"
+#endif
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/namei.h>
+#include <sys/filedesc.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+
+#include <netinet/icmp6.h>
+#include <netinet/ip6.h>
+
+#include <netinet6/in6_var.h>
+#include <netinet6/nd6.h>
+
+#include <sys/compat_stub.h>
+
+#include <compat/common/compat_mod.h>
+
+static struct sysctllog *nd6_clog;
+
+/*
+ * sysctl helper routine for the net.inet6.icmp6.nd6 nodes.  silly?
+ */
+static int              
+sysctl_net_inet6_icmp6_nd6(SYSCTLFN_ARGS)
+{
+	(void)&name;
+	(void)&l;
+	(void)&oname;
+                        
+	if (namelen != 0)
+		return (EINVAL);
+   
+	return (nd6_sysctl(rnode->sysctl_num, oldp, oldlenp,
+	    /*XXXUNCONST*/
+	    __UNCONST(newp), newlen));
+}
+int real_net_inet6_nd_90(int);
+
+/*
+ * the hook is only called for valid codes, so the mere presence
+ * of the hook means success.
+ */
+/* ARGSUSED */
+int
+real_net_inet6_nd_90(int name)
+{
+
+	return 0;
+}
+
+int
+net_inet6_nd_90_init(void)
+{
+	int error;
+
+	error = sysctl_createv(&nd6_clog, 0, NULL, NULL,
+		CTLFLAG_PERMANENT,
+		CTLTYPE_STRUCT, "nd6_drlist",
+		SYSCTL_DESCR("Default router list"),
+		sysctl_net_inet6_icmp6_nd6, 0, NULL, 0,
+		CTL_NET, PF_INET6, IPPROTO_ICMPV6,
+		OICMPV6CTL_ND6_DRLIST, CTL_EOL);
+	if (error != 0)
+		return error;
+
+	error = sysctl_createv(&nd6_clog, 0, NULL, NULL,
+		CTLFLAG_PERMANENT,
+		CTLTYPE_STRUCT, "nd6_prlist",
+		SYSCTL_DESCR("Prefix list"),
+		sysctl_net_inet6_icmp6_nd6, 0, NULL, 0,
+		CTL_NET, PF_INET6, IPPROTO_ICMPV6,
+		OICMPV6CTL_ND6_PRLIST, CTL_EOL);
+
+	MODULE_HOOK_SET(net_inet6_nd_90_hook, real_net_inet6_nd_90);
+	return error;
+}
+
+int
+net_inet6_nd_90_fini(void)
+{
+
+	sysctl_teardown(&nd6_clog);
+	MODULE_HOOK_UNSET(net_inet6_nd_90_hook);
+	return 0;
+}

Reply via email to