0001
0002
0003
0004
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
0195
0196
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
0212
0213
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
0236
0237
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
0260
0261
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 }