Coverage Report

Created: 2026-11-12 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/wireshark/epan/dissectors/packet-nvme.c
Line
Count
Source
1
/* packet-nvme.c
2
 * Routines for NVM Express dissection
3
 * Copyright 2016
4
 * Code by Parav Pandit
5
 *
6
 * Wireshark - Network traffic analyzer
7
 * By Gerald Combs <gerald@wireshark.org>
8
 * Copyright 1998 Gerald Combs
9
 *
10
 * SPDX-License-Identifier: GPL-2.0-or-later
11
 */
12
13
/* This file dissects NVMe packets received from the underlying
14
 * fabric such as RDMA, FC.
15
 * This is fabric agnostic dissector and depends on cmd_ctx and q_ctx
16
 * It currently aligns to below specification.
17
 * http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf
18
 */
19
20
#include "config.h"
21
22
#include <epan/packet.h>
23
#include <epan/expert.h>
24
#include <epan/tfs.h>
25
#include <epan/unit_strings.h>
26
27
#include <wsutil/array.h>
28
#include "packet-nvme.h"
29
30
void proto_register_nvme(void);
31
32
static int proto_nvme;
33
34
/* Dissector table for Security Send/Receive payloads, keyed on the Security
35
 * Protocol (SECP); see struct nvme_security_info in packet-nvme.h. */
36
static dissector_table_t nvme_security_secp_table;
37
38
39
/* NVMeOF fields */
40
/* NVMe Fabric Cmd */
41
static int hf_nvmeof_cmd;
42
static int hf_nvmeof_cmd_opc;
43
static int hf_nvmeof_cmd_rsvd;
44
static int hf_nvmeof_cmd_cid;
45
static int hf_nvmeof_cmd_fctype;
46
static int hf_nvmeof_cmd_connect_rsvd1;
47
static int hf_nvmeof_cmd_connect_sgl1;
48
static int hf_nvmeof_cmd_connect_recfmt;
49
static int hf_nvmeof_cmd_connect_qid;
50
static int hf_nvmeof_cmd_connect_sqsize;
51
static int hf_nvmeof_cmd_connect_cattr[5];
52
static int hf_nvmeof_cmd_connect_rsvd2;
53
static int hf_nvmeof_cmd_connect_kato;
54
static int hf_nvmeof_cmd_connect_rsvd3;
55
static int hf_nvmeof_cmd_connect_data_hostid;
56
static int hf_nvmeof_cmd_connect_data_cntlid;
57
static int hf_nvmeof_cmd_connect_data_rsvd0;
58
static int hf_nvmeof_cmd_connect_data_subnqn;
59
static int hf_nvmeof_cmd_connect_data_hostnqn;
60
static int hf_nvmeof_cmd_connect_data_rsvd1;
61
62
static int hf_nvmeof_cmd_auth_rsdv1;
63
static int hf_nvmeof_cmd_auth_sgl1;
64
static int hf_nvmeof_cmd_auth_rsdv2;
65
static int hf_nvmeof_cmd_auth_spsp0;
66
static int hf_nvmeof_cmd_auth_spsp1;
67
static int hf_nvmeof_cmd_auth_secp;
68
static int hf_nvmeof_cmd_auth_al;
69
static int hf_nvmeof_cmd_auth_rsdv3;
70
71
static int hf_nvmeof_cmd_disconnect_rsvd0;
72
static int hf_nvmeof_cmd_disconnect_recfmt;
73
static int hf_nvmeof_cmd_disconnect_rsvd1;
74
75
static int hf_nvmeof_cmd_prop_get_set_rsvd0;
76
static int hf_nvmeof_cmd_prop_get_set_attrib[3];
77
static int hf_nvmeof_cmd_prop_get_set_rsvd1;
78
static int hf_nvmeof_cmd_prop_get_set_offset;
79
static int hf_nvmeof_cmd_prop_get_rsvd2;
80
81
static int hf_nvmeof_cmd_prop_set_rsvd;
82
83
static int hf_nvmeof_cmd_generic_rsvd1;
84
static int hf_nvmeof_cmd_generic_field;
85
86
static int hf_nvmeof_prop_get_set_data;
87
static int hf_nvmeof_prop_get_set_data_4B;
88
static int hf_nvmeof_prop_get_set_data_4B_rsvd;
89
static int hf_nvmeof_prop_get_set_data_8B;
90
static int hf_nvmeof_prop_get_set_cc[10];
91
static int hf_nvmeof_prop_get_set_csts[7];
92
static int hf_nvmeof_prop_get_set_nssr[2];
93
static int hf_nvmeof_prop_get_vs[4];
94
static int hf_nvmeof_prop_get_ccap[17];
95
96
97
/* NVMe Fabric CQE */
98
static int hf_nvmeof_cqe;
99
static int hf_nvmeof_cqe_sts;
100
101
static int hf_nvmeof_cqe_connect_cntlid;
102
static int hf_nvmeof_cqe_connect_authreq;
103
static int hf_nvmeof_cqe_connect_rsvd;
104
static int hf_nvmeof_cqe_prop_set_rsvd;
105
106
/* tracking Cmd and its respective CQE */
107
int hf_nvmeof_cmd_pkt;
108
int hf_nvmeof_data_req;
109
static int hf_nvmeof_data_tr[NVME_CMD_MAX_TRS];
110
static int hf_nvmeof_cqe_pkt;
111
static int hf_nvmeof_cmd_latency;
112
113
static const range_string fctype_tbl[] = {
114
    { NVME_FCTYPE_PROP_SET,      NVME_FCTYPE_PROP_SET,      "Property Set" },
115
    { NVME_FCTYPE_CONNECT,       NVME_FCTYPE_CONNECT,       "Connect" },
116
    { NVME_FCTYPE_PROP_GET,      NVME_FCTYPE_PROP_GET,      "Property Get" },
117
    { NVME_FCTYPE_AUTH_SEND,     NVME_FCTYPE_AUTH_SEND,     "Authentication Send" },
118
    { NVME_FCTYPE_AUTH_RECV,     NVME_FCTYPE_AUTH_RECV,     "Authentication Recv" },
119
    { NVME_FCTYPE_DISCONNECT,    NVME_FCTYPE_DISCONNECT,    "Disconnect" },
120
    { 0xC0, 0xFF,                                           "Vendor Specific" },
121
    { 0, 0, NULL}
122
};
123
124
static const value_string pclass_tbl[] = {
125
    { 0x0, "Urgent" },
126
    { 0x1, "High" },
127
    { 0x2, "Medium" },
128
    { 0x3, "Low", },
129
    { 0, NULL}
130
};
131
132
static const value_string prop_offset_tbl[] = {
133
    { 0x0,      "Controller Capabilities"},
134
    { 0x8,      "Version"},
135
    { 0xc,      "Reserved"},
136
    { 0x10,     "Reserved"},
137
    { 0x14,     "Controller Configuration"},
138
    { 0x18,     "Reserved"},
139
    { 0x1c,     "Controller Status"},
140
    { 0x20,     "NVM Subsystem Reset"},
141
    { 0x24,     "Reserved"},
142
    { 0x28,     "Reserved"},
143
    { 0x30,     "Reserved"},
144
    { 0x38,     "Reserved"},
145
    { 0x3c,     "Reserved"},
146
    { 0x40,     "Reserved"},
147
    { 0x64,     "NVM Subsystem Shutdown"},
148
    { 0x68,     "Controller Ready Timeouts"},
149
    { 0, NULL}
150
};
151
152
static const value_string attr_size_tbl[] = {
153
    { 0,       "4 bytes"},
154
    { 1,       "8 bytes"},
155
    { 0, NULL}
156
};
157
158
static const value_string css_table[] = {
159
     { 0x0, "NVM Command Set"},
160
     { 0x6, "All Supported I/O Command Sets"},
161
     { 0x7, "Admin Command Set Only"},
162
     { 0x0, NULL}
163
};
164
static const value_string sn_table[] = {
165
    { 0x0, "No Shutdown"},
166
    { 0x1, "Normal Shutdown"},
167
    { 0x2, "Abrupt Shutdown"},
168
    { 0x3, "Reserved"},
169
    { 0x0, NULL}
170
};
171
static const value_string ams_table[] = {
172
    { 0x0, "Round Robin"},
173
    { 0x1, "Weighted Round Robin with Urgent Priority Class"},
174
    { 0x2, "Reserved"},
175
    { 0x3, "Reserved"},
176
    { 0x4, "Reserved"},
177
    { 0x5, "Reserved"},
178
    { 0x6, "Reserved"},
179
    { 0x7, "Vendor Specific"},
180
    { 0x0, NULL}
181
};
182
183
/* Shared with the NVMe-MI Controller Health Data Structure CSTS.SHST decode. */
184
const value_string shst_table[] = {
185
    { 0x0, "No Shutdown"},
186
    { 0x1, "Shutdown in Process"},
187
    { 0x2, "Shutdown Complete"},
188
    { 0x3, "Reserved"},
189
    { 0x0, NULL}
190
};
191
192
/* NVMe Cmd fields */
193
static int hf_nvme_cmd_opc;
194
static int hf_nvme_cmd_rsvd;
195
static int hf_nvme_cmd_cid;
196
static int hf_nvme_cmd_fuse_op;
197
static int hf_nvme_cmd_psdt;
198
static int hf_nvme_cmd_nsid;
199
static int hf_nvme_cmd_rsvd1;
200
static int hf_nvme_cmd_mptr;
201
static int hf_nvme_cmd_sgl;
202
static int hf_nvme_cmd_sgl_desc_type;
203
static int hf_nvme_cmd_sgl_desc_sub_type;
204
static int hf_nvme_cmd_sgl_desc_addr;
205
static int hf_nvme_cmd_sgl_desc_addr_rsvd;
206
static int hf_nvme_cmd_sgl_desc_len;
207
static int hf_nvme_cmd_sgl_desc_rsvd;
208
static int hf_nvme_cmd_sgl_desc_key;
209
static int hf_nvme_cmd_dword10;
210
static int hf_nvme_cmd_dword11;
211
static int hf_nvme_cmd_dword12;
212
static int hf_nvme_cmd_dword13;
213
static int hf_nvme_cmd_dword14;
214
static int hf_nvme_cmd_dword15;
215
static int hf_nvme_cmd_slba;
216
static int hf_nvme_cmd_nlb;
217
static int hf_nvme_cmd_rsvd2;
218
static int hf_nvme_cmd_prinfo;
219
static int hf_nvme_cmd_prinfo_prchk_lbrtag;
220
static int hf_nvme_cmd_prinfo_prchk_apptag;
221
static int hf_nvme_cmd_prinfo_prchk_guard;
222
static int hf_nvme_cmd_prinfo_pract;
223
static int hf_nvme_cmd_fua;
224
static int hf_nvme_cmd_lr;
225
static int hf_nvme_cmd_eilbrt;
226
static int hf_nvme_cmd_elbat;
227
static int hf_nvme_cmd_elbatm;
228
static int hf_nvme_cmd_dsm;
229
static int hf_nvme_cmd_dsm_access_freq;
230
static int hf_nvme_cmd_dsm_access_lat;
231
static int hf_nvme_cmd_dsm_seq_req;
232
static int hf_nvme_cmd_dsm_incompressible;
233
static int hf_nvme_cmd_rsvd3;
234
static int hf_nvme_identify_dword10[4];
235
static int hf_nvme_identify_dword11[4];
236
static int hf_nvme_identify_dword14[3];
237
238
static int hf_nvme_get_logpage_dword10[5];
239
static int hf_nvme_get_logpage_numd;
240
static int hf_nvme_get_logpage_dword11[3];
241
static int hf_nvme_get_logpage_lpo;
242
static int hf_nvme_get_logpage_dword14[5];
243
static int hf_nvme_set_features_dword10[4];
244
static int hf_nvme_set_features_dword14[3];
245
246
/* Admin opcodes whose CDW10-15 decode is shared with the NVMe-MI Admin
247
 * dissector (the request layout is a standard SQE from offset 40 onward). */
248
static int hf_nvme_format_nvm_dword10[8];
249
static int hf_nvme_fw_commit_dword10[5];
250
static int hf_nvme_fw_download_numd;
251
static int hf_nvme_fw_download_ofst;
252
static int hf_nvme_self_test_dword10[3];
253
static int hf_nvme_lockdown_dword10[7];
254
static int hf_nvme_lockdown_dword14[3];
255
static int hf_nvme_sanitize_dword10[8];
256
static int hf_nvme_sanitize_ovrpat;
257
static int hf_nvme_security_dword10[5];
258
static int hf_nvme_security_send_dword11_tl;
259
static int hf_nvme_security_recv_dword11_al;
260
static int hf_nvme_security_data;
261
static int hf_nvme_security_info;
262
static int hf_nvme_security_info_rsvd;
263
static int hf_nvme_security_info_list_len;
264
static int hf_nvme_security_info_protocol;
265
static int hf_nvme_security_info_cert_len;
266
static int hf_nvme_security_info_cert_data;
267
static int hf_nvme_cmd_set_features_dword11_arb[6];
268
static int hf_nvme_cmd_set_features_dword11_pm[4];
269
static int hf_nvme_cmd_set_features_dword11_lbart[3];
270
static int hf_nvme_cmd_set_features_dword11_tt[6];
271
static int hf_nvme_cmd_set_features_dword11_erec[4];
272
static int hf_nvme_cmd_set_features_dword11_vwce[3];
273
static int hf_nvme_cmd_set_features_dword11_nq[3];
274
static int hf_nvme_cmd_set_features_dword11_irqc[3];
275
static int hf_nvme_cmd_set_features_dword11_irqv[4];
276
static int hf_nvme_cmd_set_features_dword11_wan[3];
277
static int hf_nvme_cmd_set_features_dword11_aec[11];
278
static int hf_nvme_cmd_set_features_dword11_apst[3];
279
static int hf_nvme_cmd_set_features_dword11_kat[2];
280
static int hf_nvme_cmd_set_features_dword11_hctm[3];
281
static int hf_nvme_cmd_set_features_dword11_nops[3];
282
static int hf_nvme_cmd_set_features_dword11_rrl[3];
283
static int hf_nvme_cmd_set_features_dword12_rrl[3];
284
static int hf_nvme_cmd_set_features_dword11_plmc[3];
285
static int hf_nvme_cmd_set_features_dword12_plmc[3];
286
static int hf_nvme_cmd_set_features_dword11_plmw[3];
287
static int hf_nvme_cmd_set_features_dword12_plmw[3];
288
static int hf_nvme_cmd_set_features_dword11_lbasi[3];
289
static int hf_nvme_cmd_set_features_dword11_san[3];
290
static int hf_nvme_cmd_set_features_dword11_eg[4];
291
static int hf_nvme_cmd_set_features_dword11_swp[3];
292
static int hf_nvme_cmd_set_features_dword11_hid[3];
293
static int hf_nvme_cmd_set_features_dword11_rsrvn[6];
294
static int hf_nvme_cmd_set_features_dword11_rsrvp[3];
295
static int hf_nvme_cmd_set_features_dword11_nswp[3];
296
static int hf_nvme_cmd_set_features_dword11_hmd[3];
297
static int hf_nvme_cmd_set_features_dword11_hmb[6];
298
static int hf_nvme_cmd_set_features_dword11_iocsp[3];
299
static int hf_nvme_cmd_set_features_dword11_spinup[3];
300
static int hf_nvme_cmd_set_features_dword11_plsc[3];
301
static int hf_nvme_cmd_set_features_dword11_fdp[3];
302
static int hf_nvme_cmd_set_features_dword11_fdpe[4];
303
static int hf_nvme_cmd_set_features_dword11_bpwpc[4];
304
static int hf_nvme_set_features_tr_lbart;
305
static int hf_nvme_set_features_tr_lbart_type;
306
static int hf_nvme_set_features_tr_lbart_attr[4];
307
static int hf_nvme_set_features_tr_lbart_rsvd0;
308
static int hf_nvme_set_features_tr_lbart_slba;
309
static int hf_nvme_set_features_tr_lbart_nlb;
310
static int hf_nvme_set_features_tr_lbart_guid;
311
static int hf_nvme_set_features_tr_lbart_rsvd1;
312
static int hf_nvme_set_features_tr_apst[5];
313
static int hf_nvme_set_features_tr_tst[3];
314
static int hf_nvme_set_features_tr_plmc;
315
static int hf_nvme_set_features_tr_plmc_ee[7];
316
static int hf_nvme_set_features_tr_plmc_rsvd0;
317
static int hf_nvme_set_features_tr_plmc_dtwinrt;
318
static int hf_nvme_set_features_tr_plmc_dtwinwt;
319
static int hf_nvme_set_features_tr_plmc_dtwintt;
320
static int hf_nvme_set_features_tr_plmc_rsvd1;
321
static int hf_nvme_set_features_tr_hbs;
322
static int hf_nvme_set_features_tr_hbs_acre;
323
static int hf_nvme_set_features_tr_hbs_etdas;
324
static int hf_nvme_set_features_tr_hbs_lbafee;
325
static int hf_nvme_set_features_tr_hbs_hdisns;
326
static int hf_nvme_set_features_tr_hbs_cdfe[6];
327
static int hf_nvme_set_features_tr_hbs_rsvd;
328
static int hf_nvme_set_features_tr_hmd;
329
static int hf_nvme_set_features_tr_hmd_nmed;
330
static int hf_nvme_set_features_tr_hmd_rsvd;
331
static int hf_nvme_set_features_tr_hmd_med;
332
static int hf_nvme_set_features_tr_hmd_med_et;
333
static int hf_nvme_set_features_tr_hmd_med_er;
334
static int hf_nvme_set_features_tr_hmd_med_elen;
335
static int hf_nvme_set_features_tr_hmd_med_eval;
336
static int hf_nvme_get_features_dword10[4];
337
static int hf_nvme_get_features_dword14[3];
338
static int hf_nvme_cmd_get_features_dword11_rrl[3];
339
static int hf_nvme_cmd_get_features_dword11_plmc[3];
340
static int hf_nvme_cmd_get_features_dword11_plmw[3];
341
static int hf_nvme_identify_ns_nsze;
342
static int hf_nvme_identify_ns_ncap;
343
static int hf_nvme_identify_ns_nuse;
344
static int hf_nvme_identify_ns_nsfeat;
345
static int hf_nvme_identify_ns_nlbaf;
346
static int hf_nvme_identify_ns_flbas;
347
static int hf_nvme_identify_ns_mc;
348
static int hf_nvme_identify_ns_dpc;
349
static int hf_nvme_identify_ns_dps;
350
static int hf_nvme_identify_ns_nmic;
351
static int hf_nvme_identify_ns_rescap;
352
static int hf_nvme_identify_ns_fpi;
353
static int hf_nvme_identify_ns_dlfeat[5];
354
static int hf_nvme_identify_ns_nawun;
355
static int hf_nvme_identify_ns_nawupf;
356
static int hf_nvme_identify_ns_nacwu;
357
static int hf_nvme_identify_ns_nabsn;
358
static int hf_nvme_identify_ns_nabo;
359
static int hf_nvme_identify_ns_nabspf;
360
static int hf_nvme_identify_ns_noiob;
361
static int hf_nvme_identify_ns_nvmcap;
362
static int hf_nvme_identify_ns_npwg;
363
static int hf_nvme_identify_ns_npwa;
364
static int hf_nvme_identify_ns_npdg;
365
static int hf_nvme_identify_ns_npda;
366
static int hf_nvme_identify_ns_nows;
367
static int hf_nvme_identify_ns_mssrl;
368
static int hf_nvme_identify_ns_mcl;
369
static int hf_nvme_identify_ns_msrc;
370
static int hf_nvme_identify_ns_kpios[4];
371
static int hf_nvme_identify_ns_nulbaf;
372
static int hf_nvme_identify_ns_rsvd0;
373
static int hf_nvme_identify_ns_kpiodaag;
374
static int hf_nvme_identify_ns_rsvd1;
375
static int hf_nvme_identify_ns_anagrpid;
376
static int hf_nvme_identify_ns_rsvd2;
377
static int hf_nvme_identify_ns_nsattr;
378
static int hf_nvme_identify_ns_nvmsetid;
379
static int hf_nvme_identify_ns_endgid;
380
static int hf_nvme_identify_ns_nguid;
381
static int hf_nvme_identify_ns_eui64;
382
static int hf_nvme_identify_ns_lbafs;
383
static int hf_nvme_identify_ns_lbaf;
384
static int hf_nvme_identify_ns_vs;
385
/* CNS 08h: I/O Command Set Independent Identify Namespace (Base 2.3 Fig 335) */
386
static int hf_nvme_identify_cs_ind_ns_nsfeat[6];
387
static int hf_nvme_identify_cs_ind_ns_nmic[4];
388
static int hf_nvme_identify_cs_ind_ns_rescap[9];
389
static int hf_nvme_identify_cs_ind_ns_fpi[3];
390
static int hf_nvme_identify_cs_ind_ns_anagrpid;
391
static int hf_nvme_identify_cs_ind_ns_nsattr[3];
392
static int hf_nvme_identify_cs_ind_ns_rsvd0;
393
static int hf_nvme_identify_cs_ind_ns_nvmsetid;
394
static int hf_nvme_identify_cs_ind_ns_endgid;
395
static int hf_nvme_identify_cs_ind_ns_nstat[4];
396
static int hf_nvme_identify_cs_ind_ns_kpios[4];
397
static int hf_nvme_identify_cs_ind_ns_maxkt;
398
static int hf_nvme_identify_cs_ind_ns_rsvd1;
399
static int hf_nvme_identify_cs_ind_ns_rgrpid;
400
static int hf_nvme_identify_ctrl_vid;
401
static int hf_nvme_identify_ctrl_ssvid;
402
static int hf_nvme_identify_ctrl_sn;
403
static int hf_nvme_identify_ctrl_mn;
404
static int hf_nvme_identify_ctrl_fr;
405
static int hf_nvme_identify_ctrl_rab;
406
static int hf_nvme_identify_ctrl_ieee;
407
static int hf_nvme_identify_ctrl_cmic[6];
408
static int hf_nvme_identify_ctrl_mdts;
409
static int hf_nvme_identify_ctrl_cntlid;
410
static int hf_nvme_identify_ctrl_ver;
411
static int hf_nvme_identify_ctrl_ver_min;
412
static int hf_nvme_identify_ctrl_ver_mjr;
413
static int hf_nvme_identify_ctrl_ver_ter;
414
static int hf_nvme_identify_ctrl_rtd3r;
415
static int hf_nvme_identify_ctrl_rtd3e;
416
static int hf_nvme_identify_ctrl_oaes[10];
417
static int hf_nvme_identify_ctrl_ctratt[12];
418
static int hf_nvme_identify_ctrl_rrls[17];
419
static int hf_nvme_identify_ctrl_bpcap[4];
420
static int hf_nvme_identify_ctrl_rsvd0; /* byte 103 */
421
static int hf_nvme_identify_ctrl_nssl;
422
static int hf_nvme_identify_ctrl_rsvd6; /* bytes 109:108 */
423
static int hf_nvme_identify_ctrl_plsi[4];
424
static int hf_nvme_identify_ctrl_cntrltype;
425
static int hf_nvme_identify_ctrl_fguid;
426
static int hf_nvme_identify_ctrl_fguid_vse;
427
static int hf_nvme_identify_ctrl_fguid_oui;
428
static int hf_nvme_identify_ctrl_fguid_ei;
429
static int hf_nvme_identify_ctrl_crdt1;
430
static int hf_nvme_identify_ctrl_crdt2;
431
static int hf_nvme_identify_ctrl_crdt3;
432
static int hf_nvme_identify_ctrl_crcap[4];
433
static int hf_nvme_identify_ctrl_ciu;
434
static int hf_nvme_identify_ctrl_cirn;
435
static int hf_nvme_identify_ctrl_rsvd1; /* bytes 239:144 */
436
static int hf_nvme_identify_ctrl_mi;
437
static int hf_nvme_identify_ctrl_mi_rsvd;
438
static int hf_nvme_identify_ctrl_mi_nvmsr[4];
439
static int hf_nvme_identify_ctrl_mi_vwci[3];
440
static int hf_nvme_identify_ctrl_mi_mec[4];
441
static int hf_nvme_identify_ctrl_oacs[12];
442
static int hf_nvme_identify_ctrl_acl;
443
static int hf_nvme_identify_ctrl_aerl;
444
static int hf_nvme_identify_ctrl_frmw[5];
445
static int hf_nvme_identify_ctrl_lpa[7];
446
static int hf_nvme_identify_ctrl_elpe;
447
static int hf_nvme_identify_ctrl_npss;
448
static int hf_nvme_identify_ctrl_avscc[3];
449
static int hf_nvme_identify_ctrl_apsta[3];
450
static int hf_nvme_identify_ctrl_wctemp;
451
static int hf_nvme_identify_ctrl_cctemp;
452
static int hf_nvme_identify_ctrl_mtfa;
453
static int hf_nvme_identify_ctrl_hmpre;
454
static int hf_nvme_identify_ctrl_hmmin;
455
static int hf_nvme_identify_ctrl_tnvmcap;
456
static int  hf_nvme_identify_ctrl_unvmcap;
457
static int hf_nvme_identify_ctrl_rpmbs[6];
458
static int hf_nvme_identify_ctrl_edstt;
459
static int hf_nvme_identify_ctrl_dsto[3];
460
static int hf_nvme_identify_ctrl_fwug;
461
static int hf_nvme_identify_ctrl_kas;
462
static int hf_nvme_identify_ctrl_hctma[3];
463
static int hf_nvme_identify_ctrl_mntmt;
464
static int hf_nvme_identify_ctrl_mxtmt;
465
static int hf_nvme_identify_ctrl_sanicap[7];
466
static int hf_nvme_identify_ctrl_hmmminds;
467
static int hf_nvme_identify_ctrl_hmmaxd;
468
static int hf_nvme_identify_ctrl_nsetidmax;
469
static int hf_nvme_identify_ctrl_endgidmax;
470
static int hf_nvme_identify_ctrl_anatt;
471
static int hf_nvme_identify_ctrl_anacap[9];
472
static int hf_nvme_identify_ctrl_anagrpmax;
473
static int hf_nvme_identify_ctrl_nanagrpid;
474
static int hf_nvme_identify_ctrl_pels;
475
static int hf_nvme_identify_ctrl_did;
476
static int hf_nvme_identify_ctrl_kpioc[4];
477
static int hf_nvme_identify_ctrl_rsvd2; /* byte 359 */
478
static int hf_nvme_identify_ctrl_mptfawr;
479
static int hf_nvme_identify_ctrl_rsvd7; /* bytes 367:362 */
480
static int hf_nvme_identify_ctrl_megcap;
481
static int hf_nvme_identify_ctrl_tmpthha[3];
482
static int hf_nvme_identify_ctrl_mupa[3];
483
static int hf_nvme_identify_ctrl_cqt;
484
static int hf_nvme_identify_ctrl_cdpa[3];
485
static int hf_nvme_identify_ctrl_mup;
486
static int hf_nvme_identify_ctrl_ipmsr[3];
487
static int hf_nvme_identify_ctrl_msmt;
488
static int hf_nvme_identify_ctrl_rsvd8; /* bytes 511:396 */
489
static int hf_nvme_identify_ctrl_sqes[3];
490
static int hf_nvme_identify_ctrl_cqes[3];
491
static int hf_nvme_identify_ctrl_maxcmd;
492
static int hf_nvme_identify_ctrl_nn;
493
static int hf_nvme_identify_ctrl_oncs[10];
494
static int hf_nvme_identify_ctrl_fuses[3];
495
static int hf_nvme_identify_ctrl_fna[5];
496
static int hf_nvme_identify_ctrl_vwc[4];
497
static int hf_nvme_identify_ctrl_awun;
498
static int hf_nvme_identify_ctrl_awupf;
499
static int hf_nvme_identify_ctrl_nvscc[3];
500
static int hf_nvme_identify_ctrl_nwpc[5];
501
static int hf_nvme_identify_ctrl_acwu;
502
static int hf_nvme_identify_ctrl_rsvd3;
503
static int hf_nvme_identify_ctrl_sgls[11];
504
static int hf_nvme_identify_ctrl_mnan;
505
static int hf_nvme_identify_ctrl_maxdna;
506
static int hf_nvme_identify_ctrl_maxcna;
507
static int hf_nvme_identify_ctrl_oaqd;
508
static int hf_nvme_identify_ctrl_rhiri;
509
static int hf_nvme_identify_ctrl_hirt;
510
static int hf_nvme_identify_ctrl_cmmrtd;
511
static int hf_nvme_identify_ctrl_nmmrtd;
512
static int hf_nvme_identify_ctrl_minmrtg;
513
static int hf_nvme_identify_ctrl_maxmrtg;
514
static int hf_nvme_identify_ctrl_trattr[5];
515
static int hf_nvme_identify_ctrl_rsvd4; /* byte 577 */
516
static int hf_nvme_identify_ctrl_mcudmq;
517
static int hf_nvme_identify_ctrl_mnsudmq;
518
static int hf_nvme_identify_ctrl_mcmr;
519
static int hf_nvme_identify_ctrl_nmcmr;
520
static int hf_nvme_identify_ctrl_mcdqpc;
521
static int hf_nvme_identify_ctrl_rsvd9; /* bytes 767:588 */
522
static int hf_nvme_identify_ctrl_subnqn;
523
static int hf_nvme_identify_ctrl_rsvd5;
524
static int hf_nvme_identify_ctrl_nvmeof;
525
static int hf_nvme_identify_ctrl_nvmeof_ioccsz;
526
static int hf_nvme_identify_ctrl_nvmeof_iorcsz;
527
static int hf_nvme_identify_ctrl_nvmeof_icdoff;
528
static int hf_nvme_identify_ctrl_nvmeof_fcatt[3];
529
static int hf_nvme_identify_ctrl_nvmeof_msdbd;
530
static int hf_nvme_identify_ctrl_nvmeof_ofcs[3];
531
static int hf_nvme_identify_ctrl_nvmeof_dctype;
532
static int hf_nvme_identify_ctrl_nvmeof_ccrl;
533
static int hf_nvme_identify_ctrl_nvmeof_rsvd; /* bytes 2047:1808 */
534
static int hf_nvme_identify_ctrl_psds;
535
static int hf_nvme_identify_ctrl_psd;
536
static int hf_nvme_identify_ctrl_psd_mp;
537
static int hf_nvme_identify_ctrl_psd_rsvd0;
538
static int hf_nvme_identify_ctrl_psd_mxps;
539
static int hf_nvme_identify_ctrl_psd_nops;
540
static int hf_nvme_identify_ctrl_psd_rsvd1;
541
static int hf_nvme_identify_ctrl_psd_enlat;
542
static int hf_nvme_identify_ctrl_psd_exlat;
543
static int hf_nvme_identify_ctrl_psd_rrt;
544
static int hf_nvme_identify_ctrl_psd_rsvd2;
545
static int hf_nvme_identify_ctrl_psd_rrl;
546
static int hf_nvme_identify_ctrl_psd_rsvd3;
547
static int hf_nvme_identify_ctrl_psd_rwt;
548
static int hf_nvme_identify_ctrl_psd_rsvd4;
549
static int hf_nvme_identify_ctrl_psd_rwl;
550
static int hf_nvme_identify_ctrl_psd_rsvd5;
551
static int hf_nvme_identify_ctrl_psd_idlp;
552
static int hf_nvme_identify_ctrl_psd_rsvd6;
553
static int hf_nvme_identify_ctrl_psd_ips;
554
static int hf_nvme_identify_ctrl_psd_rsvd7;
555
static int hf_nvme_identify_ctrl_psd_actp;
556
static int hf_nvme_identify_ctrl_psd_apw;
557
static int hf_nvme_identify_ctrl_psd_rsvd8;
558
static int hf_nvme_identify_ctrl_psd_aps;
559
static int hf_nvme_identify_ctrl_psd_epfrt;
560
static int hf_nvme_identify_ctrl_psd_fqvt;
561
static int hf_nvme_identify_ctrl_psd_epfvt;
562
static int hf_nvme_identify_ctrl_psd_epfrts;
563
static int hf_nvme_identify_ctrl_psd_fqvts;
564
static int hf_nvme_identify_ctrl_psd_epfvts;
565
static int hf_nvme_identify_ctrl_psd_rsvd9;
566
static int hf_nvme_identify_ctrl_psd_mbw;
567
static int hf_nvme_identify_ctrl_psd_mbws;
568
static int hf_nvme_identify_ctrl_psd_rsvd10;
569
static int hf_nvme_identify_ctrl_psd_rsvd11;
570
static int hf_nvme_identify_ctrl_vs;
571
572
static int hf_nvme_identify_nslist_nsid;
573
574
/* Identify Namespace Identification Descriptor list (CNS 03h) response */
575
static int hf_nvme_identify_nsdesc_nidt;
576
static int hf_nvme_identify_nsdesc_nidl;
577
static int hf_nvme_identify_nsdesc_nid;
578
579
/* Identify Controller List (CNS 12h/13h) response */
580
static int hf_nvme_identify_ctrl_list_num;
581
static int hf_nvme_identify_ctrl_list_id;
582
583
/* Identify NVM Set List (CNS 04h) response */
584
static int hf_nvme_identify_nvmset_num;
585
static int hf_nvme_identify_nvmset_id;
586
static int hf_nvme_identify_nvmset_endgid;
587
static int hf_nvme_identify_nvmset_r4krt;
588
static int hf_nvme_identify_nvmset_ows;
589
static int hf_nvme_identify_nvmset_tnvmsc;
590
static int hf_nvme_identify_nvmset_unvmsc;
591
592
/* Identify Primary Controller Capabilities (CNS 14h) response */
593
static int hf_nvme_identify_pcc_cntlid;
594
static int hf_nvme_identify_pcc_portid;
595
static int hf_nvme_identify_pcc_crt[4];
596
static int hf_nvme_identify_pcc_vqfrt;
597
static int hf_nvme_identify_pcc_vqrfa;
598
static int hf_nvme_identify_pcc_vqrfap;
599
static int hf_nvme_identify_pcc_vqprt;
600
static int hf_nvme_identify_pcc_vqfrsm;
601
static int hf_nvme_identify_pcc_vqgran;
602
static int hf_nvme_identify_pcc_vifrt;
603
static int hf_nvme_identify_pcc_virfa;
604
static int hf_nvme_identify_pcc_virfap;
605
static int hf_nvme_identify_pcc_viprt;
606
static int hf_nvme_identify_pcc_vifrsm;
607
static int hf_nvme_identify_pcc_vigran;
608
609
/* Identify Secondary Controller List (CNS 15h) response */
610
static int hf_nvme_identify_scl_num;
611
static int hf_nvme_identify_scl_scid;
612
static int hf_nvme_identify_scl_pcid;
613
static int hf_nvme_identify_scl_scs[3];
614
static int hf_nvme_identify_scl_vfn;
615
static int hf_nvme_identify_scl_nvq;
616
static int hf_nvme_identify_scl_nvi;
617
618
/* Identify Namespace Granularity List (CNS 16h) response */
619
static int hf_nvme_identify_ngl_nga[3];
620
static int hf_nvme_identify_ngl_nd;
621
static int hf_nvme_identify_ngl_nsg;
622
static int hf_nvme_identify_ngl_ncg;
623
624
/* Identify UUID List (CNS 17h) response */
625
static int hf_nvme_identify_uuid_idassoc;
626
static int hf_nvme_identify_uuid_uuid;
627
628
/* get logpage response */
629
static int hf_nvme_get_logpage_ify_genctr;
630
static int hf_nvme_get_logpage_ify_numrec;
631
static int hf_nvme_get_logpage_ify_recfmt;
632
static int hf_nvme_get_logpage_ify_rsvd;
633
static int hf_nvme_get_logpage_ify_rcrd;
634
static int hf_nvme_get_logpage_ify_rcrd_trtype;
635
static int hf_nvme_get_logpage_ify_rcrd_adrfam;
636
static int hf_nvme_get_logpage_ify_rcrd_subtype;
637
static int hf_nvme_get_logpage_ify_rcrd_treq[6];
638
static int hf_nvme_get_logpage_ify_rcrd_portid;
639
static int hf_nvme_get_logpage_ify_rcrd_cntlid;
640
static int hf_nvme_get_logpage_ify_rcrd_asqsz;
641
static int hf_nvme_get_logpage_ify_rcrd_rsvd0;
642
static int hf_nvme_get_logpage_ify_rcrd_trsvcid;
643
static int hf_nvme_get_logpage_ify_rcrd_rsvd1;
644
static int hf_nvme_get_logpage_ify_rcrd_subnqn;
645
static int hf_nvme_get_logpage_ify_rcrd_traddr;
646
static int hf_nvme_get_logpage_ify_rcrd_tsas;
647
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype;
648
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype;
649
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms;
650
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0;
651
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey;
652
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1;
653
static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype;
654
static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd;
655
static int hf_nvme_get_logpage_errinf_errcnt;
656
static int hf_nvme_get_logpage_errinf_sqid;
657
static int hf_nvme_get_logpage_errinf_cid;
658
static int hf_nvme_get_logpage_errinf_sf[3];
659
static int hf_nvme_get_logpage_errinf_pel[4];
660
static int hf_nvme_get_logpage_errinf_lba;
661
static int hf_nvme_get_logpage_errinf_ns;
662
static int hf_nvme_get_logpage_errinf_vsi;
663
static int hf_nvme_get_logpage_errinf_trtype;
664
static int hf_nvme_get_logpage_errinf_cmdset;
665
static int hf_nvme_get_logpage_errinf_opc;
666
static int hf_nvme_get_logpage_errinf_csi;
667
static int hf_nvme_get_logpage_errinf_tsi;
668
static int hf_nvme_get_logpage_errinf_rsvd1;
669
static int hf_nvme_get_logpage_errinf_lpver;
670
static int hf_nvme_get_logpage_smart_cw[9];
671
static int hf_nvme_get_logpage_smart_ct;
672
static int hf_nvme_get_logpage_smart_asc;
673
static int hf_nvme_get_logpage_smart_ast;
674
static int hf_nvme_get_logpage_smart_lpu;
675
static int hf_nvme_get_logpage_smart_egcws[6];
676
static int hf_nvme_get_logpage_smart_rsvd0;
677
static int hf_nvme_get_logpage_smart_dur;
678
static int hf_nvme_get_logpage_smart_duw;
679
static int hf_nvme_get_logpage_smart_hrc;
680
static int hf_nvme_get_logpage_smart_hwc;
681
static int hf_nvme_get_logpage_smart_cbt;
682
static int hf_nvme_get_logpage_smart_pc;
683
static int hf_nvme_get_logpage_smart_poh;
684
static int hf_nvme_get_logpage_smart_us;
685
static int hf_nvme_get_logpage_smart_mie;
686
static int hf_nvme_get_logpage_smart_ele;
687
static int hf_nvme_get_logpage_smart_wctt;
688
static int hf_nvme_get_logpage_smart_cctt;
689
static int hf_nvme_get_logpage_smart_ts[9];
690
static int hf_nvme_get_logpage_smart_tmt1c;
691
static int hf_nvme_get_logpage_smart_tmt2c;
692
static int hf_nvme_get_logpage_smart_tmt1t;
693
static int hf_nvme_get_logpage_smart_tmt2t;
694
static int hf_nvme_get_logpage_smart_rsvd1;
695
static int hf_nvme_get_logpage_fw_slot_afi[5];
696
static int hf_nvme_get_logpage_fw_slot_rsvd0;
697
static int hf_nvme_get_logpage_fw_slot_frs;
698
static int hf_nvme_get_logpage_fw_slot_frs_ascii[7];
699
static int hf_nvme_get_logpage_fw_slot_rsvd1;
700
static int hf_nvme_get_logpage_changed_nslist;
701
static int hf_nvme_get_logpage_cmd_and_eff_cs;
702
static int hf_nvme_get_logpage_cmd_and_eff_cseds[10];
703
static int hf_nvme_get_logpage_supported_lids;
704
static int hf_nvme_get_logpage_supported_lidseds[5];
705
static int hf_nvme_get_logpage_selftest_csto[3];
706
static int hf_nvme_get_logpage_selftest_cstc[3];
707
static int hf_nvme_get_logpage_selftest_rsvd;
708
static int hf_nvme_get_logpage_selftest_res;
709
static int hf_nvme_get_logpage_selftest_res_status[3];
710
static int hf_nvme_get_logpage_selftest_res_sn;
711
static int hf_nvme_get_logpage_selftest_res_vdi[6];
712
static int hf_nvme_get_logpage_selftest_res_rsvd;
713
static int hf_nvme_get_logpage_selftest_res_poh;
714
static int hf_nvme_get_logpage_selftest_res_nsid;
715
static int hf_nvme_get_logpage_selftest_res_flba;
716
static int hf_nvme_get_logpage_selftest_res_sct[3];
717
static int hf_nvme_get_logpage_selftest_res_sc;
718
static int hf_nvme_get_logpage_selftest_res_vs;
719
static int hf_nvme_get_logpage_telemetry_li;
720
static int hf_nvme_get_logpage_telemetry_rsvd0;
721
static int hf_nvme_get_logpage_telemetry_ieee;
722
static int hf_nvme_get_logpage_telemetry_da1lb;
723
static int hf_nvme_get_logpage_telemetry_da2lb;
724
static int hf_nvme_get_logpage_telemetry_da3lb;
725
static int hf_nvme_get_logpage_telemetry_rsvd1;
726
static int hf_nvme_get_logpage_telemetry_da4lb;
727
static int hf_nvme_get_logpage_telemetry_rsvd2;
728
static int hf_nvme_get_logpage_telemetry_scope;
729
static int hf_nvme_get_logpage_telemetry_hdgn;
730
static int hf_nvme_get_logpage_telemetry_da;
731
static int hf_nvme_get_logpage_telemetry_dgn;
732
static int hf_nvme_get_logpage_telemetry_ri;
733
static int hf_nvme_get_logpage_telemetry_db;
734
static int hf_nvme_get_logpage_egroup_cw[6];
735
static int hf_nvme_get_logpage_egroup_egfeat[3];
736
static int hf_nvme_get_logpage_egroup_rsvd0;
737
static int hf_nvme_get_logpage_egroup_as;
738
static int hf_nvme_get_logpage_egroup_ast;
739
static int hf_nvme_get_logpage_egroup_pu;
740
static int hf_nvme_get_logpage_egroup_did;
741
static int hf_nvme_get_logpage_egroup_rsvd1;
742
static int hf_nvme_get_logpage_egroup_ee;
743
static int hf_nvme_get_logpage_egroup_dur;
744
static int hf_nvme_get_logpage_egroup_duw;
745
static int hf_nvme_get_logpage_egroup_muw;
746
static int hf_nvme_get_logpage_egroup_hrc;
747
static int hf_nvme_get_logpage_egroup_hwc;
748
static int hf_nvme_get_logpage_egroup_mdie;
749
static int hf_nvme_get_logpage_egroup_ele;
750
static int hf_nvme_get_logpage_egroup_tegcap;
751
static int hf_nvme_get_logpage_egroup_uegcap;
752
static int hf_nvme_get_logpage_egroup_rsvd2;
753
static int hf_nvme_get_logpage_pred_lat_status[3];
754
static int hf_nvme_get_logpage_pred_lat_rsvd0;
755
static int hf_nvme_get_logpage_pred_lat_etype[7];
756
static int hf_nvme_get_logpage_pred_lat_rsvd1;
757
static int hf_nvme_get_logpage_pred_lat_dtwin_rt;
758
static int hf_nvme_get_logpage_pred_lat_dtwin_wt;
759
static int hf_nvme_get_logpage_pred_lat_dtwin_tm;
760
static int hf_nvme_get_logpage_pred_lat_ndwin_tmh;
761
static int hf_nvme_get_logpage_pred_lat_ndwin_tml;
762
static int hf_nvme_get_logpage_pred_lat_rsvd2;
763
static int hf_nvme_get_logpage_pred_lat_dtwin_re;
764
static int hf_nvme_get_logpage_pred_lat_dtwin_we;
765
static int hf_nvme_get_logpage_pred_lat_dtwin_te;
766
static int hf_nvme_get_logpage_pred_lat_rsvd3;
767
static int hf_nvme_get_logpage_pred_lat_aggreg_ne;
768
static int hf_nvme_get_logpage_pred_lat_aggreg_nset;
769
static int hf_nvme_get_logpage_ana_chcnt;
770
static int hf_nvme_get_logpage_ana_ngd;
771
static int hf_nvme_get_logpage_ana_rsvd;
772
static int hf_nvme_get_logpage_ana_grp;
773
static int hf_nvme_get_logpage_ana_grp_id;
774
static int hf_nvme_get_logpage_ana_grp_nns;
775
static int hf_nvme_get_logpage_ana_grp_chcnt;
776
static int hf_nvme_get_logpage_ana_grp_anas[3];
777
static int hf_nvme_get_logpage_ana_grp_rsvd;
778
static int hf_nvme_get_logpage_ana_grp_nsid;
779
static int hf_nvme_get_logpage_lba_status_lslplen;
780
static int hf_nvme_get_logpage_lba_status_nlslne;
781
static int hf_nvme_get_logpage_lba_status_estulb;
782
static int hf_nvme_get_logpage_lba_status_rsvd;
783
static int hf_nvme_get_logpage_lba_status_lsgc;
784
static int hf_nvme_get_logpage_lba_status_nel;
785
static int hf_nvme_get_logpage_lba_status_nel_ne;
786
static int hf_nvme_get_logpage_lba_status_nel_ne_neid;
787
static int hf_nvme_get_logpage_lba_status_nel_ne_nlrd;
788
static int hf_nvme_get_logpage_lba_status_nel_ne_ratype;
789
static int hf_nvme_get_logpage_lba_status_nel_ne_rsvd;
790
static int hf_nvme_get_logpage_lba_status_nel_ne_rd;
791
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba;
792
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb;
793
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd;
794
static int hf_nvme_get_logpage_egroup_aggreg_ne;
795
static int hf_nvme_get_logpage_egroup_aggreg_eg;
796
static int hf_nvme_get_logpage_reserv_notif_lpc;
797
static int hf_nvme_get_logpage_reserv_notif_lpt;
798
static int hf_nvme_get_logpage_reserv_notif_nalp;
799
static int hf_nvme_get_logpage_reserv_notif_rsvd0;
800
static int hf_nvme_get_logpage_reserv_notif_nsid;
801
static int hf_nvme_get_logpage_reserv_notif_rsvd1;
802
static int hf_nvme_get_logpage_sanitize_sprog;
803
static int hf_nvme_get_logpage_sanitize_sstat[7];
804
static int hf_nvme_get_logpage_sanitize_scdw10;
805
static int hf_nvme_get_logpage_sanitize_eto;
806
static int hf_nvme_get_logpage_sanitize_etbe;
807
static int hf_nvme_get_logpage_sanitize_etce;
808
static int hf_nvme_get_logpage_sanitize_etond;
809
static int hf_nvme_get_logpage_sanitize_etbend;
810
static int hf_nvme_get_logpage_sanitize_etcend;
811
static int hf_nvme_get_logpage_sanitize_etpvds;
812
static int hf_nvme_get_logpage_sanitize_ssi[3];
813
static int hf_nvme_get_logpage_sanitize_rsvd0;
814
static int hf_nvme_get_logpage_sanitize_mnsoip;
815
static int hf_nvme_get_logpage_sanitize_stnsid;
816
static int hf_nvme_get_logpage_sanitize_rsvd;
817
static int hf_nvme_get_logpage_disc_rcrd_eflags[5];
818
/* Feature Identifiers Supported and Effects Response */
819
static int hf_nvme_get_logpage_feat_sup_and_eff_fidx;
820
static int hf_nvme_get_logpage_feat_sup_and_eff_fids[9];
821
/* NVMe-MI Commands Supported and Effects Response */
822
static int hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs;
823
static int hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[8];
824
/* Command and Feature Lockdown Response */
825
static int hf_nvme_get_logpage_cmd_feat_lockdown_cfila[4];
826
static int hf_nvme_get_logpage_cmd_feat_lockdown_rsvd;
827
static int hf_nvme_get_logpage_cmd_feat_lockdown_lngth;
828
static int hf_nvme_get_logpage_cmd_feat_lockdown_cfil;
829
static int hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1;
830
/* Physical Interface Receiver Eye Opening Measurement Response (LID 19h) */
831
static int hf_nvme_get_logpage_eom_lid;
832
static int hf_nvme_get_logpage_eom_eomip;
833
static int hf_nvme_get_logpage_eom_hsize;
834
static int hf_nvme_get_logpage_eom_rsz;
835
static int hf_nvme_get_logpage_eom_edgn;
836
static int hf_nvme_get_logpage_eom_lrev;
837
static int hf_nvme_get_logpage_eom_odp[4];
838
static int hf_nvme_get_logpage_eom_lns;
839
static int hf_nvme_get_logpage_eom_epl;
840
static int hf_nvme_get_logpage_eom_lspfc[3];
841
static int hf_nvme_get_logpage_eom_linfo[3];
842
static int hf_nvme_get_logpage_eom_rsvd0;
843
static int hf_nvme_get_logpage_eom_lsic;
844
static int hf_nvme_get_logpage_eom_ds;
845
static int hf_nvme_get_logpage_eom_nd;
846
static int hf_nvme_get_logpage_eom_maxtb;
847
static int hf_nvme_get_logpage_eom_maxlr;
848
static int hf_nvme_get_logpage_eom_etgood;
849
static int hf_nvme_get_logpage_eom_etbetter;
850
static int hf_nvme_get_logpage_eom_etbest;
851
static int hf_nvme_get_logpage_eom_rsvd1;
852
static int hf_nvme_get_logpage_eom_desc;
853
static int hf_nvme_get_logpage_eom_desc_rsvd0;
854
static int hf_nvme_get_logpage_eom_desc_mstat[3];
855
static int hf_nvme_get_logpage_eom_desc_ln;
856
static int hf_nvme_get_logpage_eom_desc_eye;
857
static int hf_nvme_get_logpage_eom_desc_top;
858
static int hf_nvme_get_logpage_eom_desc_btm;
859
static int hf_nvme_get_logpage_eom_desc_lft;
860
static int hf_nvme_get_logpage_eom_desc_rgt;
861
static int hf_nvme_get_logpage_eom_desc_nrows;
862
static int hf_nvme_get_logpage_eom_desc_ncols;
863
static int hf_nvme_get_logpage_eom_desc_edlen;
864
static int hf_nvme_get_logpage_eom_desc_rsvd1;
865
static int hf_nvme_get_logpage_eom_desc_pe;
866
static int hf_nvme_get_logpage_eom_desc_ed;
867
868
/* NVMe CQE fields */
869
static int hf_nvme_cqe_dword0;
870
static int hf_nvme_cqe_aev_dword0[6];
871
static int hf_nvme_cqe_dword0_sf_nq[3];
872
static int hf_nvme_cqe_dword0_sf_err;
873
874
static int hf_nvme_cqe_get_features_dword0_arb[6];
875
static int hf_nvme_cqe_get_features_dword0_pm[4];
876
static int hf_nvme_cqe_get_features_dword0_lbart[3];
877
static int hf_nvme_cqe_get_features_dword0_tt[6];
878
static int hf_nvme_cqe_get_features_dword0_erec[4];
879
static int hf_nvme_cqe_get_features_dword0_vwce[3];
880
static int hf_nvme_cqe_get_features_dword0_nq[3];
881
static int hf_nvme_cqe_get_features_dword0_irqc[3];
882
static int hf_nvme_cqe_get_features_dword0_irqv[4];
883
static int hf_nvme_cqe_get_features_dword0_wan[3];
884
static int hf_nvme_cqe_get_features_dword0_aec[11];
885
static int hf_nvme_cqe_get_features_dword0_apst[3];
886
static int hf_nvme_cqe_get_features_dword0_kat[2];
887
static int hf_nvme_cqe_get_features_dword0_hctm[3];
888
static int hf_nvme_cqe_get_features_dword0_nops[3];
889
static int hf_nvme_cqe_get_features_dword0_rrl[3];
890
static int hf_nvme_cqe_get_features_dword0_plmc[3];
891
static int hf_nvme_cqe_get_features_dword0_plmw[3];
892
static int hf_nvme_cqe_get_features_dword0_lbasi[3];
893
static int hf_nvme_cqe_get_features_dword0_san[3];
894
static int hf_nvme_cqe_get_features_dword0_eg[4];
895
static int hf_nvme_cqe_get_features_dword0_swp[3];
896
static int hf_nvme_cqe_get_features_dword0_hid[3];
897
static int hf_nvme_cqe_get_features_dword0_rsrvn[6];
898
static int hf_nvme_cqe_get_features_dword0_rsrvp[3];
899
static int hf_nvme_cqe_get_features_dword0_nswp[3];
900
901
static int hf_nvme_cqe_dword1;
902
static int hf_nvme_cqe_sqhd;
903
static int hf_nvme_cqe_sqid;
904
static int hf_nvme_cqe_cid;
905
static int hf_nvme_cqe_status[7];
906
static int hf_nvme_cqe_status_rsvd;
907
908
/* tracking Cmd and its respective CQE */
909
static int hf_nvme_cmd_pkt;
910
static int hf_nvme_data_req;
911
static int hf_nvme_data_tr[NVME_CMD_MAX_TRS];
912
static int hf_nvme_cqe_pkt;
913
static int hf_nvme_cmd_latency;
914
915
/* Data response fields */
916
static int hf_nvme_gen_data;
917
/* Initialize the subtree pointers */
918
static int ett_data;
919
920
static expert_field ei_nvme_cqe_status_error;
921
static expert_field ei_nvme_lbaf_count_invalid;
922
static expert_field ei_nvme_data_len_exceeds_frame;
923
static expert_field ei_nvme_logpage_window_misaligned;
924
static expert_field ei_nvme_eom_desc_truncated;
925
926
/* NVME_AQ_OPC_* admin opcodes are defined in packet-nvme.h (shared with the
927
 * NVMe-MI Admin dissector). */
928
929
7
#define NVME_IOQ_OPC_FLUSH                  0x0
930
7
#define NVME_IOQ_OPC_WRITE                  0x1
931
7
#define NVME_IOQ_OPC_READ                   0x2
932
7
#define NVME_IOQ_OPC_WRITE_UNCORRECTABLE    0x4
933
7
#define NVME_IOQ_OPC_COMPARE                0x5
934
7
#define NVME_IOQ_OPC_WRITE_ZEROS            0x8
935
7
#define NVME_IOQ_OPC_DATASET_MGMT           0x9
936
#define NVME_IOQ_OPC_VERIFY                 0xc
937
7
#define NVME_IOQ_OPC_RESV_REG               0xd
938
7
#define NVME_IOQ_OPC_RESV_REPORT            0xe
939
7
#define NVME_IOQ_OPC_RESV_ACQUIRE           0x11
940
#define NVME_IOQ_OPC_IO_MGMT_RECV           0x12
941
7
#define NVME_IOQ_OPC_RESV_RELEASE           0x15
942
#define NVME_IOQ_OPC_CANCEL                 0x18
943
#define NVME_IOQ_OPC_COPY                   0x19
944
#define NVME_IOQ_OPC_IO_MGMT_SEND           0x1d
945
946
/* NVME_IDENTIFY_CNS_* values are defined in packet-nvme.h. */
947
948
typedef enum {
949
    NVME_CQE_SCT_GENERIC = 0x0,
950
    NVME_CQE_SCT_COMMAND = 0x1,
951
    NVME_CQE_SCT_MEDIA = 0x2,
952
    NVME_CQE_SCT_PATH = 0x3,
953
    NVME_CQE_SCT_VENDOR = 0x7,
954
} nvme_cqe_sct_t;
955
956
typedef enum {
957
    NVME_CQE_SC_GEN_CMD_OK = 0x00,
958
    NVME_CQE_SC_CMD_INVALID_OPCODE = 0x01,
959
    NVME_CQE_SC_GEN_CMD_INVALID_FIELD = 0x02,
960
    NVME_CQE_SC_GEN_CMD_CID_CONFLICT = 0x03,
961
    NVME_CQE_SC_GEN_DATA_TRANSFER_ERR = 0x04,
962
    NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS = 0x05,
963
    NVME_CQE_SC_GEN_INTERNAL_ERROR = 0x06,
964
    NVME_CQE_SC_GEN_ABORT_REQUESTED = 0x07,
965
    NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE = 0x08,
966
    NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE = 0x09,
967
    NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE = 0x0A,
968
    NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT = 0x0B,
969
    NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR = 0x0C,
970
    NVME_CQE_SC_GEN_INVALID_SGL_SD = 0x0D,
971
    NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM = 0x0E,
972
    NVME_CQE_SC_GEN_INVALID_SGL_LEN = 0x0F,
973
    NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN = 0x10,
974
    NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE = 0x11,
975
    NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF = 0x12,
976
    NVME_CQE_SC_GEN_INVALID_PRP_OFFSET = 0x13,
977
    NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED = 0x14,
978
    NVME_CQE_SC_GEN_OPERATION_DENIED = 0x15,
979
    NVME_CQE_SC_GEN_INVALID_SGL_OFFSET = 0x16,
980
    NVME_CQE_SC_GEN_RESERVED_17H = 0x17,
981
    NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT = 0x18,
982
    NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED = 0x19,
983
    NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID = 0x1A,
984
    NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT = 0x1B,
985
    NVME_CQE_SC_GEN_SANITIZE_FAILED = 0x1C,
986
    NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS = 0x1D,
987
    NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID = 0x1E,
988
    NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB = 0x1F,
989
    NVME_CQE_SC_GEN_NAMESPACE_IS_WP = 0x20,
990
    NVME_CQE_SC_GEN_COMMAND_INTERRUPTED = 0x21,
991
    NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR = 0x22,
992
    NVME_CQE_SC_GEN_CMD_PROHIBITED_LOCKDOWN = 0x23,
993
    NVME_CQE_SC_GEN_ADMIN_CMD_MEDIA_NOT_READY = 0x24,
994
    NVME_CQE_SC_GEN_INVALID_KEY_TAG = 0x25,
995
    NVME_CQE_SC_GEN_HOST_DISP_NS_SUPP_NOT_ENABLED = 0x26,
996
    NVME_CQE_SC_GEN_HOST_ID_NOT_INITIALIZED = 0x27,
997
    NVME_CQE_SC_GEN_INCORRECT_KEY = 0x28,
998
    NVME_CQE_SC_GEN_FDP_DISABLED = 0x29,
999
    NVME_CQE_SC_GEN_INVALID_PLACEMENT_HANDLE_LIST = 0x2A,
1000
    NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_FAILED = 0x2B,
1001
    NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_IN_PROGRESS = 0x2C,
1002
    NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE = 0x80,
1003
    NVME_CQE_SC_GEN_CAPACITY_EXCEED = 0x81,
1004
    NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY = 0x82,
1005
    NVME_CQE_SC_GEN_RESERVATION_CONFLICT = 0x83,
1006
    NVME_CQE_SC_GEN_FMT_IN_PROGRESS = 0x84,
1007
    NVME_CQE_SC_GEN_INVALID_VALUE_SIZE = 0x85,
1008
    NVME_CQE_SC_GEN_INVALID_KEY_SIZE = 0x86,
1009
    NVME_CQE_SC_GEN_KV_KEY_DOES_NOT_EXIST = 0x87,
1010
    NVME_CQE_SC_GEN_UNRECOVERED_ERROR = 0x88,
1011
    NVME_CQE_SC_GEN_KEY_EXISTS = 0x89,
1012
} nvme_cqe_sc_gen_t;
1013
1014
typedef enum {
1015
    NVME_CQE_SC_CMD_INVALID_CQ = 0x00,
1016
    NVME_CQE_SC_CMD_INVALID_QID = 0x01,
1017
    NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE = 0x02,
1018
    NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED = 0x03,
1019
    NVME_CQE_SC_CMD_RESERVED_4H = 0x04,
1020
    NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED = 0x05,
1021
    NVME_CQE_SC_CMD_INVALID_FW_SLOT = 0x06,
1022
    NVME_CQE_SC_CMD_INVALID_FW_IMAGE = 0x07,
1023
    NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR = 0x08,
1024
    NVME_CQE_SC_CMD_INVALID_LOG_PAGE = 0x09,
1025
    NVME_CQE_SC_CMD_INVALID_FMT = 0x0A,
1026
    NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET = 0x0B,
1027
    NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE = 0x0C,
1028
    NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE = 0x0D,
1029
    NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE = 0x0E,
1030
    NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE = 0x0F,
1031
    NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET = 0x10,
1032
    NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET = 0x11,
1033
    NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME = 0x12,
1034
    NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED = 0x13,
1035
    NVME_CQE_SC_CMD_OVERLAPPING_RANGE = 0x14,
1036
    NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY = 0x15,
1037
    NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE = 0x16,
1038
    NVME_CQE_SC_CMD_RESERVED_17H = 0x17,
1039
    NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED = 0x18,
1040
    NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE = 0x19,
1041
    NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED = 0x1A,
1042
    NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP = 0x1B,
1043
    NVME_CQE_SC_CMD_INVALID_CNTRL_LIST = 0x1C,
1044
    NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS = 0x1D,
1045
    NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT = 0x1E,
1046
    NVME_CQE_SC_CMD_INVALID_CNTRL_ID = 0x1F,
1047
    NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE = 0x20,
1048
    NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM = 0x21,
1049
    NVME_CQE_SC_CMD_INVALID_RESOURSE_ID = 0x22,
1050
    NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR = 0x23,
1051
    NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID = 0x24,
1052
    NVME_CQE_SC_CMD_ANA_ATTACH_FAILED = 0x25,
1053
    NVME_CQE_SC_CMD_INSUFFICIENT_CAPACITY = 0x26,
1054
    NVME_CQE_SC_CMD_NS_ATTACHMENT_LIMIT_EXCEEDED = 0x27,
1055
    NVME_CQE_SC_CMD_PROHIBITION_NOT_SUPPORTED = 0x28,
1056
    NVME_CQE_SC_CMD_IO_CMD_SET_NOT_SUPPORTED = 0x29,
1057
    NVME_CQE_SC_CMD_IO_CMD_SET_NOT_ENABLED = 0x2A,
1058
    NVME_CQE_SC_CMD_IO_CMD_SET_COMBINATION_REJECTED = 0x2B,
1059
    NVME_CQE_SC_CMD_INVALID_IO_CMD_SET = 0x2C,
1060
    NVME_CQE_SC_CMD_IDENTIFIER_UNAVAILABLE = 0x2D,
1061
    NVME_CQE_SC_CMD_NAMESPACE_IS_DISPERSED = 0x2E,
1062
    NVME_CQE_SC_CMD_INVALID_DISCOVERY_INFO = 0x2F,
1063
    NVME_CQE_SC_CMD_ZONING_DS_LOCKED = 0x30,
1064
    NVME_CQE_SC_CMD_ZONING_DS_NOT_FOUND = 0x31,
1065
    NVME_CQE_SC_CMD_INSUFFICIENT_DISCOVERY_RES = 0x32,
1066
    NVME_CQE_SC_CMD_REQUESTED_FUNCTION_DISABLED = 0x33,
1067
    NVME_CQE_SC_CMD_ZONEGROUP_ORIGINATOR_INVALID = 0x34,
1068
    NVME_CQE_SC_CMD_INVALID_HOST = 0x35,
1069
    NVME_CQE_SC_CMD_INVALID_NVM_SUBSYSTEM = 0x36,
1070
    NVME_CQE_SC_CMD_INVALID_CTRL_DATA_QUEUE = 0x37,
1071
    NVME_CQE_SC_CMD_NOT_ENOUGH_RESOURCES = 0x38,
1072
    NVME_CQE_SC_CMD_CONTROLLER_SUSPENDED = 0x39,
1073
    NVME_CQE_SC_CMD_CONTROLLER_NOT_SUSPENDED = 0x3A,
1074
    NVME_CQE_SC_CMD_CTRL_DATA_QUEUE_FULL = 0x3B,
1075
    NVME_CQE_SC_CMD_EXCEEDS_MAX_NS_SANITIZE_OPS = 0x3C,
1076
    NVME_CQE_SC_CMD_MFG_DEFAULT_PERSONALITY_REQUIRED = 0x3D,
1077
    NVME_CQE_SC_CMD_INVALID_POWER_LIMIT = 0x3E,
1078
    NVME_CQE_SC_CMD_CROSS_CTRL_RESET_IN_PROGRESS = 0x3F,
1079
    NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LOG_PAGE_FULL = 0x40,
1080
    NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LIMIT_EXCEEDED = 0x41,
1081
    NVME_CQE_SC_CMD_CONFLICTING_ATTRS = 0x80,
1082
    NVME_CQE_SC_CMD_INVALID_PROTECTION_INF = 0x81,
1083
    NVME_CQE_SC_CMD_WRITE_TO_RO_REGION = 0x82,
1084
    NVME_CQE_SC_CMD_SIZE_LIMIT_EXCEEDED = 0x83,
1085
    NVME_CQE_SC_CMD_INVALID_COMMAND_ID = 0x84,
1086
    NVME_CQE_SC_CMD_INCOMPAT_NAMESPACE_OR_FMT = 0x85,
1087
    NVME_CQE_SC_CMD_FAST_COPY_NOT_POSSIBLE = 0x86,
1088
    NVME_CQE_SC_CMD_OVERLAPPING_IO_RANGE = 0x87,
1089
    NVME_CQE_SC_CMD_NAMESPACE_NOT_REACHABLE = 0x88,
1090
    NVME_CQE_SC_CMD_INSUFFICIENT_RESOURCES = 0x89,
1091
    NVME_CQE_SC_CMD_INSUFFICIENT_PROGRAM_RESOURCES = 0x8A,
1092
    NVME_CQE_SC_CMD_INVALID_MEMORY_NAMESPACE = 0x8B,
1093
    NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET = 0x8C,
1094
    NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET_ID = 0x8D,
1095
    NVME_CQE_SC_CMD_INVALID_PROGRAM_DATA = 0x8E,
1096
    NVME_CQE_SC_CMD_INVALID_PROGRAM_INDEX = 0x8F,
1097
    NVME_CQE_SC_CMD_INVALID_PROGRAM_TYPE = 0x90,
1098
    NVME_CQE_SC_CMD_MAX_MEMORY_RANGES_EXCEEDED = 0x91,
1099
    NVME_CQE_SC_CMD_MAX_MEMORY_RANGE_SETS_EXCEEDED = 0x92,
1100
    NVME_CQE_SC_CMD_MAX_PROGRAMS_ACTIVATED = 0x93,
1101
    NVME_CQE_SC_CMD_MAX_PROGRAM_BYTES_EXCEEDED = 0x94,
1102
    NVME_CQE_SC_CMD_MEMORY_RANGE_SET_IN_USE = 0x95,
1103
    NVME_CQE_SC_CMD_NO_PROGRAM = 0x96,
1104
    NVME_CQE_SC_CMD_OVERLAPPING_MEMORY_RANGES = 0x97,
1105
    NVME_CQE_SC_CMD_PROGRAM_NOT_ACTIVATED = 0x98,
1106
    NVME_CQE_SC_CMD_PROGRAM_IN_USE = 0x99,
1107
    NVME_CQE_SC_CMD_PROGRAM_INDEX_NOT_DOWNLOADABLE = 0x9A,
1108
    NVME_CQE_SC_CMD_PROGRAM_TOO_BIG = 0x9B,
1109
    NVME_CQE_SC_CMD_SUCCESSFUL_MEDIA_VERIFICATION_READ = 0x9C,
1110
    NVME_CQE_SC_CMD_ZONE_BOUNDARY_ERROR = 0xB8,
1111
    NVME_CQE_SC_CMD_ZONE_IS_FULL = 0xB9,
1112
    NVME_CQE_SC_CMD_ZONE_IS_READ_ONLY = 0xBA,
1113
    NVME_CQE_SC_CMD_ZONE_IS_OFFLINE = 0xBB,
1114
    NVME_CQE_SC_CMD_ZONE_INVALID_WRITE = 0xBC,
1115
    NVME_CQE_SC_CMD_TOO_MANY_ACTIVE_ZONES = 0xBD,
1116
    NVME_CQE_SC_CMD_TOO_MANY_OPEN_ZONES = 0xBE,
1117
    NVME_CQE_SC_CMD_INVALID_ZONE_STATE_TRANSITION = 0xBF,
1118
} nvme_cqe_sc_cmd_t;
1119
1120
typedef enum {
1121
    NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT = 0x80,
1122
    NVMEOF_CQE_SC_CMD_CONT_BUSY = 0x81,
1123
    NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS = 0x82,
1124
    NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC = 0x83,
1125
    NVMEOF_CQE_SC_CMD_CNCT_INV_HOST = 0x84,
1126
    NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE = 0x85,
1127
    NVMEOF_CQE_SC_CMD_DISC_RESTART = 0x90,
1128
    NVMEOF_CQE_SC_CMD_AUTH_REQ = 0x91,
1129
} nvmeof_cqe_sc_cmd_t;
1130
1131
typedef enum {
1132
    NVME_CQE_SC_MEDIA_WRITE_FAULT = 0x80,
1133
    NVME_CQE_SC_MEDIA_READ_FAULT = 0x81,
1134
    NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR = 0x82,
1135
    NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR = 0x83,
1136
    NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR = 0x84,
1137
    NVME_CQE_SC_MEDIA_COMPARE_FAILURE = 0x85,
1138
    NVME_CQE_SC_MEDIA_ACCESS_DENIED = 0x86,
1139
    NVME_CQE_SC_MEDIA_DEALLOCATED_LBA = 0x87,
1140
    NVME_CQE_SC_MEDIA_ETE_STORAGE_TAG_CHECK_ERR = 0x88,
1141
} nvme_cqe_sc_media_t;
1142
1143
typedef enum {
1144
    NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR = 0x00,
1145
    NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS = 0x01,
1146
    NVME_CQE_SC_PATH_ANA_INACCESSIBLE = 0x02,
1147
    NVME_CQE_SC_PATH_ANA_TRANSIENT = 0x03,
1148
    NVME_CQE_SC_PATH_CNTRL_PATH_ERROR = 0x60,
1149
    NVME_CQE_SC_PATH_HOST_PATH_ERROR = 0x70,
1150
    NVME_CQE_SC_PATH_CMD_ABORT = 0x71,
1151
} nvme_cqe_sc_path_t;
1152
1153
static const value_string nvme_cqe_sct_tbl[] = {
1154
    { NVME_CQE_SCT_GENERIC, "Generic Command Status" },
1155
    { NVME_CQE_SCT_COMMAND, "Command Specific Status" },
1156
    { NVME_CQE_SCT_MEDIA, "Media and Data Integrity Errors" },
1157
    { NVME_CQE_SCT_PATH, "Path Related Status" },
1158
    { NVME_CQE_SCT_VENDOR, "Vendor Specific" },
1159
    { 0, NULL },
1160
};
1161
1162
static const value_string nvme_cqe_sc_gen_tbl[] = {
1163
    { NVME_CQE_SC_GEN_CMD_OK, "Successful Completion" },
1164
    { NVME_CQE_SC_CMD_INVALID_OPCODE, "Invalid opcode field" },
1165
    { NVME_CQE_SC_GEN_CMD_INVALID_FIELD, "Invalid Field in Command" },
1166
    { NVME_CQE_SC_GEN_CMD_CID_CONFLICT, "Command ID Conflict" },
1167
    { NVME_CQE_SC_GEN_DATA_TRANSFER_ERR, "Data Transfer Error" },
1168
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS, "Commands Aborted due to Power Loss Notification" },
1169
    { NVME_CQE_SC_GEN_INTERNAL_ERROR, "Internal Error" },
1170
    { NVME_CQE_SC_GEN_ABORT_REQUESTED, "Command Abort Requested" },
1171
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE, "Command Aborted due to SQ Deletion" },
1172
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE, "Command Aborted due to Failed Fused Command" },
1173
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE, "Command Aborted due to Missing Fused Command" },
1174
    { NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT, "Invalid Namespace or Format" },
1175
    { NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR, "Command Sequence Error" },
1176
    { NVME_CQE_SC_GEN_INVALID_SGL_SD, "Invalid SGL Segment Descriptor" },
1177
    { NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM, "Invalid Number of SGL Descriptors" },
1178
    { NVME_CQE_SC_GEN_INVALID_SGL_LEN, "Data SGL Length Invalid" },
1179
    { NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN, "Metadata SGL Length Invalid" },
1180
    { NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE, "SGL Descriptor Type Invalid" },
1181
    { NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF, "Invalid Use of Controller Memory Buffer" },
1182
    { NVME_CQE_SC_GEN_INVALID_PRP_OFFSET, "PRP Offset Invalid" },
1183
    { NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED, "Atomic Write Unit Exceeded" },
1184
    { NVME_CQE_SC_GEN_OPERATION_DENIED, "Operation Denied" },
1185
    { NVME_CQE_SC_GEN_INVALID_SGL_OFFSET, "SGL Offset Invalid" },
1186
    { NVME_CQE_SC_GEN_RESERVED_17H, "Reserved" },
1187
    { NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT, "Host Identifier Inconsistent Format" },
1188
    { NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED, "Keep Alive Timer Expired" },
1189
    { NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID, "Keep Alive Timeout Invalid" },
1190
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT, "Command Aborted due to Preempt and Abort" },
1191
    { NVME_CQE_SC_GEN_SANITIZE_FAILED, "Sanitize Failed" },
1192
    { NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS,"Sanitize In Progress"  },
1193
    { NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID, "SGL Data Block Granularity Invalid" },
1194
    { NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB, "Command Not Supported for Queue in CMB" },
1195
    { NVME_CQE_SC_GEN_NAMESPACE_IS_WP, "Namespace is Write Protected" },
1196
    { NVME_CQE_SC_GEN_COMMAND_INTERRUPTED,"Command Interrupted" },
1197
    { NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR, "Transient Transport Error"},
1198
    { NVME_CQE_SC_GEN_CMD_PROHIBITED_LOCKDOWN, "Command Prohibited by Command and Feature Lockdown" },
1199
    { NVME_CQE_SC_GEN_ADMIN_CMD_MEDIA_NOT_READY, "Admin Command Media Not Ready" },
1200
    { NVME_CQE_SC_GEN_INVALID_KEY_TAG, "Invalid Key Tag" },
1201
    { NVME_CQE_SC_GEN_HOST_DISP_NS_SUPP_NOT_ENABLED, "Host Dispersed Namespace Support Not Enabled" },
1202
    { NVME_CQE_SC_GEN_HOST_ID_NOT_INITIALIZED, "Host Identifier Not Initialized" },
1203
    { NVME_CQE_SC_GEN_INCORRECT_KEY, "Incorrect Key" },
1204
    { NVME_CQE_SC_GEN_FDP_DISABLED, "FDP Disabled" },
1205
    { NVME_CQE_SC_GEN_INVALID_PLACEMENT_HANDLE_LIST, "Invalid Placement Handle List" },
1206
    { NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_FAILED, "Sanitize Namespace Failed" },
1207
    { NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_IN_PROGRESS, "Sanitize Namespace In Progress" },
1208
    { NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE, "LBA Out of Range" },
1209
    { NVME_CQE_SC_GEN_CAPACITY_EXCEED, "Capacity Exceeded" },
1210
    { NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY, "Namespace Not Ready" },
1211
    { NVME_CQE_SC_GEN_RESERVATION_CONFLICT, "Reservation Conflict" },
1212
    { NVME_CQE_SC_GEN_FMT_IN_PROGRESS, "Format In Progress"},
1213
    { NVME_CQE_SC_GEN_INVALID_VALUE_SIZE, "Invalid Value Size" },
1214
    { NVME_CQE_SC_GEN_INVALID_KEY_SIZE, "Invalid Key Size" },
1215
    { NVME_CQE_SC_GEN_KV_KEY_DOES_NOT_EXIST, "KV Key Does Not Exist" },
1216
    { NVME_CQE_SC_GEN_UNRECOVERED_ERROR, "Unrecovered Error" },
1217
    { NVME_CQE_SC_GEN_KEY_EXISTS, "Key Exists" },
1218
    { 0, NULL },
1219
};
1220
1221
static const value_string nvme_cqe_sc_cmd_tbl[] = {
1222
    { NVME_CQE_SC_CMD_INVALID_CQ, "Completion Queue Invalid" },
1223
    { NVME_CQE_SC_CMD_INVALID_QID, "Invalid Queue Identifier" },
1224
    { NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE, "Invalid Queue Size" },
1225
    { NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED, "Abort Command Limit Exceeded" },
1226
    { NVME_CQE_SC_CMD_RESERVED_4H, "Reserved" },
1227
    { NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED, "Asynchronous Event Request Limit Exceeded" },
1228
    { NVME_CQE_SC_CMD_INVALID_FW_SLOT, "Invalid Firmware Slot" },
1229
    { NVME_CQE_SC_CMD_INVALID_FW_IMAGE, "Invalid Firmware Image" },
1230
    { NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR, "Invalid Interrupt Vector" },
1231
    { NVME_CQE_SC_CMD_INVALID_LOG_PAGE, "Invalid Log Page" },
1232
    { NVME_CQE_SC_CMD_INVALID_FMT, "Invalid Format" },
1233
    { NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET, "Firmware Activation Requires Conventional Reset" },
1234
    { NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE, "Invalid Queue Deletion" },
1235
    { NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE, "Feature Identifier Not Saveable" },
1236
    { NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE, "Feature Not Changeable" },
1237
    { NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE, "Feature Not Namespace Specific" },
1238
    { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET, "Firmware Activation Requires NVM Subsystem Reset" },
1239
    { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET, "Firmware Activation Requires Controller Level Reset" },
1240
    { NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME, "Firmware Activation Requires Maximum Time Violation" },
1241
    { NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED, "Firmware Activation Prohibited" },
1242
    { NVME_CQE_SC_CMD_OVERLAPPING_RANGE, "Overlapping Range" },
1243
    { NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY, "Namespace Insufficient Capacity" },
1244
    { NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE, "Namespace Identifier Unavailable" },
1245
    { NVME_CQE_SC_CMD_RESERVED_17H, "Reserved" },
1246
    { NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED, "Namespace Already Attached" },
1247
    { NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE, "Namespace Is Private" },
1248
    { NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED, "Namespace Not Attached" },
1249
    { NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP, "Thin Provisioning Not Supported" },
1250
    { NVME_CQE_SC_CMD_INVALID_CNTRL_LIST, "Controller List Invalid" },
1251
    { NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS, "Device Self-test In Progress" },
1252
    { NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT, "Boot Partition Write Prohibited" },
1253
    { NVME_CQE_SC_CMD_INVALID_CNTRL_ID, "Invalid Controller Identifier" },
1254
    { NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE, "Invalid Secondary Controller State" },
1255
    { NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM, "Invalid Number of Controller Resources" },
1256
    { NVME_CQE_SC_CMD_INVALID_RESOURSE_ID, "Invalid Resource Identifier" },
1257
    { NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR, "Sanitize Prohibited While Persistent Memory Region  is Enabled" },
1258
    { NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID, "ANA Group Identifier Invalid" },
1259
    { NVME_CQE_SC_CMD_ANA_ATTACH_FAILED, "ANA Attach Failed" },
1260
    { NVME_CQE_SC_CMD_INSUFFICIENT_CAPACITY, "Insufficient Capacity" },
1261
    { NVME_CQE_SC_CMD_NS_ATTACHMENT_LIMIT_EXCEEDED, "Namespace Attachment Limit Exceeded" },
1262
    { NVME_CQE_SC_CMD_PROHIBITION_NOT_SUPPORTED, "Prohibition of Command Execution Not Supported" },
1263
    { NVME_CQE_SC_CMD_IO_CMD_SET_NOT_SUPPORTED, "I/O Command Set Not Supported" },
1264
    { NVME_CQE_SC_CMD_IO_CMD_SET_NOT_ENABLED, "I/O Command Set Not Enabled" },
1265
    { NVME_CQE_SC_CMD_IO_CMD_SET_COMBINATION_REJECTED, "I/O Command Set Combination Rejected" },
1266
    { NVME_CQE_SC_CMD_INVALID_IO_CMD_SET, "Invalid I/O Command Set" },
1267
    { NVME_CQE_SC_CMD_IDENTIFIER_UNAVAILABLE, "Identifier Unavailable" },
1268
    { NVME_CQE_SC_CMD_NAMESPACE_IS_DISPERSED, "Namespace Is Dispersed" },
1269
    { NVME_CQE_SC_CMD_INVALID_DISCOVERY_INFO, "Invalid Discovery Information" },
1270
    { NVME_CQE_SC_CMD_ZONING_DS_LOCKED, "Zoning Data Structure Locked" },
1271
    { NVME_CQE_SC_CMD_ZONING_DS_NOT_FOUND, "Zoning Data Structure Not Found" },
1272
    { NVME_CQE_SC_CMD_INSUFFICIENT_DISCOVERY_RES, "Insufficient Discovery Resources" },
1273
    { NVME_CQE_SC_CMD_REQUESTED_FUNCTION_DISABLED, "Requested Function Disabled" },
1274
    { NVME_CQE_SC_CMD_ZONEGROUP_ORIGINATOR_INVALID, "ZoneGroup Originator Invalid" },
1275
    { NVME_CQE_SC_CMD_INVALID_HOST, "Invalid Host" },
1276
    { NVME_CQE_SC_CMD_INVALID_NVM_SUBSYSTEM, "Invalid NVM Subsystem" },
1277
    { NVME_CQE_SC_CMD_INVALID_CTRL_DATA_QUEUE, "Invalid Controller Data Queue" },
1278
    { NVME_CQE_SC_CMD_NOT_ENOUGH_RESOURCES, "Not Enough Resources" },
1279
    { NVME_CQE_SC_CMD_CONTROLLER_SUSPENDED, "Controller Suspended" },
1280
    { NVME_CQE_SC_CMD_CONTROLLER_NOT_SUSPENDED, "Controller Not Suspended" },
1281
    { NVME_CQE_SC_CMD_CTRL_DATA_QUEUE_FULL, "Controller Data Queue Full" },
1282
    { NVME_CQE_SC_CMD_EXCEEDS_MAX_NS_SANITIZE_OPS, "Request Exceeds Maximum Namespace Sanitize Operations In Progress" },
1283
    { NVME_CQE_SC_CMD_MFG_DEFAULT_PERSONALITY_REQUIRED, "Manufacturing Default Personality Required" },
1284
    { NVME_CQE_SC_CMD_INVALID_POWER_LIMIT, "Invalid Power Limit" },
1285
    { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_IN_PROGRESS, "Cross-Controller Reset in Progress" },
1286
    { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LOG_PAGE_FULL, "Cross-Controller Reset Log Page Full" },
1287
    { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LIMIT_EXCEEDED, "Cross-Controller Reset Limit Exceeded" },
1288
    { NVME_CQE_SC_CMD_CONFLICTING_ATTRS, "Conflicting Attributes" },
1289
    { NVME_CQE_SC_CMD_INVALID_PROTECTION_INF, "Invalid Protection Information" },
1290
    { NVME_CQE_SC_CMD_WRITE_TO_RO_REGION, "Attempted Write to Read Only Range" },
1291
    { NVME_CQE_SC_CMD_SIZE_LIMIT_EXCEEDED, "Command Size Limit Exceeded" },
1292
    { NVME_CQE_SC_CMD_INVALID_COMMAND_ID, "Invalid Command ID" },
1293
    { NVME_CQE_SC_CMD_INCOMPAT_NAMESPACE_OR_FMT, "Incompatible Namespace or Format" },
1294
    { NVME_CQE_SC_CMD_FAST_COPY_NOT_POSSIBLE, "Fast Copy Not Possible" },
1295
    { NVME_CQE_SC_CMD_OVERLAPPING_IO_RANGE, "Overlapping I/O Range" },
1296
    { NVME_CQE_SC_CMD_NAMESPACE_NOT_REACHABLE, "Namespace Not Reachable" },
1297
    { NVME_CQE_SC_CMD_INSUFFICIENT_RESOURCES, "Insufficient Resources" },
1298
    { NVME_CQE_SC_CMD_INSUFFICIENT_PROGRAM_RESOURCES, "Insufficient Program Resources" },
1299
    { NVME_CQE_SC_CMD_INVALID_MEMORY_NAMESPACE, "Invalid Memory Namespace" },
1300
    { NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET, "Invalid Memory Range Set" },
1301
    { NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET_ID, "Invalid Memory Range Set Identifier" },
1302
    { NVME_CQE_SC_CMD_INVALID_PROGRAM_DATA, "Invalid Program Data" },
1303
    { NVME_CQE_SC_CMD_INVALID_PROGRAM_INDEX, "Invalid Program Index" },
1304
    { NVME_CQE_SC_CMD_INVALID_PROGRAM_TYPE, "Invalid Program Type" },
1305
    { NVME_CQE_SC_CMD_MAX_MEMORY_RANGES_EXCEEDED, "Maximum Memory Ranges Exceeded" },
1306
    { NVME_CQE_SC_CMD_MAX_MEMORY_RANGE_SETS_EXCEEDED, "Maximum Memory Range Sets Exceeded" },
1307
    { NVME_CQE_SC_CMD_MAX_PROGRAMS_ACTIVATED, "Maximum Programs Activated" },
1308
    { NVME_CQE_SC_CMD_MAX_PROGRAM_BYTES_EXCEEDED, "Maximum Program Bytes Exceeded" },
1309
    { NVME_CQE_SC_CMD_MEMORY_RANGE_SET_IN_USE, "Memory Range Set In Use" },
1310
    { NVME_CQE_SC_CMD_NO_PROGRAM, "No Program" },
1311
    { NVME_CQE_SC_CMD_OVERLAPPING_MEMORY_RANGES, "Overlapping Memory Ranges" },
1312
    { NVME_CQE_SC_CMD_PROGRAM_NOT_ACTIVATED, "Program Not Activated" },
1313
    { NVME_CQE_SC_CMD_PROGRAM_IN_USE, "Program In Use" },
1314
    { NVME_CQE_SC_CMD_PROGRAM_INDEX_NOT_DOWNLOADABLE, "Program Index Not Downloadable" },
1315
    { NVME_CQE_SC_CMD_PROGRAM_TOO_BIG, "Program Too Big" },
1316
    { NVME_CQE_SC_CMD_SUCCESSFUL_MEDIA_VERIFICATION_READ, "Successful Media Verification Read" },
1317
    { NVME_CQE_SC_CMD_ZONE_BOUNDARY_ERROR, "Zoned Boundary Error" },
1318
    { NVME_CQE_SC_CMD_ZONE_IS_FULL, "Zone Is Full" },
1319
    { NVME_CQE_SC_CMD_ZONE_IS_READ_ONLY, "Zone Is Read Only" },
1320
    { NVME_CQE_SC_CMD_ZONE_IS_OFFLINE, "Zone Is Offline" },
1321
    { NVME_CQE_SC_CMD_ZONE_INVALID_WRITE, "Zone Invalid Write" },
1322
    { NVME_CQE_SC_CMD_TOO_MANY_ACTIVE_ZONES, "Too Many Active Zones" },
1323
    { NVME_CQE_SC_CMD_TOO_MANY_OPEN_ZONES, "Too Many Open Zones" },
1324
    { NVME_CQE_SC_CMD_INVALID_ZONE_STATE_TRANSITION, "Invalid Zone State Transition" },
1325
    { 0, NULL },
1326
};
1327
1328
static const value_string nvmeof_cqe_sc_cmd_tbl[] = {
1329
    { NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT, "Incompatible Format" },
1330
    { NVMEOF_CQE_SC_CMD_CONT_BUSY, "Controller Busy" },
1331
    { NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS, "Connect Invalid Parameters" },
1332
    { NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC, "Connect Restart Discovery" },
1333
    { NVMEOF_CQE_SC_CMD_CNCT_INV_HOST, "Connect Invalid Host" },
1334
    { NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE, "Invalid Queue Type" },
1335
    { NVMEOF_CQE_SC_CMD_DISC_RESTART, "Discover Restart" },
1336
    { NVMEOF_CQE_SC_CMD_AUTH_REQ, "Authentication Required" },
1337
    { 0, NULL },
1338
};
1339
1340
static const value_string nvme_cqe_sc_media_tbl[] = {
1341
    { NVME_CQE_SC_MEDIA_WRITE_FAULT, "Write Fault" },
1342
    { NVME_CQE_SC_MEDIA_READ_FAULT, "Unrecovered Read Error" },
1343
    { NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR, "End-to-end Guard Check Error" },
1344
    { NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR, "End-to-end Application Tag Check Error" },
1345
    { NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR, "End-to-end Reference Tag Check Error" },
1346
    { NVME_CQE_SC_MEDIA_COMPARE_FAILURE, "Compare Failure" },
1347
    { NVME_CQE_SC_MEDIA_ACCESS_DENIED, "Access Denied" },
1348
    { NVME_CQE_SC_MEDIA_DEALLOCATED_LBA, "Deallocated or Unwritten Logical Block" },
1349
    { NVME_CQE_SC_MEDIA_ETE_STORAGE_TAG_CHECK_ERR, "End-to-End Storage Tag Check Error" },
1350
    { 0, NULL },
1351
};
1352
1353
static const value_string nvme_cqe_sc_path_tbl[] = {
1354
    { NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR, "Internal Path Error" },
1355
    { NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS, "Asymmetric Access Persistent Loss" },
1356
    { NVME_CQE_SC_PATH_ANA_INACCESSIBLE, "Asymmetric Access Inaccessible" },
1357
    { NVME_CQE_SC_PATH_ANA_TRANSIENT, "Asymmetric Access Transition" },
1358
    { NVME_CQE_SC_PATH_CNTRL_PATH_ERROR, "Controller Pathing Error" },
1359
    { NVME_CQE_SC_PATH_HOST_PATH_ERROR, "Host Pathing Error" },
1360
    { NVME_CQE_SC_PATH_CMD_ABORT, "Command Aborted By Host" },
1361
    { 0, NULL },
1362
};
1363
1364
static const value_string aq_opc_tbl[] = {
1365
    { NVME_AQ_OPC_DELETE_SQ,     "Delete SQ"},
1366
    { NVME_AQ_OPC_CREATE_SQ,     "Create SQ"},
1367
    { NVME_AQ_OPC_GET_LOG_PAGE,  "Get Log Page"},
1368
    { NVME_AQ_OPC_DELETE_CQ,     "Delete CQ"},
1369
    { NVME_AQ_OPC_CREATE_CQ,     "Create CQ"},
1370
    { NVME_AQ_OPC_IDENTIFY,      "Identify"},
1371
    { NVME_AQ_OPC_ABORT,         "Abort"},
1372
    { NVME_AQ_OPC_SET_FEATURES,  "Set Features"},
1373
    { NVME_AQ_OPC_GET_FEATURES,  "Get Features"},
1374
    { NVME_AQ_OPC_ASYNC_EVE_REQ, "Async Event Request"},
1375
    { NVME_AQ_OPC_NS_MGMT,       "Namespace Management"},
1376
    { NVME_AQ_OPC_FW_COMMIT,     "Firmware Commit"},
1377
    { NVME_AQ_OPC_FW_IMG_DOWNLOAD, "Firmware Image Download"},
1378
    { NVME_AQ_OPC_SELF_TEST,     "Device Self-test"},
1379
    { NVME_AQ_OPC_NS_ATTACH,     "Namespace attach"},
1380
    { NVME_AQ_OPC_KEEP_ALIVE,    "Keep Alive"},
1381
    { NVME_AQ_OPC_DIRECTIVE_SEND, "Directive Send"},
1382
    { NVME_AQ_OPC_DIRECTIVE_RECV, "Directive Receive"},
1383
    { NVME_AQ_OPC_VIRT_MGMT,     "Virtualization Management"},
1384
    { NVME_AQ_OPC_MI_SEND,       "NVMe-MI Send"},
1385
    { NVME_AQ_OPC_MI_RECV,       "NVMe-MI Receive"},
1386
    { NVME_AQ_OPC_CAP_MGMT,      "Capacity Management"},
1387
    { NVME_AQ_OPC_DISC_INFO_MGMT, "Discovery Information Management"},
1388
    { NVME_AQ_OPC_FABRIC_ZONING_RECV, "Fabric Zoning Receive"},
1389
    { NVME_AQ_OPC_LOCKDOWN,      "Lockdown"},
1390
    { NVME_AQ_OPC_FABRIC_ZONING_LOOKUP, "Fabric Zoning Lookup"},
1391
    { NVME_AQ_OPC_CLEAR_EXP_NVM_CFG, "Clear Exported NVM Resource Configuration"},
1392
    { NVME_AQ_OPC_FABRIC_ZONING_SEND, "Fabric Zoning Send"},
1393
    { NVME_AQ_OPC_CREATE_EXP_NVM_SUBSYS, "Create Exported NVM Subsystem"},
1394
    { NVME_AQ_OPC_MANAGE_EXP_NVM_SUBSYS, "Manage Exported NVM Subsystem"},
1395
    { NVME_AQ_OPC_MANAGE_EXP_NS, "Manage Exported Namespace"},
1396
    { NVME_AQ_OPC_MANAGE_EXP_PORT, "Manage Exported Port"},
1397
    { NVME_AQ_OPC_CROSS_CTRL_RESET, "Cross-Controller Reset"},
1398
    { NVME_AQ_OPC_SEND_DISC_LOG_PAGE, "Send Discovery Log Page"},
1399
    { NVME_AQ_OPC_TRACK_SEND,    "Track Send"},
1400
    { NVME_AQ_OPC_TRACK_RECV,    "Track Receive"},
1401
    { NVME_AQ_OPC_MIGRATION_SEND, "Migration Send"},
1402
    { NVME_AQ_OPC_MIGRATION_RECV, "Migration Receive"},
1403
    { NVME_AQ_OPC_CTRL_DATA_QUEUE, "Controller Data Queue"},
1404
    { NVME_AQ_OPC_DBBUF_CONFIG,  "Doorbell Buffer Config"},
1405
    { NVME_AQ_OPC_FORMAT_NVM,    "Format NVM"},
1406
    { NVME_AQ_OPC_SECURITY_SEND, "Security Send"},
1407
    { NVME_AQ_OPC_SECURITY_RECV, "Security Receive"},
1408
    { NVME_AQ_OPC_SANITIZE,      "Sanitize"},
1409
    { NVME_AQ_OPC_LOAD_PROGRAM,  "Load Program"},
1410
    { NVME_AQ_OPC_GET_LBA_STATUS, "Get LBA Status"},
1411
    { NVME_AQ_OPC_PROG_ACTIVATION_MGMT, "Program Activation Management"},
1412
    { NVME_AQ_OPC_MEM_RANGE_SET_MGMT, "Memory Range Set Management"},
1413
    { NVME_AQ_OPC_SANITIZE_NS,   "Sanitize Namespace"},
1414
    { NVME_FABRIC_OPC,           "Fabrics Commands"},
1415
    { 0, NULL}
1416
};
1417
1418
static const value_string ioq_opc_tbl[] = {
1419
    { NVME_IOQ_OPC_FLUSH,         "Flush"},
1420
    { NVME_IOQ_OPC_WRITE,         "Write"},
1421
    { NVME_IOQ_OPC_READ,          "Read"},
1422
    { NVME_IOQ_OPC_WRITE_UNCORRECTABLE, "Write Uncorrectable"},
1423
    { NVME_IOQ_OPC_COMPARE,       "Compare"},
1424
    { NVME_IOQ_OPC_WRITE_ZEROS,   "Write Zeroes"},
1425
    { NVME_IOQ_OPC_DATASET_MGMT,  "Dataset Management"},
1426
    { NVME_IOQ_OPC_VERIFY,        "Verify"},
1427
    { NVME_IOQ_OPC_RESV_REG,      "Reservation Register"},
1428
    { NVME_IOQ_OPC_RESV_REPORT,   "Reservation Report"},
1429
    { NVME_IOQ_OPC_RESV_ACQUIRE,  "Reservation Acquire"},
1430
    { NVME_IOQ_OPC_IO_MGMT_RECV,  "I/O Management Receive"},
1431
    { NVME_IOQ_OPC_RESV_RELEASE,  "Reservation Release"},
1432
    { NVME_IOQ_OPC_CANCEL,        "Cancel"},
1433
    { NVME_IOQ_OPC_COPY,          "Copy"},
1434
    { NVME_IOQ_OPC_IO_MGMT_SEND,  "I/O Management Send"},
1435
    { 0, NULL}
1436
};
1437
1438
/* aq_opc_tbl/ioq_opc_tbl only cover the assigned opcode space; C0h-FFh
1439
 * (Admin, NVM CS 1.2 Fig 21) and 80h-FFh (I/O, NVM CS 1.2 Fig 21) are
1440
 * Vendor Specific, not Reserved -- special-case them the same way
1441
 * get_logpage_name() does for the logpage table. */
1442
static const char *get_aq_opcode_name(uint8_t opcode)
1443
25
{
1444
25
    if (opcode >= 0xC0)
1445
0
        return "Vendor Specific";
1446
25
    return val_to_str_const(opcode, aq_opc_tbl, "Reserved");
1447
25
}
1448
1449
static const char *get_ioq_opcode_name(uint8_t opcode)
1450
0
{
1451
0
    if (opcode >= 0x80)
1452
0
        return "Vendor Specific";
1453
0
    return val_to_str_const(opcode, ioq_opc_tbl, "Reserved");
1454
0
}
1455
1456
1
#define NVME_CMD_SGL_DATA_DESC          0x0
1457
1
#define NVME_CMD_SGL_BIT_BUCKET_DESC    0x1
1458
3
#define NVME_CMD_SGL_SEGMENT_DESC       0x2
1459
2
#define NVME_CMD_SGL_LAST_SEGMENT_DESC  0x3
1460
1
#define NVME_CMD_SGL_KEYED_DATA_DESC    0x4
1461
#define NVME_CMD_SGL_TRANSPORT_DESC     0x5
1462
0
#define NVME_CMD_SGL_VENDOR_DESC        0xf
1463
1464
static const value_string sgl_type_tbl[] = {
1465
    { NVME_CMD_SGL_DATA_DESC,         "Data Block"},
1466
    { NVME_CMD_SGL_BIT_BUCKET_DESC,   "Bit Bucket"},
1467
    { NVME_CMD_SGL_SEGMENT_DESC,      "Segment"},
1468
    { NVME_CMD_SGL_LAST_SEGMENT_DESC, "Last Segment"},
1469
    { NVME_CMD_SGL_KEYED_DATA_DESC,   "Keyed Data Block"},
1470
    { NVME_CMD_SGL_TRANSPORT_DESC,    "Transport SGL Data Block descriptor"},
1471
    { NVME_CMD_SGL_VENDOR_DESC,       "Vendor Specific"},
1472
    { 0, NULL}
1473
};
1474
1475
#define NVME_CMD_SGL_SUB_DESC_ADDR      0x0
1476
#define NVME_CMD_SGL_SUB_DESC_OFFSET    0x1
1477
#define NVME_CMD_SGL_SUB_DESC_TRANSPORT 0xf
1478
1479
static const value_string sgl_sub_type_tbl[] = {
1480
    { NVME_CMD_SGL_SUB_DESC_ADDR,      "Address"},
1481
    { NVME_CMD_SGL_SUB_DESC_OFFSET,    "Offset"},
1482
    { 0xa,                             "NVMe Transport Specific"},
1483
    { 0xb,                             "NVMe Transport Specific"},
1484
    { 0xc,                             "NVMe Transport Specific"},
1485
    { 0xd,                             "NVMe Transport Specific"},
1486
    { 0xe,                             "NVMe Transport Specific"},
1487
    { NVME_CMD_SGL_SUB_DESC_TRANSPORT, "Transport specific"},
1488
    { 0, NULL}
1489
};
1490
1491
1492
static const value_string cns_table[] = {
1493
    { 0, "Namespace"},
1494
    { 1, "Controller"},
1495
    { 2, "Active Namespace List"},
1496
    { 3, "Namespace Identification Descriptor"},
1497
    {4, "NVM Set List"},
1498
    {0x5, "I/O Command Set Specific Namespace"},
1499
    {0x6, "I/O Command Set Specific Controller"},
1500
    {0x7, "I/O Command Set Specific Active Namespace List"},
1501
    {0x8, "I/O Command Set Independent Namespace"},
1502
    {0x9, "NVM Command Set Namespace (Format Index)"},
1503
    {0xa, "I/O Command Set Specific Namespace (Format Index)"},
1504
    {0x10, "Allocated Namespace ID List"},
1505
    {0x11, "Namespace Data Structure"},
1506
    {0x12, "Controller List Attached to NSID"},
1507
    {0x13, "Existing Controllers List"},
1508
    {0x14, "Primary Controller Capabilities"},
1509
    {0x15, "Secondary Controller List"},
1510
    {0x16, "Namespace Granularity List"},
1511
    {0x17, "UUID List"},
1512
    {0x18, "Domain List"},
1513
    {0x19, "Endurance Group List"},
1514
    {0x1a, "I/O Command Set Specific Allocated Namespace ID List"},
1515
    {0x1b, "I/O Command Set Specific Namespace (Allocated NSID)"},
1516
    {0x1c, "I/O Command Set Data Structure"},
1517
    {0x1d, "Get Underlying Namespace List"},
1518
    {0x1e, "Get Ports List"},
1519
    {0x1f, "I/O Command Set Independent Namespace (Allocated NSID)"},
1520
    {0x20, "Supported Controller State Formats"},
1521
    {0, NULL}
1522
};
1523
1524
/* Namespace Identifier Type (NIDT), NVMe Base 2.3 "Identify – Namespace
1525
 * Identification Descriptor". */
1526
static const value_string nidt_tbl[] = {
1527
    { 0x1, "IEEE Extended Unique Identifier (EUI64)" },
1528
    { 0x2, "Namespace Globally Unique Identifier (NGUID)" },
1529
    { 0x3, "Namespace UUID" },
1530
    { 0x4, "Command Set Identifier (CSI)" },
1531
    { 0, NULL }
1532
};
1533
1534
/* UUID List Entry Identifier Association (IDASSOC), NVMe Base 2.3 "UUID
1535
 * List Entry". */
1536
static const value_string uuid_idassoc_tbl[] = {
1537
    { 0x0, "No association reported" },
1538
    { 0x1, "Associated with PCI Vendor ID" },
1539
    { 0x2, "Associated with PCI Subsystem Vendor ID" },
1540
    { 0x3, "Reserved" },
1541
    { 0, NULL }
1542
};
1543
1544
static const value_string dsm_acc_freq_tbl[] = {
1545
    { 0, "No frequency"},
1546
    { 1, "Typical"},
1547
    { 2, "Infrequent Read/Write"},
1548
    { 3, "Infrequent Writes, Frequent Reads"},
1549
    { 4, "Frequent Writes, Infrequent Reads"},
1550
    { 5, "Frequent Read/Write"},
1551
    { 6, "One time read"},
1552
    { 7, "Speculative read"},
1553
    { 8, "Likely tobe overwritten"},
1554
    { 0, NULL}
1555
};
1556
1557
static const value_string dsm_acc_lat_tbl[] = {
1558
    { 0, "None"},
1559
    { 1, "Idle (Longer)"},
1560
    { 2, "Normal (Typical)"},
1561
    { 3, "Low (Smallest)"},
1562
    { 0, NULL}
1563
};
1564
1565
1566
void
1567
nvme_publish_qid(proto_tree *tree, int field_index, uint16_t qid)
1568
0
{
1569
0
    proto_item *cmd_ref_item;
1570
1571
0
    cmd_ref_item = proto_tree_add_uint_format_value(tree, field_index, NULL,
1572
0
                       0, 0, qid,
1573
0
                     qid ? "%d (IOQ)" : "%d (AQ)",
1574
0
                                     qid);
1575
1576
0
    proto_item_set_generated(cmd_ref_item);
1577
0
}
1578
1579
static void nvme_build_pending_cmd_key(wmem_tree_key_t *cmd_key, uint32_t *key)
1580
7
{
1581
7
    cmd_key[0].length = 1;
1582
7
    cmd_key[0].key = key;
1583
7
    cmd_key[1].length = 0;
1584
7
    cmd_key[1].key = NULL;
1585
7
}
1586
1587
static void
1588
nvme_build_done_frame_key(wmem_tree_key_t *cmd_key, uint32_t *key, uint32_t *frame)
1589
0
{
1590
0
    unsigned idx = 0;
1591
0
    if (key) {
1592
0
        cmd_key[0].length = 1;
1593
0
        cmd_key[0].key = key;
1594
0
        idx = 1;
1595
0
    }
1596
0
    cmd_key[idx].length = 1;
1597
0
    cmd_key[idx].key = frame;
1598
0
    idx++;
1599
1600
0
    cmd_key[idx].length = 0;
1601
0
    cmd_key[idx].key = NULL;
1602
0
}
1603
1604
void
1605
nvme_add_cmd_to_pending_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx,
1606
                             struct nvme_cmd_ctx *cmd_ctx,
1607
                             void *ctx, uint16_t cmd_id)
1608
7
{
1609
7
    wmem_tree_key_t cmd_key[3];
1610
7
    uint32_t key = cmd_id;
1611
1612
7
    cmd_ctx->cmd_pkt_num = pinfo->num;
1613
7
    cmd_ctx->cqe_pkt_num = 0;
1614
7
    cmd_ctx->cmd_start_time = pinfo->abs_ts;
1615
7
    nstime_set_zero(&cmd_ctx->cmd_end_time);
1616
1617
    /* this is a new cmd, create a new command context and map it to the
1618
       unmatched table
1619
     */
1620
7
    nvme_build_pending_cmd_key(cmd_key, &key);
1621
7
    wmem_tree_insert32_array(q_ctx->pending_cmds, cmd_key, (void *)ctx);
1622
7
}
1623
1624
void* nvme_lookup_cmd_in_pending_list(struct nvme_q_ctx *q_ctx, uint16_t cmd_id)
1625
0
{
1626
0
    wmem_tree_key_t cmd_key[3];
1627
0
    uint32_t key = cmd_id;
1628
1629
0
    nvme_build_pending_cmd_key(cmd_key, &key);
1630
0
    return wmem_tree_lookup32_array(q_ctx->pending_cmds, cmd_key);
1631
0
}
1632
1633
1634
static void nvme_build_pending_transfer_key(wmem_tree_key_t *key, struct keyed_data_req *req)
1635
0
{
1636
0
    key[0].length = 2;
1637
0
    key[0].key = (uint32_t *)&req->addr;
1638
0
    key[1].length = 1;
1639
0
    key[1].key = &req->key;
1640
0
    key[2].length = 1;
1641
0
    key[2].key = &req->size;
1642
0
    key[3].length = 0;
1643
0
    key[3].key = NULL;
1644
0
}
1645
1646
void nvme_add_data_request(struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx,
1647
                                        struct keyed_data_req *req)
1648
0
{
1649
0
    wmem_tree_key_t tr_key[4];
1650
1651
0
    memset(cmd_ctx->data_tr_pkt_num, 0, sizeof(cmd_ctx->data_tr_pkt_num));
1652
0
    nvme_build_pending_transfer_key(tr_key, req);
1653
0
    wmem_tree_insert32_array(q_ctx->data_requests, tr_key, (void *)cmd_ctx);
1654
0
}
1655
1656
struct nvme_cmd_ctx* nvme_lookup_data_request(struct nvme_q_ctx *q_ctx,
1657
                                        struct keyed_data_req *req)
1658
0
{
1659
0
    wmem_tree_key_t tr_key[4];
1660
1661
0
    nvme_build_pending_transfer_key(tr_key, req);
1662
0
    return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_requests, tr_key);
1663
0
}
1664
1665
void
1666
nvme_add_data_tr_pkt(struct nvme_q_ctx *q_ctx,
1667
                       struct nvme_cmd_ctx *cmd_ctx, uint32_t rkey, uint32_t frame_num)
1668
0
{
1669
0
    wmem_tree_key_t cmd_key[3];
1670
1671
0
    nvme_build_done_frame_key(cmd_key, &rkey, &frame_num);
1672
0
    wmem_tree_insert32_array(q_ctx->data_responses, cmd_key, (void*)cmd_ctx);
1673
0
}
1674
1675
struct nvme_cmd_ctx*
1676
nvme_lookup_data_tr_pkt(struct nvme_q_ctx *q_ctx,
1677
                          uint32_t rkey, uint32_t frame_num)
1678
0
{
1679
0
    wmem_tree_key_t cmd_key[3];
1680
1681
0
    nvme_build_done_frame_key(cmd_key, &rkey, &frame_num);
1682
0
    return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_responses, cmd_key);
1683
0
}
1684
1685
void
1686
nvme_add_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t off, uint32_t frame_num)
1687
0
{
1688
0
    wmem_tree_key_t cmd_key[2];
1689
1690
0
    nvme_build_done_frame_key(cmd_key, NULL, &frame_num);
1691
0
    wmem_tree_insert32_array(q_ctx->data_offsets, cmd_key, GUINT_TO_POINTER(off));
1692
0
}
1693
1694
uint32_t
1695
nvme_lookup_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t frame_num)
1696
0
{
1697
0
    wmem_tree_key_t cmd_key[2];
1698
1699
0
    nvme_build_done_frame_key(cmd_key, NULL, &frame_num);
1700
0
    return GPOINTER_TO_UINT(wmem_tree_lookup32_array(q_ctx->data_offsets, cmd_key));
1701
0
}
1702
1703
void
1704
nvme_add_cmd_cqe_to_done_list(struct nvme_q_ctx *q_ctx,
1705
                              struct nvme_cmd_ctx *cmd_ctx, uint16_t cmd_id)
1706
0
{
1707
0
    wmem_tree_key_t cmd_key[3];
1708
0
    uint32_t key = cmd_id;
1709
0
    uint32_t frame_num;
1710
1711
0
    nvme_build_done_frame_key(cmd_key, &key, &frame_num);
1712
1713
    /* found matching entry. Add entries to the matched table for both cmd and cqe.
1714
     */
1715
0
    frame_num = cmd_ctx->cqe_pkt_num;
1716
0
    wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx);
1717
1718
0
    frame_num = cmd_ctx->cmd_pkt_num;
1719
0
    wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx);
1720
0
}
1721
1722
void*
1723
nvme_lookup_cmd_in_done_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx,
1724
                             uint16_t cmd_id)
1725
0
{
1726
0
    wmem_tree_key_t cmd_key[3];
1727
0
    uint32_t key = cmd_id;
1728
0
    uint32_t frame_num = pinfo->num;
1729
1730
0
    nvme_build_done_frame_key(cmd_key, &key, &frame_num);
1731
1732
0
    return wmem_tree_lookup32_array(q_ctx->done_cmds, cmd_key);
1733
0
}
1734
1735
void
1736
nvme_publish_cmd_latency(proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx,
1737
                         int field_index)
1738
0
{
1739
0
    proto_item *cmd_ref_item;
1740
0
    nstime_t ns;
1741
0
    double cmd_latency;
1742
1743
0
    nstime_delta(&ns, &cmd_ctx->cmd_end_time, &cmd_ctx->cmd_start_time);
1744
0
    cmd_latency = nstime_to_msec(&ns);
1745
0
    cmd_ref_item = proto_tree_add_double_format_value(tree, field_index,
1746
0
                            NULL, 0, 0, cmd_latency,
1747
0
                            "%.3f ms", cmd_latency);
1748
0
    proto_item_set_generated(cmd_ref_item);
1749
0
}
1750
1751
void nvme_update_cmd_end_info(packet_info *pinfo, struct nvme_cmd_ctx *cmd_ctx)
1752
0
{
1753
0
    cmd_ctx->cmd_end_time = pinfo->abs_ts;
1754
0
    cmd_ctx->cqe_pkt_num = pinfo->num;
1755
0
}
1756
1757
void
1758
nvme_publish_link(proto_tree *tree, tvbuff_t *tvb, int hf_index,
1759
                                       uint32_t pkt_no, bool zero_ok)
1760
126
{
1761
126
    proto_item *ref_item;
1762
1763
126
    if (pkt_no || zero_ok) {
1764
0
        ref_item = proto_tree_add_uint(tree, hf_index,
1765
0
                                 tvb, 0, 0, pkt_no);
1766
0
        proto_item_set_generated(ref_item);
1767
0
    }
1768
126
}
1769
1770
void
1771
nvme_publish_to_cmd_link(proto_tree *tree, tvbuff_t *tvb,
1772
                          int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1773
0
{
1774
0
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cmd_pkt_num, true);
1775
0
}
1776
1777
void
1778
nvme_publish_to_cqe_link(proto_tree *tree, tvbuff_t *tvb,
1779
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1780
7
{
1781
7
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cqe_pkt_num, false);
1782
7
}
1783
1784
void
1785
nvme_publish_to_data_req_link(proto_tree *tree, tvbuff_t *tvb,
1786
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1787
7
{
1788
7
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_req_pkt_num, false);
1789
7
}
1790
1791
static void
1792
nvme_publish_to_data_tr_links(proto_tree *tree, tvbuff_t *tvb,
1793
                             int *index_arr, struct nvme_cmd_ctx *cmd_ctx)
1794
7
{
1795
7
    unsigned i;
1796
119
    for (i = 0; i < NVME_CMD_MAX_TRS; i++)
1797
112
        nvme_publish_link(tree, tvb, index_arr[i], cmd_ctx->data_tr_pkt_num[i], false);
1798
7
}
1799
1800
void nvme_publish_to_data_resp_link(proto_tree *tree, tvbuff_t *tvb,
1801
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1802
0
{
1803
0
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_tr_pkt_num[0], false);
1804
0
}
1805
1806
void dissect_nvme_cmd_sgl(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
1807
                          int field_index, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned cmd_off, bool visited)
1808
7
{
1809
7
    proto_item *ti, *sgl_tree, *type_item, *sub_type_item;
1810
7
    uint8_t sgl_identifier, desc_type, desc_sub_type;
1811
7
    int offset = 24 + cmd_off;
1812
1813
7
    ti = proto_tree_add_item(cmd_tree, field_index, cmd_tvb, offset,
1814
7
                             16, ENC_NA);
1815
7
    sgl_tree = proto_item_add_subtree(ti, ett_data);
1816
1817
7
    sgl_identifier = tvb_get_uint8(cmd_tvb, offset + 15);
1818
7
    desc_type = (sgl_identifier & 0xff) >> 4;
1819
7
    desc_sub_type = sgl_identifier & 0x0f;
1820
1821
7
    type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_type,
1822
7
                                    cmd_tvb, offset + 15, 1, ENC_LITTLE_ENDIAN);
1823
7
    proto_item_append_text(type_item, " %s",
1824
7
                           val_to_str_const(desc_type, sgl_type_tbl, "Reserved"));
1825
1826
7
    sub_type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_sub_type,
1827
7
                                        cmd_tvb,
1828
7
                                        offset + 15, 1, ENC_LITTLE_ENDIAN);
1829
7
    proto_item_append_text(sub_type_item, " %s",
1830
7
                           val_to_str_const(desc_sub_type, sgl_sub_type_tbl, "Reserved"));
1831
1832
7
    switch (desc_type) {
1833
1
    case NVME_CMD_SGL_DATA_DESC:
1834
2
    case NVME_CMD_SGL_LAST_SEGMENT_DESC:
1835
3
    case NVME_CMD_SGL_SEGMENT_DESC:
1836
3
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb,
1837
3
                            offset, 8, ENC_LITTLE_ENDIAN);
1838
3
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1839
3
                            offset + 8, 4, ENC_LITTLE_ENDIAN);
1840
3
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb,
1841
3
                            offset + 12, 3, ENC_NA);
1842
3
        break;
1843
1
    case NVME_CMD_SGL_BIT_BUCKET_DESC:
1844
1
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr_rsvd, cmd_tvb,
1845
1
                            offset, 8, ENC_LITTLE_ENDIAN);
1846
1
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1847
1
                            offset + 8, 4, ENC_LITTLE_ENDIAN);
1848
1
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb,
1849
1
                            offset + 12, 3, ENC_NA);
1850
1
        break;
1851
1
    case NVME_CMD_SGL_KEYED_DATA_DESC:
1852
1
    {
1853
1
        struct keyed_data_req req;
1854
1
        proto_tree_add_item_ret_uint64(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb,
1855
1
                            offset, 8, ENC_LITTLE_ENDIAN, &req.addr);
1856
1
        proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1857
1
                            offset + 8, 3, ENC_LITTLE_ENDIAN, &req.size);
1858
1
        proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_key, cmd_tvb,
1859
1
                            offset + 11, 4, ENC_LITTLE_ENDIAN, &req.key);
1860
1
        if (!visited && cmd_ctx && q_ctx && q_ctx->data_requests)
1861
0
            nvme_add_data_request(q_ctx, cmd_ctx, &req);
1862
1
        break;
1863
2
    }
1864
0
    case NVME_CMD_SGL_VENDOR_DESC:
1865
1
    default:
1866
1
        break;
1867
7
    }
1868
7
}
1869
1870
static void
1871
dissect_nvme_rwc_common_word_10_11_12_14_15(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
1872
0
{
1873
0
    proto_item *ti, *prinfo_tree;
1874
0
    uint16_t num_lba;
1875
1876
    /* word 10, 11 */
1877
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_slba, cmd_tvb,
1878
0
                        40, 8, ENC_LITTLE_ENDIAN);
1879
    /* add 1 for readability, as its zero based value */
1880
0
    num_lba = tvb_get_uint16(cmd_tvb, 48, ENC_LITTLE_ENDIAN) + 1;
1881
1882
    /* word 12 */
1883
0
    proto_tree_add_uint(cmd_tree, hf_nvme_cmd_nlb,
1884
0
                        cmd_tvb, 48, 2, num_lba);
1885
1886
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd2, cmd_tvb,
1887
0
                        50, 2, ENC_LITTLE_ENDIAN);
1888
1889
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_prinfo, cmd_tvb, 50,
1890
0
                             2, ENC_LITTLE_ENDIAN);
1891
0
    prinfo_tree = proto_item_add_subtree(ti, ett_data);
1892
1893
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_lbrtag, cmd_tvb,
1894
0
                        50, 2, ENC_LITTLE_ENDIAN);
1895
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_apptag, cmd_tvb,
1896
0
                        50, 2, ENC_LITTLE_ENDIAN);
1897
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_guard, cmd_tvb,
1898
0
                        50, 2, ENC_LITTLE_ENDIAN);
1899
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_pract, cmd_tvb,
1900
0
                        50, 2, ENC_LITTLE_ENDIAN);
1901
1902
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_fua, cmd_tvb,
1903
0
                        50, 2, ENC_LITTLE_ENDIAN);
1904
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_lr, cmd_tvb,
1905
0
                        50, 2, ENC_LITTLE_ENDIAN);
1906
1907
    /* word 14, 15 */
1908
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_eilbrt, cmd_tvb,
1909
0
                        56, 4, ENC_LITTLE_ENDIAN);
1910
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbat, cmd_tvb,
1911
0
                        60, 2, ENC_LITTLE_ENDIAN);
1912
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbatm, cmd_tvb,
1913
0
                        62, 2, ENC_LITTLE_ENDIAN);
1914
0
}
1915
1916
/* Stop dissecting an offset-windowed response structure once the field at
1917
 * __field_off__ (length __field_len__) no longer fits in the transfer: the
1918
 * caller's 'off' is the structure offset the data begins at and 'len' the
1919
 * bytes available, so a chunked or NVMe-MI DLEN-truncated response stops
1920
 * cleanly rather than overrunning the payload. */
1921
0
#define CHECK_STOP_PARSE(__field_off__, __field_len__) \
1922
0
do { \
1923
0
    if ((__field_off__ - off + __field_len__) > len) \
1924
0
        return; \
1925
0
} while(0)
1926
1927
static void dissect_nvme_identify_ns_lbafs(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree)
1928
0
{
1929
0
    proto_item *ti, *lbafs_tree, *item;
1930
0
    int lbaf_off, i, nlbaf;
1931
0
    uint8_t lbads;
1932
0
    uint16_t ms;
1933
0
    uint32_t lbaf_raw;
1934
0
    bool over_declared;
1935
1936
    /* Supported formats are the NLBAF (byte 25, 0's based) shared-attribute
1937
     * ones followed directly by the NULBAF (byte 82) unique-attribute ones;
1938
     * a Format Index at or above their sum is invalid and not supported
1939
     * (NVM Command Set 1.2 section 5.5).  Section 5.5 also caps the total at
1940
     * 64, the number of entries the 383:128 region holds, so clamp there too
1941
     * and a bogus NLBAF/NULBAF cannot drive reads past the region. */
1942
0
    nlbaf = tvb_get_uint8(cmd_tvb, 25) + 1 + tvb_get_uint8(cmd_tvb, 82);
1943
0
    over_declared = (nlbaf > 64);
1944
0
    if (over_declared)
1945
0
        nlbaf = 64;
1946
1947
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_lbafs, cmd_tvb,
1948
0
                             128, 256, ENC_NA);
1949
    /* The count is intrinsically impossible rather than merely unseen: the
1950
     * 383:128 region holds exactly 64 entries, so no transfer window can make
1951
     * NLBAF+1+NULBAF > 64 legitimate. */
1952
0
    if (over_declared)
1953
0
        expert_add_info(pinfo, ti, &ei_nvme_lbaf_count_invalid);
1954
0
    lbafs_tree = proto_item_add_subtree(ti, ett_data);
1955
1956
0
    for (i = 0; i < nlbaf; i++) {
1957
0
        lbaf_off = 128 + i * 4;
1958
1959
0
        lbaf_raw = tvb_get_uint32(cmd_tvb, lbaf_off, ENC_LITTLE_ENDIAN);
1960
0
        ms = lbaf_raw & 0xFF;
1961
0
        lbads = (lbaf_raw >> 16) & 0xF;
1962
0
        item = proto_tree_add_item(lbafs_tree, hf_nvme_identify_ns_lbaf,
1963
0
                                   cmd_tvb, lbaf_off, 4, ENC_LITTLE_ENDIAN);
1964
0
        proto_item_set_text(item, "LBAF%d: lbads %d ms %d", i, lbads, ms);
1965
0
    }
1966
0
}
1967
1968
/* Deallocation Read Behavior (DRB), the low 3 bits of DLFEAT. */
1969
static const value_string ns_dlfeat_drb_tbl[] = {
1970
    { 0, "read behavior is not reported" },
1971
    { 1, "deallocated logical block returns all bytes cleared to 0h" },
1972
    { 2, "deallocated logical block returns all bytes set to FFh" },
1973
    { 0, NULL}
1974
};
1975
1976
0
#define ASPEC(_x_) _x_, array_length(_x_)
1977
1978
/* Both defined further down; used here for the bit-defined bytes (DLFEAT,
1979
 * KPIOS) and the 16-byte NVM Capacity of the Identify Namespace structure. */
1980
static void add_group_mask_entry(tvbuff_t *tvb, proto_tree *tree, unsigned offset, unsigned bytes, int *array, unsigned array_len);
1981
static void post_add_bytes_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off, uint8_t shiftl);
1982
1983
static void dissect_nvme_identify_ns_resp(tvbuff_t *cmd_tvb, packet_info *pinfo,
1984
                                            proto_tree *cmd_tree, unsigned off, unsigned len)
1985
0
{
1986
0
    proto_item *ti;
1987
0
    unsigned start;
1988
0
    if (!off) {
1989
        /* Fixed-layout fields at the start of the structure.  Each read is
1990
         * length-guarded (off is 0 here) so a response truncated by a small
1991
         * DLEN -- e.g. a chunked Identify over a low-MTU transport -- stops
1992
         * cleanly instead of overrunning the payload. */
1993
0
        CHECK_STOP_PARSE(0, 8);
1994
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsze, cmd_tvb,
1995
0
                        0, 8, ENC_LITTLE_ENDIAN);
1996
0
        CHECK_STOP_PARSE(8, 8);
1997
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_ncap, cmd_tvb,
1998
0
                        8, 8, ENC_LITTLE_ENDIAN);
1999
0
        CHECK_STOP_PARSE(16, 8);
2000
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nuse, cmd_tvb,
2001
0
                        16, 8, ENC_LITTLE_ENDIAN);
2002
0
        CHECK_STOP_PARSE(24, 1);
2003
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsfeat, cmd_tvb,
2004
0
                        24, 1, ENC_LITTLE_ENDIAN);
2005
0
        CHECK_STOP_PARSE(25, 1);
2006
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nlbaf, cmd_tvb,
2007
0
                        25, 1, ENC_LITTLE_ENDIAN);
2008
0
        CHECK_STOP_PARSE(26, 1);
2009
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_flbas, cmd_tvb,
2010
0
                        26, 1, ENC_LITTLE_ENDIAN);
2011
0
        CHECK_STOP_PARSE(27, 1);
2012
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mc, cmd_tvb,
2013
0
                        27, 1, ENC_LITTLE_ENDIAN);
2014
0
        CHECK_STOP_PARSE(28, 1);
2015
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dpc, cmd_tvb,
2016
0
                        28, 1, ENC_LITTLE_ENDIAN);
2017
0
        CHECK_STOP_PARSE(29, 1);
2018
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dps, cmd_tvb,
2019
0
                        29, 1, ENC_LITTLE_ENDIAN);
2020
0
        CHECK_STOP_PARSE(30, 1);
2021
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nmic, cmd_tvb,
2022
0
                        30, 1, ENC_LITTLE_ENDIAN);
2023
0
        CHECK_STOP_PARSE(31, 1);
2024
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rescap, cmd_tvb,
2025
0
                        31, 1, ENC_LITTLE_ENDIAN);
2026
0
        CHECK_STOP_PARSE(32, 1);
2027
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_fpi, cmd_tvb,
2028
0
                        32, 1, ENC_LITTLE_ENDIAN);
2029
0
        CHECK_STOP_PARSE(33, 1);
2030
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 33, 1, ASPEC(hf_nvme_identify_ns_dlfeat));
2031
0
        CHECK_STOP_PARSE(34, 2);
2032
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nawun, cmd_tvb,
2033
0
                        34, 2, ENC_LITTLE_ENDIAN);
2034
0
        CHECK_STOP_PARSE(36, 2);
2035
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nawupf, cmd_tvb,
2036
0
                        36, 2, ENC_LITTLE_ENDIAN);
2037
0
        CHECK_STOP_PARSE(38, 2);
2038
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nacwu, cmd_tvb,
2039
0
                        38, 2, ENC_LITTLE_ENDIAN);
2040
0
        CHECK_STOP_PARSE(40, 2);
2041
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabsn, cmd_tvb,
2042
0
                        40, 2, ENC_LITTLE_ENDIAN);
2043
0
        CHECK_STOP_PARSE(42, 2);
2044
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabo, cmd_tvb,
2045
0
                        42, 2, ENC_LITTLE_ENDIAN);
2046
0
        CHECK_STOP_PARSE(44, 2);
2047
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabspf, cmd_tvb,
2048
0
                        44, 2, ENC_LITTLE_ENDIAN);
2049
0
        CHECK_STOP_PARSE(46, 2);
2050
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_noiob, cmd_tvb,
2051
0
                        46, 2, ENC_LITTLE_ENDIAN);
2052
0
        CHECK_STOP_PARSE(48, 16);
2053
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nvmcap, cmd_tvb,
2054
0
                        48, 16, ENC_NA);
2055
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 48, 0);
2056
0
        CHECK_STOP_PARSE(64, 2);
2057
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npwg, cmd_tvb,
2058
0
                        64, 2, ENC_LITTLE_ENDIAN);
2059
0
        CHECK_STOP_PARSE(66, 2);
2060
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npwa, cmd_tvb,
2061
0
                        66, 2, ENC_LITTLE_ENDIAN);
2062
0
        CHECK_STOP_PARSE(68, 2);
2063
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npdg, cmd_tvb,
2064
0
                        68, 2, ENC_LITTLE_ENDIAN);
2065
0
        CHECK_STOP_PARSE(70, 2);
2066
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npda, cmd_tvb,
2067
0
                        70, 2, ENC_LITTLE_ENDIAN);
2068
0
        CHECK_STOP_PARSE(72, 2);
2069
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nows, cmd_tvb,
2070
0
                        72, 2, ENC_LITTLE_ENDIAN);
2071
0
        CHECK_STOP_PARSE(74, 2);
2072
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mssrl, cmd_tvb,
2073
0
                        74, 2, ENC_LITTLE_ENDIAN);
2074
0
        CHECK_STOP_PARSE(76, 4);
2075
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mcl, cmd_tvb,
2076
0
                        76, 4, ENC_LITTLE_ENDIAN);
2077
0
        CHECK_STOP_PARSE(80, 1);
2078
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_msrc, cmd_tvb,
2079
0
                        80, 1, ENC_LITTLE_ENDIAN);
2080
0
        CHECK_STOP_PARSE(81, 1);
2081
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 81, 1, ASPEC(hf_nvme_identify_ns_kpios));
2082
0
        CHECK_STOP_PARSE(82, 1);
2083
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nulbaf, cmd_tvb,
2084
0
                        82, 1, ENC_LITTLE_ENDIAN);
2085
0
        CHECK_STOP_PARSE(83, 1);
2086
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd0, cmd_tvb,
2087
0
                        83, 1, ENC_NA);
2088
0
        CHECK_STOP_PARSE(84, 4);
2089
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_kpiodaag, cmd_tvb,
2090
0
                        84, 4, ENC_LITTLE_ENDIAN);
2091
0
        CHECK_STOP_PARSE(88, 4);
2092
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd1, cmd_tvb,
2093
0
                        88, 4, ENC_NA);
2094
0
        CHECK_STOP_PARSE(92, 4);
2095
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_anagrpid, cmd_tvb,
2096
0
                        92, 4, ENC_LITTLE_ENDIAN);
2097
0
        CHECK_STOP_PARSE(96, 3);
2098
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd2, cmd_tvb,
2099
0
                        96, 3, ENC_NA);
2100
0
        CHECK_STOP_PARSE(99, 1);
2101
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsattr, cmd_tvb,
2102
0
                        99, 1, ENC_LITTLE_ENDIAN);
2103
0
        CHECK_STOP_PARSE(100, 2);
2104
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nvmsetid, cmd_tvb,
2105
0
                        100, 2, ENC_LITTLE_ENDIAN);
2106
0
        CHECK_STOP_PARSE(102, 2);
2107
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_endgid, cmd_tvb,
2108
0
                        102, 2, ENC_LITTLE_ENDIAN);
2109
0
        CHECK_STOP_PARSE(104, 16);
2110
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nguid, cmd_tvb,
2111
0
                        104, 16, ENC_NA);
2112
0
        CHECK_STOP_PARSE(120, 8);
2113
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_eui64, cmd_tvb,
2114
0
                        120, 8, ENC_NA);
2115
2116
        /* LBA Formats occupy 383:128 (LBAF0..LBAF63) and Vendor Specific
2117
         * starts immediately at 384 -- nothing in 4095:0 is Reserved. */
2118
0
        CHECK_STOP_PARSE(128, 256);
2119
0
        dissect_nvme_identify_ns_lbafs(cmd_tvb, pinfo, cmd_tree);
2120
0
    }
2121
0
    if (off >= 384)
2122
0
        start = 0;
2123
0
    else
2124
0
        start = 384 - off;
2125
    /* Vendor-specific area (structure offset 384+).  Only render it once the
2126
     * transfer window actually reaches it; a shorter chunk carries no VS bytes
2127
     * (and 'len - start' would otherwise underflow). */
2128
0
    if (start < len) {
2129
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_vs, cmd_tvb,
2130
0
                            start, len - start, ENC_NA);
2131
0
        proto_item_append_text(ti, " (offset %u)", (off <= 384) ? 0 : off-384);
2132
0
    }
2133
0
}
2134
2135
/* NSTAT.IOI (I/O Impacted) sub-field, NVMe Base 2.3 Figure 335. */
2136
static const value_string cs_ind_ns_ioi_tbl[] = {
2137
    { 0, "I/O performance degradation is not reported" },
2138
    { 1, "Reserved" },
2139
    { 2, "I/O performance is not currently degraded" },
2140
    { 3, "I/O performance is currently degraded" },
2141
    { 0, NULL }
2142
};
2143
2144
/* Identify - I/O Command Set Independent Identify Namespace (CNS 08h), NVMe
2145
 * Base 2.3 Figure 335.  The defined fields occupy bytes 23:00; 4095:24 is
2146
 * reserved.  Windowed the same way as the sibling Identify decoders: each
2147
 * field renders only when the transfer window starts at or before it, and
2148
 * CHECK_STOP_PARSE stops cleanly on a DLEN-truncated chunk. */
2149
static void dissect_nvme_identify_cs_ind_ns_resp(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned off, unsigned len)
2150
0
{
2151
0
    if (!off) {
2152
0
        CHECK_STOP_PARSE(0, 1);
2153
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 0, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nsfeat));
2154
0
    }
2155
0
    if (off <= 1) {
2156
0
        CHECK_STOP_PARSE(1, 1);
2157
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 1-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nmic));
2158
0
    }
2159
0
    if (off <= 2) {
2160
0
        CHECK_STOP_PARSE(2, 1);
2161
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 2-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_rescap));
2162
0
    }
2163
0
    if (off <= 3) {
2164
0
        CHECK_STOP_PARSE(3, 1);
2165
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 3-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_fpi));
2166
0
    }
2167
0
    if (off <= 4) {
2168
0
        CHECK_STOP_PARSE(4, 4);
2169
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_anagrpid, cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN);
2170
0
    }
2171
0
    if (off <= 8) {
2172
0
        CHECK_STOP_PARSE(8, 1);
2173
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 8-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nsattr));
2174
0
    }
2175
0
    if (off <= 9) {
2176
0
        CHECK_STOP_PARSE(9, 1);
2177
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rsvd0, cmd_tvb, 9-off, 1, ENC_NA);
2178
0
    }
2179
0
    if (off <= 10) {
2180
0
        CHECK_STOP_PARSE(10, 2);
2181
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_nvmsetid, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN);
2182
0
    }
2183
0
    if (off <= 12) {
2184
0
        CHECK_STOP_PARSE(12, 2);
2185
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_endgid, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN);
2186
0
    }
2187
0
    if (off <= 14) {
2188
0
        CHECK_STOP_PARSE(14, 1);
2189
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 14-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nstat));
2190
0
    }
2191
0
    if (off <= 15) {
2192
0
        CHECK_STOP_PARSE(15, 1);
2193
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 15-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_kpios));
2194
0
    }
2195
0
    if (off <= 16) {
2196
0
        CHECK_STOP_PARSE(16, 2);
2197
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_maxkt, cmd_tvb, 16-off, 2, ENC_LITTLE_ENDIAN);
2198
0
    }
2199
0
    if (off <= 18) {
2200
0
        CHECK_STOP_PARSE(18, 2);
2201
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rsvd1, cmd_tvb, 18-off, 2, ENC_NA);
2202
0
    }
2203
0
    if (off <= 20) {
2204
0
        CHECK_STOP_PARSE(20, 4);
2205
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rgrpid, cmd_tvb, 20-off, 4, ENC_LITTLE_ENDIAN);
2206
0
    }
2207
0
}
2208
2209
static void dissect_nvme_identify_nslist_resp(tvbuff_t *cmd_tvb,
2210
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2211
0
{
2212
0
    uint32_t nsid;
2213
0
    proto_item *item;
2214
0
    unsigned done = 0;
2215
2216
0
    for (; off < 4096 && (done + 4) <= len; off += 4) {
2217
0
        nsid = tvb_get_uint32(cmd_tvb, done, ENC_LITTLE_ENDIAN);
2218
0
        if (nsid == 0)
2219
0
            break;
2220
2221
0
        item = proto_tree_add_item(cmd_tree, hf_nvme_identify_nslist_nsid,
2222
0
                                   cmd_tvb, done, 4, ENC_LITTLE_ENDIAN);
2223
0
        proto_item_set_text(item, "nsid[%u]: %u", off / 4, nsid);
2224
0
        done += 4;
2225
0
    }
2226
0
}
2227
2228
/* Namespace Identification Descriptor list (CNS 03h), NVMe Base 2.3 Figure
2229
 * 331: a packed list of variable-length descriptors, each NIDT(1)+NIDL(1)+
2230
 * reserved(2)+NID(NIDL), terminated by a descriptor with NIDL == 0.  The list
2231
 * is self-delimiting and cannot be resynchronised from a mid-structure window,
2232
 * so only a transfer starting at structure offset 0 is decoded. */
2233
static void dissect_nvme_identify_nsid_desc_list_resp(tvbuff_t *cmd_tvb,
2234
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2235
0
{
2236
0
    unsigned done = 0;
2237
0
    unsigned idx = 0;
2238
2239
0
    if (off)
2240
0
        return;
2241
2242
0
    while (done + 4 <= len) {
2243
0
        uint8_t nidl = tvb_get_uint8(cmd_tvb, done + 1);
2244
0
        unsigned dlen;
2245
0
        proto_tree *grp;
2246
2247
0
        if (nidl == 0)
2248
0
            break;          /* NIDL 0h marks the end of the list */
2249
0
        dlen = 4u + nidl;
2250
0
        if (done + dlen > len)
2251
0
            break;          /* descriptor would overrun the payload */
2252
2253
0
        grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, done, dlen,
2254
0
                                            ett_data, NULL,
2255
0
                                            "Namespace Identification Descriptor %u", idx);
2256
0
        proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nidt, cmd_tvb, done, 1, ENC_NA);
2257
0
        proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nidl, cmd_tvb, done + 1, 1, ENC_NA);
2258
0
        proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nid, cmd_tvb, done + 4, nidl, ENC_NA);
2259
2260
0
        done += dlen;
2261
0
        idx++;
2262
0
    }
2263
0
}
2264
2265
/* Controller List (CNS 12h attached-to-NSID / CNS 13h NVM-subsystem), NVMe
2266
 * Base 2.3 "Controller List Format": a 2-byte NUMCIDS count followed by that
2267
 * many 2-byte controller identifiers (up to 2,047).  Only decoded from
2268
 * structure offset 0 since NUMCIDS sits in the header. */
2269
static void dissect_nvme_identify_ctrl_list_resp(tvbuff_t *cmd_tvb,
2270
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2271
0
{
2272
0
    uint32_t numcids;
2273
0
    unsigned i, done;
2274
2275
0
    if (off || len < 2)
2276
0
        return;
2277
2278
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_ctrl_list_num,
2279
0
                                 cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN, &numcids);
2280
2281
0
    done = 2;
2282
0
    for (i = 0; i < numcids && i < 2047 && done + 2 <= len; i++) {
2283
0
        uint32_t cid;
2284
0
        proto_item *item = proto_tree_add_item_ret_uint(cmd_tree,
2285
0
                                hf_nvme_identify_ctrl_list_id, cmd_tvb, done, 2,
2286
0
                                ENC_LITTLE_ENDIAN, &cid);
2287
0
        proto_item_set_text(item, "Controller Identifier[%u]: 0x%04x", i, cid);
2288
0
        done += 2;
2289
0
    }
2290
0
}
2291
2292
static void add_group_mask_entry(tvbuff_t *tvb, proto_tree *tree, unsigned offset, unsigned bytes, int *array, unsigned array_len)
2293
0
{
2294
0
    proto_item *ti;
2295
0
    proto_tree *grp;
2296
0
    unsigned i;
2297
2298
0
    ti = proto_tree_add_item(tree, array[0], tvb, offset, bytes, ENC_LITTLE_ENDIAN);
2299
0
    grp =  proto_item_add_subtree(ti, ett_data);
2300
2301
0
    for (i = 1; i < array_len; i++)
2302
0
        proto_tree_add_item(grp, array[i], tvb, offset, bytes, ENC_LITTLE_ENDIAN);
2303
0
}
2304
2305
/* NVM Set List (CNS 04h): a 1-byte NUMENT header (up to 31 entries) with the
2306
 * entry list starting at structure offset 128, each entry 128 bytes.  Only
2307
 * decoded from structure offset 0 since NUMENT sits in the header. */
2308
static void dissect_nvme_identify_nvmset_resp(tvbuff_t *cmd_tvb,
2309
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2310
0
{
2311
0
    uint32_t nument;
2312
0
    unsigned i;
2313
2314
0
    if (off || len < 1)
2315
0
        return;
2316
2317
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_nvmset_num,
2318
0
                                 cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN, &nument);
2319
2320
0
    for (i = 0; i < nument && i < 31; i++) {
2321
0
        unsigned entry = 128 + i * 128;
2322
0
        proto_tree *grp;
2323
2324
0
        if (entry + 48 > len)
2325
0
            break;          /* entry (through UNVMSC) would overrun the payload */
2326
2327
0
        grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 128,
2328
0
                                            ett_data, NULL,
2329
0
                                            "NVM Set Attributes Entry %u", i);
2330
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_id, cmd_tvb, entry, 2, ENC_LITTLE_ENDIAN);
2331
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_endgid, cmd_tvb, entry + 2, 2, ENC_LITTLE_ENDIAN);
2332
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_r4krt, cmd_tvb, entry + 8, 4, ENC_LITTLE_ENDIAN);
2333
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_ows, cmd_tvb, entry + 12, 4, ENC_LITTLE_ENDIAN);
2334
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_tnvmsc, cmd_tvb, entry + 16, 16, ENC_NA);
2335
0
        proto_tree_add_item(grp, hf_nvme_identify_nvmset_unvmsc, cmd_tvb, entry + 32, 16, ENC_NA);
2336
0
    }
2337
0
}
2338
2339
/* Primary Controller Capabilities (CNS 14h): fixed 80-byte layout at the
2340
 * start of the 4 KiB structure; only decoded from structure offset 0. */
2341
static void dissect_nvme_identify_pri_ctrl_cap_resp(tvbuff_t *cmd_tvb,
2342
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2343
0
{
2344
0
    if (off || len < 80)
2345
0
        return;
2346
2347
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_cntlid, cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN);
2348
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_portid, cmd_tvb, 2, 2, ENC_LITTLE_ENDIAN);
2349
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 4, 4, ASPEC(hf_nvme_identify_pcc_crt));
2350
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqfrt, cmd_tvb, 32, 4, ENC_LITTLE_ENDIAN);
2351
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqrfa, cmd_tvb, 36, 4, ENC_LITTLE_ENDIAN);
2352
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqrfap, cmd_tvb, 40, 2, ENC_LITTLE_ENDIAN);
2353
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqprt, cmd_tvb, 42, 2, ENC_LITTLE_ENDIAN);
2354
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqfrsm, cmd_tvb, 44, 2, ENC_LITTLE_ENDIAN);
2355
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqgran, cmd_tvb, 46, 2, ENC_LITTLE_ENDIAN);
2356
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vifrt, cmd_tvb, 64, 4, ENC_LITTLE_ENDIAN);
2357
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_virfa, cmd_tvb, 68, 4, ENC_LITTLE_ENDIAN);
2358
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_virfap, cmd_tvb, 72, 2, ENC_LITTLE_ENDIAN);
2359
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_viprt, cmd_tvb, 74, 2, ENC_LITTLE_ENDIAN);
2360
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vifrsm, cmd_tvb, 76, 2, ENC_LITTLE_ENDIAN);
2361
0
    proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vigran, cmd_tvb, 78, 2, ENC_LITTLE_ENDIAN);
2362
0
}
2363
2364
/* Secondary Controller List (CNS 15h): a 1-byte NUMENT header (up to 127
2365
 * entries) with the entry list starting at structure offset 32, each entry
2366
 * 32 bytes.  Only decoded from structure offset 0. */
2367
static void dissect_nvme_identify_sec_ctrl_list_resp(tvbuff_t *cmd_tvb,
2368
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2369
0
{
2370
0
    uint32_t nument;
2371
0
    unsigned i;
2372
2373
0
    if (off || len < 1)
2374
0
        return;
2375
2376
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_scl_num,
2377
0
                                 cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN, &nument);
2378
2379
0
    for (i = 0; i < nument && i < 127; i++) {
2380
0
        unsigned entry = 32 + i * 32;
2381
0
        proto_tree *grp;
2382
2383
0
        if (entry + 14 > len)
2384
0
            break;          /* entry (through NVI) would overrun the payload */
2385
2386
0
        grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 32,
2387
0
                                            ett_data, NULL,
2388
0
                                            "Secondary Controller Entry %u", i);
2389
0
        proto_tree_add_item(grp, hf_nvme_identify_scl_scid, cmd_tvb, entry, 2, ENC_LITTLE_ENDIAN);
2390
0
        proto_tree_add_item(grp, hf_nvme_identify_scl_pcid, cmd_tvb, entry + 2, 2, ENC_LITTLE_ENDIAN);
2391
0
        add_group_mask_entry(cmd_tvb, grp, entry + 4, 1, ASPEC(hf_nvme_identify_scl_scs));
2392
0
        proto_tree_add_item(grp, hf_nvme_identify_scl_vfn, cmd_tvb, entry + 8, 2, ENC_LITTLE_ENDIAN);
2393
0
        proto_tree_add_item(grp, hf_nvme_identify_scl_nvq, cmd_tvb, entry + 10, 2, ENC_LITTLE_ENDIAN);
2394
0
        proto_tree_add_item(grp, hf_nvme_identify_scl_nvi, cmd_tvb, entry + 12, 2, ENC_LITTLE_ENDIAN);
2395
0
    }
2396
0
}
2397
2398
/* Namespace Granularity List (CNS 16h): a 4-byte NGA header, a 1-byte ND
2399
 * count (0's based, up to 64 descriptors), with the descriptor list starting
2400
 * at structure offset 32, each descriptor 16 bytes (NSG + NCG).  Only
2401
 * decoded from structure offset 0. */
2402
static void dissect_nvme_identify_ns_gran_list_resp(tvbuff_t *cmd_tvb,
2403
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2404
0
{
2405
0
    uint32_t nd;
2406
0
    unsigned i;
2407
2408
0
    if (off || len < 5)
2409
0
        return;
2410
2411
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 0, 4, ASPEC(hf_nvme_identify_ngl_nga));
2412
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_ngl_nd,
2413
0
                                 cmd_tvb, 4, 1, ENC_LITTLE_ENDIAN, &nd);
2414
2415
    /* ND is a 0's based count of valid descriptors. */
2416
0
    for (i = 0; i <= nd && i < 64; i++) {
2417
0
        unsigned entry = 32 + i * 16;
2418
0
        proto_tree *grp;
2419
2420
0
        if (entry + 16 > len)
2421
0
            break;          /* descriptor would overrun the payload */
2422
2423
0
        grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 16,
2424
0
                                            ett_data, NULL,
2425
0
                                            "Namespace Granularity Descriptor %u", i);
2426
0
        proto_tree_add_item(grp, hf_nvme_identify_ngl_nsg, cmd_tvb, entry, 8, ENC_LITTLE_ENDIAN);
2427
0
        proto_tree_add_item(grp, hf_nvme_identify_ngl_ncg, cmd_tvb, entry + 8, 8, ENC_LITTLE_ENDIAN);
2428
0
    }
2429
0
}
2430
2431
/* UUID List (CNS 17h): a 32-byte reserved header followed by up to 127 UUID
2432
 * List Entries, each 32 bytes (a 1-byte header carrying the Identifier
2433
 * Association, then a 128-bit UUID at byte 16).  A UUID cleared to 0h marks
2434
 * the end of the list.  Only decoded from structure offset 0 since entries
2435
 * are indexed from the fixed header. */
2436
static void dissect_nvme_identify_uuid_list_resp(tvbuff_t *cmd_tvb,
2437
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
2438
0
{
2439
0
    unsigned i;
2440
2441
0
    if (off)
2442
0
        return;
2443
2444
0
    for (i = 1; i < 128; i++) {
2445
0
        unsigned entry = i * 32;
2446
0
        proto_tree *grp;
2447
2448
0
        if (entry + 32 > len)
2449
0
            break;          /* entry would overrun the payload */
2450
0
        if (tvb_get_uint64(cmd_tvb, entry + 16, ENC_LITTLE_ENDIAN) == 0 &&
2451
0
            tvb_get_uint64(cmd_tvb, entry + 24, ENC_LITTLE_ENDIAN) == 0)
2452
0
            break;          /* a UUID cleared to 0h ends the list */
2453
2454
0
        grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 32,
2455
0
                                            ett_data, NULL,
2456
0
                                            "UUID List Entry %u", i);
2457
0
        proto_tree_add_item(grp, hf_nvme_identify_uuid_idassoc, cmd_tvb, entry, 1, ENC_LITTLE_ENDIAN);
2458
0
        proto_tree_add_item(grp, hf_nvme_identify_uuid_uuid, cmd_tvb, entry + 16, 16, ENC_NA);
2459
0
    }
2460
0
}
2461
2462
static void add_ctrl_x16_bytes( char *result, uint32_t val)
2463
0
{
2464
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u bytes)", val, val * 16);
2465
0
}
2466
2467
static void dissect_nvme_identify_ctrl_resp_nvmeof(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
2468
0
{
2469
0
    proto_item *ti;
2470
0
    proto_tree *grp;
2471
2472
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nvmeof, cmd_tvb, 1792-off, 256, ENC_NA);
2473
0
    grp =  proto_item_add_subtree(ti, ett_data);
2474
2475
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_ioccsz, cmd_tvb, 1792-off, 4, ENC_LITTLE_ENDIAN);
2476
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_iorcsz, cmd_tvb, 1796-off, 4, ENC_LITTLE_ENDIAN);
2477
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_icdoff, cmd_tvb, 1800-off, 2, ENC_LITTLE_ENDIAN);
2478
2479
0
    add_group_mask_entry(cmd_tvb, grp, 1802-off, 1, ASPEC(hf_nvme_identify_ctrl_nvmeof_fcatt));
2480
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_msdbd, cmd_tvb, 1803-off, 1, ENC_LITTLE_ENDIAN);
2481
0
    add_group_mask_entry(cmd_tvb, grp, 1804-off, 2, ASPEC(hf_nvme_identify_ctrl_nvmeof_ofcs));
2482
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_dctype, cmd_tvb, 1806-off, 1, ENC_LITTLE_ENDIAN);
2483
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_ccrl, cmd_tvb, 1807-off, 1, ENC_LITTLE_ENDIAN);
2484
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_rsvd, cmd_tvb, 1808-off, 240, ENC_NA);
2485
0
}
2486
2487
2488
static const true_false_string units_watts = {
2489
    "1 (0.0001 Watt units)",
2490
    "0 (0.01 Watt units)"
2491
};
2492
2493
2494
static const value_string power_scale_tbl[] = {
2495
    { 0, "not reported for this power state" },
2496
    { 1, "0.0001 Watt units" },
2497
    { 2, "0.01 Watt units" },
2498
    { 3,  "reserved value" },
2499
    { 0, NULL}
2500
};
2501
2502
/* Time Scale Values, NVMe Base 2.3 Figure 330 (EPFRTS / FQVTS / EPFVTS) */
2503
static const value_string time_scale_tbl[] = {
2504
    { 0x0, "1 microsecond" },
2505
    { 0x1, "10 microseconds" },
2506
    { 0x2, "100 microseconds" },
2507
    { 0x3, "1 millisecond" },
2508
    { 0x4, "10 milliseconds" },
2509
    { 0x5, "100 milliseconds" },
2510
    { 0x6, "1 second" },
2511
    { 0x7, "10 seconds" },
2512
    { 0x8, "100 seconds" },
2513
    { 0x9, "1,000 seconds" },
2514
    { 0xA, "10,000 seconds" },
2515
    { 0xB, "100,000 seconds" },
2516
    { 0xC, "1,000,000 seconds" },
2517
    { 0xD, "reserved value" },
2518
    { 0xE, "reserved value" },
2519
    { 0xF, "reserved value" },
2520
    { 0, NULL}
2521
};
2522
2523
/* Max Bandwidth Scale, NVMe Base 2.3 Figure 329 (bits 234:232) */
2524
static const value_string max_bw_scale_tbl[] = {
2525
    { 0, "1 MiB/second" },
2526
    { 1, "10 MiB/second" },
2527
    { 2, "100 MiB/second" },
2528
    { 3, "1 GiB/second" },
2529
    { 4, "10 GiB/second" },
2530
    { 5, "100 GiB/second" },
2531
    { 6, "reserved value" },
2532
    { 7, "reserved value" },
2533
    { 0, NULL}
2534
};
2535
2536
static void dissect_nvme_identify_ctrl_resp_power_state_descriptor(tvbuff_t *cmd_tvb, proto_tree *tree, uint8_t idx, uint32_t off)
2537
0
{
2538
0
    proto_item *ti;
2539
0
    proto_tree *grp;
2540
2541
0
    off = 2048 - off + idx *32;
2542
0
    ti = proto_tree_add_bytes_format(tree, hf_nvme_identify_ctrl_psd, cmd_tvb, off, 32, NULL,
2543
0
                                           "Power State %u Descriptor (PSD%u)", idx, idx);
2544
0
    grp =  proto_item_add_subtree(ti, ett_data);
2545
2546
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mp, cmd_tvb, off, 2, ENC_LITTLE_ENDIAN);
2547
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd0, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN);
2548
2549
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mxps, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
2550
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_nops, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
2551
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd1, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
2552
2553
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_enlat, cmd_tvb, off+4, 4, ENC_LITTLE_ENDIAN);
2554
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_exlat, cmd_tvb, off+8, 4, ENC_LITTLE_ENDIAN);
2555
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrt, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN);
2556
2557
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd2, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN);
2558
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrl, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN);
2559
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd3, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN);
2560
2561
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwt, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN);
2562
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd4, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN);
2563
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwl, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN);
2564
2565
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd5, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN);
2566
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_idlp, cmd_tvb, off+16, 2, ENC_LITTLE_ENDIAN);
2567
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd6, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN);
2568
2569
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_ips, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN);
2570
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd7, cmd_tvb, off+19, 1, ENC_LITTLE_ENDIAN);
2571
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_actp, cmd_tvb, off+20, 2, ENC_LITTLE_ENDIAN);
2572
2573
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_apw, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
2574
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd8, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
2575
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_aps, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
2576
    /* Bytes 31:23, NVMe Base 2.3 Figure 329: only 31:30 and the two odd
2577
     * nibbles are actually Reserved. */
2578
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfrt, cmd_tvb, off+23, 1, ENC_LITTLE_ENDIAN);
2579
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_fqvt, cmd_tvb, off+24, 1, ENC_LITTLE_ENDIAN);
2580
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfvt, cmd_tvb, off+25, 1, ENC_LITTLE_ENDIAN);
2581
2582
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfrts, cmd_tvb, off+26, 1, ENC_LITTLE_ENDIAN);
2583
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_fqvts, cmd_tvb, off+26, 1, ENC_LITTLE_ENDIAN);
2584
2585
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfvts, cmd_tvb, off+27, 1, ENC_LITTLE_ENDIAN);
2586
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd9, cmd_tvb, off+27, 1, ENC_LITTLE_ENDIAN);
2587
2588
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mbw, cmd_tvb, off+28, 1, ENC_LITTLE_ENDIAN);
2589
2590
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mbws, cmd_tvb, off+29, 1, ENC_LITTLE_ENDIAN);
2591
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd10, cmd_tvb, off+29, 1, ENC_LITTLE_ENDIAN);
2592
2593
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd11, cmd_tvb, off+30, 2, ENC_NA);
2594
0
}
2595
2596
static void dissect_nvme_identify_ctrl_resp_power_state_descriptors(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
2597
0
{
2598
0
    proto_item *ti;
2599
0
    proto_tree *grp;
2600
0
    unsigned i;
2601
2602
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_psds, cmd_tvb, 2048-off, 1024, ENC_NA);
2603
0
    grp =  proto_item_add_subtree(ti, ett_data);
2604
0
    for (i = 0; i < 32; i++)
2605
0
        dissect_nvme_identify_ctrl_resp_power_state_descriptor(cmd_tvb, grp, i, off);
2606
0
}
2607
2608
2609
static void add_ctrl_rab(char *result, uint32_t val)
2610
0
{
2611
0
    if (val >= 64)
2612
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (overflow)", val);
2613
0
    else
2614
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" command%s)", val, ((uint64_t)1) << val, val ? "s" : "");
2615
0
}
2616
2617
static void add_ctrl_mdts(char *result, uint32_t val)
2618
0
{
2619
0
    if (val >= 64)
2620
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (overflow)", val);
2621
0
    else if (val)
2622
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" pages)", val, ((uint64_t)1) << val);
2623
0
    else
2624
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (unlimited)", val);
2625
0
}
2626
2627
static void add_ctrl_rtd3(char *result, uint32_t val)
2628
0
{
2629
0
    if (!val)
2630
0
        snprintf(result, ITEM_LABEL_LENGTH, "0 (not reported)");
2631
0
    else
2632
0
        snprintf(result, ITEM_LABEL_LENGTH, "%u (%u microsecond%s)", val, val, (val > 1) ? "s" : "");
2633
0
}
2634
2635
static const value_string ctrl_type_tbl[] = {
2636
    { 0,  "Reserved (not reported)" },
2637
    { 1,  "I/O Controller" },
2638
    { 2,  "Discovery Controller" },
2639
    { 3,  "Administrative Controller" },
2640
    { 0, NULL}
2641
};
2642
2643
static const value_string ctrl_rpmbbpwps_tbl[] = {
2644
    { 0,  "Not specified" },
2645
    { 1,  "Not supported" },
2646
    { 2,  "Supported" },
2647
    { 3,  "Reserved" },
2648
    { 0, NULL}
2649
};
2650
2651
static const value_string ctrl_mups_tbl[] = {
2652
    { 0,  "Reserved" },
2653
    { 1,  "0.0001 W" },
2654
    { 2,  "0.01 W" },
2655
    { 3,  "Reserved" },
2656
    { 0, NULL}
2657
};
2658
2659
static const value_string ctrl_srs_tbl[] = {
2660
    { 0,  "Not reported" },
2661
    { 1,  "1 microsecond" },
2662
    { 2,  "10 microseconds" },
2663
    { 3,  "100 microseconds" },
2664
    { 4,  "1 millisecond" },
2665
    { 5,  "10 milliseconds" },
2666
    { 0, NULL}
2667
};
2668
2669
static const value_string ctrl_dctype_tbl[] = {
2670
    { 0,  "Not reported" },
2671
    { 1,  "Direct Discovery Controller (DDC)" },
2672
    { 2,  "Centralized Discovery Controller (CDC)" },
2673
    { 0, NULL}
2674
};
2675
2676
static void add_ctrl_ms(char *result, uint32_t val)
2677
0
{
2678
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u (%u ms)", val, val * 100);
2679
0
}
2680
2681
static void dissect_nvme_identify_ctrl_resp_ver(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
2682
0
{
2683
0
    proto_item *ti;
2684
0
    proto_tree *grp;
2685
2686
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ver, cmd_tvb,  80-off, 4, ENC_LITTLE_ENDIAN);
2687
0
    grp =  proto_item_add_subtree(ti, ett_data);
2688
2689
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_mjr, cmd_tvb, 82-off, 2, ENC_LITTLE_ENDIAN);
2690
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_min, cmd_tvb, 81-off, 1, ENC_LITTLE_ENDIAN);
2691
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_ter, cmd_tvb, 80-off, 1, ENC_LITTLE_ENDIAN);
2692
0
}
2693
2694
static void dissect_nvme_identify_ctrl_resp_fguid(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
2695
0
{
2696
0
    proto_item *ti;
2697
0
    proto_tree *grp;
2698
2699
    /* FGUID uses the EUI-64 based 16-byte designator format and, per the
2700
     * NVMe Base spec, "This field is big endian" -- unlike virtually all
2701
     * other multi-byte NVMe fields, which default to little endian. */
2702
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fguid, cmd_tvb, 112-off, 16, ENC_NA);
2703
0
    grp =  proto_item_add_subtree(ti, ett_data);
2704
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_vse, cmd_tvb, 112-off, 8, ENC_BIG_ENDIAN);
2705
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_oui, cmd_tvb, 120-off, 3, ENC_BIG_ENDIAN);
2706
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_ei, cmd_tvb, 123-off, 5, ENC_BIG_ENDIAN);
2707
0
}
2708
2709
static void dissect_nvme_identify_ctrl_resp_mi(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
2710
0
{
2711
0
    proto_item *ti;
2712
0
    proto_tree *grp;
2713
2714
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mi, cmd_tvb, 240-off, 16, ENC_NA);
2715
0
    grp =  proto_item_add_subtree(ti, ett_data);
2716
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_mi_rsvd, cmd_tvb, 240-off, 13, ENC_NA);
2717
0
    add_group_mask_entry(cmd_tvb, grp, 253-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_nvmsr));
2718
0
    add_group_mask_entry(cmd_tvb, grp, 254-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_vwci));
2719
0
    add_group_mask_entry(cmd_tvb, grp, 255-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_mec));
2720
0
}
2721
2722
static void add_ctrl_commands(char *result, uint32_t val)
2723
0
{
2724
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u command%s)", val, val+1, val ? "s" : "");
2725
0
}
2726
2727
static void add_ctrl_events(char *result, uint32_t val)
2728
0
{
2729
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u event%s)", val, val+1, val ? "s" : "");
2730
0
}
2731
2732
static void add_ctrl_entries(char *result, uint32_t val)
2733
0
{
2734
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u entr%s)", val, val+1, val ? "ies" : "y");
2735
0
}
2736
2737
static void add_ctrl_states(char *result, uint32_t val)
2738
0
{
2739
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u state%s)", val, val+1, val ? "s" : "");
2740
0
}
2741
2742
static void add_ctrl_hmpre(char *result, uint32_t val)
2743
0
{
2744
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" bytes)", val, ((uint64_t)(val)) * 4096);
2745
0
}
2746
2747
static void post_add_bytes_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off, uint8_t shiftl)
2748
0
{
2749
    /* The 128-bit value is little-endian on the wire: byte `off` holds the
2750
     * low-order 64 bits and byte `off+8` holds the high-order 64 bits. */
2751
0
    uint64_t lo = tvb_get_uint64(tvb, off, ENC_LITTLE_ENDIAN);
2752
0
    uint64_t hi = tvb_get_uint64(tvb, off+8, ENC_LITTLE_ENDIAN);
2753
2754
0
    if (shiftl) {
2755
0
        hi = hi << shiftl;
2756
0
        hi |= (lo >> (64-shiftl));
2757
0
        lo = lo << shiftl;
2758
0
    }
2759
0
    if (hi) {
2760
0
        if (!(hi >> 10))
2761
0
            proto_item_append_text(ti, " (%" PRIu64 " KiB)", (hi << 54) | (lo >> 10));
2762
0
        else if (!(hi >> 20))
2763
0
            proto_item_append_text(ti, " (%" PRIu64 " MiB)", (hi << 44) | (lo >> 20));
2764
0
        else if (!(hi >> 30))
2765
0
            proto_item_append_text(ti, " (%" PRIu64 " GiB)", (hi << 34) | (lo >> 30));
2766
0
        else if (!(hi >> 40))
2767
0
            proto_item_append_text(ti, " (%" PRIu64 " TiB)", (hi << 24) | (lo >> 40));
2768
0
        else if (!(hi >> 50))
2769
0
            proto_item_append_text(ti, " (%" PRIu64 " PiB)", (hi << 14) | (lo >> 50));
2770
0
        else if (!(hi >> 60))
2771
0
            proto_item_append_text(ti, " (%" PRIu64 " EiB)", (hi << 4) | (lo >> 60));
2772
0
        else
2773
0
            proto_item_append_text(ti, " (%" PRIu64 " ZiB)", hi >> 6);
2774
0
    } else {
2775
0
        proto_item_append_text(ti, " (%" PRIu64 " bytes)", lo);
2776
0
    }
2777
0
}
2778
2779
static void add_ctrl_tmt(char *result, uint32_t val)
2780
0
{
2781
0
    if (!val)
2782
0
        snprintf(result, ITEM_LABEL_LENGTH, "0 (not supported)");
2783
0
    else
2784
0
        snprintf(result, ITEM_LABEL_LENGTH, "%u degrees K", val);
2785
0
}
2786
2787
static const value_string mmas_type_tbl[] = {
2788
    { 0,  "modification not defined" },
2789
    { 1,  "no modification after sanitize completion" },
2790
    { 2,  "additional modification after sanitize completion" },
2791
    { 0, NULL}
2792
};
2793
2794
static void add_ctrl_pow2_bytes(char *result, uint32_t val)
2795
0
{
2796
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << val);
2797
0
}
2798
2799
static void add_ctrl_pow2_page_size(char *result, uint32_t val)
2800
0
{
2801
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (12+val));
2802
0
}
2803
2804
static void add_ctrl_pow2_dstrd_size(char *result, uint32_t val)
2805
0
{
2806
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (2+val));
2807
0
}
2808
2809
2810
static const value_string fcb_type_tbl[] = {
2811
    { 0, "support for the NSID field set to FFFFFFFFh is not indicated" },
2812
    { 1, "reserved value" },
2813
    { 2, "Flush command does not support the NSID field set to FFFFFFFFh" },
2814
    { 3, "Flush command supports the NSID field set to FFFFFFFFh" },
2815
    { 0, NULL}
2816
};
2817
2818
2819
static void add_ctrl_lblocks(char *result, uint32_t val)
2820
0
{
2821
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u logical block%s", val + 1, val ? "s" : "");
2822
0
}
2823
2824
static const value_string sgls_ify_type_tbl[] = {
2825
    { 0,  "SGLs are not supported." },
2826
    { 1, "SGLs are supported without alignment or granularity limitations" },
2827
    { 2, "SGLs are supported with DWORD alignment and granularity limitation" },
2828
    { 3,  "reserved value" },
2829
    { 0, NULL}
2830
};
2831
2832
/* Defined further down with the Get Log Page helpers; used here for the two
2833
 * 16-byte count fields (MAXDNA) in the Identify Controller structure. */
2834
static void post_add_intval_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off);
2835
2836
static void dissect_nvme_identify_ctrl_resp(tvbuff_t *cmd_tvb,
2837
                                            proto_tree *cmd_tree, unsigned off, unsigned len)
2838
0
{
2839
0
    proto_item *ti;
2840
2841
0
    if (!off) {
2842
0
        CHECK_STOP_PARSE(0, 2);
2843
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vid, cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN);
2844
0
    }
2845
0
    if (off <= 2) {
2846
0
        CHECK_STOP_PARSE(2, 2);
2847
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ssvid, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN);
2848
0
    }
2849
0
    if (off <= 4) {
2850
0
        CHECK_STOP_PARSE(4, 20);
2851
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_sn, cmd_tvb, 4-off, 20, ENC_ASCII);
2852
0
    }
2853
0
    if (off <= 24) {
2854
0
        CHECK_STOP_PARSE(24, 40);
2855
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mn, cmd_tvb, 24-off, 40, ENC_ASCII);
2856
0
    }
2857
0
    if (off <= 64) {
2858
0
        CHECK_STOP_PARSE(64, 8);
2859
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fr, cmd_tvb, 64-off, 8, ENC_ASCII);
2860
0
    }
2861
0
    if (off <= 72) {
2862
0
        CHECK_STOP_PARSE(72, 1);
2863
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rab, cmd_tvb, 72-off, 1, ENC_LITTLE_ENDIAN);
2864
0
    }
2865
0
    if (off <= 73) {
2866
0
        CHECK_STOP_PARSE(73, 3);
2867
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ieee, cmd_tvb, 73-off, 3, ENC_LITTLE_ENDIAN);
2868
0
    }
2869
0
    if (off <= 76) {
2870
0
        CHECK_STOP_PARSE(76, 1);
2871
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 76-off, 1, ASPEC(hf_nvme_identify_ctrl_cmic));
2872
0
    }
2873
0
    if (off <= 77) {
2874
0
        CHECK_STOP_PARSE(77, 1);
2875
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mdts, cmd_tvb, 77-off, 1, ENC_LITTLE_ENDIAN);
2876
0
    }
2877
2878
0
    if (off <= 78) {
2879
0
        CHECK_STOP_PARSE(78, 2);
2880
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntlid, cmd_tvb, 78-off, 2, ENC_LITTLE_ENDIAN);
2881
0
    }
2882
0
    if (off <= 80) {
2883
0
        CHECK_STOP_PARSE(80, 4);
2884
0
        dissect_nvme_identify_ctrl_resp_ver(cmd_tvb, cmd_tree, off);
2885
0
    }
2886
0
    if (off <= 84) {
2887
0
        CHECK_STOP_PARSE(84, 4);
2888
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3r, cmd_tvb, 84-off, 4, ENC_LITTLE_ENDIAN);
2889
0
    }
2890
2891
0
    if (off <= 88) {
2892
0
        CHECK_STOP_PARSE(88, 4);
2893
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3e, cmd_tvb, 88-off, 4, ENC_LITTLE_ENDIAN);
2894
0
    }
2895
0
    if (off <= 92) {
2896
0
        CHECK_STOP_PARSE(92, 4);
2897
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 92-off, 4, ASPEC(hf_nvme_identify_ctrl_oaes));
2898
0
    }
2899
0
    if (off <= 96) {
2900
0
        CHECK_STOP_PARSE(96, 4);
2901
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 96-off, 4, ASPEC(hf_nvme_identify_ctrl_ctratt));
2902
0
    }
2903
2904
0
    if (off <= 100) {
2905
0
        CHECK_STOP_PARSE(100, 2);
2906
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 100-off, 2, ASPEC(hf_nvme_identify_ctrl_rrls));
2907
0
    }
2908
0
    if (off <= 102) {
2909
0
        CHECK_STOP_PARSE(102, 1);
2910
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 102-off, 1, ASPEC(hf_nvme_identify_ctrl_bpcap));
2911
0
    }
2912
0
    if (off <= 103) {
2913
0
        CHECK_STOP_PARSE(103, 1);
2914
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd0, cmd_tvb, 103-off, 1, ENC_NA);
2915
0
    }
2916
0
    if (off <= 104) {
2917
0
        CHECK_STOP_PARSE(104, 4);
2918
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nssl, cmd_tvb, 104-off, 4, ENC_LITTLE_ENDIAN);
2919
0
    }
2920
0
    if (off <= 108) {
2921
0
        CHECK_STOP_PARSE(108, 2);
2922
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd6, cmd_tvb, 108-off, 2, ENC_NA);
2923
0
    }
2924
0
    if (off <= 110) {
2925
0
        CHECK_STOP_PARSE(110, 1);
2926
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 110-off, 1, ASPEC(hf_nvme_identify_ctrl_plsi));
2927
0
    }
2928
0
    if (off <= 111) {
2929
0
        CHECK_STOP_PARSE(111, 1);
2930
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntrltype, cmd_tvb, 111-off, 1, ENC_LITTLE_ENDIAN);
2931
0
    }
2932
0
    if (off <= 112) {
2933
0
        CHECK_STOP_PARSE(112, 16);
2934
0
        dissect_nvme_identify_ctrl_resp_fguid(cmd_tvb, cmd_tree, off);
2935
0
    }
2936
2937
0
    if (off <= 128) {
2938
0
        CHECK_STOP_PARSE(128, 2);
2939
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt1, cmd_tvb, 128-off, 2, ENC_LITTLE_ENDIAN);
2940
0
    }
2941
0
    if (off <= 130) {
2942
0
        CHECK_STOP_PARSE(130, 2);
2943
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt2, cmd_tvb, 130-off, 2, ENC_LITTLE_ENDIAN);
2944
0
    }
2945
0
    if (off <= 132)  {
2946
0
        CHECK_STOP_PARSE(132, 2);
2947
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt3, cmd_tvb, 132-off, 2, ENC_LITTLE_ENDIAN);
2948
0
    }
2949
2950
0
    if (off <= 134)  {
2951
0
        CHECK_STOP_PARSE(134, 1);
2952
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 134-off, 1, ASPEC(hf_nvme_identify_ctrl_crcap));
2953
0
    }
2954
0
    if (off <= 135)  {
2955
0
        CHECK_STOP_PARSE(135, 1);
2956
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ciu, cmd_tvb, 135-off, 1, ENC_LITTLE_ENDIAN);
2957
0
    }
2958
0
    if (off <= 136)  {
2959
0
        CHECK_STOP_PARSE(136, 8);
2960
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cirn, cmd_tvb, 136-off, 8, ENC_LITTLE_ENDIAN);
2961
0
    }
2962
0
    if (off <= 144)  {
2963
0
        CHECK_STOP_PARSE(144, 96);
2964
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd1, cmd_tvb, 144-off, 96, ENC_NA);
2965
0
    }
2966
0
    if (off <= 240)  {
2967
0
        CHECK_STOP_PARSE(240, 16);
2968
0
        dissect_nvme_identify_ctrl_resp_mi(cmd_tvb, cmd_tree, off);
2969
0
    }
2970
0
    if (off <= 256)  {
2971
0
        CHECK_STOP_PARSE(256, 2);
2972
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 256-off, 2, ASPEC(hf_nvme_identify_ctrl_oacs));
2973
0
    }
2974
2975
0
    if (off <= 258)  {
2976
0
        CHECK_STOP_PARSE(258, 1);
2977
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acl, cmd_tvb,  258-off, 1, ENC_LITTLE_ENDIAN);
2978
0
    }
2979
0
    if (off <= 259)  {
2980
0
        CHECK_STOP_PARSE(259, 1);
2981
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_aerl, cmd_tvb, 259-off, 1, ENC_LITTLE_ENDIAN);
2982
0
    }
2983
0
    if (off <= 260)  {
2984
0
        CHECK_STOP_PARSE(260, 1);
2985
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 260-off, 1, ASPEC(hf_nvme_identify_ctrl_frmw));
2986
0
    }
2987
2988
0
    if (off <= 261)  {
2989
0
        CHECK_STOP_PARSE(261, 1);
2990
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 261-off, 1, ASPEC(hf_nvme_identify_ctrl_lpa));
2991
0
    }
2992
0
    if (off <= 262)  {
2993
0
        CHECK_STOP_PARSE(262, 1);
2994
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_elpe, cmd_tvb, 262-off, 1, ENC_LITTLE_ENDIAN);
2995
0
    }
2996
0
    if (off <= 263)  {
2997
0
        CHECK_STOP_PARSE(263, 1);
2998
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_npss, cmd_tvb, 263-off, 1, ENC_LITTLE_ENDIAN);
2999
0
    }
3000
3001
0
    if (off <= 264)  {
3002
0
        CHECK_STOP_PARSE(264, 1);
3003
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 264-off, 1, ASPEC(hf_nvme_identify_ctrl_avscc));
3004
0
    }
3005
0
    if (off <= 265)  {
3006
0
        CHECK_STOP_PARSE(265, 1);
3007
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 265-off, 1, ASPEC(hf_nvme_identify_ctrl_apsta));
3008
0
    }
3009
0
    if (off <= 266)  {
3010
0
        CHECK_STOP_PARSE(266, 2);
3011
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_wctemp, cmd_tvb, 266-off, 2, ENC_LITTLE_ENDIAN);
3012
3013
0
    }
3014
0
    if (off <= 268)  {
3015
0
        CHECK_STOP_PARSE(268, 2);
3016
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cctemp, cmd_tvb, 268-off, 2, ENC_LITTLE_ENDIAN);
3017
0
    }
3018
0
    if (off <= 270)  {
3019
0
        CHECK_STOP_PARSE(270, 2);
3020
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mtfa, cmd_tvb, 270-off, 2, ENC_LITTLE_ENDIAN);
3021
0
    }
3022
0
    if (off <= 272)  {
3023
0
        CHECK_STOP_PARSE(272, 4);
3024
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmpre, cmd_tvb, 272-off, 4, ENC_LITTLE_ENDIAN);
3025
0
    }
3026
0
    if (off <= 276)  {
3027
0
        CHECK_STOP_PARSE(276, 4);
3028
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmin, cmd_tvb, 276-off, 4, ENC_LITTLE_ENDIAN);
3029
0
    }
3030
3031
0
    if (off <= 280)  {
3032
0
        CHECK_STOP_PARSE(280, 16);
3033
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_tnvmcap, cmd_tvb, 280-off, 16, ENC_NA);
3034
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 280-off, 0);
3035
0
    }
3036
0
    if (off <= 296)  {
3037
0
        CHECK_STOP_PARSE(296, 16);
3038
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_unvmcap, cmd_tvb, 296-off, 16, ENC_NA);
3039
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 296-off, 0);
3040
0
    }
3041
3042
0
    if (off <= 312)  {
3043
0
        CHECK_STOP_PARSE(312, 4);
3044
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 312-off, 4, ASPEC(hf_nvme_identify_ctrl_rpmbs));
3045
0
    }
3046
0
    if (off <= 316)  {
3047
0
        CHECK_STOP_PARSE(316, 2);
3048
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_edstt, cmd_tvb, 316-off, 2, ENC_LITTLE_ENDIAN);
3049
0
    }
3050
0
    if (off <= 318)  {
3051
0
        CHECK_STOP_PARSE(318, 1);
3052
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 318-off, 1, ASPEC(hf_nvme_identify_ctrl_dsto));
3053
0
    }
3054
3055
0
    if (off <= 319)  {
3056
0
        CHECK_STOP_PARSE(319, 1);
3057
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fwug, cmd_tvb, 319-off, 1, ENC_LITTLE_ENDIAN);
3058
0
    }
3059
0
    if (off <= 320)  {
3060
0
        CHECK_STOP_PARSE(320, 2);
3061
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_kas, cmd_tvb, 320-off, 2, ENC_LITTLE_ENDIAN);
3062
0
    }
3063
0
    if (off <= 322)  {
3064
0
        CHECK_STOP_PARSE(322, 2);
3065
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 322-off, 2, ASPEC(hf_nvme_identify_ctrl_hctma));
3066
0
    }
3067
3068
0
    if (off <= 324)  {
3069
0
        CHECK_STOP_PARSE(324, 2);
3070
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mntmt, cmd_tvb, 324-off, 2, ENC_LITTLE_ENDIAN);
3071
0
    }
3072
0
    if (off <= 326)  {
3073
0
        CHECK_STOP_PARSE(326, 2);
3074
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mxtmt, cmd_tvb, 326-off, 2, ENC_LITTLE_ENDIAN);
3075
0
    }
3076
0
    if (off <= 328)  {
3077
0
        CHECK_STOP_PARSE(328, 4);
3078
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 328-off, 4, ASPEC(hf_nvme_identify_ctrl_sanicap));
3079
0
    }
3080
3081
0
    if (off <= 332)  {
3082
0
        CHECK_STOP_PARSE(332, 4);
3083
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmminds, cmd_tvb, 332-off, 4, ENC_LITTLE_ENDIAN);
3084
0
    }
3085
0
    if (off <= 336)  {
3086
0
        CHECK_STOP_PARSE(336, 2);
3087
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmaxd, cmd_tvb, 336-off, 2, ENC_LITTLE_ENDIAN);
3088
0
    }
3089
0
    if (off <= 338)  {
3090
0
        CHECK_STOP_PARSE(338, 2);
3091
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nsetidmax, cmd_tvb, 338-off, 2, ENC_LITTLE_ENDIAN);
3092
0
    }
3093
3094
0
    if (off <= 340)  {
3095
0
        CHECK_STOP_PARSE(340, 2);
3096
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_endgidmax, cmd_tvb, 340-off, 2, ENC_LITTLE_ENDIAN);
3097
0
    }
3098
0
    if (off <= 342)  {
3099
0
        CHECK_STOP_PARSE(342, 1);
3100
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anatt, cmd_tvb, 342-off, 1, ENC_LITTLE_ENDIAN);
3101
0
    }
3102
0
    if (off <= 343)  {
3103
0
        CHECK_STOP_PARSE(343, 1);
3104
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 343-off, 1, ASPEC(hf_nvme_identify_ctrl_anacap));
3105
0
    }
3106
3107
0
    if (off <= 344)  {
3108
0
        CHECK_STOP_PARSE(344, 4);
3109
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anagrpmax, cmd_tvb, 344-off, 4, ENC_LITTLE_ENDIAN);
3110
0
    }
3111
0
    if (off <= 348)  {
3112
0
        CHECK_STOP_PARSE(348, 4);
3113
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nanagrpid, cmd_tvb, 348-off, 4, ENC_LITTLE_ENDIAN);
3114
0
    }
3115
0
    if (off <= 352)  {
3116
0
        CHECK_STOP_PARSE(352, 4);
3117
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_pels, cmd_tvb, 352-off, 4, ENC_LITTLE_ENDIAN);
3118
0
    }
3119
3120
0
    if (off <= 356)  {
3121
0
        CHECK_STOP_PARSE(356, 2);
3122
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_did, cmd_tvb, 356-off, 2, ENC_LITTLE_ENDIAN);
3123
0
    }
3124
0
    if (off <= 358)  {
3125
0
        CHECK_STOP_PARSE(358, 1);
3126
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 358-off, 1, ASPEC(hf_nvme_identify_ctrl_kpioc));
3127
0
    }
3128
0
    if (off <= 359)  {
3129
0
        CHECK_STOP_PARSE(359, 1);
3130
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd2, cmd_tvb, 359-off, 1, ENC_NA);
3131
0
    }
3132
0
    if (off <= 360)  {
3133
0
        CHECK_STOP_PARSE(360, 2);
3134
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mptfawr, cmd_tvb, 360-off, 2, ENC_LITTLE_ENDIAN);
3135
0
    }
3136
0
    if (off <= 362)  {
3137
0
        CHECK_STOP_PARSE(362, 6);
3138
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd7, cmd_tvb, 362-off, 6, ENC_NA);
3139
0
    }
3140
0
    if (off <= 368)  {
3141
0
        CHECK_STOP_PARSE(368, 16);
3142
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_megcap, cmd_tvb, 368-off, 16, ENC_NA);
3143
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 368-off, 0);
3144
0
    }
3145
0
    if (off <= 384)  {
3146
0
        CHECK_STOP_PARSE(384, 1);
3147
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 384-off, 1, ASPEC(hf_nvme_identify_ctrl_tmpthha));
3148
0
    }
3149
0
    if (off <= 385)  {
3150
0
        CHECK_STOP_PARSE(385, 1);
3151
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 385-off, 1, ASPEC(hf_nvme_identify_ctrl_mupa));
3152
0
    }
3153
0
    if (off <= 386)  {
3154
0
        CHECK_STOP_PARSE(386, 2);
3155
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cqt, cmd_tvb, 386-off, 2, ENC_LITTLE_ENDIAN);
3156
0
    }
3157
0
    if (off <= 388)  {
3158
0
        CHECK_STOP_PARSE(388, 2);
3159
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 388-off, 2, ASPEC(hf_nvme_identify_ctrl_cdpa));
3160
0
    }
3161
0
    if (off <= 390)  {
3162
0
        CHECK_STOP_PARSE(390, 2);
3163
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mup, cmd_tvb, 390-off, 2, ENC_LITTLE_ENDIAN);
3164
0
    }
3165
0
    if (off <= 392)  {
3166
0
        CHECK_STOP_PARSE(392, 2);
3167
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 392-off, 2, ASPEC(hf_nvme_identify_ctrl_ipmsr));
3168
0
    }
3169
0
    if (off <= 394)  {
3170
0
        CHECK_STOP_PARSE(394, 2);
3171
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_msmt, cmd_tvb, 394-off, 2, ENC_LITTLE_ENDIAN);
3172
0
    }
3173
0
    if (off <= 396)  {
3174
0
        CHECK_STOP_PARSE(396, 116);
3175
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd8, cmd_tvb, 396-off, 116, ENC_NA);
3176
0
    }
3177
0
    if (off <= 512)  {
3178
0
        CHECK_STOP_PARSE(512, 1);
3179
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 512-off, 1, ASPEC(hf_nvme_identify_ctrl_sqes));
3180
0
    }
3181
0
    if (off <= 513)  {
3182
0
        CHECK_STOP_PARSE(513, 1);
3183
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 513-off, 1, ASPEC(hf_nvme_identify_ctrl_cqes));
3184
0
    }
3185
3186
0
    if (off <= 514)  {
3187
0
        CHECK_STOP_PARSE(514, 2);
3188
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxcmd, cmd_tvb, 514-off, 2, ENC_LITTLE_ENDIAN);
3189
0
    }
3190
0
    if (off <= 516)  {
3191
0
        CHECK_STOP_PARSE(516, 4);
3192
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nn, cmd_tvb, 516-off, 4, ENC_LITTLE_ENDIAN);
3193
0
    }
3194
0
    if (off <= 520)  {
3195
0
        CHECK_STOP_PARSE(520, 2);
3196
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 520-off, 2, ASPEC(hf_nvme_identify_ctrl_oncs));
3197
0
    }
3198
3199
0
    if (off <= 522)  {
3200
0
        CHECK_STOP_PARSE(522, 2);
3201
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 522-off, 2, ASPEC(hf_nvme_identify_ctrl_fuses));
3202
0
    }
3203
0
    if (off <= 524)  {
3204
0
        CHECK_STOP_PARSE(524, 1);
3205
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 524-off, 1, ASPEC(hf_nvme_identify_ctrl_fna));
3206
0
    }
3207
0
    if (off <= 525)  {
3208
0
        CHECK_STOP_PARSE(525, 1);
3209
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 525-off, 1, ASPEC(hf_nvme_identify_ctrl_vwc));
3210
0
    }
3211
3212
0
    if (off <= 526)  {
3213
0
        CHECK_STOP_PARSE(526, 2);
3214
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awun, cmd_tvb, 526-off, 2, ENC_LITTLE_ENDIAN);
3215
0
    }
3216
0
    if (off <= 528)  {
3217
0
        CHECK_STOP_PARSE(528, 2);
3218
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awupf, cmd_tvb, 528-off, 2, ENC_LITTLE_ENDIAN);
3219
0
    }
3220
0
    if (off <= 530)  {
3221
0
        CHECK_STOP_PARSE(530, 1);
3222
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 530-off, 1, ASPEC(hf_nvme_identify_ctrl_nvscc));
3223
0
    }
3224
3225
0
    if (off <= 531)  {
3226
0
        CHECK_STOP_PARSE(531, 1);
3227
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 531-off, 1, ASPEC(hf_nvme_identify_ctrl_nwpc));
3228
0
    }
3229
0
    if (off <= 532)  {
3230
0
        CHECK_STOP_PARSE(532, 2);
3231
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acwu, cmd_tvb, 532-off, 2, ENC_LITTLE_ENDIAN);
3232
0
    }
3233
0
    if (off <= 534)  {
3234
0
        CHECK_STOP_PARSE(534, 2);
3235
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd3, cmd_tvb, 534-off, 2, ENC_NA);
3236
0
    }
3237
3238
0
    if (off <= 536)  {
3239
0
        CHECK_STOP_PARSE(536, 4);
3240
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 536-off, 4, ASPEC(hf_nvme_identify_ctrl_sgls));
3241
0
    }
3242
0
    if (off <= 540)  {
3243
0
        CHECK_STOP_PARSE(540, 4);
3244
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mnan, cmd_tvb, 540-off, 4, ENC_LITTLE_ENDIAN);
3245
0
    }
3246
0
    if (off <= 544)  {
3247
0
        CHECK_STOP_PARSE(544, 16);
3248
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxdna, cmd_tvb, 544-off, 16, ENC_NA);
3249
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 544-off);
3250
0
    }
3251
0
    if (off <= 560)  {
3252
0
        CHECK_STOP_PARSE(560, 4);
3253
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxcna, cmd_tvb, 560-off, 4, ENC_LITTLE_ENDIAN);
3254
0
    }
3255
0
    if (off <= 564)  {
3256
0
        CHECK_STOP_PARSE(564, 4);
3257
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_oaqd, cmd_tvb, 564-off, 4, ENC_LITTLE_ENDIAN);
3258
0
    }
3259
0
    if (off <= 568)  {
3260
0
        CHECK_STOP_PARSE(568, 1);
3261
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rhiri, cmd_tvb, 568-off, 1, ENC_LITTLE_ENDIAN);
3262
0
    }
3263
0
    if (off <= 569)  {
3264
0
        CHECK_STOP_PARSE(569, 1);
3265
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hirt, cmd_tvb, 569-off, 1, ENC_LITTLE_ENDIAN);
3266
0
    }
3267
0
    if (off <= 570)  {
3268
0
        CHECK_STOP_PARSE(570, 2);
3269
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cmmrtd, cmd_tvb, 570-off, 2, ENC_LITTLE_ENDIAN);
3270
0
    }
3271
0
    if (off <= 572)  {
3272
0
        CHECK_STOP_PARSE(572, 2);
3273
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nmmrtd, cmd_tvb, 572-off, 2, ENC_LITTLE_ENDIAN);
3274
0
    }
3275
0
    if (off <= 574)  {
3276
0
        CHECK_STOP_PARSE(574, 1);
3277
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_minmrtg, cmd_tvb, 574-off, 1, ENC_LITTLE_ENDIAN);
3278
0
    }
3279
0
    if (off <= 575)  {
3280
0
        CHECK_STOP_PARSE(575, 1);
3281
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxmrtg, cmd_tvb, 575-off, 1, ENC_LITTLE_ENDIAN);
3282
0
    }
3283
0
    if (off <= 576)  {
3284
0
        CHECK_STOP_PARSE(576, 1);
3285
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 576-off, 1, ASPEC(hf_nvme_identify_ctrl_trattr));
3286
0
    }
3287
0
    if (off <= 577)  {
3288
0
        CHECK_STOP_PARSE(577, 1);
3289
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd4, cmd_tvb, 577-off, 1, ENC_NA);
3290
0
    }
3291
0
    if (off <= 578)  {
3292
0
        CHECK_STOP_PARSE(578, 2);
3293
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcudmq, cmd_tvb, 578-off, 2, ENC_LITTLE_ENDIAN);
3294
0
    }
3295
0
    if (off <= 580)  {
3296
0
        CHECK_STOP_PARSE(580, 2);
3297
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mnsudmq, cmd_tvb, 580-off, 2, ENC_LITTLE_ENDIAN);
3298
0
    }
3299
0
    if (off <= 582)  {
3300
0
        CHECK_STOP_PARSE(582, 2);
3301
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcmr, cmd_tvb, 582-off, 2, ENC_LITTLE_ENDIAN);
3302
0
    }
3303
0
    if (off <= 584)  {
3304
0
        CHECK_STOP_PARSE(584, 2);
3305
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nmcmr, cmd_tvb, 584-off, 2, ENC_LITTLE_ENDIAN);
3306
0
    }
3307
0
    if (off <= 586)  {
3308
0
        CHECK_STOP_PARSE(586, 2);
3309
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcdqpc, cmd_tvb, 586-off, 2, ENC_LITTLE_ENDIAN);
3310
0
    }
3311
0
    if (off <= 588)  {
3312
0
        CHECK_STOP_PARSE(588, 180);
3313
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd9, cmd_tvb, 588-off, 180, ENC_NA);
3314
0
    }
3315
3316
0
    if (off <= 768)  {
3317
0
        CHECK_STOP_PARSE(768, 256);
3318
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_subnqn, cmd_tvb, 768-off, 256, ENC_ASCII);
3319
0
    }
3320
0
    if (off <= 1024)  {
3321
0
        CHECK_STOP_PARSE(1024, 768);
3322
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd5, cmd_tvb, 1024-off, 768, ENC_NA);
3323
0
    }
3324
0
    if (off <= 1792)  {
3325
0
        CHECK_STOP_PARSE(1792, 256);
3326
0
        dissect_nvme_identify_ctrl_resp_nvmeof(cmd_tvb, cmd_tree, off);
3327
0
    }
3328
3329
0
    if (off <= 2048)  {
3330
0
        CHECK_STOP_PARSE(2048, 1024);
3331
0
        dissect_nvme_identify_ctrl_resp_power_state_descriptors(cmd_tvb, cmd_tree, off);
3332
0
    }
3333
3334
0
    if (off <= 3072)  {
3335
0
        CHECK_STOP_PARSE(3072, 1024);
3336
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vs, cmd_tvb, 3072-off, 1024, ENC_NA);
3337
0
    }
3338
0
}
3339
3340
static void dissect_nvme_identify_resp(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree,
3341
                                       struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
3342
0
{
3343
0
    switch(cmd_ctx->cmd_ctx.cmd_identify.cns) {
3344
0
    case NVME_IDENTIFY_CNS_IDENTIFY_NS:
3345
0
    case NVME_IDENTIFY_CNS_NS_ALLOC:        /* same Identify Namespace structure */
3346
0
        dissect_nvme_identify_ns_resp(cmd_tvb, pinfo, cmd_tree, off, len);
3347
0
        break;
3348
0
    case NVME_IDENTIFY_CNS_IDENTIFY_CTRL:
3349
0
        dissect_nvme_identify_ctrl_resp(cmd_tvb, cmd_tree, off, len);
3350
0
        break;
3351
0
    case NVME_IDENTIFY_CNS_IDENTIFY_NSLIST:
3352
0
    case NVME_IDENTIFY_CNS_NS_ALLOC_LIST:   /* same Namespace ID list structure */
3353
0
        dissect_nvme_identify_nslist_resp(cmd_tvb, cmd_tree, off, len);
3354
0
        break;
3355
0
    case NVME_IDENTIFY_CNS_NSID_DESC_LIST:
3356
0
        dissect_nvme_identify_nsid_desc_list_resp(cmd_tvb, cmd_tree, off, len);
3357
0
        break;
3358
0
    case NVME_IDENTIFY_CNS_NVM_SET_LIST:
3359
0
        dissect_nvme_identify_nvmset_resp(cmd_tvb, cmd_tree, off, len);
3360
0
        break;
3361
0
    case NVME_IDENTIFY_CNS_CS_IND_NS:
3362
0
        dissect_nvme_identify_cs_ind_ns_resp(cmd_tvb, cmd_tree, off, len);
3363
0
        break;
3364
0
    case NVME_IDENTIFY_CNS_CTRL_LIST_NS:
3365
0
    case NVME_IDENTIFY_CNS_CTRL_LIST:       /* same Controller List structure */
3366
0
        dissect_nvme_identify_ctrl_list_resp(cmd_tvb, cmd_tree, off, len);
3367
0
        break;
3368
0
    case NVME_IDENTIFY_CNS_PRI_CTRL_CAP:
3369
0
        dissect_nvme_identify_pri_ctrl_cap_resp(cmd_tvb, cmd_tree, off, len);
3370
0
        break;
3371
0
    case NVME_IDENTIFY_CNS_SEC_CTRL_LIST:
3372
0
        dissect_nvme_identify_sec_ctrl_list_resp(cmd_tvb, cmd_tree, off, len);
3373
0
        break;
3374
0
    case NVME_IDENTIFY_CNS_NS_GRAN_LIST:
3375
0
        dissect_nvme_identify_ns_gran_list_resp(cmd_tvb, cmd_tree, off, len);
3376
0
        break;
3377
0
    case NVME_IDENTIFY_CNS_UUID_LIST:
3378
0
        dissect_nvme_identify_uuid_list_resp(cmd_tvb, cmd_tree, off, len);
3379
0
        break;
3380
0
    default:
3381
0
        break;
3382
0
    }
3383
0
}
3384
3385
static void dissect_nvme_identify_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
3386
0
{
3387
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_identify_dword10));
3388
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_identify_dword11));
3389
3390
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
3391
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
3392
3393
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_identify_dword14));
3394
3395
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
3396
0
}
3397
3398
/* Log Page Identifiers (NVMe Base 2.3 "Get Log Page – Log Page
3399
 * Identifiers").  LID 0Eh is defined by the
3400
 * NVM Command Set Specification (LBA Status Information). */
3401
typedef enum {
3402
    NVME_LID_SUPPORTED_LOG_PAGES        = 0x00,
3403
    NVME_LID_ERROR_INFO                 = 0x01,
3404
    NVME_LID_SMART                      = 0x02,
3405
    NVME_LID_FW_SLOT                    = 0x03,
3406
    NVME_LID_CHANGED_NSLIST             = 0x04,
3407
    NVME_LID_CMD_SUP_AND_EFF            = 0x05,
3408
    NVME_LID_DEVICE_SELF_TEST           = 0x06,
3409
    NVME_LID_TELEMETRY_HOST             = 0x07,
3410
    NVME_LID_TELEMETRY_CTRL             = 0x08,
3411
    NVME_LID_ENDURANCE_GROUP            = 0x09,
3412
    NVME_LID_PRED_LAT_NVM_SET           = 0x0A,
3413
    NVME_LID_PRED_LAT_EVENT_AGG         = 0x0B,
3414
    NVME_LID_ANA                        = 0x0C,
3415
    NVME_LID_PERSISTENT_EVENT           = 0x0D,
3416
    NVME_LID_LBA_STATUS                 = 0x0E,
3417
    NVME_LID_ENDURANCE_GROUP_EVENT_AGG  = 0x0F,
3418
    NVME_LID_MEDIA_UNIT_STATUS          = 0x10,
3419
    NVME_LID_SUP_CAP_CONFIG_LIST        = 0x11,
3420
    NVME_LID_FEATURE_ID_SUP_AND_EFF     = 0x12,
3421
    NVME_LID_NVME_MI_CMD_SUP_AND_EFF    = 0x13,
3422
    NVME_LID_CMD_FEAT_LOCKDOWN          = 0x14,
3423
    NVME_LID_BOOT_PARTITION             = 0x15,
3424
    NVME_LID_ROTATIONAL_MEDIA           = 0x16,
3425
    NVME_LID_DISPERSED_NS               = 0x17,
3426
    NVME_LID_MGMT_ADDR_LIST             = 0x18,
3427
    NVME_LID_PHY_RX_EOM                 = 0x19,
3428
    NVME_LID_REACHABILITY_GROUPS        = 0x1A,
3429
    NVME_LID_REACHABILITY_ASSOC         = 0x1B,
3430
    NVME_LID_CHANGED_ALLOC_NSLIST       = 0x1C,
3431
    NVME_LID_DEVICE_PERSONALITIES       = 0x1D,
3432
    NVME_LID_CROSS_CTRL_RESET           = 0x1E,
3433
    NVME_LID_LOST_HOST_COMM             = 0x1F,
3434
    NVME_LID_FDP_CONFIGS                = 0x20,
3435
    NVME_LID_RECLAIM_UNIT_HANDLE_USAGE  = 0x21,
3436
    NVME_LID_FDP_STATS                  = 0x22,
3437
    NVME_LID_FDP_EVENTS                 = 0x23,
3438
    NVME_LID_POWER_MEASUREMENT          = 0x25,
3439
    NVME_LID_DISCOVERY                  = 0x70,
3440
    NVME_LID_HOST_DISCOVERY             = 0x71,
3441
    NVME_LID_AVE_DISCOVERY              = 0x72,
3442
    NVME_LID_PULL_MODEL_DDC_REQ         = 0x73,
3443
    NVME_LID_SANITIZE_NS_STATUS_LIST    = 0x7F,
3444
    NVME_LID_RESERVATION_NOTIFICATION   = 0x80,
3445
    NVME_LID_SANITIZE_STATUS            = 0x81,
3446
} nvme_logpage_lid_t;
3447
3448
static const value_string logpage_tbl[] = {
3449
    { NVME_LID_SUPPORTED_LOG_PAGES, "Supported Log Pages" },
3450
    { NVME_LID_ERROR_INFO, "Error Information" },
3451
    { NVME_LID_SMART, "SMART/Health Information" },
3452
    { NVME_LID_FW_SLOT, "Firmware Slot Information" },
3453
    { NVME_LID_CHANGED_NSLIST, "Changed Attached Namespace List" },
3454
    { NVME_LID_CMD_SUP_AND_EFF, "Commands Supported and Effects" },
3455
    { NVME_LID_DEVICE_SELF_TEST, "Device Self-test" },
3456
    { NVME_LID_TELEMETRY_HOST, "Telemetry Host-Initiated" },
3457
    { NVME_LID_TELEMETRY_CTRL, "Telemetry Controller-Initiated" },
3458
    { NVME_LID_ENDURANCE_GROUP, "Endurance Group Information" },
3459
    { NVME_LID_PRED_LAT_NVM_SET, "Predictable Latency Per NVM Set" },
3460
    { NVME_LID_PRED_LAT_EVENT_AGG, "Predictable Latency Event Aggregate" },
3461
    { NVME_LID_ANA, "Asymmetric Namespace Access" },
3462
    { NVME_LID_PERSISTENT_EVENT, "Persistent Event Log" },
3463
    { NVME_LID_LBA_STATUS, "LBA Status Information" },
3464
    { NVME_LID_ENDURANCE_GROUP_EVENT_AGG, "Endurance Group Event Aggregate" },
3465
    { NVME_LID_MEDIA_UNIT_STATUS, "Media Unit Status" },
3466
    { NVME_LID_SUP_CAP_CONFIG_LIST, "Supported Capacity Configuration List" },
3467
    { NVME_LID_FEATURE_ID_SUP_AND_EFF, "Feature Identifiers Supported and Effects" },
3468
    { NVME_LID_NVME_MI_CMD_SUP_AND_EFF, "NVMe-MI Commands Supported and Effects" },
3469
    { NVME_LID_CMD_FEAT_LOCKDOWN, "Command and Feature Lockdown" },
3470
    { NVME_LID_BOOT_PARTITION, "Boot Partition" },
3471
    { NVME_LID_ROTATIONAL_MEDIA, "Rotational Media Information" },
3472
    { NVME_LID_DISPERSED_NS, "Dispersed Namespace Participating NVM Subsystems" },
3473
    { NVME_LID_MGMT_ADDR_LIST, "Management Address List" },
3474
    { NVME_LID_PHY_RX_EOM, "Physical Interface Receiver Eye Opening Measurement" },
3475
    { NVME_LID_REACHABILITY_GROUPS, "Reachability Groups" },
3476
    { NVME_LID_REACHABILITY_ASSOC, "Reachability Associations" },
3477
    { NVME_LID_CHANGED_ALLOC_NSLIST, "Changed Allocated Namespace List" },
3478
    { NVME_LID_DEVICE_PERSONALITIES, "Device Personalities" },
3479
    { NVME_LID_CROSS_CTRL_RESET, "Cross-Controller Reset" },
3480
    { NVME_LID_LOST_HOST_COMM, "Lost Host Communication" },
3481
    { NVME_LID_FDP_CONFIGS, "FDP Configurations" },
3482
    { NVME_LID_RECLAIM_UNIT_HANDLE_USAGE, "Reclaim Unit Handle Usage" },
3483
    { NVME_LID_FDP_STATS, "FDP Statistics" },
3484
    { NVME_LID_FDP_EVENTS, "FDP Events" },
3485
    { NVME_LID_POWER_MEASUREMENT, "Power Measurement" },
3486
    { NVME_LID_DISCOVERY, "Discovery" },
3487
    { NVME_LID_HOST_DISCOVERY, "Host Discovery" },
3488
    { NVME_LID_AVE_DISCOVERY, "AVE Discovery" },
3489
    { NVME_LID_PULL_MODEL_DDC_REQ, "Pull Model DDC Request" },
3490
    { NVME_LID_SANITIZE_NS_STATUS_LIST, "Sanitize Namespace Status List" },
3491
    { NVME_LID_RESERVATION_NOTIFICATION, "Reservation Notification" },
3492
    { NVME_LID_SANITIZE_STATUS, "Sanitize Status" },
3493
    { 0, NULL }
3494
};
3495
3496
static const char *get_logpage_name(unsigned lid)
3497
0
{
3498
0
    if (lid >= 0x82 && lid <= 0xBE)
3499
0
        return "I/O Command Set Specific";
3500
0
    else if (lid == 0xBF)
3501
0
        return "Zoned Namespace Command Set";
3502
0
    else if (lid >= 0xC0)
3503
0
        return "Vendor Specific";
3504
0
    else
3505
0
        return val_to_str_const(lid, logpage_tbl, "Reserved");
3506
0
}
3507
3508
static void add_logpage_lid(char *result, uint32_t val)
3509
0
{
3510
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s (0x%x)", get_logpage_name(val), val);
3511
0
}
3512
3513
static const value_string sec_type_tbl[] = {
3514
    { 0, "No security" },
3515
    { 1, "Transport Layer Security (TLS) version >= 1.2" },
3516
    { 0, NULL }
3517
};
3518
3519
static void dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off)
3520
0
{
3521
0
    proto_tree *grp =  proto_item_add_subtree(ti, ett_data);
3522
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN);
3523
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd, cmd_tvb, off+1, 255, ENC_NA);
3524
0
}
3525
3526
static const value_string qp_type_tbl[] = {
3527
    { 1, "Reliable Connected" },
3528
    { 2, "Reliable Datagram" },
3529
    { 0, NULL }
3530
};
3531
3532
static const value_string pr_type_tbl[] = {
3533
    { 1, "No provider specified" },
3534
    { 2, "InfiniBand" },
3535
    { 3, "RoCE (v1)" },
3536
    { 4, "RoCE (v2)" },
3537
    { 5, "iWARP" },
3538
    { 0, NULL }
3539
};
3540
3541
static const value_string cms_type_tbl[] = {
3542
    { 1, "RDMA_IP_CM" },
3543
    { 0, NULL }
3544
};
3545
3546
static void dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off)
3547
0
{
3548
0
    proto_tree *grp;
3549
3550
0
    grp =  proto_item_add_subtree(ti, ett_data);
3551
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN);
3552
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN);
3553
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN);
3554
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0, cmd_tvb, off+3, 5, ENC_NA);
3555
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey, cmd_tvb, off+8, 2, ENC_LITTLE_ENDIAN);
3556
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1, cmd_tvb, off+10, 246, ENC_NA);
3557
0
}
3558
3559
static const value_string trt_type_tbl[] = {
3560
    { 0, "Reserved" },
3561
    { 1, "RDMA Transport" },
3562
    { 2, "Fibre Channel Transport" },
3563
    { 3, "TCP Transport" },
3564
    { 254, "Intra-host Transport" },
3565
    { 0, NULL }
3566
};
3567
3568
static const value_string adrfam_type_tbl[] = {
3569
    { 0, "Reserved" },
3570
    { 1, "AF_INET" },
3571
    { 2, "AF_INET6" },
3572
    { 3, "AF_IB" },
3573
    { 4, "Fibre Channel" },
3574
    { 254, "Intra-Host" },
3575
    { 0, NULL }
3576
};
3577
3578
/* Command Set Identifiers, NVMe Base 2.3 Figure 327 */
3579
static const value_string csi_tbl[] = {
3580
    { 0x00, "NVM Command Set" },
3581
    { 0x01, "Key Value Command Set" },
3582
    { 0x02, "Zoned Namespace Command Set" },
3583
    { 0x03, "Subsystem Local Memory Command Set" },
3584
    { 0x04, "Computational Programs Command Set" },
3585
    { 0, NULL }
3586
};
3587
3588
static const value_string sub_type_tbl[] = {
3589
    { 0, "Reserved" },
3590
    { 1, "Referral to another Discovery Subsystem" },
3591
    { 2, "NVM subsystem with IO controllers" },
3592
    { 3, "Current Discovery Subsystem" },
3593
    { 0, NULL }
3594
};
3595
3596
/* TREQ bits 1:0, NVMe Base 2.3 Figure 310 */
3597
static const value_string treq_tsc_tbl[] = {
3598
    { 0, "Not specified" },
3599
    { 1, "Required" },
3600
    { 2, "Not required" },
3601
    { 3, "Reserved" },
3602
    { 0, NULL }
3603
};
3604
3605
/* TREQ bits 5:4, NVMe Base 2.3 Figure 310 */
3606
static const value_string treq_tasc_tbl[] = {
3607
    { 0, "Not specified" },
3608
    { 1, "Authentication required" },
3609
    { 2, "Authentication concatenated to secure channel establishment required" },
3610
    { 3, "Reserved" },
3611
    { 0, NULL }
3612
};
3613
3614
static void dissect_nvme_get_logpage_ify_rcrd_resp(tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, proto_tree *tree, uint64_t rcrd, unsigned roff, int off, unsigned len)
3615
0
{
3616
0
    proto_item *ti;
3617
0
    proto_tree *grp;
3618
0
    unsigned tr_type;
3619
3620
0
    ti = proto_tree_add_bytes_format(tree, hf_nvme_get_logpage_ify_rcrd, cmd_tvb, off,
3621
0
        (len < 1024) ? len : 1024, NULL, "Discovery Log Entry %"PRIu64" (DLE%"PRIu64")", rcrd, rcrd);
3622
0
    grp =  proto_item_add_subtree(ti, ett_data);
3623
3624
0
    if (!roff) {
3625
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ify_rcrd_trtype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN, &tr_type);
3626
0
        cmd_ctx->cmd_ctx.get_logpage.tr_type = tr_type;
3627
0
    } else {
3628
0
        tr_type = cmd_ctx->cmd_ctx.get_logpage.tr_type;
3629
0
    }
3630
3631
0
    if (roff <= 1 && (2-roff) <= len)
3632
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_adrfam, cmd_tvb, off-roff+1, 1, ENC_LITTLE_ENDIAN);
3633
3634
0
    if (roff <= 2 && (3-roff) <= len)
3635
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subtype, cmd_tvb, off-roff+2, 1, ENC_LITTLE_ENDIAN);
3636
3637
0
    if (roff <= 3 && (4-roff) <= len)
3638
0
        add_group_mask_entry(cmd_tvb, grp, off-roff+3, 1, ASPEC(hf_nvme_get_logpage_ify_rcrd_treq));
3639
3640
0
    if (roff <= 4 && (6-roff) <= len)
3641
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_portid, cmd_tvb, off-roff+4, 2, ENC_LITTLE_ENDIAN);
3642
3643
0
    if (roff <= 6 && (8-roff) <= len)
3644
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_cntlid, cmd_tvb, off-roff+6, 2, ENC_LITTLE_ENDIAN);
3645
3646
0
    if (roff <= 8 && (10-roff) <= len)
3647
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_asqsz, cmd_tvb, off-roff+8, 2, ENC_LITTLE_ENDIAN);
3648
3649
0
    if (roff <= 10 && (12-roff) <= len)
3650
0
        add_group_mask_entry(cmd_tvb, grp, off-roff+10, 2, ASPEC(hf_nvme_get_logpage_disc_rcrd_eflags));
3651
3652
0
    if (roff <= 12 && (32-roff) <= len)
3653
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd0, cmd_tvb, off-roff+12, 20, ENC_NA);
3654
3655
0
    if (roff <= 32 && (64-roff) <= len)
3656
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_trsvcid, cmd_tvb, off-roff+32, 32, ENC_ASCII);
3657
3658
0
    if (roff <= 64 && (256-roff) <= len)
3659
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd1, cmd_tvb, off-roff+64, 192, ENC_NA);
3660
3661
0
    if (roff <= 256 && (512-roff) <= len)
3662
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subnqn, cmd_tvb, off-roff+256, 256, ENC_ASCII);
3663
3664
0
    if (roff <= 512 && (768-roff) <= len)
3665
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_traddr, cmd_tvb, off-roff+512, 256, ENC_ASCII);
3666
3667
0
    if (roff <= 768 && (1024-roff) <= len) {
3668
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas, cmd_tvb, off-roff+768, 256, ENC_NA);
3669
0
        if (tr_type == 1)
3670
0
            dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(cmd_tvb, ti, off-roff+768);
3671
0
        else if (tr_type == 3)
3672
0
            dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(cmd_tvb, ti, off-roff+768);
3673
0
    }
3674
0
}
3675
3676
static void dissect_nvme_get_logpage_ify_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
3677
0
{
3678
0
    uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off + tr_off;
3679
0
    proto_tree *grp;
3680
0
    unsigned poff;
3681
0
    unsigned roff;
3682
0
    unsigned max_bytes;
3683
0
    uint64_t rcrd, rcrd_ctr = 0;
3684
0
    uint64_t recnum = 0;
3685
3686
0
    grp =  proto_item_add_subtree(ti, ett_data);
3687
3688
0
    if (!off && len >= 8)
3689
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_genctr, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
3690
3691
    /* unsigned casts are to silence clang-11 compile errors */
3692
0
    if (off <= 8 && (16 - (unsigned)off) <= len)
3693
0
        proto_tree_add_item_ret_uint64(grp, hf_nvme_get_logpage_ify_numrec, cmd_tvb, (unsigned)(8-off), 8, ENC_LITTLE_ENDIAN, &recnum);
3694
3695
0
    if (off <= 16 && (18 - (unsigned)off) <= len) {
3696
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_recfmt, cmd_tvb, (unsigned)(16-off), 2, ENC_LITTLE_ENDIAN);
3697
0
        cmd_ctx->cmd_ctx.get_logpage.records = (recnum & 0xffffffff);
3698
0
    } else if (tr_off) {
3699
0
        recnum = cmd_ctx->cmd_ctx.get_logpage.records;
3700
0
    }
3701
3702
0
    if (off <= 18 && (1024 - (unsigned)off) <= len)
3703
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rsvd, cmd_tvb, (unsigned)(18-off), 1006, ENC_NA);
3704
3705
0
    if (off <= 1024) {
3706
0
        poff = (1024 - (unsigned)off); /* clang-11 is so strange, hence the cast */
3707
0
        if (poff >= len)
3708
0
            return;
3709
0
        max_bytes = 1024;
3710
0
        rcrd = 0;
3711
0
        roff = 0;
3712
0
        len -= poff;
3713
0
    } else {
3714
0
        poff = 0;
3715
0
        roff = (off & 1023);
3716
0
        max_bytes = 1024 - (roff);
3717
0
        rcrd = (off - roff) / 1024 - 1;
3718
0
    }
3719
3720
0
    max_bytes = (max_bytes <= len) ? max_bytes : len;
3721
0
    dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, roff, poff, len);
3722
0
    poff += max_bytes;
3723
0
    len -= max_bytes;
3724
0
    rcrd++;
3725
0
    rcrd_ctr++;
3726
3727
    /* `recnum` is the total number of Discovery Log Entries, and one has just
3728
     * been rendered unconditionally above, so `rcrd_ctr` is already 1 here.
3729
     * When NUMREC (NVMe Base 2.3 Figure 312, bytes 15:08) was not visible in
3730
     * this window, fall back to "one entry per remaining 1024-byte record",
3731
     * plus the one already rendered, so the counter keeps the same meaning on
3732
     * both paths and `len` stays the real terminator. */
3733
0
    if (!recnum)
3734
0
        recnum = 1 + (len  + 1023) / 1024;
3735
3736
0
    while (len && rcrd_ctr < recnum) {
3737
0
        max_bytes = (len >= 1024) ? 1024 : len;
3738
0
        dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, 0, poff, len);
3739
0
        poff += max_bytes;
3740
0
        len -= max_bytes;
3741
0
        rcrd++;
3742
0
        rcrd_ctr++;
3743
0
    }
3744
0
}
3745
3746
/* True if the field at absolute structure offset `struct_off` (width
3747
 * `field_len`) is present in the currently-visible window [off, off+len)
3748
 * handed to a windowed Get Log Page / Set Features decoder, and sets
3749
 * *rel_off to its position relative to cmd_tvb (whose byte 0 is `off` into
3750
 * the logical structure).  Centralizes the "off <= struct_off &&
3751
 * (struct_off + field_len - off) <= len" bounds check that was previously
3752
 * hand-duplicated across every decoder in this file -- and, for the
3753
 * trailing/variable-length field in several of them, was computed via an
3754
 * unguarded "len -= poff" that underflows (wrapping to a huge unsigned
3755
 * value) whenever the window is shorter than `struct_off` implies. */
3756
static bool
3757
nvme_field_in_window(unsigned off, unsigned len, unsigned struct_off, unsigned field_len,
3758
                     unsigned *rel_off)
3759
0
{
3760
0
    if (off > struct_off || (struct_off + field_len - off) > len)
3761
0
        return false;
3762
0
    *rel_off = struct_off - off;
3763
0
    return true;
3764
0
}
3765
3766
/* True if `off` (the combined LPO+transport window offset) is a multiple of
3767
 * `rec_len`, the fixed record size of a repeating Log Page array (e.g. the
3768
 * 4-byte-per-entry Supported Log Pages / *-Supported-and-Effects tables).
3769
 * A compliant target should never split such a transfer mid-record, but
3770
 * this dissector has no way to enforce that on the wire -- a non-compliant
3771
 * device or a crafted/fuzzed capture can still hand a decoder a window that
3772
 * starts mid-record, which would otherwise be silently spliced into a
3773
 * bogus entry instead of being rejected. */
3774
static bool
3775
nvme_offset_record_aligned(unsigned off, unsigned rec_len)
3776
0
{
3777
0
    return (off % rec_len) == 0;
3778
0
}
3779
3780
static void dissect_nvme_get_logpage_err_inf_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
3781
0
{
3782
0
    proto_tree *grp;
3783
0
    unsigned rel;
3784
3785
0
    grp =  proto_item_add_subtree(ti, ett_data);
3786
3787
0
    if (off > 63)
3788
0
        return; /* max allowed offset is 63 */
3789
3790
0
    if (nvme_field_in_window(off, len, 0, 8, &rel))
3791
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_errcnt, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
3792
0
    if (nvme_field_in_window(off, len, 8, 2, &rel))
3793
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_sqid, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
3794
0
    if (nvme_field_in_window(off, len, 10, 2, &rel))
3795
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_cid, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
3796
0
    if (nvme_field_in_window(off, len, 12, 2, &rel))
3797
0
        add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_errinf_sf));
3798
0
    if (nvme_field_in_window(off, len, 14, 2, &rel))
3799
0
        add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_errinf_pel));
3800
0
    if (nvme_field_in_window(off, len, 16, 8, &rel))
3801
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_lba, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
3802
0
    if (nvme_field_in_window(off, len, 24, 4, &rel))
3803
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_ns, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
3804
0
    if (nvme_field_in_window(off, len, 28, 1, &rel))
3805
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_vsi, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3806
0
    if (nvme_field_in_window(off, len, 29, 1, &rel))
3807
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_trtype, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3808
    /* The spec's "CSI" here is Command Set Indicator (byte 30), but the
3809
     * ".csi" filter name was already taken upstream in 2021 by Command
3810
     * Specific Information (byte 32, below) and has shipped since 3.6.0, so
3811
     * this field uses ".cmdset" rather than silently repurposing it. */
3812
0
    if (nvme_field_in_window(off, len, 30, 1, &rel))
3813
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_cmdset, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3814
0
    if (nvme_field_in_window(off, len, 31, 1, &rel))
3815
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_opc, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3816
0
    if (nvme_field_in_window(off, len, 32, 8, &rel))
3817
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_csi, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
3818
0
    if (nvme_field_in_window(off, len, 40, 2, &rel))
3819
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_tsi, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
3820
0
    if (nvme_field_in_window(off, len, 42, 21, &rel))
3821
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_rsvd1, cmd_tvb, rel, 21, ENC_NA);
3822
0
    if (nvme_field_in_window(off, len, 63, 1, &rel))
3823
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_lpver, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3824
0
}
3825
3826
static void post_add_intval_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off)
3827
0
{
3828
    /* The 128-bit value is little-endian on the wire: byte `off` holds the
3829
     * low-order 64 bits and byte `off+8` holds the high-order 64 bits. */
3830
0
    uint64_t lo = tvb_get_uint64(tvb, off, ENC_LITTLE_ENDIAN);
3831
0
    uint64_t hi = tvb_get_uint64(tvb, off+8, ENC_LITTLE_ENDIAN);
3832
0
    double res;
3833
3834
0
    res = (double)hi;
3835
0
    res *= (((uint64_t)1) << 63);
3836
0
    res *= 2;
3837
0
    res += lo;
3838
0
    if (res > 99999999)
3839
0
        proto_item_append_text(ti, " (%.8le)", res);
3840
0
    else
3841
0
        proto_item_append_text(ti, " (%.0lf)", res);
3842
0
}
3843
3844
static void decode_smart_resp_temps(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
3845
0
{
3846
0
    proto_item *ti;
3847
0
    unsigned bytes;
3848
0
    unsigned poff;
3849
0
    unsigned max_bytes;
3850
0
    unsigned i;
3851
3852
3853
0
    poff = (off < 200) ? 200-off : 0;
3854
3855
0
    if (off > 214 || (poff + 2) > len)
3856
0
        return;
3857
3858
0
    bytes = len - poff;
3859
0
    max_bytes = (off <= 200) ? 16 : (216 - off);
3860
3861
0
    if (bytes > max_bytes)
3862
0
        bytes = max_bytes;
3863
3864
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[0],  cmd_tvb, poff, bytes, ENC_NA);
3865
0
    grp =  proto_item_add_subtree(ti, ett_data);
3866
0
    for (i = 0; i < 8; i++) {
3867
0
        unsigned pos = 200 + i * 2;
3868
0
        unsigned rel;
3869
0
        if (nvme_field_in_window(off, len, pos, 2, &rel))
3870
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[i+1],  cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
3871
0
    }
3872
0
}
3873
3874
static void dissect_nvme_get_logpage_smart_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
3875
0
{
3876
0
    proto_tree *grp;
3877
0
    unsigned rel;
3878
3879
0
    if (off >= 512)
3880
0
        return; /* max allowed offset is < 512 */
3881
3882
0
    grp =  proto_item_add_subtree(ti, ett_data);
3883
0
    if (nvme_field_in_window(off, len, 0, 1, &rel))
3884
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_smart_cw));
3885
0
    if (nvme_field_in_window(off, len, 1, 2, &rel))
3886
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ct,  cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
3887
0
    if (nvme_field_in_window(off, len, 3, 1, &rel))
3888
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_asc,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3889
0
    if (nvme_field_in_window(off, len, 4, 1, &rel))
3890
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ast,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3891
0
    if (nvme_field_in_window(off, len, 5, 1, &rel))
3892
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_lpu,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
3893
0
    if (nvme_field_in_window(off, len, 6, 1, &rel))
3894
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_smart_egcws));
3895
0
    if (nvme_field_in_window(off, len, 7, 25, &rel))
3896
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd0,  cmd_tvb, rel, 25, ENC_NA);
3897
0
    if (nvme_field_in_window(off, len, 32, 16, &rel)) {
3898
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_dur,  cmd_tvb, rel, 16, ENC_NA);
3899
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 16);
3900
0
    }
3901
0
    if (nvme_field_in_window(off, len, 48, 16, &rel)) {
3902
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_duw,  cmd_tvb, rel, 16, ENC_NA);
3903
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 16);
3904
0
    }
3905
0
    if (nvme_field_in_window(off, len, 64, 16, &rel)) {
3906
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hrc,  cmd_tvb, rel, 16, ENC_NA);
3907
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3908
0
    }
3909
0
    if (nvme_field_in_window(off, len, 80, 16, &rel)) {
3910
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hwc,  cmd_tvb, rel, 16, ENC_NA);
3911
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3912
0
    }
3913
0
    if (nvme_field_in_window(off, len, 96, 16, &rel)) {
3914
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cbt,  cmd_tvb, rel, 16, ENC_NA);
3915
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3916
0
    }
3917
0
    if (nvme_field_in_window(off, len, 112, 16, &rel)) {
3918
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_pc,  cmd_tvb, rel, 16, ENC_NA);
3919
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3920
0
    }
3921
0
    if (nvme_field_in_window(off, len, 128, 16, &rel)) {
3922
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_poh,  cmd_tvb, rel, 16, ENC_NA);
3923
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3924
0
    }
3925
0
    if (nvme_field_in_window(off, len, 144, 16, &rel)) {
3926
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_us,  cmd_tvb, rel, 16, ENC_NA);
3927
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3928
0
    }
3929
0
    if (nvme_field_in_window(off, len, 160, 16, &rel)) {
3930
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_mie,  cmd_tvb, rel, 16, ENC_NA);
3931
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3932
0
    }
3933
0
    if (nvme_field_in_window(off, len, 176, 16, &rel)) {
3934
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ele,  cmd_tvb, rel, 16, ENC_NA);
3935
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
3936
0
    }
3937
0
    if (nvme_field_in_window(off, len, 192, 4, &rel))
3938
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_wctt,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
3939
0
    if (nvme_field_in_window(off, len, 196, 4, &rel))
3940
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cctt,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
3941
3942
0
    decode_smart_resp_temps(grp, cmd_tvb, off, len);
3943
3944
0
    if (off <= 216 && (220 -off) <= len)
3945
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1c,  cmd_tvb, 216-off, 4, ENC_LITTLE_ENDIAN);
3946
0
    if (off <= 220 && (224 -off) <= len)
3947
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2c,  cmd_tvb, 220-off, 4, ENC_LITTLE_ENDIAN);
3948
0
    if (off <= 224 && (228 -off) <= len)
3949
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1t,  cmd_tvb, 224-off, 4, ENC_LITTLE_ENDIAN);
3950
0
    if (off <= 228 && (232 -off) <= len)
3951
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2t,  cmd_tvb, 228-off, 4, ENC_LITTLE_ENDIAN);
3952
0
    if (off < 512) {
3953
0
        unsigned poff = (off < 232) ? (232 - off) : 0;
3954
0
        unsigned max_len = (off <= 232) ? 280 : 512 - off;
3955
0
        if (len > poff) {
3956
0
            len -= poff;
3957
0
            if (len > max_len)
3958
0
                len = max_len;
3959
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd1,  cmd_tvb, poff, len, ENC_NA);
3960
0
        }
3961
0
    }
3962
0
}
3963
3964
static void decode_fw_slot_frs(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned len)
3965
0
{
3966
0
    proto_item *ti;
3967
0
    unsigned bytes;
3968
0
    unsigned poff;
3969
0
    unsigned max_bytes;
3970
0
    unsigned i;
3971
3972
3973
    /* poff is cmd_tvb-relative (cmd_tvb byte 0 == struct byte `off`): for
3974
     * off < 8, struct offset 8 (where the frs array starts) is still ahead
3975
     * of the window, at tvb position (8-off); for off >= 8, the window
3976
     * already begins inside-or-past the frs array, so the array's group
3977
     * item starts at tvb position 0.  This previously read ": off" instead
3978
     * of ": 0" -- dimensionally wrong (mixing a struct-absolute offset into
3979
     * a tvb-relative position) and never reachable/tested before the
3980
     * DOFST/LPO windowing fix, since off was always 0 here beforehand. */
3981
0
    poff = (off < 8) ? 8-off : 0;
3982
3983
0
    if (off > 56 || (poff + 8) > len)
3984
0
        return;
3985
3986
0
    bytes = len - poff;
3987
0
    max_bytes = (off <= 8) ? 56 : (64 - off);
3988
3989
0
    if (bytes > max_bytes)
3990
0
        bytes = max_bytes;
3991
3992
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs,  cmd_tvb, poff, bytes, ENC_NA);
3993
0
    grp =  proto_item_add_subtree(ti, ett_data);
3994
0
    for (i = 0; i < 7; i++) {
3995
0
        unsigned pos = 8 + i * 8;
3996
0
        unsigned rel;
3997
0
        if (nvme_field_in_window(off, len, pos, 8, &rel))
3998
            /* Base 2.3 Fig 212: "The firmware revision is indicated as an
3999
             * ASCII string." The raw bytes remain visible in the hex dump
4000
             * of the reassembled message if needed. */
4001
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs_ascii[i],  cmd_tvb, rel, 8, ENC_ASCII);
4002
0
    }
4003
0
}
4004
4005
static void dissect_nvme_get_logpage_fw_slot_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
4006
0
{
4007
0
    proto_tree *grp;
4008
0
    unsigned rel;
4009
4010
0
    if (off >= 512)
4011
0
        return;  /* max allowed offset is < 512 */
4012
4013
0
    grp =  proto_item_add_subtree(ti, ett_data);
4014
4015
0
    if (!off && len >= 1)
4016
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_fw_slot_afi));
4017
0
    if (nvme_field_in_window(off, len, 1, 7, &rel))
4018
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd0,  cmd_tvb, rel, 7, ENC_LITTLE_ENDIAN);
4019
4020
0
    decode_fw_slot_frs(grp, cmd_tvb, off, len);
4021
4022
0
    if (off < 512) {
4023
0
        unsigned poff = (off < 64) ? (64 - off) : 0;
4024
0
        unsigned max_len = (off <= 64) ? 448 : 512 - off;
4025
        /* Guard before subtracting: len < poff would otherwise underflow
4026
         * `len` (unsigned) to a huge value on a short/truncated transfer. */
4027
0
        if (len > poff) {
4028
0
            len -= poff;
4029
0
            if (len > max_len)
4030
0
                len = max_len;
4031
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd1,  cmd_tvb, poff, len, ENC_NA);
4032
0
        }
4033
0
    }
4034
0
}
4035
4036
static void dissect_nvme_get_logpage_changed_nslist_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len)
4037
0
{
4038
0
    proto_tree *grp;
4039
0
    unsigned poff = 0;
4040
    /* Page is 1024 four-byte entries = 4096 bytes; a nonzero window offset
4041
     * moves where the spec-mandated 4096-byte ceiling falls relative to
4042
     * this window, and (if 4-byte aligned) where cmd_tvb position 0 lands
4043
     * relative to an entry boundary -- see the alignment guard below. */
4044
0
    unsigned max_len = (off < 4096) ? (4096 - off) : 0;
4045
4046
0
    if (len > max_len)
4047
0
        len = max_len;
4048
4049
0
    if (!nvme_offset_record_aligned(off, 4)) {
4050
0
        expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned);
4051
0
        return;
4052
0
    }
4053
4054
0
    grp =  proto_item_add_subtree(ti, ett_data);
4055
0
    while (len >= 4) {
4056
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_changed_nslist,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN);
4057
0
        len -= 4;
4058
0
        poff += 4;
4059
0
    }
4060
0
}
4061
4062
static const value_string lockdown_scope_tbl[] = {
4063
    { 0, "Admin Command Set opcodes" },
4064
    { 2, "Feature Identifiers" },
4065
    { 3, "Management Interface Command Set opcodes" },
4066
    { 4, "PCIe Command Set opcodes" },
4067
    { 0, NULL }
4068
};
4069
4070
static const value_string lockdown_contents_tbl[] = {
4071
    { 0, "Can-be-prohibited list" },
4072
    { 1, "Currently prohibited (Admin Submission Queue)" },
4073
    { 2, "Currently prohibited (out-of-band Management Endpoint)" },
4074
    { 0, NULL }
4075
};
4076
4077
static const value_string cmd_eff_cse_tbl[] = {
4078
    { 0, "No command submission or execution restriction" },
4079
    { 1, "One concurrent command per namespace" },
4080
    { 2, "One concurrent command per system" },
4081
    { 0, NULL}
4082
};
4083
4084
static void dissect_nvme_get_logpage_cmd_sup_and_eff_grp(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned poff, unsigned nrec, unsigned fidx, bool acs)
4085
0
{
4086
0
    unsigned i;
4087
0
    proto_item *ti;
4088
0
    proto_tree *ent;
4089
0
    for (i = 0; i < nrec; i++) {
4090
0
        if (acs)
4091
0
            ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_cmd_and_eff_cs, cmd_tvb, poff, 4, NULL, "Admin Command Supported %u (ACS%u)", fidx+i, fidx+i);
4092
0
        else
4093
0
            ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_cmd_and_eff_cs, cmd_tvb, poff, 4, NULL, "I/O Command Supported %u (IOCS%u)", fidx+i, fidx+i);
4094
0
        ent =  proto_item_add_subtree(ti, ett_data);
4095
0
        add_group_mask_entry(cmd_tvb, ent, poff, 4, ASPEC(hf_nvme_get_logpage_cmd_and_eff_cseds));
4096
0
        poff += 4;
4097
0
    }
4098
0
}
4099
4100
4101
static void dissect_nvme_get_logpage_cmd_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4102
0
{
4103
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
4104
0
    proto_tree *grp;
4105
0
    unsigned nrec = 0;
4106
0
    unsigned fidx;
4107
4108
0
    off += tr_off;
4109
0
    if (cmd_ctx->cmd_ctx.get_logpage.off >= 4096)
4110
0
        return; /* max allowed offset is < 4096, so we do not loose bits by casting to unsigned type */
4111
4112
0
    grp =  proto_item_add_subtree(ti, ett_data);
4113
0
    if (off <= 1024 && len >= 4) {
4114
0
        fidx = off / 4;
4115
0
        nrec = (1024-off) / 4;
4116
0
        if (nrec > (len / 4))
4117
0
            nrec = len / 4;
4118
0
        dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, 0, nrec, fidx, true);
4119
0
    }
4120
4121
0
    nrec = len / 4 - nrec;
4122
0
    if (!nrec)
4123
0
        return;
4124
0
    if (nrec > 256)
4125
0
        nrec = 256;
4126
4127
0
    fidx = (off > 1024) ? (off - 1024) / 4 : 0;
4128
0
    off = (off < 1024) ? (1024 - off) : 0;
4129
4130
0
    dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, off, nrec, fidx, false);
4131
0
}
4132
4133
static const value_string stest_type_active_tbl[] = {
4134
    { 0,  "No device self-test operation in progress" },
4135
    { 1,  "Short device self-test operation in progress" },
4136
    { 2,  "Extended device self-test operation in progress" },
4137
    { 3,  "Host-Initiated Refresh operation" },
4138
    { 0xE,  "Vendor Specific" },
4139
    { 0, NULL}
4140
};
4141
4142
static const value_string stest_result_tbl[] = {
4143
    { 0, "Operation completed without error" },
4144
    { 1, "Operation was aborted by a Device Self-test command" },
4145
    { 2, "Operation was aborted by a Controller Level Reset" },
4146
    { 3, "Operation was aborted due to a removal of a namespace from the namespace inventory" },
4147
    { 4, "Operation was aborted due to the processing of a Format NVM command" },
4148
    { 5, "A fatal error or unknown test error occurred while the controller was executing the device self-test operation and the operation did not complete" },
4149
    { 6, "Operation completed with a segment that failed and the segment that failed is not known" },
4150
    { 7, "Operation completed with one or more failed segments and the first segment that failed is indicated in the Segment Number field" },
4151
    { 8, "Operation was aborted for unknown reason" },
4152
    { 9, "Operation was aborted due to a sanitize operation" },
4153
    { 0xF, "Entry not used (does not contain a test result)" },
4154
    {  0, NULL}
4155
};
4156
4157
/* DSTC of a *completed* result (Base 2.3 Figure 216), not the in-progress
4158
 * operation status of Figure 215 that stest_type_active_tbl names. */
4159
static const value_string stest_type_done_tbl[] = {
4160
    { 0,  "Entry is empty" },
4161
    { 1,  "Short device self-test operation" },
4162
    { 2,  "Extended device self-test operation" },
4163
    { 3,  "Host-Initiated Refresh operation" },
4164
    { 0xE,  "Vendor Specific" },
4165
    { 0, NULL}
4166
};
4167
4168
static void dissect_nvme_get_logpage_selftest_result(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned tst_idx)
4169
0
{
4170
0
    proto_item *ti;
4171
4172
    /* Base 2.3 Figure 216: the Self-test Result data structure is 28 bytes
4173
     * (23:00 plus STCT/STC/VS at 27:24), which is also the stride the caller
4174
     * walks. */
4175
0
    ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_selftest_res, cmd_tvb, off, 28, NULL,
4176
0
                                "Latest Self-test Result Data Structure (latest %u)", tst_idx);
4177
0
    grp =  proto_item_add_subtree(ti, ett_data);
4178
0
    add_group_mask_entry(cmd_tvb, grp, off, 1, ASPEC(hf_nvme_get_logpage_selftest_res_status));
4179
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sn, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN);
4180
0
    add_group_mask_entry(cmd_tvb, grp, off+2, 1, ASPEC(hf_nvme_get_logpage_selftest_res_vdi));
4181
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_rsvd, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
4182
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_poh, cmd_tvb, off+4, 8, ENC_LITTLE_ENDIAN);
4183
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_nsid, cmd_tvb, off+12, 4, ENC_LITTLE_ENDIAN);
4184
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_flba, cmd_tvb, off+16, 8, ENC_LITTLE_ENDIAN);
4185
0
    add_group_mask_entry(cmd_tvb, grp, off+24, 1, ASPEC(hf_nvme_get_logpage_selftest_res_sct));
4186
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sc, cmd_tvb, off+25, 1, ENC_LITTLE_ENDIAN);
4187
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_vs, cmd_tvb, off+26, 2, ENC_LITTLE_ENDIAN);
4188
0
}
4189
4190
static void dissect_nvme_get_logpage_selftest_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4191
0
{
4192
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
4193
0
    proto_tree *grp;
4194
0
    unsigned tst_idx;
4195
4196
0
    off += tr_off;
4197
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 536)
4198
0
        return; /* max offset is <= 536, so we do not loose bits by casting to unsigned type */
4199
4200
0
    grp =  proto_item_add_subtree(ti, ett_data);
4201
4202
0
    if (!off && len >= 1)
4203
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_selftest_csto));
4204
0
    if (off <= 1 && (2 - off) <= len)
4205
0
        add_group_mask_entry(cmd_tvb, grp, 1-off, 1, ASPEC(hf_nvme_get_logpage_selftest_cstc));
4206
0
    if (off <= 2 && (4 - off) <= len)
4207
0
         proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_rsvd, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN);
4208
4209
0
    if (off <= 4) {
4210
0
        unsigned skip = 4 - off;                 /* cmd_tvb pos of result 0 */
4211
0
        if (len < skip)
4212
0
            return;
4213
0
        len -= skip;
4214
0
        tst_idx = 0;
4215
0
        off = skip;
4216
0
    } else {
4217
0
        unsigned skip;
4218
0
        tst_idx = (off - 4 + 27) / 28;            /* first fully-contained result */
4219
0
        skip = tst_idx * 28 - (off - 4);          /* cmd_tvb pos of result[tst_idx] */
4220
0
        if (len < skip)
4221
0
            return;
4222
0
        len -= skip;
4223
0
        off = skip;
4224
0
    }
4225
0
    while (len >= 28) {
4226
0
        dissect_nvme_get_logpage_selftest_result(grp, cmd_tvb, off, tst_idx);
4227
0
        off += 28;
4228
0
        len -= 28;
4229
0
        tst_idx++;
4230
0
    }
4231
0
}
4232
4233
/* NVMe Base 2.3 "Telemetry Host-Initiated Log Page" / "Telemetry
4234
 * Controller-Initiated Log Page" (Telemetry Scope) */
4235
static const value_string telemetry_scope_tbl[] = {
4236
    { 0, "Not reported" },
4237
    { 1, "Controller" },
4238
    { 2, "NVM subsystem" },
4239
    { 0, NULL },
4240
};
4241
4242
static void dissect_nvme_get_logpage_telemetry_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4243
0
{
4244
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off  & 0xffffffff; /* need unsigned type to silence clang-11 errors */
4245
0
    proto_tree *grp;
4246
0
    uint64_t next_block;
4247
0
    uint32_t poff;
4248
0
    bool host_init = (cmd_ctx->cmd_ctx.get_logpage.lid == 0x7);
4249
0
    const char *pfx = host_init ? "Host-Initiated" : "Controller-Initiated";
4250
4251
0
    off += tr_off;
4252
    /* off==0 means the window starts at the very beginning of the log page
4253
     * (the 512-byte header), so poff must skip past it to reach data block 1.
4254
     * Any other exact multiple of 512 means the window already starts at a
4255
     * data block boundary, so poff must be 0, not another full 512 skip. */
4256
0
    poff = (off == 0) ? 512 : (512 - (off & 0x1ff)) % 512;
4257
0
    next_block = (off + poff) / 512;
4258
4259
0
    grp =  proto_item_add_subtree(ti, ett_data);
4260
4261
4262
0
    if (poff >= len && cmd_ctx->cmd_ctx.get_logpage.off >= 384)
4263
0
        return;
4264
4265
0
    if (!off && len >= 1)
4266
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_li, cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN);
4267
0
    if (off <= 1 && (5 - off) <= len)
4268
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd0, cmd_tvb, 1-off, 4, ENC_LITTLE_ENDIAN);
4269
0
    if (off <= 5 && (8 - off) <= len)
4270
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ieee, cmd_tvb, 5-off, 3, ENC_LITTLE_ENDIAN);
4271
0
    if (off <= 8 && (10 - off) <= len)
4272
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da1lb, cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN);
4273
0
    if (off <= 10 && (12 - off) <= len)
4274
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da2lb, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN);
4275
0
    if (off <= 12 && (14 - off) <= len)
4276
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da3lb, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN);
4277
0
    if (off <= 14 && (16 - off) <= len)
4278
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd1, cmd_tvb, 14-off, 2, ENC_NA);
4279
0
    if (off <= 16 && (20 - off) <= len)
4280
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da4lb, cmd_tvb, 16-off, 4, ENC_LITTLE_ENDIAN);
4281
0
    if (host_init) {
4282
        /* Telemetry Host-Initiated Log Page: bytes 379:20 reserved, 380 THS,
4283
         * 381 THDGN */
4284
0
        if (off <= 20 && (380 - off) <= len)
4285
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd2, cmd_tvb, 20-off, 360, ENC_NA);
4286
0
        if (off <= 380 && (381 - off) <= len)
4287
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_scope, cmd_tvb, 380-off, 1, ENC_LITTLE_ENDIAN);
4288
0
        if (off <= 381 && (382 - off) <= len)
4289
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_hdgn, cmd_tvb, 381-off, 1, ENC_LITTLE_ENDIAN);
4290
0
    } else {
4291
        /* Telemetry Controller-Initiated Log Page: bytes 380:20 reserved,
4292
         * 381 TCS */
4293
0
        if (off <= 20 && (381 - off) <= len)
4294
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd2, cmd_tvb, 20-off, 361, ENC_NA);
4295
0
        if (off <= 381 && (382 - off) <= len)
4296
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_scope, cmd_tvb, 381-off, 1, ENC_LITTLE_ENDIAN);
4297
0
    }
4298
0
    if (off <= 382 && (383 - off) <= len)
4299
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da, cmd_tvb, 382-off, 1, ENC_LITTLE_ENDIAN);
4300
0
    if (off <= 383 && (384 - off) <= len)
4301
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_dgn, cmd_tvb, 383-off, 1, ENC_LITTLE_ENDIAN);
4302
0
    if (off <= 384 && (512 - off) <= len)
4303
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ri, cmd_tvb, 384-off, 128, ENC_NA);
4304
4305
0
    if (len < poff)
4306
0
        return;
4307
0
    len -= poff;
4308
0
    while (len >= 512) {
4309
0
         proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_telemetry_db, cmd_tvb, poff, 512, NULL,
4310
0
                                           "Telemetry %s data block %"PRIu64, pfx, next_block);
4311
0
        len -= 512;
4312
0
        next_block++;
4313
0
        poff += 512;
4314
0
    }
4315
0
}
4316
4317
static void dissect_nvme_get_logpage_egroup_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
4318
0
{
4319
0
    proto_tree *grp;
4320
0
    unsigned rel;
4321
4322
    /* Figure 222 carries no Endurance Group Identifier: the subject of the log
4323
     * page is named only by the Log Specific Identifier of the request
4324
     * (NVMe Base 2.3 section 5.2.12.1.9 and Figure 221), so without this the
4325
     * responses for two Endurance Groups are indistinguishable in the tree.
4326
     * No "was the request seen" guard is needed: the caller selects this
4327
     * decoder on the stored LID, which is 0h when the request was not seen,
4328
     * so reaching here means the request supplied both LID and LSI. */
4329
0
    proto_item_append_text(ti, ", Endurance Group %u", cmd_ctx->cmd_ctx.get_logpage.lsi);
4330
4331
0
    if (off >= 512)
4332
0
        return; /* max allowed offset is < 512 */
4333
4334
0
    grp =  proto_item_add_subtree(ti, ett_data);
4335
0
    if (nvme_field_in_window(off, len, 0, 1, &rel))
4336
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_egroup_cw));
4337
0
    if (nvme_field_in_window(off, len, 1, 1, &rel))
4338
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_egroup_egfeat));
4339
0
    if (nvme_field_in_window(off, len, 2, 1, &rel))
4340
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd0,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4341
0
    if (nvme_field_in_window(off, len, 3, 1, &rel))
4342
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_as,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4343
0
    if (nvme_field_in_window(off, len, 4, 1, &rel))
4344
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ast,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4345
0
    if (nvme_field_in_window(off, len, 5, 1, &rel))
4346
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_pu,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4347
0
    if (nvme_field_in_window(off, len, 6, 2, &rel))
4348
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_did,  cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
4349
0
    if (nvme_field_in_window(off, len, 8, 24, &rel))
4350
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd1,  cmd_tvb, rel, 24, ENC_NA);
4351
0
    if (nvme_field_in_window(off, len, 32, 16, &rel)) {
4352
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ee,  cmd_tvb, rel, 16, ENC_NA);
4353
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4354
0
    }
4355
0
    if (nvme_field_in_window(off, len, 48, 16, &rel)) {
4356
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_dur,  cmd_tvb, rel, 16, ENC_NA);
4357
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4358
0
    }
4359
0
    if (nvme_field_in_window(off, len, 64, 16, &rel)) {
4360
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_duw,  cmd_tvb, rel, 16, ENC_NA);
4361
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4362
0
    }
4363
0
    if (nvme_field_in_window(off, len, 80, 16, &rel)) {
4364
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_muw,  cmd_tvb, rel, 16, ENC_NA);
4365
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4366
0
    }
4367
0
    if (nvme_field_in_window(off, len, 96, 16, &rel)) {
4368
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hrc,  cmd_tvb, rel, 16, ENC_NA);
4369
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4370
0
    }
4371
0
    if (nvme_field_in_window(off, len, 112, 16, &rel)) {
4372
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hwc,  cmd_tvb, rel, 16, ENC_NA);
4373
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4374
0
    }
4375
0
    if (nvme_field_in_window(off, len, 128, 16, &rel)) {
4376
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_mdie,  cmd_tvb, rel, 16, ENC_NA);
4377
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4378
0
    }
4379
0
    if (nvme_field_in_window(off, len, 144, 16, &rel)) {
4380
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ele,  cmd_tvb, rel, 16, ENC_NA);
4381
0
        post_add_intval_from_16bytes(ti, cmd_tvb, rel);
4382
0
    }
4383
0
    if (nvme_field_in_window(off, len, 160, 16, &rel)) {
4384
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_tegcap,  cmd_tvb, rel, 16, ENC_NA);
4385
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 0);
4386
0
    }
4387
0
    if (nvme_field_in_window(off, len, 176, 16, &rel)) {
4388
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_uegcap,  cmd_tvb, rel, 16, ENC_NA);
4389
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 0);
4390
0
    }
4391
0
    if (off <= 508 && (512 - off) <= len) {
4392
0
        unsigned poff = (off <= 192) ? (192 - off) : 0;
4393
        /* poff isn't derived from (512-off), so the guard above doesn't by
4394
         * itself guarantee poff <= len -- check explicitly before subtracting. */
4395
0
        if (poff <= len) {
4396
            /* Remaining room at tvb position poff is (512-off)-poff, not the
4397
             * raw len -- an oversized/malformed len must not render bytes
4398
             * past the structure's real 512-byte end as "Reserved2". */
4399
0
            unsigned max_len = (512 - off) - poff;
4400
0
            unsigned rlen = len - poff;
4401
0
            if (rlen > max_len)
4402
0
                rlen = max_len;
4403
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd2,  cmd_tvb, poff, rlen, ENC_NA);
4404
0
        }
4405
0
    }
4406
0
}
4407
static const value_string plat_status_tbl[] = {
4408
    { 0,  "Predictable Latency Mode not Enabled" },
4409
    { 1,  "Deterministic Window (DTWIN)" },
4410
    { 2,  "Non-Deterministic Window (NDWIN)" },
4411
    { 0, NULL}
4412
};
4413
4414
static void dissect_nvme_get_logpage_pred_lat_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
4415
0
{
4416
0
    proto_tree *grp;
4417
0
    unsigned poff;
4418
0
    unsigned rel;
4419
4420
    /* As for the Endurance Group log page above: Figure 224 does not echo the
4421
     * NVM Set Identifier, which is carried only in the Log Specific Identifier
4422
     * of the request (NVMe Base 2.3 section 5.2.12.1.11 and Figure 223).
4423
     * There is one such log page per NVM Set, so the label is what tells them
4424
     * apart. */
4425
0
    proto_item_append_text(ti, ", NVM Set %u", cmd_ctx->cmd_ctx.get_logpage.lsi);
4426
4427
0
    if (off > 508)
4428
0
        return; /* max allowed offset is < 508 */
4429
4430
0
    grp =  proto_item_add_subtree(ti, ett_data);
4431
0
    if (nvme_field_in_window(off, len, 0, 1, &rel))
4432
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_pred_lat_status));
4433
0
    if (nvme_field_in_window(off, len, 1, 1, &rel))
4434
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd0,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4435
0
    if (nvme_field_in_window(off, len, 2, 2, &rel))
4436
0
        add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_pred_lat_etype));
4437
0
    if (nvme_field_in_window(off, len, 4, 28, &rel))
4438
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd1,  cmd_tvb, rel, 28, ENC_NA);
4439
0
    if (nvme_field_in_window(off, len, 32, 8, &rel))
4440
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_rt,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4441
0
    if (nvme_field_in_window(off, len, 40, 8, &rel))
4442
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_wt,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4443
0
    if (nvme_field_in_window(off, len, 48, 8, &rel))
4444
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_tm,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4445
0
    if (nvme_field_in_window(off, len, 56, 8, &rel))
4446
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tmh,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4447
0
    if (nvme_field_in_window(off, len, 64, 8, &rel))
4448
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tml,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4449
0
    if (nvme_field_in_window(off, len, 72, 56, &rel))
4450
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd2,  cmd_tvb, rel, 56, ENC_NA);
4451
0
    if (nvme_field_in_window(off, len, 128, 8, &rel))
4452
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_re,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4453
0
    if (nvme_field_in_window(off, len, 136, 8, &rel))
4454
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_we,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4455
0
    if (nvme_field_in_window(off, len, 144, 8, &rel))
4456
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_te,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4457
0
    poff = (off <= 152) ? (152 - off) : 0;
4458
0
    if (poff > len)
4459
0
        return;
4460
0
    {
4461
        /* Remaining room at tvb position poff is (512-off)-poff, not the
4462
         * raw len -- an oversized/malformed len must not render bytes past
4463
         * the structure's real 512-byte end as "Reserved3". */
4464
0
        unsigned max_len = (512 - off) - poff;
4465
0
        unsigned rlen = len - poff;
4466
0
        if (rlen > max_len)
4467
0
            rlen = max_len;
4468
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd3,  cmd_tvb, poff, rlen, ENC_NA);
4469
0
    }
4470
0
}
4471
4472
static void dissect_nvme_get_logpage_pred_lat_aggreg_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4473
0
{
4474
0
    uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off;
4475
0
    proto_tree *grp;
4476
0
    unsigned poff;
4477
4478
0
    off += tr_off;
4479
0
    if (off < 8) {
4480
0
        poff = (unsigned)(off & 0x7);
4481
0
        poff = 8 - poff;
4482
0
    } else {
4483
0
        poff = 0;
4484
0
    }
4485
0
    if (len < (poff + 2) && off)
4486
0
        return; /* nothing to display */
4487
4488
0
    grp =  proto_item_add_subtree(ti, ett_data);
4489
0
    if (!off && len >= 8)
4490
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_ne,  cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
4491
0
    if (len < poff)
4492
0
        return;
4493
0
    len -= poff;
4494
0
    while (len >= 2) {
4495
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_nset,  cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN);
4496
0
        poff += 2;
4497
0
        len -= 2;
4498
0
    }
4499
0
}
4500
4501
static const value_string ana_state_tbl[] = {
4502
    { 0x1,  "ANA Optimized State" },
4503
    { 0x2,  "ANA Non-Optimized State" },
4504
    { 0x3,  "ANA Inaccessible State" },
4505
    { 0x4,  "ANA Persistent Loss State" },
4506
    { 0xF,  "ANA Change State" },
4507
    { 0, NULL}
4508
};
4509
4510
static unsigned dissect_nvme_get_logpage_ana_resp_grp(proto_tree *grp, tvbuff_t *cmd_tvb,  struct nvme_cmd_ctx *cmd_ctx, unsigned len, uint32_t poff)
4511
0
{
4512
0
    unsigned done = 0;
4513
0
    unsigned bytes;
4514
0
    proto_item *ti;
4515
0
    unsigned group_id;
4516
0
    unsigned nns;
4517
0
    unsigned prev_off = cmd_ctx->cmd_ctx.get_logpage.tr_off;
4518
4519
0
    if (len < 4) {
4520
0
        if (prev_off)
4521
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += len;
4522
0
        return 0;
4523
0
    }
4524
4525
0
    if (prev_off <= 4) {
4526
0
        if ((len + prev_off) < 8) {
4527
            /* The entry guard above only proves the 4-byte ANA Group ID is
4528
             * present.  Number of NSID Values (NVMe Base 2.3 Figure 228,
4529
             * bytes 07:04) needs 4 more, so a window holding 4..7 bytes of a
4530
             * fresh descriptor cannot be read for it -- reading anyway threw
4531
             * a bounds exception and rendered the whole frame malformed
4532
             * instead of decoding the Group ID that did arrive. */
4533
0
            nns = 0;
4534
0
            bytes = len;
4535
0
        } else {
4536
0
            nns = tvb_get_uint32(cmd_tvb, poff+4-prev_off, ENC_LITTLE_ENDIAN);
4537
0
            bytes = 32 + 4 * nns;
4538
0
            cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns;
4539
0
        }
4540
0
    } else if (prev_off ) {
4541
0
        nns = cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries;
4542
0
        bytes = (prev_off > 32) ? 4 * nns : ((32-prev_off) + 4 * nns);
4543
0
    } else {
4544
0
        bytes = len;
4545
0
    }
4546
4547
0
    if (bytes > len)
4548
0
            bytes = len;
4549
4550
0
    ti = proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_ana_grp, cmd_tvb, poff, bytes, NULL,
4551
0
            "ANA Group Descriptor");
4552
0
    grp =  proto_item_add_subtree(ti, ett_data);
4553
4554
0
    if (prev_off) {
4555
0
        group_id = cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id;
4556
0
        proto_item_append_text(ti, " %u (continued)", group_id);
4557
0
    } else {
4558
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_grp_id,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN, &group_id);
4559
0
        done += 4;
4560
0
        proto_item_append_text(ti, " %u", group_id);
4561
0
        cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = group_id;
4562
0
    }
4563
4564
0
    if (prev_off <= 4) {
4565
0
        if ((len - done) < 4) {
4566
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
4567
0
            return done;
4568
0
        }
4569
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nns,  cmd_tvb, poff+4-prev_off, 4, ENC_LITTLE_ENDIAN);
4570
0
        done += 4;
4571
0
    }
4572
0
    if (prev_off <= 8) {
4573
0
        if ((len - done) < 8) {
4574
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
4575
0
            return done;
4576
0
        }
4577
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_chcnt,  cmd_tvb, poff+8-prev_off, 8, ENC_LITTLE_ENDIAN);
4578
0
        done += 8;
4579
0
    }
4580
4581
0
    if (prev_off <= 16) {
4582
0
        if ((len - done) < 1) {
4583
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
4584
0
            return done;
4585
0
        }
4586
0
        add_group_mask_entry(cmd_tvb, grp, poff+16-prev_off, 1, ASPEC(hf_nvme_get_logpage_ana_grp_anas));
4587
0
        done += 1;
4588
0
    }
4589
4590
0
    if (prev_off <= 17) {
4591
0
        if ((len - done) < 15) {
4592
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
4593
0
            return done;
4594
0
        }
4595
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_rsvd,  cmd_tvb, poff+17-prev_off, 15, ENC_NA);
4596
0
        done += 15;
4597
0
    }
4598
4599
0
    poff += done;
4600
0
    while ((len - done) >= 4 && nns) {
4601
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nsid,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN);
4602
0
        poff += 4;
4603
0
        done += 4;
4604
0
        nns--;
4605
0
    }
4606
0
    if (nns) {
4607
0
        cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
4608
0
        cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns;
4609
0
    } else {
4610
0
        cmd_ctx->cmd_ctx.get_logpage.tr_off = 0;
4611
0
        cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = 0;
4612
0
        cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = 0;
4613
0
        cmd_ctx->cmd_ctx.get_logpage.records--;
4614
0
    }
4615
0
    return done;
4616
0
}
4617
4618
static unsigned dissect_nvme_get_logpage_ana_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off)
4619
0
{
4620
0
    unsigned groups=1;
4621
0
    if (!off && len >= 8)
4622
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_chcnt,  cmd_tvb, off, 8, ENC_LITTLE_ENDIAN);
4623
0
    if (off <= 8 && (10 - off) <= len)
4624
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_ngd,  cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN, &groups);
4625
0
    if (off <= 10 && (16 - off) <= len)
4626
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_rsvd,  cmd_tvb, 10-off, 6, ENC_LITTLE_ENDIAN);
4627
0
    return groups;
4628
0
}
4629
4630
static void dissect_nvme_get_logpage_ana_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4631
0
{
4632
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
4633
0
    proto_tree *grp;
4634
0
    unsigned poff = 0;
4635
0
    unsigned groups = 1;
4636
4637
0
    grp =  proto_item_add_subtree(ti, ett_data);
4638
0
    if (cmd_ctx->cmd_ctx.get_logpage.off < 16 && !tr_off) {
4639
0
        groups = dissect_nvme_get_logpage_ana_resp_header(grp, cmd_tvb, len, off);
4640
0
        cmd_ctx->cmd_ctx.get_logpage.records = groups;
4641
0
        poff = 16 - off;
4642
0
    } else if (tr_off) {
4643
0
        uint32_t combined = off + tr_off;
4644
0
        groups = cmd_ctx->cmd_ctx.get_logpage.records;
4645
        /* A continuation chunk can still start inside the 16-byte header
4646
         * (e.g. off < 16 too, just split across more than one message) --
4647
         * skip only the remaining header bytes, not the whole thing. */
4648
0
        poff = (combined < 16) ? (16 - combined) : 0;
4649
        /* NAGD (NVMe Base 2.3 Figure 227, bytes 09:08) lives in the 16-byte
4650
         * header, so a window that starts past it never supplies `records`.
4651
         * Over NVMe-MI that is every window, including the first: each
4652
         * transaction gets a freshly wmem_alloc0'd cmd_ctx, so `records` is 0
4653
         * and the walk below never ran at all.  NVMe-MI 2.1 Figure 136 caps
4654
         * DLEN at 4,096, so any ANA log page larger than that must be fetched
4655
         * with successive nonzero DOFST -- the normal path, not an edge case.
4656
         * Fall back to walking until the window is exhausted, the way
4657
         * dissect_nvme_get_logpage_ify_resp() does for NUMREC.  An ANA Group
4658
         * Descriptor is at least 32 bytes (Figure 228: 31:00 header, then the
4659
         * NSID list), so (len + 31) / 32 can never stop the walk early. */
4660
0
        if (!groups)
4661
0
            groups = (len + 31) / 32;
4662
0
    } else {
4663
        /* off >= 16 with tr_off == 0: the Get Log Page command's own Log Page
4664
         * Offset already starts this window past the 16-byte header, so NAGD
4665
         * is not in this message either and neither branch above ran --
4666
         * `groups` kept its initializer of 1 and exactly one descriptor
4667
         * rendered no matter how many the window held.  Same bound and same
4668
         * justification as the tr_off path. */
4669
0
        groups = cmd_ctx->cmd_ctx.get_logpage.records;
4670
0
        if (!groups)
4671
0
            groups = (len + 31) / 32;
4672
0
    }
4673
0
    if (len < poff)
4674
0
        return;
4675
0
    len -= poff;
4676
0
    while (len >= 4 && groups) {
4677
0
        unsigned done = dissect_nvme_get_logpage_ana_resp_grp(grp, cmd_tvb, cmd_ctx, len, poff);
4678
        /* A descriptor continuation that cannot make progress (the window
4679
         * holds fewer bytes than its next field needs) returns 0.  Without
4680
         * this the loop would keep re-rendering empty descriptor items until
4681
         * `groups` ran out -- harmless while `groups` was always the wire's
4682
         * NAGD, but not with the bound above. */
4683
0
        if (!done)
4684
0
            break;
4685
0
        poff += done;
4686
0
        len -= done;
4687
0
        groups--;
4688
0
    }
4689
0
}
4690
4691
static void dissect_nvme_get_logpage_lba_status_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off)
4692
0
{
4693
0
    if (!off && len >= 4)
4694
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lslplen,  cmd_tvb, off, 4, ENC_LITTLE_ENDIAN);
4695
0
    if (off <= 4 && (8 - off) <= len)
4696
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nlslne,  cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN);
4697
0
    if (off <= 8 && (12 - off) <= len)
4698
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_estulb,  cmd_tvb, 8-off, 4, ENC_LITTLE_ENDIAN);
4699
0
    if (off <= 12 && (14 - off) <= len)
4700
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_rsvd,  cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN);
4701
0
    if (off <= 14 && (16 - off) <= len)
4702
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lsgc,  cmd_tvb, 14-off, 2, ENC_LITTLE_ENDIAN);
4703
    /* The Namespace Element List item is added by the caller, over the same
4704
     * byte range; adding it here as well made the field match twice per
4705
     * frame. */
4706
0
}
4707
4708
static unsigned dissect_nvme_get_logpage_lba_status_lba_range(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t poff)
4709
0
{
4710
0
    uint32_t nlrd = 0;
4711
0
    uint64_t slen64;
4712
0
    unsigned slen, rem;
4713
0
    proto_item *ti;
4714
0
    proto_tree *rd;
4715
4716
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne,  cmd_tvb, poff, (len < 16) ? len : 16, ENC_NA);
4717
0
    grp =  proto_item_add_subtree(ti, ett_data);
4718
4719
0
    if (len >= 4)
4720
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_neid,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN);
4721
0
    if (len >= 8)
4722
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_lba_status_nel_ne_nlrd,  cmd_tvb, poff+4, 4, ENC_LITTLE_ENDIAN, &nlrd);
4723
0
    if (len >= 9)
4724
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_ratype,  cmd_tvb, poff+8, 1, ENC_LITTLE_ENDIAN);
4725
0
    if (len >= 16)
4726
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rsvd,  cmd_tvb, poff+9, 7, ENC_NA);
4727
4728
0
    if (len < 16)
4729
0
        return len;
4730
4731
    /* NVM CS 1.2 Figure 110: a Namespace Element is a 16-byte header followed
4732
     * by NLRD 16-byte LBA Range Descriptors (Figure 111), so the element is
4733
     * 16 * (NLRD + 1) bytes.  NLRD is a 32-bit field at 07:04 of *this*
4734
     * element, and FFFFFFFFh means no descriptor list is present.  Computed in
4735
     * 64-bit: NLRD is a raw wire value and 16 * (NLRD + 1) overflows 32 bits.
4736
     * The element length is what bounds the descriptor walk -- bounding it on
4737
     * the bytes remaining in the whole list instead swallowed every following
4738
     * Namespace Element into the first one. */
4739
0
    if (!nlrd || nlrd == 0xffffffff)
4740
0
        slen64 = 16;
4741
0
    else
4742
0
        slen64 = 16ULL * ((uint64_t)nlrd + 1);
4743
0
    slen = (slen64 > len) ? len : (unsigned)slen64;
4744
0
    proto_item_set_len(ti, slen);
4745
4746
0
    rem = slen - 16;
4747
0
    poff += 16;
4748
0
    while (rem >= 8) {
4749
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd,  cmd_tvb, poff, rem >= 16 ? 16 : rem, ENC_NA);
4750
0
        rd =  proto_item_add_subtree(ti, ett_data);
4751
0
        proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba, cmd_tvb, poff, 8, ENC_LITTLE_ENDIAN);
4752
0
        if (rem >= 12)
4753
0
            proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb, cmd_tvb, poff+8, 4, ENC_LITTLE_ENDIAN);
4754
0
        if (rem >= 16) {
4755
0
            proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd, cmd_tvb, poff+12, 4, ENC_LITTLE_ENDIAN);
4756
0
            poff += 16;
4757
0
            rem -= 16;
4758
0
        } else {
4759
0
            rem = 0;
4760
0
        }
4761
0
    }
4762
0
    return slen;
4763
0
}
4764
4765
static void dissect_nvme_get_logpage_lba_status_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4766
0
{
4767
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
4768
0
    proto_tree *grp = NULL;
4769
0
    unsigned poff = 0;
4770
4771
0
    off += tr_off;
4772
0
    if (off < 16) {
4773
0
        grp =  proto_item_add_subtree(ti, ett_data);
4774
0
        dissect_nvme_get_logpage_lba_status_resp_header(grp, cmd_tvb, len, off);
4775
0
        poff = 16 - off;
4776
0
    } else if (off & 15) {
4777
0
        poff = 16 - (off & 15);
4778
0
    }
4779
4780
0
    if (len < (poff + 8))
4781
0
        return;
4782
4783
0
    if (off >= 16)
4784
0
        grp =  proto_item_add_subtree(ti, ett_data);
4785
4786
0
    len -= poff;
4787
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel,  cmd_tvb, poff, len, ENC_NA);
4788
0
    grp =  proto_item_add_subtree(ti, ett_data);
4789
4790
0
    while (len >= 8) {
4791
0
        unsigned done = dissect_nvme_get_logpage_lba_status_lba_range(grp, cmd_tvb, len, poff);
4792
0
        poff += done;
4793
0
        len -= done;
4794
0
    }
4795
0
}
4796
4797
static void dissect_nvme_get_logpage_egroup_aggreg_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len)
4798
0
{
4799
0
    proto_tree *grp;
4800
0
    unsigned poff = 0;
4801
4802
0
    if (!tr_off) {
4803
0
        if (cmd_ctx->cmd_ctx.get_logpage.off < 8) {
4804
0
            poff = 8 - (unsigned)cmd_ctx->cmd_ctx.get_logpage.off;
4805
0
            if (poff > len || (cmd_ctx->cmd_ctx.get_logpage.off && poff == len))
4806
0
                return;
4807
0
        } else if (len < 2) {
4808
0
            return;
4809
0
        }
4810
0
    }
4811
4812
0
    len -= poff;
4813
0
    grp =  proto_item_add_subtree(ti, ett_data);
4814
0
    if (!(cmd_ctx->cmd_ctx.get_logpage.off + tr_off))
4815
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_ne, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
4816
0
    while (len >= 2) {
4817
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_eg, cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN);
4818
0
        len -= 2;
4819
0
        poff += 2;
4820
0
    }
4821
0
}
4822
4823
static const value_string rnlpt_tbl[] = {
4824
    { 0,  "Empty Log Page" },
4825
    { 1,  "Registration Preempted" },
4826
    { 2,  "Reservation Released" },
4827
    { 3,  "Reservation Preempted" },
4828
    { 0, NULL}
4829
};
4830
4831
static void dissect_nvme_get_logpage_reserv_notif_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
4832
0
{
4833
0
    proto_tree *grp;
4834
0
    unsigned poff = 0;
4835
0
    unsigned rel;
4836
4837
0
    if (off > 60)
4838
0
        return; /* max allowed offset is < 60 */
4839
4840
0
    grp =  proto_item_add_subtree(ti, ett_data);
4841
0
    if (nvme_field_in_window(off, len, 0, 8, &rel))
4842
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpc,  cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN);
4843
0
    if (nvme_field_in_window(off, len, 8, 1, &rel))
4844
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpt,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4845
0
    if (nvme_field_in_window(off, len, 9, 1, &rel))
4846
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nalp,  cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
4847
0
    if (nvme_field_in_window(off, len, 10, 2, &rel))
4848
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd0,  cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
4849
0
    if (nvme_field_in_window(off, len, 12, 4, &rel))
4850
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nsid,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4851
0
    if (off < 16) {
4852
0
        poff = 16 - off;
4853
0
        if (len <= poff)
4854
0
            return;
4855
0
        len -= poff;
4856
0
        if (len > 48)
4857
0
            len = 48; /* max padding size is 48 */
4858
0
    } else {
4859
0
        if (len > (64 - off))
4860
0
            len = 64 - off; /* max padding size is 48 */
4861
0
    }
4862
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd1, cmd_tvb, poff, len, ENC_NA);
4863
0
}
4864
4865
4866
/* Sanitize State (SANS) in the Sanitize State Information field; the Failure
4867
 * State (FAILS) field takes its values from the same set (NVMe Base 2.3
4868
 * "Sanitize Status Log Page"). */
4869
static const value_string san_sans_tbl[] = {
4870
    { 0, "Idle" },
4871
    { 1, "Restricted Processing" },
4872
    { 2, "Restricted Failure" },
4873
    { 3, "Unrestricted Processing" },
4874
    { 4, "Unrestricted Failure" },
4875
    { 5, "Media Verification" },
4876
    { 6, "Post-Verification Deallocation" },
4877
    { 0, NULL}
4878
};
4879
4880
static const value_string san_mrst_tbl[] = {
4881
    { 0, "The NVM subsystem has never been sanitized" },
4882
    { 1, "The most recent sanitize operation completed successfully" },
4883
    { 2, "A sanitize operation is currently in progress" },
4884
    { 3, "The most recent sanitize operation failed" },
4885
    { 4, "The most recent sanitize operation with No-Deallocate has completed successfully with deallocation of all logical blocks"},
4886
    { 0, NULL}
4887
};
4888
4889
static void dissect_nvme_get_logpage_sanitize_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
4890
0
{
4891
0
    proto_tree *grp;
4892
0
    unsigned poff = 0;
4893
0
    unsigned rel;
4894
4895
0
    if (off > 508)
4896
0
        return; /* max allowed offset is < 508 */
4897
4898
0
    grp =  proto_item_add_subtree(ti, ett_data);
4899
0
    if (nvme_field_in_window(off, len, 0, 2, &rel))
4900
0
         proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_sprog,  cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
4901
0
    if (nvme_field_in_window(off, len, 2, 2, &rel))
4902
0
        add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_sanitize_sstat));
4903
0
    if (nvme_field_in_window(off, len, 4, 4, &rel))
4904
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_scdw10,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4905
0
    if (nvme_field_in_window(off, len, 8, 4, &rel))
4906
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_eto,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4907
0
    if (nvme_field_in_window(off, len, 12, 4, &rel))
4908
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbe,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4909
0
    if (nvme_field_in_window(off, len, 16, 4, &rel))
4910
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etce,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4911
0
    if (nvme_field_in_window(off, len, 20, 4, &rel))
4912
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etond,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4913
0
    if (nvme_field_in_window(off, len, 24, 4, &rel))
4914
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbend,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4915
0
    if (nvme_field_in_window(off, len, 28, 4, &rel))
4916
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etcend,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4917
0
    if (nvme_field_in_window(off, len, 32, 4, &rel))
4918
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etpvds,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4919
0
    if (nvme_field_in_window(off, len, 36, 1, &rel))
4920
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_sanitize_ssi));
4921
0
    if (nvme_field_in_window(off, len, 37, 3, &rel))
4922
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_rsvd0,  cmd_tvb, rel, 3, ENC_NA);
4923
0
    if (nvme_field_in_window(off, len, 40, 4, &rel))
4924
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_mnsoip,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4925
0
    if (nvme_field_in_window(off, len, 44, 4, &rel))
4926
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_stnsid,  cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
4927
0
    if (off < 48) {
4928
0
        poff = 48 - off;
4929
        /* Inverted before this fix: bailed out exactly when there WAS
4930
         * enough data (poff <= len) and fell through to an underflowing
4931
         * "len -= poff" exactly when there wasn't -- corrected to match the
4932
         * safe pattern used elsewhere in this file (bail when unsafe). */
4933
0
        if (len <= poff)
4934
0
            return;
4935
0
        len -= poff;
4936
        /* Remaining room at tvb position poff (struct offset 48) is (512 -
4937
         * off) - poff, not 512 - poff: poff is tvb-relative (48-off), so
4938
         * "512 - poff" silently adds back `off` bytes past the structure's
4939
         * real 512-byte end. */
4940
0
        if (len > (512 - off - poff))
4941
0
            len = 512 - off - poff;
4942
0
    } else {
4943
0
        if (len > (512 - off))
4944
0
            len = 512 - off;
4945
0
    }
4946
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_rsvd,  cmd_tvb, poff, len, ENC_NA);
4947
0
}
4948
4949
static void dissect_nvme_get_logpage_feat_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len)
4950
0
{
4951
0
    proto_tree *grp;
4952
0
    unsigned nrec, fidx, i;
4953
4954
    /* off >= 1024 is a window past the end of the page -- normal.  A window
4955
     * that starts mid-record is not, so the two halves are reported apart. */
4956
0
    if (off >= 1024)
4957
0
        return;
4958
0
    if (!nvme_offset_record_aligned(off, 4)) {
4959
0
        expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned);
4960
0
        return;
4961
0
    }
4962
4963
0
    grp = proto_item_add_subtree(ti, ett_data);
4964
0
    fidx = off / 4;
4965
0
    nrec = (1024 - off) / 4;
4966
0
    if (nrec > (len / 4))
4967
0
        nrec = len / 4;
4968
4969
0
    for (i = 0; i < nrec; i++) {
4970
0
        proto_item *entry;
4971
0
        proto_tree *egrp;
4972
0
        unsigned fid = fidx + i;
4973
0
        entry = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_feat_sup_and_eff_fidx,
4974
0
            cmd_tvb, i * 4, 4, NULL, "FID %02Xh Supported and Effects", fid);
4975
0
        egrp = proto_item_add_subtree(entry, ett_data);
4976
0
        add_group_mask_entry(cmd_tvb, egrp, i * 4, 4, ASPEC(hf_nvme_get_logpage_feat_sup_and_eff_fids));
4977
0
    }
4978
0
}
4979
4980
static void dissect_nvme_get_logpage_mi_cmd_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len)
4981
0
{
4982
0
    proto_tree *grp;
4983
0
    unsigned nrec, fidx, i;
4984
4985
0
    if (off >= 1024)
4986
0
        return;
4987
0
    if (!nvme_offset_record_aligned(off, 4)) {
4988
0
        expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned);
4989
0
        return;
4990
0
    }
4991
4992
0
    grp = proto_item_add_subtree(ti, ett_data);
4993
0
    fidx = off / 4;
4994
0
    nrec = (1024 - off) / 4;
4995
0
    if (nrec > (len / 4))
4996
0
        nrec = len / 4;
4997
4998
0
    for (i = 0; i < nrec; i++) {
4999
0
        proto_item *entry;
5000
0
        proto_tree *egrp;
5001
0
        entry = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs,
5002
0
            cmd_tvb, i * 4, 4, NULL, "MI Command Opcode %02Xh Supported and Effects", fidx + i);
5003
0
        egrp = proto_item_add_subtree(entry, ett_data);
5004
0
        add_group_mask_entry(cmd_tvb, egrp, i * 4, 4, ASPEC(hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds));
5005
0
    }
5006
0
}
5007
5008
/* Defined further down, next to the fid_table it wraps. */
5009
static const char *get_feature_id_name(uint8_t fid);
5010
5011
static void dissect_nvme_get_logpage_cmd_feat_lockdown_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
5012
0
{
5013
0
    proto_tree *grp;
5014
0
    proto_item *cfil_ti;
5015
0
    uint8_t lngth, ss, code;
5016
0
    unsigned i, list_end;
5017
5018
0
    if (off)
5019
0
        return; /* variable-length CFIL list can only be decoded starting at offset 0 */
5020
0
    if (len < 4)
5021
0
        return;
5022
5023
0
    grp = proto_item_add_subtree(ti, ett_data);
5024
0
    add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_cmd_feat_lockdown_cfila));
5025
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_cmd_feat_lockdown_rsvd, cmd_tvb, 1, 2, ENC_NA);
5026
0
    proto_tree_add_item_ret_uint8(grp, hf_nvme_get_logpage_cmd_feat_lockdown_lngth, cmd_tvb, 3, 1, ENC_LITTLE_ENDIAN, &lngth);
5027
5028
    /* NVMe Base 2.3 Figure 271: the Command and Feature Identifier List holds
5029
     * "a list of coded values identified by the Scope Selected field and the
5030
     * Content Selected field", so the same byte names an Admin opcode under
5031
     * Scope 0h and a Set Features Feature Identifier under Scope 2h -- 02h is
5032
     * Get Log Page in the first and Power Management in the second.  Scope is
5033
     * echoed back in CFILA (byte 0, bits 3:0), so the response names its own
5034
     * list and nothing has to be carried over from the request.
5035
     *
5036
     * Scopes 3h and 4h are Management Interface and PCIe Command Set opcodes;
5037
     * neither table lives in this dissector, so those bytes stay raw rather
5038
     * than being labelled from the wrong one. */
5039
0
    ss = tvb_get_uint8(cmd_tvb, 0) & 0x0f;
5040
0
    for (i = 0; i < lngth && (4 + i) < len; i++) {
5041
0
        cfil_ti = proto_tree_add_item_ret_uint8(grp, hf_nvme_get_logpage_cmd_feat_lockdown_cfil,
5042
0
                                                cmd_tvb, 4 + i, 1, ENC_LITTLE_ENDIAN, &code);
5043
0
        if (ss == 0)
5044
0
            proto_item_append_text(cfil_ti, " (%s)", get_aq_opcode_name(code));
5045
0
        else if (ss == 2)
5046
0
            proto_item_append_text(cfil_ti, " (%s)", get_feature_id_name(code));
5047
0
    }
5048
0
    list_end = 4 + lngth;
5049
0
    if (len > list_end)
5050
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1, cmd_tvb, list_end, len - list_end, ENC_NA);
5051
0
}
5052
5053
/* Supported Log Pages (LID 00h): an array of 256 four-byte LID Supported and
5054
 * Effects data structures, one per Log Page
5055
 * Identifier 00h..FFh.  cmd_tvb begins at the returned data window; entry 0
5056
 * here is the LID at logical offset `off` (LPO + the MI transfer/DOFF), so the
5057
 * first decoded entry describes LID (off / 4). */
5058
static void dissect_nvme_get_logpage_supported_grp(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned nrec, unsigned lid0)
5059
0
{
5060
0
    unsigned i;
5061
0
    proto_item *ti;
5062
0
    proto_tree *sub;
5063
5064
0
    for (i = 0; i < nrec; i++) {
5065
0
        ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_supported_lids, cmd_tvb, i * 4, 4, NULL,
5066
0
                                         "Log Page Identifier 0x%02x Supported (LIDS%u)", lid0 + i, lid0 + i);
5067
0
        sub =  proto_item_add_subtree(ti, ett_data);
5068
0
        add_group_mask_entry(cmd_tvb, sub, i * 4, 4, ASPEC(hf_nvme_get_logpage_supported_lidseds));
5069
0
    }
5070
0
}
5071
5072
static void dissect_nvme_get_logpage_supported_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len)
5073
0
{
5074
0
    proto_tree *grp;
5075
0
    unsigned nrec;
5076
5077
0
    if (off >= 1024)
5078
0
        return; /* page is 256 four-byte entries = 1024 bytes */
5079
0
    if (!nvme_offset_record_aligned(off, 4)) {
5080
0
        expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned);
5081
0
        return;
5082
0
    }
5083
5084
0
    grp =  proto_item_add_subtree(ti, ett_data);
5085
5086
0
    nrec = (1024 - off) / 4;
5087
0
    if (nrec > (len / 4))
5088
0
        nrec = len / 4;
5089
0
    dissect_nvme_get_logpage_supported_grp(grp, cmd_tvb, nrec, off / 4);
5090
0
}
5091
5092
static const value_string eom_eomip_tbl[] = {
5093
    { 0, "No Measurement Started" },
5094
    { 1, "Measurement In Progress" },
5095
    { 2, "Measurement Completed" },
5096
    { 0, NULL },
5097
};
5098
5099
/* One EOM Lane Descriptor (NVMe over PCIe Transport 1.3 Figure 73): a fixed
5100
 * 32-byte header (Reserved, MSTAT, LN, EYE, TOP, BTM, LFT, RGT, NROWS, NCOLS,
5101
 * EDLEN, Reserved) followed by an optional Printable Eye field (NROWS*NCOLS
5102
 * bytes) and an optional Eye Data field (EDLEN bytes); both are wire-controlled
5103
 * so their end offsets are computed in 64-bit and checked against both the
5104
 * descriptor's own size (ds) and the available response length (len) before
5105
 * being handed to proto_tree_add_item(), whose length parameter is a signed
5106
 * int. */
5107
static void dissect_nvme_get_logpage_eom_desc(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned desc_off, unsigned ds, unsigned len, unsigned idx)
5108
0
{
5109
0
    proto_item *desc_ti;
5110
0
    proto_tree *desc_tree;
5111
0
    uint32_t nrows = 0, ncols = 0, edlen = 0;
5112
0
    uint64_t eye_off, eye_end;
5113
0
    bool pe_ok = true;
5114
5115
0
    desc_ti = proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_eom_desc, cmd_tvb,
5116
0
                    desc_off, ds, NULL, "EOM Lane Descriptor %u", idx);
5117
0
    desc_tree = proto_item_add_subtree(desc_ti, ett_data);
5118
5119
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rsvd0, cmd_tvb, desc_off, 1, ENC_NA);
5120
0
    add_group_mask_entry(cmd_tvb, desc_tree, desc_off + 1, 1, ASPEC(hf_nvme_get_logpage_eom_desc_mstat));
5121
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_ln, cmd_tvb, desc_off + 2, 1, ENC_LITTLE_ENDIAN);
5122
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_eye, cmd_tvb, desc_off + 3, 1, ENC_LITTLE_ENDIAN);
5123
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_top, cmd_tvb, desc_off + 4, 2, ENC_LITTLE_ENDIAN);
5124
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_btm, cmd_tvb, desc_off + 6, 2, ENC_LITTLE_ENDIAN);
5125
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_lft, cmd_tvb, desc_off + 8, 2, ENC_LITTLE_ENDIAN);
5126
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rgt, cmd_tvb, desc_off + 10, 2, ENC_LITTLE_ENDIAN);
5127
0
    proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_nrows, cmd_tvb, desc_off + 12, 2, ENC_LITTLE_ENDIAN, &nrows);
5128
0
    proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_ncols, cmd_tvb, desc_off + 14, 2, ENC_LITTLE_ENDIAN, &ncols);
5129
0
    proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_edlen, cmd_tvb, desc_off + 16, 4, ENC_LITTLE_ENDIAN, &edlen);
5130
0
    proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rsvd1, cmd_tvb, desc_off + 20, 12, ENC_NA);
5131
5132
    /* Figure 73 places Eye Data at (NROWS*NCOLS+32), i.e. directly after the
5133
     * Printable Eye.  So if PE is declared but does not fit in the descriptor,
5134
     * ED's own start offset is past the end of the descriptor too and the
5135
     * descriptor is internally inconsistent -- rendering ED at the PE offset
5136
     * instead would present eye-diagram bytes under the Eye Data label. */
5137
0
    eye_off = (uint64_t)desc_off + 32;
5138
0
    if (nrows && ncols) {
5139
0
        eye_end = eye_off + (uint64_t)nrows * ncols;
5140
0
        pe_ok = (eye_end <= (uint64_t)desc_off + ds && eye_end <= len);
5141
0
        if (pe_ok) {
5142
0
            proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_pe, cmd_tvb,
5143
0
                        (unsigned)eye_off, (int)(nrows * ncols), ENC_ASCII);
5144
0
            eye_off = eye_end;
5145
0
        }
5146
0
    }
5147
0
    if (edlen && pe_ok) {
5148
0
        eye_end = eye_off + edlen;
5149
0
        if (eye_end <= (uint64_t)desc_off + ds && eye_end <= len)
5150
0
            proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_ed, cmd_tvb,
5151
0
                        (unsigned)eye_off, (int)edlen, ENC_NA);
5152
0
    }
5153
0
}
5154
5155
/* Physical Interface Receiver Eye Opening Measurement (LID 19h): defined by
5156
 * the NVMe over PCIe Transport Specification, not NVMe Base -- Base's Get Log
5157
 * Page LID table just says "refer to the applicable NVM Express Transport
5158
 * specification" for 19h (get_logpage_name() already renders it as "Transport
5159
 * Specific" for that reason). Layout is a fixed 64-byte EOM Header (Figure 72)
5160
 * followed by ND EOM Lane Descriptors (Figure 73) of DS bytes each; ND and DS
5161
 * both live in the header, so -- like the CFIL list in
5162
 * dissect_nvme_get_logpage_cmd_feat_lockdown_resp() -- the descriptor list can
5163
 * only be walked when this call's window starts at offset 0 and covers the
5164
 * whole header. */
5165
static void dissect_nvme_get_logpage_eom_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
5166
0
{
5167
0
    proto_tree *grp;
5168
0
    unsigned rel, i;
5169
0
    uint32_t ds = 0, nd = 0;
5170
5171
0
    grp = proto_item_add_subtree(ti, ett_data);
5172
5173
0
    if (nvme_field_in_window(off, len, 0, 1, &rel))
5174
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lid, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5175
0
    if (nvme_field_in_window(off, len, 1, 1, &rel))
5176
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_eomip, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5177
0
    if (nvme_field_in_window(off, len, 2, 2, &rel))
5178
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_hsize, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5179
0
    if (nvme_field_in_window(off, len, 4, 4, &rel))
5180
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsz, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN);
5181
0
    if (nvme_field_in_window(off, len, 8, 1, &rel))
5182
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_edgn, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5183
0
    if (nvme_field_in_window(off, len, 9, 1, &rel))
5184
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lrev, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5185
0
    if (nvme_field_in_window(off, len, 10, 1, &rel))
5186
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_odp));
5187
0
    if (nvme_field_in_window(off, len, 11, 1, &rel))
5188
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lns, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5189
0
    if (nvme_field_in_window(off, len, 12, 1, &rel))
5190
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_epl, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN);
5191
0
    if (nvme_field_in_window(off, len, 13, 1, &rel))
5192
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_lspfc));
5193
0
    if (nvme_field_in_window(off, len, 14, 1, &rel))
5194
0
        add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_linfo));
5195
0
    if (nvme_field_in_window(off, len, 15, 3, &rel))
5196
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsvd0, cmd_tvb, rel, 3, ENC_NA);
5197
0
    if (nvme_field_in_window(off, len, 18, 2, &rel))
5198
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lsic, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5199
0
    if (nvme_field_in_window(off, len, 20, 4, &rel))
5200
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_eom_ds, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN, &ds);
5201
0
    if (nvme_field_in_window(off, len, 24, 2, &rel))
5202
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_eom_nd, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN, &nd);
5203
0
    if (nvme_field_in_window(off, len, 26, 2, &rel))
5204
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_maxtb, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5205
0
    if (nvme_field_in_window(off, len, 28, 2, &rel))
5206
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_maxlr, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5207
0
    if (nvme_field_in_window(off, len, 30, 2, &rel))
5208
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etgood, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5209
0
    if (nvme_field_in_window(off, len, 32, 2, &rel))
5210
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etbetter, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5211
0
    if (nvme_field_in_window(off, len, 34, 2, &rel))
5212
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etbest, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN);
5213
0
    if (nvme_field_in_window(off, len, 36, 28, &rel))
5214
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsvd1, cmd_tvb, rel, 28, ENC_NA);
5215
5216
0
    if (off != 0 || len < 64 || ds < 32 || nd == 0)
5217
0
        return; /* need DS/ND from the header to walk the descriptor list */
5218
5219
0
    for (i = 0; i < nd; i++) {
5220
0
        uint64_t desc_off64 = 64ULL + (uint64_t)i * ds;
5221
5222
        /* ND and DS are both wire-declared and unvalidated, so a header can
5223
         * claim more descriptors than the response holds.  `len` is already
5224
         * bounded by the buffer by the callers (see
5225
         * dissect_nvme_get_logpage_resp()), so this is the structural bound:
5226
         * stop at the last descriptor that fits in the declared response. */
5227
0
        if (desc_off64 + ds > len) {
5228
            /* Running out of descriptors is only a contradiction when this
5229
             * window already holds everything the host asked for; over
5230
             * NVMe-MI the remainder is normally just in a later window.  NUMD
5231
             * is 0's based and counts dwords (NVMe Base 2.3 Figure 202/203).
5232
             * The request must have been seen to reach this decoder at all --
5233
             * the caller selects it on the stored LID, which is 0h otherwise
5234
             * -- so NUMD is valid here. */
5235
0
            uint64_t declared = ((uint64_t)cmd_ctx->cmd_ctx.get_logpage.numd + 1) * 4;
5236
5237
0
            if (len >= declared)
5238
0
                expert_add_info(pinfo, ti, &ei_nvme_eom_desc_truncated);
5239
0
            break;
5240
0
        }
5241
0
        dissect_nvme_get_logpage_eom_desc(grp, cmd_tvb, (unsigned)desc_off64, ds, len, i);
5242
0
    }
5243
0
}
5244
5245
static void dissect_nvme_get_logpage_resp(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
5246
0
{
5247
    /* `len` is already bounded by the buffer: every caller reaches this either
5248
     * through dissect_nvme_data_response(), which clamps a lying transport
5249
     * length to tvb_reported_length(), or from packet-nvme-mi-admin.c, which
5250
     * sizes it from tvb_reported_length() itself.  So this container item does
5251
     * not clamp again -- on a snaplen-sliced capture it is meant to throw, the
5252
     * same as every decoder below it. */
5253
0
    proto_item *ti = proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data, cmd_tvb, 0,
5254
0
                            len, NULL,
5255
0
                            "NVMe Get Log Page (%s)", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid));
5256
    /* Per NVMe-MI 2.1 SS "Request and Response Data" (the "NVMe Admin
5257
     * Command Response Data Example" / "NVMe Get Log Page Command Response
5258
     * Data Example" figures): the
5259
     * Log Page Offset (LPO, captured from the request's CDW12/13 into
5260
     * cmd_ctx->cmd_ctx.get_logpage.off by dissect_nvme_get_logpage_cmd())
5261
     * is applied first to select the logical response data, then the
5262
     * transport-level window (`off` here -- NVMe-MI DOFST, or the
5263
     * TCP/RDMA transfer offset) is applied on top of that.  Several
5264
     * decoders below take a single combined offset directly; others
5265
     * (unchanged here) already do this same LPO+transport combination
5266
     * internally using their own `tr_off`-named parameter.
5267
     *
5268
     * LPO is a wire-controlled uint64_t with no upper-bound validation at
5269
     * parse time, so the sum is computed in 64-bit and saturated (not
5270
     * truncated) to unsigned: every decoder below rejects an out-of-range
5271
     * offset via an "off > <max>" style guard, so clamping an overflowing
5272
     * sum to UINT32_MAX guarantees those guards reject it, instead of a
5273
     * huge LPO silently wrapping into a small, in-range-looking offset. */
5274
0
    uint64_t lpo = cmd_ctx->cmd_ctx.get_logpage.off;
5275
0
    uint64_t combined_off64 = (lpo > UINT64_MAX - off) ? UINT64_MAX : lpo + off;
5276
0
    unsigned combined_off = (combined_off64 > UINT32_MAX) ? UINT32_MAX : (unsigned)combined_off64;
5277
5278
0
    switch(cmd_ctx->cmd_ctx.get_logpage.lid) {
5279
0
        case NVME_LID_SUPPORTED_LOG_PAGES:
5280
0
            dissect_nvme_get_logpage_supported_resp(ti, cmd_tvb, pinfo, combined_off, len); break;
5281
0
        case NVME_LID_DISCOVERY:
5282
0
            dissect_nvme_get_logpage_ify_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5283
0
        case NVME_LID_ERROR_INFO:
5284
0
            dissect_nvme_get_logpage_err_inf_resp(ti, cmd_tvb, combined_off, len); break;
5285
0
        case NVME_LID_SMART:
5286
0
            dissect_nvme_get_logpage_smart_resp(ti, cmd_tvb, combined_off, len); break;
5287
0
        case NVME_LID_FW_SLOT:
5288
0
            dissect_nvme_get_logpage_fw_slot_resp(ti, cmd_tvb, combined_off, len); break;
5289
0
        case NVME_LID_CHANGED_NSLIST:
5290
0
        case NVME_LID_CHANGED_ALLOC_NSLIST:
5291
0
            dissect_nvme_get_logpage_changed_nslist_resp(ti, cmd_tvb, pinfo, combined_off, len); break;
5292
0
        case NVME_LID_CMD_SUP_AND_EFF:
5293
0
            dissect_nvme_get_logpage_cmd_sup_and_eff_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5294
0
        case NVME_LID_DEVICE_SELF_TEST:
5295
0
            dissect_nvme_get_logpage_selftest_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5296
0
        case NVME_LID_TELEMETRY_HOST:
5297
0
        case NVME_LID_TELEMETRY_CTRL:
5298
0
            dissect_nvme_get_logpage_telemetry_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5299
0
        case NVME_LID_ENDURANCE_GROUP:
5300
0
            dissect_nvme_get_logpage_egroup_resp(ti, cmd_tvb, cmd_ctx, combined_off, len); break;
5301
0
        case NVME_LID_PRED_LAT_NVM_SET:
5302
0
            dissect_nvme_get_logpage_pred_lat_resp(ti, cmd_tvb, cmd_ctx, combined_off, len); break;
5303
0
        case NVME_LID_PRED_LAT_EVENT_AGG:
5304
0
            dissect_nvme_get_logpage_pred_lat_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5305
0
        case NVME_LID_ANA:
5306
0
            dissect_nvme_get_logpage_ana_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5307
0
        case NVME_LID_LBA_STATUS:
5308
0
            dissect_nvme_get_logpage_lba_status_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5309
0
        case NVME_LID_ENDURANCE_GROUP_EVENT_AGG:
5310
0
            dissect_nvme_get_logpage_egroup_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
5311
0
        case NVME_LID_RESERVATION_NOTIFICATION:
5312
0
            dissect_nvme_get_logpage_reserv_notif_resp(ti, cmd_tvb, combined_off, len); break;
5313
0
        case NVME_LID_SANITIZE_STATUS:
5314
0
            dissect_nvme_get_logpage_sanitize_resp(ti, cmd_tvb, combined_off, len); break;
5315
0
        case NVME_LID_FEATURE_ID_SUP_AND_EFF:
5316
0
            dissect_nvme_get_logpage_feat_sup_and_eff_resp(ti, cmd_tvb, pinfo, combined_off, len); break;
5317
0
        case NVME_LID_NVME_MI_CMD_SUP_AND_EFF:
5318
0
            dissect_nvme_get_logpage_mi_cmd_sup_and_eff_resp(ti, cmd_tvb, pinfo, combined_off, len); break;
5319
0
        case NVME_LID_CMD_FEAT_LOCKDOWN:
5320
0
            dissect_nvme_get_logpage_cmd_feat_lockdown_resp(ti, cmd_tvb, combined_off, len); break;
5321
0
        case NVME_LID_PHY_RX_EOM:
5322
0
            dissect_nvme_get_logpage_eom_resp(ti, cmd_tvb, pinfo, cmd_ctx, combined_off, len); break;
5323
0
        default:
5324
0
            return;
5325
0
    }
5326
0
}
5327
5328
static void dissect_nvme_get_logpage_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
5329
                                      struct nvme_cmd_ctx *cmd_ctx)
5330
0
{
5331
0
    proto_item *ti;
5332
0
    unsigned val;
5333
5334
0
    cmd_ctx->cmd_ctx.get_logpage.lid = tvb_get_uint8(cmd_tvb, 40);
5335
0
    cmd_ctx->cmd_ctx.get_logpage.lsi = tvb_get_uint16(cmd_tvb, 46, ENC_LITTLE_ENDIAN);
5336
5337
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_logpage_dword10));
5338
0
    ti = proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_get_logpage_numd, cmd_tvb, 42, 4, ENC_LITTLE_ENDIAN, &val);
5339
0
    proto_item_append_text(ti, " (%"PRIu64" bytes)", ((uint64_t)val + 1) * 4);
5340
0
    cmd_ctx->cmd_ctx.get_logpage.numd = val;
5341
5342
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_get_logpage_dword11));
5343
5344
0
    proto_tree_add_item_ret_uint64(cmd_tree, hf_nvme_get_logpage_lpo, cmd_tvb, 48, 8, ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.get_logpage.off);
5345
0
    cmd_ctx->cmd_ctx.get_logpage.off &= (~((uint64_t)3)); /* clear two low bits, the target shall either deny the command or clear the bits */
5346
5347
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
5348
5349
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_logpage_dword14));
5350
5351
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
5352
0
}
5353
5354
typedef enum {
5355
    F_ARBITRATION = 0x01,
5356
    F_POWER_MGMT = 0x02,
5357
    F_LBA_RANGE_TYPE = 0x03,
5358
    F_TEMP_THRESHOLD = 0x04,
5359
    F_ERROR_RECOVERY = 0x05,
5360
    F_VOLATILE_WC = 0x06,
5361
    F_NUM_OF_QUEUES = 0x07,
5362
    F_IRQ_COALESCING = 0x08,
5363
    F_IRQ_VECTOR_CONF = 0x09,
5364
    F_WRITE_ATOM_NORM = 0x0A,
5365
    F_ASYNC_EVENT_CONF = 0x0B,
5366
    F_AUTO_PS_TRANSITION = 0x0C,
5367
    F_HOST_MEM_BUF = 0x0D,
5368
    F_TIMESTAMP = 0x0E,
5369
    F_KA_TIMER = 0x0F,
5370
    F_HOST_CNTL_THERM_MGMT = 0x10,
5371
    F_NO_POWER_STATE_CONF = 0x11,
5372
    F_READ_REC_LEVEL_CONF = 0x12,
5373
    F_PRED_LAT_MODE_CONF = 0x13,
5374
    F_PRED_LAT_MODE_WIND = 0x14,
5375
    F_LBA_ST_INF_REP_INT = 0x15,
5376
    F_HOST_BEHV_SUPPORT = 0x16,
5377
    F_SANITIZE_CON = 0x17,
5378
    F_END_GROUP_EV_CONF = 0x18,
5379
    F_IO_CMD_SET_PROFILE = 0x19,
5380
    F_SPINUP_CONTROL = 0x1A,
5381
    F_POWER_LOSS_SIG_CONF = 0x1B,
5382
    F_PERF_CHARACTERISTICS = 0x1C,
5383
    F_FDP = 0x1D,
5384
    F_FDP_EVENTS = 0x1E,
5385
    F_NS_ADMIN_LABEL = 0x1F,
5386
    F_KV_CONFIG = 0x20,
5387
    F_CTRL_DATA_QUEUE = 0x21,
5388
    F_CONF_DEV_PERSONALITY = 0x22,
5389
    F_POWER_LIMIT = 0x23,
5390
    F_POWER_THRESHOLD = 0x24,
5391
    F_POWER_MEASUREMENT = 0x25,
5392
    F_EMB_MGMT_CTRL_ADDR = 0x78,
5393
    F_HOST_MGMT_AGENT_ADDR = 0x79,
5394
    F_ENH_CTRL_METADATA = 0x7D,
5395
    F_CTRL_METADATA = 0x7E,
5396
    F_NS_METADATA = 0x7F,
5397
    F_SW_PR_MARKER = 0x80,
5398
    F_HOST_ID = 0x81,
5399
    F_RSRV_NOT_MASK = 0x82,
5400
    F_RSRV_PRST = 0x83,
5401
    F_NS_WRITE_CONF = 0x84,
5402
    F_BP_WRITE_PROT_CONF = 0x85,
5403
} nvme_setf_t;
5404
5405
5406
static const range_string fid_table[] = {
5407
    { F_ARBITRATION, F_ARBITRATION, "Arbitration" },
5408
    { F_POWER_MGMT, F_POWER_MGMT, "Power Management" },
5409
    { F_LBA_RANGE_TYPE, F_LBA_RANGE_TYPE, "LBA Range Type" },
5410
    { F_TEMP_THRESHOLD, F_TEMP_THRESHOLD, "Temperature Threshold" },
5411
    { F_ERROR_RECOVERY, F_ERROR_RECOVERY, "Error Recovery" },
5412
    { F_VOLATILE_WC, F_VOLATILE_WC, "Volatile Write Cache" },
5413
    { F_NUM_OF_QUEUES, F_NUM_OF_QUEUES, "Number of Queues" },
5414
    { F_IRQ_COALESCING, F_IRQ_COALESCING, "Interrupt Coalescing" },
5415
    { F_IRQ_VECTOR_CONF, F_IRQ_VECTOR_CONF, "Interrupt Vector Configuration" },
5416
    { F_WRITE_ATOM_NORM, F_WRITE_ATOM_NORM, "Write Atomicity Normal" },
5417
    { F_ASYNC_EVENT_CONF, F_ASYNC_EVENT_CONF, "Asynchronous Event Configuration" },
5418
    { F_AUTO_PS_TRANSITION, F_AUTO_PS_TRANSITION, "Autonomous Power State Transition" },
5419
    { F_HOST_MEM_BUF, F_HOST_MEM_BUF, "Host Memory Buffer" },
5420
    { F_TIMESTAMP, F_TIMESTAMP, "Timestamp" },
5421
    { F_KA_TIMER, F_KA_TIMER, "Keep Alive Timer" },
5422
    { F_HOST_CNTL_THERM_MGMT, F_HOST_CNTL_THERM_MGMT, "Host Controlled Thermal Management" },
5423
    { F_NO_POWER_STATE_CONF, F_NO_POWER_STATE_CONF, "Non-Operational Power State Config" },
5424
    { F_READ_REC_LEVEL_CONF, F_READ_REC_LEVEL_CONF, "Read Recovery Level Config" },
5425
    { F_PRED_LAT_MODE_CONF, F_PRED_LAT_MODE_CONF, "Predictable Latency Mode Config" },
5426
    { F_PRED_LAT_MODE_WIND, F_PRED_LAT_MODE_WIND, "Predictable Latency Mode Window" },
5427
    { F_LBA_ST_INF_REP_INT, F_LBA_ST_INF_REP_INT, "LBA Status Information Report Interval" },
5428
    { F_HOST_BEHV_SUPPORT, F_HOST_BEHV_SUPPORT, "Host Behavior Support" },
5429
    { F_SANITIZE_CON, F_SANITIZE_CON, "Sanitize Config" },
5430
    { F_END_GROUP_EV_CONF, F_END_GROUP_EV_CONF, "Endurance Group Event Configuration" },
5431
    { F_IO_CMD_SET_PROFILE, F_IO_CMD_SET_PROFILE, "I/O Command Set Profile" },
5432
    { F_SPINUP_CONTROL, F_SPINUP_CONTROL, "Spinup Control" },
5433
    { F_POWER_LOSS_SIG_CONF, F_POWER_LOSS_SIG_CONF, "Power Loss Signaling Config" },
5434
    { F_PERF_CHARACTERISTICS, F_PERF_CHARACTERISTICS, "Performance Characteristics" },
5435
    { F_FDP, F_FDP, "Flexible Data Placement" },
5436
    { F_FDP_EVENTS, F_FDP_EVENTS, "Flexible Data Placement Events" },
5437
    { F_NS_ADMIN_LABEL, F_NS_ADMIN_LABEL, "Namespace Admin Label" },
5438
    { F_KV_CONFIG, F_KV_CONFIG, "Key Value Configuration" },
5439
    { F_CTRL_DATA_QUEUE, F_CTRL_DATA_QUEUE, "Controller Data Queue" },
5440
    { F_CONF_DEV_PERSONALITY, F_CONF_DEV_PERSONALITY, "Configurable Device Personality" },
5441
    { F_POWER_LIMIT, F_POWER_LIMIT, "Power Limit" },
5442
    { F_POWER_THRESHOLD, F_POWER_THRESHOLD, "Power Threshold" },
5443
    { F_POWER_MEASUREMENT, F_POWER_MEASUREMENT, "Power Measurement" },
5444
    { F_EMB_MGMT_CTRL_ADDR, F_EMB_MGMT_CTRL_ADDR, "Embedded Management Controller Address" },
5445
    { F_HOST_MGMT_AGENT_ADDR, F_HOST_MGMT_AGENT_ADDR, "Host Management Agent Address" },
5446
    { F_ENH_CTRL_METADATA, F_ENH_CTRL_METADATA, "Enhanced Controller Metadata" },
5447
    { F_CTRL_METADATA, F_CTRL_METADATA, "Controller Metadata" },
5448
    { F_NS_METADATA, F_NS_METADATA, "Namespace Metadata" },
5449
    { F_SW_PR_MARKER, F_SW_PR_MARKER, "Software Progress Marker" },
5450
    { F_HOST_ID, F_HOST_ID, "Host Identifier" },
5451
    { F_RSRV_NOT_MASK, F_RSRV_NOT_MASK, "Reservation Notification Mask" },
5452
    { F_RSRV_PRST, F_RSRV_PRST, "Reservation Persistence" },
5453
    { F_NS_WRITE_CONF, F_NS_WRITE_CONF, "Namespace Write Protection Config" },
5454
    { F_BP_WRITE_PROT_CONF, F_BP_WRITE_PROT_CONF, "Boot Partition Write Protection Config" },
5455
    { 0xC0, 0xFF, "Vendor Specific" },
5456
    { 0, 0, NULL },
5457
};
5458
5459
/* Forward-declared above for dissect_nvme_get_logpage_cmd_feat_lockdown_resp(),
5460
 * which names Command and Feature Identifier List entries when the log page's
5461
 * Scope Selected field says they are Feature Identifiers. */
5462
static const char *get_feature_id_name(uint8_t fid)
5463
0
{
5464
0
    return rval_to_str_const(fid, fid_table, "Reserved");
5465
0
}
5466
5467
static const value_string sel_table[] = {
5468
    { 0, "Current" },
5469
    { 1, "Default" },
5470
    { 2, "Saved" },
5471
    { 3, "Supported Capabilities" },
5472
    { 0, NULL },
5473
};
5474
5475
static const value_string sf_tmpsel_table[] = {
5476
    { 0x0, "Composite Temperature" },
5477
    { 0x1, "Temperature Sensor 1" },
5478
    { 0x2, "Temperature Sensor 2" },
5479
    { 0x3, "Temperature Sensor 3" },
5480
    { 0x4, "Temperature Sensor 4" },
5481
    { 0x5, "Temperature Sensor 5" },
5482
    { 0x6, "Temperature Sensor 6" },
5483
    { 0x7, "Temperature Sensor 7" },
5484
    { 0x8, "Temperature Sensor 8" },
5485
    { 0xF, "All Temperature Sensors" },
5486
    { 0, NULL },
5487
};
5488
5489
static const value_string sf_thpsel_table[] = {
5490
    { 0x0, "Over Temperature Threshold" },
5491
    { 0x1, "Under Temperature Threshold" },
5492
    { 0x2, "Reserved" },
5493
    { 0x3, "Reserved" },
5494
    { 0, NULL },
5495
};
5496
5497
static const value_string sf_ws_table[] = {
5498
    { 0x0, "Reserved" },
5499
    { 0x1, "Deterministic Window" },
5500
    { 0x2, "Non-Deterministic Window" },
5501
    { 0x3, "Reserved" },
5502
    { 0x4, "Reserved" },
5503
    { 0x5, "Reserved" },
5504
    { 0x6, "Reserved" },
5505
    { 0x7, "Reserved" },
5506
    { 0, NULL },
5507
};
5508
5509
static const value_string sf_wps[] = {
5510
    { 0x0, "No Write Protect" },
5511
    { 0x1, "Write Protect" },
5512
    { 0x2, "Write Protect Until Power Cycle" },
5513
    { 0x3, "Permanent Write Protect" },
5514
    { 0x4, "Reserved" },
5515
    { 0x5, "Reserved" },
5516
    { 0x6, "Reserved" },
5517
    { 0x7, "Reserved" },
5518
    { 0, NULL },
5519
};
5520
5521
/* Power Loss Signaling Mode (PLSM), Power Loss Signaling Config Set Features
5522
 * Command Dword 11 bits 1:0. */
5523
static const value_string sf_plsm[] = {
5524
    { 0x0, "Power Loss Signaling not enabled" },
5525
    { 0x1, "Power Loss Signaling with Emergency Power Fail enabled" },
5526
    { 0x2, "Power Loss Signaling with Forced Quiescence enabled" },
5527
    { 0x3, "Reserved" },
5528
    { 0, NULL },
5529
};
5530
5531
/* Boot Partition Write Protection State (BP0WPS/BP1WPS), Boot Partition Write
5532
 * Protection Config Set Features Command Dword 11. */
5533
static const value_string sf_bpwps[] = {
5534
    { 0x0, "Change in state not requested" },
5535
    { 0x1, "Write Unlocked" },
5536
    { 0x2, "Write Locked" },
5537
    { 0x3, "Write Locked Until Power Cycle" },
5538
    { 0x4, "Write Protection controlled by RPMB" },
5539
    { 0x5, "Reserved" },
5540
    { 0x6, "Reserved" },
5541
    { 0x7, "Reserved" },
5542
    { 0, NULL },
5543
};
5544
5545
static void add_nvme_queues(char *result, uint32_t val)
5546
0
{
5547
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u)", val, val+1);
5548
0
}
5549
5550
/* Host Metadata features (FID 7Dh/7Eh/7Fh) Element Action, Set Features
5551
 * Command Dword 11 bits 14:13. */
5552
static const value_string sf_host_metadata_ea[] = {
5553
    { 0x0, "Add or Replace Entry" },
5554
    { 0x1, "Delete Entry Multiple" },
5555
    { 0x2, "Add Entry Multiple" },
5556
    { 0x3, "Reserved" },
5557
    { 0, NULL },
5558
};
5559
5560
/* Metadata Element Descriptor Element Type for the (Enhanced) Controller
5561
 * Metadata features 7Dh/7Eh (NVMe Base 2.3 "Controller Metadata Element
5562
 * Types"). */
5563
static const range_string host_metadata_ctrl_et[] = {
5564
    { 0x00, 0x00, "Reserved" },
5565
    { 0x01, 0x01, "Operating System Controller Name" },
5566
    { 0x02, 0x02, "Operating System Driver Name" },
5567
    { 0x03, 0x03, "Operating System Driver Version" },
5568
    { 0x04, 0x04, "Pre-boot Controller Name" },
5569
    { 0x05, 0x05, "Pre-boot Driver Name" },
5570
    { 0x06, 0x06, "Pre-boot Driver Version" },
5571
    { 0x07, 0x07, "System Processor Model" },
5572
    { 0x08, 0x08, "Chipset Driver Name" },
5573
    { 0x09, 0x09, "Chipset Driver Version" },
5574
    { 0x0A, 0x0A, "Operating System Name and Build" },
5575
    { 0x0B, 0x0B, "System Product Name" },
5576
    { 0x0C, 0x0C, "Firmware Version" },
5577
    { 0x0D, 0x0D, "Operating System Driver Filename" },
5578
    { 0x0E, 0x0E, "Display Driver Name" },
5579
    { 0x0F, 0x0F, "Display Driver Version" },
5580
    { 0x10, 0x10, "Host-Determined Failure Record" },
5581
    { 0x11, 0x17, "Reserved" },
5582
    { 0x18, 0x1F, "Vendor Specific" },
5583
    { 0, 0, NULL },
5584
};
5585
5586
/* Metadata Element Descriptor Element Type for the Namespace Metadata feature
5587
 * 7Fh (NVMe Base 2.3 "Namespace Metadata Element Types"). */
5588
static const range_string host_metadata_ns_et[] = {
5589
    { 0x00, 0x00, "Reserved" },
5590
    { 0x01, 0x01, "Operating System Namespace Name" },
5591
    { 0x02, 0x02, "Pre-boot Namespace Name" },
5592
    { 0x03, 0x03, "Operating System Namespace Name Qualifier 1" },
5593
    { 0x04, 0x04, "Operating System Namespace Name Qualifier 2" },
5594
    { 0x05, 0x17, "Reserved" },
5595
    { 0x18, 0x1F, "Vendor Specific" },
5596
    { 0, 0, NULL },
5597
};
5598
5599
static void dissect_nvme_set_features_dword11(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid)
5600
0
{
5601
0
    switch (fid) {
5602
0
        case F_ARBITRATION: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_arb)); break;
5603
0
        case F_POWER_MGMT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_pm)); break;
5604
0
        case F_LBA_RANGE_TYPE: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_lbart)); break;
5605
0
        case F_TEMP_THRESHOLD: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_tt)); break;
5606
0
        case F_ERROR_RECOVERY: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_erec)); break;
5607
0
        case F_VOLATILE_WC: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_vwce)); break;
5608
0
        case F_NUM_OF_QUEUES: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nq)); break;
5609
0
        case F_IRQ_COALESCING: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_irqc)); break;
5610
0
        case F_IRQ_VECTOR_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_irqv)); break;
5611
0
        case F_WRITE_ATOM_NORM: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_wan)); break;
5612
0
        case F_ASYNC_EVENT_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_aec)); break;
5613
0
        case F_AUTO_PS_TRANSITION: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_apst)); break;
5614
0
        case F_KA_TIMER: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_kat)); break;
5615
0
        case F_HOST_CNTL_THERM_MGMT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hctm)); break;
5616
0
        case F_NO_POWER_STATE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nops)); break;
5617
0
        case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rrl)); break;
5618
0
        case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plmc)); break;
5619
0
        case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plmw)); break;
5620
0
        case F_LBA_ST_INF_REP_INT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_lbasi)); break;
5621
0
        case F_SANITIZE_CON: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_san)); break;
5622
0
        case F_END_GROUP_EV_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_eg)); break;
5623
0
        case F_SW_PR_MARKER: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_swp)); break;
5624
0
        case F_HOST_ID: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hid)); break;
5625
0
        case F_RSRV_NOT_MASK: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rsrvn)); break;
5626
0
        case F_RSRV_PRST: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rsrvp)); break;
5627
0
        case F_NS_WRITE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nswp)); break;
5628
0
        case F_ENH_CTRL_METADATA:
5629
0
        case F_CTRL_METADATA:
5630
0
        case F_NS_METADATA: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hmd)); break;
5631
0
        case F_HOST_MEM_BUF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hmb)); break;
5632
0
        case F_IO_CMD_SET_PROFILE: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_iocsp)); break;
5633
0
        case F_SPINUP_CONTROL: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_spinup)); break;
5634
0
        case F_POWER_LOSS_SIG_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plsc)); break;
5635
0
        case F_FDP: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_fdp)); break;
5636
0
        case F_FDP_EVENTS: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_fdpe)); break;
5637
0
        case F_BP_WRITE_PROT_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_bpwpc)); break;
5638
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
5639
0
    }
5640
0
}
5641
5642
static void dissect_nvme_set_features_dword12(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid)
5643
0
{
5644
0
    switch (fid) {
5645
0
        case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_rrl)); break;
5646
0
        case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_plmc)); break;
5647
0
        case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_plmw)); break;
5648
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
5649
0
    }
5650
0
}
5651
5652
static void dissect_nvme_set_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
5653
                                      struct nvme_cmd_ctx *cmd_ctx)
5654
0
{
5655
0
    cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40);
5656
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_set_features_dword10));
5657
0
    dissect_nvme_set_features_dword11(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid);
5658
0
    dissect_nvme_set_features_dword12(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid);
5659
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
5660
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_set_features_dword14));
5661
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
5662
0
}
5663
5664
static void dissect_nvme_get_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
5665
                                      struct nvme_cmd_ctx *cmd_ctx)
5666
0
{
5667
0
    cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40);
5668
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_features_dword10));
5669
0
    switch(cmd_ctx->cmd_ctx.set_features.fid) {
5670
0
        case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_rrl)); break;
5671
0
        case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_plmc)); break;
5672
0
        case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_plmw)); break;
5673
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); break;
5674
0
    }
5675
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
5676
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
5677
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_features_dword14));
5678
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
5679
0
}
5680
5681
static void dissect_nvme_rw_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
5682
0
{
5683
0
    proto_item *ti, *dsm_tree, *item;
5684
0
    uint8_t val;
5685
5686
0
    dissect_nvme_rwc_common_word_10_11_12_14_15(cmd_tvb, cmd_tree);
5687
5688
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_dsm, cmd_tvb, 52,
5689
0
                             1, ENC_NA);
5690
0
    dsm_tree = proto_item_add_subtree(ti, ett_data);
5691
5692
0
    val = tvb_get_uint8(cmd_tvb, 52) & 0x0f;
5693
0
    item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_freq, cmd_tvb,
5694
0
                               52, 1, ENC_LITTLE_ENDIAN);
5695
0
    proto_item_append_text(item, " %s",
5696
0
                           val_to_str_const(val, dsm_acc_freq_tbl, "Reserved"));
5697
5698
0
    val = (tvb_get_uint8(cmd_tvb, 52) & 0x30) >> 4;
5699
0
    item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_lat, cmd_tvb,
5700
0
                               52, 1, ENC_LITTLE_ENDIAN);
5701
0
    proto_item_append_text(item, " %s",
5702
0
                           val_to_str_const(val, dsm_acc_lat_tbl, "Reserved"));
5703
5704
0
    proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_seq_req, cmd_tvb,
5705
0
                        52, 1, ENC_LITTLE_ENDIAN);
5706
0
    proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_incompressible, cmd_tvb,
5707
0
                        52, 1, ENC_LITTLE_ENDIAN);
5708
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd3, cmd_tvb,
5709
0
                        53, 3, ENC_NA);
5710
0
}
5711
5712
static const range_string sf_lbart_type_table[] = {
5713
    { 0x0, 0x0, "General Purpose" },
5714
    { 0x1, 0x1, "Filesystem" },
5715
    { 0x2, 0x2, "RAID" },
5716
    { 0x3, 0x3, "Cache" },
5717
    { 0x4, 0x4, "Swap" },
5718
    { 0x80, 0xFF, "Vendor Specific" },
5719
    { 0, 0, NULL },
5720
};
5721
5722
static void dissect_nvme_set_features_transfer_lbart(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
5723
0
{
5724
0
    proto_tree *grp;
5725
0
    proto_item *ti;
5726
0
    unsigned done = 0;
5727
0
    while (len >= 64) {
5728
0
        ti =  proto_tree_add_bytes_format_value(tree, hf_nvme_set_features_tr_lbart, tvb, done, 64, NULL, "LBA Range Structure %u", (done + off) / 64);
5729
0
        grp =  proto_item_add_subtree(ti, ett_data);
5730
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_type, tvb, done, 1, ENC_LITTLE_ENDIAN);
5731
0
        add_group_mask_entry(tvb, grp, done+1, 1, ASPEC(hf_nvme_set_features_tr_lbart_attr));
5732
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd0, tvb, done+2, 14, ENC_NA);
5733
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_slba, tvb, done+16, 8, ENC_LITTLE_ENDIAN);
5734
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_nlb, tvb, done+24, 8, ENC_LITTLE_ENDIAN);
5735
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_guid, tvb, done+32, 16, ENC_NA);
5736
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd1, tvb, done+48, 16, ENC_NA);
5737
0
        len -= 64;
5738
0
        done += 64;
5739
0
    }
5740
0
}
5741
5742
static void dissect_nvme_set_features_transfer_apst(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
5743
0
{
5744
0
    unsigned poff = 0;
5745
    /* Non-Operational Power State Transition table: 32 entries * 8 bytes =
5746
     * 256 bytes max.  Each entry's value is self-contained, but a nonzero
5747
     * window offset moves where that 256-byte ceiling falls. */
5748
0
    unsigned max_len = (off < 256) ? (256 - off) : 0;
5749
5750
0
    if (len > max_len)
5751
0
        len = max_len;
5752
0
    while (len >= 8) {
5753
0
        add_group_mask_entry(tvb, tree, poff, 8, ASPEC(hf_nvme_set_features_tr_apst));
5754
0
        len -= 8;
5755
0
        poff += 8;
5756
0
    }
5757
0
}
5758
5759
static void dissect_nvme_set_features_transfer_tst(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
5760
0
{
5761
0
    unsigned rel;
5762
5763
0
    if (nvme_field_in_window(off, len, 0, 8, &rel))
5764
0
        add_group_mask_entry(tvb, tree, rel, 8, ASPEC(hf_nvme_set_features_tr_tst));
5765
0
}
5766
5767
5768
static void dissect_nvme_set_features_transfer_plmc(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
5769
0
{
5770
0
    proto_tree *grp;
5771
0
    proto_item *ti;
5772
0
    unsigned rel;
5773
5774
0
    ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_plmc, tvb, 0, len, ENC_NA);
5775
0
    grp =  proto_item_add_subtree(ti, ett_data);
5776
0
    if (nvme_field_in_window(off, len, 0, 2, &rel))
5777
0
        add_group_mask_entry(tvb, grp, rel, 2, ASPEC(hf_nvme_set_features_tr_plmc_ee));
5778
0
    if (nvme_field_in_window(off, len, 2, 30, &rel))
5779
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd0, tvb, rel, 30, ENC_NA);
5780
0
    if (nvme_field_in_window(off, len, 32, 8, &rel))
5781
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinrt, tvb, rel, 8, ENC_LITTLE_ENDIAN);
5782
0
    if (nvme_field_in_window(off, len, 40, 8, &rel))
5783
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinwt, tvb, rel, 8, ENC_LITTLE_ENDIAN);
5784
0
    if (nvme_field_in_window(off, len, 48, 8, &rel))
5785
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwintt, tvb, rel, 8, ENC_LITTLE_ENDIAN);
5786
    /* Trailing/remaining-length field: guard before subtracting so a short
5787
     * or windowed transfer can't underflow `len` (this is exactly the
5788
     * unsigned-subtraction bug the DOFST-windowing audit found here).
5789
     * off > 56 means the whole window already lies inside this trailing
5790
     * field, so it renders entirely from tvb position 0 (poff=0) rather
5791
     * than being silently dropped. */
5792
0
    {
5793
0
        unsigned poff = (off <= 56) ? (56 - off) : 0;
5794
0
        if (poff <= len && off <= 512) {
5795
            /* Remaining room at tvb position poff is (512-off)-poff, not the
5796
             * raw len -- an oversized/malformed len must not render bytes
5797
             * past the structure's real 512-byte end (NVMe Base 2.3 Figure
5798
             * 423) as "Reserved1". */
5799
0
            unsigned max_len = (512 - off) - poff;
5800
0
            unsigned rlen = len - poff;
5801
0
            if (rlen > max_len)
5802
0
                rlen = max_len;
5803
0
            proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd1, tvb, poff, rlen, ENC_NA);
5804
0
        }
5805
0
    }
5806
0
}
5807
5808
static void dissect_nvme_set_features_transfer_hbs(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
5809
0
{
5810
0
    proto_tree *grp;
5811
0
    proto_item *ti;
5812
0
    unsigned rel;
5813
5814
0
    ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_hbs, tvb, 0, len, ENC_NA);
5815
0
    grp =  proto_item_add_subtree(ti, ett_data);
5816
0
    if (nvme_field_in_window(off, len, 0, 1, &rel))
5817
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_acre, tvb, rel, 1, ENC_LITTLE_ENDIAN);
5818
0
    if (nvme_field_in_window(off, len, 1, 1, &rel))
5819
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_etdas, tvb, rel, 1, ENC_LITTLE_ENDIAN);
5820
0
    if (nvme_field_in_window(off, len, 2, 1, &rel))
5821
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_lbafee, tvb, rel, 1, ENC_LITTLE_ENDIAN);
5822
0
    if (nvme_field_in_window(off, len, 3, 1, &rel))
5823
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_hdisns, tvb, rel, 1, ENC_LITTLE_ENDIAN);
5824
0
    if (nvme_field_in_window(off, len, 4, 2, &rel))
5825
0
        add_group_mask_entry(tvb, grp, rel, 2, ASPEC(hf_nvme_set_features_tr_hbs_cdfe));
5826
    /* off > 6 means the whole window already lies inside this trailing
5827
     * field, so it renders entirely from tvb position 0 (poff=0) rather
5828
     * than being silently dropped. */
5829
0
    {
5830
0
        unsigned poff = (off <= 6) ? (6 - off) : 0;
5831
0
        if (poff <= len && off <= 512) {
5832
            /* Remaining room at tvb position poff is (512-off)-poff, not the
5833
             * raw len -- an oversized/malformed len must not render bytes
5834
             * past the structure's real 512-byte end (NVMe Base 2.3 Figure
5835
             * 426) as "Reserved". */
5836
0
            unsigned max_len = (512 - off) - poff;
5837
0
            unsigned rlen = len - poff;
5838
0
            if (rlen > max_len)
5839
0
                rlen = max_len;
5840
0
            proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_rsvd, tvb, poff, rlen, ENC_NA);
5841
0
        }
5842
0
    }
5843
0
}
5844
5845
/* Host Metadata data structure, shared by the (Enhanced) Controller Metadata
5846
 * and Namespace Metadata features (7Dh/7Eh/7Fh).
5847
 * A 4 KiB structure: a 1-byte NMED count, a reserved byte, then a list of
5848
 * variable-length Metadata Element Descriptors (a 4-byte header carrying
5849
 * ET/ER/ELEN, followed by ELEN bytes of UTF-8 Element Value). */
5850
static void dissect_nvme_host_metadata(tvbuff_t *tvb, proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
5851
0
{
5852
0
    const range_string *et_rs = (cmd_ctx->cmd_ctx.set_features.fid == F_NS_METADATA)
5853
0
        ? host_metadata_ns_et : host_metadata_ctrl_et;
5854
0
    proto_tree *grp;
5855
0
    proto_item *ti;
5856
0
    unsigned pos;
5857
0
    uint32_t nmed, i;
5858
5859
0
    ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_hmd, tvb, 0, len, ENC_NA);
5860
0
    grp = proto_item_add_subtree(ti, ett_data);
5861
5862
    /* The NMED header is only present at the start of the structure.  Over a
5863
     * windowed transfer (off > 0) the chunk begins mid-list and cannot be
5864
     * realigned, so show it raw rather than misparse. */
5865
0
    if (off != 0 || len < 2) {
5866
0
        proto_tree_add_item(grp, hf_nvme_gen_data, tvb, 0, len, ENC_NA);
5867
0
        return;
5868
0
    }
5869
5870
0
    proto_tree_add_item_ret_uint(grp, hf_nvme_set_features_tr_hmd_nmed, tvb, 0, 1, ENC_LITTLE_ENDIAN, &nmed);
5871
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_hmd_rsvd, tvb, 1, 1, ENC_NA);
5872
0
    pos = 2;
5873
5874
0
    for (i = 0; i < nmed; i++) {
5875
0
        proto_tree *med;
5876
0
        proto_item *med_ti, *et_ti;
5877
0
        uint32_t et, elen;
5878
5879
        /* Stop cleanly if the descriptor header or value runs past the
5880
         * available data (a DLEN-truncated or windowed chunk). */
5881
0
        if (pos + 4 > len)
5882
0
            break;
5883
0
        elen = tvb_get_uint16(tvb, pos + 2, ENC_LITTLE_ENDIAN);
5884
0
        if (pos + 4 + elen > len)
5885
0
            break;
5886
5887
0
        med_ti = proto_tree_add_item(grp, hf_nvme_set_features_tr_hmd_med, tvb, pos, 4 + elen, ENC_NA);
5888
0
        proto_item_set_text(med_ti, "Metadata Element Descriptor %u", i);
5889
0
        med = proto_item_add_subtree(med_ti, ett_data);
5890
5891
0
        et_ti = proto_tree_add_item_ret_uint(med, hf_nvme_set_features_tr_hmd_med_et, tvb, pos, 4, ENC_LITTLE_ENDIAN, &et);
5892
0
        proto_item_append_text(et_ti, " (%s)", rval_to_str_const(et, et_rs, "Unknown"));
5893
0
        proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_er, tvb, pos, 4, ENC_LITTLE_ENDIAN);
5894
0
        proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_elen, tvb, pos, 4, ENC_LITTLE_ENDIAN);
5895
0
        if (elen)
5896
0
            proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_eval, tvb, pos + 4, elen, ENC_UTF_8);
5897
0
        pos += 4 + elen;
5898
0
    }
5899
0
}
5900
5901
static void dissect_nvme_set_features_transfer(tvbuff_t *tvb, proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
5902
0
{
5903
0
    switch(cmd_ctx->cmd_ctx.set_features.fid) {
5904
0
        case F_LBA_RANGE_TYPE:
5905
0
            dissect_nvme_set_features_transfer_lbart(tvb, tree, off, len);
5906
0
            break;
5907
0
        case F_AUTO_PS_TRANSITION:
5908
0
            dissect_nvme_set_features_transfer_apst(tvb, tree, off, len);
5909
0
            break;
5910
0
        case F_TIMESTAMP:
5911
0
            dissect_nvme_set_features_transfer_tst(tvb, tree, off, len);
5912
0
            break;
5913
0
        case F_PRED_LAT_MODE_CONF:
5914
0
            dissect_nvme_set_features_transfer_plmc(tvb, tree, off, len);
5915
0
            break;
5916
0
        case F_HOST_BEHV_SUPPORT:
5917
0
            dissect_nvme_set_features_transfer_hbs(tvb, tree, off, len);
5918
0
            break;
5919
0
        case F_ENH_CTRL_METADATA:
5920
0
        case F_CTRL_METADATA:
5921
0
        case F_NS_METADATA:
5922
0
            dissect_nvme_host_metadata(tvb, tree, cmd_ctx, off, len);
5923
0
            break;
5924
0
        default:
5925
0
            proto_tree_add_bytes_format_value(tree, hf_nvme_gen_data, tvb, 0, len, NULL,
5926
0
                (cmd_ctx->opcode == NVME_AQ_OPC_SET_FEATURES) ? "Unhandled Set Features Transfer" : "Unhandled Get Features Transfer");
5927
0
            break;
5928
0
    }
5929
0
}
5930
5931
5932
void nvme_update_transfer_request(packet_info *pinfo, struct nvme_cmd_ctx *cmd, struct nvme_q_ctx *q_ctx)
5933
0
{
5934
0
    if (cmd->fabric) {
5935
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s",
5936
0
            rval_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command"));
5937
0
        return;
5938
0
    }
5939
0
    if (!q_ctx->qid) {
5940
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", get_aq_opcode_name(cmd->opcode));
5941
0
        if (cmd->opcode == NVME_AQ_OPC_IDENTIFY)
5942
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
5943
0
        else if (cmd->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
5944
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd->cmd_ctx.get_logpage.lid));
5945
0
    } else {
5946
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", get_ioq_opcode_name(cmd->opcode));
5947
0
    }
5948
0
}
5949
5950
static void dissect_nvme_security_data(tvbuff_t *tvb, packet_info *pinfo,
5951
                                       proto_tree *tree,
5952
                                       struct nvme_cmd_ctx *cmd_ctx,
5953
                                       unsigned off, unsigned len);
5954
5955
bool
5956
nvme_dissect_admin_data_resp(tvbuff_t *nvme_tvb, packet_info *pinfo,
5957
                             proto_tree *cmd_tree, struct nvme_cmd_ctx *cmd_ctx,
5958
                             unsigned off, unsigned len)
5959
4
{
5960
4
    switch (cmd_ctx->opcode) {
5961
0
    case NVME_AQ_OPC_IDENTIFY:
5962
0
        dissect_nvme_identify_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len);
5963
0
        return true;
5964
0
    case NVME_AQ_OPC_GET_LOG_PAGE:
5965
0
        dissect_nvme_get_logpage_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len);
5966
0
        return true;
5967
0
    case NVME_AQ_OPC_SET_FEATURES:
5968
0
    case NVME_AQ_OPC_GET_FEATURES:
5969
0
        dissect_nvme_set_features_transfer(nvme_tvb, cmd_tree, cmd_ctx, off, len);
5970
0
        return true;
5971
0
    case NVME_AQ_OPC_SECURITY_SEND:
5972
0
    case NVME_AQ_OPC_SECURITY_RECV:
5973
0
        dissect_nvme_security_data(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len);
5974
0
        return true;
5975
4
    default:
5976
4
        return false;
5977
4
    }
5978
4
}
5979
5980
void
5981
dissect_nvme_data_response(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
5982
                 struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned len, bool is_inline)
5983
4
{
5984
4
    proto_tree *cmd_tree;
5985
4
    proto_item *ti;
5986
4
    const char *str_opcode;
5987
4
    uint32_t off;
5988
4
    unsigned avail;
5989
4
    bool over_declared;
5990
5991
    /* `len` is the transport's wire-declared response length: over NVMe/TCP it
5992
     * is the C2HData PDU's DATAL field, taken straight off the wire by
5993
     * dissect_nvme_tcp_data_pdu() (packet-nvme-tcp.c) with no check against the
5994
     * bytes the PDU actually carries, while nvme_tvb is only a
5995
     * tvb_new_subset_remaining().  Every decoder below bounds its fields on
5996
     * `len`, so a DATAL larger than the PDU walks off the end of the tvb and
5997
     * the resulting exception replaces the whole frame's dissection with
5998
     * [Malformed Packet].  Clamp once, here, rather than in each per-structure
5999
     * decoder.
6000
     *
6001
     * The clamp is to the *reported* length, not the captured length, so the
6002
     * two cases stay distinguishable:
6003
     *
6004
     *   - a DATAL larger than the PDU is a lie about data that was never sent;
6005
     *     clamping to the reported length keeps every decoder in bounds and no
6006
     *     exception is raised.
6007
     *   - a snaplen-sliced capture still has an honest DATAL, so `len` stays
6008
     *     larger than what was captured, the decoders read into the missing
6009
     *     bytes and throw BoundsError, and Wireshark reports
6010
     *     [Packet size limited during capture] as it does for every other
6011
     *     protocol.  Clamping to tvb_captured_length() would silently hide
6012
     *     that.
6013
     *
6014
     * NVMe-MI is unaffected either way (packet-nvme-mi-admin.c calls
6015
     * nvme_dissect_admin_data_resp() directly, sized from
6016
     * tvb_reported_length()) and NVMe/RDMA already passes
6017
     * tvb_reported_length(). */
6018
4
    avail = tvb_reported_length(nvme_tvb);
6019
4
    over_declared = (len > avail);
6020
4
    if (over_declared)
6021
1
        len = avail;
6022
6023
4
    off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd_ctx->tr_bytes;
6024
6025
4
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
6026
4
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
6027
4
                             len, ENC_NA);
6028
4
    cmd_tree = proto_item_add_subtree(ti, ett_data);
6029
    /* The transport asked for more bytes than the frame reports.  This is not
6030
     * capture truncation -- tvb_reported_length() is the on-the-wire length,
6031
     * unaffected by the snaplen -- so the transport header and the frame
6032
     * genuinely disagree. */
6033
4
    if (over_declared)
6034
1
        expert_add_info(pinfo, ti, &ei_nvme_data_len_exceeds_frame);
6035
4
    if (q_ctx->qid) { //IOQ
6036
0
        str_opcode = get_ioq_opcode_name(cmd_ctx->opcode);
6037
4
      } else { //AQ
6038
4
        str_opcode = get_aq_opcode_name(cmd_ctx->opcode);
6039
4
        if (!nvme_dissect_admin_data_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len)) {
6040
4
            proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data,
6041
4
                                              nvme_tvb, 0, len, NULL,
6042
4
                                              "%s, offset %u", str_opcode, off);
6043
4
        }
6044
4
    }
6045
4
    if (is_inline)
6046
0
        return;
6047
4
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data for %s", str_opcode);
6048
4
    if (!q_ctx->qid) {
6049
0
        if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY)
6050
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s, offset %u", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"), off);
6051
0
        else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
6052
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s, offset %u", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid), off);
6053
4
    } else {
6054
4
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, ", ", "offset %u", off);
6055
4
    }
6056
4
}
6057
6058
static void add_nvme_qid(char *result, uint32_t val)
6059
0
{
6060
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%s)", val, val ? "IOQ" : "AQ");
6061
0
}
6062
6063
static void add_zero_base(char *result, uint32_t val)
6064
0
{
6065
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u", val+1);
6066
0
}
6067
6068
static
6069
void dissect_nvmeof_fabric_connect_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
6070
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off)
6071
0
{
6072
0
    uint32_t qid;
6073
6074
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd1, cmd_tvb,
6075
0
                        5+off, 19, ENC_NA);
6076
0
    dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_connect_sgl1,
6077
0
        q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
6078
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_recfmt, cmd_tvb,
6079
0
                        40+off, 2, ENC_LITTLE_ENDIAN);
6080
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvmeof_cmd_connect_qid, cmd_tvb,
6081
0
                        42+off, 2, ENC_LITTLE_ENDIAN, &qid);
6082
0
    cmd->cmd_ctx.fabric_cmd.cnct.qid = qid;
6083
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_sqsize, cmd_tvb,
6084
0
                        44+off, 2, ENC_LITTLE_ENDIAN);
6085
6086
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 46+off, 1, ASPEC(hf_nvmeof_cmd_connect_cattr));
6087
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd2, cmd_tvb,
6088
0
                        47+off, 1, ENC_NA);
6089
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_kato, cmd_tvb,
6090
0
                        48+off, 4, ENC_LITTLE_ENDIAN);
6091
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd3, cmd_tvb,
6092
0
                        52+off, 12, ENC_NA);
6093
0
}
6094
6095
static
6096
void dissect_nvmeof_fabric_auth_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
6097
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off)
6098
0
{
6099
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv1, cmd_tvb,
6100
0
                        5+off, 19, ENC_NA);
6101
0
    dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_auth_sgl1,
6102
0
        q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
6103
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv2, cmd_tvb,
6104
0
                        40+off, 1, ENC_LITTLE_ENDIAN);
6105
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp0, cmd_tvb,
6106
0
                        41+off, 1, ENC_LITTLE_ENDIAN);
6107
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp1, cmd_tvb,
6108
0
                        42+off, 1, ENC_LITTLE_ENDIAN);
6109
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_secp, cmd_tvb,
6110
0
                        43+off, 1, ENC_LITTLE_ENDIAN);
6111
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_al, cmd_tvb,
6112
0
                        44+off, 4, ENC_LITTLE_ENDIAN);
6113
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv3, cmd_tvb,
6114
0
                        48+off, 16, ENC_NA);
6115
0
}
6116
6117
static void dissect_nvme_fabric_disconnect_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb,  unsigned off)
6118
0
{
6119
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd0, cmd_tvb,
6120
0
                        5+off, 35, ENC_NA);
6121
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_recfmt, cmd_tvb,
6122
0
                        40+off, 2, ENC_LITTLE_ENDIAN);
6123
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd1, cmd_tvb,
6124
0
                        42+off, 22, ENC_NA);
6125
0
}
6126
6127
static void dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off)
6128
0
{
6129
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd0, cmd_tvb,
6130
0
                        5+off, 35, ENC_NA);
6131
6132
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40+off, 1, ASPEC(hf_nvmeof_cmd_prop_get_set_attrib));
6133
6134
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd1, cmd_tvb,
6135
0
                        41+off, 3, ENC_NA);
6136
6137
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_offset, cmd_tvb,
6138
0
                        44+off, 4, ENC_LITTLE_ENDIAN);
6139
0
}
6140
6141
static void dissect_nvmeof_fabric_prop_get_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
6142
0
{
6143
0
    cmd->cmd_ctx.fabric_cmd.prop_get.offset = tvb_get_uint8(cmd_tvb, 44+off);
6144
0
    dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
6145
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_rsvd2, cmd_tvb,
6146
0
                        48+off, 16, ENC_NA);
6147
0
}
6148
6149
static void add_500ms_units(char *result, uint32_t val)
6150
0
{
6151
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u ms)", val, val * 500);
6152
0
}
6153
6154
static void add_ccap_css(char *result, uint32_t val)
6155
0
{
6156
    /* Base 2.3 Figure 36, CAP.CSS (bits 44:37) is a bitmask, not an enum:
6157
     * bit 7 NOIOCSS, bit 6 IOCSS, bits 5:1 Reserved, bit 0 NCSS. */
6158
0
    char buf[64] = "";
6159
0
    bool have_bit = false;
6160
6161
0
    if (val & 0x80) {
6162
0
        (void)g_strlcat(buf, "NOIOCSS", sizeof(buf));
6163
0
        have_bit = true;
6164
0
    }
6165
0
    if (val & 0x40) {
6166
0
        if (have_bit)
6167
0
            (void)g_strlcat(buf, ", ", sizeof(buf));
6168
0
        (void)g_strlcat(buf, "IOCSS", sizeof(buf));
6169
0
        have_bit = true;
6170
0
    }
6171
0
    if (val & 0x1) {
6172
0
        if (have_bit)
6173
0
            (void)g_strlcat(buf, ", ", sizeof(buf));
6174
0
        (void)g_strlcat(buf, "NCSS", sizeof(buf));
6175
0
        have_bit = true;
6176
0
    }
6177
0
    if (!have_bit)
6178
0
        (void)g_strlcat(buf, "None", sizeof(buf));
6179
6180
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%s)", val, buf);
6181
0
}
6182
6183
static void dissect_nvmeof_fabric_prop_data(proto_tree *tree, tvbuff_t *tvb, unsigned off, unsigned prop_off, uint8_t attr)
6184
0
{
6185
0
    proto_item *ti, *grp;
6186
0
    ti = proto_tree_add_item(tree, hf_nvmeof_prop_get_set_data, tvb, off, 8, ENC_NA);
6187
0
    grp =  proto_item_add_subtree(ti, ett_data);
6188
0
    switch(prop_off) {
6189
0
        case 0x0:  add_group_mask_entry(tvb, grp, off, 8, ASPEC(hf_nvmeof_prop_get_ccap)); attr=1; break;
6190
0
        case 0x8:  add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_vs)); attr=0; break;
6191
0
        case 0x14: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_cc)); attr=0; break;
6192
0
        case 0x1c: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_csts)); attr=0; break;
6193
0
        case 0x20: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_nssr)); attr=0; break;
6194
0
        default:
6195
0
        {
6196
0
            if (attr == 0)
6197
0
            proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B, tvb,
6198
0
                            off, 4, ENC_LITTLE_ENDIAN);
6199
0
            else
6200
0
                proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_8B, tvb,
6201
0
                            off, 8, ENC_LITTLE_ENDIAN);
6202
0
            break;
6203
0
        }
6204
0
    }
6205
0
    if (attr == 0)
6206
0
        proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B_rsvd, tvb,
6207
0
                        off+4, 4, ENC_LITTLE_ENDIAN);
6208
0
}
6209
static void dissect_nvmeof_fabric_prop_set_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
6210
0
{
6211
0
    uint8_t attr;
6212
0
    uint32_t prop_off;
6213
6214
0
    dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
6215
0
    attr = tvb_get_uint8(cmd_tvb, 40+off) & 0x7;
6216
0
    prop_off = tvb_get_uint32(cmd_tvb, 44+off, ENC_LITTLE_ENDIAN);
6217
0
    cmd->cmd_ctx.fabric_cmd.prop_get.offset = prop_off;
6218
0
    dissect_nvmeof_fabric_prop_data(cmd_tree, cmd_tvb, 48+off, prop_off, attr);
6219
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_set_rsvd, cmd_tvb,
6220
0
                        56+off, 8, ENC_NA);
6221
0
}
6222
6223
static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off)
6224
0
{
6225
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_rsvd1, cmd_tvb,
6226
0
                        5+off, 35, ENC_NA);
6227
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_field, cmd_tvb,
6228
0
                        40+off, 24, ENC_NA);
6229
0
}
6230
6231
void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *nvme_tree,
6232
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off, bool link_data_req)
6233
0
{
6234
0
    proto_tree *cmd_tree;
6235
0
    proto_item *ti;
6236
0
    uint8_t fctype;
6237
0
    uint32_t prop_off;
6238
6239
0
    fctype = tvb_get_uint8(nvme_tvb, 4+off);
6240
0
    cmd->cmd_ctx.fabric_cmd.fctype = fctype;
6241
6242
0
    ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cmd, nvme_tvb, off,
6243
0
                             NVME_CMD_SIZE, ENC_NA);
6244
0
    cmd_tree = proto_item_add_subtree(ti, ett_data);
6245
6246
0
    proto_tree_add_bytes_format(cmd_tree, hf_nvmeof_cmd_opc, nvme_tvb, off, 1, NULL, "Opcode: 0x%x (Fabric Command)",
6247
0
                                NVME_FABRIC_OPC);
6248
0
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF %s", rval_to_str_const(fctype, fctype_tbl, "Unknown Command"));
6249
0
    prop_off = tvb_get_uint32(nvme_tvb, 44+off, ENC_LITTLE_ENDIAN);
6250
6251
0
    cmd->opcode = NVME_FABRIC_OPC;
6252
0
    if (link_data_req)
6253
0
        nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvmeof_data_req, cmd);
6254
0
    nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvmeof_data_tr, cmd);
6255
0
    nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvmeof_cqe_pkt, cmd);
6256
6257
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_rsvd, nvme_tvb,
6258
0
                        1+off, 1, ENC_NA);
6259
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_cid, nvme_tvb,
6260
0
                        2+off, 2, ENC_LITTLE_ENDIAN);
6261
6262
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_fctype, nvme_tvb,
6263
0
                        4+off, 1, ENC_LITTLE_ENDIAN);
6264
0
    switch(fctype) {
6265
0
    case NVME_FCTYPE_CONNECT:
6266
0
        dissect_nvmeof_fabric_connect_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
6267
0
        break;
6268
0
    case NVME_FCTYPE_PROP_GET:
6269
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property"));
6270
0
        dissect_nvmeof_fabric_prop_get_cmd(cmd_tree, nvme_tvb, cmd, off);
6271
0
        break;
6272
0
    case NVME_FCTYPE_PROP_SET:
6273
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property"));
6274
0
        dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb, cmd, off);
6275
0
        break;
6276
0
    case NVME_FCTYPE_DISCONNECT:
6277
0
        dissect_nvme_fabric_disconnect_cmd(cmd_tree, nvme_tvb, off);
6278
0
        break;
6279
0
    case NVME_FCTYPE_AUTH_RECV:
6280
0
    case NVME_FCTYPE_AUTH_SEND:
6281
0
        dissect_nvmeof_fabric_auth_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
6282
0
        break;
6283
0
    default:
6284
0
        dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb, off);
6285
0
        break;
6286
0
    }
6287
0
}
6288
6289
static void
6290
dissect_nvmeof_fabric_connect_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree,
6291
                                     unsigned pkt_off, unsigned off, unsigned len)
6292
0
{
6293
0
    if (!off) {
6294
0
        CHECK_STOP_PARSE(0, 16);
6295
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostid, data_tvb,
6296
0
                            pkt_off, 16, ENC_NA);
6297
0
    }
6298
0
    if (off <= 16) {
6299
0
        CHECK_STOP_PARSE(16, 2);
6300
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_cntlid, data_tvb,
6301
0
                            pkt_off + 16 - off, 2, ENC_LITTLE_ENDIAN);
6302
0
    }
6303
0
    if (off <= 18) {
6304
0
        CHECK_STOP_PARSE(18, 238);
6305
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd0, data_tvb,
6306
0
                            pkt_off + 18 - off, 238, ENC_NA);
6307
0
    }
6308
0
    if (off <= 256) {
6309
0
        CHECK_STOP_PARSE(256, 256);
6310
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_subnqn, data_tvb,
6311
0
                            pkt_off + 256 - off, 256, ENC_ASCII);
6312
0
    }
6313
0
    if (off <= 512) {
6314
0
        CHECK_STOP_PARSE(512, 256);
6315
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostnqn, data_tvb,
6316
0
                            pkt_off + 512 - off, 256, ENC_ASCII);
6317
0
    }
6318
0
    if (off <= 768) {
6319
0
        CHECK_STOP_PARSE(768, 256);
6320
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd1, data_tvb,
6321
0
                            pkt_off + 768 - off, 256, ENC_NA);
6322
0
    }
6323
0
}
6324
6325
void
6326
dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, packet_info *pinfo, proto_tree *data_tree,
6327
                                 unsigned pkt_off, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned len)
6328
0
{
6329
0
    uint32_t tr_off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd->tr_bytes;
6330
6331
0
    if (!pkt_off) {
6332
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeoF Data for %s, offset %u",
6333
0
            rval_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command"), tr_off);
6334
0
    }
6335
0
    if (cmd->cmd_ctx.fabric_cmd.fctype == NVME_FCTYPE_CONNECT && len >= 768)
6336
0
        dissect_nvmeof_fabric_connect_cmd_data(data_tvb, data_tree, pkt_off, tr_off, len);
6337
0
}
6338
6339
static void
6340
dissect_nvmeof_status_prop_get(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
6341
0
{
6342
0
    dissect_nvmeof_fabric_prop_data(cqe_tree, cqe_tvb, off, cmd->cmd_ctx.fabric_cmd.prop_get.offset, 1);
6343
0
}
6344
6345
static void
6346
dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb,
6347
                                  struct nvme_cmd_ctx *cmd, unsigned off)
6348
0
{
6349
0
    switch (cmd->cmd_ctx.fabric_cmd.fctype) {
6350
0
    case NVME_FCTYPE_CONNECT:
6351
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_cntlid, cqe_tvb,
6352
0
                            0+off, 2, ENC_LITTLE_ENDIAN);
6353
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_authreq, cqe_tvb,
6354
0
                            2+off, 2, ENC_LITTLE_ENDIAN);
6355
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_rsvd, cqe_tvb,
6356
0
                            4+off, 4, ENC_NA);
6357
0
        break;
6358
0
    case NVME_FCTYPE_PROP_GET:
6359
0
        dissect_nvmeof_status_prop_get(cqe_tree, cqe_tvb, cmd, off);
6360
0
        break;
6361
0
    case NVME_FCTYPE_PROP_SET:
6362
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_prop_set_rsvd, cqe_tvb,
6363
0
                            0+off, 8, ENC_NA);
6364
0
        break;
6365
0
    default:
6366
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb,
6367
0
                            0+off, 8, ENC_LITTLE_ENDIAN);
6368
0
        break;
6369
0
    };
6370
0
}
6371
6372
6373
const char *get_nvmeof_cmd_string(uint8_t fctype)
6374
0
{
6375
0
    return rval_to_str_const(fctype, fctype_tbl, "Unknown Fabric Command");
6376
0
}
6377
6378
static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned off, bool nvmeof);
6379
6380
void
6381
dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo,
6382
                        proto_tree *nvme_tree,
6383
                        struct nvme_cmd_ctx *cmd, unsigned off)
6384
0
{
6385
0
    proto_tree *cqe_tree;
6386
0
    proto_item *ti;
6387
0
    uint8_t fctype = cmd->cmd_ctx.fabric_cmd.fctype;
6388
6389
0
    ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cqe, nvme_tvb,
6390
0
                             0+off, NVME_CQE_SIZE, ENC_NA);
6391
6392
0
    if (fctype != NVME_FCTYPE_PROP_GET && fctype != NVME_FCTYPE_PROP_SET)
6393
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for %s", rval_to_str_const(fctype, fctype_tbl, "Unknown Command"));
6394
0
    else
6395
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for Property %s %s",
6396
0
                            (fctype == NVME_FCTYPE_PROP_GET) ? "Get" : "Set",
6397
0
                            val_to_str_const(cmd->cmd_ctx.fabric_cmd.prop_get.offset, prop_offset_tbl, "Unknown Property"));
6398
6399
0
    proto_item_append_text(ti, " (For Cmd: %s)", rval_to_str_const(fctype, fctype_tbl, "Unknown Cmd"));
6400
6401
0
    cqe_tree = proto_item_add_subtree(ti, ett_data);
6402
6403
0
    nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvmeof_cmd_pkt,
6404
0
                                 cmd);
6405
0
    nvme_publish_cmd_latency(cqe_tree, cmd, hf_nvmeof_cmd_latency);
6406
6407
0
    dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd, off);
6408
6409
0
    dissect_nvme_cqe_common(nvme_tvb, pinfo, cqe_tree, off, true);
6410
0
}
6411
6412
static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree)
6413
6
{
6414
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword10, nvme_tvb, 40, 4, ENC_LITTLE_ENDIAN);
6415
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, nvme_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6416
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, nvme_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6417
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, nvme_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6418
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, nvme_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6419
6
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, nvme_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6420
6
}
6421
6422
/* Format NVM – Secure Erase Settings (SES). */
6423
static const value_string fmt_nvm_ses_tbl[] = {
6424
    { 0x0, "No secure erase operation requested" },
6425
    { 0x1, "User Data Erase" },
6426
    { 0x2, "Cryptographic Erase" },
6427
    { 0, NULL }
6428
};
6429
6430
static void dissect_nvme_format_nvm_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6431
0
{
6432
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_format_nvm_dword10));
6433
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6434
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6435
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6436
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6437
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6438
0
}
6439
6440
/* Firmware Commit – Commit Action (CA). */
6441
static const value_string fw_commit_ca_tbl[] = {
6442
    { 0x0, "Replace image in slot, do not activate" },
6443
    { 0x1, "Replace image in slot, activate at next reset" },
6444
    { 0x2, "Activate existing image in slot at next reset" },
6445
    { 0x3, "Replace image in slot and activate immediately" },
6446
    { 0x6, "Replace Boot Partition specified by BPID" },
6447
    { 0x7, "Mark Boot Partition in BPID active, update BPINFO.ABPID" },
6448
    { 0, NULL }
6449
};
6450
6451
static void dissect_nvme_fw_commit_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6452
0
{
6453
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_fw_commit_dword10));
6454
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6455
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6456
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6457
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6458
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6459
0
}
6460
6461
static void dissect_nvme_fw_download_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6462
0
{
6463
0
    proto_tree_add_item(cmd_tree, hf_nvme_fw_download_numd, cmd_tvb, 40, 4, ENC_LITTLE_ENDIAN);
6464
0
    proto_tree_add_item(cmd_tree, hf_nvme_fw_download_ofst, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6465
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6466
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6467
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6468
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6469
0
}
6470
6471
/* Device Self-test – Self-test Code (STC). */
6472
static const value_string self_test_stc_tbl[] = {
6473
    { 0x1, "Short device self-test" },
6474
    { 0x2, "Extended device self-test" },
6475
    { 0x3, "Host-Initiated Refresh" },
6476
    { 0xe, "Vendor specific" },
6477
    { 0xf, "Abort device self-test" },
6478
    { 0, NULL }
6479
};
6480
6481
static void dissect_nvme_self_test_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6482
0
{
6483
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_self_test_dword10));
6484
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6485
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6486
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6487
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6488
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6489
0
}
6490
6491
/* Lockdown – Scope (SCP) / Interface (IFC). */
6492
static const value_string lockdown_scp_tbl[] = {
6493
    { 0x0, "Admin command opcode" },
6494
    { 0x2, "Set Features Feature Identifier" },
6495
    { 0x3, "Management Interface Command Set opcode" },
6496
    { 0x4, "PCIe Command Set opcode" },
6497
    { 0, NULL }
6498
};
6499
6500
static const value_string lockdown_ifc_tbl[] = {
6501
    { 0x0, "Admin Submission Queue" },
6502
    { 0x1, "Admin Submission Queue and out-of-band Management Endpoint" },
6503
    { 0x2, "Out-of-band Management Endpoint" },
6504
    { 0, NULL }
6505
};
6506
6507
static void dissect_nvme_lockdown_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6508
0
{
6509
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_lockdown_dword10));
6510
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6511
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6512
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6513
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_lockdown_dword14));
6514
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6515
0
}
6516
6517
/* Sanitize – Sanitize Action (SANACT). */
6518
static const value_string sanitize_act_tbl[] = {
6519
    { 0x1, "Exit Failure Mode" },
6520
    { 0x2, "Block Erase" },
6521
    { 0x3, "Overwrite" },
6522
    { 0x4, "Crypto Erase" },
6523
    { 0x5, "Exit Media Verification State" },
6524
    { 0, NULL }
6525
};
6526
6527
static void dissect_nvme_sanitize_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
6528
0
{
6529
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_sanitize_dword10));
6530
0
    proto_tree_add_item(cmd_tree, hf_nvme_sanitize_ovrpat, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
6531
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6532
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6533
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6534
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6535
0
}
6536
6537
/* Security Protocol (SECP), Security Send/Receive Command Dword 10.  Values
6538
 * are assigned by SPC-5; the commonly used identifiers are named here. */
6539
static const range_string security_secp_tbl[] = {
6540
    { 0x00, 0x00, "Security Protocol Information" },
6541
    { 0x01, 0x01, "TCG Storage - SP 1" },
6542
    { 0x02, 0x02, "TCG Storage - SP 2" },
6543
    { 0x03, 0x03, "TCG Storage - SP 3" },
6544
    { 0x04, 0x04, "TCG Storage - SP 4" },
6545
    { 0x05, 0x05, "TCG Storage - SP 5" },
6546
    { 0x06, 0x06, "TCG Storage - SP 6" },
6547
    { 0xE9, 0xE9, "NVMe over Fabrics Authentication" },
6548
    { 0xEA, 0xEA, "NVMe (RPMB / CDP Authentication)" },
6549
    { 0xEE, 0xEE, "IEEE 1667" },
6550
    { 0xF0, 0xFF, "Vendor Specific" },
6551
    { 0, 0, NULL }
6552
};
6553
6554
/* Security Send Command Dword 10 and Security Receive Command Dword 10
6555
 * share an identical layout: SECP/SPSP1/SPSP0/NSSF.
6556
 * The SECP and SPSP selectors are saved in cmd_ctx so the data payload
6557
 * (request data for Send, response data for Receive) can be dispatched to
6558
 * the matching security-protocol dissector. */
6559
static void dissect_nvme_security_dword10(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
6560
                                          struct nvme_cmd_ctx *cmd_ctx)
6561
0
{
6562
0
    const unsigned dw10_off = 40;
6563
0
    uint32_t dw10 = tvb_get_uint32(cmd_tvb, dw10_off, ENC_LITTLE_ENDIAN);
6564
6565
0
    add_group_mask_entry(cmd_tvb, cmd_tree, dw10_off, 4, ASPEC(hf_nvme_security_dword10));
6566
0
    cmd_ctx->cmd_ctx.security.secp = (uint8_t)(dw10 >> 24);
6567
    /* SPSP1 (bits 23:16) is the high byte of the SP Specific value, SPSP0
6568
     * (bits 15:08) the low byte, so bits 23:8 read as one field. */
6569
0
    cmd_ctx->cmd_ctx.security.spsp = (uint16_t)((dw10 >> 8) & 0xffff);
6570
0
}
6571
6572
static void dissect_nvme_security_send_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
6573
                                           struct nvme_cmd_ctx *cmd_ctx)
6574
0
{
6575
0
    dissect_nvme_security_dword10(cmd_tvb, cmd_tree, cmd_ctx);
6576
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_security_send_dword11_tl, cmd_tvb, 44, 4,
6577
0
                                 ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.security.xfer_len);
6578
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6579
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6580
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6581
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6582
0
}
6583
6584
static void dissect_nvme_security_recv_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
6585
                                           struct nvme_cmd_ctx *cmd_ctx)
6586
0
{
6587
0
    dissect_nvme_security_dword10(cmd_tvb, cmd_tree, cmd_ctx);
6588
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_security_recv_dword11_al, cmd_tvb, 44, 4,
6589
0
                                 ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.security.xfer_len);
6590
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
6591
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
6592
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN);
6593
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
6594
0
}
6595
6596
/* Security Protocol Information (SECP 00h), SPC-5 7.7.1: discovery data
6597
 * returned by Security Receive only, all fields big-endian.  SPSP 0000h
6598
 * returns the Supported Security Protocols List (6 reserved bytes, a 2-byte
6599
 * list length, then 1-byte protocol identifiers); SPSP 0001h returns
6600
 * Certificate Data (2 reserved bytes, a 2-byte length, then the certificate
6601
 * bytes, not parsed further).  Lengths are clamped to the payload.  Returns
6602
 * false for other SPSP values or truncated headers so the caller can fall
6603
 * back to the raw blob. */
6604
static bool dissect_nvme_security_info_resp(tvbuff_t *tvb, proto_tree *tree,
6605
                                            uint16_t spsp, unsigned len)
6606
0
{
6607
0
    proto_item *ti;
6608
0
    proto_tree *grp;
6609
0
    uint32_t plen;
6610
0
    unsigned i;
6611
6612
0
    if (spsp == 0x0000) {
6613
0
        if (len < 8)
6614
0
            return false;
6615
0
        ti = proto_tree_add_item(tree, hf_nvme_security_info, tvb, 0, len, ENC_NA);
6616
0
        grp = proto_item_add_subtree(ti, ett_data);
6617
0
        proto_tree_add_item(grp, hf_nvme_security_info_rsvd, tvb, 0, 6, ENC_NA);
6618
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_security_info_list_len,
6619
0
                                     tvb, 6, 2, ENC_BIG_ENDIAN, &plen);
6620
0
        if (plen > len - 8)
6621
0
            plen = len - 8;
6622
0
        for (i = 0; i < plen; i++)
6623
0
            proto_tree_add_item(grp, hf_nvme_security_info_protocol, tvb, 8 + i, 1, ENC_BIG_ENDIAN);
6624
0
        return true;
6625
0
    }
6626
0
    if (spsp == 0x0001) {
6627
0
        if (len < 4)
6628
0
            return false;
6629
0
        ti = proto_tree_add_item(tree, hf_nvme_security_info, tvb, 0, len, ENC_NA);
6630
0
        grp = proto_item_add_subtree(ti, ett_data);
6631
0
        proto_tree_add_item(grp, hf_nvme_security_info_rsvd, tvb, 0, 2, ENC_NA);
6632
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_security_info_cert_len,
6633
0
                                     tvb, 2, 2, ENC_BIG_ENDIAN, &plen);
6634
0
        if (plen > len - 4)
6635
0
            plen = len - 4;
6636
0
        if (plen)
6637
0
            proto_tree_add_item(grp, hf_nvme_security_info_cert_data, tvb, 4, plen, ENC_NA);
6638
0
        return true;
6639
0
    }
6640
0
    return false;
6641
0
}
6642
6643
/* The Security Send request data and Security Receive response data are
6644
 * Security Protocol specific (SPC-5), opaque at the NVMe layer.  SECP 00h
6645
 * (Security Protocol Information) response data is decoded here; other
6646
 * protocols dispatch to a registered security-protocol dissector (e.g. TCG
6647
 * Storage for SECP 01h/02h) via the "nvme.security.secp" table.  Payloads
6648
 * for protocols without a registered dissector, empty payloads, and windows
6649
 * that do not hold the complete protocol structure fall back to a labeled
6650
 * byte blob.  A window is only handed on when it starts at offset 0 (a later
6651
 * window cannot be re-aligned to the start of the structure) and is not known
6652
 * to be short: Security Send Dword 11 (Transfer Length) is the exact payload
6653
 * size, so a first window smaller than it is a partial transfer and would
6654
 * make the protocol dissector flag the frame as malformed.  Security Receive
6655
 * Dword 11 (Allocation Length) is only an upper bound - the controller may
6656
 * return less - so a short window there is indistinguishable from a complete
6657
 * short response and is still dispatched, as is any payload whose request
6658
 * (and hence Dword 11) was not captured. */
6659
static void dissect_nvme_security_data(tvbuff_t *tvb, packet_info *pinfo,
6660
                                       proto_tree *tree,
6661
                                       struct nvme_cmd_ctx *cmd_ctx,
6662
                                       unsigned off, unsigned len)
6663
0
{
6664
0
    bool is_send = (cmd_ctx->opcode == NVME_AQ_OPC_SECURITY_SEND);
6665
0
    uint32_t xfer_len = cmd_ctx->cmd_ctx.security.xfer_len;
6666
0
    bool partial = is_send && xfer_len != 0 && len < xfer_len;
6667
6668
0
    if (off == 0 && len > 0 && !partial) {
6669
0
        struct nvme_security_info sec = {
6670
0
            .send = is_send,
6671
0
            .secp = cmd_ctx->cmd_ctx.security.secp,
6672
0
            .spsp = cmd_ctx->cmd_ctx.security.spsp,
6673
0
        };
6674
0
        tvbuff_t *sec_tvb = tvb_new_subset_length(tvb, 0, len);
6675
6676
0
        if (sec.secp == 0x00 && !sec.send &&
6677
0
            dissect_nvme_security_info_resp(sec_tvb, tree, sec.spsp, len))
6678
0
            return;
6679
6680
0
        if (dissector_try_uint_with_data(nvme_security_secp_table, sec.secp,
6681
0
                                         sec_tvb, pinfo, tree, false, &sec))
6682
0
            return;
6683
0
    }
6684
0
    proto_tree_add_bytes_format_value(tree, hf_nvme_security_data, tvb, 0, len, NULL,
6685
0
                                      "NVMe Security Protocol Data (offset %u, %u bytes)", off, len);
6686
0
}
6687
6688
void
6689
nvme_dissect_admin_sqe_cdws(tvbuff_t *sqe_tvb, packet_info *pinfo,
6690
                            proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx)
6691
6
{
6692
6
    switch (cmd_ctx->opcode) {
6693
0
    case NVME_AQ_OPC_IDENTIFY:
6694
        /* CNS is one byte (CDW10 07:00); byte 41 is reserved */
6695
0
        cmd_ctx->cmd_ctx.cmd_identify.cns = tvb_get_uint8(sqe_tvb, 40);
6696
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
6697
0
        dissect_nvme_identify_cmd(sqe_tvb, tree);
6698
0
        break;
6699
0
    case NVME_AQ_OPC_GET_LOG_PAGE:
6700
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(tvb_get_uint8(sqe_tvb, 40)));
6701
0
        dissect_nvme_get_logpage_cmd(sqe_tvb, tree, cmd_ctx);
6702
0
        break;
6703
0
    case NVME_AQ_OPC_SET_FEATURES:
6704
0
        dissect_nvme_set_features_cmd(sqe_tvb, tree, cmd_ctx);
6705
0
        break;
6706
0
    case NVME_AQ_OPC_GET_FEATURES:
6707
0
        dissect_nvme_get_features_cmd(sqe_tvb, tree, cmd_ctx);
6708
0
        break;
6709
0
    case NVME_AQ_OPC_FW_COMMIT:
6710
0
        dissect_nvme_fw_commit_cmd(sqe_tvb, tree);
6711
0
        break;
6712
0
    case NVME_AQ_OPC_FW_IMG_DOWNLOAD:
6713
0
        dissect_nvme_fw_download_cmd(sqe_tvb, tree);
6714
0
        break;
6715
0
    case NVME_AQ_OPC_SELF_TEST:
6716
0
        dissect_nvme_self_test_cmd(sqe_tvb, tree);
6717
0
        break;
6718
0
    case NVME_AQ_OPC_LOCKDOWN:
6719
0
        dissect_nvme_lockdown_cmd(sqe_tvb, tree);
6720
0
        break;
6721
0
    case NVME_AQ_OPC_FORMAT_NVM:
6722
0
        dissect_nvme_format_nvm_cmd(sqe_tvb, tree);
6723
0
        break;
6724
0
    case NVME_AQ_OPC_SANITIZE:
6725
0
        dissect_nvme_sanitize_cmd(sqe_tvb, tree);
6726
0
        break;
6727
0
    case NVME_AQ_OPC_SECURITY_SEND:
6728
0
        dissect_nvme_security_send_cmd(sqe_tvb, tree, cmd_ctx);
6729
0
        break;
6730
0
    case NVME_AQ_OPC_SECURITY_RECV:
6731
0
        dissect_nvme_security_recv_cmd(sqe_tvb, tree, cmd_ctx);
6732
0
        break;
6733
6
    default:
6734
6
        dissect_nvme_unhandled_cmd(sqe_tvb, tree);
6735
6
        break;
6736
6
    }
6737
6
}
6738
6739
void
6740
dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
6741
                 struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx)
6742
7
{
6743
7
    proto_tree *cmd_tree;
6744
7
    proto_item *ti, *opc_item;
6745
6746
7
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
6747
7
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
6748
7
                             NVME_CMD_SIZE, ENC_NA);
6749
7
    proto_item_append_text(ti, " (Cmd)");
6750
7
    cmd_tree = proto_item_add_subtree(ti, ett_data);
6751
6752
7
    cmd_ctx->opcode = tvb_get_uint8(nvme_tvb, 0);
6753
7
    opc_item = proto_tree_add_item(cmd_tree, hf_nvme_cmd_opc, nvme_tvb,
6754
7
                        0, 1, ENC_LITTLE_ENDIAN);
6755
7
    if (q_ctx->qid) {
6756
0
        proto_item_append_text(opc_item, " %s", get_ioq_opcode_name(cmd_ctx->opcode));
6757
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", get_ioq_opcode_name(cmd_ctx->opcode));
6758
7
    } else {
6759
7
        proto_item_append_text(opc_item, " %s", get_aq_opcode_name(cmd_ctx->opcode));
6760
7
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", get_aq_opcode_name(cmd_ctx->opcode));
6761
7
    }
6762
6763
7
    nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvme_data_req, cmd_ctx);
6764
7
    nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvme_data_tr, cmd_ctx);
6765
7
    nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_cqe_pkt, cmd_ctx);
6766
6767
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_fuse_op, nvme_tvb,
6768
7
                        1, 1, ENC_NA);
6769
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd, nvme_tvb,
6770
7
                        1, 1, ENC_NA);
6771
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_psdt, nvme_tvb,
6772
7
                        1, 1, ENC_NA);
6773
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_cid, nvme_tvb,
6774
7
                        2, 2, ENC_LITTLE_ENDIAN);
6775
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_nsid, nvme_tvb,
6776
7
                        4, 4, ENC_LITTLE_ENDIAN);
6777
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd1, nvme_tvb,
6778
7
                        8, 8, ENC_NA);
6779
7
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, nvme_tvb,
6780
7
                        16, 8, ENC_LITTLE_ENDIAN);
6781
6782
7
    dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl, q_ctx, cmd_ctx, 0, PINFO_FD_VISITED(pinfo));
6783
6784
7
    if (q_ctx->qid) { //IOQ
6785
0
        switch (cmd_ctx->opcode) {
6786
0
        case NVME_IOQ_OPC_READ:
6787
0
        case NVME_IOQ_OPC_WRITE:
6788
0
            dissect_nvme_rw_cmd(nvme_tvb, cmd_tree);
6789
0
            break;
6790
0
        default:
6791
0
            dissect_nvme_unhandled_cmd(nvme_tvb, cmd_tree);
6792
0
            break;
6793
0
        }
6794
7
    } else { //AQ
6795
7
        nvme_dissect_admin_sqe_cdws(nvme_tvb, pinfo, cmd_tree, cmd_ctx);
6796
7
    }
6797
7
}
6798
6799
const char *nvme_get_opcode_string(uint8_t opcode, uint16_t qid)
6800
7
{
6801
7
    if (qid)
6802
0
        return get_ioq_opcode_name(opcode);
6803
7
    else
6804
7
        return get_aq_opcode_name(opcode);
6805
7
}
6806
6807
int
6808
nvme_is_io_queue_opcode(uint8_t opcode)
6809
7
{
6810
7
    return ((opcode == NVME_IOQ_OPC_FLUSH) ||
6811
7
            (opcode == NVME_IOQ_OPC_WRITE) ||
6812
7
            (opcode == NVME_IOQ_OPC_READ) ||
6813
7
            (opcode == NVME_IOQ_OPC_WRITE_UNCORRECTABLE) ||
6814
7
            (opcode == NVME_IOQ_OPC_COMPARE) ||
6815
7
            (opcode == NVME_IOQ_OPC_WRITE_ZEROS) ||
6816
7
            (opcode == NVME_IOQ_OPC_DATASET_MGMT) ||
6817
7
            (opcode == NVME_IOQ_OPC_RESV_REG) ||
6818
7
            (opcode == NVME_IOQ_OPC_RESV_REPORT) ||
6819
7
            (opcode == NVME_IOQ_OPC_RESV_ACQUIRE) ||
6820
7
            (opcode == NVME_IOQ_OPC_RESV_RELEASE));
6821
7
}
6822
6823
static const char *get_cqe_sc_string(unsigned sct, unsigned sc, bool nvmeof)
6824
0
{
6825
0
    switch (sct) {
6826
0
        case NVME_CQE_SCT_GENERIC: return val_to_str_const(sc, nvme_cqe_sc_gen_tbl, "Unknown Status Code");
6827
0
        case NVME_CQE_SCT_COMMAND: return (nvmeof) ? val_to_str_const(sc, nvmeof_cqe_sc_cmd_tbl, "Unknown Fabrics Status Code") :
6828
0
            val_to_str_const(sc, nvme_cqe_sc_cmd_tbl, "Unknown Status Code");
6829
0
        case NVME_CQE_SCT_MEDIA: return val_to_str_const(sc, nvme_cqe_sc_media_tbl, "Unknown Status Code");
6830
0
        case NVME_CQE_SCT_PATH: return val_to_str_const(sc, nvme_cqe_sc_path_tbl, "Unknown Status Code");
6831
0
        case NVME_CQE_SCT_VENDOR: return "Vendor Error";
6832
0
        default: return "Unknown Status Code";
6833
0
    }
6834
0
}
6835
6836
static const value_string nvme_cqe_sc_sf_err_dword0_tbl[] = {
6837
    { 0xD, "Feature Identifier Not Saveable" },
6838
    { 0xE, "Feature Not Changeable" },
6839
    { 0xF, "Feature Not Namespace Specific" },
6840
    { 0x14, "Overlapping Range" },
6841
    { 0x15, "I/O Command Set Combination Rejected" },
6842
    { 0x37, "Invalid Controller Data Queue" },
6843
    { 0x3E, "Invalid Power Limit" },
6844
    { 0, NULL },
6845
};
6846
6847
static const value_string nvme_cqe_aev_aet_dword0_tbl[] = {
6848
    { 0x0, "Error status" },
6849
    { 0x1, "SMART / Health status" },
6850
    { 0x2, "Notice" },
6851
    { 0x3, "Immediate" },
6852
    { 0x4, "One-Shot" },
6853
    { 0x6, "IO Command Set specific status" },
6854
    { 0x7, "Vendor specific" },
6855
    { 0, NULL },
6856
};
6857
6858
static const value_string nvme_cqe_aev_status_error_tbl[] = {
6859
    { 0x0, "Write to Invalid Doorbell Register" },
6860
    { 0x1, "Invalid Doorbell Write Value" },
6861
    { 0x2, "Diagnostic Failure" },
6862
    { 0x3, "Persistent Internal Error"},
6863
    { 0x4, "Transient Internal Error"},
6864
    { 0x5, "Firmware Image Load Error"},
6865
    { 0, NULL },
6866
};
6867
6868
static const value_string nvme_cqe_aev_status_smart_tbl[] = {
6869
    { 0x0, "NVM subsystem Reliability" },
6870
    { 0x1, "Temperature Threshold" },
6871
    { 0x2, "Spare Below Threshold" },
6872
    { 0, NULL },
6873
};
6874
6875
static const value_string nvme_cqe_aev_status_notice_tbl[] = {
6876
    { 0x0, "Attached Namespace Attribute Changed" },
6877
    { 0x1, "Firmware Activation Starting" },
6878
    { 0x2, "Telemetry Log Changed" },
6879
    { 0x3, "Asymmetric Namespace Access Change" },
6880
    { 0x4, "Predictable Latency Event Aggregate Log Change" },
6881
    { 0x5, "LBA Status Information Alert" },
6882
    { 0x6, "Endurance Group Event Aggregate Log Page Change" },
6883
    { 0x7, "Reachability Group Change" },
6884
    { 0x8, "Reachability Association Change" },
6885
    { 0x9, "Allocated Namespace Attribute Changed" },
6886
    { 0xEF, "Zone Descriptor Changed" },
6887
    { 0xF0, "Discovery Log Page Change" },
6888
    { 0xF1, "Host Discovery Log Page Change" },
6889
    { 0xF2, "AVE Discovery Log Page Change" },
6890
    { 0xF3, "Pull Model DDC Request" },
6891
    { 0xF4, "Cross-Controller Reset Completed" },
6892
    { 0xF5, "Lost Host Communication" },
6893
    { 0, NULL },
6894
};
6895
6896
static const value_string nvme_cqe_aev_status_nvm_tbl[] = {
6897
    { 0x0, "Reservation Log Page Available" },
6898
    { 0x1, "Sanitize Operation Completed" },
6899
    { 0x2, "Sanitize Operation Completed With Unexpected Deallocation" },
6900
    { 0x3, "Sanitize Operation Entered Media Verification State" },
6901
    { 0, NULL },
6902
};
6903
6904
void nvme_dissect_admin_cqe_dw0(tvbuff_t *nvme_tvb, int dw0_off, proto_tree *cqe_tree,
6905
                                uint16_t status, struct nvme_cmd_ctx *cmd_ctx)
6906
0
{
6907
0
    switch (cmd_ctx->opcode) {
6908
0
        case NVME_AQ_OPC_SET_FEATURES:
6909
0
        {
6910
0
            uint16_t sc = ((status & 0x1fe) >> 1);
6911
0
            if (sc) {
6912
0
                proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0_sf_err, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6913
0
            } else {
6914
0
                if (cmd_ctx->cmd_ctx.set_features.fid == F_NUM_OF_QUEUES)
6915
0
                    add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_dword0_sf_nq));
6916
0
                else
6917
0
                    proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6918
0
            }
6919
0
            break;
6920
0
        }
6921
0
        case NVME_AQ_OPC_GET_FEATURES:
6922
0
            switch (cmd_ctx->cmd_ctx.set_features.fid) {
6923
0
                case F_ARBITRATION: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_arb)); break;
6924
0
                case F_POWER_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_pm)); break;
6925
0
                case F_LBA_RANGE_TYPE: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbart)); break;
6926
0
                case F_TEMP_THRESHOLD: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_tt)); break;
6927
0
                case F_ERROR_RECOVERY: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_erec)); break;
6928
0
                case F_VOLATILE_WC: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_vwce)); break;
6929
0
                case F_NUM_OF_QUEUES: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nq)); break;
6930
0
                case F_IRQ_COALESCING: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqc)); break;
6931
0
                case F_IRQ_VECTOR_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqv)); break;
6932
0
                case F_WRITE_ATOM_NORM: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_wan)); break;
6933
0
                case F_ASYNC_EVENT_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_aec)); break;
6934
0
                case F_AUTO_PS_TRANSITION: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_apst)); break;
6935
0
                case F_KA_TIMER: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_kat)); break;
6936
0
                case F_HOST_CNTL_THERM_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hctm)); break;
6937
0
                case F_NO_POWER_STATE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nops)); break;
6938
0
                case F_READ_REC_LEVEL_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rrl)); break;
6939
0
                case F_PRED_LAT_MODE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmc)); break;
6940
0
                case F_PRED_LAT_MODE_WIND: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmw)); break;
6941
0
                case F_LBA_ST_INF_REP_INT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbasi)); break;
6942
0
                case F_SANITIZE_CON: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_san)); break;
6943
0
                case F_END_GROUP_EV_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_eg)); break;
6944
0
                case F_SW_PR_MARKER: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_swp)); break;
6945
0
                case F_HOST_ID: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hid)); break;
6946
0
                case F_RSRV_NOT_MASK: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvn)); break;
6947
0
                case F_RSRV_PRST: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvp)); break;
6948
0
                case F_NS_WRITE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nswp)); break;
6949
0
                default: proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); break;
6950
0
            }
6951
0
            break;
6952
0
        case NVME_AQ_OPC_ASYNC_EVE_REQ:
6953
0
        {
6954
0
            proto_item *ti;
6955
0
            proto_tree *grp;
6956
0
            unsigned i;
6957
0
            uint8_t aet;
6958
0
            uint8_t aei;
6959
0
            ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_aev_dword0[0], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6960
0
            grp =  proto_item_add_subtree(ti, ett_data);
6961
0
            for (i = 1; i < 4; i++)
6962
0
                ti = proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[i], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6963
            /* Asynchronous Event Information is CQE DW0 bits 15:08 (byte 1);
6964
             * byte 2 is the Log Page Identifier. */
6965
0
            aet = tvb_get_uint8(nvme_tvb, dw0_off) & 0x7;
6966
0
            aei = tvb_get_uint8(nvme_tvb, dw0_off + 1);
6967
0
            switch (aet) {
6968
0
                case 0: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_error_tbl, "Unknown")); break;
6969
0
                case 1: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_smart_tbl, "Unknown")); break;
6970
0
                case 2: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_notice_tbl, "Unknown")); break;
6971
0
                case 6: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_nvm_tbl, "Unknown")); break;
6972
0
            }
6973
0
            proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[4], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6974
0
            proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[5], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6975
0
            break;
6976
0
        }
6977
0
        default:
6978
0
            proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN);
6979
0
            break;
6980
0
    }
6981
0
}
6982
6983
/* Status Field word (Phase/SCT/SC/CRD/M/DNR) at status_off.  Factored out of
6984
 * dissect_nvme_cqe_common() so transports that carry the NVMe status word
6985
 * without the surrounding CQE layout (NVMe-MI omits SQHD/SQID/CID) can decode
6986
 * it at an explicit offset.  nvmeof selects the Reserved vs Phase Tag rendering
6987
 * of bit 0 and the fabrics status-code string table. */
6988
static void nvme_cqe_status_word(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned status_off, bool nvmeof)
6989
0
{
6990
0
    proto_item *ti;
6991
0
    proto_tree *grp;
6992
0
    uint16_t val;
6993
0
    unsigned i;
6994
6995
0
    val = tvb_get_uint16(nvme_tvb, status_off, ENC_LITTLE_ENDIAN);
6996
0
    ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_status[0], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN);
6997
    /* SC (08:01) or SCT (11:09) nonzero means the command did not complete
6998
     * successfully.  Phase Tag, CRD, M and DNR are deliberately excluded --
6999
     * none of them indicates failure. */
7000
0
    if (val & 0xFFE)
7001
0
        expert_add_info(pinfo, ti, &ei_nvme_cqe_status_error);
7002
0
    grp =  proto_item_add_subtree(ti, ett_data);
7003
0
    if (nvmeof)
7004
0
        proto_tree_add_item(grp, hf_nvme_cqe_status_rsvd, nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN);
7005
0
    else
7006
0
        proto_tree_add_item(grp, hf_nvme_cqe_status[1], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN);
7007
7008
0
    ti = proto_tree_add_item(grp, hf_nvme_cqe_status[2], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN);
7009
0
    proto_item_append_text(ti, " (%s)", get_cqe_sc_string((val & 0xE00) >> 9, (val & 0x1FE) >> 1, nvmeof));
7010
7011
0
    for (i = 3; i < array_length(hf_nvme_cqe_status); i++)
7012
0
        proto_tree_add_item(grp, hf_nvme_cqe_status[i], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN);
7013
0
}
7014
7015
void nvme_dissect_cqe_status(tvbuff_t *nvme_tvb, packet_info *pinfo, int status_off, proto_tree *cqe_tree)
7016
0
{
7017
0
    nvme_cqe_status_word(nvme_tvb, pinfo, cqe_tree, (unsigned)status_off, false);
7018
0
}
7019
7020
static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned off, bool nvmeof)
7021
0
{
7022
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqhd, nvme_tvb, off+8, 2, ENC_LITTLE_ENDIAN);
7023
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqid, nvme_tvb, off+10, 2, ENC_LITTLE_ENDIAN);
7024
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb, off+12, 2, ENC_LITTLE_ENDIAN);
7025
0
    nvme_cqe_status_word(nvme_tvb, pinfo, cqe_tree, off+14, nvmeof);
7026
0
}
7027
7028
void dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx)
7029
0
{
7030
0
    proto_tree *cqe_tree;
7031
0
    proto_item *ti;
7032
7033
0
    if (q_ctx->qid)
7034
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", get_ioq_opcode_name(cmd_ctx->opcode));
7035
0
    else
7036
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", get_aq_opcode_name(cmd_ctx->opcode));
7037
7038
0
    if (!q_ctx->qid) {
7039
0
        if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY)
7040
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
7041
0
        else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
7042
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid));
7043
0
    }
7044
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
7045
0
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
7046
0
                             NVME_CQE_SIZE, ENC_NA);
7047
0
    proto_item_append_text(ti, " (Cqe)");
7048
0
    cqe_tree = proto_item_add_subtree(ti, ett_data);
7049
7050
0
    nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_cmd_pkt, cmd_ctx);
7051
0
    nvme_publish_cmd_latency(cqe_tree, cmd_ctx, hf_nvme_cmd_latency);
7052
7053
0
    nvme_dissect_admin_cqe_dw0(nvme_tvb, 0, cqe_tree,
7054
0
                               tvb_get_uint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN), cmd_ctx);
7055
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword1, nvme_tvb, 4, 4, ENC_LITTLE_ENDIAN);
7056
0
    dissect_nvme_cqe_common(nvme_tvb, pinfo, cqe_tree, 0, false);
7057
0
}
7058
7059
void
7060
proto_register_nvme(void)
7061
16
{
7062
16
    static hf_register_info hf[] = {
7063
        /* NVMeOF Fabric Command Fields */
7064
16
        { &hf_nvmeof_cmd,
7065
16
            { "Cmd", "nvme.fabrics.cmd",
7066
16
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
7067
16
        },
7068
16
        { &hf_nvmeof_cmd_opc,
7069
16
            { "Opcode", "nvme.fabrics.cmd.opc",
7070
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7071
16
        },
7072
16
        { &hf_nvmeof_cmd_rsvd,
7073
16
            { "Reserved", "nvme.fabrics.cmd.rsvd",
7074
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7075
16
        },
7076
16
        { &hf_nvmeof_cmd_cid,
7077
16
            { "Command Identifier", "nvme.fabrics.cmd.cid",
7078
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7079
16
        },
7080
16
        { &hf_nvmeof_cmd_fctype,
7081
16
            { "Fabric Command Type", "nvme.fabrics.cmd.fctype",
7082
16
               FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(fctype_tbl), 0x0, NULL, HFILL}
7083
16
        },
7084
16
        { &hf_nvmeof_cmd_connect_rsvd1,
7085
16
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd1",
7086
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7087
16
        },
7088
16
        { &hf_nvmeof_cmd_connect_sgl1,
7089
16
            { "SGL1", "nvme.fabrics.cmd.connect.sgl1",
7090
16
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
7091
16
        },
7092
16
        { &hf_nvmeof_cmd_connect_recfmt,
7093
16
            { "Record Format", "nvme.fabrics.cmd.connect.recfmt",
7094
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7095
16
        },
7096
16
        { &hf_nvmeof_cmd_connect_qid,
7097
16
            { "Queue ID", "nvme.fabrics.cmd.connect.qid",
7098
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_nvme_qid), 0x0, NULL, HFILL}
7099
16
        },
7100
16
        { &hf_nvmeof_cmd_connect_sqsize,
7101
16
            { "Submission Queue Size", "nvme.fabrics.cmd.connect.sqsize",
7102
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_zero_base), 0x0, NULL, HFILL}
7103
16
        },
7104
16
        { &hf_nvmeof_cmd_connect_cattr[0],
7105
16
            { "Connect Attributes", "nvme.fabrics.cmd.connect.cattr",
7106
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7107
16
        },
7108
16
        { &hf_nvmeof_cmd_connect_cattr[1],
7109
16
            { "Priority Class", "nvme.fabrics.cmd.connect.cattr.pc",
7110
16
               FT_UINT8, BASE_HEX, VALS(pclass_tbl), 0x3, NULL, HFILL}
7111
16
        },
7112
16
        { &hf_nvmeof_cmd_connect_cattr[2],
7113
16
            { "Disable SQ Flow Control", "nvme.fabrics.cmd.connect.cattr.dfc",
7114
16
               FT_UINT8, BASE_HEX, NULL, 0x4, NULL, HFILL}
7115
16
        },
7116
16
        { &hf_nvmeof_cmd_connect_cattr[3],
7117
16
            { "Support Deletion of IO Queues", "nvme.fabrics.cmd.connect.cattr.dioq",
7118
16
               FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL}
7119
16
        },
7120
16
        { &hf_nvmeof_cmd_connect_cattr[4],
7121
16
            { "Reserved", "nvme.fabrics.cmd.connect.cattr.rsvd",
7122
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
7123
16
        },
7124
16
        { &hf_nvmeof_cmd_connect_rsvd2,
7125
16
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd2",
7126
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7127
16
        },
7128
16
        { &hf_nvmeof_cmd_connect_kato,
7129
16
            { "Keep Alive Timeout", "nvme.fabrics.cmd.connect.kato",
7130
16
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}
7131
16
        },
7132
16
        { &hf_nvmeof_cmd_connect_rsvd3,
7133
16
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd3",
7134
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7135
16
        },
7136
16
        { &hf_nvmeof_cmd_connect_data_hostid,
7137
16
            { "Host Identifier", "nvme.fabrics.cmd.connect.data.hostid",
7138
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7139
16
        },
7140
16
        { &hf_nvmeof_cmd_connect_data_cntlid,
7141
16
            { "Controller ID", "nvme.fabrics.cmd.connect.data.cntrlid",
7142
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7143
16
        },
7144
16
        { &hf_nvmeof_cmd_connect_data_rsvd0,
7145
16
            { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd0",
7146
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7147
16
        },
7148
16
        { &hf_nvmeof_cmd_connect_data_subnqn,
7149
16
            { "Subsystem NQN", "nvme.fabrics.cmd.connect.data.subnqn",
7150
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
7151
16
        },
7152
16
        { &hf_nvmeof_cmd_connect_data_hostnqn,
7153
16
            { "Host NQN", "nvme.fabrics.cmd.connect.data.hostnqn",
7154
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
7155
16
        },
7156
16
        { &hf_nvmeof_cmd_connect_data_rsvd1,
7157
16
            { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd1",
7158
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7159
16
        },
7160
16
        { &hf_nvmeof_cmd_auth_rsdv1,
7161
16
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd1",
7162
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7163
16
        },
7164
16
        { &hf_nvmeof_cmd_auth_sgl1,
7165
16
            { "SGL1", "nvme.fabrics.cmd.auth.sgl1",
7166
16
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
7167
16
        },
7168
16
        { &hf_nvmeof_cmd_auth_rsdv2,
7169
16
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd2",
7170
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7171
16
        },
7172
16
        { &hf_nvmeof_cmd_auth_spsp0,
7173
16
            { "SP Specific 0", "nvme.fabrics.cmd.auth.spsp0",
7174
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7175
16
        },
7176
16
        { &hf_nvmeof_cmd_auth_spsp1,
7177
16
            { "SP Specific 1", "nvme.fabrics.cmd.auth.spsp1",
7178
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7179
16
        },
7180
16
        { &hf_nvmeof_cmd_auth_secp,
7181
16
            { "Security Protocol", "nvme.fabrics.cmd.auth.secp",
7182
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7183
16
        },
7184
16
        { &hf_nvmeof_cmd_auth_al,
7185
16
            { "Allocation Length", "nvme.fabrics.cmd.auth.al",
7186
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7187
16
        },
7188
16
        { &hf_nvmeof_cmd_auth_rsdv3,
7189
16
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd3",
7190
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7191
16
        },
7192
16
        { &hf_nvmeof_cmd_disconnect_rsvd0,
7193
16
            { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd0",
7194
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7195
16
        },
7196
16
        { &hf_nvmeof_cmd_disconnect_recfmt,
7197
16
            { "Record Format", "nvme.fabrics.cmd.disconnect.recfmt",
7198
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7199
16
        },
7200
16
        { &hf_nvmeof_cmd_disconnect_rsvd1,
7201
16
            { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd1",
7202
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7203
16
        },
7204
16
        { &hf_nvmeof_cmd_prop_get_set_rsvd0,
7205
16
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd0",
7206
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7207
16
        },
7208
16
        { &hf_nvmeof_cmd_prop_get_set_attrib[0],
7209
16
            { "Attributes", "nvme.fabrics.cmd.prop_get_set.attrib",
7210
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7211
16
        },
7212
16
        { &hf_nvmeof_cmd_prop_get_set_attrib[1],
7213
16
            { "Property Size", "nvme.fabrics.cmd.prop_get_set.attrib.size",
7214
16
               FT_UINT8, BASE_HEX, VALS(attr_size_tbl), 0x7, NULL, HFILL}
7215
16
        },
7216
16
        { &hf_nvmeof_cmd_prop_get_set_attrib[2],
7217
16
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.attrib.rsvd",
7218
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
7219
16
        },
7220
16
        { &hf_nvmeof_cmd_prop_get_set_rsvd1,
7221
16
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd1",
7222
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7223
16
        },
7224
16
        { &hf_nvmeof_cmd_prop_get_set_offset,
7225
16
            { "Offset", "nvme.fabrics.cmd.prop_get_set.offset",
7226
16
               FT_UINT32, BASE_HEX, VALS(prop_offset_tbl), 0x0, NULL, HFILL}
7227
16
        },
7228
16
        { &hf_nvmeof_cmd_prop_get_rsvd2,
7229
16
            { "Reserved", "nvme.fabrics.cmd.prop_get.rsvd2",
7230
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7231
16
        },
7232
16
        { &hf_nvmeof_prop_get_set_data,
7233
16
            { "Property Data", "nvme.fabrics.prop_get_set.data",
7234
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7235
16
        },
7236
16
        { &hf_nvmeof_prop_get_set_data_4B,
7237
16
            { "Value", "nvme.fabrics.prop_get_set.data.4B",
7238
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7239
16
        },
7240
16
        { &hf_nvmeof_prop_get_set_data_4B_rsvd,
7241
16
            { "Reserved", "nvme.fabrics.prop_get_set.data.rsvd",
7242
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7243
16
        },
7244
16
        { &hf_nvmeof_prop_get_set_data_8B,
7245
16
            { "Value", "nvme.fabrics.prop_get_set.data.8B",
7246
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7247
16
        },
7248
16
        { &hf_nvmeof_prop_get_set_cc[0],
7249
16
            { "Controller Configuration", "nvme.fabrics.prop_get_set.cc",
7250
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7251
16
        },
7252
16
        { &hf_nvmeof_prop_get_set_cc[1],
7253
16
            { "Enable", "nvme.fabrics.prop_get_set.cc.en",
7254
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
7255
16
        },
7256
16
        { &hf_nvmeof_prop_get_set_cc[2],
7257
16
            { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd0",
7258
16
               FT_UINT32, BASE_HEX, NULL, 0xE, NULL, HFILL}
7259
16
        },
7260
16
        { &hf_nvmeof_prop_get_set_cc[3],
7261
16
            { "IO Command Set Selected", "nvme.fabrics.prop_get_set.cc.css",
7262
16
               FT_UINT32, BASE_HEX, VALS(css_table), 0x70, NULL, HFILL}
7263
16
        },
7264
16
        { &hf_nvmeof_prop_get_set_cc[4],
7265
16
            { "Memory Page Size", "nvme.fabrics.prop_get_set.cc.mps",
7266
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0x780, NULL, HFILL}
7267
16
        },
7268
16
        { &hf_nvmeof_prop_get_set_cc[5],
7269
16
            { "Arbitration Mechanism Selected", "nvme.fabrics.prop_get_set.cc.ams",
7270
16
               FT_UINT32, BASE_HEX, VALS(ams_table), 0x3800, NULL, HFILL}
7271
16
        },
7272
16
        { &hf_nvmeof_prop_get_set_cc[6],
7273
16
            { "Shutdown Notification", "nvme.fabrics.prop_get_set.cc.shn",
7274
16
               FT_UINT32, BASE_HEX, VALS(sn_table), 0xc000, NULL, HFILL}
7275
16
        },
7276
16
        { &hf_nvmeof_prop_get_set_cc[7],
7277
16
            { "IO Submission Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iosqes",
7278
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF0000, NULL, HFILL}
7279
16
        },
7280
16
        { &hf_nvmeof_prop_get_set_cc[8],
7281
16
            { "IO Completion Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iocqes",
7282
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF00000, NULL, HFILL}
7283
16
        },
7284
16
        { &hf_nvmeof_prop_get_set_cc[9],
7285
16
            { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd1",
7286
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
7287
16
        },
7288
16
        { &hf_nvmeof_prop_get_set_csts[0],
7289
16
            { "Controller Status", "nvme.fabrics.prop_get_set.csts",
7290
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7291
16
        },
7292
16
        { &hf_nvmeof_prop_get_set_csts[1],
7293
16
            { "Ready", "nvme.fabrics.prop_get_set.csts.rdy",
7294
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
7295
16
        },
7296
16
        { &hf_nvmeof_prop_get_set_csts[2],
7297
16
            { "Controller Fatal Status", "nvme.fabrics.prop_get_set.csts.cfs",
7298
16
               FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL}
7299
16
        },
7300
16
        { &hf_nvmeof_prop_get_set_csts[3],
7301
16
            { "Shutdown Status", "nvme.fabrics.prop_get_set.csts.shst",
7302
16
               FT_UINT32, BASE_HEX, VALS(shst_table), 0xC, NULL, HFILL}
7303
16
        },
7304
16
        { &hf_nvmeof_prop_get_set_csts[4],
7305
16
            { "NVM Subsystem Reset Occurred", "nvme.fabrics.prop_get_set.csts.nssro",
7306
16
               FT_UINT32, BASE_HEX, NULL, 0x10, NULL, HFILL}
7307
16
        },
7308
16
        { &hf_nvmeof_prop_get_set_csts[5],
7309
16
            { "Processing Paused", "nvme.fabrics.prop_get_set.csts.pp",
7310
16
               FT_UINT32, BASE_HEX, NULL, 0x20, NULL, HFILL}
7311
16
        },
7312
16
        { &hf_nvmeof_prop_get_set_csts[6],
7313
16
            { "Reserved", "nvme.fabrics.prop_get_set.csts.rsvd",
7314
16
               FT_UINT32, BASE_HEX, NULL, 0xffffffC0, NULL, HFILL}
7315
16
        },
7316
16
        { &hf_nvmeof_prop_get_set_nssr[0],
7317
16
            { "NVM Subsystem Reset", "nvme.fabrics.cmd.prop_attr.set.nssr",
7318
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7319
16
        },
7320
16
        { &hf_nvmeof_prop_get_set_nssr[1],
7321
16
            { "NVM Subsystem Reset Control", "nvme.fabrics.cmd.prop_attr.set.nssr.nssrc",
7322
16
               FT_UINT32, BASE_HEX, NULL, 0xffffffff, NULL, HFILL}
7323
16
        },
7324
16
        { &hf_nvmeof_cmd_prop_set_rsvd,
7325
16
            { "Reserved", "nvme.fabrics.cmd.prop_set.rsvd",
7326
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7327
16
        },
7328
16
        { &hf_nvmeof_cmd_generic_rsvd1,
7329
16
            { "Reserved", "nvme.fabrics.cmd.generic.rsvd1",
7330
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7331
16
        },
7332
16
        { &hf_nvmeof_cmd_generic_field,
7333
16
            { "Fabric Cmd specific field", "nvme.fabrics.cmd.generic.field",
7334
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7335
16
        },
7336
        /* NVMeOF Fabric Commands CQE fields */
7337
16
        { &hf_nvmeof_cqe,
7338
16
            { "Cqe", "nvme.fabrics.cqe",
7339
16
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
7340
16
        },
7341
16
        { &hf_nvmeof_cqe_sts,
7342
16
            { "Cmd specific Status", "nvme.fabrics.cqe.sts",
7343
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7344
16
        },
7345
16
        { &hf_nvmeof_prop_get_ccap[0],
7346
16
            { "Controller Capabilities", "nvme.fabrics.prop_get.ccap",
7347
16
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
7348
16
        },
7349
16
        { &hf_nvmeof_prop_get_ccap[1],
7350
16
            { "Maximum Queue Entries Supported", "nvme.fabrics.prop_get.ccap.mqes",
7351
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_zero_base), 0xffff, NULL, HFILL}
7352
16
        },
7353
16
        { &hf_nvmeof_prop_get_ccap[2],
7354
16
            { "Contiguous Queues Required", "nvme.fabrics.prop_get.ccap.cqr",
7355
16
               FT_BOOLEAN, 64, NULL, 0x10000, NULL, HFILL}
7356
16
        },
7357
16
        { &hf_nvmeof_prop_get_ccap[3],
7358
16
            { "Supports Arbitration Mechanism with Weighted Round Robin and Urgent Priority Class", "nvme.fabrics.prop_get.ccap.ams.wrr",
7359
16
               FT_BOOLEAN, 64, NULL, 0x20000, NULL, HFILL}
7360
16
        },
7361
16
        { &hf_nvmeof_prop_get_ccap[4],
7362
16
            { "Supports Arbitration Mechanism Vendor Specific", "nvme.fabrics.prop_get.ccap.ams.vs",
7363
16
               FT_BOOLEAN, 64, NULL, 0x40000, NULL, HFILL}
7364
16
        },
7365
16
        { &hf_nvmeof_prop_get_ccap[5],
7366
16
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd0",
7367
16
               FT_UINT64, BASE_HEX, NULL, 0xF80000, NULL, HFILL}
7368
16
        },
7369
16
        { &hf_nvmeof_prop_get_ccap[6],
7370
16
            { "Timeout (to ready status)", "nvme.fabrics.prop_get.ccap.to",
7371
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_500ms_units), 0xFF000000, NULL, HFILL}
7372
16
        },
7373
16
        { &hf_nvmeof_prop_get_ccap[7],
7374
16
            { "Doorbell Stride", "nvme.fabrics.prop_get.ccap.dstrd",
7375
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_dstrd_size), 0xF00000000, NULL, HFILL}
7376
16
        },
7377
16
        { &hf_nvmeof_prop_get_ccap[8],
7378
16
            { "NVM Subsystem Reset Supported", "nvme.fabrics.prop_get.ccap.nssrs",
7379
16
               FT_BOOLEAN, 64, NULL, 0x1000000000, NULL, HFILL}
7380
16
        },
7381
16
        { &hf_nvmeof_prop_get_ccap[9],
7382
16
            { "Command Sets Supported", "nvme.fabrics.prop_get.ccap.css",
7383
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ccap_css), 0x1FE000000000, NULL, HFILL}
7384
16
        },
7385
16
        { &hf_nvmeof_prop_get_ccap[10],
7386
16
            { "Boot Partition Support", "nvme.fabrics.prop_get.ccap.bps",
7387
16
               FT_BOOLEAN, 64, NULL, 0x200000000000, NULL, HFILL}
7388
16
        },
7389
16
        { &hf_nvmeof_prop_get_ccap[11],
7390
16
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsdv1",
7391
16
               FT_UINT64, BASE_HEX, NULL, 0xC00000000000, NULL, HFILL}
7392
16
        },
7393
16
        { &hf_nvmeof_prop_get_ccap[12],
7394
16
            { "Memory Page Size Minimum", "nvme.fabrics.prop_get.ccap.mpsmin",
7395
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF000000000000, NULL, HFILL}
7396
16
        },
7397
16
        { &hf_nvmeof_prop_get_ccap[13],
7398
16
            { "Memory Page Size Maximum", "nvme.fabrics.prop_get.ccap.mpsmax",
7399
16
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF0000000000000, NULL, HFILL}
7400
16
        },
7401
16
        { &hf_nvmeof_prop_get_ccap[14],
7402
16
            { "Persistent Memory Region Supported", "nvme.fabrics.prop_get.ccap.pmrs",
7403
16
               FT_BOOLEAN, 64, NULL, 0x100000000000000, NULL, HFILL}
7404
16
        },
7405
16
        { &hf_nvmeof_prop_get_ccap[15],
7406
16
            { "Controller Memory Buffer Supported", "nvme.fabrics.prop_get.ccap.cmbs",
7407
16
               FT_BOOLEAN, 64, NULL, 0x200000000000000, NULL, HFILL}
7408
16
        },
7409
16
        { &hf_nvmeof_prop_get_ccap[16],
7410
16
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd2",
7411
16
               FT_UINT64, BASE_HEX, NULL, 0xFC00000000000000, NULL, HFILL}
7412
16
        },
7413
16
        { &hf_nvmeof_prop_get_vs[0],
7414
16
            { "Version", "nvme.fabrics.prop_get.vs",
7415
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7416
16
        },
7417
16
        { &hf_nvmeof_prop_get_vs[1],
7418
16
            { "Tertiary Version", "nvme.fabrics.prop_get.vs.ter",
7419
16
               FT_UINT32, BASE_DEC, NULL, 0xff, NULL, HFILL}
7420
16
        },
7421
16
        { &hf_nvmeof_prop_get_vs[2],
7422
16
            { "Minor Version", "nvme.fabrics.prop_get.vs.mnr",
7423
16
               FT_UINT32, BASE_DEC, NULL, 0xff00, NULL, HFILL}
7424
16
        },
7425
16
        { &hf_nvmeof_prop_get_vs[3],
7426
16
            { "Major Version", "nvme.fabrics.prop_get.vs.mjr",
7427
16
               FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL}
7428
16
        },
7429
16
        { &hf_nvmeof_cqe_connect_cntlid,
7430
16
            { "Controller ID", "nvme.fabrics.cqe.connect.cntrlid",
7431
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7432
16
        },
7433
16
        { &hf_nvmeof_cqe_connect_authreq,
7434
16
            { "Authentication Required", "nvme.fabrics.cqe.connect.authreq",
7435
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7436
16
        },
7437
16
        { &hf_nvmeof_cqe_connect_rsvd,
7438
16
            { "Reserved", "nvme.fabrics.cqe.connect.rsvd",
7439
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7440
16
        },
7441
16
        { &hf_nvmeof_cqe_prop_set_rsvd,
7442
16
            { "Reserved", "nvme.fabrics.cqe.prop_set.rsvd",
7443
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7444
16
        },
7445
        /* Tracking commands, completions and transfers */
7446
16
                { &hf_nvmeof_cmd_pkt,
7447
16
            { "Fabric Cmd in", "nvme.fabrics.cmd_pkt",
7448
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7449
16
              "The Cmd for this transaction is in this frame", HFILL }
7450
16
        },
7451
16
        { &hf_nvmeof_cqe_pkt,
7452
16
            { "Fabric Cqe in", "nvme.fabrics.cqe_pkt",
7453
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7454
16
              "The Cqe for this transaction is in this frame", HFILL }
7455
16
        },
7456
16
        { &hf_nvmeof_data_req,
7457
16
            { "DATA Transfer Request", "nvme.fabrics.data_req",
7458
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7459
16
              "DATA transfer request for this transaction is in this frame", HFILL }
7460
16
        },
7461
16
        { &hf_nvmeof_data_tr[0],
7462
16
            { "DATA Transfer 0", "nvme.fabrics.data.tr0",
7463
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7464
16
              "DATA transfer 0 for this transaction is in this frame", HFILL }
7465
16
        },
7466
16
        { &hf_nvmeof_data_tr[1],
7467
16
            { "DATA Transfer 1", "nvme.fabrics.data_tr1",
7468
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7469
16
              "DATA transfer 1 for this transaction is in this frame", HFILL }
7470
16
        },
7471
16
        { &hf_nvmeof_data_tr[2],
7472
16
            { "DATA Transfer 2", "nvme.fabrics.data_tr2",
7473
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7474
16
              "DATA transfer 2 for this transaction is in this frame", HFILL }
7475
16
        },
7476
16
        { &hf_nvmeof_data_tr[3],
7477
16
            { "DATA Transfer 3", "nvme.fabrics.data_tr3",
7478
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7479
16
              "DATA transfer 3 for this transaction is in this frame", HFILL }
7480
16
        },
7481
16
        { &hf_nvmeof_data_tr[4],
7482
16
            { "DATA Transfer 4", "nvme.fabrics.data_tr4",
7483
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7484
16
              "DATA transfer 4 for this transaction is in this frame", HFILL }
7485
16
        },
7486
16
        { &hf_nvmeof_data_tr[5],
7487
16
            { "DATA Transfer 5", "nvme.fabrics.data_tr5",
7488
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7489
16
              "DATA transfer 5 for this transaction is in this frame", HFILL }
7490
16
        },
7491
16
        { &hf_nvmeof_data_tr[6],
7492
16
            { "DATA Transfer 6", "nvme.fabrics.data_tr6",
7493
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7494
16
              "DATA transfer 6 for this transaction is in this frame", HFILL }
7495
16
        },
7496
16
        { &hf_nvmeof_data_tr[7],
7497
16
            { "DATA Transfer 7", "nvme.fabrics.data_tr7",
7498
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7499
16
              "DATA transfer 7 for this transaction is in this frame", HFILL }
7500
16
        },
7501
16
        { &hf_nvmeof_data_tr[8],
7502
16
            { "DATA Transfer 8", "nvme.fabrics.data_tr8",
7503
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7504
16
              "DATA transfer 8 for this transaction is in this frame", HFILL }
7505
16
        },
7506
16
        { &hf_nvmeof_data_tr[9],
7507
16
            { "DATA Transfer 9", "nvme.fabrics.data_tr9",
7508
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7509
16
              "DATA transfer 9 for this transaction is in this frame", HFILL }
7510
16
        },
7511
16
        { &hf_nvmeof_data_tr[10],
7512
16
            { "DATA Transfer 10", "nvme.fabrics.data_tr10",
7513
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7514
16
              "DATA transfer 10 for this transaction is in this frame", HFILL }
7515
16
        },
7516
16
        { &hf_nvmeof_data_tr[11],
7517
16
            { "DATA Transfer 11", "nvme.fabrics.data_tr11",
7518
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7519
16
              "DATA transfer 11 for this transaction is in this frame", HFILL }
7520
16
        },
7521
16
        { &hf_nvmeof_data_tr[12],
7522
16
            { "DATA Transfer 12", "nvme.fabrics.data_tr12",
7523
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7524
16
              "DATA transfer 12 for this transaction is in this frame", HFILL }
7525
16
        },
7526
16
        { &hf_nvmeof_data_tr[13],
7527
16
            { "DATA Transfer 13", "nvme.fabrics.data_tr13",
7528
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7529
16
              "DATA transfer 13 for this transaction is in this frame", HFILL }
7530
16
        },
7531
16
        { &hf_nvmeof_data_tr[14],
7532
16
            { "DATA Transfer 14", "nvme.fabrics.data_tr14",
7533
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7534
16
              "DATA transfer 14 for this transaction is in this frame", HFILL }
7535
16
        },
7536
16
        { &hf_nvmeof_data_tr[15],
7537
16
            { "DATA Transfer 15", "nvme.fabrics.data_tr15",
7538
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
7539
16
              "DATA transfer 15 for this transaction is in this frame", HFILL }
7540
16
        },
7541
16
        { &hf_nvmeof_cmd_latency,
7542
16
            { "Cmd Latency", "nvme.fabrics.cmd_latency",
7543
16
              FT_DOUBLE, BASE_NONE, NULL, 0x0,
7544
16
              "The time between the command and completion, in usec", HFILL }
7545
16
        },
7546
        /* NVMe Command fields */
7547
16
        { &hf_nvme_cmd_opc,
7548
16
            { "Opcode", "nvme.cmd.opc",
7549
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7550
16
        },
7551
16
        { &hf_nvme_cmd_fuse_op,
7552
16
            { "Fuse Operation", "nvme.cmd.fuse_op",
7553
16
               FT_UINT8, BASE_HEX, NULL, 0x3, NULL, HFILL}
7554
16
        },
7555
16
        { &hf_nvme_cmd_rsvd,
7556
16
            { "Reserved", "nvme.cmd.rsvd",
7557
16
               FT_UINT8, BASE_HEX, NULL, 0x3c, NULL, HFILL}
7558
16
        },
7559
16
        { &hf_nvme_cmd_psdt,
7560
16
            { "PRP Or SGL", "nvme.cmd.psdt",
7561
16
               FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL}
7562
16
        },
7563
16
        { &hf_nvme_cmd_cid,
7564
16
            { "Command ID", "nvme.cmd.cid",
7565
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7566
16
        },
7567
16
        { &hf_nvme_cmd_nsid,
7568
16
            { "Namespace Id", "nvme.cmd.nsid",
7569
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7570
16
        },
7571
16
        { &hf_nvme_cmd_rsvd1,
7572
16
            { "Reserved", "nvme.cmd.rsvd1",
7573
16
               FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}
7574
16
        },
7575
16
        { &hf_nvme_cmd_mptr,
7576
16
            { "Metadata Pointer", "nvme.cmd.mptr",
7577
16
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
7578
16
        },
7579
16
        { &hf_nvme_cmd_sgl,
7580
16
            { "SGL1", "nvme.cmd.sgl1",
7581
16
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
7582
16
        },
7583
16
        { &hf_nvme_cmd_sgl_desc_sub_type,
7584
16
            { "Descriptor Sub Type", "nvme.cmd.sgl.subtype",
7585
16
               FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
7586
16
        },
7587
16
        { &hf_nvme_cmd_sgl_desc_type,
7588
16
            { "Descriptor Type", "nvme.cmd.sgl.type",
7589
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
7590
16
        },
7591
16
        { &hf_nvme_cmd_sgl_desc_addr,
7592
16
            { "Address", "nvme.cmd.sgl1.addr",
7593
16
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
7594
16
        },
7595
16
        { &hf_nvme_cmd_sgl_desc_addr_rsvd,
7596
16
            { "Reserved", "nvme.cmd.sgl1.addr_rsvd",
7597
16
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
7598
16
        },
7599
16
        { &hf_nvme_cmd_sgl_desc_len,
7600
16
            { "Length", "nvme.cmd.sgl1.len",
7601
16
               FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}
7602
16
        },
7603
16
        { &hf_nvme_cmd_sgl_desc_key,
7604
16
            { "Key", "nvme.cmd.sgl1.key",
7605
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7606
16
        },
7607
16
        { &hf_nvme_cmd_sgl_desc_rsvd,
7608
16
            { "Reserved", "nvme.cmd.sgl1.rsvd",
7609
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7610
16
        },
7611
16
        { &hf_nvme_cmd_dword10,
7612
16
            { "DWORD10", "nvme.cmd.dword10",
7613
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7614
16
        },
7615
16
        { &hf_nvme_cmd_dword11,
7616
16
            { "DWORD11", "nvme.cmd.dword11",
7617
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7618
16
        },
7619
16
        { &hf_nvme_cmd_dword12,
7620
16
            { "DWORD12", "nvme.cmd.dword12",
7621
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7622
16
        },
7623
16
        { &hf_nvme_cmd_dword13,
7624
16
            { "DWORD13", "nvme.cmd.dword13",
7625
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7626
16
        },
7627
16
        { &hf_nvme_cmd_dword14,
7628
16
            { "DWORD14", "nvme.cmd.dword14",
7629
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7630
16
        },
7631
16
        { &hf_nvme_cmd_dword15,
7632
16
            { "DWORD15", "nvme.cmd.dword15",
7633
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
7634
16
        },
7635
16
        { &hf_nvme_cmd_slba,
7636
16
            { "Start LBA", "nvme.cmd.slba",
7637
16
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
7638
16
        },
7639
16
        { &hf_nvme_cmd_nlb,
7640
16
            { "Absolute Number of Logical Blocks", "nvme.cmd.nlb",
7641
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0, NULL, HFILL}
7642
16
        },
7643
16
        { &hf_nvme_cmd_rsvd2,
7644
16
            { "Reserved", "nvme.cmd.rsvd2",
7645
16
               FT_UINT16, BASE_HEX, NULL, 0x03ff, NULL, HFILL}
7646
16
        },
7647
16
        { &hf_nvme_cmd_prinfo,
7648
16
            { "Protection info fields",
7649
16
              "nvme.cmd.prinfo",
7650
16
               FT_UINT16, BASE_HEX, NULL, 0x3c00, NULL, HFILL}
7651
16
        },
7652
16
        { &hf_nvme_cmd_prinfo_prchk_lbrtag,
7653
16
            { "check Logical block reference tag",
7654
16
              "nvme.cmd.prinfo.lbrtag",
7655
16
               FT_UINT16, BASE_HEX, NULL, 0x0400, NULL, HFILL}
7656
16
        },
7657
16
        { &hf_nvme_cmd_prinfo_prchk_apptag,
7658
16
            { "check application tag field",
7659
16
              "nvme.cmd.prinfo.apptag",
7660
16
               FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL}
7661
16
        },
7662
16
        { &hf_nvme_cmd_prinfo_prchk_guard,
7663
16
            { "check guard field",
7664
16
              "nvme.cmd.prinfo.guard",
7665
16
               FT_UINT16, BASE_HEX, NULL, 0x1000, NULL, HFILL}
7666
16
        },
7667
16
        { &hf_nvme_cmd_prinfo_pract,
7668
16
            { "action",
7669
16
              "nvme.cmd.prinfo.action",
7670
16
               FT_UINT16, BASE_HEX, NULL, 0x2000, NULL, HFILL}
7671
16
        },
7672
16
        { &hf_nvme_cmd_fua,
7673
16
            { "Force Unit Access", "nvme.cmd.fua",
7674
16
               FT_UINT16, BASE_HEX, NULL, 0x4000, NULL, HFILL}
7675
16
        },
7676
16
        { &hf_nvme_cmd_lr,
7677
16
            { "Limited Retry", "nvme.cmd.lr",
7678
16
               FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL}
7679
16
        },
7680
16
        { &hf_nvme_cmd_eilbrt,
7681
16
            { "Expected Initial Logical Block Reference Tag", "nvme.cmd.eilbrt",
7682
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7683
16
        },
7684
16
        { &hf_nvme_cmd_elbat,
7685
16
            { "Expected Logical Block Application Tag Mask", "nvme.cmd.elbat",
7686
16
               FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}
7687
16
        },
7688
16
        { &hf_nvme_cmd_elbatm,
7689
16
            { "Expected Logical Block Application Tag", "nvme.cmd.elbatm",
7690
16
               FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}
7691
16
        },
7692
16
        { &hf_nvme_cmd_dsm,
7693
16
            { "DSM Flags", "nvme.cmd.dsm",
7694
16
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
7695
16
        },
7696
16
        { &hf_nvme_cmd_dsm_access_freq,
7697
16
            { "Access frequency", "nvme.cmd.dsm.access_freq",
7698
16
               FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
7699
16
        },
7700
16
        { &hf_nvme_cmd_dsm_access_lat,
7701
16
            { "Access latency", "nvme.cmd.dsm.access_lat",
7702
16
               FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL}
7703
16
        },
7704
16
        { &hf_nvme_cmd_dsm_seq_req,
7705
16
            { "Sequential Request", "nvme.cmd.dsm.seq_req",
7706
16
               FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL}
7707
16
        },
7708
16
        { &hf_nvme_cmd_dsm_incompressible,
7709
16
            { "Incompressible", "nvme.cmd.dsm.incompressible",
7710
16
               FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL}
7711
16
        },
7712
16
        { &hf_nvme_cmd_rsvd3 ,
7713
16
            { "Reserved", "nvme.cmd.rsvd3",
7714
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7715
16
        },
7716
16
        { &hf_nvme_identify_dword10[0],
7717
16
            { "DWORD10", "nvme.cmd.identify.dword10",
7718
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7719
16
        },
7720
16
        { &hf_nvme_identify_dword10[1],
7721
16
            { "Controller or Namespace Structure (CNS)", "nvme.cmd.identify.dword10.cns",
7722
16
               FT_UINT32, BASE_HEX, VALS(cns_table), 0xff, NULL, HFILL}
7723
16
        },
7724
16
        { &hf_nvme_identify_dword10[2],
7725
16
            { "Reserved", "nvme.cmd.identify.dword10.rsvd",
7726
16
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
7727
16
        },
7728
16
        { &hf_nvme_identify_dword10[3],
7729
16
            { "Controller Identifier (CNTID)", "nvme.cmd.identify.dword10.cntid",
7730
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
7731
16
        },
7732
16
        { &hf_nvme_identify_dword11[0],
7733
16
            { "DWORD11", "nvme.cmd.identify.dword11",
7734
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7735
16
        },
7736
16
        { &hf_nvme_identify_dword11[1],
7737
16
            { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.dwrod11.nvmesetid",
7738
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
7739
16
        },
7740
        /* NVMe Base 2.3 Figure 324: Reserved is 23:16, CSI is 31:24. */
7741
16
        { &hf_nvme_identify_dword11[2],
7742
16
            { "Reserved", "nvme.cmd.identify.dword11.rsvd",
7743
16
               FT_UINT32, BASE_HEX, NULL, 0x00ff0000, NULL, HFILL}
7744
16
        },
7745
16
        { &hf_nvme_identify_dword11[3],
7746
16
            { "Command Set Identifier (CSI)", "nvme.cmd.identify.dword11.csi",
7747
16
               FT_UINT32, BASE_HEX, VALS(csi_tbl), 0xff000000, NULL, HFILL}
7748
16
        },
7749
16
        { &hf_nvme_identify_dword14[0],
7750
16
            { "DWORD14", "nvme.cmd.identify.dword14",
7751
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7752
16
        },
7753
16
        { &hf_nvme_identify_dword14[1],
7754
16
            { "UUID Index", "nvme.cmd.identify.dword14.uuid_index",
7755
16
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
7756
16
        },
7757
16
        { &hf_nvme_identify_dword14[2],
7758
16
            { "Reserved", "nvme.cmd.identify.dword14.rsvd",
7759
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
7760
16
        },
7761
        /* get log page */
7762
16
        { &hf_nvme_get_logpage_dword10[0],
7763
16
            { "DWORD 10", "nvme.cmd.get_logpage.dword10",
7764
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7765
16
        },
7766
16
        { &hf_nvme_get_logpage_dword10[1],
7767
16
            { "Log Page Identifier (LID)", "nvme.cmd.get_logpage.dword10.id",
7768
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff, NULL, HFILL}
7769
16
        },
7770
16
        { &hf_nvme_get_logpage_dword10[2],
7771
16
            { "Log Specific Field (LSP)", "nvme.cmd.get_logpage.dword10.lsp",
7772
16
               FT_UINT32, BASE_HEX, NULL, 0x7f00, NULL, HFILL}
7773
16
        },
7774
16
        { &hf_nvme_get_logpage_dword10[3],
7775
16
            { "Retain Asynchronous Event (RAE)", "nvme.cmd.get_logpage.dword10.rae",
7776
16
               FT_BOOLEAN, 32, NULL, 0x8000, NULL, HFILL}
7777
16
        },
7778
16
        { &hf_nvme_get_logpage_dword10[4],
7779
16
            { "Number of Dwords Lower (NUMDL)", "nvme.cmd.get_logpage.dword10.numdl",
7780
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
7781
16
        },
7782
16
        { &hf_nvme_get_logpage_numd,
7783
16
            { "Number of Dwords", "nvme.cmd.get_logpage.numd",
7784
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7785
16
        },
7786
16
        { &hf_nvme_get_logpage_dword11[0],
7787
16
            { "DWORD 11", "nvme.cmd.get_logpage.dword11",
7788
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7789
16
        },
7790
16
        { &hf_nvme_get_logpage_dword11[1],
7791
16
            { "Number of Dwords Upper (NUMDU)", "nvme.cmd.get_logpage.dword11.numdu",
7792
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
7793
16
        },
7794
16
        { &hf_nvme_get_logpage_dword11[2],
7795
16
            { "Log Specific Identifier", "nvme.cmd.get_logpage.dword11.lsi",
7796
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
7797
16
        },
7798
16
        { &hf_nvme_get_logpage_lpo,
7799
16
            { "Log Page Offset (DWORD 12 and DWORD 13)", "nvme.cmd.get_logpage.lpo",
7800
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7801
16
        },
7802
16
        { &hf_nvme_get_logpage_dword14[0],
7803
16
            { "DWORD 14", "nvme.cmd.get_logpage.dword14",
7804
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7805
16
        },
7806
        /* NVMe Base 2.3 Figure 205: UIDX is 06:00, Reserved 22:07, Offset Type
7807
         * bit 23, CSI 31:24. */
7808
16
        { &hf_nvme_get_logpage_dword14[1],
7809
16
            { "UUID Index", "nvme.cmd.identify.get_logpage.dword14.uuid_index",
7810
16
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
7811
16
        },
7812
16
        { &hf_nvme_get_logpage_dword14[2],
7813
16
            { "Reserved", "nvme.cmd.identify.get_logpage.dword14.rsvd",
7814
16
               FT_UINT32, BASE_HEX, NULL, 0x007fff80, NULL, HFILL}
7815
16
        },
7816
16
        { &hf_nvme_get_logpage_dword14[3],
7817
16
            { "Offset Type (OT)", "nvme.cmd.get_logpage.dword14.ot",
7818
16
               FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL}
7819
16
        },
7820
16
        { &hf_nvme_get_logpage_dword14[4],
7821
16
            { "Command Set Identifier (CSI)", "nvme.cmd.get_logpage.dword14.csi",
7822
16
               FT_UINT32, BASE_HEX, VALS(csi_tbl), 0xff000000, NULL, HFILL}
7823
16
        },
7824
        /* Set Features */
7825
16
        { &hf_nvme_set_features_dword10[0],
7826
16
            { "DWORD 10", "nvme.cmd.set_features.dword10",
7827
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7828
16
        },
7829
16
        { &hf_nvme_set_features_dword10[1],
7830
16
            { "Feature Identifier", "nvme.cmd.set_features.dword10.fid",
7831
16
               FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(fid_table), 0xff, NULL, HFILL}
7832
16
        },
7833
16
        { &hf_nvme_set_features_dword10[2],
7834
16
            { "Reserved", "nvme.cmd.set_features.dword10.rsvd",
7835
16
               FT_UINT32, BASE_HEX, NULL, 0x7fffff00, NULL, HFILL}
7836
16
        },
7837
16
        { &hf_nvme_set_features_dword10[3],
7838
16
            { "Save", "nvme.cmd.set_features.dword10.sv",
7839
16
               FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL}
7840
16
        },
7841
16
        { &hf_nvme_set_features_dword14[0],
7842
16
            { "DWORD 14", "nvme.cmd.set_features.dword14",
7843
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7844
16
        },
7845
16
        { &hf_nvme_set_features_dword14[1],
7846
16
            { "UUID Index", "nvme.cmd.set_features.dword14.uuid",
7847
16
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
7848
16
        },
7849
16
        { &hf_nvme_set_features_dword14[2],
7850
16
            { "Reserved", "nvme.cmd.set_features.dword14.rsvd",
7851
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
7852
16
        },
7853
        /* Format NVM – Command Dword 10 */
7854
16
        { &hf_nvme_format_nvm_dword10[0],
7855
16
            { "DWORD10", "nvme.cmd.format_nvm.dword10",
7856
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7857
16
        },
7858
16
        { &hf_nvme_format_nvm_dword10[1],
7859
16
            { "LBA Format Lower (LBAFL)", "nvme.cmd.format_nvm.dword10.lbafl",
7860
16
               FT_UINT32, BASE_HEX, NULL, 0x0000000f, NULL, HFILL}
7861
16
        },
7862
16
        { &hf_nvme_format_nvm_dword10[2],
7863
16
            { "Metadata Settings (MSET)", "nvme.cmd.format_nvm.dword10.mset",
7864
16
               FT_UINT32, BASE_HEX, NULL, 0x00000010, NULL, HFILL}
7865
16
        },
7866
16
        { &hf_nvme_format_nvm_dword10[3],
7867
16
            { "Protection Information (PI)", "nvme.cmd.format_nvm.dword10.pi",
7868
16
               FT_UINT32, BASE_HEX, NULL, 0x000000e0, NULL, HFILL}
7869
16
        },
7870
16
        { &hf_nvme_format_nvm_dword10[4],
7871
16
            { "Protection Information Location (PIL)", "nvme.cmd.format_nvm.dword10.pil",
7872
16
               FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL}
7873
16
        },
7874
16
        { &hf_nvme_format_nvm_dword10[5],
7875
16
            { "Secure Erase Settings (SES)", "nvme.cmd.format_nvm.dword10.ses",
7876
16
               FT_UINT32, BASE_HEX, VALS(fmt_nvm_ses_tbl), 0x00000e00, NULL, HFILL}
7877
16
        },
7878
16
        { &hf_nvme_format_nvm_dword10[6],
7879
16
            { "LBA Format Upper (LBAFU)", "nvme.cmd.format_nvm.dword10.lbafu",
7880
16
               FT_UINT32, BASE_HEX, NULL, 0x00003000, NULL, HFILL}
7881
16
        },
7882
16
        { &hf_nvme_format_nvm_dword10[7],
7883
16
            { "Reserved", "nvme.cmd.format_nvm.dword10.rsvd",
7884
16
               FT_UINT32, BASE_HEX, NULL, 0xffffc000, NULL, HFILL}
7885
16
        },
7886
        /* Firmware Commit – Command Dword 10 */
7887
16
        { &hf_nvme_fw_commit_dword10[0],
7888
16
            { "DWORD10", "nvme.cmd.fw_commit.dword10",
7889
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7890
16
        },
7891
16
        { &hf_nvme_fw_commit_dword10[1],
7892
16
            { "Firmware Slot (FS)", "nvme.cmd.fw_commit.dword10.fs",
7893
16
               FT_UINT32, BASE_HEX, NULL, 0x00000007, NULL, HFILL}
7894
16
        },
7895
16
        { &hf_nvme_fw_commit_dword10[2],
7896
16
            { "Commit Action (CA)", "nvme.cmd.fw_commit.dword10.ca",
7897
16
               FT_UINT32, BASE_HEX, VALS(fw_commit_ca_tbl), 0x00000038, NULL, HFILL}
7898
16
        },
7899
16
        { &hf_nvme_fw_commit_dword10[3],
7900
16
            { "Reserved", "nvme.cmd.fw_commit.dword10.rsvd",
7901
16
               FT_UINT32, BASE_HEX, NULL, 0x7fffffc0, NULL, HFILL}
7902
16
        },
7903
16
        { &hf_nvme_fw_commit_dword10[4],
7904
16
            { "Boot Partition ID (BPID)", "nvme.cmd.fw_commit.dword10.bpid",
7905
16
               FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL}
7906
16
        },
7907
        /* Firmware Image Download – Command Dwords 10/11 */
7908
16
        { &hf_nvme_fw_download_numd,
7909
16
            { "Number of Dwords (NUMD)", "nvme.cmd.fw_download.numd",
7910
16
               FT_UINT32, BASE_HEX, NULL, 0x0,
7911
16
               "Number of dwords to transfer, a 0's based value", HFILL}
7912
16
        },
7913
16
        { &hf_nvme_fw_download_ofst,
7914
16
            { "Offset (OFST)", "nvme.cmd.fw_download.ofst",
7915
16
               FT_UINT32, BASE_HEX, NULL, 0x0,
7916
16
               "Dword offset from the start of the firmware image", HFILL}
7917
16
        },
7918
        /* Device Self-test – Command Dword 10 */
7919
16
        { &hf_nvme_self_test_dword10[0],
7920
16
            { "DWORD10", "nvme.cmd.self_test.dword10",
7921
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7922
16
        },
7923
16
        { &hf_nvme_self_test_dword10[1],
7924
16
            { "Self-test Code (STC)", "nvme.cmd.self_test.dword10.stc",
7925
16
               FT_UINT32, BASE_HEX, VALS(self_test_stc_tbl), 0x0000000f, NULL, HFILL}
7926
16
        },
7927
16
        { &hf_nvme_self_test_dword10[2],
7928
16
            { "Reserved", "nvme.cmd.self_test.dword10.rsvd",
7929
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
7930
16
        },
7931
        /* Lockdown – Command Dword 10 */
7932
16
        { &hf_nvme_lockdown_dword10[0],
7933
16
            { "DWORD10", "nvme.cmd.lockdown.dword10",
7934
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7935
16
        },
7936
16
        { &hf_nvme_lockdown_dword10[1],
7937
16
            { "Scope (SCP)", "nvme.cmd.lockdown.dword10.scp",
7938
16
               FT_UINT32, BASE_HEX, VALS(lockdown_scp_tbl), 0x0000000f, NULL, HFILL}
7939
16
        },
7940
16
        { &hf_nvme_lockdown_dword10[2],
7941
16
            { "Prohibit (PRHBT)", "nvme.cmd.lockdown.dword10.prhbt",
7942
16
               FT_UINT32, BASE_HEX, NULL, 0x00000010, NULL, HFILL}
7943
16
        },
7944
16
        { &hf_nvme_lockdown_dword10[3],
7945
16
            { "Interface (IFC)", "nvme.cmd.lockdown.dword10.ifc",
7946
16
               FT_UINT32, BASE_HEX, VALS(lockdown_ifc_tbl), 0x00000060, NULL, HFILL}
7947
16
        },
7948
16
        { &hf_nvme_lockdown_dword10[4],
7949
16
            { "Reserved", "nvme.cmd.lockdown.dword10.rsvd0",
7950
16
               FT_UINT32, BASE_HEX, NULL, 0x00000080, NULL, HFILL}
7951
16
        },
7952
16
        { &hf_nvme_lockdown_dword10[5],
7953
16
            { "Opcode or Feature Identifier (OFI)", "nvme.cmd.lockdown.dword10.ofi",
7954
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ff00, NULL, HFILL}
7955
16
        },
7956
16
        { &hf_nvme_lockdown_dword10[6],
7957
16
            { "Reserved", "nvme.cmd.lockdown.dword10.rsvd1",
7958
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
7959
16
        },
7960
        /* Lockdown – Command Dword 14 */
7961
16
        { &hf_nvme_lockdown_dword14[0],
7962
16
            { "DWORD14", "nvme.cmd.lockdown.dword14",
7963
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7964
16
        },
7965
16
        { &hf_nvme_lockdown_dword14[1],
7966
16
            { "UUID Index (UIDX)", "nvme.cmd.lockdown.dword14.uidx",
7967
16
               FT_UINT32, BASE_HEX, NULL, 0x0000007f, NULL, HFILL}
7968
16
        },
7969
16
        { &hf_nvme_lockdown_dword14[2],
7970
16
            { "Reserved", "nvme.cmd.lockdown.dword14.rsvd",
7971
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
7972
16
        },
7973
        /* Sanitize – Command Dwords 10/11 */
7974
16
        { &hf_nvme_sanitize_dword10[0],
7975
16
            { "DWORD10", "nvme.cmd.sanitize.dword10",
7976
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7977
16
        },
7978
16
        { &hf_nvme_sanitize_dword10[1],
7979
16
            { "Sanitize Action (SANACT)", "nvme.cmd.sanitize.dword10.sanact",
7980
16
               FT_UINT32, BASE_HEX, VALS(sanitize_act_tbl), 0x00000007, NULL, HFILL}
7981
16
        },
7982
16
        { &hf_nvme_sanitize_dword10[2],
7983
16
            { "Allow Unrestricted Sanitize Exit (AUSE)", "nvme.cmd.sanitize.dword10.ause",
7984
16
               FT_UINT32, BASE_HEX, NULL, 0x00000008, NULL, HFILL}
7985
16
        },
7986
16
        { &hf_nvme_sanitize_dword10[3],
7987
16
            { "Overwrite Pass Count (OWPASS)", "nvme.cmd.sanitize.dword10.owpass",
7988
16
               FT_UINT32, BASE_HEX, NULL, 0x000000f0, NULL, HFILL}
7989
16
        },
7990
16
        { &hf_nvme_sanitize_dword10[4],
7991
16
            { "Overwrite Invert Pattern Between Passes (OIPBP)", "nvme.cmd.sanitize.dword10.oipbp",
7992
16
               FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL}
7993
16
        },
7994
16
        { &hf_nvme_sanitize_dword10[5],
7995
16
            { "No-Deallocate After Sanitize (NDAS)", "nvme.cmd.sanitize.dword10.ndas",
7996
16
               FT_UINT32, BASE_HEX, NULL, 0x00000200, NULL, HFILL}
7997
16
        },
7998
16
        { &hf_nvme_sanitize_dword10[6],
7999
16
            { "Enter Media Verification State (EMVS)", "nvme.cmd.sanitize.dword10.emvs",
8000
16
               FT_UINT32, BASE_HEX, NULL, 0x00000400, NULL, HFILL}
8001
16
        },
8002
16
        { &hf_nvme_sanitize_dword10[7],
8003
16
            { "Reserved", "nvme.cmd.sanitize.dword10.rsvd",
8004
16
               FT_UINT32, BASE_HEX, NULL, 0xfffff800, NULL, HFILL}
8005
16
        },
8006
16
        { &hf_nvme_sanitize_ovrpat,
8007
16
            { "Overwrite Pattern (OVRPAT)", "nvme.cmd.sanitize.ovrpat",
8008
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8009
16
        },
8010
        /* Security Send (81h) / Security Receive (82h) */
8011
16
        { &hf_nvme_security_dword10[0],
8012
16
            { "DWORD10", "nvme.cmd.security.dword10",
8013
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8014
16
        },
8015
16
        { &hf_nvme_security_dword10[1],
8016
16
            { "Security Protocol (SECP)", "nvme.cmd.security.dword10.secp",
8017
16
               FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(security_secp_tbl), 0xff000000, NULL, HFILL}
8018
16
        },
8019
16
        { &hf_nvme_security_dword10[2],
8020
16
            { "SP Specific 1 (SPSP1)", "nvme.cmd.security.dword10.spsp1",
8021
16
               FT_UINT32, BASE_HEX, NULL, 0x00ff0000, NULL, HFILL}
8022
16
        },
8023
16
        { &hf_nvme_security_dword10[3],
8024
16
            { "SP Specific 0 (SPSP0)", "nvme.cmd.security.dword10.spsp0",
8025
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ff00, NULL, HFILL}
8026
16
        },
8027
16
        { &hf_nvme_security_dword10[4],
8028
16
            { "NVMe Security Specific Field (NSSF)", "nvme.cmd.security.dword10.nssf",
8029
16
               FT_UINT32, BASE_HEX, NULL, 0x000000ff, NULL, HFILL}
8030
16
        },
8031
16
        { &hf_nvme_security_send_dword11_tl,
8032
16
            { "Transfer Length (TL)", "nvme.cmd.security_send.dword11.tl",
8033
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
8034
16
        },
8035
16
        { &hf_nvme_security_recv_dword11_al,
8036
16
            { "Allocation Length (AL)", "nvme.cmd.security_recv.dword11.al",
8037
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
8038
16
        },
8039
16
        { &hf_nvme_security_data,
8040
16
            { "Security Protocol Data", "nvme.cmd.security.data",
8041
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8042
16
        },
8043
16
        { &hf_nvme_security_info,
8044
16
            { "Security Protocol Information", "nvme.security.info",
8045
16
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
8046
16
        },
8047
16
        { &hf_nvme_security_info_rsvd,
8048
16
            { "Reserved", "nvme.security.info.rsvd",
8049
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8050
16
        },
8051
16
        { &hf_nvme_security_info_list_len,
8052
16
            { "Supported Security Protocol List Length", "nvme.security.info.list_len",
8053
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
8054
16
        },
8055
16
        { &hf_nvme_security_info_protocol,
8056
16
            { "Supported Security Protocol", "nvme.security.info.protocol",
8057
16
               FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(security_secp_tbl), 0x0, NULL, HFILL}
8058
16
        },
8059
16
        { &hf_nvme_security_info_cert_len,
8060
16
            { "Certificate Data Length", "nvme.security.info.cert_len",
8061
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
8062
16
        },
8063
16
        { &hf_nvme_security_info_cert_data,
8064
16
            { "Certificate Data", "nvme.security.info.cert_data",
8065
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8066
16
        },
8067
16
        { &hf_nvme_cmd_set_features_dword11_arb[0],
8068
16
            { "DWORD11", "nvme.cmd.set_features.dword11.arb",
8069
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8070
16
        },
8071
16
        { &hf_nvme_cmd_set_features_dword11_arb[1],
8072
16
            { "Arbitration Burst", "nvme.cmd.set_features.dword11.arb.ab",
8073
16
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
8074
16
        },
8075
16
        { &hf_nvme_cmd_set_features_dword11_arb[2],
8076
16
            { "Reserved", "nvme.cmd.set_features.dword11.arb.rsvd",
8077
16
               FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL}
8078
16
        },
8079
16
        { &hf_nvme_cmd_set_features_dword11_arb[3],
8080
16
            { "Low Priority Weight", "nvme.cmd.set_features.dword11.arb.lpw",
8081
16
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
8082
16
        },
8083
16
        { &hf_nvme_cmd_set_features_dword11_arb[4],
8084
16
            { "Medium Priority Weight", "nvme.cmd.set_features.dword11.arb.mpw",
8085
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
8086
16
        },
8087
16
        { &hf_nvme_cmd_set_features_dword11_arb[5],
8088
16
            { "High Priority Weight", "nvme.cmd.set_features.dword11.arb.hpw",
8089
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8090
16
        },
8091
16
        { &hf_nvme_cmd_set_features_dword11_pm[0],
8092
16
            { "DWORD11", "nvme.cmd.set_features.dword11.pm",
8093
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8094
16
        },
8095
16
        { &hf_nvme_cmd_set_features_dword11_pm[1],
8096
16
            { "Power State", "nvme.cmd.set_features.dword11.pm.ps",
8097
16
               FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL}
8098
16
        },
8099
16
        { &hf_nvme_cmd_set_features_dword11_pm[2],
8100
16
            { "Work Hint", "nvme.cmd.set_features.dword11.pm.wh",
8101
16
               FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL}
8102
16
        },
8103
16
        { &hf_nvme_cmd_set_features_dword11_pm[3],
8104
16
            { "Reserved", "nvme.cmd.set_features.dword11.pm.rsvd",
8105
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
8106
16
        },
8107
16
        { &hf_nvme_cmd_set_features_dword11_lbart[0],
8108
16
            { "DWORD11", "nvme.cmd.set_features.dword11.lbart",
8109
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8110
16
        },
8111
16
        { &hf_nvme_cmd_set_features_dword11_lbart[1],
8112
16
            { "Number of LBA Ranges (NUM)", "nvme.cmd.set_features.dword11.lbart.lbarn",
8113
16
               FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL}
8114
16
        },
8115
16
        { &hf_nvme_cmd_set_features_dword11_lbart[2],
8116
16
            { "Reserved", "nvme.cmd.set_features.dword11.lbart.rsvd",
8117
16
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
8118
16
        },
8119
16
        { &hf_nvme_cmd_set_features_dword11_tt[0],
8120
16
            { "DWORD11", "nvme.cmd.set_features.dword11.tt",
8121
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8122
16
        },
8123
16
        { &hf_nvme_cmd_set_features_dword11_tt[1],
8124
16
            { "Temperature Threshold", "nvme.cmd.set_features.dword11.tt.tmpth",
8125
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8126
16
        },
8127
16
        { &hf_nvme_cmd_set_features_dword11_tt[2],
8128
16
            { "Threshold Temperature Select", "nvme.cmd.set_features.dword11.tt.tmpsel",
8129
16
               FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL}
8130
16
        },
8131
16
        { &hf_nvme_cmd_set_features_dword11_tt[3],
8132
16
            { "Threshold Type Select", "nvme.cmd.set_features.dword11.tt.thpsel",
8133
16
               FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL}
8134
16
        },
8135
16
        { &hf_nvme_cmd_set_features_dword11_tt[4],
8136
16
            { "Temperature Threshold Hysteresis", "nvme.cmd.set_features.dword11.tt.tmpthh",
8137
16
               FT_UINT32, BASE_HEX, NULL, 0x1c00000, NULL, HFILL}
8138
16
        },
8139
16
        { &hf_nvme_cmd_set_features_dword11_tt[5],
8140
16
            { "Reserved", "nvme.cmd.set_features.dword11.tt.rsvd",
8141
16
               FT_UINT32, BASE_HEX, NULL, 0xfe000000, NULL, HFILL}
8142
16
        },
8143
16
        { &hf_nvme_cmd_set_features_dword11_erec[0],
8144
16
            { "DWORD11", "nvme.cmd.set_features.dword11.erec",
8145
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8146
16
        },
8147
16
        { &hf_nvme_cmd_set_features_dword11_erec[1],
8148
16
            { "Time Limited Error Recovery (100 ms units)", "nvme.cmd.set_features.dword11.erec.tler",
8149
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8150
16
        },
8151
16
        { &hf_nvme_cmd_set_features_dword11_erec[2],
8152
16
            { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cmd.set_features.dword11.erec.dulbe",
8153
16
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
8154
16
        },
8155
16
        { &hf_nvme_cmd_set_features_dword11_erec[3],
8156
16
            { "Reserved", "nvme.cmd.set_features.dword11.erec.rsvd",
8157
16
               FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL}
8158
16
        },
8159
16
        { &hf_nvme_cmd_set_features_dword11_vwce[0],
8160
16
            { "DWORD11", "nvme.cmd.set_features.dword11.vwce",
8161
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8162
16
        },
8163
16
        { &hf_nvme_cmd_set_features_dword11_vwce[1],
8164
16
            { "Volatile Write Cache Enable", "nvme.cmd.set_features.dword11.vwce.wce",
8165
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8166
16
        },
8167
16
        { &hf_nvme_cmd_set_features_dword11_vwce[2],
8168
16
            { "Reserved", "nvme.cmd.set_features.dword11.vwce.rsvd",
8169
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8170
16
        },
8171
16
        { &hf_nvme_cmd_set_features_dword11_nq[0],
8172
16
            { "DWORD11", "nvme.cmd.set_features.dword11.nq",
8173
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8174
16
        },
8175
16
        { &hf_nvme_cmd_set_features_dword11_nq[1],
8176
16
            { "Number of IO Submission Queues Requested", "nvme.cmd.set_features.dword11.nq.nsqr",
8177
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
8178
16
        },
8179
16
        { &hf_nvme_cmd_set_features_dword11_nq[2],
8180
16
            { "Number of IO Completion Queues Requested", "nvme.cmd.set_features.dword11.nq.ncqr",
8181
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
8182
16
        },
8183
16
        { &hf_nvme_cmd_set_features_dword11_irqc[0],
8184
16
            { "DWORD11", "nvme.cmd.set_features.dword11.irqc",
8185
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8186
16
        },
8187
16
        { &hf_nvme_cmd_set_features_dword11_irqc[1],
8188
16
            { "Aggregation Threshold", "nvme.cmd.set_features.dword11.irqc.thr",
8189
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8190
16
        },
8191
16
        { &hf_nvme_cmd_set_features_dword11_irqc[2],
8192
16
            { "Aggregation Time (100 us units)", "nvme.cmd.set_features.dword11.irqc.time",
8193
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8194
16
        },
8195
16
        { &hf_nvme_cmd_set_features_dword11_irqv[0],
8196
16
            { "DWORD11", "nvme.cmd.set_features.dword11.irqv",
8197
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8198
16
        },
8199
16
        { &hf_nvme_cmd_set_features_dword11_irqv[1],
8200
16
            { "IRQ Vector", "nvme.cmd.set_features.dword11.irqv.iv",
8201
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL}
8202
16
        },
8203
16
        { &hf_nvme_cmd_set_features_dword11_irqv[2],
8204
16
            { "Coalescing Disable", "nvme.cmd.set_features.dword11.irqv.cd",
8205
16
               FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL}
8206
16
        },
8207
16
        { &hf_nvme_cmd_set_features_dword11_irqv[3],
8208
16
            { "Reserved", "nvme.cmd.set_features.dword11.irqv.rsvd",
8209
16
               FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL}
8210
16
        },
8211
16
        { &hf_nvme_cmd_set_features_dword11_wan[0],
8212
16
            { "DWORD11", "nvme.cmd.set_features.dword11.wan",
8213
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8214
16
        },
8215
16
        { &hf_nvme_cmd_set_features_dword11_wan[1],
8216
16
            { "Disable Normal", "nvme.cmd.set_features.dword11.wan.dn",
8217
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8218
16
        },
8219
16
        { &hf_nvme_cmd_set_features_dword11_wan[2],
8220
16
            { "Reserved", "nvme.cmd.set_features.dword11.wan.rsvd",
8221
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8222
16
        },
8223
16
        { &hf_nvme_cmd_set_features_dword11_aec[0],
8224
16
            { "DWORD11", "nvme.cmd.set_features.dword11.aec",
8225
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8226
16
        },
8227
16
        { &hf_nvme_cmd_set_features_dword11_aec[1],
8228
16
            { "SMART and Health Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.aec.smart",
8229
16
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
8230
16
        },
8231
16
        { &hf_nvme_cmd_set_features_dword11_aec[2],
8232
16
            { "Namespace Attribute Notices", "nvme.cmd.set_features.dword11.aec.ns",
8233
16
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
8234
16
        },
8235
16
        { &hf_nvme_cmd_set_features_dword11_aec[3],
8236
16
            { "Firmware Activation Notices", "nvme.cmd.set_features.dword11.aec.fwa",
8237
16
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
8238
16
        },
8239
16
        { &hf_nvme_cmd_set_features_dword11_aec[4],
8240
16
            { "Telemetry Log Notices", "nvme.cmd.set_features.dword11.aec.tel",
8241
16
               FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL}
8242
16
        },
8243
16
        { &hf_nvme_cmd_set_features_dword11_aec[5],
8244
16
            { "ANA Change Notices", "nvme.cmd.set_features.dword11.aec.ana",
8245
16
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
8246
16
        },
8247
16
        { &hf_nvme_cmd_set_features_dword11_aec[6],
8248
16
            { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.plat",
8249
16
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
8250
16
        },
8251
16
        { &hf_nvme_cmd_set_features_dword11_aec[7],
8252
16
            { "LBA Status Information Notices", "nvme.cmd.set_features.dword11.aec.lba",
8253
16
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
8254
16
        },
8255
16
        { &hf_nvme_cmd_set_features_dword11_aec[8],
8256
16
            { "Endurance Group Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.eg",
8257
16
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
8258
16
        },
8259
16
        { &hf_nvme_cmd_set_features_dword11_aec[9],
8260
16
            { "Reserved", "nvme.cmd.set_features.dword11.aec.rsvd",
8261
16
               FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL}
8262
16
        },
8263
16
        { &hf_nvme_cmd_set_features_dword11_aec[10],
8264
16
            { "Discovery Log Page Change Notification", "nvme.cmd.set_features.dword11.aec.disc",
8265
16
               FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL}
8266
16
        },
8267
16
        { &hf_nvme_cmd_set_features_dword11_apst[0],
8268
16
            { "DWORD11", "nvme.cmd.set_features.dword11.apst",
8269
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8270
16
        },
8271
16
        { &hf_nvme_cmd_set_features_dword11_apst[1],
8272
16
            { "Autonomous Power State Transition Enable", "nvme.cmd.set_features.dword11.apst.apste",
8273
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8274
16
        },
8275
16
        { &hf_nvme_cmd_set_features_dword11_apst[2],
8276
16
            { "Reserved", "nvme.cmd.set_features.dword11.apst.rsvd",
8277
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8278
16
        },
8279
16
        { &hf_nvme_cmd_set_features_dword11_kat[0],
8280
16
            { "DWORD11", "nvme.cmd.set_features.dword11.kat",
8281
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8282
16
        },
8283
16
        { &hf_nvme_cmd_set_features_dword11_kat[1],
8284
16
            { "Keep Alive Timeout", "nvme.cmd.set_features.dword11.kat.kato",
8285
16
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL}
8286
16
        },
8287
16
        { &hf_nvme_cmd_set_features_dword11_hctm[0],
8288
16
            { "DWORD11", "nvme.cmd.set_features.dword11.hctm",
8289
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8290
16
        },
8291
16
        { &hf_nvme_cmd_set_features_dword11_hctm[1],
8292
16
            { "Thermal Management Temperature 2 (K)", "nvme.cmd.set_features.dword11.hctm.tmt2",
8293
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL}
8294
16
        },
8295
16
        { &hf_nvme_cmd_set_features_dword11_hctm[2],
8296
16
            { "Thermal Management Temperature 1 (K)", "nvme.cmd.set_features.dword11.hctm.tmt1",
8297
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8298
16
        },
8299
16
        { &hf_nvme_cmd_set_features_dword11_nops[0],
8300
16
            { "DWORD11", "nvme.cmd.set_features.dword11.nops",
8301
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8302
16
        },
8303
16
        { &hf_nvme_cmd_set_features_dword11_nops[1],
8304
16
            { "Non-Operational Power State Permissive Mode Enable", "nvme.cmd.set_features.dword11.nops.noppme",
8305
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8306
16
        },
8307
16
        { &hf_nvme_cmd_set_features_dword11_nops[2],
8308
16
            { "Reserved", "nvme.cmd.set_features.dword11.nops.rsvd",
8309
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8310
16
        },
8311
16
        { &hf_nvme_cmd_set_features_dword11_rrl[0],
8312
16
            { "DWORD11", "nvme.cmd.set_features.dword11.rrl",
8313
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8314
16
        },
8315
16
        { &hf_nvme_cmd_set_features_dword11_rrl[1],
8316
16
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.rrl.nvmsetid",
8317
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8318
16
        },
8319
16
        { &hf_nvme_cmd_set_features_dword11_rrl[2],
8320
16
            { "Reserved", "nvme.cmd.set_features.dword11.rrl.rsvd",
8321
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8322
16
        },
8323
16
        { &hf_nvme_cmd_set_features_dword12_rrl[0],
8324
16
            { "DWORD12", "nvme.cmd.set_features.dword12.rrl",
8325
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8326
16
        },
8327
16
        { &hf_nvme_cmd_set_features_dword12_rrl[1],
8328
16
            { "Read Recovery Level", "nvme.cmd.set_features.dword12.rrl.rrl",
8329
16
               FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL}
8330
16
        },
8331
16
        { &hf_nvme_cmd_set_features_dword12_rrl[2],
8332
16
            { "Reserved", "nvme.cmd.set_features.dword12.rrl.rsvd",
8333
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
8334
16
        },
8335
16
        { &hf_nvme_cmd_set_features_dword11_plmc[0],
8336
16
            { "DWORD11", "nvme.cmd.set_features.dword11.plmc",
8337
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8338
16
        },
8339
16
        { &hf_nvme_cmd_set_features_dword11_plmc[1],
8340
16
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmc.nvmsetid",
8341
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8342
16
        },
8343
16
        { &hf_nvme_cmd_set_features_dword11_plmc[2],
8344
16
            { "Reserved", "nvme.cmd.set_features.dword11.plmc.rsvd",
8345
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8346
16
        },
8347
16
        { &hf_nvme_cmd_set_features_dword12_plmc[0],
8348
16
            { "DWORD12", "nvme.cmd.set_features.dword12.plmc",
8349
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8350
16
        },
8351
16
        { &hf_nvme_cmd_set_features_dword12_plmc[1],
8352
16
            { "Predictable Latency Enable", "nvme.cmd.set_features.dword12.plmc.ple",
8353
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8354
16
        },
8355
16
        { &hf_nvme_cmd_set_features_dword12_plmc[2],
8356
16
            { "Reserved", "nvme.cmd.set_features.dword12.plmc.rsvd",
8357
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8358
16
        },
8359
16
        { &hf_nvme_cmd_set_features_dword11_plmw[0],
8360
16
            { "DWORD11", "nvme.cmd.set_features.dword11.plmw",
8361
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8362
16
        },
8363
16
        { &hf_nvme_cmd_set_features_dword11_plmw[1],
8364
16
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmw.nvmsetid",
8365
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8366
16
        },
8367
16
        { &hf_nvme_cmd_set_features_dword11_plmw[2],
8368
16
            { "Reserved", "nvme.cmd.set_features.dword11.plmw.rsvd",
8369
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8370
16
        },
8371
16
        { &hf_nvme_cmd_set_features_dword12_plmw[0],
8372
16
            { "DWORD12", "nvme.cmd.set_features.dword12.plmw",
8373
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8374
16
        },
8375
16
        { &hf_nvme_cmd_set_features_dword12_plmw[1],
8376
16
            { "Window Select (WSEL)", "nvme.cmd.set_features.dword12.plmw.ws",
8377
16
               FT_UINT32, BASE_HEX, VALS(sf_ws_table), 0x7, NULL, HFILL}
8378
16
        },
8379
16
        { &hf_nvme_cmd_set_features_dword12_plmw[2],
8380
16
            { "Reserved", "nvme.cmd.set_features.dword12.plmw.rsvd",
8381
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
8382
16
        },
8383
16
        { &hf_nvme_cmd_set_features_dword11_lbasi[0],
8384
16
            { "DWORD11", "nvme.cmd.set_features.dword11.lbasi",
8385
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8386
16
        },
8387
16
        { &hf_nvme_cmd_set_features_dword11_lbasi[1],
8388
16
            { "LBA Status Information Report Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsiri",
8389
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8390
16
        },
8391
16
        { &hf_nvme_cmd_set_features_dword11_lbasi[2],
8392
16
            { "LBA Status Information Poll Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsipi",
8393
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8394
16
        },
8395
16
        { &hf_nvme_cmd_set_features_dword11_san[0],
8396
16
            { "DWORD11", "nvme.cmd.set_features.dword11.san",
8397
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8398
16
        },
8399
16
        { &hf_nvme_cmd_set_features_dword11_san[1],
8400
16
            { "No-Deallocate Response Mode", "nvme.cmd.set_features.dword11.san.nodrm",
8401
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8402
16
        },
8403
16
        { &hf_nvme_cmd_set_features_dword11_san[2],
8404
16
            { "Reserved", "nvme.cmd.set_features.dword11.san.rsvd",
8405
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8406
16
        },
8407
16
        { &hf_nvme_cmd_set_features_dword11_eg[0],
8408
16
            { "DWORD11", "nvme.cmd.set_features.dword11.eg",
8409
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8410
16
        },
8411
16
        { &hf_nvme_cmd_set_features_dword11_eg[1],
8412
16
            { "Endurance Group Identifier", "nvme.cmd.set_features.dword11.eg.endgid",
8413
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8414
16
        },
8415
16
        { &hf_nvme_cmd_set_features_dword11_eg[2],
8416
16
            { "Endurance Group Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.eg.egcw",
8417
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
8418
16
        },
8419
16
        { &hf_nvme_cmd_set_features_dword11_eg[3],
8420
16
            { "Reserved", "nvme.cmd.set_features.dword11.eg.rsvd",
8421
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8422
16
        },
8423
16
        { &hf_nvme_cmd_set_features_dword11_swp[0],
8424
16
            { "DWORD11", "nvme.cmd.set_features.dword11.swp",
8425
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8426
16
        },
8427
16
        { &hf_nvme_cmd_set_features_dword11_swp[1],
8428
16
            { "Pre-boot Software Load Count", "nvme.cmd.set_features.dword11.swp.pbslc",
8429
16
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
8430
16
        },
8431
16
        { &hf_nvme_cmd_set_features_dword11_swp[2],
8432
16
            { "Reserved", "nvme.cmd.set_features.dword11.swp.rsvd",
8433
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
8434
16
        },
8435
16
        { &hf_nvme_cmd_set_features_dword11_hid[0],
8436
16
            { "DWORD11", "nvme.cmd.set_features.dword11.hid",
8437
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8438
16
        },
8439
16
        { &hf_nvme_cmd_set_features_dword11_hid[1],
8440
16
            { "Enable Extended Host Identifier", "nvme.cmd.set_features.dword11.hid.exhid",
8441
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8442
16
        },
8443
16
        { &hf_nvme_cmd_set_features_dword11_hid[2],
8444
16
            { "Reserved", "nvme.cmd.set_features.dword11.hid.rsvd",
8445
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8446
16
        },
8447
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[0],
8448
16
            { "DWORD11", "nvme.cmd.set_features.dword11.rsrvn",
8449
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8450
16
        },
8451
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[1],
8452
16
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd0",
8453
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8454
16
        },
8455
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[2],
8456
16
            { "Mask Registration Preempted Notification" , "nvme.cmd.set_features.dword11.rsrvn.regpre",
8457
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
8458
16
        },
8459
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[3],
8460
16
            { "Mask Reservation Released Notification", "nvme.cmd.set_features.dword11.rsrvn.resrel",
8461
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
8462
16
        },
8463
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[4],
8464
16
            { "Mask Reservation Preempted Notification", "nvme.cmd.set_features.dword11.rsrvn.resrpe",
8465
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
8466
16
        },
8467
16
        { &hf_nvme_cmd_set_features_dword11_rsrvn[5],
8468
16
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd1",
8469
16
               FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL}
8470
16
        },
8471
16
        { &hf_nvme_cmd_set_features_dword11_rsrvp[0],
8472
16
            { "DWORD11", "nvme.cmd.set_features.dword11.rsrvp",
8473
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8474
16
        },
8475
16
        { &hf_nvme_cmd_set_features_dword11_rsrvp[1],
8476
16
            { "Persist Through Power Loss", "nvme.cmd.set_features.dword11.rsrvp.ptpl",
8477
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8478
16
        },
8479
16
        { &hf_nvme_cmd_set_features_dword11_rsrvp[2],
8480
16
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvp.rsvd",
8481
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8482
16
        },
8483
16
        { &hf_nvme_cmd_set_features_dword11_nswp[0],
8484
16
            { "DWORD11", "nvme.cmd.set_features.dword11.nswp",
8485
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8486
16
        },
8487
16
        { &hf_nvme_cmd_set_features_dword11_nswp[1],
8488
16
            { "Write Protection State (WPS)", "nvme.cmd.set_features.dword11.nswp.wps",
8489
16
               FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL}
8490
16
        },
8491
16
        { &hf_nvme_cmd_set_features_dword11_nswp[2],
8492
16
            { "Reserved", "nvme.cmd.set_features.dword11.nswp.rsvd",
8493
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
8494
16
        },
8495
16
        { &hf_nvme_cmd_set_features_dword11_hmd[0],
8496
16
            { "DWORD11", "nvme.cmd.set_features.dword11.hmd",
8497
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8498
16
        },
8499
16
        { &hf_nvme_cmd_set_features_dword11_hmd[1],
8500
16
            { "Element Action", "nvme.cmd.set_features.dword11.hmd.ea",
8501
16
               FT_UINT32, BASE_HEX, VALS(sf_host_metadata_ea), 0x6000, NULL, HFILL}
8502
16
        },
8503
16
        { &hf_nvme_cmd_set_features_dword11_hmd[2],
8504
16
            { "Reserved", "nvme.cmd.set_features.dword11.hmd.rsvd",
8505
16
               FT_UINT32, BASE_HEX, NULL, 0xffff9fff, NULL, HFILL}
8506
16
        },
8507
16
        { &hf_nvme_cmd_set_features_dword11_hmb[0],
8508
16
            { "DWORD11", "nvme.cmd.set_features.dword11.hmb",
8509
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8510
16
        },
8511
16
        { &hf_nvme_cmd_set_features_dword11_hmb[1],
8512
16
            { "Enable Host Memory (EHM)", "nvme.cmd.set_features.dword11.hmb.ehm",
8513
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8514
16
        },
8515
16
        { &hf_nvme_cmd_set_features_dword11_hmb[2],
8516
16
            { "Memory Return (MR)", "nvme.cmd.set_features.dword11.hmb.mr",
8517
16
               FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL}
8518
16
        },
8519
16
        { &hf_nvme_cmd_set_features_dword11_hmb[3],
8520
16
            { "Host Memory Non-operational Access Restriction Enable (HMNARE)", "nvme.cmd.set_features.dword11.hmb.hmnare",
8521
16
               FT_UINT32, BASE_HEX, NULL, 0x4, NULL, HFILL}
8522
16
        },
8523
16
        { &hf_nvme_cmd_set_features_dword11_hmb[4],
8524
16
            { "Cleared to Zero (CTZ)", "nvme.cmd.set_features.dword11.hmb.ctz",
8525
16
               FT_UINT32, BASE_HEX, NULL, 0x8, NULL, HFILL}
8526
16
        },
8527
16
        { &hf_nvme_cmd_set_features_dword11_hmb[5],
8528
16
            { "Reserved", "nvme.cmd.set_features.dword11.hmb.rsvd",
8529
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
8530
16
        },
8531
16
        { &hf_nvme_cmd_set_features_dword11_iocsp[0],
8532
16
            { "DWORD11", "nvme.cmd.set_features.dword11.iocsp",
8533
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8534
16
        },
8535
16
        { &hf_nvme_cmd_set_features_dword11_iocsp[1],
8536
16
            { "I/O Command Set Combination Index (IOCSCI)", "nvme.cmd.set_features.dword11.iocsp.iocsci",
8537
16
               FT_UINT32, BASE_HEX, NULL, 0x1ff, NULL, HFILL}
8538
16
        },
8539
16
        { &hf_nvme_cmd_set_features_dword11_iocsp[2],
8540
16
            { "Reserved", "nvme.cmd.set_features.dword11.iocsp.rsvd",
8541
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffe00, NULL, HFILL}
8542
16
        },
8543
16
        { &hf_nvme_cmd_set_features_dword11_spinup[0],
8544
16
            { "DWORD11", "nvme.cmd.set_features.dword11.spinup",
8545
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8546
16
        },
8547
16
        { &hf_nvme_cmd_set_features_dword11_spinup[1],
8548
16
            { "Spinup Control Enable (SCE)", "nvme.cmd.set_features.dword11.spinup.sce",
8549
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8550
16
        },
8551
16
        { &hf_nvme_cmd_set_features_dword11_spinup[2],
8552
16
            { "Reserved", "nvme.cmd.set_features.dword11.spinup.rsvd",
8553
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8554
16
        },
8555
16
        { &hf_nvme_cmd_set_features_dword11_plsc[0],
8556
16
            { "DWORD11", "nvme.cmd.set_features.dword11.plsc",
8557
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8558
16
        },
8559
16
        { &hf_nvme_cmd_set_features_dword11_plsc[1],
8560
16
            { "Power Loss Signaling Mode (PLSM)", "nvme.cmd.set_features.dword11.plsc.plsm",
8561
16
               FT_UINT32, BASE_HEX, VALS(sf_plsm), 0x3, NULL, HFILL}
8562
16
        },
8563
16
        { &hf_nvme_cmd_set_features_dword11_plsc[2],
8564
16
            { "Reserved", "nvme.cmd.set_features.dword11.plsc.rsvd",
8565
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffc, NULL, HFILL}
8566
16
        },
8567
16
        { &hf_nvme_cmd_set_features_dword11_fdp[0],
8568
16
            { "DWORD11", "nvme.cmd.set_features.dword11.fdp",
8569
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8570
16
        },
8571
16
        { &hf_nvme_cmd_set_features_dword11_fdp[1],
8572
16
            { "Endurance Group Identifier (ENDGID)", "nvme.cmd.set_features.dword11.fdp.endgid",
8573
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8574
16
        },
8575
16
        { &hf_nvme_cmd_set_features_dword11_fdp[2],
8576
16
            { "Reserved", "nvme.cmd.set_features.dword11.fdp.rsvd",
8577
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8578
16
        },
8579
16
        { &hf_nvme_cmd_set_features_dword11_fdpe[0],
8580
16
            { "DWORD11", "nvme.cmd.set_features.dword11.fdpe",
8581
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8582
16
        },
8583
16
        { &hf_nvme_cmd_set_features_dword11_fdpe[1],
8584
16
            { "Placement Handle (PHNDL)", "nvme.cmd.set_features.dword11.fdpe.phndl",
8585
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8586
16
        },
8587
16
        { &hf_nvme_cmd_set_features_dword11_fdpe[2],
8588
16
            { "Number of FDP Event Types (NOET)", "nvme.cmd.set_features.dword11.fdpe.noet",
8589
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
8590
16
        },
8591
16
        { &hf_nvme_cmd_set_features_dword11_fdpe[3],
8592
16
            { "Reserved", "nvme.cmd.set_features.dword11.fdpe.rsvd",
8593
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8594
16
        },
8595
16
        { &hf_nvme_cmd_set_features_dword11_bpwpc[0],
8596
16
            { "DWORD11", "nvme.cmd.set_features.dword11.bpwpc",
8597
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8598
16
        },
8599
16
        { &hf_nvme_cmd_set_features_dword11_bpwpc[1],
8600
16
            { "Boot Partition 0 Write Protection State (BP0WPS)", "nvme.cmd.set_features.dword11.bpwpc.bp0wps",
8601
16
               FT_UINT32, BASE_HEX, VALS(sf_bpwps), 0x7, NULL, HFILL}
8602
16
        },
8603
16
        { &hf_nvme_cmd_set_features_dword11_bpwpc[2],
8604
16
            { "Boot Partition 1 Write Protection State (BP1WPS)", "nvme.cmd.set_features.dword11.bpwpc.bp1wps",
8605
16
               FT_UINT32, BASE_HEX, VALS(sf_bpwps), 0x38, NULL, HFILL}
8606
16
        },
8607
16
        { &hf_nvme_cmd_set_features_dword11_bpwpc[3],
8608
16
            { "Reserved", "nvme.cmd.set_features.dword11.bpwpc.rsvd",
8609
16
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
8610
16
        },
8611
        /* Set Features Transfers */
8612
16
        { &hf_nvme_set_features_tr_lbart,
8613
16
            { "LBA Range Structure", "nvme.set_features.lbart",
8614
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8615
16
        },
8616
16
        { &hf_nvme_set_features_tr_lbart_type,
8617
16
            { "Type", "nvme.set_features.lbart.type",
8618
16
               FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(sf_lbart_type_table), 0x0, NULL, HFILL}
8619
16
        },
8620
16
        { &hf_nvme_set_features_tr_lbart_attr[0],
8621
16
            { "Attributes", "nvme.set_features.lbart.attr",
8622
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8623
16
        },
8624
16
        { &hf_nvme_set_features_tr_lbart_attr[1],
8625
16
            { "LBA Range may be overwritten", "nvme.set_features.lbart.attr.ovw",
8626
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
8627
16
        },
8628
16
        { &hf_nvme_set_features_tr_lbart_attr[2],
8629
16
            { "LBA Range shall be hidden from OS/EFI/BIOS", "nvme.set_features.lbart.attr.hid",
8630
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
8631
16
        },
8632
16
        { &hf_nvme_set_features_tr_lbart_attr[3],
8633
16
            { "Reserved", "nvme.set_features.lbart.attr.rsvd",
8634
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
8635
16
        },
8636
16
        { &hf_nvme_set_features_tr_lbart_rsvd0,
8637
16
            { "Reserved", "nvme.set_features.lbart.rsvd0",
8638
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8639
16
        },
8640
16
        { &hf_nvme_set_features_tr_lbart_slba,
8641
16
            { "Starting LBA", "nvme.set_features.lbart.slba",
8642
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8643
16
        },
8644
16
        { &hf_nvme_set_features_tr_lbart_nlb,
8645
16
            { "Number of Logical Blocks", "nvme.set_features.lbart.nlb",
8646
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8647
16
        },
8648
16
        { &hf_nvme_set_features_tr_lbart_guid,
8649
16
            { "Unique Identifier", "nvme.set_features.lbart.guid",
8650
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8651
16
        },
8652
16
        { &hf_nvme_set_features_tr_lbart_rsvd1,
8653
16
            { "Reserved", "nvme.set_features.lbart.rsvd1",
8654
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8655
16
        },
8656
16
        { &hf_nvme_set_features_tr_apst[0],
8657
16
            { "Autonomous Power State Transition Structure", "nvme.set_features.lbart.apst",
8658
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8659
16
        },
8660
16
        { &hf_nvme_set_features_tr_apst[1],
8661
16
            { "Reserved", "nvme.set_features.lbart.apst.rsvd0",
8662
16
               FT_UINT64, BASE_HEX, NULL, 0x7, NULL, HFILL}
8663
16
        },
8664
16
        { &hf_nvme_set_features_tr_apst[2],
8665
16
            { "Idle Transition Power State", "nvme.set_features.lbart.apst.itps",
8666
16
               FT_UINT64, BASE_HEX, NULL, 0xf8, NULL, HFILL}
8667
16
        },
8668
16
        { &hf_nvme_set_features_tr_apst[3],
8669
16
            { "Idle Time Prior to Transition (ms)", "nvme.set_features.lbart.apst.itpt",
8670
16
               FT_UINT64, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
8671
16
        },
8672
16
        { &hf_nvme_set_features_tr_apst[4],
8673
16
            { "Reserved", "nvme.set_features.lbart.apst.rsvd1",
8674
16
               FT_UINT64, BASE_HEX, NULL, 0xffffffff00000000, NULL, HFILL}
8675
16
        },
8676
16
        { &hf_nvme_set_features_tr_tst[0],
8677
16
            { "Timestamp Structure", "nvme.set_features.tst",
8678
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8679
16
        },
8680
16
        { &hf_nvme_set_features_tr_tst[1],
8681
16
            { "Timestamp (milliseconds since 01-Jan-1970)", "nvme.set_features.tst.ms",
8682
16
               FT_UINT64, BASE_HEX, NULL, 0xffffffffffff, NULL, HFILL}
8683
16
        },
8684
16
        { &hf_nvme_set_features_tr_tst[2],
8685
16
            { "Reserved", "nvme.set_features.tst.rsvd",
8686
16
               FT_UINT64, BASE_HEX, NULL, 0xffff000000000000, NULL, HFILL}
8687
16
        },
8688
16
        { &hf_nvme_set_features_tr_plmc,
8689
16
            { "Deterministic Threshold Configuration Structure", "nvme.set_features.plmc",
8690
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8691
16
        },
8692
16
        { &hf_nvme_set_features_tr_plmc_ee[0],
8693
16
            { "Enable Event", "nvme.set_features.plmc.ee",
8694
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8695
16
        },
8696
16
        { &hf_nvme_set_features_tr_plmc_ee[1],
8697
16
            { "DTWIN Reads Warning", "nvme.set_features.plmc.ee.dtwinr",
8698
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
8699
16
        },
8700
16
        { &hf_nvme_set_features_tr_plmc_ee[2],
8701
16
            { "DTWIN Writes Warning", "nvme.set_features.plmc.ee.dtwinw",
8702
16
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
8703
16
        },
8704
16
        { &hf_nvme_set_features_tr_plmc_ee[3],
8705
16
            { "DTWIN Time Warning", "nvme.set_features.plmc.ee.dtwint",
8706
16
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
8707
16
        },
8708
16
        { &hf_nvme_set_features_tr_plmc_ee[4],
8709
16
            { "Reserved", "nvme.set_features.plmc.ee.rsvd",
8710
16
               FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL}
8711
16
        },
8712
16
        { &hf_nvme_set_features_tr_plmc_ee[5],
8713
16
            { "DTWIN to NDWIN transition due to typical or maximum value exceeded", "nvme.set_features.plmc.ee.ndtwindv",
8714
16
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
8715
16
        },
8716
16
        { &hf_nvme_set_features_tr_plmc_ee[6],
8717
16
            { "DTWIN to NDWIN transition due to Deterministic Excursion", "nvme.set_features.plmc.ee.ndtwindde",
8718
16
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
8719
16
        },
8720
16
        { &hf_nvme_set_features_tr_plmc_rsvd0,
8721
16
            { "Reserved", "nvme.set_features.plmc.rsvd0",
8722
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8723
16
        },
8724
16
        { &hf_nvme_set_features_tr_plmc_dtwinrt,
8725
16
            { "DTWIN Reads Threshold", "nvme.set_features.plmc.dtwinrt",
8726
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8727
16
        },
8728
16
        { &hf_nvme_set_features_tr_plmc_dtwinwt,
8729
16
            { "DTWIN Writes Threshold", "nvme.set_features.plmc.dtwinwt",
8730
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8731
16
        },
8732
16
        { &hf_nvme_set_features_tr_plmc_dtwintt,
8733
16
            { "DTWIN Time Threshold", "nvme.set_features.plmc.dtwintt",
8734
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8735
16
        },
8736
16
        { &hf_nvme_set_features_tr_plmc_rsvd1,
8737
16
            { "Reserved", "nvme.set_features.plmc.rsvd1",
8738
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8739
16
        },
8740
16
        { &hf_nvme_set_features_tr_hbs,
8741
16
            { "Host Behavior Support Structure", "nvme.set_features.hbs",
8742
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8743
16
        },
8744
16
        { &hf_nvme_set_features_tr_hbs_acre,
8745
16
            { "Advanced Command Retry Enable", "nvme.set_features.hbs.acre",
8746
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8747
16
        },
8748
16
        { &hf_nvme_set_features_tr_hbs_etdas,
8749
16
            { "Extended Telemetry Data Area 4 Supported", "nvme.set_features.hbs.etdas",
8750
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8751
16
        },
8752
16
        { &hf_nvme_set_features_tr_hbs_lbafee,
8753
16
            { "LBA Format Extension Enable", "nvme.set_features.hbs.lbafee",
8754
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8755
16
        },
8756
16
        { &hf_nvme_set_features_tr_hbs_hdisns,
8757
16
            { "Host Dispersed Namespace Support", "nvme.set_features.hbs.hdisns",
8758
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8759
16
        },
8760
16
        { &hf_nvme_set_features_tr_hbs_cdfe[0],
8761
16
            { "Copy Descriptor Formats Enable (CDFE)", "nvme.set_features.hbs.cdfe",
8762
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8763
16
        },
8764
16
        { &hf_nvme_set_features_tr_hbs_cdfe[1],
8765
16
            { "Not Used (NUSED)", "nvme.set_features.hbs.cdfe.nused",
8766
16
               FT_UINT16, BASE_HEX, NULL, 0x0003, NULL, HFILL}
8767
16
        },
8768
16
        { &hf_nvme_set_features_tr_hbs_cdfe[2],
8769
16
            { "Copy Descriptor Format 2h Enable", "nvme.set_features.hbs.cdfe.cdf2e",
8770
16
               FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL}
8771
16
        },
8772
16
        { &hf_nvme_set_features_tr_hbs_cdfe[3],
8773
16
            { "Copy Descriptor Format 3h Enable", "nvme.set_features.hbs.cdfe.cdf3e",
8774
16
               FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL}
8775
16
        },
8776
16
        { &hf_nvme_set_features_tr_hbs_cdfe[4],
8777
16
            { "Copy Descriptor Format 4h Enable", "nvme.set_features.hbs.cdfe.cdf4e",
8778
16
               FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL}
8779
16
        },
8780
16
        { &hf_nvme_set_features_tr_hbs_cdfe[5],
8781
16
            { "Reserved", "nvme.set_features.hbs.cdfe.rsvd",
8782
16
               FT_UINT16, BASE_HEX, NULL, 0xffe0, NULL, HFILL}
8783
16
        },
8784
16
        { &hf_nvme_set_features_tr_hbs_rsvd,
8785
16
            { "Reserved", "nvme.set_features.hbs.rsvd",
8786
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8787
16
        },
8788
16
        { &hf_nvme_set_features_tr_hmd,
8789
16
            { "Host Metadata Data Structure", "nvme.set_features.hmd",
8790
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8791
16
        },
8792
16
        { &hf_nvme_set_features_tr_hmd_nmed,
8793
16
            { "Number of Metadata Element Descriptors", "nvme.set_features.hmd.nmed",
8794
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
8795
16
        },
8796
16
        { &hf_nvme_set_features_tr_hmd_rsvd,
8797
16
            { "Reserved", "nvme.set_features.hmd.rsvd",
8798
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8799
16
        },
8800
16
        { &hf_nvme_set_features_tr_hmd_med,
8801
16
            { "Metadata Element Descriptor", "nvme.set_features.hmd.med",
8802
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8803
16
        },
8804
16
        { &hf_nvme_set_features_tr_hmd_med_et,
8805
16
            { "Element Type", "nvme.set_features.hmd.med.et",
8806
16
               FT_UINT32, BASE_HEX, NULL, 0x0000001f, NULL, HFILL}
8807
16
        },
8808
16
        { &hf_nvme_set_features_tr_hmd_med_er,
8809
16
            { "Element Revision", "nvme.set_features.hmd.med.er",
8810
16
               FT_UINT32, BASE_HEX, NULL, 0x00000f00, NULL, HFILL}
8811
16
        },
8812
16
        { &hf_nvme_set_features_tr_hmd_med_elen,
8813
16
            { "Element Length", "nvme.set_features.hmd.med.elen",
8814
16
               FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL}
8815
16
        },
8816
16
        { &hf_nvme_set_features_tr_hmd_med_eval,
8817
16
            { "Element Value", "nvme.set_features.hmd.med.eval",
8818
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
8819
16
        },
8820
        /* Get Features */
8821
16
        { &hf_nvme_get_features_dword10[0],
8822
16
            { "DWORD 10", "nvme.cmd.get_features.dword10",
8823
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8824
16
        },
8825
16
        { &hf_nvme_get_features_dword10[1],
8826
16
            { "Feature Identifier", "nvme.cmd.get_features.dword10.fid",
8827
16
               FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(fid_table), 0xff, NULL, HFILL}
8828
16
        },
8829
16
        { &hf_nvme_get_features_dword10[2],
8830
16
            { "Select", "nvme.cmd.set_features.dword10.sel",
8831
16
               FT_UINT32, BASE_HEX, VALS(sel_table), 0x700, NULL, HFILL}
8832
16
        },
8833
16
        { &hf_nvme_get_features_dword10[3],
8834
16
            { "Reserved", "nvme.cmd.get_features.dword10.rsvd",
8835
16
               FT_UINT32, BASE_HEX, NULL, 0xfffff800, NULL, HFILL}
8836
16
        },
8837
16
        { &hf_nvme_get_features_dword14[0],
8838
16
            { "DWORD 14", "nvme.cmd.get_features.dword14",
8839
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8840
16
        },
8841
16
        { &hf_nvme_get_features_dword14[1],
8842
16
            { "UUID Index", "nvme.cmd.get_features.dword14.uuid",
8843
16
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
8844
16
        },
8845
16
        { &hf_nvme_get_features_dword14[2],
8846
16
            { "Reserved", "nvme.cmd.get_features.dword14.rsvd",
8847
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
8848
16
        },
8849
16
        { &hf_nvme_cmd_get_features_dword11_rrl[0],
8850
16
            { "DWORD11", "nvme.cmd.get_features.dword11.rrl",
8851
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8852
16
        },
8853
16
        { &hf_nvme_cmd_get_features_dword11_rrl[1],
8854
16
            { "NVM Set Identifier", "nvme.cmd_get_features.dword11.rrl.nvmsetid",
8855
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8856
16
        },
8857
16
        { &hf_nvme_cmd_get_features_dword11_rrl[2],
8858
16
            { "Reserved", "nvme.cmd.get_features.dword11.rrl.rsvd",
8859
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8860
16
        },
8861
16
        { &hf_nvme_cmd_get_features_dword11_plmc[0],
8862
16
            { "DWORD11", "nvme.cmd.get_features.dword11.plmc",
8863
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8864
16
        },
8865
16
        { &hf_nvme_cmd_get_features_dword11_plmc[1],
8866
16
            { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmc.nvmsetid",
8867
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8868
16
        },
8869
16
        { &hf_nvme_cmd_get_features_dword11_plmc[2],
8870
16
            { "Reserved", "nvme.cmd.get_features.dword11.plmc.rsvd",
8871
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8872
16
        },
8873
16
        { &hf_nvme_cmd_get_features_dword11_plmw[0],
8874
16
            { "DWORD11", "nvme.cmd.get_features.dword11.plmw",
8875
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8876
16
        },
8877
16
        { &hf_nvme_cmd_get_features_dword11_plmw[1],
8878
16
            { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmw.nvmsetid",
8879
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8880
16
        },
8881
16
        { &hf_nvme_cmd_get_features_dword11_plmw[2],
8882
16
            { "Reserved", "nvme.cmd.get_features.dword11.plmw.rsvd",
8883
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8884
16
        },
8885
        /* Identify NS response */
8886
16
        { &hf_nvme_identify_ns_nsze,
8887
16
            { "Namespace Size (NSZE)", "nvme.cmd.identify.ns.nsze",
8888
16
               FT_UINT64, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8889
16
        },
8890
16
        { &hf_nvme_identify_ns_ncap,
8891
16
            { "Namespace Capacity (NCAP)", "nvme.cmd.identify.ns.ncap",
8892
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8893
16
        },
8894
16
        { &hf_nvme_identify_ns_nuse,
8895
16
            { "Namespace Utilization (NUSE)", "nvme.cmd.identify.ns.nuse",
8896
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
8897
16
        },
8898
16
        { &hf_nvme_identify_ns_nsfeat,
8899
16
            { "Namespace Features (NSFEAT)", "nvme.cmd.identify.ns.nsfeat",
8900
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8901
16
        },
8902
16
        { &hf_nvme_identify_ns_nlbaf,
8903
16
            { "Number of LBA Formats (NLBAF)", "nvme.cmd.identify.ns.nlbaf",
8904
16
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8905
16
        },
8906
16
        { &hf_nvme_identify_ns_flbas,
8907
16
            { "Formatted LBA Size (FLBAS)", "nvme.cmd.identify.ns.flbas",
8908
16
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8909
16
        },
8910
16
        { &hf_nvme_identify_ns_mc,
8911
16
            { "Metadata Capabilities (MC)", "nvme.cmd.identify.ns.mc",
8912
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8913
16
        },
8914
16
        { &hf_nvme_identify_ns_dpc,
8915
16
            { "End-to-end Data Protection Capabilities (DPC)", "nvme.cmd.identify.ns.dpc",
8916
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8917
16
        },
8918
16
        { &hf_nvme_identify_ns_dps,
8919
16
            { "End-to-end Data Protection Type Settings (DPS)", "nvme.cmd.identify.ns.dps",
8920
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8921
16
        },
8922
16
        { &hf_nvme_identify_ns_nmic,
8923
16
            { "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)",
8924
16
              "nvme.cmd.identify.ns.nmic", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8925
16
        },
8926
16
        { &hf_nvme_identify_ns_rescap,
8927
16
            { "Reservation Capabilities (RESCAP)", "nvme.cmd.identify.ns.rescap",
8928
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8929
16
        },
8930
16
        { &hf_nvme_identify_ns_fpi,
8931
16
            { "Format Progress Indicator (FPI)", "nvme.cmd.identify.ns.fpi",
8932
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8933
16
        },
8934
16
        { &hf_nvme_identify_ns_dlfeat[0],
8935
16
            { "Deallocate Logical Block Features (DLFEAT)", "nvme.cmd.identify.ns.dlfeat",
8936
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
8937
16
        },
8938
16
        { &hf_nvme_identify_ns_dlfeat[1],
8939
16
            { "Deallocation Read Behavior (DRB)", "nvme.cmd.identify.ns.dlfeat.drb",
8940
16
               FT_UINT8, BASE_HEX, VALS(ns_dlfeat_drb_tbl), 0x7, NULL, HFILL}
8941
16
        },
8942
16
        { &hf_nvme_identify_ns_dlfeat[2],
8943
16
            { "Write Zeroes Deallocation Support (WZDS)", "nvme.cmd.identify.ns.dlfeat.wzds",
8944
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
8945
16
        },
8946
16
        { &hf_nvme_identify_ns_dlfeat[3],
8947
16
            { "Guard Deallocation Status (GDS)", "nvme.cmd.identify.ns.dlfeat.gds",
8948
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
8949
16
        },
8950
16
        { &hf_nvme_identify_ns_dlfeat[4],
8951
16
            { "Reserved", "nvme.cmd.identify.ns.dlfeat.rsvd",
8952
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
8953
16
        },
8954
16
        { &hf_nvme_identify_ns_nawun,
8955
16
            { "Namespace Atomic Write Unit Normal (NAWUN)", "nvme.cmd.identify.ns.nawun",
8956
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8957
16
        },
8958
16
        { &hf_nvme_identify_ns_nawupf,
8959
16
            { "Namespace Atomic Write Unit Power Fail (NAWUPF)", "nvme.cmd.identify.ns.nawupf",
8960
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8961
16
        },
8962
16
        { &hf_nvme_identify_ns_nacwu,
8963
16
            { "Namespace Atomic Compare & Write Unit (NACWU)", "nvme.cmd.identify.ns.nacwu",
8964
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8965
16
        },
8966
16
        { &hf_nvme_identify_ns_nabsn,
8967
16
            { "Namespace Atomic Boundary Size Normal (NABSN)", "nvme.cmd.identify.ns.nabsn",
8968
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8969
16
        },
8970
16
        { &hf_nvme_identify_ns_nabo,
8971
16
            { "Namespace Atomic Boundary Offset (NABO)", "nvme.cmd.identify.ns.nabo",
8972
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8973
16
        },
8974
16
        { &hf_nvme_identify_ns_nabspf,
8975
16
            { "Namespace Atomic Boundary Size Power Fail (NABSPF)", "nvme.cmd.identify.ns.nabspf",
8976
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8977
16
        },
8978
16
        { &hf_nvme_identify_ns_noiob,
8979
16
            { "Namespace Optimal I/O Boundary (NOIOB)", "nvme.cmd.identify.ns.noiob",
8980
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8981
16
        },
8982
16
        { &hf_nvme_identify_ns_nvmcap,
8983
16
            { "NVM Capacity (NVMCAP)", "nvme.cmd.identify.ns.nvmcap",
8984
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8985
16
        },
8986
16
        { &hf_nvme_identify_ns_npwg,
8987
16
            { "Namespace Preferred Write Granularity (NPWG)", "nvme.cmd.identify.ns.npwg",
8988
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8989
16
        },
8990
16
        { &hf_nvme_identify_ns_npwa,
8991
16
            { "Namespace Preferred Write Alignment (NPWA)", "nvme.cmd.identify.ns.npwa",
8992
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8993
16
        },
8994
16
        { &hf_nvme_identify_ns_npdg,
8995
16
            { "Namespace Preferred Deallocate Granularity (NPDG)", "nvme.cmd.identify.ns.npdg",
8996
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
8997
16
        },
8998
16
        { &hf_nvme_identify_ns_npda,
8999
16
            { "Namespace Preferred Deallocate Alignment (NPDA)", "nvme.cmd.identify.ns.npda",
9000
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9001
16
        },
9002
16
        { &hf_nvme_identify_ns_nows,
9003
16
            { "Namespace Optimal Write Size (NOWS)", "nvme.cmd.identify.ns.nows",
9004
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9005
16
        },
9006
16
        { &hf_nvme_identify_ns_mssrl,
9007
16
            { "Maximum Single Source Range Length (MSSRL)", "nvme.cmd.identify.ns.mssrl",
9008
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9009
16
        },
9010
16
        { &hf_nvme_identify_ns_mcl,
9011
16
            { "Maximum Copy Length (MCL)", "nvme.cmd.identify.ns.mcl",
9012
16
               FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9013
16
        },
9014
16
        { &hf_nvme_identify_ns_msrc,
9015
16
            { "Maximum Source Range Count (MSRC)", "nvme.cmd.identify.ns.msrc",
9016
16
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9017
16
        },
9018
16
        { &hf_nvme_identify_ns_kpios[0],
9019
16
            { "Key Per I/O Status (KPIOS)", "nvme.cmd.identify.ns.kpios",
9020
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9021
16
        },
9022
16
        { &hf_nvme_identify_ns_kpios[1],
9023
16
            { "Key Per I/O Enabled in Namespace (KPIOENS)", "nvme.cmd.identify.ns.kpios.kpioens",
9024
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9025
16
        },
9026
16
        { &hf_nvme_identify_ns_kpios[2],
9027
16
            { "Key Per I/O Supported in Namespace (KPIOSNS)", "nvme.cmd.identify.ns.kpios.kpiosns",
9028
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9029
16
        },
9030
16
        { &hf_nvme_identify_ns_kpios[3],
9031
16
            { "Reserved", "nvme.cmd.identify.ns.kpios.rsvd",
9032
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9033
16
        },
9034
16
        { &hf_nvme_identify_ns_nulbaf,
9035
16
            { "Number of Unique Attribute LBA Formats (NULBAF)", "nvme.cmd.identify.ns.nulbaf",
9036
16
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9037
16
        },
9038
16
        { &hf_nvme_identify_ns_rsvd0,
9039
16
            { "Reserved", "nvme.cmd.identify.ns.rsvd0",
9040
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9041
16
        },
9042
16
        { &hf_nvme_identify_ns_kpiodaag,
9043
16
            { "Key Per I/O Data Access Alignment and Granularity (KPIODAAG)",
9044
16
              "nvme.cmd.identify.ns.kpiodaag",
9045
16
               FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9046
16
        },
9047
16
        { &hf_nvme_identify_ns_rsvd1,
9048
16
            { "Reserved", "nvme.cmd.identify.ns.rsvd1",
9049
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9050
16
        },
9051
16
        { &hf_nvme_identify_ns_anagrpid,
9052
16
            { "ANA Group Identifier (ANAGRPID)", "nvme.cmd.identify.ns.anagrpid",
9053
16
               FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9054
16
        },
9055
16
        { &hf_nvme_identify_ns_rsvd2,
9056
16
            { "Reserved", "nvme.cmd.identify.ns.rsvd2",
9057
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9058
16
        },
9059
16
        { &hf_nvme_identify_ns_nsattr,
9060
16
            { "Namespace Attributes (NSATTR)", "nvme.cmd.identify.ns.nsattr",
9061
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9062
16
        },
9063
16
        { &hf_nvme_identify_ns_nvmsetid,
9064
16
            { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.ns.nvmsetid",
9065
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9066
16
        },
9067
16
        { &hf_nvme_identify_ns_endgid,
9068
16
            { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.ns.endgid",
9069
16
               FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
9070
16
        },
9071
16
        { &hf_nvme_identify_ns_nguid,
9072
16
            { "Namespace Globally Unique Identifier (NGUID)", "nvme.cmd.identify.ns.nguid",
9073
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9074
16
        },
9075
16
        { &hf_nvme_identify_ns_eui64,
9076
16
            { "IEEE Extended Unique Identifier (EUI64)", "nvme.cmd.identify.ns.eui64",
9077
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9078
16
        },
9079
16
        { &hf_nvme_identify_ns_lbafs,
9080
16
            { "LBA Formats", "nvme.cmd.identify.ns.lbafs",
9081
16
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
9082
16
        },
9083
16
        { &hf_nvme_identify_ns_lbaf,
9084
16
            { "LBA Format", "nvme.cmd.identify.ns.lbaf",
9085
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9086
16
        },
9087
16
        { &hf_nvme_identify_ns_vs,
9088
16
            { "Vendor Specific", "nvme.cmd.identify.ns.vs",
9089
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9090
16
        },
9091
        /* Identify - I/O Command Set Independent Namespace (CNS 08h), Fig 335 */
9092
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[0],
9093
16
            { "Common Namespace Features (NSFEAT)", "nvme.cmd.identify.cs_ind_ns.nsfeat",
9094
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9095
16
        },
9096
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[1],
9097
16
            { "Volatile Write Cache Not Present (VWCNP)", "nvme.cmd.identify.cs_ind_ns.nsfeat.vwcnp",
9098
16
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
9099
16
        },
9100
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[2],
9101
16
            { "Rotational Media (RMEDIA)", "nvme.cmd.identify.cs_ind_ns.nsfeat.rmedia",
9102
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
9103
16
        },
9104
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[3],
9105
16
            { "UID Reuse (UIDREUSE)", "nvme.cmd.identify.cs_ind_ns.nsfeat.uidreuse",
9106
16
               FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}
9107
16
        },
9108
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[4],
9109
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsfeat.rsvd0",
9110
16
               FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL}
9111
16
        },
9112
16
        { &hf_nvme_identify_cs_ind_ns_nsfeat[5],
9113
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsfeat.rsvd1",
9114
16
               FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL}
9115
16
        },
9116
16
        { &hf_nvme_identify_cs_ind_ns_nmic[0],
9117
16
            { "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)", "nvme.cmd.identify.cs_ind_ns.nmic",
9118
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9119
16
        },
9120
16
        { &hf_nvme_identify_cs_ind_ns_nmic[1],
9121
16
            { "Dispersed Namespace (DISNS)", "nvme.cmd.identify.cs_ind_ns.nmic.disns",
9122
16
               FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
9123
16
        },
9124
16
        { &hf_nvme_identify_cs_ind_ns_nmic[2],
9125
16
            { "Shared Namespace (SHRNS)", "nvme.cmd.identify.cs_ind_ns.nmic.shrns",
9126
16
               FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
9127
16
        },
9128
16
        { &hf_nvme_identify_cs_ind_ns_nmic[3],
9129
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.nmic.rsvd",
9130
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9131
16
        },
9132
16
        { &hf_nvme_identify_cs_ind_ns_rescap[0],
9133
16
            { "Reservation Capabilities (RESCAP)", "nvme.cmd.identify.cs_ind_ns.rescap",
9134
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9135
16
        },
9136
16
        { &hf_nvme_identify_cs_ind_ns_rescap[1],
9137
16
            { "Ignore Existing Key Support (IEKS)", "nvme.cmd.identify.cs_ind_ns.rescap.ieks",
9138
16
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
9139
16
        },
9140
16
        { &hf_nvme_identify_cs_ind_ns_rescap[2],
9141
16
            { "Exclusive Access - All Registrants Support (EAARS)", "nvme.cmd.identify.cs_ind_ns.rescap.eaars",
9142
16
               FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
9143
16
        },
9144
16
        { &hf_nvme_identify_cs_ind_ns_rescap[3],
9145
16
            { "Write Exclusive - All Registrants Support (WEARS)", "nvme.cmd.identify.cs_ind_ns.rescap.wears",
9146
16
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
9147
16
        },
9148
16
        { &hf_nvme_identify_cs_ind_ns_rescap[4],
9149
16
            { "Exclusive Access - Registrants Only Support (EAROS)", "nvme.cmd.identify.cs_ind_ns.rescap.earos",
9150
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
9151
16
        },
9152
16
        { &hf_nvme_identify_cs_ind_ns_rescap[5],
9153
16
            { "Write Exclusive - Registrants Only Support (WEROS)", "nvme.cmd.identify.cs_ind_ns.rescap.weros",
9154
16
               FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL}
9155
16
        },
9156
16
        { &hf_nvme_identify_cs_ind_ns_rescap[6],
9157
16
            { "Exclusive Access Support (EAS)", "nvme.cmd.identify.cs_ind_ns.rescap.eas",
9158
16
               FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL}
9159
16
        },
9160
16
        { &hf_nvme_identify_cs_ind_ns_rescap[7],
9161
16
            { "Write Exclusive Support (WES)", "nvme.cmd.identify.cs_ind_ns.rescap.wes",
9162
16
               FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
9163
16
        },
9164
16
        { &hf_nvme_identify_cs_ind_ns_rescap[8],
9165
16
            { "Persist Through Power Loss Support (PTPLS)", "nvme.cmd.identify.cs_ind_ns.rescap.ptpls",
9166
16
               FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
9167
16
        },
9168
16
        { &hf_nvme_identify_cs_ind_ns_fpi[0],
9169
16
            { "Format Progress Indicator (FPI)", "nvme.cmd.identify.cs_ind_ns.fpi",
9170
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9171
16
        },
9172
16
        { &hf_nvme_identify_cs_ind_ns_fpi[1],
9173
16
            { "Format Progress Indicator Support (FPIS)", "nvme.cmd.identify.cs_ind_ns.fpi.fpis",
9174
16
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
9175
16
        },
9176
16
        { &hf_nvme_identify_cs_ind_ns_fpi[2],
9177
16
            { "Remaining Format NVM (RFNVM)", "nvme.cmd.identify.cs_ind_ns.fpi.rfnvm",
9178
16
               FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL}
9179
16
        },
9180
16
        { &hf_nvme_identify_cs_ind_ns_anagrpid,
9181
16
            { "ANA Group Identifier (ANAGRPID)", "nvme.cmd.identify.cs_ind_ns.anagrpid",
9182
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9183
16
        },
9184
16
        { &hf_nvme_identify_cs_ind_ns_nsattr[0],
9185
16
            { "Namespace Attributes (NSATTR)", "nvme.cmd.identify.cs_ind_ns.nsattr",
9186
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9187
16
        },
9188
16
        { &hf_nvme_identify_cs_ind_ns_nsattr[1],
9189
16
            { "Currently Write Protected (CWP)", "nvme.cmd.identify.cs_ind_ns.nsattr.cwp",
9190
16
               FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
9191
16
        },
9192
16
        { &hf_nvme_identify_cs_ind_ns_nsattr[2],
9193
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsattr.rsvd",
9194
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
9195
16
        },
9196
16
        { &hf_nvme_identify_cs_ind_ns_rsvd0,
9197
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.rsvd0",
9198
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9199
16
        },
9200
16
        { &hf_nvme_identify_cs_ind_ns_nvmsetid,
9201
16
            { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.cs_ind_ns.nvmsetid",
9202
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9203
16
        },
9204
16
        { &hf_nvme_identify_cs_ind_ns_endgid,
9205
16
            { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.cs_ind_ns.endgid",
9206
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9207
16
        },
9208
16
        { &hf_nvme_identify_cs_ind_ns_nstat[0],
9209
16
            { "Namespace Status (NSTAT)", "nvme.cmd.identify.cs_ind_ns.nstat",
9210
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9211
16
        },
9212
16
        { &hf_nvme_identify_cs_ind_ns_nstat[1],
9213
16
            { "I/O Impacted (IOI)", "nvme.cmd.identify.cs_ind_ns.nstat.ioi",
9214
16
               FT_UINT8, BASE_HEX, VALS(cs_ind_ns_ioi_tbl), 0x06, NULL, HFILL}
9215
16
        },
9216
16
        { &hf_nvme_identify_cs_ind_ns_nstat[2],
9217
16
            { "Namespace Ready (NRDY)", "nvme.cmd.identify.cs_ind_ns.nstat.nrdy",
9218
16
               FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
9219
16
        },
9220
16
        { &hf_nvme_identify_cs_ind_ns_nstat[3],
9221
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.nstat.rsvd",
9222
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
9223
16
        },
9224
16
        { &hf_nvme_identify_cs_ind_ns_kpios[0],
9225
16
            { "Key Per I/O Status (KPIOS)", "nvme.cmd.identify.cs_ind_ns.kpios",
9226
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9227
16
        },
9228
16
        { &hf_nvme_identify_cs_ind_ns_kpios[1],
9229
16
            { "Key Per I/O Supported in Namespace (KPIOSNS)", "nvme.cmd.identify.cs_ind_ns.kpios.kpiosns",
9230
16
               FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL}
9231
16
        },
9232
16
        { &hf_nvme_identify_cs_ind_ns_kpios[2],
9233
16
            { "Key Per I/O Enabled in Namespace (KPIOENS)", "nvme.cmd.identify.cs_ind_ns.kpios.kpioens",
9234
16
               FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL}
9235
16
        },
9236
16
        { &hf_nvme_identify_cs_ind_ns_kpios[3],
9237
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.kpios.rsvd",
9238
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9239
16
        },
9240
16
        { &hf_nvme_identify_cs_ind_ns_maxkt,
9241
16
            { "Maximum Key Tag (MAXKT)", "nvme.cmd.identify.cs_ind_ns.maxkt",
9242
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9243
16
        },
9244
16
        { &hf_nvme_identify_cs_ind_ns_rsvd1,
9245
16
            { "Reserved", "nvme.cmd.identify.cs_ind_ns.rsvd1",
9246
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9247
16
        },
9248
16
        { &hf_nvme_identify_cs_ind_ns_rgrpid,
9249
16
            { "Reachability Group Identifier (RGRPID)", "nvme.cmd.identify.cs_ind_ns.rgrpid",
9250
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9251
16
        },
9252
        /* Identify Ctrl response */
9253
16
        { &hf_nvme_identify_ctrl_vid,
9254
16
            { "PCI Vendor ID (VID)", "nvme.cmd.identify.ctrl.vid",
9255
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9256
16
        },
9257
16
        { &hf_nvme_identify_ctrl_ssvid,
9258
16
            { "PCI Subsystem Vendor ID (SSVID)", "nvme.cmd.identify.ctrl.ssvid",
9259
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9260
16
        },
9261
16
        { &hf_nvme_identify_ctrl_sn,
9262
16
            { "Serial Number (SN)", "nvme.cmd.identify.ctrl.sn",
9263
16
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
9264
16
        },
9265
16
        { &hf_nvme_identify_ctrl_mn,
9266
16
            { "Model Number (MN)", "nvme.cmd.identify.ctrl.mn",
9267
16
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
9268
16
        },
9269
16
        { &hf_nvme_identify_ctrl_fr,
9270
16
            { "Firmware Revision (FR)", "nvme.cmd.identify.ctrl.fr",
9271
16
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
9272
16
        },
9273
16
        { &hf_nvme_identify_ctrl_rab,
9274
16
            { "Recommended Arbitration Burst (RAB)", "nvme.cmd.identify.ctrl.rab",
9275
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_rab), 0x0, NULL, HFILL}
9276
16
        },
9277
16
        { &hf_nvme_identify_ctrl_ieee,
9278
16
            { "IEEE OUI Identifier (IEEE)", "nvme.cmd.identify.ctrl.ieee",
9279
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9280
16
        },
9281
16
        { &hf_nvme_identify_ctrl_cmic[0],
9282
16
            { "Controller Multi-Path I/O and Namespace Sharing Capabilities (CMIC)", "nvme.cmd.identify.ctrl.cmic",
9283
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9284
16
        },
9285
16
        { &hf_nvme_identify_ctrl_cmic[1],
9286
16
            { "Multiple Ports Support", "nvme.cmd.identify.ctrl.cmic.mp",
9287
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9288
16
        },
9289
16
        { &hf_nvme_identify_ctrl_cmic[2],
9290
16
            { "Multiple Controllers Support", "nvme.cmd.identify.ctrl.cmic.mc",
9291
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9292
16
        },
9293
16
        { &hf_nvme_identify_ctrl_cmic[3],
9294
16
            { "SRIOV Association", "nvme.cmd.identify.ctrl.cmic.sriov",
9295
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
9296
16
        },
9297
16
        { &hf_nvme_identify_ctrl_cmic[4],
9298
16
            { "ANA Reporting Support", "nvme.cmd.identify.ctrl.cmic.ana",
9299
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
9300
16
        },
9301
16
        { &hf_nvme_identify_ctrl_cmic[5],
9302
16
            { "Reserved", "nvme.cmd.identify.ctrl.cmic.rsvd",
9303
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
9304
16
        },
9305
16
        { &hf_nvme_identify_ctrl_mdts,
9306
16
            { "Maximum Data Transfer Size (MDTS)", "nvme.cmd.identify.ctrl.mdts",
9307
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_mdts), 0x0, NULL, HFILL}
9308
16
        },
9309
16
        { &hf_nvme_identify_ctrl_cntlid,
9310
16
            { "Controller ID (CNTLID)", "nvme.cmd.identify.ctrl.cntlid",
9311
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9312
16
        },
9313
16
        { &hf_nvme_identify_ctrl_ver,
9314
16
            { "Version (VER)", "nvme.cmd.identify.ctrl.ver",
9315
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9316
16
        },
9317
16
        { &hf_nvme_identify_ctrl_ver_ter,
9318
16
            { "Tertiary Version Number (TER)", "nvme.cmd.identify.ctrl.ver.ter",
9319
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9320
16
        },
9321
16
        { &hf_nvme_identify_ctrl_ver_min,
9322
16
            { "Minor Version Number (MNR)", "nvme.cmd.identify.ctrl.ver.min",
9323
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9324
16
        },
9325
16
        { &hf_nvme_identify_ctrl_ver_mjr,
9326
16
            { "Major Version Number (MJR)", "nvme.cmd.identify.ctrl.ver.mjr",
9327
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
9328
16
        },
9329
16
        { &hf_nvme_identify_ctrl_rtd3r,
9330
16
            { "RTD3 Resume Latency (RTD3R)", "nvme.cmd.identify.ctrl.rtd3r",
9331
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL}
9332
16
        },
9333
16
        { &hf_nvme_identify_ctrl_rtd3e,
9334
16
            { "RTD3 Entry Latency (RTD3E)", "nvme.cmd.identify.ctrl.rtd3e",
9335
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL}
9336
16
        },
9337
16
        { &hf_nvme_identify_ctrl_oaes[0],
9338
16
            { "Optional Asynchronous Events Supported (OAES)", "nvme.cmd.identify.ctrl.oaes",
9339
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9340
16
        },
9341
16
        { &hf_nvme_identify_ctrl_oaes[1],
9342
16
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd0",
9343
16
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
9344
16
        },
9345
16
        { &hf_nvme_identify_ctrl_oaes[2],
9346
16
            { "Namespace Attribute Notices Supported", "nvme.cmd.identify.ctrl.oaes.nan",
9347
16
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
9348
16
        },
9349
16
        { &hf_nvme_identify_ctrl_oaes[3],
9350
16
            { "Firmware Activation Supported", "nvme.cmd.identify.ctrl.oaes.fan",
9351
16
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
9352
16
        },
9353
16
        { &hf_nvme_identify_ctrl_oaes[4],
9354
16
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd1",
9355
16
               FT_UINT32, BASE_HEX, NULL, 0x400, NULL, HFILL}
9356
16
        },
9357
16
        { &hf_nvme_identify_ctrl_oaes[5],
9358
16
            { "Asymmetric Namespace Access Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ana",
9359
16
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
9360
16
        },
9361
16
        { &hf_nvme_identify_ctrl_oaes[6],
9362
16
            { "Predictable Latency Event Aggregate Log Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ple",
9363
16
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
9364
16
        },
9365
16
        { &hf_nvme_identify_ctrl_oaes[7],
9366
16
            { "LBA Status Information Notices Supported", "nvme.cmd.identify.ctrl.oaes.lba",
9367
16
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
9368
16
        },
9369
16
        { &hf_nvme_identify_ctrl_oaes[8],
9370
16
            { "Endurance Group Event Aggregate Log Page Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ege",
9371
16
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
9372
16
        },
9373
16
        { &hf_nvme_identify_ctrl_oaes[9],
9374
16
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd2",
9375
16
               FT_UINT32, BASE_HEX, NULL, 0xffff8000, NULL, HFILL}
9376
16
        },
9377
16
        { &hf_nvme_identify_ctrl_ctratt[0],
9378
16
            { "Controller Attributes (CTRATT)", "nvme.cmd.identify.ctrl.ctratt",
9379
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9380
16
        },
9381
16
        { &hf_nvme_identify_ctrl_ctratt[1],
9382
16
            { "128-bit Host Identifier Support", "nvme.cmd.identify.ctrl.ctratt.hi_128",
9383
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
9384
16
        },
9385
16
        { &hf_nvme_identify_ctrl_ctratt[2],
9386
16
            { "Non-Operational Power State Permissive Mode Supported", "nvme.cmd.identify.ctrl.ctratt.nopspm",
9387
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
9388
16
        },
9389
16
        { &hf_nvme_identify_ctrl_ctratt[3],
9390
16
            { "NVM Sets Supported", "nvme.cmd.identify.ctrl.ctratt.nvmset",
9391
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
9392
16
        },
9393
16
        { &hf_nvme_identify_ctrl_ctratt[4],
9394
16
            { "Read Recovery Levels Supported", "nvme.cmd.identify.ctrl.ctratt.rrl",
9395
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
9396
16
        },
9397
16
        { &hf_nvme_identify_ctrl_ctratt[5],
9398
16
            { "Endurance Groups Supported", "nvme.cmd.identify.ctrl.ctratt.eg",
9399
16
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
9400
16
        },
9401
16
        { &hf_nvme_identify_ctrl_ctratt[6],
9402
16
            { "Predictable Latency Mode Supported", "nvme.cmd.identify.ctrl.ctratt.plm",
9403
16
               FT_BOOLEAN, 32, NULL, 0x20, NULL, HFILL}
9404
16
        },
9405
16
        { &hf_nvme_identify_ctrl_ctratt[7],
9406
16
            { "Traffic Based Keep Alive Support (TBKAS)", "nvme.cmd.identify.ctrl.ctratt.tbkas",
9407
16
               FT_BOOLEAN, 32, NULL, 0x40, NULL, HFILL}
9408
16
        },
9409
16
        { &hf_nvme_identify_ctrl_ctratt[8],
9410
16
            { "Namespace Granularity", "nvme.cmd.identify.ctrl.ctratt.ng",
9411
16
               FT_BOOLEAN, 32, NULL, 0x80, NULL, HFILL}
9412
16
        },
9413
16
        { &hf_nvme_identify_ctrl_ctratt[9],
9414
16
            { "SQ Associations Support", "nvme.cmd.identify.ctrl.ctratt.sqa",
9415
16
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
9416
16
        },
9417
16
        { &hf_nvme_identify_ctrl_ctratt[10],
9418
16
            { "UUID List Support", "nvme.cmd.identify.ctrl.ctratt.uuidl",
9419
16
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
9420
16
        },
9421
16
        { &hf_nvme_identify_ctrl_ctratt[11],
9422
16
            { "Reserved", "nvme.cmd.identify.ctrl.ctratt.rsvd",
9423
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffc00, NULL, HFILL}
9424
16
        },
9425
16
        { &hf_nvme_identify_ctrl_rrls[0],
9426
16
            { "Read Recovery Levels Support (RRLS)", "nvme.cmd.identify.ctrl.rrls",
9427
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9428
16
        },
9429
16
        { &hf_nvme_identify_ctrl_rrls[1],
9430
16
            { "Read Recovery Level 0 Support", "nvme.cmd.identify.ctrl.rrls.rrls0",
9431
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
9432
16
        },
9433
16
        { &hf_nvme_identify_ctrl_rrls[2],
9434
16
            { "Read Recovery Level 1 Support", "nvme.cmd.identify.ctrl.rrls.rrls1",
9435
16
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
9436
16
        },
9437
16
        { &hf_nvme_identify_ctrl_rrls[3],
9438
16
            { "Read Recovery Level 2 Support", "nvme.cmd.identify.ctrl.rrls.rrls2",
9439
16
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
9440
16
        },
9441
16
        { &hf_nvme_identify_ctrl_rrls[4],
9442
16
            { "Read Recovery Level 3 Support", "nvme.cmd.identify.ctrl.rrls.rrls3",
9443
16
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
9444
16
        },
9445
16
        { &hf_nvme_identify_ctrl_rrls[5],
9446
16
            { "Read Recovery Level 4 (Default) Support", "nvme.cmd.identify.ctrl.rrls.rrls4",
9447
16
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
9448
16
        },
9449
16
        { &hf_nvme_identify_ctrl_rrls[6],
9450
16
            { "Read Recovery Level 5 Support", "nvme.cmd.identify.ctrl.rrls.rrls5",
9451
16
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
9452
16
        },
9453
16
        { &hf_nvme_identify_ctrl_rrls[7],
9454
16
            { "Read Recovery Level 6 Support", "nvme.cmd.identify.ctrl.rrls.rrls6",
9455
16
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
9456
16
        },
9457
16
        { &hf_nvme_identify_ctrl_rrls[8],
9458
16
            { "Read Recovery Level 7 Support", "nvme.cmd.identify.ctrl.rrls.rrls7",
9459
16
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
9460
16
        },
9461
16
        { &hf_nvme_identify_ctrl_rrls[9],
9462
16
            { "Read Recovery Level 8 Support", "nvme.cmd.identify.ctrl.rrls.rrls8",
9463
16
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
9464
16
        },
9465
16
        { &hf_nvme_identify_ctrl_rrls[10],
9466
16
            { "Read Recovery Level 9 Support", "nvme.cmd.identify.ctrl.rrls.rrls9",
9467
16
               FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL}
9468
16
        },
9469
16
        { &hf_nvme_identify_ctrl_rrls[11],
9470
16
            { "Read Recovery Level 10 Support", "nvme.cmd.identify.ctrl.rrls.rrls10",
9471
16
               FT_BOOLEAN, 16, NULL, 0x400, NULL, HFILL}
9472
16
        },
9473
16
        { &hf_nvme_identify_ctrl_rrls[12],
9474
16
            { "Read Recovery Level 11 Support", "nvme.cmd.identify.ctrl.rrls.rrls11",
9475
16
               FT_BOOLEAN, 16, NULL, 0x800, NULL, HFILL}
9476
16
        },
9477
16
        { &hf_nvme_identify_ctrl_rrls[13],
9478
16
            { "Read Recovery Level 12 Support", "nvme.cmd.identify.ctrl.rrls.rrls12",
9479
16
               FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL}
9480
16
        },
9481
16
        { &hf_nvme_identify_ctrl_rrls[14],
9482
16
            { "Read Recovery Level 13 Support", "nvme.cmd.identify.ctrl.rrls.rrls13",
9483
16
               FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL}
9484
16
        },
9485
16
        { &hf_nvme_identify_ctrl_rrls[15],
9486
16
            { "Read Recovery Level 14 Support", "nvme.cmd.identify.ctrl.rrls.rrls14",
9487
16
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
9488
16
        },
9489
16
        { &hf_nvme_identify_ctrl_rrls[16],
9490
16
            { "Read Recovery Level 15 (Fast Fail) Support", "nvme.cmd.identify.ctrl.rrls.rrls15",
9491
16
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
9492
16
        },
9493
16
        { &hf_nvme_identify_ctrl_bpcap[0],
9494
16
            { "Boot Partition Capabilities (BPCAP)", "nvme.cmd.identify.ctrl.bpcap",
9495
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9496
16
        },
9497
16
        { &hf_nvme_identify_ctrl_bpcap[1],
9498
16
            { "RPMB Boot Partition Write Protection Support (RPMBBPWPS)", "nvme.cmd.identify.ctrl.bpcap.rpmbbpwps",
9499
16
               FT_UINT8, BASE_HEX, VALS(ctrl_rpmbbpwps_tbl), 0x3, NULL, HFILL}
9500
16
        },
9501
16
        { &hf_nvme_identify_ctrl_bpcap[2],
9502
16
            { "Set Features Boot Partition Write Protection Support (SFBPWPS)", "nvme.cmd.identify.ctrl.bpcap.sfbpwps",
9503
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
9504
16
        },
9505
16
        { &hf_nvme_identify_ctrl_bpcap[3],
9506
16
            { "Reserved", "nvme.cmd.identify.ctrl.bpcap.rsvd",
9507
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
9508
16
        },
9509
16
        { &hf_nvme_identify_ctrl_rsvd0,
9510
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd0",
9511
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9512
16
        },
9513
16
        { &hf_nvme_identify_ctrl_nssl,
9514
16
            { "NVM Subsystem Shutdown Latency (NSSL)", "nvme.cmd.identify.ctrl.nssl",
9515
16
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_microseconds), 0x0, NULL, HFILL}
9516
16
        },
9517
16
        { &hf_nvme_identify_ctrl_rsvd6,
9518
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd6",
9519
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9520
16
        },
9521
16
        { &hf_nvme_identify_ctrl_plsi[0],
9522
16
            { "Power Loss Signaling Information (PLSI)", "nvme.cmd.identify.ctrl.plsi",
9523
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9524
16
        },
9525
16
        { &hf_nvme_identify_ctrl_plsi[1],
9526
16
            { "PLS Emergency Power Fail (PLSEPF)", "nvme.cmd.identify.ctrl.plsi.plsepf",
9527
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9528
16
        },
9529
16
        { &hf_nvme_identify_ctrl_plsi[2],
9530
16
            { "PLS Forced Quiescence (PLSFQ)", "nvme.cmd.identify.ctrl.plsi.plsfq",
9531
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9532
16
        },
9533
16
        { &hf_nvme_identify_ctrl_plsi[3],
9534
16
            { "Reserved", "nvme.cmd.identify.ctrl.plsi.rsvd",
9535
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9536
16
        },
9537
16
        { &hf_nvme_identify_ctrl_cntrltype,
9538
16
            { "Controller Type (CNTRLTYPE)", "nvme.cmd.identify.ctrl.cntrltype",
9539
16
               FT_UINT8, BASE_HEX, VALS(ctrl_type_tbl), 0x0, NULL, HFILL}
9540
16
        },
9541
16
        { &hf_nvme_identify_ctrl_fguid,
9542
16
            { "FRU Globally Unique Identifier (FGUID)", "nvme.cmd.identify.ctrl.fguid",
9543
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9544
16
        },
9545
16
        { &hf_nvme_identify_ctrl_fguid_vse,
9546
16
            { "Vendor Specific Extension Identifier", "nvme.cmd.identify.ctrl.fguid.vse",
9547
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
9548
16
        },
9549
16
        { &hf_nvme_identify_ctrl_fguid_oui,
9550
16
            { "Organizationally Unique Identifier", "nvme.cmd.identify.ctrl.fguid.oui",
9551
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9552
16
        },
9553
16
        { &hf_nvme_identify_ctrl_fguid_ei,
9554
16
            { "Extension Identifier", "nvme.cmd.identify.ctrl.fguid.ei",
9555
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
9556
16
        },
9557
16
        { &hf_nvme_identify_ctrl_crdt1,
9558
16
            { "Command Retry Delay Time 1", "nvme.cmd.identify.ctrl.crdt1",
9559
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
9560
16
        },
9561
16
        { &hf_nvme_identify_ctrl_crdt2,
9562
16
            { "Command Retry Delay Time 2", "nvme.cmd.identify.ctrl.crdt2",
9563
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
9564
16
        },
9565
16
        { &hf_nvme_identify_ctrl_crdt3,
9566
16
            { "Command Retry Delay Time 3", "nvme.cmd.identify.ctrl.crdt3",
9567
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
9568
16
        },
9569
16
        { &hf_nvme_identify_ctrl_crcap[0],
9570
16
            { "Controller Reachability Capabilities (CRCAP)", "nvme.cmd.identify.ctrl.crcap",
9571
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9572
16
        },
9573
16
        { &hf_nvme_identify_ctrl_crcap[1],
9574
16
            { "Reachability Reporting Supported (RRSUP)", "nvme.cmd.identify.ctrl.crcap.rrsup",
9575
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9576
16
        },
9577
16
        { &hf_nvme_identify_ctrl_crcap[2],
9578
16
            { "Reachability Group ID Changeable (RGIDC)", "nvme.cmd.identify.ctrl.crcap.rgidc",
9579
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9580
16
        },
9581
16
        { &hf_nvme_identify_ctrl_crcap[3],
9582
16
            { "Reserved", "nvme.cmd.identify.ctrl.crcap.rsvd",
9583
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9584
16
        },
9585
16
        { &hf_nvme_identify_ctrl_ciu,
9586
16
            { "Controller Instance Uniquifier (CIU)", "nvme.cmd.identify.ctrl.ciu",
9587
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9588
16
        },
9589
16
        { &hf_nvme_identify_ctrl_cirn,
9590
16
            { "Controller Instance Random Number (CIRN)", "nvme.cmd.identify.ctrl.cirn",
9591
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
9592
16
        },
9593
16
        { &hf_nvme_identify_ctrl_rsvd1,
9594
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd1",
9595
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9596
16
        },
9597
16
        { &hf_nvme_identify_ctrl_mi,
9598
16
            { "NVMe Management Interface", "nvme.cmd.identify.ctrl.mi",
9599
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9600
16
        },
9601
16
        { &hf_nvme_identify_ctrl_mi_rsvd,
9602
16
            { "Reserved", "nvme.cmd.identify.ctrl.mi.rsvd",
9603
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
9604
16
        },
9605
16
        { &hf_nvme_identify_ctrl_mi_nvmsr[0],
9606
16
            { "NVM Subsystem Report (NVMSR)", "nvme.cmd.identify.ctrl.mi.nvmsr",
9607
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9608
16
        },
9609
16
        { &hf_nvme_identify_ctrl_mi_nvmsr[1],
9610
16
            { "NVMe Storage Device (NVMESD)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmesd",
9611
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9612
16
        },
9613
16
        { &hf_nvme_identify_ctrl_mi_nvmsr[2],
9614
16
            { "NVMe Enclosure (NVMEE)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmee",
9615
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9616
16
        },
9617
16
        { &hf_nvme_identify_ctrl_mi_nvmsr[3],
9618
16
            { "Reserved", "nvme.cmd.identify.ctrl.mi.nvmsr.rsvd",
9619
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9620
16
        },
9621
16
        { &hf_nvme_identify_ctrl_mi_vwci[0],
9622
16
            { "VPD Write Cycle Information (VWCI)", "nvme.cmd.identify.ctrl.mi.vwci",
9623
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9624
16
        },
9625
16
        { &hf_nvme_identify_ctrl_mi_vwci[1],
9626
16
            { "VPD Write Cycles Remaining (VWCR)", "nvme.cmd.identify.ctrl.mi.vwci.vwcr",
9627
16
               FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL}
9628
16
        },
9629
16
        { &hf_nvme_identify_ctrl_mi_vwci[2],
9630
16
            { "VPD Write Cycle Remaining Valid (VWCRV)", "nvme.cmd.identify.ctrl.mi.vwci.vwcrv",
9631
16
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
9632
16
        },
9633
16
        { &hf_nvme_identify_ctrl_mi_mec[0],
9634
16
            { "Management Endpoint Capabilities (MEC)", "nvme.cmd.identify.ctrl.mi.mec",
9635
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9636
16
        },
9637
16
        { &hf_nvme_identify_ctrl_mi_mec[1],
9638
16
            { "SMBus/I2C Port Management Endpoint (SMBUSME)", "nvme.cmd.identify.ctrl.mi.mec.smbusme",
9639
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9640
16
        },
9641
16
        { &hf_nvme_identify_ctrl_mi_mec[2],
9642
16
            { "PCIe Port Management Endpoint (PCIEME)", "nvme.cmd.identify.ctrl.mi.mec.pcieme",
9643
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9644
16
        },
9645
16
        { &hf_nvme_identify_ctrl_mi_mec[3],
9646
16
            { "Reserved", "nvme.cmd.identify.ctrl.mi.mec.rsvd",
9647
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9648
16
        },
9649
16
        { &hf_nvme_identify_ctrl_oacs[0],
9650
16
            { "Optional Admin Command Support (OACS)", "nvme.cmd.identify.ctrl.oacs",
9651
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9652
16
        },
9653
16
        { &hf_nvme_identify_ctrl_oacs[1],
9654
16
            { "Security Send and Security Receive Support", "nvme.cmd.identify.ctrl.oacs.sec",
9655
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
9656
16
        },
9657
16
        { &hf_nvme_identify_ctrl_oacs[2],
9658
16
            { "Format NVM Support", "nvme.cmd.identify.ctrl.oacs.fmt",
9659
16
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
9660
16
        },
9661
16
        { &hf_nvme_identify_ctrl_oacs[3],
9662
16
            { "Firmware Download and Commit Support", "nvme.cmd.identify.ctrl.oacs.fw",
9663
16
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
9664
16
        },
9665
16
        { &hf_nvme_identify_ctrl_oacs[4],
9666
16
            { "Namespace Management Support", "nvme.cmd.identify.ctrl.oacs.nsmgmt",
9667
16
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
9668
16
        },
9669
16
        { &hf_nvme_identify_ctrl_oacs[5],
9670
16
            { "Device Self-Test Support", "nvme.cmd.identify.ctrl.oacs.stst",
9671
16
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
9672
16
        },
9673
16
        { &hf_nvme_identify_ctrl_oacs[6],
9674
16
            { "Directive Send and Directive Receive Support", "nvme.cmd.identify.ctrl.oacs.dtv",
9675
16
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
9676
16
        },
9677
16
        { &hf_nvme_identify_ctrl_oacs[7],
9678
16
            { "NVMe-MI Send and NVMe-MI Receive Support", "nvme.cmd.identify.ctrl.oacs.mi",
9679
16
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
9680
16
        },
9681
16
        { &hf_nvme_identify_ctrl_oacs[8],
9682
16
            { "Virtualization Management Support", "nvme.cmd.identify.ctrl.oacs.vm",
9683
16
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
9684
16
        },
9685
16
        { &hf_nvme_identify_ctrl_oacs[9],
9686
16
            { "Doorbell Buffer Config Support", "nvme.cmd.identify.ctrl.oacs.db",
9687
16
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
9688
16
        },
9689
16
        { &hf_nvme_identify_ctrl_oacs[10],
9690
16
            { "Get LBA Status Support", "nvme.cmd.identify.ctrl.oacs.sec.lba",
9691
16
               FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL}
9692
16
        },
9693
16
        { &hf_nvme_identify_ctrl_oacs[11],
9694
16
            { "Reserved", "nvme.cmd.identify.ctrl.oacs.sec.rsvd",
9695
16
               FT_UINT16, BASE_HEX, NULL, 0xfc00, NULL, HFILL}
9696
16
        },
9697
16
        { &hf_nvme_identify_ctrl_acl,
9698
16
            { "Abort Command Limit (ACL)", "nvme.cmd.identify.ctrl.acl",
9699
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_commands), 0x0, NULL, HFILL}
9700
16
        },
9701
16
        { &hf_nvme_identify_ctrl_aerl,
9702
16
            { "Asynchronous Event Request Limit (AERL)", "nvme.cmd.identify.ctrl.aerl",
9703
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_events), 0x0, NULL, HFILL}
9704
16
        },
9705
16
        { &hf_nvme_identify_ctrl_frmw[0],
9706
16
            { "Firmware Updates (FRMW)", "nvme.cmd.identify.ctrl.frmw",
9707
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9708
16
        },
9709
16
        { &hf_nvme_identify_ctrl_frmw[1],
9710
16
            { "First Firmware Slot Read-Only", "nvme.cmd.identify.ctrl.frmw.fro",
9711
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9712
16
        },
9713
16
        { &hf_nvme_identify_ctrl_frmw[2],
9714
16
            { "Number of Firmware Slots", "nvme.cmd.identify.ctrl.frmw.fsn",
9715
16
               FT_UINT8, BASE_HEX, NULL, 0xe, NULL, HFILL}
9716
16
        },
9717
16
        { &hf_nvme_identify_ctrl_frmw[3],
9718
16
            { "Supports Activation Without Reset", "nvme.cmd.identify.ctrl.frmw.anr",
9719
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
9720
16
        },
9721
16
        { &hf_nvme_identify_ctrl_frmw[4],
9722
16
            { "Reserved", "nvme.cmd.identify.ctrl.frmw.rsvd",
9723
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
9724
16
        },
9725
16
        { &hf_nvme_identify_ctrl_lpa[0],
9726
16
            { "Log Page Attributes (LPA)", "nvme.cmd.identify.ctrl.lpa",
9727
16
               FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL}
9728
16
        },
9729
16
        { &hf_nvme_identify_ctrl_lpa[1],
9730
16
            { "Smart Log Page per Namespace Support", "nvme.cmd.identify.ctrl.lpa.smrt",
9731
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9732
16
        },
9733
16
        { &hf_nvme_identify_ctrl_lpa[2],
9734
16
            { "Commands Supported and Effects Log Page Support", "nvme.cmd.identify.ctrl.lpa.cmds",
9735
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9736
16
        },
9737
16
        { &hf_nvme_identify_ctrl_lpa[3],
9738
16
            { "Extended Data Get Log Page Support", "nvme.cmd.identify.ctrl.lpa.elp",
9739
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
9740
16
        },
9741
16
        { &hf_nvme_identify_ctrl_lpa[4],
9742
16
            { "Telemetry Log Page and Notices Support", "nvme.cmd.identify.ctrl.lpa.tel",
9743
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
9744
16
        },
9745
16
        { &hf_nvme_identify_ctrl_lpa[5],
9746
16
            { "Persistent Event Log Support", "nvme.cmd.identify.ctrl.lpa.ple",
9747
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
9748
16
        },
9749
16
        { &hf_nvme_identify_ctrl_lpa[6],
9750
16
            { "Reserved", "nvme.cmd.identify.ctrl.lpa.rsvd",
9751
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
9752
16
        },
9753
16
        { &hf_nvme_identify_ctrl_elpe,
9754
16
            { "Error Log Page Entries (ELPE)", "nvme.cmd.identify.ctrl.elpe",
9755
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_entries), 0x0, NULL, HFILL}
9756
16
        },
9757
16
        { &hf_nvme_identify_ctrl_npss,
9758
16
            { "Number of Power States Supported (NPSS)", "nvme.cmd.identify.ctrl.npss",
9759
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_states), 0x0, NULL, HFILL}
9760
16
        },
9761
16
        { &hf_nvme_identify_ctrl_avscc[0],
9762
16
            { "Admin Vendor Specific Command Configuration (AVSCC)", "nvme.cmd.identify.ctrl.avscc",
9763
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9764
16
        },
9765
16
        { &hf_nvme_identify_ctrl_avscc[1],
9766
16
            { "Standard Command Format", "nvme.cmd.identify.ctrl.avscc.std",
9767
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9768
16
        },
9769
16
        { &hf_nvme_identify_ctrl_avscc[2],
9770
16
            { "Reserved", "nvme.cmd.identify.ctrl.avscc.rsvd",
9771
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
9772
16
        },
9773
16
        { &hf_nvme_identify_ctrl_apsta[0],
9774
16
            { "Autonomous Power State Transition Attributes (APSTA)", "nvme.cmd.identify.ctrl.apsta",
9775
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9776
16
        },
9777
16
        { &hf_nvme_identify_ctrl_apsta[1],
9778
16
            { "Autonomous Power State Transitions Supported", "nvme.cmd.identify.ctrl.apsta.aut",
9779
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9780
16
        },
9781
16
        { &hf_nvme_identify_ctrl_apsta[2],
9782
16
            { "Reserved", "nvme.cmd.identify.ctrl.apsta.rsvd",
9783
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
9784
16
        },
9785
16
        { &hf_nvme_identify_ctrl_wctemp,
9786
16
            { "Warning Composite Temperature Threshold (WCTEMP)", "nvme.cmd.identify.ctrl.wctemp",
9787
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
9788
16
        },
9789
16
        { &hf_nvme_identify_ctrl_cctemp,
9790
16
            { "Critical Composite Temperature Threshold (CCTEMP)", "nvme.cmd.identify.ctrl.cctemp",
9791
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
9792
16
        },
9793
16
        { &hf_nvme_identify_ctrl_mtfa,
9794
16
            { "Maximum Time for Firmware Activation (MTFA)", "nvme.cmd.identify.ctrl.mtfa",
9795
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
9796
16
        },
9797
16
        { &hf_nvme_identify_ctrl_hmpre,
9798
16
            { "Host Memory Buffer Preferred Size (HMPRE)", "nvme.cmd.identify.ctrl.hmpre",
9799
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
9800
16
        },
9801
16
        { &hf_nvme_identify_ctrl_hmmin,
9802
16
            { "Host Memory Buffer Minimum Size (HMMIN)", "nvme.cmd.identify.ctrl.hmmin",
9803
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
9804
16
        },
9805
16
        { &hf_nvme_identify_ctrl_tnvmcap,
9806
16
            { "Total NVM Capacity (TNVMCAP)", "nvme.cmd.identify.ctrl.tnvmcap",
9807
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
9808
16
        },
9809
16
        { &hf_nvme_identify_ctrl_unvmcap,
9810
16
            { "Unallocated NVM Capacity (UNVMCAP)", "nvme.cmd.identify.ctrl.unvmcap",
9811
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
9812
16
        },
9813
16
        { &hf_nvme_identify_ctrl_rpmbs[0],
9814
16
            { "Replay Protected Memory Block Support (RPMBS)", "nvme.cmd.identify.ctrl.rpmbs",
9815
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9816
16
        },
9817
16
        { &hf_nvme_identify_ctrl_rpmbs[1],
9818
16
            { "Number of RPMB Units", "nvme.cmd.identify.ctrl.rpmbs.nu",
9819
16
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
9820
16
        },
9821
16
        { &hf_nvme_identify_ctrl_rpmbs[2],
9822
16
            { "Authentication Method", "nvme.cmd.identify.ctrl.rpmbs.au",
9823
16
               FT_UINT32, BASE_HEX, NULL, 0x38, NULL, HFILL}
9824
16
        },
9825
16
        { &hf_nvme_identify_ctrl_rpmbs[3],
9826
16
            { "Reserved", "nvme.cmd.identify.ctrl.rpmbs.rsvd",
9827
16
               FT_UINT32, BASE_HEX, NULL, 0xffc0, NULL, HFILL}
9828
16
        },
9829
16
        { &hf_nvme_identify_ctrl_rpmbs[4],
9830
16
            { "Total RPMB Unit Size (128 KiB blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.ts",
9831
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
9832
16
        },
9833
16
        { &hf_nvme_identify_ctrl_rpmbs[5],
9834
16
            { "Access Size (512-byte blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.as",
9835
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
9836
16
        },
9837
16
            { &hf_nvme_identify_ctrl_edstt,
9838
16
            { "Extended Device Self-test Time (EDSTT) (in minutes)", "nvme.cmd.identify.ctrl.edstt",
9839
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
9840
16
        },
9841
16
        { &hf_nvme_identify_ctrl_dsto[0],
9842
16
            { "Device Self-test Options (DSTO)", "nvme.cmd.identify.ctrl.dsto",
9843
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9844
16
        },
9845
16
        { &hf_nvme_identify_ctrl_dsto[1],
9846
16
            { "Single Device Self-test Operation (SDSO)", "nvme.cmd.identify.ctrl.dsto.mds",
9847
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9848
16
        },
9849
16
        { &hf_nvme_identify_ctrl_dsto[2],
9850
16
            { "Reserved", "nvme.cmd.identify.ctrl.dsto.rsvd",
9851
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
9852
16
        },
9853
16
        { &hf_nvme_identify_ctrl_fwug,
9854
16
            { "Firmware Update Granularity in 4 KiB Units (FWUG)", "nvme.cmd.identify.ctrl.fwug",
9855
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9856
16
        },
9857
16
        { &hf_nvme_identify_ctrl_kas,
9858
16
            { "Keep Alive Support - Timer Value (KAS)", "nvme.cmd.identify.ctrl.kas",
9859
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
9860
16
        },
9861
16
        { &hf_nvme_identify_ctrl_hctma[0],
9862
16
            { "Host Controlled Thermal Management Attributes (HCTMA)", "nvme.cmd.identify.ctrl.hctma",
9863
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9864
16
        },
9865
16
        { &hf_nvme_identify_ctrl_hctma[1],
9866
16
            { "Controller Supports Thermal Management", "nvme.cmd.identify.ctrl.hctma.sup",
9867
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
9868
16
        },
9869
16
        { &hf_nvme_identify_ctrl_hctma[2],
9870
16
            { "Reserved", "nvme.cmd.identify.ctrl.hctma.rsvd",
9871
16
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
9872
16
        },
9873
16
        { &hf_nvme_identify_ctrl_mntmt,
9874
16
            { "Minimum Thermal Management Temperature (MNTMT)", "nvme.cmd.identify.ctrl.mntmt",
9875
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL}
9876
16
        },
9877
16
        { &hf_nvme_identify_ctrl_mxtmt,
9878
16
            { "Maximum Thermal Management Temperature (MXTMT)", "nvme.cmd.identify.ctrl.mxtmt",
9879
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL}
9880
16
        },
9881
16
        { &hf_nvme_identify_ctrl_sanicap[0],
9882
16
            { "Sanitize Capabilities (SANICAP)", "nvme.cmd.identify.ctrl.sanicap",
9883
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9884
16
        },
9885
16
        { &hf_nvme_identify_ctrl_sanicap[1],
9886
16
            { "Crypto Erase Support (CES)", "nvme.cmd.identify.ctrl.sanicap.ces",
9887
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
9888
16
        },
9889
16
        { &hf_nvme_identify_ctrl_sanicap[2],
9890
16
            { "Block Erase Support (BES)", "nvme.cmd.identify.ctrl.sanicap.bes",
9891
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
9892
16
        },
9893
16
        { &hf_nvme_identify_ctrl_sanicap[3],
9894
16
            { "Overwrite Support (OWS)", "nvme.cmd.identify.ctrl.sanicap.ows",
9895
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
9896
16
        },
9897
16
        { &hf_nvme_identify_ctrl_sanicap[4],
9898
16
            { "Reserved", "nvme.cmd.identify.ctrl.sanicap.rsvd",
9899
16
               FT_UINT32, BASE_HEX, NULL, 0x1ffffff8, NULL, HFILL}
9900
16
        },
9901
16
        { &hf_nvme_identify_ctrl_sanicap[5],
9902
16
            { "No-Deallocate Inhibited (NDI)", "nvme.cmd.identify.ctrl.sanicap.ndi",
9903
16
               FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL}
9904
16
        },
9905
16
        { &hf_nvme_identify_ctrl_sanicap[6],
9906
16
            { "No-Deallocate Modifies Media After Sanitize (NODMMAS)", "nvme.cmd.identify.ctrl.sanicap.nodmmas",
9907
16
               FT_UINT32, BASE_HEX, VALS(mmas_type_tbl), 0xc0000000, NULL, HFILL}
9908
16
        },
9909
16
        { &hf_nvme_identify_ctrl_hmmminds,
9910
16
            { "Host Memory Buffer Minimum Descriptor Entry Size in 4 KiB Units (HMMINDS)", "nvme.cmd.identify.ctrl.hmmminds",
9911
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
9912
16
        },
9913
16
        { &hf_nvme_identify_ctrl_hmmaxd,
9914
16
            { "Host Memory Maximum Descriptors Entries (HMMAXD)", "nvme.cmd.identify.ctrl.hmmaxd",
9915
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
9916
16
        },
9917
16
        { &hf_nvme_identify_ctrl_nsetidmax,
9918
16
            { "NVM Set Identifier Maximum (NSETIDMAX)", "nvme.cmd.identify.ctrl.nsetidmax",
9919
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9920
16
        },
9921
16
        { &hf_nvme_identify_ctrl_endgidmax,
9922
16
            { "Endurance Group Identifier Maximum (ENDGIDMAX)", "nvme.cmd.identify.ctrl.endgidmax",
9923
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9924
16
        },
9925
16
        { &hf_nvme_identify_ctrl_anatt,
9926
16
            { "ANA Transition Time in Seconds (ANATT)", "nvme.cmd.identify.ctrl.anatt",
9927
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
9928
16
        },
9929
16
        { &hf_nvme_identify_ctrl_anacap[0],
9930
16
            { "Asymmetric Namespace Access Capabilities (ANACAP)", "nvme.cmd.identify.ctrl.anacap",
9931
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9932
16
        },
9933
16
        { &hf_nvme_identify_ctrl_anacap[1],
9934
16
            { "Reports ANA Optimized State", "nvme.cmd.identify.ctrl.anacap.osr",
9935
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9936
16
        },
9937
16
        { &hf_nvme_identify_ctrl_anacap[2],
9938
16
            { "Reports ANA Non-Optimized State", "nvme.cmd.identify.ctrl.anacap.nosr",
9939
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9940
16
        },
9941
16
        { &hf_nvme_identify_ctrl_anacap[3],
9942
16
            { "Reports Inaccessible State", "nvme.cmd.identify.ctrl.anacap.isr",
9943
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
9944
16
        },
9945
16
        { &hf_nvme_identify_ctrl_anacap[4],
9946
16
            { "Reports ANA Persistent Loss State", "nvme.cmd.identify.ctrl.anacap.plsr",
9947
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
9948
16
        },
9949
16
        { &hf_nvme_identify_ctrl_anacap[5],
9950
16
            { "Reports ANA Change State", "nvme.cmd.identify.ctrl.anacap.csr",
9951
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
9952
16
        },
9953
16
        { &hf_nvme_identify_ctrl_anacap[6],
9954
16
            { "Reserved", "nvme.cmd.identify.ctrl.anacap.rsvd",
9955
16
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
9956
16
        },
9957
16
        { &hf_nvme_identify_ctrl_anacap[7],
9958
16
            { "ANAGRPID field in the Identify Namespace does not change", "nvme.cmd.identify.ctrl.anacap.panagrpid",
9959
16
               FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
9960
16
        },
9961
16
        { &hf_nvme_identify_ctrl_anacap[8],
9962
16
            { "Supports non-zero value in the ANAGRPID field", "nvme.cmd.identify.ctrl.anacap.nzpanagrpid",
9963
16
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
9964
16
        },
9965
16
        { &hf_nvme_identify_ctrl_anagrpmax,
9966
16
            { "ANA Group Identifier Maximum (ANAGRPMAX)", "nvme.cmd.identify.ctrl.anagrpmax",
9967
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
9968
16
        },
9969
16
        { &hf_nvme_identify_ctrl_nanagrpid,
9970
16
            { "Number of ANA Group Identifiers (NANAGRPID)", "nvme.cmd.identify.ctrl.nanagrpid",
9971
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
9972
16
        },
9973
16
        { &hf_nvme_identify_ctrl_pels,
9974
16
            { "Persistent Event Log Size in 64 KiB Units (PELS)", "nvme.cmd.identify.ctrl.pels",
9975
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
9976
16
        },
9977
16
        { &hf_nvme_identify_ctrl_did,
9978
16
            { "Domain Identifier (DID)", "nvme.cmd.identify.ctrl.did",
9979
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
9980
16
        },
9981
16
        { &hf_nvme_identify_ctrl_kpioc[0],
9982
16
            { "Key Per I/O Capabilities (KPIOC)", "nvme.cmd.identify.ctrl.kpioc",
9983
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
9984
16
        },
9985
16
        { &hf_nvme_identify_ctrl_kpioc[1],
9986
16
            { "Key Per I/O Supported (KPIOS)", "nvme.cmd.identify.ctrl.kpioc.kpios",
9987
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
9988
16
        },
9989
16
        { &hf_nvme_identify_ctrl_kpioc[2],
9990
16
            { "Key Per I/O Scope (KPIOSC)", "nvme.cmd.identify.ctrl.kpioc.kpiosc",
9991
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
9992
16
        },
9993
16
        { &hf_nvme_identify_ctrl_kpioc[3],
9994
16
            { "Reserved", "nvme.cmd.identify.ctrl.kpioc.rsvd",
9995
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
9996
16
        },
9997
16
        { &hf_nvme_identify_ctrl_rsvd2,
9998
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd2",
9999
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10000
16
        },
10001
16
        { &hf_nvme_identify_ctrl_mptfawr,
10002
16
            { "Maximum Processing Time for Firmware Activation Without Reset (MPTFAWR)", "nvme.cmd.identify.ctrl.mptfawr",
10003
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
10004
16
        },
10005
16
        { &hf_nvme_identify_ctrl_rsvd7,
10006
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd7",
10007
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10008
16
        },
10009
16
        { &hf_nvme_identify_ctrl_megcap,
10010
16
            { "Max Endurance Group Capacity (MEGCAP)", "nvme.cmd.identify.ctrl.megcap",
10011
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10012
16
        },
10013
16
        { &hf_nvme_identify_ctrl_tmpthha[0],
10014
16
            { "Temperature Threshold Hysteresis Attributes (TMPTHHA)", "nvme.cmd.identify.ctrl.tmpthha",
10015
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10016
16
        },
10017
16
        { &hf_nvme_identify_ctrl_tmpthha[1],
10018
16
            { "Temperature Threshold Maximum Hysteresis (TMPTHMH)", "nvme.cmd.identify.ctrl.tmpthha.tmpthmh",
10019
16
               FT_UINT8, BASE_DEC, NULL, 0x7, NULL, HFILL}
10020
16
        },
10021
16
        { &hf_nvme_identify_ctrl_tmpthha[2],
10022
16
            { "Reserved", "nvme.cmd.identify.ctrl.tmpthha.rsvd",
10023
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10024
16
        },
10025
16
        { &hf_nvme_identify_ctrl_mupa[0],
10026
16
            { "Maximum Unlimited Power Attributes (MUPA)", "nvme.cmd.identify.ctrl.mupa",
10027
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10028
16
        },
10029
16
        { &hf_nvme_identify_ctrl_mupa[1],
10030
16
            { "Maximum Unlimited Power Scale (MUPS)", "nvme.cmd.identify.ctrl.mupa.mups",
10031
16
               FT_UINT8, BASE_HEX, VALS(ctrl_mups_tbl), 0x3, NULL, HFILL}
10032
16
        },
10033
16
        { &hf_nvme_identify_ctrl_mupa[2],
10034
16
            { "Reserved", "nvme.cmd.identify.ctrl.mupa.rsvd",
10035
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
10036
16
        },
10037
16
        { &hf_nvme_identify_ctrl_cqt,
10038
16
            { "Command Quiesce Time (CQT)", "nvme.cmd.identify.ctrl.cqt",
10039
16
               FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}
10040
16
        },
10041
16
        { &hf_nvme_identify_ctrl_cdpa[0],
10042
16
            { "Configurable Device Personality Attributes (CDPA)", "nvme.cmd.identify.ctrl.cdpa",
10043
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10044
16
        },
10045
16
        { &hf_nvme_identify_ctrl_cdpa[1],
10046
16
            { "HMAC-SHA-384 (HS3)", "nvme.cmd.identify.ctrl.cdpa.hs3",
10047
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
10048
16
        },
10049
16
        { &hf_nvme_identify_ctrl_cdpa[2],
10050
16
            { "Reserved", "nvme.cmd.identify.ctrl.cdpa.rsvd",
10051
16
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
10052
16
        },
10053
16
        { &hf_nvme_identify_ctrl_mup,
10054
16
            { "Maximum Unlimited Power (MUP)", "nvme.cmd.identify.ctrl.mup",
10055
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10056
16
        },
10057
16
        { &hf_nvme_identify_ctrl_ipmsr[0],
10058
16
            { "Interval Power Measurement Sample Rate (IPMSR)", "nvme.cmd.identify.ctrl.ipmsr",
10059
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10060
16
        },
10061
16
        { &hf_nvme_identify_ctrl_ipmsr[1],
10062
16
            { "Sample Rate Value (SRV)", "nvme.cmd.identify.ctrl.ipmsr.srv",
10063
16
               FT_UINT16, BASE_DEC, NULL, 0x00ff, NULL, HFILL}
10064
16
        },
10065
16
        { &hf_nvme_identify_ctrl_ipmsr[2],
10066
16
            { "Sample Rate Scale (SRS)", "nvme.cmd.identify.ctrl.ipmsr.srs",
10067
16
               FT_UINT16, BASE_HEX, VALS(ctrl_srs_tbl), 0xff00, NULL, HFILL}
10068
16
        },
10069
16
        { &hf_nvme_identify_ctrl_msmt,
10070
16
            { "Maximum Stop Measurement Time (MSMT)", "nvme.cmd.identify.ctrl.msmt",
10071
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10072
16
        },
10073
16
        { &hf_nvme_identify_ctrl_rsvd8,
10074
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd8",
10075
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10076
16
        },
10077
16
        { &hf_nvme_identify_ctrl_sqes[0],
10078
16
            { "Submission Queue Entry Size (SQES)", "nvme.cmd.identify.ctrl.sqes",
10079
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10080
16
        },
10081
16
        { &hf_nvme_identify_ctrl_sqes[1],
10082
16
            { "Minimum (required) Size", "nvme.cmd.identify.ctrl.sqes.mins",
10083
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL}
10084
16
        },
10085
16
        { &hf_nvme_identify_ctrl_sqes[2],
10086
16
            { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.sqes.maxs",
10087
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL}
10088
16
        },
10089
16
        { &hf_nvme_identify_ctrl_cqes[0],
10090
16
            { "Completion Queue Entry Size (CQES)", "nvme.cmd.identify.ctrl.cqes",
10091
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10092
16
        },
10093
16
        { &hf_nvme_identify_ctrl_cqes[1],
10094
16
            { "Minimum (required) Size", "nvme.cmd.identify.ctrl.cqes.mins",
10095
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL}
10096
16
        },
10097
16
        { &hf_nvme_identify_ctrl_cqes[2],
10098
16
            { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.cqes.maxs",
10099
16
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL}
10100
16
        },
10101
16
        { &hf_nvme_identify_ctrl_maxcmd,
10102
16
            { "Maximum Outstanding Commands (MAXCMD)", "nvme.cmd.identify.ctrl.maxcmd",
10103
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10104
16
        },
10105
16
        { &hf_nvme_identify_ctrl_nn,
10106
16
            { "Number of Namespaces (NN)", "nvme.cmd.identify.ctrl.nn",
10107
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10108
16
        },
10109
16
        { &hf_nvme_identify_ctrl_oncs[0],
10110
16
            { "Optional NVM Command Support (ONCS)", "nvme.cmd.identify.ctrl.oncs",
10111
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10112
16
        },
10113
16
        { &hf_nvme_identify_ctrl_oncs[1],
10114
16
            { "Supports Compare Command", "nvme.cmd.identify.ctrl.oncs.ccs",
10115
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
10116
16
        },
10117
16
        { &hf_nvme_identify_ctrl_oncs[2],
10118
16
            { "Supports Write Uncorrectable Command", "nvme.cmd.identify.ctrl.oncs.wus",
10119
16
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
10120
16
        },
10121
16
        { &hf_nvme_identify_ctrl_oncs[3],
10122
16
            { "Supports Dataset Management Command", "nvme.cmd.identify.ctrl.oncs.dsms",
10123
16
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
10124
16
        },
10125
16
        { &hf_nvme_identify_ctrl_oncs[4],
10126
16
            { "Support Write Zeroes Command", "nvme.cmd.identify.ctrl.oncs.wzs",
10127
16
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
10128
16
        },
10129
16
        { &hf_nvme_identify_ctrl_oncs[5],
10130
16
            { "Supports non-zero Save Field in Set/Get Features", "nvme.cmd.identify.ctrl.oncs.nzfs",
10131
16
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
10132
16
        },
10133
16
        { &hf_nvme_identify_ctrl_oncs[6],
10134
16
            { "Supports Reservations", "nvme.cmd.identify.ctrl.oncs.ress",
10135
16
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
10136
16
        },
10137
16
        { &hf_nvme_identify_ctrl_oncs[7],
10138
16
            { "Supports Timestamps", "nvme.cmd.identify.ctrl.oncs.tstmps",
10139
16
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
10140
16
        },
10141
16
        { &hf_nvme_identify_ctrl_oncs[8],
10142
16
            { "Supports Verify Command", "nvme.cmd.identify.ctrl.oncs.vers",
10143
16
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
10144
16
        },
10145
16
        { &hf_nvme_identify_ctrl_oncs[9],
10146
16
            { "Reserved", "nvme.cmd.identify.ctrl.oncs.rsvd",
10147
16
               FT_UINT16, BASE_HEX, NULL, 0xff00, NULL, HFILL}
10148
16
        },
10149
16
        { &hf_nvme_identify_ctrl_fuses[0],
10150
16
            { "Fused Operation Support (FUSES)", "nvme.cmd.identify.ctrl.fuses",
10151
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10152
16
        },
10153
16
        { &hf_nvme_identify_ctrl_fuses[1],
10154
16
            { "Compare and Write Fused Operation Support", "nvme.cmd.identify.ctrl.fuses.cws",
10155
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
10156
16
        },
10157
16
        { &hf_nvme_identify_ctrl_fuses[2],
10158
16
            { "Reserved", "nvme.cmd.identify.ctrl.fuses.rsvd",
10159
16
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
10160
16
        },
10161
16
        { &hf_nvme_identify_ctrl_fna[0],
10162
16
            { "Format NVM Attributes (FNA)", "nvme.cmd.identify.ctrl.fna",
10163
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10164
16
        },
10165
16
        { &hf_nvme_identify_ctrl_fna[1],
10166
16
            { "Format Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.fall",
10167
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10168
16
        },
10169
16
        { &hf_nvme_identify_ctrl_fna[2],
10170
16
            { "Secure Erase Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.seall",
10171
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
10172
16
        },
10173
16
        { &hf_nvme_identify_ctrl_fna[3],
10174
16
            { "Cryptographic Erase Supported", "nvme.cmd.identify.ctrl.fna.ces",
10175
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
10176
16
        },
10177
16
        { &hf_nvme_identify_ctrl_fna[4],
10178
16
            { "Reserved", "nvme.cmd.identify.ctrl.fna.rsvd",
10179
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10180
16
        },
10181
16
        { &hf_nvme_identify_ctrl_vwc[0],
10182
16
            { "Volatile Write Cache (VWC)", "nvme.cmd.identify.ctrl.vwc",
10183
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10184
16
        },
10185
16
        { &hf_nvme_identify_ctrl_vwc[1],
10186
16
            { "Volatile Write Cache Present", "nvme.cmd.identify.ctrl.vwc.cp",
10187
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10188
16
        },
10189
16
        { &hf_nvme_identify_ctrl_vwc[2],
10190
16
            { "Flush Command Behavior", "nvme.cmd.identify.ctrl.vwc.cfb",
10191
16
               FT_UINT8, BASE_HEX, VALS(fcb_type_tbl), 0x6, NULL, HFILL}
10192
16
        },
10193
16
        { &hf_nvme_identify_ctrl_vwc[3],
10194
16
            { "Reserved", "nvme.cmd.identify.ctrl.vwc.rsvd",
10195
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10196
16
        },
10197
16
        { &hf_nvme_identify_ctrl_awun,
10198
16
            { "Atomic Write Unit Normal (AWUN)", "nvme.cmd.identify.ctrl.awun",
10199
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL}
10200
16
        },
10201
16
        { &hf_nvme_identify_ctrl_awupf,
10202
16
            { "Atomic Write Unit Power Fail (AWUPF)", "nvme.cmd.identify.ctrl.awupf",
10203
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL}
10204
16
        },
10205
16
        { &hf_nvme_identify_ctrl_nvscc[0],
10206
16
            { "NVM Vendor Specific Command Configuration (NVSCC)", "nvme.cmd.identify.ctrl.nvscc",
10207
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10208
16
        },
10209
16
        { &hf_nvme_identify_ctrl_nvscc[1],
10210
16
            { "Standard Format Used for Vendor Specific Commands", "nvme.cmd.identify.ctrl.nvscc.std",
10211
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10212
16
        },
10213
16
        { &hf_nvme_identify_ctrl_nvscc[2],
10214
16
            { "Reserved", "nvme.cmd.identify.ctrl.nvscc.rsvd",
10215
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
10216
16
        },
10217
16
        { &hf_nvme_identify_ctrl_nwpc[0],
10218
16
            { "Namespace Write Protection Capabilities (NWPC)", "nvme.cmd.identify.ctrl.nwpc",
10219
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10220
16
        },
10221
16
        { &hf_nvme_identify_ctrl_nwpc[1],
10222
16
            { "No Write Protect and Write Protect namespace write protection states Support", "nvme.cmd.identify.ctrl.nwpc.wpss",
10223
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10224
16
        },
10225
16
        { &hf_nvme_identify_ctrl_nwpc[2],
10226
16
            { "Write Protect Until Power Cycle state Support", "nvme.cmd.identify.ctrl.nwpc.wppcs",
10227
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
10228
16
        },
10229
16
        { &hf_nvme_identify_ctrl_nwpc[3],
10230
16
            { "Permanent Write Protect state Support", "nvme.cmd.identify.ctrl.nwpc.pwpss",
10231
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
10232
16
        },
10233
16
        { &hf_nvme_identify_ctrl_nwpc[4],
10234
16
            { "Reserved", "nvme.cmd.identify.ctrl.nwpc.rsvd",
10235
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10236
16
        },
10237
16
        { &hf_nvme_identify_ctrl_acwu,
10238
16
            { "Atomic Compare & Write Unit (ACWU)", "nvme.cmd.identify.ctrl.acwu",
10239
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
10240
16
        },
10241
16
        { &hf_nvme_identify_ctrl_rsvd3,
10242
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd3",
10243
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10244
16
        },
10245
16
        { &hf_nvme_identify_ctrl_sgls[0],
10246
16
            { "SGL Support (SGLS)", "nvme.cmd.identify.ctrl.sgls",
10247
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10248
16
        },
10249
16
        { &hf_nvme_identify_ctrl_sgls[1],
10250
16
            { "SGL Supported", "nvme.cmd.identify.ctrl.sgls.sgls",
10251
16
               FT_UINT32, BASE_HEX, VALS(sgls_ify_type_tbl), 0x3, NULL, HFILL}
10252
16
        },
10253
16
        { &hf_nvme_identify_ctrl_sgls[2],
10254
16
            { "Supports Keyed SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.kdbs",
10255
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
10256
16
        },
10257
16
        { &hf_nvme_identify_ctrl_sgls[3],
10258
16
            { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd0",
10259
16
               FT_UINT32, BASE_HEX, NULL, 0xfff8, NULL, HFILL}
10260
16
        },
10261
16
        { &hf_nvme_identify_ctrl_sgls[4],
10262
16
            { "Supports SGL Bit Bucket Descriptor", "nvme.cmd.identify.ctrl.sgls.bbd",
10263
16
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
10264
16
        },
10265
16
        { &hf_nvme_identify_ctrl_sgls[5],
10266
16
            { "Supports byte aligned contiguous buffer in MPTR Field", "nvme.cmd.identify.ctrl.sgls.bufmptr",
10267
16
               FT_BOOLEAN, 32, NULL, 0x20000, NULL, HFILL}
10268
16
        },
10269
16
        { &hf_nvme_identify_ctrl_sgls[6],
10270
16
            { "Supports Larger SGL List than Command Requires", "nvme.cmd.identify.ctrl.sgls.lsgl",
10271
16
               FT_BOOLEAN, 32, NULL, 0x40000, NULL, HFILL}
10272
16
        },
10273
16
        { &hf_nvme_identify_ctrl_sgls[7],
10274
16
            { "Supports SGL Segment in MPTR Field", "nvme.cmd.identify.ctrl.sgls.kmptr",
10275
16
               FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL}
10276
16
        },
10277
16
        { &hf_nvme_identify_ctrl_sgls[8],
10278
16
            { "Supports Address Field as offset in Data Block, Segment and Last Segment SGLs", "nvme.cmd.identify.ctrl.sgls.offs",
10279
16
               FT_BOOLEAN, 32, NULL, 0x100000, NULL, HFILL}
10280
16
        },
10281
16
        { &hf_nvme_identify_ctrl_sgls[9],
10282
16
            { "Supports Transport SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.tdbd",
10283
16
               FT_BOOLEAN, 32, NULL, 0x200000, NULL, HFILL}
10284
16
        },
10285
16
        { &hf_nvme_identify_ctrl_sgls[10],
10286
16
            { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd1",
10287
16
               FT_UINT32, BASE_HEX, NULL, 0xffc00000, NULL, HFILL}
10288
16
        },
10289
16
        { &hf_nvme_identify_ctrl_mnan,
10290
16
            { "Maximum Number of Allowed Namespaces (MNAN)", "nvme.cmd.identify.ctrl.mnan",
10291
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10292
16
        },
10293
16
        { &hf_nvme_identify_ctrl_maxdna,
10294
16
            { "Maximum Domain Namespace Attachments (MAXDNA)", "nvme.cmd.identify.ctrl.maxdna",
10295
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10296
16
        },
10297
16
        { &hf_nvme_identify_ctrl_maxcna,
10298
16
            { "Maximum I/O Controller Namespace Attachments (MAXCNA)", "nvme.cmd.identify.ctrl.maxcna",
10299
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10300
16
        },
10301
16
        { &hf_nvme_identify_ctrl_oaqd,
10302
16
            { "Optimal Aggregated Queue Depth (OAQD)", "nvme.cmd.identify.ctrl.oaqd",
10303
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10304
16
        },
10305
16
        { &hf_nvme_identify_ctrl_rhiri,
10306
16
            { "Recommended Host-Initiated Refresh Interval (RHIRI)", "nvme.cmd.identify.ctrl.rhiri",
10307
16
               FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_day_days), 0x0, NULL, HFILL}
10308
16
        },
10309
16
        { &hf_nvme_identify_ctrl_hirt,
10310
16
            { "Host-Initiated Refresh Time (HIRT)", "nvme.cmd.identify.ctrl.hirt",
10311
16
               FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_minutes), 0x0, NULL, HFILL}
10312
16
        },
10313
16
        { &hf_nvme_identify_ctrl_cmmrtd,
10314
16
            { "Controller Maximum Memory Range Tracking Descriptors (CMMRTD)", "nvme.cmd.identify.ctrl.cmmrtd",
10315
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10316
16
        },
10317
16
        { &hf_nvme_identify_ctrl_nmmrtd,
10318
16
            { "NVM Subsystem Maximum Memory Range Tracking Descriptors (NMMRTD)", "nvme.cmd.identify.ctrl.nmmrtd",
10319
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10320
16
        },
10321
16
        { &hf_nvme_identify_ctrl_minmrtg,
10322
16
            { "Minimum Memory Range Tracking Granularity (MINMRTG)", "nvme.cmd.identify.ctrl.minmrtg",
10323
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10324
16
        },
10325
16
        { &hf_nvme_identify_ctrl_maxmrtg,
10326
16
            { "Maximum Memory Range Tracking Granularity (MAXMRTG)", "nvme.cmd.identify.ctrl.maxmrtg",
10327
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10328
16
        },
10329
16
        { &hf_nvme_identify_ctrl_trattr[0],
10330
16
            { "Tracking Attributes (TRATTR)", "nvme.cmd.identify.ctrl.trattr",
10331
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10332
16
        },
10333
16
        { &hf_nvme_identify_ctrl_trattr[1],
10334
16
            { "Track Host Memory Changes Support (THMCS)", "nvme.cmd.identify.ctrl.trattr.thmcs",
10335
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10336
16
        },
10337
16
        { &hf_nvme_identify_ctrl_trattr[2],
10338
16
            { "Track User Data Changes Support (TUDCS)", "nvme.cmd.identify.ctrl.trattr.tudcs",
10339
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
10340
16
        },
10341
16
        { &hf_nvme_identify_ctrl_trattr[3],
10342
16
            { "Memory Range Tracking Length Limit (MRTLL)", "nvme.cmd.identify.ctrl.trattr.mrtll",
10343
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
10344
16
        },
10345
16
        { &hf_nvme_identify_ctrl_trattr[4],
10346
16
            { "Reserved", "nvme.cmd.identify.ctrl.trattr.rsvd",
10347
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10348
16
        },
10349
16
        { &hf_nvme_identify_ctrl_rsvd4,
10350
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd4",
10351
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10352
16
        },
10353
16
        { &hf_nvme_identify_ctrl_mcudmq,
10354
16
            { "Maximum Controller User Data Migration Queues (MCUDMQ)", "nvme.cmd.identify.ctrl.mcudmq",
10355
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10356
16
        },
10357
16
        { &hf_nvme_identify_ctrl_mnsudmq,
10358
16
            { "Maximum NVM Subsystem User Data Migration Queues (MNSUDMQ)", "nvme.cmd.identify.ctrl.mnsudmq",
10359
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10360
16
        },
10361
16
        { &hf_nvme_identify_ctrl_mcmr,
10362
16
            { "Maximum CDQ Memory Ranges (MCMR)", "nvme.cmd.identify.ctrl.mcmr",
10363
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10364
16
        },
10365
16
        { &hf_nvme_identify_ctrl_nmcmr,
10366
16
            { "NVM Subsystem Maximum CDQ Memory Ranges (NMCMR)", "nvme.cmd.identify.ctrl.nmcmr",
10367
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10368
16
        },
10369
16
        { &hf_nvme_identify_ctrl_mcdqpc,
10370
16
            { "Maximum Controller Data Queue PRP Count (MCDQPC)", "nvme.cmd.identify.ctrl.mcdqpc",
10371
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10372
16
        },
10373
16
        { &hf_nvme_identify_ctrl_rsvd9,
10374
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd9",
10375
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10376
16
        },
10377
16
        { &hf_nvme_identify_ctrl_subnqn,
10378
16
            { "NVM Subsystem NVMe Qualified Name (SUBNQN)", "nvme.cmd.identify.ctrl.subnqn",
10379
16
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
10380
16
        },
10381
16
        { &hf_nvme_identify_ctrl_rsvd5,
10382
16
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd5",
10383
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10384
16
        },
10385
16
        { &hf_nvme_identify_ctrl_nvmeof,
10386
16
            { "NVMeOF Attributes", "nvme.cmd.identify.ctrl.nvmeof",
10387
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10388
16
        },
10389
16
        { &hf_nvme_identify_ctrl_nvmeof_ioccsz,
10390
16
            { "I/O Queue Command Capsule Supported Size (IOCCSZ)", "nvme.cmd.identify.ctrl.nvmeof.ioccsz",
10391
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
10392
16
        },
10393
16
        { &hf_nvme_identify_ctrl_nvmeof_iorcsz,
10394
16
            { "I/O Queue Response Capsule Supported Size (IORCSZ)", "nvme.cmd.identify.ctrl.nvmeof.iorcsz",
10395
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
10396
16
        },
10397
16
        { &hf_nvme_identify_ctrl_nvmeof_icdoff,
10398
16
            { "In Capsule Data Offset (ICDOFF)", "nvme.cmd.identify.ctrl.nvmeof.icdoff",
10399
16
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
10400
16
        },
10401
16
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[0],
10402
16
            { "Fabrics Controller Attributes (FCATT)", "nvme.cmd.identify.ctrl.nvmeof.fcatt",
10403
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10404
16
        },
10405
16
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[1],
10406
16
            { "Dynamic Controller Model", "nvme.cmd.identify.ctrl.nvmeof.fcatt.dcm",
10407
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
10408
16
        },
10409
16
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[2],
10410
16
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.fcatt.rsvd",
10411
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
10412
16
        },
10413
16
        { &hf_nvme_identify_ctrl_nvmeof_msdbd,
10414
16
            { "Maximum SGL Data Block Descriptors (MSDBD)", "nvme.cmd.identify.ctrl.nvmeof.msdbd",
10415
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10416
16
        },
10417
16
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[0],
10418
16
            { "Optional Fabric Commands Support (OFCS)", "nvme.cmd.identify.ctrl.nvmeof.ofcs",
10419
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10420
16
        },
10421
16
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[1],
10422
16
            { "Supports Disconnect Command", "nvme.cmd.identify.ctrl.nvmeof.ofcs.dcs",
10423
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
10424
16
        },
10425
16
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[2],
10426
16
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.ofcs.rsvd",
10427
16
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
10428
16
        },
10429
16
        { &hf_nvme_identify_ctrl_nvmeof_dctype,
10430
16
            { "Discovery Controller Type (DCTYPE)", "nvme.cmd.identify.ctrl.nvmeof.dctype",
10431
16
               FT_UINT8, BASE_HEX, VALS(ctrl_dctype_tbl), 0x0, NULL, HFILL}
10432
16
        },
10433
16
        { &hf_nvme_identify_ctrl_nvmeof_ccrl,
10434
16
            { "Cross-Controller Reset Limit (CCRL)", "nvme.cmd.identify.ctrl.nvmeof.ccrl",
10435
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10436
16
        },
10437
16
        { &hf_nvme_identify_ctrl_nvmeof_rsvd,
10438
16
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.rsvd",
10439
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10440
16
        },
10441
16
        { &hf_nvme_identify_ctrl_psds,
10442
16
            { "Power State Attributes", "nvme.cmd.identify.ctrl.psds",
10443
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10444
16
        },
10445
16
        { &hf_nvme_identify_ctrl_psd,
10446
16
            { "Power State 0 Descriptor (PSD0)", "nvme.cmd.identify.ctrl.psds.psd",
10447
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10448
16
        },
10449
16
        { &hf_nvme_identify_ctrl_psd_mp,
10450
16
            { "Maximum Power (MP)", "nvme.cmd.identify.ctrl.psds.psd.mp",
10451
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10452
16
        },
10453
16
        { &hf_nvme_identify_ctrl_psd_rsvd0,
10454
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd0",
10455
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10456
16
        },
10457
16
        { &hf_nvme_identify_ctrl_psd_mxps,
10458
16
            { "Max Power Scale (MXPS)", "nvme.cmd.identify.ctrl.psds.psd.mxps",
10459
16
               FT_BOOLEAN, 8, TFS(&units_watts), 0x1, NULL, HFILL}
10460
16
        },
10461
16
        { &hf_nvme_identify_ctrl_psd_nops,
10462
16
            { "Non-Operational State (NOPS)", "nvme.cmd.identify.ctrl.psds.psd.nops",
10463
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
10464
16
        },
10465
16
        { &hf_nvme_identify_ctrl_psd_rsvd1,
10466
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd1",
10467
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
10468
16
        },
10469
16
        { &hf_nvme_identify_ctrl_psd_enlat,
10470
16
            { "Entry Latency (ENLAT)", "nvme.cmd.identify.ctrl.psds.psd.enlat",
10471
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10472
16
        },
10473
16
        { &hf_nvme_identify_ctrl_psd_exlat,
10474
16
            { "Exit Latency (EXLAT)", "nvme.cmd.identify.ctrl.psds.psd.exlat",
10475
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10476
16
        },
10477
16
        { &hf_nvme_identify_ctrl_psd_rrt,
10478
16
            { "Relative Read Throughput (RRT)", "nvme.cmd.identify.ctrl.psds.psd.rrt",
10479
16
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
10480
16
        },
10481
16
        { &hf_nvme_identify_ctrl_psd_rsvd2,
10482
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd2",
10483
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
10484
16
        },
10485
16
        { &hf_nvme_identify_ctrl_psd_rrl,
10486
16
            { "Relative Read Latency (RRL)", "nvme.cmd.identify.ctrl.psds.psd.rrl",
10487
16
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
10488
16
        },
10489
16
        { &hf_nvme_identify_ctrl_psd_rsvd3,
10490
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd3",
10491
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
10492
16
        },
10493
16
        { &hf_nvme_identify_ctrl_psd_rwt,
10494
16
            { "Relative Write Throughput (RWT)", "nvme.cmd.identify.ctrl.psds.psd.rwt",
10495
16
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
10496
16
        },
10497
16
        { &hf_nvme_identify_ctrl_psd_rsvd4,
10498
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd4",
10499
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
10500
16
        },
10501
16
        { &hf_nvme_identify_ctrl_psd_rwl,
10502
16
            { "Relative Write Latency (RWL)", "nvme.cmd.identify.ctrl.psds.psd.rwl",
10503
16
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
10504
16
        },
10505
16
        { &hf_nvme_identify_ctrl_psd_rsvd5,
10506
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd5",
10507
16
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
10508
16
        },
10509
16
        { &hf_nvme_identify_ctrl_psd_idlp,
10510
16
            { "Idle Power (IDLP)", "nvme.cmd.identify.ctrl.psds.psd.idlp",
10511
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10512
16
        },
10513
16
        { &hf_nvme_identify_ctrl_psd_rsvd6,
10514
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd6",
10515
16
               FT_UINT8, BASE_HEX, NULL, 0x3f, NULL, HFILL}
10516
16
        },
10517
16
        { &hf_nvme_identify_ctrl_psd_ips,
10518
16
            { "Idle Power Scale (IPS)", "nvme.cmd.identify.ctrl.psds.psd.ips",
10519
16
               FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL}
10520
16
        },
10521
16
        { &hf_nvme_identify_ctrl_psd_rsvd7,
10522
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd7",
10523
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10524
16
        },
10525
16
        { &hf_nvme_identify_ctrl_psd_actp,
10526
16
            { "Active Power (ACTP)", "nvme.cmd.identify.ctrl.psds.psd.actp",
10527
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10528
16
        },
10529
16
        { &hf_nvme_identify_ctrl_psd_apw,
10530
16
            { "Active Power Workload (APW)", "nvme.cmd.identify.ctrl.psds.psd.apw",
10531
16
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
10532
16
        },
10533
16
        { &hf_nvme_identify_ctrl_psd_rsvd8,
10534
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd8",
10535
16
               FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL}
10536
16
        },
10537
16
        { &hf_nvme_identify_ctrl_psd_aps,
10538
16
            { "Active Power Scale (APS)", "nvme.cmd.identify.ctrl.psds.psd.aps",
10539
16
               FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL}
10540
16
        },
10541
16
        { &hf_nvme_identify_ctrl_psd_epfrt,
10542
16
            { "Emergency Power Fail Recovery Time (EPFRT)", "nvme.cmd.identify.ctrl.psds.psd.epfrt",
10543
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10544
16
        },
10545
16
        { &hf_nvme_identify_ctrl_psd_fqvt,
10546
16
            { "Forced Quiescence Vault Time (FQVT)", "nvme.cmd.identify.ctrl.psds.psd.fqvt",
10547
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10548
16
        },
10549
16
        { &hf_nvme_identify_ctrl_psd_epfvt,
10550
16
            { "Emergency Power Fail Vault Time (EPFVT)", "nvme.cmd.identify.ctrl.psds.psd.epfvt",
10551
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10552
16
        },
10553
16
        { &hf_nvme_identify_ctrl_psd_epfrts,
10554
16
            { "Emergency Power Fail Recovery Time Scale (EPFRTS)", "nvme.cmd.identify.ctrl.psds.psd.epfrts",
10555
16
               FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0x0f, NULL, HFILL}
10556
16
        },
10557
16
        { &hf_nvme_identify_ctrl_psd_fqvts,
10558
16
            { "Forced Quiescence Vault Time Scale (FQVTS)", "nvme.cmd.identify.ctrl.psds.psd.fqvts",
10559
16
               FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0xf0, NULL, HFILL}
10560
16
        },
10561
16
        { &hf_nvme_identify_ctrl_psd_epfvts,
10562
16
            { "Emergency Power Fail Vault Time Scale (EPFVTS)", "nvme.cmd.identify.ctrl.psds.psd.epfvts",
10563
16
               FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0x0f, NULL, HFILL}
10564
16
        },
10565
16
        { &hf_nvme_identify_ctrl_psd_rsvd9,
10566
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd9",
10567
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
10568
16
        },
10569
16
        { &hf_nvme_identify_ctrl_psd_mbw,
10570
16
            { "Max Bandwidth (MBW)", "nvme.cmd.identify.ctrl.psds.psd.mbw",
10571
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10572
16
        },
10573
16
        { &hf_nvme_identify_ctrl_psd_mbws,
10574
16
            { "Max Bandwidth Scale (MBWS)", "nvme.cmd.identify.ctrl.psds.psd.mbws",
10575
16
               FT_UINT8, BASE_HEX, VALS(max_bw_scale_tbl), 0x07, NULL, HFILL}
10576
16
        },
10577
16
        { &hf_nvme_identify_ctrl_psd_rsvd10,
10578
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd10",
10579
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
10580
16
        },
10581
16
        { &hf_nvme_identify_ctrl_psd_rsvd11,
10582
16
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd11",
10583
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10584
16
        },
10585
16
        { &hf_nvme_identify_ctrl_vs,
10586
16
            { "Vendor Specific", "nvme.cmd.identify.ctrl.vs",
10587
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10588
16
        },
10589
10590
        /* Identify nslist response */
10591
16
        { &hf_nvme_identify_nslist_nsid,
10592
16
            { "Namespace list element", "nvme.cmd.identify.nslist.nsid",
10593
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10594
16
        },
10595
        /* Identify Namespace Identification Descriptor list (CNS 03h) response */
10596
16
        { &hf_nvme_identify_nsdesc_nidt,
10597
16
            { "Namespace Identifier Type (NIDT)", "nvme.cmd.identify.nsdesc.nidt",
10598
16
               FT_UINT8, BASE_HEX, VALS(nidt_tbl), 0x0, NULL, HFILL}
10599
16
        },
10600
16
        { &hf_nvme_identify_nsdesc_nidl,
10601
16
            { "Namespace Identifier Length (NIDL)", "nvme.cmd.identify.nsdesc.nidl",
10602
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10603
16
        },
10604
16
        { &hf_nvme_identify_nsdesc_nid,
10605
16
            { "Namespace Identifier (NID)", "nvme.cmd.identify.nsdesc.nid",
10606
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10607
16
        },
10608
        /* Identify Controller List (CNS 12h/13h) response */
10609
16
        { &hf_nvme_identify_ctrl_list_num,
10610
16
            { "Number of Controller Identifiers (NUMCIDS)", "nvme.cmd.identify.ctrl_list.num",
10611
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10612
16
        },
10613
16
        { &hf_nvme_identify_ctrl_list_id,
10614
16
            { "Controller Identifier", "nvme.cmd.identify.ctrl_list.id",
10615
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10616
16
        },
10617
        /* Identify NVM Set List (CNS 04h) response */
10618
16
        { &hf_nvme_identify_nvmset_num,
10619
16
            { "Number of Entries (NUMENT)", "nvme.cmd.identify.nvmset.num",
10620
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10621
16
        },
10622
16
        { &hf_nvme_identify_nvmset_id,
10623
16
            { "NVM Set Identifier (NSETID)", "nvme.cmd.identify.nvmset.id",
10624
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10625
16
        },
10626
16
        { &hf_nvme_identify_nvmset_endgid,
10627
16
            { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.nvmset.endgid",
10628
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10629
16
        },
10630
16
        { &hf_nvme_identify_nvmset_r4krt,
10631
16
            { "Random 4 KiB Read Typical (R4KRT)", "nvme.cmd.identify.nvmset.r4krt",
10632
16
               FT_UINT32, BASE_DEC, NULL, 0x0, "In 100 ns units", HFILL}
10633
16
        },
10634
16
        { &hf_nvme_identify_nvmset_ows,
10635
16
            { "Optimal Write Size (OWS)", "nvme.cmd.identify.nvmset.ows",
10636
16
               FT_UINT32, BASE_DEC, NULL, 0x0, "In bytes", HFILL}
10637
16
        },
10638
16
        { &hf_nvme_identify_nvmset_tnvmsc,
10639
16
            { "Total NVM Set Capacity (TNVMSC)", "nvme.cmd.identify.nvmset.tnvmsc",
10640
16
               FT_BYTES, BASE_NONE, NULL, 0x0, "In bytes (128-bit)", HFILL}
10641
16
        },
10642
16
        { &hf_nvme_identify_nvmset_unvmsc,
10643
16
            { "Unallocated NVM Set Capacity (UNVMSC)", "nvme.cmd.identify.nvmset.unvmsc",
10644
16
               FT_BYTES, BASE_NONE, NULL, 0x0, "In bytes (128-bit)", HFILL}
10645
16
        },
10646
        /* Identify Primary Controller Capabilities (CNS 14h) response */
10647
16
        { &hf_nvme_identify_pcc_cntlid,
10648
16
            { "Controller Identifier (CNTLID)", "nvme.cmd.identify.pcc.cntlid",
10649
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10650
16
        },
10651
16
        { &hf_nvme_identify_pcc_portid,
10652
16
            { "Port Identifier (PORTID)", "nvme.cmd.identify.pcc.portid",
10653
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10654
16
        },
10655
16
        { &hf_nvme_identify_pcc_crt[0],
10656
16
            { "Controller Resource Types (CRT)", "nvme.cmd.identify.pcc.crt",
10657
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10658
16
        },
10659
16
        { &hf_nvme_identify_pcc_crt[1],
10660
16
            { "VQ Resources Support (VQRS)", "nvme.cmd.identify.pcc.crt.vqrs",
10661
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
10662
16
        },
10663
16
        { &hf_nvme_identify_pcc_crt[2],
10664
16
            { "VI Resources Support (VIRS)", "nvme.cmd.identify.pcc.crt.virs",
10665
16
               FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL}
10666
16
        },
10667
16
        { &hf_nvme_identify_pcc_crt[3],
10668
16
            { "Reserved", "nvme.cmd.identify.pcc.crt.rsvd",
10669
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffc, NULL, HFILL}
10670
16
        },
10671
16
        { &hf_nvme_identify_pcc_vqfrt,
10672
16
            { "VQ Resources Flexible Total (VQFRT)", "nvme.cmd.identify.pcc.vqfrt",
10673
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10674
16
        },
10675
16
        { &hf_nvme_identify_pcc_vqrfa,
10676
16
            { "VQ Resources Flexible Assigned (VQRFA)", "nvme.cmd.identify.pcc.vqrfa",
10677
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10678
16
        },
10679
16
        { &hf_nvme_identify_pcc_vqrfap,
10680
16
            { "VQ Resources Flexible Allocated to Primary (VQRFAP)", "nvme.cmd.identify.pcc.vqrfap",
10681
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10682
16
        },
10683
16
        { &hf_nvme_identify_pcc_vqprt,
10684
16
            { "VQ Resources Private Total (VQPRT)", "nvme.cmd.identify.pcc.vqprt",
10685
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10686
16
        },
10687
16
        { &hf_nvme_identify_pcc_vqfrsm,
10688
16
            { "VQ Resources Flexible Secondary Maximum (VQFRSM)", "nvme.cmd.identify.pcc.vqfrsm",
10689
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10690
16
        },
10691
16
        { &hf_nvme_identify_pcc_vqgran,
10692
16
            { "VQ Flexible Resource Preferred Granularity (VQGRAN)", "nvme.cmd.identify.pcc.vqgran",
10693
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10694
16
        },
10695
16
        { &hf_nvme_identify_pcc_vifrt,
10696
16
            { "VI Resources Flexible Total (VIFRT)", "nvme.cmd.identify.pcc.vifrt",
10697
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10698
16
        },
10699
16
        { &hf_nvme_identify_pcc_virfa,
10700
16
            { "VI Resources Flexible Assigned (VIRFA)", "nvme.cmd.identify.pcc.virfa",
10701
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
10702
16
        },
10703
16
        { &hf_nvme_identify_pcc_virfap,
10704
16
            { "VI Resources Flexible Allocated to Primary (VIRFAP)", "nvme.cmd.identify.pcc.virfap",
10705
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10706
16
        },
10707
16
        { &hf_nvme_identify_pcc_viprt,
10708
16
            { "VI Resources Private Total (VIPRT)", "nvme.cmd.identify.pcc.viprt",
10709
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10710
16
        },
10711
16
        { &hf_nvme_identify_pcc_vifrsm,
10712
16
            { "VI Resources Flexible Secondary Maximum (VIFRSM)", "nvme.cmd.identify.pcc.vifrsm",
10713
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10714
16
        },
10715
16
        { &hf_nvme_identify_pcc_vigran,
10716
16
            { "VI Flexible Resource Preferred Granularity (VIGRAN)", "nvme.cmd.identify.pcc.vigran",
10717
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10718
16
        },
10719
        /* Identify Secondary Controller List (CNS 15h) response */
10720
16
        { &hf_nvme_identify_scl_num,
10721
16
            { "Number of Entries (NUMENT)", "nvme.cmd.identify.scl.num",
10722
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
10723
16
        },
10724
16
        { &hf_nvme_identify_scl_scid,
10725
16
            { "Secondary Controller Identifier (SCID)", "nvme.cmd.identify.scl.scid",
10726
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10727
16
        },
10728
16
        { &hf_nvme_identify_scl_pcid,
10729
16
            { "Primary Controller Identifier (PCID)", "nvme.cmd.identify.scl.pcid",
10730
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10731
16
        },
10732
16
        { &hf_nvme_identify_scl_scs[0],
10733
16
            { "Secondary Controller State (SCS)", "nvme.cmd.identify.scl.scs",
10734
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10735
16
        },
10736
16
        { &hf_nvme_identify_scl_scs[1],
10737
16
            { "Online State (OLS)", "nvme.cmd.identify.scl.scs.ols",
10738
16
               FT_UINT8, BASE_HEX, NULL, 0x1, NULL, HFILL}
10739
16
        },
10740
16
        { &hf_nvme_identify_scl_scs[2],
10741
16
            { "Reserved", "nvme.cmd.identify.scl.scs.rsvd",
10742
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
10743
16
        },
10744
16
        { &hf_nvme_identify_scl_vfn,
10745
16
            { "Virtual Function Number (VFN)", "nvme.cmd.identify.scl.vfn",
10746
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10747
16
        },
10748
16
        { &hf_nvme_identify_scl_nvq,
10749
16
            { "Number of VQ Flexible Resources Assigned (NVQ)", "nvme.cmd.identify.scl.nvq",
10750
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10751
16
        },
10752
16
        { &hf_nvme_identify_scl_nvi,
10753
16
            { "Number of VI Flexible Resources Assigned (NVI)", "nvme.cmd.identify.scl.nvi",
10754
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10755
16
        },
10756
        /* Identify Namespace Granularity List (CNS 16h) response */
10757
16
        { &hf_nvme_identify_ngl_nga[0],
10758
16
            { "Namespace Granularity Attributes (NGA)", "nvme.cmd.identify.ngl.nga",
10759
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10760
16
        },
10761
16
        { &hf_nvme_identify_ngl_nga[1],
10762
16
            { "Granularity Descriptor Mapping (GDM)", "nvme.cmd.identify.ngl.nga.gdm",
10763
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
10764
16
        },
10765
16
        { &hf_nvme_identify_ngl_nga[2],
10766
16
            { "Reserved", "nvme.cmd.identify.ngl.nga.rsvd",
10767
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
10768
16
        },
10769
16
        { &hf_nvme_identify_ngl_nd,
10770
16
            { "Number of Descriptors (ND)", "nvme.cmd.identify.ngl.nd",
10771
16
               FT_UINT8, BASE_DEC, NULL, 0x0, "0's based count", HFILL}
10772
16
        },
10773
16
        { &hf_nvme_identify_ngl_nsg,
10774
16
            { "Namespace Size Granularity (NSG)", "nvme.cmd.identify.ngl.nsg",
10775
16
               FT_UINT64, BASE_DEC, NULL, 0x0, "In bytes", HFILL}
10776
16
        },
10777
16
        { &hf_nvme_identify_ngl_ncg,
10778
16
            { "Namespace Capacity Granularity (NCG)", "nvme.cmd.identify.ngl.ncg",
10779
16
               FT_UINT64, BASE_DEC, NULL, 0x0, "In bytes", HFILL}
10780
16
        },
10781
        /* Identify UUID List (CNS 17h) response */
10782
16
        { &hf_nvme_identify_uuid_idassoc,
10783
16
            { "Identifier Association (IDASSOC)", "nvme.cmd.identify.uuid.idassoc",
10784
16
               FT_UINT8, BASE_HEX, VALS(uuid_idassoc_tbl), 0x3, NULL, HFILL}
10785
16
        },
10786
16
        { &hf_nvme_identify_uuid_uuid,
10787
16
            { "UUID", "nvme.cmd.identify.uuid.uuid",
10788
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10789
16
        },
10790
        /* get logpage response */
10791
        /* Identify Response */
10792
16
        { &hf_nvme_get_logpage_ify_genctr,
10793
16
            { "Generation Counter (GENCTR)", "nvme.cmd.get_logpage.identify.genctr",
10794
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
10795
16
        },
10796
16
        { &hf_nvme_get_logpage_ify_numrec,
10797
16
            { "Number of Records (NUMREC)", "nvme.cmd.get_logpage.identify.numrec",
10798
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
10799
16
        },
10800
16
        { &hf_nvme_get_logpage_ify_recfmt,
10801
16
            { "Record Format (RECFMT)", "nvme.cmd.get_logpage.identify.recfmt",
10802
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10803
16
        },
10804
16
        { &hf_nvme_get_logpage_ify_rsvd,
10805
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rsvd",
10806
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10807
16
        },
10808
16
        { &hf_nvme_get_logpage_ify_rcrd,
10809
16
            { "Discovery Log Entry", "nvme.cmd.get_logpage.identify.rcrd",
10810
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10811
16
        },
10812
16
        { &hf_nvme_get_logpage_ify_rcrd_trtype,
10813
16
            { "Transport Type (TRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.trtype",
10814
16
               FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL}
10815
16
        },
10816
16
        { &hf_nvme_get_logpage_ify_rcrd_adrfam,
10817
16
            { "Address Family (ADRFAM)", "nvme.cmd.get_logpage.identify.rcrd.adrfam",
10818
16
               FT_UINT8, BASE_HEX, VALS(adrfam_type_tbl), 0x0, NULL, HFILL}
10819
16
        },
10820
16
        { &hf_nvme_get_logpage_ify_rcrd_subtype,
10821
16
            { "Subsystem Type (SUBTYPE)", "nvme.cmd.get_logpage.identify.rcrd.subtype",
10822
16
               FT_UINT8, BASE_HEX, VALS(sub_type_tbl), 0x0, NULL, HFILL}
10823
16
        },
10824
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[0],
10825
16
            { "Transport Requirements (TREQ)", "nvme.cmd.get_logpage.identify.rcrd.treq",
10826
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10827
16
        },
10828
        /* NVMe Base 2.3 Figure 310, byte 03: TSC 1:0, SQFCD 2, ZHIDS 3,
10829
         * TASC 5:4, Reserved 7:6.  The pre-2.0 layout this was written against
10830
         * had a 1-bit secure-channel flag and SQ flow control on bit 1. */
10831
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[1],
10832
16
            { "Transport Secure Channel (TSC)", "nvme.cmd.get_logpage.identify.rcrd.treq.secch",
10833
16
               FT_UINT8, BASE_HEX, VALS(treq_tsc_tbl), 0x3, NULL, HFILL}
10834
16
        },
10835
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[2],
10836
16
            { "SQ Flow Control Disable (SQFCD)", "nvme.cmd.get_logpage.identify.rcrd.treq.sqfc",
10837
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
10838
16
        },
10839
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[3],
10840
16
            { "Zero Host ID Support (ZHIDS)", "nvme.cmd.get_logpage.identify.rcrd.treq.zhids",
10841
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
10842
16
        },
10843
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[4],
10844
16
            { "Transport Authentication and Secure Channel (TASC)",
10845
16
               "nvme.cmd.get_logpage.identify.rcrd.treq.tasc",
10846
16
               FT_UINT8, BASE_HEX, VALS(treq_tasc_tbl), 0x30, NULL, HFILL}
10847
16
        },
10848
16
        { &hf_nvme_get_logpage_ify_rcrd_treq[5],
10849
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.treq.rsvd",
10850
16
               FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL}
10851
16
        },
10852
16
        { &hf_nvme_get_logpage_ify_rcrd_portid,
10853
16
            { "Port ID (PORTID)", "nvme.cmd.get_logpage.identify.rcrd.portid",
10854
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10855
16
        },
10856
16
        { &hf_nvme_get_logpage_ify_rcrd_cntlid,
10857
16
            { "Controller ID (CNTLID)", "nvme.cmd.get_logpage.identify.rcrd.cntlid",
10858
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10859
16
        },
10860
16
        { &hf_nvme_get_logpage_ify_rcrd_asqsz,
10861
16
            { "Admin Max SQ Size (ASQSZ)", "nvme.cmd.get_logpage.identify.rcrd.asqsz",
10862
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10863
16
        },
10864
16
        { &hf_nvme_get_logpage_disc_rcrd_eflags[0],
10865
16
            { "Entry flags (EFLAGS)", "nvme.cmd.get_logpage.discovery.rcrd.eflags",
10866
16
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10867
16
        },
10868
16
        { &hf_nvme_get_logpage_disc_rcrd_eflags[1],
10869
16
            { "Duplicate Returned Information (DUPRETINFO)", "nvme.cmd.get_logpage.discovery.rcrd.eflags.dupretinfo",
10870
16
                FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
10871
16
        },
10872
16
        { &hf_nvme_get_logpage_disc_rcrd_eflags[2],
10873
16
            { "Explicit Persistent Connection Support for Discovery (EPCSD)",
10874
16
                "nvme.cmd.get_logpage.discovery.rcrd.eflags.epcsd",
10875
16
                FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
10876
16
        },
10877
        /* NVMe Base 2.3 Figure 310, bytes 11:10: NCC is bit 2. */
10878
16
        { &hf_nvme_get_logpage_disc_rcrd_eflags[3],
10879
16
            { "No CDC Connectivity (NCC)", "nvme.cmd.get_logpage.discovery.rcrd.eflags.ncc",
10880
16
                FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
10881
16
        },
10882
16
        { &hf_nvme_get_logpage_disc_rcrd_eflags[4],
10883
16
            { "Reserved", "nvme.cmd.get_logpage.discovery.rcrd.eflags.rsvd0",
10884
16
                FT_UINT16, BASE_HEX, NULL, 0xfff8, NULL, HFILL}
10885
16
        },
10886
16
        { &hf_nvme_get_logpage_ify_rcrd_rsvd0,
10887
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd0",
10888
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10889
16
        },
10890
16
        { &hf_nvme_get_logpage_ify_rcrd_trsvcid,
10891
16
            { "Transport Service Identifier (TRSVCID)", "nvme.cmd.get_logpage.identify.rcrd.trsvcid",
10892
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
10893
16
        },
10894
16
        { &hf_nvme_get_logpage_ify_rcrd_rsvd1,
10895
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd1",
10896
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10897
16
        },
10898
16
        { &hf_nvme_get_logpage_ify_rcrd_subnqn,
10899
16
            { "NVM Subsystem Qualified Name (SUBNQN)", "nvme.cmd.get_logpage.identify.rcrd.subnqn",
10900
16
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
10901
16
        },
10902
16
        { &hf_nvme_get_logpage_ify_rcrd_traddr,
10903
16
            { "Transport Address (TRADDR)", "nvme.cmd.get_logpage.identify.rcrd.traddr",
10904
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
10905
16
        },
10906
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas,
10907
16
            { "Transport Specific Address Subtype (TSAS)", "nvme.cmd.get_logpage.identify.rcrd.tsas",
10908
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10909
16
        },
10910
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype,
10911
16
            { "RDMA QP Service Type (RDMA_QPTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_qptype",
10912
16
               FT_UINT8, BASE_HEX, VALS(qp_type_tbl), 0x0, NULL, HFILL}
10913
16
        },
10914
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype,
10915
16
            { "RDMA Provider Type (RDMA_PRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_prtype",
10916
16
               FT_UINT8, BASE_HEX, VALS(pr_type_tbl), 0x0, NULL, HFILL}
10917
16
        },
10918
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms,
10919
16
            { "RDMA Connection Management Service (RDMA_CMS)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_cms",
10920
16
               FT_UINT8, BASE_HEX, VALS(cms_type_tbl), 0x0, NULL, HFILL}
10921
16
        },
10922
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0,
10923
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd0",
10924
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10925
16
        },
10926
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey,
10927
16
            { "RDMA Partition Key (RDMA_PKEY)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_pkey",
10928
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10929
16
        },
10930
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1,
10931
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd1",
10932
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10933
16
        },
10934
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype,
10935
16
            { "Security Type (SECTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_sectype",
10936
16
               FT_UINT8, BASE_HEX, VALS(sec_type_tbl), 0x0, NULL, HFILL}
10937
16
        },
10938
16
        { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd,
10939
16
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_rsvd",
10940
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
10941
16
        },
10942
        /* Error Information Response */
10943
16
        { &hf_nvme_get_logpage_errinf_errcnt,
10944
16
            { "Error Count", "nvme.cmd.get_logpage.errinf.errcnt",
10945
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
10946
16
        },
10947
16
        { &hf_nvme_get_logpage_errinf_sqid,
10948
16
            { "Submission Queue ID", "nvme.cmd.get_logpage.errinf.sqid",
10949
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
10950
16
        },
10951
16
        { &hf_nvme_get_logpage_errinf_cid,
10952
16
            { "Command ID", "nvme.cmd.get_logpage.errinf.cid",
10953
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10954
16
        },
10955
16
        { &hf_nvme_get_logpage_errinf_sf[0],
10956
16
            { "Status Field", "nvme.cmd.get_logpage.errinf.sf",
10957
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10958
16
        },
10959
16
        { &hf_nvme_get_logpage_errinf_sf[1],
10960
16
            { "Status Field Value", "nvme.cmd.get_logpage.errinf.sf.val",
10961
16
               FT_UINT16, BASE_HEX, NULL, 0x7fff, NULL, HFILL}
10962
16
        },
10963
16
        { &hf_nvme_get_logpage_errinf_sf[2],
10964
16
            { "Status Field Phase Tag", "nvme.cmd.get_logpage.errinf.sf.ptag",
10965
16
               FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL}
10966
16
        },
10967
16
        { &hf_nvme_get_logpage_errinf_pel[0],
10968
16
            { "Parameter Error Location", "nvme.cmd.get_logpage.errinf.pel",
10969
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
10970
16
        },
10971
16
        { &hf_nvme_get_logpage_errinf_pel[1],
10972
16
            { "Byte in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bytee",
10973
16
               FT_UINT16, BASE_DEC, NULL, 0xff, NULL, HFILL}
10974
16
        },
10975
16
        { &hf_nvme_get_logpage_errinf_pel[2],
10976
16
            { "Bit in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bite",
10977
16
               FT_UINT16, BASE_DEC, NULL, 0x0700, NULL, HFILL}
10978
16
        },
10979
16
        { &hf_nvme_get_logpage_errinf_pel[3],
10980
16
            { "Reserved", "nvme.cmd.get_logpage.errinf.pel.rsvd",
10981
16
               FT_UINT16, BASE_DEC, NULL, 0xf800, NULL, HFILL}
10982
16
        },
10983
16
        { &hf_nvme_get_logpage_errinf_lba,
10984
16
            { "LBA", "nvme.cmd.get_logpage.errinf.lba",
10985
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
10986
16
        },
10987
16
        { &hf_nvme_get_logpage_errinf_ns,
10988
16
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.nsid",
10989
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
10990
16
        },
10991
16
        { &hf_nvme_get_logpage_errinf_vsi,
10992
16
            { "Vendor Specific Information Available", "nvme.cmd.get_logpage.errinf.vsi",
10993
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
10994
16
        },
10995
16
        { &hf_nvme_get_logpage_errinf_trtype,
10996
16
            { "Transport Type", "nvme.cmd.get_logpage.errinf.trype",
10997
16
               FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL}
10998
16
        },
10999
16
        { &hf_nvme_get_logpage_errinf_cmdset,
11000
16
            { "Command Set Indicator (CSI)", "nvme.cmd.get_logpage.errinf.cmdset",
11001
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11002
16
        },
11003
16
        { &hf_nvme_get_logpage_errinf_opc,
11004
16
            { "Opcode", "nvme.cmd.get_logpage.errinf.opc",
11005
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11006
16
        },
11007
16
        { &hf_nvme_get_logpage_errinf_csi,
11008
16
            { "Command Specific Information", "nvme.cmd.get_logpage.errinf.csi",
11009
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11010
16
        },
11011
16
        { &hf_nvme_get_logpage_errinf_tsi,
11012
16
            { "Transport Type Specific Information", "nvme.cmd.get_logpage.errinf.tsi",
11013
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11014
16
        },
11015
16
        { &hf_nvme_get_logpage_errinf_rsvd1,
11016
16
            { "Reserved", "nvme.cmd.get_logpage.errinf.rsvd1",
11017
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11018
16
        },
11019
16
        { &hf_nvme_get_logpage_errinf_lpver,
11020
16
            { "Log Page Version", "nvme.cmd.get_logpage.errinf.lpver",
11021
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11022
16
        },
11023
        /* Get LogPage SMART response */
11024
16
        { &hf_nvme_get_logpage_smart_cw[0],
11025
16
            { "Critical Warning", "nvme.cmd.get_logpage.smart.cw",
11026
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11027
16
        },
11028
16
        { &hf_nvme_get_logpage_smart_cw[1],
11029
16
            { "Spare Capacity Below Threshold", "nvme.cmd.get_logpage.smart.cw.sc",
11030
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
11031
16
        },
11032
16
        { &hf_nvme_get_logpage_smart_cw[2],
11033
16
            { "Temperature Crossed Threshold", "nvme.cmd.get_logpage.smart.cw.temp",
11034
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
11035
16
        },
11036
16
        { &hf_nvme_get_logpage_smart_cw[3],
11037
16
            { "Reliability Degraded due to Significant Media Errors", "nvme.cmd.get_logpage.smart.cw.sme",
11038
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
11039
16
        },
11040
16
        { &hf_nvme_get_logpage_smart_cw[4],
11041
16
            { "Media Placed in RO State", "nvme.cmd.get_logpage.smart.cw.ro",
11042
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
11043
16
        },
11044
16
        { &hf_nvme_get_logpage_smart_cw[5],
11045
16
            { "Volatile Memory Backup Device Has Failed", "nvme.cmd.get_logpage.smart.cw.bdf",
11046
16
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
11047
16
        },
11048
16
        { &hf_nvme_get_logpage_smart_cw[6],
11049
16
            { "Persistent Memory Region Placed in RO State", "nvme.cmd.get_logpage.smart.cw.mrro",
11050
16
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
11051
16
        },
11052
16
        { &hf_nvme_get_logpage_smart_cw[7],
11053
16
            { "Indeterminate Personality State", "nvme.cmd.get_logpage.smart.cw.ips",
11054
16
               FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
11055
16
        },
11056
16
        { &hf_nvme_get_logpage_smart_cw[8],
11057
16
            { "Reserved", "nvme.cmd.get_logpage.smart.cw.rsvd",
11058
16
               FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL}
11059
16
        },
11060
16
        { &hf_nvme_get_logpage_smart_ct,
11061
16
            { "Composite Temperature (degrees K)", "nvme.cmd.get_logpage.smart.ct",
11062
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11063
16
        },
11064
16
        { &hf_nvme_get_logpage_smart_asc,
11065
16
            { "Available Spare Capacity (%)", "nvme.cmd.get_logpage.smart.asc",
11066
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11067
16
        },
11068
16
        { &hf_nvme_get_logpage_smart_ast,
11069
16
            { "Available Spare Capacity Threshold (%)", "nvme.cmd.get_logpage.smart.ast",
11070
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11071
16
        },
11072
16
        { &hf_nvme_get_logpage_smart_lpu,
11073
16
            { "Life Age Estimate (%)", "nvme.cmd.get_logpage.smart.lae",
11074
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11075
16
        },
11076
16
        { &hf_nvme_get_logpage_smart_egcws[0],
11077
16
            { "Endurance Group Critical Warning Summary", "nvme.cmd.get_logpage.smart.egcws",
11078
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11079
16
        },
11080
16
        { &hf_nvme_get_logpage_smart_egcws[1],
11081
16
            { "Spare Capacity of Endurance Group Below Threshold", "nvme.cmd.get_logpage.smart.egcws.sc",
11082
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
11083
16
        },
11084
16
        { &hf_nvme_get_logpage_smart_egcws[2],
11085
16
            { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd0",
11086
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
11087
16
        },
11088
16
        { &hf_nvme_get_logpage_smart_egcws[3],
11089
16
            { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.smart.egcws.me",
11090
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
11091
16
        },
11092
16
        { &hf_nvme_get_logpage_smart_egcws[4],
11093
16
            { "A Namespace in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.smart.egcws.ro",
11094
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
11095
16
        },
11096
16
        { &hf_nvme_get_logpage_smart_egcws[5],
11097
16
            { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd1",
11098
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
11099
16
        },
11100
16
        { &hf_nvme_get_logpage_smart_rsvd0,
11101
16
            { "Reserved", "nvme.cmd.get_logpage.smart.rsvd0",
11102
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11103
16
        },
11104
16
        { &hf_nvme_get_logpage_smart_dur,
11105
16
            { "Data Units Read", "nvme.cmd.get_logpage.smart.dur",
11106
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11107
16
        },
11108
16
        { &hf_nvme_get_logpage_smart_duw,
11109
16
            { "Data Units Written", "nvme.cmd.get_logpage.smart.duw",
11110
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11111
16
        },
11112
16
        { &hf_nvme_get_logpage_smart_hrc,
11113
16
            { "Host Read Commands", "nvme.cmd.get_logpage.smart.hrc",
11114
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11115
16
        },
11116
16
        { &hf_nvme_get_logpage_smart_hwc,
11117
16
            { "Host Write Commands", "nvme.cmd.get_logpage.smart.hwc",
11118
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11119
16
        },
11120
16
        { &hf_nvme_get_logpage_smart_cbt,
11121
16
            { "Controller Busy Time (minutes)", "nvme.cmd.get_logpage.smart.cbt",
11122
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11123
16
        },
11124
16
        { &hf_nvme_get_logpage_smart_pc,
11125
16
            { "Power Cycles", "nvme.cmd.get_logpage.smart.pc",
11126
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11127
16
        },
11128
16
        { &hf_nvme_get_logpage_smart_poh,
11129
16
            { "Power On Hours", "nvme.cmd.get_logpage.smart.poh",
11130
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11131
16
        },
11132
16
        { &hf_nvme_get_logpage_smart_mie,
11133
16
            { "Media Integrity Errors", "nvme.cmd.get_logpage.smart.mie",
11134
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11135
16
        },
11136
16
        { &hf_nvme_get_logpage_smart_us,
11137
16
            { "Unsafe Shutdowns", "nvme.cmd.get_logpage.smart.us",
11138
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11139
16
        },
11140
16
        { &hf_nvme_get_logpage_smart_ele,
11141
16
            { "Number of Error Information Log Entries", "nvme.cmd.get_logpage.smart.ele",
11142
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11143
16
        },
11144
16
        { &hf_nvme_get_logpage_smart_wctt,
11145
16
            { "Warning Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.wctt",
11146
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11147
16
        },
11148
16
        { &hf_nvme_get_logpage_smart_cctt,
11149
16
            { "Critical Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.cctt",
11150
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11151
16
        },
11152
16
        { &hf_nvme_get_logpage_smart_ts[0],
11153
16
            { "Temperature Sensors", "nvme.cmd.get_logpage.smart.ts",
11154
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11155
16
        },
11156
16
        { &hf_nvme_get_logpage_smart_ts[1],
11157
16
            { "Temperature Sensor 1 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s1",
11158
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11159
16
        },
11160
16
        { &hf_nvme_get_logpage_smart_ts[2],
11161
16
            { "Temperature Sensor 2 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s2",
11162
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11163
16
        },
11164
16
        { &hf_nvme_get_logpage_smart_ts[3],
11165
16
            { "Temperature Sensor 3 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s3",
11166
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11167
16
        },
11168
16
        { &hf_nvme_get_logpage_smart_ts[4],
11169
16
            { "Temperature Sensor 4 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s4",
11170
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11171
16
        },
11172
16
        { &hf_nvme_get_logpage_smart_ts[5],
11173
16
            { "Temperature Sensor 5 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s5",
11174
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11175
16
        },
11176
16
        { &hf_nvme_get_logpage_smart_ts[6],
11177
16
            { "Temperature Sensor 6 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s6",
11178
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11179
16
        },
11180
16
        { &hf_nvme_get_logpage_smart_ts[7],
11181
16
            { "Temperature Sensor 7 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s7",
11182
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11183
16
        },
11184
16
        { &hf_nvme_get_logpage_smart_ts[8],
11185
16
            { "Temperature Sensor 8 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s8",
11186
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11187
16
        },
11188
16
        { &hf_nvme_get_logpage_smart_tmt1c,
11189
16
            { "Thermal Management Temperature 1 Transition Count", "nvme.cmd.get_logpage.smart.tmt1c",
11190
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11191
16
        },
11192
16
        { &hf_nvme_get_logpage_smart_tmt2c,
11193
16
            { "Thermal Management Temperature 2 Transition Count", "nvme.cmd.get_logpage.smart.tmt2c",
11194
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11195
16
        },
11196
16
        { &hf_nvme_get_logpage_smart_tmt1t,
11197
16
            { "Total Time For Thermal Management Temperature 1 (seconds)", "nvme.cmd.get_logpage.smart.tmt1t",
11198
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11199
16
        },
11200
16
        { &hf_nvme_get_logpage_smart_tmt2t,
11201
16
            { "Total Time For Thermal Management Temperature 2 (seconds)", "nvme.cmd.get_logpage.smart.tmt2t",
11202
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11203
16
        },
11204
16
        { &hf_nvme_get_logpage_smart_rsvd1,
11205
16
            { "Reserved", "nvme.cmd.get_logpage.smart.rsvd1",
11206
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11207
16
        },
11208
        /* FW Slot Information Response */
11209
16
        { &hf_nvme_get_logpage_fw_slot_afi[0],
11210
16
            { "Active Firmware Info (AFI)", "nvme.cmd.get_logpage.fw_slot.afi",
11211
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11212
16
        },
11213
16
        { &hf_nvme_get_logpage_fw_slot_afi[1],
11214
16
            { "Active Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.afs",
11215
16
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
11216
16
        },
11217
16
        { &hf_nvme_get_logpage_fw_slot_afi[2],
11218
16
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd0",
11219
16
               FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL}
11220
16
        },
11221
16
        { &hf_nvme_get_logpage_fw_slot_afi[3],
11222
16
            { "Next Reset Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.nfs",
11223
16
               FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL}
11224
16
        },
11225
16
        { &hf_nvme_get_logpage_fw_slot_afi[4],
11226
16
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd1",
11227
16
               FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL}
11228
16
        },
11229
16
        { &hf_nvme_get_logpage_fw_slot_rsvd0,
11230
16
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd0",
11231
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11232
16
        },
11233
16
        { &hf_nvme_get_logpage_fw_slot_frs,
11234
16
            { "Firmware Slot Revisions", "nvme.cmd.get_logpage.fw_slot.frs",
11235
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11236
16
        },
11237
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[0],
11238
16
            { "Firmware Revision for Slot 1 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s1.ascii",
11239
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11240
16
        },
11241
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[1],
11242
16
            { "Firmware Revision for Slot 2 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s2.ascii",
11243
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11244
16
        },
11245
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[2],
11246
16
            { "Firmware Revision for Slot 3 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s3.ascii",
11247
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11248
16
        },
11249
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[3],
11250
16
            { "Firmware Revision for Slot 4 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s4.ascii",
11251
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11252
16
        },
11253
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[4],
11254
16
            { "Firmware Revision for Slot 5 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s5.ascii",
11255
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11256
16
        },
11257
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[5],
11258
16
            { "Firmware Revision for Slot 6 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s6.ascii",
11259
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11260
16
        },
11261
16
        { &hf_nvme_get_logpage_fw_slot_frs_ascii[6],
11262
16
            { "Firmware Revision for Slot 7 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s7.ascii",
11263
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
11264
16
        },
11265
16
        { &hf_nvme_get_logpage_fw_slot_rsvd1,
11266
16
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd1",
11267
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11268
16
        },
11269
        /* Changed NameSpace List Response */
11270
16
        { &hf_nvme_get_logpage_changed_nslist,
11271
16
            { "Changed Namespace", "nvme.cmd.get_logpage.changed_nslist",
11272
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11273
16
        },
11274
        /* Commands Supported and Effects Response */
11275
16
        { &hf_nvme_get_logpage_cmd_and_eff_cs,
11276
16
            { "Command Supported Entry", "nvme.cmd.get_logpage.cmd_and_eff.cs",
11277
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11278
16
        },
11279
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[0],
11280
16
            { "Commands Supported and Effects Data Structure", "nvme.cmd.get_logpage.cmd_and_eff.cseds",
11281
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11282
16
        },
11283
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[1],
11284
16
            { "Command Supported (CSUPP)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.csupp",
11285
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
11286
16
        },
11287
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[2],
11288
16
            { "Logical Block Content Change (LBCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.lbcc",
11289
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
11290
16
        },
11291
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[3],
11292
16
            { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ncc",
11293
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
11294
16
        },
11295
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[4],
11296
16
            { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.nic",
11297
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
11298
16
        },
11299
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[5],
11300
16
            { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ccc",
11301
16
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
11302
16
        },
11303
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[6],
11304
16
            { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd0",
11305
16
               FT_UINT32, BASE_HEX, NULL, 0xffe0, NULL, HFILL}
11306
16
        },
11307
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[7],
11308
16
            { "Command Submission and Execution (CSE)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.cse",
11309
16
               FT_UINT32, BASE_HEX, VALS(cmd_eff_cse_tbl), 0x70000, NULL, HFILL}
11310
16
        },
11311
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[8],
11312
16
            { "UUID Selection Supported", "nvme.cmd.get_logpage.cmd_and_eff.cseds.uss",
11313
16
               FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL}
11314
16
        },
11315
16
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[9],
11316
16
            { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd1",
11317
16
               FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL}
11318
16
        },
11319
        /* Supported Log Pages Response (LID 00h) */
11320
16
        { &hf_nvme_get_logpage_supported_lids,
11321
16
            { "Log Page Identifier Supported", "nvme.cmd.get_logpage.supported.lids",
11322
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11323
16
        },
11324
16
        { &hf_nvme_get_logpage_supported_lidseds[0],
11325
16
            { "LID Supported and Effects Data Structure", "nvme.cmd.get_logpage.supported.lidseds",
11326
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11327
16
        },
11328
16
        { &hf_nvme_get_logpage_supported_lidseds[1],
11329
16
            { "LID Supported (LSUPP)", "nvme.cmd.get_logpage.supported.lidseds.lsupp",
11330
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
11331
16
        },
11332
16
        { &hf_nvme_get_logpage_supported_lidseds[2],
11333
16
            { "Index Offset Supported (IOS)", "nvme.cmd.get_logpage.supported.lidseds.ios",
11334
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
11335
16
        },
11336
16
        { &hf_nvme_get_logpage_supported_lidseds[3],
11337
16
            { "Reserved", "nvme.cmd.get_logpage.supported.lidseds.rsvd",
11338
16
               FT_UINT32, BASE_HEX, NULL, 0xfffc, NULL, HFILL}
11339
16
        },
11340
16
        { &hf_nvme_get_logpage_supported_lidseds[4],
11341
16
            { "LID Specific Parameter (LIDSP)", "nvme.cmd.get_logpage.supported.lidseds.lidsp",
11342
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
11343
16
        },
11344
        /* Device Self-Test Response */
11345
16
                { &hf_nvme_get_logpage_selftest_csto[0],
11346
16
            { "Current Device Self-Test Operation", "nvme.cmd.get_logpage.selftest.csto",
11347
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11348
16
        },
11349
16
        { &hf_nvme_get_logpage_selftest_csto[1],
11350
16
            { "Current Self-Test Operation Status", "nvme.cmd.get_logpage.selftest.csto.st",
11351
16
               FT_UINT8, BASE_HEX, VALS(stest_type_active_tbl), 0xf, NULL, HFILL}
11352
16
        },
11353
16
        { &hf_nvme_get_logpage_selftest_csto[2],
11354
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.csto.rsvd",
11355
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
11356
16
        },
11357
16
        { &hf_nvme_get_logpage_selftest_cstc[0],
11358
16
            { "Current Device Self-Test Completion", "nvme.cmd.get_logpage.selftest.cstc",
11359
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11360
16
        },
11361
16
        { &hf_nvme_get_logpage_selftest_cstc[1],
11362
16
            { "Self-Test Completion Percent", "nvme.cmd.get_logpage.selftest.cstc.pcnt",
11363
16
               FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL}
11364
16
        },
11365
16
        { &hf_nvme_get_logpage_selftest_cstc[2],
11366
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.cstc.rsvd",
11367
16
               FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL}
11368
16
        },
11369
16
        { &hf_nvme_get_logpage_selftest_rsvd,
11370
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.rsvd",
11371
16
               FT_UINT16, BASE_HEX, NULL, 0x80, NULL, HFILL}
11372
16
        },
11373
16
        { &hf_nvme_get_logpage_selftest_res,
11374
16
            { "Latest Self-test Result Data Structure", "nvme.cmd.get_logpage.selftest.res",
11375
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11376
16
        },
11377
16
        { &hf_nvme_get_logpage_selftest_res_status[0],
11378
16
            { "Device Self-test Status", "nvme.cmd.get_logpage.selftest.res.status",
11379
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11380
16
        },
11381
16
        { &hf_nvme_get_logpage_selftest_res_status[1],
11382
16
            { "Device Self-test Result", "nvme.cmd.get_logpage.selftest.res.status.result",
11383
16
               FT_UINT8, BASE_HEX, VALS(stest_result_tbl), 0xf, NULL, HFILL}
11384
16
        },
11385
16
        { &hf_nvme_get_logpage_selftest_res_status[2],
11386
16
            { "Device Self-test Type", "nvme.cmd.get_logpage.selftest.res.status.type",
11387
16
               FT_UINT8, BASE_HEX, VALS(stest_type_done_tbl), 0xf0, NULL, HFILL}
11388
16
        },
11389
16
        { &hf_nvme_get_logpage_selftest_res_sn,
11390
16
            { "Segment Number", "nvme.cmd.get_logpage.selftest.res.sn",
11391
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11392
16
        },
11393
16
        { &hf_nvme_get_logpage_selftest_res_vdi[0],
11394
16
            { "Valid Diagnostic Information", "nvme.cmd.get_logpage.selftest.res.vdi",
11395
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11396
16
        },
11397
16
        { &hf_nvme_get_logpage_selftest_res_vdi[1],
11398
16
            { "Namespace Identifier (NSID) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.nsid",
11399
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
11400
16
        },
11401
16
        { &hf_nvme_get_logpage_selftest_res_vdi[2],
11402
16
            { "Failing LBA (FLBA) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.flba",
11403
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
11404
16
        },
11405
16
        { &hf_nvme_get_logpage_selftest_res_vdi[3],
11406
16
            { "Status Code Type (SCT) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sct",
11407
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
11408
16
        },
11409
16
        { &hf_nvme_get_logpage_selftest_res_vdi[4],
11410
16
            { "Status Code (SC) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sc",
11411
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
11412
16
        },
11413
16
        { &hf_nvme_get_logpage_selftest_res_vdi[5],
11414
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.vdi.rsvd",
11415
16
               FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL}
11416
16
        },
11417
16
        { &hf_nvme_get_logpage_selftest_res_rsvd,
11418
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.rsvd",
11419
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11420
16
        },
11421
16
        { &hf_nvme_get_logpage_selftest_res_poh,
11422
16
            { "Power On Hours (POH)", "nvme.cmd.get_logpage.selftest.res.poh",
11423
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11424
16
        },
11425
16
        { &hf_nvme_get_logpage_selftest_res_nsid,
11426
16
            { "Namespace Identifier (NSID)", "nvme.cmd.get_logpage.selftest.res.nsid",
11427
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11428
16
        },
11429
16
        { &hf_nvme_get_logpage_selftest_res_flba,
11430
16
            { "Failing LBA", "nvme.cmd.get_logpage.selftest.res.flba",
11431
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11432
16
        },
11433
16
        { &hf_nvme_get_logpage_selftest_res_sct[0],
11434
16
            { "Status Code Type", "nvme.cmd.get_logpage.selftest.res.sct",
11435
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11436
16
        },
11437
16
        { &hf_nvme_get_logpage_selftest_res_sct[1],
11438
16
            { "Additional Information", "nvme.cmd.get_logpage.selftest.res.sct.ai",
11439
16
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
11440
16
        },
11441
16
        { &hf_nvme_get_logpage_selftest_res_sct[2],
11442
16
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.sct.rsvd",
11443
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
11444
16
        },
11445
16
        { &hf_nvme_get_logpage_selftest_res_sc,
11446
16
            { "Status Code", "nvme.cmd.get_logpage.selftest.res.sc",
11447
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11448
16
        },
11449
16
        { &hf_nvme_get_logpage_selftest_res_vs,
11450
16
            { "Vendor Specific", "nvme.cmd.get_logpage.selftest.res.vs",
11451
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11452
16
        },
11453
        /* Telemetry Log Response */
11454
16
        { &hf_nvme_get_logpage_telemetry_li,
11455
16
            { "Log Identifier", "nvme.cmd.get_logpage.telemetry.li",
11456
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11457
16
        },
11458
16
        { &hf_nvme_get_logpage_telemetry_rsvd0,
11459
16
            { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd0",
11460
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11461
16
        },
11462
16
        { &hf_nvme_get_logpage_telemetry_ieee,
11463
16
            { "IEEE OUI Identifier (IEEE)", "nvme.cmd.get_logpage.telemetry.ieee",
11464
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11465
16
        },
11466
16
        { &hf_nvme_get_logpage_telemetry_da1lb,
11467
16
            { "Telemetry Data Area 1 Last Block", "nvme.cmd.get_logpage.telemetry.da1b",
11468
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11469
16
        },
11470
16
        { &hf_nvme_get_logpage_telemetry_da2lb,
11471
16
            { "Telemetry Data Area 2 Last Block", "nvme.cmd.get_logpage.telemetry.da2b",
11472
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11473
16
        },
11474
16
        { &hf_nvme_get_logpage_telemetry_da3lb,
11475
16
            { "Telemetry Data Area 3 Last Block", "nvme.cmd.get_logpage.telemetry.da3b",
11476
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11477
16
        },
11478
16
        { &hf_nvme_get_logpage_telemetry_rsvd1,
11479
16
            { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd1",
11480
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11481
16
        },
11482
16
        { &hf_nvme_get_logpage_telemetry_da4lb,
11483
16
            { "Telemetry Data Area 4 Last Block", "nvme.cmd.get_logpage.telemetry.da4b",
11484
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11485
16
        },
11486
16
        { &hf_nvme_get_logpage_telemetry_rsvd2,
11487
16
            { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd2",
11488
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11489
16
        },
11490
16
        { &hf_nvme_get_logpage_telemetry_scope,
11491
16
            { "Telemetry Scope", "nvme.cmd.get_logpage.telemetry.scope",
11492
16
               FT_UINT8, BASE_HEX, VALS(telemetry_scope_tbl), 0x0, NULL, HFILL}
11493
16
        },
11494
16
        { &hf_nvme_get_logpage_telemetry_hdgn,
11495
16
            { "Telemetry Host-Initiated Data Generation Number", "nvme.cmd.get_logpage.telemetry.hdgn",
11496
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11497
16
        },
11498
16
        { &hf_nvme_get_logpage_telemetry_da,
11499
16
            { "Telemetry Controller-Initiated Data Available", "nvme.cmd.get_logpage.telemetry.da",
11500
16
               FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}
11501
16
        },
11502
16
        { &hf_nvme_get_logpage_telemetry_dgn,
11503
16
            { "Telemetry Controller-Initiated Data Generation Number", "nvme.cmd.get_logpage.telemetry.dgn",
11504
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11505
16
        },
11506
16
        { &hf_nvme_get_logpage_telemetry_ri,
11507
16
            { "Reason Identifier", "nvme.cmd.get_logpage.telemetry.ri",
11508
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11509
16
        },
11510
16
        { &hf_nvme_get_logpage_telemetry_db,
11511
16
            { "Telemetry Data Block", "nvme.cmd.get_logpage.telemetry.db",
11512
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11513
16
        },
11514
        /* Endurance Group Response */
11515
16
        { &hf_nvme_get_logpage_egroup_cw[0],
11516
16
            { "Critical Warning", "nvme.cmd.get_logpage.egroup.cw",
11517
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11518
16
        },
11519
16
        { &hf_nvme_get_logpage_egroup_cw[1],
11520
16
            { "Available Spare Capacity Below Threshold", "nvme.cmd.get_logpage.egroup.cw.asc",
11521
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
11522
16
        },
11523
16
        { &hf_nvme_get_logpage_egroup_cw[2],
11524
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd0",
11525
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
11526
16
        },
11527
16
        { &hf_nvme_get_logpage_egroup_cw[3],
11528
16
            { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.egroup.cw.rd",
11529
16
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
11530
16
        },
11531
16
        { &hf_nvme_get_logpage_egroup_cw[4],
11532
16
            { "All Namespaces in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.egroup.cw.ro",
11533
16
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
11534
16
        },
11535
16
        { &hf_nvme_get_logpage_egroup_cw[5],
11536
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd1",
11537
16
               FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL}
11538
16
        },
11539
16
        { &hf_nvme_get_logpage_egroup_egfeat[0],
11540
16
            { "Endurance Group Features", "nvme.cmd.get_logpage.egroup.egfeat",
11541
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11542
16
        },
11543
16
        { &hf_nvme_get_logpage_egroup_egfeat[1],
11544
16
            { "Endurance Group Media (Rotational)", "nvme.cmd.get_logpage.egroup.egfeat.egrmedia",
11545
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
11546
16
        },
11547
16
        { &hf_nvme_get_logpage_egroup_egfeat[2],
11548
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.egfeat.rsvd0",
11549
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
11550
16
        },
11551
16
        { &hf_nvme_get_logpage_egroup_rsvd0,
11552
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd0",
11553
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11554
16
        },
11555
16
        { &hf_nvme_get_logpage_egroup_as,
11556
16
            { "Available Spare Capacity %", "nvme.cmd.get_logpage.egroup.as",
11557
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11558
16
        },
11559
16
        { &hf_nvme_get_logpage_egroup_ast,
11560
16
            { "Available Spare Threshold %", "nvme.cmd.get_logpage.egroup.ast",
11561
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11562
16
        },
11563
16
        { &hf_nvme_get_logpage_egroup_pu,
11564
16
            { "Life Age (Percentage Used) %", "nvme.cmd.get_logpage.egroup.pu",
11565
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11566
16
        },
11567
16
        { &hf_nvme_get_logpage_egroup_did,
11568
16
            { "Domain Identifier", "nvme.cmd.get_logpage.egroup.did",
11569
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11570
16
        },
11571
16
        { &hf_nvme_get_logpage_egroup_rsvd1,
11572
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd1",
11573
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11574
16
        },
11575
16
        { &hf_nvme_get_logpage_egroup_ee,
11576
16
            { "Endurance Estimate (GB that may be written)", "nvme.cmd.get_logpage.egroup.ee",
11577
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11578
16
        },
11579
16
        { &hf_nvme_get_logpage_egroup_dur,
11580
16
            { "Data Units Read (GB)", "nvme.cmd.get_logpage.egroup.dur",
11581
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11582
16
        },
11583
16
        { &hf_nvme_get_logpage_egroup_duw,
11584
16
            { "Data Units Written (GB)", "nvme.cmd.get_logpage.egroup.duw",
11585
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11586
16
        },
11587
16
        { &hf_nvme_get_logpage_egroup_muw,
11588
16
            { "Media Units Written (GB)", "nvme.cmd.get_logpage.egroup.muw",
11589
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11590
16
        },
11591
16
        { &hf_nvme_get_logpage_egroup_hrc,
11592
16
            { "Host Read Commands", "nvme.cmd.get_logpage.egroup.hrc",
11593
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11594
16
        },
11595
16
        { &hf_nvme_get_logpage_egroup_hwc,
11596
16
            { "Host Write Commands", "nvme.cmd.get_logpage.egroup.hwc",
11597
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11598
16
        },
11599
16
        { &hf_nvme_get_logpage_egroup_mdie,
11600
16
            { "Media and Data Integrity Errors", "nvme.cmd.get_logpage.egroup.mdie",
11601
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11602
16
        },
11603
16
        { &hf_nvme_get_logpage_egroup_ele,
11604
16
            { "Number of Error Information Log Entries", "nvme.cmd.get_logpage.egroup.ele",
11605
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11606
16
        },
11607
16
        { &hf_nvme_get_logpage_egroup_tegcap,
11608
16
            { "Total Endurance Group Capacity (TEGCAP)", "nvme.cmd.get_logpage.egroup.tegcap",
11609
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11610
16
        },
11611
16
        { &hf_nvme_get_logpage_egroup_uegcap,
11612
16
            { "Unallocated Endurance Group Capacity (UEGCAP)", "nvme.cmd.get_logpage.egroup.uegcap",
11613
16
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
11614
16
        },
11615
16
        { &hf_nvme_get_logpage_egroup_rsvd2,
11616
16
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd2",
11617
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11618
16
        },
11619
        /* Predictable Latency NVMSet Response */
11620
16
        { &hf_nvme_get_logpage_pred_lat_status[0],
11621
16
            { "Predictable Latency NVM Set Status", "nvme.cmd.get_logpage.pred_lat.status",
11622
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11623
16
        },
11624
16
        { &hf_nvme_get_logpage_pred_lat_status[1],
11625
16
            { "Enabled Window Setting", "nvme.cmd.get_logpage.pred_lat.status.ws",
11626
16
               FT_UINT8, BASE_HEX, VALS(plat_status_tbl), 0x7, NULL, HFILL}
11627
16
        },
11628
16
        { &hf_nvme_get_logpage_pred_lat_status[2],
11629
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.status.rsvd",
11630
16
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
11631
16
        },
11632
16
        { &hf_nvme_get_logpage_pred_lat_rsvd0,
11633
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd0",
11634
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11635
16
        },
11636
16
        { &hf_nvme_get_logpage_pred_lat_etype[0],
11637
16
            { "Event Type", "nvme.cmd.get_logpage.pred_lat.etype",
11638
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11639
16
        },
11640
16
        { &hf_nvme_get_logpage_pred_lat_etype[1],
11641
16
            { "DTWIN Reads Warning", "nvme.cmd.get_logpage.pred_lat.etype.rw",
11642
16
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
11643
16
        },
11644
16
        { &hf_nvme_get_logpage_pred_lat_etype[2],
11645
16
            { "DTWIN Writes Warning", "nvme.cmd.get_logpage.pred_lat.etype.ww",
11646
16
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
11647
16
        },
11648
16
        { &hf_nvme_get_logpage_pred_lat_etype[3],
11649
16
            { "DTWIN Time Warning", "nvme.cmd.get_logpage.pred_lat.etype.tw",
11650
16
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
11651
16
        },
11652
16
        { &hf_nvme_get_logpage_pred_lat_etype[4],
11653
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.etype.rsvd",
11654
16
               FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL}
11655
16
        },
11656
16
        { &hf_nvme_get_logpage_pred_lat_etype[5],
11657
16
            { "Autonomous transition from DTWIN to NDWIN due to typical or maximum value exceeded", "nvme.cmd.get_logpage.pred_lat.etype.atve",
11658
16
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
11659
16
        },
11660
16
        { &hf_nvme_get_logpage_pred_lat_etype[6],
11661
16
            { "Autonomous transition from DTWIN to NDWIN due to Deterministic Excursion", "nvme.cmd.get_logpage.pred_lat.etype.atde",
11662
16
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
11663
16
        },
11664
16
        { &hf_nvme_get_logpage_pred_lat_rsvd1,
11665
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd1",
11666
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11667
16
        },
11668
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_rt,
11669
16
            { "DTWIN Reads Typical (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_rt",
11670
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11671
16
        },
11672
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_wt,
11673
16
            { "DTWIN Writes Typical (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_wt",
11674
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11675
16
        },
11676
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_tm,
11677
16
            { "DTWIN Time Maximum (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_tm",
11678
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11679
16
        },
11680
16
        { &hf_nvme_get_logpage_pred_lat_ndwin_tmh,
11681
16
            { "NDWIN Time Minimum High (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tmh",
11682
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11683
16
        },
11684
16
        { &hf_nvme_get_logpage_pred_lat_ndwin_tml,
11685
16
            { "NDWIN Time Minimum Low (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tml",
11686
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11687
16
        },
11688
16
        { &hf_nvme_get_logpage_pred_lat_rsvd2,
11689
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd2",
11690
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11691
16
        },
11692
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_re,
11693
16
            { "DTWIN Reads Estimate (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_re",
11694
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11695
16
        },
11696
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_we,
11697
16
            { "DTWIN Writes Estimate (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_we",
11698
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11699
16
        },
11700
16
        { &hf_nvme_get_logpage_pred_lat_dtwin_te,
11701
16
            { "DTWIN Time Estimate (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_te",
11702
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11703
16
        },
11704
16
        { &hf_nvme_get_logpage_pred_lat_rsvd3,
11705
16
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd3",
11706
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11707
16
        },
11708
        /* Predictable Latency NVMSet Aggregate Response */
11709
16
        { &hf_nvme_get_logpage_pred_lat_aggreg_ne,
11710
16
            { "Number of Entries", "nvme.cmd.get_logpage.pred_lat_aggreg.ne",
11711
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11712
16
        },
11713
16
        { &hf_nvme_get_logpage_pred_lat_aggreg_nset,
11714
16
            { "NVM Set with Pending Predictable Latency Event", "nvme.cmd.get_logpage.pred_lat_aggreg.nset",
11715
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11716
16
        },
11717
        /* ANA Response */
11718
16
        { &hf_nvme_get_logpage_ana_chcnt,
11719
16
            { "Change Count", "nvme.cmd.get_logpage.ana.chcnt",
11720
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11721
16
        },
11722
16
        { &hf_nvme_get_logpage_ana_ngd,
11723
16
            { "Number of ANA Group Descriptors", "nvme.cmd.get_logpage.ana.ngd",
11724
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
11725
16
        },
11726
16
        { &hf_nvme_get_logpage_ana_rsvd,
11727
16
            { "Reserved", "nvme.cmd.get_logpage.ana.rsvd",
11728
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11729
16
        },
11730
16
        { &hf_nvme_get_logpage_ana_grp,
11731
16
            { "ANA Group Descriptor", "nvme.cmd.get_logpage.ana.grp",
11732
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11733
16
        },
11734
16
        { &hf_nvme_get_logpage_ana_grp_id,
11735
16
            { "ANA Group ID", "nvme.cmd.get_logpage.ana.grp.id",
11736
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11737
16
        },
11738
16
        { &hf_nvme_get_logpage_ana_grp_nns,
11739
16
            { "Number of NSID Values", "nvme.cmd.get_logpage.ana.grp.nns",
11740
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11741
16
        },
11742
16
        { &hf_nvme_get_logpage_ana_grp_chcnt,
11743
16
            { "Change Count", "nvme.cmd.get_logpage.ana.grp.chcnt",
11744
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11745
16
        },
11746
16
        { &hf_nvme_get_logpage_ana_grp_anas[0],
11747
16
            { "ANA State", "nvme.cmd.get_logpage.ana.grp.anas",
11748
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11749
16
        },
11750
16
        { &hf_nvme_get_logpage_ana_grp_anas[1],
11751
16
            { "Asymmetric Namespace Access State", "nvme.cmd.get_logpage.ana.grp.anas.state",
11752
16
               FT_UINT8, BASE_HEX, VALS(ana_state_tbl), 0xf, NULL, HFILL}
11753
16
        },
11754
16
        { &hf_nvme_get_logpage_ana_grp_anas[2],
11755
16
            { "Reserved", "nvme.cmd.get_logpage.ana.grp.anas.rsvd",
11756
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
11757
16
        },
11758
16
        { &hf_nvme_get_logpage_ana_grp_rsvd,
11759
16
            { "Reserved", "nvme.cmd.get_logpage.ana.grp.rsvd",
11760
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11761
16
        },
11762
16
        { &hf_nvme_get_logpage_ana_grp_nsid,
11763
16
            { "Namespace Identifier", "nvme.cmd.get_logpage.ana.grp.nsid",
11764
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11765
16
        },
11766
        /* LBA Status Information Response */
11767
16
        { &hf_nvme_get_logpage_lba_status_lslplen,
11768
16
            { "LBA Status Log Page Length (LSLPLEN)", "nvme.cmd.get_logpage.lba_status.lslplen",
11769
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11770
16
        },
11771
16
        { &hf_nvme_get_logpage_lba_status_nlslne,
11772
16
            { "Number of LBA Status Log Namespace Elements (NLSLNE)", "nvme.cmd.get_logpage.lba_status.nlslne",
11773
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11774
16
        },
11775
16
        { &hf_nvme_get_logpage_lba_status_estulb,
11776
16
            { "Estimate of Unrecoverable Logical Blocks (ESTULB)", "nvme.cmd.get_logpage.lba_status.estulb",
11777
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11778
16
        },
11779
16
        { &hf_nvme_get_logpage_lba_status_rsvd,
11780
16
            { "Reserved", "nvme.cmd.get_logpage.lba_status.rsvd",
11781
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11782
16
        },
11783
16
        { &hf_nvme_get_logpage_lba_status_lsgc,
11784
16
            { "LBA Status Generation Counter (LSGC)", "nvme.cmd.get_logpage.lba_status.lsgc",
11785
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11786
16
        },
11787
16
        { &hf_nvme_get_logpage_lba_status_nel,
11788
16
            { "LBA Status Log Namespace Element List", "nvme.cmd.get_logpage.lba_status.nel",
11789
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11790
16
        },
11791
16
        { &hf_nvme_get_logpage_lba_status_nel_ne,
11792
16
            { "LBA Status Log Namespace Element", "nvme.cmd.get_logpage.lba_status.nel.ne",
11793
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11794
16
        },
11795
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_neid,
11796
16
            { "Namespace Element Identifier (NEID)", "nvme.cmd.get_logpage.lba_status.nel.ne.neid",
11797
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11798
16
        },
11799
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_nlrd,
11800
16
            { "Number of LBA Range Descriptors (NLRD)", "nvme.cmd.get_logpage.lba_status.nel.ne.nlrd",
11801
16
               FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
11802
16
        },
11803
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_ratype,
11804
16
            { "Recommended Action Type (RATYPE)", "nvme.cmd.get_logpage.lba_status.nel.ne.ratype",
11805
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11806
16
        },
11807
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_rsvd,
11808
16
            { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rsvd",
11809
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11810
16
        },
11811
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd,
11812
16
            { "LBA Range Descriptor", "nvme.cmd.get_logpage.lba_status.nel.ne.rd",
11813
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11814
16
        },
11815
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba,
11816
16
            { "Range Starting LBA (RSLBA)", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rslba",
11817
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11818
16
        },
11819
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb,
11820
16
            { "Range Number of Logical Blocks (RNLB)", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rnlb",
11821
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11822
16
        },
11823
16
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd,
11824
16
            { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rsvd",
11825
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11826
16
        },
11827
        /* Get LogPage Endurance Group Aggregate Response */
11828
16
        { &hf_nvme_get_logpage_egroup_aggreg_ne,
11829
16
            { "Number of Entries", "nvme.cmd.get_logpage.egroup_agreg.ne",
11830
16
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
11831
16
        },
11832
16
        { &hf_nvme_get_logpage_egroup_aggreg_eg,
11833
16
            { "Endurance Group", "nvme.cmd.get_logpage.egroup_agreg.eg",
11834
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11835
16
        },
11836
        /* Get LogPage Reservation Notification Response */
11837
16
        { &hf_nvme_get_logpage_reserv_notif_lpc,
11838
16
            { "Log Page Count", "nvme.cmd.get_logpage.reserv_notif.lpc",
11839
16
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
11840
16
        },
11841
16
        { &hf_nvme_get_logpage_reserv_notif_lpt,
11842
16
            { "Reservation Notification Log Page Type", "nvme.cmd.get_logpage.reserv_notif.lpt",
11843
16
               FT_UINT8, BASE_HEX, VALS(rnlpt_tbl), 0x0, NULL, HFILL}
11844
16
        },
11845
16
        { &hf_nvme_get_logpage_reserv_notif_nalp,
11846
16
            { "Number of Available Log Pages", "nvme.cmd.get_logpage.reserv_notif.nalp",
11847
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
11848
16
        },
11849
16
        { &hf_nvme_get_logpage_reserv_notif_rsvd0,
11850
16
            { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd0",
11851
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11852
16
        },
11853
16
        { &hf_nvme_get_logpage_reserv_notif_nsid,
11854
16
            { "Namespace ID", "nvme.cmd.get_logpage.reserv_notif.nsid",
11855
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11856
16
        },
11857
16
        { &hf_nvme_get_logpage_reserv_notif_rsvd1,
11858
16
            { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd1",
11859
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11860
16
        },
11861
        /* Get LogPage Sanitize Response */
11862
16
        { &hf_nvme_get_logpage_sanitize_sprog,
11863
16
            { "Sanitize Progress (SPROG)", "nvme.cmd.get_logpage.sanitize.sprog",
11864
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11865
16
        },
11866
16
        { &hf_nvme_get_logpage_sanitize_sstat[0],
11867
16
            { "Sanitize Status (SSTAT)", "nvme.cmd.get_logpage.sanitize.sstat",
11868
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
11869
16
        },
11870
16
        { &hf_nvme_get_logpage_sanitize_sstat[1],
11871
16
            { "Status of the most recent Sanitize Operation", "nvme.cmd.get_logpage.sanitize.sstat.mrst",
11872
16
               FT_UINT16, BASE_HEX, VALS(san_mrst_tbl), 0x7, NULL, HFILL}
11873
16
        },
11874
16
        { &hf_nvme_get_logpage_sanitize_sstat[2],
11875
16
            { "Number of Completed Overwrite Passes", "nvme.cmd.get_logpage.sanitize.sstat.cop",
11876
16
               FT_UINT16, BASE_HEX, NULL, 0xf8, NULL, HFILL}
11877
16
        },
11878
16
        { &hf_nvme_get_logpage_sanitize_sstat[3],
11879
16
            { "Global Data Erased", "nvme.cmd.get_logpage.sanitize.sstat.gde",
11880
16
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
11881
16
        },
11882
16
        { &hf_nvme_get_logpage_sanitize_sstat[4],
11883
16
            { "Media Verification Canceled", "nvme.cmd.get_logpage.sanitize.sstat.mvcncld",
11884
16
               FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL}
11885
16
        },
11886
16
        { &hf_nvme_get_logpage_sanitize_sstat[5],
11887
16
            { "Namespace Data Erased", "nvme.cmd.get_logpage.sanitize.sstat.nde",
11888
16
               FT_BOOLEAN, 16, NULL, 0x400, NULL, HFILL}
11889
16
        },
11890
16
        { &hf_nvme_get_logpage_sanitize_sstat[6],
11891
16
            { "Reserved", "nvme.cmd.get_logpage.sanitize.sstat.rsvd",
11892
16
               FT_UINT16, BASE_HEX, NULL, 0xf800, NULL, HFILL}
11893
16
        },
11894
16
        { &hf_nvme_get_logpage_sanitize_scdw10,
11895
16
            { "Sanitize Command Dword 10 Information (SCDW10)", "nvme.cmd.get_logpage.sanitize.scdw10",
11896
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11897
16
        },
11898
16
        { &hf_nvme_get_logpage_sanitize_eto,
11899
16
            { "Estimated Time For Overwrite (seconds)", "nvme.cmd.get_logpage.sanitize.eto",
11900
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11901
16
        },
11902
16
        { &hf_nvme_get_logpage_sanitize_etbe,
11903
16
            { "Estimated Time For Block Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etbe",
11904
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11905
16
        },
11906
16
        { &hf_nvme_get_logpage_sanitize_etce,
11907
16
            { "Estimated Time For Crypto Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etce",
11908
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11909
16
        },
11910
16
        { &hf_nvme_get_logpage_sanitize_etond,
11911
16
            { "Estimated Time For Overwrite (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etond",
11912
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11913
16
        },
11914
16
        { &hf_nvme_get_logpage_sanitize_etbend,
11915
16
            { "Estimated Time For Block Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etbend",
11916
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11917
16
        },
11918
16
        { &hf_nvme_get_logpage_sanitize_etcend,
11919
16
            { "Estimated Time For Crypto Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etcend",
11920
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11921
16
        },
11922
16
        { &hf_nvme_get_logpage_sanitize_etpvds,
11923
16
            { "Estimated Time For Post-Verification Deallocation State (seconds)", "nvme.cmd.get_logpage.sanitize.etpvds",
11924
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11925
16
        },
11926
16
        { &hf_nvme_get_logpage_sanitize_ssi[0],
11927
16
            { "Sanitize State Information (SSI)", "nvme.cmd.get_logpage.sanitize.ssi",
11928
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
11929
16
        },
11930
16
        { &hf_nvme_get_logpage_sanitize_ssi[1],
11931
16
            { "Sanitize State (SANS)", "nvme.cmd.get_logpage.sanitize.ssi.sans",
11932
16
               FT_UINT8, BASE_HEX, VALS(san_sans_tbl), 0x0f, NULL, HFILL}
11933
16
        },
11934
16
        { &hf_nvme_get_logpage_sanitize_ssi[2],
11935
16
            { "Failure State (FAILS)", "nvme.cmd.get_logpage.sanitize.ssi.fails",
11936
16
               FT_UINT8, BASE_HEX, VALS(san_sans_tbl), 0xf0,
11937
16
               "Sanitize state in which the failure occurred", HFILL}
11938
16
        },
11939
16
        { &hf_nvme_get_logpage_sanitize_rsvd0,
11940
16
            { "Reserved", "nvme.cmd.get_logpage.sanitize.rsvd0",
11941
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11942
16
        },
11943
16
        { &hf_nvme_get_logpage_sanitize_mnsoip,
11944
16
            { "Maximum Namespace Sanitize Operations In Progress (MNSOIP)", "nvme.cmd.get_logpage.sanitize.mnsoip",
11945
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
11946
16
        },
11947
16
        { &hf_nvme_get_logpage_sanitize_stnsid,
11948
16
            { "Sanitization Target NSID (STNSID)", "nvme.cmd.get_logpage.sanitize.stnsid",
11949
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11950
16
        },
11951
16
        { &hf_nvme_get_logpage_sanitize_rsvd,
11952
16
            { "Reserved", "nvme.cmd.get_logpage.sanitize.rsvd",
11953
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11954
16
        },
11955
        /* Feature Identifiers Supported and Effects Response */
11956
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fidx,
11957
16
            { "FID Supported Entry", "nvme.cmd.get_logpage.feat_sup_and_eff.fidx",
11958
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
11959
16
        },
11960
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[0],
11961
16
            { "FID Supported and Effects Data Structure", "nvme.cmd.get_logpage.feat_sup_and_eff.fids",
11962
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
11963
16
        },
11964
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[1],
11965
16
            { "FID Supported (FSUPP)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.fsupp",
11966
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
11967
16
        },
11968
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[2],
11969
16
            { "User Data Content Change (UDCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.udcc",
11970
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
11971
16
        },
11972
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[3],
11973
16
            { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.ncc",
11974
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
11975
16
        },
11976
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[4],
11977
16
            { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.nic",
11978
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
11979
16
        },
11980
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[5],
11981
16
            { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.ccc",
11982
16
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
11983
16
        },
11984
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[6],
11985
16
            { "Reserved", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.rsvd0",
11986
16
               FT_UINT32, BASE_HEX, NULL, 0x7ffe0, NULL, HFILL}
11987
16
        },
11988
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[7],
11989
16
            { "UUID Selection Supported (USS)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.uss",
11990
16
               FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL}
11991
16
        },
11992
16
        { &hf_nvme_get_logpage_feat_sup_and_eff_fids[8],
11993
16
            { "FID Scope (FSP)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.fsp",
11994
16
               FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL}
11995
16
        },
11996
        /* NVMe-MI Commands Supported and Effects Response */
11997
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs,
11998
16
            { "MI Command Supported Entry", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cs",
11999
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12000
16
        },
12001
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[0],
12002
16
            { "NVMe-MI Commands Supported and Effects Data Structure", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds",
12003
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
12004
16
        },
12005
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[1],
12006
16
            { "Command Supported (CSUPP)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.csupp",
12007
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12008
16
        },
12009
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[2],
12010
16
            { "User Data Content Change (UDCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.udcc",
12011
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
12012
16
        },
12013
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[3],
12014
16
            { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.ncc",
12015
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
12016
16
        },
12017
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[4],
12018
16
            { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.nic",
12019
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
12020
16
        },
12021
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[5],
12022
16
            { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.ccc",
12023
16
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
12024
16
        },
12025
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[6],
12026
16
            { "Reserved", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.rsvd",
12027
16
               FT_UINT32, BASE_HEX, NULL, 0xfffe0, NULL, HFILL}
12028
16
        },
12029
16
        { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[7],
12030
16
            { "Command Scope (CSP)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.csp",
12031
16
               FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL}
12032
16
        },
12033
        /* Command and Feature Lockdown Response */
12034
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[0],
12035
16
            { "Command and Feature Identifier List Attributes (CFILA)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila",
12036
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12037
16
        },
12038
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[1],
12039
16
            { "Scope Selected (SS)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.ss",
12040
16
               FT_UINT8, BASE_HEX, VALS(lockdown_scope_tbl), 0x0f, NULL, HFILL}
12041
16
        },
12042
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[2],
12043
16
            { "Contents Selected (CS)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.cs",
12044
16
               FT_UINT8, BASE_HEX, VALS(lockdown_contents_tbl), 0x30, NULL, HFILL}
12045
16
        },
12046
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[3],
12047
16
            { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.rsvd",
12048
16
               FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL}
12049
16
        },
12050
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_rsvd,
12051
16
            { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.rsvd",
12052
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12053
16
        },
12054
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_lngth,
12055
16
            { "Length (LNGTH)", "nvme.cmd.get_logpage.cmd_feat_lockdown.lngth",
12056
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12057
16
        },
12058
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_cfil,
12059
16
            { "Command/Feature Identifier", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfil",
12060
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12061
16
        },
12062
16
        { &hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1,
12063
16
            { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.rsvd1",
12064
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12065
16
        },
12066
        /* Get LogPage Physical Interface Receiver Eye Opening Measurement (LID 19h) response */
12067
16
        { &hf_nvme_get_logpage_eom_lid,
12068
16
            { "Log Identifier", "nvme.cmd.get_logpage.eom.lid",
12069
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12070
16
        },
12071
16
        { &hf_nvme_get_logpage_eom_eomip,
12072
16
            { "EOM In Progress", "nvme.cmd.get_logpage.eom.eomip",
12073
16
               FT_UINT8, BASE_HEX, VALS(eom_eomip_tbl), 0x0, NULL, HFILL}
12074
16
        },
12075
16
        { &hf_nvme_get_logpage_eom_hsize,
12076
16
            { "Header Size (bytes)", "nvme.cmd.get_logpage.eom.hsize",
12077
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12078
16
        },
12079
16
        { &hf_nvme_get_logpage_eom_rsz,
12080
16
            { "Result Size (bytes)", "nvme.cmd.get_logpage.eom.rsz",
12081
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
12082
16
        },
12083
16
        { &hf_nvme_get_logpage_eom_edgn,
12084
16
            { "EOM Data Generation Number", "nvme.cmd.get_logpage.eom.edgn",
12085
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12086
16
        },
12087
16
        { &hf_nvme_get_logpage_eom_lrev,
12088
16
            { "Log Revision", "nvme.cmd.get_logpage.eom.lrev",
12089
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12090
16
        },
12091
16
        { &hf_nvme_get_logpage_eom_odp[0],
12092
16
            { "Optional Data Present", "nvme.cmd.get_logpage.eom.odp",
12093
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12094
16
        },
12095
16
        { &hf_nvme_get_logpage_eom_odp[1],
12096
16
            { "Printable Eye Field Present", "nvme.cmd.get_logpage.eom.odp.pefp",
12097
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
12098
16
        },
12099
16
        { &hf_nvme_get_logpage_eom_odp[2],
12100
16
            { "Eye Data Field Present", "nvme.cmd.get_logpage.eom.odp.edfp",
12101
16
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
12102
16
        },
12103
16
        { &hf_nvme_get_logpage_eom_odp[3],
12104
16
            { "Reserved", "nvme.cmd.get_logpage.eom.odp.rsvd",
12105
16
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
12106
16
        },
12107
16
        { &hf_nvme_get_logpage_eom_lns,
12108
16
            { "Lanes Configured", "nvme.cmd.get_logpage.eom.lns",
12109
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12110
16
        },
12111
16
        { &hf_nvme_get_logpage_eom_epl,
12112
16
            { "Eyes Per Lane", "nvme.cmd.get_logpage.eom.epl",
12113
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12114
16
        },
12115
16
        { &hf_nvme_get_logpage_eom_lspfc[0],
12116
16
            { "Log Specific Parameter Field Copy", "nvme.cmd.get_logpage.eom.lspfc",
12117
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12118
16
        },
12119
16
        { &hf_nvme_get_logpage_eom_lspfc[1],
12120
16
            { "Log Specific Parameter Field Value", "nvme.cmd.get_logpage.eom.lspfc.lspfv",
12121
16
               FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL}
12122
16
        },
12123
16
        { &hf_nvme_get_logpage_eom_lspfc[2],
12124
16
            { "Reserved", "nvme.cmd.get_logpage.eom.lspfc.rsvd",
12125
16
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
12126
16
        },
12127
16
        { &hf_nvme_get_logpage_eom_linfo[0],
12128
16
            { "Link Information", "nvme.cmd.get_logpage.eom.linfo",
12129
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12130
16
        },
12131
16
        { &hf_nvme_get_logpage_eom_linfo[1],
12132
16
            { "Measurement Link Speed", "nvme.cmd.get_logpage.eom.linfo.mls",
12133
16
               FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
12134
16
        },
12135
16
        { &hf_nvme_get_logpage_eom_linfo[2],
12136
16
            { "Reserved", "nvme.cmd.get_logpage.eom.linfo.rsvd",
12137
16
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
12138
16
        },
12139
16
        { &hf_nvme_get_logpage_eom_rsvd0,
12140
16
            { "Reserved", "nvme.cmd.get_logpage.eom.rsvd0",
12141
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12142
16
        },
12143
16
        { &hf_nvme_get_logpage_eom_lsic,
12144
16
            { "Log Specific Identifier Copy", "nvme.cmd.get_logpage.eom.lsic",
12145
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
12146
16
        },
12147
16
        { &hf_nvme_get_logpage_eom_ds,
12148
16
            { "Descriptor Size (bytes)", "nvme.cmd.get_logpage.eom.ds",
12149
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
12150
16
        },
12151
16
        { &hf_nvme_get_logpage_eom_nd,
12152
16
            { "Number of Descriptors", "nvme.cmd.get_logpage.eom.nd",
12153
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12154
16
        },
12155
16
        { &hf_nvme_get_logpage_eom_maxtb,
12156
16
            { "Maximum Top Bottom", "nvme.cmd.get_logpage.eom.maxtb",
12157
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12158
16
        },
12159
16
        { &hf_nvme_get_logpage_eom_maxlr,
12160
16
            { "Maximum Left Right", "nvme.cmd.get_logpage.eom.maxlr",
12161
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12162
16
        },
12163
16
        { &hf_nvme_get_logpage_eom_etgood,
12164
16
            { "Estimated Time for Good Quality (seconds)", "nvme.cmd.get_logpage.eom.etgood",
12165
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12166
16
        },
12167
16
        { &hf_nvme_get_logpage_eom_etbetter,
12168
16
            { "Estimated Time for Better Quality (seconds)", "nvme.cmd.get_logpage.eom.etbetter",
12169
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12170
16
        },
12171
16
        { &hf_nvme_get_logpage_eom_etbest,
12172
16
            { "Estimated Time for Best Quality (seconds)", "nvme.cmd.get_logpage.eom.etbest",
12173
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12174
16
        },
12175
16
        { &hf_nvme_get_logpage_eom_rsvd1,
12176
16
            { "Reserved", "nvme.cmd.get_logpage.eom.rsvd1",
12177
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12178
16
        },
12179
16
        { &hf_nvme_get_logpage_eom_desc,
12180
16
            { "EOM Lane Descriptor", "nvme.cmd.get_logpage.eom.desc",
12181
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12182
16
        },
12183
16
        { &hf_nvme_get_logpage_eom_desc_rsvd0,
12184
16
            { "Reserved", "nvme.cmd.get_logpage.eom.desc.rsvd0",
12185
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12186
16
        },
12187
16
        { &hf_nvme_get_logpage_eom_desc_mstat[0],
12188
16
            { "Measurement Status", "nvme.cmd.get_logpage.eom.desc.mstat",
12189
16
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
12190
16
        },
12191
16
        { &hf_nvme_get_logpage_eom_desc_mstat[1],
12192
16
            { "Measurement Successful", "nvme.cmd.get_logpage.eom.desc.mstat.mscs",
12193
16
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
12194
16
        },
12195
16
        { &hf_nvme_get_logpage_eom_desc_mstat[2],
12196
16
            { "Reserved", "nvme.cmd.get_logpage.eom.desc.mstat.rsvd",
12197
16
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
12198
16
        },
12199
16
        { &hf_nvme_get_logpage_eom_desc_ln,
12200
16
            { "Lane", "nvme.cmd.get_logpage.eom.desc.ln",
12201
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12202
16
        },
12203
16
        { &hf_nvme_get_logpage_eom_desc_eye,
12204
16
            { "Eye", "nvme.cmd.get_logpage.eom.desc.eye",
12205
16
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
12206
16
        },
12207
16
        { &hf_nvme_get_logpage_eom_desc_top,
12208
16
            { "Top", "nvme.cmd.get_logpage.eom.desc.top",
12209
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12210
16
        },
12211
16
        { &hf_nvme_get_logpage_eom_desc_btm,
12212
16
            { "Bottom", "nvme.cmd.get_logpage.eom.desc.btm",
12213
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12214
16
        },
12215
16
        { &hf_nvme_get_logpage_eom_desc_lft,
12216
16
            { "Left", "nvme.cmd.get_logpage.eom.desc.lft",
12217
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12218
16
        },
12219
16
        { &hf_nvme_get_logpage_eom_desc_rgt,
12220
16
            { "Right", "nvme.cmd.get_logpage.eom.desc.rgt",
12221
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12222
16
        },
12223
16
        { &hf_nvme_get_logpage_eom_desc_nrows,
12224
16
            { "Number of Rows", "nvme.cmd.get_logpage.eom.desc.nrows",
12225
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12226
16
        },
12227
16
        { &hf_nvme_get_logpage_eom_desc_ncols,
12228
16
            { "Number of Columns", "nvme.cmd.get_logpage.eom.desc.ncols",
12229
16
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
12230
16
        },
12231
16
        { &hf_nvme_get_logpage_eom_desc_edlen,
12232
16
            { "Eye Data Length (bytes)", "nvme.cmd.get_logpage.eom.desc.edlen",
12233
16
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
12234
16
        },
12235
16
        { &hf_nvme_get_logpage_eom_desc_rsvd1,
12236
16
            { "Reserved", "nvme.cmd.get_logpage.eom.desc.rsvd1",
12237
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12238
16
        },
12239
16
        { &hf_nvme_get_logpage_eom_desc_pe,
12240
16
            { "Printable Eye", "nvme.cmd.get_logpage.eom.desc.pe",
12241
16
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
12242
16
        },
12243
16
        { &hf_nvme_get_logpage_eom_desc_ed,
12244
16
            { "Eye Data", "nvme.cmd.get_logpage.eom.desc.ed",
12245
16
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
12246
16
        },
12247
        /* NVMe Response fields */
12248
16
        { &hf_nvme_cqe_dword0,
12249
16
            { "DWORD0", "nvme.cqe.dword0",
12250
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
12251
16
        },
12252
16
        { &hf_nvme_cqe_dword0_sf_err,
12253
16
            { "Set Features Error Specific Code", "nvme.cqe.dword0.set_features.err",
12254
16
               FT_UINT32, BASE_HEX, VALS(nvme_cqe_sc_sf_err_dword0_tbl), 0x0, NULL, HFILL}
12255
16
        },
12256
16
        { &hf_nvme_cqe_aev_dword0[0],
12257
16
            { "DWORD0", "nvme.cqe.dword0.aev",
12258
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
12259
16
        },
12260
16
        { &hf_nvme_cqe_aev_dword0[1],
12261
16
            { "Asynchronous Event Type", "nvme.cqe.dword0.aev.aet",
12262
16
               FT_UINT32, BASE_HEX, VALS(nvme_cqe_aev_aet_dword0_tbl), 0x7, NULL, HFILL}
12263
16
        },
12264
16
        { &hf_nvme_cqe_aev_dword0[2],
12265
16
            { "Reserved", "nvme.cqe.dword0.aev.rsvd0",
12266
16
               FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL}
12267
16
        },
12268
16
        { &hf_nvme_cqe_aev_dword0[3],
12269
16
            { "Asynchronous Event Information", "nvme.cqe.dword0.aev.aei",
12270
16
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
12271
16
        },
12272
16
        { &hf_nvme_cqe_aev_dword0[4],
12273
16
            { "Log Page Identifier", "nvme.cqe.dword0.aev.lpi",
12274
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff0000, NULL, HFILL}
12275
16
        },
12276
16
        { &hf_nvme_cqe_aev_dword0[5],
12277
16
            { "Reserved", "nvme.cqe.dword0.aev.rsvd1",
12278
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
12279
16
        },
12280
        /* Set Feature Responses */
12281
16
        { &hf_nvme_cqe_dword0_sf_nq[0],
12282
16
            { "DWORD0: Set Feature Number of Queues Result", "nvme.cqe.dword0.set_features.nq",
12283
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
12284
16
        },
12285
16
        { &hf_nvme_cqe_dword0_sf_nq[1],
12286
16
            { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.set_features.nq.nsqa",
12287
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
12288
16
        },
12289
16
        { &hf_nvme_cqe_dword0_sf_nq[2],
12290
16
            { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.set_features.ncqa",
12291
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
12292
16
        },
12293
        /* Get Feature Responses */
12294
16
        { &hf_nvme_cqe_get_features_dword0_arb[0],
12295
16
            { "DWORD0", "nvme.cqe.dword0.get_features.arb",
12296
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12297
16
        },
12298
16
        { &hf_nvme_cqe_get_features_dword0_arb[1],
12299
16
            { "Arbitration Burst", "nvme.cqe.dword0.get_features.arb.ab",
12300
16
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
12301
16
        },
12302
16
        { &hf_nvme_cqe_get_features_dword0_arb[2],
12303
16
            { "Reserved", "nvme.cqe.dword0.get_features.arb.rsvd",
12304
16
               FT_UINT32, BASE_HEX, NULL, 0x000000f8, NULL, HFILL}
12305
16
        },
12306
16
        { &hf_nvme_cqe_get_features_dword0_arb[3],
12307
16
            { "Low Priority Weight", "nvme.cqe.dword0.get_features.arb.lpw",
12308
16
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
12309
16
        },
12310
16
        { &hf_nvme_cqe_get_features_dword0_arb[4],
12311
16
            { "Medium Priority Weight", "nvme.cqe.dword0.get_features.arb.mpw",
12312
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
12313
16
        },
12314
16
        { &hf_nvme_cqe_get_features_dword0_arb[5],
12315
16
            { "High Priority Weight", "nvme.cqe.dword0.get_features.arb.hpw",
12316
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
12317
16
        },
12318
16
        { &hf_nvme_cqe_get_features_dword0_pm[0],
12319
16
            { "DWORD0", "nvme.cqe.dword0.get_features.pm",
12320
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12321
16
        },
12322
16
        { &hf_nvme_cqe_get_features_dword0_pm[1],
12323
16
            { "Power State", "nvme.cqe.dword0.get_features.pm.ps",
12324
16
               FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL}
12325
16
        },
12326
16
        { &hf_nvme_cqe_get_features_dword0_pm[2],
12327
16
            { "Work Hint", "nvme.cqe.dword0.get_features.pm.wh",
12328
16
               FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL}
12329
16
        },
12330
16
        { &hf_nvme_cqe_get_features_dword0_pm[3],
12331
16
            { "Reserved", "nvme.cqe.dword0.get_features.pm.rsvd",
12332
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
12333
16
        },
12334
16
        { &hf_nvme_cqe_get_features_dword0_lbart[0],
12335
16
            { "DWORD0", "nvme.cqe.dword0.get_features.lbart",
12336
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12337
16
        },
12338
16
        { &hf_nvme_cqe_get_features_dword0_lbart[1],
12339
16
            { "Number of LBA Ranges (NUM)", "nvme.cqe.dword0.get_features.lbart.lbarn",
12340
16
               FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL}
12341
16
        },
12342
16
        { &hf_nvme_cqe_get_features_dword0_lbart[2],
12343
16
            { "Reserved", "nvme.cqe.dword0.get_features.lbart.rsvd",
12344
16
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
12345
16
        },
12346
16
        { &hf_nvme_cqe_get_features_dword0_tt[0],
12347
16
            { "DWORD0", "nvme.cqe.dword0.get_features.tt",
12348
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12349
16
        },
12350
16
        { &hf_nvme_cqe_get_features_dword0_tt[1],
12351
16
            { "Temperature Threshold", "nvme.cqe.dword0.get_features.tt.tmpth",
12352
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12353
16
        },
12354
16
        { &hf_nvme_cqe_get_features_dword0_tt[2],
12355
16
            { "Threshold Temperature Select", "nvme.cqe.dword0.get_features.tt.tmpsel",
12356
16
               FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL}
12357
16
        },
12358
16
        { &hf_nvme_cqe_get_features_dword0_tt[3],
12359
16
            { "Threshold Type Select", "nvme.cqe.dword0.get_features.tt.thpsel",
12360
16
               FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL}
12361
16
        },
12362
16
        { &hf_nvme_cqe_get_features_dword0_tt[4],
12363
16
            { "Temperature Threshold Hysteresis", "nvme.cqe.dword0.get_features.tt.tmpthh",
12364
16
               FT_UINT32, BASE_HEX, NULL, 0x1c00000, NULL, HFILL}
12365
16
        },
12366
16
        { &hf_nvme_cqe_get_features_dword0_tt[5],
12367
16
            { "Reserved", "nvme.cqe.dword0.get_features.tt.rsvd",
12368
16
               FT_UINT32, BASE_HEX, NULL, 0xfe000000, NULL, HFILL}
12369
16
        },
12370
16
        { &hf_nvme_cqe_get_features_dword0_erec[0],
12371
16
            { "DWORD0", "nvme.cqe.dword0.get_features.erec",
12372
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12373
16
        },
12374
16
        { &hf_nvme_cqe_get_features_dword0_erec[1],
12375
16
            { "Time Limited Error Recovery (100 ms units)", "nvme.cqe.dword0.get_features.erec.tler",
12376
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12377
16
        },
12378
16
        { &hf_nvme_cqe_get_features_dword0_erec[2],
12379
16
            { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cqe.dword0.get_features.erec.dulbe",
12380
16
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
12381
16
        },
12382
16
        { &hf_nvme_cqe_get_features_dword0_erec[3],
12383
16
            { "Reserved", "nvme.cqe.dword0.get_features.erec.rsvd",
12384
16
               FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL}
12385
16
        },
12386
16
        { &hf_nvme_cqe_get_features_dword0_vwce[0],
12387
16
            { "DWORD0", "nvme.cqe.dword0.get_features.vwce",
12388
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12389
16
        },
12390
16
        { &hf_nvme_cqe_get_features_dword0_vwce[1],
12391
16
            { "Volatile Write Cache Enable", "nvme.cqe.dword0.get_features.vwce.wce",
12392
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12393
16
        },
12394
16
        { &hf_nvme_cqe_get_features_dword0_vwce[2],
12395
16
            { "Reserved", "nvme.cqe.dword0.get_features.vwce.rsvd",
12396
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12397
16
        },
12398
16
        { &hf_nvme_cqe_get_features_dword0_nq[0],
12399
16
            { "DWORD0", "nvme.cqe.dword0.get_features.nq",
12400
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12401
16
        },
12402
16
        { &hf_nvme_cqe_get_features_dword0_nq[1],
12403
16
            { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.get_features.nq.nsqa",
12404
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
12405
16
        },
12406
16
        { &hf_nvme_cqe_get_features_dword0_nq[2],
12407
16
            { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.get_features.nq.ncqa",
12408
16
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
12409
16
        },
12410
16
        { &hf_nvme_cqe_get_features_dword0_irqc[0],
12411
16
            { "DWORD0", "nvme.cqe.dword0.get_features.irqc",
12412
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12413
16
        },
12414
16
        { &hf_nvme_cqe_get_features_dword0_irqc[1],
12415
16
            { "Aggregation Threshold", "nvme.cqe.dword0.get_features.irqc.thr",
12416
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12417
16
        },
12418
16
        { &hf_nvme_cqe_get_features_dword0_irqc[2],
12419
16
            { "Aggregation Time (100 us units)", "nvme.cqe.dword0.get_features.irqc.time",
12420
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
12421
16
        },
12422
16
        { &hf_nvme_cqe_get_features_dword0_irqv[0],
12423
16
            { "DWORD0", "nvme.cqe.dword0.get_features.irqv",
12424
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12425
16
        },
12426
16
        { &hf_nvme_cqe_get_features_dword0_irqv[1],
12427
16
            { "IRQ Vector", "nvme.cqe.dword0.get_features.irqv.iv",
12428
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL}
12429
16
        },
12430
16
        { &hf_nvme_cqe_get_features_dword0_irqv[2],
12431
16
            { "Coalescing Disable", "nvme.cqe.dword0.get_features.irqv.cd",
12432
16
               FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL}
12433
16
        },
12434
16
        { &hf_nvme_cqe_get_features_dword0_irqv[3],
12435
16
            { "Reserved", "nvme.cqe.dword0.get_features.irqv.rsvd",
12436
16
               FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL}
12437
16
        },
12438
16
        { &hf_nvme_cqe_get_features_dword0_wan[0],
12439
16
            { "DWORD0", "nvme.cqe.dword0.get_features.wan",
12440
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12441
16
        },
12442
16
        { &hf_nvme_cqe_get_features_dword0_wan[1],
12443
16
            { "Disable Normal", "nvme.cqe.dword0.get_features.wan.dn",
12444
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12445
16
        },
12446
16
        { &hf_nvme_cqe_get_features_dword0_wan[2],
12447
16
            { "Reserved", "nvme.cqe.dword0.get_features.wan.rsvd",
12448
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12449
16
        },
12450
16
        { &hf_nvme_cqe_get_features_dword0_aec[0],
12451
16
            { "DWORD0", "nvme.cqe.dword0.get_features.aec",
12452
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12453
16
        },
12454
16
        { &hf_nvme_cqe_get_features_dword0_aec[1],
12455
16
            { "SMART and Health Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.aec.smart",
12456
16
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
12457
16
        },
12458
16
        { &hf_nvme_cqe_get_features_dword0_aec[2],
12459
16
            { "Namespace Attribute Notices", "nvme.cqe.dword0.get_features.aec.ns",
12460
16
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
12461
16
        },
12462
16
        { &hf_nvme_cqe_get_features_dword0_aec[3],
12463
16
            { "Firmware Activation Notices", "nvme.cqe.dword0.get_features.aec.fwa",
12464
16
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
12465
16
        },
12466
16
        { &hf_nvme_cqe_get_features_dword0_aec[4],
12467
16
            { "Telemetry Log Notices", "nvme.cqe.dword0.get_features.aec.tel",
12468
16
               FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL}
12469
16
        },
12470
16
        { &hf_nvme_cqe_get_features_dword0_aec[5],
12471
16
            { "ANA Change Notices", "nvme.cqe.dword0.get_features.aec.ana",
12472
16
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
12473
16
        },
12474
16
        { &hf_nvme_cqe_get_features_dword0_aec[6],
12475
16
            { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.plat",
12476
16
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
12477
16
        },
12478
16
        { &hf_nvme_cqe_get_features_dword0_aec[7],
12479
16
            { "LBA Status Information Notices", "nvme.cqe.dword0.get_features.aec.lba",
12480
16
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
12481
16
        },
12482
16
        { &hf_nvme_cqe_get_features_dword0_aec[8],
12483
16
            { "Endurance Group Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.eg",
12484
16
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
12485
16
        },
12486
16
        { &hf_nvme_cqe_get_features_dword0_aec[9],
12487
16
            { "Reserved", "nvme.cqe.dword0.get_features.aec.rsvd",
12488
16
               FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL}
12489
16
        },
12490
16
        { &hf_nvme_cqe_get_features_dword0_aec[10],
12491
16
            { "Discovery Log Page Change Notification", "nvme.cqe.dword0.get_features.aec.disc",
12492
16
               FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL}
12493
16
        },
12494
16
        { &hf_nvme_cqe_get_features_dword0_apst[0],
12495
16
            { "DWORD0", "nvme.cqe.dword0.get_features.apst",
12496
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12497
16
        },
12498
16
        { &hf_nvme_cqe_get_features_dword0_apst[1],
12499
16
            { "Autonomous Power State Transition Enable", "nvme.cqe.dword0.get_features.apst.apste",
12500
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12501
16
        },
12502
16
        { &hf_nvme_cqe_get_features_dword0_apst[2],
12503
16
            { "Reserved", "nvme.cqe.dword0.get_features.apst.rsvd",
12504
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12505
16
        },
12506
16
        { &hf_nvme_cqe_get_features_dword0_kat[0],
12507
16
            { "DWORD0", "nvme.cqe.dword0.get_features.kat",
12508
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12509
16
        },
12510
16
        { &hf_nvme_cqe_get_features_dword0_kat[1],
12511
16
            { "Keep Alive Timeout", "nvme.cqe.dword0.get_features.kat.kato",
12512
16
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL}
12513
16
        },
12514
16
        { &hf_nvme_cqe_get_features_dword0_hctm[0],
12515
16
            { "DWORD0", "nvme.cqe.dword0.get_features.hctm",
12516
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12517
16
        },
12518
16
        { &hf_nvme_cqe_get_features_dword0_hctm[1],
12519
16
            { "Thermal Management Temperature 2 (K)", "nvme.cqe.dword0.get_features.hctm.tmt2",
12520
16
               FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL}
12521
16
        },
12522
16
        { &hf_nvme_cqe_get_features_dword0_hctm[2],
12523
16
            { "Thermal Management Temperature 1 (K)", "nvme.cqe.dword0.get_features.hctm.tmt1",
12524
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
12525
16
        },
12526
16
        { &hf_nvme_cqe_get_features_dword0_nops[0],
12527
16
            { "DWORD0", "nvme.cqe.dword0.get_features.nops",
12528
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12529
16
        },
12530
16
        { &hf_nvme_cqe_get_features_dword0_nops[1],
12531
16
            { "Non-Operational Power State Permissive Mode Enable", "nvme.cqe.dword0.get_features.nops.noppme",
12532
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
12533
16
        },
12534
16
        { &hf_nvme_cqe_get_features_dword0_nops[2],
12535
16
            { "Reserved", "nvme.cqe.dword0.get_features.nops.rsvd",
12536
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12537
16
        },
12538
16
        { &hf_nvme_cqe_get_features_dword0_rrl[0],
12539
16
            { "DWORD0", "nvme.cqe.dword0.get_features.rrl",
12540
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12541
16
        },
12542
16
        { &hf_nvme_cqe_get_features_dword0_rrl[1],
12543
16
            { "Read Recovery Level", "nvme.cqe.dword0.get_features.rrl.rrl",
12544
16
               FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL}
12545
16
        },
12546
16
        { &hf_nvme_cqe_get_features_dword0_rrl[2],
12547
16
            { "Reserved", "nvme.cqe.dword0.get_features.rrl.rsvd",
12548
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
12549
16
        },
12550
16
        { &hf_nvme_cqe_get_features_dword0_plmc[0],
12551
16
            { "DWORD0", "nvme.cqe.dword0.get_features.plmc",
12552
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12553
16
        },
12554
16
        { &hf_nvme_cqe_get_features_dword0_plmc[1],
12555
16
            { "Predictable Latency Enable", "nvme.cqe.dword0.get_features.plmc.ple",
12556
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
12557
16
        },
12558
16
        { &hf_nvme_cqe_get_features_dword0_plmc[2],
12559
16
            { "Reserved", "nvme.cqe.dword0.get_features.plmc.rsvd",
12560
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12561
16
        },
12562
16
        { &hf_nvme_cqe_get_features_dword0_plmw[0],
12563
16
            { "DWORD0", "nvme.cqe.dword0.get_features.plmw",
12564
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12565
16
        },
12566
16
        { &hf_nvme_cqe_get_features_dword0_plmw[1],
12567
16
            { "NVM Set Identifier", "nvme.cqe.dword0.get_features.plmw.nvmsetid",
12568
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12569
16
        },
12570
16
        { &hf_nvme_cqe_get_features_dword0_plmw[2],
12571
16
            { "Reserved", "nvme.cqe.dword0.get_features.plmw.rsvd",
12572
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
12573
16
        },
12574
16
        { &hf_nvme_cqe_get_features_dword0_lbasi[0],
12575
16
            { "DWORD0", "nvme.cqe.dword0.get_features.lbasi",
12576
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12577
16
        },
12578
16
        { &hf_nvme_cqe_get_features_dword0_lbasi[1],
12579
16
            { "LBA Status Information Report Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsiri",
12580
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12581
16
        },
12582
16
        { &hf_nvme_cqe_get_features_dword0_lbasi[2],
12583
16
            { "LBA Status Information Poll Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsipi",
12584
16
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
12585
16
        },
12586
16
        { &hf_nvme_cqe_get_features_dword0_san[0],
12587
16
            { "DWORD0", "nvme.cqe.dword0.get_features.san",
12588
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12589
16
        },
12590
16
        { &hf_nvme_cqe_get_features_dword0_san[1],
12591
16
            { "No-Deallocate Response Mode", "nvme.cqe.dword0.get_features.san.nodrm",
12592
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12593
16
        },
12594
16
        { &hf_nvme_cqe_get_features_dword0_san[2],
12595
16
            { "Reserved", "nvme.cqe.dword0.get_features.san.rsvd",
12596
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12597
16
        },
12598
16
        { &hf_nvme_cqe_get_features_dword0_eg[0],
12599
16
            { "DWORD0", "nvme.cqe.dword0.get_features.eg",
12600
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12601
16
        },
12602
16
        { &hf_nvme_cqe_get_features_dword0_eg[1],
12603
16
            { "Endurance Group Identifier", "nvme.cqe.dword0.get_features.eg.endgid",
12604
16
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
12605
16
        },
12606
16
        { &hf_nvme_cqe_get_features_dword0_eg[2],
12607
16
            { "Endurance Group Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.eg.egcw",
12608
16
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
12609
16
        },
12610
16
        { &hf_nvme_cqe_get_features_dword0_eg[3],
12611
16
            { "Reserved", "nvme.cqe.dword0.get_features.eg.rsvd",
12612
16
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
12613
16
        },
12614
16
        { &hf_nvme_cqe_get_features_dword0_swp[0],
12615
16
            { "DWORD0", "nvme.cqe.dword0.get_features.swp",
12616
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12617
16
        },
12618
16
        { &hf_nvme_cqe_get_features_dword0_swp[1],
12619
16
            { "Pre-boot Software Load Count", "nvme.cqe.dword0.get_features.swp.pbslc",
12620
16
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
12621
16
        },
12622
16
        { &hf_nvme_cqe_get_features_dword0_swp[2],
12623
16
            { "Reserved", "nvme.cqe.dword0.get_features.swp.rsvd",
12624
16
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
12625
16
        },
12626
16
        { &hf_nvme_cqe_get_features_dword0_hid[0],
12627
16
            { "DWORD0", "nvme.cqe.dword0.get_features.hid",
12628
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12629
16
        },
12630
16
        { &hf_nvme_cqe_get_features_dword0_hid[1],
12631
16
            { "Enable Extended Host Identifier", "nvme.cqe.dword0.get_features.hid.exhid",
12632
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12633
16
        },
12634
16
        { &hf_nvme_cqe_get_features_dword0_hid[2],
12635
16
            { "Reserved", "nvme.cqe.dword0.get_features.hid.rsvd",
12636
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12637
16
        },
12638
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[0],
12639
16
            { "DWORD0", "nvme.cqe.dword0.get_features.rsrvn",
12640
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12641
16
        },
12642
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[1],
12643
16
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd0",
12644
16
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
12645
16
        },
12646
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[2],
12647
16
            { "Mask Registration Preempted Notification" , "nvme.cqe.dword0.get_features.rsrvn.regpre",
12648
16
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
12649
16
        },
12650
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[3],
12651
16
            { "Mask Reservation Released Notification", "nvme.cqe.dword0.get_features.rsrvn.resrel",
12652
16
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
12653
16
        },
12654
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[4],
12655
16
            { "Mask Reservation Preempted Notification", "nvme.cqe.dword0.get_features.rsrvn.resrpe",
12656
16
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
12657
16
        },
12658
16
        { &hf_nvme_cqe_get_features_dword0_rsrvn[5],
12659
16
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd1",
12660
16
               FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL}
12661
16
        },
12662
16
        { &hf_nvme_cqe_get_features_dword0_rsrvp[0],
12663
16
            { "DWORD0", "nvme.cqe.dword0.get_features.rsrvp",
12664
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12665
16
        },
12666
16
        { &hf_nvme_cqe_get_features_dword0_rsrvp[1],
12667
16
            { "Persist Through Power Loss", "nvme.cqe.dword0.get_features.rsrvp.ptpl",
12668
16
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
12669
16
        },
12670
16
        { &hf_nvme_cqe_get_features_dword0_rsrvp[2],
12671
16
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvp.rsvd",
12672
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
12673
16
        },
12674
16
        { &hf_nvme_cqe_get_features_dword0_nswp[0],
12675
16
            { "DWORD0", "nvme.cqe.dword0.get_features.nswp",
12676
16
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
12677
16
        },
12678
16
        { &hf_nvme_cqe_get_features_dword0_nswp[1],
12679
16
            { "Write Protection State (WPS)", "nvme.cqe.dword0.get_features.nswp.wps",
12680
16
               FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL}
12681
16
        },
12682
16
        { &hf_nvme_cqe_get_features_dword0_nswp[2],
12683
16
            { "Reserved", "nvme.cqe.dword0.get_features.nswp.rsvd",
12684
16
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
12685
16
        },
12686
        /* Generic Response Fields */
12687
16
        { &hf_nvme_cqe_dword1,
12688
16
            { "DWORD1", "nvme.cqe.dword1",
12689
16
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
12690
16
        },
12691
16
        { &hf_nvme_cqe_sqhd,
12692
16
            { "SQ Head Pointer", "nvme.cqe.sqhd",
12693
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
12694
16
        },
12695
16
        { &hf_nvme_cqe_sqid,
12696
16
            { "SQ Identifier", "nvme.cqe.sqid",
12697
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
12698
16
        },
12699
16
        { &hf_nvme_cqe_cid,
12700
16
            { "Command Identifier", "nvme.cqe.cid",
12701
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
12702
16
        },
12703
16
        { &hf_nvme_cqe_status[0],
12704
16
            { "Status Field", "nvme.cqe.status",
12705
16
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
12706
16
        },
12707
16
        { &hf_nvme_cqe_status[1],
12708
16
            { "Phase Tag", "nvme.cqe.status.p",
12709
16
               FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL}
12710
16
        },
12711
16
        { &hf_nvme_cqe_status_rsvd,
12712
16
            { "Reserved", "nvme.cqe.status.rsvd",
12713
16
               FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL}
12714
16
        },
12715
16
        { &hf_nvme_cqe_status[2],
12716
16
            { "Status Code", "nvme.cqe.status.sc",
12717
16
               FT_UINT16, BASE_HEX, NULL, 0x1fe, NULL, HFILL}
12718
16
        },
12719
16
        { &hf_nvme_cqe_status[3],
12720
16
            { "Status Code Type", "nvme.cqe.status.sct",
12721
16
               FT_UINT16, BASE_HEX, VALS(nvme_cqe_sct_tbl), 0xE00, NULL, HFILL}
12722
16
        },
12723
16
        { &hf_nvme_cqe_status[4],
12724
16
            { "Command Retry Delay", "nvme.cqe.status.crd",
12725
16
               FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL}
12726
16
        },
12727
16
        { &hf_nvme_cqe_status[5],
12728
16
            { "More Information in Log Page", "nvme.cqe.status.m",
12729
16
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
12730
16
        },
12731
16
        { &hf_nvme_cqe_status[6],
12732
16
            { "Do not Retry", "nvme.cqe.status.dnr",
12733
16
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
12734
16
        },
12735
16
        { &hf_nvme_cmd_pkt,
12736
16
            { "Cmd in", "nvme.cmd_pkt",
12737
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12738
16
              "The Cmd for this transaction is in this frame", HFILL }
12739
16
        },
12740
16
        { &hf_nvme_data_req,
12741
16
            { "DATA Transfer Request", "nvme.data_req",
12742
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12743
16
              "DATA transfer request for this transaction is in this frame", HFILL }
12744
16
        },
12745
16
        { &hf_nvme_data_tr[0],
12746
16
            { "DATA Transfer 0", "nvme.data.tr0",
12747
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12748
16
              "DATA transfer 0 for this transaction is in this frame", HFILL }
12749
16
        },
12750
16
        { &hf_nvme_data_tr[1],
12751
16
            { "DATA Transfer 1", "nvme.data_tr1",
12752
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12753
16
              "DATA transfer 1 for this transaction is in this frame", HFILL }
12754
16
        },
12755
16
        { &hf_nvme_data_tr[2],
12756
16
            { "DATA Transfer 2", "nvme.data_tr2",
12757
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12758
16
              "DATA transfer 2 for this transaction is in this frame", HFILL }
12759
16
        },
12760
16
        { &hf_nvme_data_tr[3],
12761
16
            { "DATA Transfer 3", "nvme.data_tr3",
12762
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12763
16
              "DATA transfer 3 for this transaction is in this frame", HFILL }
12764
16
        },
12765
16
        { &hf_nvme_data_tr[4],
12766
16
            { "DATA Transfer 4", "nvme.data_tr4",
12767
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12768
16
              "DATA transfer 4 for this transaction is in this frame", HFILL }
12769
16
        },
12770
16
        { &hf_nvme_data_tr[5],
12771
16
            { "DATA Transfer 5", "nvme.data_tr5",
12772
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12773
16
              "DATA transfer 5 for this transaction is in this frame", HFILL }
12774
16
        },
12775
16
        { &hf_nvme_data_tr[6],
12776
16
            { "DATA Transfer 6", "nvme.data_tr6",
12777
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12778
16
              "DATA transfer 6 for this transaction is in this frame", HFILL }
12779
16
        },
12780
16
        { &hf_nvme_data_tr[7],
12781
16
            { "DATA Transfer 7", "nvme.data_tr7",
12782
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12783
16
              "DATA transfer 7 for this transaction is in this frame", HFILL }
12784
16
        },
12785
16
        { &hf_nvme_data_tr[8],
12786
16
            { "DATA Transfer 8", "nvme.data_tr8",
12787
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12788
16
              "DATA transfer 8 for this transaction is in this frame", HFILL }
12789
16
        },
12790
16
        { &hf_nvme_data_tr[9],
12791
16
            { "DATA Transfer 9", "nvme.data_tr9",
12792
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12793
16
              "DATA transfer 9 for this transaction is in this frame", HFILL }
12794
16
        },
12795
16
        { &hf_nvme_data_tr[10],
12796
16
            { "DATA Transfer 10", "nvme.data_tr10",
12797
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12798
16
              "DATA transfer 10 for this transaction is in this frame", HFILL }
12799
16
        },
12800
16
        { &hf_nvme_data_tr[11],
12801
16
            { "DATA Transfer 11", "nvme.data_tr11",
12802
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12803
16
              "DATA transfer 11 for this transaction is in this frame", HFILL }
12804
16
        },
12805
16
        { &hf_nvme_data_tr[12],
12806
16
            { "DATA Transfer 12", "nvme.data_tr12",
12807
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12808
16
              "DATA transfer 12 for this transaction is in this frame", HFILL }
12809
16
        },
12810
16
        { &hf_nvme_data_tr[13],
12811
16
            { "DATA Transfer 13", "nvme.data_tr13",
12812
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12813
16
              "DATA transfer 13 for this transaction is in this frame", HFILL }
12814
16
        },
12815
16
        { &hf_nvme_data_tr[14],
12816
16
            { "DATA Transfer 14", "nvme.data_tr14",
12817
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12818
16
              "DATA transfer 14 for this transaction is in this frame", HFILL }
12819
16
        },
12820
16
        { &hf_nvme_data_tr[15],
12821
16
            { "DATA Transfer 15", "nvme.data_tr15",
12822
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12823
16
              "DATA transfer 15 for this transaction is in this frame", HFILL }
12824
16
        },
12825
16
        { &hf_nvme_cqe_pkt,
12826
16
            { "Cqe in", "nvme.cqe_pkt",
12827
16
              FT_FRAMENUM, BASE_NONE, NULL, 0,
12828
16
              "The Cqe for this transaction is in this frame", HFILL }
12829
16
        },
12830
16
        { &hf_nvme_cmd_latency,
12831
16
            { "Cmd Latency", "nvme.cmd_latency",
12832
16
              FT_DOUBLE, BASE_NONE, NULL, 0x0,
12833
16
              "The time between the command and completion, in usec", HFILL }
12834
16
        },
12835
16
        { &hf_nvme_gen_data,
12836
16
            { "Nvme Data", "nvme.data",
12837
16
              FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}
12838
16
        },
12839
16
    };
12840
16
    static int *ett[] = {
12841
16
        &ett_data,
12842
16
    };
12843
12844
16
    static ei_register_info ei[] = {
12845
16
        { &ei_nvme_cqe_status_error,
12846
16
            { "nvme.cqe.status.error", PI_RESPONSE_CODE, PI_NOTE,
12847
16
              "Command completed with an error status", EXPFILL }
12848
16
        },
12849
16
        { &ei_nvme_lbaf_count_invalid,
12850
16
            { "nvme.identify.ns.lbaf.count_invalid", PI_MALFORMED, PI_WARN,
12851
16
              "NLBAF and NULBAF describe more LBA Formats than the LBA Format list holds", EXPFILL }
12852
16
        },
12853
16
        { &ei_nvme_data_len_exceeds_frame,
12854
16
            { "nvme.data.len_exceeds_frame", PI_MALFORMED, PI_WARN,
12855
16
              "Transport declared more data than the frame carries", EXPFILL }
12856
16
        },
12857
16
        { &ei_nvme_logpage_window_misaligned,
12858
16
            { "nvme.cmd.get_logpage.window_misaligned", PI_MALFORMED, PI_WARN,
12859
16
              "Log page window does not start on a record boundary", EXPFILL }
12860
16
        },
12861
16
        { &ei_nvme_eom_desc_truncated,
12862
16
            { "nvme.cmd.get_logpage.eom.desc_truncated", PI_MALFORMED, PI_WARN,
12863
16
              "Number of Descriptors exceeds the descriptors the response holds", EXPFILL }
12864
16
        },
12865
16
    };
12866
12867
16
    expert_module_t *expert_nvme;
12868
12869
16
    proto_nvme = proto_register_protocol("NVM Express", "nvme", "nvme");
12870
12871
16
    proto_register_field_array(proto_nvme, hf, array_length(hf));
12872
16
    proto_register_subtree_array(ett, array_length(ett));
12873
12874
16
    expert_nvme = expert_register_protocol(proto_nvme);
12875
16
    expert_register_field_array(expert_nvme, ei, array_length(ei));
12876
12877
    /* Security Send/Receive payload dissectors register here, keyed on the
12878
     * Security Protocol (SECP) value; struct nvme_security_info is passed
12879
     * as the data pointer. */
12880
16
    nvme_security_secp_table = register_dissector_table("nvme.security.secp",
12881
16
            "NVMe Security Protocol (SECP)", proto_nvme, FT_UINT8, BASE_HEX);
12882
16
}
12883
12884
/*
12885
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
12886
 *
12887
 * Local variables:
12888
 * c-basic-offset: 4
12889
 * tab-width: 8
12890
 * indent-tabs-mode: nil
12891
 * End:
12892
 *
12893
 * vi: set shiftwidth=4 tabstop=8 expandtab:
12894
 * :indentSize=4:tabSize=8:noTabs=true:
12895
 */