Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*
0003  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
0004  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
0005  */
0006 
0007 #include <linux/slab.h>
0008 #include "glob.h"
0009 
0010 #include "auth.h"
0011 #include "connection.h"
0012 #include "smb_common.h"
0013 #include "server.h"
0014 
0015 static struct smb_version_values smb21_server_values = {
0016     .version_string = SMB21_VERSION_STRING,
0017     .protocol_id = SMB21_PROT_ID,
0018     .capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
0019     .max_read_size = SMB21_DEFAULT_IOSIZE,
0020     .max_write_size = SMB21_DEFAULT_IOSIZE,
0021     .max_trans_size = SMB21_DEFAULT_IOSIZE,
0022     .max_credits = SMB2_MAX_CREDITS,
0023     .large_lock_type = 0,
0024     .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
0025     .shared_lock_type = SMB2_LOCKFLAG_SHARED,
0026     .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
0027     .header_size = sizeof(struct smb2_hdr),
0028     .max_header_size = MAX_SMB2_HDR_SIZE,
0029     .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
0030     .lock_cmd = SMB2_LOCK,
0031     .cap_unix = 0,
0032     .cap_nt_find = SMB2_NT_FIND,
0033     .cap_large_files = SMB2_LARGE_FILES,
0034     .create_lease_size = sizeof(struct create_lease),
0035     .create_durable_size = sizeof(struct create_durable_rsp),
0036     .create_mxac_size = sizeof(struct create_mxac_rsp),
0037     .create_disk_id_size = sizeof(struct create_disk_id_rsp),
0038     .create_posix_size = sizeof(struct create_posix_rsp),
0039 };
0040 
0041 static struct smb_version_values smb30_server_values = {
0042     .version_string = SMB30_VERSION_STRING,
0043     .protocol_id = SMB30_PROT_ID,
0044     .capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
0045     .max_read_size = SMB3_DEFAULT_IOSIZE,
0046     .max_write_size = SMB3_DEFAULT_IOSIZE,
0047     .max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
0048     .max_credits = SMB2_MAX_CREDITS,
0049     .large_lock_type = 0,
0050     .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
0051     .shared_lock_type = SMB2_LOCKFLAG_SHARED,
0052     .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
0053     .header_size = sizeof(struct smb2_hdr),
0054     .max_header_size = MAX_SMB2_HDR_SIZE,
0055     .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
0056     .lock_cmd = SMB2_LOCK,
0057     .cap_unix = 0,
0058     .cap_nt_find = SMB2_NT_FIND,
0059     .cap_large_files = SMB2_LARGE_FILES,
0060     .create_lease_size = sizeof(struct create_lease_v2),
0061     .create_durable_size = sizeof(struct create_durable_rsp),
0062     .create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
0063     .create_mxac_size = sizeof(struct create_mxac_rsp),
0064     .create_disk_id_size = sizeof(struct create_disk_id_rsp),
0065     .create_posix_size = sizeof(struct create_posix_rsp),
0066 };
0067 
0068 static struct smb_version_values smb302_server_values = {
0069     .version_string = SMB302_VERSION_STRING,
0070     .protocol_id = SMB302_PROT_ID,
0071     .capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
0072     .max_read_size = SMB3_DEFAULT_IOSIZE,
0073     .max_write_size = SMB3_DEFAULT_IOSIZE,
0074     .max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
0075     .max_credits = SMB2_MAX_CREDITS,
0076     .large_lock_type = 0,
0077     .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
0078     .shared_lock_type = SMB2_LOCKFLAG_SHARED,
0079     .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
0080     .header_size = sizeof(struct smb2_hdr),
0081     .max_header_size = MAX_SMB2_HDR_SIZE,
0082     .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
0083     .lock_cmd = SMB2_LOCK,
0084     .cap_unix = 0,
0085     .cap_nt_find = SMB2_NT_FIND,
0086     .cap_large_files = SMB2_LARGE_FILES,
0087     .create_lease_size = sizeof(struct create_lease_v2),
0088     .create_durable_size = sizeof(struct create_durable_rsp),
0089     .create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
0090     .create_mxac_size = sizeof(struct create_mxac_rsp),
0091     .create_disk_id_size = sizeof(struct create_disk_id_rsp),
0092     .create_posix_size = sizeof(struct create_posix_rsp),
0093 };
0094 
0095 static struct smb_version_values smb311_server_values = {
0096     .version_string = SMB311_VERSION_STRING,
0097     .protocol_id = SMB311_PROT_ID,
0098     .capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
0099     .max_read_size = SMB3_DEFAULT_IOSIZE,
0100     .max_write_size = SMB3_DEFAULT_IOSIZE,
0101     .max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
0102     .max_credits = SMB2_MAX_CREDITS,
0103     .large_lock_type = 0,
0104     .exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
0105     .shared_lock_type = SMB2_LOCKFLAG_SHARED,
0106     .unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
0107     .header_size = sizeof(struct smb2_hdr),
0108     .max_header_size = MAX_SMB2_HDR_SIZE,
0109     .read_rsp_size = sizeof(struct smb2_read_rsp) - 1,
0110     .lock_cmd = SMB2_LOCK,
0111     .cap_unix = 0,
0112     .cap_nt_find = SMB2_NT_FIND,
0113     .cap_large_files = SMB2_LARGE_FILES,
0114     .create_lease_size = sizeof(struct create_lease_v2),
0115     .create_durable_size = sizeof(struct create_durable_rsp),
0116     .create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
0117     .create_mxac_size = sizeof(struct create_mxac_rsp),
0118     .create_disk_id_size = sizeof(struct create_disk_id_rsp),
0119     .create_posix_size = sizeof(struct create_posix_rsp),
0120 };
0121 
0122 static struct smb_version_ops smb2_0_server_ops = {
0123     .get_cmd_val        =   get_smb2_cmd_val,
0124     .init_rsp_hdr       =   init_smb2_rsp_hdr,
0125     .set_rsp_status     =   set_smb2_rsp_status,
0126     .allocate_rsp_buf       =       smb2_allocate_rsp_buf,
0127     .set_rsp_credits    =   smb2_set_rsp_credits,
0128     .check_user_session =   smb2_check_user_session,
0129     .get_ksmbd_tcon     =   smb2_get_ksmbd_tcon,
0130     .is_sign_req        =   smb2_is_sign_req,
0131     .check_sign_req     =   smb2_check_sign_req,
0132     .set_sign_rsp       =   smb2_set_sign_rsp
0133 };
0134 
0135 static struct smb_version_ops smb3_0_server_ops = {
0136     .get_cmd_val        =   get_smb2_cmd_val,
0137     .init_rsp_hdr       =   init_smb2_rsp_hdr,
0138     .set_rsp_status     =   set_smb2_rsp_status,
0139     .allocate_rsp_buf       =       smb2_allocate_rsp_buf,
0140     .set_rsp_credits    =   smb2_set_rsp_credits,
0141     .check_user_session =   smb2_check_user_session,
0142     .get_ksmbd_tcon     =   smb2_get_ksmbd_tcon,
0143     .is_sign_req        =   smb2_is_sign_req,
0144     .check_sign_req     =   smb3_check_sign_req,
0145     .set_sign_rsp       =   smb3_set_sign_rsp,
0146     .generate_signingkey    =   ksmbd_gen_smb30_signingkey,
0147     .generate_encryptionkey =   ksmbd_gen_smb30_encryptionkey,
0148     .is_transform_hdr   =   smb3_is_transform_hdr,
0149     .decrypt_req        =   smb3_decrypt_req,
0150     .encrypt_resp       =   smb3_encrypt_resp
0151 };
0152 
0153 static struct smb_version_ops smb3_11_server_ops = {
0154     .get_cmd_val        =   get_smb2_cmd_val,
0155     .init_rsp_hdr       =   init_smb2_rsp_hdr,
0156     .set_rsp_status     =   set_smb2_rsp_status,
0157     .allocate_rsp_buf       =       smb2_allocate_rsp_buf,
0158     .set_rsp_credits    =   smb2_set_rsp_credits,
0159     .check_user_session =   smb2_check_user_session,
0160     .get_ksmbd_tcon     =   smb2_get_ksmbd_tcon,
0161     .is_sign_req        =   smb2_is_sign_req,
0162     .check_sign_req     =   smb3_check_sign_req,
0163     .set_sign_rsp       =   smb3_set_sign_rsp,
0164     .generate_signingkey    =   ksmbd_gen_smb311_signingkey,
0165     .generate_encryptionkey =   ksmbd_gen_smb311_encryptionkey,
0166     .is_transform_hdr   =   smb3_is_transform_hdr,
0167     .decrypt_req        =   smb3_decrypt_req,
0168     .encrypt_resp       =   smb3_encrypt_resp
0169 };
0170 
0171 static struct smb_version_cmds smb2_0_server_cmds[NUMBER_OF_SMB2_COMMANDS] = {
0172     [SMB2_NEGOTIATE_HE] =   { .proc = smb2_negotiate_request, },
0173     [SMB2_SESSION_SETUP_HE] =   { .proc = smb2_sess_setup, },
0174     [SMB2_TREE_CONNECT_HE]  =   { .proc = smb2_tree_connect,},
0175     [SMB2_TREE_DISCONNECT_HE]  =    { .proc = smb2_tree_disconnect,},
0176     [SMB2_LOGOFF_HE]    =   { .proc = smb2_session_logoff,},
0177     [SMB2_CREATE_HE]    =   { .proc = smb2_open},
0178     [SMB2_QUERY_INFO_HE]    =   { .proc = smb2_query_info},
0179     [SMB2_QUERY_DIRECTORY_HE] = { .proc = smb2_query_dir},
0180     [SMB2_CLOSE_HE]     =   { .proc = smb2_close},
0181     [SMB2_ECHO_HE]      =   { .proc = smb2_echo},
0182     [SMB2_SET_INFO_HE]      =       { .proc = smb2_set_info},
0183     [SMB2_READ_HE]      =   { .proc = smb2_read},
0184     [SMB2_WRITE_HE]     =   { .proc = smb2_write},
0185     [SMB2_FLUSH_HE]     =   { .proc = smb2_flush},
0186     [SMB2_CANCEL_HE]    =   { .proc = smb2_cancel},
0187     [SMB2_LOCK_HE]      =   { .proc = smb2_lock},
0188     [SMB2_IOCTL_HE]     =   { .proc = smb2_ioctl},
0189     [SMB2_OPLOCK_BREAK_HE]  =   { .proc = smb2_oplock_break},
0190     [SMB2_CHANGE_NOTIFY_HE] =   { .proc = smb2_notify},
0191 };
0192 
0193 /**
0194  * init_smb2_1_server() - initialize a smb server connection with smb2.1
0195  *          command dispatcher
0196  * @conn:   connection instance
0197  */
0198 void init_smb2_1_server(struct ksmbd_conn *conn)
0199 {
0200     conn->vals = &smb21_server_values;
0201     conn->ops = &smb2_0_server_ops;
0202     conn->cmds = smb2_0_server_cmds;
0203     conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
0204     conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE;
0205 
0206     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
0207         conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
0208 }
0209 
0210 /**
0211  * init_smb3_0_server() - initialize a smb server connection with smb3.0
0212  *          command dispatcher
0213  * @conn:   connection instance
0214  */
0215 void init_smb3_0_server(struct ksmbd_conn *conn)
0216 {
0217     conn->vals = &smb30_server_values;
0218     conn->ops = &smb3_0_server_ops;
0219     conn->cmds = smb2_0_server_cmds;
0220     conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
0221     conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
0222 
0223     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
0224         conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
0225 
0226     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
0227         conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
0228         conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
0229 
0230     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
0231         conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
0232 }
0233 
0234 /**
0235  * init_smb3_02_server() - initialize a smb server connection with smb3.02
0236  *          command dispatcher
0237  * @conn:   connection instance
0238  */
0239 void init_smb3_02_server(struct ksmbd_conn *conn)
0240 {
0241     conn->vals = &smb302_server_values;
0242     conn->ops = &smb3_0_server_ops;
0243     conn->cmds = smb2_0_server_cmds;
0244     conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
0245     conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
0246 
0247     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
0248         conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
0249 
0250     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
0251         conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
0252         conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
0253 
0254     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
0255         conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
0256 }
0257 
0258 /**
0259  * init_smb3_11_server() - initialize a smb server connection with smb3.11
0260  *          command dispatcher
0261  * @conn:   connection instance
0262  */
0263 int init_smb3_11_server(struct ksmbd_conn *conn)
0264 {
0265     conn->vals = &smb311_server_values;
0266     conn->ops = &smb3_11_server_ops;
0267     conn->cmds = smb2_0_server_cmds;
0268     conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
0269     conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
0270 
0271     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
0272         conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
0273 
0274     if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
0275         conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
0276 
0277     INIT_LIST_HEAD(&conn->preauth_sess_table);
0278     return 0;
0279 }
0280 
0281 void init_smb2_max_read_size(unsigned int sz)
0282 {
0283     sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
0284     smb21_server_values.max_read_size = sz;
0285     smb30_server_values.max_read_size = sz;
0286     smb302_server_values.max_read_size = sz;
0287     smb311_server_values.max_read_size = sz;
0288 }
0289 
0290 void init_smb2_max_write_size(unsigned int sz)
0291 {
0292     sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
0293     smb21_server_values.max_write_size = sz;
0294     smb30_server_values.max_write_size = sz;
0295     smb302_server_values.max_write_size = sz;
0296     smb311_server_values.max_write_size = sz;
0297 }
0298 
0299 void init_smb2_max_trans_size(unsigned int sz)
0300 {
0301     sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
0302     smb21_server_values.max_trans_size = sz;
0303     smb30_server_values.max_trans_size = sz;
0304     smb302_server_values.max_trans_size = sz;
0305     smb311_server_values.max_trans_size = sz;
0306 }
0307 
0308 void init_smb2_max_credits(unsigned int sz)
0309 {
0310     smb21_server_values.max_credits = sz;
0311     smb30_server_values.max_credits = sz;
0312     smb302_server_values.max_credits = sz;
0313     smb311_server_values.max_credits = sz;
0314 }