Date: Mon, 27 Jul 2020 14:41:23 +0000 (UTC) From: Mark Johnston <markj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r363609 - in stable/12: share/man/man4 sys/modules sys/modules/sctp sys/netinet Message-ID: <202007271441.06REfNKl087181@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: markj Date: Mon Jul 27 14:41:23 2020 New Revision: 363609 URL: https://svnweb.freebsd.org/changeset/base/363609 Log: MFC r363079, r363080, r363129, r363133: Provide support for building SCTP as a loadable module. Added: stable/12/sys/modules/sctp/ - copied from r363079, head/sys/modules/sctp/ stable/12/sys/netinet/sctp_module.c - copied unchanged from r363079, head/sys/netinet/sctp_module.c Modified: stable/12/share/man/man4/sctp.4 stable/12/sys/modules/Makefile stable/12/sys/netinet/sctp_os_bsd.h stable/12/sys/netinet/sctp_syscalls.c stable/12/sys/netinet/sctp_usrreq.c Directory Properties: stable/12/ (props changed) Modified: stable/12/share/man/man4/sctp.4 ============================================================================== --- stable/12/share/man/man4/sctp.4 Mon Jul 27 14:28:55 2020 (r363608) +++ stable/12/share/man/man4/sctp.4 Mon Jul 27 14:41:23 2020 (r363609) @@ -26,7 +26,7 @@ .\" .\" $FreeBSD$ .\" -.Dd June 18, 2020 +.Dd July 9, 2020 .Dt SCTP 4 .Os .Sh NAME @@ -144,8 +144,18 @@ The transport protocol also provides a unordered service as well. The unordered service allows a message to be sent and delivered with no regard to the ordering of any other message. +.Pp +The +.Tn SCTP +kernel implementation may either be compiled into the kernel, or loaded +dynamically as a module. +To support dynamic loading of the stack, the kernel must be compiled +with +.Cd "options SCTP_SUPPORT" . .Ss Extensions -The FreeBSD implementation of +The +.Fx +implementation of .Tn SCTP also supports the following extensions: .Bl -tag -width "sctp partial reliability" @@ -609,3 +619,7 @@ Maximum outgoing SCTP buffer size. .Xr sctp_recvmsg 3 , .Xr sctp_sendmsg 3 , .Xr blackhole 4 +.Sh BUGS +The +.Nm +kernel module cannot be unloaded. Modified: stable/12/sys/modules/Makefile ============================================================================== --- stable/12/sys/modules/Makefile Mon Jul 27 14:28:55 2020 (r363608) +++ stable/12/sys/modules/Makefile Mon Jul 27 14:41:23 2020 (r363609) @@ -343,6 +343,7 @@ SUBDIR= \ ${_sbni} \ scc \ ${_scsi_low} \ + ${_sctp} \ sdhci \ ${_sdhci_acpi} \ sdhci_pci \ @@ -460,6 +461,9 @@ _if_gre= if_gre _ipfw_pmod= ipfw_pmod .if ${MK_IPSEC_SUPPORT} != "no" _ipsec= ipsec +.endif +.if ${KERN_OPTS:MSCTP_SUPPORT} || ${KERN_OPTS:MSCTP} +_sctp= sctp .endif .endif Copied: stable/12/sys/netinet/sctp_module.c (from r363079, head/sys/netinet/sctp_module.c) ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ stable/12/sys/netinet/sctp_module.c Mon Jul 27 14:41:23 2020 (r363609, copy of r363079, head/sys/netinet/sctp_module.c) @@ -0,0 +1,197 @@ +/*- + * SPDX-License-Identifier: BSD-2-Clause-FreeBSD + * + * Copyright (c) 2019-2020 The FreeBSD Foundation + * + * This software was developed by Mark Johnston under sponsorship from + * the FreeBSD Foundation. + * + * 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 AUTHOR 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 AUTHOR 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> +__FBSDID("$FreeBSD$"); + +#include "opt_inet.h" +#include "opt_inet6.h" + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/protosw.h> +#include <sys/socket.h> + +#include <netinet/in.h> +#include <netinet/ip.h> +#include <netinet/ip_var.h> +#include <netinet/sctp.h> +#include <netinet/sctp_pcb.h> +#include <netinet/sctp_var.h> +#include <netinet/sctp_os_bsd.h> + +#include <netinet6/ip6_var.h> +#include <netinet6/sctp6_var.h> + +#ifdef INET +extern struct domain inetdomain; + +struct protosw sctp_stream_protosw = { + .pr_type = SOCK_STREAM, + .pr_domain = &inetdomain, + .pr_protocol = IPPROTO_SCTP, + .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LASTHDR, + .pr_input = sctp_input, + .pr_ctlinput = sctp_ctlinput, + .pr_ctloutput = sctp_ctloutput, + .pr_drain = sctp_drain, + .pr_usrreqs = &sctp_usrreqs, +}; + +struct protosw sctp_seqpacket_protosw = { + .pr_type = SOCK_SEQPACKET, + .pr_domain = &inetdomain, + .pr_protocol = IPPROTO_SCTP, + .pr_flags = PR_WANTRCVD|PR_LASTHDR, + .pr_input = sctp_input, + .pr_ctlinput = sctp_ctlinput, + .pr_ctloutput = sctp_ctloutput, + .pr_drain = sctp_drain, + .pr_usrreqs = &sctp_usrreqs, +}; +#endif + +#ifdef INET6 +extern struct domain inet6domain; + +struct protosw sctp6_stream_protosw = { + .pr_type = SOCK_STREAM, + .pr_domain = &inet6domain, + .pr_protocol = IPPROTO_SCTP, + .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LASTHDR, + .pr_input = sctp6_input, + .pr_ctlinput = sctp6_ctlinput, + .pr_ctloutput = sctp_ctloutput, + .pr_init = sctp_init, + .pr_drain = sctp_drain, + .pr_usrreqs = &sctp6_usrreqs, +}; + +struct protosw sctp6_seqpacket_protosw = { + .pr_type = SOCK_SEQPACKET, + .pr_domain = &inet6domain, + .pr_protocol = IPPROTO_SCTP, + .pr_flags = PR_WANTRCVD|PR_LASTHDR, + .pr_input = sctp6_input, + .pr_ctlinput = sctp6_ctlinput, + .pr_ctloutput = sctp_ctloutput, +#ifndef INET /* Do not call initialization and drain routines twice. */ + .pr_init = sctp_init, + .pr_drain = sctp_drain, +#endif + .pr_usrreqs = &sctp6_usrreqs, +}; +#endif + +static int +sctp_module_load(void) +{ + int error; + +#ifdef INET + error = pf_proto_register(PF_INET, &sctp_stream_protosw); + if (error != 0) + return (error); + error = pf_proto_register(PF_INET, &sctp_seqpacket_protosw); + if (error != 0) + return (error); + error = ipproto_register(IPPROTO_SCTP); + if (error != 0) + return (error); +#endif +#ifdef INET6 + error = pf_proto_register(PF_INET6, &sctp6_stream_protosw); + if (error != 0) + return (error); + error = pf_proto_register(PF_INET6, &sctp6_seqpacket_protosw); + if (error != 0) + return (error); + error = ip6proto_register(IPPROTO_SCTP); + if (error != 0) + return (error); +#endif + error = sctp_syscalls_init(); + if (error != 0) + return (error); + return (0); +} + +static int __unused +sctp_module_unload(void) +{ + + (void)sctp_syscalls_uninit(); + +#ifdef INET + (void)ipproto_unregister(IPPROTO_SCTP); + (void)pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_STREAM); + (void)pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_SEQPACKET); +#endif +#ifdef INET6 + (void)ip6proto_unregister(IPPROTO_SCTP); + (void)pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_STREAM); + (void)pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_SEQPACKET); +#endif + return (0); +} + +static int +sctp_modload(struct module *module, int cmd, void *arg) +{ + int error; + + switch (cmd) { + case MOD_LOAD: + error = sctp_module_load(); + break; + case MOD_UNLOAD: + /* + * Unloading SCTP is currently unsupported. Currently, SCTP + * iterator threads are not stopped during unload. + */ + error = EOPNOTSUPP; + break; + default: + error = 0; + break; + } + return (error); +} + +static moduledata_t sctp_mod = { + "sctp", + &sctp_modload, + NULL, +}; + +DECLARE_MODULE(sctp, sctp_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY); +MODULE_VERSION(sctp, 1); Modified: stable/12/sys/netinet/sctp_os_bsd.h ============================================================================== --- stable/12/sys/netinet/sctp_os_bsd.h Mon Jul 27 14:28:55 2020 (r363608) +++ stable/12/sys/netinet/sctp_os_bsd.h Mon Jul 27 14:41:23 2020 (r363609) @@ -45,9 +45,12 @@ __FBSDID("$FreeBSD$"); #include "opt_sctp.h" #include <sys/param.h> +#include <sys/domain.h> +#include <sys/eventhandler.h> #include <sys/ktr.h> #include <sys/systm.h> #include <sys/malloc.h> +#include <sys/module.h> #include <sys/kernel.h> #include <sys/sysctl.h> #include <sys/mbuf.h> @@ -83,7 +86,6 @@ __FBSDID("$FreeBSD$"); #include <netinet/icmp_var.h> #ifdef INET6 -#include <sys/domain.h> #include <netinet/ip6.h> #include <netinet6/ip6_var.h> #include <netinet6/in6_pcb.h> @@ -477,5 +479,8 @@ sctp_get_mbuf_for_msg(unsigned int space_needed, #endif #define SCTP_IS_LISTENING(inp) ((inp->sctp_flags & SCTP_PCB_FLAGS_ACCEPTING) != 0) + +int sctp_syscalls_init(void); +int sctp_syscalls_uninit(void); #endif Modified: stable/12/sys/netinet/sctp_syscalls.c ============================================================================== --- stable/12/sys/netinet/sctp_syscalls.c Mon Jul 27 14:28:55 2020 (r363608) +++ stable/12/sys/netinet/sctp_syscalls.c Mon Jul 27 14:41:23 2020 (r363609) @@ -32,8 +32,6 @@ __FBSDID("$FreeBSD$"); #include "opt_capsicum.h" -#include "opt_inet.h" -#include "opt_inet6.h" #include "opt_sctp.h" #include "opt_ktrace.h" @@ -69,6 +67,8 @@ __FBSDID("$FreeBSD$"); #include <sys/ktrace.h> #endif #ifdef COMPAT_FREEBSD32 +#include <compat/freebsd32/freebsd32.h> +#include <compat/freebsd32/freebsd32_syscall.h> #include <compat/freebsd32/freebsd32_util.h> #endif @@ -78,6 +78,7 @@ __FBSDID("$FreeBSD$"); #include <security/mac/mac_framework.h> #include <netinet/sctp.h> +#include <netinet/sctp_os_bsd.h> #include <netinet/sctp_peeloff.h> static struct syscall_helper_data sctp_syscalls[] = { @@ -88,28 +89,54 @@ static struct syscall_helper_data sctp_syscalls[] = { SYSCALL_INIT_LAST }; -static void -sctp_syscalls_init(void *unused __unused) +#ifdef COMPAT_FREEBSD32 +static struct syscall_helper_data sctp32_syscalls[] = { + SYSCALL32_INIT_HELPER_COMPAT(sctp_peeloff), + SYSCALL32_INIT_HELPER_COMPAT(sctp_generic_sendmsg), + SYSCALL32_INIT_HELPER_COMPAT(sctp_generic_sendmsg_iov), + SYSCALL32_INIT_HELPER_COMPAT(sctp_generic_recvmsg), + SYSCALL_INIT_LAST +}; +#endif + +int +sctp_syscalls_init(void) { - int error __unused; + int error; - error = syscall_helper_register(sctp_syscalls, SY_THR_STATIC); - KASSERT((error == 0), - ("%s: syscall_helper_register failed for sctp syscalls", __func__)); + error = syscall_helper_register(sctp_syscalls, SY_THR_STATIC_KLD); + if (error != 0) + return (error); #ifdef COMPAT_FREEBSD32 - error = syscall32_helper_register(sctp_syscalls, SY_THR_STATIC); - KASSERT((error == 0), - ("%s: syscall32_helper_register failed for sctp syscalls", - __func__)); + error = syscall32_helper_register(sctp32_syscalls, SY_THR_STATIC_KLD); + if (error != 0) + return (error); #endif + return (0); } + +#ifdef SCTP SYSINIT(sctp_syscalls, SI_SUB_SYSCALLS, SI_ORDER_ANY, sctp_syscalls_init, NULL); +#endif +int +sctp_syscalls_uninit(void) +{ + int error; + +#ifdef COMPAT_FREEBSD32 + error = syscall32_helper_unregister(sctp32_syscalls); + if (error != 0) + return (error); +#endif + error = syscall_helper_unregister(sctp_syscalls); + if (error != 0) + return (error); + return (0); +} + /* * SCTP syscalls. - * Functionality only compiled in if SCTP is defined in the kernel Makefile, - * otherwise all return EOPNOTSUPP. - * XXX: We should make this loadable one day. */ int sys_sctp_peeloff(td, uap) @@ -119,7 +146,6 @@ sys_sctp_peeloff(td, uap) caddr_t name; } */ *uap; { -#if (defined(INET) || defined(INET6)) && defined(SCTP) struct file *headfp, *nfp = NULL; struct socket *head, *so; cap_rights_t rights; @@ -181,9 +207,6 @@ done: fdrop(headfp, td); done2: return (error); -#else /* SCTP */ - return (EOPNOTSUPP); -#endif /* SCTP */ } int @@ -199,7 +222,6 @@ sys_sctp_generic_sendmsg (td, uap) int flags } */ *uap; { -#if (defined(INET) || defined(INET6)) && defined(SCTP) struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; struct socket *so; struct file *fp = NULL; @@ -294,9 +316,6 @@ sctp_bad: sctp_bad2: free(to, M_SONAME); return (error); -#else /* SCTP */ - return (EOPNOTSUPP); -#endif /* SCTP */ } int @@ -312,7 +331,6 @@ sys_sctp_generic_sendmsg_iov(td, uap) int flags } */ *uap; { -#if (defined(INET) || defined(INET6)) && defined(SCTP) struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL; struct socket *so; struct file *fp = NULL; @@ -424,9 +442,6 @@ sctp_bad1: sctp_bad2: free(to, M_SONAME); return (error); -#else /* SCTP */ - return (EOPNOTSUPP); -#endif /* SCTP */ } int @@ -442,7 +457,6 @@ sys_sctp_generic_recvmsg(td, uap) int *msg_flags } */ *uap; { -#if (defined(INET) || defined(INET6)) && defined(SCTP) uint8_t sockbufstore[256]; struct uio auio; struct iovec *iov, *tiov; @@ -572,7 +586,4 @@ out1: fdrop(fp, td); return (error); -#else /* SCTP */ - return (EOPNOTSUPP); -#endif /* SCTP */ } Modified: stable/12/sys/netinet/sctp_usrreq.c ============================================================================== --- stable/12/sys/netinet/sctp_usrreq.c Mon Jul 27 14:28:55 2020 (r363608) +++ stable/12/sys/netinet/sctp_usrreq.c Mon Jul 27 14:41:23 2020 (r363609) @@ -98,6 +98,7 @@ sctp_init(void) static void sctp_finish(void *unused __unused) { + EVENTHANDLER_DEREGISTER(rt_addrmsg, SCTP_BASE_VAR(eh_tag)); sctp_pcb_finish(); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202007271441.06REfNKl087181>