Module Name: src
Committed By: pgoyette
Date: Fri Sep 21 02:56:22 UTC 2018
Modified Files:
src/sys/compat/common [pgoyette-compat]: if43_20.c if_43.c
src/sys/kern [pgoyette-compat]: compat_stub.c
src/sys/net [pgoyette-compat]: if.c
src/sys/sys [pgoyette-compat]: compat_stub.h
Log Message:
Clean-up some pre-existing function-pointer code (related to if_43)
to use the new MP-safe mechanism.
To generate a diff of this commit:
cvs rdiff -u -r1.1.2.1 -r1.1.2.2 src/sys/compat/common/if43_20.c
cvs rdiff -u -r1.14.2.4 -r1.14.2.5 src/sys/compat/common/if_43.c
cvs rdiff -u -r1.1.2.21 -r1.1.2.22 src/sys/kern/compat_stub.c
cvs rdiff -u -r1.419.2.12 -r1.419.2.13 src/sys/net/if.c
cvs rdiff -u -r1.1.2.31 -r1.1.2.32 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/if43_20.c
diff -u src/sys/compat/common/if43_20.c:1.1.2.1 src/sys/compat/common/if43_20.c:1.1.2.2
--- src/sys/compat/common/if43_20.c:1.1.2.1 Fri Mar 30 02:28:49 2018
+++ src/sys/compat/common/if43_20.c Fri Sep 21 02:56:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if43_20.c,v 1.1.2.1 2018/03/30 02:28:49 pgoyette Exp $ */
+/* $NetBSD: if43_20.c,v 1.1.2.2 2018/09/21 02:56:22 pgoyette Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if43_20.c,v 1.1.2.1 2018/03/30 02:28:49 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if43_20.c,v 1.1.2.2 2018/09/21 02:56:22 pgoyette Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -64,7 +64,7 @@ __KERNEL_RCSID(0, "$NetBSD: if43_20.c,v
#include <compat/common/compat_mod.h>
static int
-if43_cvtcmd_20(int ncmd)
+if43_cvtcmd_20(u_long ncmd)
{
switch (ncmd) {
@@ -76,16 +76,19 @@ if43_cvtcmd_20(int ncmd)
}
}
+MODULE_SET_HOOK(if43_20_hook, "if4320", if43_cvtcmd_20);
+MODULE_UNSET_HOOK(if43_20_hook);
+
void
if43_20_init(void)
{
- if43_20_cvtcmd = if43_cvtcmd_20;
+ if43_20_hook_set();
}
void
if43_20_fini(void)
{
- if43_20_cvtcmd = (void *)enosys;
+ if43_20_hook_unset();
}
Index: src/sys/compat/common/if_43.c
diff -u src/sys/compat/common/if_43.c:1.14.2.4 src/sys/compat/common/if_43.c:1.14.2.5
--- src/sys/compat/common/if_43.c:1.14.2.4 Tue Sep 18 23:03:54 2018
+++ src/sys/compat/common/if_43.c Fri Sep 21 02:56:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if_43.c,v 1.14.2.4 2018/09/18 23:03:54 pgoyette Exp $ */
+/* $NetBSD: if_43.c,v 1.14.2.5 2018/09/21 02:56:22 pgoyette Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1990, 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1.14.2.4 2018/09/18 23:03:54 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1.14.2.5 2018/09/21 02:56:22 pgoyette Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -77,13 +77,31 @@ __KERNEL_RCSID(0, "$NetBSD: if_43.c,v 1.
#include <compat/common/if_43.h>
#include <uvm/uvm_extern.h>
-/* MODULE_HOOK for replacing the cmdcvt() function */
-MODULE_CALL_HOOK_DECL(ieee80211_get_ostats_20_hook, f, (int cmd), (cmd), cmd);
-MODULE_CALL_HOOK(ieee80211_get_ostats_20_hook, f, (int cmd), (cmd), cmd);
+#if defined(COMPAT_43)
-u_long
-compat_cvtcmd(u_long cmd)
+/*
+ * Hook for calling the if43_20 compatability routine.
+ *
+ * XXX The if43_20 routine doesn't really have any effect, since its
+ * XXX return value is ignored (see compat/common/if_43.c)!
+ */
+MODULE_CALL_HOOK_DECL(if43_20_hook, f, (u_long ncmd), (ncmd), enosys());
+MODULE_CALL_HOOK(if43_20_hook, f, (u_long ncmd), (ncmd), enosys());
+
+/*
+ * Use a wrapper so that the compat_cvtcmd() can return a u_long
+ */
+static int
+do_compat_cvtcmd(u_long *ncmd, u_long ocmd)
{
+
+ *ncmd = compat_cvtcmd(ocmd);
+ return 0;
+}
+
+u_long
+compat_cvtcmd(u_long cmd)
+{
u_long ncmd;
if (IOCPARM_LEN(cmd) != sizeof(struct oifreq))
@@ -206,7 +224,8 @@ compat_cvtcmd(u_long cmd)
case TAPGIFNAME:
return ncmd;
default:
- return ieee80211_get_ostats_20_hook_f_call(ncmd);
+ (void)if43_20_hook_f_call(ncmd);
+ return ncmd;
}
}
}
@@ -282,27 +301,20 @@ compat_ifioctl(struct socket *so, u_long
return error;
}
-#if defined(COMPAT_43)
-static u_long (*orig_compat_cvtcmd)(u_long);
-static int (*orig_compat_ifioctl)(struct socket *, u_long, u_long,
- void *, struct lwp *);
+MODULE_SET_HOOK2(if_43_hook, "if_43", do_compat_cvtcmd, compat_ifioctl);
+MODULE_UNSET_HOOK2(if_43_hook);
void
if_43_init(void)
{
- orig_compat_cvtcmd = vec_compat_cvtcmd;
- vec_compat_cvtcmd = compat_cvtcmd;
-
- orig_compat_ifioctl = vec_compat_ifioctl;
- vec_compat_ifioctl = compat_ifioctl;
+ if_43_hook_set();
}
void
if_43_fini(void)
{
- vec_compat_cvtcmd = orig_compat_cvtcmd;
- vec_compat_ifioctl = orig_compat_ifioctl;
+ if_43_hook_unset();
}
#endif /* defined(COMPAT_43) */
Index: src/sys/kern/compat_stub.c
diff -u src/sys/kern/compat_stub.c:1.1.2.21 src/sys/kern/compat_stub.c:1.1.2.22
--- src/sys/kern/compat_stub.c:1.1.2.21 Thu Sep 20 07:34:10 2018
+++ src/sys/kern/compat_stub.c Fri Sep 21 02:56:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.c,v 1.1.2.21 2018/09/20 07:34:10 pgoyette Exp $ */
+/* $NetBSD: compat_stub.c,v 1.1.2.22 2018/09/21 02:56:22 pgoyette Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -139,6 +139,11 @@ struct ieee80211_get_ostats_20_hook_t ie
struct if_43_hook_t if_43_hook;
/*
+ * if43_20 compatability
+ */
+struct if43_20_hook_t if43_20_hook;
+
+/*
* upic_syscalls_40 compatability
*/
struct uipc_syscalls_40_hook_t uipc_syscalls_40_hook;
@@ -148,8 +153,6 @@ struct uipc_syscalls_40_hook_t uipc_sysc
*/
struct uipc_syscalls_50_hook_t uipc_syscalls_50_hook;
-/*XXX PRG */int (*if43_20_cvtcmd)(int) = (void *)enosys;
-
/*
* rtsock 14 compatability
*/
Index: src/sys/net/if.c
diff -u src/sys/net/if.c:1.419.2.12 src/sys/net/if.c:1.419.2.13
--- src/sys/net/if.c:1.419.2.12 Thu Sep 20 09:23:22 2018
+++ src/sys/net/if.c Fri Sep 21 02:56:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: if.c,v 1.419.2.12 2018/09/20 09:23:22 pgoyette Exp $ */
+/* $NetBSD: if.c,v 1.419.2.13 2018/09/21 02:56:22 pgoyette Exp $ */
/*-
* Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.419.2.12 2018/09/20 09:23:22 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.419.2.13 2018/09/21 02:56:22 pgoyette Exp $");
#if defined(_KERNEL_OPT)
#include "opt_inet.h"
@@ -243,11 +243,6 @@ static void sysctl_net_pktq_setup(struct
static void if_sysctl_setup(struct sysctllog **);
-/* Compatibility vector functions */
-u_long (*vec_compat_cvtcmd)(u_long) = NULL;
-int (*vec_compat_ifioctl)(struct socket *, u_long, u_long, void *,
- struct lwp *) = NULL;
-
static int
if_listener_cb(kauth_cred_t cred, kauth_action_t action, void *cookie,
void *arg0, void *arg1, void *arg2, void *arg3)
@@ -3119,6 +3114,18 @@ MODULE_CALL_HOOK_DECL(uipc_syscalls_50_h
MODULE_CALL_HOOK(uipc_syscalls_50_hook, f,
(struct lwp *l, int cmd, void *data), (l, cmd, data), enosys());
+MODULE_CALL_HOOK_DECL(if_43_hook, f1,
+ (u_long *ncmd, u_long ocmd), (ncmd, ocmd), enosys());
+MODULE_CALL_HOOK(if_43_hook, f1,
+ (u_long *ncmd, u_long ocmd), (ncmd, ocmd), enosys());
+
+MODULE_CALL_HOOK_DECL(if_43_hook, f2,
+ (struct socket *so, u_long ocmd, u_long cmd, void *data, struct lwp *l),
+ (so, ocmd, cmd, data, l), enosys());
+MODULE_CALL_HOOK(if_43_hook, f2,
+ (struct socket *so, u_long ocmd, u_long cmd, void *data, struct lwp *l),
+ (so, ocmd, cmd, data, l), enosys());
+
/*
* Interface ioctls.
*/
@@ -3128,14 +3135,10 @@ doifioctl(struct socket *so, u_long cmd,
struct ifnet *ifp;
struct ifreq *ifr;
int error = 0;
-#if defined(COMPAT_OSOCK) || defined(COMPAT_OIFREQ)
u_long ocmd = cmd;
-#endif
short oif_flags;
-#ifdef COMPAT_OIFREQ
struct ifreq ifrb;
struct oifreq *oifr = NULL;
-#endif
int r;
struct psref psref;
int bound;
@@ -3157,16 +3160,13 @@ doifioctl(struct socket *so, u_long cmd,
}
ifr = data;
-#ifdef COMPAT_OIFREQ
- if (vec_compat_cvtcmd) {
- cmd = (*vec_compat_cvtcmd)(cmd);
+ if (if_43_hook_f1_call(&cmd, ocmd) != ENOSYS) {
if (cmd != ocmd) {
oifr = data;
data = ifr = &ifrb;
ifreqo2n(oifr, ifr);
}
}
-#endif
switch (cmd) {
case SIOCIFCREATE:
@@ -3259,11 +3259,8 @@ doifioctl(struct socket *so, u_long cmd,
error = EOPNOTSUPP;
else {
KERNEL_LOCK_IF_IFP_MPSAFE(ifp);
-#ifdef COMPAT_OSOCK
- if (vec_compat_ifioctl != NULL)
- error = (*vec_compat_ifioctl)(so, ocmd, cmd, data, l);
- else
-#endif
+ error = if_43_hook_f2_call(so, ocmd, cmd, data, l);
+ if (error == ENOSYS)
error = (*so->so_proto->pr_usrreqs->pr_ioctl)(so,
cmd, data, ifp);
KERNEL_UNLOCK_IF_IFP_MPSAFE(ifp);
@@ -3276,10 +3273,8 @@ doifioctl(struct socket *so, u_long cmd,
splx(s);
}
}
-#ifdef COMPAT_OIFREQ
if (cmd != ocmd)
ifreqn2o(oifr, ifr);
-#endif
IFNET_UNLOCK(ifp);
KERNEL_UNLOCK_UNLESS_IFP_MPSAFE(ifp);
@@ -3414,13 +3409,11 @@ int
ifreq_setaddr(u_long cmd, struct ifreq *ifr, const struct sockaddr *sa)
{
uint8_t len = sizeof(ifr->ifr_ifru.ifru_space);
-#ifdef COMPAT_OIFREQ
struct ifreq ifrb;
struct oifreq *oifr = NULL;
u_long ocmd = cmd;
- if (vec_compat_cvtcmd) {
- cmd = (*vec_compat_cvtcmd)(cmd);
+ if (if_43_hook_f1_call(&cmd, ocmd) != ENOSYS) {
if (cmd != ocmd) {
oifr = (struct oifreq *)(void *)ifr;
ifr = &ifrb;
@@ -3429,17 +3422,14 @@ ifreq_setaddr(u_long cmd, struct ifreq *
}
}
-#endif
if (len < sa->sa_len)
return EFBIG;
memset(&ifr->ifr_addr, 0, len);
sockaddr_copy(&ifr->ifr_addr, len, sa);
-#ifdef COMPAT_OIFREQ
if (cmd != ocmd)
ifreqn2o(oifr, ifr);
-#endif
return 0;
}
Index: src/sys/sys/compat_stub.h
diff -u src/sys/sys/compat_stub.h:1.1.2.31 src/sys/sys/compat_stub.h:1.1.2.32
--- src/sys/sys/compat_stub.h:1.1.2.31 Thu Sep 20 09:23:22 2018
+++ src/sys/sys/compat_stub.h Fri Sep 21 02:56:22 2018
@@ -1,4 +1,4 @@
-/* $NetBSD: compat_stub.h,v 1.1.2.31 2018/09/20 09:23:22 pgoyette Exp $ */
+/* $NetBSD: compat_stub.h,v 1.1.2.32 2018/09/21 02:56:22 pgoyette Exp $ */
/*-
* Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -166,10 +166,14 @@ MODULE_HOOK(ieee80211_get_ostats_20_hook
*/
struct socket;
-MODULE_HOOK2(if_43_hook, (int),
+MODULE_HOOK2(if_43_hook,
+ (u_long *, u_long),
(struct socket *, u_long, u_long, void *, struct lwp *));
-/* XXX PRG */extern int (*if43_20_cvtcmd)(int);
+/*
+ * if43_20 compatability
+ */
+MODULE_HOOK(if43_20_hook, (u_long cmd));
/*
* uipc_syscalls_40 compatability