cifs: Create a new shared file holding smb2 pdu definitions
authorRonnie Sahlberg <lsahlber@redhat.com>
Thu, 4 Nov 2021 23:39:01 +0000 (08:39 +0900)
committerSteve French <stfrench@microsoft.com>
Fri, 5 Nov 2021 14:50:57 +0000 (09:50 -0500)
This file will contain all the definitions we need for SMB2 packets
and will follow the naming convention of MS-SMB2.PDF as closely
as possible to make it easier to cross-reference beween the definitions
and the standard.

The content of this file will mostly consist of migration of existing
definitions in the cifs/smb2.pdu.h and ksmbd/smb2pdu.h files
with some additional tweaks as the two files have diverged.

This patch introduces the new smbfs_common/smb2pdu.h file
and migrates the SMB2 header as well as TREE_CONNECT and TREE_DISCONNECT
to the shared file.

Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com>
Reviewed-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
12 files changed:
fs/cifs/cifsfs.c
fs/cifs/cifsglob.h
fs/cifs/connect.c
fs/cifs/misc.c
fs/cifs/smb2maperror.c
fs/cifs/smb2misc.c
fs/cifs/smb2ops.c
fs/cifs/smb2pdu.c
fs/cifs/smb2pdu.h
fs/cifs/smb2proto.h
fs/cifs/smb2transport.c
fs/smbfs_common/smb2pdu.h [new file with mode: 0644]

index 9fa930d..dca42aa 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/key-type.h>
 #include "cifs_spnego.h"
 #include "fscache.h"
-#include "smb2pdu.h"
 #ifdef CONFIG_CIFS_DFS_UPCALL
 #include "dfs_cache.h"
 #endif
index e916470..abff31d 100644 (file)
@@ -20,6 +20,7 @@
 #include <crypto/internal/hash.h>
 #include <linux/scatterlist.h>
 #include <uapi/linux/cifs/cifs_mount.h>
+#include "../smbfs_common/smb2pdu.h"
 #include "smb2pdu.h"
 
 #define CIFS_MAGIC_NUMBER 0xFF534D42      /* the first four bytes of SMB PDUs */
@@ -776,7 +777,7 @@ revert_current_mid(struct TCP_Server_Info *server, const unsigned int val)
 
 static inline void
 revert_current_mid_from_hdr(struct TCP_Server_Info *server,
-                           const struct smb2_sync_hdr *shdr)
+                           const struct smb2_hdr *shdr)
 {
        unsigned int num = le16_to_cpu(shdr->CreditCharge);
 
index e6e261d..da3b1ff 100644 (file)
@@ -677,7 +677,7 @@ dequeue_mid(struct mid_q_entry *mid, bool malformed)
 static unsigned int
 smb2_get_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buffer;
 
        /*
         * SMB1 does not use credits.
@@ -877,7 +877,7 @@ cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 static void
 smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buffer;
        int scredits, in_flight;
 
        /*
index bb1185f..ba2c3e8 100644 (file)
@@ -152,7 +152,7 @@ cifs_buf_get(void)
         * SMB2 header is bigger than CIFS one - no problems to clean some
         * more bytes for CIFS.
         */
-       size_t buf_size = sizeof(struct smb2_sync_hdr);
+       size_t buf_size = sizeof(struct smb2_hdr);
 
        /*
         * We could use negotiated size instead of max_msgsize -
index 181514b..194799d 100644 (file)
@@ -2439,14 +2439,16 @@ smb2_print_status(__le32 status)
 int
 map_smb2_to_linux_error(char *buf, bool log_err)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
        unsigned int i;
        int rc = -EIO;
        __le32 smb2err = shdr->Status;
 
        if (smb2err == 0) {
-               trace_smb3_cmd_done(shdr->TreeId, shdr->SessionId,
-                       le16_to_cpu(shdr->Command), le64_to_cpu(shdr->MessageId));
+               trace_smb3_cmd_done(le32_to_cpu(shdr->Id.SyncId.TreeId),
+                             le64_to_cpu(shdr->SessionId),
+                             le16_to_cpu(shdr->Command),
+                             le64_to_cpu(shdr->MessageId));
                return 0;
        }
 
@@ -2470,8 +2472,10 @@ map_smb2_to_linux_error(char *buf, bool log_err)
        cifs_dbg(FYI, "Mapping SMB2 status code 0x%08x to POSIX err %d\n",
                 __le32_to_cpu(smb2err), rc);
 
-       trace_smb3_cmd_err(shdr->TreeId, shdr->SessionId,
-                       le16_to_cpu(shdr->Command),
-                       le64_to_cpu(shdr->MessageId), le32_to_cpu(smb2err), rc);
+       trace_smb3_cmd_err(le32_to_cpu(shdr->Id.SyncId.TreeId),
+                          le64_to_cpu(shdr->SessionId),
+                          le16_to_cpu(shdr->Command),
+                          le64_to_cpu(shdr->MessageId),
+                          le32_to_cpu(smb2err), rc);
        return rc;
 }
index 29b5554..ce7d6cc 100644 (file)
@@ -8,7 +8,6 @@
  *
  */
 #include <linux/ctype.h>
-#include "smb2pdu.h"
 #include "cifsglob.h"
 #include "cifsproto.h"
 #include "smb2proto.h"
@@ -19,7 +18,7 @@
 #include "nterr.h"
 
 static int
-check_smb2_hdr(struct smb2_sync_hdr *shdr, __u64 mid)
+check_smb2_hdr(struct smb2_hdr *shdr, __u64 mid)
 {
        __u64 wire_mid = le64_to_cpu(shdr->MessageId);
 
@@ -81,9 +80,9 @@ static const __le16 smb2_rsp_struct_sizes[NUMBER_OF_SMB2_COMMANDS] = {
        /* SMB2_OPLOCK_BREAK */ cpu_to_le16(24)
 };
 
-#define SMB311_NEGPROT_BASE_SIZE (sizeof(struct smb2_sync_hdr) + sizeof(struct smb2_negotiate_rsp))
+#define SMB311_NEGPROT_BASE_SIZE (sizeof(struct smb2_hdr) + sizeof(struct smb2_negotiate_rsp))
 
-static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
+static __u32 get_neg_ctxt_len(struct smb2_hdr *hdr, __u32 len,
                              __u32 non_ctxlen)
 {
        __u16 neg_count;
@@ -135,13 +134,13 @@ static __u32 get_neg_ctxt_len(struct smb2_sync_hdr *hdr, __u32 len,
 int
 smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
-       struct smb2_sync_pdu *pdu = (struct smb2_sync_pdu *)shdr;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
+       struct smb2_pdu *pdu = (struct smb2_pdu *)shdr;
        __u64 mid;
        __u32 clc_len;  /* calculated length */
        int command;
-       int pdu_size = sizeof(struct smb2_sync_pdu);
-       int hdr_size = sizeof(struct smb2_sync_hdr);
+       int pdu_size = sizeof(struct smb2_pdu);
+       int hdr_size = sizeof(struct smb2_hdr);
 
        /*
         * Add function to do table lookup of StructureSize by command
@@ -155,7 +154,7 @@ smb2_check_message(char *buf, unsigned int len, struct TCP_Server_Info *srvr)
                /* decrypt frame now that it is completely read in */
                spin_lock(&cifs_tcp_ses_lock);
                list_for_each_entry(ses, &srvr->smb_ses_list, smb_ses_list) {
-                       if (ses->Suid == thdr->SessionId)
+                       if (ses->Suid == le64_to_cpu(thdr->SessionId))
                                break;
                }
                spin_unlock(&cifs_tcp_ses_lock);
@@ -296,7 +295,7 @@ static const bool has_smb2_data_area[NUMBER_OF_SMB2_COMMANDS] = {
  * area and the offset to it (from the beginning of the smb are also returned.
  */
 char *
-smb2_get_data_area_len(int *off, int *len, struct smb2_sync_hdr *shdr)
+smb2_get_data_area_len(int *off, int *len, struct smb2_hdr *shdr)
 {
        *off = 0;
        *len = 0;
@@ -401,8 +400,8 @@ smb2_get_data_area_len(int *off, int *len, struct smb2_sync_hdr *shdr)
 unsigned int
 smb2_calc_size(void *buf, struct TCP_Server_Info *srvr)
 {
-       struct smb2_sync_pdu *pdu = (struct smb2_sync_pdu *)buf;
-       struct smb2_sync_hdr *shdr = &pdu->sync_hdr;
+       struct smb2_pdu *pdu = (struct smb2_pdu *)buf;
+       struct smb2_hdr *shdr = &pdu->hdr;
        int offset; /* the offset from the beginning of SMB to data area */
        int data_length; /* the length of the variable length data area */
        /* Structure Size has already been checked to make sure it is 64 */
@@ -669,7 +668,7 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
 
        cifs_dbg(FYI, "Checking for oplock break\n");
 
-       if (rsp->sync_hdr.Command != SMB2_OPLOCK_BREAK)
+       if (rsp->hdr.Command != SMB2_OPLOCK_BREAK)
                return false;
 
        if (rsp->StructureSize !=
@@ -816,23 +815,23 @@ smb2_handle_cancelled_close(struct cifs_tcon *tcon, __u64 persistent_fid,
 int
 smb2_handle_cancelled_mid(struct mid_q_entry *mid, struct TCP_Server_Info *server)
 {
-       struct smb2_sync_hdr *sync_hdr = mid->resp_buf;
+       struct smb2_hdr *hdr = mid->resp_buf;
        struct smb2_create_rsp *rsp = mid->resp_buf;
        struct cifs_tcon *tcon;
        int rc;
 
-       if ((mid->optype & CIFS_CP_CREATE_CLOSE_OP) || sync_hdr->Command != SMB2_CREATE ||
-           sync_hdr->Status != STATUS_SUCCESS)
+       if ((mid->optype & CIFS_CP_CREATE_CLOSE_OP) || hdr->Command != SMB2_CREATE ||
+           hdr->Status != STATUS_SUCCESS)
                return 0;
 
-       tcon = smb2_find_smb_tcon(server, sync_hdr->SessionId,
-                                 sync_hdr->TreeId);
+       tcon = smb2_find_smb_tcon(server, le64_to_cpu(hdr->SessionId),
+                                 le32_to_cpu(hdr->Id.SyncId.TreeId));
        if (!tcon)
                return -ENOENT;
 
        rc = __smb2_handle_cancelled_cmd(tcon,
-                                        le16_to_cpu(sync_hdr->Command),
-                                        le64_to_cpu(sync_hdr->MessageId),
+                                        le16_to_cpu(hdr->Command),
+                                        le64_to_cpu(hdr->MessageId),
                                         rsp->PersistentFileId,
                                         rsp->VolatileFileId);
        if (rc)
@@ -856,10 +855,10 @@ smb311_update_preauth_hash(struct cifs_ses *ses, struct kvec *iov, int nvec)
 {
        int i, rc;
        struct sdesc *d;
-       struct smb2_sync_hdr *hdr;
+       struct smb2_hdr *hdr;
        struct TCP_Server_Info *server = cifs_ses_server(ses);
 
-       hdr = (struct smb2_sync_hdr *)iov[0].iov_base;
+       hdr = (struct smb2_hdr *)iov[0].iov_base;
        /* neg prot are always taken */
        if (hdr->Command == SMB2_NEGOTIATE)
                goto ok;
index bda606d..2ad223d 100644 (file)
@@ -325,7 +325,7 @@ static struct mid_q_entry *
 __smb2_find_mid(struct TCP_Server_Info *server, char *buf, bool dequeue)
 {
        struct mid_q_entry *mid;
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
        __u64 wire_mid = le64_to_cpu(shdr->MessageId);
 
        if (shdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM) {
@@ -367,11 +367,11 @@ static void
 smb2_dump_detail(void *buf, struct TCP_Server_Info *server)
 {
 #ifdef CONFIG_CIFS_DEBUG2
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
 
        cifs_server_dbg(VFS, "Cmd: %d Err: 0x%x Flags: 0x%x Mid: %llu Pid: %d\n",
                 shdr->Command, shdr->Status, shdr->Flags, shdr->MessageId,
-                shdr->ProcessId);
+                shdr->Id.SyncId.ProcessId);
        cifs_server_dbg(VFS, "smb buf %p len %u\n", buf,
                 server->ops->calc_smb_size(buf, server));
 #endif
@@ -888,7 +888,7 @@ int open_cached_dir(unsigned int xid, struct cifs_tcon *tcon,
        oparms.fid->persistent_fid = o_rsp->PersistentFileId;
        oparms.fid->volatile_fid = o_rsp->VolatileFileId;
 #ifdef CONFIG_CIFS_DEBUG2
-       oparms.fid->mid = le64_to_cpu(o_rsp->sync_hdr.MessageId);
+       oparms.fid->mid = le64_to_cpu(o_rsp->hdr.MessageId);
 #endif /* CIFS_DEBUG2 */
 
        tcon->crfid.tcon = tcon;
@@ -2391,7 +2391,7 @@ again:
 
        /* If the open failed there is nothing to do */
        op_rsp = (struct smb2_create_rsp *)rsp_iov[0].iov_base;
-       if (op_rsp == NULL || op_rsp->sync_hdr.Status != STATUS_SUCCESS) {
+       if (op_rsp == NULL || op_rsp->hdr.Status != STATUS_SUCCESS) {
                cifs_dbg(FYI, "query_dir_first: open failed rc=%d\n", rc);
                goto qdf_free;
        }
@@ -2410,7 +2410,7 @@ again:
        atomic_inc(&tcon->num_remote_opens);
 
        qd_rsp = (struct smb2_query_directory_rsp *)rsp_iov[1].iov_base;
-       if (qd_rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) {
+       if (qd_rsp->hdr.Status == STATUS_NO_MORE_FILES) {
                trace_smb3_query_dir_done(xid, fid->persistent_fid,
                                          tcon->tid, tcon->ses->Suid, 0, 0);
                srch_inf->endOfSearch = true;
@@ -2462,7 +2462,7 @@ smb2_close_dir(const unsigned int xid, struct cifs_tcon *tcon,
 static bool
 smb2_is_status_pending(char *buf, struct TCP_Server_Info *server)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
        int scredits, in_flight;
 
        if (shdr->Status != STATUS_PENDING)
@@ -2489,13 +2489,14 @@ smb2_is_status_pending(char *buf, struct TCP_Server_Info *server)
 static bool
 smb2_is_session_expired(char *buf)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
 
        if (shdr->Status != STATUS_NETWORK_SESSION_EXPIRED &&
            shdr->Status != STATUS_USER_SESSION_DELETED)
                return false;
 
-       trace_smb3_ses_expired(shdr->TreeId, shdr->SessionId,
+       trace_smb3_ses_expired(le32_to_cpu(shdr->Id.SyncId.TreeId),
+                              le64_to_cpu(shdr->SessionId),
                               le16_to_cpu(shdr->Command),
                               le64_to_cpu(shdr->MessageId));
        cifs_dbg(FYI, "Session expired or deleted\n");
@@ -2506,7 +2507,7 @@ smb2_is_session_expired(char *buf)
 static bool
 smb2_is_status_io_timeout(char *buf)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
 
        if (shdr->Status == STATUS_IO_TIMEOUT)
                return true;
@@ -2517,7 +2518,7 @@ smb2_is_status_io_timeout(char *buf)
 static void
 smb2_is_network_name_deleted(char *buf, struct TCP_Server_Info *server)
 {
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
        struct list_head *tmp, *tmp1;
        struct cifs_ses *ses;
        struct cifs_tcon *tcon;
@@ -2530,7 +2531,7 @@ smb2_is_network_name_deleted(char *buf, struct TCP_Server_Info *server)
                ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
                list_for_each(tmp1, &ses->tcon_list) {
                        tcon = list_entry(tmp1, struct cifs_tcon, tcon_list);
-                       if (tcon->tid == shdr->TreeId) {
+                       if (tcon->tid == le32_to_cpu(shdr->Id.SyncId.TreeId)) {
                                tcon->need_reconnect = true;
                                spin_unlock(&cifs_tcp_ses_lock);
                                pr_warn_once("Server share %s deleted.\n",
@@ -2558,9 +2559,9 @@ smb2_oplock_response(struct cifs_tcon *tcon, struct cifs_fid *fid,
 void
 smb2_set_related(struct smb_rqst *rqst)
 {
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
 
-       shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base);
+       shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base);
        if (shdr == NULL) {
                cifs_dbg(FYI, "shdr NULL in smb2_set_related\n");
                return;
@@ -2573,13 +2574,13 @@ char smb2_padding[7] = {0, 0, 0, 0, 0, 0, 0};
 void
 smb2_set_next_command(struct cifs_tcon *tcon, struct smb_rqst *rqst)
 {
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        struct cifs_ses *ses = tcon->ses;
        struct TCP_Server_Info *server = ses->server;
        unsigned long len = smb_rqst_len(server, rqst);
        int i, num_padding;
 
-       shdr = (struct smb2_sync_hdr *)(rqst->rq_iov[0].iov_base);
+       shdr = (struct smb2_hdr *)(rqst->rq_iov[0].iov_base);
        if (shdr == NULL) {
                cifs_dbg(FYI, "shdr NULL in smb2_set_next_command\n");
                return;
@@ -3124,7 +3125,7 @@ smb2_query_symlink(const unsigned int xid, struct cifs_tcon *tcon,
                                resp_buftype, rsp_iov);
 
        create_rsp = rsp_iov[0].iov_base;
-       if (create_rsp && create_rsp->sync_hdr.Status)
+       if (create_rsp && create_rsp->hdr.Status)
                err_iov = rsp_iov[0];
        ioctl_rsp = rsp_iov[1].iov_base;
 
@@ -4369,8 +4370,8 @@ static void
 fill_transform_hdr(struct smb2_transform_hdr *tr_hdr, unsigned int orig_len,
                   struct smb_rqst *old_rq, __le16 cipher_type)
 {
-       struct smb2_sync_hdr *shdr =
-                       (struct smb2_sync_hdr *)old_rq->rq_iov[0].iov_base;
+       struct smb2_hdr *shdr =
+                       (struct smb2_hdr *)old_rq->rq_iov[0].iov_base;
 
        memset(tr_hdr, 0, sizeof(struct smb2_transform_hdr));
        tr_hdr->ProtocolId = SMB2_TRANSFORM_PROTO_NUM;
@@ -4496,7 +4497,7 @@ crypt_message(struct TCP_Server_Info *server, int num_rqst,
        struct crypto_aead *tfm;
        unsigned int crypt_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
 
-       rc = smb2_get_enc_key(server, tr_hdr->SessionId, enc, key);
+       rc = smb2_get_enc_key(server, le64_to_cpu(tr_hdr->SessionId), enc, key);
        if (rc) {
                cifs_server_dbg(VFS, "%s: Could not get %scryption key\n", __func__,
                         enc ? "en" : "de");
@@ -4788,7 +4789,7 @@ handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid,
        unsigned int cur_page_idx;
        unsigned int pad_len;
        struct cifs_readdata *rdata = mid->callback_data;
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)buf;
        struct bio_vec *bvec = NULL;
        struct iov_iter iter;
        struct kvec iov;
@@ -5117,7 +5118,7 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
 {
        int ret, length;
        char *buf = server->smallbuf;
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        unsigned int pdu_length = server->pdu_size;
        unsigned int buf_size;
        struct mid_q_entry *mid_entry;
@@ -5147,7 +5148,7 @@ receive_encrypted_standard(struct TCP_Server_Info *server,
 
        next_is_large = server->large_buf;
 one_more:
-       shdr = (struct smb2_sync_hdr *)buf;
+       shdr = (struct smb2_hdr *)buf;
        if (shdr->NextCommand) {
                if (next_is_large)
                        next_buffer = (char *)cifs_buf_get();
@@ -5213,7 +5214,7 @@ smb3_receive_transform(struct TCP_Server_Info *server,
        unsigned int orig_len = le32_to_cpu(tr_hdr->OriginalMessageSize);
 
        if (pdu_length < sizeof(struct smb2_transform_hdr) +
-                                               sizeof(struct smb2_sync_hdr)) {
+                                               sizeof(struct smb2_hdr)) {
                cifs_server_dbg(VFS, "Transform message is too small (%u)\n",
                         pdu_length);
                cifs_reconnect(server);
@@ -5246,7 +5247,7 @@ smb3_handle_read_data(struct TCP_Server_Info *server, struct mid_q_entry *mid)
 static int
 smb2_next_header(char *buf)
 {
-       struct smb2_sync_hdr *hdr = (struct smb2_sync_hdr *)buf;
+       struct smb2_hdr *hdr = (struct smb2_hdr *)buf;
        struct smb2_transform_hdr *t_hdr = (struct smb2_transform_hdr *)buf;
 
        if (hdr->ProtocolId == SMB2_TRANSFORM_PROTO_NUM)
@@ -5788,7 +5789,7 @@ struct smb_version_values smb20_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5809,7 +5810,7 @@ struct smb_version_values smb21_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5830,7 +5831,7 @@ struct smb_version_values smb3any_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5851,7 +5852,7 @@ struct smb_version_values smbdefault_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5872,7 +5873,7 @@ struct smb_version_values smb30_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5893,7 +5894,7 @@ struct smb_version_values smb302_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
@@ -5914,7 +5915,7 @@ struct smb_version_values smb311_values = {
        .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE_LOCK,
        .shared_lock_type = SMB2_LOCKFLAG_SHARED_LOCK,
        .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
-       .header_size = sizeof(struct smb2_sync_hdr),
+       .header_size = sizeof(struct smb2_hdr),
        .header_preamble_size = 0,
        .max_header_size = MAX_SMB2_HDR_SIZE,
        .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
index 7829c59..dbbd804 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/uuid.h>
 #include <linux/pagemap.h>
 #include <linux/xattr.h>
-#include "smb2pdu.h"
 #include "cifsglob.h"
 #include "cifsacl.h"
 #include "cifsproto.h"
@@ -84,7 +83,7 @@ int smb3_encryption_required(const struct cifs_tcon *tcon)
 }
 
 static void
-smb2_hdr_assemble(struct smb2_sync_hdr *shdr, __le16 smb2_cmd,
+smb2_hdr_assemble(struct smb2_hdr *shdr, __le16 smb2_cmd,
                  const struct cifs_tcon *tcon,
                  struct TCP_Server_Info *server)
 {
@@ -104,7 +103,7 @@ smb2_hdr_assemble(struct smb2_sync_hdr *shdr, __le16 smb2_cmd,
        } else {
                shdr->CreditRequest = cpu_to_le16(2);
        }
-       shdr->ProcessId = cpu_to_le32((__u16)current->tgid);
+       shdr->Id.SyncId.ProcessId = cpu_to_le32((__u16)current->tgid);
 
        if (!tcon)
                goto out;
@@ -115,10 +114,10 @@ smb2_hdr_assemble(struct smb2_sync_hdr *shdr, __le16 smb2_cmd,
                shdr->CreditCharge = cpu_to_le16(1);
        /* else CreditCharge MBZ */
 
-       shdr->TreeId = tcon->tid;
+       shdr->Id.SyncId.TreeId = cpu_to_le32(tcon->tid);
        /* Uid is not converted */
        if (tcon->ses)
-               shdr->SessionId = tcon->ses->Suid;
+               shdr->SessionId = cpu_to_le64(tcon->ses->Suid);
 
        /*
         * If we would set SMB2_FLAGS_DFS_OPERATIONS on open we also would have
@@ -331,7 +330,7 @@ fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon,
               void *buf,
               unsigned int *total_len)
 {
-       struct smb2_sync_pdu *spdu = (struct smb2_sync_pdu *)buf;
+       struct smb2_pdu *spdu = (struct smb2_pdu *)buf;
        /* lookup word count ie StructureSize from table */
        __u16 parmsize = smb2_req_struct_sizes[le16_to_cpu(smb2_command)];
 
@@ -341,10 +340,10 @@ fill_small_buf(__le16 smb2_command, struct cifs_tcon *tcon,
         */
        memset(buf, 0, 256);
 
-       smb2_hdr_assemble(&spdu->sync_hdr, smb2_command, tcon, server);
+       smb2_hdr_assemble(&spdu->hdr, smb2_command, tcon, server);
        spdu->StructureSize2 = cpu_to_le16(parmsize);
 
-       *total_len = parmsize + sizeof(struct smb2_sync_hdr);
+       *total_len = parmsize + sizeof(struct smb2_hdr);
 }
 
 /*
@@ -367,7 +366,7 @@ static int __smb2_plain_req_init(__le16 smb2_command, struct cifs_tcon *tcon,
        }
 
        fill_small_buf(smb2_command, tcon, server,
-                      (struct smb2_sync_hdr *)(*request_buf),
+                      (struct smb2_hdr *)(*request_buf),
                       total_len);
 
        if (tcon != NULL) {
@@ -857,7 +856,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
        if (rc)
                return rc;
 
-       req->sync_hdr.SessionId = 0;
+       req->hdr.SessionId = 0;
 
        memset(server->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE);
        memset(ses->preauth_sha_hash, 0, SMB2_PREAUTH_HASH_SIZE);
@@ -1018,7 +1017,7 @@ SMB2_negotiate(const unsigned int xid, struct cifs_ses *ses)
                server->cipher_type = SMB2_ENCRYPTION_AES128_CCM;
 
        security_blob = smb2_get_data_area_len(&blob_offset, &blob_length,
-                                              (struct smb2_sync_hdr *)rsp);
+                                              (struct smb2_hdr *)rsp);
        /*
         * See MS-SMB2 section 2.2.4: if no blob, client picks default which
         * for us will be
@@ -1250,13 +1249,13 @@ SMB2_sess_alloc_buffer(struct SMB2_sess_data *sess_data)
                return rc;
 
        if (sess_data->ses->binding) {
-               req->sync_hdr.SessionId = sess_data->ses->Suid;
-               req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+               req->hdr.SessionId = cpu_to_le64(sess_data->ses->Suid);
+               req->hdr.Flags |= SMB2_FLAGS_SIGNED;
                req->PreviousSessionId = 0;
                req->Flags = SMB2_SESSION_REQ_FLAG_BINDING;
        } else {
                /* First session, not a reauthenticate */
-               req->sync_hdr.SessionId = 0;
+               req->hdr.SessionId = 0;
                /*
                 * if reconnect, we need to send previous sess id
                 * otherwise it is 0
@@ -1266,7 +1265,7 @@ SMB2_sess_alloc_buffer(struct SMB2_sess_data *sess_data)
        }
 
        /* enough to enable echos and oplocks and one max size write */
-       req->sync_hdr.CreditRequest = cpu_to_le16(130);
+       req->hdr.CreditRequest = cpu_to_le16(130);
 
        /* only one of SMB2 signing flags may be set in SMB2 request */
        if (server->sign)
@@ -1425,7 +1424,7 @@ SMB2_auth_kerberos(struct SMB2_sess_data *sess_data)
        rsp = (struct smb2_sess_setup_rsp *)sess_data->iov[0].iov_base;
        /* keep session id and flags if binding */
        if (!ses->binding) {
-               ses->Suid = rsp->sync_hdr.SessionId;
+               ses->Suid = le64_to_cpu(rsp->hdr.SessionId);
                ses->session_flags = le16_to_cpu(rsp->SessionFlags);
        }
 
@@ -1501,7 +1500,7 @@ SMB2_sess_auth_rawntlmssp_negotiate(struct SMB2_sess_data *sess_data)
 
        /* If true, rc here is expected and not an error */
        if (sess_data->buf0_type != CIFS_NO_BUFFER &&
-               rsp->sync_hdr.Status == STATUS_MORE_PROCESSING_REQUIRED)
+               rsp->hdr.Status == STATUS_MORE_PROCESSING_REQUIRED)
                rc = 0;
 
        if (rc)
@@ -1523,7 +1522,7 @@ SMB2_sess_auth_rawntlmssp_negotiate(struct SMB2_sess_data *sess_data)
 
        /* keep existing ses id and flags if binding */
        if (!ses->binding) {
-               ses->Suid = rsp->sync_hdr.SessionId;
+               ses->Suid = le64_to_cpu(rsp->hdr.SessionId);
                ses->session_flags = le16_to_cpu(rsp->SessionFlags);
        }
 
@@ -1558,7 +1557,7 @@ SMB2_sess_auth_rawntlmssp_authenticate(struct SMB2_sess_data *sess_data)
                goto out;
 
        req = (struct smb2_sess_setup_req *) sess_data->iov[0].iov_base;
-       req->sync_hdr.SessionId = ses->Suid;
+       req->hdr.SessionId = cpu_to_le64(ses->Suid);
 
        rc = build_ntlmssp_auth_blob(&ntlmssp_blob, &blob_length, ses,
                                        sess_data->nls_cp);
@@ -1584,7 +1583,7 @@ SMB2_sess_auth_rawntlmssp_authenticate(struct SMB2_sess_data *sess_data)
 
        /* keep existing ses id and flags if binding */
        if (!ses->binding) {
-               ses->Suid = rsp->sync_hdr.SessionId;
+               ses->Suid = le64_to_cpu(rsp->hdr.SessionId);
                ses->session_flags = le16_to_cpu(rsp->SessionFlags);
        }
 
@@ -1715,12 +1714,12 @@ SMB2_logoff(const unsigned int xid, struct cifs_ses *ses)
                return rc;
 
         /* since no tcon, smb2_init can not do this, so do here */
-       req->sync_hdr.SessionId = ses->Suid;
+       req->hdr.SessionId = cpu_to_le64(ses->Suid);
 
        if (ses->session_flags & SMB2_SESSION_FLAG_ENCRYPT_DATA)
                flags |= CIFS_TRANSFORM_REQ;
        else if (server->sign)
-               req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+               req->hdr.Flags |= SMB2_FLAGS_SIGNED;
 
        flags |= CIFS_NO_RSP_BUF;
 
@@ -1828,14 +1827,14 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
            !(ses->session_flags &
                    (SMB2_SESSION_FLAG_IS_GUEST|SMB2_SESSION_FLAG_IS_NULL)) &&
            ((ses->user_name != NULL) || (ses->sectype == Kerberos)))
-               req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+               req->hdr.Flags |= SMB2_FLAGS_SIGNED;
 
        memset(&rqst, 0, sizeof(struct smb_rqst));
        rqst.rq_iov = iov;
        rqst.rq_nvec = 2;
 
        /* Need 64 for max size write so ask for more in case not there yet */
-       req->sync_hdr.CreditRequest = cpu_to_le16(64);
+       req->hdr.CreditRequest = cpu_to_le16(64);
 
        rc = cifs_send_recv(xid, ses, server,
                            &rqst, &resp_buftype, flags, &rsp_iov);
@@ -1871,7 +1870,7 @@ SMB2_tcon(const unsigned int xid, struct cifs_ses *ses, const char *tree,
        tcon->maximal_access = le32_to_cpu(rsp->MaximalAccess);
        tcon->tidStatus = CifsGood;
        tcon->need_reconnect = false;
-       tcon->tid = rsp->sync_hdr.TreeId;
+       tcon->tid = le32_to_cpu(rsp->hdr.Id.SyncId.TreeId);
        strlcpy(tcon->treeName, tree, sizeof(tcon->treeName));
 
        if ((rsp->Capabilities & SMB2_SHARE_CAP_DFS) &&
@@ -1892,9 +1891,8 @@ tcon_exit:
        return rc;
 
 tcon_error_exit:
-       if (rsp && rsp->sync_hdr.Status == STATUS_BAD_NETWORK_NAME) {
+       if (rsp && rsp->hdr.Status == STATUS_BAD_NETWORK_NAME)
                cifs_tcon_dbg(VFS, "BAD_NETWORK_NAME: %s\n", tree);
-       }
        goto tcon_exit;
 }
 
@@ -2608,7 +2606,7 @@ int smb311_posix_mkdir(const unsigned int xid, struct inode *inode,
        if (tcon->share_flags & SHI1005_FLAGS_DFS) {
                int name_len;
 
-               req->sync_hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS;
+               req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS;
                rc = alloc_path_with_tree_prefix(&copy_path, &copy_size,
                                                 &name_len,
                                                 tcon->treeName, utf16_path);
@@ -2740,7 +2738,7 @@ SMB2_open_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
        if (tcon->share_flags & SHI1005_FLAGS_DFS) {
                int name_len;
 
-               req->sync_hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS;
+               req->hdr.Flags |= SMB2_FLAGS_DFS_OPERATIONS;
                rc = alloc_path_with_tree_prefix(&copy_path, &copy_size,
                                                 &name_len,
                                                 tcon->treeName, path);
@@ -2952,7 +2950,7 @@ SMB2_open(const unsigned int xid, struct cifs_open_parms *oparms, __le16 *path,
        oparms->fid->volatile_fid = rsp->VolatileFileId;
        oparms->fid->access = oparms->desired_access;
 #ifdef CONFIG_CIFS_DEBUG2
-       oparms->fid->mid = le64_to_cpu(rsp->sync_hdr.MessageId);
+       oparms->fid->mid = le64_to_cpu(rsp->hdr.MessageId);
 #endif /* CIFS_DEBUG2 */
 
        if (buf) {
@@ -3052,7 +3050,7 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
         * response size smaller.
         */
        req->MaxOutputResponse = cpu_to_le32(max_response_size);
-       req->sync_hdr.CreditCharge =
+       req->hdr.CreditCharge =
                cpu_to_le16(DIV_ROUND_UP(max(indatalen, max_response_size),
                                         SMB2_MAX_BUFFER_SIZE));
        if (is_fsctl)
@@ -3062,7 +3060,7 @@ SMB2_ioctl_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
 
        /* validate negotiate request must be signed - see MS-SMB2 3.2.5.5 */
        if (opcode == FSCTL_VALIDATE_NEGOTIATE_INFO)
-               req->sync_hdr.Flags |= SMB2_FLAGS_SIGNED;
+               req->hdr.Flags |= SMB2_FLAGS_SIGNED;
 
        return 0;
 }
@@ -3687,7 +3685,7 @@ smb2_echo_callback(struct mid_q_entry *mid)
 
        if (mid->mid_state == MID_RESPONSE_RECEIVED
            || mid->mid_state == MID_RESPONSE_MALFORMED) {
-               credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest);
+               credits.value = le16_to_cpu(rsp->hdr.CreditRequest);
                credits.instance = server->reconnect_instance;
        }
 
@@ -3787,7 +3785,7 @@ SMB2_echo(struct TCP_Server_Info *server)
        if (rc)
                return rc;
 
-       req->sync_hdr.CreditRequest = cpu_to_le16(1);
+       req->hdr.CreditRequest = cpu_to_le16(1);
 
        iov[0].iov_len = total_len;
        iov[0].iov_base = (char *)req;
@@ -3891,7 +3889,7 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
 {
        int rc = -EACCES;
        struct smb2_read_plain_req *req = NULL;
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        struct TCP_Server_Info *server = io_parms->server;
 
        rc = smb2_plain_req_init(SMB2_READ, io_parms->tcon, server,
@@ -3902,8 +3900,8 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
        if (server == NULL)
                return -ECONNABORTED;
 
-       shdr = &req->sync_hdr;
-       shdr->ProcessId = cpu_to_le32(io_parms->pid);
+       shdr = &req->hdr;
+       shdr->Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid);
 
        req->PersistentFileId = io_parms->persistent_fid;
        req->VolatileFileId = io_parms->volatile_fid;
@@ -3964,8 +3962,8 @@ smb2_new_read_req(void **buf, unsigned int *total_len,
                         * Related requests use info from previous read request
                         * in chain.
                         */
-                       shdr->SessionId = 0xFFFFFFFFFFFFFFFF;
-                       shdr->TreeId = 0xFFFFFFFF;
+                       shdr->SessionId = cpu_to_le64(0xFFFFFFFFFFFFFFFF);
+                       shdr->Id.SyncId.TreeId = cpu_to_le32(0xFFFFFFFF);
                        req->PersistentFileId = 0xFFFFFFFFFFFFFFFF;
                        req->VolatileFileId = 0xFFFFFFFFFFFFFFFF;
                }
@@ -3985,8 +3983,8 @@ smb2_readv_callback(struct mid_q_entry *mid)
        struct cifs_readdata *rdata = mid->callback_data;
        struct cifs_tcon *tcon = tlink_tcon(rdata->cfile->tlink);
        struct TCP_Server_Info *server = rdata->server;
-       struct smb2_sync_hdr *shdr =
-                               (struct smb2_sync_hdr *)rdata->iov[0].iov_base;
+       struct smb2_hdr *shdr =
+                               (struct smb2_hdr *)rdata->iov[0].iov_base;
        struct cifs_credits credits = { .value = 0, .instance = 0 };
        struct smb_rqst rqst = { .rq_iov = &rdata->iov[1],
                                 .rq_nvec = 1,
@@ -4072,7 +4070,7 @@ smb2_async_readv(struct cifs_readdata *rdata)
 {
        int rc, flags = 0;
        char *buf;
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        struct cifs_io_parms io_parms;
        struct smb_rqst rqst = { .rq_iov = rdata->iov,
                                 .rq_nvec = 1 };
@@ -4105,7 +4103,7 @@ smb2_async_readv(struct cifs_readdata *rdata)
        rdata->iov[0].iov_base = buf;
        rdata->iov[0].iov_len = total_len;
 
-       shdr = (struct smb2_sync_hdr *)buf;
+       shdr = (struct smb2_hdr *)buf;
 
        if (rdata->credits.value > 0) {
                shdr->CreditCharge = cpu_to_le16(DIV_ROUND_UP(rdata->bytes,
@@ -4238,7 +4236,7 @@ smb2_writev_callback(struct mid_q_entry *mid)
 
        switch (mid->mid_state) {
        case MID_RESPONSE_RECEIVED:
-               credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest);
+               credits.value = le16_to_cpu(rsp->hdr.CreditRequest);
                credits.instance = server->reconnect_instance;
                wdata->result = smb2_check_receive(mid, server, 0);
                if (wdata->result != 0)
@@ -4264,7 +4262,7 @@ smb2_writev_callback(struct mid_q_entry *mid)
                wdata->result = -EAGAIN;
                break;
        case MID_RESPONSE_MALFORMED:
-               credits.value = le16_to_cpu(rsp->sync_hdr.CreditRequest);
+               credits.value = le16_to_cpu(rsp->hdr.CreditRequest);
                credits.instance = server->reconnect_instance;
                fallthrough;
        default:
@@ -4311,7 +4309,7 @@ smb2_async_writev(struct cifs_writedata *wdata,
 {
        int rc = -EACCES, flags = 0;
        struct smb2_write_req *req = NULL;
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        struct cifs_tcon *tcon = tlink_tcon(wdata->cfile->tlink);
        struct TCP_Server_Info *server = wdata->server;
        struct kvec iov[1];
@@ -4329,8 +4327,8 @@ smb2_async_writev(struct cifs_writedata *wdata,
        if (smb3_encryption_required(tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
-       shdr = (struct smb2_sync_hdr *)req;
-       shdr->ProcessId = cpu_to_le32(wdata->cfile->pid);
+       shdr = (struct smb2_hdr *)req;
+       shdr->Id.SyncId.ProcessId = cpu_to_le32(wdata->cfile->pid);
 
        req->PersistentFileId = wdata->cfile->fid.persistent_fid;
        req->VolatileFileId = wdata->cfile->fid.volatile_fid;
@@ -4481,7 +4479,7 @@ SMB2_write(const unsigned int xid, struct cifs_io_parms *io_parms,
        if (smb3_encryption_required(io_parms->tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
-       req->sync_hdr.ProcessId = cpu_to_le32(io_parms->pid);
+       req->hdr.Id.SyncId.ProcessId = cpu_to_le32(io_parms->pid);
 
        req->PersistentFileId = io_parms->persistent_fid;
        req->VolatileFileId = io_parms->volatile_fid;
@@ -4866,7 +4864,7 @@ SMB2_query_directory(const unsigned int xid, struct cifs_tcon *tcon,
 
        if (rc) {
                if (rc == -ENODATA &&
-                   rsp->sync_hdr.Status == STATUS_NO_MORE_FILES) {
+                   rsp->hdr.Status == STATUS_NO_MORE_FILES) {
                        trace_smb3_query_dir_done(xid, persistent_fid,
                                tcon->tid, tcon->ses->Suid, index, 0);
                        srch_inf->endOfSearch = true;
@@ -4914,7 +4912,7 @@ SMB2_set_info_init(struct cifs_tcon *tcon, struct TCP_Server_Info *server,
        if (rc)
                return rc;
 
-       req->sync_hdr.ProcessId = cpu_to_le32(pid);
+       req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid);
        req->InfoType = info_type;
        req->FileInfoClass = info_class;
        req->PersistentFileId = persistent_fid;
@@ -5074,7 +5072,7 @@ SMB2_oplock_break(const unsigned int xid, struct cifs_tcon *tcon,
        req->VolatileFid = volatile_fid;
        req->PersistentFid = persistent_fid;
        req->OplockLevel = oplock_level;
-       req->sync_hdr.CreditRequest = cpu_to_le16(1);
+       req->hdr.CreditRequest = cpu_to_le16(1);
 
        flags |= CIFS_NO_RSP_BUF;
 
@@ -5376,7 +5374,7 @@ smb2_lockv(const unsigned int xid, struct cifs_tcon *tcon,
        if (smb3_encryption_required(tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
-       req->sync_hdr.ProcessId = cpu_to_le32(pid);
+       req->hdr.Id.SyncId.ProcessId = cpu_to_le32(pid);
        req->LockCount = cpu_to_le16(num_lock);
 
        req->PersistentFileId = persist_fid;
@@ -5452,7 +5450,7 @@ SMB2_lease_break(const unsigned int xid, struct cifs_tcon *tcon,
        if (smb3_encryption_required(tcon))
                flags |= CIFS_TRANSFORM_REQ;
 
-       req->sync_hdr.CreditRequest = cpu_to_le16(1);
+       req->hdr.CreditRequest = cpu_to_le16(1);
        req->StructureSize = cpu_to_le16(36);
        total_len += 12;
 
index f32c99c..739e98d 100644 (file)
 #include <net/sock.h>
 #include "cifsacl.h"
 
-/*
- * Note that, due to trying to use names similar to the protocol specifications,
- * there are many mixed case field names in the structures below.  Although
- * this does not match typical Linux kernel style, it is necessary to be
- * able to match against the protocol specfication.
- *
- * SMB2 commands
- * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses
- * (ie no useful data other than the SMB error code itself) and are marked such.
- * Knowing this helps avoid response buffer allocations and copy in some cases.
- */
-
-/* List of commands in host endian */
-#define SMB2_NEGOTIATE_HE      0x0000
-#define SMB2_SESSION_SETUP_HE  0x0001
-#define SMB2_LOGOFF_HE         0x0002 /* trivial request/resp */
-#define SMB2_TREE_CONNECT_HE   0x0003
-#define SMB2_TREE_DISCONNECT_HE        0x0004 /* trivial req/resp */
-#define SMB2_CREATE_HE         0x0005
-#define SMB2_CLOSE_HE          0x0006
-#define SMB2_FLUSH_HE          0x0007 /* trivial resp */
-#define SMB2_READ_HE           0x0008
-#define SMB2_WRITE_HE          0x0009
-#define SMB2_LOCK_HE           0x000A
-#define SMB2_IOCTL_HE          0x000B
-#define SMB2_CANCEL_HE         0x000C
-#define SMB2_ECHO_HE           0x000D
-#define SMB2_QUERY_DIRECTORY_HE        0x000E
-#define SMB2_CHANGE_NOTIFY_HE  0x000F
-#define SMB2_QUERY_INFO_HE     0x0010
-#define SMB2_SET_INFO_HE       0x0011
-#define SMB2_OPLOCK_BREAK_HE   0x0012
-
-/* The same list in little endian */
-#define SMB2_NEGOTIATE         cpu_to_le16(SMB2_NEGOTIATE_HE)
-#define SMB2_SESSION_SETUP     cpu_to_le16(SMB2_SESSION_SETUP_HE)
-#define SMB2_LOGOFF            cpu_to_le16(SMB2_LOGOFF_HE)
-#define SMB2_TREE_CONNECT      cpu_to_le16(SMB2_TREE_CONNECT_HE)
-#define SMB2_TREE_DISCONNECT   cpu_to_le16(SMB2_TREE_DISCONNECT_HE)
-#define SMB2_CREATE            cpu_to_le16(SMB2_CREATE_HE)
-#define SMB2_CLOSE             cpu_to_le16(SMB2_CLOSE_HE)
-#define SMB2_FLUSH             cpu_to_le16(SMB2_FLUSH_HE)
-#define SMB2_READ              cpu_to_le16(SMB2_READ_HE)
-#define SMB2_WRITE             cpu_to_le16(SMB2_WRITE_HE)
-#define SMB2_LOCK              cpu_to_le16(SMB2_LOCK_HE)
-#define SMB2_IOCTL             cpu_to_le16(SMB2_IOCTL_HE)
-#define SMB2_CANCEL            cpu_to_le16(SMB2_CANCEL_HE)
-#define SMB2_ECHO              cpu_to_le16(SMB2_ECHO_HE)
-#define SMB2_QUERY_DIRECTORY   cpu_to_le16(SMB2_QUERY_DIRECTORY_HE)
-#define SMB2_CHANGE_NOTIFY     cpu_to_le16(SMB2_CHANGE_NOTIFY_HE)
-#define SMB2_QUERY_INFO                cpu_to_le16(SMB2_QUERY_INFO_HE)
-#define SMB2_SET_INFO          cpu_to_le16(SMB2_SET_INFO_HE)
-#define SMB2_OPLOCK_BREAK      cpu_to_le16(SMB2_OPLOCK_BREAK_HE)
-
-#define SMB2_INTERNAL_CMD      cpu_to_le16(0xFFFF)
-
-#define NUMBER_OF_SMB2_COMMANDS        0x0013
-
 /* 52 transform hdr + 64 hdr + 88 create rsp */
 #define SMB2_TRANSFORM_HEADER_SIZE 52
 #define MAX_SMB2_HDR_SIZE 204
 
-#define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe)
-#define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd)
-#define SMB2_COMPRESSION_TRANSFORM_ID cpu_to_le32(0x424d53fc)
-
-/*
- * SMB2 Header Definition
- *
- * "MBZ" :  Must be Zero
- * "BB"  :  BugBug, Something to check/review/analyze later
- * "PDU" :  "Protocol Data Unit" (ie a network "frame")
- *
- */
-
-#define SMB2_HEADER_STRUCTURE_SIZE cpu_to_le16(64)
-
-struct smb2_sync_hdr {
-       __le32 ProtocolId;      /* 0xFE 'S' 'M' 'B' */
-       __le16 StructureSize;   /* 64 */
-       __le16 CreditCharge;    /* MBZ */
-       __le32 Status;          /* Error from server */
-       __le16 Command;
-       __le16 CreditRequest;  /* CreditResponse */
-       __le32 Flags;
-       __le32 NextCommand;
-       __le64 MessageId;
-       __le32 ProcessId;
-       __u32  TreeId;          /* opaque - so do not make little endian */
-       __u64  SessionId;       /* opaque - so do not make little endian */
-       __u8   Signature[16];
-} __packed;
-
 /* The total header size for SMB2 read and write */
-#define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_sync_hdr))
-
-struct smb2_sync_pdu {
-       struct smb2_sync_hdr sync_hdr;
-       __le16 StructureSize2; /* size of wct area (varies, request specific) */
-} __packed;
-
-#define SMB3_AES_CCM_NONCE 11
-#define SMB3_AES_GCM_NONCE 12
-
-/* Transform flags (for 3.0 dialect this flag indicates CCM */
-#define TRANSFORM_FLAG_ENCRYPTED       0x0001
-struct smb2_transform_hdr {
-       __le32 ProtocolId;      /* 0xFD 'S' 'M' 'B' */
-       __u8   Signature[16];
-       __u8   Nonce[16];
-       __le32 OriginalMessageSize;
-       __u16  Reserved1;
-       __le16 Flags; /* EncryptionAlgorithm for 3.0, enc enabled for 3.1.1 */
-       __u64  SessionId;
-} __packed;
-
-/* See MS-SMB2 2.2.42 */
-struct smb2_compression_transform_hdr_unchained {
-       __le32 ProtocolId;      /* 0xFC 'S' 'M' 'B' */
-       __le32 OriginalCompressedSegmentSize;
-       __le16 CompressionAlgorithm;
-       __le16 Flags;
-       __le16 Length; /* if chained it is length, else offset */
-} __packed;
-
-/* See MS-SMB2 2.2.42.1 */
-#define SMB2_COMPRESSION_FLAG_NONE     0x0000
-#define SMB2_COMPRESSION_FLAG_CHAINED  0x0001
-
-struct compression_payload_header {
-       __le16  CompressionAlgorithm;
-       __le16  Flags;
-       __le32  Length; /* length of compressed playload including field below if present */
-       /* __le32 OriginalPayloadSize; */ /* optional, present when LZNT1, LZ77, LZ77+Huffman */
-} __packed;
-
-/* See MS-SMB2 2.2.42.2 */
-struct smb2_compression_transform_hdr_chained {
-       __le32 ProtocolId;      /* 0xFC 'S' 'M' 'B' */
-       __le32 OriginalCompressedSegmentSize;
-       /* struct compression_payload_header[] */
-} __packed;
-
-/* See MS-SMB2 2.2.42.2.2 */
-struct compression_pattern_payload_v1 {
-       __le16  Pattern;
-       __le16  Reserved1;
-       __le16  Reserved2;
-       __le32  Repetitions;
-} __packed;
+#define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_hdr))
 
 /* See MS-SMB2 2.2.43 */
 struct smb2_rdma_transform {
@@ -190,17 +46,6 @@ struct smb2_rdma_crypto_transform {
 } __packed;
 
 /*
- *     SMB2 flag definitions
- */
-#define SMB2_FLAGS_SERVER_TO_REDIR     cpu_to_le32(0x00000001)
-#define SMB2_FLAGS_ASYNC_COMMAND       cpu_to_le32(0x00000002)
-#define SMB2_FLAGS_RELATED_OPERATIONS  cpu_to_le32(0x00000004)
-#define SMB2_FLAGS_SIGNED              cpu_to_le32(0x00000008)
-#define SMB2_FLAGS_PRIORITY_MASK       cpu_to_le32(0x00000070) /* SMB3.1.1 */
-#define SMB2_FLAGS_DFS_OPERATIONS      cpu_to_le32(0x10000000)
-#define SMB2_FLAGS_REPLAY_OPERATION    cpu_to_le32(0x20000000) /* SMB3 & up */
-
-/*
  *     Definitions for SMB2 Protocol Data Units (network frames)
  *
  *  See MS-SMB2.PDF specification for protocol details.
@@ -214,7 +59,7 @@ struct smb2_rdma_crypto_transform {
 #define SMB2_ERROR_STRUCTURE_SIZE2 cpu_to_le16(9)
 
 struct smb2_err_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;
        __le16 Reserved; /* MBZ */
        __le32 ByteCount;  /* even if zero, at least one byte follows */
@@ -273,7 +118,7 @@ struct share_redirect_error_context_rsp {
 #define SMB2_CLIENT_GUID_SIZE 16
 
 struct smb2_negotiate_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 36 */
        __le16 DialectCount;
        __le16 SecurityMode;
@@ -472,7 +317,7 @@ struct smb2_posix_neg_context {
 } __packed;
 
 struct smb2_negotiate_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 65 */
        __le16 SecurityMode;
        __le16 DialectRevision;
@@ -495,7 +340,7 @@ struct smb2_negotiate_rsp {
 #define SMB2_SESSION_REQ_FLAG_ENCRYPT_DATA     0x04
 
 struct smb2_sess_setup_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 25 */
        __u8   Flags;
        __u8   SecurityMode;
@@ -512,7 +357,7 @@ struct smb2_sess_setup_req {
 #define SMB2_SESSION_FLAG_IS_NULL      0x0002
 #define SMB2_SESSION_FLAG_ENCRYPT_DATA 0x0004
 struct smb2_sess_setup_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 9 */
        __le16 SessionFlags;
        __le16 SecurityBufferOffset;
@@ -521,161 +366,13 @@ struct smb2_sess_setup_rsp {
 } __packed;
 
 struct smb2_logoff_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 4 */
        __le16 Reserved;
 } __packed;
 
 struct smb2_logoff_rsp {
-       struct smb2_sync_hdr sync_hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __le16 Reserved;
-} __packed;
-
-/* Flags/Reserved for SMB3.1.1 */
-#define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT cpu_to_le16(0x0001)
-#define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER cpu_to_le16(0x0002)
-#define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT cpu_to_le16(0x0004)
-
-struct smb2_tree_connect_req {
-       struct smb2_sync_hdr sync_hdr;
-       __le16 StructureSize;   /* Must be 9 */
-       __le16 Flags; /* Reserved MBZ for dialects prior to SMB3.1.1 */
-       __le16 PathOffset;
-       __le16 PathLength;
-       __u8   Buffer[1];       /* variable length */
-} __packed;
-
-/* See MS-SMB2 section 2.2.9.2 */
-/* Context Types */
-#define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID 0x0000
-#define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID cpu_to_le16(0x0001)
-
-struct tree_connect_contexts {
-       __le16 ContextType;
-       __le16 DataLength;
-       __le32 Reserved;
-       __u8   Data[];
-} __packed;
-
-/* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */
-struct smb3_blob_data {
-       __le16 BlobSize;
-       __u8   BlobData[];
-} __packed;
-
-/* Valid values for Attr */
-#define SE_GROUP_MANDATORY             0x00000001
-#define SE_GROUP_ENABLED_BY_DEFAULT    0x00000002
-#define SE_GROUP_ENABLED               0x00000004
-#define SE_GROUP_OWNER                 0x00000008
-#define SE_GROUP_USE_FOR_DENY_ONLY     0x00000010
-#define SE_GROUP_INTEGRITY             0x00000020
-#define SE_GROUP_INTEGRITY_ENABLED     0x00000040
-#define SE_GROUP_RESOURCE              0x20000000
-#define SE_GROUP_LOGON_ID              0xC0000000
-
-/* struct sid_attr_data is SidData array in BlobData format then le32 Attr */
-
-struct sid_array_data {
-       __le16 SidAttrCount;
-       /* SidAttrList - array of sid_attr_data structs */
-} __packed;
-
-struct luid_attr_data {
-
-} __packed;
-
-/*
- * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5
- * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA
- */
-
-struct privilege_array_data {
-       __le16 PrivilegeCount;
-       /* array of privilege_data structs */
-} __packed;
-
-struct remoted_identity_tcon_context {
-       __le16 TicketType; /* must be 0x0001 */
-       __le16 TicketSize; /* total size of this struct */
-       __le16 User; /* offset to SID_ATTR_DATA struct with user info */
-       __le16 UserName; /* offset to null terminated Unicode username string */
-       __le16 Domain; /* offset to null terminated Unicode domain name */
-       __le16 Groups; /* offset to SID_ARRAY_DATA struct with group info */
-       __le16 RestrictedGroups; /* similar to above */
-       __le16 Privileges; /* offset to PRIVILEGE_ARRAY_DATA struct */
-       __le16 PrimaryGroup; /* offset to SID_ARRAY_DATA struct */
-       __le16 Owner; /* offset to BLOB_DATA struct */
-       __le16 DefaultDacl; /* offset to BLOB_DATA struct */
-       __le16 DeviceGroups; /* offset to SID_ARRAY_DATA struct */
-       __le16 UserClaims; /* offset to BLOB_DATA struct */
-       __le16 DeviceClaims; /* offset to BLOB_DATA struct */
-       __u8   TicketInfo[]; /* variable length buf - remoted identity data */
-} __packed;
-
-struct smb2_tree_connect_req_extension {
-       __le32 TreeConnectContextOffset;
-       __le16 TreeConnectContextCount;
-       __u8  Reserved[10];
-       __u8  PathName[]; /* variable sized array */
-       /* followed by array of TreeConnectContexts */
-} __packed;
-
-struct smb2_tree_connect_rsp {
-       struct smb2_sync_hdr sync_hdr;
-       __le16 StructureSize;   /* Must be 16 */
-       __u8   ShareType;  /* see below */
-       __u8   Reserved;
-       __le32 ShareFlags; /* see below */
-       __le32 Capabilities; /* see below */
-       __le32 MaximalAccess;
-} __packed;
-
-/* Possible ShareType values */
-#define SMB2_SHARE_TYPE_DISK   0x01
-#define SMB2_SHARE_TYPE_PIPE   0x02
-#define        SMB2_SHARE_TYPE_PRINT   0x03
-
-/*
- * Possible ShareFlags - exactly one and only one of the first 4 caching flags
- * must be set (any of the remaining, SHI1005, flags may be set individually
- * or in combination.
- */
-#define SMB2_SHAREFLAG_MANUAL_CACHING                  0x00000000
-#define SMB2_SHAREFLAG_AUTO_CACHING                    0x00000010
-#define SMB2_SHAREFLAG_VDO_CACHING                     0x00000020
-#define SMB2_SHAREFLAG_NO_CACHING                      0x00000030
-#define SHI1005_FLAGS_DFS                              0x00000001
-#define SHI1005_FLAGS_DFS_ROOT                         0x00000002
-#define SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS         0x00000100
-#define SHI1005_FLAGS_FORCE_SHARED_DELETE              0x00000200
-#define SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING          0x00000400
-#define SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM      0x00000800
-#define SHI1005_FLAGS_FORCE_LEVELII_OPLOCK             0x00001000
-#define SHI1005_FLAGS_ENABLE_HASH_V1                   0x00002000
-#define SHI1005_FLAGS_ENABLE_HASH_V2                   0x00004000
-#define SHI1005_FLAGS_ENCRYPT_DATA                     0x00008000
-#define SMB2_SHAREFLAG_IDENTITY_REMOTING               0x00040000 /* 3.1.1 */
-#define SMB2_SHAREFLAG_COMPRESS_DATA                   0x00100000 /* 3.1.1 */
-#define SHI1005_FLAGS_ALL                              0x0014FF33
-
-/* Possible share capabilities */
-#define SMB2_SHARE_CAP_DFS     cpu_to_le32(0x00000008) /* all dialects */
-#define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY cpu_to_le32(0x00000010) /* 3.0 */
-#define SMB2_SHARE_CAP_SCALEOUT        cpu_to_le32(0x00000020) /* 3.0 */
-#define SMB2_SHARE_CAP_CLUSTER cpu_to_le32(0x00000040) /* 3.0 */
-#define SMB2_SHARE_CAP_ASYMMETRIC cpu_to_le32(0x00000080) /* 3.02 */
-#define SMB2_SHARE_CAP_REDIRECT_TO_OWNER cpu_to_le32(0x00000100) /* 3.1.1 */
-
-struct smb2_tree_disconnect_req {
-       struct smb2_sync_hdr sync_hdr;
-       __le16 StructureSize;   /* Must be 4 */
-       __le16 Reserved;
-} __packed;
-
-struct smb2_tree_disconnect_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 4 */
        __le16 Reserved;
 } __packed;
@@ -808,7 +505,7 @@ struct smb2_tree_disconnect_rsp {
 #define SMB2_CREATE_IOV_SIZE 8
 
 struct smb2_create_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 57 */
        __u8   SecurityFlags;
        __u8   RequestedOplockLevel;
@@ -835,7 +532,7 @@ struct smb2_create_req {
 #define MAX_SMB2_CREATE_RESPONSE_SIZE 880
 
 struct smb2_create_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 89 */
        __u8   OplockLevel;
        __u8   Flag;  /* 0x01 if reparse point */
@@ -1210,7 +907,7 @@ struct duplicate_extents_to_file {
 #define SMB2_IOCTL_IOV_SIZE 2
 
 struct smb2_ioctl_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 57 */
        __u16 Reserved;
        __le32 CtlCode;
@@ -1228,7 +925,7 @@ struct smb2_ioctl_req {
 } __packed;
 
 struct smb2_ioctl_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 57 */
        __u16 Reserved;
        __le32 CtlCode;
@@ -1246,7 +943,7 @@ struct smb2_ioctl_rsp {
 /* Currently defined values for close flags */
 #define SMB2_CLOSE_FLAG_POSTQUERY_ATTRIB       cpu_to_le16(0x0001)
 struct smb2_close_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 24 */
        __le16 Flags;
        __le32 Reserved;
@@ -1260,7 +957,7 @@ struct smb2_close_req {
 #define MAX_SMB2_CLOSE_RESPONSE_SIZE 124
 
 struct smb2_close_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* 60 */
        __le16 Flags;
        __le32 Reserved;
@@ -1274,7 +971,7 @@ struct smb2_close_rsp {
 } __packed;
 
 struct smb2_flush_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 24 */
        __le16 Reserved1;
        __le32 Reserved2;
@@ -1283,7 +980,7 @@ struct smb2_flush_req {
 } __packed;
 
 struct smb2_flush_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;
        __le16 Reserved;
 } __packed;
@@ -1300,7 +997,7 @@ struct smb2_flush_rsp {
 
 /* SMB2 read request without RFC1001 length at the beginning */
 struct smb2_read_plain_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 49 */
        __u8   Padding; /* offset from start of SMB2 header to place read */
        __u8   Flags; /* MBZ unless SMB3.02 or later */
@@ -1321,7 +1018,7 @@ struct smb2_read_plain_req {
 #define SMB2_READFLAG_RESPONSE_RDMA_TRANSFORM  0x00000001
 
 struct smb2_read_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 17 */
        __u8   DataOffset;
        __u8   Reserved;
@@ -1336,7 +1033,7 @@ struct smb2_read_rsp {
 #define SMB2_WRITEFLAG_WRITE_UNBUFFERED        0x00000002      /* SMB3.02 or later */
 
 struct smb2_write_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 49 */
        __le16 DataOffset; /* offset from start of SMB2 header to write data */
        __le32 Length;
@@ -1352,7 +1049,7 @@ struct smb2_write_req {
 } __packed;
 
 struct smb2_write_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 17 */
        __u8   DataOffset;
        __u8   Reserved;
@@ -1380,7 +1077,7 @@ struct smb2_write_rsp {
 #define FILE_NOTIFY_CHANGE_STREAM_WRITE                0x00000800
 
 struct smb2_change_notify_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16  StructureSize;
        __le16  Flags;
        __le32  OutputBufferLength;
@@ -1391,7 +1088,7 @@ struct smb2_change_notify_req {
 } __packed;
 
 struct smb2_change_notify_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16  StructureSize;  /* Must be 9 */
        __le16  OutputBufferOffset;
        __le32  OutputBufferLength;
@@ -1411,7 +1108,7 @@ struct smb2_lock_element {
 } __packed;
 
 struct smb2_lock_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 48 */
        __le16 LockCount;
        /*
@@ -1426,19 +1123,19 @@ struct smb2_lock_req {
 } __packed;
 
 struct smb2_lock_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 4 */
        __le16 Reserved;
 } __packed;
 
 struct smb2_echo_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 4 */
        __u16  Reserved;
 } __packed;
 
 struct smb2_echo_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize;   /* Must be 4 */
        __u16  Reserved;
 } __packed;
@@ -1468,7 +1165,7 @@ struct smb2_echo_rsp {
  */
 
 struct smb2_query_directory_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 33 */
        __u8   FileInformationClass;
        __u8   Flags;
@@ -1482,7 +1179,7 @@ struct smb2_query_directory_req {
 } __packed;
 
 struct smb2_query_directory_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 9 */
        __le16 OutputBufferOffset;
        __le32 OutputBufferLength;
@@ -1515,7 +1212,7 @@ struct smb2_query_directory_rsp {
 #define SL_INDEX_SPECIFIED     0x00000004
 
 struct smb2_query_info_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 41 */
        __u8   InfoType;
        __u8   FileInfoClass;
@@ -1531,7 +1228,7 @@ struct smb2_query_info_req {
 } __packed;
 
 struct smb2_query_info_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 9 */
        __le16 OutputBufferOffset;
        __le32 OutputBufferLength;
@@ -1548,7 +1245,7 @@ struct smb2_query_info_rsp {
 #define SMB2_SET_INFO_IOV_SIZE 3
 
 struct smb2_set_info_req {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 33 */
        __u8   InfoType;
        __u8   FileInfoClass;
@@ -1562,12 +1259,12 @@ struct smb2_set_info_req {
 } __packed;
 
 struct smb2_set_info_rsp {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 2 */
 } __packed;
 
 struct smb2_oplock_break {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 24 */
        __u8   OplockLevel;
        __u8   Reserved;
@@ -1579,7 +1276,7 @@ struct smb2_oplock_break {
 #define SMB2_NOTIFY_BREAK_LEASE_FLAG_ACK_REQUIRED cpu_to_le32(0x01)
 
 struct smb2_lease_break {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 44 */
        __le16 Epoch;
        __le32 Flags;
@@ -1592,7 +1289,7 @@ struct smb2_lease_break {
 } __packed;
 
 struct smb2_lease_ack {
-       struct smb2_sync_hdr sync_hdr;
+       struct smb2_hdr hdr;
        __le16 StructureSize; /* Must be 36 */
        __le16 Reserved;
        __le32 Flags;
index 5479454..096fada 100644 (file)
@@ -25,7 +25,7 @@ extern int smb2_check_message(char *buf, unsigned int length,
                              struct TCP_Server_Info *server);
 extern unsigned int smb2_calc_size(void *buf, struct TCP_Server_Info *server);
 extern char *smb2_get_data_area_len(int *off, int *len,
-                                   struct smb2_sync_hdr *shdr);
+                                   struct smb2_hdr *shdr);
 extern __le16 *cifs_convert_path_to_utf16(const char *from,
                                          struct cifs_sb_info *cifs_sb);
 
index f59b956..2bf047b 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/mempool.h>
 #include <linux/highmem.h>
 #include <crypto/aead.h>
-#include "smb2pdu.h"
 #include "cifsglob.h"
 #include "cifsproto.h"
 #include "smb2proto.h"
@@ -213,14 +212,14 @@ smb2_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
        unsigned char smb2_signature[SMB2_HMACSHA256_SIZE];
        unsigned char *sigptr = smb2_signature;
        struct kvec *iov = rqst->rq_iov;
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[0].iov_base;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)iov[0].iov_base;
        struct cifs_ses *ses;
        struct shash_desc *shash;
        struct crypto_shash *hash;
        struct sdesc *sdesc = NULL;
        struct smb_rqst drqst;
 
-       ses = smb2_find_smb_ses(server, shdr->SessionId);
+       ses = smb2_find_smb_ses(server, le64_to_cpu(shdr->SessionId));
        if (!ses) {
                cifs_server_dbg(VFS, "%s: Could not find session\n", __func__);
                return 0;
@@ -534,14 +533,14 @@ smb3_calc_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server,
        unsigned char smb3_signature[SMB2_CMACAES_SIZE];
        unsigned char *sigptr = smb3_signature;
        struct kvec *iov = rqst->rq_iov;
-       struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)iov[0].iov_base;
+       struct smb2_hdr *shdr = (struct smb2_hdr *)iov[0].iov_base;
        struct shash_desc *shash;
        struct crypto_shash *hash;
        struct sdesc *sdesc = NULL;
        struct smb_rqst drqst;
        u8 key[SMB3_SIGN_KEY_SIZE];
 
-       rc = smb2_get_sign_key(shdr->SessionId, server, key);
+       rc = smb2_get_sign_key(le64_to_cpu(shdr->SessionId), server, key);
        if (rc)
                return 0;
 
@@ -611,12 +610,12 @@ static int
 smb2_sign_rqst(struct smb_rqst *rqst, struct TCP_Server_Info *server)
 {
        int rc = 0;
-       struct smb2_sync_hdr *shdr;
+       struct smb2_hdr *shdr;
        struct smb2_sess_setup_req *ssr;
        bool is_binding;
        bool is_signed;
 
-       shdr = (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base;
+       shdr = (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
        ssr = (struct smb2_sess_setup_req *)shdr;
 
        is_binding = shdr->Command == SMB2_SESSION_SETUP &&
@@ -642,8 +641,8 @@ smb2_verify_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
 {
        unsigned int rc;
        char server_response_sig[SMB2_SIGNATURE_SIZE];
-       struct smb2_sync_hdr *shdr =
-                       (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base;
+       struct smb2_hdr *shdr =
+                       (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
 
        if ((shdr->Command == SMB2_NEGOTIATE) ||
            (shdr->Command == SMB2_SESSION_SETUP) ||
@@ -689,7 +688,7 @@ smb2_verify_signature(struct smb_rqst *rqst, struct TCP_Server_Info *server)
  */
 static inline void
 smb2_seq_num_into_buf(struct TCP_Server_Info *server,
-                     struct smb2_sync_hdr *shdr)
+                     struct smb2_hdr *shdr)
 {
        unsigned int i, num = le16_to_cpu(shdr->CreditCharge);
 
@@ -700,7 +699,7 @@ smb2_seq_num_into_buf(struct TCP_Server_Info *server,
 }
 
 static struct mid_q_entry *
-smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr,
+smb2_mid_entry_alloc(const struct smb2_hdr *shdr,
                     struct TCP_Server_Info *server)
 {
        struct mid_q_entry *temp;
@@ -732,14 +731,15 @@ smb2_mid_entry_alloc(const struct smb2_sync_hdr *shdr,
 
        atomic_inc(&midCount);
        temp->mid_state = MID_REQUEST_ALLOCATED;
-       trace_smb3_cmd_enter(shdr->TreeId, shdr->SessionId,
-               le16_to_cpu(shdr->Command), temp->mid);
+       trace_smb3_cmd_enter(le32_to_cpu(shdr->Id.SyncId.TreeId),
+                            le64_to_cpu(shdr->SessionId),
+                            le16_to_cpu(shdr->Command), temp->mid);
        return temp;
 }
 
 static int
 smb2_get_mid_entry(struct cifs_ses *ses, struct TCP_Server_Info *server,
-                  struct smb2_sync_hdr *shdr, struct mid_q_entry **mid)
+                  struct smb2_hdr *shdr, struct mid_q_entry **mid)
 {
        if (server->tcpStatus == CifsExiting)
                return -ENOENT;
@@ -807,8 +807,8 @@ smb2_setup_request(struct cifs_ses *ses, struct TCP_Server_Info *server,
                   struct smb_rqst *rqst)
 {
        int rc;
-       struct smb2_sync_hdr *shdr =
-                       (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base;
+       struct smb2_hdr *shdr =
+                       (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
        struct mid_q_entry *mid;
 
        smb2_seq_num_into_buf(server, shdr);
@@ -833,8 +833,8 @@ struct mid_q_entry *
 smb2_setup_async_request(struct TCP_Server_Info *server, struct smb_rqst *rqst)
 {
        int rc;
-       struct smb2_sync_hdr *shdr =
-                       (struct smb2_sync_hdr *)rqst->rq_iov[0].iov_base;
+       struct smb2_hdr *shdr =
+                       (struct smb2_hdr *)rqst->rq_iov[0].iov_base;
        struct mid_q_entry *mid;
 
        if (server->tcpStatus == CifsNeedNegotiate &&
diff --git a/fs/smbfs_common/smb2pdu.h b/fs/smbfs_common/smb2pdu.h
new file mode 100644 (file)
index 0000000..f191ed6
--- /dev/null
@@ -0,0 +1,318 @@
+/* SPDX-License-Identifier: LGPL-2.1 */
+#ifndef _COMMON_SMB2PDU_H
+#define _COMMON_SMB2PDU_H
+
+/*
+ * Note that, due to trying to use names similar to the protocol specifications,
+ * there are many mixed case field names in the structures below.  Although
+ * this does not match typical Linux kernel style, it is necessary to be
+ * able to match against the protocol specfication.
+ *
+ * SMB2 commands
+ * Some commands have minimal (wct=0,bcc=0), or uninteresting, responses
+ * (ie no useful data other than the SMB error code itself) and are marked such.
+ * Knowing this helps avoid response buffer allocations and copy in some cases.
+ */
+
+/* List of commands in host endian */
+#define SMB2_NEGOTIATE_HE      0x0000
+#define SMB2_SESSION_SETUP_HE  0x0001
+#define SMB2_LOGOFF_HE         0x0002 /* trivial request/resp */
+#define SMB2_TREE_CONNECT_HE   0x0003
+#define SMB2_TREE_DISCONNECT_HE        0x0004 /* trivial req/resp */
+#define SMB2_CREATE_HE         0x0005
+#define SMB2_CLOSE_HE          0x0006
+#define SMB2_FLUSH_HE          0x0007 /* trivial resp */
+#define SMB2_READ_HE           0x0008
+#define SMB2_WRITE_HE          0x0009
+#define SMB2_LOCK_HE           0x000A
+#define SMB2_IOCTL_HE          0x000B
+#define SMB2_CANCEL_HE         0x000C
+#define SMB2_ECHO_HE           0x000D
+#define SMB2_QUERY_DIRECTORY_HE        0x000E
+#define SMB2_CHANGE_NOTIFY_HE  0x000F
+#define SMB2_QUERY_INFO_HE     0x0010
+#define SMB2_SET_INFO_HE       0x0011
+#define SMB2_OPLOCK_BREAK_HE   0x0012
+
+/* The same list in little endian */
+#define SMB2_NEGOTIATE         cpu_to_le16(SMB2_NEGOTIATE_HE)
+#define SMB2_SESSION_SETUP     cpu_to_le16(SMB2_SESSION_SETUP_HE)
+#define SMB2_LOGOFF            cpu_to_le16(SMB2_LOGOFF_HE)
+#define SMB2_TREE_CONNECT      cpu_to_le16(SMB2_TREE_CONNECT_HE)
+#define SMB2_TREE_DISCONNECT   cpu_to_le16(SMB2_TREE_DISCONNECT_HE)
+#define SMB2_CREATE            cpu_to_le16(SMB2_CREATE_HE)
+#define SMB2_CLOSE             cpu_to_le16(SMB2_CLOSE_HE)
+#define SMB2_FLUSH             cpu_to_le16(SMB2_FLUSH_HE)
+#define SMB2_READ              cpu_to_le16(SMB2_READ_HE)
+#define SMB2_WRITE             cpu_to_le16(SMB2_WRITE_HE)
+#define SMB2_LOCK              cpu_to_le16(SMB2_LOCK_HE)
+#define SMB2_IOCTL             cpu_to_le16(SMB2_IOCTL_HE)
+#define SMB2_CANCEL            cpu_to_le16(SMB2_CANCEL_HE)
+#define SMB2_ECHO              cpu_to_le16(SMB2_ECHO_HE)
+#define SMB2_QUERY_DIRECTORY   cpu_to_le16(SMB2_QUERY_DIRECTORY_HE)
+#define SMB2_CHANGE_NOTIFY     cpu_to_le16(SMB2_CHANGE_NOTIFY_HE)
+#define SMB2_QUERY_INFO                cpu_to_le16(SMB2_QUERY_INFO_HE)
+#define SMB2_SET_INFO          cpu_to_le16(SMB2_SET_INFO_HE)
+#define SMB2_OPLOCK_BREAK      cpu_to_le16(SMB2_OPLOCK_BREAK_HE)
+
+#define SMB2_INTERNAL_CMD      cpu_to_le16(0xFFFF)
+
+#define NUMBER_OF_SMB2_COMMANDS        0x0013
+
+/*
+ * SMB2 Header Definition
+ *
+ * "MBZ" :  Must be Zero
+ * "BB"  :  BugBug, Something to check/review/analyze later
+ * "PDU" :  "Protocol Data Unit" (ie a network "frame")
+ *
+ */
+
+#define __SMB2_HEADER_STRUCTURE_SIZE   64
+#define SMB2_HEADER_STRUCTURE_SIZE                             \
+       cpu_to_le16(__SMB2_HEADER_STRUCTURE_SIZE)
+
+#define SMB2_PROTO_NUMBER cpu_to_le32(0x424d53fe)
+#define SMB2_TRANSFORM_PROTO_NUM cpu_to_le32(0x424d53fd)
+#define SMB2_COMPRESSION_TRANSFORM_ID cpu_to_le32(0x424d53fc)
+
+/*
+ *     SMB2 flag definitions
+ */
+#define SMB2_FLAGS_SERVER_TO_REDIR     cpu_to_le32(0x00000001)
+#define SMB2_FLAGS_ASYNC_COMMAND       cpu_to_le32(0x00000002)
+#define SMB2_FLAGS_RELATED_OPERATIONS  cpu_to_le32(0x00000004)
+#define SMB2_FLAGS_SIGNED              cpu_to_le32(0x00000008)
+#define SMB2_FLAGS_PRIORITY_MASK       cpu_to_le32(0x00000070) /* SMB3.1.1 */
+#define SMB2_FLAGS_DFS_OPERATIONS      cpu_to_le32(0x10000000)
+#define SMB2_FLAGS_REPLAY_OPERATION    cpu_to_le32(0x20000000) /* SMB3 & up */
+
+/* See MS-SMB2 section 2.2.1 */
+struct smb2_hdr {
+       __le32 ProtocolId;      /* 0xFE 'S' 'M' 'B' */
+       __le16 StructureSize;   /* 64 */
+       __le16 CreditCharge;    /* MBZ */
+       __le32 Status;          /* Error from server */
+       __le16 Command;
+       __le16 CreditRequest;   /* CreditResponse */
+       __le32 Flags;
+       __le32 NextCommand;
+       __le64 MessageId;
+       union {
+               struct {
+                       __le32 ProcessId;
+                       __le32  TreeId;
+               } __packed SyncId;
+               __le64  AsyncId;
+       } __packed Id;
+       __le64  SessionId;
+       __u8   Signature[16];
+} __packed;
+
+struct smb2_pdu {
+       struct smb2_hdr hdr;
+       __le16 StructureSize2; /* size of wct area (varies, request specific) */
+} __packed;
+
+#define SMB3_AES_CCM_NONCE 11
+#define SMB3_AES_GCM_NONCE 12
+
+/* Transform flags (for 3.0 dialect this flag indicates CCM */
+#define TRANSFORM_FLAG_ENCRYPTED       0x0001
+struct smb2_transform_hdr {
+       __le32 ProtocolId;      /* 0xFD 'S' 'M' 'B' */
+       __u8   Signature[16];
+       __u8   Nonce[16];
+       __le32 OriginalMessageSize;
+       __u16  Reserved1;
+       __le16 Flags; /* EncryptionAlgorithm for 3.0, enc enabled for 3.1.1 */
+       __le64  SessionId;
+} __packed;
+
+
+/* See MS-SMB2 2.2.42 */
+struct smb2_compression_transform_hdr_unchained {
+       __le32 ProtocolId;      /* 0xFC 'S' 'M' 'B' */
+       __le32 OriginalCompressedSegmentSize;
+       __le16 CompressionAlgorithm;
+       __le16 Flags;
+       __le16 Length; /* if chained it is length, else offset */
+} __packed;
+
+/* See MS-SMB2 2.2.42.1 */
+#define SMB2_COMPRESSION_FLAG_NONE     0x0000
+#define SMB2_COMPRESSION_FLAG_CHAINED  0x0001
+
+struct compression_payload_header {
+       __le16  CompressionAlgorithm;
+       __le16  Flags;
+       __le32  Length; /* length of compressed playload including field below if present */
+       /* __le32 OriginalPayloadSize; */ /* optional, present when LZNT1, LZ77, LZ77+Huffman */
+} __packed;
+
+/* See MS-SMB2 2.2.42.2 */
+struct smb2_compression_transform_hdr_chained {
+       __le32 ProtocolId;      /* 0xFC 'S' 'M' 'B' */
+       __le32 OriginalCompressedSegmentSize;
+       /* struct compression_payload_header[] */
+} __packed;
+
+/* See MS-SMB2 2.2.42.2.2 */
+struct compression_pattern_payload_v1 {
+       __le16  Pattern;
+       __le16  Reserved1;
+       __le16  Reserved2;
+       __le32  Repetitions;
+} __packed;
+
+/* See MS-SMB2 section 2.2.9.2 */
+/* Context Types */
+#define SMB2_RESERVED_TREE_CONNECT_CONTEXT_ID 0x0000
+#define SMB2_REMOTED_IDENTITY_TREE_CONNECT_CONTEXT_ID cpu_to_le16(0x0001)
+
+struct tree_connect_contexts {
+       __le16 ContextType;
+       __le16 DataLength;
+       __le32 Reserved;
+       __u8   Data[];
+} __packed;
+
+/* Remoted identity tree connect context structures - see MS-SMB2 2.2.9.2.1 */
+struct smb3_blob_data {
+       __le16 BlobSize;
+       __u8   BlobData[];
+} __packed;
+
+/* Valid values for Attr */
+#define SE_GROUP_MANDATORY             0x00000001
+#define SE_GROUP_ENABLED_BY_DEFAULT    0x00000002
+#define SE_GROUP_ENABLED               0x00000004
+#define SE_GROUP_OWNER                 0x00000008
+#define SE_GROUP_USE_FOR_DENY_ONLY     0x00000010
+#define SE_GROUP_INTEGRITY             0x00000020
+#define SE_GROUP_INTEGRITY_ENABLED     0x00000040
+#define SE_GROUP_RESOURCE              0x20000000
+#define SE_GROUP_LOGON_ID              0xC0000000
+
+/* struct sid_attr_data is SidData array in BlobData format then le32 Attr */
+
+struct sid_array_data {
+       __le16 SidAttrCount;
+       /* SidAttrList - array of sid_attr_data structs */
+} __packed;
+
+struct luid_attr_data {
+
+} __packed;
+
+/*
+ * struct privilege_data is the same as BLOB_DATA - see MS-SMB2 2.2.9.2.1.5
+ * but with size of LUID_ATTR_DATA struct and BlobData set to LUID_ATTR DATA
+ */
+
+struct privilege_array_data {
+       __le16 PrivilegeCount;
+       /* array of privilege_data structs */
+} __packed;
+
+struct remoted_identity_tcon_context {
+       __le16 TicketType; /* must be 0x0001 */
+       __le16 TicketSize; /* total size of this struct */
+       __le16 User; /* offset to SID_ATTR_DATA struct with user info */
+       __le16 UserName; /* offset to null terminated Unicode username string */
+       __le16 Domain; /* offset to null terminated Unicode domain name */
+       __le16 Groups; /* offset to SID_ARRAY_DATA struct with group info */
+       __le16 RestrictedGroups; /* similar to above */
+       __le16 Privileges; /* offset to PRIVILEGE_ARRAY_DATA struct */
+       __le16 PrimaryGroup; /* offset to SID_ARRAY_DATA struct */
+       __le16 Owner; /* offset to BLOB_DATA struct */
+       __le16 DefaultDacl; /* offset to BLOB_DATA struct */
+       __le16 DeviceGroups; /* offset to SID_ARRAY_DATA struct */
+       __le16 UserClaims; /* offset to BLOB_DATA struct */
+       __le16 DeviceClaims; /* offset to BLOB_DATA struct */
+       __u8   TicketInfo[]; /* variable length buf - remoted identity data */
+} __packed;
+
+struct smb2_tree_connect_req_extension {
+       __le32 TreeConnectContextOffset;
+       __le16 TreeConnectContextCount;
+       __u8  Reserved[10];
+       __u8  PathName[]; /* variable sized array */
+       /* followed by array of TreeConnectContexts */
+} __packed;
+
+/* Flags/Reserved for SMB3.1.1 */
+#define SMB2_TREE_CONNECT_FLAG_CLUSTER_RECONNECT cpu_to_le16(0x0001)
+#define SMB2_TREE_CONNECT_FLAG_REDIRECT_TO_OWNER cpu_to_le16(0x0002)
+#define SMB2_TREE_CONNECT_FLAG_EXTENSION_PRESENT cpu_to_le16(0x0004)
+
+struct smb2_tree_connect_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 9 */
+       __le16 Flags;           /* Flags in SMB3.1.1 */
+       __le16 PathOffset;
+       __le16 PathLength;
+       __u8   Buffer[1];       /* variable length */
+} __packed;
+
+/* Possible ShareType values */
+#define SMB2_SHARE_TYPE_DISK   0x01
+#define SMB2_SHARE_TYPE_PIPE   0x02
+#define        SMB2_SHARE_TYPE_PRINT   0x03
+
+/*
+ * Possible ShareFlags - exactly one and only one of the first 4 caching flags
+ * must be set (any of the remaining, SHI1005, flags may be set individually
+ * or in combination.
+ */
+#define SMB2_SHAREFLAG_MANUAL_CACHING                  0x00000000
+#define SMB2_SHAREFLAG_AUTO_CACHING                    0x00000010
+#define SMB2_SHAREFLAG_VDO_CACHING                     0x00000020
+#define SMB2_SHAREFLAG_NO_CACHING                      0x00000030
+#define SHI1005_FLAGS_DFS                              0x00000001
+#define SHI1005_FLAGS_DFS_ROOT                         0x00000002
+#define SHI1005_FLAGS_RESTRICT_EXCLUSIVE_OPENS         0x00000100
+#define SHI1005_FLAGS_FORCE_SHARED_DELETE              0x00000200
+#define SHI1005_FLAGS_ALLOW_NAMESPACE_CACHING          0x00000400
+#define SHI1005_FLAGS_ACCESS_BASED_DIRECTORY_ENUM      0x00000800
+#define SHI1005_FLAGS_FORCE_LEVELII_OPLOCK             0x00001000
+#define SHI1005_FLAGS_ENABLE_HASH_V1                   0x00002000
+#define SHI1005_FLAGS_ENABLE_HASH_V2                   0x00004000
+#define SHI1005_FLAGS_ENCRYPT_DATA                     0x00008000
+#define SMB2_SHAREFLAG_IDENTITY_REMOTING               0x00040000 /* 3.1.1 */
+#define SMB2_SHAREFLAG_COMPRESS_DATA                   0x00100000 /* 3.1.1 */
+#define SHI1005_FLAGS_ALL                              0x0014FF33
+
+/* Possible share capabilities */
+#define SMB2_SHARE_CAP_DFS     cpu_to_le32(0x00000008) /* all dialects */
+#define SMB2_SHARE_CAP_CONTINUOUS_AVAILABILITY cpu_to_le32(0x00000010) /* 3.0 */
+#define SMB2_SHARE_CAP_SCALEOUT        cpu_to_le32(0x00000020) /* 3.0 */
+#define SMB2_SHARE_CAP_CLUSTER cpu_to_le32(0x00000040) /* 3.0 */
+#define SMB2_SHARE_CAP_ASYMMETRIC cpu_to_le32(0x00000080) /* 3.02 */
+#define SMB2_SHARE_CAP_REDIRECT_TO_OWNER cpu_to_le32(0x00000100) /* 3.1.1 */
+
+struct smb2_tree_connect_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 16 */
+       __u8   ShareType;       /* see below */
+       __u8   Reserved;
+       __le32 ShareFlags;      /* see below */
+       __le32 Capabilities;    /* see below */
+       __le32 MaximalAccess;
+} __packed;
+
+struct smb2_tree_disconnect_req {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 4 */
+       __le16 Reserved;
+} __packed;
+
+struct smb2_tree_disconnect_rsp {
+       struct smb2_hdr hdr;
+       __le16 StructureSize;   /* Must be 4 */
+       __le16 Reserved;
+} __packed;
+
+
+#endif                         /* _COMMON_SMB2PDU_H */