Commit | Line | Data |
---|---|---|
e2f34481 NJ |
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* | |
3 | * Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org> | |
4 | * Copyright (C) 2018 Samsung Electronics Co., Ltd. | |
5 | */ | |
6 | ||
7 | #ifndef _SMB2PDU_H | |
8 | #define _SMB2PDU_H | |
9 | ||
10 | #include "ntlmssp.h" | |
11 | #include "smbacl.h" | |
12 | ||
e2f34481 NJ |
13 | /*Create Action Flags*/ |
14 | #define FILE_SUPERSEDED 0x00000000 | |
15 | #define FILE_OPENED 0x00000001 | |
16 | #define FILE_CREATED 0x00000002 | |
17 | #define FILE_OVERWRITTEN 0x00000003 | |
18 | ||
e2f34481 NJ |
19 | /* SMB2 Max Credits */ |
20 | #define SMB2_MAX_CREDITS 8192 | |
21 | ||
e2f34481 NJ |
22 | /* BB FIXME - analyze following length BB */ |
23 | #define MAX_SMB2_HDR_SIZE 0x78 /* 4 len + 64 hdr + (2*24 wct) + 2 bct + 2 pad */ | |
24 | ||
e2f34481 | 25 | #define SMB21_DEFAULT_IOSIZE (1024 * 1024) |
e2f34481 | 26 | #define SMB3_DEFAULT_TRANS_SIZE (1024 * 1024) |
4bc59477 NJ |
27 | #define SMB3_MIN_IOSIZE (64 * 1024) |
28 | #define SMB3_MAX_IOSIZE (8 * 1024 * 1024) | |
e2f34481 | 29 | |
e2f34481 NJ |
30 | /* |
31 | * Definitions for SMB2 Protocol Data Units (network frames) | |
32 | * | |
33 | * See MS-SMB2.PDF specification for protocol details. | |
34 | * The Naming convention is the lower case version of the SMB2 | |
35 | * command code name for the struct. Note that structures must be packed. | |
36 | * | |
37 | */ | |
38 | ||
e2f34481 NJ |
39 | struct preauth_integrity_info { |
40 | /* PreAuth integrity Hash ID */ | |
41 | __le16 Preauth_HashId; | |
42 | /* PreAuth integrity Hash Value */ | |
d6c9ad23 | 43 | __u8 Preauth_HashValue[SMB2_PREAUTH_HASH_SIZE]; |
e2f34481 NJ |
44 | }; |
45 | ||
cb451720 | 46 | /* offset is sizeof smb2_negotiate_rsp but rounded up to 8 bytes. */ |
e2f34481 | 47 | #ifdef CONFIG_SMB_SERVER_KERBEROS5 |
cb451720 | 48 | /* sizeof(struct smb2_negotiate_rsp) = |
e2f34481 NJ |
49 | * header(64) + response(64) + GSS_LENGTH(96) + GSS_PADDING(0) |
50 | */ | |
51 | #define OFFSET_OF_NEG_CONTEXT 0xe0 | |
52 | #else | |
cb451720 | 53 | /* sizeof(struct smb2_negotiate_rsp) = |
e2f34481 NJ |
54 | * header(64) + response(64) + GSS_LENGTH(74) + GSS_PADDING(6) |
55 | */ | |
56 | #define OFFSET_OF_NEG_CONTEXT 0xd0 | |
57 | #endif | |
58 | ||
e2f34481 | 59 | #define SMB2_SESSION_EXPIRED (0) |
64b39f4a NJ |
60 | #define SMB2_SESSION_IN_PROGRESS BIT(0) |
61 | #define SMB2_SESSION_VALID BIT(1) | |
e2f34481 | 62 | |
e2f34481 NJ |
63 | struct create_durable_req_v2 { |
64 | struct create_context ccontext; | |
65 | __u8 Name[8]; | |
66 | __le32 Timeout; | |
67 | __le32 Flags; | |
68 | __u8 Reserved[8]; | |
69 | __u8 CreateGuid[16]; | |
70 | } __packed; | |
71 | ||
72 | struct create_durable_reconn_req { | |
73 | struct create_context ccontext; | |
74 | __u8 Name[8]; | |
75 | union { | |
76 | __u8 Reserved[16]; | |
77 | struct { | |
2d004c6c PA |
78 | __u64 PersistentFileId; |
79 | __u64 VolatileFileId; | |
e2f34481 NJ |
80 | } Fid; |
81 | } Data; | |
82 | } __packed; | |
83 | ||
84 | struct create_durable_reconn_v2_req { | |
85 | struct create_context ccontext; | |
86 | __u8 Name[8]; | |
87 | struct { | |
2d004c6c PA |
88 | __u64 PersistentFileId; |
89 | __u64 VolatileFileId; | |
e2f34481 NJ |
90 | } Fid; |
91 | __u8 CreateGuid[16]; | |
92 | __le32 Flags; | |
93 | } __packed; | |
94 | ||
95 | struct create_app_inst_id { | |
96 | struct create_context ccontext; | |
97 | __u8 Name[8]; | |
98 | __u8 Reserved[8]; | |
99 | __u8 AppInstanceId[16]; | |
100 | } __packed; | |
101 | ||
102 | struct create_app_inst_id_vers { | |
103 | struct create_context ccontext; | |
104 | __u8 Name[8]; | |
105 | __u8 Reserved[2]; | |
106 | __u8 Padding[4]; | |
107 | __le64 AppInstanceVersionHigh; | |
108 | __le64 AppInstanceVersionLow; | |
109 | } __packed; | |
110 | ||
111 | struct create_mxac_req { | |
112 | struct create_context ccontext; | |
113 | __u8 Name[8]; | |
114 | __le64 Timestamp; | |
115 | } __packed; | |
116 | ||
117 | struct create_alloc_size_req { | |
118 | struct create_context ccontext; | |
119 | __u8 Name[8]; | |
120 | __le64 AllocationSize; | |
121 | } __packed; | |
122 | ||
e2f34481 NJ |
123 | struct create_durable_rsp { |
124 | struct create_context ccontext; | |
125 | __u8 Name[8]; | |
126 | union { | |
127 | __u8 Reserved[8]; | |
128 | __u64 data; | |
129 | } Data; | |
130 | } __packed; | |
131 | ||
132 | struct create_durable_v2_rsp { | |
133 | struct create_context ccontext; | |
134 | __u8 Name[8]; | |
135 | __le32 Timeout; | |
136 | __le32 Flags; | |
137 | } __packed; | |
138 | ||
139 | struct create_mxac_rsp { | |
140 | struct create_context ccontext; | |
141 | __u8 Name[8]; | |
142 | __le32 QueryStatus; | |
143 | __le32 MaximalAccess; | |
144 | } __packed; | |
145 | ||
146 | struct create_disk_id_rsp { | |
147 | struct create_context ccontext; | |
148 | __u8 Name[8]; | |
149 | __le64 DiskFileId; | |
150 | __le64 VolumeId; | |
151 | __u8 Reserved[16]; | |
152 | } __packed; | |
153 | ||
154 | /* equivalent of the contents of SMB3.1.1 POSIX open context response */ | |
155 | struct create_posix_rsp { | |
156 | struct create_context ccontext; | |
157 | __u8 Name[16]; | |
158 | __le32 nlink; | |
159 | __le32 reparse_tag; | |
160 | __le32 mode; | |
161 | u8 SidBuffer[40]; | |
162 | } __packed; | |
163 | ||
e2f34481 NJ |
164 | struct smb2_buffer_desc_v1 { |
165 | __le64 offset; | |
166 | __le32 token; | |
167 | __le32 length; | |
168 | } __packed; | |
169 | ||
e2f34481 NJ |
170 | #define SMB2_0_IOCTL_IS_FSCTL 0x00000001 |
171 | ||
e2f34481 NJ |
172 | struct smb_sockaddr_in { |
173 | __be16 Port; | |
174 | __be32 IPv4address; | |
175 | __u8 Reserved[8]; | |
176 | } __packed; | |
177 | ||
178 | struct smb_sockaddr_in6 { | |
179 | __be16 Port; | |
180 | __be32 FlowInfo; | |
181 | __u8 IPv6address[16]; | |
182 | __be32 ScopeId; | |
183 | } __packed; | |
184 | ||
185 | #define INTERNETWORK 0x0002 | |
186 | #define INTERNETWORKV6 0x0017 | |
187 | ||
188 | struct sockaddr_storage_rsp { | |
189 | __le16 Family; | |
190 | union { | |
191 | struct smb_sockaddr_in addr4; | |
192 | struct smb_sockaddr_in6 addr6; | |
193 | }; | |
194 | } __packed; | |
195 | ||
196 | #define RSS_CAPABLE 0x00000001 | |
197 | #define RDMA_CAPABLE 0x00000002 | |
198 | ||
199 | struct network_interface_info_ioctl_rsp { | |
200 | __le32 Next; /* next interface. zero if this is last one */ | |
201 | __le32 IfIndex; | |
202 | __le32 Capability; /* RSS or RDMA Capable */ | |
203 | __le32 Reserved; | |
204 | __le64 LinkSpeed; | |
205 | char SockAddr_Storage[128]; | |
206 | } __packed; | |
207 | ||
208 | struct file_object_buf_type1_ioctl_rsp { | |
209 | __u8 ObjectId[16]; | |
210 | __u8 BirthVolumeId[16]; | |
211 | __u8 BirthObjectId[16]; | |
212 | __u8 DomainId[16]; | |
213 | } __packed; | |
214 | ||
215 | struct resume_key_ioctl_rsp { | |
2d004c6c | 216 | __u64 ResumeKey[3]; |
e2f34481 NJ |
217 | __le32 ContextLength; |
218 | __u8 Context[4]; /* ignored, Windows sets to 4 bytes of zero */ | |
219 | } __packed; | |
220 | ||
221 | struct copychunk_ioctl_req { | |
222 | __le64 ResumeKey[3]; | |
223 | __le32 ChunkCount; | |
224 | __le32 Reserved; | |
225 | __u8 Chunks[1]; /* array of srv_copychunk */ | |
226 | } __packed; | |
227 | ||
228 | struct srv_copychunk { | |
229 | __le64 SourceOffset; | |
230 | __le64 TargetOffset; | |
231 | __le32 Length; | |
232 | __le32 Reserved; | |
233 | } __packed; | |
234 | ||
235 | struct copychunk_ioctl_rsp { | |
236 | __le32 ChunksWritten; | |
237 | __le32 ChunkBytesWritten; | |
238 | __le32 TotalBytesWritten; | |
239 | } __packed; | |
240 | ||
241 | struct file_sparse { | |
242 | __u8 SetSparse; | |
243 | } __packed; | |
244 | ||
e2f34481 NJ |
245 | /* FILE Info response size */ |
246 | #define FILE_DIRECTORY_INFORMATION_SIZE 1 | |
247 | #define FILE_FULL_DIRECTORY_INFORMATION_SIZE 2 | |
248 | #define FILE_BOTH_DIRECTORY_INFORMATION_SIZE 3 | |
249 | #define FILE_BASIC_INFORMATION_SIZE 40 | |
250 | #define FILE_STANDARD_INFORMATION_SIZE 24 | |
251 | #define FILE_INTERNAL_INFORMATION_SIZE 8 | |
252 | #define FILE_EA_INFORMATION_SIZE 4 | |
253 | #define FILE_ACCESS_INFORMATION_SIZE 4 | |
254 | #define FILE_NAME_INFORMATION_SIZE 9 | |
255 | #define FILE_RENAME_INFORMATION_SIZE 10 | |
256 | #define FILE_LINK_INFORMATION_SIZE 11 | |
257 | #define FILE_NAMES_INFORMATION_SIZE 12 | |
258 | #define FILE_DISPOSITION_INFORMATION_SIZE 13 | |
259 | #define FILE_POSITION_INFORMATION_SIZE 14 | |
260 | #define FILE_FULL_EA_INFORMATION_SIZE 15 | |
261 | #define FILE_MODE_INFORMATION_SIZE 4 | |
262 | #define FILE_ALIGNMENT_INFORMATION_SIZE 4 | |
263 | #define FILE_ALL_INFORMATION_SIZE 104 | |
264 | #define FILE_ALLOCATION_INFORMATION_SIZE 19 | |
265 | #define FILE_END_OF_FILE_INFORMATION_SIZE 20 | |
266 | #define FILE_ALTERNATE_NAME_INFORMATION_SIZE 8 | |
267 | #define FILE_STREAM_INFORMATION_SIZE 32 | |
268 | #define FILE_PIPE_INFORMATION_SIZE 23 | |
269 | #define FILE_PIPE_LOCAL_INFORMATION_SIZE 24 | |
270 | #define FILE_PIPE_REMOTE_INFORMATION_SIZE 25 | |
271 | #define FILE_MAILSLOT_QUERY_INFORMATION_SIZE 26 | |
272 | #define FILE_MAILSLOT_SET_INFORMATION_SIZE 27 | |
273 | #define FILE_COMPRESSION_INFORMATION_SIZE 16 | |
274 | #define FILE_OBJECT_ID_INFORMATION_SIZE 29 | |
275 | /* Number 30 not defined in documents */ | |
276 | #define FILE_MOVE_CLUSTER_INFORMATION_SIZE 31 | |
277 | #define FILE_QUOTA_INFORMATION_SIZE 32 | |
278 | #define FILE_REPARSE_POINT_INFORMATION_SIZE 33 | |
279 | #define FILE_NETWORK_OPEN_INFORMATION_SIZE 56 | |
280 | #define FILE_ATTRIBUTE_TAG_INFORMATION_SIZE 8 | |
281 | ||
e2f34481 NJ |
282 | /* FS Info response size */ |
283 | #define FS_DEVICE_INFORMATION_SIZE 8 | |
284 | #define FS_ATTRIBUTE_INFORMATION_SIZE 16 | |
285 | #define FS_VOLUME_INFORMATION_SIZE 24 | |
286 | #define FS_SIZE_INFORMATION_SIZE 24 | |
287 | #define FS_FULL_SIZE_INFORMATION_SIZE 32 | |
288 | #define FS_SECTOR_SIZE_INFORMATION_SIZE 28 | |
289 | #define FS_OBJECT_ID_INFORMATION_SIZE 64 | |
290 | #define FS_CONTROL_INFORMATION_SIZE 48 | |
291 | #define FS_POSIX_INFORMATION_SIZE 56 | |
292 | ||
293 | /* FS_ATTRIBUTE_File_System_Name */ | |
294 | #define FS_TYPE_SUPPORT_SIZE 44 | |
295 | struct fs_type_info { | |
296 | char *fs_name; | |
297 | long magic_number; | |
298 | } __packed; | |
299 | ||
e2f34481 | 300 | /* |
be135000 | 301 | * PDU query infolevel structure definitions |
e2f34481 NJ |
302 | * BB consider moving to a different header |
303 | */ | |
304 | ||
e2f34481 NJ |
305 | struct smb2_file_access_info { |
306 | __le32 AccessFlags; | |
307 | } __packed; | |
308 | ||
309 | struct smb2_file_alignment_info { | |
310 | __le32 AlignmentRequirement; | |
311 | } __packed; | |
312 | ||
88d30052 NJ |
313 | struct smb2_file_basic_info { /* data block encoding of response to level 18 */ |
314 | __le64 CreationTime; /* Beginning of FILE_BASIC_INFO equivalent */ | |
315 | __le64 LastAccessTime; | |
316 | __le64 LastWriteTime; | |
317 | __le64 ChangeTime; | |
318 | __le32 Attributes; | |
319 | __u32 Pad1; /* End of FILE_BASIC_INFO_INFO equivalent */ | |
320 | } __packed; | |
321 | ||
e2f34481 NJ |
322 | struct smb2_file_alt_name_info { |
323 | __le32 FileNameLength; | |
5224f790 | 324 | char FileName[]; |
e2f34481 NJ |
325 | } __packed; |
326 | ||
327 | struct smb2_file_stream_info { | |
328 | __le32 NextEntryOffset; | |
329 | __le32 StreamNameLength; | |
330 | __le64 StreamSize; | |
331 | __le64 StreamAllocationSize; | |
5224f790 | 332 | char StreamName[]; |
e2f34481 NJ |
333 | } __packed; |
334 | ||
e2f34481 NJ |
335 | struct smb2_file_ntwrk_info { |
336 | __le64 CreationTime; | |
337 | __le64 LastAccessTime; | |
338 | __le64 LastWriteTime; | |
339 | __le64 ChangeTime; | |
340 | __le64 AllocationSize; | |
341 | __le64 EndOfFile; | |
342 | __le32 Attributes; | |
343 | __le32 Reserved; | |
344 | } __packed; | |
345 | ||
346 | struct smb2_file_standard_info { | |
347 | __le64 AllocationSize; | |
348 | __le64 EndOfFile; | |
349 | __le32 NumberOfLinks; /* hard links */ | |
350 | __u8 DeletePending; | |
351 | __u8 Directory; | |
352 | __le16 Reserved; | |
353 | } __packed; /* level 18 Query */ | |
354 | ||
355 | struct smb2_file_ea_info { | |
356 | __le32 EASize; | |
357 | } __packed; | |
358 | ||
359 | struct smb2_file_alloc_info { | |
360 | __le64 AllocationSize; | |
361 | } __packed; | |
362 | ||
363 | struct smb2_file_disposition_info { | |
364 | __u8 DeletePending; | |
365 | } __packed; | |
366 | ||
367 | struct smb2_file_pos_info { | |
368 | __le64 CurrentByteOffset; | |
369 | } __packed; | |
370 | ||
26a2787d | 371 | #define FILE_MODE_INFO_MASK cpu_to_le32(0x0000100e) |
e2f34481 NJ |
372 | |
373 | struct smb2_file_mode_info { | |
374 | __le32 Mode; | |
375 | } __packed; | |
376 | ||
377 | #define COMPRESSION_FORMAT_NONE 0x0000 | |
378 | #define COMPRESSION_FORMAT_LZNT1 0x0002 | |
379 | ||
380 | struct smb2_file_comp_info { | |
381 | __le64 CompressedFileSize; | |
382 | __le16 CompressionFormat; | |
383 | __u8 CompressionUnitShift; | |
384 | __u8 ChunkShift; | |
385 | __u8 ClusterShift; | |
386 | __u8 Reserved[3]; | |
387 | } __packed; | |
388 | ||
389 | struct smb2_file_attr_tag_info { | |
390 | __le32 FileAttributes; | |
391 | __le32 ReparseTag; | |
392 | } __packed; | |
393 | ||
394 | #define SL_RESTART_SCAN 0x00000001 | |
395 | #define SL_RETURN_SINGLE_ENTRY 0x00000002 | |
396 | #define SL_INDEX_SPECIFIED 0x00000004 | |
397 | ||
398 | struct smb2_ea_info_req { | |
399 | __le32 NextEntryOffset; | |
400 | __u8 EaNameLength; | |
401 | char name[1]; | |
402 | } __packed; /* level 15 Query */ | |
403 | ||
404 | struct smb2_ea_info { | |
405 | __le32 NextEntryOffset; | |
406 | __u8 Flags; | |
407 | __u8 EaNameLength; | |
408 | __le16 EaValueLength; | |
409 | char name[1]; | |
410 | /* optionally followed by value */ | |
411 | } __packed; /* level 15 Query */ | |
412 | ||
413 | struct create_ea_buf_req { | |
414 | struct create_context ccontext; | |
415 | __u8 Name[8]; | |
416 | struct smb2_ea_info ea; | |
417 | } __packed; | |
418 | ||
419 | struct create_sd_buf_req { | |
420 | struct create_context ccontext; | |
421 | __u8 Name[8]; | |
422 | struct smb_ntsd ntsd; | |
423 | } __packed; | |
424 | ||
e2f34481 NJ |
425 | struct smb2_posix_info { |
426 | __le32 NextEntryOffset; | |
427 | __u32 Ignored; | |
428 | __le64 CreationTime; | |
429 | __le64 LastAccessTime; | |
430 | __le64 LastWriteTime; | |
431 | __le64 ChangeTime; | |
432 | __le64 EndOfFile; | |
433 | __le64 AllocationSize; | |
434 | __le32 DosAttributes; | |
435 | __le64 Inode; | |
436 | __le32 DeviceId; | |
437 | __le32 Zero; | |
438 | /* beginning of POSIX Create Context Response */ | |
439 | __le32 HardLinks; | |
440 | __le32 ReparseTag; | |
441 | __le32 Mode; | |
442 | u8 SidBuffer[40]; | |
443 | __le32 name_len; | |
444 | u8 name[1]; | |
445 | /* | |
446 | * var sized owner SID | |
447 | * var sized group SID | |
448 | * le32 filenamelength | |
449 | * u8 filename[] | |
450 | */ | |
451 | } __packed; | |
452 | ||
453 | /* functions */ | |
64b39f4a NJ |
454 | void init_smb2_1_server(struct ksmbd_conn *conn); |
455 | void init_smb3_0_server(struct ksmbd_conn *conn); | |
456 | void init_smb3_02_server(struct ksmbd_conn *conn); | |
457 | int init_smb3_11_server(struct ksmbd_conn *conn); | |
458 | ||
459 | void init_smb2_max_read_size(unsigned int sz); | |
460 | void init_smb2_max_write_size(unsigned int sz); | |
461 | void init_smb2_max_trans_size(unsigned int sz); | |
004443b3 | 462 | void init_smb2_max_credits(unsigned int sz); |
64b39f4a | 463 | |
f4228b67 NJ |
464 | bool is_smb2_neg_cmd(struct ksmbd_work *work); |
465 | bool is_smb2_rsp(struct ksmbd_work *work); | |
64b39f4a NJ |
466 | |
467 | u16 get_smb2_cmd_val(struct ksmbd_work *work); | |
468 | void set_smb2_rsp_status(struct ksmbd_work *work, __le32 err); | |
469 | int init_smb2_rsp_hdr(struct ksmbd_work *work); | |
470 | int smb2_allocate_rsp_buf(struct ksmbd_work *work); | |
471 | bool is_chained_smb2_message(struct ksmbd_work *work); | |
472 | int init_smb2_neg_rsp(struct ksmbd_work *work); | |
473 | void smb2_set_err_rsp(struct ksmbd_work *work); | |
474 | int smb2_check_user_session(struct ksmbd_work *work); | |
475 | int smb2_get_ksmbd_tcon(struct ksmbd_work *work); | |
476 | bool smb2_is_sign_req(struct ksmbd_work *work, unsigned int command); | |
477 | int smb2_check_sign_req(struct ksmbd_work *work); | |
478 | void smb2_set_sign_rsp(struct ksmbd_work *work); | |
479 | int smb3_check_sign_req(struct ksmbd_work *work); | |
480 | void smb3_set_sign_rsp(struct ksmbd_work *work); | |
481 | int find_matching_smb2_dialect(int start_index, __le16 *cli_dialects, | |
d7e5852b | 482 | __le16 dialects_count); |
64b39f4a NJ |
483 | struct file_lock *smb_flock_init(struct file *f); |
484 | int setup_async_work(struct ksmbd_work *work, void (*fn)(void **), | |
d7e5852b | 485 | void **arg); |
64b39f4a | 486 | void smb2_send_interim_resp(struct ksmbd_work *work, __le32 status); |
f5a544e3 NJ |
487 | struct channel *lookup_chann_list(struct ksmbd_session *sess, |
488 | struct ksmbd_conn *conn); | |
64b39f4a | 489 | void smb3_preauth_hash_rsp(struct ksmbd_work *work); |
f4228b67 | 490 | bool smb3_is_transform_hdr(void *buf); |
64b39f4a NJ |
491 | int smb3_decrypt_req(struct ksmbd_work *work); |
492 | int smb3_encrypt_resp(struct ksmbd_work *work); | |
493 | bool smb3_11_final_sess_setup_resp(struct ksmbd_work *work); | |
494 | int smb2_set_rsp_credits(struct ksmbd_work *work); | |
e2f34481 NJ |
495 | |
496 | /* smb2 misc functions */ | |
64b39f4a | 497 | int ksmbd_smb2_check_message(struct ksmbd_work *work); |
e2f34481 NJ |
498 | |
499 | /* smb2 command handlers */ | |
64b39f4a NJ |
500 | int smb2_handle_negotiate(struct ksmbd_work *work); |
501 | int smb2_negotiate_request(struct ksmbd_work *work); | |
502 | int smb2_sess_setup(struct ksmbd_work *work); | |
503 | int smb2_tree_connect(struct ksmbd_work *work); | |
504 | int smb2_tree_disconnect(struct ksmbd_work *work); | |
505 | int smb2_session_logoff(struct ksmbd_work *work); | |
506 | int smb2_open(struct ksmbd_work *work); | |
507 | int smb2_query_info(struct ksmbd_work *work); | |
508 | int smb2_query_dir(struct ksmbd_work *work); | |
509 | int smb2_close(struct ksmbd_work *work); | |
510 | int smb2_echo(struct ksmbd_work *work); | |
511 | int smb2_set_info(struct ksmbd_work *work); | |
512 | int smb2_read(struct ksmbd_work *work); | |
513 | int smb2_write(struct ksmbd_work *work); | |
514 | int smb2_flush(struct ksmbd_work *work); | |
515 | int smb2_cancel(struct ksmbd_work *work); | |
516 | int smb2_lock(struct ksmbd_work *work); | |
517 | int smb2_ioctl(struct ksmbd_work *work); | |
518 | int smb2_oplock_break(struct ksmbd_work *work); | |
519 | int smb2_notify(struct ksmbd_work *ksmbd_work); | |
e2f34481 | 520 | |
cb451720 NJ |
521 | /* |
522 | * Get the body of the smb2 message excluding the 4 byte rfc1002 headers | |
523 | * from request/response buffer. | |
524 | */ | |
525 | static inline void *smb2_get_msg(void *buf) | |
526 | { | |
527 | return buf + 4; | |
528 | } | |
529 | ||
e2f34481 | 530 | #endif /* _SMB2PDU_H */ |