DRBD: Add support for new packets including the P_RS_DAGTAG family

These were recently added to the DRBD protocol. See the following
commits at https://github.com/LINBIT/drbd-headers:
098b1fdcdbaa introduce new P_RS_CANCEL_AHEAD
e5d5e6fa9af7 add P_DISCONNECT to stop connect-attempts
1681c4b0166e add dagtag resync request packets
This commit is contained in:
Joel Colledge 2021-12-01 11:33:57 +01:00 committed by Wireshark GitLab Utility
parent 91b453a70a
commit 9878026a51
1 changed files with 40 additions and 3 deletions

View File

@ -108,6 +108,16 @@ enum drbd_packet {
P_CONFIRM_STABLE = 0x49,
P_RS_CANCEL_AHEAD = 0x4a,
P_DISCONNECT = 0x4b,
P_RS_DAGTAG_REQ = 0x4c,
P_RS_CSUM_DAGTAG_REQ = 0x4d,
P_RS_THIN_DAGTAG_REQ = 0x4e,
P_OV_DAGTAG_REQ = 0x4f,
P_OV_DAGTAG_REPLY = 0x50,
P_INITIAL_META = 0xfff1,
P_INITIAL_DATA = 0xfff2,
@ -190,6 +200,16 @@ static const value_string packet_names[] = {
{ P_CONFIRM_STABLE, "P_CONFIRM_STABLE" },
{ P_RS_CANCEL_AHEAD, "P_RS_CANCEL_AHEAD" },
{ P_DISCONNECT, "P_DISCONNECT" },
{ P_RS_DAGTAG_REQ, "P_RS_DAGTAG_REQ" },
{ P_RS_CSUM_DAGTAG_REQ, "P_RS_CSUM_DAGTAG_REQ" },
{ P_RS_THIN_DAGTAG_REQ, "P_RS_THIN_DAGTAG_REQ" },
{ P_OV_DAGTAG_REQ, "P_OV_DAGTAG_REQ" },
{ P_OV_DAGTAG_REPLY, "P_OV_DAGTAG_REPLY" },
{ P_INITIAL_META, "P_INITIAL_META" },
{ P_INITIAL_DATA, "P_INITIAL_DATA" },
@ -343,6 +363,7 @@ static void decode_payload_data(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_data_reply(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_rs_data_reply(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_barrier(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_dagtag_data_request(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_data_request(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_sync_param(tvbuff_t *tvb, proto_tree *tree);
static void decode_payload_protocol(tvbuff_t *tvb, proto_tree *tree);
@ -411,6 +432,12 @@ static const value_payload_decoder payload_decoders[] = {
{ P_ZEROES, decode_payload_data_size },
{ P_RS_DEALLOCATED, decode_payload_rs_deallocated },
{ P_WSAME, decode_payload_data_wsame },
{ P_DISCONNECT, NULL },
{ P_RS_DAGTAG_REQ, decode_payload_dagtag_data_request },
{ P_RS_CSUM_DAGTAG_REQ, decode_payload_dagtag_data_request },
{ P_RS_THIN_DAGTAG_REQ, decode_payload_dagtag_data_request },
{ P_OV_DAGTAG_REQ, decode_payload_dagtag_data_request },
{ P_OV_DAGTAG_REPLY, decode_payload_dagtag_data_request },
{ P_PING, NULL },
{ P_PING_ACK, NULL },
@ -428,6 +455,7 @@ static const value_payload_decoder payload_decoders[] = {
{ P_RS_IS_IN_SYNC, decode_payload_block_ack },
{ P_DELAY_PROBE, decode_payload_skip },
{ P_RS_CANCEL, decode_payload_block_ack },
{ P_RS_CANCEL_AHEAD, decode_payload_block_ack },
{ P_CONN_ST_CHG_REPLY, decode_payload_rq_s_reply },
{ P_RETRY_WRITE, decode_payload_block_ack },
{ P_PEER_ACK, decode_payload_peer_ack },
@ -515,7 +543,7 @@ static int hf_drbd_nodes_to_reach = -1;
static int hf_drbd_reachable_nodes = -1;
static int hf_drbd_offset = -1;
static int hf_drbd_dagtag = -1;
static int hf_drbd_node_id = -1;
static int hf_drbd_dagtag_node_id = -1;
static int hf_drbd_state_role = -1;
static int hf_drbd_state_peer = -1;
@ -842,6 +870,15 @@ static void decode_payload_data_request(tvbuff_t *tvb, proto_tree *tree)
proto_tree_add_item(tree, hf_drbd_blksize, tvb, 16, 4, ENC_BIG_ENDIAN);
}
static void decode_payload_dagtag_data_request(tvbuff_t *tvb, proto_tree *tree)
{
proto_tree_add_item(tree, hf_drbd_sector, tvb, 0, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_block_id, tvb, 8, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_blksize, tvb, 16, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_dagtag_node_id, tvb, 20, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_dagtag, tvb, 24, 8, ENC_BIG_ENDIAN);
}
static void decode_payload_sync_param(tvbuff_t *tvb, proto_tree *tree)
{
guint length = tvb_reported_length(tvb);
@ -978,7 +1015,7 @@ static void decode_payload_uuids110(tvbuff_t *tvb, proto_tree *tree)
static void decode_payload_peer_dagtag(tvbuff_t *tvb, proto_tree *tree)
{
proto_tree_add_item(tree, hf_drbd_dagtag, tvb, 0, 8, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_node_id, tvb, 8, 4, ENC_BIG_ENDIAN);
proto_tree_add_item(tree, hf_drbd_dagtag_node_id, tvb, 8, 4, ENC_BIG_ENDIAN);
}
static void decode_payload_current_uuid(tvbuff_t *tvb, proto_tree *tree)
@ -1168,7 +1205,7 @@ void proto_register_drbd(void)
{ &hf_drbd_reachable_nodes, { "reachable_nodes", "drbd.reachable_nodes", FT_UINT64, BASE_CUSTOM, format_node_mask, 0x0, NULL, HFILL }},
{ &hf_drbd_offset, { "offset", "drbd.offset", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_drbd_dagtag, { "dagtag", "drbd.dagtag", FT_UINT64, BASE_HEX_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_drbd_node_id, { "node_id", "drbd.node_id", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_drbd_dagtag_node_id, { "dagtag_node_id", "drbd.dagtag_node_id", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
{ &hf_drbd_state_role, { "role", "drbd.state.role", FT_UINT32, BASE_DEC, VALS(role_names), STATE_ROLE, NULL, HFILL }},
{ &hf_drbd_state_peer, { "peer", "drbd.state.peer", FT_UINT32, BASE_DEC, VALS(role_names), STATE_PEER, NULL, HFILL }},