socksctp.c revision 0f1702c5201310f0529cd5abb77652e5e9b241b6
d0538f66491267879b7418b21ad78e3dcc2dcc83cg * CDDL HEADER START
60405de4d8688d96dd05157c28db3ade5c9bc234kz * The contents of this file are subject to the terms of the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Common Development and Distribution License (the "License").
60405de4d8688d96dd05157c28db3ade5c9bc234kz * You may not use this file except in compliance with the License.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
60405de4d8688d96dd05157c28db3ade5c9bc234kz * See the License for the specific language governing permissions
60405de4d8688d96dd05157c28db3ade5c9bc234kz * and limitations under the License.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * When distributing Covered Code, include this CDDL HEADER in each
60405de4d8688d96dd05157c28db3ade5c9bc234kz * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * If applicable, add the following below this CDDL HEADER, with the
60405de4d8688d96dd05157c28db3ade5c9bc234kz * fields enclosed by brackets "[]" replaced with your own identifying
60405de4d8688d96dd05157c28db3ade5c9bc234kz * information: Portions Copyright [yyyy] [name of copyright owner]
60405de4d8688d96dd05157c28db3ade5c9bc234kz * CDDL HEADER END
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Use is subject to license terms.
60405de4d8688d96dd05157c28db3ade5c9bc234kz * SCTP sockfs sonode operations, 1-1 socket
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_init(struct sonode *, struct sonode *, struct cred *, int);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_accept(struct sonode *, int, struct cred *, struct sonode **);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_bind(struct sonode *, struct sockaddr *, socklen_t, int,
60405de4d8688d96dd05157c28db3ade5c9bc234kz struct cred *);
d0538f66491267879b7418b21ad78e3dcc2dcc83cgstatic int sosctp_listen(struct sonode *, int, struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_connect(struct sonode *, const struct sockaddr *, socklen_t,
60405de4d8688d96dd05157c28db3ade5c9bc234kz int, int, struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_recvmsg(struct sonode *, struct nmsghdr *, struct uio *,
60405de4d8688d96dd05157c28db3ade5c9bc234kz struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_sendmsg(struct sonode *, struct nmsghdr *, struct uio *,
60405de4d8688d96dd05157c28db3ade5c9bc234kz struct cred *);
d0538f66491267879b7418b21ad78e3dcc2dcc83cgstatic int sosctp_getpeername(struct sonode *, struct sockaddr *, socklen_t *,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_getsockname(struct sonode *, struct sockaddr *, socklen_t *,
60405de4d8688d96dd05157c28db3ade5c9bc234kz struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_shutdown(struct sonode *, int, struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_getsockopt(struct sonode *, int, int, void *, socklen_t *,
60405de4d8688d96dd05157c28db3ade5c9bc234kz int, struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_setsockopt(struct sonode *, int, int, const void *,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_ioctl(struct sonode *, int, intptr_t, int, struct cred *,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_close(struct sonode *, int, struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kz * SCTP sockfs sonode operations, 1-N socket
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_seq_connect(struct sonode *, const struct sockaddr *,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sosctp_seq_sendmsg(struct sonode *, struct nmsghdr *, struct uio *,
60405de4d8688d96dd05157c28db3ade5c9bc234kz struct cred *);
60405de4d8688d96dd05157c28db3ade5c9bc234kz * Socket association upcalls, 1-N socket connection
60405de4d8688d96dd05157c28db3ade5c9bc234kzsock_upper_handle_t sctp_assoc_newconn(sock_upper_handle_t,
60405de4d8688d96dd05157c28db3ade5c9bc234kz sock_lower_handle_t, sock_downcalls_t *, struct cred *, pid_t,
d0538f66491267879b7418b21ad78e3dcc2dcc83cgstatic void sctp_assoc_connected(sock_upper_handle_t, sock_connid_t,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic int sctp_assoc_disconnected(sock_upper_handle_t, sock_connid_t, int);
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic void sctp_assoc_disconnecting(sock_upper_handle_t, sock_opctl_action_t,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic ssize_t sctp_assoc_recv(sock_upper_handle_t, mblk_t *, size_t, int,
60405de4d8688d96dd05157c28db3ade5c9bc234kzstatic void sctp_assoc_xmitted(sock_upper_handle_t, boolean_t);
return (ENOMEM);
int error = 0;
return (EINVAL);
return (error);
int error;
goto done;
if (error == 0) {
done:
return (error);
int error = 0;
goto done;
if (backlog < 0) {
backlog = 0;
goto done;
if (error == 0) {
done:
return (error);
int error = 0;
goto done;
goto done;
SS_CANTSENDMORE)) {
goto done;
goto done;
if (error == 0) {
done:
return (error);
int error;
goto done;
if (error != 0) {
done:
return (error);
void *opt;
SS_CANTRCVMORE))) {
return (ENOTCONN);
if (namelen == 0)
return (EOPNOTSUPP);
return (ENOTCONN);
return (EOPNOTSUPP);
if (error) {
return (error);
if (controllen == 0) {
if (len > 0) {
} else if (len > 0) {
done:
if (readcnt > 0 &&
return (error);
int error;
while (count > 0) {
return (EAGAIN);
return (error);
if (error != 0) {
return (error);
int error;
return (EOPNOTSUPP);
return (EINVAL);
return (EINVAL);
return (EINVAL);
return (error);
optlen = 0;
return (EPIPE);
return (error);
return (EINTR);
return (EAGAIN);
return (EINTR);
return (EMSGSIZE);
goto error_nofree;
cr);
if (error) {
goto error_nofree;
error = 0;
goto error_nofree;
goto error_ret;
if (error == 0)
return (EPIPE);
return (error);
int aid = 0;
int error;
return (EINVAL);
optlen = 0;
if (aid == 0) {
goto done;
if (error) {
goto done;
error = 0;
goto done;
goto refrele;
return (EPIPE);
goto refrele;
goto refrele;
goto refrele;
goto refrele;
goto refrele;
goto lock_rele;
goto lock_rele;
if (error != 0) {
return (EPIPE);
done:
return (error);
addrlen));
addrlen));
int wakesig = 0;
int error = 0;
switch (how) {
case SHUT_RD:
case SHUT_WR:
case SHUT_RDWR:
return (EINVAL);
error = 0;
return (error);
return (EINVAL);
id = 0;
switch (option_name) {
case SCTP_RTOINFO:
case SCTP_ASSOCINFO:
case SCTP_PRIMARY_ADDR:
case SCTP_PEER_ADDR_PARAMS:
goto done;
case SCTP_DEFAULT_SEND_PARAM:
goto done;
case SCTP_INITMSG:
goto done;
if (id != 0) {
goto done;
if (error == 0) {
done:
return (error);
int error;
int intval;
void *conn;
void *buf;
int buflen;
switch (cmd) {
case FIONBIO:
return (EFAULT);
if (value) {
case FIOASYNC:
return (EFAULT);
if (value) {
case SIOCSPGRP:
case FIOSETOWN:
return (EFAULT);
return (error);
case SIOCGPGRP:
case FIOGETOWN:
return (EFAULT);
case FIONREAD:
return (EFAULT);
case SIOCATMARK:
intval = 0;
return (EFAULT);
case SIOCSCTPGOPT:
return (EFAULT);
return (EINVAL);
return (error);
return (EFAULT);
if (error == 0) {
return (error);
case SIOCSCTPSOPT:
return (EFAULT);
return (EINVAL);
if (intval != 0) {
return (error);
return (EFAULT);
if (ssa) {
return (error);
case SIOCSCTPPEELOFF: {
int nfd;
return (EOPNOTSUPP);
return (EFAULT);
if (intval == 0) {
return (EINVAL);
&sp);
return (EMFILE);
goto err;
goto err;
goto err;
if (error) {
goto peelerr;
if (error) {
goto peelerr;
err:
return (error);
return (error);
return (EINVAL);
int32_t i;
int32_t i;
return (NULL);
return (NULL);
int ret;
ret = 0;
return (ret);
static ssize_t
*errorp = 0;
case SCTP_ASSOC_CHANGE:
case SCTP_PEER_ADDR_CHANGE:
case SCTP_REMOTE_ERROR:
case SCTP_SEND_FAILED:
case SCTP_SHUTDOWN_EVENT:
ASSERT(0);
char *cend;
NULL));