blob: 4035b1130ffd7c5a4a0132024d6a6cca9449c6a4 (
plain) (
tree)
|
|
/*
* 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()
|