1*93c68cc4SChristoph Böhmwalder /* SPDX-License-Identifier: GPL-2.0-only */ 2a3603a6eSAndreas Gruenbacher #ifndef __DRBD_PROTOCOL_H 3a3603a6eSAndreas Gruenbacher #define __DRBD_PROTOCOL_H 4a3603a6eSAndreas Gruenbacher 5a3603a6eSAndreas Gruenbacher enum drbd_packet { 6a3603a6eSAndreas Gruenbacher /* receiver (data socket) */ 7a3603a6eSAndreas Gruenbacher P_DATA = 0x00, 8a3603a6eSAndreas Gruenbacher P_DATA_REPLY = 0x01, /* Response to P_DATA_REQUEST */ 9a3603a6eSAndreas Gruenbacher P_RS_DATA_REPLY = 0x02, /* Response to P_RS_DATA_REQUEST */ 10a3603a6eSAndreas Gruenbacher P_BARRIER = 0x03, 11a3603a6eSAndreas Gruenbacher P_BITMAP = 0x04, 12a3603a6eSAndreas Gruenbacher P_BECOME_SYNC_TARGET = 0x05, 13a3603a6eSAndreas Gruenbacher P_BECOME_SYNC_SOURCE = 0x06, 14a3603a6eSAndreas Gruenbacher P_UNPLUG_REMOTE = 0x07, /* Used at various times to hint the peer */ 15a3603a6eSAndreas Gruenbacher P_DATA_REQUEST = 0x08, /* Used to ask for a data block */ 16a3603a6eSAndreas Gruenbacher P_RS_DATA_REQUEST = 0x09, /* Used to ask for a data block for resync */ 17a3603a6eSAndreas Gruenbacher P_SYNC_PARAM = 0x0a, 18a3603a6eSAndreas Gruenbacher P_PROTOCOL = 0x0b, 19a3603a6eSAndreas Gruenbacher P_UUIDS = 0x0c, 20a3603a6eSAndreas Gruenbacher P_SIZES = 0x0d, 21a3603a6eSAndreas Gruenbacher P_STATE = 0x0e, 22a3603a6eSAndreas Gruenbacher P_SYNC_UUID = 0x0f, 23a3603a6eSAndreas Gruenbacher P_AUTH_CHALLENGE = 0x10, 24a3603a6eSAndreas Gruenbacher P_AUTH_RESPONSE = 0x11, 25a3603a6eSAndreas Gruenbacher P_STATE_CHG_REQ = 0x12, 26a3603a6eSAndreas Gruenbacher 27668700b4SPhilipp Reisner /* (meta socket) */ 28a3603a6eSAndreas Gruenbacher P_PING = 0x13, 29a3603a6eSAndreas Gruenbacher P_PING_ACK = 0x14, 30a3603a6eSAndreas Gruenbacher P_RECV_ACK = 0x15, /* Used in protocol B */ 31a3603a6eSAndreas Gruenbacher P_WRITE_ACK = 0x16, /* Used in protocol C */ 32a3603a6eSAndreas Gruenbacher P_RS_WRITE_ACK = 0x17, /* Is a P_WRITE_ACK, additionally call set_in_sync(). */ 33a3603a6eSAndreas Gruenbacher P_SUPERSEDED = 0x18, /* Used in proto C, two-primaries conflict detection */ 34a3603a6eSAndreas Gruenbacher P_NEG_ACK = 0x19, /* Sent if local disk is unusable */ 35a3603a6eSAndreas Gruenbacher P_NEG_DREPLY = 0x1a, /* Local disk is broken... */ 36a3603a6eSAndreas Gruenbacher P_NEG_RS_DREPLY = 0x1b, /* Local disk is broken... */ 37a3603a6eSAndreas Gruenbacher P_BARRIER_ACK = 0x1c, 38a3603a6eSAndreas Gruenbacher P_STATE_CHG_REPLY = 0x1d, 39a3603a6eSAndreas Gruenbacher 40a3603a6eSAndreas Gruenbacher /* "new" commands, no longer fitting into the ordering scheme above */ 41a3603a6eSAndreas Gruenbacher 42a3603a6eSAndreas Gruenbacher P_OV_REQUEST = 0x1e, /* data socket */ 43a3603a6eSAndreas Gruenbacher P_OV_REPLY = 0x1f, 44a3603a6eSAndreas Gruenbacher P_OV_RESULT = 0x20, /* meta socket */ 45a3603a6eSAndreas Gruenbacher P_CSUM_RS_REQUEST = 0x21, /* data socket */ 46a3603a6eSAndreas Gruenbacher P_RS_IS_IN_SYNC = 0x22, /* meta socket */ 47a3603a6eSAndreas Gruenbacher P_SYNC_PARAM89 = 0x23, /* data socket, protocol version 89 replacement for P_SYNC_PARAM */ 48a3603a6eSAndreas Gruenbacher P_COMPRESSED_BITMAP = 0x24, /* compressed or otherwise encoded bitmap transfer */ 49a3603a6eSAndreas Gruenbacher /* P_CKPT_FENCE_REQ = 0x25, * currently reserved for protocol D */ 50a3603a6eSAndreas Gruenbacher /* P_CKPT_DISABLE_REQ = 0x26, * currently reserved for protocol D */ 51a3603a6eSAndreas Gruenbacher P_DELAY_PROBE = 0x27, /* is used on BOTH sockets */ 52a3603a6eSAndreas Gruenbacher P_OUT_OF_SYNC = 0x28, /* Mark as out of sync (Outrunning), data socket */ 53a3603a6eSAndreas Gruenbacher P_RS_CANCEL = 0x29, /* meta: Used to cancel RS_DATA_REQUEST packet by SyncSource */ 54a3603a6eSAndreas Gruenbacher P_CONN_ST_CHG_REQ = 0x2a, /* data sock: Connection wide state request */ 55a3603a6eSAndreas Gruenbacher P_CONN_ST_CHG_REPLY = 0x2b, /* meta sock: Connection side state req reply */ 56a3603a6eSAndreas Gruenbacher P_RETRY_WRITE = 0x2c, /* Protocol C: retry conflicting write request */ 57a3603a6eSAndreas Gruenbacher P_PROTOCOL_UPDATE = 0x2d, /* data sock: is used in established connections */ 58a0fb3c47SLars Ellenberg /* 0x2e to 0x30 reserved, used in drbd 9 */ 59a0fb3c47SLars Ellenberg 609305455aSBart Van Assche /* REQ_OP_DISCARD. We used "discard" in different contexts before, 61a0fb3c47SLars Ellenberg * which is why I chose TRIM here, to disambiguate. */ 62a0fb3c47SLars Ellenberg P_TRIM = 0x31, 63a3603a6eSAndreas Gruenbacher 64700ca8c0SPhilipp Reisner /* Only use these two if both support FF_THIN_RESYNC */ 65700ca8c0SPhilipp Reisner P_RS_THIN_REQ = 0x32, /* Request a block for resync or reply P_RS_DEALLOCATED */ 66700ca8c0SPhilipp Reisner P_RS_DEALLOCATED = 0x33, /* Contains only zeros on sync source node */ 67700ca8c0SPhilipp Reisner 689104d31aSLars Ellenberg /* REQ_WRITE_SAME. 699104d31aSLars Ellenberg * On a receiving side without REQ_WRITE_SAME, 709104d31aSLars Ellenberg * we may fall back to an opencoded loop instead. */ 719104d31aSLars Ellenberg P_WSAME = 0x34, 729104d31aSLars Ellenberg 73f31e583aSLars Ellenberg /* 0x35 already claimed in DRBD 9 */ 74f31e583aSLars Ellenberg P_ZEROES = 0x36, /* data sock: zero-out, WRITE_ZEROES */ 75f31e583aSLars Ellenberg 76f31e583aSLars Ellenberg /* 0x40 .. 0x48 already claimed in DRBD 9 */ 77f31e583aSLars Ellenberg 78a3603a6eSAndreas Gruenbacher P_MAY_IGNORE = 0x100, /* Flag to test if (cmd > P_MAY_IGNORE) ... */ 79a3603a6eSAndreas Gruenbacher P_MAX_OPT_CMD = 0x101, 80a3603a6eSAndreas Gruenbacher 81a3603a6eSAndreas Gruenbacher /* special command ids for handshake */ 82a3603a6eSAndreas Gruenbacher 83a3603a6eSAndreas Gruenbacher P_INITIAL_META = 0xfff1, /* First Packet on the MetaSock */ 84a3603a6eSAndreas Gruenbacher P_INITIAL_DATA = 0xfff2, /* First Packet on the Socket */ 85a3603a6eSAndreas Gruenbacher 86a3603a6eSAndreas Gruenbacher P_CONNECTION_FEATURES = 0xfffe /* FIXED for the next century! */ 87a3603a6eSAndreas Gruenbacher }; 88a3603a6eSAndreas Gruenbacher 89a3603a6eSAndreas Gruenbacher #ifndef __packed 90a3603a6eSAndreas Gruenbacher #define __packed __attribute__((packed)) 91a3603a6eSAndreas Gruenbacher #endif 92a3603a6eSAndreas Gruenbacher 93a3603a6eSAndreas Gruenbacher /* This is the layout for a packet on the wire. 94a3603a6eSAndreas Gruenbacher * The byteorder is the network byte order. 95a3603a6eSAndreas Gruenbacher * (except block_id and barrier fields. 96a3603a6eSAndreas Gruenbacher * these are pointers to local structs 97a3603a6eSAndreas Gruenbacher * and have no relevance for the partner, 98a3603a6eSAndreas Gruenbacher * which just echoes them as received.) 99a3603a6eSAndreas Gruenbacher * 100a3603a6eSAndreas Gruenbacher * NOTE that the payload starts at a long aligned offset, 101a3603a6eSAndreas Gruenbacher * regardless of 32 or 64 bit arch! 102a3603a6eSAndreas Gruenbacher */ 103a3603a6eSAndreas Gruenbacher struct p_header80 { 104a3603a6eSAndreas Gruenbacher u32 magic; 105a3603a6eSAndreas Gruenbacher u16 command; 106a3603a6eSAndreas Gruenbacher u16 length; /* bytes of data after this header */ 107a3603a6eSAndreas Gruenbacher } __packed; 108a3603a6eSAndreas Gruenbacher 109a3603a6eSAndreas Gruenbacher /* Header for big packets, Used for data packets exceeding 64kB */ 110a3603a6eSAndreas Gruenbacher struct p_header95 { 111a3603a6eSAndreas Gruenbacher u16 magic; /* use DRBD_MAGIC_BIG here */ 112a3603a6eSAndreas Gruenbacher u16 command; 113a3603a6eSAndreas Gruenbacher u32 length; 114a3603a6eSAndreas Gruenbacher } __packed; 115a3603a6eSAndreas Gruenbacher 116a3603a6eSAndreas Gruenbacher struct p_header100 { 117a3603a6eSAndreas Gruenbacher u32 magic; 118a3603a6eSAndreas Gruenbacher u16 volume; 119a3603a6eSAndreas Gruenbacher u16 command; 120a3603a6eSAndreas Gruenbacher u32 length; 121a3603a6eSAndreas Gruenbacher u32 pad; 122a3603a6eSAndreas Gruenbacher } __packed; 123a3603a6eSAndreas Gruenbacher 1249104d31aSLars Ellenberg /* These defines must not be changed without changing the protocol version. 1259104d31aSLars Ellenberg * New defines may only be introduced together with protocol version bump or 1269104d31aSLars Ellenberg * new protocol feature flags. 1279104d31aSLars Ellenberg */ 1289104d31aSLars Ellenberg #define DP_HARDBARRIER 1 /* no longer used */ 129a3603a6eSAndreas Gruenbacher #define DP_RW_SYNC 2 /* equals REQ_SYNC */ 130a3603a6eSAndreas Gruenbacher #define DP_MAY_SET_IN_SYNC 4 131a3603a6eSAndreas Gruenbacher #define DP_UNPLUG 8 /* not used anymore */ 132a3603a6eSAndreas Gruenbacher #define DP_FUA 16 /* equals REQ_FUA */ 13328a8f0d3SMike Christie #define DP_FLUSH 32 /* equals REQ_PREFLUSH */ 1349305455aSBart Van Assche #define DP_DISCARD 64 /* equals REQ_OP_DISCARD */ 135a3603a6eSAndreas Gruenbacher #define DP_SEND_RECEIVE_ACK 128 /* This is a proto B write request */ 136a3603a6eSAndreas Gruenbacher #define DP_SEND_WRITE_ACK 256 /* This is a proto C write request */ 1379104d31aSLars Ellenberg #define DP_WSAME 512 /* equiv. REQ_WRITE_SAME */ 138f31e583aSLars Ellenberg #define DP_ZEROES 1024 /* equiv. REQ_OP_WRITE_ZEROES */ 139f31e583aSLars Ellenberg 140f31e583aSLars Ellenberg /* possible combinations: 141f31e583aSLars Ellenberg * REQ_OP_WRITE_ZEROES: DP_DISCARD | DP_ZEROES 142f31e583aSLars Ellenberg * REQ_OP_WRITE_ZEROES + REQ_NOUNMAP: DP_ZEROES 143f31e583aSLars Ellenberg */ 144a3603a6eSAndreas Gruenbacher 145a3603a6eSAndreas Gruenbacher struct p_data { 146a3603a6eSAndreas Gruenbacher u64 sector; /* 64 bits sector number */ 147a3603a6eSAndreas Gruenbacher u64 block_id; /* to identify the request in protocol B&C */ 148a3603a6eSAndreas Gruenbacher u32 seq_num; 149a3603a6eSAndreas Gruenbacher u32 dp_flags; 150a3603a6eSAndreas Gruenbacher } __packed; 151a3603a6eSAndreas Gruenbacher 152a0fb3c47SLars Ellenberg struct p_trim { 153a0fb3c47SLars Ellenberg struct p_data p_data; 154a0fb3c47SLars Ellenberg u32 size; /* == bio->bi_size */ 155a0fb3c47SLars Ellenberg } __packed; 156a0fb3c47SLars Ellenberg 1579104d31aSLars Ellenberg struct p_wsame { 1589104d31aSLars Ellenberg struct p_data p_data; 1599104d31aSLars Ellenberg u32 size; /* == bio->bi_size */ 1609104d31aSLars Ellenberg } __packed; 1619104d31aSLars Ellenberg 162a3603a6eSAndreas Gruenbacher /* 163a3603a6eSAndreas Gruenbacher * commands which share a struct: 164a3603a6eSAndreas Gruenbacher * p_block_ack: 165a3603a6eSAndreas Gruenbacher * P_RECV_ACK (proto B), P_WRITE_ACK (proto C), 166a3603a6eSAndreas Gruenbacher * P_SUPERSEDED (proto C, two-primaries conflict detection) 167a3603a6eSAndreas Gruenbacher * p_block_req: 168a3603a6eSAndreas Gruenbacher * P_DATA_REQUEST, P_RS_DATA_REQUEST 169a3603a6eSAndreas Gruenbacher */ 170a3603a6eSAndreas Gruenbacher struct p_block_ack { 171a3603a6eSAndreas Gruenbacher u64 sector; 172a3603a6eSAndreas Gruenbacher u64 block_id; 173a3603a6eSAndreas Gruenbacher u32 blksize; 174a3603a6eSAndreas Gruenbacher u32 seq_num; 175a3603a6eSAndreas Gruenbacher } __packed; 176a3603a6eSAndreas Gruenbacher 177a3603a6eSAndreas Gruenbacher struct p_block_req { 178a3603a6eSAndreas Gruenbacher u64 sector; 179a3603a6eSAndreas Gruenbacher u64 block_id; 180a3603a6eSAndreas Gruenbacher u32 blksize; 181a3603a6eSAndreas Gruenbacher u32 pad; /* to multiple of 8 Byte */ 182a3603a6eSAndreas Gruenbacher } __packed; 183a3603a6eSAndreas Gruenbacher 184a3603a6eSAndreas Gruenbacher /* 185a3603a6eSAndreas Gruenbacher * commands with their own struct for additional fields: 186a3603a6eSAndreas Gruenbacher * P_CONNECTION_FEATURES 187a3603a6eSAndreas Gruenbacher * P_BARRIER 188a3603a6eSAndreas Gruenbacher * P_BARRIER_ACK 189a3603a6eSAndreas Gruenbacher * P_SYNC_PARAM 190a3603a6eSAndreas Gruenbacher * ReportParams 191a3603a6eSAndreas Gruenbacher */ 192a3603a6eSAndreas Gruenbacher 1939104d31aSLars Ellenberg /* supports TRIM/DISCARD on the "wire" protocol */ 1949104d31aSLars Ellenberg #define DRBD_FF_TRIM 1 1959104d31aSLars Ellenberg 1969104d31aSLars Ellenberg /* Detect all-zeros during resync, and rather TRIM/UNMAP/DISCARD those blocks 1979104d31aSLars Ellenberg * instead of fully allocate a supposedly thin volume on initial resync */ 1989104d31aSLars Ellenberg #define DRBD_FF_THIN_RESYNC 2 1999104d31aSLars Ellenberg 2009104d31aSLars Ellenberg /* supports REQ_WRITE_SAME on the "wire" protocol. 2019104d31aSLars Ellenberg * Note: this flag is overloaded, 2029104d31aSLars Ellenberg * its presence also 2039104d31aSLars Ellenberg * - indicates support for 128 MiB "batch bios", 2049104d31aSLars Ellenberg * max discard size of 128 MiB 2059104d31aSLars Ellenberg * instead of 4M before that. 2069104d31aSLars Ellenberg * - indicates that we exchange additional settings in p_sizes 2079104d31aSLars Ellenberg * drbd_send_sizes()/receive_sizes() 2089104d31aSLars Ellenberg */ 2099104d31aSLars Ellenberg #define DRBD_FF_WSAME 4 21020c68fdeSLars Ellenberg 211f31e583aSLars Ellenberg /* supports REQ_OP_WRITE_ZEROES on the "wire" protocol. 212f31e583aSLars Ellenberg * 213f31e583aSLars Ellenberg * We used to map that to "discard" on the sending side, and if we cannot 214f31e583aSLars Ellenberg * guarantee that discard zeroes data, the receiving side would map discard 215f31e583aSLars Ellenberg * back to zero-out. 216f31e583aSLars Ellenberg * 217f31e583aSLars Ellenberg * With the introduction of REQ_OP_WRITE_ZEROES, 218f31e583aSLars Ellenberg * we started to use that for both WRITE_ZEROES and DISCARDS, 219f31e583aSLars Ellenberg * hoping that WRITE_ZEROES would "do what we want", 220f31e583aSLars Ellenberg * UNMAP if possible, zero-out the rest. 221f31e583aSLars Ellenberg * 222f31e583aSLars Ellenberg * The example scenario is some LVM "thin" backend. 223f31e583aSLars Ellenberg * 224f31e583aSLars Ellenberg * While an un-allocated block on dm-thin reads as zeroes, on a dm-thin 225f31e583aSLars Ellenberg * with "skip_block_zeroing=true", after a partial block write allocated 226f31e583aSLars Ellenberg * that block, that same block may well map "undefined old garbage" from 227f31e583aSLars Ellenberg * the backends on LBAs that have not yet been written to. 228f31e583aSLars Ellenberg * 229f31e583aSLars Ellenberg * If we cannot distinguish between zero-out and discard on the receiving 230f31e583aSLars Ellenberg * side, to avoid "undefined old garbage" to pop up randomly at later times 231f31e583aSLars Ellenberg * on supposedly zero-initialized blocks, we'd need to map all discards to 232f31e583aSLars Ellenberg * zero-out on the receiving side. But that would potentially do a full 233f31e583aSLars Ellenberg * alloc on thinly provisioned backends, even when the expectation was to 234f31e583aSLars Ellenberg * unmap/trim/discard/de-allocate. 235f31e583aSLars Ellenberg * 236f31e583aSLars Ellenberg * We need to distinguish on the protocol level, whether we need to guarantee 237f31e583aSLars Ellenberg * zeroes (and thus use zero-out, potentially doing the mentioned full-alloc), 238f31e583aSLars Ellenberg * or if we want to put the emphasis on discard, and only do a "best effort 239f31e583aSLars Ellenberg * zeroing" (by "discarding" blocks aligned to discard-granularity, and zeroing 240f31e583aSLars Ellenberg * only potential unaligned head and tail clippings), to at least *try* to 241f31e583aSLars Ellenberg * avoid "false positives" in an online-verify later, hoping that someone 242f31e583aSLars Ellenberg * set skip_block_zeroing=false. 243f31e583aSLars Ellenberg */ 244f31e583aSLars Ellenberg #define DRBD_FF_WZEROES 8 245f31e583aSLars Ellenberg 246f31e583aSLars Ellenberg 247a3603a6eSAndreas Gruenbacher struct p_connection_features { 248a3603a6eSAndreas Gruenbacher u32 protocol_min; 249a3603a6eSAndreas Gruenbacher u32 feature_flags; 250a3603a6eSAndreas Gruenbacher u32 protocol_max; 251a3603a6eSAndreas Gruenbacher 252a3603a6eSAndreas Gruenbacher /* should be more than enough for future enhancements 253a3603a6eSAndreas Gruenbacher * for now, feature_flags and the reserved array shall be zero. 254a3603a6eSAndreas Gruenbacher */ 255a3603a6eSAndreas Gruenbacher 256a3603a6eSAndreas Gruenbacher u32 _pad; 257a3603a6eSAndreas Gruenbacher u64 reserved[7]; 258a3603a6eSAndreas Gruenbacher } __packed; 259a3603a6eSAndreas Gruenbacher 260a3603a6eSAndreas Gruenbacher struct p_barrier { 261a3603a6eSAndreas Gruenbacher u32 barrier; /* barrier number _handle_ only */ 262a3603a6eSAndreas Gruenbacher u32 pad; /* to multiple of 8 Byte */ 263a3603a6eSAndreas Gruenbacher } __packed; 264a3603a6eSAndreas Gruenbacher 265a3603a6eSAndreas Gruenbacher struct p_barrier_ack { 266a3603a6eSAndreas Gruenbacher u32 barrier; 267a3603a6eSAndreas Gruenbacher u32 set_size; 268a3603a6eSAndreas Gruenbacher } __packed; 269a3603a6eSAndreas Gruenbacher 270a3603a6eSAndreas Gruenbacher struct p_rs_param { 271a3603a6eSAndreas Gruenbacher u32 resync_rate; 272a3603a6eSAndreas Gruenbacher 273a3603a6eSAndreas Gruenbacher /* Since protocol version 88 and higher. */ 2741060bfc8SGustavo A. R. Silva char verify_alg[]; 275a3603a6eSAndreas Gruenbacher } __packed; 276a3603a6eSAndreas Gruenbacher 277a3603a6eSAndreas Gruenbacher struct p_rs_param_89 { 278a3603a6eSAndreas Gruenbacher u32 resync_rate; 279a3603a6eSAndreas Gruenbacher /* protocol version 89: */ 280a3603a6eSAndreas Gruenbacher char verify_alg[SHARED_SECRET_MAX]; 281a3603a6eSAndreas Gruenbacher char csums_alg[SHARED_SECRET_MAX]; 282a3603a6eSAndreas Gruenbacher } __packed; 283a3603a6eSAndreas Gruenbacher 284a3603a6eSAndreas Gruenbacher struct p_rs_param_95 { 285a3603a6eSAndreas Gruenbacher u32 resync_rate; 28652a0cab3SKees Cook struct_group(algs, 287a3603a6eSAndreas Gruenbacher char verify_alg[SHARED_SECRET_MAX]; 288a3603a6eSAndreas Gruenbacher char csums_alg[SHARED_SECRET_MAX]; 28952a0cab3SKees Cook ); 290a3603a6eSAndreas Gruenbacher u32 c_plan_ahead; 291a3603a6eSAndreas Gruenbacher u32 c_delay_target; 292a3603a6eSAndreas Gruenbacher u32 c_fill_target; 293a3603a6eSAndreas Gruenbacher u32 c_max_rate; 294a3603a6eSAndreas Gruenbacher } __packed; 295a3603a6eSAndreas Gruenbacher 296a3603a6eSAndreas Gruenbacher enum drbd_conn_flags { 297a3603a6eSAndreas Gruenbacher CF_DISCARD_MY_DATA = 1, 298a3603a6eSAndreas Gruenbacher CF_DRY_RUN = 2, 299a3603a6eSAndreas Gruenbacher }; 300a3603a6eSAndreas Gruenbacher 301a3603a6eSAndreas Gruenbacher struct p_protocol { 302a3603a6eSAndreas Gruenbacher u32 protocol; 303a3603a6eSAndreas Gruenbacher u32 after_sb_0p; 304a3603a6eSAndreas Gruenbacher u32 after_sb_1p; 305a3603a6eSAndreas Gruenbacher u32 after_sb_2p; 306a3603a6eSAndreas Gruenbacher u32 conn_flags; 307a3603a6eSAndreas Gruenbacher u32 two_primaries; 308a3603a6eSAndreas Gruenbacher 309a3603a6eSAndreas Gruenbacher /* Since protocol version 87 and higher. */ 3101060bfc8SGustavo A. R. Silva char integrity_alg[]; 311a3603a6eSAndreas Gruenbacher 312a3603a6eSAndreas Gruenbacher } __packed; 313a3603a6eSAndreas Gruenbacher 314a3603a6eSAndreas Gruenbacher struct p_uuids { 315a3603a6eSAndreas Gruenbacher u64 uuid[UI_EXTENDED_SIZE]; 316a3603a6eSAndreas Gruenbacher } __packed; 317a3603a6eSAndreas Gruenbacher 318a3603a6eSAndreas Gruenbacher struct p_rs_uuid { 319a3603a6eSAndreas Gruenbacher u64 uuid; 320a3603a6eSAndreas Gruenbacher } __packed; 321a3603a6eSAndreas Gruenbacher 3229104d31aSLars Ellenberg /* optional queue_limits if (agreed_features & DRBD_FF_WSAME) 3239104d31aSLars Ellenberg * see also struct queue_limits, as of late 2015 */ 3249104d31aSLars Ellenberg struct o_qlim { 3259104d31aSLars Ellenberg /* we don't need it yet, but we may as well communicate it now */ 3269104d31aSLars Ellenberg u32 physical_block_size; 3279104d31aSLars Ellenberg 3289104d31aSLars Ellenberg /* so the original in struct queue_limits is unsigned short, 3299104d31aSLars Ellenberg * but I'd have to put in padding anyways. */ 3309104d31aSLars Ellenberg u32 logical_block_size; 3319104d31aSLars Ellenberg 3329104d31aSLars Ellenberg /* One incoming bio becomes one DRBD request, 3339104d31aSLars Ellenberg * which may be translated to several bio on the receiving side. 3349104d31aSLars Ellenberg * We don't need to communicate chunk/boundary/segment ... limits. 3359104d31aSLars Ellenberg */ 3369104d31aSLars Ellenberg 3379104d31aSLars Ellenberg /* various IO hints may be useful with "diskless client" setups */ 3389104d31aSLars Ellenberg u32 alignment_offset; 3399104d31aSLars Ellenberg u32 io_min; 3409104d31aSLars Ellenberg u32 io_opt; 3419104d31aSLars Ellenberg 3429104d31aSLars Ellenberg /* We may need to communicate integrity stuff at some point, 3439104d31aSLars Ellenberg * but let's not get ahead of ourselves. */ 3449104d31aSLars Ellenberg 3459104d31aSLars Ellenberg /* Backend discard capabilities. 3469104d31aSLars Ellenberg * Receiving side uses "blkdev_issue_discard()", no need to communicate 3479104d31aSLars Ellenberg * more specifics. If the backend cannot do discards, the DRBD peer 3489104d31aSLars Ellenberg * may fall back to blkdev_issue_zeroout(). 3499104d31aSLars Ellenberg */ 3509104d31aSLars Ellenberg u8 discard_enabled; 3519104d31aSLars Ellenberg u8 discard_zeroes_data; 3529104d31aSLars Ellenberg u8 write_same_capable; 3539104d31aSLars Ellenberg u8 _pad; 3549104d31aSLars Ellenberg } __packed; 3559104d31aSLars Ellenberg 356a3603a6eSAndreas Gruenbacher struct p_sizes { 357a3603a6eSAndreas Gruenbacher u64 d_size; /* size of disk */ 358a3603a6eSAndreas Gruenbacher u64 u_size; /* user requested size */ 359a3603a6eSAndreas Gruenbacher u64 c_size; /* current exported size */ 360a3603a6eSAndreas Gruenbacher u32 max_bio_size; /* Maximal size of a BIO */ 361a3603a6eSAndreas Gruenbacher u16 queue_order_type; /* not yet implemented in DRBD*/ 362a3603a6eSAndreas Gruenbacher u16 dds_flags; /* use enum dds_flags here. */ 3639104d31aSLars Ellenberg 3649104d31aSLars Ellenberg /* optional queue_limits if (agreed_features & DRBD_FF_WSAME) */ 3651060bfc8SGustavo A. R. Silva struct o_qlim qlim[]; 366a3603a6eSAndreas Gruenbacher } __packed; 367a3603a6eSAndreas Gruenbacher 368a3603a6eSAndreas Gruenbacher struct p_state { 369a3603a6eSAndreas Gruenbacher u32 state; 370a3603a6eSAndreas Gruenbacher } __packed; 371a3603a6eSAndreas Gruenbacher 372a3603a6eSAndreas Gruenbacher struct p_req_state { 373a3603a6eSAndreas Gruenbacher u32 mask; 374a3603a6eSAndreas Gruenbacher u32 val; 375a3603a6eSAndreas Gruenbacher } __packed; 376a3603a6eSAndreas Gruenbacher 377a3603a6eSAndreas Gruenbacher struct p_req_state_reply { 378a3603a6eSAndreas Gruenbacher u32 retcode; 379a3603a6eSAndreas Gruenbacher } __packed; 380a3603a6eSAndreas Gruenbacher 381a3603a6eSAndreas Gruenbacher struct p_drbd06_param { 382a3603a6eSAndreas Gruenbacher u64 size; 383a3603a6eSAndreas Gruenbacher u32 state; 384a3603a6eSAndreas Gruenbacher u32 blksize; 385a3603a6eSAndreas Gruenbacher u32 protocol; 386a3603a6eSAndreas Gruenbacher u32 version; 387a3603a6eSAndreas Gruenbacher u32 gen_cnt[5]; 388a3603a6eSAndreas Gruenbacher u32 bit_map_gen[5]; 389a3603a6eSAndreas Gruenbacher } __packed; 390a3603a6eSAndreas Gruenbacher 391a3603a6eSAndreas Gruenbacher struct p_block_desc { 392a3603a6eSAndreas Gruenbacher u64 sector; 393a3603a6eSAndreas Gruenbacher u32 blksize; 394a3603a6eSAndreas Gruenbacher u32 pad; /* to multiple of 8 Byte */ 395a3603a6eSAndreas Gruenbacher } __packed; 396a3603a6eSAndreas Gruenbacher 397a3603a6eSAndreas Gruenbacher /* Valid values for the encoding field. 398a3603a6eSAndreas Gruenbacher * Bump proto version when changing this. */ 399a3603a6eSAndreas Gruenbacher enum drbd_bitmap_code { 400a3603a6eSAndreas Gruenbacher /* RLE_VLI_Bytes = 0, 401a3603a6eSAndreas Gruenbacher * and other bit variants had been defined during 402a3603a6eSAndreas Gruenbacher * algorithm evaluation. */ 403a3603a6eSAndreas Gruenbacher RLE_VLI_Bits = 2, 404a3603a6eSAndreas Gruenbacher }; 405a3603a6eSAndreas Gruenbacher 406a3603a6eSAndreas Gruenbacher struct p_compressed_bm { 407a3603a6eSAndreas Gruenbacher /* (encoding & 0x0f): actual encoding, see enum drbd_bitmap_code 408a3603a6eSAndreas Gruenbacher * (encoding & 0x80): polarity (set/unset) of first runlength 409a3603a6eSAndreas Gruenbacher * ((encoding >> 4) & 0x07): pad_bits, number of trailing zero bits 410a3603a6eSAndreas Gruenbacher * used to pad up to head.length bytes 411a3603a6eSAndreas Gruenbacher */ 412a3603a6eSAndreas Gruenbacher u8 encoding; 413a3603a6eSAndreas Gruenbacher 4141060bfc8SGustavo A. R. Silva u8 code[]; 415a3603a6eSAndreas Gruenbacher } __packed; 416a3603a6eSAndreas Gruenbacher 417a3603a6eSAndreas Gruenbacher struct p_delay_probe93 { 418a3603a6eSAndreas Gruenbacher u32 seq_num; /* sequence number to match the two probe packets */ 419a3603a6eSAndreas Gruenbacher u32 offset; /* usecs the probe got sent after the reference time point */ 420a3603a6eSAndreas Gruenbacher } __packed; 421a3603a6eSAndreas Gruenbacher 422a3603a6eSAndreas Gruenbacher /* 423a3603a6eSAndreas Gruenbacher * Bitmap packets need to fit within a single page on the sender and receiver, 424a3603a6eSAndreas Gruenbacher * so we are limited to 4 KiB (and not to PAGE_SIZE, which can be bigger). 425a3603a6eSAndreas Gruenbacher */ 426a3603a6eSAndreas Gruenbacher #define DRBD_SOCKET_BUFFER_SIZE 4096 427a3603a6eSAndreas Gruenbacher 428a3603a6eSAndreas Gruenbacher #endif /* __DRBD_PROTOCOL_H */ 429