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