Commit | Line | Data |
---|---|---|
0626e664 NJ |
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.net | |
6 | */ | |
7 | ||
8 | #ifndef _LINUX_KSMBD_SERVER_H | |
9 | #define _LINUX_KSMBD_SERVER_H | |
10 | ||
11 | #include <linux/types.h> | |
12 | ||
8b758859 NJ |
13 | /* |
14 | * This is a userspace ABI to communicate data between ksmbd and user IPC | |
15 | * daemon using netlink. This is added to track and cache user account DB | |
16 | * 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 IPC | |
20 | * daemon is dead, ksmbd keep existing connection till disconnecting and | |
21 | * 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 ksmbd | |
25 | * server from the user IPC daemon and to start the server. The global | |
26 | * section parameters are given from smb.conf as initialization | |
27 | * 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 in | |
53 | * userspace. | |
54 | */ | |
55 | ||
0626e664 NJ |
56 | #define KSMBD_GENL_NAME "SMBD_GENL" |
57 | #define KSMBD_GENL_VERSION 0x01 | |
58 | ||
0626e664 NJ |
59 | #define KSMBD_REQ_MAX_ACCOUNT_NAME_SZ 48 |
60 | #define KSMBD_REQ_MAX_HASH_SZ 18 | |
61 | #define KSMBD_REQ_MAX_SHARE_NAME 64 | |
62 | ||
8b758859 NJ |
63 | /* |
64 | * IPC heartbeat frame to check whether user IPC daemon is alive. | |
65 | */ | |
0626e664 NJ |
66 | struct ksmbd_heartbeat { |
67 | __u32 handle; | |
68 | }; | |
69 | ||
70 | /* | |
71 | * Global config flags. | |
72 | */ | |
73 | #define KSMBD_GLOBAL_FLAG_INVALID (0) | |
64b39f4a | 74 | #define KSMBD_GLOBAL_FLAG_SMB2_LEASES BIT(0) |
c30f4eb8 NJ |
75 | #define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION BIT(1) |
76 | #define KSMBD_GLOBAL_FLAG_SMB3_MULTICHANNEL BIT(2) | |
37ba7b00 | 77 | #define KSMBD_GLOBAL_FLAG_SMB2_ENCRYPTION_OFF BIT(3) |
0626e664 | 78 | |
8b758859 NJ |
79 | /* |
80 | * IPC request for ksmbd server startup | |
81 | */ | |
0626e664 | 82 | struct ksmbd_startup_request { |
8b758859 NJ |
83 | __u32 flags; /* Flags for global config */ |
84 | __s32 signing; /* Signing enabled */ | |
85 | __s8 min_prot[16]; /* The minimum SMB protocol version */ | |
86 | __s8 max_prot[16]; /* The maximum SMB protocol version */ | |
0626e664 | 87 | __s8 netbios_name[16]; |
8b758859 NJ |
88 | __s8 work_group[64]; /* Workgroup */ |
89 | __s8 server_string[64]; /* Server string */ | |
90 | __u16 tcp_port; /* tcp port */ | |
91 | __u16 ipc_timeout; /* | |
92 | * specifies the number of seconds | |
93 | * server will wait for the userspace to | |
94 | * reply to heartbeat frames. | |
95 | */ | |
96 | __u32 deadtime; /* Number of minutes of inactivity */ | |
97 | __u32 file_max; /* Limits the maximum number of open files */ | |
98 | __u32 smb2_max_write; /* MAX write size */ | |
99 | __u32 smb2_max_read; /* MAX read size */ | |
100 | __u32 smb2_max_trans; /* MAX trans size */ | |
101 | __u32 share_fake_fscaps; /* | |
102 | * Support some special application that | |
103 | * makes QFSINFO calls to check whether | |
104 | * we set the SPARSE_FILES bit (0x40). | |
105 | */ | |
106 | __u32 sub_auth[3]; /* Subauth value for Security ID */ | |
004443b3 | 107 | __u32 smb2_max_credits; /* MAX credits */ |
65bb45b9 | 108 | __u32 smbd_max_io_size; /* smbd read write size */ |
0d0d4680 NJ |
109 | __u32 max_connections; /* Number of maximum simultaneous connections */ |
110 | __u32 reserved[126]; /* Reserved room */ | |
8b758859 | 111 | __u32 ifc_list_sz; /* interfaces list size */ |
9f88af04 NJ |
112 | __s8 ____payload[]; |
113 | }; | |
0626e664 NJ |
114 | |
115 | #define KSMBD_STARTUP_CONFIG_INTERFACES(s) ((s)->____payload) | |
116 | ||
8b758859 NJ |
117 | /* |
118 | * IPC request to shutdown ksmbd server. | |
119 | */ | |
0626e664 | 120 | struct ksmbd_shutdown_request { |
41dbda16 | 121 | __s32 reserved[16]; |
9f88af04 | 122 | }; |
0626e664 | 123 | |
8b758859 NJ |
124 | /* |
125 | * IPC user login request. | |
126 | */ | |
0626e664 NJ |
127 | struct ksmbd_login_request { |
128 | __u32 handle; | |
8b758859 | 129 | __s8 account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */ |
41dbda16 | 130 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 131 | }; |
0626e664 | 132 | |
8b758859 NJ |
133 | /* |
134 | * IPC user login response. | |
135 | */ | |
0626e664 NJ |
136 | struct ksmbd_login_response { |
137 | __u32 handle; | |
8b758859 NJ |
138 | __u32 gid; /* group id */ |
139 | __u32 uid; /* user id */ | |
140 | __s8 account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */ | |
0626e664 | 141 | __u16 status; |
8b758859 NJ |
142 | __u16 hash_sz; /* hash size */ |
143 | __s8 hash[KSMBD_REQ_MAX_HASH_SZ]; /* password hash */ | |
41dbda16 | 144 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 145 | }; |
0626e664 | 146 | |
8b758859 NJ |
147 | /* |
148 | * IPC request to fetch net share config. | |
149 | */ | |
0626e664 NJ |
150 | struct ksmbd_share_config_request { |
151 | __u32 handle; | |
8b758859 | 152 | __s8 share_name[KSMBD_REQ_MAX_SHARE_NAME]; /* share name */ |
41dbda16 | 153 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 154 | }; |
0626e664 | 155 | |
8b758859 NJ |
156 | /* |
157 | * IPC response to the net share config request. | |
158 | */ | |
0626e664 NJ |
159 | struct ksmbd_share_config_response { |
160 | __u32 handle; | |
161 | __u32 flags; | |
162 | __u16 create_mask; | |
163 | __u16 directory_mask; | |
164 | __u16 force_create_mode; | |
165 | __u16 force_directory_mode; | |
166 | __u16 force_uid; | |
167 | __u16 force_gid; | |
f5ba1cda AH |
168 | __s8 share_name[KSMBD_REQ_MAX_SHARE_NAME]; |
169 | __u32 reserved[112]; /* Reserved room */ | |
0626e664 | 170 | __u32 veto_list_sz; |
9f88af04 NJ |
171 | __s8 ____payload[]; |
172 | }; | |
0626e664 NJ |
173 | |
174 | #define KSMBD_SHARE_CONFIG_VETO_LIST(s) ((s)->____payload) | |
3fbe43c9 NJ |
175 | |
176 | static inline char * | |
177 | ksmbd_share_config_path(struct ksmbd_share_config_response *sc) | |
178 | { | |
179 | char *p = sc->____payload; | |
180 | ||
181 | if (sc->veto_list_sz) | |
182 | p += sc->veto_list_sz + 1; | |
183 | ||
184 | return p; | |
185 | } | |
0626e664 | 186 | |
8b758859 NJ |
187 | /* |
188 | * IPC request for tree connection. This request include session and tree | |
189 | * connect info from client. | |
190 | */ | |
0626e664 NJ |
191 | struct ksmbd_tree_connect_request { |
192 | __u32 handle; | |
193 | __u16 account_flags; | |
194 | __u16 flags; | |
195 | __u64 session_id; | |
196 | __u64 connect_id; | |
197 | __s8 account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; | |
198 | __s8 share[KSMBD_REQ_MAX_SHARE_NAME]; | |
199 | __s8 peer_addr[64]; | |
41dbda16 | 200 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 201 | }; |
0626e664 | 202 | |
8b758859 NJ |
203 | /* |
204 | * IPC Response structure for tree connection. | |
205 | */ | |
0626e664 NJ |
206 | struct ksmbd_tree_connect_response { |
207 | __u32 handle; | |
208 | __u16 status; | |
209 | __u16 connection_flags; | |
41dbda16 | 210 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 211 | }; |
0626e664 | 212 | |
8b758859 NJ |
213 | /* |
214 | * IPC Request struture to disconnect tree connection. | |
215 | */ | |
0626e664 | 216 | struct ksmbd_tree_disconnect_request { |
8b758859 NJ |
217 | __u64 session_id; /* session id */ |
218 | __u64 connect_id; /* tree connection id */ | |
41dbda16 | 219 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 220 | }; |
0626e664 | 221 | |
8b758859 NJ |
222 | /* |
223 | * IPC Response structure to logout user account. | |
224 | */ | |
0626e664 | 225 | struct ksmbd_logout_request { |
8b758859 | 226 | __s8 account[KSMBD_REQ_MAX_ACCOUNT_NAME_SZ]; /* user account name */ |
621be84a | 227 | __u32 account_flags; |
41dbda16 | 228 | __u32 reserved[16]; /* Reserved room */ |
9f88af04 | 229 | }; |
0626e664 | 230 | |
8b758859 NJ |
231 | /* |
232 | * RPC command structure to send rpc request like srvsvc or wkssvc to | |
233 | * IPC user daemon. | |
234 | */ | |
0626e664 NJ |
235 | struct ksmbd_rpc_command { |
236 | __u32 handle; | |
237 | __u32 flags; | |
238 | __u32 payload_sz; | |
9f88af04 NJ |
239 | __u8 payload[]; |
240 | }; | |
0626e664 | 241 | |
8b758859 NJ |
242 | /* |
243 | * IPC Request Kerberos authentication | |
244 | */ | |
0626e664 NJ |
245 | struct ksmbd_spnego_authen_request { |
246 | __u32 handle; | |
8b758859 | 247 | __u16 spnego_blob_len; /* the length of spnego_blob */ |
5224f790 | 248 | __u8 spnego_blob[]; /* |
8b758859 NJ |
249 | * the GSS token from SecurityBuffer of |
250 | * SMB2 SESSION SETUP request | |
251 | */ | |
9f88af04 | 252 | }; |
0626e664 | 253 | |
8b758859 NJ |
254 | /* |
255 | * Response data which includes the GSS token and the session key generated by | |
256 | * user daemon. | |
257 | */ | |
0626e664 NJ |
258 | struct ksmbd_spnego_authen_response { |
259 | __u32 handle; | |
8b758859 NJ |
260 | struct ksmbd_login_response login_response; /* |
261 | * the login response with | |
262 | * a user identified by the | |
263 | * GSS token from a client | |
264 | */ | |
265 | __u16 session_key_len; /* the length of the session key */ | |
266 | __u16 spnego_blob_len; /* | |
267 | * the length of the GSS token which will be | |
268 | * stored in SecurityBuffer of SMB2 SESSION | |
269 | * SETUP response | |
270 | */ | |
271 | __u8 payload[]; /* session key + AP_REP */ | |
9f88af04 | 272 | }; |
0626e664 NJ |
273 | |
274 | /* | |
275 | * This also used as NETLINK attribute type value. | |
276 | * | |
277 | * NOTE: | |
278 | * Response message type value should be equal to | |
279 | * request message type value + 1. | |
280 | */ | |
281 | enum ksmbd_event { | |
282 | KSMBD_EVENT_UNSPEC = 0, | |
283 | KSMBD_EVENT_HEARTBEAT_REQUEST, | |
284 | ||
285 | KSMBD_EVENT_STARTING_UP, | |
286 | KSMBD_EVENT_SHUTTING_DOWN, | |
287 | ||
288 | KSMBD_EVENT_LOGIN_REQUEST, | |
289 | KSMBD_EVENT_LOGIN_RESPONSE = 5, | |
290 | ||
291 | KSMBD_EVENT_SHARE_CONFIG_REQUEST, | |
292 | KSMBD_EVENT_SHARE_CONFIG_RESPONSE, | |
293 | ||
294 | KSMBD_EVENT_TREE_CONNECT_REQUEST, | |
295 | KSMBD_EVENT_TREE_CONNECT_RESPONSE, | |
296 | ||
297 | KSMBD_EVENT_TREE_DISCONNECT_REQUEST = 10, | |
298 | ||
299 | KSMBD_EVENT_LOGOUT_REQUEST, | |
300 | ||
301 | KSMBD_EVENT_RPC_REQUEST, | |
302 | KSMBD_EVENT_RPC_RESPONSE, | |
303 | ||
304 | KSMBD_EVENT_SPNEGO_AUTHEN_REQUEST, | |
305 | KSMBD_EVENT_SPNEGO_AUTHEN_RESPONSE = 15, | |
306 | ||
307 | KSMBD_EVENT_MAX | |
308 | }; | |
309 | ||
8b758859 NJ |
310 | /* |
311 | * Enumeration for IPC tree connect status. | |
312 | */ | |
0626e664 NJ |
313 | enum KSMBD_TREE_CONN_STATUS { |
314 | KSMBD_TREE_CONN_STATUS_OK = 0, | |
315 | KSMBD_TREE_CONN_STATUS_NOMEM, | |
316 | KSMBD_TREE_CONN_STATUS_NO_SHARE, | |
317 | KSMBD_TREE_CONN_STATUS_NO_USER, | |
318 | KSMBD_TREE_CONN_STATUS_INVALID_USER, | |
319 | KSMBD_TREE_CONN_STATUS_HOST_DENIED = 5, | |
320 | KSMBD_TREE_CONN_STATUS_CONN_EXIST, | |
321 | KSMBD_TREE_CONN_STATUS_TOO_MANY_CONNS, | |
322 | KSMBD_TREE_CONN_STATUS_TOO_MANY_SESSIONS, | |
323 | KSMBD_TREE_CONN_STATUS_ERROR, | |
324 | }; | |
325 | ||
326 | /* | |
327 | * User config flags. | |
328 | */ | |
329 | #define KSMBD_USER_FLAG_INVALID (0) | |
64b39f4a NJ |
330 | #define KSMBD_USER_FLAG_OK BIT(0) |
331 | #define KSMBD_USER_FLAG_BAD_PASSWORD BIT(1) | |
332 | #define KSMBD_USER_FLAG_BAD_UID BIT(2) | |
333 | #define KSMBD_USER_FLAG_BAD_USER BIT(3) | |
334 | #define KSMBD_USER_FLAG_GUEST_ACCOUNT BIT(4) | |
621be84a | 335 | #define KSMBD_USER_FLAG_DELAY_SESSION BIT(5) |
0626e664 NJ |
336 | |
337 | /* | |
338 | * Share config flags. | |
339 | */ | |
340 | #define KSMBD_SHARE_FLAG_INVALID (0) | |
64b39f4a NJ |
341 | #define KSMBD_SHARE_FLAG_AVAILABLE BIT(0) |
342 | #define KSMBD_SHARE_FLAG_BROWSEABLE BIT(1) | |
343 | #define KSMBD_SHARE_FLAG_WRITEABLE BIT(2) | |
344 | #define KSMBD_SHARE_FLAG_READONLY BIT(3) | |
345 | #define KSMBD_SHARE_FLAG_GUEST_OK BIT(4) | |
346 | #define KSMBD_SHARE_FLAG_GUEST_ONLY BIT(5) | |
347 | #define KSMBD_SHARE_FLAG_STORE_DOS_ATTRS BIT(6) | |
348 | #define KSMBD_SHARE_FLAG_OPLOCKS BIT(7) | |
349 | #define KSMBD_SHARE_FLAG_PIPE BIT(8) | |
350 | #define KSMBD_SHARE_FLAG_HIDE_DOT_FILES BIT(9) | |
d710f37c NJ |
351 | #define KSMBD_SHARE_FLAG_INHERIT_OWNER BIT(10) |
352 | #define KSMBD_SHARE_FLAG_STREAMS BIT(11) | |
353 | #define KSMBD_SHARE_FLAG_FOLLOW_SYMLINKS BIT(12) | |
354 | #define KSMBD_SHARE_FLAG_ACL_XATTR BIT(13) | |
4963d74f | 355 | #define KSMBD_SHARE_FLAG_UPDATE BIT(14) |
0626e664 NJ |
356 | |
357 | /* | |
358 | * Tree connect request flags. | |
359 | */ | |
360 | #define KSMBD_TREE_CONN_FLAG_REQUEST_SMB1 (0) | |
64b39f4a NJ |
361 | #define KSMBD_TREE_CONN_FLAG_REQUEST_IPV6 BIT(0) |
362 | #define KSMBD_TREE_CONN_FLAG_REQUEST_SMB2 BIT(1) | |
0626e664 NJ |
363 | |
364 | /* | |
365 | * Tree connect flags. | |
366 | */ | |
64b39f4a NJ |
367 | #define KSMBD_TREE_CONN_FLAG_GUEST_ACCOUNT BIT(0) |
368 | #define KSMBD_TREE_CONN_FLAG_READ_ONLY BIT(1) | |
369 | #define KSMBD_TREE_CONN_FLAG_WRITABLE BIT(2) | |
370 | #define KSMBD_TREE_CONN_FLAG_ADMIN_ACCOUNT BIT(3) | |
4963d74f | 371 | #define KSMBD_TREE_CONN_FLAG_UPDATE BIT(4) |
0626e664 NJ |
372 | |
373 | /* | |
374 | * RPC over IPC. | |
375 | */ | |
64b39f4a NJ |
376 | #define KSMBD_RPC_METHOD_RETURN BIT(0) |
377 | #define KSMBD_RPC_SRVSVC_METHOD_INVOKE BIT(1) | |
378 | #define KSMBD_RPC_SRVSVC_METHOD_RETURN (KSMBD_RPC_SRVSVC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN) | |
379 | #define KSMBD_RPC_WKSSVC_METHOD_INVOKE BIT(2) | |
380 | #define KSMBD_RPC_WKSSVC_METHOD_RETURN (KSMBD_RPC_WKSSVC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN) | |
381 | #define KSMBD_RPC_IOCTL_METHOD (BIT(3) | KSMBD_RPC_METHOD_RETURN) | |
382 | #define KSMBD_RPC_OPEN_METHOD BIT(4) | |
383 | #define KSMBD_RPC_WRITE_METHOD BIT(5) | |
384 | #define KSMBD_RPC_READ_METHOD (BIT(6) | KSMBD_RPC_METHOD_RETURN) | |
385 | #define KSMBD_RPC_CLOSE_METHOD BIT(7) | |
386 | #define KSMBD_RPC_RAP_METHOD (BIT(8) | KSMBD_RPC_METHOD_RETURN) | |
387 | #define KSMBD_RPC_RESTRICTED_CONTEXT BIT(9) | |
388 | #define KSMBD_RPC_SAMR_METHOD_INVOKE BIT(10) | |
389 | #define KSMBD_RPC_SAMR_METHOD_RETURN (KSMBD_RPC_SAMR_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN) | |
390 | #define KSMBD_RPC_LSARPC_METHOD_INVOKE BIT(11) | |
391 | #define KSMBD_RPC_LSARPC_METHOD_RETURN (KSMBD_RPC_LSARPC_METHOD_INVOKE | KSMBD_RPC_METHOD_RETURN) | |
0626e664 | 392 | |
8b758859 NJ |
393 | /* |
394 | * RPC status definitions. | |
395 | */ | |
0626e664 NJ |
396 | #define KSMBD_RPC_OK 0 |
397 | #define KSMBD_RPC_EBAD_FUNC 0x00000001 | |
398 | #define KSMBD_RPC_EACCESS_DENIED 0x00000005 | |
399 | #define KSMBD_RPC_EBAD_FID 0x00000006 | |
400 | #define KSMBD_RPC_ENOMEM 0x00000008 | |
401 | #define KSMBD_RPC_EBAD_DATA 0x0000000D | |
402 | #define KSMBD_RPC_ENOTIMPLEMENTED 0x00000040 | |
403 | #define KSMBD_RPC_EINVALID_PARAMETER 0x00000057 | |
404 | #define KSMBD_RPC_EMORE_DATA 0x000000EA | |
405 | #define KSMBD_RPC_EINVALID_LEVEL 0x0000007C | |
406 | #define KSMBD_RPC_SOME_NOT_MAPPED 0x00000107 | |
407 | ||
408 | #define KSMBD_CONFIG_OPT_DISABLED 0 | |
409 | #define KSMBD_CONFIG_OPT_ENABLED 1 | |
410 | #define KSMBD_CONFIG_OPT_AUTO 2 | |
411 | #define KSMBD_CONFIG_OPT_MANDATORY 3 | |
412 | ||
413 | #endif /* _LINUX_KSMBD_SERVER_H */ |