162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *   Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
462306a36Sopenharmony_ci *   Copyright (C) 2018 Samsung Electronics Co., Ltd.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/slab.h>
862306a36Sopenharmony_ci#include "glob.h"
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include "auth.h"
1162306a36Sopenharmony_ci#include "connection.h"
1262306a36Sopenharmony_ci#include "smb_common.h"
1362306a36Sopenharmony_ci#include "server.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_cistatic struct smb_version_values smb21_server_values = {
1662306a36Sopenharmony_ci	.version_string = SMB21_VERSION_STRING,
1762306a36Sopenharmony_ci	.protocol_id = SMB21_PROT_ID,
1862306a36Sopenharmony_ci	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
1962306a36Sopenharmony_ci	.max_read_size = SMB21_DEFAULT_IOSIZE,
2062306a36Sopenharmony_ci	.max_write_size = SMB21_DEFAULT_IOSIZE,
2162306a36Sopenharmony_ci	.max_trans_size = SMB21_DEFAULT_IOSIZE,
2262306a36Sopenharmony_ci	.max_credits = SMB2_MAX_CREDITS,
2362306a36Sopenharmony_ci	.large_lock_type = 0,
2462306a36Sopenharmony_ci	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
2562306a36Sopenharmony_ci	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
2662306a36Sopenharmony_ci	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
2762306a36Sopenharmony_ci	.header_size = sizeof(struct smb2_hdr),
2862306a36Sopenharmony_ci	.max_header_size = MAX_SMB2_HDR_SIZE,
2962306a36Sopenharmony_ci	.read_rsp_size = sizeof(struct smb2_read_rsp),
3062306a36Sopenharmony_ci	.lock_cmd = SMB2_LOCK,
3162306a36Sopenharmony_ci	.cap_unix = 0,
3262306a36Sopenharmony_ci	.cap_nt_find = SMB2_NT_FIND,
3362306a36Sopenharmony_ci	.cap_large_files = SMB2_LARGE_FILES,
3462306a36Sopenharmony_ci	.create_lease_size = sizeof(struct create_lease),
3562306a36Sopenharmony_ci	.create_durable_size = sizeof(struct create_durable_rsp),
3662306a36Sopenharmony_ci	.create_mxac_size = sizeof(struct create_mxac_rsp),
3762306a36Sopenharmony_ci	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
3862306a36Sopenharmony_ci	.create_posix_size = sizeof(struct create_posix_rsp),
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic struct smb_version_values smb30_server_values = {
4262306a36Sopenharmony_ci	.version_string = SMB30_VERSION_STRING,
4362306a36Sopenharmony_ci	.protocol_id = SMB30_PROT_ID,
4462306a36Sopenharmony_ci	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
4562306a36Sopenharmony_ci	.max_read_size = SMB3_DEFAULT_IOSIZE,
4662306a36Sopenharmony_ci	.max_write_size = SMB3_DEFAULT_IOSIZE,
4762306a36Sopenharmony_ci	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
4862306a36Sopenharmony_ci	.max_credits = SMB2_MAX_CREDITS,
4962306a36Sopenharmony_ci	.large_lock_type = 0,
5062306a36Sopenharmony_ci	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
5162306a36Sopenharmony_ci	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
5262306a36Sopenharmony_ci	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
5362306a36Sopenharmony_ci	.header_size = sizeof(struct smb2_hdr),
5462306a36Sopenharmony_ci	.max_header_size = MAX_SMB2_HDR_SIZE,
5562306a36Sopenharmony_ci	.read_rsp_size = sizeof(struct smb2_read_rsp),
5662306a36Sopenharmony_ci	.lock_cmd = SMB2_LOCK,
5762306a36Sopenharmony_ci	.cap_unix = 0,
5862306a36Sopenharmony_ci	.cap_nt_find = SMB2_NT_FIND,
5962306a36Sopenharmony_ci	.cap_large_files = SMB2_LARGE_FILES,
6062306a36Sopenharmony_ci	.create_lease_size = sizeof(struct create_lease_v2),
6162306a36Sopenharmony_ci	.create_durable_size = sizeof(struct create_durable_rsp),
6262306a36Sopenharmony_ci	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
6362306a36Sopenharmony_ci	.create_mxac_size = sizeof(struct create_mxac_rsp),
6462306a36Sopenharmony_ci	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
6562306a36Sopenharmony_ci	.create_posix_size = sizeof(struct create_posix_rsp),
6662306a36Sopenharmony_ci};
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic struct smb_version_values smb302_server_values = {
6962306a36Sopenharmony_ci	.version_string = SMB302_VERSION_STRING,
7062306a36Sopenharmony_ci	.protocol_id = SMB302_PROT_ID,
7162306a36Sopenharmony_ci	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
7262306a36Sopenharmony_ci	.max_read_size = SMB3_DEFAULT_IOSIZE,
7362306a36Sopenharmony_ci	.max_write_size = SMB3_DEFAULT_IOSIZE,
7462306a36Sopenharmony_ci	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
7562306a36Sopenharmony_ci	.max_credits = SMB2_MAX_CREDITS,
7662306a36Sopenharmony_ci	.large_lock_type = 0,
7762306a36Sopenharmony_ci	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
7862306a36Sopenharmony_ci	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
7962306a36Sopenharmony_ci	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
8062306a36Sopenharmony_ci	.header_size = sizeof(struct smb2_hdr),
8162306a36Sopenharmony_ci	.max_header_size = MAX_SMB2_HDR_SIZE,
8262306a36Sopenharmony_ci	.read_rsp_size = sizeof(struct smb2_read_rsp),
8362306a36Sopenharmony_ci	.lock_cmd = SMB2_LOCK,
8462306a36Sopenharmony_ci	.cap_unix = 0,
8562306a36Sopenharmony_ci	.cap_nt_find = SMB2_NT_FIND,
8662306a36Sopenharmony_ci	.cap_large_files = SMB2_LARGE_FILES,
8762306a36Sopenharmony_ci	.create_lease_size = sizeof(struct create_lease_v2),
8862306a36Sopenharmony_ci	.create_durable_size = sizeof(struct create_durable_rsp),
8962306a36Sopenharmony_ci	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
9062306a36Sopenharmony_ci	.create_mxac_size = sizeof(struct create_mxac_rsp),
9162306a36Sopenharmony_ci	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
9262306a36Sopenharmony_ci	.create_posix_size = sizeof(struct create_posix_rsp),
9362306a36Sopenharmony_ci};
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_cistatic struct smb_version_values smb311_server_values = {
9662306a36Sopenharmony_ci	.version_string = SMB311_VERSION_STRING,
9762306a36Sopenharmony_ci	.protocol_id = SMB311_PROT_ID,
9862306a36Sopenharmony_ci	.capabilities = SMB2_GLOBAL_CAP_LARGE_MTU,
9962306a36Sopenharmony_ci	.max_read_size = SMB3_DEFAULT_IOSIZE,
10062306a36Sopenharmony_ci	.max_write_size = SMB3_DEFAULT_IOSIZE,
10162306a36Sopenharmony_ci	.max_trans_size = SMB3_DEFAULT_TRANS_SIZE,
10262306a36Sopenharmony_ci	.max_credits = SMB2_MAX_CREDITS,
10362306a36Sopenharmony_ci	.large_lock_type = 0,
10462306a36Sopenharmony_ci	.exclusive_lock_type = SMB2_LOCKFLAG_EXCLUSIVE,
10562306a36Sopenharmony_ci	.shared_lock_type = SMB2_LOCKFLAG_SHARED,
10662306a36Sopenharmony_ci	.unlock_lock_type = SMB2_LOCKFLAG_UNLOCK,
10762306a36Sopenharmony_ci	.header_size = sizeof(struct smb2_hdr),
10862306a36Sopenharmony_ci	.max_header_size = MAX_SMB2_HDR_SIZE,
10962306a36Sopenharmony_ci	.read_rsp_size = sizeof(struct smb2_read_rsp),
11062306a36Sopenharmony_ci	.lock_cmd = SMB2_LOCK,
11162306a36Sopenharmony_ci	.cap_unix = 0,
11262306a36Sopenharmony_ci	.cap_nt_find = SMB2_NT_FIND,
11362306a36Sopenharmony_ci	.cap_large_files = SMB2_LARGE_FILES,
11462306a36Sopenharmony_ci	.create_lease_size = sizeof(struct create_lease_v2),
11562306a36Sopenharmony_ci	.create_durable_size = sizeof(struct create_durable_rsp),
11662306a36Sopenharmony_ci	.create_durable_v2_size = sizeof(struct create_durable_v2_rsp),
11762306a36Sopenharmony_ci	.create_mxac_size = sizeof(struct create_mxac_rsp),
11862306a36Sopenharmony_ci	.create_disk_id_size = sizeof(struct create_disk_id_rsp),
11962306a36Sopenharmony_ci	.create_posix_size = sizeof(struct create_posix_rsp),
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic struct smb_version_ops smb2_0_server_ops = {
12362306a36Sopenharmony_ci	.get_cmd_val		=	get_smb2_cmd_val,
12462306a36Sopenharmony_ci	.init_rsp_hdr		=	init_smb2_rsp_hdr,
12562306a36Sopenharmony_ci	.set_rsp_status		=	set_smb2_rsp_status,
12662306a36Sopenharmony_ci	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
12762306a36Sopenharmony_ci	.set_rsp_credits	=	smb2_set_rsp_credits,
12862306a36Sopenharmony_ci	.check_user_session	=	smb2_check_user_session,
12962306a36Sopenharmony_ci	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
13062306a36Sopenharmony_ci	.is_sign_req		=	smb2_is_sign_req,
13162306a36Sopenharmony_ci	.check_sign_req		=	smb2_check_sign_req,
13262306a36Sopenharmony_ci	.set_sign_rsp		=	smb2_set_sign_rsp
13362306a36Sopenharmony_ci};
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_cistatic struct smb_version_ops smb3_0_server_ops = {
13662306a36Sopenharmony_ci	.get_cmd_val		=	get_smb2_cmd_val,
13762306a36Sopenharmony_ci	.init_rsp_hdr		=	init_smb2_rsp_hdr,
13862306a36Sopenharmony_ci	.set_rsp_status		=	set_smb2_rsp_status,
13962306a36Sopenharmony_ci	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
14062306a36Sopenharmony_ci	.set_rsp_credits	=	smb2_set_rsp_credits,
14162306a36Sopenharmony_ci	.check_user_session	=	smb2_check_user_session,
14262306a36Sopenharmony_ci	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
14362306a36Sopenharmony_ci	.is_sign_req		=	smb2_is_sign_req,
14462306a36Sopenharmony_ci	.check_sign_req		=	smb3_check_sign_req,
14562306a36Sopenharmony_ci	.set_sign_rsp		=	smb3_set_sign_rsp,
14662306a36Sopenharmony_ci	.generate_signingkey	=	ksmbd_gen_smb30_signingkey,
14762306a36Sopenharmony_ci	.generate_encryptionkey	=	ksmbd_gen_smb30_encryptionkey,
14862306a36Sopenharmony_ci	.is_transform_hdr	=	smb3_is_transform_hdr,
14962306a36Sopenharmony_ci	.decrypt_req		=	smb3_decrypt_req,
15062306a36Sopenharmony_ci	.encrypt_resp		=	smb3_encrypt_resp
15162306a36Sopenharmony_ci};
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_cistatic struct smb_version_ops smb3_11_server_ops = {
15462306a36Sopenharmony_ci	.get_cmd_val		=	get_smb2_cmd_val,
15562306a36Sopenharmony_ci	.init_rsp_hdr		=	init_smb2_rsp_hdr,
15662306a36Sopenharmony_ci	.set_rsp_status		=	set_smb2_rsp_status,
15762306a36Sopenharmony_ci	.allocate_rsp_buf       =       smb2_allocate_rsp_buf,
15862306a36Sopenharmony_ci	.set_rsp_credits	=	smb2_set_rsp_credits,
15962306a36Sopenharmony_ci	.check_user_session	=	smb2_check_user_session,
16062306a36Sopenharmony_ci	.get_ksmbd_tcon		=	smb2_get_ksmbd_tcon,
16162306a36Sopenharmony_ci	.is_sign_req		=	smb2_is_sign_req,
16262306a36Sopenharmony_ci	.check_sign_req		=	smb3_check_sign_req,
16362306a36Sopenharmony_ci	.set_sign_rsp		=	smb3_set_sign_rsp,
16462306a36Sopenharmony_ci	.generate_signingkey	=	ksmbd_gen_smb311_signingkey,
16562306a36Sopenharmony_ci	.generate_encryptionkey	=	ksmbd_gen_smb311_encryptionkey,
16662306a36Sopenharmony_ci	.is_transform_hdr	=	smb3_is_transform_hdr,
16762306a36Sopenharmony_ci	.decrypt_req		=	smb3_decrypt_req,
16862306a36Sopenharmony_ci	.encrypt_resp		=	smb3_encrypt_resp
16962306a36Sopenharmony_ci};
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_cistatic struct smb_version_cmds smb2_0_server_cmds[NUMBER_OF_SMB2_COMMANDS] = {
17262306a36Sopenharmony_ci	[SMB2_NEGOTIATE_HE]	=	{ .proc = smb2_negotiate_request, },
17362306a36Sopenharmony_ci	[SMB2_SESSION_SETUP_HE] =	{ .proc = smb2_sess_setup, },
17462306a36Sopenharmony_ci	[SMB2_TREE_CONNECT_HE]  =	{ .proc = smb2_tree_connect,},
17562306a36Sopenharmony_ci	[SMB2_TREE_DISCONNECT_HE]  =	{ .proc = smb2_tree_disconnect,},
17662306a36Sopenharmony_ci	[SMB2_LOGOFF_HE]	=	{ .proc = smb2_session_logoff,},
17762306a36Sopenharmony_ci	[SMB2_CREATE_HE]	=	{ .proc = smb2_open},
17862306a36Sopenharmony_ci	[SMB2_QUERY_INFO_HE]	=	{ .proc = smb2_query_info},
17962306a36Sopenharmony_ci	[SMB2_QUERY_DIRECTORY_HE] =	{ .proc = smb2_query_dir},
18062306a36Sopenharmony_ci	[SMB2_CLOSE_HE]		=	{ .proc = smb2_close},
18162306a36Sopenharmony_ci	[SMB2_ECHO_HE]		=	{ .proc = smb2_echo},
18262306a36Sopenharmony_ci	[SMB2_SET_INFO_HE]      =       { .proc = smb2_set_info},
18362306a36Sopenharmony_ci	[SMB2_READ_HE]		=	{ .proc = smb2_read},
18462306a36Sopenharmony_ci	[SMB2_WRITE_HE]		=	{ .proc = smb2_write},
18562306a36Sopenharmony_ci	[SMB2_FLUSH_HE]		=	{ .proc = smb2_flush},
18662306a36Sopenharmony_ci	[SMB2_CANCEL_HE]	=	{ .proc = smb2_cancel},
18762306a36Sopenharmony_ci	[SMB2_LOCK_HE]		=	{ .proc = smb2_lock},
18862306a36Sopenharmony_ci	[SMB2_IOCTL_HE]		=	{ .proc = smb2_ioctl},
18962306a36Sopenharmony_ci	[SMB2_OPLOCK_BREAK_HE]	=	{ .proc = smb2_oplock_break},
19062306a36Sopenharmony_ci	[SMB2_CHANGE_NOTIFY_HE]	=	{ .proc = smb2_notify},
19162306a36Sopenharmony_ci};
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_ci/**
19462306a36Sopenharmony_ci * init_smb2_1_server() - initialize a smb server connection with smb2.1
19562306a36Sopenharmony_ci *			command dispatcher
19662306a36Sopenharmony_ci * @conn:	connection instance
19762306a36Sopenharmony_ci */
19862306a36Sopenharmony_civoid init_smb2_1_server(struct ksmbd_conn *conn)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	conn->vals = &smb21_server_values;
20162306a36Sopenharmony_ci	conn->ops = &smb2_0_server_ops;
20262306a36Sopenharmony_ci	conn->cmds = smb2_0_server_cmds;
20362306a36Sopenharmony_ci	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
20462306a36Sopenharmony_ci	conn->signing_algorithm = SIGNING_ALG_HMAC_SHA256_LE;
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
20762306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING;
20862306a36Sopenharmony_ci}
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci/**
21162306a36Sopenharmony_ci * init_smb3_0_server() - initialize a smb server connection with smb3.0
21262306a36Sopenharmony_ci *			command dispatcher
21362306a36Sopenharmony_ci * @conn:	connection instance
21462306a36Sopenharmony_ci */
21562306a36Sopenharmony_civoid init_smb3_0_server(struct ksmbd_conn *conn)
21662306a36Sopenharmony_ci{
21762306a36Sopenharmony_ci	conn->vals = &smb30_server_values;
21862306a36Sopenharmony_ci	conn->ops = &smb3_0_server_ops;
21962306a36Sopenharmony_ci	conn->cmds = smb2_0_server_cmds;
22062306a36Sopenharmony_ci	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
22162306a36Sopenharmony_ci	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
22462306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
22562306a36Sopenharmony_ci			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
22662306a36Sopenharmony_ci
22762306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION &&
22862306a36Sopenharmony_ci	    conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION)
22962306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
23262306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
23362306a36Sopenharmony_ci}
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci/**
23662306a36Sopenharmony_ci * init_smb3_02_server() - initialize a smb server connection with smb3.02
23762306a36Sopenharmony_ci *			command dispatcher
23862306a36Sopenharmony_ci * @conn:	connection instance
23962306a36Sopenharmony_ci */
24062306a36Sopenharmony_civoid init_smb3_02_server(struct ksmbd_conn *conn)
24162306a36Sopenharmony_ci{
24262306a36Sopenharmony_ci	conn->vals = &smb302_server_values;
24362306a36Sopenharmony_ci	conn->ops = &smb3_0_server_ops;
24462306a36Sopenharmony_ci	conn->cmds = smb2_0_server_cmds;
24562306a36Sopenharmony_ci	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
24662306a36Sopenharmony_ci	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
24962306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
25062306a36Sopenharmony_ci			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
25162306a36Sopenharmony_ci
25262306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
25362306a36Sopenharmony_ci	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
25462306a36Sopenharmony_ci	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
25562306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
25862306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
25962306a36Sopenharmony_ci}
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci/**
26262306a36Sopenharmony_ci * init_smb3_11_server() - initialize a smb server connection with smb3.11
26362306a36Sopenharmony_ci *			command dispatcher
26462306a36Sopenharmony_ci * @conn:	connection instance
26562306a36Sopenharmony_ci */
26662306a36Sopenharmony_ciint init_smb3_11_server(struct ksmbd_conn *conn)
26762306a36Sopenharmony_ci{
26862306a36Sopenharmony_ci	conn->vals = &smb311_server_values;
26962306a36Sopenharmony_ci	conn->ops = &smb3_11_server_ops;
27062306a36Sopenharmony_ci	conn->cmds = smb2_0_server_cmds;
27162306a36Sopenharmony_ci	conn->max_cmds = ARRAY_SIZE(smb2_0_server_cmds);
27262306a36Sopenharmony_ci	conn->signing_algorithm = SIGNING_ALG_AES_CMAC_LE;
27362306a36Sopenharmony_ci
27462306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_LEASES)
27562306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_LEASING |
27662306a36Sopenharmony_ci			SMB2_GLOBAL_CAP_DIRECTORY_LEASING;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION ||
27962306a36Sopenharmony_ci	    (!(server_conf.flags & KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF) &&
28062306a36Sopenharmony_ci	     conn->cli_cap & SMB2_GLOBAL_CAP_ENCRYPTION))
28162306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_ENCRYPTION;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci	if (server_conf.flags & KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL)
28462306a36Sopenharmony_ci		conn->vals->capabilities |= SMB2_GLOBAL_CAP_MULTI_CHANNEL;
28562306a36Sopenharmony_ci
28662306a36Sopenharmony_ci	INIT_LIST_HEAD(&conn->preauth_sess_table);
28762306a36Sopenharmony_ci	return 0;
28862306a36Sopenharmony_ci}
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_civoid init_smb2_max_read_size(unsigned int sz)
29162306a36Sopenharmony_ci{
29262306a36Sopenharmony_ci	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
29362306a36Sopenharmony_ci	smb21_server_values.max_read_size = sz;
29462306a36Sopenharmony_ci	smb30_server_values.max_read_size = sz;
29562306a36Sopenharmony_ci	smb302_server_values.max_read_size = sz;
29662306a36Sopenharmony_ci	smb311_server_values.max_read_size = sz;
29762306a36Sopenharmony_ci}
29862306a36Sopenharmony_ci
29962306a36Sopenharmony_civoid init_smb2_max_write_size(unsigned int sz)
30062306a36Sopenharmony_ci{
30162306a36Sopenharmony_ci	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
30262306a36Sopenharmony_ci	smb21_server_values.max_write_size = sz;
30362306a36Sopenharmony_ci	smb30_server_values.max_write_size = sz;
30462306a36Sopenharmony_ci	smb302_server_values.max_write_size = sz;
30562306a36Sopenharmony_ci	smb311_server_values.max_write_size = sz;
30662306a36Sopenharmony_ci}
30762306a36Sopenharmony_ci
30862306a36Sopenharmony_civoid init_smb2_max_trans_size(unsigned int sz)
30962306a36Sopenharmony_ci{
31062306a36Sopenharmony_ci	sz = clamp_val(sz, SMB3_MIN_IOSIZE, SMB3_MAX_IOSIZE);
31162306a36Sopenharmony_ci	smb21_server_values.max_trans_size = sz;
31262306a36Sopenharmony_ci	smb30_server_values.max_trans_size = sz;
31362306a36Sopenharmony_ci	smb302_server_values.max_trans_size = sz;
31462306a36Sopenharmony_ci	smb311_server_values.max_trans_size = sz;
31562306a36Sopenharmony_ci}
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_civoid init_smb2_max_credits(unsigned int sz)
31862306a36Sopenharmony_ci{
31962306a36Sopenharmony_ci	smb21_server_values.max_credits = sz;
32062306a36Sopenharmony_ci	smb30_server_values.max_credits = sz;
32162306a36Sopenharmony_ci	smb302_server_values.max_credits = sz;
32262306a36Sopenharmony_ci	smb311_server_values.max_credits = sz;
32362306a36Sopenharmony_ci}
324