Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F152451437
D21997.id63299.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
30 KB
Referenced Files
None
Subscribers
None
D21997.id63299.diff
View Options
Index: sys/amd64/conf/GENERIC
===================================================================
--- sys/amd64/conf/GENERIC
+++ sys/amd64/conf/GENERIC
@@ -35,7 +35,7 @@
options TCP_BLACKBOX # Enhanced TCP event logging
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_RFC7413 # TCP Fast Open
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/amd64/conf/MINIMAL
===================================================================
--- sys/amd64/conf/MINIMAL
+++ sys/amd64/conf/MINIMAL
@@ -44,7 +44,7 @@
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options TCP_OFFLOAD # TCP offload
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/arm/conf/std.armv6
===================================================================
--- sys/arm/conf/std.armv6
+++ sys/arm/conf/std.armv6
@@ -12,7 +12,7 @@
options TCP_HHOOK # hhook(9) framework for TCP
device crypto # core crypto support
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/arm/conf/std.armv7
===================================================================
--- sys/arm/conf/std.armv7
+++ sys/arm/conf/std.armv7
@@ -12,7 +12,7 @@
options TCP_HHOOK # hhook(9) framework for TCP
device crypto # core crypto support
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/arm64/conf/GENERIC
===================================================================
--- sys/arm64/conf/GENERIC
+++ sys/arm64/conf/GENERIC
@@ -33,7 +33,7 @@
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_OFFLOAD # TCP offload
options TCP_RFC7413 # TCP Fast Open
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/conf/NOTES
===================================================================
--- sys/conf/NOTES
+++ sys/conf/NOTES
@@ -685,7 +685,12 @@
# the V6 and V4.. since an association can span
# both a V6 and V4 address at the SAME time :-)
#
+# The SCTP_SUPPORT option does not enable SCTP, but provides the necessary
+# support for loading SCTP as a loadable kernel module.
+#
options SCTP
+options SCTP_SUPPORT
+
# There are bunches of options:
# this one turns on all sorts of
# nastily printing that you can
@@ -698,6 +703,7 @@
# bits and prints.. which makes the code run
# faster.. if you are not debugging don't use.
options SCTP_DEBUG
+
#
# All that options after that turn on specific types of
# logging. You can monitor CWND growth, flight size
@@ -721,7 +727,6 @@
options SCTP_LTRACE_CHUNKS
options SCTP_LTRACE_ERRORS
-
# altq(9). Enable the base part of the hooks with the ALTQ option.
# Individual disciplines must be built into the base system and can not be
# loaded as modules at this point. ALTQ requires a stable TSC so if yours is
Index: sys/conf/options
===================================================================
--- sys/conf/options
+++ sys/conf/options
@@ -467,6 +467,7 @@
# SCTP
#
SCTP opt_sctp.h
+SCTP_SUPPORT opt_sctp.h
SCTP_DEBUG opt_sctp.h # Enable debug printfs
SCTP_LOCK_LOGGING opt_sctp.h # Log to KTR lock activity
SCTP_MBUF_LOGGING opt_sctp.h # Log to KTR general mbuf aloc/free
Index: sys/i386/conf/GENERIC
===================================================================
--- sys/i386/conf/GENERIC
+++ sys/i386/conf/GENERIC
@@ -34,7 +34,7 @@
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_OFFLOAD # TCP offload
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/i386/conf/MINIMAL
===================================================================
--- sys/i386/conf/MINIMAL
+++ sys/i386/conf/MINIMAL
@@ -45,7 +45,7 @@
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options TCP_OFFLOAD # TCP offload
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/kern/uipc_socket.c
===================================================================
--- sys/kern/uipc_socket.c
+++ sys/kern/uipc_socket.c
@@ -692,7 +692,7 @@
return (so);
}
-#ifdef SCTP
+#ifdef SCTP_SUPPORT
/*
* Socket part of sctp_peeloff(). Detach a new socket from an
* association. The new socket is returned with a reference.
Index: sys/mips/conf/ERL
===================================================================
--- sys/mips/conf/ERL
+++ sys/mips/conf/ERL
@@ -55,7 +55,7 @@
options INET6 # IPv6 communications protocols
options IPSEC # IP (v4/v6) security
options TCP_HHOOK # hhook(9) framework for TCP
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/mips/conf/OCTEON1
===================================================================
--- sys/mips/conf/OCTEON1
+++ sys/mips/conf/OCTEON1
@@ -55,7 +55,7 @@
options INET # InterNETworking
options INET6 # IPv6 communications protocols
options TCP_HHOOK # hhook(9) framework for TCP
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/modules/sctp/Makefile
===================================================================
--- /dev/null
+++ sys/modules/sctp/Makefile
@@ -0,0 +1,29 @@
+# $FreeBSD$
+
+.PATH: ${SRCTOP}/sys/netinet
+.PATH: ${SRCTOP}/sys/netinet6
+
+KMOD= sctp
+SRCS= sctp_asconf.c \
+ sctp_auth.c \
+ sctp_bsd_addr.c \
+ sctp_cc_functions.c \
+ sctp_crc32.c \
+ sctp_indata.c \
+ sctp_input.c \
+ sctp_kdtrace.c \
+ sctp_output.c \
+ sctp_pcb.c \
+ sctp_peeloff.c \
+ sctp_ss_functions.c \
+ sctp_syscalls.c \
+ sctp_sysctl.c \
+ sctp_timer.c \
+ sctp_usrreq.c \
+ sctp6_usrreq.c \
+ sctputil.c
+
+SRCS+= device_if.h bus_if.h vnode_if.h
+SRCS+= opt_capsicum.h opt_ktrace.h opt_inet.h opt_inet6.h opt_sctp.h
+
+.include <bsd.kmod.mk>
Index: sys/netinet/in_proto.c
===================================================================
--- sys/netinet/in_proto.c
+++ sys/netinet/in_proto.c
@@ -34,11 +34,10 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include "opt_mrouting.h"
#include "opt_ipsec.h"
#include "opt_inet.h"
#include "opt_inet6.h"
-#include "opt_sctp.h"
+#include "opt_mrouting.h"
#include "opt_mpath.h"
#include <sys/param.h>
@@ -92,13 +91,6 @@
static struct pr_usrreqs nousrreqs;
-#ifdef SCTP
-#include <netinet/in_pcb.h>
-#include <netinet/sctp_pcb.h>
-#include <netinet/sctp.h>
-#include <netinet/sctp_var.h>
-#endif /* SCTP */
-
FEATURE(inet, "Internet Protocol version 4");
extern struct domain inetdomain;
@@ -145,31 +137,6 @@
.pr_drain = tcp_drain,
.pr_usrreqs = &tcp_usrreqs
},
-#ifdef SCTP
-{
- .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_init = sctp_init,
- .pr_drain = sctp_drain,
- .pr_usrreqs = &sctp_usrreqs
-},
-{
- .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
-},
-#endif /* SCTP */
{
.pr_type = SOCK_DGRAM,
.pr_domain = &inetdomain,
@@ -327,9 +294,6 @@
SYSCTL_NODE(_net_inet, IPPROTO_ICMP, icmp, CTLFLAG_RW, 0, "ICMP");
SYSCTL_NODE(_net_inet, IPPROTO_UDP, udp, CTLFLAG_RW, 0, "UDP");
SYSCTL_NODE(_net_inet, IPPROTO_TCP, tcp, CTLFLAG_RW, 0, "TCP");
-#ifdef SCTP
-SYSCTL_NODE(_net_inet, IPPROTO_SCTP, sctp, CTLFLAG_RW, 0, "SCTP");
-#endif
SYSCTL_NODE(_net_inet, IPPROTO_IGMP, igmp, CTLFLAG_RW, 0, "IGMP");
#if defined(IPSEC) || defined(IPSEC_SUPPORT)
/* XXX no protocol # to use, pick something "reserved" */
Index: sys/netinet/ip_divert.c
===================================================================
--- sys/netinet/ip_divert.c
+++ sys/netinet/ip_divert.c
@@ -69,7 +69,7 @@
#include <netinet/ip6.h>
#include <netinet6/ip6_var.h>
#endif
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp_crc32.h>
#endif
@@ -210,7 +210,7 @@
in_delayed_cksum(m);
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP) {
sctp_delayed_cksum(m, (uint32_t)(ip->ip_hl << 2));
m->m_pkthdr.csum_flags &= ~CSUM_SCTP;
Index: sys/netinet/ip_output.c
===================================================================
--- sys/netinet/ip_output.c
+++ sys/netinet/ip_output.c
@@ -87,7 +87,7 @@
#include <netinet/udp.h>
#include <netinet/udp_var.h>
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp.h>
#include <netinet/sctp_crc32.h>
#endif
@@ -155,7 +155,7 @@
}
m->m_pkthdr.csum_flags |=
CSUM_IP_CHECKED | CSUM_IP_VALID;
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP)
m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
#endif
@@ -186,7 +186,7 @@
CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
m->m_pkthdr.csum_data = 0xffff;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP)
m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
#endif
@@ -741,7 +741,7 @@
goto bad;
}
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP & ~ifp->if_hwassist) {
m = mb_unmapped_to_ext(m);
if (m == NULL) {
@@ -894,7 +894,7 @@
in_delayed_cksum(m0);
m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m0->m_pkthdr.csum_flags & CSUM_SCTP) {
m0 = mb_unmapped_to_ext(m0);
if (m0 == NULL) {
Index: sys/netinet/sctp_crc32.h
===================================================================
--- sys/netinet/sctp_crc32.h
+++ sys/netinet/sctp_crc32.h
@@ -40,7 +40,7 @@
#if defined(_KERNEL)
uint32_t sctp_calculate_cksum(struct mbuf *, uint32_t);
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
void sctp_delayed_cksum(struct mbuf *, uint32_t offset);
#endif
#endif /* _KERNEL */
Index: sys/netinet/sctp_crc32.c
===================================================================
--- sys/netinet/sctp_crc32.c
+++ sys/netinet/sctp_crc32.c
@@ -38,7 +38,7 @@
#include "opt_sctp.h"
#include <sys/gsb_crc32.h>
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp_os.h>
#include <netinet/sctp.h>
#include <netinet/sctp_crc32.h>
@@ -117,7 +117,7 @@
return (base);
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
/*
* Compute and insert the SCTP checksum in network byte order for a given
* mbuf chain m which contains an SCTP packet starting at offset.
@@ -128,8 +128,8 @@
uint32_t checksum;
checksum = sctp_calculate_cksum(m, offset);
- SCTP_STAT_DECR(sctps_sendhwcrc);
- SCTP_STAT_INCR(sctps_sendswcrc);
+ //SCTP_STAT_DECR(sctps_sendhwcrc);
+ //SCTP_STAT_INCR(sctps_sendswcrc);
offset += offsetof(struct sctphdr, checksum);
if (offset + sizeof(uint32_t) > (uint32_t)(m->m_pkthdr.len)) {
Index: sys/netinet/sctp_os_bsd.h
===================================================================
--- sys/netinet/sctp_os_bsd.h
+++ sys/netinet/sctp_os_bsd.h
@@ -45,9 +45,12 @@
#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 @@
#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>
@@ -478,4 +480,7 @@
#define SCTP_IS_LISTENING(inp) ((inp->sctp_flags & SCTP_PCB_FLAGS_ACCEPTING) != 0)
+int sctp_syscalls_init(void);
+int sctp_syscalls_uninit(void);
+
#endif
Index: sys/netinet/sctp_syscalls.c
===================================================================
--- sys/netinet/sctp_syscalls.c
+++ sys/netinet/sctp_syscalls.c
@@ -69,6 +69,8 @@
#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 +80,7 @@
#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 +91,52 @@
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);
+}
+
+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);
}
-SYSINIT(sctp_syscalls, SI_SUB_SYSCALLS, SI_ORDER_ANY, sctp_syscalls_init, NULL);
/*
* 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,7 @@
caddr_t name;
} */ *uap;
{
-#if (defined(INET) || defined(INET6)) && defined(SCTP)
+#if defined(INET) || defined(INET6)
struct file *headfp, *nfp = NULL;
struct socket *head, *so;
cap_rights_t rights;
@@ -181,9 +208,7 @@
fdrop(headfp, td);
done2:
return (error);
-#else /* SCTP */
- return (EOPNOTSUPP);
-#endif /* SCTP */
+#endif
}
int
@@ -199,7 +224,7 @@
int flags
} */ *uap;
{
-#if (defined(INET) || defined(INET6)) && defined(SCTP)
+#if defined(INET) || defined(INET6)
struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
struct socket *so;
struct file *fp = NULL;
@@ -294,9 +319,7 @@
sctp_bad2:
free(to, M_SONAME);
return (error);
-#else /* SCTP */
- return (EOPNOTSUPP);
-#endif /* SCTP */
+#endif
}
int
@@ -312,7 +335,7 @@
int flags
} */ *uap;
{
-#if (defined(INET) || defined(INET6)) && defined(SCTP)
+#if defined(INET) || defined(INET6)
struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
struct socket *so;
struct file *fp = NULL;
@@ -424,9 +447,7 @@
sctp_bad2:
free(to, M_SONAME);
return (error);
-#else /* SCTP */
- return (EOPNOTSUPP);
-#endif /* SCTP */
+#endif
}
int
@@ -442,7 +463,7 @@
int *msg_flags
} */ *uap;
{
-#if (defined(INET) || defined(INET6)) && defined(SCTP)
+#if defined(INET) || defined(INET6)
uint8_t sockbufstore[256];
struct uio auio;
struct iovec *iov, *tiov;
@@ -572,7 +593,5 @@
fdrop(fp, td);
return (error);
-#else /* SCTP */
- return (EOPNOTSUPP);
-#endif /* SCTP */
+#endif
}
Index: sys/netinet/sctp_sysctl.c
===================================================================
--- sys/netinet/sctp_sysctl.c
+++ sys/netinet/sctp_sysctl.c
@@ -51,6 +51,9 @@
* sysctl tunable variables
*/
+/* XXX ifdef inet/inet6? */
+SYSCTL_NODE(_net_inet, IPPROTO_SCTP, sctp, CTLFLAG_RW, 0, "SCTP");
+
void
sctp_init_sysctls()
{
Index: sys/netinet/sctp_usrreq.c
===================================================================
--- sys/netinet/sctp_usrreq.c
+++ sys/netinet/sctp_usrreq.c
@@ -55,15 +55,65 @@
#include <netinet/udp.h>
#include <sys/eventhandler.h>
-
-
extern const struct sctp_cc_functions sctp_cc_functions[];
extern const struct sctp_ss_functions sctp_ss_functions[];
-void
+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,
+};
+
+static eventhandler_tag eh_tag;
+
+static int
sctp_init(void)
{
u_long sb_max_adj;
+ int error;
+
+ 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)
+ /* XXX do we need to unwind? */
+ return (error);
+#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)
+ /* XXX do we need to unwind? */
+ return (error);
+#endif
/* Initialize and modify the sysctled variables */
sctp_init_sysctls();
@@ -90,10 +140,72 @@
SCTP_BASE_VAR(packet_log_end) = 0;
memset(&SCTP_BASE_VAR(packet_log_buffer), 0, SCTP_PACKET_LOG_SIZE);
#endif
- EVENTHANDLER_REGISTER(rt_addrmsg, sctp_addr_change_event_handler,
- NULL, EVENTHANDLER_PRI_FIRST);
+
+ eh_tag = EVENTHANDLER_REGISTER(rt_addrmsg,
+ sctp_addr_change_event_handler, NULL, EVENTHANDLER_PRI_FIRST);
+
+ return (sctp_syscalls_init());
+}
+
+static int
+sctp_uninit(void)
+{
+ int error;
+
+ error = ipproto_unregister(IPPROTO_SCTP);
+ if (error != 0)
+ return (error);
+ error = pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_STREAM);
+ if (error != 0)
+ return (error);
+ error = pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_SEQPACKET);
+ if (error != 0)
+ return (error);
+#ifdef INET6
+ error = ip6proto_unregister(IPPROTO_SCTP);
+ if (error != 0)
+ return (error);
+ error = pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_STREAM);
+ if (error != 0)
+ return (error);
+ error = pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_SEQPACKET);
+ if (error != 0)
+ return (error);
+#endif
+
+ EVENTHANDLER_DEREGISTER(rt_addrmsg, eh_tag);
+
+ return (sctp_syscalls_uninit());
+}
+
+static int
+sctp_modload(struct module *module, int cmd, void *arg)
+{
+ int error;
+
+ switch (cmd) {
+ case MOD_LOAD:
+ error = sctp_init();
+ break;
+ case MOD_UNLOAD:
+ error = sctp_uninit();
+ 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);
+
#ifdef VIMAGE
static void
sctp_finish(void *unused __unused)
Index: sys/netinet/sctp_var.h
===================================================================
--- sys/netinet/sctp_var.h
+++ sys/netinet/sctp_var.h
@@ -340,7 +340,6 @@
#endif
void sctp_pathmtu_adjustment(struct sctp_tcb *, uint16_t);
void sctp_drain(void);
-void sctp_init(void);
void
sctp_notify(struct sctp_inpcb *, struct sctp_tcb *, struct sctp_nets *,
uint8_t, uint8_t, uint16_t, uint32_t);
Index: sys/netinet6/in6_proto.c
===================================================================
--- sys/netinet6/in6_proto.c
+++ sys/netinet6/in6_proto.c
@@ -69,7 +69,6 @@
#include "opt_inet6.h"
#include "opt_ipsec.h"
#include "opt_ipstealth.h"
-#include "opt_sctp.h"
#include "opt_mpath.h"
#include "opt_route.h"
@@ -115,14 +114,6 @@
#include <netinet6/pim6_var.h>
#include <netinet6/nd6.h>
-#ifdef SCTP
-#include <netinet/in_pcb.h>
-#include <netinet/sctp_pcb.h>
-#include <netinet/sctp.h>
-#include <netinet/sctp_var.h>
-#include <netinet6/sctp6_var.h>
-#endif /* SCTP */
-
#include <netinet6/ip6protosw.h>
/*
@@ -182,33 +173,6 @@
.pr_drain = tcp_drain,
.pr_usrreqs = &tcp6_usrreqs,
},
-#ifdef SCTP
-{
- .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,
- .pr_drain = sctp_drain,
-#ifndef INET /* Do not call initialization twice. */
- .pr_init = sctp_init,
-#endif
- .pr_usrreqs = &sctp6_usrreqs
-},
-{
- .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_drain = sctp_drain,
- .pr_usrreqs = &sctp6_usrreqs
-},
-#endif /* SCTP */
{
.pr_type = SOCK_DGRAM,
.pr_domain = &inet6domain,
@@ -432,9 +396,6 @@
SYSCTL_NODE(_net_inet6, IPPROTO_ICMPV6, icmp6, CTLFLAG_RW, 0, "ICMP6");
SYSCTL_NODE(_net_inet6, IPPROTO_UDP, udp6, CTLFLAG_RW, 0, "UDP6");
SYSCTL_NODE(_net_inet6, IPPROTO_TCP, tcp6, CTLFLAG_RW, 0, "TCP6");
-#ifdef SCTP
-SYSCTL_NODE(_net_inet6, IPPROTO_SCTP, sctp6, CTLFLAG_RW, 0, "SCTP6");
-#endif
#if defined(IPSEC) || defined(IPSEC_SUPPORT)
SYSCTL_NODE(_net_inet6, IPPROTO_ESP, ipsec6, CTLFLAG_RW, 0, "IPSEC6");
#endif /* IPSEC */
Index: sys/netinet6/ip6_forward.c
===================================================================
--- sys/netinet6/ip6_forward.c
+++ sys/netinet6/ip6_forward.c
@@ -352,7 +352,7 @@
CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR;
m->m_pkthdr.csum_data = 0xffff;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6)
m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
#endif
Index: sys/netinet6/ip6_output.c
===================================================================
--- sys/netinet6/ip6_output.c
+++ sys/netinet6/ip6_output.c
@@ -113,7 +113,7 @@
#include <netinet6/in6_rss.h>
#include <netipsec/ipsec_support.h>
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp.h>
#include <netinet/sctp_crc32.h>
#endif
@@ -918,7 +918,7 @@
CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR;
m->m_pkthdr.csum_data = 0xffff;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6)
m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
#endif
@@ -948,7 +948,7 @@
CSUM_DATA_VALID_IPV6 | CSUM_PSEUDO_HDR;
m->m_pkthdr.csum_data = 0xffff;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6)
m->m_pkthdr.csum_flags |= CSUM_SCTP_VALID;
#endif
@@ -1015,7 +1015,7 @@
goto bad;
}
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (sw_csum & CSUM_SCTP_IPV6) {
sw_csum &= ~CSUM_SCTP_IPV6;
m = mb_unmapped_to_ext(m);
@@ -1120,7 +1120,7 @@
in6_delayed_cksum(m, plen, hlen);
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) {
m = mb_unmapped_to_ext(m);
if (m == NULL) {
Index: sys/netinet6/sctp6_usrreq.c
===================================================================
--- sys/netinet6/sctp6_usrreq.c
+++ sys/netinet6/sctp6_usrreq.c
@@ -57,6 +57,10 @@
#include <netinet/icmp6.h>
#include <netinet/udp.h>
+SYSCTL_DECL(_net_inet6); /* XXX should be in a header */
+
+SYSCTL_NODE(_net_inet6, IPPROTO_SCTP, sctp6, CTLFLAG_RW, 0, "SCTP6");
+
int
sctp6_input_with_port(struct mbuf **i_pak, int *offp, uint16_t port)
{
@@ -1152,7 +1156,7 @@
return (error);
}
-struct pr_usrreqs sctp6_usrreqs = {
+static struct pr_usrreqs sctp6_usrreqs = {
.pru_abort = sctp6_abort,
.pru_accept = sctp_accept,
.pru_attach = sctp6_attach,
@@ -1173,4 +1177,30 @@
.pru_soreceive = sctp_soreceive
};
+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_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,
+ .pr_drain = sctp_drain,
+ .pr_usrreqs = &sctp6_usrreqs,
+};
+
#endif
Index: sys/netinet6/sctp6_var.h
===================================================================
--- sys/netinet6/sctp6_var.h
+++ sys/netinet6/sctp6_var.h
@@ -40,8 +40,7 @@
#if defined(_KERNEL)
-SYSCTL_DECL(_net_inet6_sctp6);
-extern struct pr_usrreqs sctp6_usrreqs;
+extern struct protosw sctp6_stream_protosw, sctp6_seqpacket_protosw;
int sctp6_input(struct mbuf **, int *, int);
int sctp6_input_with_port(struct mbuf **, int *, uint16_t);
Index: sys/netipsec/ipsec_output.c
===================================================================
--- sys/netipsec/ipsec_output.c
+++ sys/netipsec/ipsec_output.c
@@ -71,7 +71,7 @@
#ifdef INET6
#include <netinet/icmp6.h>
#endif
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp_crc32.h>
#endif
@@ -326,7 +326,7 @@
in_delayed_cksum(m);
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP) {
struct ip *ip = mtod(m, struct ip *);
@@ -621,7 +621,7 @@
sizeof(struct ip6_hdr), sizeof(struct ip6_hdr));
m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA_IPV6;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m->m_pkthdr.csum_flags & CSUM_SCTP_IPV6) {
sctp_delayed_cksum(m, sizeof(struct ip6_hdr));
m->m_pkthdr.csum_flags &= ~CSUM_SCTP_IPV6;
Index: sys/netpfil/pf/pf.c
===================================================================
--- sys/netpfil/pf/pf.c
+++ sys/netpfil/pf/pf.c
@@ -40,9 +40,9 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include "opt_bpf.h"
#include "opt_inet.h"
#include "opt_inet6.h"
-#include "opt_bpf.h"
#include "opt_pf.h"
#include "opt_sctp.h"
@@ -103,7 +103,7 @@
#include <netinet6/scope6_var.h>
#endif /* INET6 */
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
#include <netinet/sctp_crc32.h>
#endif
@@ -5591,7 +5591,7 @@
in_delayed_cksum(m0);
m0->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
}
-#ifdef SCTP
+#if defined(SCTP) || defined(SCTP_SUPPORT)
if (m0->m_pkthdr.csum_flags & CSUM_SCTP & ~ifp->if_hwassist) {
sctp_delayed_cksum(m0, (uint32_t)(ip->ip_hl << 2));
m0->m_pkthdr.csum_flags &= ~CSUM_SCTP;
Index: sys/powerpc/conf/GENERIC
===================================================================
--- sys/powerpc/conf/GENERIC
+++ sys/powerpc/conf/GENERIC
@@ -41,7 +41,7 @@
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_RFC7413 # TCP Fast Open
-options SCTP #Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS #Berkeley Fast Filesystem
options SOFTUPDATES #Enable FFS soft updates support
options UFS_ACL #Support for access control lists
Index: sys/powerpc/conf/GENERIC64
===================================================================
--- sys/powerpc/conf/GENERIC64
+++ sys/powerpc/conf/GENERIC64
@@ -45,7 +45,7 @@
options TCP_BLACKBOX # Enhanced TCP event logging
options TCP_HHOOK # hhook(9) framework for TCP
options TCP_RFC7413 # TCP Fast Open
-options SCTP #Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS #Berkeley Fast Filesystem
options SOFTUPDATES #Enable FFS soft updates support
options UFS_ACL #Support for access control lists
Index: sys/riscv/conf/GENERIC
===================================================================
--- sys/riscv/conf/GENERIC
+++ sys/riscv/conf/GENERIC
@@ -32,7 +32,7 @@
options TCP_HHOOK # hhook(9) framework for TCP
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
options TCP_OFFLOAD # TCP offload
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
Index: sys/sparc64/conf/GENERIC
===================================================================
--- sys/sparc64/conf/GENERIC
+++ sys/sparc64/conf/GENERIC
@@ -33,7 +33,7 @@
options INET6 # IPv6 communications protocols
options IPSEC_SUPPORT # Allow kldload of ipsec and tcpmd5
options TCP_HHOOK # hhook(9) framework for TCP
-options SCTP # Stream Control Transmission Protocol
+options SCTP_SUPPORT # Allow kldload of SCTP
options FFS # Berkeley Fast Filesystem
options SOFTUPDATES # Enable FFS soft updates support
options UFS_ACL # Support for access control lists
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Apr 16, 1:29 AM (38 m, 51 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31568180
Default Alt Text
D21997.id63299.diff (30 KB)
Attached To
Mode
D21997: Allow SCTP to be build as a module
Attached
Detach File
Event Timeline
Log In to Comment