smb2pdu.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /* SPDX-License-Identifier: LGPL-2.1 */
  2. /*
  3. *
  4. * Copyright (c) International Business Machines Corp., 2009, 2013
  5. * Etersoft, 2012
  6. * Author(s): Steve French ([email protected])
  7. * Pavel Shilovsky ([email protected]) 2012
  8. *
  9. */
  10. #ifndef _SMB2PDU_H
  11. #define _SMB2PDU_H
  12. #include <net/sock.h>
  13. #include "cifsacl.h"
  14. /* 52 transform hdr + 64 hdr + 88 create rsp */
  15. #define SMB2_TRANSFORM_HEADER_SIZE 52
  16. #define MAX_SMB2_HDR_SIZE 204
  17. /* The total header size for SMB2 read and write */
  18. #define SMB2_READWRITE_PDU_HEADER_SIZE (48 + sizeof(struct smb2_hdr))
  19. /* See MS-SMB2 2.2.43 */
  20. struct smb2_rdma_transform {
  21. __le16 RdmaDescriptorOffset;
  22. __le16 RdmaDescriptorLength;
  23. __le32 Channel; /* for values see channel description in smb2 read above */
  24. __le16 TransformCount;
  25. __le16 Reserved1;
  26. __le32 Reserved2;
  27. } __packed;
  28. /* TransformType */
  29. #define SMB2_RDMA_TRANSFORM_TYPE_ENCRYPTION 0x0001
  30. #define SMB2_RDMA_TRANSFORM_TYPE_SIGNING 0x0002
  31. struct smb2_rdma_crypto_transform {
  32. __le16 TransformType;
  33. __le16 SignatureLength;
  34. __le16 NonceLength;
  35. __u16 Reserved;
  36. __u8 Signature[]; /* variable length */
  37. /* u8 Nonce[] */
  38. /* followed by padding */
  39. } __packed;
  40. /*
  41. * Definitions for SMB2 Protocol Data Units (network frames)
  42. *
  43. * See MS-SMB2.PDF specification for protocol details.
  44. * The Naming convention is the lower case version of the SMB2
  45. * command code name for the struct. Note that structures must be packed.
  46. *
  47. */
  48. #define COMPOUND_FID 0xFFFFFFFFFFFFFFFFULL
  49. #define SMB2_SYMLINK_STRUCT_SIZE \
  50. (sizeof(struct smb2_err_rsp) - 1 + sizeof(struct smb2_symlink_err_rsp))
  51. #define SYMLINK_ERROR_TAG 0x4c4d5953
  52. struct smb2_symlink_err_rsp {
  53. __le32 SymLinkLength;
  54. __le32 SymLinkErrorTag;
  55. __le32 ReparseTag;
  56. __le16 ReparseDataLength;
  57. __le16 UnparsedPathLength;
  58. __le16 SubstituteNameOffset;
  59. __le16 SubstituteNameLength;
  60. __le16 PrintNameOffset;
  61. __le16 PrintNameLength;
  62. __le32 Flags;
  63. __u8 PathBuffer[];
  64. } __packed;
  65. /* SMB 3.1.1 and later dialects. See MS-SMB2 section 2.2.2.1 */
  66. struct smb2_error_context_rsp {
  67. __le32 ErrorDataLength;
  68. __le32 ErrorId;
  69. __u8 ErrorContextData; /* ErrorDataLength long array */
  70. } __packed;
  71. /* ErrorId values */
  72. #define SMB2_ERROR_ID_DEFAULT 0x00000000
  73. #define SMB2_ERROR_ID_SHARE_REDIRECT cpu_to_le32(0x72645253) /* "rdRS" */
  74. /* Defines for Type field below (see MS-SMB2 2.2.2.2.2.1) */
  75. #define MOVE_DST_IPADDR_V4 cpu_to_le32(0x00000001)
  76. #define MOVE_DST_IPADDR_V6 cpu_to_le32(0x00000002)
  77. struct move_dst_ipaddr {
  78. __le32 Type;
  79. __u32 Reserved;
  80. __u8 address[16]; /* IPv4 followed by 12 bytes rsvd or IPv6 address */
  81. } __packed;
  82. struct share_redirect_error_context_rsp {
  83. __le32 StructureSize;
  84. __le32 NotificationType;
  85. __le32 ResourceNameOffset;
  86. __le32 ResourceNameLength;
  87. __le16 Reserved;
  88. __le16 TargetType;
  89. __le32 IPAddrCount;
  90. struct move_dst_ipaddr IpAddrMoveList[];
  91. /* __u8 ResourceName[] */ /* Name of share as counted Unicode string */
  92. } __packed;
  93. /*
  94. * Maximum number of iovs we need for an open/create request.
  95. * [0] : struct smb2_create_req
  96. * [1] : path
  97. * [2] : lease context
  98. * [3] : durable context
  99. * [4] : posix context
  100. * [5] : time warp context
  101. * [6] : query id context
  102. * [7] : compound padding
  103. */
  104. #define SMB2_CREATE_IOV_SIZE 8
  105. /*
  106. * Maximum size of a SMB2_CREATE response is 64 (smb2 header) +
  107. * 88 (fixed part of create response) + 520 (path) + 208 (contexts) +
  108. * 2 bytes of padding.
  109. */
  110. #define MAX_SMB2_CREATE_RESPONSE_SIZE 880
  111. #define SMB2_LEASE_READ_CACHING_HE 0x01
  112. #define SMB2_LEASE_HANDLE_CACHING_HE 0x02
  113. #define SMB2_LEASE_WRITE_CACHING_HE 0x04
  114. struct create_durable {
  115. struct create_context ccontext;
  116. __u8 Name[8];
  117. union {
  118. __u8 Reserved[16];
  119. struct {
  120. __u64 PersistentFileId;
  121. __u64 VolatileFileId;
  122. } Fid;
  123. } Data;
  124. } __packed;
  125. /* See MS-SMB2 2.2.13.2.11 */
  126. /* Flags */
  127. #define SMB2_DHANDLE_FLAG_PERSISTENT 0x00000002
  128. struct durable_context_v2 {
  129. __le32 Timeout;
  130. __le32 Flags;
  131. __u64 Reserved;
  132. __u8 CreateGuid[16];
  133. } __packed;
  134. struct create_durable_v2 {
  135. struct create_context ccontext;
  136. __u8 Name[8];
  137. struct durable_context_v2 dcontext;
  138. } __packed;
  139. /* See MS-SMB2 2.2.13.2.12 */
  140. struct durable_reconnect_context_v2 {
  141. struct {
  142. __u64 PersistentFileId;
  143. __u64 VolatileFileId;
  144. } Fid;
  145. __u8 CreateGuid[16];
  146. __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
  147. } __packed;
  148. /* See MS-SMB2 2.2.14.2.9 */
  149. struct create_on_disk_id {
  150. struct create_context ccontext;
  151. __u8 Name[8];
  152. __le64 DiskFileId;
  153. __le64 VolumeId;
  154. __u32 Reserved[4];
  155. } __packed;
  156. /* See MS-SMB2 2.2.14.2.12 */
  157. struct durable_reconnect_context_v2_rsp {
  158. __le32 Timeout;
  159. __le32 Flags; /* see above DHANDLE_FLAG_PERSISTENT */
  160. } __packed;
  161. struct create_durable_handle_reconnect_v2 {
  162. struct create_context ccontext;
  163. __u8 Name[8];
  164. struct durable_reconnect_context_v2 dcontext;
  165. __u8 Pad[4];
  166. } __packed;
  167. /* See MS-SMB2 2.2.13.2.5 */
  168. struct crt_twarp_ctxt {
  169. struct create_context ccontext;
  170. __u8 Name[8];
  171. __le64 Timestamp;
  172. } __packed;
  173. /* See MS-SMB2 2.2.13.2.9 */
  174. struct crt_query_id_ctxt {
  175. struct create_context ccontext;
  176. __u8 Name[8];
  177. } __packed;
  178. struct crt_sd_ctxt {
  179. struct create_context ccontext;
  180. __u8 Name[8];
  181. struct smb3_sd sd;
  182. } __packed;
  183. #define COPY_CHUNK_RES_KEY_SIZE 24
  184. struct resume_key_req {
  185. char ResumeKey[COPY_CHUNK_RES_KEY_SIZE];
  186. __le32 ContextLength; /* MBZ */
  187. char Context[]; /* ignored, Windows sets to 4 bytes of zero */
  188. } __packed;
  189. /* this goes in the ioctl buffer when doing a copychunk request */
  190. struct copychunk_ioctl {
  191. char SourceKey[COPY_CHUNK_RES_KEY_SIZE];
  192. __le32 ChunkCount; /* we are only sending 1 */
  193. __le32 Reserved;
  194. /* array will only be one chunk long for us */
  195. __le64 SourceOffset;
  196. __le64 TargetOffset;
  197. __le32 Length; /* how many bytes to copy */
  198. __u32 Reserved2;
  199. } __packed;
  200. struct copychunk_ioctl_rsp {
  201. __le32 ChunksWritten;
  202. __le32 ChunkBytesWritten;
  203. __le32 TotalBytesWritten;
  204. } __packed;
  205. /* See MS-FSCC 2.3.29 and 2.3.30 */
  206. struct get_retrieval_pointer_count_req {
  207. __le64 StartingVcn; /* virtual cluster number (signed) */
  208. } __packed;
  209. struct get_retrieval_pointer_count_rsp {
  210. __le32 ExtentCount;
  211. } __packed;
  212. /*
  213. * See MS-FSCC 2.3.33 and 2.3.34
  214. * request is the same as get_retrieval_point_count_req struct above
  215. */
  216. struct smb3_extents {
  217. __le64 NextVcn;
  218. __le64 Lcn; /* logical cluster number */
  219. } __packed;
  220. struct get_retrieval_pointers_refcount_rsp {
  221. __le32 ExtentCount;
  222. __u32 Reserved;
  223. __le64 StartingVcn;
  224. struct smb3_extents extents[];
  225. } __packed;
  226. /* See MS-DFSC 2.2.2 */
  227. struct fsctl_get_dfs_referral_req {
  228. __le16 MaxReferralLevel;
  229. __u8 RequestFileName[];
  230. } __packed;
  231. /* DFS response is struct get_dfs_refer_rsp */
  232. /* See MS-SMB2 2.2.31.3 */
  233. struct network_resiliency_req {
  234. __le32 Timeout;
  235. __le32 Reserved;
  236. } __packed;
  237. /* There is no buffer for the response ie no struct network_resiliency_rsp */
  238. #define RSS_CAPABLE cpu_to_le32(0x00000001)
  239. #define RDMA_CAPABLE cpu_to_le32(0x00000002)
  240. #define INTERNETWORK cpu_to_le16(0x0002)
  241. #define INTERNETWORKV6 cpu_to_le16(0x0017)
  242. struct network_interface_info_ioctl_rsp {
  243. __le32 Next; /* next interface. zero if this is last one */
  244. __le32 IfIndex;
  245. __le32 Capability; /* RSS or RDMA Capable */
  246. __le32 Reserved;
  247. __le64 LinkSpeed;
  248. __le16 Family;
  249. __u8 Buffer[126];
  250. } __packed;
  251. struct iface_info_ipv4 {
  252. __be16 Port;
  253. __be32 IPv4Address;
  254. __be64 Reserved;
  255. } __packed;
  256. struct iface_info_ipv6 {
  257. __be16 Port;
  258. __be32 FlowInfo;
  259. __u8 IPv6Address[16];
  260. __be32 ScopeId;
  261. } __packed;
  262. #define NO_FILE_ID 0xFFFFFFFFFFFFFFFFULL /* general ioctls to srv not to file */
  263. struct compress_ioctl {
  264. __le16 CompressionState; /* See cifspdu.h for possible flag values */
  265. } __packed;
  266. /*
  267. * Maximum number of iovs we need for an ioctl request.
  268. * [0] : struct smb2_ioctl_req
  269. * [1] : in_data
  270. */
  271. #define SMB2_IOCTL_IOV_SIZE 2
  272. /*
  273. * PDU query infolevel structure definitions
  274. * BB consider moving to a different header
  275. */
  276. struct smb2_file_full_ea_info { /* encoding of response for level 15 */
  277. __le32 next_entry_offset;
  278. __u8 flags;
  279. __u8 ea_name_length;
  280. __le16 ea_value_length;
  281. char ea_data[]; /* \0 terminated name plus value */
  282. } __packed; /* level 15 Set */
  283. struct smb2_file_reparse_point_info {
  284. __le64 IndexNumber;
  285. __le32 Tag;
  286. } __packed;
  287. struct smb2_file_network_open_info {
  288. __le64 CreationTime;
  289. __le64 LastAccessTime;
  290. __le64 LastWriteTime;
  291. __le64 ChangeTime;
  292. __le64 AllocationSize;
  293. __le64 EndOfFile;
  294. __le32 Attributes;
  295. __le32 Reserved;
  296. } __packed; /* level 34 Query also similar returned in close rsp and open rsp */
  297. /* See MS-FSCC 2.4.21 */
  298. struct smb2_file_id_information {
  299. __le64 VolumeSerialNumber;
  300. __u64 PersistentFileId; /* opaque endianness */
  301. __u64 VolatileFileId; /* opaque endianness */
  302. } __packed; /* level 59 */
  303. /* See MS-FSCC 2.4.18 */
  304. struct smb2_file_id_extd_directory_info {
  305. __le32 NextEntryOffset;
  306. __u32 FileIndex;
  307. __le64 CreationTime;
  308. __le64 LastAccessTime;
  309. __le64 LastWriteTime;
  310. __le64 ChangeTime;
  311. __le64 EndOfFile;
  312. __le64 AllocationSize;
  313. __le32 FileAttributes;
  314. __le32 FileNameLength;
  315. __le32 EaSize; /* EA size */
  316. __le32 ReparsePointTag; /* valid if FILE_ATTR_REPARSE_POINT set in FileAttributes */
  317. __le64 UniqueId; /* inode num - le since Samba puts ino in low 32 bit */
  318. char FileName[1];
  319. } __packed; /* level 60 */
  320. extern char smb2_padding[7];
  321. /* equivalent of the contents of SMB3.1.1 POSIX open context response */
  322. struct create_posix_rsp {
  323. u32 nlink;
  324. u32 reparse_tag;
  325. u32 mode;
  326. struct cifs_sid owner; /* var-sized on the wire */
  327. struct cifs_sid group; /* var-sized on the wire */
  328. } __packed;
  329. #define SMB2_QUERY_DIRECTORY_IOV_SIZE 2
  330. /*
  331. * SMB2-only POSIX info level for query dir
  332. *
  333. * See posix_info_sid_size(), posix_info_extra_size() and
  334. * posix_info_parse() to help with the handling of this struct.
  335. */
  336. struct smb2_posix_info {
  337. __le32 NextEntryOffset;
  338. __u32 Ignored;
  339. __le64 CreationTime;
  340. __le64 LastAccessTime;
  341. __le64 LastWriteTime;
  342. __le64 ChangeTime;
  343. __le64 EndOfFile;
  344. __le64 AllocationSize;
  345. __le32 DosAttributes;
  346. __le64 Inode;
  347. __le32 DeviceId;
  348. __le32 Zero;
  349. /* beginning of POSIX Create Context Response */
  350. __le32 HardLinks;
  351. __le32 ReparseTag;
  352. __le32 Mode;
  353. /*
  354. * var sized owner SID
  355. * var sized group SID
  356. * le32 filenamelength
  357. * u8 filename[]
  358. */
  359. } __packed;
  360. /*
  361. * Parsed version of the above struct. Allows direct access to the
  362. * variable length fields
  363. */
  364. struct smb2_posix_info_parsed {
  365. const struct smb2_posix_info *base;
  366. size_t size;
  367. struct cifs_sid owner;
  368. struct cifs_sid group;
  369. int name_len;
  370. const u8 *name;
  371. };
  372. #endif /* _SMB2PDU_H */