NVMeOF: complete decoding of fabric commands.

Add support for:
* Authentication Send
* Authentication Receive
* Disconnect
This commit is contained in:
Constantine Gavrilov 2021-06-13 21:42:55 +03:00 committed by Wireshark GitLab Utility
parent c7e082c6de
commit 5d35e28e45
1 changed files with 102 additions and 8 deletions

View File

@ -56,7 +56,7 @@ static int proto_nvme = -1;
#define NVME_FCTYPE_PROP_GET 0x4
#define NVME_FCTYPE_AUTH_SEND 0x5
#define NVME_FCTYPE_AUTH_RECV 0x6
#define NVME_FCTYPE_AUTH_DISC 0x8
#define NVME_FCTYPE_DISCONNECT 0x8
/* NVMeOF fields */
@ -77,11 +77,24 @@ static int hf_nvmeof_cmd_connect_kato = -1;
static int hf_nvmeof_cmd_connect_rsvd3 = -1;
static int hf_nvmeof_cmd_connect_data_hostid = -1;
static int hf_nvmeof_cmd_connect_data_cntlid = -1;
static int hf_nvmeof_cmd_connect_data_rsvd = -1;
static int hf_nvmeof_cmd_connect_data_rsvd0 = -1;
static int hf_nvmeof_cmd_connect_data_subnqn = -1;
static int hf_nvmeof_cmd_connect_data_hostnqn = -1;
static int hf_nvmeof_cmd_connect_data_rsvd1 = -1;
static int hf_nvmeof_cmd_auth_rsdv1 = -1;
static int hf_nvmeof_cmd_auth_sgl1 = -1;
static int hf_nvmeof_cmd_auth_rsdv2 = -1;
static int hf_nvmeof_cmd_auth_spsp0 = -1;
static int hf_nvmeof_cmd_auth_spsp1 = -1;
static int hf_nvmeof_cmd_auth_secp = -1;
static int hf_nvmeof_cmd_auth_al = -1;
static int hf_nvmeof_cmd_auth_rsdv3 = -1;
static int hf_nvmeof_cmd_disconnect_rsvd0 = -1;
static int hf_nvmeof_cmd_disconnect_recfmt = -1;
static int hf_nvmeof_cmd_disconnect_rsvd1 = -1;
static int hf_nvmeof_cmd_prop_get_set_rsvd0 = -1;
static int hf_nvmeof_cmd_prop_get_set_attrib[3] = { NEG_LST_3 };
static int hf_nvmeof_cmd_prop_get_set_rsvd1 = -1;
@ -125,7 +138,7 @@ static const value_string fctype_tbl[] = {
{ NVME_FCTYPE_PROP_GET, "Property Get" },
{ NVME_FCTYPE_AUTH_SEND, "Authentication Send" },
{ NVME_FCTYPE_AUTH_RECV, "Authentication Recv" },
{ NVME_FCTYPE_AUTH_DISC, "Disconnect" },
{ NVME_FCTYPE_DISCONNECT, "Disconnect" },
{ 0, NULL}
};
@ -3383,6 +3396,38 @@ void dissect_nvmeof_fabric_connect_cmd(proto_tree *cmd_tree, packet_info *pinfo,
52+off, 12, ENC_NA);
}
static
void dissect_nvmeof_fabric_auth_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, guint off)
{
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv1, cmd_tvb,
5+off, 19, ENC_NA);
dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_auth_sgl1,
q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv2, cmd_tvb,
40+off, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp0, cmd_tvb,
41+off, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp1, cmd_tvb,
42+off, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_secp, cmd_tvb,
43+off, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_al, cmd_tvb,
44+off, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv3, cmd_tvb,
48+off, 16, ENC_NA);
}
static void dissect_nvme_fabric_disconnect_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, guint off)
{
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd0, cmd_tvb,
5+off, 35, ENC_NA);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_recfmt, cmd_tvb,
40+off, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd1, cmd_tvb,
42+off, 22, ENC_NA);
}
static void dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, guint off)
{
proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd0, cmd_tvb,
@ -3506,7 +3551,13 @@ void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tre
case NVME_FCTYPE_PROP_SET:
dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb, off);
break;
case NVME_FCTYPE_DISCONNECT:
dissect_nvme_fabric_disconnect_cmd(cmd_tree, nvme_tvb, off);
break;
case NVME_FCTYPE_AUTH_RECV:
case NVME_FCTYPE_AUTH_SEND:
dissect_nvmeof_fabric_auth_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
break;
default:
dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb, off);
break;
@ -3521,7 +3572,7 @@ dissect_nvmeof_fabric_connect_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree
offset, 16, ENC_NA);
proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_cntlid, data_tvb,
offset + 16, 2, ENC_LITTLE_ENDIAN);
proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd, data_tvb,
proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd0, data_tvb,
offset + 18, 238, ENC_NA);
proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_subnqn, data_tvb,
offset + 256, 256, ENC_ASCII | ENC_NA);
@ -3565,7 +3616,6 @@ dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb,
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_prop_set_rsvd, cqe_tvb,
0+off, 8, ENC_NA);
break;
case NVME_FCTYPE_AUTH_RECV:
default:
proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb,
0+off, 8, ENC_LITTLE_ENDIAN);
@ -3884,7 +3934,7 @@ proto_register_nvme(void)
{ "Reserved", "nvmeof.cmd.connect.rsvd3",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_connect_data_hostid,
{ &hf_nvmeof_cmd_connect_data_hostid,
{ "Host Identifier", "nvmeof.cmd.connect.data.hostid",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
@ -3892,8 +3942,8 @@ proto_register_nvme(void)
{ "Controller ID", "nvmeof.cmd.connect.data.cntrlid",
FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_connect_data_rsvd,
{ "Reserved", "nvmeof.cmd.connect.data.rsvd",
{ &hf_nvmeof_cmd_connect_data_rsvd0,
{ "Reserved", "nvmeof.cmd.connect.data.rsvd0",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_connect_data_subnqn,
@ -3908,6 +3958,50 @@ proto_register_nvme(void)
{ "Reserved", "nvmeof.cmd.connect.data.rsvd1",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_rsdv1,
{ "Reserved", "nvmeof.cmd.auth.rsvd1",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_sgl1,
{ "SGL1", "nvmeof.cmd.auth.sgl1",
FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_rsdv2,
{ "Reserved", "nvmeof.cmd.auth.rsvd2",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_spsp0,
{ "SP Specific 0", "nvmeof.cmd.auth.spsp0",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_spsp1,
{ "SP Specific 1", "nvmeof.cmd.auth.spsp1",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_secp,
{ "Security Protocol", "nvmeof.cmd.auth.secp",
FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_al,
{ "Allocation Length", "nvmeof.cmd.auth.al",
FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_auth_rsdv3,
{ "Reserved", "nvmeof.cmd.auth.rsvd3",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_disconnect_rsvd0,
{ "Reserved", "nvmeof.cmd.disconnect.rsvd0",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_disconnect_recfmt,
{ "Record Format", "nvmeof.cmd.disconnect.recfmt",
FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_disconnect_rsvd1,
{ "Reserved", "nvmeof.cmd.disconnect.rsvd1",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
},
{ &hf_nvmeof_cmd_prop_get_set_rsvd0,
{ "Reserved", "nvmeof.cmd.prop_get_set.rsvd0",
FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}