r14739: keep the last request time for the smbsrv_connection,
authorStefan Metzmacher <metze@samba.org>
Sun, 26 Mar 2006 11:32:27 +0000 (11:32 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:59:18 +0000 (13:59 -0500)
smbsrv_session and smbsrv_tcon for management tools

metze
(This used to be commit 2c87f210e9e68de42dc45ca6532f3f33f4b6ce95)

source4/librpc/idl/irpc.idl
source4/smb_server/management.c
source4/smb_server/session.c
source4/smb_server/smb/receive.c
source4/smb_server/smb2/receive.c
source4/smb_server/smb_server.c
source4/smb_server/smb_server.h
source4/smb_server/tcon.c

index f83816f2f2db559b050db0c5936a024e6df0e987..5614608bd75f78f7fad6e51f65485114d57339b6 100644 (file)
@@ -92,6 +92,7 @@
                astring client_ip;
                NTTIME  connect_time;
                NTTIME  auth_time;
+               NTTIME  last_use_time;
        } smbsrv_session_info;
 
        typedef struct {
                astring share_name;
                astring client_ip;
                NTTIME  connect_time;
+               NTTIME  last_use_time;
        } smbsrv_tcon_info;
 
        typedef struct {
index b55a9f7d574cea11986111c30f5fcbd83f66df79..17258cf6c6db4b7b62ef00bdf3d573d4d109a89d 100644 (file)
@@ -63,6 +63,7 @@ static NTSTATUS smbsrv_session_information(struct irpc_message *msg,
                
                info->connect_time = timeval_to_nttime(&sess->statistics.connect_time);
                info->auth_time    = timeval_to_nttime(&sess->statistics.auth_time);
+               info->last_use_time= timeval_to_nttime(&sess->statistics.last_request_time);
                i++;
        }       
 
@@ -102,6 +103,7 @@ static NTSTATUS smbsrv_tcon_information(struct irpc_message *msg,
                info->tid          = tcon->tid;
                info->share_name   = tcon->share_name;
                info->connect_time = timeval_to_nttime(&tcon->statistics.connect_time);
+               info->last_use_time= timeval_to_nttime(&tcon->statistics.last_request_time);
                i++;
        }
 
index 967c02bfc9c1cf00630cdc73feb7ce50dbc42815..7274a7a71684fd4441ff633daad27c5ba546d227 100644 (file)
@@ -47,7 +47,8 @@ NTSTATUS smbsrv_init_sessions(struct smbsrv_connection *smb_conn, uint64_t limit
  * Find the session structure assoicated with a VUID
  * (not one from an in-progress session setup)
  */
-struct smbsrv_session *smbsrv_session_find(struct smbsrv_connection *smb_conn, uint64_t vuid)
+struct smbsrv_session *smbsrv_session_find(struct smbsrv_connection *smb_conn,
+                                          uint64_t vuid, struct timeval request_time)
 {
        void *p;
        struct smbsrv_session *sess;
@@ -62,6 +63,7 @@ struct smbsrv_session *smbsrv_session_find(struct smbsrv_connection *smb_conn, u
        /* only return a finished session */
        sess = talloc_get_type(p, struct smbsrv_session);
        if (sess && sess->session_info) {
+               sess->statistics.last_request_time = request_time;
                return sess;
        }
 
index d049475dd2eed336b58977e2f5341f1f276cb4d3..aff5e88285d86e449365ca642b05e6387683540f 100644 (file)
@@ -71,8 +71,11 @@ NTSTATUS smbsrv_recv_smb_request(void *private, DATA_BLOB blob)
 {
        struct smbsrv_connection *smb_conn = talloc_get_type(private, struct smbsrv_connection);
        struct smbsrv_request *req;
+       struct timeval cur_time = timeval_current();
        uint8_t command;
 
+       smb_conn->statistics.last_request_time = cur_time;
+
        /* see if its a special NBT packet */
        if (CVAL(blob.data, 0) != 0) {
                req = smbsrv_init_request(smb_conn);
@@ -82,7 +85,7 @@ NTSTATUS smbsrv_recv_smb_request(void *private, DATA_BLOB blob)
 
                req->in.buffer = talloc_steal(req, blob.data);
                req->in.size = blob.length;
-               req->request_time = timeval_current();
+               req->request_time = cur_time;
 
                smbsrv_reply_special(req);
                return NT_STATUS_OK;
@@ -107,7 +110,7 @@ NTSTATUS smbsrv_recv_smb_request(void *private, DATA_BLOB blob)
 
        req->in.buffer = talloc_steal(req, blob.data);
        req->in.size = blob.length;
-       req->request_time = timeval_current();
+       req->request_time = cur_time;
        req->chained_fnum = -1;
        req->in.allocated = req->in.size;
        req->in.hdr = req->in.buffer + NBT_HDR_SIZE;
@@ -471,7 +474,7 @@ static void switch_message(int type, struct smbsrv_request *req)
 
        flags = smb_messages[type].flags;
 
-       req->tcon = smbsrv_smb_tcon_find(smb_conn, SVAL(req->in.hdr,HDR_TID));
+       req->tcon = smbsrv_smb_tcon_find(smb_conn, SVAL(req->in.hdr,HDR_TID), req->request_time);
 
        if (!req->session) {
                /* setup the user context for this request if it
@@ -484,7 +487,7 @@ static void switch_message(int type, struct smbsrv_request *req)
                                req->session = req->tcon->sec_share.session;
                        }
                } else {
-                       req->session = smbsrv_session_find(req->smb_conn, SVAL(req->in.hdr,HDR_UID));
+                       req->session = smbsrv_session_find(req->smb_conn, SVAL(req->in.hdr,HDR_UID), req->request_time);
                }
        }
 
index ef67d29c515883ce7c79420ff1d697b0423ae9f2..6781b6ce658c8d1ad2ca141869aa5a8cfd42ab82 100644 (file)
@@ -128,8 +128,8 @@ static NTSTATUS smb2srv_reply(struct smb2srv_request *req)
        tid             = IVAL(req->in.hdr, SMB2_HDR_TID);
        uid             = BVAL(req->in.hdr, SMB2_HDR_UID);
 
-       req->session    = smbsrv_session_find(req->smb_conn, uid);
-       req->tcon       = smbsrv_smb2_tcon_find(req->session, tid);
+       req->session    = smbsrv_session_find(req->smb_conn, uid, req->request_time);
+       req->tcon       = smbsrv_smb2_tcon_find(req->session, tid, req->request_time);
 
        errno = 0;
 
@@ -241,10 +241,13 @@ NTSTATUS smbsrv_recv_smb2_request(void *private, DATA_BLOB blob)
 {
        struct smbsrv_connection *smb_conn = talloc_get_type(private, struct smbsrv_connection);
        struct smb2srv_request *req;
+       struct timeval cur_time = timeval_current();
        uint32_t protocol_version;
        uint16_t buffer_code;
        uint32_t dynamic_size;
 
+       smb_conn->statistics.last_request_time = cur_time;
+
        /* see if its a special NBT packet */
        if (CVAL(blob.data,0) != 0) {
                DEBUG(2,("Special NBT packet on SMB2 connection"));
@@ -271,7 +274,7 @@ NTSTATUS smbsrv_recv_smb2_request(void *private, DATA_BLOB blob)
 
        req->in.buffer          = talloc_steal(req, blob.data);
        req->in.size            = blob.length;
-       req->request_time       = timeval_current();
+       req->request_time       = cur_time;
        req->in.allocated       = req->in.size;
 
        req->in.hdr             = req->in.buffer+ NBT_HDR_SIZE;
index f47063f945d0013874af8bc4862d551ba879c1ed..927609226b63d8a8f85fd2ea08fd3e90c1133642 100644 (file)
@@ -151,6 +151,8 @@ static void smbsrv_accept(struct stream_connection *conn)
 
        irpc_add_name(conn->msg_ctx, "smb_server");
 
+       smb_conn->statistics.connect_time = timeval_current();
+
        smbsrv_management_init(smb_conn);
 }
 
index 8efe7730df824067a34279de74ff11b4040d2950..12b12692f37b2507e61731f37c71e1df81a57478 100644 (file)
@@ -84,6 +84,8 @@ struct smbsrv_session {
                struct timeval connect_time;
                /* the time when the session setup was finished */
                struct timeval auth_time;
+               /* the time when the last request comes in */
+               struct timeval last_request_time;
        } statistics;
 };
 
@@ -124,7 +126,10 @@ struct smbsrv_tcon {
 
        /* some statictics for the management tools */
        struct {
+               /* the time when the tree connect started */
                struct timeval connect_time;
+               /* the time when the last request comes in */
+               struct timeval last_request_time;
        } statistics;
 };
 
@@ -297,6 +302,14 @@ struct smbsrv_connection {
                enum security_types security;
                BOOL nt_status_support;
        } config;
+
+       /* some statictics for the management tools */
+       struct {
+               /* the time when the client connects */
+               struct timeval connect_time;
+               /* the time when the last request comes in */
+               struct timeval last_request_time;
+       } statistics;
 };
 
 #include "smb_server/smb_server_proto.h"
index 95e42d6537c9db366794c8d66d21666eb6f156f7..8b100d11ce2605ee9daf11e5a55290e2f4bc6287 100644 (file)
@@ -58,7 +58,8 @@ NTSTATUS smbsrv_smb2_init_tcons(struct smbsrv_session *smb_sess)
 /****************************************************************************
 find a tcon given a tid for SMB
 ****************************************************************************/
-static struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_tcons_context *tcons_ctx, uint32_t tid)
+static struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_tcons_context *tcons_ctx,
+                                           uint32_t tid, struct timeval request_time)
 {
        void *p;
        struct smbsrv_tcon *tcon;
@@ -71,19 +72,24 @@ static struct smbsrv_tcon *smbsrv_tcon_find(struct smbsrv_tcons_context *tcons_c
        if (!p) return NULL;
 
        tcon = talloc_get_type(p, struct smbsrv_tcon);
+       if (!tcon) return NULL;
+
+       tcon->statistics.last_request_time = request_time;
 
        return tcon;
 }
 
-struct smbsrv_tcon *smbsrv_smb_tcon_find(struct smbsrv_connection *smb_conn, uint32_t tid)
+struct smbsrv_tcon *smbsrv_smb_tcon_find(struct smbsrv_connection *smb_conn,
+                                        uint32_t tid, struct timeval request_time)
 {
-       return smbsrv_tcon_find(&smb_conn->smb_tcons, tid);
+       return smbsrv_tcon_find(&smb_conn->smb_tcons, tid, request_time);
 }
 
-struct smbsrv_tcon *smbsrv_smb2_tcon_find(struct smbsrv_session *smb_sess, uint32_t tid)
+struct smbsrv_tcon *smbsrv_smb2_tcon_find(struct smbsrv_session *smb_sess,
+                                         uint32_t tid, struct timeval request_time)
 {
        if (!smb_sess) return NULL;
-       return smbsrv_tcon_find(&smb_sess->smb2_tcons, tid);
+       return smbsrv_tcon_find(&smb_sess->smb2_tcons, tid, request_time);
 }
 
 /*