/* 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 #include #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 { __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 is_anonymous; int state; __u8 *Preauth_HashValue; char sess_key[CIFS_KEY_SIZE]; struct hlist_node hlist; 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; rwlock_t tree_conns_lock; atomic_t refcnt; }; 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); int ksmbd_session_register(struct ksmbd_conn *conn, struct ksmbd_session *sess); void ksmbd_sessions_deregister(struct ksmbd_conn *conn); struct ksmbd_session *__session_lookup(unsigned long long id); struct ksmbd_session *ksmbd_session_lookup_all(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); 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); #endif /* __USER_SESSION_MANAGEMENT_H__ */