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