162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2018 Samsung Electronics Co., Ltd. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef __USER_SESSION_MANAGEMENT_H__ 762306a36Sopenharmony_ci#define __USER_SESSION_MANAGEMENT_H__ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/hashtable.h> 1062306a36Sopenharmony_ci#include <linux/xarray.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include "../smb_common.h" 1362306a36Sopenharmony_ci#include "../ntlmssp.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define CIFDS_SESSION_FLAG_SMB2 BIT(1) 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#define PREAUTH_HASHVALUE_SIZE 64 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct ksmbd_file_table; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct channel { 2262306a36Sopenharmony_ci __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE]; 2362306a36Sopenharmony_ci struct ksmbd_conn *conn; 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistruct preauth_session { 2762306a36Sopenharmony_ci __u8 Preauth_HashValue[PREAUTH_HASHVALUE_SIZE]; 2862306a36Sopenharmony_ci u64 id; 2962306a36Sopenharmony_ci struct list_head preauth_entry; 3062306a36Sopenharmony_ci}; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cistruct ksmbd_session { 3362306a36Sopenharmony_ci u64 id; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci __u16 dialect; 3662306a36Sopenharmony_ci char ClientGUID[SMB2_CLIENT_GUID_SIZE]; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci struct ksmbd_user *user; 3962306a36Sopenharmony_ci unsigned int sequence_number; 4062306a36Sopenharmony_ci unsigned int flags; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci bool sign; 4362306a36Sopenharmony_ci bool enc; 4462306a36Sopenharmony_ci bool is_anonymous; 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci int state; 4762306a36Sopenharmony_ci __u8 *Preauth_HashValue; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci char sess_key[CIFS_KEY_SIZE]; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci struct hlist_node hlist; 5262306a36Sopenharmony_ci struct xarray ksmbd_chann_list; 5362306a36Sopenharmony_ci struct xarray tree_conns; 5462306a36Sopenharmony_ci struct ida tree_conn_ida; 5562306a36Sopenharmony_ci struct xarray rpc_handle_list; 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci __u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE]; 5862306a36Sopenharmony_ci __u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE]; 5962306a36Sopenharmony_ci __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE]; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci struct ksmbd_file_table file_table; 6262306a36Sopenharmony_ci unsigned long last_active; 6362306a36Sopenharmony_ci rwlock_t tree_conns_lock; 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic inline int test_session_flag(struct ksmbd_session *sess, int bit) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci return sess->flags & bit; 6962306a36Sopenharmony_ci} 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic inline void set_session_flag(struct ksmbd_session *sess, int bit) 7262306a36Sopenharmony_ci{ 7362306a36Sopenharmony_ci sess->flags |= bit; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic inline void clear_session_flag(struct ksmbd_session *sess, int bit) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci sess->flags &= ~bit; 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct ksmbd_session *ksmbd_smb2_session_create(void); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_civoid ksmbd_session_destroy(struct ksmbd_session *sess); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id); 8662306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn, 8762306a36Sopenharmony_ci unsigned long long id); 8862306a36Sopenharmony_ciint ksmbd_session_register(struct ksmbd_conn *conn, 8962306a36Sopenharmony_ci struct ksmbd_session *sess); 9062306a36Sopenharmony_civoid ksmbd_sessions_deregister(struct ksmbd_conn *conn); 9162306a36Sopenharmony_cistruct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn, 9262306a36Sopenharmony_ci unsigned long long id); 9362306a36Sopenharmony_cistruct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn, 9462306a36Sopenharmony_ci u64 sess_id); 9562306a36Sopenharmony_cistruct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn, 9662306a36Sopenharmony_ci unsigned long long id); 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ciint ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess); 9962306a36Sopenharmony_civoid ksmbd_release_tree_conn_id(struct ksmbd_session *sess, int id); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ciint ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name); 10262306a36Sopenharmony_civoid ksmbd_session_rpc_close(struct ksmbd_session *sess, int id); 10362306a36Sopenharmony_ciint ksmbd_session_rpc_method(struct ksmbd_session *sess, int id); 10462306a36Sopenharmony_ci#endif /* __USER_SESSION_MANAGEMENT_H__ */ 105