smb_session.c revision 21b7895d5162890490668032d92f9fbe941f02bb
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER START
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The contents of this file are subject to the terms of the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Common Development and Distribution License (the "License").
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You may not use this file except in compliance with the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * or http://www.opensolaris.org/os/licensing.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * See the License for the specific language governing permissions
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * and limitations under the License.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * When distributing Covered Code, include this CDDL HEADER in each
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If applicable, add the following below this CDDL HEADER, with the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * fields enclosed by brackets "[]" replaced with your own identifying
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * information: Portions Copyright [yyyy] [name of copyright owner]
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * CDDL HEADER END
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Use is subject to license terms.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#pragma ident "%Z%%M% %I% %E% SMI"
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/atomic.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/strsubr.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/synch.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/types.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/socketvar.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <sys/sdt.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <smbsrv/netbios.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <smbsrv/smb_incl.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan#include <smbsrv/smb_i18n.h>
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic volatile uint64_t smb_kids;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanuint32_t smb_keep_alive = SSN_KEEP_ALIVE_TIMEOUT;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int smb_session_message(smb_session_t *);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int smb_session_xprt_puthdr(smb_session_t *, smb_xprt_t *,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint8_t *, size_t);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void smb_request_init_command_mbuf(smb_request_t *sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_timers(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (session) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Walk through the table and decrement each keep_alive
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * timer that has not timed out yet. (keepalive > 0)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (session->keep_alive &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (session->keep_alive != (uint32_t)-1))
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->keep_alive--;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_next(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_correct_keep_alive_values(
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_list_t *se,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t new_keep_alive)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *sn;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (new_keep_alive == smb_keep_alive)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * keep alive == 0 means do not drop connection if it's idle
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_keep_alive = (new_keep_alive) ? new_keep_alive : -1;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Walk through the table and set each session to the new keep_alive
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * value if they have not already timed out. Block clock interrupts.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_head(&se->se_rdy.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (sn) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sn->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn->keep_alive = new_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_next(&se->se_rdy.lst, sn);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (sn) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sn->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sn->keep_alive)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn->keep_alive = new_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_next(&se->se_act.lst, sn);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_reconnection_check
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function is called when a client indicates its current connection
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * should be the only one it has with the server, as indicated by VC=0 in
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * a SessionSetupX request. We go through the session list and destroy any
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * stale connections for that client.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Clients don't associate IP addresses and servers. So a client may make
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * independent connections (i.e. with VC=0) to a server with multiple
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * IP addresses. So, when checking for a reconnection, we need to include
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * the local IP address, to which the client is connecting, when checking
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * for stale sessions.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Also check the server's NetBIOS name to support simultaneous access by
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * multiple clients behind a NAT server. This will only work for SMB over
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * NetBIOS on TCP port 139, it will not work SMB over TCP port 445 because
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * there is no NetBIOS name. See also Knowledge Base article Q301673.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_reconnection_check(smb_session_list_t *se, smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *sn;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (sn) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sn->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((sn != session) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (sn->ipaddr == session->ipaddr) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (sn->local_ipaddr == session->local_ipaddr) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (strcasecmp(sn->workstation, session->workstation) == 0) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (sn->opentime <= session->opentime) &&
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (sn->s_kid < session->s_kid)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tsignal(sn->s_thread, SIGINT);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sn = list_next(&se->se_act.lst, sn);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Send a session message - supports SMB-over-NBT and SMB-over-TCP.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The mbuf chain is copied into a contiguous buffer so that the whole
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * message is submitted to smb_sosend as a single request. This should
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * help Ethereal/Wireshark delineate the packets correctly even though
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * TCP_NODELAY has been set on the socket.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If an mbuf chain is provided, it will be freed and set to NULL here.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_send(smb_session_t *session, uint8_t type, mbuf_chain_t *mbc)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_txreq_t *txr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xprt_t hdr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (session->s_state) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_DISCONNECTED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_TERMINATED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((mbc != NULL) && (mbc->chain != NULL)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan m_freem(mbc->chain);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbc->chain = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mbc->flags = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (ENOTCONN);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan txr = smb_net_txr_alloc();
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((mbc != NULL) && (mbc->chain != NULL)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = mbc_moveout(mbc, (caddr_t)&txr->tr_buf[NETBIOS_HDR_SZ],
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sizeof (txr->tr_buf) - NETBIOS_HDR_SZ, &txr->tr_len);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_net_txr_free(txr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan hdr.xh_type = type;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan hdr.xh_length = (uint32_t)txr->tr_len;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_session_xprt_puthdr(session, &hdr, txr->tr_buf,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan NETBIOS_HDR_SZ);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_net_txr_free(txr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan txr->tr_len += NETBIOS_HDR_SZ;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (smb_net_txr_send(session->sock, &session->s_txlst, txr));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read, process and respond to a NetBIOS session request.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * A NetBIOS session must be established for SMB-over-NetBIOS. Validate
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * the calling and called name format and save the client NetBIOS name,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * which is used when a NetBIOS session is established to check for and
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * cleanup leftover state from a previous session.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Session requests are not valid for SMB-over-TCP, which is unfortunate
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * because without the client name leftover state cannot be cleaned up
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * if the client is behind a NAT server.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_request(struct smb_session *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char *calling_name;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char *called_name;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char client_name[NETBIOS_NAME_SZ];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct mbuf_chain mbc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char *names = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mts_wchar_t *wbuf = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xprt_t hdr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char *p;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan unsigned int cpid = oem_get_smb_cpid();
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rc1, rc2;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->keep_alive = smb_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((rc = smb_session_xprt_gethdr(session, &hdr)) != 0)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE2(receive__session__req__xprthdr, struct session *, session,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xprt_t *, &hdr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((hdr.xh_type != SESSION_REQUEST) ||
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (hdr.xh_length != NETBIOS_SESSION_REQUEST_DATA_LENGTH)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE1(receive__session__req__failed,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct session *, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EINVAL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan names = kmem_alloc(hdr.xh_length, KM_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((rc = smb_sorecv(session->sock, names, hdr.xh_length)) != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_free(names, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE1(receive__session__req__failed,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct session *, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE3(receive__session__req__data, struct session *, session,
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan char *, names, uint32_t, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan called_name = &names[0];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan calling_name = &names[NETBIOS_ENCODED_NAME_SZ + 2];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc1 = netbios_name_isvalid(called_name, 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc2 = netbios_name_isvalid(calling_name, client_name);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc1 == 0 || rc2 == 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE3(receive__invalid__session__req,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct session *, session, char *, names,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_free(names, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MBC_INIT(&mbc, MAX_DATAGRAM_LENGTH);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) smb_encode_mbc(&mbc, "b",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DATAGRAM_INVALID_SOURCE_NAME_FORMAT);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) smb_session_send(session, NEGATIVE_SESSION_RESPONSE,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan &mbc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EINVAL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE3(receive__session__req__calling__decoded,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct session *, session,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan char *, calling_name, char *, client_name);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * The client NetBIOS name is in oem codepage format.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * We need to convert it to unicode and store it in
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * multi-byte format. We also need to strip off any
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * spaces added as part of the NetBIOS name encoding.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan wbuf = kmem_alloc((SMB_PI_MAX_HOST * sizeof (mts_wchar_t)), KM_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) oemstounicodes(wbuf, client_name, SMB_PI_MAX_HOST, cpid);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) mts_wcstombs(session->workstation, wbuf, SMB_PI_MAX_HOST);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_free(wbuf, (SMB_PI_MAX_HOST * sizeof (mts_wchar_t)));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((p = strchr(session->workstation, ' ')) != 0)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *p = '\0';
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_free(names, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (smb_session_send(session, POSITIVE_SESSION_RESPONSE, NULL));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read 4-byte header from the session socket and build an in-memory
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * session transport header. See smb_xprt_t definition for header
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * format information.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Direct hosted NetBIOS-less SMB (SMB-over-TCP) uses port 445. The
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * first byte of the four-byte header must be 0 and the next three
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * bytes contain the length of the remaining data.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_xprt_gethdr(smb_session_t *session, smb_xprt_t *ret_hdr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan unsigned char buf[NETBIOS_HDR_SZ];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if ((rc = smb_sorecv(session->sock, buf, NETBIOS_HDR_SZ)) != 0)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (session->s_local_port) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SSN_SRVC_TCP_PORT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret_hdr->xh_type = buf[0];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret_hdr->xh_length = (((uint32_t)buf[1] & 1) << 16) |
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ((uint32_t)buf[2] << 8) |
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ((uint32_t)buf[3]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SRVC_TCP_PORT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret_hdr->xh_type = buf[0];
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (ret_hdr->xh_type != 0) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "0x%08x: invalid type (%u)",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->ipaddr, ret_hdr->xh_type);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EPROTO);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ret_hdr->xh_length = ((uint32_t)buf[1] << 16) |
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ((uint32_t)buf[2] << 8) |
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ((uint32_t)buf[3]);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "0x%08x: invalid port %u",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->ipaddr, session->s_local_port);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EPROTO);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Encode a transport session packet header into a 4-byte buffer.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * See smb_xprt_t definition for header format information.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_xprt_puthdr(smb_session_t *session, smb_xprt_t *hdr,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint8_t *buf, size_t buflen)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (session == NULL || hdr == NULL ||
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf == NULL || buflen < NETBIOS_HDR_SZ) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (-1);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (session->s_local_port) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SSN_SRVC_TCP_PORT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[0] = hdr->xh_type;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[1] = ((hdr->xh_length >> 16) & 1);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[2] = (hdr->xh_length >> 8) & 0xff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[3] = hdr->xh_length & 0xff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SRVC_TCP_PORT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[0] = hdr->xh_type;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan buf[1] = (hdr->xh_length >> 16) & 0xff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[2] = (hdr->xh_length >> 8) & 0xff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan buf[3] = hdr->xh_length & 0xff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cmn_err(CE_WARN, "0x%08x: invalid port (%u)",
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->ipaddr, session->s_local_port);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (-1);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic void
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathansmb_request_init_command_mbuf(smb_request_t *sr)
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan MGET(sr->command.chain, 0, MT_DATA);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Setup mbuf, mimic MCLGET but use the complete packet buffer.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_ext.ext_buf = sr->sr_request_buf;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_data = sr->command.chain->m_ext.ext_buf;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_len = sr->sr_req_length;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_flags |= M_EXT;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_ext.ext_size = sr->sr_req_length;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain->m_ext.ext_ref = &mclrefnoop;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Initialize the rest of the mbuf_chain fields
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.flags = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.shadow_of = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.max_bytes = sr->sr_req_length;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->command.chain_offset = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_request_cancel
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Handle a cancel for a request properly depending on the current request
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * state.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_request_cancel(smb_request_t *sr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (sr->sr_state) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_SUBMITTED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_ACTIVE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_CLEANED_UP:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_CANCELED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_WAITING_LOCK:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This request is waiting on a lock. Wakeup everything
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * waiting on the lock so that the relevant thread regains
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * control and notices that is has been canceled. The
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * other lock request threads waiting on this lock will go
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * back to sleep when they discover they are still blocked.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_CANCELED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sr_awaiting != NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&sr->sr_awaiting->l_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan cv_broadcast(&sr->sr_awaiting->l_cv);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_awaiting->l_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_WAITING_EVENT:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_EVENT_OCCURRED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Cancellations for these states are handled by the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * notify-change code
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_COMPLETED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_CANCELED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * No action required for these states since the request
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * is completing.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Cases included:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * SMB_REQ_STATE_FREE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * SMB_REQ_STATE_INITIALIZING:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This is the entry point for processing SMB messages over NetBIOS or
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * SMB-over-TCP.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * NetBIOS connections require a session request to establish a session
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * on which to send session messages.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Session requests are not valid on SMB-over-TCP. We don't need to do
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * anything here as session requests will be treated as an error when
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * handling session messages.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanint
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_daemon(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan int rc = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = smb_session_list_activate_head(se);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (session == NULL)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EINVAL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (session->s_local_port == SSN_SRVC_TCP_PORT) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_session_request(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_DISCONNECTED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_list_terminate(se, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_ESTABLISHED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_session_message(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_DISCONNECTED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_soshutdown(session->sock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE2(session__drop, struct session *, session, int, rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_cancel(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * At this point everything related to the session should have been
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * cleaned up and we expect that nothing will attempt to use the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * socket.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_list_terminate(se, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Read and process SMB requests.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Returns:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 0 Success
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 1 Unable to read transport header
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 2 Invalid transport header type
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 3 Invalid SMB length (too small)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 4 Unable to read SMB header
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 5 Invalid SMB header (bad magic number)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 6 Unable to read SMB data
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * 2x Write raw failed
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanstatic int
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_message(smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_t *sr = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xprt_t hdr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint8_t *req_buf;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t resid;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan int rc;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan for (;;) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_session_xprt_gethdr(session, &hdr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE2(session__receive__xprthdr, session_t *, session,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xprt_t *, &hdr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (hdr.xh_type != SESSION_MESSAGE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Anything other than SESSION_MESSAGE or
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * SESSION_KEEP_ALIVE is an error. A SESSION_REQUEST
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * may indicate a new session request but we need to
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * close this session and we can treat it as an error
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * here.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (hdr.xh_type == SESSION_KEEP_ALIVE) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->keep_alive = smb_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan continue;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EPROTO);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (hdr.xh_length < SMB_HEADER_LEN)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EPROTO);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->keep_alive = smb_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Allocate a request context, read the SMB header and validate
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * it. The sr includes a buffer large enough to hold the SMB
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * request payload. If the header looks valid, read any
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * remaining data.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr = smb_request_alloc(session, hdr.xh_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan req_buf = (uint8_t *)sr->sr_request_buf;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan resid = hdr.xh_length;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_sorecv(session->sock, req_buf, SMB_HEADER_LEN);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_free(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (SMB_PROTOCOL_MAGIC_INVALID(sr)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_free(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (EPROTO);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (resid > SMB_HEADER_LEN) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan req_buf += SMB_HEADER_LEN;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan resid -= SMB_HEADER_LEN;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_sorecv(session->sock, req_buf, resid);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (rc) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_free(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Initialize command MBC to represent the received data.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_init_command_mbuf(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan DTRACE_PROBE1(session__receive__smb, smb_request_t *, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * If this is a raw write, hand off the request. The handler
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * will retrieve the remaining raw data and process the request.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (SMB_IS_WRITERAW(sr)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rc = smb_handle_write_raw(session, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* XXX smb_request_free(sr); ??? */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (rc);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_SUBMITTED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan (void) taskq_dispatch(session->s_server->sv_thread_pool,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_worker, sr, TQ_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Port will be SSN_SRVC_TCP_PORT or SMB_SRVC_TCP_PORT.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_t *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_create(struct sonode *new_so, uint16_t port, smb_server_t *sv)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t ipaddr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan uint32_t local_ipaddr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan struct sockaddr_in sin;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = kmem_cache_alloc(sv->si_cache_session, KM_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bzero(session, sizeof (smb_session_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (smb_idpool_constructor(&session->s_uid_pool)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_cache_free(sv->si_cache_session, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (NULL);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->s_kid = SMB_NEW_KID();
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_INITIALIZED;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->native_os = NATIVE_OS_UNKNOWN;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->opentime = lbolt64;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->keep_alive = smb_keep_alive;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->activity_timestamp = lbolt64;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_constructor(&session->s_req_list, sizeof (smb_request_t),
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan offsetof(smb_request_t, sr_session_lnd));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_llist_constructor(&session->s_user_list, sizeof (smb_user_t),
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan offsetof(smb_user_t, u_lnd));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_llist_constructor(&session->s_xa_list, sizeof (smb_xa_t),
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan offsetof(smb_xa_t, xa_lnd));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_net_txl_constructor(&session->s_txlst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_init(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (new_so) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bcopy(new_so->so_faddr_sa, &sin, new_so->so_faddr_len);
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan ipaddr = sin.sin_addr.s_addr;
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan bcopy(new_so->so_laddr_sa, &sin, new_so->so_faddr_len);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan local_ipaddr = sin.sin_addr.s_addr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_local_port = port;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->ipaddr = ipaddr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->local_ipaddr = local_ipaddr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->sock = new_so;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_server = sv;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_server_get_cfg(sv, &session->s_cfg);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_cache_request = sv->si_cache_request;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_cache = sv->si_cache_session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_magic = SMB_SESSION_MAGIC;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_delete(smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_magic = (uint32_t)~SMB_SESSION_MAGIC;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_destroy(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_net_txl_destructor(&session->s_txlst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_destructor(&session->s_req_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_llist_destructor(&session->s_user_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_llist_destructor(&session->s_xa_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_tree_cnt == 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_file_cnt == 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_dir_cnt == 0);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_idpool_destructor(&session->s_uid_pool);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_cache_free(session->s_cache, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_cancel(smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xa_t *xa, *nextxa;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* All the request currently being treated must be canceled. */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_cancel_requests(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * We wait for the completion of all the requests associated with
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * this session.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_wait_for_empty(&session->s_req_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * At this point the reference count of the users, trees, files,
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * directories should be zero. It should be possible to destroy them
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * without any problem.
0662fbf4a5c0ae38617fd0fe521817c65a4dca3fSukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan xa = smb_llist_head(&session->s_xa_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (xa) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan nextxa = smb_llist_next(&session->s_xa_list, xa);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_xa_close(xa);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan xa = nextxa;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_logoff_all(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_cancel_requests(
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_t *sr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_t *tmp;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* All the SMB requests on the notification queue are canceled. */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_process_session_notify_change_queue(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_enter(&session->s_req_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr = smb_slist_head(&session->s_req_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (sr) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sr_magic == SMB_REQ_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tmp = smb_slist_next(&session->s_req_list, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_cancel(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr = tmp;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_exit(&session->s_req_list);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_worker(
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan void *arg)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_t *sr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr = (smb_request_t *)arg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sr_magic == SMB_REQ_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (sr->sr_state) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_REQ_STATE_SUBMITTED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_dispatch_request(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_enter(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (!sr->sr_keep) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_COMPLETED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_free(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sr_state == SMB_REQ_STATE_CANCELED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_COMPLETED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_exit(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_free(sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_session_disconnect_share
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * Disconnects the specified share. This function should be called after the
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * share passed in has been made unavailable by the "share manager".
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan */
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_disconnect_share(smb_session_list_t *se, char *sharename)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (session) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (session->s_state) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_NEGOTIATED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_OPLOCK_BREAKING:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_WRITE_RAW_ACTIVE: {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_t *user;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_t *next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan user = smb_user_lookup_by_state(session, NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (user) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_disconnect_share(user, sharename);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan next = smb_user_lookup_by_state(session, user);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_release(user);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan user = next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_next(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan/*
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan * smb_session_disconnect_volume
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function is called when a volume is deleted. We need to ensure
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * all trees with a reference to the volume are destroyed before we
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * discard the fs_online. Before destroying each tree, we notify any
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * in-progress requests and give them a chance to complete.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * NOTE:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * We shouldn't be accepting any new connection on this volume while
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * we are in this function.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_disconnect_volume(smb_session_list_t *se, fs_desc_t *fsd)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (session) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_READER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan switch (session->s_state) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_NEGOTIATED:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_OPLOCK_BREAKING:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan case SMB_SESSION_STATE_WRITE_RAW_ACTIVE: {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_t *user;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_t *next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan user = smb_user_lookup_by_state(session, NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (user) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_disconnect_volume(user, fsd);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan next = smb_user_lookup_by_state(session, user);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_release(user);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan user = next;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan default:
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan break;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_next(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_constructor(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bzero(se, sizeof (*se));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_init(&se->se_lock, NULL, RW_DEFAULT, NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_create(&se->se_rdy.lst, sizeof (smb_session_t),
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan offsetof(smb_session_t, s_lnd));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_create(&se->se_act.lst, sizeof (smb_session_t),
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan offsetof(smb_session_t, s_lnd));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_destructor(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_destroy(&se->se_rdy.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_destroy(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_destroy(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_append(smb_session_list_t *se, smb_session_t *session)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ASSERT(session->s_state == SMB_SESSION_STATE_INITIALIZED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan list_insert_tail(&se->se_rdy.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_rdy.count++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_wrop++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_delete_tail(smb_session_list_t *se)
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_tail(&se->se_rdy.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (session) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_state == SMB_SESSION_STATE_INITIALIZED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_remove(&se->se_rdy.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(se->se_rdy.count);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_rdy.count--;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_delete(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathansmb_session_t *
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathansmb_session_list_activate_head(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session = list_head(&se->se_rdy.lst);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (session) {
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_state == SMB_SESSION_STATE_INITIALIZED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_thread = curthread;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_ktdid = session->s_thread->t_did;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_remove(&se->se_rdy.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_rdy.count--;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_insert_tail(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_act.count++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_wrop++;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_terminate(smb_session_list_t *se, smb_session_t *session)
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan{
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan ASSERT(session->s_state == SMB_SESSION_STATE_DISCONNECTED);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_TERMINATED;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan smb_sodestroy(session->sock);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan session->sock = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_remove(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_act.count--;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_wrop++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_thread == curthread);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_delete(session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_session_list_signal
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function signals all the session threads. The intent is to terminate
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * them. The sessions still in the SMB_SESSION_STATE_INITIALIZED are delete
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * immediately.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * This function must only be called by the threads listening and accepting
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * connections. They must pass in their respective session list.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_session_list_signal(smb_session_list_t *se)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_session_t *session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan while (session = list_head(&se->se_rdy.lst)) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwenter(&session->s_lock, RW_WRITER);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_state == SMB_SESSION_STATE_INITIALIZED);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->s_state = SMB_SESSION_STATE_TERMINATED;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_sodestroy(session->sock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session->sock = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_rwx_rwexit(&session->s_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan list_remove(&se->se_rdy.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_rdy.count--;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan se->se_wrop++;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_exit(&se->se_lock);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan smb_session_delete(session);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan rw_enter(&se->se_lock, RW_WRITER);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_downgrade(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_head(&se->se_act.lst);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan while (session) {
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan tsignal(session->s_thread, SIGINT);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan session = list_next(&se->se_act.lst, session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan }
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan rw_exit(&se->se_lock);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_request_alloc
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Allocate an smb_request_t structure from the kmem_cache. Partially
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * initialize the found/new request.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Returns pointer to a request
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_request_t *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_request_alloc(smb_session_t *session, int req_length)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_request_t *sr;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(session->s_magic == SMB_SESSION_MAGIC);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr = kmem_cache_alloc(session->s_cache_request, KM_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * Future: Use constructor to pre-initialize some fields. For now
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * there are so many fields that it is easiest just to zero the
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * whole thing and start over.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan bzero(sr, sizeof (smb_request_t));
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_init(&sr->sr_mutex, NULL, MUTEX_DEFAULT, NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->session = session;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_server = session->s_server;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_gmtoff = session->s_server->si_gmtoff;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_cache = session->s_server->si_cache_request;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_cfg = &session->s_cfg;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->request_storage.forw = &sr->request_storage;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->request_storage.back = &sr->request_storage;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan sr->command.max_bytes = req_length;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan sr->reply.max_bytes = smb_maxbufsize;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan sr->sr_req_length = req_length;
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan if (req_length)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_request_buf = kmem_alloc(req_length, KM_SLEEP);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_magic = SMB_REQ_MAGIC;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_state = SMB_REQ_STATE_INITIALIZING;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_insert_tail(&session->s_req_list, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan return (sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan/*
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * smb_request_free
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan *
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan * release the memories which have been allocated for a smb request.
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathanvoid
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathansmb_request_free(smb_request_t *sr)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan{
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sr_magic == SMB_REQ_MAGIC);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->session);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->fid_ofile == NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->sid_odir == NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan ASSERT(sr->r_xa == NULL);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->tid_tree)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_tree_release(sr->tid_tree);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->uid_user)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_user_release(sr->uid_user);
accf27a5824ae84dfac7b089c4325917231a7d15Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smb_slist_remove(&sr->session->s_req_list, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->session = NULL;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan /* Release any temp storage */
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan smbsr_free_malloc_list(&sr->request_storage);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->sr_request_buf)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_free(sr->sr_request_buf, sr->sr_req_length);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->command.chain)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan m_freem(sr->command.chain);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->reply.chain)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan m_freem(sr->reply.chain);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan if (sr->raw_data.chain)
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan m_freem(sr->raw_data.chain);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan sr->sr_magic = 0;
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan mutex_destroy(&sr->sr_mutex);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan kmem_cache_free(sr->sr_cache, sr);
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan}
bafec74292ca6805e5acb387856f4e60a5314b37Sukumar Swaminathan