diff options
author | Stefan Metzmacher <metze@samba.org> | 2005-12-06 17:59:20 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 13:47:09 -0500 |
commit | 273f340376452bd072b68d0601dde3f7b43b62db (patch) | |
tree | d62e422cedc3ab2fbcd67697db3cb4b5a4fa8c0d /source4/smb_server/tcon.c | |
parent | 2184ad5af7f354dfb5f8addcb99e69fa2f79df01 (diff) | |
download | samba-273f340376452bd072b68d0601dde3f7b43b62db.tar.gz samba-273f340376452bd072b68d0601dde3f7b43b62db.tar.bz2 samba-273f340376452bd072b68d0601dde3f7b43b62db.zip |
r12102: for SMB2 we need to allocate tcons per session
metze
(This used to be commit 4d527ac005086c2db954578b4126ca128e436e01)
Diffstat (limited to 'source4/smb_server/tcon.c')
-rw-r--r-- | source4/smb_server/tcon.c | 85 |
1 files changed, 67 insertions, 18 deletions
diff --git a/source4/smb_server/tcon.c b/source4/smb_server/tcon.c index 6714b61e90..0cb6738d31 100644 --- a/source4/smb_server/tcon.c +++ b/source4/smb_server/tcon.c @@ -29,7 +29,7 @@ /**************************************************************************** init the tcon structures ****************************************************************************/ -NTSTATUS smbsrv_init_tcons(struct smbsrv_connection *smb_conn, uint32_t limit) +static NTSTATUS smbsrv_init_tcons(struct smbsrv_tcons_context *tcons_ctx, TALLOC_CTX *mem_ctx, uint32_t limit) { /* * the idr_* functions take 'int' as limit, @@ -37,27 +37,37 @@ NTSTATUS smbsrv_init_tcons(struct smbsrv_connection *smb_conn, uint32_t limit) */ limit &= 0x00FFFFFF; - smb_conn->tcons.idtree_tid = idr_init(smb_conn); - NT_STATUS_HAVE_NO_MEMORY(smb_conn->tcons.idtree_tid); - smb_conn->tcons.idtree_limit = limit; - smb_conn->tcons.list = NULL; + tcons_ctx->idtree_tid = idr_init(mem_ctx); + NT_STATUS_HAVE_NO_MEMORY(tcons_ctx->idtree_tid); + tcons_ctx->idtree_limit = limit; + tcons_ctx->list = NULL; return NT_STATUS_OK; } +NTSTATUS smbsrv_smb_init_tcons(struct smbsrv_connection *smb_conn) +{ + return smbsrv_init_tcons(&smb_conn->smb_tcons, smb_conn, UINT16_MAX); +} + +NTSTATUS smbsrv_smb2_init_tcons(struct smbsrv_session *smb_sess) +{ + return smbsrv_init_tcons(&smb_sess->smb2_tcons, smb_sess, UINT32_MAX); +} + /**************************************************************************** -find a tcon given a cnum +find a tcon given a tid for SMB ****************************************************************************/ -struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_connection *smb_conn, uint32_t tid) +static struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_tcons_context *tcons_ctx, uint32_t tid) { void *p; struct smbsrv_tcon *tcon; if (tid == 0) return NULL; - if (tid > smb_conn->tcons.idtree_limit) return NULL; + if (tid > tcons_ctx->idtree_limit) return NULL; - p = idr_find(smb_conn->tcons.idtree_tid, tid); + p = idr_find(tcons_ctx->idtree_tid, tid); if (!p) return NULL; tcon = talloc_get_type(p, struct smbsrv_tcon); @@ -65,12 +75,24 @@ struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_connection *smb_conn, uint32_ return tcon; } +struct smbsrv_tcon *smbsrv_smb_tcon_find(struct smbsrv_connection *smb_conn, uint32_t tid) +{ + return smbsrv_tcon_find(&smb_conn->smb_tcons, tid); +} + +struct smbsrv_tcon *smbsrv_smb2_tcon_find(struct smbsrv_session *smb_sess, uint32_t tid) +{ + if (!smb_sess) return NULL; + return smbsrv_tcon_find(&smb_sess->smb2_tcons, tid); +} + /* destroy a connection structure */ static int smbsrv_tcon_destructor(void *ptr) { - struct smbsrv_tcon *tcon = ptr; + struct smbsrv_tcon *tcon = talloc_get_type(ptr, struct smbsrv_tcon); + struct smbsrv_tcons_context *tcons_ctx; DEBUG(3,("%s closed connection to service %s\n", socket_get_peer_addr(tcon->smb_conn->connection->socket, tcon), @@ -81,31 +103,48 @@ static int smbsrv_tcon_destructor(void *ptr) ntvfs_disconnect(tcon); } - idr_remove(tcon->smb_conn->tcons.idtree_tid, tcon->tid); - DLIST_REMOVE(tcon->smb_conn->tcons.list, tcon); + if (tcon->smb2.session) { + tcons_ctx = &tcon->smb2.session->smb2_tcons; + } else { + tcons_ctx = &tcon->smb_conn->smb_tcons; + } + + idr_remove(tcons_ctx->idtree_tid, tcon->tid); + DLIST_REMOVE(tcons_ctx->list, tcon); return 0; } /* find first available connection slot */ -struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn) +static struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn, struct smbsrv_session *smb_sess) { + TALLOC_CTX *mem_ctx; + struct smbsrv_tcons_context *tcons_ctx; struct smbsrv_tcon *tcon; int i; - tcon = talloc_zero(smb_conn, struct smbsrv_tcon); + if (smb_sess) { + mem_ctx = smb_sess; + tcons_ctx = &smb_sess->smb2_tcons; + } else { + mem_ctx = smb_conn; + tcons_ctx = &smb_conn->smb_tcons; + } + + tcon = talloc_zero(mem_ctx, struct smbsrv_tcon); if (!tcon) return NULL; - tcon->smb_conn = smb_conn; + tcon->smb_conn = smb_conn; + tcon->smb2.session = smb_sess; - i = idr_get_new_random(smb_conn->tcons.idtree_tid, tcon, smb_conn->tcons.idtree_limit); + i = idr_get_new_random(tcons_ctx->idtree_tid, tcon, tcons_ctx->idtree_limit); if (i == -1) { - DEBUG(1,("ERROR! Out of connection structures\n")); + DEBUG(1,("ERROR! Out of connection structures\n")); return NULL; } tcon->tid = i; - DLIST_ADD(smb_conn->tcons.list, tcon); + DLIST_ADD(tcons_ctx->list, tcon); talloc_set_destructor(tcon, smbsrv_tcon_destructor); /* now fill in some statistics */ @@ -113,3 +152,13 @@ struct smbsrv_tcon *smbsrv_tcon_new(struct smbsrv_connection *smb_conn) return tcon; } + +struct smbsrv_tcon *smbsrv_smb_tcon_new(struct smbsrv_connection *smb_conn) +{ + return smbsrv_tcon_new(smb_conn, NULL); +} + +struct smbsrv_tcon *smbsrv_smb2_tcon_new(struct smbsrv_session *smb_sess) +{ + return smbsrv_tcon_new(smb_sess->smb_conn, smb_sess); +} |