s3:smbd: add support for SMB2 Keepalive (SMB2 Echo)
authorStefan Metzmacher <metze@samba.org>
Fri, 15 May 2009 10:07:28 +0000 (12:07 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 20 May 2009 13:43:00 +0000 (15:43 +0200)
metze

source3/Makefile.in
source3/smbd/globals.h
source3/smbd/smb2_keepalive.c [new file with mode: 0644]
source3/smbd/smb2_server.c

index 53b7a3252adc6c080987ac87c1137ad9ae8e99e7..f5074e3a78472361acb66430fbeaef9c24ce9df0 100644 (file)
@@ -749,6 +749,7 @@ SMBD_OBJ_SRV = smbd/files.o smbd/chgpasswd.o smbd/connection.o \
               smbd/file_access.o \
               smbd/dnsregister.o smbd/globals.o \
               smbd/smb2_server.o smbd/smb2_negprot.o \
+              smbd/smb2_keepalive.o \
               $(MANGLE_OBJ) @VFS_STATIC@
 
 SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
index d0935e10f1f78747395e6f0af6a07ffe066a6577..c5dd97c7c846f139d19930ab661742a1e432cf30 100644 (file)
@@ -218,6 +218,7 @@ NTSTATUS smbd_smb2_request_done(struct smbd_smb2_request *req,
                                DATA_BLOB body, DATA_BLOB *dyn);
 
 NTSTATUS smbd_smb2_request_process_negprot(struct smbd_smb2_request *req);
+NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req);
 
 struct smbd_smb2_request {
        TALLOC_CTX *mem_pool;
diff --git a/source3/smbd/smb2_keepalive.c b/source3/smbd/smb2_keepalive.c
new file mode 100644 (file)
index 0000000..0028fd3
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+   Unix SMB/CIFS implementation.
+   Core SMB2 server
+
+   Copyright (C) Stefan Metzmacher 2009
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "smbd/globals.h"
+#include "../source4/libcli/smb2/smb2_constants.h"
+
+NTSTATUS smbd_smb2_request_process_keepalive(struct smbd_smb2_request *req)
+{
+       const uint8_t *inbody;
+       int i = req->current_idx;
+       DATA_BLOB outbody;
+       size_t expected_body_size = 0x04;
+       size_t body_size;
+
+       if (req->in.vector[i+1].iov_len != (expected_body_size & 0xFFFFFFFE)) {
+               return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+       }
+
+       inbody = (const uint8_t *)req->in.vector[i+1].iov_base;
+
+       body_size = SVAL(inbody, 0x00);
+       if (body_size != expected_body_size) {
+               return smbd_smb2_request_error(req, NT_STATUS_INVALID_PARAMETER);
+       }
+
+       /* TODO: update some time stamps */
+
+       outbody = data_blob_talloc(req->out.vector, NULL, 0x04);
+       if (outbody.data == NULL) {
+               return smbd_smb2_request_error(req, NT_STATUS_NO_MEMORY);
+       }
+
+       SSVAL(outbody.data, 0x00, 0x04);        /* struct size */
+       SSVAL(outbody.data, 0x02, 0);           /* reserved */
+
+       return smbd_smb2_request_done(req, outbody, NULL);
+}
index f4e5dfabc5a0832e0f54a43bc7b368b592fd98f3..9be6a73e13ab22542d8ff332a2ea3df0b5968c5e 100644 (file)
@@ -293,22 +293,58 @@ static NTSTATUS smbd_smb2_request_dispatch(struct smbd_smb2_request *req)
                return smbd_smb2_request_process_negprot(req);
 
        case SMB2_OP_SESSSETUP:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_LOGOFF:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
        case SMB2_OP_TCON:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
        case SMB2_OP_TDIS:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_CREATE:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_CLOSE:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_FLUSH:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_READ:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_WRITE:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_LOCK:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_IOCTL:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_CANCEL:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_KEEPALIVE:
+               return smbd_smb2_request_process_keepalive(req);
+
        case SMB2_OP_FIND:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_NOTIFY:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_GETINFO:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_SETINFO:
+               return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
+
        case SMB2_OP_BREAK:
                return smbd_smb2_request_error(req, NT_STATUS_NOT_IMPLEMENTED);
        }