0001
0002
0003
0004
0005
0006 #ifndef __USER_SESSION_MANAGEMENT_H__
0007 #define __USER_SESSION_MANAGEMENT_H__
0008
0009 #include <linux/hashtable.h>
0010 #include <linux/xarray.h>
0011
0012 #include "../smb_common.h"
0013 #include "../ntlmssp.h"
0014
0015 #define CIFDS_SESSION_FLAG_SMB2 BIT(1)
0016
0017 #define PREAUTH_HASHVALUE_SIZE 64
0018
0019 struct ksmbd_file_table;
0020
0021 struct channel {
0022 __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE];
0023 struct ksmbd_conn *conn;
0024 struct list_head chann_list;
0025 };
0026
0027 struct preauth_session {
0028 __u8 Preauth_HashValue[PREAUTH_HASHVALUE_SIZE];
0029 u64 id;
0030 struct list_head preauth_entry;
0031 };
0032
0033 struct ksmbd_session {
0034 u64 id;
0035
0036 __u16 dialect;
0037 char ClientGUID[SMB2_CLIENT_GUID_SIZE];
0038
0039 struct ksmbd_user *user;
0040 unsigned int sequence_number;
0041 unsigned int flags;
0042
0043 bool sign;
0044 bool enc;
0045 bool is_anonymous;
0046
0047 int state;
0048 __u8 *Preauth_HashValue;
0049
0050 char sess_key[CIFS_KEY_SIZE];
0051
0052 struct hlist_node hlist;
0053 rwlock_t chann_lock;
0054 struct list_head ksmbd_chann_list;
0055 struct xarray tree_conns;
0056 struct ida tree_conn_ida;
0057 struct list_head rpc_handle_list;
0058
0059 __u8 smb3encryptionkey[SMB3_ENC_DEC_KEY_SIZE];
0060 __u8 smb3decryptionkey[SMB3_ENC_DEC_KEY_SIZE];
0061 __u8 smb3signingkey[SMB3_SIGN_KEY_SIZE];
0062
0063 struct ksmbd_file_table file_table;
0064 };
0065
0066 static inline int test_session_flag(struct ksmbd_session *sess, int bit)
0067 {
0068 return sess->flags & bit;
0069 }
0070
0071 static inline void set_session_flag(struct ksmbd_session *sess, int bit)
0072 {
0073 sess->flags |= bit;
0074 }
0075
0076 static inline void clear_session_flag(struct ksmbd_session *sess, int bit)
0077 {
0078 sess->flags &= ~bit;
0079 }
0080
0081 struct ksmbd_session *ksmbd_smb2_session_create(void);
0082
0083 void ksmbd_session_destroy(struct ksmbd_session *sess);
0084
0085 struct ksmbd_session *ksmbd_session_lookup_slowpath(unsigned long long id);
0086 struct ksmbd_session *ksmbd_session_lookup(struct ksmbd_conn *conn,
0087 unsigned long long id);
0088 int ksmbd_session_register(struct ksmbd_conn *conn,
0089 struct ksmbd_session *sess);
0090 void ksmbd_sessions_deregister(struct ksmbd_conn *conn);
0091 struct ksmbd_session *ksmbd_session_lookup_all(struct ksmbd_conn *conn,
0092 unsigned long long id);
0093 struct preauth_session *ksmbd_preauth_session_alloc(struct ksmbd_conn *conn,
0094 u64 sess_id);
0095 struct preauth_session *ksmbd_preauth_session_lookup(struct ksmbd_conn *conn,
0096 unsigned long long id);
0097
0098 int ksmbd_acquire_tree_conn_id(struct ksmbd_session *sess);
0099 void ksmbd_release_tree_conn_id(struct ksmbd_session *sess, int id);
0100
0101 int ksmbd_session_rpc_open(struct ksmbd_session *sess, char *rpc_name);
0102 void ksmbd_session_rpc_close(struct ksmbd_session *sess, int id);
0103 int ksmbd_session_rpc_method(struct ksmbd_session *sess, int id);
0104 #endif