brintos

brintos / linux-shallow public Read only

0
0
Text · 12.4 KiB · 3d01d9d Raw
436 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*3 *   Copyright (C) 2018 Samsung Electronics Co., Ltd.4 *5 *   linux-ksmbd-devel@lists.sourceforge.net6 */7 8#ifndef _LINUX_KSMBD_SERVER_H9#define _LINUX_KSMBD_SERVER_H10 11#include <linux/types.h>12 13/*14 * This is a userspace ABI to communicate data between ksmbd and user IPC15 * daemon using netlink. This is added to track and cache user account DB16 * and share configuration info from userspace.17 *18 *  - KSMBD_EVENT_HEARTBEAT_REQUEST(ksmbd_heartbeat)19 *    This event is to check whether user IPC daemon is alive. If user IPC20 *    daemon is dead, ksmbd keep existing connection till disconnecting and21 *    new connection will be denied.22 *23 *  - KSMBD_EVENT_STARTING_UP(ksmbd_startup_request)24 *    This event is to receive the information that initializes the ksmbd25 *    server from the user IPC daemon and to start the server. The global26 *    section parameters are given from smb.conf as initialization27 *    information.28 *29 *  - KSMBD_EVENT_SHUTTING_DOWN(ksmbd_shutdown_request)30 *    This event is to shutdown ksmbd server.31 *32 *  - KSMBD_EVENT_LOGIN_REQUEST/RESPONSE(ksmbd_login_request/response)33 *    This event is to get user account info to user IPC daemon.34 *35 *  - KSMBD_EVENT_SHARE_CONFIG_REQUEST/RESPONSE(ksmbd_share_config_request/response)36 *    This event is to get net share configuration info.37 *38 *  - KSMBD_EVENT_TREE_CONNECT_REQUEST/RESPONSE(ksmbd_tree_connect_request/response)39 *    This event is to get session and tree connect info.40 *41 *  - KSMBD_EVENT_TREE_DISCONNECT_REQUEST(ksmbd_tree_disconnect_request)42 *    This event is to send tree disconnect info to user IPC daemon.43 *44 *  - KSMBD_EVENT_LOGOUT_REQUEST(ksmbd_logout_request)45 *    This event is to send logout request to user IPC daemon.46 *47 *  - KSMBD_EVENT_RPC_REQUEST/RESPONSE(ksmbd_rpc_command)48 *    This event is to make DCE/RPC request like srvsvc, wkssvc, lsarpc,49 *    samr to be processed in userspace.50 *51 *  - KSMBD_EVENT_SPNEGO_AUTHEN_REQUEST/RESPONSE(ksmbd_spnego_authen_request/response)52 *    This event is to make kerberos authentication to be processed in53 *    userspace.54 *55 *  - KSMBD_EVENT_LOGIN_REQUEST_EXT/RESPONSE_EXT(ksmbd_login_request_ext/response_ext)56 *    This event is to get user account extension info to user IPC daemon.57 */58 59#define KSMBD_GENL_NAME		"SMBD_GENL"60#define KSMBD_GENL_VERSION		0x0161 62#define KSMBD_REQ_MAX_ACCOUNT_NAME_SZ	4863#define KSMBD_REQ_MAX_HASH_SZ		1864#define KSMBD_REQ_MAX_SHARE_NAME	6465 66/*67 * IPC heartbeat frame to check whether user IPC daemon is alive.68 */69struct ksmbd_heartbeat {70	__u32	handle;71};72 73/*74 * Global config flags.75 */76#define KSMBD_GLOBAL_FLAG_INVALID		(0)77#define KSMBD_GLOBAL_FLAG_SMB2_LEASES		BIT(0)78#define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION	BIT(1)79#define KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL	BIT(2)80#define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF	BIT(3)81#define KSMBD_GLOBAL_FLAG_DURABLE_HANDLE	BIT(4)82 83/*84 * IPC request for ksmbd server startup85 */86struct ksmbd_startup_request {87	__u32	flags;			/* Flags for global config */88	__s32	signing;		/* Signing enabled */89	__s8	min_prot[16];		/* The minimum SMB protocol version */90	__s8	max_prot[16];		/* The maximum SMB protocol version */91	__s8	netbios_name[16];92	__s8	work_group[64];		/* Workgroup */93	__s8	server_string[64];	/* Server string */94	__u16	tcp_port;		/* tcp port */95	__u16	ipc_timeout;		/*96					 * specifies the number of seconds97					 * server will wait for the userspace to98					 * reply to heartbeat frames.99					 */100	__u32	deadtime;		/* Number of minutes of inactivity */101	__u32	file_max;		/* Limits the maximum number of open files */102	__u32	smb2_max_write;		/* MAX write size */103	__u32	smb2_max_read;		/* MAX read size */104	__u32	smb2_max_trans;		/* MAX trans size */105	__u32	share_fake_fscaps;	/*106					 * Support some special application that107					 * makes QFSINFO calls to check whether108					 * we set the SPARSE_FILES bit (0x40).109					 */110	__u32	sub_auth[3];		/* Subauth value for Security ID */111	__u32	smb2_max_credits;	/* MAX credits */112	__u32	smbd_max_io_size;	/* smbd read write size */113	__u32	max_connections;	/* Number of maximum simultaneous connections */114	__u32	reserved[126];		/* Reserved room */115	__u32	ifc_list_sz;		/* interfaces list size */116	__s8	____payload[];117};118 119#define KSMBD_STARTUP_CONFIG_INTERFACES(s)	((s)->____payload)120 121/*122 * IPC request to shutdown ksmbd server.123 */124struct ksmbd_shutdown_request {125	__s32	reserved[16];126};127 128/*129 * IPC user login request.130 */131struct ksmbd_login_request {132	__u32	handle;133	__s8	account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */134	__u32	reserved[16];				/* Reserved room */135};136 137/*138 * IPC user login response.139 */140struct ksmbd_login_response {141	__u32	handle;142	__u32	gid;					/* group id */143	__u32	uid;					/* user id */144	__s8	account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */145	__u16	status;146	__u16	hash_sz;			/* hash size */147	__s8	hash[KSMBD_REQ_MAX_HASH_SZ];	/* password hash */148	__u32	reserved[16];			/* Reserved room */149};150 151/*152 * IPC user login response extension.153 */154struct ksmbd_login_response_ext {155	__u32	handle;156	__s32	ngroups;			/* supplementary group count */157	__s8	reserved[128];			/* Reserved room */158	__s8	____payload[];159};160 161/*162 * IPC request to fetch net share config.163 */164struct ksmbd_share_config_request {165	__u32	handle;166	__s8	share_name[KSMBD_REQ_MAX_SHARE_NAME]; /* share name */167	__u32	reserved[16];		/* Reserved room */168};169 170/*171 * IPC response to the net share config request.172 */173struct ksmbd_share_config_response {174	__u32	handle;175	__u32	flags;176	__u16	create_mask;177	__u16	directory_mask;178	__u16	force_create_mode;179	__u16	force_directory_mode;180	__u16	force_uid;181	__u16	force_gid;182	__s8	share_name[KSMBD_REQ_MAX_SHARE_NAME];183	__u32	reserved[111];		/* Reserved room */184	__u32	payload_sz;185	__u32	veto_list_sz;186	__s8	____payload[];187};188 189#define KSMBD_SHARE_CONFIG_VETO_LIST(s)	((s)->____payload)190 191static inline char *192ksmbd_share_config_path(struct ksmbd_share_config_response *sc)193{194	char *p = sc->____payload;195 196	if (sc->veto_list_sz)197		p += sc->veto_list_sz + 1;198 199	return p;200}201 202/*203 * IPC request for tree connection. This request include session and tree204 * connect info from client.205 */206struct ksmbd_tree_connect_request {207	__u32	handle;208	__u16	account_flags;209	__u16	flags;210	__u64	session_id;211	__u64	connect_id;212	__s8	account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ];213	__s8	share[KSMBD_REQ_MAX_SHARE_NAME];214	__s8	peer_addr[64];215	__u32	reserved[16];		/* Reserved room */216};217 218/*219 * IPC Response structure for tree connection.220 */221struct ksmbd_tree_connect_response {222	__u32	handle;223	__u16	status;224	__u16	connection_flags;225	__u32	reserved[16];		/* Reserved room */226};227 228/*229 * IPC Request structure to disconnect tree connection.230 */231struct ksmbd_tree_disconnect_request {232	__u64	session_id;	/* session id */233	__u64	connect_id;	/* tree connection id */234	__u32	reserved[16];	/* Reserved room */235};236 237/*238 * IPC Response structure to logout user account.239 */240struct ksmbd_logout_request {241	__s8	account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */242	__u32	account_flags;243	__u32	reserved[16];				/* Reserved room */244};245 246/*247 * RPC command structure to send rpc request like srvsvc or wkssvc to248 * IPC user daemon.249 */250struct ksmbd_rpc_command {251	__u32	handle;252	__u32	flags;253	__u32	payload_sz;254	__u8	payload[];255};256 257/*258 * IPC Request Kerberos authentication259 */260struct ksmbd_spnego_authen_request {261	__u32	handle;262	__u16	spnego_blob_len;	/* the length of spnego_blob */263	__u8	spnego_blob[];		/*264					 * the GSS token from SecurityBuffer of265					 * SMB2 SESSION SETUP request266					 */267};268 269/*270 * Response data which includes the GSS token and the session key generated by271 * user daemon.272 */273struct ksmbd_spnego_authen_response {274	__u32	handle;275	struct ksmbd_login_response login_response; /*276						     * the login response with277						     * a user identified by the278						     * GSS token from a client279						     */280	__u16	session_key_len; /* the length of the session key */281	__u16	spnego_blob_len; /*282				  * the length of  the GSS token which will be283				  * stored in SecurityBuffer of SMB2 SESSION284				  * SETUP response285				  */286	__u8	payload[]; /* session key + AP_REP */287};288 289/*290 * This also used as NETLINK attribute type value.291 *292 * NOTE:293 * Response message type value should be equal to294 * request message type value + 1.295 */296enum ksmbd_event {297	KSMBD_EVENT_UNSPEC			= 0,298	KSMBD_EVENT_HEARTBEAT_REQUEST,299 300	KSMBD_EVENT_STARTING_UP,301	KSMBD_EVENT_SHUTTING_DOWN,302 303	KSMBD_EVENT_LOGIN_REQUEST,304	KSMBD_EVENT_LOGIN_RESPONSE		= 5,305 306	KSMBD_EVENT_SHARE_CONFIG_REQUEST,307	KSMBD_EVENT_SHARE_CONFIG_RESPONSE,308 309	KSMBD_EVENT_TREE_CONNECT_REQUEST,310	KSMBD_EVENT_TREE_CONNECT_RESPONSE,311 312	KSMBD_EVENT_TREE_DISCONNECT_REQUEST	= 10,313 314	KSMBD_EVENT_LOGOUT_REQUEST,315 316	KSMBD_EVENT_RPC_REQUEST,317	KSMBD_EVENT_RPC_RESPONSE,318 319	KSMBD_EVENT_SPNEGO_AUTHEN_REQUEST,320	KSMBD_EVENT_SPNEGO_AUTHEN_RESPONSE	= 15,321 322	KSMBD_EVENT_LOGIN_REQUEST_EXT,323	KSMBD_EVENT_LOGIN_RESPONSE_EXT,324 325	__KSMBD_EVENT_MAX,326	KSMBD_EVENT_MAX = __KSMBD_EVENT_MAX - 1327};328 329/*330 * Enumeration for IPC tree connect status.331 */332enum KSMBD_TREE_CONN_STATUS {333	KSMBD_TREE_CONN_STATUS_OK		= 0,334	KSMBD_TREE_CONN_STATUS_NOMEM,335	KSMBD_TREE_CONN_STATUS_NO_SHARE,336	KSMBD_TREE_CONN_STATUS_NO_USER,337	KSMBD_TREE_CONN_STATUS_INVALID_USER,338	KSMBD_TREE_CONN_STATUS_HOST_DENIED	= 5,339	KSMBD_TREE_CONN_STATUS_CONN_EXIST,340	KSMBD_TREE_CONN_STATUS_TOO_MANY_CONNS,341	KSMBD_TREE_CONN_STATUS_TOO_MANY_SESSIONS,342	KSMBD_TREE_CONN_STATUS_ERROR,343};344 345/*346 * User config flags.347 */348#define KSMBD_USER_FLAG_INVALID		(0)349#define KSMBD_USER_FLAG_OK		BIT(0)350#define KSMBD_USER_FLAG_BAD_PASSWORD	BIT(1)351#define KSMBD_USER_FLAG_BAD_UID		BIT(2)352#define KSMBD_USER_FLAG_BAD_USER	BIT(3)353#define KSMBD_USER_FLAG_GUEST_ACCOUNT	BIT(4)354#define KSMBD_USER_FLAG_DELAY_SESSION	BIT(5)355#define KSMBD_USER_FLAG_EXTENSION	BIT(6)356 357/*358 * Share config flags.359 */360#define KSMBD_SHARE_FLAG_INVALID			(0)361#define KSMBD_SHARE_FLAG_AVAILABLE			BIT(0)362#define KSMBD_SHARE_FLAG_BROWSEABLE			BIT(1)363#define KSMBD_SHARE_FLAG_WRITEABLE			BIT(2)364#define KSMBD_SHARE_FLAG_READONLY			BIT(3)365#define KSMBD_SHARE_FLAG_GUEST_OK			BIT(4)366#define KSMBD_SHARE_FLAG_GUEST_ONLY			BIT(5)367#define KSMBD_SHARE_FLAG_STORE_DOS_ATTRS		BIT(6)368#define KSMBD_SHARE_FLAG_OPLOCKS			BIT(7)369#define KSMBD_SHARE_FLAG_PIPE				BIT(8)370#define KSMBD_SHARE_FLAG_HIDE_DOT_FILES			BIT(9)371#define KSMBD_SHARE_FLAG_INHERIT_OWNER			BIT(10)372#define KSMBD_SHARE_FLAG_STREAMS			BIT(11)373#define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS		BIT(12)374#define KSMBD_SHARE_FLAG_ACL_XATTR			BIT(13)375#define KSMBD_SHARE_FLAG_UPDATE				BIT(14)376#define KSMBD_SHARE_FLAG_CROSSMNT			BIT(15)377#define KSMBD_SHARE_FLAG_CONTINUOUS_AVAILABILITY	BIT(16)378 379/*380 * Tree connect request flags.381 */382#define KSMBD_TREE_CONN_FLAG_REQUEST_SMB1	(0)383#define KSMBD_TREE_CONN_FLAG_REQUEST_IPV6	BIT(0)384#define KSMBD_TREE_CONN_FLAG_REQUEST_SMB2	BIT(1)385 386/*387 * Tree connect flags.388 */389#define KSMBD_TREE_CONN_FLAG_GUEST_ACCOUNT	BIT(0)390#define KSMBD_TREE_CONN_FLAG_READ_ONLY		BIT(1)391#define KSMBD_TREE_CONN_FLAG_WRITABLE		BIT(2)392#define KSMBD_TREE_CONN_FLAG_ADMIN_ACCOUNT	BIT(3)393#define KSMBD_TREE_CONN_FLAG_UPDATE		BIT(4)394 395/*396 * RPC over IPC.397 */398#define KSMBD_RPC_METHOD_RETURN		BIT(0)399#define KSMBD_RPC_SRVSVC_METHOD_INVOKE	BIT(1)400#define KSMBD_RPC_SRVSVC_METHOD_RETURN	(KSMBD_RPC_SRVSVC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN)401#define KSMBD_RPC_WKSSVC_METHOD_INVOKE	BIT(2)402#define KSMBD_RPC_WKSSVC_METHOD_RETURN	(KSMBD_RPC_WKSSVC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN)403#define KSMBD_RPC_IOCTL_METHOD		(BIT(3) | KSMBD_RPC_METHOD_RETURN)404#define KSMBD_RPC_OPEN_METHOD		BIT(4)405#define KSMBD_RPC_WRITE_METHOD		BIT(5)406#define KSMBD_RPC_READ_METHOD		(BIT(6) | KSMBD_RPC_METHOD_RETURN)407#define KSMBD_RPC_CLOSE_METHOD		BIT(7)408#define KSMBD_RPC_RAP_METHOD		(BIT(8) | KSMBD_RPC_METHOD_RETURN)409#define KSMBD_RPC_RESTRICTED_CONTEXT	BIT(9)410#define KSMBD_RPC_SAMR_METHOD_INVOKE	BIT(10)411#define KSMBD_RPC_SAMR_METHOD_RETURN	(KSMBD_RPC_SAMR_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN)412#define KSMBD_RPC_LSARPC_METHOD_INVOKE	BIT(11)413#define KSMBD_RPC_LSARPC_METHOD_RETURN	(KSMBD_RPC_LSARPC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN)414 415/*416 * RPC status definitions.417 */418#define KSMBD_RPC_OK			0419#define KSMBD_RPC_EBAD_FUNC		0x00000001420#define KSMBD_RPC_EACCESS_DENIED	0x00000005421#define KSMBD_RPC_EBAD_FID		0x00000006422#define KSMBD_RPC_ENOMEM		0x00000008423#define KSMBD_RPC_EBAD_DATA		0x0000000D424#define KSMBD_RPC_ENOTIMPLEMENTED	0x00000040425#define KSMBD_RPC_EINVALID_PARAMETER	0x00000057426#define KSMBD_RPC_EMORE_DATA		0x000000EA427#define KSMBD_RPC_EINVALID_LEVEL	0x0000007C428#define KSMBD_RPC_SOME_NOT_MAPPED	0x00000107429 430#define KSMBD_CONFIG_OPT_DISABLED	0431#define KSMBD_CONFIG_OPT_ENABLED	1432#define KSMBD_CONFIG_OPT_AUTO		2433#define KSMBD_CONFIG_OPT_MANDATORY	3434 435#endif /* _LINUX_KSMBD_SERVER_H */436