summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/fs/smbsrv/smb_session.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/fs/smbsrv/smb_session.c')
-rw-r--r--usr/src/uts/common/fs/smbsrv/smb_session.c48
1 files changed, 38 insertions, 10 deletions
diff --git a/usr/src/uts/common/fs/smbsrv/smb_session.c b/usr/src/uts/common/fs/smbsrv/smb_session.c
index 003321a126..b17ca1cfff 100644
--- a/usr/src/uts/common/fs/smbsrv/smb_session.c
+++ b/usr/src/uts/common/fs/smbsrv/smb_session.c
@@ -19,10 +19,8 @@
* CDDL HEADER END
*/
/*
- * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
*/
-
#include <sys/atomic.h>
#include <sys/strsubr.h>
#include <sys/synch.h>
@@ -196,6 +194,7 @@ smb_session_send(smb_session_t *session, uint8_t type, mbuf_chain_t *mbc)
return (rc);
}
txr->tr_len += NETBIOS_HDR_SZ;
+ smb_server_add_txb(session->s_server, (int64_t)txr->tr_len);
return (smb_net_txr_send(session->sock, &session->s_txlst, txr));
}
@@ -539,12 +538,15 @@ smb_session_daemon(smb_session_list_t *se)
static int
smb_session_message(smb_session_t *session)
{
+ smb_server_t *sv;
smb_request_t *sr = NULL;
smb_xprt_t hdr;
uint8_t *req_buf;
uint32_t resid;
int rc;
+ sv = session->s_server;
+
for (;;) {
rc = smb_session_xprt_gethdr(session, &hdr);
@@ -573,7 +575,6 @@ smb_session_message(smb_session_t *session)
return (EPROTO);
session->keep_alive = smb_keep_alive;
-
/*
* Allocate a request context, read the SMB header and validate
* it. The sr includes a buffer large enough to hold the SMB
@@ -606,7 +607,8 @@ smb_session_message(smb_session_t *session)
return (rc);
}
}
-
+ smb_server_add_rxb(sv,
+ (int64_t)(hdr.xh_length + NETBIOS_HDR_SZ));
/*
* Initialize command MBC to represent the received data.
*/
@@ -624,8 +626,20 @@ smb_session_message(smb_session_t *session)
continue;
return (rc);
}
-
+ if (sr->session->signing.flags & SMB_SIGNING_ENABLED) {
+ if (SMB_IS_NT_CANCEL(sr)) {
+ sr->session->signing.seqnum++;
+ sr->sr_seqnum = sr->session->signing.seqnum + 1;
+ sr->reply_seqnum = 0;
+ } else {
+ sr->session->signing.seqnum += 2;
+ sr->sr_seqnum = sr->session->signing.seqnum;
+ sr->reply_seqnum = sr->sr_seqnum + 1;
+ }
+ }
+ sr->sr_time_submitted = gethrtime();
sr->sr_state = SMB_REQ_STATE_SUBMITTED;
+ smb_srqueue_waitq_enter(session->s_srqueue);
(void) taskq_dispatch(session->s_server->sv_thread_pool,
smb_session_worker, sr, TQ_SLEEP);
}
@@ -677,7 +691,7 @@ smb_session_create(ksocket_t new_so, uint16_t port, smb_server_t *sv,
smb_rwx_init(&session->s_lock);
- if (new_so) {
+ if (new_so != NULL) {
if (family == AF_INET) {
slen = sizeof (sin);
(void) ksocket_getsockname(new_so,
@@ -709,10 +723,15 @@ smb_session_create(ksocket_t new_so, uint16_t port, smb_server_t *sv,
session->local_ipaddr.a_family = family;
session->s_local_port = port;
session->sock = new_so;
+ if (port == IPPORT_NETBIOS_SSN)
+ smb_server_inc_nbt_sess(sv);
+ else
+ smb_server_inc_tcp_sess(sv);
}
-
session->s_server = sv;
smb_server_get_cfg(sv, &session->s_cfg);
+ session->s_srqueue = &sv->sv_srqueue;
+
session->s_cache_request = sv->si_cache_request;
session->s_cache = sv->si_cache_session;
session->s_magic = SMB_SESSION_MAGIC;
@@ -728,6 +747,11 @@ smb_session_delete(smb_session_t *session)
session->s_magic = 0;
+ if (session->s_local_port == IPPORT_NETBIOS_SSN)
+ smb_server_dec_nbt_sess(session->s_server);
+ else
+ smb_server_dec_tcp_sess(session->s_server);
+
smb_rwx_destroy(&session->s_lock);
smb_net_txl_destructor(&session->s_txlst);
@@ -813,13 +837,16 @@ void
smb_session_worker(void *arg)
{
smb_request_t *sr;
+ smb_srqueue_t *srq;
sr = (smb_request_t *)arg;
+ SMB_REQ_VALID(sr);
- ASSERT(sr->sr_magic == SMB_REQ_MAGIC);
-
+ srq = sr->session->s_srqueue;
+ smb_srqueue_waitq_to_runq(srq);
sr->sr_worker = curthread;
mutex_enter(&sr->sr_mutex);
+ sr->sr_time_active = gethrtime();
switch (sr->sr_state) {
case SMB_REQ_STATE_SUBMITTED:
mutex_exit(&sr->sr_mutex);
@@ -838,6 +865,7 @@ smb_session_worker(void *arg)
smb_request_free(sr);
break;
}
+ smb_srqueue_runq_exit(srq);
}
void