da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
5cdbe942b031cac50f4252efc4371b15d624fcd1jb * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
88c10719b37fbb198caa2923d45715f6d98f7e87Gordon Ross * Copyright 2016 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#undef mem_free /* XXX Remove this after we convert everything to kmem_alloc */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * SMB Network Socket API
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_socreate: Creates an socket based on domain/type.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_soshutdown: Disconnect a socket created with smb_socreate
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_sodestroy: Release resources associated with a socket
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_sosend: Send the contents of a buffer on a socket
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_sorecv: Receive data into a buffer from a socket
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_iov_sosend: Send the contents of an iovec on a socket
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_iov_sorecv: Receive data into an iovec from a socket
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning err = ksocket_socket(&sock, domain, type, protocol, KSOCKET_SLEEP,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_soshutdown will disconnect the socket and prevent subsequent PDU
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * reception and transmission. The sonode still exists but its state
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * gets modified to indicate it is no longer connected. Calls to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_sorecv/smb_iov_sorecv will return so smb_soshutdown can be used
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * regain control of a thread stuck in smb_sorecv.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning (void) ksocket_shutdown(so, SHUT_RDWR, CRED());
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_sodestroy releases all resources associated with a socket previously
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * created with smb_socreate. The socket must be shutdown using smb_soshutdown
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * before the socket is destroyed with smb_sodestroy, otherwise undefined
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * behavior will result.
0f1702c5201310f0529cd5abb77652e5e9b241b6Yu Xiangning if ((err = ksocket_recv(so, msg, len, MSG_WAITALL, &recvd,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Successful receive */
5cdbe942b031cac50f4252efc4371b15d624fcd1jb * smb_net_txl_constructor
5cdbe942b031cac50f4252efc4371b15d624fcd1jb * Transmit list constructor
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross cv_init(&txl->tl_wait_cv, NULL, CV_DEFAULT, NULL);
5cdbe942b031cac50f4252efc4371b15d624fcd1jb * smb_net_txl_destructor
5cdbe942b031cac50f4252efc4371b15d624fcd1jb * Transmit list destructor
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * smb_net_send_uio
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * This routine puts the transmit buffer passed in on the wire.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * If another thread is already sending, block on the CV.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_net_send_uio(smb_session_t *s, struct uio *uio)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross DTRACE_PROBE1(send__wait__start, struct smb_session_t *, s);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Wait for our turn to send.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross DTRACE_PROBE1(send__wait__done, struct smb_session_t *, s);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * OK, try to send.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * This should block until we've sent it all,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * or given up due to errors (socket closed).
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = ksocket_sendmsg(s->sock, &msg, 0, &sent, CRED());
5cdbe942b031cac50f4252efc4371b15d624fcd1jb return (rc);