Coverage Report

Created: 2026-05-14 06:28

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/tfs.h>
24
#include <epan/unit_strings.h>
25
26
#include <wsutil/array.h>
27
#include "packet-nvme.h"
28
29
void proto_register_nvme(void);
30
31
static int proto_nvme;
32
33
34
/* NVMeOF fields */
35
/* NVMe Fabric Cmd */
36
static int hf_nvmeof_cmd;
37
static int hf_nvmeof_cmd_opc;
38
static int hf_nvmeof_cmd_rsvd;
39
static int hf_nvmeof_cmd_cid;
40
static int hf_nvmeof_cmd_fctype;
41
static int hf_nvmeof_cmd_connect_rsvd1;
42
static int hf_nvmeof_cmd_connect_sgl1;
43
static int hf_nvmeof_cmd_connect_recfmt;
44
static int hf_nvmeof_cmd_connect_qid;
45
static int hf_nvmeof_cmd_connect_sqsize;
46
static int hf_nvmeof_cmd_connect_cattr[5];
47
static int hf_nvmeof_cmd_connect_rsvd2;
48
static int hf_nvmeof_cmd_connect_kato;
49
static int hf_nvmeof_cmd_connect_rsvd3;
50
static int hf_nvmeof_cmd_connect_data_hostid;
51
static int hf_nvmeof_cmd_connect_data_cntlid;
52
static int hf_nvmeof_cmd_connect_data_rsvd0;
53
static int hf_nvmeof_cmd_connect_data_subnqn;
54
static int hf_nvmeof_cmd_connect_data_hostnqn;
55
static int hf_nvmeof_cmd_connect_data_rsvd1;
56
57
static int hf_nvmeof_cmd_auth_rsdv1;
58
static int hf_nvmeof_cmd_auth_sgl1;
59
static int hf_nvmeof_cmd_auth_rsdv2;
60
static int hf_nvmeof_cmd_auth_spsp0;
61
static int hf_nvmeof_cmd_auth_spsp1;
62
static int hf_nvmeof_cmd_auth_secp;
63
static int hf_nvmeof_cmd_auth_al;
64
static int hf_nvmeof_cmd_auth_rsdv3;
65
66
static int hf_nvmeof_cmd_disconnect_rsvd0;
67
static int hf_nvmeof_cmd_disconnect_recfmt;
68
static int hf_nvmeof_cmd_disconnect_rsvd1;
69
70
static int hf_nvmeof_cmd_prop_get_set_rsvd0;
71
static int hf_nvmeof_cmd_prop_get_set_attrib[3];
72
static int hf_nvmeof_cmd_prop_get_set_rsvd1;
73
static int hf_nvmeof_cmd_prop_get_set_offset;
74
static int hf_nvmeof_cmd_prop_get_rsvd2;
75
76
static int hf_nvmeof_cmd_prop_set_rsvd;
77
78
static int hf_nvmeof_cmd_generic_rsvd1;
79
static int hf_nvmeof_cmd_generic_field;
80
81
static int hf_nvmeof_prop_get_set_data;
82
static int hf_nvmeof_prop_get_set_data_4B;
83
static int hf_nvmeof_prop_get_set_data_4B_rsvd;
84
static int hf_nvmeof_prop_get_set_data_8B;
85
static int hf_nvmeof_prop_get_set_cc[10];
86
static int hf_nvmeof_prop_get_set_csts[7];
87
static int hf_nvmeof_prop_get_set_nssr[2];
88
static int hf_nvmeof_prop_get_vs[4];
89
static int hf_nvmeof_prop_get_ccap[17];
90
91
92
/* NVMe Fabric CQE */
93
static int hf_nvmeof_cqe;
94
static int hf_nvmeof_cqe_sts;
95
96
static int hf_nvmeof_cqe_connect_cntlid;
97
static int hf_nvmeof_cqe_connect_authreq;
98
static int hf_nvmeof_cqe_connect_rsvd;
99
static int hf_nvmeof_cqe_prop_set_rsvd;
100
101
/* tracking Cmd and its respective CQE */
102
int hf_nvmeof_cmd_pkt;
103
int hf_nvmeof_data_req;
104
static int hf_nvmeof_data_tr[NVME_CMD_MAX_TRS];
105
static int hf_nvmeof_cqe_pkt;
106
static int hf_nvmeof_cmd_latency;
107
108
static const value_string fctype_tbl[] = {
109
    { NVME_FCTYPE_PROP_SET,      "Property Set" },
110
    { NVME_FCTYPE_CONNECT,       "Connect" },
111
    { NVME_FCTYPE_PROP_GET,      "Property Get" },
112
    { NVME_FCTYPE_AUTH_SEND,     "Authentication Send" },
113
    { NVME_FCTYPE_AUTH_RECV,     "Authentication Recv" },
114
    { NVME_FCTYPE_DISCONNECT,     "Disconnect" },
115
    { 0, NULL}
116
};
117
118
static const value_string pclass_tbl[] = {
119
    { 0x0, "Urgent" },
120
    { 0x1, "High" },
121
    { 0x2, "Medium" },
122
    { 0x3, "Low", },
123
    { 0, NULL}
124
};
125
126
static const value_string prop_offset_tbl[] = {
127
    { 0x0,      "Controller Capabilities"},
128
    { 0x8,      "Version"},
129
    { 0xc,      "Reserved"},
130
    { 0x10,     "Reserved"},
131
    { 0x14,     "Controller Configuration"},
132
    { 0x18,     "Reserved"},
133
    { 0x1c,     "Controller Status"},
134
    { 0x20,     "NVM Subsystem Reset"},
135
    { 0x24,     "Reserved"},
136
    { 0x28,     "Reserved"},
137
    { 0x30,     "Reserved"},
138
    { 0x38,     "Reserved"},
139
    { 0x3c,     "Reserved"},
140
    { 0x40,     "Reserved"},
141
    { 0, NULL}
142
};
143
144
static const value_string attr_size_tbl[] = {
145
    { 0,       "4 bytes"},
146
    { 1,       "8 bytes"},
147
    { 0, NULL}
148
};
149
150
static const value_string css_table[] = {
151
     { 0x0, "NVM IO Command Set"},
152
     { 0x1, "Admin Command Set Only"},
153
     { 0x0, NULL}
154
};
155
static const value_string sn_table[] = {
156
    { 0x0, "No Shutdown"},
157
    { 0x1, "Normal Shutdown"},
158
    { 0x2, "Abrupt Shutdown"},
159
    { 0x3, "Reserved"},
160
    { 0x0, NULL}
161
};
162
static const value_string ams_table[] = {
163
    { 0x0, "Round Robin"},
164
    { 0x1, "Weighted Round Robin with Urgent Priority Class"},
165
    { 0x2, "Reserved"},
166
    { 0x3, "Reserved"},
167
    { 0x4, "Reserved"},
168
    { 0x5, "Reserved"},
169
    { 0x6, "Reserved"},
170
    { 0x7, "Vendor Specific"},
171
    { 0x0, NULL}
172
};
173
174
static const value_string shst_table[] = {
175
    { 0x0, "No Shutdown"},
176
    { 0x1, "Shutdown in Process"},
177
    { 0x2, "Shutdown Complete"},
178
    { 0x3, "Reserved"},
179
    { 0x0, NULL}
180
};
181
182
/* NVMe Cmd fields */
183
static int hf_nvme_cmd_opc;
184
static int hf_nvme_cmd_rsvd;
185
static int hf_nvme_cmd_cid;
186
static int hf_nvme_cmd_fuse_op;
187
static int hf_nvme_cmd_psdt;
188
static int hf_nvme_cmd_nsid;
189
static int hf_nvme_cmd_rsvd1;
190
static int hf_nvme_cmd_mptr;
191
static int hf_nvme_cmd_sgl;
192
static int hf_nvme_cmd_sgl_desc_type;
193
static int hf_nvme_cmd_sgl_desc_sub_type;
194
static int hf_nvme_cmd_sgl_desc_addr;
195
static int hf_nvme_cmd_sgl_desc_addr_rsvd;
196
static int hf_nvme_cmd_sgl_desc_len;
197
static int hf_nvme_cmd_sgl_desc_rsvd;
198
static int hf_nvme_cmd_sgl_desc_key;
199
static int hf_nvme_cmd_dword10;
200
static int hf_nvme_cmd_dword11;
201
static int hf_nvme_cmd_dword12;
202
static int hf_nvme_cmd_dword13;
203
static int hf_nvme_cmd_dword14;
204
static int hf_nvme_cmd_dword15;
205
static int hf_nvme_cmd_slba;
206
static int hf_nvme_cmd_nlb;
207
static int hf_nvme_cmd_rsvd2;
208
static int hf_nvme_cmd_prinfo;
209
static int hf_nvme_cmd_prinfo_prchk_lbrtag;
210
static int hf_nvme_cmd_prinfo_prchk_apptag;
211
static int hf_nvme_cmd_prinfo_prchk_guard;
212
static int hf_nvme_cmd_prinfo_pract;
213
static int hf_nvme_cmd_fua;
214
static int hf_nvme_cmd_lr;
215
static int hf_nvme_cmd_eilbrt;
216
static int hf_nvme_cmd_elbat;
217
static int hf_nvme_cmd_elbatm;
218
static int hf_nvme_cmd_dsm;
219
static int hf_nvme_cmd_dsm_access_freq;
220
static int hf_nvme_cmd_dsm_access_lat;
221
static int hf_nvme_cmd_dsm_seq_req;
222
static int hf_nvme_cmd_dsm_incompressible;
223
static int hf_nvme_cmd_rsvd3;
224
static int hf_nvme_identify_dword10[4];
225
static int hf_nvme_identify_dword11[3];
226
static int hf_nvme_identify_dword14[3];
227
228
static int hf_nvme_get_logpage_dword10[6];
229
static int hf_nvme_get_logpage_numd;
230
static int hf_nvme_get_logpage_dword11[3];
231
static int hf_nvme_get_logpage_lpo;
232
static int hf_nvme_get_logpage_dword14[3];
233
static int hf_nvme_set_features_dword10[4];
234
static int hf_nvme_set_features_dword14[3];
235
static int hf_nvme_cmd_set_features_dword11_arb[6];
236
static int hf_nvme_cmd_set_features_dword11_pm[4];
237
static int hf_nvme_cmd_set_features_dword11_lbart[3];
238
static int hf_nvme_cmd_set_features_dword11_tt[5];
239
static int hf_nvme_cmd_set_features_dword11_erec[4];
240
static int hf_nvme_cmd_set_features_dword11_vwce[3];
241
static int hf_nvme_cmd_set_features_dword11_nq[3];
242
static int hf_nvme_cmd_set_features_dword11_irqc[3];
243
static int hf_nvme_cmd_set_features_dword11_irqv[4];
244
static int hf_nvme_cmd_set_features_dword11_wan[3];
245
static int hf_nvme_cmd_set_features_dword11_aec[11];
246
static int hf_nvme_cmd_set_features_dword11_apst[3];
247
static int hf_nvme_cmd_set_features_dword11_kat[2];
248
static int hf_nvme_cmd_set_features_dword11_hctm[3];
249
static int hf_nvme_cmd_set_features_dword11_nops[3];
250
static int hf_nvme_cmd_set_features_dword11_rrl[3];
251
static int hf_nvme_cmd_set_features_dword12_rrl[3];
252
static int hf_nvme_cmd_set_features_dword11_plmc[3];
253
static int hf_nvme_cmd_set_features_dword12_plmc[3];
254
static int hf_nvme_cmd_set_features_dword11_plmw[3];
255
static int hf_nvme_cmd_set_features_dword12_plmw[3];
256
static int hf_nvme_cmd_set_features_dword11_lbasi[3];
257
static int hf_nvme_cmd_set_features_dword11_san[3];
258
static int hf_nvme_cmd_set_features_dword11_eg[4];
259
static int hf_nvme_cmd_set_features_dword11_swp[3];
260
static int hf_nvme_cmd_set_features_dword11_hid[3];
261
static int hf_nvme_cmd_set_features_dword11_rsrvn[6];
262
static int hf_nvme_cmd_set_features_dword11_rsrvp[3];
263
static int hf_nvme_cmd_set_features_dword11_nswp[3];
264
static int hf_nvme_set_features_tr_lbart;
265
static int hf_nvme_set_features_tr_lbart_type;
266
static int hf_nvme_set_features_tr_lbart_attr[4];
267
static int hf_nvme_set_features_tr_lbart_rsvd0;
268
static int hf_nvme_set_features_tr_lbart_slba;
269
static int hf_nvme_set_features_tr_lbart_nlb;
270
static int hf_nvme_set_features_tr_lbart_guid;
271
static int hf_nvme_set_features_tr_lbart_rsvd1;
272
static int hf_nvme_set_features_tr_apst[5];
273
static int hf_nvme_set_features_tr_tst[3];
274
static int hf_nvme_set_features_tr_plmc;
275
static int hf_nvme_set_features_tr_plmc_ee[7];
276
static int hf_nvme_set_features_tr_plmc_rsvd0;
277
static int hf_nvme_set_features_tr_plmc_dtwinrt;
278
static int hf_nvme_set_features_tr_plmc_dtwinwt;
279
static int hf_nvme_set_features_tr_plmc_dtwintt;
280
static int hf_nvme_set_features_tr_plmc_rsvd1;
281
static int hf_nvme_set_features_tr_hbs;
282
static int hf_nvme_set_features_tr_hbs_acre;
283
static int hf_nvme_set_features_tr_hbs_rsvd;
284
static int hf_nvme_get_features_dword10[4];
285
static int hf_nvme_get_features_dword14[3];
286
static int hf_nvme_cmd_get_features_dword11_rrl[3];
287
static int hf_nvme_cmd_get_features_dword11_plmc[3];
288
static int hf_nvme_cmd_get_features_dword11_plmw[3];
289
static int hf_nvme_identify_ns_nsze;
290
static int hf_nvme_identify_ns_ncap;
291
static int hf_nvme_identify_ns_nuse;
292
static int hf_nvme_identify_ns_nsfeat;
293
static int hf_nvme_identify_ns_nlbaf;
294
static int hf_nvme_identify_ns_flbas;
295
static int hf_nvme_identify_ns_mc;
296
static int hf_nvme_identify_ns_dpc;
297
static int hf_nvme_identify_ns_dps;
298
static int hf_nvme_identify_ns_nmic;
299
static int hf_nvme_identify_ns_nguid;
300
static int hf_nvme_identify_ns_eui64;
301
static int hf_nvme_identify_ns_lbafs;
302
static int hf_nvme_identify_ns_lbaf;
303
static int hf_nvme_identify_ns_rsvd;
304
static int hf_nvme_identify_ns_vs;
305
static int hf_nvme_identify_ctrl_vid;
306
static int hf_nvme_identify_ctrl_ssvid;
307
static int hf_nvme_identify_ctrl_sn;
308
static int hf_nvme_identify_ctrl_mn;
309
static int hf_nvme_identify_ctrl_fr;
310
static int hf_nvme_identify_ctrl_rab;
311
static int hf_nvme_identify_ctrl_ieee;
312
static int hf_nvme_identify_ctrl_cmic[6];
313
static int hf_nvme_identify_ctrl_mdts;
314
static int hf_nvme_identify_ctrl_cntlid;
315
static int hf_nvme_identify_ctrl_ver;
316
static int hf_nvme_identify_ctrl_ver_min;
317
static int hf_nvme_identify_ctrl_ver_mjr;
318
static int hf_nvme_identify_ctrl_ver_ter;
319
static int hf_nvme_identify_ctrl_rtd3r;
320
static int hf_nvme_identify_ctrl_rtd3e;
321
static int hf_nvme_identify_ctrl_oaes[10];
322
static int hf_nvme_identify_ctrl_ctratt[12];
323
static int hf_nvme_identify_ctrl_rrls[17];
324
static int hf_nvme_identify_ctrl_rsvd0;
325
static int hf_nvme_identify_ctrl_cntrltype;
326
static int hf_nvme_identify_ctrl_fguid;
327
static int hf_nvme_identify_ctrl_fguid_vse;
328
static int hf_nvme_identify_ctrl_fguid_oui;
329
static int hf_nvme_identify_ctrl_fguid_ei;
330
static int hf_nvme_identify_ctrl_crdt1;
331
static int hf_nvme_identify_ctrl_crdt2;
332
static int hf_nvme_identify_ctrl_crdt3;
333
static int hf_nvme_identify_ctrl_rsvd1;
334
static int hf_nvme_identify_ctrl_mi;
335
static int hf_nvme_identify_ctrl_mi_rsvd;
336
static int hf_nvme_identify_ctrl_mi_nvmsr[4];
337
static int hf_nvme_identify_ctrl_mi_vwci[3];
338
static int hf_nvme_identify_ctrl_mi_mec[4];
339
static int hf_nvme_identify_ctrl_oacs[12];
340
static int hf_nvme_identify_ctrl_acl;
341
static int hf_nvme_identify_ctrl_aerl;
342
static int hf_nvme_identify_ctrl_frmw[5];
343
static int hf_nvme_identify_ctrl_lpa[7];
344
static int hf_nvme_identify_ctrl_elpe;
345
static int hf_nvme_identify_ctrl_npss;
346
static int hf_nvme_identify_ctrl_avscc[3];
347
static int hf_nvme_identify_ctrl_apsta[3];
348
static int hf_nvme_identify_ctrl_wctemp;
349
static int hf_nvme_identify_ctrl_cctemp;
350
static int hf_nvme_identify_ctrl_mtfa;
351
static int hf_nvme_identify_ctrl_hmpre;
352
static int hf_nvme_identify_ctrl_hmmin;
353
static int hf_nvme_identify_ctrl_tnvmcap;
354
static int  hf_nvme_identify_ctrl_unvmcap;
355
static int hf_nvme_identify_ctrl_rpmbs[6];
356
static int hf_nvme_identify_ctrl_edstt;
357
static int hf_nvme_identify_ctrl_dsto[3];
358
static int hf_nvme_identify_ctrl_fwug;
359
static int hf_nvme_identify_ctrl_kas;
360
static int hf_nvme_identify_ctrl_hctma[3];
361
static int hf_nvme_identify_ctrl_mntmt;
362
static int hf_nvme_identify_ctrl_mxtmt;
363
static int hf_nvme_identify_ctrl_sanicap[7];
364
static int hf_nvme_identify_ctrl_hmmminds;
365
static int hf_nvme_identify_ctrl_hmmaxd;
366
static int hf_nvme_identify_ctrl_nsetidmax;
367
static int hf_nvme_identify_ctrl_endgidmax;
368
static int hf_nvme_identify_ctrl_anatt;
369
static int hf_nvme_identify_ctrl_anacap[9];
370
static int hf_nvme_identify_ctrl_anagrpmax;
371
static int hf_nvme_identify_ctrl_nanagrpid;
372
static int hf_nvme_identify_ctrl_pels;
373
static int hf_nvme_identify_ctrl_rsvd2;
374
static int hf_nvme_identify_ctrl_sqes[3];
375
static int hf_nvme_identify_ctrl_cqes[3];
376
static int hf_nvme_identify_ctrl_maxcmd;
377
static int hf_nvme_identify_ctrl_nn;
378
static int hf_nvme_identify_ctrl_oncs[10];
379
static int hf_nvme_identify_ctrl_fuses[3];
380
static int hf_nvme_identify_ctrl_fna[5];
381
static int hf_nvme_identify_ctrl_vwc[4];
382
static int hf_nvme_identify_ctrl_awun;
383
static int hf_nvme_identify_ctrl_awupf;
384
static int hf_nvme_identify_ctrl_nvscc[3];
385
static int hf_nvme_identify_ctrl_nwpc[5];
386
static int hf_nvme_identify_ctrl_acwu;
387
static int hf_nvme_identify_ctrl_rsvd3;
388
static int hf_nvme_identify_ctrl_sgls[11];
389
static int hf_nvme_identify_ctrl_mnan;
390
static int hf_nvme_identify_ctrl_rsvd4;
391
static int hf_nvme_identify_ctrl_subnqn;
392
static int hf_nvme_identify_ctrl_rsvd5;
393
static int hf_nvme_identify_ctrl_nvmeof;
394
static int hf_nvme_identify_ctrl_nvmeof_ioccsz;
395
static int hf_nvme_identify_ctrl_nvmeof_iorcsz;
396
static int hf_nvme_identify_ctrl_nvmeof_icdoff;
397
static int hf_nvme_identify_ctrl_nvmeof_fcatt[3];
398
static int hf_nvme_identify_ctrl_nvmeof_msdbd;
399
static int hf_nvme_identify_ctrl_nvmeof_ofcs[3];
400
static int hf_nvme_identify_ctrl_nvmeof_rsvd;
401
static int hf_nvme_identify_ctrl_psds;
402
static int hf_nvme_identify_ctrl_psd;
403
static int hf_nvme_identify_ctrl_psd_mp;
404
static int hf_nvme_identify_ctrl_psd_rsvd0;
405
static int hf_nvme_identify_ctrl_psd_mxps;
406
static int hf_nvme_identify_ctrl_psd_nops;
407
static int hf_nvme_identify_ctrl_psd_rsvd1;
408
static int hf_nvme_identify_ctrl_psd_enlat;
409
static int hf_nvme_identify_ctrl_psd_exlat;
410
static int hf_nvme_identify_ctrl_psd_rrt;
411
static int hf_nvme_identify_ctrl_psd_rsvd2;
412
static int hf_nvme_identify_ctrl_psd_rrl;
413
static int hf_nvme_identify_ctrl_psd_rsvd3;
414
static int hf_nvme_identify_ctrl_psd_rwt;
415
static int hf_nvme_identify_ctrl_psd_rsvd4;
416
static int hf_nvme_identify_ctrl_psd_rwl;
417
static int hf_nvme_identify_ctrl_psd_rsvd5;
418
static int hf_nvme_identify_ctrl_psd_idlp;
419
static int hf_nvme_identify_ctrl_psd_rsvd6;
420
static int hf_nvme_identify_ctrl_psd_ips;
421
static int hf_nvme_identify_ctrl_psd_rsvd7;
422
static int hf_nvme_identify_ctrl_psd_actp;
423
static int hf_nvme_identify_ctrl_psd_apw;
424
static int hf_nvme_identify_ctrl_psd_rsvd8;
425
static int hf_nvme_identify_ctrl_psd_aps;
426
static int hf_nvme_identify_ctrl_psd_rsvd9;
427
static int hf_nvme_identify_ctrl_vs;
428
429
static int hf_nvme_identify_nslist_nsid;
430
431
/* get logpage response */
432
static int hf_nvme_get_logpage_ify_genctr;
433
static int hf_nvme_get_logpage_ify_numrec;
434
static int hf_nvme_get_logpage_ify_recfmt;
435
static int hf_nvme_get_logpage_ify_rsvd;
436
static int hf_nvme_get_logpage_ify_rcrd;
437
static int hf_nvme_get_logpage_ify_rcrd_trtype;
438
static int hf_nvme_get_logpage_ify_rcrd_adrfam;
439
static int hf_nvme_get_logpage_ify_rcrd_subtype;
440
static int hf_nvme_get_logpage_ify_rcrd_treq[4];
441
static int hf_nvme_get_logpage_ify_rcrd_portid;
442
static int hf_nvme_get_logpage_ify_rcrd_cntlid;
443
static int hf_nvme_get_logpage_ify_rcrd_asqsz;
444
static int hf_nvme_get_logpage_ify_rcrd_rsvd0;
445
static int hf_nvme_get_logpage_ify_rcrd_trsvcid;
446
static int hf_nvme_get_logpage_ify_rcrd_rsvd1;
447
static int hf_nvme_get_logpage_ify_rcrd_subnqn;
448
static int hf_nvme_get_logpage_ify_rcrd_traddr;
449
static int hf_nvme_get_logpage_ify_rcrd_tsas;
450
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype;
451
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype;
452
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms;
453
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0;
454
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey;
455
static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1;
456
static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype;
457
static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd;
458
static int hf_nvme_get_logpage_errinf_errcnt;
459
static int hf_nvme_get_logpage_errinf_sqid;
460
static int hf_nvme_get_logpage_errinf_cid;
461
static int hf_nvme_get_logpage_errinf_sf[3];
462
static int hf_nvme_get_logpage_errinf_pel[4];
463
static int hf_nvme_get_logpage_errinf_lba;
464
static int hf_nvme_get_logpage_errinf_ns;
465
static int hf_nvme_get_logpage_errinf_vsi;
466
static int hf_nvme_get_logpage_errinf_trtype;
467
static int hf_nvme_get_logpage_errinf_rsvd0;
468
static int hf_nvme_get_logpage_errinf_csi;
469
static int hf_nvme_get_logpage_errinf_tsi;
470
static int hf_nvme_get_logpage_errinf_rsvd1;
471
static int hf_nvme_get_logpage_smart_cw[8];
472
static int hf_nvme_get_logpage_smart_ct;
473
static int hf_nvme_get_logpage_smart_asc;
474
static int hf_nvme_get_logpage_smart_ast;
475
static int hf_nvme_get_logpage_smart_lpu;
476
static int hf_nvme_get_logpage_smart_egcws[6];
477
static int hf_nvme_get_logpage_smart_rsvd0;
478
static int hf_nvme_get_logpage_smart_dur;
479
static int hf_nvme_get_logpage_smart_duw;
480
static int hf_nvme_get_logpage_smart_hrc;
481
static int hf_nvme_get_logpage_smart_hwc;
482
static int hf_nvme_get_logpage_smart_cbt;
483
static int hf_nvme_get_logpage_smart_pc;
484
static int hf_nvme_get_logpage_smart_poh;
485
static int hf_nvme_get_logpage_smart_us;
486
static int hf_nvme_get_logpage_smart_mie;
487
static int hf_nvme_get_logpage_smart_ele;
488
static int hf_nvme_get_logpage_smart_wctt;
489
static int hf_nvme_get_logpage_smart_cctt;
490
static int hf_nvme_get_logpage_smart_ts[9];
491
static int hf_nvme_get_logpage_smart_tmt1c;
492
static int hf_nvme_get_logpage_smart_tmt2c;
493
static int hf_nvme_get_logpage_smart_tmt1t;
494
static int hf_nvme_get_logpage_smart_tmt2t;
495
static int hf_nvme_get_logpage_smart_rsvd1;
496
static int hf_nvme_get_logpage_fw_slot_afi[5];
497
static int hf_nvme_get_logpage_fw_slot_rsvd0;
498
static int hf_nvme_get_logpage_fw_slot_frs[8];
499
static int hf_nvme_get_logpage_fw_slot_rsvd1;
500
static int hf_nvme_get_logpage_changed_nslist;
501
static int hf_nvme_get_logpage_cmd_and_eff_cs;
502
static int hf_nvme_get_logpage_cmd_and_eff_cseds[10];
503
static int hf_nvme_get_logpage_selftest_csto[3];
504
static int hf_nvme_get_logpage_selftest_cstc[3];
505
static int hf_nvme_get_logpage_selftest_rsvd;
506
static int hf_nvme_get_logpage_selftest_res;
507
static int hf_nvme_get_logpage_selftest_res_status[3];
508
static int hf_nvme_get_logpage_selftest_res_sn;
509
static int hf_nvme_get_logpage_selftest_res_vdi[6];
510
static int hf_nvme_get_logpage_selftest_res_rsvd;
511
static int hf_nvme_get_logpage_selftest_res_poh;
512
static int hf_nvme_get_logpage_selftest_res_nsid;
513
static int hf_nvme_get_logpage_selftest_res_flba;
514
static int hf_nvme_get_logpage_selftest_res_sct[3];
515
static int hf_nvme_get_logpage_selftest_res_sc;
516
static int hf_nvme_get_logpage_selftest_res_vs;
517
static int hf_nvme_get_logpage_telemetry_li;
518
static int hf_nvme_get_logpage_telemetry_rsvd0;
519
static int hf_nvme_get_logpage_telemetry_ieee;
520
static int hf_nvme_get_logpage_telemetry_da1lb;
521
static int hf_nvme_get_logpage_telemetry_da2lb;
522
static int hf_nvme_get_logpage_telemetry_da3lb;
523
static int hf_nvme_get_logpage_telemetry_rsvd1;
524
static int hf_nvme_get_logpage_telemetry_da;
525
static int hf_nvme_get_logpage_telemetry_dgn;
526
static int hf_nvme_get_logpage_telemetry_ri;
527
static int hf_nvme_get_logpage_telemetry_db;
528
static int hf_nvme_get_logpage_egroup_cw[6];
529
static int hf_nvme_get_logpage_egroup_rsvd0;
530
static int hf_nvme_get_logpage_egroup_as;
531
static int hf_nvme_get_logpage_egroup_ast;
532
static int hf_nvme_get_logpage_egroup_pu;
533
static int hf_nvme_get_logpage_egroup_rsvd1;
534
static int hf_nvme_get_logpage_egroup_ee;
535
static int hf_nvme_get_logpage_egroup_dur;
536
static int hf_nvme_get_logpage_egroup_duw;
537
static int hf_nvme_get_logpage_egroup_muw;
538
static int hf_nvme_get_logpage_egroup_hrc;
539
static int hf_nvme_get_logpage_egroup_hwc;
540
static int hf_nvme_get_logpage_egroup_mdie;
541
static int hf_nvme_get_logpage_egroup_ele;
542
static int hf_nvme_get_logpage_egroup_rsvd2;
543
static int hf_nvme_get_logpage_pred_lat_status[3];
544
static int hf_nvme_get_logpage_pred_lat_rsvd0;
545
static int hf_nvme_get_logpage_pred_lat_etype[7];
546
static int hf_nvme_get_logpage_pred_lat_rsvd1;
547
static int hf_nvme_get_logpage_pred_lat_dtwin_rt;
548
static int hf_nvme_get_logpage_pred_lat_dtwin_wt;
549
static int hf_nvme_get_logpage_pred_lat_dtwin_tm;
550
static int hf_nvme_get_logpage_pred_lat_ndwin_tmh;
551
static int hf_nvme_get_logpage_pred_lat_ndwin_tml;
552
static int hf_nvme_get_logpage_pred_lat_rsvd2;
553
static int hf_nvme_get_logpage_pred_lat_dtwin_re;
554
static int hf_nvme_get_logpage_pred_lat_dtwin_we;
555
static int hf_nvme_get_logpage_pred_lat_dtwin_te;
556
static int hf_nvme_get_logpage_pred_lat_rsvd3;
557
static int hf_nvme_get_logpage_pred_lat_aggreg_ne;
558
static int hf_nvme_get_logpage_pred_lat_aggreg_nset;
559
static int hf_nvme_get_logpage_ana_chcnt;
560
static int hf_nvme_get_logpage_ana_ngd;
561
static int hf_nvme_get_logpage_ana_rsvd;
562
static int hf_nvme_get_logpage_ana_grp;
563
static int hf_nvme_get_logpage_ana_grp_id;
564
static int hf_nvme_get_logpage_ana_grp_nns;
565
static int hf_nvme_get_logpage_ana_grp_chcnt;
566
static int hf_nvme_get_logpage_ana_grp_anas[3];
567
static int hf_nvme_get_logpage_ana_grp_rsvd;
568
static int hf_nvme_get_logpage_ana_grp_nsid;
569
static int hf_nvme_get_logpage_lba_status_lslplen;
570
static int hf_nvme_get_logpage_lba_status_nlslne;
571
static int hf_nvme_get_logpage_lba_status_estulb;
572
static int hf_nvme_get_logpage_lba_status_rsvd;
573
static int hf_nvme_get_logpage_lba_status_lsgc;
574
static int hf_nvme_get_logpage_lba_status_nel;
575
static int hf_nvme_get_logpage_lba_status_nel_ne;
576
static int hf_nvme_get_logpage_lba_status_nel_ne_neid;
577
static int hf_nvme_get_logpage_lba_status_nel_ne_nlrd;
578
static int hf_nvme_get_logpage_lba_status_nel_ne_ratype;
579
static int hf_nvme_get_logpage_lba_status_nel_ne_rsvd;
580
static int hf_nvme_get_logpage_lba_status_nel_ne_rd;
581
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba;
582
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb;
583
static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd;
584
static int hf_nvme_get_logpage_egroup_aggreg_ne;
585
static int hf_nvme_get_logpage_egroup_aggreg_eg;
586
static int hf_nvme_get_logpage_reserv_notif_lpc;
587
static int hf_nvme_get_logpage_reserv_notif_lpt;
588
static int hf_nvme_get_logpage_reserv_notif_nalp;
589
static int hf_nvme_get_logpage_reserv_notif_rsvd0;
590
static int hf_nvme_get_logpage_reserv_notif_nsid;
591
static int hf_nvme_get_logpage_reserv_notif_rsvd1;
592
static int hf_nvme_get_logpage_sanitize_sprog;
593
static int hf_nvme_get_logpage_sanitize_sstat[5];
594
static int hf_nvme_get_logpage_sanitize_scdw10;
595
static int hf_nvme_get_logpage_sanitize_eto;
596
static int hf_nvme_get_logpage_sanitize_etbe;
597
static int hf_nvme_get_logpage_sanitize_etce;
598
static int hf_nvme_get_logpage_sanitize_etond;
599
static int hf_nvme_get_logpage_sanitize_etbend;
600
static int hf_nvme_get_logpage_sanitize_etcend;
601
static int hf_nvme_get_logpage_sanitize_rsvd;
602
static int hf_nvme_get_logpage_disc_rcrd_eflags[4];
603
604
/* NVMe CQE fields */
605
static int hf_nvme_cqe_dword0;
606
static int hf_nvme_cqe_aev_dword0[6];
607
static int hf_nvme_cqe_dword0_sf_nq[3];
608
static int hf_nvme_cqe_dword0_sf_err;
609
610
static int hf_nvme_cqe_get_features_dword0_arb[6];
611
static int hf_nvme_cqe_get_features_dword0_pm[4];
612
static int hf_nvme_cqe_get_features_dword0_lbart[3];
613
static int hf_nvme_cqe_get_features_dword0_tt[5];
614
static int hf_nvme_cqe_get_features_dword0_erec[4];
615
static int hf_nvme_cqe_get_features_dword0_vwce[3];
616
static int hf_nvme_cqe_get_features_dword0_nq[3];
617
static int hf_nvme_cqe_get_features_dword0_irqc[3];
618
static int hf_nvme_cqe_get_features_dword0_irqv[4];
619
static int hf_nvme_cqe_get_features_dword0_wan[3];
620
static int hf_nvme_cqe_get_features_dword0_aec[11];
621
static int hf_nvme_cqe_get_features_dword0_apst[3];
622
static int hf_nvme_cqe_get_features_dword0_kat[2];
623
static int hf_nvme_cqe_get_features_dword0_hctm[3];
624
static int hf_nvme_cqe_get_features_dword0_nops[3];
625
static int hf_nvme_cqe_get_features_dword0_rrl[3];
626
static int hf_nvme_cqe_get_features_dword0_plmc[3];
627
static int hf_nvme_cqe_get_features_dword0_plmw[3];
628
static int hf_nvme_cqe_get_features_dword0_lbasi[3];
629
static int hf_nvme_cqe_get_features_dword0_san[3];
630
static int hf_nvme_cqe_get_features_dword0_eg[4];
631
static int hf_nvme_cqe_get_features_dword0_swp[3];
632
static int hf_nvme_cqe_get_features_dword0_hid[3];
633
static int hf_nvme_cqe_get_features_dword0_rsrvn[6];
634
static int hf_nvme_cqe_get_features_dword0_rsrvp[3];
635
static int hf_nvme_cqe_get_features_dword0_nswp[3];
636
637
static int hf_nvme_cqe_dword1;
638
static int hf_nvme_cqe_sqhd;
639
static int hf_nvme_cqe_sqid;
640
static int hf_nvme_cqe_cid;
641
static int hf_nvme_cqe_status[7];
642
static int hf_nvme_cqe_status_rsvd;
643
644
/* tracking Cmd and its respective CQE */
645
static int hf_nvme_cmd_pkt;
646
static int hf_nvme_data_req;
647
static int hf_nvme_data_tr[NVME_CMD_MAX_TRS];
648
static int hf_nvme_cqe_pkt;
649
static int hf_nvme_cmd_latency;
650
651
/* Data response fields */
652
static int hf_nvme_gen_data;
653
/* Initialize the subtree pointers */
654
static int ett_data;
655
656
#define NVME_AQ_OPC_DELETE_SQ           0x0
657
#define NVME_AQ_OPC_CREATE_SQ           0x1
658
0
#define NVME_AQ_OPC_GET_LOG_PAGE        0x2
659
#define NVME_AQ_OPC_DELETE_CQ           0x4
660
#define NVME_AQ_OPC_CREATE_CQ           0x5
661
0
#define NVME_AQ_OPC_IDENTIFY            0x6
662
#define NVME_AQ_OPC_ABORT               0x8
663
0
#define NVME_AQ_OPC_SET_FEATURES        0x9
664
0
#define NVME_AQ_OPC_GET_FEATURES        0xa
665
0
#define NVME_AQ_OPC_ASYNC_EVE_REQ       0xc
666
#define NVME_AQ_OPC_NS_MGMT             0xd
667
#define NVME_AQ_OPC_FW_COMMIT           0x10
668
#define NVME_AQ_OPC_FW_IMG_DOWNLOAD     0x11
669
#define NVME_AQ_OPC_NS_ATTACH           0x15
670
#define NVME_AQ_OPC_KEEP_ALIVE          0x18
671
672
3
#define NVME_IOQ_OPC_FLUSH                  0x0
673
3
#define NVME_IOQ_OPC_WRITE                  0x1
674
3
#define NVME_IOQ_OPC_READ                   0x2
675
3
#define NVME_IOQ_OPC_WRITE_UNCORRECTABLE    0x4
676
3
#define NVME_IOQ_OPC_COMPARE                0x5
677
3
#define NVME_IOQ_OPC_WRITE_ZEROS            0x8
678
3
#define NVME_IOQ_OPC_DATASET_MGMT           0x9
679
3
#define NVME_IOQ_OPC_RESV_REG               0xd
680
3
#define NVME_IOQ_OPC_RESV_REPORT            0xe
681
3
#define NVME_IOQ_OPC_RESV_ACQUIRE           0x11
682
3
#define NVME_IOQ_OPC_RESV_RELEASE           0x15
683
684
0
#define NVME_IDENTIFY_CNS_IDENTIFY_NS       0x0
685
0
#define NVME_IDENTIFY_CNS_IDENTIFY_CTRL     0x1
686
0
#define NVME_IDENTIFY_CNS_IDENTIFY_NSLIST   0x2
687
688
typedef enum {
689
    NVME_CQE_SCT_GENERIC = 0x0,
690
    NVME_CQE_SCT_COMMAND = 0x1,
691
    NVME_CQE_SCT_MEDIA = 0x2,
692
    NVME_CQE_SCT_PATH = 0x3,
693
    NVME_CQE_SCT_VENDOR = 0x7,
694
} nvme_cqe_sct_t;
695
696
typedef enum {
697
    NVME_CQE_SC_GEN_CMD_OK = 0x00,
698
    NVME_CQE_SC_CMD_INVALID_OPCODE = 0x01,
699
    NVME_CQE_SC_GEN_CMD_INVALID_FIELD = 0x02,
700
    NVME_CQE_SC_GEN_CMD_CID_CONFLICT = 0x03,
701
    NVME_CQE_SC_GEN_DATA_TRANSFER_ERR = 0x04,
702
    NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS = 0x05,
703
    NVME_CQE_SC_GEN_INTERNAL_ERROR = 0x06,
704
    NVME_CQE_SC_GEN_ABORT_REQUESTED = 0x07,
705
    NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE = 0x08,
706
    NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE = 0x09,
707
    NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE = 0x0A,
708
    NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT = 0x0B,
709
    NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR = 0x0C,
710
    NVME_CQE_SC_GEN_INVALID_SGL_SD = 0x0D,
711
    NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM = 0x0E,
712
    NVME_CQE_SC_GEN_INVALID_SGL_LEN = 0x0F,
713
    NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN = 0x10,
714
    NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE = 0x11,
715
    NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF = 0x12,
716
    NVME_CQE_SC_GEN_INVALID_PRP_OFFSET = 0x13,
717
    NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED = 0x14,
718
    NVME_CQE_SC_GEN_OPERATION_DENIED = 0x15,
719
    NVME_CQE_SC_GEN_INVALID_SGL_OFFSET = 0x16,
720
    NVME_CQE_SC_GEN_RESERVED_17H = 0x17,
721
    NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT = 0x18,
722
    NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED = 0x19,
723
    NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID = 0x1A,
724
    NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT = 0x1B,
725
    NVME_CQE_SC_GEN_SANITIZE_FAILED = 0x1C,
726
    NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS = 0x1D,
727
    NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID = 0x1E,
728
    NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB = 0x1F,
729
    NVME_CQE_SC_GEN_NAMESPACE_IS_WP = 0x20,
730
    NVME_CQE_SC_GEN_COMMAND_INTERRUPTED = 0x21,
731
    NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR = 0x22,
732
    NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE = 0x80,
733
    NVME_CQE_SC_GEN_CAPACITY_EXCEED = 0x81,
734
    NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY = 0x82,
735
    NVME_CQE_SC_GEN_RESERVATION_CONFLICT = 0x83,
736
    NVME_CQE_SC_GEN_FMT_IN_PROGRESS = 0x84,
737
} nvme_cqe_sc_gen_t;
738
739
typedef enum {
740
    NVME_CQE_SC_CMD_INVALID_CQ = 0x00,
741
    NVME_CQE_SC_CMD_INVALID_QID = 0x01,
742
    NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE = 0x02,
743
    NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED = 0x03,
744
    NVME_CQE_SC_CMD_RESERVED_4H = 0x04,
745
    NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED = 0x05,
746
    NVME_CQE_SC_CMD_INVALID_FW_SLOT = 0x06,
747
    NVME_CQE_SC_CMD_INVALID_FW_IMAGE = 0x07,
748
    NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR = 0x08,
749
    NVME_CQE_SC_CMD_INVALID_LOG_PAGE = 0x09,
750
    NVME_CQE_SC_CMD_INVALID_FMT = 0x0A,
751
    NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET = 0x0B,
752
    NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE = 0x0C,
753
    NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE = 0x0D,
754
    NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE = 0x0E,
755
    NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE = 0x0F,
756
    NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET = 0x10,
757
    NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET = 0x11,
758
    NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME = 0x12,
759
    NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED = 0x13,
760
    NVME_CQE_SC_CMD_OVERLAPPING_RANGE = 0x14,
761
    NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY = 0x15,
762
    NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE = 0x16,
763
    NVME_CQE_SC_CMD_RESERVED_17H = 0x17,
764
    NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED = 0x18,
765
    NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE = 0x19,
766
    NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED = 0x1A,
767
    NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP = 0x1B,
768
    NVME_CQE_SC_CMD_INVALID_CNTRL_LIST = 0x1C,
769
    NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS = 0x1D,
770
    NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT = 0x1E,
771
    NVME_CQE_SC_CMD_INVALID_CNTRL_ID = 0x1F,
772
    NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE = 0x20,
773
    NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM = 0x21,
774
    NVME_CQE_SC_CMD_INVALID_RESOURSE_ID = 0x22,
775
    NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR = 0x23,
776
    NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID = 0x24,
777
    NVME_CQE_SC_CMD_ANA_ATTACH_FAILED = 0x25,
778
    NVME_CQE_SC_CMD_CONFLICTING_ATTRS = 0x80,
779
    NVME_CQE_SC_CMD_INVALID_PROTECTION_INF = 0x81,
780
    NVME_CQE_SC_CMD_WRITE_TO_RO_REGION = 0x82,
781
} nvme_cqe_sc_cmd_t;
782
783
typedef enum {
784
    NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT = 0x80,
785
    NVMEOF_CQE_SC_CMD_CONT_BUSY = 0x81,
786
    NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS = 0x82,
787
    NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC = 0x83,
788
    NVMEOF_CQE_SC_CMD_CNCT_INV_HOST = 0x84,
789
    NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE = 0x85,
790
    NVMEOF_CQE_SC_CMD_DISC_RESTART = 0x90,
791
    NVMEOF_CQE_SC_CMD_AUTH_REQ = 0x91,
792
} nvmeof_cqe_sc_cmd_t;
793
794
typedef enum {
795
    NVME_CQE_SC_MEDIA_WRITE_FAULT = 0x80,
796
    NVME_CQE_SC_MEDIA_READ_FAULT = 0x81,
797
    NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR = 0x82,
798
    NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR = 0x83,
799
    NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR = 0x84,
800
    NVME_CQE_SC_MEDIA_COMPARE_FAILURE = 0x85,
801
    NVME_CQE_SC_MEDIA_ACCESS_DENIED = 0x86,
802
    NVME_CQE_SC_MEDIA_DEALLOCATED_LBA = 0x87,
803
} nvme_cqe_sc_media_t;
804
805
typedef enum {
806
    NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR = 0x00,
807
    NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS = 0x01,
808
    NVME_CQE_SC_PATH_ANA_INACCESSIBLE = 0x02,
809
    NVME_CQE_SC_PATH_ANA_TRANSIENT = 0x03,
810
    NVME_CQE_SC_PATH_CNTRL_PATH_ERROR = 0x60,
811
    NVME_CQE_SC_PATH_HOST_PATH_ERROR = 0x70,
812
    NVME_CQE_SC_PATH_CMD_ABORT = 0x71,
813
} nvme_cqe_sc_path_t;
814
815
static const value_string nvme_cqe_sct_tbl[] = {
816
    { NVME_CQE_SCT_GENERIC, "Generic Command Status" },
817
    { NVME_CQE_SCT_COMMAND, "Command Specific Status" },
818
    { NVME_CQE_SCT_MEDIA, "Media and Data Integrity Errors" },
819
    { NVME_CQE_SCT_PATH, "Path Related Status" },
820
    { NVME_CQE_SCT_VENDOR, "Vendor Specific" },
821
    { 0, NULL },
822
};
823
824
static const value_string nvme_cqe_sc_gen_tbl[] = {
825
    { NVME_CQE_SC_GEN_CMD_OK, "Successful Completion" },
826
    { NVME_CQE_SC_CMD_INVALID_OPCODE, "Invalid opcode field" },
827
    { NVME_CQE_SC_GEN_CMD_INVALID_FIELD, "Invalid Field in Command" },
828
    { NVME_CQE_SC_GEN_CMD_CID_CONFLICT, "Command ID Conflict" },
829
    { NVME_CQE_SC_GEN_DATA_TRANSFER_ERR, "Data Transfer Error" },
830
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS, "Commands Aborted due to Power Loss Notification" },
831
    { NVME_CQE_SC_GEN_INTERNAL_ERROR, "Internal Error" },
832
    { NVME_CQE_SC_GEN_ABORT_REQUESTED, "Command Abort Requested" },
833
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE, "Command Aborted due to SQ Deletion" },
834
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE, "Command Aborted due to Failed Fused Command" },
835
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE, "Command Aborted due to Missing Fused Command" },
836
    { NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT, "Invalid Namespace or Format" },
837
    { NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR, "Command Sequence Error" },
838
    { NVME_CQE_SC_GEN_INVALID_SGL_SD, "Invalid SGL Segment Descriptor" },
839
    { NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM, "Invalid Number of SGL Descriptors" },
840
    { NVME_CQE_SC_GEN_INVALID_SGL_LEN, "Data SGL Length Invalid" },
841
    { NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN, "Metadata SGL Length Invalid" },
842
    { NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE, "SGL Descriptor Type Invalid" },
843
    { NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF, "Invalid Use of Controller Memory Buffer" },
844
    { NVME_CQE_SC_GEN_INVALID_PRP_OFFSET, "PRP Offset Invalid" },
845
    { NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED, "Atomic Write Unit Exceeded" },
846
    { NVME_CQE_SC_GEN_OPERATION_DENIED, "Operation Denied" },
847
    { NVME_CQE_SC_GEN_INVALID_SGL_OFFSET, "SGL Offset Invalid" },
848
    { NVME_CQE_SC_GEN_RESERVED_17H, "Reserved" },
849
    { NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT, "Host Identifier Inconsistent Format" },
850
    { NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED, "Keep Alive Timer Expired" },
851
    { NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID, "Keep Alive Timeout Invalid" },
852
    { NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT, "Command Aborted due to Preempt and Abort" },
853
    { NVME_CQE_SC_GEN_SANITIZE_FAILED, "Sanitize Failed" },
854
    { NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS,"Sanitize In Progress"  },
855
    { NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID, "SGL Data Block Granularity Invalid" },
856
    { NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB, "Command Not Supported for Queue in CMB" },
857
    { NVME_CQE_SC_GEN_NAMESPACE_IS_WP, "Namespace is Write Protected" },
858
    { NVME_CQE_SC_GEN_COMMAND_INTERRUPTED,"Command Interrupted" },
859
    { NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR, "Transient Transport Error"},
860
    { NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE, "LBA Out of Range" },
861
    { NVME_CQE_SC_GEN_CAPACITY_EXCEED, "Capacity Exceeded" },
862
    { NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY, "Namespace Not Ready" },
863
    { NVME_CQE_SC_GEN_RESERVATION_CONFLICT, "Reservation Conflict" },
864
    { NVME_CQE_SC_GEN_FMT_IN_PROGRESS, "Format In Progress"},
865
    { 0, NULL },
866
};
867
868
static const value_string nvme_cqe_sc_cmd_tbl[] = {
869
    { NVME_CQE_SC_CMD_INVALID_CQ, "Completion Queue Invalid" },
870
    { NVME_CQE_SC_CMD_INVALID_QID, "Invalid Queue Identifier" },
871
    { NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE, "Invalid Queue Size" },
872
    { NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED, "Abort Command Limit Exceeded" },
873
    { NVME_CQE_SC_CMD_RESERVED_4H, "Reserved" },
874
    { NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED, "Asynchronous Event Request Limit Exceeded" },
875
    { NVME_CQE_SC_CMD_INVALID_FW_SLOT, "Invalid Firmware Slot" },
876
    { NVME_CQE_SC_CMD_INVALID_FW_IMAGE, "Invalid Firmware Image" },
877
    { NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR, "Invalid Interrupt Vector" },
878
    { NVME_CQE_SC_CMD_INVALID_LOG_PAGE, "Invalid Log Page" },
879
    { NVME_CQE_SC_CMD_INVALID_FMT, "Invalid Format" },
880
    { NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET, "Firmware Activation Requires Conventional Reset" },
881
    { NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE, "Invalid Queue Deletion" },
882
    { NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE, "Feature Identifier Not Saveable" },
883
    { NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE, "Feature Not Changeable" },
884
    { NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE, "Feature Not Namespace Specific" },
885
    { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET, "Firmware Activation Requires NVM Subsystem Reset" },
886
    { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET, "Firmware Activation Requires Controller Level Reset" },
887
    { NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME, "Firmware Activation Requires Maximum Time Violation" },
888
    { NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED, "Firmware Activation Prohibited" },
889
    { NVME_CQE_SC_CMD_OVERLAPPING_RANGE, "Overlapping Range" },
890
    { NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY, "Namespace Insufficient Capacity" },
891
    { NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE, "Namespace Identifier Unavailable" },
892
    { NVME_CQE_SC_CMD_RESERVED_17H, "Reserved" },
893
    { NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED, "Namespace Already Attached" },
894
    { NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE, "Namespace Is Private" },
895
    { NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED, "Namespace Not Attached" },
896
    { NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP, "Thin Provisioning Not Supported" },
897
    { NVME_CQE_SC_CMD_INVALID_CNTRL_LIST, "Controller List Invalid" },
898
    { NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS, "Device Self-test In Progress" },
899
    { NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT, "Boot Partition Write Prohibited" },
900
    { NVME_CQE_SC_CMD_INVALID_CNTRL_ID, "Invalid Controller Identifier" },
901
    { NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE, "Invalid Secondary Controller State" },
902
    { NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM, "Invalid Number of Controller Resources" },
903
    { NVME_CQE_SC_CMD_INVALID_RESOURSE_ID, "Invalid Resource Identifier" },
904
    { NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR, "Sanitize Prohibited While Persistent Memory Region  is Enabled" },
905
    { NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID, "ANA Group Identifier Invalid" },
906
    { NVME_CQE_SC_CMD_ANA_ATTACH_FAILED, "ANA Attach Failed" },
907
    { NVME_CQE_SC_CMD_CONFLICTING_ATTRS, "Conflicting Attributes" },
908
    { NVME_CQE_SC_CMD_INVALID_PROTECTION_INF, "Invalid Protection Information" },
909
    { NVME_CQE_SC_CMD_WRITE_TO_RO_REGION, "Attempted Write to Read Only Range" },
910
    { 0, NULL },
911
};
912
913
static const value_string nvmeof_cqe_sc_cmd_tbl[] = {
914
    { NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT, "Incompatible Format" },
915
    { NVMEOF_CQE_SC_CMD_CONT_BUSY, "Controller Busy" },
916
    { NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS, "Connect Invalid Parameters" },
917
    { NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC, "Connect Restart Discovery" },
918
    { NVMEOF_CQE_SC_CMD_CNCT_INV_HOST, "Connect Invalid Host" },
919
    { NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE, "Invalid Queue Type" },
920
    { NVMEOF_CQE_SC_CMD_DISC_RESTART, "Discover Restart" },
921
    { NVMEOF_CQE_SC_CMD_AUTH_REQ, "Authentication Required" },
922
    { 0, NULL },
923
};
924
925
static const value_string nvme_cqe_sc_media_tbl[] = {
926
    { NVME_CQE_SC_MEDIA_WRITE_FAULT, "Write Fault" },
927
    { NVME_CQE_SC_MEDIA_READ_FAULT, "Unrecovered Read Error" },
928
    { NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR, "End-to-end Guard Check Error" },
929
    { NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR, "End-to-end Application Tag Check Error" },
930
    { NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR, "End-to-end Reference Tag Check Error" },
931
    { NVME_CQE_SC_MEDIA_COMPARE_FAILURE, "Compare Failure" },
932
    { NVME_CQE_SC_MEDIA_ACCESS_DENIED, "Access Denied" },
933
    { NVME_CQE_SC_MEDIA_DEALLOCATED_LBA, "Deallocated or Unwritten Logical Block" },
934
    { 0, NULL },
935
};
936
937
static const value_string nvme_cqe_sc_path_tbl[] = {
938
    { NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR, "Internal Path Error" },
939
    { NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS, "Asymmetric Access Persistent Loss" },
940
    { NVME_CQE_SC_PATH_ANA_INACCESSIBLE, "Asymmetric Access Inaccessible" },
941
    { NVME_CQE_SC_PATH_ANA_TRANSIENT, "Asymmetric Access Transition" },
942
    { NVME_CQE_SC_PATH_CNTRL_PATH_ERROR, "Controller Pathing Error" },
943
    { NVME_CQE_SC_PATH_HOST_PATH_ERROR, "Host Pathing Error" },
944
    { NVME_CQE_SC_PATH_CMD_ABORT, "Command Aborted By Host" },
945
    { 0, NULL },
946
};
947
948
static const value_string aq_opc_tbl[] = {
949
    { NVME_AQ_OPC_DELETE_SQ,     "Delete SQ"},
950
    { NVME_AQ_OPC_CREATE_SQ,     "Create SQ"},
951
    { NVME_AQ_OPC_GET_LOG_PAGE,  "Get Log Page"},
952
    { NVME_AQ_OPC_DELETE_CQ,     "Delete CQ"},
953
    { NVME_AQ_OPC_CREATE_CQ,     "Create CQ"},
954
    { NVME_AQ_OPC_IDENTIFY,      "Identify"},
955
    { NVME_AQ_OPC_ABORT,         "Abort"},
956
    { NVME_AQ_OPC_SET_FEATURES,  "Set Features"},
957
    { NVME_AQ_OPC_GET_FEATURES,  "Get Features"},
958
    { NVME_AQ_OPC_ASYNC_EVE_REQ, "Async Event Request"},
959
    { NVME_AQ_OPC_NS_MGMT,       "Namespace Management"},
960
    { NVME_AQ_OPC_FW_COMMIT,     "Firmware Commit"},
961
    { NVME_AQ_OPC_FW_IMG_DOWNLOAD, "Firmware Image Download"},
962
    { NVME_AQ_OPC_NS_ATTACH,     "Namespace attach"},
963
    { NVME_AQ_OPC_KEEP_ALIVE,    "Keep Alive"},
964
    { 0, NULL}
965
};
966
967
static const value_string ioq_opc_tbl[] = {
968
    { NVME_IOQ_OPC_FLUSH,         "Flush"},
969
    { NVME_IOQ_OPC_WRITE,         "Write"},
970
    { NVME_IOQ_OPC_READ,          "Read"},
971
    { NVME_IOQ_OPC_WRITE_UNCORRECTABLE, "Write Uncorrectable"},
972
    { NVME_IOQ_OPC_COMPARE,       "Compare"},
973
    { NVME_IOQ_OPC_WRITE_ZEROS,   "Write Zero"},
974
    { NVME_IOQ_OPC_DATASET_MGMT,  "Dataset Management"},
975
    { NVME_IOQ_OPC_RESV_REG,      "Reserve Register"},
976
    { NVME_IOQ_OPC_RESV_REPORT,   "Reserve Report"},
977
    { NVME_IOQ_OPC_RESV_ACQUIRE,  "Reserve Acquire"},
978
    { NVME_IOQ_OPC_RESV_RELEASE,  "Reserve Release"},
979
    { 0, NULL}
980
};
981
982
0
#define NVME_CMD_SGL_DATA_DESC          0x0
983
2
#define NVME_CMD_SGL_BIT_BUCKET_DESC    0x1
984
0
#define NVME_CMD_SGL_SEGMENT_DESC       0x2
985
0
#define NVME_CMD_SGL_LAST_SEGMENT_DESC  0x3
986
0
#define NVME_CMD_SGL_KEYED_DATA_DESC    0x4
987
0
#define NVME_CMD_SGL_VENDOR_DESC        0xf
988
989
static const value_string sgl_type_tbl[] = {
990
    { NVME_CMD_SGL_DATA_DESC,         "Data Block"},
991
    { NVME_CMD_SGL_BIT_BUCKET_DESC,   "Bit Bucket"},
992
    { NVME_CMD_SGL_SEGMENT_DESC,      "Segment"},
993
    { NVME_CMD_SGL_LAST_SEGMENT_DESC, "Last Segment"},
994
    { NVME_CMD_SGL_KEYED_DATA_DESC,   "Keyed Data Block"},
995
    { NVME_CMD_SGL_VENDOR_DESC,       "Vendor Specific"},
996
    { 0, NULL}
997
};
998
999
#define NVME_CMD_SGL_SUB_DESC_ADDR      0x0
1000
#define NVME_CMD_SGL_SUB_DESC_OFFSET    0x1
1001
#define NVME_CMD_SGL_SUB_DESC_TRANSPORT 0xf
1002
1003
static const value_string sgl_sub_type_tbl[] = {
1004
    { NVME_CMD_SGL_SUB_DESC_ADDR,      "Address"},
1005
    { NVME_CMD_SGL_SUB_DESC_OFFSET,    "Offset"},
1006
    { NVME_CMD_SGL_SUB_DESC_TRANSPORT, "Transport specific"},
1007
    { 0, NULL}
1008
};
1009
1010
1011
static const value_string cns_table[] = {
1012
    { 0, "Namespace"},
1013
    { 1, "Controller"},
1014
    { 2, "Active Namespace List"},
1015
    { 3, "Namespace Identification Descriptor"},
1016
    {4, "NVM Set List"},
1017
    {0x10, "Allocated Namespace ID List"},
1018
    {0x11, "Namespace Data Structure"},
1019
    {0x12, "Controller List Attached to NSID"},
1020
    {0x13, "Existing Controllers List"},
1021
    {0x14, "Primary Controller Capabilities"},
1022
    {0x15, "Secondary Controller List"},
1023
    {0x16, "Namespace Granularity List"},
1024
    {0x17, "UUID List"},
1025
    {0, NULL}
1026
};
1027
1028
static const value_string dsm_acc_freq_tbl[] = {
1029
    { 0, "No frequency"},
1030
    { 1, "Typical"},
1031
    { 2, "Infrequent Read/Write"},
1032
    { 3, "Infrequent Writes, Frequent Reads"},
1033
    { 4, "Frequent Writes, Infrequent Reads"},
1034
    { 5, "Frequent Read/Write"},
1035
    { 6, "One time read"},
1036
    { 7, "Speculative read"},
1037
    { 8, "Likely tobe overwritten"},
1038
    { 0, NULL}
1039
};
1040
1041
static const value_string dsm_acc_lat_tbl[] = {
1042
    { 0, "None"},
1043
    { 1, "Idle (Longer)"},
1044
    { 2, "Normal (Typical)"},
1045
    { 3, "Low (Smallest)"},
1046
    { 0, NULL}
1047
};
1048
1049
1050
void
1051
nvme_publish_qid(proto_tree *tree, int field_index, uint16_t qid)
1052
0
{
1053
0
    proto_item *cmd_ref_item;
1054
1055
0
    cmd_ref_item = proto_tree_add_uint_format_value(tree, field_index, NULL,
1056
0
                       0, 0, qid,
1057
0
                     qid ? "%d (IOQ)" : "%d (AQ)",
1058
0
                                     qid);
1059
1060
0
    proto_item_set_generated(cmd_ref_item);
1061
0
}
1062
1063
static void nvme_build_pending_cmd_key(wmem_tree_key_t *cmd_key, uint32_t *key)
1064
3
{
1065
3
    cmd_key[0].length = 1;
1066
3
    cmd_key[0].key = key;
1067
3
    cmd_key[1].length = 0;
1068
3
    cmd_key[1].key = NULL;
1069
3
}
1070
1071
static void
1072
nvme_build_done_frame_key(wmem_tree_key_t *cmd_key, uint32_t *key, uint32_t *frame)
1073
0
{
1074
0
    unsigned idx = 0;
1075
0
    if (key) {
1076
0
        cmd_key[0].length = 1;
1077
0
        cmd_key[0].key = key;
1078
0
        idx = 1;
1079
0
    }
1080
0
    cmd_key[idx].length = 1;
1081
0
    cmd_key[idx].key = frame;
1082
0
    idx++;
1083
1084
0
    cmd_key[idx].length = 0;
1085
0
    cmd_key[idx].key = NULL;
1086
0
}
1087
1088
void
1089
nvme_add_cmd_to_pending_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx,
1090
                             struct nvme_cmd_ctx *cmd_ctx,
1091
                             void *ctx, uint16_t cmd_id)
1092
3
{
1093
3
    wmem_tree_key_t cmd_key[3];
1094
3
    uint32_t key = cmd_id;
1095
1096
3
    cmd_ctx->cmd_pkt_num = pinfo->num;
1097
3
    cmd_ctx->cqe_pkt_num = 0;
1098
3
    cmd_ctx->cmd_start_time = pinfo->abs_ts;
1099
3
    nstime_set_zero(&cmd_ctx->cmd_end_time);
1100
1101
    /* this is a new cmd, create a new command context and map it to the
1102
       unmatched table
1103
     */
1104
3
    nvme_build_pending_cmd_key(cmd_key, &key);
1105
3
    wmem_tree_insert32_array(q_ctx->pending_cmds, cmd_key, (void *)ctx);
1106
3
}
1107
1108
void* nvme_lookup_cmd_in_pending_list(struct nvme_q_ctx *q_ctx, uint16_t cmd_id)
1109
0
{
1110
0
    wmem_tree_key_t cmd_key[3];
1111
0
    uint32_t key = cmd_id;
1112
1113
0
    nvme_build_pending_cmd_key(cmd_key, &key);
1114
0
    return wmem_tree_lookup32_array(q_ctx->pending_cmds, cmd_key);
1115
0
}
1116
1117
1118
static void nvme_build_pending_transfer_key(wmem_tree_key_t *key, struct keyed_data_req *req)
1119
0
{
1120
0
    key[0].length = 2;
1121
0
    key[0].key = (uint32_t *)&req->addr;
1122
0
    key[1].length = 1;
1123
0
    key[1].key = &req->key;
1124
0
    key[2].length = 1;
1125
0
    key[2].key = &req->size;
1126
0
    key[3].length = 0;
1127
0
    key[3].key = NULL;
1128
0
}
1129
1130
void nvme_add_data_request(struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx,
1131
                                        struct keyed_data_req *req)
1132
0
{
1133
0
    wmem_tree_key_t tr_key[4];
1134
1135
0
    memset(cmd_ctx->data_tr_pkt_num, 0, sizeof(cmd_ctx->data_tr_pkt_num));
1136
0
    nvme_build_pending_transfer_key(tr_key, req);
1137
0
    wmem_tree_insert32_array(q_ctx->data_requests, tr_key, (void *)cmd_ctx);
1138
0
}
1139
1140
struct nvme_cmd_ctx* nvme_lookup_data_request(struct nvme_q_ctx *q_ctx,
1141
                                        struct keyed_data_req *req)
1142
0
{
1143
0
    wmem_tree_key_t tr_key[4];
1144
1145
0
    nvme_build_pending_transfer_key(tr_key, req);
1146
0
    return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_requests, tr_key);
1147
0
}
1148
1149
void
1150
nvme_add_data_tr_pkt(struct nvme_q_ctx *q_ctx,
1151
                       struct nvme_cmd_ctx *cmd_ctx, uint32_t rkey, uint32_t frame_num)
1152
0
{
1153
0
    wmem_tree_key_t cmd_key[3];
1154
1155
0
    nvme_build_done_frame_key(cmd_key, rkey ? &rkey : NULL, &frame_num);
1156
0
    wmem_tree_insert32_array(q_ctx->data_responses, cmd_key, (void*)cmd_ctx);
1157
0
}
1158
1159
struct nvme_cmd_ctx*
1160
nvme_lookup_data_tr_pkt(struct nvme_q_ctx *q_ctx,
1161
                          uint32_t rkey, uint32_t frame_num)
1162
0
{
1163
0
    wmem_tree_key_t cmd_key[3];
1164
1165
0
    nvme_build_done_frame_key(cmd_key, rkey ? &rkey : NULL, &frame_num);
1166
0
    return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_responses, cmd_key);
1167
0
}
1168
1169
void
1170
nvme_add_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t off, uint32_t frame_num)
1171
0
{
1172
0
    wmem_tree_key_t cmd_key[2];
1173
1174
0
    nvme_build_done_frame_key(cmd_key, NULL, &frame_num);
1175
0
    wmem_tree_insert32_array(q_ctx->data_offsets, cmd_key, GUINT_TO_POINTER(off));
1176
0
}
1177
1178
uint32_t
1179
nvme_lookup_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t frame_num)
1180
0
{
1181
0
    wmem_tree_key_t cmd_key[2];
1182
1183
0
    nvme_build_done_frame_key(cmd_key, NULL, &frame_num);
1184
0
    return GPOINTER_TO_UINT(wmem_tree_lookup32_array(q_ctx->data_offsets, cmd_key));
1185
0
}
1186
1187
void
1188
nvme_add_cmd_cqe_to_done_list(struct nvme_q_ctx *q_ctx,
1189
                              struct nvme_cmd_ctx *cmd_ctx, uint16_t cmd_id)
1190
0
{
1191
0
    wmem_tree_key_t cmd_key[3];
1192
0
    uint32_t key = cmd_id;
1193
0
    uint32_t frame_num;
1194
1195
0
    nvme_build_done_frame_key(cmd_key, &key, &frame_num);
1196
1197
    /* found matching entry. Add entries to the matched table for both cmd and cqe.
1198
     */
1199
0
    frame_num = cmd_ctx->cqe_pkt_num;
1200
0
    wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx);
1201
1202
0
    frame_num = cmd_ctx->cmd_pkt_num;
1203
0
    wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx);
1204
0
}
1205
1206
void*
1207
nvme_lookup_cmd_in_done_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx,
1208
                             uint16_t cmd_id)
1209
0
{
1210
0
    wmem_tree_key_t cmd_key[3];
1211
0
    uint32_t key = cmd_id;
1212
0
    uint32_t frame_num = pinfo->num;
1213
1214
0
    nvme_build_done_frame_key(cmd_key, &key, &frame_num);
1215
1216
0
    return wmem_tree_lookup32_array(q_ctx->done_cmds, cmd_key);
1217
0
}
1218
1219
void
1220
nvme_publish_cmd_latency(proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx,
1221
                         int field_index)
1222
0
{
1223
0
    proto_item *cmd_ref_item;
1224
0
    nstime_t ns;
1225
0
    double cmd_latency;
1226
1227
0
    nstime_delta(&ns, &cmd_ctx->cmd_end_time, &cmd_ctx->cmd_start_time);
1228
0
    cmd_latency = nstime_to_msec(&ns);
1229
0
    cmd_ref_item = proto_tree_add_double_format_value(tree, field_index,
1230
0
                            NULL, 0, 0, cmd_latency,
1231
0
                            "%.3f ms", cmd_latency);
1232
0
    proto_item_set_generated(cmd_ref_item);
1233
0
}
1234
1235
void nvme_update_cmd_end_info(packet_info *pinfo, struct nvme_cmd_ctx *cmd_ctx)
1236
0
{
1237
0
    cmd_ctx->cmd_end_time = pinfo->abs_ts;
1238
0
    cmd_ctx->cqe_pkt_num = pinfo->num;
1239
0
}
1240
1241
void
1242
nvme_publish_link(proto_tree *tree, tvbuff_t *tvb, int hf_index,
1243
                                       uint32_t pkt_no, bool zero_ok)
1244
54
{
1245
54
    proto_item *ref_item;
1246
1247
54
    if (pkt_no || zero_ok) {
1248
0
        ref_item = proto_tree_add_uint(tree, hf_index,
1249
0
                                 tvb, 0, 0, pkt_no);
1250
0
        proto_item_set_generated(ref_item);
1251
0
    }
1252
54
}
1253
1254
void
1255
nvme_publish_to_cmd_link(proto_tree *tree, tvbuff_t *tvb,
1256
                          int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1257
0
{
1258
0
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cmd_pkt_num, true);
1259
0
}
1260
1261
void
1262
nvme_publish_to_cqe_link(proto_tree *tree, tvbuff_t *tvb,
1263
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1264
3
{
1265
3
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cqe_pkt_num, false);
1266
3
}
1267
1268
void
1269
nvme_publish_to_data_req_link(proto_tree *tree, tvbuff_t *tvb,
1270
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1271
3
{
1272
3
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_req_pkt_num, false);
1273
3
}
1274
1275
static void
1276
nvme_publish_to_data_tr_links(proto_tree *tree, tvbuff_t *tvb,
1277
                             int *index_arr, struct nvme_cmd_ctx *cmd_ctx)
1278
3
{
1279
3
    unsigned i;
1280
51
    for (i = 0; i < NVME_CMD_MAX_TRS; i++)
1281
48
        nvme_publish_link(tree, tvb, index_arr[i], cmd_ctx->data_tr_pkt_num[i], false);
1282
3
}
1283
1284
void nvme_publish_to_data_resp_link(proto_tree *tree, tvbuff_t *tvb,
1285
                             int hf_index, struct nvme_cmd_ctx *cmd_ctx)
1286
0
{
1287
0
    nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_tr_pkt_num[0], false);
1288
0
}
1289
1290
void dissect_nvme_cmd_sgl(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
1291
                          int field_index, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned cmd_off, bool visited)
1292
3
{
1293
3
    proto_item *ti, *sgl_tree, *type_item, *sub_type_item;
1294
3
    uint8_t sgl_identifier, desc_type, desc_sub_type;
1295
3
    int offset = 24 + cmd_off;
1296
1297
3
    ti = proto_tree_add_item(cmd_tree, field_index, cmd_tvb, offset,
1298
3
                             16, ENC_NA);
1299
3
    sgl_tree = proto_item_add_subtree(ti, ett_data);
1300
1301
3
    sgl_identifier = tvb_get_uint8(cmd_tvb, offset + 15);
1302
3
    desc_type = (sgl_identifier & 0xff) >> 4;
1303
3
    desc_sub_type = sgl_identifier & 0x0f;
1304
1305
3
    type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_type,
1306
3
                                    cmd_tvb, offset + 15, 1, ENC_LITTLE_ENDIAN);
1307
3
    proto_item_append_text(type_item, " %s",
1308
3
                           val_to_str_const(desc_type, sgl_type_tbl, "Reserved"));
1309
1310
3
    sub_type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_sub_type,
1311
3
                                        cmd_tvb,
1312
3
                                        offset + 15, 1, ENC_LITTLE_ENDIAN);
1313
3
    proto_item_append_text(sub_type_item, " %s",
1314
3
                           val_to_str_const(desc_sub_type, sgl_sub_type_tbl, "Reserved"));
1315
1316
3
    switch (desc_type) {
1317
0
    case NVME_CMD_SGL_DATA_DESC:
1318
0
    case NVME_CMD_SGL_LAST_SEGMENT_DESC:
1319
0
    case NVME_CMD_SGL_SEGMENT_DESC:
1320
0
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb,
1321
0
                            offset, 8, ENC_LITTLE_ENDIAN);
1322
0
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1323
0
                            offset + 8, 4, ENC_LITTLE_ENDIAN);
1324
0
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb,
1325
0
                            offset + 12, 3, ENC_NA);
1326
0
        break;
1327
2
    case NVME_CMD_SGL_BIT_BUCKET_DESC:
1328
2
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr_rsvd, cmd_tvb,
1329
2
                            offset, 8, ENC_LITTLE_ENDIAN);
1330
2
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1331
2
                            offset + 8, 4, ENC_LITTLE_ENDIAN);
1332
2
        proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb,
1333
2
                            offset + 12, 3, ENC_NA);
1334
2
        break;
1335
0
    case NVME_CMD_SGL_KEYED_DATA_DESC:
1336
0
    {
1337
0
        struct keyed_data_req req;
1338
0
        proto_tree_add_item_ret_uint64(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb,
1339
0
                            offset, 8, ENC_LITTLE_ENDIAN, &req.addr);
1340
0
        proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb,
1341
0
                            offset + 8, 3, ENC_LITTLE_ENDIAN, &req.size);
1342
0
        proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_key, cmd_tvb,
1343
0
                            offset + 11, 4, ENC_LITTLE_ENDIAN, &req.key);
1344
0
        if (!visited && cmd_ctx && q_ctx && q_ctx->data_requests)
1345
0
            nvme_add_data_request(q_ctx, cmd_ctx, &req);
1346
0
        break;
1347
0
    }
1348
0
    case NVME_CMD_SGL_VENDOR_DESC:
1349
1
    default:
1350
1
        break;
1351
3
    }
1352
3
}
1353
1354
static void
1355
dissect_nvme_rwc_common_word_10_11_12_14_15(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
1356
0
{
1357
0
    proto_item *ti, *prinfo_tree;
1358
0
    uint16_t num_lba;
1359
1360
    /* word 10, 11 */
1361
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_slba, cmd_tvb,
1362
0
                        40, 8, ENC_LITTLE_ENDIAN);
1363
    /* add 1 for readability, as its zero based value */
1364
0
    num_lba = tvb_get_uint16(cmd_tvb, 48, ENC_LITTLE_ENDIAN) + 1;
1365
1366
    /* word 12 */
1367
0
    proto_tree_add_uint(cmd_tree, hf_nvme_cmd_nlb,
1368
0
                        cmd_tvb, 48, 2, num_lba);
1369
1370
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd2, cmd_tvb,
1371
0
                        50, 2, ENC_LITTLE_ENDIAN);
1372
1373
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_prinfo, cmd_tvb, 50,
1374
0
                             2, ENC_LITTLE_ENDIAN);
1375
0
    prinfo_tree = proto_item_add_subtree(ti, ett_data);
1376
1377
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_lbrtag, cmd_tvb,
1378
0
                        50, 2, ENC_LITTLE_ENDIAN);
1379
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_apptag, cmd_tvb,
1380
0
                        50, 2, ENC_LITTLE_ENDIAN);
1381
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_guard, cmd_tvb,
1382
0
                        50, 2, ENC_LITTLE_ENDIAN);
1383
0
    proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_pract, cmd_tvb,
1384
0
                        50, 2, ENC_LITTLE_ENDIAN);
1385
1386
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_fua, cmd_tvb,
1387
0
                        50, 2, ENC_LITTLE_ENDIAN);
1388
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_lr, cmd_tvb,
1389
0
                        50, 2, ENC_LITTLE_ENDIAN);
1390
1391
    /* word 14, 15 */
1392
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_eilbrt, cmd_tvb,
1393
0
                        56, 4, ENC_LITTLE_ENDIAN);
1394
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbat, cmd_tvb,
1395
0
                        60, 2, ENC_LITTLE_ENDIAN);
1396
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbatm, cmd_tvb,
1397
0
                        62, 2, ENC_LITTLE_ENDIAN);
1398
0
}
1399
1400
static void dissect_nvme_identify_ns_lbafs(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
1401
0
{
1402
0
    proto_item *ti, *lbafs_tree, *item;
1403
0
    int lbaf_off, i;
1404
0
    uint8_t nlbaf, lbads;
1405
0
    uint16_t ms;
1406
0
    uint32_t lbaf_raw;
1407
1408
0
    nlbaf = tvb_get_uint8(cmd_tvb, 25) + 1; // +1 for zero-base value
1409
1410
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_lbafs, cmd_tvb,
1411
0
                             128, 64, ENC_NA);
1412
0
    lbafs_tree = proto_item_add_subtree(ti, ett_data);
1413
1414
0
    for (i = 0; i < nlbaf; i++) {
1415
0
        lbaf_off = 128 + i * 4;
1416
1417
0
        lbaf_raw = tvb_get_uint32(cmd_tvb, lbaf_off, ENC_LITTLE_ENDIAN);
1418
0
        ms = lbaf_raw & 0xFF;
1419
0
        lbads = (lbaf_raw >> 16) & 0xF;
1420
0
        item = proto_tree_add_item(lbafs_tree, hf_nvme_identify_ns_lbaf,
1421
0
                                   cmd_tvb, lbaf_off, 4, ENC_LITTLE_ENDIAN);
1422
0
        proto_item_set_text(item, "LBAF%d: lbads %d ms %d", i, lbads, ms);
1423
0
    }
1424
0
}
1425
1426
static void dissect_nvme_identify_ns_resp(tvbuff_t *cmd_tvb,
1427
                                            proto_tree *cmd_tree, unsigned off, unsigned len)
1428
0
{
1429
0
    proto_item *ti;
1430
0
    unsigned start;
1431
0
    if (!off) {
1432
        /* minimal MTU fits this block */
1433
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsze, cmd_tvb,
1434
0
                        0, 8, ENC_LITTLE_ENDIAN);
1435
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_ncap, cmd_tvb,
1436
0
                        8, 8, ENC_LITTLE_ENDIAN);
1437
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nuse, cmd_tvb,
1438
0
                        16, 8, ENC_LITTLE_ENDIAN);
1439
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsfeat, cmd_tvb,
1440
0
                        24, 1, ENC_LITTLE_ENDIAN);
1441
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nlbaf, cmd_tvb,
1442
0
                        25, 1, ENC_LITTLE_ENDIAN);
1443
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_flbas, cmd_tvb,
1444
0
                        26, 1, ENC_LITTLE_ENDIAN);
1445
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mc, cmd_tvb,
1446
0
                        27, 1, ENC_LITTLE_ENDIAN);
1447
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dpc, cmd_tvb,
1448
0
                        28, 1, ENC_LITTLE_ENDIAN);
1449
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dps, cmd_tvb,
1450
0
                        29, 1, ENC_LITTLE_ENDIAN);
1451
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nmic, cmd_tvb,
1452
0
                        30, 1, ENC_LITTLE_ENDIAN);
1453
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nguid, cmd_tvb,
1454
0
                        104, 16, ENC_NA);
1455
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_eui64, cmd_tvb,
1456
0
                        120, 8, ENC_NA);
1457
1458
0
        dissect_nvme_identify_ns_lbafs(cmd_tvb, cmd_tree);
1459
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd, cmd_tvb,
1460
0
                        192, 192, ENC_NA);
1461
0
    }
1462
0
    if (off >= 384)
1463
0
        start = 0;
1464
0
    else
1465
0
        start = 384 - off;
1466
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_vs, cmd_tvb,
1467
0
                        start, len - start, ENC_NA);
1468
0
    proto_item_append_text(ti, " (offset %u)", (off <= 384) ? 0 : off-384);
1469
0
}
1470
1471
static void dissect_nvme_identify_nslist_resp(tvbuff_t *cmd_tvb,
1472
                                              proto_tree *cmd_tree, unsigned off, unsigned len)
1473
0
{
1474
0
    uint32_t nsid;
1475
0
    proto_item *item;
1476
0
    unsigned done = 0;
1477
1478
0
    for (; off < 4096 && (done + 4) <= len; off += 4) {
1479
0
        nsid = tvb_get_uint32(cmd_tvb, done, ENC_LITTLE_ENDIAN);
1480
0
        if (nsid == 0)
1481
0
            break;
1482
1483
0
        item = proto_tree_add_item(cmd_tree, hf_nvme_identify_nslist_nsid,
1484
0
                                   cmd_tvb, done, 4, ENC_LITTLE_ENDIAN);
1485
0
        proto_item_set_text(item, "nsid[%u]: %u", off / 4, nsid);
1486
0
        done += 4;
1487
0
    }
1488
0
}
1489
1490
0
#define ASPEC(_x_) _x_, array_length(_x_)
1491
1492
static void add_group_mask_entry(tvbuff_t *tvb, proto_tree *tree, unsigned offset, unsigned bytes, int *array, unsigned array_len)
1493
0
{
1494
0
    proto_item *ti;
1495
0
    proto_tree *grp;
1496
0
    unsigned i;
1497
1498
0
    ti = proto_tree_add_item(tree, array[0], tvb, offset, bytes, ENC_LITTLE_ENDIAN);
1499
0
    grp =  proto_item_add_subtree(ti, ett_data);
1500
1501
0
    for (i = 1; i < array_len; i++)
1502
0
        proto_tree_add_item(grp, array[i], tvb, offset, bytes, ENC_LITTLE_ENDIAN);
1503
0
}
1504
1505
static void add_ctrl_x16_bytes( char *result, uint32_t val)
1506
0
{
1507
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u bytes)", val, val * 16);
1508
0
}
1509
1510
static void dissect_nvme_identify_ctrl_resp_nvmeof(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
1511
0
{
1512
0
    proto_item *ti;
1513
0
    proto_tree *grp;
1514
1515
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nvmeof, cmd_tvb, 1792-off, 256, ENC_NA);
1516
0
    grp =  proto_item_add_subtree(ti, ett_data);
1517
1518
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_ioccsz, cmd_tvb, 1792-off, 4, ENC_LITTLE_ENDIAN);
1519
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_iorcsz, cmd_tvb, 1796-off, 4, ENC_LITTLE_ENDIAN);
1520
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_icdoff, cmd_tvb, 1800-off, 2, ENC_LITTLE_ENDIAN);
1521
1522
0
    add_group_mask_entry(cmd_tvb, grp, 1802-off, 1, ASPEC(hf_nvme_identify_ctrl_nvmeof_fcatt));
1523
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_msdbd, cmd_tvb, 1803-off, 1, ENC_LITTLE_ENDIAN);
1524
0
    add_group_mask_entry(cmd_tvb, grp, 1804-off, 2, ASPEC(hf_nvme_identify_ctrl_nvmeof_ofcs));
1525
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_rsvd, cmd_tvb, 1806-off, 242, ENC_NA);
1526
0
}
1527
1528
1529
static const true_false_string units_watts = {
1530
    "1 (0.0001 Watt units)",
1531
    "0 (0.01 Watt units)"
1532
};
1533
1534
1535
static const value_string power_scale_tbl[] = {
1536
    { 0, "not reported for this power state" },
1537
    { 1, "0.0001 Watt units" },
1538
    { 2, "0.01 Watt units" },
1539
    { 3,  "reserved value" },
1540
    { 0, NULL}
1541
};
1542
1543
static void dissect_nvme_identify_ctrl_resp_power_state_descriptor(tvbuff_t *cmd_tvb, proto_tree *tree, uint8_t idx, uint32_t off)
1544
0
{
1545
0
    proto_item *ti;
1546
0
    proto_tree *grp;
1547
1548
0
    off = 2048 - off + idx *32;
1549
0
    ti = proto_tree_add_bytes_format(tree, hf_nvme_identify_ctrl_psd, cmd_tvb, off, 32, NULL,
1550
0
                                           "Power State %u Descriptor (PSD%u)", idx, idx);
1551
0
    grp =  proto_item_add_subtree(ti, ett_data);
1552
1553
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mp, cmd_tvb, off, 2, ENC_LITTLE_ENDIAN);
1554
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd0, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN);
1555
1556
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mxps, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
1557
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_nops, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
1558
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd1, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
1559
1560
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_enlat, cmd_tvb, off+4, 4, ENC_LITTLE_ENDIAN);
1561
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_exlat, cmd_tvb, off+8, 4, ENC_LITTLE_ENDIAN);
1562
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrt, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN);
1563
1564
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd2, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN);
1565
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrl, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN);
1566
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd3, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN);
1567
1568
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwt, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN);
1569
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd4, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN);
1570
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwl, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN);
1571
1572
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd5, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN);
1573
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_idlp, cmd_tvb, off+16, 2, ENC_LITTLE_ENDIAN);
1574
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd6, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN);
1575
1576
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_ips, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN);
1577
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd7, cmd_tvb, off+19, 1, ENC_LITTLE_ENDIAN);
1578
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_actp, cmd_tvb, off+20, 2, ENC_LITTLE_ENDIAN);
1579
1580
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_apw, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
1581
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd8, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
1582
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_aps, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN);
1583
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd9, cmd_tvb, off+23, 9, ENC_NA);
1584
0
}
1585
1586
static void dissect_nvme_identify_ctrl_resp_power_state_descriptors(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
1587
0
{
1588
0
    proto_item *ti;
1589
0
    proto_tree *grp;
1590
0
    unsigned i;
1591
1592
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_psds, cmd_tvb, 2048-off, 1024, ENC_NA);
1593
0
    grp =  proto_item_add_subtree(ti, ett_data);
1594
0
    for (i = 0; i < 32; i++)
1595
0
        dissect_nvme_identify_ctrl_resp_power_state_descriptor(cmd_tvb, grp, i, off);
1596
0
}
1597
1598
1599
static void add_ctrl_rab(char *result, uint32_t val)
1600
0
{
1601
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" command%s)", val, ((uint64_t)1) << val, val ? "s" : "");
1602
0
}
1603
1604
static void add_ctrl_mdts(char *result, uint32_t val)
1605
0
{
1606
0
    if (val)
1607
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" pages)", val, ((uint64_t)1) << val);
1608
0
    else
1609
0
        snprintf(result, ITEM_LABEL_LENGTH, "0x%x (unlimited)", val);
1610
0
}
1611
1612
static void add_ctrl_rtd3(char *result, uint32_t val)
1613
0
{
1614
0
    if (!val)
1615
0
        snprintf(result, ITEM_LABEL_LENGTH, "0 (not reported)");
1616
0
    else
1617
0
        snprintf(result, ITEM_LABEL_LENGTH, "%u (%u microsecond%s)", val, val, (val > 1) ? "%s" : "");
1618
0
}
1619
1620
static const value_string ctrl_type_tbl[] = {
1621
    { 0,  "Reserved (not reported)" },
1622
    { 1,  "I/O Controller" },
1623
    { 2,  "Discovery Controller" },
1624
    { 3,  "Administrative Controller" },
1625
    { 0, NULL}
1626
};
1627
1628
static void add_ctrl_ms(char *result, uint32_t val)
1629
0
{
1630
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u (%u ms)", val, val * 100);
1631
0
}
1632
1633
static void dissect_nvme_identify_ctrl_resp_ver(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
1634
0
{
1635
0
    proto_item *ti;
1636
0
    proto_tree *grp;
1637
1638
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ver, cmd_tvb,  80-off, 4, ENC_LITTLE_ENDIAN);
1639
0
    grp =  proto_item_add_subtree(ti, ett_data);
1640
1641
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_mjr, cmd_tvb, 82-off, 2, ENC_LITTLE_ENDIAN);
1642
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_min, cmd_tvb, 81-off, 1, ENC_LITTLE_ENDIAN);
1643
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_ter, cmd_tvb, 80-off, 1, ENC_LITTLE_ENDIAN);
1644
0
}
1645
1646
static void dissect_nvme_identify_ctrl_resp_fguid(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
1647
0
{
1648
0
    proto_item *ti;
1649
0
    proto_tree *grp;
1650
1651
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fguid, cmd_tvb, 112-off, 16, ENC_NA);
1652
0
    grp =  proto_item_add_subtree(ti, ett_data);
1653
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_vse, cmd_tvb, 112-off, 8, ENC_LITTLE_ENDIAN);
1654
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_oui, cmd_tvb, 120-off, 3, ENC_LITTLE_ENDIAN);
1655
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_ei, cmd_tvb, 123-off, 5, ENC_LITTLE_ENDIAN);
1656
0
}
1657
1658
static void dissect_nvme_identify_ctrl_resp_mi(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off)
1659
0
{
1660
0
    proto_item *ti;
1661
0
    proto_tree *grp;
1662
1663
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mi, cmd_tvb, 240-off, 16, ENC_NA);
1664
0
    grp =  proto_item_add_subtree(ti, ett_data);
1665
0
    proto_tree_add_item(grp, hf_nvme_identify_ctrl_mi_rsvd, cmd_tvb, 240-off, 13, ENC_NA);
1666
0
    add_group_mask_entry(cmd_tvb, grp, 253-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_nvmsr));
1667
0
    add_group_mask_entry(cmd_tvb, grp, 254-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_vwci));
1668
0
    add_group_mask_entry(cmd_tvb, grp, 255-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_mec));
1669
0
}
1670
1671
static void add_ctrl_commands(char *result, uint32_t val)
1672
0
{
1673
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u command%s)", val, val+1, val ? "s" : "");
1674
0
}
1675
1676
static void add_ctrl_events(char *result, uint32_t val)
1677
0
{
1678
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u event%s)", val, val+1, val ? "s" : "");
1679
0
}
1680
1681
static void add_ctrl_entries(char *result, uint32_t val)
1682
0
{
1683
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u entr%s)", val, val+1, val ? "ies" : "y");
1684
0
}
1685
1686
static void add_ctrl_states(char *result, uint32_t val)
1687
0
{
1688
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u state%s)", val, val+1, val ? "s" : "");
1689
0
}
1690
1691
static void add_ctrl_hmpre(char *result, uint32_t val)
1692
0
{
1693
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" bytes)", val, ((uint64_t)(val)) * 4096);
1694
0
}
1695
1696
static void post_add_bytes_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off, uint8_t shiftl)
1697
0
{
1698
0
    uint64_t lo = tvb_get_uint64(tvb, off, 0);
1699
0
    uint64_t hi = tvb_get_uint64(tvb, off, 8);
1700
1701
0
    if (shiftl) {
1702
0
        hi = hi << shiftl;
1703
0
        hi |= (lo >> (64-shiftl));
1704
0
        lo = lo << shiftl;
1705
0
    }
1706
0
    if (hi) {
1707
0
        if (!(hi >> 10))
1708
0
            proto_item_append_text(ti, " (%" PRIu64 " KiB)", (hi << 54) | (lo >> 10));
1709
0
        else if (!(hi >> 20))
1710
0
            proto_item_append_text(ti, " (%" PRIu64 " MiB)", (hi << 44) | (lo >> 20));
1711
0
        else if (!(hi >> 30))
1712
0
            proto_item_append_text(ti, " (%" PRIu64 " GiB)", (hi << 34) | (lo >> 30));
1713
0
        else if (!(hi >> 40))
1714
0
            proto_item_append_text(ti, " (%" PRIu64 " TiB)", (hi << 24) | (lo >> 40));
1715
0
        else if (!(hi >> 50))
1716
0
            proto_item_append_text(ti, " (%" PRIu64 " PiB)", (hi << 14) | (lo >> 50));
1717
0
        else if (!(hi >> 60))
1718
0
            proto_item_append_text(ti, " (%" PRIu64 " EiB)", (hi << 4) | (lo >> 60));
1719
0
        else
1720
0
            proto_item_append_text(ti, " (%" PRIu64 " ZiB)", hi >> 6);
1721
0
    } else {
1722
0
        proto_item_append_text(ti, " (%" PRIu64 " bytes)", lo);
1723
0
    }
1724
0
}
1725
1726
static void add_ctrl_tmt(char *result, uint32_t val)
1727
0
{
1728
0
    if (!val)
1729
0
        snprintf(result, ITEM_LABEL_LENGTH, "0 (not supported)");
1730
0
    else
1731
0
        snprintf(result, ITEM_LABEL_LENGTH, "%u degrees K", val);
1732
0
}
1733
1734
static const value_string mmas_type_tbl[] = {
1735
    { 0,  "modification not defined" },
1736
    { 1,  "no modification after sanitize completion" },
1737
    { 2,  "additional modification after sanitize completion" },
1738
    { 0, NULL}
1739
};
1740
1741
static void add_ctrl_pow2_bytes(char *result, uint32_t val)
1742
0
{
1743
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << val);
1744
0
}
1745
1746
static void add_ctrl_pow2_page_size(char *result, uint32_t val)
1747
0
{
1748
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (12+val));
1749
0
}
1750
1751
static void add_ctrl_pow2_dstrd_size(char *result, uint32_t val)
1752
0
{
1753
0
    snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (2+val));
1754
0
}
1755
1756
1757
static const value_string fcb_type_tbl[] = {
1758
    { 0, "support for the NSID field set to FFFFFFFFh is not indicated" },
1759
    { 1, "reserved value" },
1760
    { 2, "Flush command does not support the NSID field set to FFFFFFFFh" },
1761
    { 3, "Flush command supports the NSID field set to FFFFFFFFh" },
1762
    { 0, NULL}
1763
};
1764
1765
1766
static void add_ctrl_lblocks(char *result, uint32_t val)
1767
0
{
1768
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u logical block%s", val + 1, val ? "%s" : "");
1769
0
}
1770
1771
static const value_string sgls_ify_type_tbl[] = {
1772
    { 0,  "SGLs are not supported." },
1773
    { 1, "SGLs are supported without alignment or granularity limitations" },
1774
    { 2, "SGLs are supported with DWORD alignment and granularity limitation" },
1775
    { 3,  "reserved value" },
1776
    { 0, NULL}
1777
};
1778
1779
0
#define CHECK_STOP_PARSE(__field_off__, __field_len__) \
1780
0
do { \
1781
0
    if ((__field_off__ - off + __field_len__) > len) \
1782
0
        return; \
1783
0
} while(0)
1784
1785
static void dissect_nvme_identify_ctrl_resp(tvbuff_t *cmd_tvb,
1786
                                            proto_tree *cmd_tree, unsigned off, unsigned len)
1787
0
{
1788
0
    proto_item *ti;
1789
1790
0
    if (!off) {
1791
0
        CHECK_STOP_PARSE(0, 2);
1792
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vid, cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN);
1793
0
    }
1794
0
    if (off <= 2) {
1795
0
        CHECK_STOP_PARSE(2, 2);
1796
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ssvid, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN);
1797
0
    }
1798
0
    if (off <= 4) {
1799
0
        CHECK_STOP_PARSE(4, 20);
1800
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_sn, cmd_tvb, 4-off, 20, ENC_ASCII);
1801
0
    }
1802
0
    if (off <= 24) {
1803
0
        CHECK_STOP_PARSE(24, 40);
1804
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mn, cmd_tvb, 24-off, 40, ENC_ASCII);
1805
0
    }
1806
0
    if (off <= 64) {
1807
0
        CHECK_STOP_PARSE(64, 8);
1808
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fr, cmd_tvb, 64-off, 8, ENC_NA);
1809
0
    }
1810
0
    if (off <= 72) {
1811
0
        CHECK_STOP_PARSE(72, 1);
1812
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rab, cmd_tvb, 72-off, 1, ENC_LITTLE_ENDIAN);
1813
0
    }
1814
0
    if (off <= 73) {
1815
0
        CHECK_STOP_PARSE(73, 3);
1816
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ieee, cmd_tvb, 73-off, 3, ENC_LITTLE_ENDIAN);
1817
0
    }
1818
0
    if (off <= 76) {
1819
0
        CHECK_STOP_PARSE(76, 1);
1820
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 76-off, 1, ASPEC(hf_nvme_identify_ctrl_cmic));
1821
0
    }
1822
0
    if (off <= 77) {
1823
0
        CHECK_STOP_PARSE(77, 1);
1824
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mdts, cmd_tvb, 77-off, 1, ENC_LITTLE_ENDIAN);
1825
0
    }
1826
1827
0
    if (off <= 78) {
1828
0
        CHECK_STOP_PARSE(78, 2);
1829
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntlid, cmd_tvb, 78-off, 2, ENC_LITTLE_ENDIAN);
1830
0
    }
1831
0
    if (off <= 80) {
1832
0
        CHECK_STOP_PARSE(80, 4);
1833
0
        dissect_nvme_identify_ctrl_resp_ver(cmd_tvb, cmd_tree, off);
1834
0
    }
1835
0
    if (off <= 84) {
1836
0
        CHECK_STOP_PARSE(84, 4);
1837
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3r, cmd_tvb, 84-off, 4, ENC_LITTLE_ENDIAN);
1838
0
    }
1839
1840
0
    if (off <= 88) {
1841
0
        CHECK_STOP_PARSE(88, 4);
1842
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3e, cmd_tvb, 88-off, 4, ENC_LITTLE_ENDIAN);
1843
0
    }
1844
0
    if (off <= 92) {
1845
0
        CHECK_STOP_PARSE(92, 4);
1846
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 92-off, 4, ASPEC(hf_nvme_identify_ctrl_oaes));
1847
0
    }
1848
0
    if (off <= 96) {
1849
0
        CHECK_STOP_PARSE(96, 4);
1850
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 96-off, 4, ASPEC(hf_nvme_identify_ctrl_ctratt));
1851
0
    }
1852
1853
0
    if (off <= 100) {
1854
0
        CHECK_STOP_PARSE(100, 2);
1855
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 100-off, 2, ASPEC(hf_nvme_identify_ctrl_rrls));
1856
0
    }
1857
0
    if (off <= 102) {
1858
0
        CHECK_STOP_PARSE(102, 9);
1859
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd0, cmd_tvb, 102-off, 9, ENC_NA);
1860
0
    }
1861
0
    if (off <= 111) {
1862
0
        CHECK_STOP_PARSE(111, 1);
1863
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntrltype, cmd_tvb, 111-off, 1, ENC_LITTLE_ENDIAN);
1864
0
    }
1865
0
    if (off <= 112) {
1866
0
        CHECK_STOP_PARSE(112, 16);
1867
0
        dissect_nvme_identify_ctrl_resp_fguid(cmd_tvb, cmd_tree, off);
1868
0
    }
1869
1870
0
    if (off <= 128) {
1871
0
        CHECK_STOP_PARSE(128, 2);
1872
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt1, cmd_tvb, 128-off, 2, ENC_LITTLE_ENDIAN);
1873
0
    }
1874
0
    if (off <= 130) {
1875
0
        CHECK_STOP_PARSE(130, 2);
1876
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt2, cmd_tvb, 130-off, 2, ENC_LITTLE_ENDIAN);
1877
0
    }
1878
0
    if (off <= 132)  {
1879
0
        CHECK_STOP_PARSE(132, 2);
1880
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt3, cmd_tvb, 132-off, 2, ENC_LITTLE_ENDIAN);
1881
0
    }
1882
1883
0
    if (off <= 132)  {
1884
0
        CHECK_STOP_PARSE(134, 2);
1885
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd1, cmd_tvb, 134-off, 106, ENC_NA);
1886
0
    }
1887
0
    if (off <= 240)  {
1888
0
        CHECK_STOP_PARSE(240, 16);
1889
0
        dissect_nvme_identify_ctrl_resp_mi(cmd_tvb, cmd_tree, off);
1890
0
    }
1891
0
    if (off <= 256)  {
1892
0
        CHECK_STOP_PARSE(256, 2);
1893
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 256-off, 2, ASPEC(hf_nvme_identify_ctrl_oacs));
1894
0
    }
1895
1896
0
    if (off <= 258)  {
1897
0
        CHECK_STOP_PARSE(258, 1);
1898
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acl, cmd_tvb,  258-off, 1, ENC_LITTLE_ENDIAN);
1899
0
    }
1900
0
    if (off <= 259)  {
1901
0
        CHECK_STOP_PARSE(259, 1);
1902
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_aerl, cmd_tvb, 259-off, 1, ENC_LITTLE_ENDIAN);
1903
0
    }
1904
0
    if (off <= 260)  {
1905
0
        CHECK_STOP_PARSE(260, 1);
1906
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 260, 1, ASPEC(hf_nvme_identify_ctrl_frmw));
1907
0
    }
1908
1909
0
    if (off <= 261)  {
1910
0
        CHECK_STOP_PARSE(261, 1);
1911
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 261-off, 1, ASPEC(hf_nvme_identify_ctrl_lpa));
1912
0
    }
1913
0
    if (off <= 262)  {
1914
0
        CHECK_STOP_PARSE(262, 1);
1915
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_elpe, cmd_tvb, 262-off, 1, ENC_LITTLE_ENDIAN);
1916
0
    }
1917
0
    if (off <= 263)  {
1918
0
        CHECK_STOP_PARSE(263, 1);
1919
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_npss, cmd_tvb, 263-off, 1, ENC_LITTLE_ENDIAN);
1920
0
    }
1921
1922
0
    if (off <= 264)  {
1923
0
        CHECK_STOP_PARSE(264, 1);
1924
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 264-off, 1, ASPEC(hf_nvme_identify_ctrl_avscc));
1925
0
    }
1926
0
    if (off <= 265)  {
1927
0
        CHECK_STOP_PARSE(265, 1);
1928
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 265-off, 1, ASPEC(hf_nvme_identify_ctrl_apsta));
1929
0
    }
1930
0
    if (off <= 266)  {
1931
0
        CHECK_STOP_PARSE(266, 1);
1932
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_wctemp, cmd_tvb, 266-off, 2, ENC_LITTLE_ENDIAN);
1933
1934
0
    }
1935
0
    if (off <= 268)  {
1936
0
        CHECK_STOP_PARSE(268, 2);
1937
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cctemp, cmd_tvb, 268-off, 2, ENC_LITTLE_ENDIAN);
1938
0
    }
1939
0
    if (off <= 270)  {
1940
0
        CHECK_STOP_PARSE(270, 2);
1941
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mtfa, cmd_tvb, 270-off, 2, ENC_LITTLE_ENDIAN);
1942
0
    }
1943
0
    if (off <= 272)  {
1944
0
        CHECK_STOP_PARSE(272, 4);
1945
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmpre, cmd_tvb, 272-off, 4, ENC_LITTLE_ENDIAN);
1946
0
    }
1947
0
    if (off <= 276)  {
1948
0
        CHECK_STOP_PARSE(276, 4);
1949
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmin, cmd_tvb, 276-off, 4, ENC_LITTLE_ENDIAN);
1950
0
    }
1951
1952
0
    if (off <= 280)  {
1953
0
        CHECK_STOP_PARSE(280, 16);
1954
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_tnvmcap, cmd_tvb, 280-off, 16, ENC_NA);
1955
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 280-off, 0);
1956
0
    }
1957
0
    if (off <= 296)  {
1958
0
        CHECK_STOP_PARSE(296, 16);
1959
0
        ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_unvmcap, cmd_tvb, 296-off, 16, ENC_NA);
1960
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 296-off, 0);
1961
0
    }
1962
1963
0
    if (off <= 312)  {
1964
0
        CHECK_STOP_PARSE(312, 4);
1965
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 312-off, 4, ASPEC(hf_nvme_identify_ctrl_rpmbs));
1966
0
    }
1967
0
    if (off <= 316)  {
1968
0
        CHECK_STOP_PARSE(316, 2);
1969
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_edstt, cmd_tvb, 316-off, 2, ENC_LITTLE_ENDIAN);
1970
0
    }
1971
0
    if (off <= 318)  {
1972
0
        CHECK_STOP_PARSE(318, 1);
1973
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 318-off, 1, ASPEC(hf_nvme_identify_ctrl_dsto));
1974
0
    }
1975
1976
0
    if (off <= 319)  {
1977
0
        CHECK_STOP_PARSE(319, 1);
1978
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fwug, cmd_tvb, 319-off, 1, ENC_LITTLE_ENDIAN);
1979
0
    }
1980
0
    if (off <= 320)  {
1981
0
        CHECK_STOP_PARSE(320, 2);
1982
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_kas, cmd_tvb, 320-off, 2, ENC_LITTLE_ENDIAN);
1983
0
    }
1984
0
    if (off <= 322)  {
1985
0
        CHECK_STOP_PARSE(322, 2);
1986
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 322-off, 2, ASPEC(hf_nvme_identify_ctrl_hctma));
1987
0
    }
1988
1989
0
    if (off <= 324)  {
1990
0
        CHECK_STOP_PARSE(324, 2);
1991
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mntmt, cmd_tvb, 324-off, 2, ENC_LITTLE_ENDIAN);
1992
0
    }
1993
0
    if (off <= 326)  {
1994
0
        CHECK_STOP_PARSE(326, 2);
1995
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mxtmt, cmd_tvb, 326-off, 2, ENC_LITTLE_ENDIAN);
1996
0
    }
1997
0
    if (off <= 328)  {
1998
0
        CHECK_STOP_PARSE(328, 2);
1999
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 328-off, 2, ASPEC(hf_nvme_identify_ctrl_sanicap));
2000
0
    }
2001
2002
0
    if (off <= 332)  {
2003
0
        CHECK_STOP_PARSE(332, 4);
2004
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmminds, cmd_tvb, 332-off, 4, ENC_LITTLE_ENDIAN);
2005
0
    }
2006
0
    if (off <= 336)  {
2007
0
        CHECK_STOP_PARSE(336, 2);
2008
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmaxd, cmd_tvb, 336-off, 2, ENC_LITTLE_ENDIAN);
2009
0
    }
2010
0
    if (off <= 338)  {
2011
0
        CHECK_STOP_PARSE(338, 2);
2012
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nsetidmax, cmd_tvb, 338-off, 2, ENC_LITTLE_ENDIAN);
2013
0
    }
2014
2015
0
    if (off <= 340)  {
2016
0
        CHECK_STOP_PARSE(340, 2);
2017
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_endgidmax, cmd_tvb, 340-off, 2, ENC_LITTLE_ENDIAN);
2018
0
    }
2019
0
    if (off <= 342)  {
2020
0
        CHECK_STOP_PARSE(342, 2);
2021
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anatt, cmd_tvb, 342-off, 1, ENC_LITTLE_ENDIAN);
2022
0
    }
2023
0
    if (off <= 343)  {
2024
0
        CHECK_STOP_PARSE(343, 1);
2025
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 343-off, 1, ASPEC(hf_nvme_identify_ctrl_anacap));
2026
0
    }
2027
2028
0
    if (off <= 344)  {
2029
0
        CHECK_STOP_PARSE(344, 4);
2030
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anagrpmax, cmd_tvb, 344-off, 4, ENC_LITTLE_ENDIAN);
2031
0
    }
2032
0
    if (off <= 348)  {
2033
0
        CHECK_STOP_PARSE(348, 4);
2034
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nanagrpid, cmd_tvb, 348-off, 4, ENC_LITTLE_ENDIAN);
2035
0
    }
2036
0
    if (off <= 352)  {
2037
0
        CHECK_STOP_PARSE(352, 4);
2038
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_pels, cmd_tvb, 352-off, 4, ENC_LITTLE_ENDIAN);
2039
0
    }
2040
2041
0
    if (off <= 356)  {
2042
0
        CHECK_STOP_PARSE(356, 156);
2043
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd2, cmd_tvb, 356-off, 156, ENC_NA);
2044
0
    }
2045
0
    if (off <= 512)  {
2046
0
        CHECK_STOP_PARSE(512, 1);
2047
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 512-off, 1, ASPEC(hf_nvme_identify_ctrl_sqes));
2048
0
    }
2049
0
    if (off <= 513)  {
2050
0
        CHECK_STOP_PARSE(513, 1);
2051
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 513-off, 1, ASPEC(hf_nvme_identify_ctrl_cqes));
2052
0
    }
2053
2054
0
    if (off <= 514)  {
2055
0
        CHECK_STOP_PARSE(514, 2);
2056
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxcmd, cmd_tvb, 514-off, 2, ENC_LITTLE_ENDIAN);
2057
0
    }
2058
0
    if (off <= 516)  {
2059
0
        CHECK_STOP_PARSE(516, 4);
2060
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nn, cmd_tvb, 516-off, 4, ENC_LITTLE_ENDIAN);
2061
0
    }
2062
0
    if (off <= 520)  {
2063
0
        CHECK_STOP_PARSE(520, 2);
2064
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 520-off, 2, ASPEC(hf_nvme_identify_ctrl_oncs));
2065
0
    }
2066
2067
0
    if (off <= 522)  {
2068
0
        CHECK_STOP_PARSE(522, 2);
2069
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 522-off, 2, ASPEC(hf_nvme_identify_ctrl_fuses));
2070
0
    }
2071
0
    if (off <= 524)  {
2072
0
        CHECK_STOP_PARSE(524, 1);
2073
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 524-off, 1, ASPEC(hf_nvme_identify_ctrl_fna));
2074
0
    }
2075
0
    if (off <= 525)  {
2076
0
        CHECK_STOP_PARSE(525, 1);
2077
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 525-off, 1, ASPEC(hf_nvme_identify_ctrl_vwc));
2078
0
    }
2079
2080
0
    if (off <= 526)  {
2081
0
        CHECK_STOP_PARSE(526, 2);
2082
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awun, cmd_tvb, 526-off, 2, ENC_LITTLE_ENDIAN);
2083
0
    }
2084
0
    if (off <= 528)  {
2085
0
        CHECK_STOP_PARSE(528, 2);
2086
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awupf, cmd_tvb, 528-off, 2, ENC_LITTLE_ENDIAN);
2087
0
    }
2088
0
    if (off <= 530)  {
2089
0
        CHECK_STOP_PARSE(530, 1);
2090
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 530-off, 1, ASPEC(hf_nvme_identify_ctrl_nvscc));
2091
0
    }
2092
2093
0
    if (off <= 531)  {
2094
0
        CHECK_STOP_PARSE(531, 1);
2095
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 531-off, 1, ASPEC(hf_nvme_identify_ctrl_nwpc));
2096
0
    }
2097
0
    if (off <= 532)  {
2098
0
        CHECK_STOP_PARSE(532, 3);
2099
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acwu, cmd_tvb, 532-off, 2, ENC_LITTLE_ENDIAN);
2100
0
    }
2101
0
    if (off <= 534)  {
2102
0
        CHECK_STOP_PARSE(534, 2);
2103
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd3, cmd_tvb, 534-off, 2, ENC_NA);
2104
0
    }
2105
2106
0
    if (off <= 536)  {
2107
0
        CHECK_STOP_PARSE(536, 4);
2108
0
        add_group_mask_entry(cmd_tvb, cmd_tree, 536-off, 4, ASPEC(hf_nvme_identify_ctrl_sgls));
2109
0
    }
2110
0
    if (off <= 540)  {
2111
0
        CHECK_STOP_PARSE(540, 4);
2112
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mnan, cmd_tvb, 540-off, 4, ENC_LITTLE_ENDIAN);
2113
0
    }
2114
0
    if (off <= 544)  {
2115
0
        CHECK_STOP_PARSE(544, 224);
2116
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd4, cmd_tvb, 544-off, 224, ENC_NA);
2117
0
    }
2118
2119
0
    if (off <= 768)  {
2120
0
        CHECK_STOP_PARSE(768, 256);
2121
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_subnqn, cmd_tvb, 768-off, 256, ENC_ASCII);
2122
0
    }
2123
0
    if (off <= 1024)  {
2124
0
        CHECK_STOP_PARSE(1024, 768);
2125
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd5, cmd_tvb, 1024-off, 768, ENC_NA);
2126
0
    }
2127
0
    if (off <= 1792)  {
2128
0
        CHECK_STOP_PARSE(1792, 256);
2129
0
        dissect_nvme_identify_ctrl_resp_nvmeof(cmd_tvb, cmd_tree, off);
2130
0
    }
2131
2132
0
    if (off <= 2048)  {
2133
0
        CHECK_STOP_PARSE(2048, 1024);
2134
0
        dissect_nvme_identify_ctrl_resp_power_state_descriptors(cmd_tvb, cmd_tree, off);
2135
0
    }
2136
2137
0
    if (off <= 3072)  {
2138
0
        CHECK_STOP_PARSE(3072, 1024);
2139
0
        proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vs, cmd_tvb, 3072-off, 1024, ENC_NA);
2140
0
    }
2141
0
}
2142
2143
static void dissect_nvme_identify_resp(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
2144
                                       struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
2145
0
{
2146
0
    switch(cmd_ctx->cmd_ctx.cmd_identify.cns) {
2147
0
    case NVME_IDENTIFY_CNS_IDENTIFY_NS:
2148
0
        dissect_nvme_identify_ns_resp(cmd_tvb, cmd_tree, off, len);
2149
0
        break;
2150
0
    case NVME_IDENTIFY_CNS_IDENTIFY_CTRL:
2151
0
        dissect_nvme_identify_ctrl_resp(cmd_tvb, cmd_tree, off, len);
2152
0
        break;
2153
0
    case NVME_IDENTIFY_CNS_IDENTIFY_NSLIST:
2154
0
        dissect_nvme_identify_nslist_resp(cmd_tvb, cmd_tree, off, len);
2155
0
        break;
2156
0
    default:
2157
0
        break;
2158
0
    }
2159
0
}
2160
2161
static void dissect_nvme_identify_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
2162
0
{
2163
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_identify_dword10));
2164
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_identify_dword11));
2165
2166
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
2167
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
2168
2169
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_identify_dword14));
2170
2171
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
2172
0
}
2173
2174
static const value_string logpage_tbl[] = {
2175
    { 0, "Unspecified" },
2176
    { 1, "Error Information" },
2177
    { 2, "SMART/Health Information" },
2178
    { 3, "Firmware Slot Information" },
2179
    { 4, "Changed Namespace List" },
2180
    { 5, "Commands Supported and Effects" },
2181
    { 6, "Device Self-test" },
2182
    { 7, "Telemetry Host-Initiated" },
2183
    { 8, "Telemetry Controller-Initiated" },
2184
    { 9, "Endurance Group Information" },
2185
    { 10, "Predictable Latency Per NVM Set" },
2186
    { 11, "Predictable Latency Event Aggregate" },
2187
    { 12, "Asymmetric Namespace Access" },
2188
    { 13, "Persistent Event Log" },
2189
    { 14, "LBA Status Information" },
2190
    { 15, "Endurance Group Event Aggregate" },
2191
    { 0x70, "NVMeOF Discovery" },
2192
    { 0x80, "Reservation Notification" },
2193
    { 0x81, "Sanitize Status" },
2194
    { 0, NULL }
2195
};
2196
2197
static const char *get_logpage_name(unsigned lid)
2198
0
{
2199
0
    if (lid > 0x70 && lid < 0x80)
2200
0
        return "NVMeoF Reserved Page name";
2201
0
    else if (lid > 0x81 && lid < 0xc0)
2202
0
        return "IO Command Set Specific Page";
2203
0
    else if (lid >= 0xc0)
2204
0
        return "Vendor Specific Page";
2205
0
    else
2206
0
        return val_to_str_const(lid, logpage_tbl, "Reserved Page Name");
2207
0
}
2208
2209
static void add_logpage_lid(char *result, uint32_t val)
2210
0
{
2211
0
    snprintf(result, ITEM_LABEL_LENGTH, "%s (0x%x)", get_logpage_name(val), val);
2212
0
}
2213
2214
static const value_string sec_type_tbl[] = {
2215
    { 0, "No security" },
2216
    { 1, "Transport Layer Security (TLS) version >= 1.2" },
2217
    { 0, NULL }
2218
};
2219
2220
static void dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off)
2221
0
{
2222
0
    proto_tree *grp =  proto_item_add_subtree(ti, ett_data);
2223
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN);
2224
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd, cmd_tvb, off+1, 255, ENC_NA);
2225
0
}
2226
2227
static const value_string qp_type_tbl[] = {
2228
    { 1, "Reliable Connected" },
2229
    { 2, "Reliable Datagram" },
2230
    { 0, NULL }
2231
};
2232
2233
static const value_string pr_type_tbl[] = {
2234
    { 1, "No provider specified" },
2235
    { 2, "InfiniBand" },
2236
    { 3, "RoCE (v1)" },
2237
    { 4, "RoCE (v2)" },
2238
    { 5, "iWARP" },
2239
    { 0, NULL }
2240
};
2241
2242
static const value_string cms_type_tbl[] = {
2243
    { 1, "RDMA_IP_CM" },
2244
    { 0, NULL }
2245
};
2246
2247
static void dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off)
2248
0
{
2249
0
    proto_tree *grp;
2250
2251
0
    grp =  proto_item_add_subtree(ti, ett_data);
2252
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN);
2253
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN);
2254
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN);
2255
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0, cmd_tvb, off+3, 5, ENC_NA);
2256
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey, cmd_tvb, off+8, 2, ENC_LITTLE_ENDIAN);
2257
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1, cmd_tvb, off+10, 246, ENC_NA);
2258
0
}
2259
2260
static const value_string trt_type_tbl[] = {
2261
    { 0, "Reserved" },
2262
    { 1, "RDMA Transport" },
2263
    { 2, "Fibre Channel Transport" },
2264
    { 3, "TCP Transport" },
2265
    { 254, "Itra-host Transport" },
2266
    { 0, NULL }
2267
};
2268
2269
static const value_string adrfam_type_tbl[] = {
2270
    { 0, "Reserved" },
2271
    { 1, "AF_INET" },
2272
    { 2, "AF_INET6" },
2273
    { 3, "AF_IB" },
2274
    { 4, "Fibre Channel" },
2275
    { 254, "Intra-Host" },
2276
    { 0, NULL }
2277
};
2278
2279
static const value_string sub_type_tbl[] = {
2280
    { 0, "Reserved" },
2281
    { 1, "Referral to another Discovery Subsystem" },
2282
    { 2, "NVM subsystem with IO controllers" },
2283
    { 3, "Current Discovery Subsystem" },
2284
    { 0, NULL }
2285
};
2286
2287
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)
2288
0
{
2289
0
    proto_item *ti;
2290
0
    proto_tree *grp;
2291
0
    unsigned tr_type;
2292
2293
0
    ti = proto_tree_add_bytes_format(tree, hf_nvme_get_logpage_ify_rcrd, cmd_tvb, off,
2294
0
        (len < 1024) ? len : 1024, NULL, "Discovery Log Entry %"PRIu64" (DLE%"PRIu64")", rcrd, rcrd);
2295
0
    grp =  proto_item_add_subtree(ti, ett_data);
2296
2297
0
    if (!roff) {
2298
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ify_rcrd_trtype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN, &tr_type);
2299
0
        cmd_ctx->cmd_ctx.get_logpage.tr_type = tr_type;
2300
0
    } else {
2301
0
        tr_type = cmd_ctx->cmd_ctx.get_logpage.tr_type;
2302
0
    }
2303
2304
0
    if (roff <= 1 && (2-roff) <= len)
2305
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_adrfam, cmd_tvb, off-roff+1, 1, ENC_LITTLE_ENDIAN);
2306
2307
0
    if (roff <= 2 && (3-roff) <= len)
2308
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subtype, cmd_tvb, off-roff+2, 1, ENC_LITTLE_ENDIAN);
2309
2310
0
    if (roff <= 3 && (4-roff) <= len)
2311
0
        add_group_mask_entry(cmd_tvb, grp, off-roff+3, 1, ASPEC(hf_nvme_get_logpage_ify_rcrd_treq));
2312
2313
0
    if (roff <= 4 && (6-roff) <= len)
2314
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_portid, cmd_tvb, off-roff+4, 2, ENC_LITTLE_ENDIAN);
2315
2316
0
    if (roff <= 6 && (8-roff) <= len)
2317
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_cntlid, cmd_tvb, off-roff+6, 2, ENC_LITTLE_ENDIAN);
2318
2319
0
    if (roff <= 8 && (10-roff) <= len)
2320
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_asqsz, cmd_tvb, off-roff+8, 2, ENC_LITTLE_ENDIAN);
2321
2322
0
    if (roff <= 10 && (12-roff) <= len)
2323
0
        add_group_mask_entry(cmd_tvb, grp, off-roff+10, 2, ASPEC(hf_nvme_get_logpage_disc_rcrd_eflags));
2324
2325
0
    if (roff <= 12 && (32-roff) <= len)
2326
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd0, cmd_tvb, off-roff+12, 20, ENC_NA);
2327
2328
0
    if (roff <= 32 && (64-roff) <= len)
2329
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_trsvcid, cmd_tvb, off-roff+32, 32, ENC_ASCII);
2330
2331
0
    if (roff <= 64 && (256-roff) <= len)
2332
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd1, cmd_tvb, off-roff+64, 192, ENC_NA);
2333
2334
0
    if (roff <= 256 && (512-roff) <= len)
2335
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subnqn, cmd_tvb, off-roff+256, 256, ENC_ASCII);
2336
2337
0
    if (roff <= 512 && (768-roff) <= len)
2338
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_traddr, cmd_tvb, off-roff+512, 256, ENC_ASCII);
2339
2340
0
    if (roff <= 768 && (1024-roff) <= len) {
2341
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas, cmd_tvb, off-roff+768, 256, ENC_NA);
2342
0
        if (tr_type == 1)
2343
0
            dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(cmd_tvb, ti, off-roff+768);
2344
0
        else if (tr_type == 3)
2345
0
            dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(cmd_tvb, ti, off-roff+768);
2346
0
    }
2347
0
}
2348
2349
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)
2350
0
{
2351
0
    uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off + tr_off;
2352
0
    proto_tree *grp;
2353
0
    unsigned poff;
2354
0
    unsigned roff;
2355
0
    unsigned max_bytes;
2356
0
    uint64_t rcrd, rcrd_ctr = 0;
2357
0
    uint64_t recnum = 0;
2358
2359
0
    grp =  proto_item_add_subtree(ti, ett_data);
2360
2361
0
    if (!off && len >= 8)
2362
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_genctr, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
2363
2364
    /* unsigned casts are to silence clang-11 compile errors */
2365
0
    if (off <= 8 && (16 - (unsigned)off) <= len)
2366
0
        proto_tree_add_item_ret_uint64(grp, hf_nvme_get_logpage_ify_numrec, cmd_tvb, (unsigned)(8-off), 8, ENC_LITTLE_ENDIAN, &recnum);
2367
2368
0
    if (off <= 16 && (18 - (unsigned)off) <= len) {
2369
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_recfmt, cmd_tvb, (unsigned)(16-off), 2, ENC_LITTLE_ENDIAN);
2370
0
        cmd_ctx->cmd_ctx.get_logpage.records = (recnum & 0xffffffff);
2371
0
    } else if (tr_off) {
2372
0
        recnum = cmd_ctx->cmd_ctx.get_logpage.records;
2373
0
    }
2374
2375
0
    if (off <= 18 && (1024 - (unsigned)off) <= len)
2376
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rsvd, cmd_tvb, (unsigned)(18-off), 1006, ENC_NA);
2377
2378
0
    if (off <= 1024) {
2379
0
        poff = (1024 - (unsigned)off); /* clang-11 is so strange, hence the cast */
2380
0
        if (poff >= len)
2381
0
            return;
2382
0
        max_bytes = 1024;
2383
0
        rcrd = 0;
2384
0
        roff = 0;
2385
0
        len -= poff;
2386
0
    } else {
2387
0
        poff = 0;
2388
0
        roff = (off & 1023);
2389
0
        max_bytes = 1024 - (roff);
2390
0
        rcrd = (off - roff) / 1024 - 1;
2391
0
    }
2392
2393
0
    max_bytes = (max_bytes <= len) ? max_bytes : len;
2394
0
    dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, roff, poff, len);
2395
0
    poff += max_bytes;
2396
0
    len -= max_bytes;
2397
0
    rcrd++;
2398
0
    rcrd_ctr++;
2399
2400
0
    if (!recnum)
2401
0
        recnum = (len  + 1023) / 1024;
2402
2403
0
    while (len && rcrd_ctr <= recnum) {
2404
0
        max_bytes = (len >= 1024) ? 1024 : len;
2405
0
        dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, 0, poff, len);
2406
0
        poff += max_bytes;
2407
0
        len -= max_bytes;
2408
0
        rcrd++;
2409
0
        rcrd_ctr++;
2410
0
    }
2411
0
}
2412
2413
static void dissect_nvme_get_logpage_err_inf_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
2414
0
{
2415
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2416
0
    proto_tree *grp;
2417
2418
0
    grp =  proto_item_add_subtree(ti, ett_data);
2419
2420
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 42)
2421
0
        return; /* max allowed offset is 42, so we do not loose bits by casting to unsigned type */
2422
2423
0
    if (!off && len >= 8)
2424
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_errcnt, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
2425
0
    if (off <= 8 && (10-off) <= len)
2426
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_sqid, cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN);
2427
0
    if (off <= 10 && (12-off) <= len)
2428
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_cid, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN);
2429
0
    if (off <= 12 && (14-off) <= len)
2430
0
        add_group_mask_entry(cmd_tvb, grp, 12-off, 2, ASPEC(hf_nvme_get_logpage_errinf_sf));
2431
0
    if (off <= 14 && (16-off) <= len)
2432
0
        add_group_mask_entry(cmd_tvb, grp, 14-off, 2, ASPEC(hf_nvme_get_logpage_errinf_pel));
2433
0
    if (off <= 16 && (24-off) <= len)
2434
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_lba, cmd_tvb, 16-off, 8, ENC_LITTLE_ENDIAN);
2435
0
    if (off <= 24 && (28-off) <= len)
2436
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_ns, cmd_tvb, 24-off, 4, ENC_LITTLE_ENDIAN);
2437
0
    if (off <= 28 && (29-off) <= len)
2438
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_vsi, cmd_tvb, 28-off, 1, ENC_LITTLE_ENDIAN);
2439
0
    if (off <= 29 && (30-off) <= len)
2440
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_trtype, cmd_tvb, 29-off, 1, ENC_LITTLE_ENDIAN);
2441
0
    if (off <= 30 && (32-off) <= len)
2442
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_rsvd0, cmd_tvb, 30-off, 2, ENC_LITTLE_ENDIAN);
2443
0
    if (off <= 32 && (40-off) <= len)
2444
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_csi, cmd_tvb, 32-off, 8, ENC_LITTLE_ENDIAN);
2445
0
    if (off <= 40 && (42-off) <= len)
2446
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_tsi, cmd_tvb, 40-off, 2, ENC_LITTLE_ENDIAN);
2447
0
    if (off <= 42 && (64-off) <= len)
2448
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_rsvd1, cmd_tvb, 42-off, 24, ENC_NA);
2449
0
}
2450
2451
static void post_add_intval_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off)
2452
0
{
2453
0
    uint64_t lo = tvb_get_uint64(tvb, off, 0);
2454
0
    uint64_t hi = tvb_get_uint64(tvb, off, 8);
2455
0
    double res;
2456
2457
0
    res = (double)hi;
2458
0
    res *= (((uint64_t)1) << 63);
2459
0
    res *= 2;
2460
0
    res += lo;
2461
0
    if (res > 99999999)
2462
0
        proto_item_append_text(ti, " (%.8le)", res);
2463
0
    else
2464
0
        proto_item_append_text(ti, " (%.0lf)", res);
2465
0
}
2466
2467
static void decode_smart_resp_temps(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned off, unsigned len)
2468
0
{
2469
0
    proto_item *ti;
2470
0
    unsigned bytes;
2471
0
    unsigned poff;
2472
0
    unsigned max_bytes;
2473
0
    unsigned i;
2474
2475
2476
0
    poff = (off < 200) ? 200-off : off;
2477
2478
0
    if (off > 214 || (poff + 2) > len)
2479
0
        return;
2480
2481
0
    bytes = len - poff;
2482
0
    max_bytes = (off <= 200) ? 16 : (216 - off);
2483
2484
0
    if (bytes > max_bytes)
2485
0
        bytes = max_bytes;
2486
2487
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[0],  cmd_tvb, poff, bytes, ENC_NA);
2488
0
    grp =  proto_item_add_subtree(ti, ett_data);
2489
0
    for (i = 0; i < 8; i++) {
2490
0
        unsigned pos = 200 + i * 2;
2491
0
        if (off <= pos && (off + pos + 2) <= len)
2492
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[i+1],  cmd_tvb, pos - off, 2, ENC_LITTLE_ENDIAN);
2493
0
    }
2494
0
}
2495
2496
static void dissect_nvme_get_logpage_smart_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
2497
0
{
2498
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2499
0
    proto_tree *grp;
2500
2501
0
    if (cmd_ctx->cmd_ctx.get_logpage.off >= 512)
2502
0
        return; /* max allowed offset is < 512, so we do not loose bits by casting to unsigned type */
2503
2504
0
    grp =  proto_item_add_subtree(ti, ett_data);
2505
0
    if (!off && len >= 1)
2506
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_smart_cw));
2507
0
    if (off <= 1 && (3 -off) <= len)
2508
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ct,  cmd_tvb, 1-off, 2, ENC_LITTLE_ENDIAN);
2509
0
    if (off <= 3 && (4 -off) <= len)
2510
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_asc,  cmd_tvb, 3-off, 1, ENC_LITTLE_ENDIAN);
2511
0
    if (off <= 4 && (5 -off) <= len)
2512
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ast,  cmd_tvb, 4-off, 1, ENC_LITTLE_ENDIAN);
2513
0
    if (off <= 5 && (6 -off) <= len)
2514
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_lpu,  cmd_tvb, 5-off, 1, ENC_LITTLE_ENDIAN);
2515
0
    if (off <= 6 && (7 -off) <= len)
2516
0
        add_group_mask_entry(cmd_tvb, grp, 6-off, 1, ASPEC(hf_nvme_get_logpage_smart_egcws));
2517
0
    if (off <= 7 && (32 -off) <= len)
2518
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd0,  cmd_tvb, 7-off, 25, ENC_NA);
2519
0
    if (off <= 32 && (48 -off) <= len) {
2520
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_dur,  cmd_tvb, 32-off, 16, ENC_NA);
2521
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 32-off, 16);
2522
0
    }
2523
0
    if (off <= 48 && (64 -off) <= len) {
2524
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_duw,  cmd_tvb, 48-off, 16, ENC_NA);
2525
0
        post_add_bytes_from_16bytes(ti, cmd_tvb, 48-off, 16);
2526
0
    }
2527
0
    if (off <= 64 && (80 -off) <= len) {
2528
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hrc,  cmd_tvb, 64-off, 16, ENC_NA);
2529
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 64-off);
2530
0
    }
2531
0
    if (off <= 80 && (96 -off) <= len) {
2532
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hwc,  cmd_tvb, 80-off, 16, ENC_NA);
2533
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 80-off);
2534
0
    }
2535
0
    if (off <= 96 && (112 -off) <= len) {
2536
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cbt,  cmd_tvb, 96-off, 16, ENC_NA);
2537
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 96-off);
2538
0
    }
2539
0
    if (off <= 112 && (128 -off) <= len) {
2540
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_pc,  cmd_tvb, 112-off, 16, ENC_NA);
2541
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 112-off);
2542
0
    }
2543
0
    if (off <= 128 && (144 -off) <= len) {
2544
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_poh,  cmd_tvb, 128-off, 16, ENC_NA);
2545
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 128-off);
2546
0
    }
2547
0
    if (off <= 144 && (160 -off) <= len) {
2548
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_us,  cmd_tvb, 144-off, 16, ENC_NA);
2549
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 144-off);
2550
0
    }
2551
0
    if (off <= 160 && (176 -off) <= len) {
2552
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_mie,  cmd_tvb, 160-off, 16, ENC_NA);
2553
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 160-off);
2554
0
    }
2555
0
    if (off <= 176 && (192 -off) <= len) {
2556
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ele,  cmd_tvb, 176-off, 16, ENC_NA);
2557
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 176-off);
2558
0
    }
2559
0
    if (off <= 192 && (196 -off) <= len)
2560
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_wctt,  cmd_tvb, 192-off, 4, ENC_LITTLE_ENDIAN);
2561
0
    if (off <= 196 && (200 -off) <= len)
2562
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cctt,  cmd_tvb, 196-off, 4, ENC_LITTLE_ENDIAN);
2563
2564
0
    decode_smart_resp_temps(grp, cmd_tvb, off, len);
2565
2566
0
    if (off <= 216 && (220 -off) <= len)
2567
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1c,  cmd_tvb, 216-off, 4, ENC_LITTLE_ENDIAN);
2568
0
    if (off <= 220 && (224 -off) <= len)
2569
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2c,  cmd_tvb, 220-off, 4, ENC_LITTLE_ENDIAN);
2570
0
    if (off <= 224 && (228 -off) <= len)
2571
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1t,  cmd_tvb, 224-off, 4, ENC_LITTLE_ENDIAN);
2572
0
    if (off <= 228 && (232 -off) <= len)
2573
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2t,  cmd_tvb, 228-off, 4, ENC_LITTLE_ENDIAN);
2574
0
    if (off < 512) {
2575
0
        unsigned poff = (off < 232) ? 232 : off;
2576
0
        unsigned max_len = (off <= 232) ? 280 : 512 - off;
2577
0
        len -= poff;
2578
0
        if (len > max_len)
2579
0
            len = max_len;
2580
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd1,  cmd_tvb, poff, len, ENC_NA);
2581
0
    }
2582
0
}
2583
2584
static void decode_fw_slot_frs(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned len)
2585
0
{
2586
0
    proto_item *ti;
2587
0
    unsigned bytes;
2588
0
    unsigned poff;
2589
0
    unsigned max_bytes;
2590
0
    unsigned i;
2591
2592
2593
0
    poff = (off < 8) ? 8-off : off;
2594
2595
0
    if (off > 56 || (poff + 8) > len)
2596
0
        return;
2597
2598
0
    bytes = len - poff;
2599
0
    max_bytes = (off <= 8) ? 56 : (64 - off);
2600
2601
0
    if (bytes > max_bytes)
2602
0
        bytes = max_bytes;
2603
2604
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs[0],  cmd_tvb, poff, bytes, ENC_NA);
2605
0
    grp =  proto_item_add_subtree(ti, ett_data);
2606
0
    for (i = 0; i < 7; i++) {
2607
0
        unsigned pos = 8 + i * 8;
2608
0
        if (off <= pos && (pos + 8 - off) <= len)
2609
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs[i+1],  cmd_tvb, pos - off, 8, ENC_LITTLE_ENDIAN);
2610
0
    }
2611
0
}
2612
2613
static void dissect_nvme_get_logpage_fw_slot_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
2614
0
{
2615
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2616
0
    proto_tree *grp;
2617
2618
0
    if (cmd_ctx->cmd_ctx.get_logpage.off >= 512)
2619
0
        return;  /* max allowed offset is < 512, so we do not loose bits by casting to unsigned type */
2620
2621
0
    grp =  proto_item_add_subtree(ti, ett_data);
2622
2623
0
    if (!off && len > 1)
2624
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_fw_slot_afi));
2625
0
    if (off <= 1 && (8-off) <= len)
2626
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd0,  cmd_tvb, 1-off, 7, ENC_LITTLE_ENDIAN);
2627
2628
0
    decode_fw_slot_frs(grp, cmd_tvb, off, len);
2629
2630
0
    if (off < 512) {
2631
0
        unsigned poff = (off < 64) ? 64 : off;
2632
0
        unsigned max_len = (off <= 64) ? 448 : 512 - off;
2633
0
        len -= poff;
2634
0
        if (len > max_len)
2635
0
            len = max_len;
2636
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd1,  cmd_tvb, poff, len, ENC_NA);
2637
0
    }
2638
0
}
2639
2640
static void dissect_nvme_get_logpage_changed_nslist_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned len)
2641
0
{
2642
0
    proto_tree *grp;
2643
0
    unsigned off = 0;
2644
2645
0
    grp =  proto_item_add_subtree(ti, ett_data);
2646
0
    while (len >= 4) {
2647
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_changed_nslist,  cmd_tvb, off, 4, ENC_LITTLE_ENDIAN);
2648
0
        len -= 4;
2649
0
        off += 4;
2650
0
    }
2651
0
}
2652
2653
static const value_string cmd_eff_cse_tbl[] = {
2654
    { 0, "No command submission or execution restriction" },
2655
    { 1, "One concurrent command per namespace" },
2656
    { 2, "One concurrent command per system" },
2657
    { 0, NULL}
2658
};
2659
2660
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)
2661
0
{
2662
0
    unsigned i;
2663
0
    proto_item *ti;
2664
0
    for (i = 0; i < nrec; i++) {
2665
0
        if (acs)
2666
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+1);
2667
0
        else
2668
0
            ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_cmd_and_eff_cs, cmd_tvb, poff, 4, NULL, "I/0 Command Supported %u (IOCS%u)", fidx+i, fidx+1);
2669
0
        grp =  proto_item_add_subtree(ti, ett_data);
2670
0
        add_group_mask_entry(cmd_tvb, grp, poff, 4, ASPEC(hf_nvme_get_logpage_cmd_and_eff_cseds));
2671
0
        poff += 4;
2672
0
    }
2673
0
}
2674
2675
2676
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)
2677
0
{
2678
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2679
0
    proto_tree *grp;
2680
0
    unsigned nrec = 0;
2681
0
    unsigned fidx;
2682
2683
0
    off += tr_off;
2684
0
    if (cmd_ctx->cmd_ctx.get_logpage.off >= 4096)
2685
0
        return; /* max allowed offset is < 4096, so we do not loose bits by casting to unsigned type */
2686
2687
0
    grp =  proto_item_add_subtree(ti, ett_data);
2688
0
    if (off <= 1024 && len >= 4) {
2689
0
        fidx = off / 4;
2690
0
        nrec = (1024-off) / 4;
2691
0
        if (nrec > (len / 4))
2692
0
            nrec = len / 4;
2693
0
        dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, 0, nrec, fidx, true);
2694
0
    }
2695
2696
0
    nrec = len / 4 - nrec;
2697
0
    if (!nrec)
2698
0
        return;
2699
0
    if (nrec > 256)
2700
0
        nrec = 256;
2701
2702
0
    fidx = (off > 1028) ? (off - 1028) / 4 : 0;
2703
0
    off = (off < 1028) ? (1028 - off) : 0;
2704
2705
0
    dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, off, nrec, fidx, false);
2706
0
}
2707
2708
static const value_string stest_type_active_tbl[] = {
2709
    { 0,  "No device self-test operation in progress" },
2710
    { 1,  "Short device self-test operation in progress" },
2711
    { 2,  "Extended device self-test operation in progress" },
2712
    { 0xE,  "Vendor Specific" },
2713
    { 0, NULL}
2714
};
2715
2716
static const value_string stest_result_tbl[] = {
2717
    { 0, "Operation completed without error" },
2718
    { 1, "Operation was aborted by a Device Self-test command" },
2719
    { 2, "Operation was aborted by a Controller Level Reset" },
2720
    { 3, "Operation was aborted due to a removal of a namespace from the namespace inventory" },
2721
    { 4, "Operation was aborted due to the processing of a Format NVM command" },
2722
    { 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" },
2723
    { 6, "Operation completed with a segment that failed and the segment that failed is not known" },
2724
    { 7, "Operation completed with one or more failed segments and the first segment that failed is indicated in the Segment Number field" },
2725
    { 8, "Operation was aborted for unknown reason" },
2726
    { 9, "Operation was aborted due to a sanitize operation" },
2727
    { 0xF, "Entry not used (does not contain a test result)" },
2728
    {  0, NULL}
2729
};
2730
2731
static const value_string stest_type_done_tbl[] = {
2732
    { 1,  "Short device self-test operation in progress" },
2733
    { 2,  "Extended device self-test operation in progress" },
2734
    { 0xE,  "Vendor Specific" },
2735
    { 0, NULL}
2736
};
2737
2738
static void dissect_nvme_get_logpage_selftest_result(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned tst_idx)
2739
0
{
2740
0
    proto_item *ti;
2741
2742
0
    ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_selftest_res, cmd_tvb, off, 24, NULL,
2743
0
                                "Latest Self-test Result Data Structure (latest %u)", tst_idx);
2744
0
    grp =  proto_item_add_subtree(ti, ett_data);
2745
0
    add_group_mask_entry(cmd_tvb, grp, off, 1, ASPEC(hf_nvme_get_logpage_selftest_res_status));
2746
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sn, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN);
2747
0
    add_group_mask_entry(cmd_tvb, grp, off+2, 1, ASPEC(hf_nvme_get_logpage_selftest_res_vdi));
2748
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_rsvd, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN);
2749
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_poh, cmd_tvb, off+4, 8, ENC_LITTLE_ENDIAN);
2750
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_nsid, cmd_tvb, off+12, 4, ENC_LITTLE_ENDIAN);
2751
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_flba, cmd_tvb, off+16, 8, ENC_LITTLE_ENDIAN);
2752
0
    add_group_mask_entry(cmd_tvb, grp, off+24, 1, ASPEC(hf_nvme_get_logpage_selftest_res_sct));
2753
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sc, cmd_tvb, off+25, 1, ENC_LITTLE_ENDIAN);
2754
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_vs, cmd_tvb, off+26, 2, ENC_LITTLE_ENDIAN);
2755
0
}
2756
2757
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)
2758
0
{
2759
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2760
0
    proto_tree *grp;
2761
0
    unsigned tst_idx;
2762
2763
0
    off += tr_off;
2764
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 536)
2765
0
        return; /* max offset is <= 536, so we do not loose bits by casting to unsigned type */
2766
2767
0
    grp =  proto_item_add_subtree(ti, ett_data);
2768
2769
0
    if (!off && len >= 1)
2770
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_selftest_csto));
2771
0
    if (off <= 1 && (2 - off) <= len)
2772
0
        add_group_mask_entry(cmd_tvb, grp, 1-off, 1, ASPEC(hf_nvme_get_logpage_selftest_cstc));
2773
0
    if (off <= 2 && (4 - off) <= len)
2774
0
         proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_rsvd, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN);
2775
2776
0
    if (off <= 4) {
2777
0
        len -= (4-off);
2778
0
        tst_idx = 0;
2779
0
        off = 4;
2780
0
    } else {
2781
0
        tst_idx = (off - 4 + 27) / 28;
2782
0
        len -= (tst_idx * 28 - (off - 4));
2783
0
        off = 4 + (tst_idx * 8);
2784
0
    }
2785
0
    while (len >= 28) {
2786
0
        dissect_nvme_get_logpage_selftest_result(grp, cmd_tvb, off, tst_idx);
2787
0
        off += 28;
2788
0
        len -= 28;
2789
0
    }
2790
0
}
2791
2792
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)
2793
0
{
2794
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off  & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2795
0
    proto_tree *grp;
2796
0
    uint64_t next_block;
2797
0
    uint32_t poff;
2798
0
    const char *pfx = (cmd_ctx->cmd_ctx.get_logpage.lid == 0x7) ? "Host-Initiated" : "Controller-Initiated";
2799
2800
0
    off += tr_off;
2801
0
    poff = 512 - (off & 0x1ff);
2802
0
    next_block = (off + poff) / 512;
2803
2804
0
    grp =  proto_item_add_subtree(ti, ett_data);
2805
2806
2807
0
    if (poff >= len && cmd_ctx->cmd_ctx.get_logpage.off >= 384)
2808
0
        return;
2809
2810
0
    if (!off && len >= 1)
2811
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_li, cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN);
2812
0
    if (off <= 1 && (5 - off) <= len)
2813
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd0, cmd_tvb, 1-off, 4, ENC_LITTLE_ENDIAN);
2814
0
    if (off <= 5 && (8 - off) <= len)
2815
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ieee, cmd_tvb, 5-off, 3, ENC_LITTLE_ENDIAN);
2816
0
    if (off <= 8 && (10 - off) <= len)
2817
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da1lb, cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN);
2818
0
    if (off <= 10 && (12 - off) <= len)
2819
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da2lb, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN);
2820
0
    if (off <= 12 && (14 - off) <= len)
2821
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da3lb, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN);
2822
0
    if (off <= 14 && (372 - off) <= len)
2823
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd1, cmd_tvb, 14-off, 368, ENC_NA);
2824
0
    if (off <= 382 && (383 - off) <= len)
2825
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da, cmd_tvb, 382-off, 1, ENC_LITTLE_ENDIAN);
2826
0
    if (off <= 383 && (384 - off) <= len)
2827
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_dgn, cmd_tvb, 383-off, 1, ENC_LITTLE_ENDIAN);
2828
0
    if (off <= 384 && (512 - off) <= len)
2829
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ri, cmd_tvb, 384-off, 128, ENC_NA);
2830
2831
0
    len -= poff;
2832
0
    while (len >= 512) {
2833
0
         proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_telemetry_db, cmd_tvb, poff, 512, NULL,
2834
0
                                           "Telemetry %s data block %"PRIu64, pfx, next_block);
2835
0
        len -= 512;
2836
0
        next_block++;
2837
0
        poff += 512;
2838
0
    }
2839
0
}
2840
2841
static void dissect_nvme_get_logpage_egroup_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
2842
0
{
2843
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2844
0
    proto_tree *grp;
2845
2846
0
    if (cmd_ctx->cmd_ctx.get_logpage.off >= 512)
2847
0
        return; /* max allowed offset is < 512, so we do not loose bits by casting to unsigned type */
2848
2849
0
    grp =  proto_item_add_subtree(ti, ett_data);
2850
0
    if (!off && len >= 1)
2851
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_egroup_cw));
2852
0
    if (off <= 1 && (3 - off) <= len)
2853
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd0,  cmd_tvb, 1-off, 2, ENC_LITTLE_ENDIAN);
2854
0
    if (off <= 3 && (4 - off) <= len)
2855
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_as,  cmd_tvb, 3-off, 1, ENC_LITTLE_ENDIAN);
2856
0
    if (off <= 4 && (5 - off) <= len)
2857
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ast,  cmd_tvb, 4-off, 1, ENC_LITTLE_ENDIAN);
2858
0
    if (off <= 5 && (6 - off) <= len)
2859
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_pu,  cmd_tvb, 5-off, 1, ENC_LITTLE_ENDIAN);
2860
0
    if (off <= 6 && (32 - off) <= len)
2861
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd1,  cmd_tvb, 6-off, 26, ENC_NA);
2862
0
    if (off <= 32 && (48 - off) <= len) {
2863
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ee,  cmd_tvb, 32-off, 16, ENC_NA);
2864
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 32-off);
2865
0
    }
2866
0
    if (off <= 48 && (64 - off) <= len) {
2867
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_dur,  cmd_tvb, 48-off, 16, ENC_NA);
2868
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 48-off);
2869
0
    }
2870
0
    if (off <= 64 && (80 - off) <= len) {
2871
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_duw,  cmd_tvb, 64-off, 16, ENC_NA);
2872
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 64-off);
2873
0
    }
2874
0
    if (off <= 80 && (96 - off) <= len) {
2875
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_muw,  cmd_tvb, 80-off, 16, ENC_NA);
2876
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 80-off);
2877
0
    }
2878
0
    if (off <= 96 && (112 - off) <= len) {
2879
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hrc,  cmd_tvb, 96-off, 16, ENC_NA);
2880
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 96-off);
2881
0
    }
2882
0
    if (off <= 112 && (128 - off) <= len) {
2883
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hwc,  cmd_tvb, 112-off, 16, ENC_NA);
2884
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 112-off);
2885
0
    }
2886
0
    if (off <= 128 && (144 - off) <= len) {
2887
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_mdie,  cmd_tvb, 128-off, 16, ENC_NA);
2888
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 128-off);
2889
0
    }
2890
0
    if (off <= 144 && (160 - off) <= len) {
2891
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ele,  cmd_tvb, 144-off, 16, ENC_NA);
2892
0
        post_add_intval_from_16bytes(ti, cmd_tvb, 144-off);
2893
0
    }
2894
0
    if (off <= 508 && (512 - off) <= len) {
2895
0
        unsigned poff = (off <= 160) ? (160 - off) : (off - 160);
2896
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd2,  cmd_tvb, poff, len - poff, ENC_NA);
2897
0
    }
2898
0
}
2899
static const value_string plat_status_tbl[] = {
2900
    { 0,  "Predictable Latency Mode not Enabled" },
2901
    { 1,  "Deterministic Window (DTWIN)" },
2902
    { 2,  "Non-Deterministic Window (NDWIN)" },
2903
    { 0, NULL}
2904
};
2905
2906
static void dissect_nvme_get_logpage_pred_lat_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
2907
0
{
2908
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
2909
0
    proto_tree *grp;
2910
0
    unsigned poff;
2911
2912
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 508)
2913
0
        return; /* max allowed offset is < 508, so we do not loose bits by casting to unsigned type */
2914
2915
0
    grp =  proto_item_add_subtree(ti, ett_data);
2916
0
    if (!off && len >= 1)
2917
0
        add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_pred_lat_status));
2918
0
    if (off <= 1 && (2 - off) <= len)
2919
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd0,  cmd_tvb, 1-off, 1, ENC_LITTLE_ENDIAN);
2920
0
    if (off <= 2 && (4 - off) <= len)
2921
0
        add_group_mask_entry(cmd_tvb, grp, 2-off, 2, ASPEC(hf_nvme_get_logpage_pred_lat_etype));
2922
0
    if (off <= 4 && (32 - off) <= len)
2923
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd1,  cmd_tvb, 4-off, 28, ENC_NA);
2924
0
    if (off <= 32 && (40 - off) <= len)
2925
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_rt,  cmd_tvb, 32-off, 8, ENC_LITTLE_ENDIAN);
2926
0
    if (off <= 40 && (48 - off) <= len)
2927
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_wt,  cmd_tvb, 40-off, 8, ENC_LITTLE_ENDIAN);
2928
0
    if (off <= 48 && (56 - off) <= len)
2929
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_tm,  cmd_tvb, 48-off, 8, ENC_LITTLE_ENDIAN);
2930
0
    if (off <= 56 && (64 - off) <= len)
2931
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tmh,  cmd_tvb, 56-off, 8, ENC_LITTLE_ENDIAN);
2932
0
    if (off <= 64 && (72 - off) <= len)
2933
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tml,  cmd_tvb, 64-off, 8, ENC_LITTLE_ENDIAN);
2934
0
    if (off <= 72 && (128 - off) <= len)
2935
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd2,  cmd_tvb, 72-off, 56, ENC_NA);
2936
0
    if (off <= 128 && (136 - off) <= len)
2937
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_re,  cmd_tvb, 128-off, 8, ENC_LITTLE_ENDIAN);
2938
0
    if (off <= 136 && (144 - off) <= len)
2939
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_we,  cmd_tvb, 136-off, 8, ENC_LITTLE_ENDIAN);
2940
0
    if (off <= 144 && (152 - off) <= len)
2941
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_te,  cmd_tvb, 144-off, 8, ENC_LITTLE_ENDIAN);
2942
0
    poff = (off <= 152) ? (152 - off) : 0;
2943
0
    if (poff > len)
2944
0
        return;
2945
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd3,  cmd_tvb, poff, len - poff, ENC_NA);
2946
0
}
2947
2948
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)
2949
0
{
2950
0
    uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off;
2951
0
    proto_tree *grp;
2952
0
    unsigned poff;
2953
2954
0
    off += tr_off;
2955
0
    if (off < 8) {
2956
0
        poff = (cmd_ctx->cmd_ctx.get_logpage.off & 0x7);
2957
0
        poff = 8 - poff;
2958
0
    } else {
2959
0
        poff = 0;
2960
0
    }
2961
0
    if (len < (poff + 2) && off)
2962
0
        return; /* nothing to display */
2963
2964
0
    grp =  proto_item_add_subtree(ti, ett_data);
2965
0
    if (!off && len >= 8)
2966
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_ne,  cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
2967
0
    len -= poff;
2968
0
    while (len >= 2) {
2969
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_nset,  cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN);
2970
0
        poff += 2;
2971
0
        len -= 2;
2972
0
    }
2973
0
}
2974
2975
static const value_string ana_state_tbl[] = {
2976
    { 0x1,  "ANA Optimized State" },
2977
    { 0x2,  "ANA Non-Optimized State" },
2978
    { 0x3,  "ANA Inaccessible State" },
2979
    { 0x4,  "ANA Persistent Loss State" },
2980
    { 0xF,  "ANA Change Sate" },
2981
    { 0, NULL}
2982
};
2983
2984
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)
2985
0
{
2986
0
    unsigned done = 0;
2987
0
    unsigned bytes;
2988
0
    proto_item *ti;
2989
0
    unsigned group_id;
2990
0
    unsigned nns;
2991
0
    unsigned prev_off = cmd_ctx->cmd_ctx.get_logpage.tr_off;
2992
2993
0
    if (len < 4) {
2994
0
        if (prev_off)
2995
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += len;
2996
0
        return 0;
2997
0
    }
2998
2999
0
    if (prev_off <= 4) {
3000
0
        nns = tvb_get_uint32(cmd_tvb, poff+4-prev_off, ENC_LITTLE_ENDIAN);
3001
0
        bytes = 32 + 4 * nns;
3002
0
        cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns;
3003
0
    } else if (prev_off ) {
3004
0
        nns = cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries;
3005
0
        bytes = (prev_off > 32) ? 4 * nns : ((32-prev_off) + 4 * nns);
3006
0
    } else {
3007
0
        bytes = len;
3008
0
    }
3009
3010
0
    if (bytes > len)
3011
0
            bytes = len;
3012
3013
0
    ti = proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_ana_grp, cmd_tvb, poff, bytes, NULL,
3014
0
            "ANA Group Descriptor");
3015
0
    grp =  proto_item_add_subtree(ti, ett_data);
3016
3017
0
    if (prev_off) {
3018
0
        group_id = cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id;
3019
0
        proto_item_append_text(ti, " %u (continued)", group_id);
3020
0
    } else {
3021
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_grp_id,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN, &group_id);
3022
0
        done += 4;
3023
0
        proto_item_append_text(ti, " %u", group_id);
3024
0
        cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = group_id;
3025
0
    }
3026
3027
0
    if (prev_off <= 4) {
3028
0
        if ((len - done) < 4) {
3029
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
3030
0
            return done;
3031
0
        }
3032
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nns,  cmd_tvb, poff+4-prev_off, 4, ENC_LITTLE_ENDIAN);
3033
0
        done += 4;
3034
0
    }
3035
0
    if (prev_off <= 8) {
3036
0
        if ((len - done) < 8) {
3037
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
3038
0
            return done;
3039
0
        }
3040
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_chcnt,  cmd_tvb, poff+8-prev_off, 8, ENC_LITTLE_ENDIAN);
3041
0
        done += 8;
3042
0
    }
3043
3044
0
    if (prev_off <= 16) {
3045
0
        if ((len - done) < 1) {
3046
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
3047
0
            return done;
3048
0
        }
3049
0
        add_group_mask_entry(cmd_tvb, grp, poff+16-prev_off, 1, ASPEC(hf_nvme_get_logpage_ana_grp_anas));
3050
0
        done += 1;
3051
0
    }
3052
3053
0
    if (prev_off <= 17) {
3054
0
        if ((len - done) < 15) {
3055
0
            cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
3056
0
            return done;
3057
0
        }
3058
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_rsvd,  cmd_tvb, poff+17-prev_off, 15, ENC_NA);
3059
0
        done += 15;
3060
0
    }
3061
3062
0
    poff += done;
3063
0
    while ((len - done) >= 4 && nns) {
3064
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nsid,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN);
3065
0
        poff += 4;
3066
0
        done += 4;
3067
0
        nns--;
3068
0
    }
3069
0
    if (nns) {
3070
0
        cmd_ctx->cmd_ctx.get_logpage.tr_off += done;
3071
0
        cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns;
3072
0
    } else {
3073
0
        cmd_ctx->cmd_ctx.get_logpage.tr_off = 0;
3074
0
        cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = 0;
3075
0
        cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = 0;
3076
0
        cmd_ctx->cmd_ctx.get_logpage.records--;
3077
0
    }
3078
0
    return done;
3079
0
}
3080
3081
static unsigned dissect_nvme_get_logpage_ana_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off)
3082
0
{
3083
0
    unsigned groups=1;
3084
0
    if (!off && len >= 8)
3085
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_chcnt,  cmd_tvb, off, 8, ENC_LITTLE_ENDIAN);
3086
0
    if (off <= 8 && (10 - off) <= len)
3087
0
        proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_ngd,  cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN, &groups);
3088
0
    if (off <= 10 && (16 - off) <= len)
3089
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_ana_rsvd,  cmd_tvb, 10-off, 6, ENC_LITTLE_ENDIAN);
3090
0
    return groups;
3091
0
}
3092
3093
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)
3094
0
{
3095
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
3096
0
    proto_tree *grp;
3097
0
    unsigned poff = 0;
3098
0
    unsigned groups = 1;
3099
3100
0
    grp =  proto_item_add_subtree(ti, ett_data);
3101
0
    if (cmd_ctx->cmd_ctx.get_logpage.off < 16 && !tr_off) {
3102
0
        groups = dissect_nvme_get_logpage_ana_resp_header(grp, cmd_tvb, len, off);
3103
0
        cmd_ctx->cmd_ctx.get_logpage.records = groups;
3104
0
        poff = 16 - off;
3105
0
    } else if (tr_off) {
3106
0
        groups = cmd_ctx->cmd_ctx.get_logpage.records;
3107
0
    }
3108
0
    len -= poff;
3109
0
    while (len >= 4 && groups) {
3110
0
        unsigned done = dissect_nvme_get_logpage_ana_resp_grp(grp, cmd_tvb, cmd_ctx, len, poff);
3111
0
        poff += done;
3112
0
        len -= done;
3113
0
        groups--;
3114
0
    }
3115
0
}
3116
3117
static void dissect_nvme_get_logpage_lba_status_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off)
3118
0
{
3119
0
    if (!off && len >= 4)
3120
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lslplen,  cmd_tvb, off, 4, ENC_LITTLE_ENDIAN);
3121
0
    if (off <= 4 && (8 - off) <= len)
3122
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nlslne,  cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN);
3123
0
    if (off <= 8 && (12 - off) <= len)
3124
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_estulb,  cmd_tvb, 8-off, 4, ENC_LITTLE_ENDIAN);
3125
0
    if (off <= 12 && (14 - off) <= len)
3126
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_rsvd,  cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN);
3127
0
    if (off <= 14 && (16 - off) <= len)
3128
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lsgc,  cmd_tvb, 14-off, 2, ENC_LITTLE_ENDIAN);
3129
0
    if (off <= 16 && (20 - off) <= len)
3130
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel,  cmd_tvb, 16-off, len - (16-off), ENC_NA);
3131
0
}
3132
3133
static unsigned dissect_nvme_get_logpage_lba_status_lba_range(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t poff)
3134
0
{
3135
0
    uint32_t slen;
3136
0
    proto_item *ti;
3137
0
    unsigned done;
3138
3139
0
    if (len >= 16) {
3140
0
        slen = tvb_get_uint8(cmd_tvb, 4);
3141
0
        if (!slen || slen == 0xffffffff)
3142
0
            slen = 16;
3143
0
        else
3144
0
            slen = 16 * (slen + 1);
3145
0
        if (slen > len)
3146
0
            slen = len;
3147
0
    } else {
3148
0
        slen = len;
3149
0
    }
3150
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne,  cmd_tvb, poff, slen, ENC_NA);
3151
0
    grp =  proto_item_add_subtree(ti, ett_data);
3152
3153
0
    if (len >= 4)
3154
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_neid,  cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN);
3155
0
    if (len >= 8)
3156
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_nlrd,  cmd_tvb, poff+4, 4, ENC_LITTLE_ENDIAN);
3157
0
    if (len >= 9)
3158
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_ratype,  cmd_tvb, poff+8, 1, ENC_LITTLE_ENDIAN);
3159
0
    if (len >= 16)
3160
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rsvd,  cmd_tvb, poff+9, 7, ENC_NA);
3161
3162
0
    if (len <= 16)
3163
0
        return len;
3164
3165
0
    len -= 16;
3166
0
    poff += 16;
3167
0
    done = 16;
3168
0
    while (len >= 8) {
3169
0
        ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd,  cmd_tvb, poff, len >= 16 ? 16 : len, ENC_NA);
3170
0
        grp =  proto_item_add_subtree(ti, ett_data);
3171
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba, cmd_tvb, poff, 8, ENC_LITTLE_ENDIAN);
3172
0
        if (len >= 12)
3173
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb, cmd_tvb, poff+8, 4, ENC_LITTLE_ENDIAN);
3174
0
        if (len >= 16)
3175
0
            proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd, cmd_tvb, poff+12, 4, ENC_LITTLE_ENDIAN);
3176
0
        if (len >= 16) {
3177
0
            done += 16;
3178
0
            poff += 16;
3179
0
        } else {
3180
0
            done += len;
3181
0
            len = 0;
3182
0
        }
3183
0
    }
3184
0
    return done;
3185
0
}
3186
3187
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)
3188
0
{
3189
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
3190
0
    proto_tree *grp = NULL;
3191
0
    unsigned poff = 0;
3192
3193
0
    off += tr_off;
3194
0
    if (off < 16) {
3195
0
        grp =  proto_item_add_subtree(ti, ett_data);
3196
0
        dissect_nvme_get_logpage_lba_status_resp_header(grp, cmd_tvb, len, off);
3197
0
        poff = 16 - off;
3198
0
    } else if (off & 15) {
3199
0
        poff = 16 - (off & 15);
3200
0
    }
3201
3202
0
    if (len < (poff + 8))
3203
0
        return;
3204
3205
0
    if (off >= 16)
3206
0
        grp =  proto_item_add_subtree(ti, ett_data);
3207
3208
0
    len -= poff;
3209
0
    ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel,  cmd_tvb, poff, len, ENC_NA);
3210
0
    grp =  proto_item_add_subtree(ti, ett_data);
3211
3212
0
    while (len >= 8) {
3213
0
        unsigned done = dissect_nvme_get_logpage_lba_status_lba_range(grp, cmd_tvb, len, poff);
3214
0
        poff += done;
3215
0
        len -= done;
3216
0
    }
3217
0
}
3218
3219
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)
3220
0
{
3221
0
    proto_tree *grp;
3222
0
    unsigned poff = 0;
3223
3224
0
    if (!tr_off) {
3225
0
        if (cmd_ctx->cmd_ctx.get_logpage.off < 8) {
3226
0
            poff = 8 - (unsigned)cmd_ctx->cmd_ctx.get_logpage.off;
3227
0
            if (poff > len || (cmd_ctx->cmd_ctx.get_logpage.off && poff == len))
3228
0
                return;
3229
0
        } else if (len < 2) {
3230
0
            return;
3231
0
        }
3232
0
    }
3233
3234
0
    len -= poff;
3235
0
    grp =  proto_item_add_subtree(ti, ett_data);
3236
0
    if (!(cmd_ctx->cmd_ctx.get_logpage.off + tr_off))
3237
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_ne, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
3238
0
    while (len >= 2) {
3239
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_eg, cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN);
3240
0
        len -= 2;
3241
0
        poff += 2;
3242
0
    }
3243
0
}
3244
3245
static const value_string rnlpt_tbl[] = {
3246
    { 0,  "Empty Log Page" },
3247
    { 1,  "Registration Preempted" },
3248
    { 2,  "Reservation Released" },
3249
    { 3,  "Reservation Preempted" },
3250
    { 0, NULL}
3251
};
3252
3253
static void dissect_nvme_get_logpage_reserv_notif_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
3254
0
{
3255
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
3256
0
    proto_tree *grp;
3257
0
    unsigned poff = 0;
3258
3259
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 60)
3260
0
        return; /* max allowed offset is < 60, so we do not loose bits by casting to unsigned type */
3261
3262
0
    grp =  proto_item_add_subtree(ti, ett_data);
3263
0
    if (!off && len >= 8)
3264
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpc,  cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN);
3265
0
    if (off <= 8 && (9 - off) <= len)
3266
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpt,  cmd_tvb, 8-off, 1, ENC_LITTLE_ENDIAN);
3267
0
    if (off <= 9 && (10 - off) <= len)
3268
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nalp,  cmd_tvb, 9-off, 1, ENC_LITTLE_ENDIAN);
3269
0
    if (off <= 10 && (12 - off) <= len)
3270
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd0,  cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN);
3271
0
    if (off <= 12 && (16 - off) <= len)
3272
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nsid,  cmd_tvb, 12-off, 4, ENC_LITTLE_ENDIAN);
3273
0
    if (off < 16) {
3274
0
        poff = 16 - off;
3275
0
        if (len <= poff)
3276
0
            return;
3277
0
        len -= poff;
3278
0
        if (len > 48)
3279
0
            len = 48; /* max padding size is 48 */
3280
0
    } else {
3281
0
        if (len > (64 - off))
3282
0
            len = 64 - off; /* max padding size is 48 */
3283
0
    }
3284
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd1, cmd_tvb, poff, len, ENC_NA);
3285
0
}
3286
3287
3288
static const value_string san_mrst_tbl[] = {
3289
    { 0, "The NVM subsystem has never been sanitized" },
3290
    { 1, "The most recent sanitize operation completed successfully" },
3291
    { 2, "A sanitize operation is currently in progress" },
3292
    { 3, "The most recent sanitize operation failed" },
3293
    { 4, "The most recent sanitize operation with No-Deallocate has completed successfully with deallocation of all logical blocks"},
3294
    { 0, NULL}
3295
};
3296
3297
static void dissect_nvme_get_logpage_sanitize_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len)
3298
0
{
3299
0
    uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */
3300
0
    proto_tree *grp;
3301
0
    unsigned poff = 0;
3302
3303
0
    if (cmd_ctx->cmd_ctx.get_logpage.off > 508)
3304
0
        return; /* max allowed offset is < 508, so we do not loose bits by casting to unsigned type */
3305
3306
0
    grp =  proto_item_add_subtree(ti, ett_data);
3307
0
    if (!off && len >= 2)
3308
0
         proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_sprog,  cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN);
3309
0
    if (off <= 2 && (4 - off) <= len)
3310
0
        add_group_mask_entry(cmd_tvb, grp, 2 - off, 2, ASPEC(hf_nvme_get_logpage_sanitize_sstat));
3311
0
    if (off <= 4 && (8 - off) <= len)
3312
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_scdw10,  cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN);
3313
0
    if (off <= 8 && (12 - off) <= len)
3314
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_eto,  cmd_tvb, 8-off, 4, ENC_LITTLE_ENDIAN);
3315
0
    if (off <= 12 && (16 - off) <= len)
3316
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbe,  cmd_tvb, 12-off, 4, ENC_LITTLE_ENDIAN);
3317
0
    if (off <= 16 && (20 - off) <= len)
3318
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etce,  cmd_tvb, 16-off, 4, ENC_LITTLE_ENDIAN);
3319
0
    if (off <= 20 && (24 - off) <= len)
3320
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etond,  cmd_tvb, 20-off, 4, ENC_LITTLE_ENDIAN);
3321
0
    if (off <= 24 && (28 - off) <= len)
3322
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbend,  cmd_tvb, 24-off, 4, ENC_LITTLE_ENDIAN);
3323
0
    if (off <= 28 && (32 - off) <= len)
3324
0
        proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etcend,  cmd_tvb, 28-off, 4, ENC_LITTLE_ENDIAN);
3325
0
    if (off < 32) {
3326
0
        poff = 32 - off;
3327
0
        if (poff <= len)
3328
0
            return;
3329
0
        len -= poff;
3330
0
        if (len > (512 - poff))
3331
0
            len = 512 - poff;
3332
0
    } else {
3333
0
        if (len > (512 - off))
3334
0
            len = 512 - off;
3335
0
    }
3336
0
    proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_rsvd,  cmd_tvb, poff, len, ENC_NA);
3337
0
}
3338
3339
static void dissect_nvme_get_logpage_resp(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
3340
0
{
3341
0
    proto_item *ti = proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data, cmd_tvb, 0, len, NULL,
3342
0
                            "NVMe Get Log Page (%s)", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid));
3343
0
    switch(cmd_ctx->cmd_ctx.get_logpage.lid) {
3344
0
        case 0x70:
3345
0
            dissect_nvme_get_logpage_ify_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3346
0
        case 0x1:
3347
            /* fits smallest mtu */
3348
0
            dissect_nvme_get_logpage_err_inf_resp(ti, cmd_tvb, cmd_ctx, len); break;
3349
0
        case 0x2:
3350
            /* fits smallest mtu */
3351
0
            dissect_nvme_get_logpage_smart_resp(ti, cmd_tvb, cmd_ctx, len); break;
3352
0
        case 0x3:
3353
            /* fits smallest mtu */
3354
0
            dissect_nvme_get_logpage_fw_slot_resp(ti, cmd_tvb, cmd_ctx, len); break;
3355
0
        case 0x4:
3356
            /* decodes array of integers, does need to know packet offset */
3357
0
            dissect_nvme_get_logpage_changed_nslist_resp(ti, cmd_tvb, len); break;
3358
0
        case 0x5:
3359
0
            dissect_nvme_get_logpage_cmd_sup_and_eff_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3360
0
        case 0x6:
3361
0
            dissect_nvme_get_logpage_selftest_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3362
0
        case 0x7:
3363
0
        case 0x8:
3364
0
            dissect_nvme_get_logpage_telemetry_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3365
0
        case 0x9:
3366
            /* fits smallest mtu */
3367
0
            dissect_nvme_get_logpage_egroup_resp(ti, cmd_tvb, cmd_ctx, len); break;
3368
0
        case 0xA:
3369
            /* fits smallest mtu */
3370
0
            dissect_nvme_get_logpage_pred_lat_resp(ti, cmd_tvb, cmd_ctx, len); break;
3371
0
        case 0xB:
3372
0
            dissect_nvme_get_logpage_pred_lat_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3373
0
        case 0xC:
3374
0
            dissect_nvme_get_logpage_ana_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3375
0
        case 0xE:
3376
0
            dissect_nvme_get_logpage_lba_status_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3377
0
        case 0xF:
3378
0
            dissect_nvme_get_logpage_egroup_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break;
3379
0
        case 0x80:
3380
            /* fits smallest mtu */
3381
0
            dissect_nvme_get_logpage_reserv_notif_resp(ti, cmd_tvb, cmd_ctx, len); break;
3382
0
        case 0x81:
3383
            /* fits smallest mtu */
3384
0
            dissect_nvme_get_logpage_sanitize_resp(ti, cmd_tvb, cmd_ctx, len); break;
3385
0
        default:
3386
0
            return;
3387
0
    }
3388
0
}
3389
3390
static void dissect_nvme_get_logpage_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
3391
                                      struct nvme_cmd_ctx *cmd_ctx)
3392
0
{
3393
0
    proto_item *ti;
3394
0
    unsigned val;
3395
3396
0
    cmd_ctx->cmd_ctx.get_logpage.lid = tvb_get_uint8(cmd_tvb, 40);
3397
0
    cmd_ctx->cmd_ctx.get_logpage.lsp = tvb_get_uint8(cmd_tvb, 41) & 0xf;
3398
0
    cmd_ctx->cmd_ctx.get_logpage.lsi = tvb_get_uint16(cmd_tvb, 46, ENC_LITTLE_ENDIAN);
3399
0
    cmd_ctx->cmd_ctx.get_logpage.uid_idx = tvb_get_uint8(cmd_tvb, 56) & 0x7f;
3400
3401
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_logpage_dword10));
3402
0
    ti = proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_get_logpage_numd, cmd_tvb, 42, 4, ENC_LITTLE_ENDIAN, &val);
3403
0
    proto_item_append_text(ti, " (%"PRIu64" bytes)", ((uint64_t)(val+1)) * 4);
3404
3405
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_get_logpage_dword11));
3406
3407
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);
3408
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 */
3409
3410
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
3411
3412
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_logpage_dword14));
3413
3414
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
3415
0
}
3416
3417
typedef enum {
3418
    F_ARBITRATION = 0x01,
3419
    F_POWER_MGMT = 0x02,
3420
    F_LBA_RANGE_TYPE = 0x03,
3421
    F_TEMP_THRESHOLD = 0x04,
3422
    F_ERROR_RECOVERY = 0x05,
3423
    F_VOLATILE_WC = 0x06,
3424
    F_NUM_OF_QUEUES = 0x07,
3425
    F_IRQ_COALESCING = 0x08,
3426
    F_IRQ_VECTOR_CONF = 0x09,
3427
    F_WRITE_ATOM_NORM = 0x0A,
3428
    F_ASYNC_EVENT_CONF = 0x0B,
3429
    F_AUTO_PS_TRANSITION = 0x0C,
3430
    F_HOST_MEM_BUF = 0x0D,
3431
    F_TIMESTAMP = 0x0E,
3432
    F_KA_TIMER = 0x0F,
3433
    F_HOST_CNTL_THERM_MGMT = 0x10,
3434
    F_NO_POWER_STATE_CONF = 0x11,
3435
    F_READ_REC_LEVEL_CONF = 0x12,
3436
    F_PRED_LAT_MODE_CONF = 0x13,
3437
    F_PRED_LAT_MODE_WIND = 0x14,
3438
    F_LBA_ST_INF_REP_INT = 0x15,
3439
    F_HOST_BEHV_SUPPORT = 0x16,
3440
    F_SANITIZE_CON = 0x17,
3441
    F_END_GROUP_EV_CONF = 0x18,
3442
    F_SW_PR_MARKER = 0x80,
3443
    F_HOST_ID = 0x81,
3444
    F_RSRV_NOT_MASK = 0x82,
3445
    F_RSRV_PRST = 0x83,
3446
    F_NS_WRITE_CONF = 0x84,
3447
} nvme_setf_t;
3448
3449
3450
static const value_string fid_table[] = {
3451
    { F_ARBITRATION, "Arbitration" },
3452
    { F_POWER_MGMT, "Power Management" },
3453
    { F_LBA_RANGE_TYPE, "LBA Range Type" },
3454
    { F_TEMP_THRESHOLD, "Temperature Threshold" },
3455
    { F_ERROR_RECOVERY, "Error Recovery" },
3456
    { F_VOLATILE_WC, "Volatile Write Cache" },
3457
    { F_NUM_OF_QUEUES, "Number of Queues" },
3458
    { F_IRQ_COALESCING, "Interrupt Coalescing" },
3459
    { F_IRQ_VECTOR_CONF, "Interrupt Vector Configuration" },
3460
    { F_WRITE_ATOM_NORM, "Write Atomicity Normal" },
3461
    { F_ASYNC_EVENT_CONF, "Asynchronous Event Configuration" },
3462
    { F_AUTO_PS_TRANSITION, "Autonomous Power State Transition" },
3463
    { F_HOST_MEM_BUF, "Host Memory Buffer" },
3464
    { F_TIMESTAMP, "Timestamp" },
3465
    { F_KA_TIMER, "Keep Alive Timer" },
3466
    { F_HOST_CNTL_THERM_MGMT, "Host Controlled Thermal Management" },
3467
    { F_NO_POWER_STATE_CONF, "Non-Operational Power State Config" },
3468
    { F_READ_REC_LEVEL_CONF, "Read Recovery Level Config" },
3469
    { F_PRED_LAT_MODE_CONF, "Predictable Latency Mode Config" },
3470
    { F_PRED_LAT_MODE_WIND, "Predictable Latency Mode Window" },
3471
    { F_LBA_ST_INF_REP_INT, "LBA Status Information Report Interval" },
3472
    { F_HOST_BEHV_SUPPORT, "Host Behavior Support" },
3473
    { F_SANITIZE_CON, "Sanitize Config" },
3474
    { F_END_GROUP_EV_CONF, "Endurance Group Event Configuration" },
3475
    { F_SW_PR_MARKER, "Software Progress Marker" },
3476
    { F_HOST_ID, "Host Identifier" },
3477
    { F_RSRV_NOT_MASK, "Reservation Notification Mask" },
3478
    { F_RSRV_PRST, "Reservation Persistence" },
3479
    { F_NS_WRITE_CONF, "Namespace Write Protection Config" },
3480
    { 0, NULL },
3481
};
3482
3483
static const value_string sel_table[] = {
3484
    { 0, "Current" },
3485
    { 1, "Default" },
3486
    { 2, "Saved" },
3487
    { 3, "Supported Capabilities" },
3488
    { 0, NULL },
3489
};
3490
3491
static const value_string sf_tmpsel_table[] = {
3492
    { 0x0, "Composite Temperature" },
3493
    { 0x1, "Temperature Sensor 1" },
3494
    { 0x2, "Temperature Sensor 2" },
3495
    { 0x3, "Temperature Sensor 3" },
3496
    { 0x4, "Temperature Sensor 4" },
3497
    { 0x5, "Temperature Sensor 5" },
3498
    { 0x6, "Temperature Sensor 6" },
3499
    { 0x7, "Temperature Sensor 7" },
3500
    { 0x8, "Temperature Sensor 8" },
3501
    { 0xF, "All Temperature Sensors" },
3502
    { 0, NULL },
3503
};
3504
3505
static const value_string sf_thpsel_table[] = {
3506
    { 0x0, "Over Temperature Threshold" },
3507
    { 0x1, "Under Temperature Threshold" },
3508
    { 0x2, "Reserved" },
3509
    { 0x3, "Reserved" },
3510
    { 0, NULL },
3511
};
3512
3513
static const value_string sf_ws_table[] = {
3514
    { 0x0, "Reserved" },
3515
    { 0x1, "Deterministic Window" },
3516
    { 0x2, "Non-Deterministic Window" },
3517
    { 0x3, "Reserved" },
3518
    { 0x4, "Reserved" },
3519
    { 0x5, "Reserved" },
3520
    { 0x6, "Reserved" },
3521
    { 0x7, "Reserved" },
3522
    { 0, NULL },
3523
};
3524
3525
static const value_string sf_wps[] = {
3526
    { 0x0, "No Write Protect" },
3527
    { 0x1, "Write Protect" },
3528
    { 0x2, "Write Protect Until Power Cycle" },
3529
    { 0x3, "Permanent Write Protect" },
3530
    { 0x4, "Reserved" },
3531
    { 0x5, "Reserved" },
3532
    { 0x6, "Reserved" },
3533
    { 0x7, "Reserved" },
3534
    { 0, NULL },
3535
};
3536
3537
static void add_nvme_queues(char *result, uint32_t val)
3538
0
{
3539
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u)", val, val+1);
3540
0
}
3541
3542
static void dissect_nvme_set_features_dword11(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid)
3543
0
{
3544
0
    switch (fid) {
3545
0
        case F_ARBITRATION: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_arb)); break;
3546
0
        case F_POWER_MGMT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_pm)); break;
3547
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;
3548
0
        case F_TEMP_THRESHOLD: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_tt)); break;
3549
0
        case F_ERROR_RECOVERY: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_erec)); break;
3550
0
        case F_VOLATILE_WC: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_vwce)); break;
3551
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;
3552
0
        case F_IRQ_COALESCING: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_irqc)); break;
3553
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;
3554
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;
3555
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;
3556
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;
3557
0
        case F_KA_TIMER: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_kat)); break;
3558
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;
3559
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;
3560
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;
3561
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;
3562
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;
3563
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;
3564
0
        case F_SANITIZE_CON: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_san)); break;
3565
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;
3566
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;
3567
0
        case F_HOST_ID: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hid)); break;
3568
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;
3569
0
        case F_RSRV_PRST: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rsrvp)); break;
3570
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;
3571
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN);
3572
0
    }
3573
0
}
3574
3575
static void dissect_nvme_set_features_dword12(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid)
3576
0
{
3577
0
    switch (fid) {
3578
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;
3579
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;
3580
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;
3581
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
3582
0
    }
3583
0
}
3584
3585
static void dissect_nvme_set_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
3586
                                      struct nvme_cmd_ctx *cmd_ctx)
3587
0
{
3588
0
    cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40);
3589
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_set_features_dword10));
3590
0
    dissect_nvme_set_features_dword11(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid);
3591
0
    dissect_nvme_set_features_dword12(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid);
3592
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
3593
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_set_features_dword14));
3594
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
3595
0
}
3596
3597
static void dissect_nvme_get_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree,
3598
                                      struct nvme_cmd_ctx *cmd_ctx)
3599
0
{
3600
0
    cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40);
3601
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_features_dword10));
3602
0
    switch(cmd_ctx->cmd_ctx.set_features.fid) {
3603
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;
3604
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;
3605
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;
3606
0
        default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); break;
3607
0
    }
3608
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN);
3609
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN);
3610
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_features_dword14));
3611
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN);
3612
0
}
3613
3614
static void dissect_nvme_rw_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree)
3615
0
{
3616
0
    proto_item *ti, *dsm_tree, *item;
3617
0
    uint8_t val;
3618
3619
0
    dissect_nvme_rwc_common_word_10_11_12_14_15(cmd_tvb, cmd_tree);
3620
3621
0
    ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_dsm, cmd_tvb, 52,
3622
0
                             1, ENC_NA);
3623
0
    dsm_tree = proto_item_add_subtree(ti, ett_data);
3624
3625
0
    val = tvb_get_uint8(cmd_tvb, 52) & 0x0f;
3626
0
    item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_freq, cmd_tvb,
3627
0
                               52, 1, ENC_LITTLE_ENDIAN);
3628
0
    proto_item_append_text(item, " %s",
3629
0
                           val_to_str_const(val, dsm_acc_freq_tbl, "Reserved"));
3630
3631
0
    val = (tvb_get_uint8(cmd_tvb, 52) & 0x30) >> 4;
3632
0
    item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_lat, cmd_tvb,
3633
0
                               52, 1, ENC_LITTLE_ENDIAN);
3634
0
    proto_item_append_text(item, " %s",
3635
0
                           val_to_str_const(val, dsm_acc_lat_tbl, "Reserved"));
3636
3637
0
    proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_seq_req, cmd_tvb,
3638
0
                        52, 1, ENC_LITTLE_ENDIAN);
3639
0
    proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_incompressible, cmd_tvb,
3640
0
                        52, 1, ENC_LITTLE_ENDIAN);
3641
0
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd3, cmd_tvb,
3642
0
                        53, 3, ENC_NA);
3643
0
}
3644
3645
static const value_string sf_lbart_type_table[] = {
3646
    { 0x0, "General Purpose" },
3647
    { 0x1, "Filesystem" },
3648
    { 0x2, "RAID" },
3649
    { 0x3, "Cache" },
3650
    { 0x4, "Swap" },
3651
    { 0, NULL },
3652
};
3653
3654
static void dissect_nvme_set_features_transfer_lbart(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len)
3655
0
{
3656
0
    proto_tree *grp;
3657
0
    proto_item *ti;
3658
0
    unsigned done = 0;
3659
0
    while (len >= 64) {
3660
0
        ti =  proto_tree_add_bytes_format_value(tree, hf_nvme_set_features_tr_lbart, tvb, 0, 64, NULL, "LBA Range Structure %u", (done + off) / 64);
3661
0
        grp =  proto_item_add_subtree(ti, ett_data);
3662
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_type, tvb, done, 1, ENC_LITTLE_ENDIAN);
3663
0
        add_group_mask_entry(tvb, grp, done+1, 1, ASPEC(hf_nvme_set_features_tr_lbart_attr));
3664
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd0, tvb, done+2, 14, ENC_NA);
3665
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_slba, tvb, done+16, 8, ENC_LITTLE_ENDIAN);
3666
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_nlb, tvb, done+24, 8, ENC_LITTLE_ENDIAN);
3667
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_guid, tvb, done+32, 16, ENC_NA);
3668
0
        proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd1, tvb, done+48, 16, ENC_NA);
3669
0
        len -= 64;
3670
0
        done += 64;
3671
0
    }
3672
0
}
3673
3674
static void dissect_nvme_set_features_transfer_apst(tvbuff_t *tvb, proto_tree *tree, unsigned len)
3675
0
{
3676
0
    unsigned off = 0;
3677
0
    while (len >= 8) {
3678
0
        add_group_mask_entry(tvb, tree, off, 8, ASPEC(hf_nvme_set_features_tr_apst));
3679
0
        len -= 8;
3680
0
        off += 8;
3681
0
    }
3682
0
}
3683
3684
static void dissect_nvme_set_features_transfer_tst(tvbuff_t *tvb, proto_tree *tree)
3685
0
{
3686
0
    add_group_mask_entry(tvb, tree, 0, 8, ASPEC(hf_nvme_set_features_tr_tst));
3687
0
}
3688
3689
3690
static void dissect_nvme_set_features_transfer_plmc(tvbuff_t *tvb, proto_tree *tree, unsigned len)
3691
0
{
3692
0
    proto_tree *grp;
3693
0
    proto_item *ti;
3694
3695
0
    ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_plmc, tvb, 0, len, ENC_NA);
3696
0
    grp =  proto_item_add_subtree(ti, ett_data);
3697
0
    add_group_mask_entry(tvb, grp, 0, 2, ASPEC(hf_nvme_set_features_tr_plmc_ee));
3698
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd0, tvb, 2, 30, ENC_NA);
3699
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinrt, tvb, 32, 8, ENC_LITTLE_ENDIAN);
3700
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinwt, tvb, 40, 8, ENC_LITTLE_ENDIAN);
3701
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwintt, tvb, 48, 8, ENC_LITTLE_ENDIAN);
3702
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd1, tvb, 56, len-56, ENC_NA);
3703
0
}
3704
3705
static void dissect_nvme_set_features_transfer_hbs(tvbuff_t *tvb, proto_tree *tree, unsigned len)
3706
0
{
3707
0
    proto_tree *grp;
3708
0
    proto_item *ti;
3709
3710
0
    ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_hbs, tvb, 0, len, ENC_NA);
3711
0
    grp =  proto_item_add_subtree(ti, ett_data);
3712
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_acre, tvb, 0, 1, ENC_LITTLE_ENDIAN);
3713
0
    proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_rsvd, tvb, 1, len-1, ENC_NA);
3714
0
}
3715
3716
static void dissect_nvme_set_features_transfer(tvbuff_t *tvb, proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len)
3717
0
{
3718
0
    switch(cmd_ctx->cmd_ctx.set_features.fid) {
3719
0
        case F_LBA_RANGE_TYPE:
3720
0
            dissect_nvme_set_features_transfer_lbart(tvb, tree, off, len);
3721
0
            break;
3722
0
        case F_AUTO_PS_TRANSITION:
3723
0
            dissect_nvme_set_features_transfer_apst(tvb, tree, len);
3724
0
            break;
3725
0
        case F_TIMESTAMP:
3726
0
            dissect_nvme_set_features_transfer_tst(tvb, tree);
3727
0
            break;
3728
0
        case F_PRED_LAT_MODE_CONF:
3729
0
            dissect_nvme_set_features_transfer_plmc(tvb, tree, len);
3730
0
            break;
3731
0
        case F_HOST_BEHV_SUPPORT:
3732
0
            dissect_nvme_set_features_transfer_hbs(tvb, tree, len);
3733
0
            break;
3734
0
        default:
3735
0
            proto_tree_add_bytes_format_value(tree, hf_nvme_gen_data, tvb, 0, len, NULL,
3736
0
                (cmd_ctx->opcode == NVME_AQ_OPC_SET_FEATURES) ? "Unhandled Set Features Transfer" : "Unhandled Get Features Transfer");
3737
0
            break;
3738
0
    }
3739
0
}
3740
3741
3742
void nvme_update_transfer_request(packet_info *pinfo, struct nvme_cmd_ctx *cmd, struct nvme_q_ctx *q_ctx)
3743
0
{
3744
0
    if (cmd->fabric) {
3745
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s",
3746
0
            val_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command"));
3747
0
        return;
3748
0
    }
3749
0
    if (!q_ctx->qid) {
3750
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", val_to_str_const(cmd->opcode, aq_opc_tbl, "Unknown Command"));
3751
0
        if (cmd->opcode == NVME_AQ_OPC_IDENTIFY)
3752
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
3753
0
        else if (cmd->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
3754
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd->cmd_ctx.get_logpage.lid));
3755
0
    } else {
3756
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", val_to_str_const(cmd->opcode, ioq_opc_tbl, "Unknown Command"));
3757
0
    }
3758
0
}
3759
3760
void
3761
dissect_nvme_data_response(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
3762
                 struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned len, bool is_inline)
3763
0
{
3764
0
    proto_tree *cmd_tree;
3765
0
    proto_item *ti;
3766
0
    const char *str_opcode;
3767
0
    uint32_t off;
3768
3769
0
    off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd_ctx->tr_bytes;
3770
3771
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
3772
0
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
3773
0
                             len, ENC_NA);
3774
0
    cmd_tree = proto_item_add_subtree(ti, ett_data);
3775
0
    if (q_ctx->qid) { //IOQ
3776
0
        str_opcode = val_to_str_const(cmd_ctx->opcode, ioq_opc_tbl,
3777
0
                                      "Unknown Command");
3778
0
      } else { //AQ
3779
0
        str_opcode = val_to_str_const(cmd_ctx->opcode, aq_opc_tbl,
3780
0
                                      "Unknown Command");
3781
0
        switch (cmd_ctx->opcode) {
3782
0
        case NVME_AQ_OPC_IDENTIFY:
3783
0
            dissect_nvme_identify_resp(nvme_tvb, cmd_tree, cmd_ctx, off, len);
3784
0
            break;
3785
0
        case NVME_AQ_OPC_GET_LOG_PAGE:
3786
0
                dissect_nvme_get_logpage_resp(nvme_tvb, cmd_tree, cmd_ctx, off, len);
3787
0
            break;
3788
3789
0
        case NVME_AQ_OPC_SET_FEATURES:
3790
0
        case NVME_AQ_OPC_GET_FEATURES:
3791
0
                dissect_nvme_set_features_transfer(nvme_tvb, cmd_tree, cmd_ctx, off, len);
3792
0
            break;
3793
3794
0
        default:
3795
0
            proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data,
3796
0
                                              nvme_tvb, 0, len, NULL,
3797
0
                                              "%s, offset %u", str_opcode, off);
3798
0
            break;
3799
0
        }
3800
0
    }
3801
0
    if (is_inline)
3802
0
        return;
3803
0
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data for %s", str_opcode);
3804
0
    if (!q_ctx->qid) {
3805
0
        if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY)
3806
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);
3807
0
        else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
3808
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s, offset %u", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid), off);
3809
0
    } else {
3810
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, ", ", "offset %u", off);
3811
0
    }
3812
0
}
3813
3814
static void add_nvme_qid(char *result, uint32_t val)
3815
0
{
3816
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%s)", val, val ? "IOQ" : "AQ");
3817
0
}
3818
3819
static void add_zero_base(char *result, uint32_t val)
3820
0
{
3821
0
    snprintf(result, ITEM_LABEL_LENGTH, "%u", val+1);
3822
0
}
3823
3824
static
3825
void dissect_nvmeof_fabric_connect_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
3826
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off)
3827
0
{
3828
0
    uint32_t qid;
3829
3830
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd1, cmd_tvb,
3831
0
                        5+off, 19, ENC_NA);
3832
0
    dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_connect_sgl1,
3833
0
        q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
3834
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_recfmt, cmd_tvb,
3835
0
                        40+off, 2, ENC_LITTLE_ENDIAN);
3836
0
    proto_tree_add_item_ret_uint(cmd_tree, hf_nvmeof_cmd_connect_qid, cmd_tvb,
3837
0
                        42+off, 2, ENC_LITTLE_ENDIAN, &qid);
3838
0
    cmd->cmd_ctx.fabric_cmd.cnct.qid = qid;
3839
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_sqsize, cmd_tvb,
3840
0
                        44+off, 2, ENC_LITTLE_ENDIAN);
3841
3842
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 46+off, 1, ASPEC(hf_nvmeof_cmd_connect_cattr));
3843
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd2, cmd_tvb,
3844
0
                        47+off, 1, ENC_NA);
3845
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_kato, cmd_tvb,
3846
0
                        48+off, 4, ENC_LITTLE_ENDIAN);
3847
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd3, cmd_tvb,
3848
0
                        52+off, 12, ENC_NA);
3849
0
}
3850
3851
static
3852
void dissect_nvmeof_fabric_auth_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb,
3853
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off)
3854
0
{
3855
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv1, cmd_tvb,
3856
0
                        5+off, 19, ENC_NA);
3857
0
    dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_auth_sgl1,
3858
0
        q_ctx, cmd, off, PINFO_FD_VISITED(pinfo));
3859
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv2, cmd_tvb,
3860
0
                        40+off, 1, ENC_LITTLE_ENDIAN);
3861
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp0, cmd_tvb,
3862
0
                        41+off, 1, ENC_LITTLE_ENDIAN);
3863
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp1, cmd_tvb,
3864
0
                        42+off, 1, ENC_LITTLE_ENDIAN);
3865
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_secp, cmd_tvb,
3866
0
                        43+off, 1, ENC_LITTLE_ENDIAN);
3867
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_al, cmd_tvb,
3868
0
                        44+off, 4, ENC_LITTLE_ENDIAN);
3869
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv3, cmd_tvb,
3870
0
                        48+off, 16, ENC_NA);
3871
0
}
3872
3873
static void dissect_nvme_fabric_disconnect_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb,  unsigned off)
3874
0
{
3875
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd0, cmd_tvb,
3876
0
                        5+off, 35, ENC_NA);
3877
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_recfmt, cmd_tvb,
3878
0
                        40+off, 2, ENC_LITTLE_ENDIAN);
3879
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd1, cmd_tvb,
3880
0
                        42+off, 22, ENC_NA);
3881
0
}
3882
3883
static void dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off)
3884
0
{
3885
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd0, cmd_tvb,
3886
0
                        5+off, 35, ENC_NA);
3887
3888
0
    add_group_mask_entry(cmd_tvb, cmd_tree, 40+off, 1, ASPEC(hf_nvmeof_cmd_prop_get_set_attrib));
3889
3890
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd1, cmd_tvb,
3891
0
                        41+off, 3, ENC_NA);
3892
3893
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_offset, cmd_tvb,
3894
0
                        44+off, 4, ENC_LITTLE_ENDIAN);
3895
0
}
3896
3897
static void dissect_nvmeof_fabric_prop_get_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
3898
0
{
3899
0
    cmd->cmd_ctx.fabric_cmd.prop_get.offset = tvb_get_uint8(cmd_tvb, 44+off);
3900
0
    dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
3901
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_rsvd2, cmd_tvb,
3902
0
                        48+off, 16, ENC_NA);
3903
0
}
3904
3905
static void add_500ms_units(char *result, uint32_t val)
3906
0
{
3907
0
    snprintf(result, ITEM_LABEL_LENGTH, "%x (%u ms)", val, val * 500);
3908
0
}
3909
3910
static void add_ccap_css(char *result, uint32_t val)
3911
0
{
3912
0
    if (val & 0x1)
3913
0
        snprintf(result, ITEM_LABEL_LENGTH, "%x (NVM IO Command Set)", val);
3914
0
    else if (val & 0x80)
3915
0
        snprintf(result, ITEM_LABEL_LENGTH, "%x (Admin Command Set Only)", val);
3916
0
    else
3917
0
        snprintf(result, ITEM_LABEL_LENGTH, "%x (Reserved)", val);
3918
0
}
3919
3920
static void dissect_nvmeof_fabric_prop_data(proto_tree *tree, tvbuff_t *tvb, unsigned off, unsigned prop_off, uint8_t attr)
3921
0
{
3922
0
    proto_item *ti, *grp;
3923
0
    ti = proto_tree_add_item(tree, hf_nvmeof_prop_get_set_data, tvb, off, 8, ENC_NA);
3924
0
    grp =  proto_item_add_subtree(ti, ett_data);
3925
0
    switch(prop_off) {
3926
0
        case 0x0:  add_group_mask_entry(tvb, grp, off, 8, ASPEC(hf_nvmeof_prop_get_ccap)); attr=1; break;
3927
0
        case 0x8:  add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_vs)); attr=0; break;
3928
0
        case 0x14: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_cc)); attr=0; break;
3929
0
        case 0x1c: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_csts)); attr=0; break;
3930
0
        case 0x20: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_nssr)); attr=0; break;
3931
0
        default:
3932
0
        {
3933
0
            if (attr == 0)
3934
0
            proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B, tvb,
3935
0
                            off, 4, ENC_LITTLE_ENDIAN);
3936
0
            else
3937
0
                proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_8B, tvb,
3938
0
                            off, 8, ENC_LITTLE_ENDIAN);
3939
0
            break;
3940
0
        }
3941
0
    }
3942
0
    if (attr == 0)
3943
0
        proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B_rsvd, tvb,
3944
0
                        off+4, 4, ENC_LITTLE_ENDIAN);
3945
0
}
3946
static void dissect_nvmeof_fabric_prop_set_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
3947
0
{
3948
0
    uint8_t attr;
3949
0
    uint32_t prop_off;
3950
3951
0
    dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off);
3952
0
    attr = tvb_get_uint8(cmd_tvb, 40+off) & 0x7;
3953
0
    prop_off = tvb_get_uint32(cmd_tvb, 44+off, ENC_LITTLE_ENDIAN);
3954
0
    cmd->cmd_ctx.fabric_cmd.prop_get.offset = prop_off;
3955
0
    dissect_nvmeof_fabric_prop_data(cmd_tree, cmd_tvb, 48+off, prop_off, attr);
3956
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_set_rsvd, cmd_tvb,
3957
0
                        56+off, 8, ENC_NA);
3958
0
}
3959
3960
static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off)
3961
0
{
3962
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_rsvd1, cmd_tvb,
3963
0
                        5+off, 35, ENC_NA);
3964
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_field, cmd_tvb,
3965
0
                        40+off, 24, ENC_NA);
3966
0
}
3967
3968
void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *nvme_tree,
3969
        struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off, bool link_data_req)
3970
0
{
3971
0
    proto_tree *cmd_tree;
3972
0
    proto_item *ti;
3973
0
    uint8_t fctype;
3974
0
    uint32_t prop_off;
3975
3976
0
    fctype = tvb_get_uint8(nvme_tvb, 4+off);
3977
0
    cmd->cmd_ctx.fabric_cmd.fctype = fctype;
3978
3979
0
    ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cmd, nvme_tvb, off,
3980
0
                             NVME_CMD_SIZE, ENC_NA);
3981
0
    cmd_tree = proto_item_add_subtree(ti, ett_data);
3982
3983
0
    proto_tree_add_bytes_format(cmd_tree, hf_nvmeof_cmd_opc, nvme_tvb, off, 1, NULL, "Opcode: 0x%x (Fabric Command)",
3984
0
                                NVME_FABRIC_OPC);
3985
0
    col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF %s", val_to_str_const(fctype, fctype_tbl, "Unknown Command"));
3986
0
    prop_off = tvb_get_uint32(nvme_tvb, 44+off, ENC_LITTLE_ENDIAN);
3987
3988
0
    cmd->opcode = NVME_FABRIC_OPC;
3989
0
    if (link_data_req)
3990
0
        nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvmeof_data_req, cmd);
3991
0
    nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvmeof_data_tr, cmd);
3992
0
    nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvmeof_cqe_pkt, cmd);
3993
3994
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_rsvd, nvme_tvb,
3995
0
                        1+off, 1, ENC_NA);
3996
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_cid, nvme_tvb,
3997
0
                        2+off, 2, ENC_LITTLE_ENDIAN);
3998
3999
0
    proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_fctype, nvme_tvb,
4000
0
                        4+off, 1, ENC_LITTLE_ENDIAN);
4001
0
    switch(fctype) {
4002
0
    case NVME_FCTYPE_CONNECT:
4003
0
        dissect_nvmeof_fabric_connect_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
4004
0
        break;
4005
0
    case NVME_FCTYPE_PROP_GET:
4006
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property"));
4007
0
        dissect_nvmeof_fabric_prop_get_cmd(cmd_tree, nvme_tvb, cmd, off);
4008
0
        break;
4009
0
    case NVME_FCTYPE_PROP_SET:
4010
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property"));
4011
0
        dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb, cmd, off);
4012
0
        break;
4013
0
    case NVME_FCTYPE_DISCONNECT:
4014
0
        dissect_nvme_fabric_disconnect_cmd(cmd_tree, nvme_tvb, off);
4015
0
        break;
4016
0
    case NVME_FCTYPE_AUTH_RECV:
4017
0
    case NVME_FCTYPE_AUTH_SEND:
4018
0
        dissect_nvmeof_fabric_auth_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off);
4019
0
        break;
4020
0
    default:
4021
0
        dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb, off);
4022
0
        break;
4023
0
    }
4024
0
}
4025
4026
static void
4027
dissect_nvmeof_fabric_connect_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree,
4028
                                     unsigned pkt_off, unsigned off, unsigned len)
4029
0
{
4030
0
    if (!off) {
4031
0
        CHECK_STOP_PARSE(0, 16);
4032
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostid, data_tvb,
4033
0
                            pkt_off, 16, ENC_NA);
4034
0
    }
4035
0
    if (off <= 16) {
4036
0
        CHECK_STOP_PARSE(16, 2);
4037
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_cntlid, data_tvb,
4038
0
                            pkt_off + 16 - off, 2, ENC_LITTLE_ENDIAN);
4039
0
    }
4040
0
    if (off <= 18) {
4041
0
        CHECK_STOP_PARSE(18, 238);
4042
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd0, data_tvb,
4043
0
                            pkt_off + 18 - off, 238, ENC_NA);
4044
0
    }
4045
0
    if (off <= 256) {
4046
0
        CHECK_STOP_PARSE(256, 256);
4047
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_subnqn, data_tvb,
4048
0
                            pkt_off + 256 - off, 256, ENC_ASCII);
4049
0
    }
4050
0
    if (off <= 512) {
4051
0
        CHECK_STOP_PARSE(512, 256);
4052
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostnqn, data_tvb,
4053
0
                            pkt_off + 512 - off, 256, ENC_ASCII);
4054
0
    }
4055
0
    if (off <= 768) {
4056
0
        CHECK_STOP_PARSE(768, 256);
4057
0
        proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd1, data_tvb,
4058
0
                            pkt_off + 768 - off, 256, ENC_NA);
4059
0
    }
4060
0
}
4061
4062
void
4063
dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, packet_info *pinfo, proto_tree *data_tree,
4064
                                 unsigned pkt_off, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned len)
4065
0
{
4066
0
    uint32_t tr_off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd->tr_bytes;
4067
4068
0
    if (!pkt_off) {
4069
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeoF Data for %s, offset %u",
4070
0
            val_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command"), tr_off);
4071
0
    }
4072
0
    if (cmd->cmd_ctx.fabric_cmd.fctype == NVME_FCTYPE_CONNECT && len >= 768)
4073
0
        dissect_nvmeof_fabric_connect_cmd_data(data_tvb, data_tree, pkt_off, tr_off, len);
4074
0
}
4075
4076
static void
4077
dissect_nvmeof_status_prop_get(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, struct nvme_cmd_ctx *cmd, unsigned off)
4078
0
{
4079
0
    dissect_nvmeof_fabric_prop_data(cqe_tree, cqe_tvb, off, cmd->cmd_ctx.fabric_cmd.prop_get.offset, 1);
4080
0
}
4081
4082
static void
4083
dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb,
4084
                                  struct nvme_cmd_ctx *cmd, unsigned off)
4085
0
{
4086
0
    switch (cmd->cmd_ctx.fabric_cmd.fctype) {
4087
0
    case NVME_FCTYPE_CONNECT:
4088
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_cntlid, cqe_tvb,
4089
0
                            0+off, 2, ENC_LITTLE_ENDIAN);
4090
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_authreq, cqe_tvb,
4091
0
                            2+off, 2, ENC_LITTLE_ENDIAN);
4092
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_rsvd, cqe_tvb,
4093
0
                            4+off, 4, ENC_NA);
4094
0
        break;
4095
0
    case NVME_FCTYPE_PROP_GET:
4096
0
        dissect_nvmeof_status_prop_get(cqe_tree, cqe_tvb, cmd, off);
4097
0
        break;
4098
0
    case NVME_FCTYPE_PROP_SET:
4099
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_prop_set_rsvd, cqe_tvb,
4100
0
                            0+off, 8, ENC_NA);
4101
0
        break;
4102
0
    default:
4103
0
        proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb,
4104
0
                            0+off, 8, ENC_LITTLE_ENDIAN);
4105
0
        break;
4106
0
    };
4107
0
}
4108
4109
4110
const char *get_nvmeof_cmd_string(uint8_t fctype)
4111
0
{
4112
0
    return val_to_str_const(fctype, fctype_tbl, "Unknown Fabric Command");
4113
0
}
4114
4115
static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, unsigned off, bool nvmeof);
4116
4117
void
4118
dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo,
4119
                        proto_tree *nvme_tree,
4120
                        struct nvme_cmd_ctx *cmd, unsigned off)
4121
0
{
4122
0
    proto_tree *cqe_tree;
4123
0
    proto_item *ti;
4124
0
    uint8_t fctype = cmd->cmd_ctx.fabric_cmd.fctype;
4125
4126
0
    ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cqe, nvme_tvb,
4127
0
                             0+off, NVME_CQE_SIZE, ENC_NA);
4128
4129
0
    if (fctype != NVME_FCTYPE_PROP_GET && fctype != NVME_FCTYPE_PROP_SET)
4130
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for %s", val_to_str_const(fctype, fctype_tbl, "Unknown Command"));
4131
0
    else
4132
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for Property %s %s",
4133
0
                            (fctype == NVME_FCTYPE_PROP_GET) ? "Get" : "Set",
4134
0
                            val_to_str_const(cmd->cmd_ctx.fabric_cmd.prop_get.offset, prop_offset_tbl, "Unknown Property"));
4135
4136
0
    proto_item_append_text(ti, " (For Cmd: %s)", val_to_str_const(fctype, fctype_tbl, "Unknown Cmd"));
4137
4138
0
    cqe_tree = proto_item_add_subtree(ti, ett_data);
4139
4140
0
    nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvmeof_cmd_pkt,
4141
0
                                 cmd);
4142
0
    nvme_publish_cmd_latency(cqe_tree, cmd, hf_nvmeof_cmd_latency);
4143
4144
0
    dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd, off);
4145
4146
0
    dissect_nvme_cqe_common(nvme_tvb, cqe_tree, off, true);
4147
0
}
4148
4149
static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree)
4150
3
{
4151
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword10, nvme_tvb, 40, 4, ENC_LITTLE_ENDIAN);
4152
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, nvme_tvb, 44, 4, ENC_LITTLE_ENDIAN);
4153
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, nvme_tvb, 48, 4, ENC_LITTLE_ENDIAN);
4154
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, nvme_tvb, 52, 4, ENC_LITTLE_ENDIAN);
4155
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, nvme_tvb, 56, 4, ENC_LITTLE_ENDIAN);
4156
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, nvme_tvb, 60, 4, ENC_LITTLE_ENDIAN);
4157
3
}
4158
4159
void
4160
dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree,
4161
                 struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx)
4162
3
{
4163
3
    proto_tree *cmd_tree;
4164
3
    proto_item *ti, *opc_item;
4165
4166
3
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
4167
3
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
4168
3
                             NVME_CMD_SIZE, ENC_NA);
4169
3
    proto_item_append_text(ti, " (Cmd)");
4170
3
    cmd_tree = proto_item_add_subtree(ti, ett_data);
4171
4172
3
    cmd_ctx->opcode = tvb_get_uint8(nvme_tvb, 0);
4173
3
    opc_item = proto_tree_add_item(cmd_tree, hf_nvme_cmd_opc, nvme_tvb,
4174
3
                        0, 1, ENC_LITTLE_ENDIAN);
4175
3
    if (q_ctx->qid) {
4176
0
        proto_item_append_text(opc_item, " %s",
4177
0
                               val_to_str_const(cmd_ctx->opcode, ioq_opc_tbl, "Unknown"));
4178
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", val_to_str_const(cmd_ctx->opcode, ioq_opc_tbl, "Unknown Command"));
4179
3
    } else {
4180
3
        proto_item_append_text(opc_item, " %s",
4181
3
                               val_to_str_const(cmd_ctx->opcode, aq_opc_tbl, "Unknown"));
4182
3
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", val_to_str_const(cmd_ctx->opcode, aq_opc_tbl, "Unknown Command"));
4183
3
    }
4184
4185
3
    nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvme_data_req, cmd_ctx);
4186
3
    nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvme_data_tr, cmd_ctx);
4187
3
    nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_cqe_pkt, cmd_ctx);
4188
4189
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_fuse_op, nvme_tvb,
4190
3
                        1, 1, ENC_NA);
4191
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd, nvme_tvb,
4192
3
                        1, 1, ENC_NA);
4193
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_psdt, nvme_tvb,
4194
3
                        1, 1, ENC_NA);
4195
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_cid, nvme_tvb,
4196
3
                        2, 2, ENC_LITTLE_ENDIAN);
4197
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_nsid, nvme_tvb,
4198
3
                        4, 4, ENC_LITTLE_ENDIAN);
4199
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd1, nvme_tvb,
4200
3
                        8, 8, ENC_NA);
4201
3
    proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, nvme_tvb,
4202
3
                        16, 8, ENC_LITTLE_ENDIAN);
4203
4204
3
    dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl, q_ctx, cmd_ctx, 0, PINFO_FD_VISITED(pinfo));
4205
4206
3
    if (q_ctx->qid) { //IOQ
4207
0
        switch (cmd_ctx->opcode) {
4208
0
        case NVME_IOQ_OPC_READ:
4209
0
        case NVME_IOQ_OPC_WRITE:
4210
0
            dissect_nvme_rw_cmd(nvme_tvb, cmd_tree);
4211
0
            break;
4212
0
        default:
4213
0
            dissect_nvme_unhandled_cmd(nvme_tvb, cmd_tree);
4214
0
            break;
4215
0
        }
4216
3
    } else { //AQ
4217
3
        switch (cmd_ctx->opcode) {
4218
0
        case NVME_AQ_OPC_IDENTIFY:
4219
0
            cmd_ctx->cmd_ctx.cmd_identify.cns = tvb_get_uint16(nvme_tvb, 40, ENC_LITTLE_ENDIAN);
4220
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
4221
0
            dissect_nvme_identify_cmd(nvme_tvb, cmd_tree);
4222
0
            break;
4223
0
        case NVME_AQ_OPC_GET_LOG_PAGE:
4224
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(tvb_get_uint8(nvme_tvb, 40)));
4225
0
            dissect_nvme_get_logpage_cmd(nvme_tvb, cmd_tree, cmd_ctx);
4226
0
            break;
4227
0
        case NVME_AQ_OPC_SET_FEATURES:
4228
0
            dissect_nvme_set_features_cmd(nvme_tvb, cmd_tree, cmd_ctx);
4229
0
            break;
4230
0
        case NVME_AQ_OPC_GET_FEATURES:
4231
0
            dissect_nvme_get_features_cmd(nvme_tvb, cmd_tree, cmd_ctx);
4232
0
            break;
4233
3
        default:
4234
3
            dissect_nvme_unhandled_cmd(nvme_tvb, cmd_tree);
4235
3
            break;
4236
3
        }
4237
3
    }
4238
3
}
4239
4240
const char *nvme_get_opcode_string(uint8_t opcode, uint16_t qid)
4241
3
{
4242
3
    if (qid)
4243
0
        return val_to_str_const(opcode, ioq_opc_tbl, "Reserved");
4244
3
    else
4245
3
        return val_to_str_const(opcode, aq_opc_tbl, "Reserved");
4246
3
}
4247
4248
int
4249
nvme_is_io_queue_opcode(uint8_t opcode)
4250
3
{
4251
3
    return ((opcode == NVME_IOQ_OPC_FLUSH) ||
4252
3
            (opcode == NVME_IOQ_OPC_WRITE) ||
4253
3
            (opcode == NVME_IOQ_OPC_READ) ||
4254
3
            (opcode == NVME_IOQ_OPC_WRITE_UNCORRECTABLE) ||
4255
3
            (opcode == NVME_IOQ_OPC_COMPARE) ||
4256
3
            (opcode == NVME_IOQ_OPC_WRITE_ZEROS) ||
4257
3
            (opcode == NVME_IOQ_OPC_DATASET_MGMT) ||
4258
3
            (opcode == NVME_IOQ_OPC_RESV_REG) ||
4259
3
            (opcode == NVME_IOQ_OPC_RESV_REPORT) ||
4260
3
            (opcode == NVME_IOQ_OPC_RESV_ACQUIRE) ||
4261
3
            (opcode == NVME_IOQ_OPC_RESV_RELEASE));
4262
3
}
4263
4264
static const char *get_cqe_sc_string(unsigned sct, unsigned sc, bool nvmeof)
4265
0
{
4266
0
    switch (sct) {
4267
0
        case NVME_CQE_SCT_GENERIC: return val_to_str_const(sc, nvme_cqe_sc_gen_tbl, "Unknown Status Code");
4268
0
        case NVME_CQE_SCT_COMMAND: return (nvmeof) ? val_to_str_const(sc, nvmeof_cqe_sc_cmd_tbl, "Unknown Fabrics Status Code") :
4269
0
            val_to_str_const(sc, nvme_cqe_sc_cmd_tbl, "Unknown Status Code");
4270
0
        case NVME_CQE_SCT_MEDIA: return val_to_str_const(sc, nvme_cqe_sc_media_tbl, "Unknown Status Code");
4271
0
        case NVME_CQE_SCT_PATH: return val_to_str_const(sc, nvme_cqe_sc_path_tbl, "Unknown Status Code");
4272
0
        case NVME_CQE_SCT_VENDOR: return "Vendor Error";
4273
0
        default: return "Unknown Status Code";
4274
0
    }
4275
0
}
4276
4277
static const value_string nvme_cqe_sc_sf_err_dword0_tbl[] = {
4278
    { 0xD, "Feature Identifier Not Saveable" },
4279
    { 0xE, "Feature Not Changeable" },
4280
    { 0xF, "Feature Not Namespace Specific" },
4281
    { 0x14, "Overlapping Range" },
4282
    { 0, NULL },
4283
};
4284
4285
static const value_string nvme_cqe_aev_aet_dword0_tbl[] = {
4286
    { 0x0, "Error status" },
4287
    { 0x1, "SMART / Health status" },
4288
    { 0x2, "Notice" },
4289
    { 0x6, "IO Command Set specific status" },
4290
    { 0x7, "Vendor specific" },
4291
    { 0, NULL },
4292
};
4293
4294
static const value_string nvme_cqe_aev_status_error_tbl[] = {
4295
    { 0x0, "Write to Invalid Doorbell Register" },
4296
    { 0x1, "Invalid Doorbell Write Value" },
4297
    { 0x2, "Diagnostic Failure" },
4298
    { 0x3, "Persistent Internal Error"},
4299
    { 0x4, "Transient Internal Error"},
4300
    { 0x5, "Firmware Image Load Error"},
4301
    { 0, NULL },
4302
};
4303
4304
static const value_string nvme_cqe_aev_status_smart_tbl[] = {
4305
    { 0x0, "NVM subsystem Reliability" },
4306
    { 0x1, "Temperature Threshold" },
4307
    { 0x2, "Spare Below Threshold" },
4308
    { 0, NULL },
4309
};
4310
4311
static const value_string nvme_cqe_aev_status_notice_tbl[] = {
4312
    { 0x0, "Namespace Attribute Changed" },
4313
    { 0x1, "Firmware Activation Starting" },
4314
    { 0x2, "Telemetry Log Changed" },
4315
    { 0x3, "Asymmetric Namespace Access Change" },
4316
    { 0x4, "Predictable Latency Event Aggregate Log Change" },
4317
    { 0x5, "LBA Status Information Alert" },
4318
    { 0x6, "Endurance Group Event Aggregate Log Page Change" },
4319
    { 0, NULL },
4320
};
4321
4322
static const value_string nvme_cqe_aev_status_nvm_tbl[] = {
4323
    { 0x0, "Reservation Log Page Available" },
4324
    { 0x1, "Sanitize Operation Completed" },
4325
    { 0x2, "Sanitize Operation Completed With Unexpected Deallocation" },
4326
    { 0, NULL },
4327
};
4328
4329
static void decode_dword0_cqe(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, struct nvme_cmd_ctx *cmd_ctx)
4330
0
{
4331
0
    switch (cmd_ctx->opcode) {
4332
0
        case NVME_AQ_OPC_SET_FEATURES:
4333
0
        {
4334
0
            uint16_t sc = tvb_get_uint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN);
4335
0
            sc = ((sc & 0x1fe) >> 1);
4336
0
            if (sc) {
4337
0
                proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0_sf_err, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4338
0
            } else {
4339
0
                if (cmd_ctx->cmd_ctx.set_features.fid == F_NUM_OF_QUEUES)
4340
0
                    add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_dword0_sf_nq));
4341
0
                else
4342
0
                    proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4343
0
            }
4344
0
            break;
4345
0
        }
4346
0
        case NVME_AQ_OPC_GET_FEATURES:
4347
0
            switch (cmd_ctx->cmd_ctx.set_features.fid) {
4348
0
                case F_ARBITRATION: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_arb)); break;
4349
0
                case F_POWER_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_pm)); break;
4350
0
                case F_LBA_RANGE_TYPE: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbart)); break;
4351
0
                case F_TEMP_THRESHOLD: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_tt)); break;
4352
0
                case F_ERROR_RECOVERY: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_erec)); break;
4353
0
                case F_VOLATILE_WC: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_vwce)); break;
4354
0
                case F_NUM_OF_QUEUES: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nq)); break;
4355
0
                case F_IRQ_COALESCING: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqc)); break;
4356
0
                case F_IRQ_VECTOR_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqv)); break;
4357
0
                case F_WRITE_ATOM_NORM: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_wan)); break;
4358
0
                case F_ASYNC_EVENT_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_aec)); break;
4359
0
                case F_AUTO_PS_TRANSITION: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_apst)); break;
4360
0
                case F_KA_TIMER: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_kat)); break;
4361
0
                case F_HOST_CNTL_THERM_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hctm)); break;
4362
0
                case F_NO_POWER_STATE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nops)); break;
4363
0
                case F_READ_REC_LEVEL_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rrl)); break;
4364
0
                case F_PRED_LAT_MODE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmc)); break;
4365
0
                case F_PRED_LAT_MODE_WIND: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmw)); break;
4366
0
                case F_LBA_ST_INF_REP_INT: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbasi)); break;
4367
0
                case F_SANITIZE_CON: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_san)); break;
4368
0
                case F_END_GROUP_EV_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_eg)); break;
4369
0
                case F_SW_PR_MARKER: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_swp)); break;
4370
0
                case F_HOST_ID: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hid)); break;
4371
0
                case F_RSRV_NOT_MASK: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvn)); break;
4372
0
                case F_RSRV_PRST: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvp)); break;
4373
0
                case F_NS_WRITE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, 0, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nswp)); break;
4374
0
                default: proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN); break;
4375
0
            }
4376
0
            break;
4377
0
        case NVME_AQ_OPC_ASYNC_EVE_REQ:
4378
0
        {
4379
0
            proto_item *ti;
4380
0
            proto_tree *grp;
4381
0
            unsigned i;
4382
0
            uint8_t aet;
4383
0
            uint8_t aei;
4384
0
            ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_aev_dword0[0], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4385
0
            grp =  proto_item_add_subtree(ti, ett_data);
4386
0
            for (i = 1; i < 4; i++)
4387
0
                ti = proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[i], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4388
0
            aet = tvb_get_uint8(nvme_tvb, 0) & 0x7;
4389
0
            aei = tvb_get_uint8(nvme_tvb, 2);
4390
0
            switch (aet) {
4391
0
                case 0: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_error_tbl, "Unknown")); break;
4392
0
                case 1: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_smart_tbl, "Unknown")); break;
4393
0
                case 2: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_notice_tbl, "Unknown")); break;
4394
0
                case 6: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_nvm_tbl, "Unknown")); break;
4395
0
            }
4396
0
            proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[4], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4397
0
            proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[5], nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4398
0
            break;
4399
0
        }
4400
0
        default:
4401
0
            proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, 0, 4, ENC_LITTLE_ENDIAN);
4402
0
            break;
4403
0
    }
4404
0
}
4405
4406
static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, proto_tree *cqe_tree, unsigned off, bool nvmeof)
4407
0
{
4408
0
    proto_item *ti;
4409
0
    proto_tree *grp;
4410
0
    uint16_t val;
4411
0
    unsigned i;
4412
4413
0
    val = tvb_get_uint16(nvme_tvb, off+14, ENC_LITTLE_ENDIAN);
4414
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqhd, nvme_tvb, off+8, 2, ENC_LITTLE_ENDIAN);
4415
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqid, nvme_tvb, off+10, 2, ENC_LITTLE_ENDIAN);
4416
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb, off+12, 2, ENC_LITTLE_ENDIAN);
4417
4418
0
    ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_status[0], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN);
4419
0
    grp =  proto_item_add_subtree(ti, ett_data);
4420
0
    if (nvmeof)
4421
0
        proto_tree_add_item(grp, hf_nvme_cqe_status_rsvd, nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN);
4422
0
    else
4423
0
        proto_tree_add_item(grp, hf_nvme_cqe_status[1], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN);
4424
4425
0
    ti = proto_tree_add_item(grp, hf_nvme_cqe_status[2], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN);
4426
0
    proto_item_append_text(ti, " (%s)", get_cqe_sc_string((val & 0xE00) >> 9, (val & 0x1FE) >> 1, nvmeof));
4427
4428
0
    for (i = 3; i < array_length(hf_nvme_cqe_status); i++)
4429
0
        proto_tree_add_item(grp, hf_nvme_cqe_status[i], nvme_tvb, off+14, 2, ENC_LITTLE_ENDIAN);
4430
0
}
4431
4432
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)
4433
0
{
4434
0
    proto_tree *cqe_tree;
4435
0
    proto_item *ti;
4436
4437
0
    if (q_ctx->qid)
4438
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", val_to_str_const(cmd_ctx->opcode, ioq_opc_tbl, "Unknown Command"));
4439
0
    else
4440
0
        col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", val_to_str_const(cmd_ctx->opcode, aq_opc_tbl, "Unknown Command"));
4441
4442
0
    if (!q_ctx->qid) {
4443
0
        if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY)
4444
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"));
4445
0
        else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE)
4446
0
            col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid));
4447
0
    }
4448
0
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe");
4449
0
    ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0,
4450
0
                             NVME_CQE_SIZE, ENC_NA);
4451
0
    proto_item_append_text(ti, " (Cqe)");
4452
0
    cqe_tree = proto_item_add_subtree(ti, ett_data);
4453
4454
0
    nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_cmd_pkt, cmd_ctx);
4455
0
    nvme_publish_cmd_latency(cqe_tree, cmd_ctx, hf_nvme_cmd_latency);
4456
4457
0
    decode_dword0_cqe(nvme_tvb, cqe_tree, cmd_ctx);
4458
0
    proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword1, nvme_tvb, 4, 4, ENC_LITTLE_ENDIAN);
4459
0
    dissect_nvme_cqe_common(nvme_tvb, cqe_tree, 0, false);
4460
0
}
4461
4462
void
4463
proto_register_nvme(void)
4464
15
{
4465
15
    static hf_register_info hf[] = {
4466
        /* NVMeOF Fabric Command Fields */
4467
15
        { &hf_nvmeof_cmd,
4468
15
            { "Cmd", "nvme.fabrics.cmd",
4469
15
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
4470
15
        },
4471
15
        { &hf_nvmeof_cmd_opc,
4472
15
            { "Opcode", "nvme.fabrics.cmd.opc",
4473
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4474
15
        },
4475
15
        { &hf_nvmeof_cmd_rsvd,
4476
15
            { "Reserved", "nvme.fabrics.cmd.rsvd",
4477
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4478
15
        },
4479
15
        { &hf_nvmeof_cmd_cid,
4480
15
            { "Command Identifier", "nvme.fabrics.cmd.cid",
4481
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
4482
15
        },
4483
15
        { &hf_nvmeof_cmd_fctype,
4484
15
            { "Fabric Command Type", "nvme.fabrics.cmd.fctype",
4485
15
               FT_UINT8, BASE_HEX, VALS(fctype_tbl), 0x0, NULL, HFILL}
4486
15
        },
4487
15
        { &hf_nvmeof_cmd_connect_rsvd1,
4488
15
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd1",
4489
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4490
15
        },
4491
15
        { &hf_nvmeof_cmd_connect_sgl1,
4492
15
            { "SGL1", "nvme.fabrics.cmd.connect.sgl1",
4493
15
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
4494
15
        },
4495
15
        { &hf_nvmeof_cmd_connect_recfmt,
4496
15
            { "Record Format", "nvme.fabrics.cmd.connect.recfmt",
4497
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
4498
15
        },
4499
15
        { &hf_nvmeof_cmd_connect_qid,
4500
15
            { "Queue ID", "nvme.fabrics.cmd.connect.qid",
4501
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_nvme_qid), 0x0, NULL, HFILL}
4502
15
        },
4503
15
        { &hf_nvmeof_cmd_connect_sqsize,
4504
15
            { "Submission Queue Size", "nvme.fabrics.cmd.connect.sqsize",
4505
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_zero_base), 0x0, NULL, HFILL}
4506
15
        },
4507
15
        { &hf_nvmeof_cmd_connect_cattr[0],
4508
15
            { "Connect Attributes", "nvme.fabrics.cmd.connect.cattr",
4509
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4510
15
        },
4511
15
        { &hf_nvmeof_cmd_connect_cattr[1],
4512
15
            { "Priority Class", "nvme.fabrics.cmd.connect.cattr.pc",
4513
15
               FT_UINT8, BASE_HEX, VALS(pclass_tbl), 0x3, NULL, HFILL}
4514
15
        },
4515
15
        { &hf_nvmeof_cmd_connect_cattr[2],
4516
15
            { "Disable SQ Flow Control", "nvme.fabrics.cmd.connect.cattr.dfc",
4517
15
               FT_UINT8, BASE_HEX, NULL, 0x4, NULL, HFILL}
4518
15
        },
4519
15
        { &hf_nvmeof_cmd_connect_cattr[3],
4520
15
            { "Support Deletion of IO Queues", "nvme.fabrics.cmd.connect.cattr.dioq",
4521
15
               FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL}
4522
15
        },
4523
15
        { &hf_nvmeof_cmd_connect_cattr[4],
4524
15
            { "Reserved", "nvme.fabrics.cmd.connect.cattr.rsvd",
4525
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
4526
15
        },
4527
15
        { &hf_nvmeof_cmd_connect_rsvd2,
4528
15
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd2",
4529
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4530
15
        },
4531
15
        { &hf_nvmeof_cmd_connect_kato,
4532
15
            { "Keep Alive Timeout", "nvme.fabrics.cmd.connect.kato",
4533
15
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL}
4534
15
        },
4535
15
        { &hf_nvmeof_cmd_connect_rsvd3,
4536
15
            { "Reserved", "nvme.fabrics.cmd.connect.rsvd3",
4537
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4538
15
        },
4539
15
        { &hf_nvmeof_cmd_connect_data_hostid,
4540
15
            { "Host Identifier", "nvme.fabrics.cmd.connect.data.hostid",
4541
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4542
15
        },
4543
15
        { &hf_nvmeof_cmd_connect_data_cntlid,
4544
15
            { "Controller ID", "nvme.fabrics.cmd.connect.data.cntrlid",
4545
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
4546
15
        },
4547
15
        { &hf_nvmeof_cmd_connect_data_rsvd0,
4548
15
            { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd0",
4549
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4550
15
        },
4551
15
        { &hf_nvmeof_cmd_connect_data_subnqn,
4552
15
            { "Subsystem NQN", "nvme.fabrics.cmd.connect.data.subnqn",
4553
15
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
4554
15
        },
4555
15
        { &hf_nvmeof_cmd_connect_data_hostnqn,
4556
15
            { "Host NQN", "nvme.fabrics.cmd.connect.data.hostnqn",
4557
15
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
4558
15
        },
4559
15
        { &hf_nvmeof_cmd_connect_data_rsvd1,
4560
15
            { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd1",
4561
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4562
15
        },
4563
15
        { &hf_nvmeof_cmd_auth_rsdv1,
4564
15
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd1",
4565
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4566
15
        },
4567
15
        { &hf_nvmeof_cmd_auth_sgl1,
4568
15
            { "SGL1", "nvme.fabrics.cmd.auth.sgl1",
4569
15
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
4570
15
        },
4571
15
        { &hf_nvmeof_cmd_auth_rsdv2,
4572
15
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd2",
4573
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4574
15
        },
4575
15
        { &hf_nvmeof_cmd_auth_spsp0,
4576
15
            { "SP Specific 0", "nvme.fabrics.cmd.auth.spsp0",
4577
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4578
15
        },
4579
15
        { &hf_nvmeof_cmd_auth_spsp1,
4580
15
            { "SP Specific 1", "nvme.fabrics.cmd.auth.spsp1",
4581
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4582
15
        },
4583
15
        { &hf_nvmeof_cmd_auth_secp,
4584
15
            { "Security Protocol", "nvme.fabrics.cmd.auth.secp",
4585
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4586
15
        },
4587
15
        { &hf_nvmeof_cmd_auth_al,
4588
15
            { "Allocation Length", "nvme.fabrics.cmd.auth.al",
4589
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
4590
15
        },
4591
15
        { &hf_nvmeof_cmd_auth_rsdv3,
4592
15
            { "Reserved", "nvme.fabrics.cmd.auth.rsvd3",
4593
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4594
15
        },
4595
15
        { &hf_nvmeof_cmd_disconnect_rsvd0,
4596
15
            { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd0",
4597
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4598
15
        },
4599
15
        { &hf_nvmeof_cmd_disconnect_recfmt,
4600
15
            { "Record Format", "nvme.fabrics.cmd.disconnect.recfmt",
4601
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
4602
15
        },
4603
15
        { &hf_nvmeof_cmd_disconnect_rsvd1,
4604
15
            { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd1",
4605
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4606
15
        },
4607
15
        { &hf_nvmeof_cmd_prop_get_set_rsvd0,
4608
15
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd0",
4609
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4610
15
        },
4611
15
        { &hf_nvmeof_cmd_prop_get_set_attrib[0],
4612
15
            { "Attributes", "nvme.fabrics.cmd.prop_get_set.attrib",
4613
15
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
4614
15
        },
4615
15
        { &hf_nvmeof_cmd_prop_get_set_attrib[1],
4616
15
            { "Property Size", "nvme.fabrics.cmd.prop_get_set.attrib.size",
4617
15
               FT_UINT8, BASE_HEX, VALS(attr_size_tbl), 0x7, NULL, HFILL}
4618
15
        },
4619
15
        { &hf_nvmeof_cmd_prop_get_set_attrib[2],
4620
15
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.attrib.rsvd",
4621
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
4622
15
        },
4623
15
        { &hf_nvmeof_cmd_prop_get_set_rsvd1,
4624
15
            { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd1",
4625
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4626
15
        },
4627
15
        { &hf_nvmeof_cmd_prop_get_set_offset,
4628
15
            { "Offset", "nvme.fabrics.cmd.prop_get_set.offset",
4629
15
               FT_UINT32, BASE_HEX, VALS(prop_offset_tbl), 0x0, NULL, HFILL}
4630
15
        },
4631
15
        { &hf_nvmeof_cmd_prop_get_rsvd2,
4632
15
            { "Reserved", "nvme.fabrics.cmd.prop_get.rsvd2",
4633
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4634
15
        },
4635
15
        { &hf_nvmeof_prop_get_set_data,
4636
15
            { "Property Data", "nvme.fabrics.prop_get_set.data",
4637
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4638
15
        },
4639
15
        { &hf_nvmeof_prop_get_set_data_4B,
4640
15
            { "Value", "nvme.fabrics.prop_get_set.data.4B",
4641
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
4642
15
        },
4643
15
        { &hf_nvmeof_prop_get_set_data_4B_rsvd,
4644
15
            { "Reserved", "nvme.fabrics.prop_get_set.data.rsvd",
4645
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
4646
15
        },
4647
15
        { &hf_nvmeof_prop_get_set_data_8B,
4648
15
            { "Value", "nvme.fabrics.prop_get_set.data.8B",
4649
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
4650
15
        },
4651
15
        { &hf_nvmeof_prop_get_set_cc[0],
4652
15
            { "Controller Configuration", "nvme.fabrics.prop_get_set.cc",
4653
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
4654
15
        },
4655
15
        { &hf_nvmeof_prop_get_set_cc[1],
4656
15
            { "Enable", "nvme.fabrics.prop_get_set.cc.en",
4657
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
4658
15
        },
4659
15
        { &hf_nvmeof_prop_get_set_cc[2],
4660
15
            { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd0",
4661
15
               FT_UINT32, BASE_HEX, NULL, 0xE, NULL, HFILL}
4662
15
        },
4663
15
        { &hf_nvmeof_prop_get_set_cc[3],
4664
15
            { "IO Command Set Selected", "nvme.fabrics.prop_get_set.cc.css",
4665
15
               FT_UINT32, BASE_HEX, VALS(css_table), 0x70, NULL, HFILL}
4666
15
        },
4667
15
        { &hf_nvmeof_prop_get_set_cc[4],
4668
15
            { "Memory Page Size", "nvme.fabrics.prop_get_set.cc.mps",
4669
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0x780, NULL, HFILL}
4670
15
        },
4671
15
        { &hf_nvmeof_prop_get_set_cc[5],
4672
15
            { "Arbitration Mechanism Selected", "nvme.fabrics.prop_get_set.cc.ams",
4673
15
               FT_UINT32, BASE_HEX, VALS(ams_table), 0x3800, NULL, HFILL}
4674
15
        },
4675
15
        { &hf_nvmeof_prop_get_set_cc[6],
4676
15
            { "Shutdown Notification", "nvme.fabrics.prop_get_set.cc.shn",
4677
15
               FT_UINT32, BASE_HEX, VALS(sn_table), 0xc000, NULL, HFILL}
4678
15
        },
4679
15
        { &hf_nvmeof_prop_get_set_cc[7],
4680
15
            { "IO Submission Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iosqes",
4681
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF0000, NULL, HFILL}
4682
15
        },
4683
15
        { &hf_nvmeof_prop_get_set_cc[8],
4684
15
            { "IO Completion Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iocqes",
4685
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF00000, NULL, HFILL}
4686
15
        },
4687
15
        { &hf_nvmeof_prop_get_set_cc[9],
4688
15
            { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd1",
4689
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
4690
15
        },
4691
15
        { &hf_nvmeof_prop_get_set_csts[0],
4692
15
            { "Controller Status", "nvme.fabrics.prop_get_set.csts",
4693
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
4694
15
        },
4695
15
        { &hf_nvmeof_prop_get_set_csts[1],
4696
15
            { "Ready", "nvme.fabrics.prop_get_set.csts.rdy",
4697
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
4698
15
        },
4699
15
        { &hf_nvmeof_prop_get_set_csts[2],
4700
15
            { "Controller Fatal Status", "nvme.fabrics.prop_get_set.csts.cfs",
4701
15
               FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL}
4702
15
        },
4703
15
        { &hf_nvmeof_prop_get_set_csts[3],
4704
15
            { "Shutdown Status", "nvme.fabrics.prop_get_set.csts.shst",
4705
15
               FT_UINT32, BASE_HEX, VALS(shst_table), 0xC, NULL, HFILL}
4706
15
        },
4707
15
        { &hf_nvmeof_prop_get_set_csts[4],
4708
15
            { "NVM Subsystem Reset Occurred", "nvme.fabrics.prop_get_set.csts.nssro",
4709
15
               FT_UINT32, BASE_HEX, NULL, 0x10, NULL, HFILL}
4710
15
        },
4711
15
        { &hf_nvmeof_prop_get_set_csts[5],
4712
15
            { "Processing Paused", "nvme.fabrics.prop_get_set.csts.pp",
4713
15
               FT_UINT32, BASE_HEX, NULL, 0x20, NULL, HFILL}
4714
15
        },
4715
15
        { &hf_nvmeof_prop_get_set_csts[6],
4716
15
            { "Reserved", "nvme.fabrics.prop_get_set.csts.rsvd",
4717
15
               FT_UINT32, BASE_HEX, NULL, 0xffffffC0, NULL, HFILL}
4718
15
        },
4719
15
        { &hf_nvmeof_prop_get_set_nssr[0],
4720
15
            { "NVM Subsystem Reset", "nvme.fabrics.cmd.prop_attr.set.nssr",
4721
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
4722
15
        },
4723
15
        { &hf_nvmeof_prop_get_set_nssr[1],
4724
15
            { "NVM Subsystem Reset Control", "nvme.fabrics.cmd.prop_attr.set.nssr.nssrc",
4725
15
               FT_UINT32, BASE_HEX, NULL, 0xffffffff, NULL, HFILL}
4726
15
        },
4727
15
        { &hf_nvmeof_cmd_prop_set_rsvd,
4728
15
            { "Reserved", "nvme.fabrics.cmd.prop_set.rsvd",
4729
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4730
15
        },
4731
15
        { &hf_nvmeof_cmd_generic_rsvd1,
4732
15
            { "Reserved", "nvme.fabrics.cmd.generic.rsvd1",
4733
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4734
15
        },
4735
15
        { &hf_nvmeof_cmd_generic_field,
4736
15
            { "Fabric Cmd specific field", "nvme.fabrics.cmd.generic.field",
4737
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4738
15
        },
4739
        /* NVMeOF Fabric Commands CQE fields */
4740
15
        { &hf_nvmeof_cqe,
4741
15
            { "Cqe", "nvme.fabrics.cqe",
4742
15
               FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL}
4743
15
        },
4744
15
        { &hf_nvmeof_cqe_sts,
4745
15
            { "Cmd specific Status", "nvme.fabrics.cqe.sts",
4746
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
4747
15
        },
4748
15
        { &hf_nvmeof_prop_get_ccap[0],
4749
15
            { "Controller Capabilities", "nvme.fabrics.prop_get.ccap",
4750
15
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
4751
15
        },
4752
15
        { &hf_nvmeof_prop_get_ccap[1],
4753
15
            { "Maximum Queue Entries Supported", "nvme.fabrics.prop_get.ccap.mqes",
4754
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_zero_base), 0xffff, NULL, HFILL}
4755
15
        },
4756
15
        { &hf_nvmeof_prop_get_ccap[2],
4757
15
            { "Contiguous Queues Required", "nvme.fabrics.prop_get.ccap.cqr",
4758
15
               FT_BOOLEAN, 64, NULL, 0x10000, NULL, HFILL}
4759
15
        },
4760
15
        { &hf_nvmeof_prop_get_ccap[3],
4761
15
            { "Supports Arbitration Mechanism with Weighted Round Robin and Urgent Priority Class", "nvme.fabrics.prop_get.ccap.ams.wrr",
4762
15
               FT_BOOLEAN, 64, NULL, 0x20000, NULL, HFILL}
4763
15
        },
4764
15
        { &hf_nvmeof_prop_get_ccap[4],
4765
15
            { "Supports Arbitration Mechanism Vendor Specific", "nvme.fabrics.prop_get.ccap.ams.vs",
4766
15
               FT_BOOLEAN, 64, NULL, 0x40000, NULL, HFILL}
4767
15
        },
4768
15
        { &hf_nvmeof_prop_get_ccap[5],
4769
15
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd0",
4770
15
               FT_UINT64, BASE_HEX, NULL, 0xF80000, NULL, HFILL}
4771
15
        },
4772
15
        { &hf_nvmeof_prop_get_ccap[6],
4773
15
            { "Timeout (to ready status)", "nvme.fabrics.prop_get.ccap.to",
4774
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_500ms_units), 0xFF000000, NULL, HFILL}
4775
15
        },
4776
15
        { &hf_nvmeof_prop_get_ccap[7],
4777
15
            { "Doorbell Stride", "nvme.fabrics.prop_get.ccap.dstrd",
4778
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_dstrd_size), 0xF00000000, NULL, HFILL}
4779
15
        },
4780
15
        { &hf_nvmeof_prop_get_ccap[8],
4781
15
            { "NVM Subsystem Reset Supported", "nvme.fabrics.prop_get.ccap.nssrs",
4782
15
               FT_BOOLEAN, 64, NULL, 0x1000000000, NULL, HFILL}
4783
15
        },
4784
15
        { &hf_nvmeof_prop_get_ccap[9],
4785
15
            { "Command Sets Supported", "nvme.fabrics.prop_get.ccap.css",
4786
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ccap_css), 0x1FE000000000, NULL, HFILL}
4787
15
        },
4788
15
        { &hf_nvmeof_prop_get_ccap[10],
4789
15
            { "Boot Partition Support", "nvme.fabrics.prop_get.ccap.bps",
4790
15
               FT_BOOLEAN, 64, NULL, 0x200000000000, NULL, HFILL}
4791
15
        },
4792
15
        { &hf_nvmeof_prop_get_ccap[11],
4793
15
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsdv1",
4794
15
               FT_UINT64, BASE_HEX, NULL, 0xC00000000000, NULL, HFILL}
4795
15
        },
4796
15
        { &hf_nvmeof_prop_get_ccap[12],
4797
15
            { "Memory Page Size Minimum", "nvme.fabrics.prop_get.ccap.mpsmin",
4798
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF000000000000, NULL, HFILL}
4799
15
        },
4800
15
        { &hf_nvmeof_prop_get_ccap[13],
4801
15
            { "Memory Page Size Maximum", "nvme.fabrics.prop_get.ccap.mpsmax",
4802
15
               FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF0000000000000, NULL, HFILL}
4803
15
        },
4804
15
        { &hf_nvmeof_prop_get_ccap[14],
4805
15
            { "Persistent Memory Region Supported", "nvme.fabrics.prop_get.ccap.pmrs",
4806
15
               FT_BOOLEAN, 64, NULL, 0x100000000000000, NULL, HFILL}
4807
15
        },
4808
15
        { &hf_nvmeof_prop_get_ccap[15],
4809
15
            { "Controller Memory Buffer Supported", "nvme.fabrics.prop_get.ccap.cmbs",
4810
15
               FT_BOOLEAN, 64, NULL, 0x200000000000000, NULL, HFILL}
4811
15
        },
4812
15
        { &hf_nvmeof_prop_get_ccap[16],
4813
15
            { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd2",
4814
15
               FT_UINT64, BASE_HEX, NULL, 0xFC00000000000000, NULL, HFILL}
4815
15
        },
4816
15
        { &hf_nvmeof_prop_get_vs[0],
4817
15
            { "Version", "nvme.fabrics.prop_get.vs",
4818
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
4819
15
        },
4820
15
        { &hf_nvmeof_prop_get_vs[1],
4821
15
            { "Tertiary Version", "nvme.fabrics.prop_get.vs.ter",
4822
15
               FT_UINT32, BASE_DEC, NULL, 0xff, NULL, HFILL}
4823
15
        },
4824
15
        { &hf_nvmeof_prop_get_vs[2],
4825
15
            { "Minor Version", "nvme.fabrics.prop_get.vs.mnr",
4826
15
               FT_UINT32, BASE_DEC, NULL, 0xff00, NULL, HFILL}
4827
15
        },
4828
15
        { &hf_nvmeof_prop_get_vs[3],
4829
15
            { "Major Version", "nvme.fabrics.prop_get.vs.mjr",
4830
15
               FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL}
4831
15
        },
4832
15
        { &hf_nvmeof_cqe_connect_cntlid,
4833
15
            { "Controller ID", "nvme.fabrics.cqe.connect.cntrlid",
4834
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
4835
15
        },
4836
15
        { &hf_nvmeof_cqe_connect_authreq,
4837
15
            { "Authentication Required", "nvme.fabrics.cqe.connect.authreq",
4838
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
4839
15
        },
4840
15
        { &hf_nvmeof_cqe_connect_rsvd,
4841
15
            { "Reserved", "nvme.fabrics.cqe.connect.rsvd",
4842
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4843
15
        },
4844
15
        { &hf_nvmeof_cqe_prop_set_rsvd,
4845
15
            { "Reserved", "nvme.fabrics.cqe.prop_set.rsvd",
4846
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
4847
15
        },
4848
        /* Tracking commands, completions and transfers */
4849
15
                { &hf_nvmeof_cmd_pkt,
4850
15
            { "Fabric Cmd in", "nvme.fabrics.cmd_pkt",
4851
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4852
15
              "The Cmd for this transaction is in this frame", HFILL }
4853
15
        },
4854
15
        { &hf_nvmeof_cqe_pkt,
4855
15
            { "Fabric Cqe in", "nvme.fabrics.cqe_pkt",
4856
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4857
15
              "The Cqe for this transaction is in this frame", HFILL }
4858
15
        },
4859
15
        { &hf_nvmeof_data_req,
4860
15
            { "DATA Transfer Request", "nvme.fabrics.data_req",
4861
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4862
15
              "DATA transfer request for this transaction is in this frame", HFILL }
4863
15
        },
4864
15
        { &hf_nvmeof_data_tr[0],
4865
15
            { "DATA Transfer 0", "nvme.fabrics.data.tr0",
4866
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4867
15
              "DATA transfer 0 for this transaction is in this frame", HFILL }
4868
15
        },
4869
15
        { &hf_nvmeof_data_tr[1],
4870
15
            { "DATA Transfer 1", "nvme.fabrics.data_tr1",
4871
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4872
15
              "DATA transfer 1 for this transaction is in this frame", HFILL }
4873
15
        },
4874
15
        { &hf_nvmeof_data_tr[2],
4875
15
            { "DATA Transfer 2", "nvme.fabrics.data_tr2",
4876
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4877
15
              "DATA transfer 2 for this transaction is in this frame", HFILL }
4878
15
        },
4879
15
        { &hf_nvmeof_data_tr[3],
4880
15
            { "DATA Transfer 3", "nvme.fabrics.data_tr3",
4881
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4882
15
              "DATA transfer 3 for this transaction is in this frame", HFILL }
4883
15
        },
4884
15
        { &hf_nvmeof_data_tr[4],
4885
15
            { "DATA Transfer 4", "nvme.fabrics.data_tr4",
4886
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4887
15
              "DATA transfer 4 for this transaction is in this frame", HFILL }
4888
15
        },
4889
15
        { &hf_nvmeof_data_tr[5],
4890
15
            { "DATA Transfer 5", "nvme.fabrics.data_tr5",
4891
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4892
15
              "DATA transfer 5 for this transaction is in this frame", HFILL }
4893
15
        },
4894
15
        { &hf_nvmeof_data_tr[6],
4895
15
            { "DATA Transfer 6", "nvme.fabrics.data_tr6",
4896
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4897
15
              "DATA transfer 6 for this transaction is in this frame", HFILL }
4898
15
        },
4899
15
        { &hf_nvmeof_data_tr[7],
4900
15
            { "DATA Transfer 7", "nvme.fabrics.data_tr7",
4901
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4902
15
              "DATA transfer 7 for this transaction is in this frame", HFILL }
4903
15
        },
4904
15
        { &hf_nvmeof_data_tr[8],
4905
15
            { "DATA Transfer 8", "nvme.fabrics.data_tr8",
4906
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4907
15
              "DATA transfer 8 for this transaction is in this frame", HFILL }
4908
15
        },
4909
15
        { &hf_nvmeof_data_tr[9],
4910
15
            { "DATA Transfer 9", "nvme.fabrics.data_tr9",
4911
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4912
15
              "DATA transfer 9 for this transaction is in this frame", HFILL }
4913
15
        },
4914
15
        { &hf_nvmeof_data_tr[10],
4915
15
            { "DATA Transfer 10", "nvme.fabrics.data_tr10",
4916
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4917
15
              "DATA transfer 10 for this transaction is in this frame", HFILL }
4918
15
        },
4919
15
        { &hf_nvmeof_data_tr[11],
4920
15
            { "DATA Transfer 11", "nvme.fabrics.data_tr11",
4921
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4922
15
              "DATA transfer 11 for this transaction is in this frame", HFILL }
4923
15
        },
4924
15
        { &hf_nvmeof_data_tr[12],
4925
15
            { "DATA Transfer 12", "nvme.fabrics.data_tr12",
4926
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4927
15
              "DATA transfer 12 for this transaction is in this frame", HFILL }
4928
15
        },
4929
15
        { &hf_nvmeof_data_tr[13],
4930
15
            { "DATA Transfer 13", "nvme.fabrics.data_tr13",
4931
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4932
15
              "DATA transfer 13 for this transaction is in this frame", HFILL }
4933
15
        },
4934
15
        { &hf_nvmeof_data_tr[14],
4935
15
            { "DATA Transfer 14", "nvme.fabrics.data_tr14",
4936
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4937
15
              "DATA transfer 14 for this transaction is in this frame", HFILL }
4938
15
        },
4939
15
        { &hf_nvmeof_data_tr[15],
4940
15
            { "DATA Transfer 15", "nvme.fabrics.data_tr15",
4941
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
4942
15
              "DATA transfer 15 for this transaction is in this frame", HFILL }
4943
15
        },
4944
15
        { &hf_nvmeof_cmd_latency,
4945
15
            { "Cmd Latency", "nvme.fabrics.cmd_latency",
4946
15
              FT_DOUBLE, BASE_NONE, NULL, 0x0,
4947
15
              "The time between the command and completion, in usec", HFILL }
4948
15
        },
4949
        /* NVMe Command fields */
4950
15
        { &hf_nvme_cmd_opc,
4951
15
            { "Opcode", "nvme.cmd.opc",
4952
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
4953
15
        },
4954
15
        { &hf_nvme_cmd_fuse_op,
4955
15
            { "Fuse Operation", "nvme.cmd.fuse_op",
4956
15
               FT_UINT8, BASE_HEX, NULL, 0x3, NULL, HFILL}
4957
15
        },
4958
15
        { &hf_nvme_cmd_rsvd,
4959
15
            { "Reserved", "nvme.cmd.rsvd",
4960
15
               FT_UINT8, BASE_HEX, NULL, 0x3c, NULL, HFILL}
4961
15
        },
4962
15
        { &hf_nvme_cmd_psdt,
4963
15
            { "PRP Or SGL", "nvme.cmd.psdt",
4964
15
               FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL}
4965
15
        },
4966
15
        { &hf_nvme_cmd_cid,
4967
15
            { "Command ID", "nvme.cmd.cid",
4968
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
4969
15
        },
4970
15
        { &hf_nvme_cmd_nsid,
4971
15
            { "Namespace Id", "nvme.cmd.nsid",
4972
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
4973
15
        },
4974
15
        { &hf_nvme_cmd_rsvd1,
4975
15
            { "Reserved", "nvme.cmd.rsvd1",
4976
15
               FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}
4977
15
        },
4978
15
        { &hf_nvme_cmd_mptr,
4979
15
            { "Metadata Pointer", "nvme.cmd.mptr",
4980
15
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
4981
15
        },
4982
15
        { &hf_nvme_cmd_sgl,
4983
15
            { "SGL1", "nvme.cmd.sgl1",
4984
15
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
4985
15
        },
4986
15
        { &hf_nvme_cmd_sgl_desc_sub_type,
4987
15
            { "Descriptor Sub Type", "nvme.cmd.sgl.subtype",
4988
15
               FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
4989
15
        },
4990
15
        { &hf_nvme_cmd_sgl_desc_type,
4991
15
            { "Descriptor Type", "nvme.cmd.sgl.type",
4992
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
4993
15
        },
4994
15
        { &hf_nvme_cmd_sgl_desc_addr,
4995
15
            { "Address", "nvme.cmd.sgl1.addr",
4996
15
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
4997
15
        },
4998
15
        { &hf_nvme_cmd_sgl_desc_addr_rsvd,
4999
15
            { "Reserved", "nvme.cmd.sgl1.addr_rsvd",
5000
15
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
5001
15
        },
5002
15
        { &hf_nvme_cmd_sgl_desc_len,
5003
15
            { "Length", "nvme.cmd.sgl1.len",
5004
15
               FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}
5005
15
        },
5006
15
        { &hf_nvme_cmd_sgl_desc_key,
5007
15
            { "Key", "nvme.cmd.sgl1.key",
5008
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5009
15
        },
5010
15
        { &hf_nvme_cmd_sgl_desc_rsvd,
5011
15
            { "Reserved", "nvme.cmd.sgl1.rsvd",
5012
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5013
15
        },
5014
15
        { &hf_nvme_cmd_dword10,
5015
15
            { "DWORD10", "nvme.cmd.dword10",
5016
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5017
15
        },
5018
15
        { &hf_nvme_cmd_dword11,
5019
15
            { "DWORD11", "nvme.cmd.dword11",
5020
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5021
15
        },
5022
15
        { &hf_nvme_cmd_dword12,
5023
15
            { "DWORD12", "nvme.cmd.dword12",
5024
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5025
15
        },
5026
15
        { &hf_nvme_cmd_dword13,
5027
15
            { "DWORD13", "nvme.cmd.dword13",
5028
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5029
15
        },
5030
15
        { &hf_nvme_cmd_dword14,
5031
15
            { "DWORD14", "nvme.cmd.dword14",
5032
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5033
15
        },
5034
15
        { &hf_nvme_cmd_dword15,
5035
15
            { "DWORD15", "nvme.cmd.dword15",
5036
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5037
15
        },
5038
15
        { &hf_nvme_cmd_slba,
5039
15
            { "Start LBA", "nvme.cmd.slba",
5040
15
               FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL}
5041
15
        },
5042
15
        { &hf_nvme_cmd_nlb,
5043
15
            { "Absolute Number of Logical Blocks", "nvme.cmd.nlb",
5044
15
               FT_UINT16, BASE_DEC_HEX, NULL, 0, NULL, HFILL}
5045
15
        },
5046
15
        { &hf_nvme_cmd_rsvd2,
5047
15
            { "Reserved", "nvme.cmd.rsvd2",
5048
15
               FT_UINT16, BASE_HEX, NULL, 0x03ff, NULL, HFILL}
5049
15
        },
5050
15
        { &hf_nvme_cmd_prinfo,
5051
15
            { "Protection info fields",
5052
15
              "nvme.cmd.prinfo",
5053
15
               FT_UINT16, BASE_HEX, NULL, 0x3c00, NULL, HFILL}
5054
15
        },
5055
15
        { &hf_nvme_cmd_prinfo_prchk_lbrtag,
5056
15
            { "check Logical block reference tag",
5057
15
              "nvme.cmd.prinfo.lbrtag",
5058
15
               FT_UINT16, BASE_HEX, NULL, 0x0400, NULL, HFILL}
5059
15
        },
5060
15
        { &hf_nvme_cmd_prinfo_prchk_apptag,
5061
15
            { "check application tag field",
5062
15
              "nvme.cmd.prinfo.apptag",
5063
15
               FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL}
5064
15
        },
5065
15
        { &hf_nvme_cmd_prinfo_prchk_guard,
5066
15
            { "check guard field",
5067
15
              "nvme.cmd.prinfo.guard",
5068
15
               FT_UINT16, BASE_HEX, NULL, 0x1000, NULL, HFILL}
5069
15
        },
5070
15
        { &hf_nvme_cmd_prinfo_pract,
5071
15
            { "action",
5072
15
              "nvme.cmd.prinfo.action",
5073
15
               FT_UINT16, BASE_HEX, NULL, 0x2000, NULL, HFILL}
5074
15
        },
5075
15
        { &hf_nvme_cmd_fua,
5076
15
            { "Force Unit Access", "nvme.cmd.fua",
5077
15
               FT_UINT16, BASE_HEX, NULL, 0x4000, NULL, HFILL}
5078
15
        },
5079
15
        { &hf_nvme_cmd_lr,
5080
15
            { "Limited Retry", "nvme.cmd.lr",
5081
15
               FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL}
5082
15
        },
5083
15
        { &hf_nvme_cmd_eilbrt,
5084
15
            { "Expected Initial Logical Block Reference Tag", "nvme.cmd.eilbrt",
5085
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5086
15
        },
5087
15
        { &hf_nvme_cmd_elbat,
5088
15
            { "Expected Logical Block Application Tag Mask", "nvme.cmd.elbat",
5089
15
               FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}
5090
15
        },
5091
15
        { &hf_nvme_cmd_elbatm,
5092
15
            { "Expected Logical Block Application Tag", "nvme.cmd.elbatm",
5093
15
               FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL}
5094
15
        },
5095
15
        { &hf_nvme_cmd_dsm,
5096
15
            { "DSM Flags", "nvme.cmd.dsm",
5097
15
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
5098
15
        },
5099
15
        { &hf_nvme_cmd_dsm_access_freq,
5100
15
            { "Access frequency", "nvme.cmd.dsm.access_freq",
5101
15
               FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL}
5102
15
        },
5103
15
        { &hf_nvme_cmd_dsm_access_lat,
5104
15
            { "Access latency", "nvme.cmd.dsm.access_lat",
5105
15
               FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL}
5106
15
        },
5107
15
        { &hf_nvme_cmd_dsm_seq_req,
5108
15
            { "Sequential Request", "nvme.cmd.dsm.seq_req",
5109
15
               FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL}
5110
15
        },
5111
15
        { &hf_nvme_cmd_dsm_incompressible,
5112
15
            { "Incompressible", "nvme.cmd.dsm.incompressible",
5113
15
               FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL}
5114
15
        },
5115
15
        { &hf_nvme_cmd_rsvd3 ,
5116
15
            { "Reserved", "nvme.cmd.rsvd3",
5117
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5118
15
        },
5119
15
        { &hf_nvme_identify_dword10[0],
5120
15
            { "DWORD10", "nvme.cmd.identify.dword10",
5121
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5122
15
        },
5123
15
        { &hf_nvme_identify_dword10[1],
5124
15
            { "Controller or Namespace Structure (CNS)", "nvme.cmd.identify.dword10.cns",
5125
15
               FT_UINT32, BASE_HEX, VALS(cns_table), 0xff, NULL, HFILL}
5126
15
        },
5127
15
        { &hf_nvme_identify_dword10[2],
5128
15
            { "Reserved", "nvme.cmd.identify.dword10.rsvd",
5129
15
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
5130
15
        },
5131
15
        { &hf_nvme_identify_dword10[3],
5132
15
            { "Controller Identifier (CNTID)", "nvme.cmd.identify.dword10.cntid",
5133
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5134
15
        },
5135
15
        { &hf_nvme_identify_dword11[0],
5136
15
            { "DWORD11", "nvme.cmd.identify.dword11",
5137
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5138
15
        },
5139
15
        { &hf_nvme_identify_dword11[1],
5140
15
            { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.dwrod11.nvmesetid",
5141
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5142
15
        },
5143
15
        { &hf_nvme_identify_dword11[2],
5144
15
            { "Reserved", "nvme.cmd.identify.dword11.rsvd",
5145
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5146
15
        },
5147
15
        { &hf_nvme_identify_dword14[0],
5148
15
            { "DWORD14", "nvme.cmd.identify.dword14",
5149
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5150
15
        },
5151
15
        { &hf_nvme_identify_dword14[1],
5152
15
            { "UUID Index", "nvme.cmd.identify.dword14.uuid_index",
5153
15
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
5154
15
        },
5155
15
        { &hf_nvme_identify_dword14[2],
5156
15
            { "UUID Index", "nvme.cmd.identify.dword14.rsvd",
5157
15
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
5158
15
        },
5159
        /* get log page */
5160
15
        { &hf_nvme_get_logpage_dword10[0],
5161
15
            { "DWORD 10", "nvme.cmd.get_logpage.dword10",
5162
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5163
15
        },
5164
15
        { &hf_nvme_get_logpage_dword10[1],
5165
15
            { "Log Page Identifier (LID)", "nvme.cmd.get_logpage.dword10.id",
5166
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff, NULL, HFILL}
5167
15
        },
5168
15
        { &hf_nvme_get_logpage_dword10[2],
5169
15
            { "Log Specific Field (LSP)", "nvme.cmd.get_logpage.dword10.lsp",
5170
15
               FT_UINT32, BASE_HEX, NULL, 0x1f00, NULL, HFILL}
5171
15
        },
5172
15
        { &hf_nvme_get_logpage_dword10[3],
5173
15
            { "Reserved", "nvme.cmd.get_logpage.dword10.rsvd",
5174
15
               FT_UINT32, BASE_HEX, NULL, 0x6000, NULL, HFILL}
5175
15
        },
5176
15
        { &hf_nvme_get_logpage_dword10[4],
5177
15
            { "Retain Asynchronous Event (RAE)", "nvme.cmd.get_logpage.dword10.rae",
5178
15
               FT_BOOLEAN, 32, NULL, 0x8000, NULL, HFILL}
5179
15
        },
5180
15
        { &hf_nvme_get_logpage_dword10[5],
5181
15
            { "Number of Dwords Lower (NUMDL)", "nvme.cmd.get_logpage.dword10.numdl",
5182
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5183
15
        },
5184
15
        { &hf_nvme_get_logpage_numd,
5185
15
            { "Number of Dwords", "nvme.cmd.get_logpage.numd",
5186
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
5187
15
        },
5188
15
        { &hf_nvme_get_logpage_dword11[0],
5189
15
            { "DWORD 11", "nvme.cmd.get_logpage.dword11",
5190
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5191
15
        },
5192
15
        { &hf_nvme_get_logpage_dword11[1],
5193
15
            { "Number of Dwords Upper (NUMDU)", "nvme.cmd.get_logpage.dword11.numdu",
5194
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5195
15
        },
5196
15
        { &hf_nvme_get_logpage_dword11[2],
5197
15
            { "Log Specific Identifier", "nvme.cmd.get_logpage.dword11.lsi",
5198
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5199
15
        },
5200
15
        { &hf_nvme_get_logpage_lpo,
5201
15
            { "Log Page Offset (DWORD 12 and DWORD 13)", "nvme.cmd.get_logpage.lpo",
5202
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
5203
15
        },
5204
15
        { &hf_nvme_get_logpage_dword14[0],
5205
15
            { "DWORD 14", "nvme.cmd.get_logpage.dword14",
5206
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5207
15
        },
5208
15
        { &hf_nvme_get_logpage_dword14[1],
5209
15
            { "UUID Index", "nvme.cmd.identify.get_logpage.dword14.uuid_index",
5210
15
               FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL}
5211
15
        },
5212
15
        { &hf_nvme_get_logpage_dword14[2],
5213
15
            { "Reserved", "nvme.cmd.identify.get_logpage.dword14.rsvd",
5214
15
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
5215
15
        },
5216
        /* Set Features */
5217
15
        { &hf_nvme_set_features_dword10[0],
5218
15
            { "DWORD 10", "nvme.cmd.set_features.dword10",
5219
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5220
15
        },
5221
15
        { &hf_nvme_set_features_dword10[1],
5222
15
            { "Feature Identifier", "nvme.cmd.set_features.dword10.fid",
5223
15
               FT_UINT32, BASE_HEX, VALS(fid_table), 0xff, NULL, HFILL}
5224
15
        },
5225
15
        { &hf_nvme_set_features_dword10[2],
5226
15
            { "Reserved", "nvme.cmd.set_features.dword10.rsvd",
5227
15
               FT_UINT32, BASE_HEX, NULL, 0x7fffff00, NULL, HFILL}
5228
15
        },
5229
15
        { &hf_nvme_set_features_dword10[3],
5230
15
            { "Save", "nvme.cmd.set_features.dword10.sv",
5231
15
               FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL}
5232
15
        },
5233
15
        { &hf_nvme_set_features_dword14[0],
5234
15
            { "DWORD 14", "nvme.cmd.set_features.dword14",
5235
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5236
15
        },
5237
15
        { &hf_nvme_set_features_dword14[1],
5238
15
            { "UUID Index", "nvme.cmd.set_features.dword14.uuid",
5239
15
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
5240
15
        },
5241
15
        { &hf_nvme_set_features_dword14[2],
5242
15
            { "Reserved", "nvme.cmd.set_features.dword14.rsvd",
5243
15
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
5244
15
        },
5245
15
        { &hf_nvme_cmd_set_features_dword11_arb[0],
5246
15
            { "DWORD11", "nvme.cmd.set_features.dword11.arb",
5247
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5248
15
        },
5249
15
        { &hf_nvme_cmd_set_features_dword11_arb[1],
5250
15
            { "Arbitration Burst", "nvme.cmd.set_features.dword11.arb.ab",
5251
15
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
5252
15
        },
5253
15
        { &hf_nvme_cmd_set_features_dword11_arb[3],
5254
15
            { "Low Priority Weight", "nvme.cmd.set_features.dword11.arb.lpw",
5255
15
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
5256
15
        },
5257
15
        { &hf_nvme_cmd_set_features_dword11_arb[4],
5258
15
            { "Medium Priority Weight", "nvme.cmd.set_features.dword11.arb.mpw",
5259
15
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
5260
15
        },
5261
15
        { &hf_nvme_cmd_set_features_dword11_arb[5],
5262
15
            { "High Priority Weight", "nvme.cmd.set_features.dword11.arb.hpw",
5263
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
5264
15
        },
5265
15
        { &hf_nvme_cmd_set_features_dword11_pm[0],
5266
15
            { "DWORD11", "nvme.cmd.set_features.dword11.pm",
5267
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5268
15
        },
5269
15
        { &hf_nvme_cmd_set_features_dword11_pm[1],
5270
15
            { "Power State", "nvme.cmd.set_features.dword11.pm.ps",
5271
15
               FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL}
5272
15
        },
5273
15
        { &hf_nvme_cmd_set_features_dword11_pm[2],
5274
15
            { "Work Hint", "nvme.cmd.set_features.dword11.pm.wh",
5275
15
               FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL}
5276
15
        },
5277
15
        { &hf_nvme_cmd_set_features_dword11_pm[3],
5278
15
            { "Work Hint", "nvme.cmd.set_features.dword11.pm.rsvd",
5279
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
5280
15
        },
5281
15
        { &hf_nvme_cmd_set_features_dword11_lbart[0],
5282
15
            { "DWORD11", "nvme.cmd.set_features.dword11.lbart",
5283
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5284
15
        },
5285
15
        { &hf_nvme_cmd_set_features_dword11_lbart[1],
5286
15
            { "DWORD11", "nvme.cmd.set_features.dword11.lbart.lbarn",
5287
15
               FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL}
5288
15
        },
5289
15
        { &hf_nvme_cmd_set_features_dword11_lbart[2],
5290
15
            { "DWORD11", "nvme.cmd.set_features.dword11.lbart.rsvd",
5291
15
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
5292
15
        },
5293
15
        { &hf_nvme_cmd_set_features_dword11_tt[0],
5294
15
            { "DWORD11", "nvme.cmd.set_features.dword11.tt",
5295
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5296
15
        },
5297
15
        { &hf_nvme_cmd_set_features_dword11_tt[1],
5298
15
            { "Temperature Threshold", "nvme.cmd.set_features.dword11.tt.tmpth",
5299
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5300
15
        },
5301
15
        { &hf_nvme_cmd_set_features_dword11_tt[2],
5302
15
            { "Threshold Temperature Select", "nvme.cmd.set_features.dword11.tt.tmpsel",
5303
15
               FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL}
5304
15
        },
5305
15
        { &hf_nvme_cmd_set_features_dword11_tt[3],
5306
15
            { "Threshold Type Select", "nvme.cmd.set_features.dword11.tt.thpsel",
5307
15
               FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL}
5308
15
        },
5309
15
        { &hf_nvme_cmd_set_features_dword11_tt[4],
5310
15
            { "Reserved", "nvme.cmd.set_features.dword11.tt.rsvd",
5311
15
               FT_UINT32, BASE_HEX, NULL, 0xc00000, NULL, HFILL}
5312
15
        },
5313
15
        { &hf_nvme_cmd_set_features_dword11_erec[0],
5314
15
            { "DWORD11", "nvme.cmd.set_features.dword11.erec",
5315
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5316
15
        },
5317
15
        { &hf_nvme_cmd_set_features_dword11_erec[1],
5318
15
            { "Time Limited Error Recovery (100 ms units)", "nvme.cmd.set_features.dword11.erec.tler",
5319
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5320
15
        },
5321
15
        { &hf_nvme_cmd_set_features_dword11_erec[2],
5322
15
            { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cmd.set_features.dword11.erec.dulbe",
5323
15
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
5324
15
        },
5325
15
        { &hf_nvme_cmd_set_features_dword11_erec[3],
5326
15
            { "Reserved", "nvme.cmd.set_features.dword11.erec.rsvd",
5327
15
               FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL}
5328
15
        },
5329
15
        { &hf_nvme_cmd_set_features_dword11_vwce[0],
5330
15
            { "DWORD11", "nvme.cmd.set_features.dword11.vwce",
5331
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5332
15
        },
5333
15
        { &hf_nvme_cmd_set_features_dword11_vwce[1],
5334
15
            { "Volatile Write Cache Enable", "nvme.cmd.set_features.dword11.vwce.wce",
5335
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5336
15
        },
5337
15
        { &hf_nvme_cmd_set_features_dword11_vwce[2],
5338
15
            { "Volatile Write Cache Enable", "nvme.cmd.set_features.dword11.vwce.rsvd",
5339
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5340
15
        },
5341
15
        { &hf_nvme_cmd_set_features_dword11_nq[0],
5342
15
            { "DWORD11", "nvme.cmd.set_features.dword11.nq",
5343
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5344
15
        },
5345
15
        { &hf_nvme_cmd_set_features_dword11_nq[1],
5346
15
            { "Number of IO Submission Queues Requested", "nvme.cmd.set_features.dword11.nq.nsqr",
5347
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
5348
15
        },
5349
15
        { &hf_nvme_cmd_set_features_dword11_nq[2],
5350
15
            { "Number of IO Completion Queues Requested", "nvme.cmd.set_features.dword11.nq.ncqr",
5351
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
5352
15
        },
5353
15
        { &hf_nvme_cmd_set_features_dword11_irqc[0],
5354
15
            { "DWORD11", "nvme.cmd.set_features.dword11.irqc",
5355
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5356
15
        },
5357
15
        { &hf_nvme_cmd_set_features_dword11_irqc[1],
5358
15
            { "Aggregation Threshold", "nvme.cmd.set_features.dword11.irqc.thr",
5359
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5360
15
        },
5361
15
        { &hf_nvme_cmd_set_features_dword11_irqc[2],
5362
15
            { "Aggregation Time (100 us units)", "nvme.cmd.set_features.dword11.irqc.time",
5363
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5364
15
        },
5365
15
        { &hf_nvme_cmd_set_features_dword11_irqv[0],
5366
15
            { "DWORD11", "nvme.cmd.set_features.dword11.irqv",
5367
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5368
15
        },
5369
15
        { &hf_nvme_cmd_set_features_dword11_irqv[1],
5370
15
            { "IRQ Vector", "nvme.cmd.set_features.dword11.irqv.iv",
5371
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5372
15
        },
5373
15
        { &hf_nvme_cmd_set_features_dword11_irqv[2],
5374
15
            { "Coalescing Disable", "nvme.cmd.set_features.dword11.irqv.cd",
5375
15
               FT_BOOLEAN, 32, NULL, 0x1ffff, NULL, HFILL}
5376
15
        },
5377
15
        { &hf_nvme_cmd_set_features_dword11_irqv[3],
5378
15
            { "Reserved", "nvme.cmd.set_features.dword11.irqv.rsvd",
5379
15
               FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL}
5380
15
        },
5381
15
        { &hf_nvme_cmd_set_features_dword11_wan[0],
5382
15
            { "DWORD11", "nvme.cmd.set_features.dword11.wan",
5383
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5384
15
        },
5385
15
        { &hf_nvme_cmd_set_features_dword11_wan[1],
5386
15
            { "Disable Normal", "nvme.cmd.set_features.dword11.wan.dn",
5387
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5388
15
        },
5389
15
        { &hf_nvme_cmd_set_features_dword11_wan[2],
5390
15
            { "Reserved", "nvme.cmd.set_features.dword11.wan.rsvd",
5391
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5392
15
        },
5393
15
        { &hf_nvme_cmd_set_features_dword11_aec[0],
5394
15
            { "DWORD11", "nvme.cmd.set_features.dword11.aec",
5395
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5396
15
        },
5397
15
        { &hf_nvme_cmd_set_features_dword11_aec[1],
5398
15
            { "SMART and Health Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.aec.smart",
5399
15
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
5400
15
        },
5401
15
        { &hf_nvme_cmd_set_features_dword11_aec[2],
5402
15
            { "Namespace Attribute Notices", "nvme.cmd.set_features.dword11.aec.ns",
5403
15
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
5404
15
        },
5405
15
        { &hf_nvme_cmd_set_features_dword11_aec[3],
5406
15
            { "Firmware Activation Notices", "nvme.cmd.set_features.dword11.aec.fwa",
5407
15
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
5408
15
        },
5409
15
        { &hf_nvme_cmd_set_features_dword11_aec[4],
5410
15
            { "Telemetry Log Notices", "nvme.cmd.set_features.dword11.aec.tel",
5411
15
               FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL}
5412
15
        },
5413
15
        { &hf_nvme_cmd_set_features_dword11_aec[5],
5414
15
            { "ANA Change Notices", "nvme.cmd.set_features.dword11.aec.ana",
5415
15
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
5416
15
        },
5417
15
        { &hf_nvme_cmd_set_features_dword11_aec[6],
5418
15
            { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.plat",
5419
15
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
5420
15
        },
5421
15
        { &hf_nvme_cmd_set_features_dword11_aec[7],
5422
15
            { "LBA Status Information Notices", "nvme.cmd.set_features.dword11.aec.lba",
5423
15
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
5424
15
        },
5425
15
        { &hf_nvme_cmd_set_features_dword11_aec[8],
5426
15
            { "Endurance Group Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.eg",
5427
15
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
5428
15
        },
5429
15
        { &hf_nvme_cmd_set_features_dword11_aec[9],
5430
15
            { "Reserved", "nvme.cmd.set_features.dword11.aec.rsvd",
5431
15
               FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL}
5432
15
        },
5433
15
        { &hf_nvme_cmd_set_features_dword11_aec[10],
5434
15
            { "Discovery Log Page Change Notification", "nvme.cmd.set_features.dword11.aec.disc",
5435
15
               FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL}
5436
15
        },
5437
15
        { &hf_nvme_cmd_set_features_dword11_apst[0],
5438
15
            { "DWORD11", "nvme.cmd.set_features.dword11.apst",
5439
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5440
15
        },
5441
15
        { &hf_nvme_cmd_set_features_dword11_apst[1],
5442
15
            { "Autonomous Power State Transition Enable", "nvme.cmd.set_features.dword11.apst.apste",
5443
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5444
15
        },
5445
15
        { &hf_nvme_cmd_set_features_dword11_apst[2],
5446
15
            { "Reserved", "nvme.cmd.set_features.dword11.apst.rsvd",
5447
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5448
15
        },
5449
15
        { &hf_nvme_cmd_set_features_dword11_kat[0],
5450
15
            { "DWORD11", "nvme.cmd.set_features.dword11.kat",
5451
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5452
15
        },
5453
15
        { &hf_nvme_cmd_set_features_dword11_kat[1],
5454
15
            { "Keep Alive Timeout", "nvme.cmd.set_features.dword11.kat.kato",
5455
15
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL}
5456
15
        },
5457
15
        { &hf_nvme_cmd_set_features_dword11_hctm[0],
5458
15
            { "DWORD11", "nvme.cmd.set_features.dword11.hctm",
5459
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5460
15
        },
5461
15
        { &hf_nvme_cmd_set_features_dword11_hctm[1],
5462
15
            { "Thermal Management Temperature 2 (K)", "nvme.cmd.set_features.dword11.hctm.tmt2",
5463
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5464
15
        },
5465
15
        { &hf_nvme_cmd_set_features_dword11_hctm[2],
5466
15
            { "Thermal Management Temperature 1 (K)", "nvme.cmd.set_features.dword11.hctm.tmt1",
5467
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5468
15
        },
5469
15
        { &hf_nvme_cmd_set_features_dword11_nops[0],
5470
15
            { "DWORD11", "nvme.cmd.set_features.dword11.nops",
5471
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5472
15
        },
5473
15
        { &hf_nvme_cmd_set_features_dword11_nops[1],
5474
15
            { "Non-Operational Power State Permissive Mode Enable", "nvme.cmd.set_features.dword11.nops.noppme",
5475
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
5476
15
        },
5477
15
        { &hf_nvme_cmd_set_features_dword11_nops[2],
5478
15
            { "Reserved", "nvme.cmd.set_features.dword11.nops.rsvd",
5479
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5480
15
        },
5481
15
        { &hf_nvme_cmd_set_features_dword11_rrl[0],
5482
15
            { "DWORD11", "nvme.cmd.set_features.dword11.rrl",
5483
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5484
15
        },
5485
15
        { &hf_nvme_cmd_set_features_dword11_rrl[1],
5486
15
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.rrl.nvmsetid",
5487
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5488
15
        },
5489
15
        { &hf_nvme_cmd_set_features_dword11_rrl[2],
5490
15
            { "Reserved", "nvme.cmd.set_features.dword11.rrl.rsvd",
5491
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5492
15
        },
5493
15
        { &hf_nvme_cmd_set_features_dword12_rrl[0],
5494
15
            { "DWORD12", "nvme.cmd.set_features.dword12.rrl",
5495
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5496
15
        },
5497
15
        { &hf_nvme_cmd_set_features_dword12_rrl[1],
5498
15
            { "Read Recovery Level", "nvme.cmd.set_features.dword12.rrl.rrl",
5499
15
               FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL}
5500
15
        },
5501
15
        { &hf_nvme_cmd_set_features_dword12_rrl[2],
5502
15
            { "Reserved", "nvme.cmd.set_features.dword12.rrl.rsvd",
5503
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
5504
15
        },
5505
15
        { &hf_nvme_cmd_set_features_dword11_plmc[0],
5506
15
            { "DWORD11", "nvme.cmd.set_features.dword11.plmc",
5507
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5508
15
        },
5509
15
        { &hf_nvme_cmd_set_features_dword11_plmc[1],
5510
15
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmc.nvmsetid",
5511
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5512
15
        },
5513
15
        { &hf_nvme_cmd_set_features_dword11_plmc[2],
5514
15
            { "Reserved", "nvme.cmd.set_features.dword11.plmc.rsvd",
5515
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5516
15
        },
5517
15
        { &hf_nvme_cmd_set_features_dword12_plmc[0],
5518
15
            { "DWORD12", "nvme.cmd.set_features.dword12.plmc",
5519
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5520
15
        },
5521
15
        { &hf_nvme_cmd_set_features_dword12_plmc[1],
5522
15
            { "Predictable Latency Enable", "nvme.cmd.set_features.dword12.plmc.ple",
5523
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5524
15
        },
5525
15
        { &hf_nvme_cmd_set_features_dword12_plmc[2],
5526
15
            { "Reserved", "nvme.cmd.set_features.dword12.plmc.rsvd",
5527
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5528
15
        },
5529
15
        { &hf_nvme_cmd_set_features_dword11_plmw[0],
5530
15
            { "DWORD11", "nvme.cmd.set_features.dword11.plmw",
5531
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5532
15
        },
5533
15
        { &hf_nvme_cmd_set_features_dword11_plmw[1],
5534
15
            { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmw.nvmsetid",
5535
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5536
15
        },
5537
15
        { &hf_nvme_cmd_set_features_dword11_plmw[2],
5538
15
            { "Reserved", "nvme.cmd.set_features.dword11.plmw.rsvd",
5539
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5540
15
        },
5541
15
        { &hf_nvme_cmd_set_features_dword12_plmw[0],
5542
15
            { "DWORD12", "nvme.cmd.set_features.dword12.plmw",
5543
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5544
15
        },
5545
15
        { &hf_nvme_cmd_set_features_dword12_plmw[1],
5546
15
            { "DWORD12", "nvme.cmd.set_features.dword12.plmw.ws",
5547
15
               FT_UINT32, BASE_HEX, VALS(sf_ws_table), 0x7, NULL, HFILL}
5548
15
        },
5549
15
        { &hf_nvme_cmd_set_features_dword12_plmw[2],
5550
15
            { "Reserved", "nvme.cmd.set_features.dword12.plmw.rsvd",
5551
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
5552
15
        },
5553
15
        { &hf_nvme_cmd_set_features_dword11_lbasi[0],
5554
15
            { "DWORD11", "nvme.cmd.set_features.dword11.lbasi",
5555
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5556
15
        },
5557
15
        { &hf_nvme_cmd_set_features_dword11_lbasi[1],
5558
15
            { "LBA Status Information Report Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsiri",
5559
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5560
15
        },
5561
15
        { &hf_nvme_cmd_set_features_dword11_lbasi[2],
5562
15
            { "LBA Status Information Poll Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsipi",
5563
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5564
15
        },
5565
15
        { &hf_nvme_cmd_set_features_dword11_san[0],
5566
15
            { "DWORD11", "nvme.cmd.set_features.dword11.san",
5567
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5568
15
        },
5569
15
        { &hf_nvme_cmd_set_features_dword11_san[1],
5570
15
            { "No-Deallocate Response Mode", "nvme.cmd.set_features.dword11.san.nodrm",
5571
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5572
15
        },
5573
15
        { &hf_nvme_cmd_set_features_dword11_san[2],
5574
15
            { "Reserved", "nvme.cmd.set_features.dword11.san.rsvd",
5575
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5576
15
        },
5577
15
        { &hf_nvme_cmd_set_features_dword11_eg[0],
5578
15
            { "DWORD11", "nvme.cmd.set_features.dword11.eg",
5579
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5580
15
        },
5581
15
        { &hf_nvme_cmd_set_features_dword11_eg[1],
5582
15
            { "Endurance Group Identifier", "nvme.cmd.set_features.dword11.eg.endgid",
5583
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5584
15
        },
5585
15
        { &hf_nvme_cmd_set_features_dword11_eg[2],
5586
15
            { "Endurance Group Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.eg.egcw",
5587
15
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
5588
15
        },
5589
15
        { &hf_nvme_cmd_set_features_dword11_eg[3],
5590
15
            { "Reserved", "nvme.cmd.set_features.dword11.eg.rsvd",
5591
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
5592
15
        },
5593
15
        { &hf_nvme_cmd_set_features_dword11_swp[0],
5594
15
            { "DWORD11", "nvme.cmd.set_features.dword11.swp",
5595
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5596
15
        },
5597
15
        { &hf_nvme_cmd_set_features_dword11_swp[1],
5598
15
            { "Pre-boot Software Load Count", "nvme.cmd.set_features.dword11.swp.pbslc",
5599
15
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
5600
15
        },
5601
15
        { &hf_nvme_cmd_set_features_dword11_swp[2],
5602
15
            { "Reserved", "nvme.cmd.set_features.dword11.swp.rsvd",
5603
15
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
5604
15
        },
5605
15
        { &hf_nvme_cmd_set_features_dword11_hid[0],
5606
15
            { "DWORD11", "nvme.cmd.set_features.dword11.hid",
5607
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5608
15
        },
5609
15
        { &hf_nvme_cmd_set_features_dword11_hid[1],
5610
15
            { "Enable Extended Host Identifier", "nvme.cmd.set_features.dword11.hid.exhid",
5611
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5612
15
        },
5613
15
        { &hf_nvme_cmd_set_features_dword11_hid[2],
5614
15
            { "Reserved", "nvme.cmd.set_features.dword11.hid.rsvd",
5615
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5616
15
        },
5617
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[0],
5618
15
            { "DWORD11", "nvme.cmd.set_features.dword11.rsrvn",
5619
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5620
15
        },
5621
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[1],
5622
15
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd0",
5623
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
5624
15
        },
5625
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[2],
5626
15
            { "Mask Registration Preempted Notification" , "nvme.cmd.set_features.dword11.rsrvn.regpre",
5627
15
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
5628
15
        },
5629
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[3],
5630
15
            { "Mask Reservation Released Notification", "nvme.cmd.set_features.dword11.rsrvn.resrel",
5631
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
5632
15
        },
5633
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[4],
5634
15
            { "Mask Reservation Preempted Notification", "nvme.cmd.set_features.dword11.rsrvn.resrpe",
5635
15
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
5636
15
        },
5637
15
        { &hf_nvme_cmd_set_features_dword11_rsrvn[5],
5638
15
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd1",
5639
15
               FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL}
5640
15
        },
5641
15
        { &hf_nvme_cmd_set_features_dword11_rsrvp[0],
5642
15
            { "DWORD11", "nvme.cmd.set_features.dword11.rsrvp",
5643
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5644
15
        },
5645
15
        { &hf_nvme_cmd_set_features_dword11_rsrvp[1],
5646
15
            { "Persist Through Power Loss", "nvme.cmd.set_features.dword11.rsrvp.ptpl",
5647
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
5648
15
        },
5649
15
        { &hf_nvme_cmd_set_features_dword11_rsrvp[2],
5650
15
            { "Reserved", "nvme.cmd.set_features.dword11.rsrvp.rsvd",
5651
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
5652
15
        },
5653
15
        { &hf_nvme_cmd_set_features_dword11_nswp[0],
5654
15
            { "DWORD11", "nvme.cmd.set_features.dword11.nswp",
5655
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5656
15
        },
5657
15
        { &hf_nvme_cmd_set_features_dword11_nswp[1],
5658
15
            { "DWORD11", "nvme.cmd.set_features.dword11.nswp.wps",
5659
15
               FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL}
5660
15
        },
5661
15
        { &hf_nvme_cmd_set_features_dword11_nswp[2],
5662
15
            { "DWORD11", "nvme.cmd.set_features.dword11.nswp.rsvd",
5663
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
5664
15
        },
5665
        /* Set Features Transfers */
5666
15
        { &hf_nvme_set_features_tr_lbart,
5667
15
            { "LBA Range Structure", "nvme.set_features.lbart",
5668
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5669
15
        },
5670
15
        { &hf_nvme_set_features_tr_lbart_type,
5671
15
            { "Type", "nvme.set_features.lbart.type",
5672
15
               FT_UINT8, BASE_HEX, VALS(sf_lbart_type_table), 0x0, NULL, HFILL}
5673
15
        },
5674
15
        { &hf_nvme_set_features_tr_lbart_attr[0],
5675
15
            { "Attributes", "nvme.set_features.lbart.attr",
5676
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5677
15
        },
5678
15
        { &hf_nvme_set_features_tr_lbart_attr[1],
5679
15
            { "LBA Range may be overwritten", "nvme.set_features.lbart.attr.ovw",
5680
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
5681
15
        },
5682
15
        { &hf_nvme_set_features_tr_lbart_attr[2],
5683
15
            { "LBA Range shall be hidden from OS/EFI/BIOS", "nvme.set_features.lbart.attr.hid",
5684
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
5685
15
        },
5686
15
        { &hf_nvme_set_features_tr_lbart_attr[3],
5687
15
            { "Reserved", "nvme.set_features.lbart.attr.rsvd",
5688
15
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
5689
15
        },
5690
15
        { &hf_nvme_set_features_tr_lbart_rsvd0,
5691
15
            { "Reserved", "nvme.set_features.lbart.rsvd0",
5692
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5693
15
        },
5694
15
        { &hf_nvme_set_features_tr_lbart_slba,
5695
15
            { "Starting LBA", "nvme.set_features.lbart.slba",
5696
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5697
15
        },
5698
15
        { &hf_nvme_set_features_tr_lbart_nlb,
5699
15
            { "Number of Logical Blocks", "nvme.set_features.lbart.nlb",
5700
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5701
15
        },
5702
15
        { &hf_nvme_set_features_tr_lbart_guid,
5703
15
            { "Unique Identifier", "nvme.set_features.lbart.guid",
5704
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5705
15
        },
5706
15
        { &hf_nvme_set_features_tr_lbart_rsvd1,
5707
15
            { "Reserved", "nvme.set_features.lbart.rsvd1",
5708
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5709
15
        },
5710
15
        { &hf_nvme_set_features_tr_apst[0],
5711
15
            { "Autonomous Power State Transition Structure", "nvme.set_features.lbart.apst",
5712
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5713
15
        },
5714
15
        { &hf_nvme_set_features_tr_apst[1],
5715
15
            { "Reserved", "nvme.set_features.lbart.apst.rsvd0",
5716
15
               FT_UINT64, BASE_HEX, NULL, 0x7, NULL, HFILL}
5717
15
        },
5718
15
        { &hf_nvme_set_features_tr_apst[2],
5719
15
            { "Idle Transition Power State", "nvme.set_features.lbart.apst.itps",
5720
15
               FT_UINT64, BASE_HEX, NULL, 0xf8, NULL, HFILL}
5721
15
        },
5722
15
        { &hf_nvme_set_features_tr_apst[3],
5723
15
            { "Idle Time Prior to Transition (us)", "nvme.set_features.lbart.apst.itpt",
5724
15
               FT_UINT64, BASE_HEX, NULL, 0xfffff00, NULL, HFILL}
5725
15
        },
5726
15
        { &hf_nvme_set_features_tr_apst[4],
5727
15
            { "Reserved", "nvme.set_features.lbart.apst.rsvd1",
5728
15
               FT_UINT64, BASE_HEX, NULL, 0xffffffff00000000, NULL, HFILL}
5729
15
        },
5730
15
        { &hf_nvme_set_features_tr_tst[0],
5731
15
            { "Timestamp Structure", "nvme.set_features.tst",
5732
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5733
15
        },
5734
15
        { &hf_nvme_set_features_tr_tst[1],
5735
15
            { "Timestamp (milliseconds since 01-Jan-1970)", "nvme.set_features.tst.ms",
5736
15
               FT_UINT64, BASE_HEX, NULL, 0xffffffffffff, NULL, HFILL}
5737
15
        },
5738
15
        { &hf_nvme_set_features_tr_tst[2],
5739
15
            { "Reserved", "nvme.set_features.tst.rsvd",
5740
15
               FT_UINT64, BASE_HEX, NULL, 0xffff000000000000, NULL, HFILL}
5741
15
        },
5742
15
        { &hf_nvme_set_features_tr_plmc,
5743
15
            { "Reserved", "nvme.set_features.plmc",
5744
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5745
15
        },
5746
15
        { &hf_nvme_set_features_tr_plmc_ee[0],
5747
15
            { "Enable Event", "nvme.set_features.plmc.ee",
5748
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
5749
15
        },
5750
15
        { &hf_nvme_set_features_tr_plmc_ee[1],
5751
15
            { "DTWIN Reads Warning", "nvme.set_features.plmc.ee.dtwinr",
5752
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
5753
15
        },
5754
15
        { &hf_nvme_set_features_tr_plmc_ee[2],
5755
15
            { "DTWIN Writes Warning", "nvme.set_features.plmc.ee.dtwinw",
5756
15
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
5757
15
        },
5758
15
        { &hf_nvme_set_features_tr_plmc_ee[3],
5759
15
            { "DTWIN Time Warning", "nvme.set_features.plmc.ee.dtwint",
5760
15
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
5761
15
        },
5762
15
        { &hf_nvme_set_features_tr_plmc_ee[4],
5763
15
            { "Reserved", "nvme.set_features.plmc.ee.rsvd",
5764
15
               FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL}
5765
15
        },
5766
15
        { &hf_nvme_set_features_tr_plmc_ee[5],
5767
15
            { "DTWIN to NDWIN transition due to typical or maximum value exceeded", "nvme.set_features.plmc.ee.ndtwindv",
5768
15
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
5769
15
        },
5770
15
        { &hf_nvme_set_features_tr_plmc_ee[6],
5771
15
            { "DTWIN to NDWIN transition due to Deterministic Excursion", "nvme.set_features.plmc.ee.ndtwindde",
5772
15
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
5773
15
        },
5774
15
        { &hf_nvme_set_features_tr_plmc_rsvd0,
5775
15
            { "Reserved", "nvme.set_features.plmc.rsvd0",
5776
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5777
15
        },
5778
15
        { &hf_nvme_set_features_tr_plmc_dtwinrt,
5779
15
            { "DTWIN Reads Threshold", "nvme.set_features.plmc.dtwinrt",
5780
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5781
15
        },
5782
15
        { &hf_nvme_set_features_tr_plmc_dtwinwt,
5783
15
            { "DTWIN Writes Threshold", "nvme.set_features.plmc.dtwinwt",
5784
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5785
15
        },
5786
15
        { &hf_nvme_set_features_tr_plmc_dtwintt,
5787
15
            { "DTWIN Time Threshold", "nvme.set_features.plmc.dtwintt",
5788
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5789
15
        },
5790
15
        { &hf_nvme_set_features_tr_plmc_rsvd1,
5791
15
            { "Reserved", "nvme.set_features.plmc.rsvd1",
5792
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5793
15
        },
5794
15
        { &hf_nvme_set_features_tr_hbs,
5795
15
            { "Host Behavior Support Structure", "nvme.set_features.hbs",
5796
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5797
15
        },
5798
15
        { &hf_nvme_set_features_tr_hbs_acre,
5799
15
            { "Advanced Command Retry Enable", "nvme.set_features.hbs.acre",
5800
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5801
15
        },
5802
15
        { &hf_nvme_set_features_tr_hbs_rsvd,
5803
15
            { "Reserved", "nvme.set_features.hbs.rsvd",
5804
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5805
15
        },
5806
        /* Get Features */
5807
15
        { &hf_nvme_get_features_dword10[0],
5808
15
            { "DWORD 10", "nvme.cmd.get_features.dword10",
5809
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5810
15
        },
5811
15
        { &hf_nvme_get_features_dword10[1],
5812
15
            { "Feature Identifier", "nvme.cmd.get_features.dword10.fid",
5813
15
               FT_UINT32, BASE_HEX, VALS(fid_table), 0xff, NULL, HFILL}
5814
15
        },
5815
15
        { &hf_nvme_get_features_dword10[2],
5816
15
            { "Select", "nvme.cmd.set_features.dword10.sel",
5817
15
               FT_UINT32, BASE_HEX, VALS(sel_table), 0x700, NULL, HFILL}
5818
15
        },
5819
15
        { &hf_nvme_get_features_dword10[3],
5820
15
            { "Reserved", "nvme.cmd.get_features.dword10.rsvd",
5821
15
               FT_UINT32, BASE_HEX, NULL, 0xfffff800, NULL, HFILL}
5822
15
        },
5823
15
        { &hf_nvme_get_features_dword14[0],
5824
15
            { "DWORD 14", "nvme.cmd.get_features.dword14",
5825
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5826
15
        },
5827
15
        { &hf_nvme_get_features_dword14[1],
5828
15
            { "UUID Index", "nvme.cmd.get_features.dword14.uuid",
5829
15
               FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL}
5830
15
        },
5831
15
        { &hf_nvme_get_features_dword14[2],
5832
15
            { "Reserved", "nvme.cmd.get_features.dword14.rsvd",
5833
15
               FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL}
5834
15
        },
5835
15
        { &hf_nvme_cmd_get_features_dword11_rrl[0],
5836
15
            { "DWORD11", "nvme.cmd.get_features.dword11.rrl",
5837
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5838
15
        },
5839
15
        { &hf_nvme_cmd_get_features_dword11_rrl[1],
5840
15
            { "NVM Set Identifier", "nvme.cmd_get_features.dword11.rrl.nvmsetid",
5841
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5842
15
        },
5843
15
        { &hf_nvme_cmd_get_features_dword11_rrl[2],
5844
15
            { "Reserved", "nvme.cmd.get_features.dword11.rrl.rsvd",
5845
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5846
15
        },
5847
15
        { &hf_nvme_cmd_get_features_dword11_plmc[0],
5848
15
            { "DWORD11", "nvme.cmd.get_features.dword11.plmc",
5849
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5850
15
        },
5851
15
        { &hf_nvme_cmd_get_features_dword11_plmc[1],
5852
15
            { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmc.nvmsetid",
5853
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5854
15
        },
5855
15
        { &hf_nvme_cmd_get_features_dword11_plmc[2],
5856
15
            { "Reserved", "nvme.cmd.get_features.dword11.plmc.rsvd",
5857
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5858
15
        },
5859
15
        { &hf_nvme_cmd_get_features_dword11_plmw[0],
5860
15
            { "DWORD11", "nvme.cmd.get_features.dword11.plmw",
5861
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
5862
15
        },
5863
15
        { &hf_nvme_cmd_get_features_dword11_plmw[1],
5864
15
            { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmw.nvmsetid",
5865
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
5866
15
        },
5867
15
        { &hf_nvme_cmd_get_features_dword11_plmw[2],
5868
15
            { "Reserved", "nvme.cmd.get_features.dword11.plmw.rsvd",
5869
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
5870
15
        },
5871
        /* Identify NS response */
5872
15
        { &hf_nvme_identify_ns_nsze,
5873
15
            { "Namespace Size (NSZE)", "nvme.cmd.identify.ns.nsze",
5874
15
               FT_UINT64, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
5875
15
        },
5876
15
        { &hf_nvme_identify_ns_ncap,
5877
15
            { "Namespace Capacity (NCAP)", "nvme.cmd.identify.ns.ncap",
5878
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5879
15
        },
5880
15
        { &hf_nvme_identify_ns_nuse,
5881
15
            { "Namespace Utilization (NUSE)", "nvme.cmd.identify.ns.nuse",
5882
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
5883
15
        },
5884
15
        { &hf_nvme_identify_ns_nsfeat,
5885
15
            { "Namespace Features (NSFEAT)", "nvme.cmd.identify.ns.nsfeat",
5886
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5887
15
        },
5888
15
        { &hf_nvme_identify_ns_nlbaf,
5889
15
            { "Number of LBA Formats (NLBAF)", "nvme.cmd.identify.ns.nlbaf",
5890
15
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
5891
15
        },
5892
15
        { &hf_nvme_identify_ns_flbas,
5893
15
            { "Formatted LBA Size (FLBAS)", "nvme.cmd.identify.ns.flbas",
5894
15
               FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
5895
15
        },
5896
15
        { &hf_nvme_identify_ns_mc,
5897
15
            { "Metadata Capabilities (MC)", "nvme.cmd.identify.ns.mc",
5898
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5899
15
        },
5900
15
        { &hf_nvme_identify_ns_dpc,
5901
15
            { "End-to-end Data Protection Capabilities (DPC)", "nvme.cmd.identify.ns.dpc",
5902
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5903
15
        },
5904
15
        { &hf_nvme_identify_ns_dps,
5905
15
            { "End-to-end Data Protection Type Settings (DPS)", "nvme.cmd.identify.ns.dps",
5906
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5907
15
        },
5908
15
        { &hf_nvme_identify_ns_nmic,
5909
15
            { "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)",
5910
15
              "nvme.cmd.identify.ns.nmic", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5911
15
        },
5912
15
        { &hf_nvme_identify_ns_nguid,
5913
15
            { "Namespace Globally Unique Identifier (NGUID)", "nvme.cmd.identify.ns.nguid",
5914
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5915
15
        },
5916
15
        { &hf_nvme_identify_ns_eui64,
5917
15
            { "IEEE Extended Unique Identifier (EUI64)", "nvme.cmd.identify.ns.eui64",
5918
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5919
15
        },
5920
15
        { &hf_nvme_identify_ns_lbafs,
5921
15
            { "LBA Formats", "nvme.cmd.identify.ns.lbafs",
5922
15
               FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL}
5923
15
        },
5924
15
        { &hf_nvme_identify_ns_lbaf,
5925
15
            { "LBA Format", "nvme.cmd.identify.ns.lbaf",
5926
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5927
15
        },
5928
15
        { &hf_nvme_identify_ns_rsvd,
5929
15
            { "Reserved", "nvme.cmd.identify.ns.rsvd",
5930
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5931
15
        },
5932
15
        { &hf_nvme_identify_ns_vs,
5933
15
            { "Vendor Specific", "nvme.cmd.identify.ns.vs",
5934
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5935
15
        },
5936
        /* Identify Ctrl response */
5937
15
        { &hf_nvme_identify_ctrl_vid,
5938
15
            { "PCI Vendor ID (VID)", "nvme.cmd.identify.ctrl.vid",
5939
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
5940
15
        },
5941
15
        { &hf_nvme_identify_ctrl_ssvid,
5942
15
            { "PCI Subsystem Vendor ID (SSVID)", "nvme.cmd.identify.ctrl.ssvid",
5943
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
5944
15
        },
5945
15
        { &hf_nvme_identify_ctrl_sn,
5946
15
            { "Serial Number (SN)", "nvme.cmd.identify.ctrl.sn",
5947
15
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
5948
15
        },
5949
15
        { &hf_nvme_identify_ctrl_mn,
5950
15
            { "Model Number (MN)", "nvme.cmd.identify.ctrl.mn",
5951
15
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
5952
15
        },
5953
15
        { &hf_nvme_identify_ctrl_fr,
5954
15
            { "Firmware Revision (FR)", "nvme.cmd.identify.ctrl.fr",
5955
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
5956
15
        },
5957
15
        { &hf_nvme_identify_ctrl_rab,
5958
15
            { "Recommended Arbitration Burst (RAB)", "nvme.cmd.identify.ctrl.rab",
5959
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_rab), 0x0, NULL, HFILL}
5960
15
        },
5961
15
        { &hf_nvme_identify_ctrl_ieee,
5962
15
            { "IEEE OUI Identifier (IEEE)", "nvme.cmd.identify.ctrl.ieee",
5963
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
5964
15
        },
5965
15
        { &hf_nvme_identify_ctrl_cmic[0],
5966
15
            { "Controller Multi-Path I/O and Namespace Sharing Capabilities (CMIC)", "nvme.cmd.identify.ctrl.cmic",
5967
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
5968
15
        },
5969
15
        { &hf_nvme_identify_ctrl_cmic[1],
5970
15
            { "Multiple Ports Support", "nvme.cmd.identify.ctrl.cmic.mp",
5971
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
5972
15
        },
5973
15
        { &hf_nvme_identify_ctrl_cmic[2],
5974
15
            { "Multiple Controllers Support", "nvme.cmd.identify.ctrl.cmic.mc",
5975
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
5976
15
        },
5977
15
        { &hf_nvme_identify_ctrl_cmic[3],
5978
15
            { "SRIOV Association", "nvme.cmd.identify.ctrl.cmic.sriov",
5979
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
5980
15
        },
5981
15
        { &hf_nvme_identify_ctrl_cmic[4],
5982
15
            { "ANA Reporting Support", "nvme.cmd.identify.ctrl.cmic.ana",
5983
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
5984
15
        },
5985
15
        { &hf_nvme_identify_ctrl_cmic[5],
5986
15
            { "Reserved", "nvme.cmd.identify.ctrl.cmic.rsvd",
5987
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
5988
15
        },
5989
15
        { &hf_nvme_identify_ctrl_mdts,
5990
15
            { "Maximum Data Transfer Size (MDTS)", "nvme.cmd.identify.ctrl.mdts",
5991
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_mdts), 0x0, NULL, HFILL}
5992
15
        },
5993
15
        { &hf_nvme_identify_ctrl_cntlid,
5994
15
            { "Controller ID (CNTLID)", "nvme.cmd.identify.ctrl.cntlid",
5995
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
5996
15
        },
5997
15
        { &hf_nvme_identify_ctrl_ver,
5998
15
            { "Version (VER)", "nvme.cmd.identify.ctrl.ver",
5999
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6000
15
        },
6001
15
        { &hf_nvme_identify_ctrl_ver_ter,
6002
15
            { "Tertiary Version Number (TER)", "nvme.cmd.identify.ctrl.ver.ter",
6003
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
6004
15
        },
6005
15
        { &hf_nvme_identify_ctrl_ver_min,
6006
15
            { "Minor Version Number (MNR)", "nvme.cmd.identify.ctrl.ver.min",
6007
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
6008
15
        },
6009
15
        { &hf_nvme_identify_ctrl_ver_mjr,
6010
15
            { "Major Version Number (MJR)", "nvme.cmd.identify.ctrl.ver.mjr",
6011
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6012
15
        },
6013
15
        { &hf_nvme_identify_ctrl_rtd3r,
6014
15
            { "RTD3 Resume Latency (RTD3R)", "nvme.cmd.identify.ctrl.rtd3r",
6015
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL}
6016
15
        },
6017
15
        { &hf_nvme_identify_ctrl_rtd3e,
6018
15
            { "RTD3 Entry Latency (RTD3E)", "nvme.cmd.identify.ctrl.rtd3e",
6019
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL}
6020
15
        },
6021
15
        { &hf_nvme_identify_ctrl_oaes[0],
6022
15
            { "Optional Asynchronous Events Supported (OAES)", "nvme.cmd.identify.ctrl.oaes",
6023
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6024
15
        },
6025
15
        { &hf_nvme_identify_ctrl_oaes[1],
6026
15
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd0",
6027
15
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
6028
15
        },
6029
15
        { &hf_nvme_identify_ctrl_oaes[2],
6030
15
            { "Namespace Attribute Notices Supported", "nvme.cmd.identify.ctrl.oaes.nan",
6031
15
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
6032
15
        },
6033
15
        { &hf_nvme_identify_ctrl_oaes[3],
6034
15
            { "Firmware Activation Supported", "nvme.cmd.identify.ctrl.oaes.fan",
6035
15
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
6036
15
        },
6037
15
        { &hf_nvme_identify_ctrl_oaes[4],
6038
15
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd1",
6039
15
               FT_UINT32, BASE_HEX, NULL, 0x400, NULL, HFILL}
6040
15
        },
6041
15
        { &hf_nvme_identify_ctrl_oaes[5],
6042
15
            { "Asymmetric Namespace Access Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ana",
6043
15
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
6044
15
        },
6045
15
        { &hf_nvme_identify_ctrl_oaes[6],
6046
15
            { "Predictable Latency Event Aggregate Log Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ple",
6047
15
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
6048
15
        },
6049
15
        { &hf_nvme_identify_ctrl_oaes[7],
6050
15
            { "LBA Status Information Notices Supported", "nvme.cmd.identify.ctrl.oaes.lba",
6051
15
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
6052
15
        },
6053
15
        { &hf_nvme_identify_ctrl_oaes[8],
6054
15
            { "Endurance Group Event Aggregate Log Page Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ege",
6055
15
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
6056
15
        },
6057
15
        { &hf_nvme_identify_ctrl_oaes[9],
6058
15
            { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd2",
6059
15
               FT_UINT32, BASE_HEX, NULL, 0xffff8000, NULL, HFILL}
6060
15
        },
6061
15
        { &hf_nvme_identify_ctrl_ctratt[0],
6062
15
            { "Controller Attributes (CTRATT)", "nvme.cmd.identify.ctrl.ctratt",
6063
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6064
15
        },
6065
15
        { &hf_nvme_identify_ctrl_ctratt[1],
6066
15
            { "128-bit Host Identifier Support", "nvme.cmd.identify.ctrl.ctratt.hi_128",
6067
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
6068
15
        },
6069
15
        { &hf_nvme_identify_ctrl_ctratt[2],
6070
15
            { "Non-Operational Power State Permissive Mode Supported", "nvme.cmd.identify.ctrl.ctratt.nopspm",
6071
15
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
6072
15
        },
6073
15
        { &hf_nvme_identify_ctrl_ctratt[3],
6074
15
            { "NVM Sets Supported", "nvme.cmd.identify.ctrl.ctratt.nvmset",
6075
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
6076
15
        },
6077
15
        { &hf_nvme_identify_ctrl_ctratt[4],
6078
15
            { "Read Recovery Levels Supported", "nvme.cmd.identify.ctrl.ctratt.rrl",
6079
15
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
6080
15
        },
6081
15
        { &hf_nvme_identify_ctrl_ctratt[5],
6082
15
            { "Endurance Groups Supported", "nvme.cmd.identify.ctrl.ctratt.eg",
6083
15
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
6084
15
        },
6085
15
        { &hf_nvme_identify_ctrl_ctratt[6],
6086
15
            { "Predictable Latency Mode Supported", "nvme.cmd.identify.ctrl.ctratt.plm",
6087
15
               FT_BOOLEAN, 32, NULL, 0x20, NULL, HFILL}
6088
15
        },
6089
15
        { &hf_nvme_identify_ctrl_ctratt[7],
6090
15
            { "Traffic Based Keep Alive Support (TBKAS)", "nvme.cmd.identify.ctrl.ctratt.tbkas",
6091
15
               FT_BOOLEAN, 32, NULL, 0x40, NULL, HFILL}
6092
15
        },
6093
15
        { &hf_nvme_identify_ctrl_ctratt[8],
6094
15
            { "Namespace Granularity", "nvme.cmd.identify.ctrl.ctratt.ng",
6095
15
               FT_BOOLEAN, 32, NULL, 0x80, NULL, HFILL}
6096
15
        },
6097
15
        { &hf_nvme_identify_ctrl_ctratt[9],
6098
15
            { "SQ Associations Support", "nvme.cmd.identify.ctrl.ctratt.sqa",
6099
15
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
6100
15
        },
6101
15
        { &hf_nvme_identify_ctrl_ctratt[10],
6102
15
            { "UUID List Support", "nvme.cmd.identify.ctrl.ctratt.uuidl",
6103
15
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
6104
15
        },
6105
15
        { &hf_nvme_identify_ctrl_ctratt[11],
6106
15
            { "Reserved", "nvme.cmd.identify.ctrl.ctratt.rsvd",
6107
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffc00, NULL, HFILL}
6108
15
        },
6109
15
        { &hf_nvme_identify_ctrl_rrls[0],
6110
15
            { "Read Recovery Levels Support (RRLS)", "nvme.cmd.identify.ctrl.rrls",
6111
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6112
15
        },
6113
15
        { &hf_nvme_identify_ctrl_rrls[1],
6114
15
            { "Read Recovery Level 0 Support", "nvme.cmd.identify.ctrl.rrls.rrls0",
6115
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6116
15
        },
6117
15
        { &hf_nvme_identify_ctrl_rrls[2],
6118
15
            { "Read Recovery Level 1 Support", "nvme.cmd.identify.ctrl.rrls.rrls1",
6119
15
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
6120
15
        },
6121
15
        { &hf_nvme_identify_ctrl_rrls[3],
6122
15
            { "Read Recovery Level 2 Support", "nvme.cmd.identify.ctrl.rrls.rrls2",
6123
15
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
6124
15
        },
6125
15
        { &hf_nvme_identify_ctrl_rrls[4],
6126
15
            { "Read Recovery Level 3 Support", "nvme.cmd.identify.ctrl.rrls.rrls3",
6127
15
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
6128
15
        },
6129
15
        { &hf_nvme_identify_ctrl_rrls[5],
6130
15
            { "Read Recovery Level 4 (Default) Support", "nvme.cmd.identify.ctrl.rrls.rrls4",
6131
15
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
6132
15
        },
6133
15
        { &hf_nvme_identify_ctrl_rrls[6],
6134
15
            { "Read Recovery Level 5 Support", "nvme.cmd.identify.ctrl.rrls.rrls5",
6135
15
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
6136
15
        },
6137
15
        { &hf_nvme_identify_ctrl_rrls[7],
6138
15
            { "Read Recovery Level 6 Support", "nvme.cmd.identify.ctrl.rrls.rrls6",
6139
15
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
6140
15
        },
6141
15
        { &hf_nvme_identify_ctrl_rrls[8],
6142
15
            { "Read Recovery Level 7 Support", "nvme.cmd.identify.ctrl.rrls.rrls7",
6143
15
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
6144
15
        },
6145
15
        { &hf_nvme_identify_ctrl_rrls[9],
6146
15
            { "Read Recovery Level 8 Support", "nvme.cmd.identify.ctrl.rrls.rrls8",
6147
15
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
6148
15
        },
6149
15
        { &hf_nvme_identify_ctrl_rrls[10],
6150
15
            { "Read Recovery Level 9 Support", "nvme.cmd.identify.ctrl.rrls.rrls9",
6151
15
               FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL}
6152
15
        },
6153
15
        { &hf_nvme_identify_ctrl_rrls[11],
6154
15
            { "Read Recovery Level 10 Support", "nvme.cmd.identify.ctrl.rrls.rrls10",
6155
15
               FT_BOOLEAN, 16, NULL, 0x400, NULL, HFILL}
6156
15
        },
6157
15
        { &hf_nvme_identify_ctrl_rrls[12],
6158
15
            { "Read Recovery Level 11 Support", "nvme.cmd.identify.ctrl.rrls.rrls11",
6159
15
               FT_BOOLEAN, 16, NULL, 0x800, NULL, HFILL}
6160
15
        },
6161
15
        { &hf_nvme_identify_ctrl_rrls[13],
6162
15
            { "Read Recovery Level 12 Support", "nvme.cmd.identify.ctrl.rrls.rrls12",
6163
15
               FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL}
6164
15
        },
6165
15
        { &hf_nvme_identify_ctrl_rrls[14],
6166
15
            { "Read Recovery Level 13 Support", "nvme.cmd.identify.ctrl.rrls.rrls13",
6167
15
               FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL}
6168
15
        },
6169
15
        { &hf_nvme_identify_ctrl_rrls[15],
6170
15
            { "Read Recovery Level 14 Support", "nvme.cmd.identify.ctrl.rrls.rrls14",
6171
15
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
6172
15
        },
6173
15
        { &hf_nvme_identify_ctrl_rrls[16],
6174
15
            { "Read Recovery Level 15 (Fast Fail) Support", "nvme.cmd.identify.ctrl.rrls.rrls15",
6175
15
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
6176
15
        },
6177
15
        { &hf_nvme_identify_ctrl_rsvd0,
6178
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd0",
6179
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6180
15
        },
6181
15
        { &hf_nvme_identify_ctrl_cntrltype,
6182
15
            { "Controller Type (CNTRLTYPE)", "nvme.cmd.identify.ctrl.cntrltype",
6183
15
               FT_UINT8, BASE_HEX, VALS(ctrl_type_tbl), 0x0, NULL, HFILL}
6184
15
        },
6185
15
        { &hf_nvme_identify_ctrl_fguid,
6186
15
            { "FRU Globally Unique Identifier (FGUID)", "nvme.cmd.identify.ctrl.fguid",
6187
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6188
15
        },
6189
15
        { &hf_nvme_identify_ctrl_fguid_vse,
6190
15
            { "Vendor Specific Extension Identifier", "nvme.cmd.identify.ctrl.fguid.vse",
6191
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
6192
15
        },
6193
15
        { &hf_nvme_identify_ctrl_fguid_oui,
6194
15
            { "Organizationally Unique Identifier", "nvme.cmd.identify.ctrl.fguid.oui",
6195
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6196
15
        },
6197
15
        { &hf_nvme_identify_ctrl_fguid_ei,
6198
15
            { "Extension Identifier", "nvme.cmd.identify.ctrl.fguid.ei",
6199
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
6200
15
        },
6201
15
        { &hf_nvme_identify_ctrl_crdt1,
6202
15
            { "Command Retry Delay Time 1", "nvme.cmd.identify.ctrl.crdt1",
6203
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
6204
15
        },
6205
15
        { &hf_nvme_identify_ctrl_crdt2,
6206
15
            { "Command Retry Delay Time 2", "nvme.cmd.identify.ctrl.crdt2",
6207
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
6208
15
        },
6209
15
        { &hf_nvme_identify_ctrl_crdt3,
6210
15
            { "Command Retry Delay Time 3", "nvme.cmd.identify.ctrl.crdt3",
6211
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
6212
15
        },
6213
15
        { &hf_nvme_identify_ctrl_rsvd1,
6214
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd1",
6215
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6216
15
        },
6217
15
        { &hf_nvme_identify_ctrl_mi,
6218
15
            { "NVMe Management Interface", "nvme.cmd.identify.ctrl.mi",
6219
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6220
15
        },
6221
15
        { &hf_nvme_identify_ctrl_mi_rsvd,
6222
15
            { "Reserved", "nvme.cmd.identify.ctrl.mi.rsvd",
6223
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6224
15
        },
6225
15
        { &hf_nvme_identify_ctrl_mi_nvmsr[0],
6226
15
            { "NVM Subsystem Report (NVMSR)", "nvme.cmd.identify.ctrl.mi.nvmsr",
6227
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6228
15
        },
6229
15
        { &hf_nvme_identify_ctrl_mi_nvmsr[1],
6230
15
            { "NVMe Storage Device (NVMESD)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmesd",
6231
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6232
15
        },
6233
15
        { &hf_nvme_identify_ctrl_mi_nvmsr[2],
6234
15
            { "NVMe Enclosure (NVMEE)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmee",
6235
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6236
15
        },
6237
15
        { &hf_nvme_identify_ctrl_mi_nvmsr[3],
6238
15
            { "Reserved", "nvme.cmd.identify.ctrl.mi.nvmsr.rsvd",
6239
15
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
6240
15
        },
6241
15
        { &hf_nvme_identify_ctrl_mi_vwci[0],
6242
15
            { "VPD Write Cycle Information (VWCI)", "nvme.cmd.identify.ctrl.mi.vwci",
6243
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6244
15
        },
6245
15
        { &hf_nvme_identify_ctrl_mi_vwci[1],
6246
15
            { "VPD Write Cycles Remaining (VWCR)", "nvme.cmd.identify.ctrl.mi.vwci.vwcr",
6247
15
               FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL}
6248
15
        },
6249
15
        { &hf_nvme_identify_ctrl_mi_vwci[2],
6250
15
            { "VPD Write Cycle Remaining Valid (VWCRV)", "nvme.cmd.identify.ctrl.mi.vwci.vwcrv",
6251
15
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
6252
15
        },
6253
15
        { &hf_nvme_identify_ctrl_mi_mec[0],
6254
15
            { "Management Endpoint Capabilities (MEC)", "nvme.cmd.identify.ctrl.mi.mec",
6255
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6256
15
        },
6257
15
        { &hf_nvme_identify_ctrl_mi_mec[1],
6258
15
            { "SMBus/I2C Port Management Endpoint (SMBUSME)", "nvme.cmd.identify.ctrl.mi.mec.smbusme",
6259
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6260
15
        },
6261
15
        { &hf_nvme_identify_ctrl_mi_mec[2],
6262
15
            { "PCIe Port Management Endpoint (PCIEME)", "nvme.cmd.identify.ctrl.mi.mec.pcieme",
6263
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6264
15
        },
6265
15
        { &hf_nvme_identify_ctrl_mi_mec[3],
6266
15
            { "Reserved", "nvme.cmd.identify.ctrl.mi.mec.rsvd",
6267
15
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
6268
15
        },
6269
15
        { &hf_nvme_identify_ctrl_oacs[0],
6270
15
            { "Optional Admin Command Support (OACS)", "nvme.cmd.identify.ctrl.oacs",
6271
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6272
15
        },
6273
15
        { &hf_nvme_identify_ctrl_oacs[1],
6274
15
            { "Security Send and Security Receive Support", "nvme.cmd.identify.ctrl.oacs.sec",
6275
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6276
15
        },
6277
15
        { &hf_nvme_identify_ctrl_oacs[2],
6278
15
            { "Format NVM Support", "nvme.cmd.identify.ctrl.oacs.fmt",
6279
15
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
6280
15
        },
6281
15
        { &hf_nvme_identify_ctrl_oacs[3],
6282
15
            { "Firmware Download and Commit Support", "nvme.cmd.identify.ctrl.oacs.fw",
6283
15
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
6284
15
        },
6285
15
        { &hf_nvme_identify_ctrl_oacs[4],
6286
15
            { "Namespace Management Support", "nvme.cmd.identify.ctrl.oacs.nsmgmt",
6287
15
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
6288
15
        },
6289
15
        { &hf_nvme_identify_ctrl_oacs[5],
6290
15
            { "Device Self-Test Support", "nvme.cmd.identify.ctrl.oacs.stst",
6291
15
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
6292
15
        },
6293
15
        { &hf_nvme_identify_ctrl_oacs[6],
6294
15
            { "Directive Send and Directive Receive Support", "nvme.cmd.identify.ctrl.oacs.dtv",
6295
15
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
6296
15
        },
6297
15
        { &hf_nvme_identify_ctrl_oacs[7],
6298
15
            { "NVMe-MI Send and NVMe Receive Support", "nvme.cmd.identify.ctrl.oacs.mi",
6299
15
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
6300
15
        },
6301
15
        { &hf_nvme_identify_ctrl_oacs[8],
6302
15
            { "Virtualization Management Support", "nvme.cmd.identify.ctrl.oacs.vm",
6303
15
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
6304
15
        },
6305
15
        { &hf_nvme_identify_ctrl_oacs[9],
6306
15
            { "Dorbell Buffer Config Support", "nvme.cmd.identify.ctrl.oacs.db",
6307
15
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
6308
15
        },
6309
15
        { &hf_nvme_identify_ctrl_oacs[10],
6310
15
            { "Get LBA Status Support", "nvme.cmd.identify.ctrl.oacs.sec.lba",
6311
15
               FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL}
6312
15
        },
6313
15
        { &hf_nvme_identify_ctrl_oacs[11],
6314
15
            { "Reserved", "nvme.cmd.identify.ctrl.oacs.sec.rsvd",
6315
15
               FT_UINT16, BASE_HEX, NULL, 0xfc00, NULL, HFILL}
6316
15
        },
6317
15
        { &hf_nvme_identify_ctrl_acl,
6318
15
            { "Abort Command Limit (ACL)", "nvme.cmd.identify.ctrl.acl",
6319
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_commands), 0x0, NULL, HFILL}
6320
15
        },
6321
15
        { &hf_nvme_identify_ctrl_aerl,
6322
15
            { "Asynchronous Event Request Limit (AERL)", "nvme.cmd.identify.ctrl.aerl",
6323
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_events), 0x0, NULL, HFILL}
6324
15
        },
6325
15
        { &hf_nvme_identify_ctrl_frmw[0],
6326
15
            { "Firmware Updates (FRMW)", "nvme.cmd.identify.ctrl.frmw",
6327
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6328
15
        },
6329
15
        { &hf_nvme_identify_ctrl_frmw[1],
6330
15
            { "First Firmware Slot Read-Only", "nvme.cmd.identify.ctrl.frmw.fro",
6331
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6332
15
        },
6333
15
        { &hf_nvme_identify_ctrl_frmw[2],
6334
15
            { "Number of Firmware Slots", "nvme.cmd.identify.ctrl.frmw.fsn",
6335
15
               FT_UINT8, BASE_HEX, NULL, 0xe, NULL, HFILL}
6336
15
        },
6337
15
        { &hf_nvme_identify_ctrl_frmw[3],
6338
15
            { "Supports Activation Without Reset", "nvme.cmd.identify.ctrl.frmw.anr",
6339
15
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
6340
15
        },
6341
15
        { &hf_nvme_identify_ctrl_frmw[4],
6342
15
            { "Reserved", "nvme.cmd.identify.ctrl.frmw.rsvd",
6343
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6344
15
        },
6345
15
        { &hf_nvme_identify_ctrl_lpa[0],
6346
15
            { "Log Page Attributes (LPA)", "nvme.cmd.identify.ctrl.lpa",
6347
15
               FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL}
6348
15
        },
6349
15
        { &hf_nvme_identify_ctrl_lpa[1],
6350
15
            { "Smart Log Page per Namespace Support", "nvme.cmd.identify.ctrl.lpa.smrt",
6351
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6352
15
        },
6353
15
        { &hf_nvme_identify_ctrl_lpa[2],
6354
15
            { "Commands Supported and Effects Log Page Support", "nvme.cmd.identify.ctrl.lpa.cmds",
6355
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6356
15
        },
6357
15
        { &hf_nvme_identify_ctrl_lpa[3],
6358
15
            { "Extended Data Get Log Page Support", "nvme.cmd.identify.ctrl.lpa.elp",
6359
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
6360
15
        },
6361
15
        { &hf_nvme_identify_ctrl_lpa[4],
6362
15
            { "Telemetry Log Page and Notices Support", "nvme.cmd.identify.ctrl.lpa.tel",
6363
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
6364
15
        },
6365
15
        { &hf_nvme_identify_ctrl_lpa[5],
6366
15
            { "Persistent Event Log Support", "nvme.cmd.identify.ctrl.lpa.ple",
6367
15
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
6368
15
        },
6369
15
        { &hf_nvme_identify_ctrl_lpa[6],
6370
15
            { "Reserved", "nvme.cmd.identify.ctrl.lpa.rsvd",
6371
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6372
15
        },
6373
15
        { &hf_nvme_identify_ctrl_elpe,
6374
15
            { "Error Log Page Entries (ELPE)", "nvme.cmd.identify.ctrl.elpe",
6375
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_entries), 0x0, NULL, HFILL}
6376
15
        },
6377
15
        { &hf_nvme_identify_ctrl_npss,
6378
15
            { "Number of Power States Supported (NPSS)", "nvme.cmd.identify.ctrl.npss",
6379
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_states), 0x0, NULL, HFILL}
6380
15
        },
6381
15
        { &hf_nvme_identify_ctrl_avscc[0],
6382
15
            { "Admin Vendor Specific Command Configuration (AVSCC)", "nvme.cmd.identify.ctrl.avscc",
6383
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6384
15
        },
6385
15
        { &hf_nvme_identify_ctrl_avscc[1],
6386
15
            { "Standard Command Format", "nvme.cmd.identify.ctrl.avscc.std",
6387
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6388
15
        },
6389
15
        { &hf_nvme_identify_ctrl_avscc[2],
6390
15
            { "Reserved", "nvme.cmd.identify.ctrl.avscc.rsvd",
6391
15
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
6392
15
        },
6393
15
        { &hf_nvme_identify_ctrl_apsta[0],
6394
15
            { "Autonomous Power State Transition Attributes (APSTA)", "nvme.cmd.identify.ctrl.apsta",
6395
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6396
15
        },
6397
15
        { &hf_nvme_identify_ctrl_apsta[1],
6398
15
            { "Autonomous Power State Transitions Supported", "nvme.cmd.identify.ctrl.apsta.aut",
6399
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6400
15
        },
6401
15
        { &hf_nvme_identify_ctrl_apsta[2],
6402
15
            { "Reserved", "nvme.cmd.identify.ctrl.apsta.rsvd",
6403
15
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
6404
15
        },
6405
15
        { &hf_nvme_identify_ctrl_wctemp,
6406
15
            { "Warning Composite Temperature Threshold (WCTEMP)", "nvme.cmd.identify.ctrl.wctemp",
6407
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6408
15
        },
6409
15
        { &hf_nvme_identify_ctrl_cctemp,
6410
15
            { "Critical Composite Temperature Threshold (CCTEMP)", "nvme.cmd.identify.ctrl.cctemp",
6411
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6412
15
        },
6413
15
        { &hf_nvme_identify_ctrl_mtfa,
6414
15
            { "Maximum Time for Firmware Activation (MTFA)", "nvme.cmd.identify.ctrl.mtfa",
6415
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
6416
15
        },
6417
15
        { &hf_nvme_identify_ctrl_hmpre,
6418
15
            { "Host Memory Buffer Preferred Size (HMPRE)", "nvme.cmd.identify.ctrl.hmpre",
6419
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
6420
15
        },
6421
15
        { &hf_nvme_identify_ctrl_hmmin,
6422
15
            { "Host Memory Buffer Minimum Size (HMMIN)", "nvme.cmd.identify.ctrl.hmmin",
6423
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
6424
15
        },
6425
15
        { &hf_nvme_identify_ctrl_tnvmcap,
6426
15
            { "Total NVM Capacity (TNVMCAP)", "nvme.cmd.identify.ctrl.tnvmcap",
6427
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
6428
15
        },
6429
15
        { &hf_nvme_identify_ctrl_unvmcap,
6430
15
            { "Unallocated NVM Capacity (UNVMCAP)", "nvme.cmd.identify.ctrl.unvmcap",
6431
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
6432
15
        },
6433
15
        { &hf_nvme_identify_ctrl_rpmbs[0],
6434
15
            { "Replay Protected Memory Block Support (RPMBS)", "nvme.cmd.identify.ctrl.rpmbs",
6435
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6436
15
        },
6437
15
        { &hf_nvme_identify_ctrl_rpmbs[1],
6438
15
            { "Number of RPMB Units", "nvme.cmd.identify.ctrl.rpmbs.nu",
6439
15
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
6440
15
        },
6441
15
        { &hf_nvme_identify_ctrl_rpmbs[2],
6442
15
            { "Authentication Method", "nvme.cmd.identify.ctrl.rpmbs.au",
6443
15
               FT_UINT32, BASE_HEX, NULL, 0x38, NULL, HFILL}
6444
15
        },
6445
15
        { &hf_nvme_identify_ctrl_rpmbs[3],
6446
15
            { "Reserved", "nvme.cmd.identify.ctrl.rpmbs.rsvd",
6447
15
               FT_UINT32, BASE_HEX, NULL, 0xffc0, NULL, HFILL}
6448
15
        },
6449
15
        { &hf_nvme_identify_ctrl_rpmbs[4],
6450
15
            { "Total RPMB Unit Size (128 KiB blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.ts",
6451
15
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
6452
15
        },
6453
15
        { &hf_nvme_identify_ctrl_rpmbs[5],
6454
15
            { "Access Size (512-byte blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.as",
6455
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
6456
15
        },
6457
15
            { &hf_nvme_identify_ctrl_edstt,
6458
15
            { "Extended Device Self-test Time (EDSTT) (in minutes)", "nvme.cmd.identify.ctrl.edstt",
6459
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6460
15
        },
6461
15
        { &hf_nvme_identify_ctrl_dsto[0],
6462
15
            { "Device Self-test Options (DSTO)", "nvme.cmd.identify.ctrl.dsto",
6463
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6464
15
        },
6465
15
        { &hf_nvme_identify_ctrl_dsto[1],
6466
15
            { "Concurrent Self-Tests for Multiple Devices Support", "nvme.cmd.identify.ctrl.dsto.mds",
6467
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6468
15
        },
6469
15
        { &hf_nvme_identify_ctrl_dsto[2],
6470
15
            { "Reserved", "nvme.cmd.identify.ctrl.dsto.rsvd",
6471
15
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
6472
15
        },
6473
15
        { &hf_nvme_identify_ctrl_fwug,
6474
15
            { "Firmware Update Granularity in 4 KiB Units (FWUG)", "nvme.cmd.identify.ctrl.fwug",
6475
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
6476
15
        },
6477
15
        { &hf_nvme_identify_ctrl_kas,
6478
15
            { "Keep Alive Support - Timer Value (KAS)", "nvme.cmd.identify.ctrl.kas",
6479
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL}
6480
15
        },
6481
15
        { &hf_nvme_identify_ctrl_hctma[0],
6482
15
            { "Host Controlled Thermal Management Attributes (HCTMA)", "nvme.cmd.identify.ctrl.hctma",
6483
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6484
15
        },
6485
15
        { &hf_nvme_identify_ctrl_hctma[1],
6486
15
            { "Controller Supports Thermal Management", "nvme.cmd.identify.ctrl.hctma.sup",
6487
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6488
15
        },
6489
15
        { &hf_nvme_identify_ctrl_hctma[2],
6490
15
            { "Reserved", "nvme.cmd.identify.ctrl.hctma.rsvd",
6491
15
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
6492
15
        },
6493
15
        { &hf_nvme_identify_ctrl_mntmt,
6494
15
            { "Minimum Thermal Management Temperature (MNTMT)", "nvme.cmd.identify.ctrl.mntmt",
6495
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL}
6496
15
        },
6497
15
        { &hf_nvme_identify_ctrl_mxtmt,
6498
15
            { "Maximum Thermal Management Temperature (MXTMT)", "nvme.cmd.identify.ctrl.mxtmt",
6499
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL}
6500
15
        },
6501
15
        { &hf_nvme_identify_ctrl_sanicap[0],
6502
15
            { "Sanitize Capabilities (SANICAP)", "nvme.cmd.identify.ctrl.sanicap",
6503
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6504
15
        },
6505
15
        { &hf_nvme_identify_ctrl_sanicap[1],
6506
15
            { "Crypto Erase Support (CES)", "nvme.cmd.identify.ctrl.sanicap.ces",
6507
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
6508
15
        },
6509
15
        { &hf_nvme_identify_ctrl_sanicap[2],
6510
15
            { "Block Erase Support (BES)", "nvme.cmd.identify.ctrl.sanicap.bes",
6511
15
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
6512
15
        },
6513
15
        { &hf_nvme_identify_ctrl_sanicap[3],
6514
15
            { "Overwrite Support (OWS)", "nvme.cmd.identify.ctrl.sanicap.ows",
6515
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
6516
15
        },
6517
15
        { &hf_nvme_identify_ctrl_sanicap[4],
6518
15
            { "Reserved", "nvme.cmd.identify.ctrl.sanicap.rsvd",
6519
15
               FT_UINT32, BASE_HEX, NULL, 0x1ffffff8, NULL, HFILL}
6520
15
        },
6521
15
        { &hf_nvme_identify_ctrl_sanicap[5],
6522
15
            { "No-Deallocate Inhibited (NDI)", "nvme.cmd.identify.ctrl.sanicap.ndi",
6523
15
               FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL}
6524
15
        },
6525
15
        { &hf_nvme_identify_ctrl_sanicap[6],
6526
15
            { "No-Deallocate Modifies Media After Sanitize (NODMMAS)", "nvme.cmd.identify.ctrl.sanicap.nodmmas",
6527
15
               FT_UINT32, BASE_HEX, VALS(mmas_type_tbl), 0xc0000000, NULL, HFILL}
6528
15
        },
6529
15
        { &hf_nvme_identify_ctrl_hmmminds,
6530
15
            { "Host Memory Buffer Minimum Descriptor Entry Size in 4 KiB Units (HMMINDS)", "nvme.cmd.identify.ctrl.hmmminds",
6531
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6532
15
        },
6533
15
        { &hf_nvme_identify_ctrl_hmmaxd,
6534
15
            { "Host Memory Maximum Descriptors Entries (HMMAXD)", "nvme.cmd.identify.ctrl.hmmaxd",
6535
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6536
15
        },
6537
15
        { &hf_nvme_identify_ctrl_nsetidmax,
6538
15
            { "NVM Set Identifier Maximum (NSETIDMAX)", "nvme.cmd.identify.ctrl.nsetidmax",
6539
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6540
15
        },
6541
15
        { &hf_nvme_identify_ctrl_endgidmax,
6542
15
            { "Endurance Group Identifier Maximum (ENDGIDMAX)", "nvme.cmd.identify.ctrl.endgidmax",
6543
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6544
15
        },
6545
15
        { &hf_nvme_identify_ctrl_anatt,
6546
15
            { "ANA Transition Time in Seconds (ANATT)", "nvme.cmd.identify.ctrl.anatt",
6547
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
6548
15
        },
6549
15
        { &hf_nvme_identify_ctrl_anacap[0],
6550
15
            { "Asymmetric Namespace Access Capabilities (ANACAP)", "nvme.cmd.identify.ctrl.anacap",
6551
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6552
15
        },
6553
15
        { &hf_nvme_identify_ctrl_anacap[1],
6554
15
            { "Reports ANA Optimized State", "nvme.cmd.identify.ctrl.anacap.osr",
6555
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6556
15
        },
6557
15
        { &hf_nvme_identify_ctrl_anacap[2],
6558
15
            { "Reports ANA Non-Optimized State", "nvme.cmd.identify.ctrl.anacap.nosr",
6559
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6560
15
        },
6561
15
        { &hf_nvme_identify_ctrl_anacap[3],
6562
15
            { "Reports Innaccessible State", "nvme.cmd.identify.ctrl.anacap.isr",
6563
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
6564
15
        },
6565
15
        { &hf_nvme_identify_ctrl_anacap[4],
6566
15
            { "Reports ANA Persistent Loss State", "nvme.cmd.identify.ctrl.anacap.plsr",
6567
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
6568
15
        },
6569
15
        { &hf_nvme_identify_ctrl_anacap[5],
6570
15
            { "Reports ANA Change Sate", "nvme.cmd.identify.ctrl.anacap.csr",
6571
15
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
6572
15
        },
6573
15
        { &hf_nvme_identify_ctrl_anacap[6],
6574
15
            { "Reserved", "nvme.cmd.identify.ctrl.anacap.rsvd",
6575
15
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
6576
15
        },
6577
15
        { &hf_nvme_identify_ctrl_anacap[7],
6578
15
            { "ANAGRPID field in the Identify Namespace does not change", "nvme.cmd.identify.ctrl.anacap.panagrpid",
6579
15
               FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL}
6580
15
        },
6581
15
        { &hf_nvme_identify_ctrl_anacap[8],
6582
15
            { "Supports non-zero value in the ANAGRPID field", "nvme.cmd.identify.ctrl.anacap.nzpanagrpid",
6583
15
               FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL}
6584
15
        },
6585
15
        { &hf_nvme_identify_ctrl_anagrpmax,
6586
15
            { "ANA Group Identifier Maximum (ANAGRPMAX)", "nvme.cmd.identify.ctrl.anagrpmax",
6587
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6588
15
        },
6589
15
        { &hf_nvme_identify_ctrl_nanagrpid,
6590
15
            { "Number of ANA Group Identifiers (NANAGRPID)", "nvme.cmd.identify.ctrl.nanagrpid",
6591
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6592
15
        },
6593
15
        { &hf_nvme_identify_ctrl_pels,
6594
15
            { "Persistent Event Log Size in 64 KiB Units (PELS)", "nvme.cmd.identify.ctrl.pels",
6595
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6596
15
        },
6597
15
        { &hf_nvme_identify_ctrl_rsvd2,
6598
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd2",
6599
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6600
15
        },
6601
15
        { &hf_nvme_identify_ctrl_sqes[0],
6602
15
            { "Submission Queue Entry Size (SQES)", "nvme.cmd.identify.ctrl.sqes",
6603
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6604
15
        },
6605
15
        { &hf_nvme_identify_ctrl_sqes[1],
6606
15
            { "Minimum (required) Size", "nvme.cmd.identify.ctrl.sqes.mins",
6607
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL}
6608
15
        },
6609
15
        { &hf_nvme_identify_ctrl_sqes[2],
6610
15
            { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.sqes.maxs",
6611
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL}
6612
15
        },
6613
15
        { &hf_nvme_identify_ctrl_cqes[0],
6614
15
            { "Completion Queue Entry Size (CQES)", "nvme.cmd.identify.ctrl.cqes",
6615
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6616
15
        },
6617
15
        { &hf_nvme_identify_ctrl_cqes[1],
6618
15
            { "Minimum (required) Size", "nvme.cmd.identify.ctrl.cqes.mins",
6619
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL}
6620
15
        },
6621
15
        { &hf_nvme_identify_ctrl_cqes[2],
6622
15
            { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.cqes.maxs",
6623
15
               FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL}
6624
15
        },
6625
15
        { &hf_nvme_identify_ctrl_maxcmd,
6626
15
            { "Maximum Outstanding Commands (MAXCMD)", "nvme.cmd.identify.ctrl.maxcmd",
6627
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6628
15
        },
6629
15
        { &hf_nvme_identify_ctrl_nn,
6630
15
            { "Number of Namespaces (NN)", "nvme.cmd.identify.ctrl.nn",
6631
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6632
15
        },
6633
15
        { &hf_nvme_identify_ctrl_oncs[0],
6634
15
            { "Optional NVM Command Support (ONCS)", "nvme.cmd.identify.ctrl.oncs",
6635
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6636
15
        },
6637
15
        { &hf_nvme_identify_ctrl_oncs[1],
6638
15
            { "Supports Compare Command", "nvme.cmd.identify.ctrl.oncs.ccs",
6639
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6640
15
        },
6641
15
        { &hf_nvme_identify_ctrl_oncs[2],
6642
15
            { "Supports Write Uncorrectable Command", "nvme.cmd.identify.ctrl.oncs.wus",
6643
15
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
6644
15
        },
6645
15
        { &hf_nvme_identify_ctrl_oncs[3],
6646
15
            { "Supports Dataset Management Command", "nvme.cmd.identify.ctrl.oncs.dsms",
6647
15
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
6648
15
        },
6649
15
        { &hf_nvme_identify_ctrl_oncs[4],
6650
15
            { "Support Write Zeroes Command", "nvme.cmd.identify.ctrl.oncs.wzs",
6651
15
               FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL}
6652
15
        },
6653
15
        { &hf_nvme_identify_ctrl_oncs[5],
6654
15
            { "Supports non-zero Save Field in Set/Get Features", "nvme.cmd.identify.ctrl.oncs.nzfs",
6655
15
               FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL}
6656
15
        },
6657
15
        { &hf_nvme_identify_ctrl_oncs[6],
6658
15
            { "Supports Reservations", "nvme.cmd.identify.ctrl.oncs.ress",
6659
15
               FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL}
6660
15
        },
6661
15
        { &hf_nvme_identify_ctrl_oncs[7],
6662
15
            { "Supports Timestamps", "nvme.cmd.identify.ctrl.oncs.tstmps",
6663
15
               FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL}
6664
15
        },
6665
15
        { &hf_nvme_identify_ctrl_oncs[8],
6666
15
            { "Supports Verify Command", "nvme.cmd.identify.ctrl.oncs.vers",
6667
15
               FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL}
6668
15
        },
6669
15
        { &hf_nvme_identify_ctrl_oncs[9],
6670
15
            { "Reserved", "nvme.cmd.identify.ctrl.oncs.rsvd",
6671
15
               FT_UINT16, BASE_HEX, NULL, 0xff00, NULL, HFILL}
6672
15
        },
6673
15
        { &hf_nvme_identify_ctrl_fuses[0],
6674
15
            { "Fused Operation Support (FUSES)", "nvme.cmd.identify.ctrl.fuses",
6675
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6676
15
        },
6677
15
        { &hf_nvme_identify_ctrl_fuses[1],
6678
15
            { "Compare and Write Fused Operation Support", "nvme.cmd.identify.ctrl.fuses.cws",
6679
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6680
15
        },
6681
15
        { &hf_nvme_identify_ctrl_fuses[2],
6682
15
            { "Reserved", "nvme.cmd.identify.ctrl.fuses.rsvd",
6683
15
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
6684
15
        },
6685
15
        { &hf_nvme_identify_ctrl_fna[0],
6686
15
            { "Format NVM Attributes (FNA)", "nvme.cmd.identify.ctrl.fna",
6687
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6688
15
        },
6689
15
        { &hf_nvme_identify_ctrl_fna[1],
6690
15
            { "Format Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.fall",
6691
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6692
15
        },
6693
15
        { &hf_nvme_identify_ctrl_fna[2],
6694
15
            { "Secure Erase Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.seall",
6695
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6696
15
        },
6697
15
        { &hf_nvme_identify_ctrl_fna[3],
6698
15
            { "Cryptographic Erase Supported", "nvme.cmd.identify.ctrl.fna.ces",
6699
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
6700
15
        },
6701
15
        { &hf_nvme_identify_ctrl_fna[4],
6702
15
            { "Reserved", "nvme.cmd.identify.ctrl.fna.rsvd",
6703
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
6704
15
        },
6705
15
        { &hf_nvme_identify_ctrl_vwc[0],
6706
15
            { "Volatile Write Cache (VWC)", "nvme.cmd.identify.ctrl.vwc",
6707
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6708
15
        },
6709
15
        { &hf_nvme_identify_ctrl_vwc[1],
6710
15
            { "Volatile Write Cache Present", "nvme.cmd.identify.ctrl.vwc.cp",
6711
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6712
15
        },
6713
15
        { &hf_nvme_identify_ctrl_vwc[2],
6714
15
            { "Flush Command Behavior", "nvme.cmd.identify.ctrl.vwc.cfb",
6715
15
               FT_UINT8, BASE_HEX, VALS(fcb_type_tbl), 0x6, NULL, HFILL}
6716
15
        },
6717
15
        { &hf_nvme_identify_ctrl_vwc[3],
6718
15
            { "Reserved", "nvme.cmd.identify.ctrl.vwc.rsvd",
6719
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
6720
15
        },
6721
15
        { &hf_nvme_identify_ctrl_awun,
6722
15
            { "Atomic Write Unit Normal (AWUN)", "nvme.cmd.identify.ctrl.awun",
6723
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL}
6724
15
        },
6725
15
        { &hf_nvme_identify_ctrl_awupf,
6726
15
            { "Atomic Write Unit Power Fail (AWUPF)", "nvme.cmd.identify.ctrl.awupf",
6727
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL}
6728
15
        },
6729
15
        { &hf_nvme_identify_ctrl_nvscc[0],
6730
15
            { "NVM Vendor Specific Command Configuration (NVSCC)", "nvme.cmd.identify.ctrl.nvscc",
6731
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6732
15
        },
6733
15
        { &hf_nvme_identify_ctrl_nvscc[1],
6734
15
            { "Standard Format Used for Vendor Specific Commands", "nvme.cmd.identify.ctrl.nvscc.std",
6735
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6736
15
        },
6737
15
        { &hf_nvme_identify_ctrl_nvscc[2],
6738
15
            { "Reserved", "nvme.cmd.identify.ctrl.nvscc.rsvd",
6739
15
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
6740
15
        },
6741
15
        { &hf_nvme_identify_ctrl_nwpc[0],
6742
15
            { "Namespace Write Protection Capabilities (NWPC)", "nvme.cmd.identify.ctrl.nwpc",
6743
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6744
15
        },
6745
15
        { &hf_nvme_identify_ctrl_nwpc[1],
6746
15
            { "No Write Protect and Write Protect namespace write protection states Support", "nvme.cmd.identify.ctrl.nwpc.wpss",
6747
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6748
15
        },
6749
15
        { &hf_nvme_identify_ctrl_nwpc[2],
6750
15
            { "Write Protect Until Power Cycle state Support", "nvme.cmd.identify.ctrl.nwpc.wppcs",
6751
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6752
15
        },
6753
15
        { &hf_nvme_identify_ctrl_nwpc[3],
6754
15
            { "Permanent Write Protect state Support", "nvme.cmd.identify.ctrl.nwpc.pwpss",
6755
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
6756
15
        },
6757
15
        { &hf_nvme_identify_ctrl_nwpc[4],
6758
15
            { "Reserved", "nvme.cmd.identify.ctrl.nwpc.rsvd",
6759
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
6760
15
        },
6761
15
        { &hf_nvme_identify_ctrl_acwu,
6762
15
            { "Atomic Compare & Write Unit (ACWU)", "nvme.cmd.identify.ctrl.acwu",
6763
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL}
6764
15
        },
6765
15
        { &hf_nvme_identify_ctrl_rsvd3,
6766
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd3",
6767
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6768
15
        },
6769
15
        { &hf_nvme_identify_ctrl_sgls[0],
6770
15
            { "SGL Support (SGLS)", "nvme.cmd.identify.ctrl.sgls",
6771
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6772
15
        },
6773
15
        { &hf_nvme_identify_ctrl_sgls[1],
6774
15
            { "SGL Supported", "nvme.cmd.identify.ctrl.sgls.sgls",
6775
15
               FT_UINT32, BASE_HEX, VALS(sgls_ify_type_tbl), 0x3, NULL, HFILL}
6776
15
        },
6777
15
        { &hf_nvme_identify_ctrl_sgls[2],
6778
15
            { "Supports Keyed SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.kdbs",
6779
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
6780
15
        },
6781
15
        { &hf_nvme_identify_ctrl_sgls[3],
6782
15
            { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd0",
6783
15
               FT_UINT32, BASE_HEX, NULL, 0xfff8, NULL, HFILL}
6784
15
        },
6785
15
        { &hf_nvme_identify_ctrl_sgls[4],
6786
15
            { "Supports SGL Bit Bucket Descriptor", "nvme.cmd.identify.ctrl.sgls.bbd",
6787
15
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
6788
15
        },
6789
15
        { &hf_nvme_identify_ctrl_sgls[5],
6790
15
            { "Supports byte aligned contiguous buffer in MPTR Field", "nvme.cmd.identify.ctrl.sgls.bufmptr",
6791
15
               FT_BOOLEAN, 32, NULL, 0x20000, NULL, HFILL}
6792
15
        },
6793
15
        { &hf_nvme_identify_ctrl_sgls[6],
6794
15
            { "Supports Larger SGL List than Command Requires", "nvme.cmd.identify.ctrl.sgls.lsgl",
6795
15
               FT_BOOLEAN, 32, NULL, 0x40000, NULL, HFILL}
6796
15
        },
6797
15
        { &hf_nvme_identify_ctrl_sgls[7],
6798
15
            { "Supports SGL Segment in MPTR Field", "nvme.cmd.identify.ctrl.sgls.kmptr",
6799
15
               FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL}
6800
15
        },
6801
15
        { &hf_nvme_identify_ctrl_sgls[8],
6802
15
            { "Supports Address Field as offset in Data Block, Segment and Last Segment SGLs", "nvme.cmd.identify.ctrl.sgls.offs",
6803
15
               FT_BOOLEAN, 32, NULL, 0x100000, NULL, HFILL}
6804
15
        },
6805
15
        { &hf_nvme_identify_ctrl_sgls[9],
6806
15
            { "Supports Transport SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.tdbd",
6807
15
               FT_BOOLEAN, 32, NULL, 0x200000, NULL, HFILL}
6808
15
        },
6809
15
        { &hf_nvme_identify_ctrl_sgls[10],
6810
15
            { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd1",
6811
15
               FT_UINT32, BASE_HEX, NULL, 0xffc00000, NULL, HFILL}
6812
15
        },
6813
15
        { &hf_nvme_identify_ctrl_mnan,
6814
15
            { "Maximum Number of Allowed Namespaces (MNAN)", "nvme.cmd.identify.ctrl.mnan",
6815
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6816
15
        },
6817
15
        { &hf_nvme_identify_ctrl_rsvd4,
6818
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd4",
6819
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6820
15
        },
6821
15
        { &hf_nvme_identify_ctrl_subnqn,
6822
15
            { "NVM Subsystem NVMe Qualified Name (SUBNQN)", "nvme.cmd.identify.ctrl.subnqn",
6823
15
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
6824
15
        },
6825
15
        { &hf_nvme_identify_ctrl_rsvd5,
6826
15
            { "Reserved", "nvme.cmd.identify.ctrl.rsvd5",
6827
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6828
15
        },
6829
15
        { &hf_nvme_identify_ctrl_nvmeof,
6830
15
            { "NVMeOF Attributes", "nvme.cmd.identify.ctrl.nvmeof",
6831
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6832
15
        },
6833
15
        { &hf_nvme_identify_ctrl_nvmeof_ioccsz,
6834
15
            { "I/O Queue Command Capsule Supported Size (IOCCSZ)", "nvme.cmd.identify.ctrl.nvmeof.ioccsz",
6835
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
6836
15
        },
6837
15
        { &hf_nvme_identify_ctrl_nvmeof_iorcsz,
6838
15
            { "I/O Queue Response Capsule Supported Size (IORCSZ)", "nvme.cmd.identify.ctrl.nvmeof.iorcsz",
6839
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
6840
15
        },
6841
15
        { &hf_nvme_identify_ctrl_nvmeof_icdoff,
6842
15
            { "In Capsule Data Offset (ICDOFF)", "nvme.cmd.identify.ctrl.nvmeof.icdoff",
6843
15
               FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL}
6844
15
        },
6845
15
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[0],
6846
15
            { "Fabrics Controller Attributes (FCATT)", "nvme.cmd.identify.ctrl.nvmeof.fcatt",
6847
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6848
15
        },
6849
15
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[1],
6850
15
            { "Dynamic Controller Model", "nvme.cmd.identify.ctrl.nvmeof.fcatt.dcm",
6851
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
6852
15
        },
6853
15
        { &hf_nvme_identify_ctrl_nvmeof_fcatt[2],
6854
15
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.fcatt.rsvd",
6855
15
               FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL}
6856
15
        },
6857
15
        { &hf_nvme_identify_ctrl_nvmeof_msdbd,
6858
15
            { "Maximum SGL Data Block Descriptors (MSDBD)", "nvme.cmd.identify.ctrl.nvmeof.msdbd",
6859
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
6860
15
        },
6861
15
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[0],
6862
15
            { "Optional Fabric Commands Support (OFCS)", "nvme.cmd.identify.ctrl.nvmeof.ofcs",
6863
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
6864
15
        },
6865
15
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[1],
6866
15
            { "Supports Disconnect Command", "nvme.cmd.identify.ctrl.nvmeof.ofcs.dcs",
6867
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
6868
15
        },
6869
15
        { &hf_nvme_identify_ctrl_nvmeof_ofcs[2],
6870
15
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.ofcs.rsvd",
6871
15
               FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL}
6872
15
        },
6873
15
        { &hf_nvme_identify_ctrl_nvmeof_rsvd,
6874
15
            { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.rsvd",
6875
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6876
15
        },
6877
15
        { &hf_nvme_identify_ctrl_psds,
6878
15
            { "Power State Attributes", "nvme.cmd.identify.ctrl.psds",
6879
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6880
15
        },
6881
15
        { &hf_nvme_identify_ctrl_psd,
6882
15
            { "Power State 0 Descriptor (PSD0)", "nvme.cmd.identify.ctrl.psds.psd",
6883
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6884
15
        },
6885
15
        { &hf_nvme_identify_ctrl_psd_mp,
6886
15
            { "Maximum Power (MP)", "nvme.cmd.identify.ctrl.psds.psd.mp",
6887
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6888
15
        },
6889
15
        { &hf_nvme_identify_ctrl_psd_rsvd0,
6890
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd0",
6891
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6892
15
        },
6893
15
        { &hf_nvme_identify_ctrl_psd_mxps,
6894
15
            { "Max Power Scale (MXPS)", "nvme.cmd.identify.ctrl.psds.psd.mxps",
6895
15
               FT_BOOLEAN, 8, TFS(&units_watts), 0x1, NULL, HFILL}
6896
15
        },
6897
15
        { &hf_nvme_identify_ctrl_psd_nops,
6898
15
            { "Non-Operational State (NOPS)", "nvme.cmd.identify.ctrl.psds.psd.nops",
6899
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
6900
15
        },
6901
15
        { &hf_nvme_identify_ctrl_psd_rsvd1,
6902
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd1",
6903
15
               FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL}
6904
15
        },
6905
15
        { &hf_nvme_identify_ctrl_psd_enlat,
6906
15
            { "Entry Latency (ENLAT)", "nvme.cmd.identify.ctrl.psds.psd.enlat",
6907
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6908
15
        },
6909
15
        { &hf_nvme_identify_ctrl_psd_exlat,
6910
15
            { "Exit Latency (EXLAT)", "nvme.cmd.identify.ctrl.psds.psd.exlat",
6911
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
6912
15
        },
6913
15
        { &hf_nvme_identify_ctrl_psd_rrt,
6914
15
            { "Relative Read Throughput (RRT)", "nvme.cmd.identify.ctrl.psds.psd.rrt",
6915
15
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
6916
15
        },
6917
15
        { &hf_nvme_identify_ctrl_psd_rsvd2,
6918
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd2",
6919
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6920
15
        },
6921
15
        { &hf_nvme_identify_ctrl_psd_rrl,
6922
15
            { "Relative Read Latency (RRL)", "nvme.cmd.identify.ctrl.psds.psd.rrl",
6923
15
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
6924
15
        },
6925
15
        { &hf_nvme_identify_ctrl_psd_rsvd3,
6926
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd3",
6927
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6928
15
        },
6929
15
        { &hf_nvme_identify_ctrl_psd_rwt,
6930
15
            { "Relative Write Throughput (RWT)", "nvme.cmd.identify.ctrl.psds.psd.rwt",
6931
15
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
6932
15
        },
6933
15
        { &hf_nvme_identify_ctrl_psd_rsvd4,
6934
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd4",
6935
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6936
15
        },
6937
15
        { &hf_nvme_identify_ctrl_psd_rwl,
6938
15
            { "Relative Write Latency (RWL)", "nvme.cmd.identify.ctrl.psds.psd.rwl",
6939
15
               FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL}
6940
15
        },
6941
15
        { &hf_nvme_identify_ctrl_psd_rsvd5,
6942
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd5",
6943
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
6944
15
        },
6945
15
        { &hf_nvme_identify_ctrl_psd_idlp,
6946
15
            { "Idle Power (IDLP)", "nvme.cmd.identify.ctrl.psds.psd.idlp",
6947
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6948
15
        },
6949
15
        { &hf_nvme_identify_ctrl_psd_rsvd6,
6950
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd6",
6951
15
               FT_UINT8, BASE_HEX, NULL, 0x3f, NULL, HFILL}
6952
15
        },
6953
15
        { &hf_nvme_identify_ctrl_psd_ips,
6954
15
            { "Idle Power Scale (IPS)", "nvme.cmd.identify.ctrl.psds.psd.ips",
6955
15
               FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL}
6956
15
        },
6957
15
        { &hf_nvme_identify_ctrl_psd_rsvd7,
6958
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd7",
6959
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
6960
15
        },
6961
15
        { &hf_nvme_identify_ctrl_psd_actp,
6962
15
            { "Active Power (ACTP)", "nvme.cmd.identify.ctrl.psds.psd.actp",
6963
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
6964
15
        },
6965
15
        { &hf_nvme_identify_ctrl_psd_apw,
6966
15
            { "Active Power Workload (APW)", "nvme.cmd.identify.ctrl.psds.psd.apw",
6967
15
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
6968
15
        },
6969
15
        { &hf_nvme_identify_ctrl_psd_rsvd8,
6970
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd8",
6971
15
               FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL}
6972
15
        },
6973
15
        { &hf_nvme_identify_ctrl_psd_aps,
6974
15
            { "Active Power Scale (APS)", "nvme.cmd.identify.ctrl.psds.psd.aps",
6975
15
               FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL}
6976
15
        },
6977
15
        { &hf_nvme_identify_ctrl_psd_rsvd9,
6978
15
            { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd9",
6979
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6980
15
        },
6981
15
        { &hf_nvme_identify_ctrl_vs,
6982
15
            { "Vendor Specific", "nvme.cmd.identify.ctrl.vs",
6983
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
6984
15
        },
6985
6986
        /* Identify nslist response */
6987
15
        { &hf_nvme_identify_nslist_nsid,
6988
15
            { "Namespace list element", "nvme.cmd.identify.nslist.nsid",
6989
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
6990
15
        },
6991
        /* get logpage response */
6992
        /* Identify Response */
6993
15
        { &hf_nvme_get_logpage_ify_genctr,
6994
15
            { "Generation Counter (GENCTR)", "nvme.cmd.get_logpage.identify.genctr",
6995
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
6996
15
        },
6997
15
        { &hf_nvme_get_logpage_ify_numrec,
6998
15
            { "Number of Records (NUMREC)", "nvme.cmd.get_logpage.identify.numrec",
6999
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7000
15
        },
7001
15
        { &hf_nvme_get_logpage_ify_recfmt,
7002
15
            { "Record Format (RECFMT)", "nvme.cmd.get_logpage.identify.recfmt",
7003
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7004
15
        },
7005
15
        { &hf_nvme_get_logpage_ify_rsvd,
7006
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rsvd",
7007
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7008
15
        },
7009
15
        { &hf_nvme_get_logpage_ify_rcrd,
7010
15
            { "Discovery Log Entry", "nvme.cmd.get_logpage.identify.rcrd",
7011
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7012
15
        },
7013
15
        { &hf_nvme_get_logpage_ify_rcrd_trtype,
7014
15
            { "Transport Type (TRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.trtype",
7015
15
               FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL}
7016
15
        },
7017
15
        { &hf_nvme_get_logpage_ify_rcrd_adrfam,
7018
15
            { "Address Family (ADRFAM)", "nvme.cmd.get_logpage.identify.rcrd.adrfam",
7019
15
               FT_UINT8, BASE_HEX, VALS(adrfam_type_tbl), 0x0, NULL, HFILL}
7020
15
        },
7021
15
        { &hf_nvme_get_logpage_ify_rcrd_subtype,
7022
15
            { "Subsystem Type (SUBTYPE)", "nvme.cmd.get_logpage.identify.rcrd.subtype",
7023
15
               FT_UINT8, BASE_HEX, VALS(sub_type_tbl), 0x0, NULL, HFILL}
7024
15
        },
7025
15
        { &hf_nvme_get_logpage_ify_rcrd_treq[0],
7026
15
            { "Transport Requirements (TREQ)", "nvme.cmd.get_logpage.identify.rcrd.treq",
7027
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7028
15
        },
7029
15
        { &hf_nvme_get_logpage_ify_rcrd_treq[1],
7030
15
            { "Secure Channel Connection Requirement", "nvme.cmd.get_logpage.identify.rcrd.treq.secch",
7031
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
7032
15
        },
7033
15
        { &hf_nvme_get_logpage_ify_rcrd_treq[2],
7034
15
            { "Disable SQ Flow Control Support", "nvme.cmd.get_logpage.identify.rcrd.treq.sqfc",
7035
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
7036
15
        },
7037
15
        { &hf_nvme_get_logpage_ify_rcrd_treq[3],
7038
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.treq.rsvd",
7039
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
7040
15
        },
7041
15
        { &hf_nvme_get_logpage_ify_rcrd_portid,
7042
15
            { "Port ID (PORTID)", "nvme.cmd.get_logpage.identify.rcrd.portid",
7043
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7044
15
        },
7045
15
        { &hf_nvme_get_logpage_ify_rcrd_cntlid,
7046
15
            { "Controller ID (CNTLID)", "nvme.cmd.get_logpage.identify.rcrd.cntlid",
7047
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7048
15
        },
7049
15
        { &hf_nvme_get_logpage_ify_rcrd_asqsz,
7050
15
            { "Admin Max SQ Size (ASQSZ)", "nvme.cmd.get_logpage.identify.rcrd.asqsz",
7051
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7052
15
        },
7053
15
        { &hf_nvme_get_logpage_disc_rcrd_eflags[0],
7054
15
            { "Entry flags (EFLAGS)", "nvme.cmd.get_logpage.discovery.rcrd.eflags",
7055
15
                FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7056
15
        },
7057
15
        { &hf_nvme_get_logpage_disc_rcrd_eflags[1],
7058
15
            { "Duplicate Returned Information (DUPRETINFO)", "nvme.cmd.get_logpage.discovery.rcrd.eflags.dupretinfo",
7059
15
                FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
7060
15
        },
7061
15
        { &hf_nvme_get_logpage_disc_rcrd_eflags[2],
7062
15
            { "Explicit Persistent Connection Support for Discovery (EPCSD)",
7063
15
                "nvme.cmd.get_logpage.discovery.rcrd.eflags.epcsd",
7064
15
                FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
7065
15
        },
7066
15
        { &hf_nvme_get_logpage_disc_rcrd_eflags[3],
7067
15
            { "Reserved", "nvme.cmd.get_logpage.discovery.rcrd.eflags.rsvd0",
7068
15
                FT_UINT16, BASE_HEX, NULL, 0xfffc, NULL, HFILL}
7069
15
        },
7070
15
        { &hf_nvme_get_logpage_ify_rcrd_rsvd0,
7071
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd0",
7072
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7073
15
        },
7074
15
        { &hf_nvme_get_logpage_ify_rcrd_trsvcid,
7075
15
            { "Transport Service Identifier (TRSVCID)", "nvme.cmd.get_logpage.identify.rcrd.trsvcid",
7076
15
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
7077
15
        },
7078
15
        { &hf_nvme_get_logpage_ify_rcrd_rsvd1,
7079
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd1",
7080
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7081
15
        },
7082
15
        { &hf_nvme_get_logpage_ify_rcrd_subnqn,
7083
15
            { "NVM Subsystem Qualified Name (SUBNQN)", "nvme.cmd.get_logpage.identify.rcrd.subnqn",
7084
15
               FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL}
7085
15
        },
7086
15
        { &hf_nvme_get_logpage_ify_rcrd_traddr,
7087
15
            { "Transport Address (TRADDR)", "nvme.cmd.get_logpage.identify.rcrd.traddr",
7088
15
               FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL}
7089
15
        },
7090
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas,
7091
15
            { "Transport Specific Address Subtype (TSAS)", "nvme.cmd.get_logpage.identify.rcrd.tsas",
7092
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7093
15
        },
7094
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype,
7095
15
            { "RDMA QP Service Type (RDMA_QPTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_qptype",
7096
15
               FT_UINT8, BASE_HEX, VALS(qp_type_tbl), 0x0, NULL, HFILL}
7097
15
        },
7098
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype,
7099
15
            { "RDMA Provider Type (RDMA_PRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_prtype",
7100
15
               FT_UINT8, BASE_HEX, VALS(pr_type_tbl), 0x0, NULL, HFILL}
7101
15
        },
7102
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms,
7103
15
            { "RDMA Connection Management Service (RDMA_CMS)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_cms",
7104
15
               FT_UINT8, BASE_HEX, VALS(cms_type_tbl), 0x0, NULL, HFILL}
7105
15
        },
7106
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0,
7107
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd0",
7108
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7109
15
        },
7110
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey,
7111
15
            { "RDMA Partition Key (RDMA_PKEY)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_pkey",
7112
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7113
15
        },
7114
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1,
7115
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd1",
7116
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7117
15
        },
7118
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype,
7119
15
            { "Security Type (SECTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_sectype",
7120
15
               FT_UINT8, BASE_HEX, VALS(sec_type_tbl), 0x0, NULL, HFILL}
7121
15
        },
7122
15
        { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd,
7123
15
            { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_rsvd",
7124
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7125
15
        },
7126
        /* Error Information Response */
7127
15
        { &hf_nvme_get_logpage_errinf_errcnt,
7128
15
            { "Error Count", "nvme.cmd.get_logpage.errinf.errcnt",
7129
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7130
15
        },
7131
15
        { &hf_nvme_get_logpage_errinf_sqid,
7132
15
            { "Submission Queue ID", "nvme.cmd.get_logpage.errinf.sqid",
7133
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7134
15
        },
7135
15
        { &hf_nvme_get_logpage_errinf_cid,
7136
15
            { "Command ID", "nvme.cmd.get_logpage.errinf.cid",
7137
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7138
15
        },
7139
15
        { &hf_nvme_get_logpage_errinf_sf[0],
7140
15
            { "Status Field", "nvme.cmd.get_logpage.errinf.sf",
7141
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7142
15
        },
7143
15
        { &hf_nvme_get_logpage_errinf_sf[1],
7144
15
            { "Status Field Value", "nvme.cmd.get_logpage.errinf.sf.val",
7145
15
               FT_UINT16, BASE_HEX, NULL, 0x7fff, NULL, HFILL}
7146
15
        },
7147
15
        { &hf_nvme_get_logpage_errinf_sf[2],
7148
15
            { "Status Field Phase Tag", "nvme.cmd.get_logpage.errinf.sf.ptag",
7149
15
               FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL}
7150
15
        },
7151
15
        { &hf_nvme_get_logpage_errinf_pel[0],
7152
15
            { "Parameter Error Location", "nvme.cmd.get_logpage.errinf.pel",
7153
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7154
15
        },
7155
15
        { &hf_nvme_get_logpage_errinf_pel[1],
7156
15
            { "Byte in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bytee",
7157
15
               FT_UINT16, BASE_DEC, NULL, 0xff, NULL, HFILL}
7158
15
        },
7159
15
        { &hf_nvme_get_logpage_errinf_pel[2],
7160
15
            { "Bit in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bite",
7161
15
               FT_UINT16, BASE_DEC, NULL, 0x7ff, NULL, HFILL}
7162
15
        },
7163
15
        { &hf_nvme_get_logpage_errinf_pel[3],
7164
15
            { "Reserved", "nvme.cmd.get_logpage.errinf.pel.rsvd",
7165
15
               FT_UINT16, BASE_DEC, NULL, 0xf8ff, NULL, HFILL}
7166
15
        },
7167
15
        { &hf_nvme_get_logpage_errinf_lba,
7168
15
            { "LBA", "nvme.cmd.get_logpage.errinf.lba",
7169
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7170
15
        },
7171
15
        { &hf_nvme_get_logpage_errinf_ns,
7172
15
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.nsid",
7173
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7174
15
        },
7175
15
        { &hf_nvme_get_logpage_errinf_vsi,
7176
15
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.vsi",
7177
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7178
15
        },
7179
15
        { &hf_nvme_get_logpage_errinf_trtype,
7180
15
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.trype",
7181
15
               FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL}
7182
15
        },
7183
15
        { &hf_nvme_get_logpage_errinf_rsvd0,
7184
15
            { "Reserved", "nvme.cmd.get_logpage.errinf.rsvd0",
7185
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7186
15
        },
7187
15
        { &hf_nvme_get_logpage_errinf_csi,
7188
15
            { "Command Specific Information", "nvme.cmd.get_logpage.errinf.csi",
7189
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7190
15
        },
7191
15
        { &hf_nvme_get_logpage_errinf_tsi,
7192
15
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.tsi",
7193
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7194
15
        },
7195
15
        { &hf_nvme_get_logpage_errinf_rsvd1,
7196
15
            { "Namespace ID", "nvme.cmd.get_logpage.errinf.rsvd1",
7197
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7198
15
        },
7199
        /* Get LogPage SMART response */
7200
15
        { &hf_nvme_get_logpage_smart_cw[0],
7201
15
            { "Critical Warning", "nvme.cmd.get_logpage.smart.cw",
7202
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7203
15
        },
7204
15
        { &hf_nvme_get_logpage_smart_cw[1],
7205
15
            { "Spare Capacity Below Threshold", "nvme.cmd.get_logpage.smart.cw.sc",
7206
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
7207
15
        },
7208
15
        { &hf_nvme_get_logpage_smart_cw[2],
7209
15
            { "Temperature Crossed Threshold", "nvme.cmd.get_logpage.smart.cw.temp",
7210
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
7211
15
        },
7212
15
        { &hf_nvme_get_logpage_smart_cw[3],
7213
15
            { "Reliability Degraded due to Significant Media Errors", "nvme.cmd.get_logpage.smart.cw.sme",
7214
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
7215
15
        },
7216
15
        { &hf_nvme_get_logpage_smart_cw[4],
7217
15
            { "Media Placed in RO State", "nvme.cmd.get_logpage.smart.cw.ro",
7218
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
7219
15
        },
7220
15
        { &hf_nvme_get_logpage_smart_cw[5],
7221
15
            { "Volatile Memory Backup Device Has Failed", "nvme.cmd.get_logpage.smart.cw.bdf",
7222
15
               FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL}
7223
15
        },
7224
15
        { &hf_nvme_get_logpage_smart_cw[6],
7225
15
            { "Persistent Memory Region Placed in RO State", "nvme.cmd.get_logpage.smart.cw.mrro",
7226
15
               FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL}
7227
15
        },
7228
15
        { &hf_nvme_get_logpage_smart_cw[7],
7229
15
            { "Reserved", "nvme.cmd.get_logpage.smart.cw.rsvd",
7230
15
               FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL}
7231
15
        },
7232
15
        { &hf_nvme_get_logpage_smart_ct,
7233
15
            { "Composite Temperature (degrees K)", "nvme.cmd.get_logpage.smart.ct",
7234
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7235
15
        },
7236
15
        { &hf_nvme_get_logpage_smart_asc,
7237
15
            { "Available Spare Capacity (%)", "nvme.cmd.get_logpage.smart.asc",
7238
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7239
15
        },
7240
15
        { &hf_nvme_get_logpage_smart_ast,
7241
15
            { "Available Spare Capacity Threshold (%)", "nvme.cmd.get_logpage.smart.ast",
7242
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7243
15
        },
7244
15
        { &hf_nvme_get_logpage_smart_lpu,
7245
15
            { "Life Age Estimate (%)", "nvme.cmd.get_logpage.smart.lae",
7246
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7247
15
        },
7248
15
        { &hf_nvme_get_logpage_smart_egcws[0],
7249
15
            { "Endurance Group Critical Warning Summary", "nvme.cmd.get_logpage.smart.egcws",
7250
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7251
15
        },
7252
15
        { &hf_nvme_get_logpage_smart_egcws[1],
7253
15
            { "Spare Capacity of Endurance Group Below Threshold", "nvme.cmd.get_logpage.smart.egcws.sc",
7254
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
7255
15
        },
7256
15
        { &hf_nvme_get_logpage_smart_egcws[2],
7257
15
            { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd0",
7258
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
7259
15
        },
7260
15
        { &hf_nvme_get_logpage_smart_egcws[3],
7261
15
            { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.smart.egcws.me",
7262
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
7263
15
        },
7264
15
        { &hf_nvme_get_logpage_smart_egcws[4],
7265
15
            { "A Namespace in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.smart.egcws.ro",
7266
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
7267
15
        },
7268
15
        { &hf_nvme_get_logpage_smart_egcws[5],
7269
15
            { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd1",
7270
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
7271
15
        },
7272
15
        { &hf_nvme_get_logpage_smart_rsvd0,
7273
15
            { "Reserved", "nvme.cmd.get_logpage.smart.rsvd0",
7274
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7275
15
        },
7276
15
        { &hf_nvme_get_logpage_smart_dur,
7277
15
            { "Data Units Read", "nvme.cmd.get_logpage.smart.dur",
7278
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7279
15
        },
7280
15
        { &hf_nvme_get_logpage_smart_duw,
7281
15
            { "Data Units Written", "nvme.cmd.get_logpage.smart.duw",
7282
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7283
15
        },
7284
15
        { &hf_nvme_get_logpage_smart_hrc,
7285
15
            { "Host Read Commands", "nvme.cmd.get_logpage.smart.hrc",
7286
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7287
15
        },
7288
15
        { &hf_nvme_get_logpage_smart_hwc,
7289
15
            { "Host Write Commands", "nvme.cmd.get_logpage.smart.hwc",
7290
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7291
15
        },
7292
15
        { &hf_nvme_get_logpage_smart_cbt,
7293
15
            { "Controller Busy Time (minutes)", "nvme.cmd.get_logpage.smart.cbt",
7294
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7295
15
        },
7296
15
        { &hf_nvme_get_logpage_smart_pc,
7297
15
            { "Power Cycles", "nvme.cmd.get_logpage.smart.pc",
7298
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7299
15
        },
7300
15
        { &hf_nvme_get_logpage_smart_poh,
7301
15
            { "Power On Hours", "nvme.cmd.get_logpage.smart.poh",
7302
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7303
15
        },
7304
15
        { &hf_nvme_get_logpage_smart_mie,
7305
15
            { "Media Integrity Errors", "nvme.cmd.get_logpage.smart.mie",
7306
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7307
15
        },
7308
15
        { &hf_nvme_get_logpage_smart_us,
7309
15
            { "Unsafe Shutdowns", "nvme.cmd.get_logpage.smart.us",
7310
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7311
15
        },
7312
15
        { &hf_nvme_get_logpage_smart_ele,
7313
15
            { "Number of Error Information Log Entries", "nvme.cmd.get_logpage.smart.ele",
7314
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7315
15
        },
7316
15
        { &hf_nvme_get_logpage_smart_wctt,
7317
15
            { "Warning Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.wctt",
7318
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7319
15
        },
7320
15
        { &hf_nvme_get_logpage_smart_cctt,
7321
15
            { "Critical Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.cctt",
7322
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7323
15
        },
7324
15
        { &hf_nvme_get_logpage_smart_ts[0],
7325
15
            { "Temperature Sensors", "nvme.cmd.get_logpage.smart.ts",
7326
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7327
15
        },
7328
15
        { &hf_nvme_get_logpage_smart_ts[1],
7329
15
            { "Temperature Sensor 1 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s1",
7330
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7331
15
        },
7332
15
        { &hf_nvme_get_logpage_smart_ts[2],
7333
15
            { "Temperature Sensor 2 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s2",
7334
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7335
15
        },
7336
15
        { &hf_nvme_get_logpage_smart_ts[3],
7337
15
            { "Temperature Sensor 3 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s3",
7338
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7339
15
        },
7340
15
        { &hf_nvme_get_logpage_smart_ts[4],
7341
15
            { "Temperature Sensor 4 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s4",
7342
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7343
15
        },
7344
15
        { &hf_nvme_get_logpage_smart_ts[5],
7345
15
            { "Temperature Sensor 5 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s5",
7346
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7347
15
        },
7348
15
        { &hf_nvme_get_logpage_smart_ts[6],
7349
15
            { "Temperature Sensor 6 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s6",
7350
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7351
15
        },
7352
15
        { &hf_nvme_get_logpage_smart_ts[7],
7353
15
            { "Temperature Sensor 7 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s7",
7354
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7355
15
        },
7356
15
        { &hf_nvme_get_logpage_smart_ts[8],
7357
15
            { "Temperature Sensor 8 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s8",
7358
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7359
15
        },
7360
15
        { &hf_nvme_get_logpage_smart_tmt1c,
7361
15
            { "Thermal Management Temperature 1 Transition Count", "nvme.cmd.get_logpage.smart.tmt1c",
7362
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7363
15
        },
7364
15
        { &hf_nvme_get_logpage_smart_tmt2c,
7365
15
            { "Thermal Management Temperature 2 Transition Count", "nvme.cmd.get_logpage.smart.tmt2c",
7366
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7367
15
        },
7368
15
        { &hf_nvme_get_logpage_smart_tmt1t,
7369
15
            { "Total Time For Thermal Management Temperature 1 (seconds)", "nvme.cmd.get_logpage.smart.tmt1t",
7370
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7371
15
        },
7372
15
        { &hf_nvme_get_logpage_smart_tmt2t,
7373
15
            { "Total Time For Thermal Management Temperature 2 (seconds)", "nvme.cmd.get_logpage.smart.tmt2t",
7374
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7375
15
        },
7376
15
        { &hf_nvme_get_logpage_smart_rsvd1,
7377
15
            { "Reserved", "nvme.cmd.get_logpage.smart.rsvd1",
7378
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7379
15
        },
7380
        /* FW Slot Information Response */
7381
15
        { &hf_nvme_get_logpage_fw_slot_afi[0],
7382
15
            { "Active Firmware Info (AFI)", "nvme.cmd.get_logpage.fw_slot.afi",
7383
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7384
15
        },
7385
15
        { &hf_nvme_get_logpage_fw_slot_afi[1],
7386
15
            { "Active Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.afs",
7387
15
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
7388
15
        },
7389
15
        { &hf_nvme_get_logpage_fw_slot_afi[2],
7390
15
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd0",
7391
15
               FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL}
7392
15
        },
7393
15
        { &hf_nvme_get_logpage_fw_slot_afi[3],
7394
15
            { "Next Reset Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.nfs",
7395
15
               FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL}
7396
15
        },
7397
15
        { &hf_nvme_get_logpage_fw_slot_afi[4],
7398
15
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd1",
7399
15
               FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL}
7400
15
        },
7401
15
        { &hf_nvme_get_logpage_fw_slot_rsvd0,
7402
15
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd0",
7403
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7404
15
        },
7405
15
        { &hf_nvme_get_logpage_fw_slot_frs[0],
7406
15
            { "Firmware Slot Revisions", "nvme.cmd.get_logpage.fw_slot.frs",
7407
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7408
15
        },
7409
15
        { &hf_nvme_get_logpage_fw_slot_frs[1],
7410
15
            { "Firmware Revision for Slot 1", "nvme.cmd.get_logpage.fw_slot.frs.s1",
7411
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7412
15
        },
7413
15
        { &hf_nvme_get_logpage_fw_slot_frs[2],
7414
15
            { "Firmware Revision for Slot 2", "nvme.cmd.get_logpage.fw_slot.frs.s2",
7415
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7416
15
        },
7417
15
        { &hf_nvme_get_logpage_fw_slot_frs[3],
7418
15
            { "Firmware Revision for Slot 3", "nvme.cmd.get_logpage.fw_slot.frs.s3",
7419
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7420
15
        },
7421
15
        { &hf_nvme_get_logpage_fw_slot_frs[4],
7422
15
            { "Firmware Revision for Slot 4", "nvme.cmd.get_logpage.fw_slot.frs.s4",
7423
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7424
15
        },
7425
15
        { &hf_nvme_get_logpage_fw_slot_frs[5],
7426
15
            { "Firmware Revision for Slot 5", "nvme.cmd.get_logpage.fw_slot.frs.s5",
7427
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7428
15
        },
7429
15
        { &hf_nvme_get_logpage_fw_slot_frs[6],
7430
15
            { "Firmware Revision for Slot 6", "nvme.cmd.get_logpage.fw_slot.frs.s6",
7431
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7432
15
        },
7433
15
        { &hf_nvme_get_logpage_fw_slot_frs[7],
7434
15
            { "Firmware Revision for Slot 7", "nvme.cmd.get_logpage.fw_slot.frs.s7",
7435
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7436
15
        },
7437
15
        { &hf_nvme_get_logpage_fw_slot_rsvd1,
7438
15
            { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd1",
7439
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7440
15
        },
7441
        /* Changed NameSpace List Response */
7442
15
        { &hf_nvme_get_logpage_changed_nslist,
7443
15
            { "Changed Namespace", "nvme.cmd.get_logpage.changed_nslist",
7444
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7445
15
        },
7446
        /* Commands Supported and Effects Response */
7447
15
        { &hf_nvme_get_logpage_cmd_and_eff_cs,
7448
15
            { "Command Supported Entry", "nvme.cmd.get_logpage.cmd_and_eff.cs",
7449
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7450
15
        },
7451
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[0],
7452
15
            { "Commands Supported and Effects Data Structure", "nvme.cmd.get_logpage.cmd_and_eff.cseds",
7453
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7454
15
        },
7455
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[1],
7456
15
            { "Command Supported (CSUPP)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.csupp",
7457
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
7458
15
        },
7459
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[2],
7460
15
            { "Logical Block Content Change (LBCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.lbcc",
7461
15
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
7462
15
        },
7463
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[3],
7464
15
            { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ncc",
7465
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
7466
15
        },
7467
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[4],
7468
15
            { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.nic",
7469
15
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
7470
15
        },
7471
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[5],
7472
15
            { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ccc",
7473
15
               FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL}
7474
15
        },
7475
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[6],
7476
15
            { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd0",
7477
15
               FT_UINT32, BASE_HEX, NULL, 0xffe0, NULL, HFILL}
7478
15
        },
7479
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[7],
7480
15
            { "Command Submission and Execution (CSE)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.cse",
7481
15
               FT_UINT32, BASE_HEX, VALS(cmd_eff_cse_tbl), 0x70000, NULL, HFILL}
7482
15
        },
7483
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[8],
7484
15
            { "UUID Selection Supported", "nvme.cmd.get_logpage.cmd_and_eff.cseds.uss",
7485
15
               FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL}
7486
15
        },
7487
15
        { &hf_nvme_get_logpage_cmd_and_eff_cseds[9],
7488
15
            { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd1",
7489
15
               FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL}
7490
15
        },
7491
        /* Device Self-Test Response */
7492
15
                { &hf_nvme_get_logpage_selftest_csto[0],
7493
15
            { "Current Device Self-Test Operation", "nvme.cmd.get_logpage.selftest.csto",
7494
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7495
15
        },
7496
15
        { &hf_nvme_get_logpage_selftest_csto[1],
7497
15
            { "Current Self-Test Operation Status", "nvme.cmd.get_logpage.selftest.csto.st",
7498
15
               FT_UINT8, BASE_HEX, VALS(stest_type_active_tbl), 0xf, NULL, HFILL}
7499
15
        },
7500
15
        { &hf_nvme_get_logpage_selftest_csto[2],
7501
15
            { "Reserved", "nvme.cmd.get_logpage.selftest.csto.rsvd",
7502
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
7503
15
        },
7504
15
        { &hf_nvme_get_logpage_selftest_cstc[0],
7505
15
            { "Current Device Self-Test Completion", "nvme.cmd.get_logpage.selftest.cstc",
7506
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7507
15
        },
7508
15
        { &hf_nvme_get_logpage_selftest_cstc[1],
7509
15
            { "Self-Test Completion Percent", "nvme.cmd.get_logpage.selftest.cstc.pcnt",
7510
15
               FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL}
7511
15
        },
7512
15
        { &hf_nvme_get_logpage_selftest_cstc[2],
7513
15
            { "Reserved", "nvme.cmd.get_logpage.selftest.cstc.rsvd",
7514
15
               FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL}
7515
15
        },
7516
15
        { &hf_nvme_get_logpage_selftest_rsvd,
7517
15
            { "Self-Test Completion Percent", "nvme.cmd.get_logpage.selftest.rsvd",
7518
15
               FT_UINT16, BASE_HEX, NULL, 0x80, NULL, HFILL}
7519
15
        },
7520
15
        { &hf_nvme_get_logpage_selftest_res,
7521
15
            { "Latest Self-test Result Data Structure", "nvme.cmd.get_logpage.selftest.res",
7522
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7523
15
        },
7524
15
        { &hf_nvme_get_logpage_selftest_res_status[0],
7525
15
            { "Device Self-test Status", "nvme.cmd.get_logpage.selftest.res.status",
7526
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7527
15
        },
7528
15
        { &hf_nvme_get_logpage_selftest_res_status[1],
7529
15
            { "Device Self-test Result", "nvme.cmd.get_logpage.selftest.res.status.result",
7530
15
               FT_UINT8, BASE_HEX, VALS(stest_result_tbl), 0xf, NULL, HFILL}
7531
15
        },
7532
15
        { &hf_nvme_get_logpage_selftest_res_status[2],
7533
15
            { "Device Self-test Type", "nvme.cmd.get_logpage.selftest.res.status.type",
7534
15
               FT_UINT8, BASE_HEX, VALS(stest_type_done_tbl), 0xf0, NULL, HFILL}
7535
15
        },
7536
15
        { &hf_nvme_get_logpage_selftest_res_sn,
7537
15
            { "Segment Number", "nvme.cmd.get_logpage.selftest.res.sn",
7538
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7539
15
        },
7540
15
        { &hf_nvme_get_logpage_selftest_res_vdi[0],
7541
15
            { "Valid Diagnostic Information", "nvme.cmd.get_logpage.selftest.res.vdi",
7542
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7543
15
        },
7544
15
        { &hf_nvme_get_logpage_selftest_res_vdi[1],
7545
15
            { "Namespace Identifier (NSID) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.nsid",
7546
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
7547
15
        },
7548
15
        { &hf_nvme_get_logpage_selftest_res_vdi[2],
7549
15
            { "Failing LBA (FLBA) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.flba",
7550
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
7551
15
        },
7552
15
        { &hf_nvme_get_logpage_selftest_res_vdi[3],
7553
15
            { "Status Code Type (SCT) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sct",
7554
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
7555
15
        },
7556
15
        { &hf_nvme_get_logpage_selftest_res_vdi[4],
7557
15
            { "Status Code (SC) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sc",
7558
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
7559
15
        },
7560
15
        { &hf_nvme_get_logpage_selftest_res_vdi[5],
7561
15
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.vdi.rsvd",
7562
15
               FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL}
7563
15
        },
7564
15
        { &hf_nvme_get_logpage_selftest_res_rsvd,
7565
15
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.rsvd",
7566
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7567
15
        },
7568
15
        { &hf_nvme_get_logpage_selftest_res_poh,
7569
15
            { "Power On Hours (POH)", "nvme.cmd.get_logpage.selftest.res.poh",
7570
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7571
15
        },
7572
15
        { &hf_nvme_get_logpage_selftest_res_nsid,
7573
15
            { "Namespace Identifier (NSID)", "nvme.cmd.get_logpage.selftest.res.nsid",
7574
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7575
15
        },
7576
15
        { &hf_nvme_get_logpage_selftest_res_flba,
7577
15
            { "Failing LBA", "nvme.cmd.get_logpage.selftest.res.flba",
7578
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7579
15
        },
7580
15
        { &hf_nvme_get_logpage_selftest_res_sct[0],
7581
15
            { "Status Code Type", "nvme.cmd.get_logpage.selftest.res.sct",
7582
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7583
15
        },
7584
15
        { &hf_nvme_get_logpage_selftest_res_sct[1],
7585
15
            { "Additional Information", "nvme.cmd.get_logpage.selftest.res.sct.ai",
7586
15
               FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL}
7587
15
        },
7588
15
        { &hf_nvme_get_logpage_selftest_res_sct[2],
7589
15
            { "Reserved", "nvme.cmd.get_logpage.selftest.res.sct.rsvd",
7590
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
7591
15
        },
7592
15
        { &hf_nvme_get_logpage_selftest_res_sc,
7593
15
            { "Status Code", "nvme.cmd.get_logpage.selftest.res.sc",
7594
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7595
15
        },
7596
15
        { &hf_nvme_get_logpage_selftest_res_vs,
7597
15
            { "Vendor Specific", "nvme.cmd.get_logpage.selftest.res.vs",
7598
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7599
15
        },
7600
        /* Telemetry Log Response */
7601
15
        { &hf_nvme_get_logpage_telemetry_li,
7602
15
            { "Log Identifier", "nvme.cmd.get_logpage.telemetry.li",
7603
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7604
15
        },
7605
15
        { &hf_nvme_get_logpage_telemetry_rsvd0,
7606
15
            { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd0",
7607
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7608
15
        },
7609
15
        { &hf_nvme_get_logpage_telemetry_ieee,
7610
15
            { "IEEE OUI Identifier (IEEE)", "nvme.cmd.get_logpage.telemetry.ieee",
7611
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7612
15
        },
7613
15
        { &hf_nvme_get_logpage_telemetry_da1lb,
7614
15
            { "Telemetry Data Area 1 Last Block", "nvme.cmd.get_logpage.telemetry.da1b",
7615
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7616
15
        },
7617
15
        { &hf_nvme_get_logpage_telemetry_da2lb,
7618
15
            { "Telemetry Data Area 2 Last Block", "nvme.cmd.get_logpage.telemetry.da2b",
7619
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7620
15
        },
7621
15
        { &hf_nvme_get_logpage_telemetry_da3lb,
7622
15
            { "Telemetry Data Area 3 Last Block", "nvme.cmd.get_logpage.telemetry.da3b",
7623
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7624
15
        },
7625
15
        { &hf_nvme_get_logpage_telemetry_rsvd1,
7626
15
            { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd1",
7627
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7628
15
        },
7629
15
        { &hf_nvme_get_logpage_telemetry_da,
7630
15
            { "Telemetry Data Available", "nvme.cmd.get_logpage.telemetry.da",
7631
15
               FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL}
7632
15
        },
7633
15
        { &hf_nvme_get_logpage_telemetry_dgn,
7634
15
            { "Telemetry Data Generation Number", "nvme.cmd.get_logpage.telemetry.dgn",
7635
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7636
15
        },
7637
15
        { &hf_nvme_get_logpage_telemetry_ri,
7638
15
            { "Reason Identifier", "nvme.cmd.get_logpage.telemetry.ri",
7639
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7640
15
        },
7641
15
        { &hf_nvme_get_logpage_telemetry_db,
7642
15
            { "Telemetry Data Block", "nvme.cmd.get_logpage.telemetry.db",
7643
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7644
15
        },
7645
        /* Endurance Group Response */
7646
15
        { &hf_nvme_get_logpage_egroup_cw[0],
7647
15
            { "Critical Warning", "nvme.cmd.get_logpage.egroup.cw",
7648
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7649
15
        },
7650
15
        { &hf_nvme_get_logpage_egroup_cw[1],
7651
15
            { "Available Spare Capacity Below Threshold", "nvme.cmd.get_logpage.egroup.cw.asc",
7652
15
               FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL}
7653
15
        },
7654
15
        { &hf_nvme_get_logpage_egroup_cw[2],
7655
15
            { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd0",
7656
15
               FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL}
7657
15
        },
7658
15
        { &hf_nvme_get_logpage_egroup_cw[3],
7659
15
            { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.egroup.cw.rd",
7660
15
               FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL}
7661
15
        },
7662
15
        { &hf_nvme_get_logpage_egroup_cw[4],
7663
15
            { "All Namespaces in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.egroup.cw.ro",
7664
15
               FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL}
7665
15
        },
7666
15
        { &hf_nvme_get_logpage_egroup_cw[5],
7667
15
            { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd1",
7668
15
               FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL}
7669
15
        },
7670
15
        { &hf_nvme_get_logpage_egroup_rsvd0,
7671
15
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd0",
7672
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7673
15
        },
7674
15
        { &hf_nvme_get_logpage_egroup_as,
7675
15
            { "Available Spare Capacity %", "nvme.cmd.get_logpage.egroup.as",
7676
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7677
15
        },
7678
15
        { &hf_nvme_get_logpage_egroup_ast,
7679
15
            { "Available Spare Threshold %", "nvme.cmd.get_logpage.egroup.ast",
7680
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7681
15
        },
7682
15
        { &hf_nvme_get_logpage_egroup_pu,
7683
15
            { "Life Age (Percentage Used) %", "nvme.cmd.get_logpage.egroup.pu",
7684
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7685
15
        },
7686
15
        { &hf_nvme_get_logpage_egroup_rsvd1,
7687
15
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd1",
7688
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7689
15
        },
7690
15
        { &hf_nvme_get_logpage_egroup_ee,
7691
15
            { "Endurance Estimate (GB that may be written)", "nvme.cmd.get_logpage.egroup.ee",
7692
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7693
15
        },
7694
15
        { &hf_nvme_get_logpage_egroup_dur,
7695
15
            { "Data Units Read (GB)", "nvme.cmd.get_logpage.egroup.dur",
7696
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7697
15
        },
7698
15
        { &hf_nvme_get_logpage_egroup_duw,
7699
15
            { "Data Units Written (GB)", "nvme.cmd.get_logpage.egroup.duw",
7700
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7701
15
        },
7702
15
        { &hf_nvme_get_logpage_egroup_muw,
7703
15
            { "Media Units Written (GB)", "nvme.cmd.get_logpage.egroup.muw",
7704
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7705
15
        },
7706
15
        { &hf_nvme_get_logpage_egroup_hrc,
7707
15
            { "Host Read Commands", "nvme.cmd.get_logpage.egroup.hrc",
7708
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7709
15
        },
7710
15
        { &hf_nvme_get_logpage_egroup_hwc,
7711
15
            { "Host Write Commands", "nvme.cmd.get_logpage.egroup.hwc",
7712
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7713
15
        },
7714
15
        { &hf_nvme_get_logpage_egroup_mdie,
7715
15
            { "Media and Data Integrity Errors", "nvme.cmd.get_logpage.egroup.mdie",
7716
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7717
15
        },
7718
15
        { &hf_nvme_get_logpage_egroup_ele,
7719
15
            { "Media and Data Integrity Errors", "nvme.cmd.get_logpage.egroup.ele",
7720
15
               FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL}
7721
15
        },
7722
15
        { &hf_nvme_get_logpage_egroup_rsvd2,
7723
15
            { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd2",
7724
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7725
15
        },
7726
        /* Predictable Latency NVMSet Response */
7727
15
        { &hf_nvme_get_logpage_pred_lat_status[0],
7728
15
            { "Predictable Latency NVM Set Status", "nvme.cmd.get_logpage.pred_lat.status",
7729
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7730
15
        },
7731
15
        { &hf_nvme_get_logpage_pred_lat_status[1],
7732
15
            { "Enabled Window Setting", "nvme.cmd.get_logpage.pred_lat.status.ws",
7733
15
               FT_UINT8, BASE_HEX, VALS(plat_status_tbl), 0x7, NULL, HFILL}
7734
15
        },
7735
15
        { &hf_nvme_get_logpage_pred_lat_status[2],
7736
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.status.rsvd",
7737
15
               FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL}
7738
15
        },
7739
15
        { &hf_nvme_get_logpage_pred_lat_rsvd0,
7740
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd0",
7741
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7742
15
        },
7743
15
        { &hf_nvme_get_logpage_pred_lat_etype[0],
7744
15
            { "Event Type", "nvme.cmd.get_logpage.pred_lat.etype",
7745
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7746
15
        },
7747
15
        { &hf_nvme_get_logpage_pred_lat_etype[1],
7748
15
            { "DTWIN Reads Warning", "nvme.cmd.get_logpage.pred_lat.etype.rw",
7749
15
               FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL}
7750
15
        },
7751
15
        { &hf_nvme_get_logpage_pred_lat_etype[2],
7752
15
            { "DTWIN Writes Warning", "nvme.cmd.get_logpage.pred_lat.etype.ww",
7753
15
               FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL}
7754
15
        },
7755
15
        { &hf_nvme_get_logpage_pred_lat_etype[3],
7756
15
            { "DTWIN Time Warning", "nvme.cmd.get_logpage.pred_lat.etype.tw",
7757
15
               FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL}
7758
15
        },
7759
15
        { &hf_nvme_get_logpage_pred_lat_etype[4],
7760
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.etype.rsvd",
7761
15
               FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL}
7762
15
        },
7763
15
        { &hf_nvme_get_logpage_pred_lat_etype[5],
7764
15
            { "Autonomous transition from DTWIN to NDWIN due to typical or maximum value exceeded", "nvme.cmd.get_logpage.pred_lat.etype.atve",
7765
15
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
7766
15
        },
7767
15
        { &hf_nvme_get_logpage_pred_lat_etype[6],
7768
15
            { "Autonomous transition from DTWIN to NDWIN due to Deterministic Excursion", "nvme.cmd.get_logpage.pred_lat.etype.atde",
7769
15
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
7770
15
        },
7771
15
        { &hf_nvme_get_logpage_pred_lat_rsvd1,
7772
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd1",
7773
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7774
15
        },
7775
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_rt,
7776
15
            { "DTWIN Reads Typical (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_rt",
7777
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7778
15
        },
7779
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_wt,
7780
15
            { "DTWIN Writes Typical (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_wt",
7781
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7782
15
        },
7783
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_tm,
7784
15
            { "DTWIN Time Maximum (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_tm",
7785
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7786
15
        },
7787
15
        { &hf_nvme_get_logpage_pred_lat_ndwin_tmh,
7788
15
            { "NDWIN Time Minimum High (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tmh",
7789
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7790
15
        },
7791
15
        { &hf_nvme_get_logpage_pred_lat_ndwin_tml,
7792
15
            { "NDWIN Time Minimum Low (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tml",
7793
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7794
15
        },
7795
15
        { &hf_nvme_get_logpage_pred_lat_rsvd2,
7796
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd2",
7797
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7798
15
        },
7799
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_re,
7800
15
            { "DTWIN Reads Estimate (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_re",
7801
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7802
15
        },
7803
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_we,
7804
15
            { "DTWIN Writes Estimate (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_we",
7805
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7806
15
        },
7807
15
        { &hf_nvme_get_logpage_pred_lat_dtwin_te,
7808
15
            { "DTWIN Time Estimate (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_te",
7809
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7810
15
        },
7811
15
        { &hf_nvme_get_logpage_pred_lat_rsvd3,
7812
15
            { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd3",
7813
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7814
15
        },
7815
        /* Predictable Latency NVMSet Aggregate Response */
7816
15
        { &hf_nvme_get_logpage_pred_lat_aggreg_ne,
7817
15
            { "Number of Entries", "nvme.cmd.get_logpage.pred_lat_aggreg.ne",
7818
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7819
15
        },
7820
15
        { &hf_nvme_get_logpage_pred_lat_aggreg_nset,
7821
15
            { "NVM Set with Pending Predictable Latency Event", "nvme.cmd.get_logpage.pred_lat_aggreg.nset",
7822
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7823
15
        },
7824
        /* ANA Response */
7825
15
        { &hf_nvme_get_logpage_ana_chcnt,
7826
15
            { "Change Count", "nvme.cmd.get_logpage.ana.chcnt",
7827
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7828
15
        },
7829
15
        { &hf_nvme_get_logpage_ana_ngd,
7830
15
            { "Number of ANA Group Descriptors", "nvme.cmd.get_logpage.ana.ngd",
7831
15
               FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL}
7832
15
        },
7833
15
        { &hf_nvme_get_logpage_ana_rsvd,
7834
15
            { "Reserved", "nvme.cmd.get_logpage.ana.rsvd",
7835
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7836
15
        },
7837
15
        { &hf_nvme_get_logpage_ana_grp,
7838
15
            { "ANA Group Descriptor", "nvme.cmd.get_logpage.ana.grp",
7839
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7840
15
        },
7841
15
        { &hf_nvme_get_logpage_ana_grp_id,
7842
15
            { "ANA Group ID", "nvme.cmd.get_logpage.ana.grp.id",
7843
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7844
15
        },
7845
15
        { &hf_nvme_get_logpage_ana_grp_nns,
7846
15
            { "Number of NSID Values", "nvme.cmd.get_logpage.ana.grp.nns",
7847
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7848
15
        },
7849
15
        { &hf_nvme_get_logpage_ana_grp_chcnt,
7850
15
            { "Change Count", "nvme.cmd.get_logpage.ana.grp.chcnt",
7851
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7852
15
        },
7853
15
        { &hf_nvme_get_logpage_ana_grp_anas[0],
7854
15
            { "ANA State", "nvme.cmd.get_logpage.ana.grp.anas",
7855
15
               FT_UINT8, BASE_HEX, NULL, 0xf, NULL, HFILL}
7856
15
        },
7857
15
        { &hf_nvme_get_logpage_ana_grp_anas[1],
7858
15
            { "Asymmetric Namespace Access State", "nvme.cmd.get_logpage.ana.grp.anas.state",
7859
15
               FT_UINT8, BASE_HEX, VALS(ana_state_tbl), 0xf, NULL, HFILL}
7860
15
        },
7861
15
        { &hf_nvme_get_logpage_ana_grp_anas[2],
7862
15
            { "Reserved", "nvme.cmd.get_logpage.ana.grp.anas.rsvd",
7863
15
               FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL}
7864
15
        },
7865
15
        { &hf_nvme_get_logpage_ana_grp_rsvd,
7866
15
            { "Reserved", "nvme.cmd.get_logpage.ana.grp.rsvd",
7867
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7868
15
        },
7869
15
        { &hf_nvme_get_logpage_ana_grp_nsid,
7870
15
            { "Namespace Identifier", "nvme.cmd.get_logpage.ana.grp.nsid",
7871
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7872
15
        },
7873
        /* LBA Status Information Response */
7874
15
        { &hf_nvme_get_logpage_lba_status_lslplen,
7875
15
            { "LBA Status Log Page Length (LSLPLEN)", "nvme.cmd.get_logpage.lba_status.lslplen",
7876
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7877
15
        },
7878
15
        { &hf_nvme_get_logpage_lba_status_nlslne,
7879
15
            { "Number of LBA Status Log Namespace Elements (NLSLNE)", "nvme.cmd.get_logpage.lba_status.nlslne",
7880
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7881
15
        },
7882
15
        { &hf_nvme_get_logpage_lba_status_estulb,
7883
15
            { "Estimate of Unrecoverable Logical Blocks (ESTULB)", "nvme.cmd.get_logpage.lba_status.estulb",
7884
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7885
15
        },
7886
15
        { &hf_nvme_get_logpage_lba_status_rsvd,
7887
15
            { "Reserved", "nvme.cmd.get_logpage.lba_status.rsvd",
7888
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7889
15
        },
7890
15
        { &hf_nvme_get_logpage_lba_status_lsgc,
7891
15
            { "LBA Status Generation Counter (LSGC)", "nvme.cmd.get_logpage.lba_status.lsgc",
7892
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7893
15
        },
7894
15
        { &hf_nvme_get_logpage_lba_status_nel,
7895
15
            { "LBA Status Log Namespace Element List", "nvme.cmd.get_logpage.lba_status.nel",
7896
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7897
15
        },
7898
15
        { &hf_nvme_get_logpage_lba_status_nel_ne,
7899
15
            { "LBA Status Log Namespace Element", "nvme.cmd.get_logpage.lba_status.nel.ne",
7900
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7901
15
        },
7902
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_neid,
7903
15
            { "Namespace Element Identifier (NEID)", "nvme.cmd.get_logpage.lba_status.nel.ne.neid",
7904
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7905
15
        },
7906
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_nlrd,
7907
15
            { "Number of LBA Range Descriptors (NLRD)", "nvme.cmd.get_logpage.lba_status.nel.ne.nlrd",
7908
15
               FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL}
7909
15
        },
7910
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_ratype,
7911
15
            { "Number of LBA Range Descriptors (NLRD)", "nvme.cmd.get_logpage.lba_status.nel.ne.ratype",
7912
15
               FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL}
7913
15
        },
7914
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_rsvd,
7915
15
            { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rsvd",
7916
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7917
15
        },
7918
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd,
7919
15
            { "LBA Range Descriptor", "nvme.cmd.get_logpage.lba_status.nel.ne.rd",
7920
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7921
15
        },
7922
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba,
7923
15
            { "LBA Range Descriptor", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rslba",
7924
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7925
15
        },
7926
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb,
7927
15
            { "Range Number of Logical Blocks (RNLB)", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rnlb",
7928
15
               FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL}
7929
15
        },
7930
15
        { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd,
7931
15
            { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rsvd",
7932
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7933
15
        },
7934
        /* Get LogPage Endurance Group Aggregate Response */
7935
15
        { &hf_nvme_get_logpage_egroup_aggreg_ne,
7936
15
            { "Number of Entries", "nvme.cmd.get_logpage.egroup_agreg.ne",
7937
15
               FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL}
7938
15
        },
7939
15
        { &hf_nvme_get_logpage_egroup_aggreg_eg,
7940
15
            { "Endurance Group", "nvme.cmd.get_logpage.egroup_agreg.eg",
7941
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7942
15
        },
7943
        /* Get LogPage Reservation Notification Response */
7944
15
        { &hf_nvme_get_logpage_reserv_notif_lpc,
7945
15
            { "Log Page Count", "nvme.cmd.get_logpage.reserv_notif.lpc",
7946
15
               FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL}
7947
15
        },
7948
15
        { &hf_nvme_get_logpage_reserv_notif_lpt,
7949
15
            { "Reservation Notification Log Page Type", "nvme.cmd.get_logpage.reserv_notif.lpt",
7950
15
               FT_UINT8, BASE_HEX, VALS(rnlpt_tbl), 0x0, NULL, HFILL}
7951
15
        },
7952
15
        { &hf_nvme_get_logpage_reserv_notif_nalp,
7953
15
            { "Number of Available Log Pages", "nvme.cmd.get_logpage.reserv_notif.nalp",
7954
15
               FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL}
7955
15
        },
7956
15
        { &hf_nvme_get_logpage_reserv_notif_rsvd0,
7957
15
            { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd0",
7958
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7959
15
        },
7960
15
        { &hf_nvme_get_logpage_reserv_notif_nsid,
7961
15
            { "Namespace ID", "nvme.cmd.get_logpage.reserv_notif.nsid",
7962
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7963
15
        },
7964
15
        { &hf_nvme_get_logpage_reserv_notif_rsvd1,
7965
15
            { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd1",
7966
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
7967
15
        },
7968
        /* Get LogPage Sanitize Response */
7969
15
        { &hf_nvme_get_logpage_sanitize_sprog,
7970
15
            { "Sanitize Progress (SPROG)", "nvme.cmd.get_logpage.sanitize.sprog",
7971
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7972
15
        },
7973
15
        { &hf_nvme_get_logpage_sanitize_sstat[0],
7974
15
            { "Sanitize Status (SSTAT)", "nvme.cmd.get_logpage.sanitize.sstat",
7975
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
7976
15
        },
7977
15
        { &hf_nvme_get_logpage_sanitize_sstat[1],
7978
15
            { "Status of the most resent Sanitize Operation", "nvme.cmd.get_logpage.sanitize.sstat.mrst",
7979
15
               FT_UINT16, BASE_HEX, VALS(san_mrst_tbl), 0x7, NULL, HFILL}
7980
15
        },
7981
15
        { &hf_nvme_get_logpage_sanitize_sstat[2],
7982
15
            { "Number of Completed Overwrite Passes", "nvme.cmd.get_logpage.sanitize.sstat.cop",
7983
15
               FT_UINT16, BASE_HEX, NULL, 0xf8, NULL, HFILL}
7984
15
        },
7985
15
        { &hf_nvme_get_logpage_sanitize_sstat[3],
7986
15
            { "Global Data Erased", "nvme.cmd.get_logpage.sanitize.sstat.gde",
7987
15
               FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL}
7988
15
        },
7989
15
        { &hf_nvme_get_logpage_sanitize_sstat[4],
7990
15
            { "Reserved", "nvme.cmd.get_logpage.sanitize.sstat.rsvd",
7991
15
               FT_UINT16, BASE_HEX, NULL, 0xfe00, NULL, HFILL}
7992
15
        },
7993
15
        { &hf_nvme_get_logpage_sanitize_scdw10,
7994
15
            { "Sanitize Command Dword 10 Information (SCDW10)", "nvme.cmd.get_logpage.sanitize.scdw10",
7995
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
7996
15
        },
7997
15
        { &hf_nvme_get_logpage_sanitize_eto,
7998
15
            { "Estimated Time For Overwrite (seconds)", "nvme.cmd.get_logpage.sanitize.eto",
7999
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8000
15
        },
8001
15
        { &hf_nvme_get_logpage_sanitize_etbe,
8002
15
            { "Estimated Time For Block Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etbe",
8003
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8004
15
        },
8005
15
        { &hf_nvme_get_logpage_sanitize_etce,
8006
15
            { "Estimated Time For Crypto Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etce",
8007
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8008
15
        },
8009
15
        { &hf_nvme_get_logpage_sanitize_etond,
8010
15
            { "Estimated Time For Overwrite (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etond",
8011
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8012
15
        },
8013
15
        { &hf_nvme_get_logpage_sanitize_etbend,
8014
15
            { "Estimated Time For Block Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etbend",
8015
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8016
15
        },
8017
15
        { &hf_nvme_get_logpage_sanitize_etcend,
8018
15
            { "Estimated Time For Crypto Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etcend",
8019
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8020
15
        },
8021
15
        { &hf_nvme_get_logpage_sanitize_rsvd,
8022
15
            { "Reserved", "nvme.cmd.get_logpage.sanitize.rsvd",
8023
15
               FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL}
8024
15
        },
8025
        /* NVMe Response fields */
8026
15
        { &hf_nvme_cqe_dword0,
8027
15
            { "DWORD0", "nvme.cqe.dword0",
8028
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8029
15
        },
8030
15
        { &hf_nvme_cqe_dword0_sf_err,
8031
15
            { "Set Features Error Specific Code", "nvme.cqe.dword0.set_features.err",
8032
15
               FT_UINT32, BASE_HEX, VALS(nvme_cqe_sc_sf_err_dword0_tbl), 0x0, NULL, HFILL}
8033
15
        },
8034
15
        { &hf_nvme_cqe_aev_dword0[0],
8035
15
            { "DWORD0", "nvme.cqe.dword0.aev",
8036
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8037
15
        },
8038
15
        { &hf_nvme_cqe_aev_dword0[1],
8039
15
            { "Asynchronous Event Type", "nvme.cqe.dword0.aev.aet",
8040
15
               FT_UINT32, BASE_HEX, VALS(nvme_cqe_aev_aet_dword0_tbl), 0x7, NULL, HFILL}
8041
15
        },
8042
15
        { &hf_nvme_cqe_aev_dword0[2],
8043
15
            { "Reserved", "nvme.cqe.dword0.aev.rsvd0",
8044
15
               FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL}
8045
15
        },
8046
15
        { &hf_nvme_cqe_aev_dword0[3],
8047
15
            { "Asynchronous Event Information", "nvme.cqe.dword0.aev.aei",
8048
15
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
8049
15
        },
8050
15
        { &hf_nvme_cqe_aev_dword0[4],
8051
15
            { "Log Page Identifier", "nvme.cqe.dword0.aev.lpi",
8052
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff0000, NULL, HFILL}
8053
15
        },
8054
15
        { &hf_nvme_cqe_aev_dword0[5],
8055
15
            { "Reserved", "nvme.cqe.dword0.aev.rsvd1",
8056
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8057
15
        },
8058
        /* Set Feature Responses */
8059
15
        { &hf_nvme_cqe_dword0_sf_nq[0],
8060
15
            { "DWORD0: Set Feature Number of Queues Result", "nvme.cqe.dword0.set_features.nq",
8061
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8062
15
        },
8063
15
        { &hf_nvme_cqe_dword0_sf_nq[1],
8064
15
            { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.set_features.nq.nsqa",
8065
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
8066
15
        },
8067
15
        { &hf_nvme_cqe_dword0_sf_nq[2],
8068
15
            { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.set_features.ncqa",
8069
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
8070
15
        },
8071
        /* Get Feature Responses */
8072
15
        { &hf_nvme_cqe_get_features_dword0_arb[0],
8073
15
            { "DWORD0", "nvme.cqe.dword0.get_features.arb",
8074
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8075
15
        },
8076
15
        { &hf_nvme_cqe_get_features_dword0_arb[1],
8077
15
            { "Arbitration Burst", "nvme.cqe.dword0.get_features.arb.ab",
8078
15
               FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL}
8079
15
        },
8080
15
        { &hf_nvme_cqe_get_features_dword0_arb[2],
8081
15
            { "Reserved", "nvme.cqe.dword0.get_features.arb.rsvd",
8082
15
               FT_UINT32, BASE_HEX, NULL, 0x000000f8, NULL, HFILL}
8083
15
        },
8084
15
        { &hf_nvme_cqe_get_features_dword0_arb[3],
8085
15
            { "Low Priority Weight", "nvme.cqe.dword0.get_features.arb.lpw",
8086
15
               FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL}
8087
15
        },
8088
15
        { &hf_nvme_cqe_get_features_dword0_arb[4],
8089
15
            { "Medium Priority Weight", "nvme.cqe.dword0.get_features.arb.mpw",
8090
15
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
8091
15
        },
8092
15
        { &hf_nvme_cqe_get_features_dword0_arb[5],
8093
15
            { "High Priority Weight", "nvme.cqe.dword0.get_features.arb.hpw",
8094
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8095
15
        },
8096
15
        { &hf_nvme_cqe_get_features_dword0_pm[0],
8097
15
            { "DWORD0", "nvme.cqe.dword0.get_features.pm",
8098
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8099
15
        },
8100
15
        { &hf_nvme_cqe_get_features_dword0_pm[1],
8101
15
            { "Power State", "nvme.cqe.dword0.get_features.pm.ps",
8102
15
               FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL}
8103
15
        },
8104
15
        { &hf_nvme_cqe_get_features_dword0_pm[2],
8105
15
            { "Work Hint", "nvme.cqe.dword0.get_features.pm.wh",
8106
15
               FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL}
8107
15
        },
8108
15
        { &hf_nvme_cqe_get_features_dword0_pm[3],
8109
15
            { "Work Hint", "nvme.cqe.dword0.get_features.pm.rsvd",
8110
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8111
15
        },
8112
15
        { &hf_nvme_cqe_get_features_dword0_lbart[0],
8113
15
            { "DWORD0", "nvme.cqe.dword0.get_features.lbart",
8114
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8115
15
        },
8116
15
        { &hf_nvme_cqe_get_features_dword0_lbart[1],
8117
15
            { "DWORD0", "nvme.cqe.dword0.get_features.lbart.lbarn",
8118
15
               FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL}
8119
15
        },
8120
15
        { &hf_nvme_cqe_get_features_dword0_lbart[2],
8121
15
            { "DWORD0", "nvme.cqe.dword0.get_features.lbart.rsvd",
8122
15
               FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL}
8123
15
        },
8124
15
        { &hf_nvme_cqe_get_features_dword0_tt[0],
8125
15
            { "DWORD0", "nvme.cqe.dword0.get_features.tt",
8126
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8127
15
        },
8128
15
        { &hf_nvme_cqe_get_features_dword0_tt[1],
8129
15
            { "Temperature Threshold", "nvme.cqe.dword0.get_features.tt.tmpth",
8130
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8131
15
        },
8132
15
        { &hf_nvme_cqe_get_features_dword0_tt[2],
8133
15
            { "Threshold Temperature Select", "nvme.cqe.dword0.get_features.tt.tmpsel",
8134
15
               FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL}
8135
15
        },
8136
15
        { &hf_nvme_cqe_get_features_dword0_tt[3],
8137
15
            { "Threshold Type Select", "nvme.cqe.dword0.get_features.tt.thpsel",
8138
15
               FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL}
8139
15
        },
8140
15
        { &hf_nvme_cqe_get_features_dword0_tt[4],
8141
15
            { "Reserved", "nvme.cqe.dword0.get_features.tt.rsvd",
8142
15
               FT_UINT32, BASE_HEX, NULL, 0xc00000, NULL, HFILL}
8143
15
        },
8144
15
        { &hf_nvme_cqe_get_features_dword0_erec[0],
8145
15
            { "DWORD0", "nvme.cqe.dword0.get_features.erec",
8146
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8147
15
        },
8148
15
        { &hf_nvme_cqe_get_features_dword0_erec[1],
8149
15
            { "Time Limited Error Recovery (100 ms units)", "nvme.cqe.dword0.get_features.erec.tler",
8150
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8151
15
        },
8152
15
        { &hf_nvme_cqe_get_features_dword0_erec[2],
8153
15
            { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cqe.dword0.get_features.erec.dulbe",
8154
15
               FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL}
8155
15
        },
8156
15
        { &hf_nvme_cqe_get_features_dword0_erec[3],
8157
15
            { "Reserved", "nvme.cqe.dword0.get_features.erec.rsvd",
8158
15
               FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL}
8159
15
        },
8160
15
        { &hf_nvme_cqe_get_features_dword0_vwce[0],
8161
15
            { "DWORD0", "nvme.cqe.dword0.get_features.vwce",
8162
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8163
15
        },
8164
15
        { &hf_nvme_cqe_get_features_dword0_vwce[1],
8165
15
            { "Volatile Write Cache Enable", "nvme.cqe.dword0.get_features.vwce.wce",
8166
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8167
15
        },
8168
15
        { &hf_nvme_cqe_get_features_dword0_vwce[2],
8169
15
            { "Volatile Write Cache Enable", "nvme.cqe.dword0.get_features.vwce.rsvd",
8170
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8171
15
        },
8172
15
        { &hf_nvme_cqe_get_features_dword0_nq[0],
8173
15
            { "DWORD0", "nvme.cqe.dword0.get_features.nq",
8174
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8175
15
        },
8176
15
        { &hf_nvme_cqe_get_features_dword0_nq[1],
8177
15
            { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.get_features.nq.nsqa",
8178
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL}
8179
15
        },
8180
15
        { &hf_nvme_cqe_get_features_dword0_nq[2],
8181
15
            { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.get_features.nq.ncqa",
8182
15
               FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL}
8183
15
        },
8184
15
        { &hf_nvme_cqe_get_features_dword0_irqc[0],
8185
15
            { "DWORD0", "nvme.cqe.dword0.get_features.irqc",
8186
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8187
15
        },
8188
15
        { &hf_nvme_cqe_get_features_dword0_irqc[1],
8189
15
            { "Aggregation Threshold", "nvme.cqe.dword0.get_features.irqc.thr",
8190
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8191
15
        },
8192
15
        { &hf_nvme_cqe_get_features_dword0_irqc[2],
8193
15
            { "Aggregation Time (100 us units)", "nvme.cqe.dword0.get_features.irqc.time",
8194
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8195
15
        },
8196
15
        { &hf_nvme_cqe_get_features_dword0_irqv[0],
8197
15
            { "DWORD0", "nvme.cqe.dword0.get_features.irqv",
8198
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8199
15
        },
8200
15
        { &hf_nvme_cqe_get_features_dword0_irqv[1],
8201
15
            { "IRQ Vector", "nvme.cqe.dword0.get_features.irqv.iv",
8202
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8203
15
        },
8204
15
        { &hf_nvme_cqe_get_features_dword0_irqv[2],
8205
15
            { "Coalescing Disable", "nvme.cqe.dword0.get_features.irqv.cd",
8206
15
               FT_BOOLEAN, 32, NULL, 0x1ffff, NULL, HFILL}
8207
15
        },
8208
15
        { &hf_nvme_cqe_get_features_dword0_irqv[3],
8209
15
            { "Reserved", "nvme.cqe.dword0.get_features.irqv.rsvd",
8210
15
               FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL}
8211
15
        },
8212
15
        { &hf_nvme_cqe_get_features_dword0_wan[0],
8213
15
            { "DWORD0", "nvme.cqe.dword0.get_features.wan",
8214
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8215
15
        },
8216
15
        { &hf_nvme_cqe_get_features_dword0_wan[1],
8217
15
            { "Disable Normal", "nvme.cqe.dword0.get_features.wan.dn",
8218
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8219
15
        },
8220
15
        { &hf_nvme_cqe_get_features_dword0_wan[2],
8221
15
            { "Reserved", "nvme.cqe.dword0.get_features.wan.rsvd",
8222
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8223
15
        },
8224
15
        { &hf_nvme_cqe_get_features_dword0_aec[0],
8225
15
            { "DWORD0", "nvme.cqe.dword0.get_features.aec",
8226
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8227
15
        },
8228
15
        { &hf_nvme_cqe_get_features_dword0_aec[1],
8229
15
            { "SMART and Health Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.aec.smart",
8230
15
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
8231
15
        },
8232
15
        { &hf_nvme_cqe_get_features_dword0_aec[2],
8233
15
            { "Namespace Attribute Notices", "nvme.cqe.dword0.get_features.aec.ns",
8234
15
               FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL}
8235
15
        },
8236
15
        { &hf_nvme_cqe_get_features_dword0_aec[3],
8237
15
            { "Firmware Activation Notices", "nvme.cqe.dword0.get_features.aec.fwa",
8238
15
               FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL}
8239
15
        },
8240
15
        { &hf_nvme_cqe_get_features_dword0_aec[4],
8241
15
            { "Telemetry Log Notices", "nvme.cqe.dword0.get_features.aec.tel",
8242
15
               FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL}
8243
15
        },
8244
15
        { &hf_nvme_cqe_get_features_dword0_aec[5],
8245
15
            { "ANA Change Notices", "nvme.cqe.dword0.get_features.aec.ana",
8246
15
               FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL}
8247
15
        },
8248
15
        { &hf_nvme_cqe_get_features_dword0_aec[6],
8249
15
            { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.plat",
8250
15
               FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL}
8251
15
        },
8252
15
        { &hf_nvme_cqe_get_features_dword0_aec[7],
8253
15
            { "LBA Status Information Notices", "nvme.cqe.dword0.get_features.aec.lba",
8254
15
               FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL}
8255
15
        },
8256
15
        { &hf_nvme_cqe_get_features_dword0_aec[8],
8257
15
            { "Endurance Group Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.eg",
8258
15
               FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL}
8259
15
        },
8260
15
        { &hf_nvme_cqe_get_features_dword0_aec[9],
8261
15
            { "Reserved", "nvme.cqe.dword0.get_features.aec.rsvd",
8262
15
               FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL}
8263
15
        },
8264
15
        { &hf_nvme_cqe_get_features_dword0_aec[10],
8265
15
            { "Discovery Log Page Change Notification", "nvme.cqe.dword0.get_features.aec.disc",
8266
15
               FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL}
8267
15
        },
8268
15
        { &hf_nvme_cqe_get_features_dword0_apst[0],
8269
15
            { "DWORD0", "nvme.cqe.dword0.get_features.apst",
8270
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8271
15
        },
8272
15
        { &hf_nvme_cqe_get_features_dword0_apst[1],
8273
15
            { "Autonomous Power State Transition Enable", "nvme.cqe.dword0.get_features.apst.apste",
8274
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8275
15
        },
8276
15
        { &hf_nvme_cqe_get_features_dword0_apst[2],
8277
15
            { "Reserved", "nvme.cqe.dword0.get_features.apst.rsvd",
8278
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8279
15
        },
8280
15
        { &hf_nvme_cqe_get_features_dword0_kat[0],
8281
15
            { "DWORD0", "nvme.cqe.dword0.get_features.kat",
8282
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8283
15
        },
8284
15
        { &hf_nvme_cqe_get_features_dword0_kat[1],
8285
15
            { "Keep Alive Timeout", "nvme.cqe.dword0.get_features.kat.kato",
8286
15
               FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL}
8287
15
        },
8288
15
        { &hf_nvme_cqe_get_features_dword0_hctm[0],
8289
15
            { "DWORD0", "nvme.cqe.dword0.get_features.hctm",
8290
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8291
15
        },
8292
15
        { &hf_nvme_cqe_get_features_dword0_hctm[1],
8293
15
            { "Thermal Management Temperature 2 (K)", "nvme.cqe.dword0.get_features.hctm.tmt2",
8294
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8295
15
        },
8296
15
        { &hf_nvme_cqe_get_features_dword0_hctm[2],
8297
15
            { "Thermal Management Temperature 1 (K)", "nvme.cqe.dword0.get_features.hctm.tmt1",
8298
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8299
15
        },
8300
15
        { &hf_nvme_cqe_get_features_dword0_nops[0],
8301
15
            { "DWORD0", "nvme.cqe.dword0.get_features.nops",
8302
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8303
15
        },
8304
15
        { &hf_nvme_cqe_get_features_dword0_nops[1],
8305
15
            { "Non-Operational Power State Permissive Mode Enable", "nvme.cqe.dword0.get_features.nops.noppme",
8306
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8307
15
        },
8308
15
        { &hf_nvme_cqe_get_features_dword0_nops[2],
8309
15
            { "Reserved", "nvme.cqe.dword0.get_features.nops.rsvd",
8310
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8311
15
        },
8312
15
        { &hf_nvme_cqe_get_features_dword0_rrl[0],
8313
15
            { "DWORD0", "nvme.cqe.dword0.get_features.rrl",
8314
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8315
15
        },
8316
15
        { &hf_nvme_cqe_get_features_dword0_rrl[1],
8317
15
            { "Read Recovery Level", "nvme.cqe.dword0.get_features.rrl.rrl",
8318
15
               FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL}
8319
15
        },
8320
15
        { &hf_nvme_cqe_get_features_dword0_rrl[2],
8321
15
            { "Reserved", "nvme.cqe.dword0.get_features.rrl.rsvd",
8322
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL}
8323
15
        },
8324
15
        { &hf_nvme_cqe_get_features_dword0_plmc[0],
8325
15
            { "DWORD0", "nvme.cqe.dword0.get_features.plmc",
8326
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8327
15
        },
8328
15
        { &hf_nvme_cqe_get_features_dword0_plmc[1],
8329
15
            { "Predictable Latency Enable", "nvme.cqe.dword0.get_features.plmc.ple",
8330
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8331
15
        },
8332
15
        { &hf_nvme_cqe_get_features_dword0_plmc[2],
8333
15
            { "Reserved", "nvme.cqe.dword0.get_features.plmc.rsvd",
8334
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8335
15
        },
8336
15
        { &hf_nvme_cqe_get_features_dword0_plmw[0],
8337
15
            { "DWORD0", "nvme.cqe.dword0.get_features.plmw",
8338
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8339
15
        },
8340
15
        { &hf_nvme_cqe_get_features_dword0_plmw[1],
8341
15
            { "NVM Set Identifier", "nvme.cqe.dword0.get_features.plmw.nvmsetid",
8342
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8343
15
        },
8344
15
        { &hf_nvme_cqe_get_features_dword0_plmw[2],
8345
15
            { "Reserved", "nvme.cqe.dword0.get_features.plmw.rsvd",
8346
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8347
15
        },
8348
15
        { &hf_nvme_cqe_get_features_dword0_lbasi[0],
8349
15
            { "DWORD0", "nvme.cqe.dword0.get_features.lbasi",
8350
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8351
15
        },
8352
15
        { &hf_nvme_cqe_get_features_dword0_lbasi[1],
8353
15
            { "LBA Status Information Report Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsiri",
8354
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8355
15
        },
8356
15
        { &hf_nvme_cqe_get_features_dword0_lbasi[2],
8357
15
            { "LBA Status Information Poll Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsipi",
8358
15
               FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL}
8359
15
        },
8360
15
        { &hf_nvme_cqe_get_features_dword0_san[0],
8361
15
            { "DWORD0", "nvme.cqe.dword0.get_features.san",
8362
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8363
15
        },
8364
15
        { &hf_nvme_cqe_get_features_dword0_san[1],
8365
15
            { "No-Deallocate Response Mode", "nvme.cqe.dword0.get_features.san.nodrm",
8366
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8367
15
        },
8368
15
        { &hf_nvme_cqe_get_features_dword0_san[2],
8369
15
            { "Reserved", "nvme.cqe.dword0.get_features.san.rsvd",
8370
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8371
15
        },
8372
15
        { &hf_nvme_cqe_get_features_dword0_eg[0],
8373
15
            { "DWORD0", "nvme.cqe.dword0.get_features.eg",
8374
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8375
15
        },
8376
15
        { &hf_nvme_cqe_get_features_dword0_eg[1],
8377
15
            { "Endurance Group Identifier", "nvme.cqe.dword0.get_features.eg.endgid",
8378
15
               FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL}
8379
15
        },
8380
15
        { &hf_nvme_cqe_get_features_dword0_eg[2],
8381
15
            { "Endurance Group Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.eg.egcw",
8382
15
               FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL}
8383
15
        },
8384
15
        { &hf_nvme_cqe_get_features_dword0_eg[3],
8385
15
            { "Reserved", "nvme.cqe.dword0.get_features.eg.rsvd",
8386
15
               FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL}
8387
15
        },
8388
15
        { &hf_nvme_cqe_get_features_dword0_swp[0],
8389
15
            { "DWORD0", "nvme.cqe.dword0.get_features.swp",
8390
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8391
15
        },
8392
15
        { &hf_nvme_cqe_get_features_dword0_swp[1],
8393
15
            { "Pre-boot Software Load Count", "nvme.cqe.dword0.get_features.swp.pbslc",
8394
15
               FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL}
8395
15
        },
8396
15
        { &hf_nvme_cqe_get_features_dword0_swp[2],
8397
15
            { "Reserved", "nvme.cqe.dword0.get_features.swp.rsvd",
8398
15
               FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL}
8399
15
        },
8400
15
        { &hf_nvme_cqe_get_features_dword0_hid[0],
8401
15
            { "DWORD0", "nvme.cqe.dword0.get_features.hid",
8402
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8403
15
        },
8404
15
        { &hf_nvme_cqe_get_features_dword0_hid[1],
8405
15
            { "Enable Extended Host Identifier", "nvme.cqe.dword0.get_features.hid.exhid",
8406
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8407
15
        },
8408
15
        { &hf_nvme_cqe_get_features_dword0_hid[2],
8409
15
            { "Reserved", "nvme.cqe.dword0.get_features.hid.rsvd",
8410
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8411
15
        },
8412
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[0],
8413
15
            { "DWORD0", "nvme.cqe.dword0.get_features.rsrvn",
8414
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8415
15
        },
8416
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[1],
8417
15
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd0",
8418
15
               FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL}
8419
15
        },
8420
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[2],
8421
15
            { "Mask Registration Preempted Notification" , "nvme.cqe.dword0.get_features.rsrvn.regpre",
8422
15
               FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL}
8423
15
        },
8424
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[3],
8425
15
            { "Mask Reservation Released Notification", "nvme.cqe.dword0.get_features.rsrvn.resrel",
8426
15
               FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL}
8427
15
        },
8428
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[4],
8429
15
            { "Mask Reservation Preempted Notification", "nvme.cqe.dword0.get_features.rsrvn.resrpe",
8430
15
               FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL}
8431
15
        },
8432
15
        { &hf_nvme_cqe_get_features_dword0_rsrvn[5],
8433
15
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd1",
8434
15
               FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL}
8435
15
        },
8436
15
        { &hf_nvme_cqe_get_features_dword0_rsrvp[0],
8437
15
            { "DWORD0", "nvme.cqe.dword0.get_features.rsrvp",
8438
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8439
15
        },
8440
15
        { &hf_nvme_cqe_get_features_dword0_rsrvp[1],
8441
15
            { "Persist Through Power Loss", "nvme.cqe.dword0.get_features.rsrvp.ptpl",
8442
15
               FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL}
8443
15
        },
8444
15
        { &hf_nvme_cqe_get_features_dword0_rsrvp[2],
8445
15
            { "Reserved", "nvme.cqe.dword0.get_features.rsrvp.rsvd",
8446
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL}
8447
15
        },
8448
15
        { &hf_nvme_cqe_get_features_dword0_nswp[0],
8449
15
            { "DWORD0", "nvme.cqe.dword0.get_features.nswp",
8450
15
               FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}
8451
15
        },
8452
15
        { &hf_nvme_cqe_get_features_dword0_nswp[1],
8453
15
            { "DWORD0", "nvme.cqe.dword0.get_features.nswp.wps",
8454
15
               FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL}
8455
15
        },
8456
15
        { &hf_nvme_cqe_get_features_dword0_nswp[2],
8457
15
            { "DWORD0", "nvme.cqe.dword0.get_features.nswp.rsvd",
8458
15
               FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL}
8459
15
        },
8460
        /* Generic Response Fields */
8461
15
        { &hf_nvme_cqe_dword1,
8462
15
            { "DWORD1", "nvme.cqe.dword1",
8463
15
               FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL}
8464
15
        },
8465
15
        { &hf_nvme_cqe_sqhd,
8466
15
            { "SQ Head Pointer", "nvme.cqe.sqhd",
8467
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8468
15
        },
8469
15
        { &hf_nvme_cqe_sqid,
8470
15
            { "SQ Identifier", "nvme.cqe.sqid",
8471
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8472
15
        },
8473
15
        { &hf_nvme_cqe_cid,
8474
15
            { "Command Identifier", "nvme.cqe.cid",
8475
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8476
15
        },
8477
15
        { &hf_nvme_cqe_status[0],
8478
15
            { "Status Field", "nvme.cqe.status",
8479
15
               FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL}
8480
15
        },
8481
15
        { &hf_nvme_cqe_status[1],
8482
15
            { "Phase Tag", "nvme.cqe.status.p",
8483
15
               FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL}
8484
15
        },
8485
15
        { &hf_nvme_cqe_status_rsvd,
8486
15
            { "Reserved", "nvme.cqe.status.rsvd",
8487
15
               FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL}
8488
15
        },
8489
15
        { &hf_nvme_cqe_status[2],
8490
15
            { "Status Code", "nvme.cqe.status.sc",
8491
15
               FT_UINT16, BASE_HEX, NULL, 0x1fe, NULL, HFILL}
8492
15
        },
8493
15
        { &hf_nvme_cqe_status[3],
8494
15
            { "Status Code Type", "nvme.cqe.status.sct",
8495
15
               FT_UINT16, BASE_HEX, VALS(nvme_cqe_sct_tbl), 0xE00, NULL, HFILL}
8496
15
        },
8497
15
        { &hf_nvme_cqe_status[4],
8498
15
            { "Command Retry Delay", "nvme.cqe.status.crd",
8499
15
               FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL}
8500
15
        },
8501
15
        { &hf_nvme_cqe_status[5],
8502
15
            { "More Information in Log Page", "nvme.cqe.status.m",
8503
15
               FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL}
8504
15
        },
8505
15
        { &hf_nvme_cqe_status[6],
8506
15
            { "Do not Retry", "nvme.cqe.status.dnr",
8507
15
               FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL}
8508
15
        },
8509
15
        { &hf_nvme_cmd_pkt,
8510
15
            { "Cmd in", "nvme.cmd_pkt",
8511
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8512
15
              "The Cmd for this transaction is in this frame", HFILL }
8513
15
        },
8514
15
        { &hf_nvme_data_req,
8515
15
            { "DATA Transfer Request", "nvme.data_req",
8516
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8517
15
              "DATA transfer request for this transaction is in this frame", HFILL }
8518
15
        },
8519
15
        { &hf_nvme_data_tr[0],
8520
15
            { "DATA Transfer 0", "nvme.data.tr0",
8521
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8522
15
              "DATA transfer 0 for this transaction is in this frame", HFILL }
8523
15
        },
8524
15
        { &hf_nvme_data_tr[1],
8525
15
            { "DATA Transfer 1", "nvme.data_tr1",
8526
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8527
15
              "DATA transfer 1 for this transaction is in this frame", HFILL }
8528
15
        },
8529
15
        { &hf_nvme_data_tr[2],
8530
15
            { "DATA Transfer 2", "nvme.data_tr2",
8531
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8532
15
              "DATA transfer 2 for this transaction is in this frame", HFILL }
8533
15
        },
8534
15
        { &hf_nvme_data_tr[3],
8535
15
            { "DATA Transfer 3", "nvme.data_tr3",
8536
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8537
15
              "DATA transfer 3 for this transaction is in this frame", HFILL }
8538
15
        },
8539
15
        { &hf_nvme_data_tr[4],
8540
15
            { "DATA Transfer 4", "nvme.data_tr4",
8541
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8542
15
              "DATA transfer 4 for this transaction is in this frame", HFILL }
8543
15
        },
8544
15
        { &hf_nvme_data_tr[5],
8545
15
            { "DATA Transfer 5", "nvme.data_tr5",
8546
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8547
15
              "DATA transfer 5 for this transaction is in this frame", HFILL }
8548
15
        },
8549
15
        { &hf_nvme_data_tr[6],
8550
15
            { "DATA Transfer 6", "nvme.data_tr6",
8551
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8552
15
              "DATA transfer 6 for this transaction is in this frame", HFILL }
8553
15
        },
8554
15
        { &hf_nvme_data_tr[7],
8555
15
            { "DATA Transfer 7", "nvme.data_tr7",
8556
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8557
15
              "DATA transfer 7 for this transaction is in this frame", HFILL }
8558
15
        },
8559
15
        { &hf_nvme_data_tr[8],
8560
15
            { "DATA Transfer 8", "nvme.data_tr8",
8561
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8562
15
              "DATA transfer 8 for this transaction is in this frame", HFILL }
8563
15
        },
8564
15
        { &hf_nvme_data_tr[9],
8565
15
            { "DATA Transfer 9", "nvme.data_tr9",
8566
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8567
15
              "DATA transfer 9 for this transaction is in this frame", HFILL }
8568
15
        },
8569
15
        { &hf_nvme_data_tr[10],
8570
15
            { "DATA Transfer 10", "nvme.data_tr10",
8571
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8572
15
              "DATA transfer 10 for this transaction is in this frame", HFILL }
8573
15
        },
8574
15
        { &hf_nvme_data_tr[11],
8575
15
            { "DATA Transfer 11", "nvme.data_tr11",
8576
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8577
15
              "DATA transfer 11 for this transaction is in this frame", HFILL }
8578
15
        },
8579
15
        { &hf_nvme_data_tr[12],
8580
15
            { "DATA Transfer 12", "nvme.data_tr12",
8581
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8582
15
              "DATA transfer 12 for this transaction is in this frame", HFILL }
8583
15
        },
8584
15
        { &hf_nvme_data_tr[13],
8585
15
            { "DATA Transfer 13", "nvme.data_tr13",
8586
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8587
15
              "DATA transfer 13 for this transaction is in this frame", HFILL }
8588
15
        },
8589
15
        { &hf_nvme_data_tr[14],
8590
15
            { "DATA Transfer 14", "nvme.data_tr14",
8591
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8592
15
              "DATA transfer 14 for this transaction is in this frame", HFILL }
8593
15
        },
8594
15
        { &hf_nvme_data_tr[15],
8595
15
            { "DATA Transfer 15", "nvme.data_tr15",
8596
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8597
15
              "DATA transfer 15 for this transaction is in this frame", HFILL }
8598
15
        },
8599
15
        { &hf_nvme_cqe_pkt,
8600
15
            { "Cqe in", "nvme.cqe_pkt",
8601
15
              FT_FRAMENUM, BASE_NONE, NULL, 0,
8602
15
              "The Cqe for this transaction is in this frame", HFILL }
8603
15
        },
8604
15
        { &hf_nvme_cmd_latency,
8605
15
            { "Cmd Latency", "nvme.cmd_latency",
8606
15
              FT_DOUBLE, BASE_NONE, NULL, 0x0,
8607
15
              "The time between the command and completion, in usec", HFILL }
8608
15
        },
8609
15
        { &hf_nvme_gen_data,
8610
15
            { "Nvme Data", "nvme.data",
8611
15
              FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL}
8612
15
        },
8613
15
    };
8614
15
    static int *ett[] = {
8615
15
        &ett_data,
8616
15
    };
8617
8618
15
    proto_nvme = proto_register_protocol("NVM Express", "nvme", "nvme");
8619
8620
15
    proto_register_field_array(proto_nvme, hf, array_length(hf));
8621
15
    proto_register_subtree_array(ett, array_length(ett));
8622
15
}
8623
8624
/*
8625
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
8626
 *
8627
 * Local variables:
8628
 * c-basic-offset: 4
8629
 * tab-width: 8
8630
 * indent-tabs-mode: nil
8631
 * End:
8632
 *
8633
 * vi: set shiftwidth=4 tabstop=8 expandtab:
8634
 * :indentSize=4:tabSize=8:noTabs=true:
8635
 */