4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
23 * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 #include <sys/sysmacros.h>
28 #include <sys/strsubr.h>
29 #include <sys/socket.h>
30 #include <sys/socketvar.h>
31 #include <sys/modctl.h>
32 #include <sys/cmn_err.h>
33 #include <netinet/sctp.h>
34 #include <../../../../kernel/fs/sockfs/sockcommon.h>
37 struct sonode
*socksctp_create(struct sockparams
*, int, int, int, int,
39 void socksctp_destroy(struct sonode
*);
41 static int socksctp_constructor(void *, void *, int);
42 static void socksctp_destructor(void *, void *);
44 static __smod_priv_t sosctp_priv
= {
50 static smod_reg_t sinfo
= {
59 kmem_cache_t
*sosctp_assoccache
;
60 static kmem_cache_t
*sosctp_sockcache
;
63 * Module linkage information for the kernel.
65 static struct modlsockmod modlsockmod
= {
66 &mod_sockmodops
, "SCTP socket module", &sinfo
69 static struct modlinkage modlinkage
= {
78 sosctp_sockcache
= kmem_cache_create("sctpsock",
79 sizeof (struct sctp_sonode
), 0, socksctp_constructor
,
80 socksctp_destructor
, NULL
, NULL
, NULL
, 0);
81 sosctp_assoccache
= kmem_cache_create("sctp_assoc",
82 sizeof (struct sctp_soassoc
), 0, NULL
, NULL
, NULL
, NULL
, NULL
, 0);
89 kmem_cache_destroy(sosctp_sockcache
);
90 kmem_cache_destroy(sosctp_assoccache
);
95 socksctp_constructor(void *buf
, void *cdrarg
, int kmflags
)
97 struct sctp_sonode
*ss
= buf
;
98 struct sonode
*so
= &ss
->ss_so
;
100 ss
->ss_type
= SOSCTP_SOCKET
;
101 return (sonode_constructor((void *)so
, cdrarg
, kmflags
));
106 socksctp_destructor(void *buf
, void *cdrarg
)
108 struct sctp_sonode
*ss
= buf
;
109 struct sonode
*so
= &ss
->ss_so
;
111 sonode_destructor((void *)so
, cdrarg
);
115 * Creates a sctp socket data structure.
119 socksctp_create(struct sockparams
*sp
, int family
, int type
, int protocol
,
120 int sflags
, int *errorp
, cred_t
*cr
)
122 struct sctp_sonode
*ss
;
124 int kmflags
= (sflags
& SOCKET_NOSLEEP
) ? KM_NOSLEEP
: KM_SLEEP
;
127 * We only support two types of SCTP socket. Let sotpi_create()
128 * handle all other cases, such as raw socket.
130 if (!(family
== AF_INET
|| family
== AF_INET6
) ||
131 !(type
== SOCK_STREAM
|| type
== SOCK_SEQPACKET
)) {
136 ss
= kmem_cache_alloc(sosctp_sockcache
, kmflags
);
146 ss
->ss_assocs
= NULL
;
148 if (type
== SOCK_STREAM
) {
149 sonode_init(so
, sp
, family
, type
, protocol
,
152 sonode_init(so
, sp
, family
, type
, protocol
,
153 &sosctp_seq_sonodeops
);
154 ASSERT(type
== SOCK_SEQPACKET
);
155 mutex_enter(&so
->so_lock
);
156 (void) sosctp_aid_grow(ss
, 1, kmflags
);
157 mutex_exit(&so
->so_lock
);
160 so
->so_is_stream
= false;
162 dprint(2, ("sosctp_create: %p domain %d type %d\n", (void *)so
, family
,
166 * set the default values to be INFPSZ
167 * if a protocol desires it can change the value later
169 so
->so_proto_props
.sopp_rxhiwat
= SOCKET_RECVHIWATER
;
170 so
->so_proto_props
.sopp_rxlowat
= SOCKET_RECVLOWATER
;
171 so
->so_proto_props
.sopp_maxpsz
= INFPSZ
;
172 so
->so_proto_props
.sopp_maxblk
= INFPSZ
;
178 * Free SCTP socket data structure.
181 socksctp_destroy(struct sonode
*so
)
183 struct sctp_sonode
*ss
;
185 ASSERT((so
->so_type
== SOCK_STREAM
|| so
->so_type
== SOCK_SEQPACKET
) &&
186 so
->so_protocol
== IPPROTO_SCTP
);
188 sosctp_fini(so
, CRED());
191 kmem_cache_free(sosctp_sockcache
, ss
);
199 (void) socksctp_init();
201 if ((error
= mod_install(&modlinkage
)) != 0)
212 if ((error
= mod_remove(&modlinkage
)) == 0)
219 _info(struct modinfo
*modinfop
)
221 return (mod_info(&modlinkage
, modinfop
));