SMC: support for SMC-Rv2 LLC messages

Add the support for SMC-Rv2 Link Level Control (LLC) messages which
flow over Infiniband.

Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
This commit is contained in:
Karsten Graul 2021-09-30 15:57:16 +02:00 committed by Gerald Combs
parent 7c70af016f
commit 341e625249
1 changed files with 249 additions and 26 deletions

View File

@ -152,6 +152,15 @@ typedef enum {
LLC_CONFIRM_RKEY_CONT = 0x08,
LLC_DELETE_RKEY = 0x09,
LLC_TEST_LINK = 0x07,
/* SMC-Rv2 LLC message types */
LLC_CONFIRM_LINK_V2 = 0x21,
LLC_ADD_LINK_V2 = 0x22,
LLC_DEL_LINK_V2 = 0x24,
LLC_REQUEST_ADD_LINK_V2 = 0x25,
LLC_CONFIRM_RKEY_V2 = 0x26,
LLC_TEST_LINK_V2 = 0x27,
LLC_DELETE_RKEY_V2 = 0x29,
/* Common message types */
LLC_OPT_MSG_CTRL = 0x80,
LLC_NWM_DATA = 0x8A,
LLC_RMBE_CTRL = 0xFE
@ -166,6 +175,15 @@ static const value_string smcr_llc_message_txt[] = {
{ LLC_CONFIRM_RKEY_CONT, "Confirm Rkey Continuous" },
{ LLC_DELETE_RKEY, "Delete Rkey" },
{ LLC_TEST_LINK, "Test Link" },
/* SMC-Rv2 LLC message types */
{ LLC_CONFIRM_LINK_V2, "Confirm Link (v2)" },
{ LLC_ADD_LINK_V2, "Add Link (v2)" },
{ LLC_DEL_LINK_V2, "Delete Link (v2)" },
{ LLC_REQUEST_ADD_LINK_V2, "Request Add Link (v2)" },
{ LLC_CONFIRM_RKEY_V2, "Confirm Rkey (v2)" },
{ LLC_TEST_LINK_V2, "Test Link (v2)" },
{ LLC_DELETE_RKEY_V2, "Delete Rkey (v2)" },
/* Common message types */
{ LLC_OPT_MSG_CTRL, "OPT Message Control" },
{ LLC_NWM_DATA, "NWM Data" },
{ RMBE_CTRL, "CDC Message" },
@ -318,9 +336,11 @@ static int hf_smcr_confirm_link_response = -1;
/* SMC-R Add Link */
static int ett_add_link_flag = -1;
static int ett_add_link_flag2 = -1;
static int ett_add_link_flag3 = -1;
static int hf_smcr_add_link_flags = -1;
static int hf_smcr_add_link_response = -1;
static int hf_smcr_add_link_response_rejected = -1;
static int hf_smcr_add_link_reject_reason = -1;
static int hf_smcr_add_link_mac = -1;
static int hf_smcr_add_link_gid = -1;
static int hf_smcr_add_link_qp_number = -1;
@ -328,6 +348,13 @@ static int hf_smcr_add_link_number = -1;
static int hf_smcr_add_link_initial_psn = -1;
static int hf_smcr_add_link_flags2 = -1;
static int hf_smcr_add_link_qp_mtu_value = -1;
static int hf_smcr_add_link_client_target_gid = -1;
static int hf_smcr_add_link_rkey_count = -1;
static int hf_smcr_add_link_rkey = -1;
static int hf_smcr_add_link_rkey2 = -1;
static int hf_smcr_add_link_virt_addr = -1;
static int hf_smcr_add_link_flags3 = -1;
static int hf_smcr_add_link_flag3_direct_link = -1;
/* SMC-R Add Link Continue*/
static int ett_add_link_cont_flag = -1;
@ -342,6 +369,15 @@ static int hf_smcr_add_link_cont_p2_rkey = -1;
static int hf_smcr_add_link_cont_p2_rkey2 = -1;
static int hf_smcr_add_link_cont_p2_virt_addr = -1;
/* SMC-Rv2 Request Add Link */
static int ett_request_add_link_flag = -1;
static int hf_smcr_request_add_link_flags = -1;
static int hf_smcr_request_add_link_response = -1;
static int hf_smcr_request_add_link_response_rejected = -1;
static int hf_smcr_request_add_link_reject_reason = -1;
static int hf_smc_request_add_link_gid_lst_len = -1;
static int hf_smc_request_add_link_gid_list_entry = -1;
/* SMC-R Delete Link */
static int ett_delete_link_flag = -1;
static int hf_smcr_delete_link_flags = -1;
@ -369,6 +405,8 @@ static int hf_smcr_delete_rkey_response = -1;
static int hf_smcr_delete_rkey_negative_response = -1;
static int hf_smcr_delete_rkey_mask = -1;
static int hf_smcr_delete_rkey_deleted = -1;
static int hf_smcr_delete_rkey_count = -1;
static int hf_smcr_delete_rkey_invalid_count = -1;
/* SMC-R Test Link */
static int ett_test_link_flag = -1;
@ -626,7 +664,8 @@ disect_smcd_accept(tvbuff_t* tvb, proto_tree* tree)
accept_flag2_tree = proto_item_add_subtree(accept_flag2_item, ett_smcd_accept_flag2);
proto_tree_add_item(accept_flag2_tree, hf_accept_dmb_buffer_size, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
offset += FLAG_BYTE_LEN;
offset += TWO_BYTE_RESERVED;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, TWO_BYTE_RESERVED, ENC_NA);
offset += TWO_BYTE_RESERVED; /* reserved */
proto_tree_add_item(tree, hf_smcd_accept_server_link_id, tvb,
offset, ALERT_TOKEN_LEN, ENC_BIG_ENDIAN);
offset += ALERT_TOKEN_LEN;
@ -997,26 +1036,31 @@ disect_smcr_confirm_link(tvbuff_t *tvb, proto_tree *tree)
}
static void
disect_smcr_add_link(tvbuff_t *tvb, proto_tree *tree)
disect_smcr_add_link(tvbuff_t *tvb, proto_tree *tree, bool is_smc_v2)
{
guint offset;
guint offset, rkey_count;
proto_item *add_link_flag_item;
proto_tree *add_link_flag_tree;
proto_item *add_link_flag2_item;
proto_tree *add_link_flag2_tree;
proto_item *add_link_flag3_item;
proto_tree *add_link_flag3_tree;
bool is_response = tvb_get_guint8(tvb, LLC_CMD_RSP_OFFSET) & LLC_FLAG_RESP;
offset = LLC_MSG_START_OFFSET;
add_link_flag_item = proto_tree_add_item(tree, hf_smcr_add_link_flags, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
add_link_flag_tree = proto_item_add_subtree(add_link_flag_item, ett_add_link_flag);
proto_tree_add_item(add_link_flag_tree, hf_smcr_add_link_response, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
proto_tree_add_item(add_link_flag_tree, hf_smcr_add_link_response_rejected, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
if (is_smc_v2 && is_response) {
proto_tree_add_item(add_link_flag_tree, hf_smcr_add_link_reject_reason, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
}
offset += FLAG_BYTE_LEN;
proto_tree_add_item(tree, hf_smcr_add_link_mac, tvb,
offset, MAC_ADDR_LEN, ENC_NA);
offset += MAC_ADDR_LEN;
proto_tree_add_item(tree, hf_smc_reserved, tvb,
offset, TWO_BYTE_RESERVED, ENC_NA);
offset += TWO_BYTE_RESERVED;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, TWO_BYTE_RESERVED, ENC_NA);
offset += TWO_BYTE_RESERVED; /* reserved */
proto_tree_add_item(tree, hf_smcr_add_link_gid, tvb,
offset, GID_LEN, ENC_NA);
offset += GID_LEN;
@ -1032,6 +1076,34 @@ disect_smcr_add_link(tvbuff_t *tvb, proto_tree *tree)
offset += 1;
proto_tree_add_item(tree, hf_smcr_add_link_initial_psn, tvb,
offset, PSN_LEN, ENC_BIG_ENDIAN);
offset += PSN_LEN;
if (!is_smc_v2 || is_response)
return;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 8, ENC_NA);
offset += 8; /* reserved */
add_link_flag3_item = proto_tree_add_item(tree, hf_smcr_add_link_flags3, tvb, offset, 1, ENC_BIG_ENDIAN);
add_link_flag3_tree = proto_item_add_subtree(add_link_flag3_item, ett_add_link_flag3);
proto_tree_add_item(add_link_flag3_tree, hf_smcr_add_link_flag3_direct_link, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 1, ENC_NA);
offset += 1; /* reserved */
proto_tree_add_item(tree, hf_smcr_add_link_client_target_gid, tvb, offset, GID_LEN, ENC_NA);
offset += GID_LEN;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 8, ENC_NA);
offset += 8; /* reserved */
proto_tree_add_item(tree, hf_smcr_add_link_rkey_count, tvb, offset, 2, ENC_BIG_ENDIAN);
rkey_count = tvb_get_guint16(tvb, offset, ENC_BIG_ENDIAN);
offset += 2;
while (rkey_count > 0) {
proto_tree_add_item(tree, hf_smcr_add_link_rkey, tvb, offset, RKEY_LEN, ENC_BIG_ENDIAN);
offset += RKEY_LEN;
proto_tree_add_item(tree, hf_smcr_add_link_rkey2, tvb, offset, RKEY_LEN, ENC_BIG_ENDIAN);
offset += RKEY_LEN;
proto_tree_add_item(tree, hf_smcr_add_link_virt_addr, tvb, offset, VIRTUAL_ADDR_LEN, ENC_BIG_ENDIAN);
offset += VIRTUAL_ADDR_LEN;
rkey_count--;
}
}
static void
@ -1079,6 +1151,37 @@ disect_smcr_add_continuation(tvbuff_t *tvb, proto_tree *tree)
}
}
static void
disect_smcr_request_add_link(tvbuff_t* tvb, proto_tree* tree)
{
bool is_response = tvb_get_guint8(tvb, LLC_CMD_RSP_OFFSET) & LLC_FLAG_RESP;
proto_item* add_link_flag_item;
proto_tree* add_link_flag_tree;
guint offset, gid_list_len;
offset = LLC_MSG_START_OFFSET;
add_link_flag_item = proto_tree_add_item(tree, hf_smcr_request_add_link_flags, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
add_link_flag_tree = proto_item_add_subtree(add_link_flag_item, ett_request_add_link_flag);
proto_tree_add_item(add_link_flag_tree, hf_smcr_request_add_link_response, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
proto_tree_add_item(add_link_flag_tree, hf_smcr_request_add_link_response_rejected, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
if (is_response) {
proto_tree_add_item(add_link_flag_tree, hf_smcr_request_add_link_reject_reason, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
}
offset += FLAG_BYTE_LEN;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 20, ENC_NA);
offset += 20; /* reserved */
gid_list_len = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_smc_request_add_link_gid_lst_len, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 3, ENC_NA);
offset += 3; /* reserved */
while (gid_list_len > 0) {
proto_tree_add_item(tree, hf_smc_request_add_link_gid_list_entry, tvb, offset, GID_LEN, ENC_NA);
offset += GID_LEN;
gid_list_len--;
}
}
static void
disect_smcr_delete_link(tvbuff_t *tvb, proto_tree *tree)
{
@ -1182,7 +1285,7 @@ disect_smcr_confirm_rkey_cont(tvbuff_t *tvb, proto_tree *tree)
}
static void
disect_smcr_delete_rkey(tvbuff_t *tvb, proto_tree *tree)
disect_smcr_delete_rkey(tvbuff_t *tvb, proto_tree *tree, bool is_smc_v2)
{
guint offset;
guint8 count;
@ -1194,15 +1297,30 @@ disect_smcr_delete_rkey(tvbuff_t *tvb, proto_tree *tree)
delete_rkey_flag_tree = proto_item_add_subtree(delete_rkey_flag_item, ett_delete_rkey_flag);
proto_tree_add_item(delete_rkey_flag_tree, hf_smcr_delete_rkey_response, tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
proto_tree_add_item(delete_rkey_flag_tree, hf_smcr_delete_rkey_negative_response,
tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
tvb, offset, FLAG_BYTE_LEN, ENC_BIG_ENDIAN);
offset += FLAG_BYTE_LEN;
proto_tree_add_item(tree, hf_smcr_delete_rkey_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
count = tvb_get_guint8(tvb, offset);
proto_tree_add_item(tree, hf_smcr_delete_rkey_count, tvb, offset, 1, ENC_NA);
offset += 1;
for (count=0; count < 8; count++) {
if (!is_smc_v2) {
proto_tree_add_item(tree, hf_smcr_delete_rkey_mask, tvb, offset, 1, ENC_BIG_ENDIAN);
} else {
bool is_response = tvb_get_guint8(tvb, LLC_CMD_RSP_OFFSET) & LLC_FLAG_RESP;
if (is_response) {
proto_tree_add_item(tree, hf_smcr_delete_rkey_invalid_count, tvb, offset, 1, ENC_NA);
count = tvb_get_guint8(tvb, offset);
if (count > 8)
count = 8; /* show a maximum of 8 invalid rkeys in response */
}
}
offset += 1;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, 2, ENC_NA);
offset += 2; /* reserved */
while (count > 0) {
proto_tree_add_item(tree, hf_smcr_delete_rkey_deleted, tvb,
offset, RKEY_LEN, ENC_BIG_ENDIAN);
offset += RKEY_LEN;
count--;
}
}
@ -1234,13 +1352,13 @@ disect_smcr_rmbe_ctrl(tvbuff_t *tvb, proto_tree *tree)
proto_tree_add_item(tree, hf_smcr_rmbe_ctrl_alert_token, tvb, offset, ALERT_TOKEN_LEN, ENC_BIG_ENDIAN);
offset += ALERT_TOKEN_LEN;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, TWO_BYTE_RESERVED, ENC_NA);
offset += TWO_BYTE_RESERVED;
offset += TWO_BYTE_RESERVED; /* reserved */
proto_tree_add_item(tree, hf_smcr_rmbe_ctrl_prod_wrap_seqno, tvb, offset, SEQNO_LEN, ENC_BIG_ENDIAN);
offset += SEQNO_LEN;
proto_tree_add_item(tree, hf_smcr_rmbe_ctrl_peer_prod_curs, tvb, offset, CURSOR_LEN, ENC_BIG_ENDIAN);
offset += CURSOR_LEN;
proto_tree_add_item(tree, hf_smc_reserved, tvb, offset, TWO_BYTE_RESERVED, ENC_NA);
offset += TWO_BYTE_RESERVED;
offset += TWO_BYTE_RESERVED; /* reserved */
proto_tree_add_item(tree, hf_smcr_rmbe_ctrl_cons_wrap_seqno, tvb, offset, SEQNO_LEN, ENC_BIG_ENDIAN);
offset += SEQNO_LEN;
proto_tree_add_item(tree, hf_smcr_rmbe_ctrl_peer_cons_curs, tvb, offset, CURSOR_LEN, ENC_BIG_ENDIAN);
@ -1413,11 +1531,22 @@ dissect_smcr_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
llc_message llc_msgid;
proto_item *ti;
proto_tree *smcr_tree;
int smc_version;
bool is_smc_v2;
msg_len = tvb_get_guint8(tvb, LLC_LEN_OFFSET);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "SMC-R");
llc_msgid = (llc_message) tvb_get_guint8(tvb, LLC_CMD_OFFSET);
col_append_str(pinfo->cinfo, COL_INFO, "[SMC-R] ");
smc_version = ((llc_msgid >> 4) & 0x0F);
is_smc_v2 = (smc_version == SMC_V2);
if (!is_smc_v2) {
msg_len = tvb_get_guint8(tvb, LLC_LEN_OFFSET);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "SMC-R");
col_append_str(pinfo->cinfo, COL_INFO, "[SMC-R] ");
} else {
msg_len = tvb_get_guint16(tvb, LLC_LEN_OFFSET, ENC_BIG_ENDIAN);
col_set_str(pinfo->cinfo, COL_PROTOCOL, "SMC-Rv2");
col_append_str(pinfo->cinfo, COL_INFO, "[SMC-Rv2] ");
}
col_append_str(pinfo->cinfo, COL_INFO,
val_to_str_const((guint32)llc_msgid,
smcr_llc_message_txt, "Unknown Command"));
@ -1428,18 +1557,22 @@ dissect_smcr_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
ti = proto_tree_add_item(tree, proto_smc, tvb, 0, msg_len, ENC_NA);
smcr_tree = proto_item_add_subtree(ti, ett_smcr);
proto_tree_add_item(smcr_tree, hf_smcr_llc_msg, tvb, 0, 1,
ENC_BIG_ENDIAN);
ti = proto_tree_add_item(smcr_tree, hf_smcr_llc_msg, tvb, 0, 1, ENC_BIG_ENDIAN);
if ((llc_msgid != RMBE_CTRL) &&
(tvb_get_guint8(tvb, LLC_CMD_RSP_OFFSET) & LLC_FLAG_RESP))
proto_item_append_text(ti, " (Resp)");
proto_tree_add_item(smcr_tree, hf_smc_length, tvb, LLC_LEN_OFFSET, (!is_smc_v2?1:2), ENC_BIG_ENDIAN);
switch (llc_msgid) {
case LLC_CONFIRM_LINK:
case LLC_CONFIRM_LINK_V2:
disect_smcr_confirm_link(tvb, smcr_tree);
break;
case LLC_ADD_LINK:
disect_smcr_add_link(tvb, smcr_tree);
case LLC_ADD_LINK_V2:
disect_smcr_add_link(tvb, smcr_tree, is_smc_v2);
break;
case LLC_ADD_LINK_CONT:
@ -1447,10 +1580,12 @@ dissect_smcr_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
break;
case LLC_DEL_LINK:
case LLC_DEL_LINK_V2:
disect_smcr_delete_link(tvb, smcr_tree);
break;
case LLC_CONFIRM_RKEY:
case LLC_CONFIRM_RKEY_V2:
disect_smcr_confirm_rkey(tvb, smcr_tree);
break;
@ -1459,13 +1594,19 @@ dissect_smcr_infiniband(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi
break;
case LLC_DELETE_RKEY:
disect_smcr_delete_rkey(tvb, smcr_tree);
case LLC_DELETE_RKEY_V2:
disect_smcr_delete_rkey(tvb, smcr_tree, is_smc_v2);
break;
case LLC_TEST_LINK:
case LLC_TEST_LINK_V2:
disect_smcr_test_link(tvb, smcr_tree);
break;
case LLC_REQUEST_ADD_LINK_V2:
disect_smcr_request_add_link(tvb, smcr_tree);
break;
case RMBE_CTRL:
disect_smcr_rmbe_ctrl(tvb, smcr_tree);
break;
@ -1518,6 +1659,7 @@ dissect_smcr_infiniband_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
guint16 msg_len;
llc_message msg_byte0;
guint8 msg_byte1;
int v1_check = TRUE, v2_check = TRUE;
if (tvb_captured_length_remaining(tvb, SMCR_MSG_BYTE_0) < 2) /* need at least 2 bytes */
return FALSE;
@ -1534,9 +1676,21 @@ dissect_smcr_infiniband_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree
(((msg_byte0 >= LLC_CONFIRM_LINK) &&
(msg_byte0 <= LLC_DELETE_RKEY)) ||
(msg_byte0 == LLC_RMBE_CTRL))))
v1_check = FALSE;
if (!(((msg_byte0 >= LLC_CONFIRM_LINK_V2) &&
(msg_byte0 <= LLC_ADD_LINK_V2)) ||
((msg_byte0 >= LLC_DEL_LINK_V2) &&
(msg_byte0 <= LLC_TEST_LINK_V2)) ||
(msg_byte0 == LLC_DELETE_RKEY_V2)))
v2_check = FALSE;
if ((!v1_check && !v2_check) || (v1_check && v2_check))
return FALSE;
msg_len = tvb_get_guint8(tvb, LLC_LEN_OFFSET);
if (v1_check)
msg_len = tvb_get_guint8(tvb, LLC_LEN_OFFSET);
else
msg_len = tvb_get_guint16(tvb, LLC_LEN_OFFSET, ENC_BIG_ENDIAN);
if (msg_len != tvb_reported_length_remaining(tvb, LLC_CMD_OFFSET))
return FALSE;
@ -1556,7 +1710,7 @@ proto_register_smcr(void)
{ &hf_smcr_llc_msg, {
"LLC Message", "smc.llc_msg",
FT_UINT8, BASE_DEC, VALS(smcr_llc_message_txt), 0x0,
FT_UINT8, BASE_HEX, VALS(smcr_llc_message_txt), 0x0,
NULL, HFILL}},
{ &hf_proposal_smc_version_release_number, {
@ -1901,13 +2055,48 @@ proto_register_smcr(void)
"Add Link Rejected", "smc.add.link.response.rejected",
FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}},
{ &hf_smcr_add_link_reject_reason, {
"Reject Reason", "smc.add.link.response.reject_reason",
FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL}},
{ &hf_smcr_add_link_flags2, {
"Flags", "smc.add.link.flags2",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
{ &hf_smcr_add_link_qp_mtu_value, {
"QP MTU Value", "smc.add.link.qp.mtu.value",
FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL}},
"QP MTU Value (enumerated value)", "smc.add.link.qp.mtu.value",
FT_UINT8, BASE_DEC, NULL, 0x0F, NULL, HFILL}},
{ &hf_smcr_add_link_flags3, {
"V2 Flags", "smc.add.link.flags3",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
{ &hf_smcr_add_link_flag3_direct_link, {
"Direct link attachment to peer", "smc.add.link.direct_link",
FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}},
{ &hf_smcr_add_link_client_target_gid, {
"Client Target GID", "smc.add.link.client_target_gid",
FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_add_link_rkey_count, {
"Number of Rkeys", "smc.add.link.rkey_count",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_add_link_rkey, {
"RMB RToken Pair - Rkey as known on this SMC Link",
"smc.add.link.rmb.RTok.Rkey1",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_add_link_rkey2, {
"RMB RToken Pair - Equivalent Rkey for the new SMC Link",
"smc.add.link.rmb.RTok.Rkey2",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_add_link_virt_addr, {
"RMB RToken Pair - Virtual Address for the new SMC Link",
"smc.add.link.rmb.RTok.virt",
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_add_link_cont_flags, {
"Flags", "smc.add.link.cont.flags",
@ -1923,7 +2112,7 @@ proto_register_smcr(void)
{ &hf_smcr_add_link_cont_number_of_rkeys, {
"Number of Rkeys", "smc.add.link.cont.rkey.number",
FT_UINT8, BASE_HEX, NULL, 0x00, NULL, HFILL}},
FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL}},
{ &hf_smcr_add_link_cont_p1_rkey, {
"RMB RToken Pair 1 - Rkey as known on this SMC Link",
@ -1955,6 +2144,30 @@ proto_register_smcr(void)
"smc.add.link.cont.rmb.RTok1.virt",
FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_request_add_link_flags, {
"Flags", "smc.add.link.flags",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} },
{ &hf_smcr_request_add_link_response, {
"Request Add Link Response", "smc.request.add.link.response",
FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} },
{ &hf_smcr_request_add_link_response_rejected, {
"Request Add Link Rejected", "smc.request.add.link.response.rejected",
FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL} },
{ &hf_smcr_request_add_link_reject_reason, {
"Reject Reason", "smc.request.add.link.response.reject_reason",
FT_UINT8, BASE_HEX, NULL, 0x0F, NULL, HFILL} },
{ &hf_smc_request_add_link_gid_lst_len, {
"GID List Entry Count", "smc.request.add.link.gid.list.entry_count",
FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} },
{ &hf_smc_request_add_link_gid_list_entry, {
"RoCEv2 GID List Entry", "smc.request.add.link.gid.list.entry",
FT_IPv6, BASE_NONE, NULL, 0x0, NULL, HFILL} },
{ &hf_smcr_delete_link_flags, {
"Flags", "smc.delete.link.flags",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
@ -1998,7 +2211,7 @@ proto_register_smcr(void)
{ &hf_smcr_confirm_rkey_number, {
"Number of other QP", "smc.confirm.rkey.number.qp",
FT_UINT8, BASE_HEX, NULL, 0x00, NULL, HFILL}},
FT_UINT8, BASE_DEC, NULL, 0x00, NULL, HFILL}},
{ &hf_smcr_confirm_rkey_new_rkey, {
"New Rkey for this link","smc.confirm.rkey.new.rkey",
@ -2033,6 +2246,14 @@ proto_register_smcr(void)
"RMB Rkey to be deleted", "smc.delete.rkey.deleted",
FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_delete_rkey_count, {
"Rkey Count", "smc.delete.rkey.count",
FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_delete_rkey_invalid_count, {
"Invalid Rkey Count", "smc.delete.rkey.count.invalid",
FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}},
{ &hf_smcr_test_link_flags, {
"Flags", "smc.test.link.flags",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}},
@ -2279,7 +2500,9 @@ proto_register_smcr(void)
&ett_decline_flag2,
&ett_add_link_flag,
&ett_add_link_flag2,
&ett_add_link_flag3,
&ett_add_link_cont_flag,
&ett_request_add_link_flag,
&ett_delete_link_flag,
&ett_confirm_rkey_flag,
&ett_delete_rkey_flag,