cifs: remove rfc1002 header from smb2_tree_disconnect_req
[linux-block.git] / fs / cifs / smb2pdu.c
index 01346b8b6edb38498c1b48c37e1c9210f4d5fe09..0c58bff30de0be5bd30bea850978b8e02f7452e5 100644 (file)
@@ -398,8 +398,8 @@ small_smb2_init(__le16 smb2_command, struct cifs_tcon *tcon,
 }
 
 #ifdef CONFIG_CIFS_SMB311
-/* offset is sizeof smb2_negotiate_req - 4 but rounded up to 8 bytes */
-#define OFFSET_OF_NEG_CONTEXT 0x68  /* sizeof(struct smb2_negotiate_req) - 4 */
+/* offset is sizeof smb2_negotiate_req but rounded up to 8 bytes */
+#define OFFSET_OF_NEG_CONTEXT 0x68  /* sizeof(struct smb2_negotiate_req) */
 
 
 #define SMB2_PREAUTH_INTEGRITY_CAPABILITIES    cpu_to_le16(1)
@@ -427,23 +427,25 @@ build_encrypt_ctxt(struct smb2_encryption_neg_context *pneg_ctxt)
 }
 
 static void
-assemble_neg_contexts(struct smb2_negotiate_req *req)
+assemble_neg_contexts(struct smb2_negotiate_req *req,
+                     unsigned int *total_len)
 {
-
-       /* +4 is to account for the RFC1001 len field */
-       char *pneg_ctxt = (char *)req + OFFSET_OF_NEG_CONTEXT + 4;
+       char *pneg_ctxt = (char *)req + OFFSET_OF_NEG_CONTEXT;
 
        build_preauth_ctxt((struct smb2_preauth_neg_context *)pneg_ctxt);
        /* Add 2 to size to round to 8 byte boundary */
+
        pneg_ctxt += 2 + sizeof(struct smb2_preauth_neg_context);
        build_encrypt_ctxt((struct smb2_encryption_neg_context *)pneg_ctxt);
        req->NegotiateContextOffset = cpu_to_le32(OFFSET_OF_NEG_CONTEXT);
        req->NegotiateContextCount = cpu_to_le16(2);
-       inc_rfc1001_len(req, 4 + sizeof(struct smb2_preauth_neg_context)
-                       + sizeof(struct smb2_encryption_neg_context)); /* calculate hash */
+
+       *total_len += 4 + sizeof(struct smb2_preauth_neg_context)
+               + sizeof(struct smb2_encryption_neg_context);
 }
 #else
-static void assemble_neg_contexts(struct smb2_negotiate_req *req)
+static void assemble_neg_contexts(struct smb2_negotiate_req *req,
+                                 unsigned int *total_len)
 {
        return;
 }
@@ -477,6 +479,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
        int blob_offset, blob_length;
        char *security_blob;
        int flags = CIFS_NEG_OP;
+       unsigned int total_len;
 
        cifs_dbg(FYI, "Negotiate protocol\n");
 
@@ -485,30 +488,30 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
                return -EIO;
        }
 
-       rc = small_smb2_init(SMB2_NEGOTIATE, NULL, (void **) &req);
+       rc = smb2_plain_req_init(SMB2_NEGOTIATE, NULL, (void **) &req, &total_len);
        if (rc)
                return rc;
 
-       req->hdr.sync_hdr.SessionId = 0;
+       req->sync_hdr.SessionId = 0;
 
        if (strcmp(ses->server->vals->version_string,
                   SMB3ANY_VERSION_STRING) == 0) {
                req->Dialects[0] = cpu_to_le16(SMB30_PROT_ID);
                req->Dialects[1] = cpu_to_le16(SMB302_PROT_ID);
                req->DialectCount = cpu_to_le16(2);
-               inc_rfc1001_len(req, 4);
+               total_len += 4;
        } else if (strcmp(ses->server->vals->version_string,
                   SMBDEFAULT_VERSION_STRING) == 0) {
                req->Dialects[0] = cpu_to_le16(SMB21_PROT_ID);
                req->Dialects[1] = cpu_to_le16(SMB30_PROT_ID);
                req->Dialects[2] = cpu_to_le16(SMB302_PROT_ID);
                req->DialectCount = cpu_to_le16(3);
-               inc_rfc1001_len(req, 6);
+               total_len += 6;
        } else {
                /* otherwise send specific dialect */
                req->Dialects[0] = cpu_to_le16(ses->server->vals->protocol_id);
                req->DialectCount = cpu_to_le16(1);
-               inc_rfc1001_len(req, 2);
+               total_len += 2;
        }
 
        /* only one of SMB2 signing flags may be set in SMB2 request */
@@ -528,13 +531,12 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
                memcpy(req->ClientGUID, server->client_guid,
                        SMB2_CLIENT_GUID_SIZE);
                if (ses->server->vals->protocol_id == SMB311_PROT_ID)
-                       assemble_neg_contexts(req);
+                       assemble_neg_contexts(req, &total_len);
        }
        iov[0].iov_base = (char *)req;
-       /* 4 for rfc1002 length field */
-       iov[0].iov_len = get_rfc1002_length(req) + 4;
+       iov[0].iov_len = total_len;
 
-       rc = SendReceive2(xid, ses, iov, 1, &resp_buftype, flags, &rsp_iov);
+       rc = smb2_send_recv(xid, ses, iov, 1, &resp_buftype, flags, &rsp_iov);
        cifs_small_buf_release(req);
        rsp = (struct smb2_negotiate_rsp *)rsp_iov.iov_base;
        /*
@@ -1202,6 +1204,10 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
        int rc = 0;
        struct TCP_Server_Info *server;
        int flags = 0;
+       unsigned int total_len;
+       struct kvec iov[1];
+       struct kvec rsp_iov;
+       int resp_buf_type;
 
        cifs_dbg(FYI, "disconnect session %p\n", ses);
 
@@ -1214,19 +1220,24 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
        if (ses->need_reconnect)
                goto smb2_session_already_dead;
 
-       rc = small_smb2_init(SMB2_LOGOFF, NULL, (void **) &req);
+       rc = smb2_plain_req_init(SMB2_LOGOFF, NULL, (void **) &req, &total_len);
        if (rc)
                return rc;
 
         /* since no tcon, smb2_init can not do this, so do here */
-       req->hdr.sync_hdr.SessionId = ses->Suid;
+       req->sync_hdr.SessionId = ses->Suid;
 
        if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA)
                flags |= CIFS_TRANSFORM_REQ;
        else if (server->sign)
-               req->hdr.sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+               req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+
+       flags |= CIFS_NO_RESP;
 
-       rc = SendReceiveNoRsp(xid, ses, (char *) req, flags);
+       iov[0].iov_base = (char *)req;
+       iov[0].iov_len = total_len;
+
+       rc = smb2_send_recv(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
        /*
         * No tcon so can't do
@@ -1389,6 +1400,10 @@ SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon)
        int rc = 0;
        struct cifs_ses *ses = tcon->ses;
        int flags = 0;
+       unsigned int total_len;
+       struct kvec iov[1];
+       struct kvec rsp_iov;
+       int resp_buf_type;
 
        cifs_dbg(FYI, "Tree Disconnect\n");
 
@@ -1398,14 +1413,20 @@ SMB2_tdis(const unsigned int xid, struct cifs_tcon *tcon)
        if ((tcon->need_reconnect) || (tcon->ses->need_reconnect))
                return 0;
 
-       rc = small_smb2_init(SMB2_TREE_DISCONNECT, tcon, (void **) &req);
+       rc = smb2_plain_req_init(SMB2_TREE_DISCONNECT, tcon, (void **) &req,
+                            &total_len);
        if (rc)
                return rc;
 
        if (encryption_required(tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
-       rc = SendReceiveNoRsp(xid, ses, (char *)req, flags);
+       flags |= CIFS_NO_RESP;
+
+       iov[0].iov_base = (char *)req;
+       iov[0].iov_len = total_len;
+
+       rc = smb2_send_recv(xid, ses, iov, 1, &resp_buf_type, flags, &rsp_iov);
        cifs_small_buf_release(req);
        if (rc)
                cifs_stats_fail_inc(tcon, SMB2_TREE_DISCONNECT_HE);