FreeBSD kernel IPv4 code
sctp_module.c
Go to the documentation of this file.
1/*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2019-2020 The FreeBSD Foundation
5 *
6 * This software was developed by Mark Johnston under sponsorship from
7 * the FreeBSD Foundation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are
11 * met:
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the distribution.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 * SUCH DAMAGE.
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD$");
33
34#include "opt_inet.h"
35#include "opt_inet6.h"
36
37#include <sys/param.h>
38#include <sys/systm.h>
39#include <sys/kernel.h>
40#include <sys/module.h>
41#include <sys/protosw.h>
42#include <sys/socket.h>
43
44#include <netinet/in.h>
45#include <netinet/ip.h>
46#include <netinet/ip_var.h>
47#include <netinet/sctp.h>
48#include <netinet/sctp_pcb.h>
49#include <netinet/sctp_var.h>
50#include <netinet/sctp_os_bsd.h>
51
52#include <netinet6/ip6_var.h>
53#include <netinet6/sctp6_var.h>
54
55#ifdef INET
56extern struct domain inetdomain;
57
58struct protosw sctp_stream_protosw = {
59 .pr_type = SOCK_STREAM,
60 .pr_domain = &inetdomain,
61 .pr_protocol = IPPROTO_SCTP,
62 .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LASTHDR,
63 .pr_input = sctp_input,
64 .pr_ctlinput = sctp_ctlinput,
65 .pr_ctloutput = sctp_ctloutput,
66 .pr_drain = sctp_drain,
67 .pr_usrreqs = &sctp_usrreqs,
68};
69
70struct protosw sctp_seqpacket_protosw = {
71 .pr_type = SOCK_SEQPACKET,
72 .pr_domain = &inetdomain,
73 .pr_protocol = IPPROTO_SCTP,
74 .pr_flags = PR_WANTRCVD|PR_LASTHDR,
75 .pr_input = sctp_input,
76 .pr_ctlinput = sctp_ctlinput,
77 .pr_ctloutput = sctp_ctloutput,
78 .pr_drain = sctp_drain,
79 .pr_usrreqs = &sctp_usrreqs,
80};
81#endif
82
83#ifdef INET6
84extern struct domain inet6domain;
85
86struct protosw sctp6_stream_protosw = {
87 .pr_type = SOCK_STREAM,
88 .pr_domain = &inet6domain,
89 .pr_protocol = IPPROTO_SCTP,
90 .pr_flags = PR_CONNREQUIRED|PR_WANTRCVD|PR_LASTHDR,
91 .pr_input = sctp6_input,
92 .pr_ctlinput = sctp6_ctlinput,
93 .pr_ctloutput = sctp_ctloutput,
94 .pr_drain = sctp_drain,
95 .pr_usrreqs = &sctp6_usrreqs,
96};
97
98struct protosw sctp6_seqpacket_protosw = {
99 .pr_type = SOCK_SEQPACKET,
100 .pr_domain = &inet6domain,
101 .pr_protocol = IPPROTO_SCTP,
102 .pr_flags = PR_WANTRCVD|PR_LASTHDR,
103 .pr_input = sctp6_input,
104 .pr_ctlinput = sctp6_ctlinput,
105 .pr_ctloutput = sctp_ctloutput,
106#ifndef INET /* Do not call initialization and drain routines twice. */
107 .pr_drain = sctp_drain,
108#endif
109 .pr_usrreqs = &sctp6_usrreqs,
110};
111#endif
112
113static int
115{
116 int error;
117
118#ifdef INET
119 error = pf_proto_register(PF_INET, &sctp_stream_protosw);
120 if (error != 0)
121 return (error);
122 error = pf_proto_register(PF_INET, &sctp_seqpacket_protosw);
123 if (error != 0)
124 return (error);
126 if (error != 0)
127 return (error);
128#endif
129#ifdef INET6
130 error = pf_proto_register(PF_INET6, &sctp6_stream_protosw);
131 if (error != 0)
132 return (error);
133 error = pf_proto_register(PF_INET6, &sctp6_seqpacket_protosw);
134 if (error != 0)
135 return (error);
136 error = ip6proto_register(IPPROTO_SCTP);
137 if (error != 0)
138 return (error);
139#endif
140 error = sctp_syscalls_init();
141 if (error != 0)
142 return (error);
143 return (0);
144}
145
146static int __unused
148{
149
150 (void)sctp_syscalls_uninit();
151
152#ifdef INET
154 (void)pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_STREAM);
155 (void)pf_proto_unregister(PF_INET, IPPROTO_SCTP, SOCK_SEQPACKET);
156#endif
157#ifdef INET6
158 (void)ip6proto_unregister(IPPROTO_SCTP);
159 (void)pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_STREAM);
160 (void)pf_proto_unregister(PF_INET6, IPPROTO_SCTP, SOCK_SEQPACKET);
161#endif
162 return (0);
163}
164
165static int
166sctp_modload(struct module *module, int cmd, void *arg)
167{
168 int error;
169
170 switch (cmd) {
171 case MOD_LOAD:
172 error = sctp_module_load();
173 break;
174 case MOD_UNLOAD:
175 /*
176 * Unloading SCTP is currently unsupported. Currently, SCTP
177 * iterator threads are not stopped during unload.
178 */
179 error = EOPNOTSUPP;
180 break;
181 default:
182 error = 0;
183 break;
184 }
185 return (error);
186}
187
188static moduledata_t sctp_mod = {
189 "sctp",
191 NULL,
192};
193
194DECLARE_MODULE(sctp, sctp_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
int ipproto_register(short ipproto)
Definition: ip_input.c:884
struct domain inetdomain
int ipproto_unregister(short ipproto)
Definition: ip_input.c:915
#define IPPROTO_SCTP
static moduledata_t sctp_mod
Definition: sctp_module.c:188
static int __unused sctp_module_unload(void)
Definition: sctp_module.c:147
static int sctp_modload(struct module *module, int cmd, void *arg)
Definition: sctp_module.c:166
MODULE_VERSION(sctp, 1)
__FBSDID("$FreeBSD$")
static int sctp_module_load(void)
Definition: sctp_module.c:114
DECLARE_MODULE(sctp, sctp_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY)
int sctp_syscalls_init(void)
int sctp_syscalls_uninit(void)
void sctp_drain()
Definition: sctp_pcb.c:6957
int sctp_ctloutput(struct socket *so, struct sockopt *sopt)
Definition: sctp_usrreq.c:6870
void sctp_ctlinput(int, struct sockaddr *, void *)
struct pr_usrreqs sctp_usrreqs