diff options
author | Lars Müller | 2008-03-01 19:30:38 +0100 |
---|---|---|
committer | Lars Müller | 2008-03-01 19:30:38 +0100 |
commit | 93b9103f7383d400616d222606c294e07b16e1aa (patch) | |
tree | 611a39f7bc1d1dd5a4335157ef95c101d64dddc8 /include | |
download | dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.tar.gz dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.tar.xz dnbd2-93b9103f7383d400616d222606c294e07b16e1aa.zip |
Import dnbd* from the former openslx-contrib repo as of revision 92.
openslx-contrib is currently read only and will get removed in some
days.
git-svn-id: http://svn.openslx.org/svn/openslx/contrib/dnbd2/trunk@1592 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'include')
-rw-r--r-- | include/dnbd2.h | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/include/dnbd2.h b/include/dnbd2.h new file mode 100644 index 0000000..4035b11 --- /dev/null +++ b/include/dnbd2.h @@ -0,0 +1,131 @@ +/* + * libs/dnbd2.h - Stuff that applies to all programs. + */ + + +/* + * The Linux Kernel's minimum block request size is PAGE_SIZE. We use + * the same block size to simplify things. We don't care about other + * sizes because our software is platform dependant. + */ +#define DNBD2_BLOCK_SIZE 4096 + +/* + * Commands the data-server understands. + */ +#define CMD_GET_BLOCK 1 /* Request a block. */ +#define CMD_GET_SIZE 2 /* Request the size of a Dataset. */ +#define CMD_GET_SERVERS 3 /* Request a list of alternative servers. */ + +/* + * Maximum number of alternative data-servers per dataset. + */ +#define ALT_SERVERS_MAX 4 + +/* + * Maximum lenght of strings including the ending \0. + */ +#define FILE_NAME_MAX 255 +#define LINE_SIZE_MAX FILE_NAME_MAX + +/* + * Network byte order <-> Host byte order (64bits). + */ +#ifndef MODULE +#if __BYTE_ORDER == __BIG_ENDIAN +#define ntohll(x) (x) +#define htonll(x) (x) +#else +#define ntohll(x) bswap_64(x) +#define htonll(x) bswap_64(x) +#endif +#endif + + +/* + * Dataset + */ +typedef struct dataset { + char path[FILE_NAME_MAX]; /* pathname to file or block-device */ + uint16_t vid; /* Volume-ID */ + uint16_t rid; /* Release-ID */ +} dataset_t; + +/* + * Structure to identify servers. + */ +#pragma pack(4) +typedef struct dnbd2_server { + uint32_t ip; /* IP (network byte order) */ + uint16_t port; /* Port (network byte order) */ + uint16_t pad; /* Padding - unused */ +} dnbd2_server_t; +#pragma pack() + +/* + * Structure for requests: + * + * <--------- 64 bits ---------> + * + * +---------------------------+ + * | cmd | time | vid | rid | + * |---------------------------| + * | offset | + * +---------------------------+ + * + * - cmd: Command (defined above) + * - time: Time of request + * - vid: Volume-ID + * - rid: Release-ID + * - num: Offset (for CMD_GET_BLOCK), otherwise undefined + */ +#pragma pack(1) +typedef struct dnbd2_data_request { + uint16_t cmd; + uint16_t time; + uint16_t vid; + uint16_t rid; + uint64_t num; +} dnbd2_data_request_t; +#pragma pack() + +/* + * Structure for replies: + * + * <--------- 64 bits ---------> + * + * +---------------------------+ + * | cmd | time | vid | rid | + * |---------------------------| + * | offset/size/n.servers | + * |---------------------------| + * | | + * | (4KB) | + * | Block/List of servers | + * | | + * +---------------------------+ + * + * - req.cmd: Always echoed + * - req.time: Always echoed + * - req.vid: Always echoed + * - req.rid: Always echoed + * - req.num: Echoed (for CMD_GET_BLOCK) or + * Dataset size (for CMD_GET_SIZE) or + * Number of Servers (for CMD_GET_SERVERS) + * - payload: A block (for CMD_GET_BLOCK) or + * Undefined (for CMD_GET_SIZE) or + * List of Servers (for CMD_GET_SIZE) + */ +#pragma pack(1) +typedef struct dnbd2_data_reply { + uint16_t cmd; + uint16_t time; + uint16_t vid; + uint16_t rid; + uint64_t num; + union { + uint8_t data[DNBD2_BLOCK_SIZE]; + dnbd2_server_t server[ALT_SERVERS_MAX]; + } payload; +} dnbd2_data_reply_t; +#pragma pack() |