xref: /openbmc/linux/fs/smb/server/smb2ops.c (revision 8df4bcdb)
138c8a9a5SSteve French // SPDX-License-Identifier: GPL-2.0-or-later
238c8a9a5SSteve French /*
338c8a9a5SSteve French  *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
438c8a9a5SSteve French  *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
538c8a9a5SSteve French  */
638c8a9a5SSteve French 
738c8a9a5SSteve French #include <linux/slab.h>
838c8a9a5SSteve French #include "glob.h"
938c8a9a5SSteve French 
1038c8a9a5SSteve French #include "auth.h"
1138c8a9a5SSteve French #include "connection.h"
1238c8a9a5SSteve French #include "smb_common.h"
1338c8a9a5SSteve French #include "server.h"
1438c8a9a5SSteve French 
1538c8a9a5SSteve French static struct smb_version_values smb21_server_values = {
1638c8a9a5SSteve French 	.version_string = SMB21_VERSION_STRING,
1738c8a9a5SSteve French 	.protocol_id = SMB21_PROT_ID,
1838c8a9a5SSteve French 	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
1938c8a9a5SSteve French 	.max_read_size = SMB21_DEFAULT_IOSIZE,
2038c8a9a5SSteve French 	.max_write_size = SMB21_DEFAULT_IOSIZE,
2138c8a9a5SSteve French 	.max_trans_size = SMB21_DEFAULT_IOSIZE,
2238c8a9a5SSteve French 	.max_credits = SMB2_MAX_CREDITS,
2338c8a9a5SSteve French 	.large_lock_type = 0,
2438c8a9a5SSteve French 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
2538c8a9a5SSteve French 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
2638c8a9a5SSteve French 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2738c8a9a5SSteve French 	.header_size = sizeof(struct smb2_hdr),
2838c8a9a5SSteve French 	.max_header_size = MAX_SMB2_HDR_SIZE,
2938c8a9a5SSteve French 	.read_rsp_size = sizeof(struct smb2_read_rsp),
3038c8a9a5SSteve French 	.lock_cmd = SMB2_LOCK,
3138c8a9a5SSteve French 	.cap_unix = 0,
3238c8a9a5SSteve French 	.cap_nt_find = SMB2_NT_FIND,
3338c8a9a5SSteve French 	.cap_large_files = SMB2_LARGE_FILES,
3438c8a9a5SSteve French 	.create_lease_size = sizeof(struct create_lease),
3538c8a9a5SSteve French 	.create_durable_size = sizeof(struct create_durable_rsp),
3638c8a9a5SSteve French 	.create_mxac_size = sizeof(struct create_mxac_rsp),
3738c8a9a5SSteve French 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
3838c8a9a5SSteve French 	.create_posix_size = sizeof(struct create_posix_rsp),
3938c8a9a5SSteve French };
4038c8a9a5SSteve French 
4138c8a9a5SSteve French static struct smb_version_values smb30_server_values = {
4238c8a9a5SSteve French 	.version_string = SMB30_VERSION_STRING,
4338c8a9a5SSteve French 	.protocol_id = SMB30_PROT_ID,
4438c8a9a5SSteve French 	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
4538c8a9a5SSteve French 	.max_read_size = SMB3_DEFAULT_IOSIZE,
4638c8a9a5SSteve French 	.max_write_size = SMB3_DEFAULT_IOSIZE,
4738c8a9a5SSteve French 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
4838c8a9a5SSteve French 	.max_credits = SMB2_MAX_CREDITS,
4938c8a9a5SSteve French 	.large_lock_type = 0,
5038c8a9a5SSteve French 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
5138c8a9a5SSteve French 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
5238c8a9a5SSteve French 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
5338c8a9a5SSteve French 	.header_size = sizeof(struct smb2_hdr),
5438c8a9a5SSteve French 	.max_header_size = MAX_SMB2_HDR_SIZE,
5538c8a9a5SSteve French 	.read_rsp_size = sizeof(struct smb2_read_rsp),
5638c8a9a5SSteve French 	.lock_cmd = SMB2_LOCK,
5738c8a9a5SSteve French 	.cap_unix = 0,
5838c8a9a5SSteve French 	.cap_nt_find = SMB2_NT_FIND,
5938c8a9a5SSteve French 	.cap_large_files = SMB2_LARGE_FILES,
6038c8a9a5SSteve French 	.create_lease_size = sizeof(struct create_lease_v2),
6138c8a9a5SSteve French 	.create_durable_size = sizeof(struct create_durable_rsp),
6238c8a9a5SSteve French 	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
6338c8a9a5SSteve French 	.create_mxac_size = sizeof(struct create_mxac_rsp),
6438c8a9a5SSteve French 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
6538c8a9a5SSteve French 	.create_posix_size = sizeof(struct create_posix_rsp),
6638c8a9a5SSteve French };
6738c8a9a5SSteve French 
6838c8a9a5SSteve French static struct smb_version_values smb302_server_values = {
6938c8a9a5SSteve French 	.version_string = SMB302_VERSION_STRING,
7038c8a9a5SSteve French 	.protocol_id = SMB302_PROT_ID,
7138c8a9a5SSteve French 	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
7238c8a9a5SSteve French 	.max_read_size = SMB3_DEFAULT_IOSIZE,
7338c8a9a5SSteve French 	.max_write_size = SMB3_DEFAULT_IOSIZE,
7438c8a9a5SSteve French 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
7538c8a9a5SSteve French 	.max_credits = SMB2_MAX_CREDITS,
7638c8a9a5SSteve French 	.large_lock_type = 0,
7738c8a9a5SSteve French 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
7838c8a9a5SSteve French 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
7938c8a9a5SSteve French 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
8038c8a9a5SSteve French 	.header_size = sizeof(struct smb2_hdr),
8138c8a9a5SSteve French 	.max_header_size = MAX_SMB2_HDR_SIZE,
8238c8a9a5SSteve French 	.read_rsp_size = sizeof(struct smb2_read_rsp),
8338c8a9a5SSteve French 	.lock_cmd = SMB2_LOCK,
8438c8a9a5SSteve French 	.cap_unix = 0,
8538c8a9a5SSteve French 	.cap_nt_find = SMB2_NT_FIND,
8638c8a9a5SSteve French 	.cap_large_files = SMB2_LARGE_FILES,
8738c8a9a5SSteve French 	.create_lease_size = sizeof(struct create_lease_v2),
8838c8a9a5SSteve French 	.create_durable_size = sizeof(struct create_durable_rsp),
8938c8a9a5SSteve French 	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
9038c8a9a5SSteve French 	.create_mxac_size = sizeof(struct create_mxac_rsp),
9138c8a9a5SSteve French 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
9238c8a9a5SSteve French 	.create_posix_size = sizeof(struct create_posix_rsp),
9338c8a9a5SSteve French };
9438c8a9a5SSteve French 
9538c8a9a5SSteve French static struct smb_version_values smb311_server_values = {
9638c8a9a5SSteve French 	.version_string = SMB311_VERSION_STRING,
9738c8a9a5SSteve French 	.protocol_id = SMB311_PROT_ID,
9838c8a9a5SSteve French 	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
9938c8a9a5SSteve French 	.max_read_size = SMB3_DEFAULT_IOSIZE,
10038c8a9a5SSteve French 	.max_write_size = SMB3_DEFAULT_IOSIZE,
10138c8a9a5SSteve French 	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
10238c8a9a5SSteve French 	.max_credits = SMB2_MAX_CREDITS,
10338c8a9a5SSteve French 	.large_lock_type = 0,
10438c8a9a5SSteve French 	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
10538c8a9a5SSteve French 	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
10638c8a9a5SSteve French 	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
10738c8a9a5SSteve French 	.header_size = sizeof(struct smb2_hdr),
10838c8a9a5SSteve French 	.max_header_size = MAX_SMB2_HDR_SIZE,
10938c8a9a5SSteve French 	.read_rsp_size = sizeof(struct smb2_read_rsp),
11038c8a9a5SSteve French 	.lock_cmd = SMB2_LOCK,
11138c8a9a5SSteve French 	.cap_unix = 0,
11238c8a9a5SSteve French 	.cap_nt_find = SMB2_NT_FIND,
11338c8a9a5SSteve French 	.cap_large_files = SMB2_LARGE_FILES,
11438c8a9a5SSteve French 	.create_lease_size = sizeof(struct create_lease_v2),
11538c8a9a5SSteve French 	.create_durable_size = sizeof(struct create_durable_rsp),
11638c8a9a5SSteve French 	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
11738c8a9a5SSteve French 	.create_mxac_size = sizeof(struct create_mxac_rsp),
11838c8a9a5SSteve French 	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
11938c8a9a5SSteve French 	.create_posix_size = sizeof(struct create_posix_rsp),
12038c8a9a5SSteve French };
12138c8a9a5SSteve French 
12238c8a9a5SSteve French static struct smb_version_ops smb2_0_server_ops = {
12338c8a9a5SSteve French 	.get_cmd_val		=	get_smb2_cmd_val,
12438c8a9a5SSteve French 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
12538c8a9a5SSteve French 	.set_rsp_status		=	set_smb2_rsp_status,
12638c8a9a5SSteve French 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
12738c8a9a5SSteve French 	.set_rsp_credits	=	smb2_set_rsp_credits,
12838c8a9a5SSteve French 	.check_user_session	=	smb2_check_user_session,
12938c8a9a5SSteve French 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
13038c8a9a5SSteve French 	.is_sign_req		=	smb2_is_sign_req,
13138c8a9a5SSteve French 	.check_sign_req		=	smb2_check_sign_req,
13238c8a9a5SSteve French 	.set_sign_rsp		=	smb2_set_sign_rsp
13338c8a9a5SSteve French };
13438c8a9a5SSteve French 
13538c8a9a5SSteve French static struct smb_version_ops smb3_0_server_ops = {
13638c8a9a5SSteve French 	.get_cmd_val		=	get_smb2_cmd_val,
13738c8a9a5SSteve French 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
13838c8a9a5SSteve French 	.set_rsp_status		=	set_smb2_rsp_status,
13938c8a9a5SSteve French 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
14038c8a9a5SSteve French 	.set_rsp_credits	=	smb2_set_rsp_credits,
14138c8a9a5SSteve French 	.check_user_session	=	smb2_check_user_session,
14238c8a9a5SSteve French 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
14338c8a9a5SSteve French 	.is_sign_req		=	smb2_is_sign_req,
14438c8a9a5SSteve French 	.check_sign_req		=	smb3_check_sign_req,
14538c8a9a5SSteve French 	.set_sign_rsp		=	smb3_set_sign_rsp,
14638c8a9a5SSteve French 	.generate_signingkey	=	ksmbd_gen_smb30_signingkey,
14738c8a9a5SSteve French 	.generate_encryptionkey	=	ksmbd_gen_smb30_encryptionkey,
14838c8a9a5SSteve French 	.is_transform_hdr	=	smb3_is_transform_hdr,
14938c8a9a5SSteve French 	.decrypt_req		=	smb3_decrypt_req,
15038c8a9a5SSteve French 	.encrypt_resp		=	smb3_encrypt_resp
15138c8a9a5SSteve French };
15238c8a9a5SSteve French 
15338c8a9a5SSteve French static struct smb_version_ops smb3_11_server_ops = {
15438c8a9a5SSteve French 	.get_cmd_val		=	get_smb2_cmd_val,
15538c8a9a5SSteve French 	.init_rsp_hdr		=	init_smb2_rsp_hdr,
15638c8a9a5SSteve French 	.set_rsp_status		=	set_smb2_rsp_status,
15738c8a9a5SSteve French 	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
15838c8a9a5SSteve French 	.set_rsp_credits	=	smb2_set_rsp_credits,
15938c8a9a5SSteve French 	.check_user_session	=	smb2_check_user_session,
16038c8a9a5SSteve French 	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
16138c8a9a5SSteve French 	.is_sign_req		=	smb2_is_sign_req,
16238c8a9a5SSteve French 	.check_sign_req		=	smb3_check_sign_req,
16338c8a9a5SSteve French 	.set_sign_rsp		=	smb3_set_sign_rsp,
16438c8a9a5SSteve French 	.generate_signingkey	=	ksmbd_gen_smb311_signingkey,
16538c8a9a5SSteve French 	.generate_encryptionkey	=	ksmbd_gen_smb311_encryptionkey,
16638c8a9a5SSteve French 	.is_transform_hdr	=	smb3_is_transform_hdr,
16738c8a9a5SSteve French 	.decrypt_req		=	smb3_decrypt_req,
16838c8a9a5SSteve French 	.encrypt_resp		=	smb3_encrypt_resp
16938c8a9a5SSteve French };
17038c8a9a5SSteve French 
17138c8a9a5SSteve French static struct smb_version_cmds smb2_0_server_cmds[NUMBER_OF_SMB2_COMMANDS] = {
17238c8a9a5SSteve French 	[SMB2_NEGOTIATE_HE]	=	{ .proc = smb2_negotiate_request, },
17338c8a9a5SSteve French 	[SMB2_SESSION_SETUP_HE] =	{ .proc = smb2_sess_setup, },
17438c8a9a5SSteve French 	[SMB2_TREE_CONNECT_HE]  =	{ .proc = smb2_tree_connect,},
17538c8a9a5SSteve French 	[SMB2_TREE_DISCONNECT_HE]  =	{ .proc = smb2_tree_disconnect,},
17638c8a9a5SSteve French 	[SMB2_LOGOFF_HE]	=	{ .proc = smb2_session_logoff,},
17738c8a9a5SSteve French 	[SMB2_CREATE_HE]	=	{ .proc = smb2_open},
17838c8a9a5SSteve French 	[SMB2_QUERY_INFO_HE]	=	{ .proc = smb2_query_info},
17938c8a9a5SSteve French 	[SMB2_QUERY_DIRECTORY_HE] =	{ .proc = smb2_query_dir},
18038c8a9a5SSteve French 	[SMB2_CLOSE_HE]		=	{ .proc = smb2_close},
18138c8a9a5SSteve French 	[SMB2_ECHO_HE]		=	{ .proc = smb2_echo},
18238c8a9a5SSteve French 	[SMB2_SET_INFO_HE]      =       { .proc = smb2_set_info},
18338c8a9a5SSteve French 	[SMB2_READ_HE]		=	{ .proc = smb2_read},
18438c8a9a5SSteve French 	[SMB2_WRITE_HE]		=	{ .proc = smb2_write},
18538c8a9a5SSteve French 	[SMB2_FLUSH_HE]		=	{ .proc = smb2_flush},
18638c8a9a5SSteve French 	[SMB2_CANCEL_HE]	=	{ .proc = smb2_cancel},
18738c8a9a5SSteve French 	[SMB2_LOCK_HE]		=	{ .proc = smb2_lock},
18838c8a9a5SSteve French 	[SMB2_IOCTL_HE]		=	{ .proc = smb2_ioctl},
18938c8a9a5SSteve French 	[SMB2_OPLOCK_BREAK_HE]	=	{ .proc = smb2_oplock_break},
19038c8a9a5SSteve French 	[SMB2_CHANGE_NOTIFY_HE]	=	{ .proc = smb2_notify},
19138c8a9a5SSteve French };
19238c8a9a5SSteve French 
19338c8a9a5SSteve French /**
19438c8a9a5SSteve French  * init_smb2_1_server() - initialize a smb server connection with smb2.1
19538c8a9a5SSteve French  *			command dispatcher
19638c8a9a5SSteve French  * @conn:	connection instance
19738c8a9a5SSteve French  */
init_smb2_1_server(struct ksmbd_conn * conn)19838c8a9a5SSteve French void init_smb2_1_server(struct ksmbd_conn *conn)
19938c8a9a5SSteve French {
20038c8a9a5SSteve French 	conn->vals = &smb21_server_values;
20138c8a9a5SSteve French 	conn->ops = &smb2_0_server_ops;
20238c8a9a5SSteve French 	conn->cmds = smb2_0_server_cmds;
20338c8a9a5SSteve French 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
20438c8a9a5SSteve French 	conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE;
20538c8a9a5SSteve French 
20638c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
20738c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
20838c8a9a5SSteve French }
20938c8a9a5SSteve French 
21038c8a9a5SSteve French /**
21138c8a9a5SSteve French  * init_smb3_0_server() - initialize a smb server connection with smb3.0
21238c8a9a5SSteve French  *			command dispatcher
21338c8a9a5SSteve French  * @conn:	connection instance
21438c8a9a5SSteve French  */
init_smb3_0_server(struct ksmbd_conn * conn)21538c8a9a5SSteve French void init_smb3_0_server(struct ksmbd_conn *conn)
21638c8a9a5SSteve French {
21738c8a9a5SSteve French 	conn->vals = &smb30_server_values;
21838c8a9a5SSteve French 	conn->ops = &smb3_0_server_ops;
21938c8a9a5SSteve French 	conn->cmds = smb2_0_server_cmds;
22038c8a9a5SSteve French 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
22138c8a9a5SSteve French 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
22238c8a9a5SSteve French 
22338c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
224d7af4e49SNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
225d7af4e49SNamjae Jeon 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
22638c8a9a5SSteve French 
22738c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
22838c8a9a5SSteve French 	    conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
22938c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
23038c8a9a5SSteve French 
23167c477f3SNamjae Jeon 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
23267c477f3SNamjae Jeon 	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
23367c477f3SNamjae Jeon 	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
23467c477f3SNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
23567c477f3SNamjae Jeon 
23638c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
23738c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
23838c8a9a5SSteve French }
23938c8a9a5SSteve French 
24038c8a9a5SSteve French /**
24138c8a9a5SSteve French  * init_smb3_02_server() - initialize a smb server connection with smb3.02
24238c8a9a5SSteve French  *			command dispatcher
24338c8a9a5SSteve French  * @conn:	connection instance
24438c8a9a5SSteve French  */
init_smb3_02_server(struct ksmbd_conn * conn)24538c8a9a5SSteve French void init_smb3_02_server(struct ksmbd_conn *conn)
24638c8a9a5SSteve French {
24738c8a9a5SSteve French 	conn->vals = &smb302_server_values;
24838c8a9a5SSteve French 	conn->ops = &smb3_0_server_ops;
24938c8a9a5SSteve French 	conn->cmds = smb2_0_server_cmds;
25038c8a9a5SSteve French 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
25138c8a9a5SSteve French 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
25238c8a9a5SSteve French 
25338c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
254d7af4e49SNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
255d7af4e49SNamjae Jeon 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
25638c8a9a5SSteve French 
25738c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
25838c8a9a5SSteve French 	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
25938c8a9a5SSteve French 	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
26038c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
26138c8a9a5SSteve French 
26238c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
26338c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
2648df4bcdbSNamjae Jeon 
2658df4bcdbSNamjae Jeon 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_DURABLE_HANDLE)
2668df4bcdbSNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_PERSISTENT_HANDLES;
26738c8a9a5SSteve French }
26838c8a9a5SSteve French 
26938c8a9a5SSteve French /**
27038c8a9a5SSteve French  * init_smb3_11_server() - initialize a smb server connection with smb3.11
27138c8a9a5SSteve French  *			command dispatcher
27238c8a9a5SSteve French  * @conn:	connection instance
27338c8a9a5SSteve French  */
init_smb3_11_server(struct ksmbd_conn * conn)27438c8a9a5SSteve French int init_smb3_11_server(struct ksmbd_conn *conn)
27538c8a9a5SSteve French {
27638c8a9a5SSteve French 	conn->vals = &smb311_server_values;
27738c8a9a5SSteve French 	conn->ops = &smb3_11_server_ops;
27838c8a9a5SSteve French 	conn->cmds = smb2_0_server_cmds;
27938c8a9a5SSteve French 	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
28038c8a9a5SSteve French 	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
28138c8a9a5SSteve French 
28238c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
283d7af4e49SNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
284d7af4e49SNamjae Jeon 			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
28538c8a9a5SSteve French 
28638c8a9a5SSteve French 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
28738c8a9a5SSteve French 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
28838c8a9a5SSteve French 
2898df4bcdbSNamjae Jeon 	if (server_conf.flags & KSMBD_GLOBAL_FLAG_DURABLE_HANDLE)
2908df4bcdbSNamjae Jeon 		conn->vals->capabilities |= SMB2_GLOBAL_CAP_PERSISTENT_HANDLES;
2918df4bcdbSNamjae Jeon 
29238c8a9a5SSteve French 	INIT_LIST_HEAD(&conn->preauth_sess_table);
29338c8a9a5SSteve French 	return 0;
29438c8a9a5SSteve French }
29538c8a9a5SSteve French 
init_smb2_max_read_size(unsigned int sz)29638c8a9a5SSteve French void init_smb2_max_read_size(unsigned int sz)
29738c8a9a5SSteve French {
29838c8a9a5SSteve French 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
29938c8a9a5SSteve French 	smb21_server_values.max_read_size = sz;
30038c8a9a5SSteve French 	smb30_server_values.max_read_size = sz;
30138c8a9a5SSteve French 	smb302_server_values.max_read_size = sz;
30238c8a9a5SSteve French 	smb311_server_values.max_read_size = sz;
30338c8a9a5SSteve French }
30438c8a9a5SSteve French 
init_smb2_max_write_size(unsigned int sz)30538c8a9a5SSteve French void init_smb2_max_write_size(unsigned int sz)
30638c8a9a5SSteve French {
30738c8a9a5SSteve French 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
30838c8a9a5SSteve French 	smb21_server_values.max_write_size = sz;
30938c8a9a5SSteve French 	smb30_server_values.max_write_size = sz;
31038c8a9a5SSteve French 	smb302_server_values.max_write_size = sz;
31138c8a9a5SSteve French 	smb311_server_values.max_write_size = sz;
31238c8a9a5SSteve French }
31338c8a9a5SSteve French 
init_smb2_max_trans_size(unsigned int sz)31438c8a9a5SSteve French void init_smb2_max_trans_size(unsigned int sz)
31538c8a9a5SSteve French {
31638c8a9a5SSteve French 	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
31738c8a9a5SSteve French 	smb21_server_values.max_trans_size = sz;
31838c8a9a5SSteve French 	smb30_server_values.max_trans_size = sz;
31938c8a9a5SSteve French 	smb302_server_values.max_trans_size = sz;
32038c8a9a5SSteve French 	smb311_server_values.max_trans_size = sz;
32138c8a9a5SSteve French }
32238c8a9a5SSteve French 
init_smb2_max_credits(unsigned int sz)32338c8a9a5SSteve French void init_smb2_max_credits(unsigned int sz)
32438c8a9a5SSteve French {
32538c8a9a5SSteve French 	smb21_server_values.max_credits = sz;
32638c8a9a5SSteve French 	smb30_server_values.max_credits = sz;
32738c8a9a5SSteve French 	smb302_server_values.max_credits = sz;
32838c8a9a5SSteve French 	smb311_server_values.max_credits = sz;
32938c8a9a5SSteve French }
330