diff --git a/sys/compat/common/compat_50_mod.c b/sys/compat/common/compat_50_mod.c index bfa90f8b60b4..7c9e87a0694f 100644 --- a/sys/compat/common/compat_50_mod.c +++ b/sys/compat/common/compat_50_mod.c @@ -1,4 +1,4 @@ -/* $NetBSD: compat_50_mod.c,v 1.2 2019/01/27 02:08:39 pgoyette Exp $ */ +/* $NetBSD: compat_50_mod.c,v 1.3 2019/04/15 02:07:11 pgoyette Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: compat_50_mod.c,v 1.2 2019/01/27 02:08:39 pgoyette Exp $"); +__KERNEL_RCSID(0, "$NetBSD: compat_50_mod.c,v 1.3 2019/04/15 02:07:11 pgoyette Exp $"); #if defined(_KERNEL_OPT) #include "opt_compat_netbsd.h" @@ -87,6 +87,7 @@ compat_50_init(void) vnd_50_init(); rndpseudo_50_init(); rtsock_50_init(); + kern_uipc_socket_50_init(); return error; @@ -107,6 +108,7 @@ compat_50_fini(void) { int error = 0; + kern_uipc_socket_50_fini(); rtsock_50_fini(); rndpseudo_50_fini(); vnd_50_fini(); @@ -152,6 +154,7 @@ compat_50_fini(void) vnd_50_init(); rndpseudo_50_init(); rtsock_50_init(); + kern_uipc_socket_50_init(); return error; } diff --git a/sys/compat/common/compat_mod.h b/sys/compat/common/compat_mod.h index 8d2e0ec98fc3..67082cb264b1 100644 --- a/sys/compat/common/compat_mod.h +++ b/sys/compat/common/compat_mod.h @@ -1,4 +1,4 @@ -/* $NetBSD: compat_mod.h,v 1.3 2019/01/28 15:46:49 christos Exp $ */ +/* $NetBSD: compat_mod.h,v 1.4 2019/04/15 02:07:11 pgoyette Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -76,6 +76,8 @@ void rndpseudo_50_init(void); void rndpseudo_50_fini(void); void rtsock_50_init(void); void rtsock_50_fini(void); +void kern_uipc_socket_50_init(void); +void kern_uipc_socket_50_fini(void); #endif #ifdef COMPAT_40 diff --git a/sys/compat/common/files.common b/sys/compat/common/files.common index 8be2437dfee1..f6df483af98e 100644 --- a/sys/compat/common/files.common +++ b/sys/compat/common/files.common @@ -1,4 +1,4 @@ -# $NetBSD: files.common,v 1.2 2019/01/27 02:08:39 pgoyette Exp $ +# $NetBSD: files.common,v 1.3 2019/04/15 02:07:11 pgoyette Exp $ # # Generic utility files, used by various compat options. @@ -85,6 +85,7 @@ file compat/common/vnd_50.c compat_50 file compat/common/clockctl_50.c compat_50 file compat/common/if_spppsubr50.c compat_50 file compat/common/uvm_50.c compat_50 +file compat/common/kern_uipc_socket_50.c compat_50 # Compatibility code for NetBSD 6.0 file compat/common/compat_60_mod.c compat_60 diff --git a/sys/compat/common/kern_uipc_socket_50.c b/sys/compat/common/kern_uipc_socket_50.c new file mode 100644 index 000000000000..50a7be9e06bc --- /dev/null +++ b/sys/compat/common/kern_uipc_socket_50.c @@ -0,0 +1,233 @@ +/* $NetBSD: kern_uipc_socket_50.c,v 1.1 2019/04/15 02:07:11 pgoyette Exp $ */ + +/* + * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. + * All rights reserved. + * + * This code is derived from software contributed to The NetBSD Foundation + * by Jason R. Thorpe of Wasabi Systems, Inc, and by Andrew Doran. + * + * 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. + * + * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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. + */ + +/* + * Copyright (c) 2004 The FreeBSD Foundation + * Copyright (c) 2004 Robert Watson + * Copyright (c) 1982, 1986, 1988, 1990, 1993 + * The Regents of the University of California. 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 University 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 REGENTS 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 REGENTS 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. + * + * @(#)uipc_socket.c 8.6 (Berkeley) 5/2/95 + */ + +/* + * Copyright (c) 1988 University of Utah. + * Copyright (c) 1990, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * the Systems Programming Group of the University of Utah Computer + * Science Department. + * + * 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 University 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 REGENTS 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 REGENTS 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. + * + * from: Utah $Hdr: vn.c 1.13 94/04/02$ + * + * @(#)vn.c 8.9 (Berkeley) 5/14/95 + */ + +#include +__KERNEL_RCSID(0, "$NetBSD: kern_uipc_socket_50.c,v 1.1 2019/04/15 02:07:11 pgoyette Exp $"); + +#if defined(_KERNEL_OPT) +#include "opt_compat_netbsd.h" +#endif + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include + +static int +uipc_socket_50_getopt1(int opt, struct socket *so, struct sockopt *sopt, + struct timeval *tv) +{ + int optval, error; + struct timeval50 otv; + + switch (opt) { + + case SO_OSNDTIMEO: + case SO_ORCVTIMEO: + optval = (opt == SO_OSNDTIMEO ? + so->so_snd.sb_timeo : so->so_rcv.sb_timeo); + + otv.tv_sec = optval / hz; + otv.tv_usec = (optval % hz) * tick; + + error = sockopt_set(sopt, &otv, sizeof(otv)); + break; + + case SO_OTIMESTAMP: + error = sockopt_setint(sopt, (so->so_options & opt) ? 1 : 0); + break; + + default: + error = EPASSTHROUGH; + } + return error; +} + +static int +uipc_socket_50_setopt1(int opt, struct socket *so, const struct sockopt *sopt, + struct timeval *tv) +{ + int optval, error; + struct timeval50 otv; + + switch (opt) { + + case SO_OSNDTIMEO: + case SO_ORCVTIMEO: + error = sockopt_get(sopt, &otv, sizeof(otv)); + if (error) { + solock(so); + break; + } + timeval50_to_timeval(&otv, tv); + opt = opt == SO_OSNDTIMEO ? SO_SNDTIMEO : SO_RCVTIMEO; + /* + * Processing will continue as for SO_SNDTIMEO + * and SO_RCVTIMEO, using the new-format tv + */ + break; + + case SO_OTIMESTAMP: + error = sockopt_getint(sopt, &optval); + solock(so); + if (error) + break; + if (optval) + so->so_options |= opt; + else + so->so_options &= ~opt; + break; + + default: + error = EPASSTHROUGH; + } + return error; +} + +static int +uipc_socket_50_sbts(int opt, struct mbuf **mp) +{ + struct timeval50 tv50; + struct timeval tv; + + microtime(&tv); + + if (opt & SO_OTIMESTAMP) { + + timeval_to_timeval50(&tv, &tv50); + *mp = sbcreatecontrol(&tv50, sizeof(tv50), SCM_OTIMESTAMP, + SOL_SOCKET); + if (*mp) + mp = &(*mp)->m_next; + return 0; + } else + return EPASSTHROUGH; +} + +void +kern_uipc_socket_50_init(void) +{ + + MODULE_HOOK_SET(uipc_socket_50_setopt1_hook, "sockop_50", + uipc_socket_50_setopt1); + MODULE_HOOK_SET(uipc_socket_50_getopt1_hook, "sockop_50", + uipc_socket_50_getopt1); + MODULE_HOOK_SET(uipc_socket_50_sbts_hook, "sbts_50", + uipc_socket_50_sbts); +} + +void +kern_uipc_socket_50_fini(void) +{ + + MODULE_HOOK_UNSET(uipc_socket_50_setopt1_hook); + MODULE_HOOK_UNSET(uipc_socket_50_getopt1_hook); + MODULE_HOOK_UNSET(uipc_socket_50_sbts_hook); +} diff --git a/sys/kern/compat_stub.c b/sys/kern/compat_stub.c index 684e0c3cf282..82cbf6fdcff8 100644 --- a/sys/kern/compat_stub.c +++ b/sys/kern/compat_stub.c @@ -1,4 +1,4 @@ -/* $NetBSD: compat_stub.c,v 1.8 2019/02/05 23:28:02 christos Exp $ */ +/* $NetBSD: compat_stub.c,v 1.9 2019/04/15 02:07:11 pgoyette Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -173,10 +173,17 @@ struct if43_cvtcmd_20_hook_t if43_cvtcmd_20_hook; struct tty_ttioctl_43_hook_t tty_ttioctl_43_hook; /* - * uipc_syscalls_40 compatability + * uipc_syscalls_40 compatibility */ struct uipc_syscalls_40_hook_t uipc_syscalls_40_hook; +/* + * uipc_socket_50 compatibility + */ +struct uipc_socket_50_setopt1_hook_t uipc_socket_50_setopt1_hook; +struct uipc_socket_50_getopt1_hook_t uipc_socket_50_getopt1_hook; +struct uipc_socket_50_sbts_hook_t uipc_socket_50_sbts_hook; + /* * uipc_syscalls_50 compatability */ diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 4bb9d82d7ad7..ba9de4d1677f 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.274 2019/04/14 09:09:55 maxv Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.275 2019/04/15 02:07:11 pgoyette Exp $ */ /* * Copyright (c) 2002, 2007, 2008, 2009 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.274 2019/04/14 09:09:55 maxv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.275 2019/04/15 02:07:11 pgoyette Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -104,11 +104,10 @@ __KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.274 2019/04/14 09:09:55 maxv Exp $ #include #include #include +#include -#ifdef COMPAT_50 #include #include -#endif #include #include @@ -1707,12 +1706,23 @@ sorflush(struct socket *so) static int sosetopt1(struct socket *so, const struct sockopt *sopt) { - int error = EINVAL, opt; + int error, opt; int optval = 0; /* XXX: gcc */ struct linger l; struct timeval tv; - switch ((opt = sopt->sopt_name)) { + opt = sopt->sopt_name; + + MODULE_HOOK_CALL(uipc_socket_50_setopt1_hook, (opt, so, sopt, &tv), + enosys(), error); + if (error == EPASSTHROUGH) + error = EINVAL; + else if (error && error != ENOSYS) { + KASSERT(solocked(so)); + return error; + } + + switch (opt) { case SO_ACCEPTFILTER: error = accept_filt_setopt(so, sopt); @@ -1747,9 +1757,6 @@ sosetopt1(struct socket *so, const struct sockopt *sopt) case SO_TIMESTAMP: case SO_NOSIGPIPE: case SO_RERROR: -#ifdef SO_OTIMESTAMP - case SO_OTIMESTAMP: -#endif error = sockopt_getint(sopt, &optval); solock(so); if (error) @@ -1815,25 +1822,15 @@ sosetopt1(struct socket *so, const struct sockopt *sopt) } break; -#ifdef COMPAT_50 case SO_OSNDTIMEO: - case SO_ORCVTIMEO: { - struct timeval50 otv; - error = sockopt_get(sopt, &otv, sizeof(otv)); - if (error) { + case SO_ORCVTIMEO: + if (error == ENOSYS) { + error = EINVAL; solock(so); break; } - timeval50_to_timeval(&otv, &tv); - opt = opt == SO_OSNDTIMEO ? SO_SNDTIMEO : SO_RCVTIMEO; - error = 0; - /*FALLTHROUGH*/ - } -#endif /* COMPAT_50 */ - - /*FALLTHROUGH*/ + /* FALLTHROUGH */ case SO_SNDTIMEO: - /*FALLTHROUGH*/ case SO_RCVTIMEO: if (error) error = sockopt_get(sopt, &tv, sizeof(tv)); @@ -1955,9 +1952,6 @@ sogetopt1(struct socket *so, struct sockopt *sopt) case SO_TIMESTAMP: case SO_NOSIGPIPE: case SO_RERROR: -#ifdef SO_OTIMESTAMP - case SO_OTIMESTAMP: -#endif case SO_ACCEPTCONN: error = sockopt_setint(sopt, (so->so_options & opt) ? 1 : 0); break; @@ -1991,22 +1985,6 @@ sogetopt1(struct socket *so, struct sockopt *sopt) error = sockopt_setint(sopt, so->so_rcv.sb_lowat); break; -#ifdef COMPAT_50 - case SO_OSNDTIMEO: - case SO_ORCVTIMEO: { - struct timeval50 otv; - - optval = (opt == SO_OSNDTIMEO ? - so->so_snd.sb_timeo : so->so_rcv.sb_timeo); - - otv.tv_sec = optval / hz; - otv.tv_usec = (optval % hz) * tick; - - error = sockopt_set(sopt, &otv, sizeof(otv)); - break; - } -#endif /* COMPAT_50 */ - case SO_SNDTIMEO: case SO_RCVTIMEO: optval = (opt == SO_SNDTIMEO ? @@ -2023,7 +2001,10 @@ sogetopt1(struct socket *so, struct sockopt *sopt) break; default: - error = ENOPROTOOPT; + MODULE_HOOK_CALL(uipc_socket_50_getopt1_hook, + (opt, so, sopt, &tv), enosys(), error); + if (error) + error = ENOPROTOOPT; break; } @@ -2441,19 +2422,13 @@ struct mbuf ** sbsavetimestamp(int opt, struct mbuf **mp) { struct timeval tv; + int error; + microtime(&tv); -#ifdef SO_OTIMESTAMP - if (opt & SO_OTIMESTAMP) { - struct timeval50 tv50; - - timeval_to_timeval50(&tv, &tv50); - *mp = sbcreatecontrol(&tv50, sizeof(tv50), - SCM_OTIMESTAMP, SOL_SOCKET); - if (*mp) - mp = &(*mp)->m_next; - } else -#endif + MODULE_HOOK_CALL(uipc_socket_50_sbts_hook, (opt, mp), enosys(), error); + if (error == 0) + return mp; if (opt & SO_TIMESTAMP) { *mp = sbcreatecontrol(&tv, sizeof(tv), diff --git a/sys/modules/compat_50/Makefile b/sys/modules/compat_50/Makefile index 0e6a3aecac64..92bceea52f5d 100644 --- a/sys/modules/compat_50/Makefile +++ b/sys/modules/compat_50/Makefile @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.3 2019/02/17 04:05:45 rin Exp $ +# $NetBSD: Makefile,v 1.4 2019/04/15 02:07:11 pgoyette Exp $ .include "../Makefile.inc" @@ -12,6 +12,7 @@ SRCS+= compat_50_mod.c SRCS+= kern_50.c kern_time_50.c kern_select_50.c SRCS+= vfs_syscalls_50.c uipc_syscalls_50.c uvm_50.c SRCS+= rndpseudo_50.c clockctl_50.c if_spppsubr50.c +SRCS+= kern_uipc_socket_50.c CPPFLAGS+= -DINET -DINET6 # XXX someday we'll need to add diff --git a/sys/sys/compat_stub.h b/sys/sys/compat_stub.h index a603727d6406..7150cfd34b98 100644 --- a/sys/sys/compat_stub.h +++ b/sys/sys/compat_stub.h @@ -1,4 +1,4 @@ -/* $NetBSD: compat_stub.h,v 1.11 2019/02/05 23:28:02 christos Exp $ */ +/* $NetBSD: compat_stub.h,v 1.12 2019/04/15 02:07:11 pgoyette Exp $ */ /*- * Copyright (c) 2018 The NetBSD Foundation, Inc. @@ -220,6 +220,19 @@ MODULE_HOOK(tty_ttioctl_43_hook, int, MODULE_HOOK(uipc_syscalls_40_hook, int, (u_long, void *)); +/* + * uipc_socket_50 compatibility + */ +struct sockopt; +struct timeval; +struct mbuf; + +MODULE_HOOK(uipc_socket_50_setopt1_hook, int, + (int, struct socket *, const struct sockopt *, struct timeval *)); +MODULE_HOOK(uipc_socket_50_getopt1_hook, int, + (int, struct socket *, struct sockopt *, struct timeval *)); +MODULE_HOOK(uipc_socket_50_sbts_hook, int, (int, struct mbuf **)); + /* * uipc_syscalls_50 compatibility */ @@ -311,7 +324,6 @@ MODULE_HOOK(vfs_openat_10_hook, int, (struct pathbuf **)); /* * Hook for compat_70_unp_addsockcred */ -struct mbuf; MODULE_HOOK(uipc_unp_70_hook, struct mbuf *, (struct lwp *, struct mbuf *));