| /* SPDX-License-Identifier: GPL-2.0-or-later */ | |
| /* | |
| * Copyright (C) 2018 Samsung Electronics Co., Ltd. | |
| */ | |
| #ifndef __USER_SESSION_MANAGEMENT_H__ | |
| #define __USER_SESSION_MANAGEMENT_H__ | |
| #include <linux/hashtable.h> | |
| #include <linux/xarray.h> | |
| #include "../smb_common.h" | |
| #include "../ntlmssp.h" | |
| #define CIFDS_SESSION_FLAG_SMB2 BIT(1) | |
| #define PREAUTH_HASHVALUE_SIZE 64 | |
| struct ksmbd_file_table; | |
| struct channel { | |
| char sess_key[CIFS_KEY_SIZE]; | |
| __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE]; | |
| struct ksmbd_conn *conn; | |
| }; | |
| struct preauth_session { | |
| __u8 Preauth_HashValue[PREAUTH_HASHVALUE_SIZE]; | |
| u64 id; | |
| struct list_head preauth_entry; | |
| }; | |
| struct ksmbd_session { | |
| u64 id; | |
| __u16 dialect; | |
| char ClientGUID[SMB2_CLIENT_GUID_SIZE]; | |
| struct ksmbd_user *user; | |
| unsigned int sequence_number; | |
| unsigned int flags; | |
| bool sign; | |
| bool enc; | |
| bool tearing_down; | |
| int state; | |
| __u8 *Preauth_HashValue; | |
| char sess_key[CIFS_KEY_SIZE]; | |
| u64 kerberos_expiry; | |
| struct hlist_node hlist; | |
| struct rw_semaphore chann_lock; | |
| struct xarray ksmbd_chann_list; | |
| struct xarray tree_conns; | |
| struct ida tree_conn_ida; | |
| struct xarray rpc_handle_list; | |
| __u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE]; | |
| __u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE]; | |
| __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE]; | |
| struct ksmbd_file_table file_table; | |
| unsigned long last_active; | |
| struct rw_semaphore tree_conns_lock; | |
| #ifdef CONFIG_PROC_FS | |
| struct proc_dir_entry *proc_entry; | |
| #endif | |
| atomic_t refcnt; | |
| struct rw_semaphore rpc_lock; | |
| }; | |
| #define KSMBD_MAX_CHANNELS 32 | |
| static inline int test_session_flag(struct ksmbd_session *sess, int bit) | |
| { | |
| return sess->flags & bit; | |
| } | |
| static inline void set_session_flag(struct ksmbd_session *sess, int bit) | |
| { | |
| sess->flags |= bit; | |
| } | |
| static inline void clear_session_flag(struct ksmbd_session *sess, int bit) | |
| { | |
| sess->flags &= ~bit; | |
| } | |
| struct ksmbd_session *ksmbd_smb2_session_create(void); | |
| void ksmbd_session_destroy(struct ksmbd_session *sess); | |
| struct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id); | |
| struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn, | |
| unsigned long long id); | |
| bool is_ksmbd_session_in_connection(struct ksmbd_conn *conn, | |
| unsigned long long id); | |
| int ksmbd_session_register(struct ksmbd_conn *conn, | |
| struct ksmbd_session *sess); | |
| void ksmbd_session_unregister(struct ksmbd_conn *conn, | |
| struct ksmbd_session *sess); | |
| void ksmbd_conn_sessions_cleanup(struct ksmbd_conn *conn); | |
| bool ksmbd_conn_has_valid_or_expired_session(struct ksmbd_conn *conn); | |
| void ksmbd_expire_sessions(void); | |
| struct ksmbd_session *__session_lookup(unsigned long long id); | |
| struct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn, | |
| unsigned long long id); | |
| struct ksmbd_session *ksmbd_session_lookup_all_states(struct ksmbd_conn *conn, | |
| unsigned long long id); | |
| void destroy_previous_session(struct ksmbd_conn *conn, | |
| struct ksmbd_user *user, u64 id); | |
| struct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn, | |
| u64 sess_id); | |
| void ksmbd_preauth_session_destroy(struct ksmbd_conn *conn); | |
| struct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn, | |
| unsigned long long id); | |
| int ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess); | |
| void ksmbd_release_tree_conn_id(struct ksmbd_session *sess, int id); | |
| int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name); | |
| void ksmbd_session_rpc_close(struct ksmbd_session *sess, int id); | |
| int ksmbd_session_rpc_method(struct ksmbd_session *sess, int id); | |
| void ksmbd_user_session_get(struct ksmbd_session *sess); | |
| void ksmbd_user_session_put(struct ksmbd_session *sess); | |
| int create_proc_sessions(void); | |
| #endif /* __USER_SESSION_MANAGEMENT_H__ */ |