From 93b9103f7383d400616d222606c294e07b16e1aa Mon Sep 17 00:00:00 2001 From: Lars Müller Date: Sat, 1 Mar 2008 18:30:38 +0000 Subject: 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 --- include/dnbd2.h | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 include/dnbd2.h (limited to 'include') 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() -- cgit v1.2.3-55-g7522