diff options
Diffstat (limited to 'fs/cifs/cifspdu.h')
| -rw-r--r-- | fs/cifs/cifspdu.h | 62 |
1 files changed, 58 insertions, 4 deletions
diff --git a/fs/cifs/cifspdu.h b/fs/cifs/cifspdu.h index de36b09763a8..b5c8cc5d7a7f 100644 --- a/fs/cifs/cifspdu.h +++ b/fs/cifs/cifspdu.h | |||
| @@ -23,6 +23,7 @@ | |||
| 23 | #define _CIFSPDU_H | 23 | #define _CIFSPDU_H |
| 24 | 24 | ||
| 25 | #include <net/sock.h> | 25 | #include <net/sock.h> |
| 26 | #include <asm/unaligned.h> | ||
| 26 | #include "smbfsctl.h" | 27 | #include "smbfsctl.h" |
| 27 | 28 | ||
| 28 | #ifdef CONFIG_CIFS_WEAK_PW_HASH | 29 | #ifdef CONFIG_CIFS_WEAK_PW_HASH |
| @@ -50,6 +51,7 @@ | |||
| 50 | #define SMB_COM_SETATTR 0x09 /* trivial response */ | 51 | #define SMB_COM_SETATTR 0x09 /* trivial response */ |
| 51 | #define SMB_COM_LOCKING_ANDX 0x24 /* trivial response */ | 52 | #define SMB_COM_LOCKING_ANDX 0x24 /* trivial response */ |
| 52 | #define SMB_COM_COPY 0x29 /* trivial rsp, fail filename ignrd*/ | 53 | #define SMB_COM_COPY 0x29 /* trivial rsp, fail filename ignrd*/ |
| 54 | #define SMB_COM_ECHO 0x2B /* echo request */ | ||
| 53 | #define SMB_COM_OPEN_ANDX 0x2D /* Legacy open for old servers */ | 55 | #define SMB_COM_OPEN_ANDX 0x2D /* Legacy open for old servers */ |
| 54 | #define SMB_COM_READ_ANDX 0x2E | 56 | #define SMB_COM_READ_ANDX 0x2E |
| 55 | #define SMB_COM_WRITE_ANDX 0x2F | 57 | #define SMB_COM_WRITE_ANDX 0x2F |
| @@ -425,11 +427,49 @@ struct smb_hdr { | |||
| 425 | __u16 Mid; | 427 | __u16 Mid; |
| 426 | __u8 WordCount; | 428 | __u8 WordCount; |
| 427 | } __attribute__((packed)); | 429 | } __attribute__((packed)); |
| 428 | /* given a pointer to an smb_hdr retrieve the value of byte count */ | 430 | |
| 429 | #define BCC(smb_var) (*(__u16 *)((char *)(smb_var) + sizeof(struct smb_hdr) + (2 * (smb_var)->WordCount))) | 431 | /* given a pointer to an smb_hdr retrieve a char pointer to the byte count */ |
| 430 | #define BCC_LE(smb_var) (*(__le16 *)((char *)(smb_var) + sizeof(struct smb_hdr) + (2 * (smb_var)->WordCount))) | 432 | #define BCC(smb_var) ((unsigned char *)(smb_var) + sizeof(struct smb_hdr) + \ |
| 433 | (2 * (smb_var)->WordCount)) | ||
| 434 | |||
| 431 | /* given a pointer to an smb_hdr retrieve the pointer to the byte area */ | 435 | /* given a pointer to an smb_hdr retrieve the pointer to the byte area */ |
| 432 | #define pByteArea(smb_var) ((unsigned char *)(smb_var) + sizeof(struct smb_hdr) + (2 * (smb_var)->WordCount) + 2) | 436 | #define pByteArea(smb_var) (BCC(smb_var) + 2) |
| 437 | |||
| 438 | /* get the converted ByteCount for a SMB packet and return it */ | ||
| 439 | static inline __u16 | ||
| 440 | get_bcc(struct smb_hdr *hdr) | ||
| 441 | { | ||
| 442 | __u16 *bc_ptr = (__u16 *)BCC(hdr); | ||
| 443 | |||
| 444 | return get_unaligned(bc_ptr); | ||
| 445 | } | ||
| 446 | |||
| 447 | /* get the unconverted ByteCount for a SMB packet and return it */ | ||
| 448 | static inline __u16 | ||
| 449 | get_bcc_le(struct smb_hdr *hdr) | ||
| 450 | { | ||
| 451 | __le16 *bc_ptr = (__le16 *)BCC(hdr); | ||
| 452 | |||
| 453 | return get_unaligned_le16(bc_ptr); | ||
| 454 | } | ||
| 455 | |||
| 456 | /* set the ByteCount for a SMB packet in host-byte order */ | ||
| 457 | static inline void | ||
| 458 | put_bcc(__u16 count, struct smb_hdr *hdr) | ||
| 459 | { | ||
| 460 | __u16 *bc_ptr = (__u16 *)BCC(hdr); | ||
| 461 | |||
| 462 | put_unaligned(count, bc_ptr); | ||
| 463 | } | ||
| 464 | |||
| 465 | /* set the ByteCount for a SMB packet in little-endian */ | ||
| 466 | static inline void | ||
| 467 | put_bcc_le(__u16 count, struct smb_hdr *hdr) | ||
| 468 | { | ||
| 469 | __le16 *bc_ptr = (__le16 *)BCC(hdr); | ||
| 470 | |||
| 471 | put_unaligned_le16(count, bc_ptr); | ||
| 472 | } | ||
| 433 | 473 | ||
| 434 | /* | 474 | /* |
| 435 | * Computer Name Length (since Netbios name was length 16 with last byte 0x20) | 475 | * Computer Name Length (since Netbios name was length 16 with last byte 0x20) |
| @@ -760,6 +800,20 @@ typedef struct smb_com_tconx_rsp_ext { | |||
| 760 | * | 800 | * |
| 761 | */ | 801 | */ |
| 762 | 802 | ||
| 803 | typedef struct smb_com_echo_req { | ||
| 804 | struct smb_hdr hdr; | ||
| 805 | __le16 EchoCount; | ||
| 806 | __le16 ByteCount; | ||
| 807 | char Data[1]; | ||
| 808 | } __attribute__((packed)) ECHO_REQ; | ||
| 809 | |||
| 810 | typedef struct smb_com_echo_rsp { | ||
| 811 | struct smb_hdr hdr; | ||
| 812 | __le16 SequenceNumber; | ||
| 813 | __le16 ByteCount; | ||
| 814 | char Data[1]; | ||
| 815 | } __attribute__((packed)) ECHO_RSP; | ||
| 816 | |||
| 763 | typedef struct smb_com_logoff_andx_req { | 817 | typedef struct smb_com_logoff_andx_req { |
| 764 | struct smb_hdr hdr; /* wct = 2 */ | 818 | struct smb_hdr hdr; /* wct = 2 */ |
| 765 | __u8 AndXCommand; | 819 | __u8 AndXCommand; |
