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