/src/wireshark/epan/dissectors/packet-nvme.c
Line | Count | Source |
1 | | /* packet-nvme.c |
2 | | * Routines for NVM Express dissection |
3 | | * Copyright 2016 |
4 | | * Code by Parav Pandit |
5 | | * |
6 | | * Wireshark - Network traffic analyzer |
7 | | * By Gerald Combs <gerald@wireshark.org> |
8 | | * Copyright 1998 Gerald Combs |
9 | | * |
10 | | * SPDX-License-Identifier: GPL-2.0-or-later |
11 | | */ |
12 | | |
13 | | /* This file dissects NVMe packets received from the underlying |
14 | | * fabric such as RDMA, FC. |
15 | | * This is fabric agnostic dissector and depends on cmd_ctx and q_ctx |
16 | | * It currently aligns to below specification. |
17 | | * http://www.nvmexpress.org/wp-content/uploads/NVM-Express-1_2a.pdf |
18 | | */ |
19 | | |
20 | | #include "config.h" |
21 | | |
22 | | #include <epan/packet.h> |
23 | | #include <epan/expert.h> |
24 | | #include <epan/tfs.h> |
25 | | #include <epan/unit_strings.h> |
26 | | |
27 | | #include <wsutil/array.h> |
28 | | #include "packet-nvme.h" |
29 | | |
30 | | void proto_register_nvme(void); |
31 | | |
32 | | static int proto_nvme; |
33 | | |
34 | | /* Dissector table for Security Send/Receive payloads, keyed on the Security |
35 | | * Protocol (SECP); see struct nvme_security_info in packet-nvme.h. */ |
36 | | static dissector_table_t nvme_security_secp_table; |
37 | | |
38 | | |
39 | | /* NVMeOF fields */ |
40 | | /* NVMe Fabric Cmd */ |
41 | | static int hf_nvmeof_cmd; |
42 | | static int hf_nvmeof_cmd_opc; |
43 | | static int hf_nvmeof_cmd_rsvd; |
44 | | static int hf_nvmeof_cmd_cid; |
45 | | static int hf_nvmeof_cmd_fctype; |
46 | | static int hf_nvmeof_cmd_connect_rsvd1; |
47 | | static int hf_nvmeof_cmd_connect_sgl1; |
48 | | static int hf_nvmeof_cmd_connect_recfmt; |
49 | | static int hf_nvmeof_cmd_connect_qid; |
50 | | static int hf_nvmeof_cmd_connect_sqsize; |
51 | | static int hf_nvmeof_cmd_connect_cattr[5]; |
52 | | static int hf_nvmeof_cmd_connect_rsvd2; |
53 | | static int hf_nvmeof_cmd_connect_kato; |
54 | | static int hf_nvmeof_cmd_connect_rsvd3; |
55 | | static int hf_nvmeof_cmd_connect_data_hostid; |
56 | | static int hf_nvmeof_cmd_connect_data_cntlid; |
57 | | static int hf_nvmeof_cmd_connect_data_rsvd0; |
58 | | static int hf_nvmeof_cmd_connect_data_subnqn; |
59 | | static int hf_nvmeof_cmd_connect_data_hostnqn; |
60 | | static int hf_nvmeof_cmd_connect_data_rsvd1; |
61 | | |
62 | | static int hf_nvmeof_cmd_auth_rsdv1; |
63 | | static int hf_nvmeof_cmd_auth_sgl1; |
64 | | static int hf_nvmeof_cmd_auth_rsdv2; |
65 | | static int hf_nvmeof_cmd_auth_spsp0; |
66 | | static int hf_nvmeof_cmd_auth_spsp1; |
67 | | static int hf_nvmeof_cmd_auth_secp; |
68 | | static int hf_nvmeof_cmd_auth_al; |
69 | | static int hf_nvmeof_cmd_auth_rsdv3; |
70 | | |
71 | | static int hf_nvmeof_cmd_disconnect_rsvd0; |
72 | | static int hf_nvmeof_cmd_disconnect_recfmt; |
73 | | static int hf_nvmeof_cmd_disconnect_rsvd1; |
74 | | |
75 | | static int hf_nvmeof_cmd_prop_get_set_rsvd0; |
76 | | static int hf_nvmeof_cmd_prop_get_set_attrib[3]; |
77 | | static int hf_nvmeof_cmd_prop_get_set_rsvd1; |
78 | | static int hf_nvmeof_cmd_prop_get_set_offset; |
79 | | static int hf_nvmeof_cmd_prop_get_rsvd2; |
80 | | |
81 | | static int hf_nvmeof_cmd_prop_set_rsvd; |
82 | | |
83 | | static int hf_nvmeof_cmd_generic_rsvd1; |
84 | | static int hf_nvmeof_cmd_generic_field; |
85 | | |
86 | | static int hf_nvmeof_prop_get_set_data; |
87 | | static int hf_nvmeof_prop_get_set_data_4B; |
88 | | static int hf_nvmeof_prop_get_set_data_4B_rsvd; |
89 | | static int hf_nvmeof_prop_get_set_data_8B; |
90 | | static int hf_nvmeof_prop_get_set_cc[10]; |
91 | | static int hf_nvmeof_prop_get_set_csts[7]; |
92 | | static int hf_nvmeof_prop_get_set_nssr[2]; |
93 | | static int hf_nvmeof_prop_get_vs[4]; |
94 | | static int hf_nvmeof_prop_get_ccap[17]; |
95 | | |
96 | | |
97 | | /* NVMe Fabric CQE */ |
98 | | static int hf_nvmeof_cqe; |
99 | | static int hf_nvmeof_cqe_sts; |
100 | | |
101 | | static int hf_nvmeof_cqe_connect_cntlid; |
102 | | static int hf_nvmeof_cqe_connect_authreq; |
103 | | static int hf_nvmeof_cqe_connect_rsvd; |
104 | | static int hf_nvmeof_cqe_prop_set_rsvd; |
105 | | |
106 | | /* tracking Cmd and its respective CQE */ |
107 | | int hf_nvmeof_cmd_pkt; |
108 | | int hf_nvmeof_data_req; |
109 | | static int hf_nvmeof_data_tr[NVME_CMD_MAX_TRS]; |
110 | | static int hf_nvmeof_cqe_pkt; |
111 | | static int hf_nvmeof_cmd_latency; |
112 | | |
113 | | static const range_string fctype_tbl[] = { |
114 | | { NVME_FCTYPE_PROP_SET, NVME_FCTYPE_PROP_SET, "Property Set" }, |
115 | | { NVME_FCTYPE_CONNECT, NVME_FCTYPE_CONNECT, "Connect" }, |
116 | | { NVME_FCTYPE_PROP_GET, NVME_FCTYPE_PROP_GET, "Property Get" }, |
117 | | { NVME_FCTYPE_AUTH_SEND, NVME_FCTYPE_AUTH_SEND, "Authentication Send" }, |
118 | | { NVME_FCTYPE_AUTH_RECV, NVME_FCTYPE_AUTH_RECV, "Authentication Recv" }, |
119 | | { NVME_FCTYPE_DISCONNECT, NVME_FCTYPE_DISCONNECT, "Disconnect" }, |
120 | | { 0xC0, 0xFF, "Vendor Specific" }, |
121 | | { 0, 0, NULL} |
122 | | }; |
123 | | |
124 | | static const value_string pclass_tbl[] = { |
125 | | { 0x0, "Urgent" }, |
126 | | { 0x1, "High" }, |
127 | | { 0x2, "Medium" }, |
128 | | { 0x3, "Low", }, |
129 | | { 0, NULL} |
130 | | }; |
131 | | |
132 | | static const value_string prop_offset_tbl[] = { |
133 | | { 0x0, "Controller Capabilities"}, |
134 | | { 0x8, "Version"}, |
135 | | { 0xc, "Reserved"}, |
136 | | { 0x10, "Reserved"}, |
137 | | { 0x14, "Controller Configuration"}, |
138 | | { 0x18, "Reserved"}, |
139 | | { 0x1c, "Controller Status"}, |
140 | | { 0x20, "NVM Subsystem Reset"}, |
141 | | { 0x24, "Reserved"}, |
142 | | { 0x28, "Reserved"}, |
143 | | { 0x30, "Reserved"}, |
144 | | { 0x38, "Reserved"}, |
145 | | { 0x3c, "Reserved"}, |
146 | | { 0x40, "Reserved"}, |
147 | | { 0x64, "NVM Subsystem Shutdown"}, |
148 | | { 0x68, "Controller Ready Timeouts"}, |
149 | | { 0, NULL} |
150 | | }; |
151 | | |
152 | | static const value_string attr_size_tbl[] = { |
153 | | { 0, "4 bytes"}, |
154 | | { 1, "8 bytes"}, |
155 | | { 0, NULL} |
156 | | }; |
157 | | |
158 | | static const value_string css_table[] = { |
159 | | { 0x0, "NVM Command Set"}, |
160 | | { 0x6, "All Supported I/O Command Sets"}, |
161 | | { 0x7, "Admin Command Set Only"}, |
162 | | { 0x0, NULL} |
163 | | }; |
164 | | static const value_string sn_table[] = { |
165 | | { 0x0, "No Shutdown"}, |
166 | | { 0x1, "Normal Shutdown"}, |
167 | | { 0x2, "Abrupt Shutdown"}, |
168 | | { 0x3, "Reserved"}, |
169 | | { 0x0, NULL} |
170 | | }; |
171 | | static const value_string ams_table[] = { |
172 | | { 0x0, "Round Robin"}, |
173 | | { 0x1, "Weighted Round Robin with Urgent Priority Class"}, |
174 | | { 0x2, "Reserved"}, |
175 | | { 0x3, "Reserved"}, |
176 | | { 0x4, "Reserved"}, |
177 | | { 0x5, "Reserved"}, |
178 | | { 0x6, "Reserved"}, |
179 | | { 0x7, "Vendor Specific"}, |
180 | | { 0x0, NULL} |
181 | | }; |
182 | | |
183 | | /* Shared with the NVMe-MI Controller Health Data Structure CSTS.SHST decode. */ |
184 | | const value_string shst_table[] = { |
185 | | { 0x0, "No Shutdown"}, |
186 | | { 0x1, "Shutdown in Process"}, |
187 | | { 0x2, "Shutdown Complete"}, |
188 | | { 0x3, "Reserved"}, |
189 | | { 0x0, NULL} |
190 | | }; |
191 | | |
192 | | /* NVMe Cmd fields */ |
193 | | static int hf_nvme_cmd_opc; |
194 | | static int hf_nvme_cmd_rsvd; |
195 | | static int hf_nvme_cmd_cid; |
196 | | static int hf_nvme_cmd_fuse_op; |
197 | | static int hf_nvme_cmd_psdt; |
198 | | static int hf_nvme_cmd_nsid; |
199 | | static int hf_nvme_cmd_rsvd1; |
200 | | static int hf_nvme_cmd_mptr; |
201 | | static int hf_nvme_cmd_sgl; |
202 | | static int hf_nvme_cmd_sgl_desc_type; |
203 | | static int hf_nvme_cmd_sgl_desc_sub_type; |
204 | | static int hf_nvme_cmd_sgl_desc_addr; |
205 | | static int hf_nvme_cmd_sgl_desc_addr_rsvd; |
206 | | static int hf_nvme_cmd_sgl_desc_len; |
207 | | static int hf_nvme_cmd_sgl_desc_rsvd; |
208 | | static int hf_nvme_cmd_sgl_desc_key; |
209 | | static int hf_nvme_cmd_dword10; |
210 | | static int hf_nvme_cmd_dword11; |
211 | | static int hf_nvme_cmd_dword12; |
212 | | static int hf_nvme_cmd_dword13; |
213 | | static int hf_nvme_cmd_dword14; |
214 | | static int hf_nvme_cmd_dword15; |
215 | | static int hf_nvme_cmd_slba; |
216 | | static int hf_nvme_cmd_nlb; |
217 | | static int hf_nvme_cmd_rsvd2; |
218 | | static int hf_nvme_cmd_prinfo; |
219 | | static int hf_nvme_cmd_prinfo_prchk_lbrtag; |
220 | | static int hf_nvme_cmd_prinfo_prchk_apptag; |
221 | | static int hf_nvme_cmd_prinfo_prchk_guard; |
222 | | static int hf_nvme_cmd_prinfo_pract; |
223 | | static int hf_nvme_cmd_fua; |
224 | | static int hf_nvme_cmd_lr; |
225 | | static int hf_nvme_cmd_eilbrt; |
226 | | static int hf_nvme_cmd_elbat; |
227 | | static int hf_nvme_cmd_elbatm; |
228 | | static int hf_nvme_cmd_dsm; |
229 | | static int hf_nvme_cmd_dsm_access_freq; |
230 | | static int hf_nvme_cmd_dsm_access_lat; |
231 | | static int hf_nvme_cmd_dsm_seq_req; |
232 | | static int hf_nvme_cmd_dsm_incompressible; |
233 | | static int hf_nvme_cmd_rsvd3; |
234 | | static int hf_nvme_identify_dword10[4]; |
235 | | static int hf_nvme_identify_dword11[4]; |
236 | | static int hf_nvme_identify_dword14[3]; |
237 | | |
238 | | static int hf_nvme_get_logpage_dword10[5]; |
239 | | static int hf_nvme_get_logpage_numd; |
240 | | static int hf_nvme_get_logpage_dword11[3]; |
241 | | static int hf_nvme_get_logpage_lpo; |
242 | | static int hf_nvme_get_logpage_dword14[5]; |
243 | | static int hf_nvme_set_features_dword10[4]; |
244 | | static int hf_nvme_set_features_dword14[3]; |
245 | | |
246 | | /* Admin opcodes whose CDW10-15 decode is shared with the NVMe-MI Admin |
247 | | * dissector (the request layout is a standard SQE from offset 40 onward). */ |
248 | | static int hf_nvme_format_nvm_dword10[8]; |
249 | | static int hf_nvme_fw_commit_dword10[5]; |
250 | | static int hf_nvme_fw_download_numd; |
251 | | static int hf_nvme_fw_download_ofst; |
252 | | static int hf_nvme_self_test_dword10[3]; |
253 | | static int hf_nvme_lockdown_dword10[7]; |
254 | | static int hf_nvme_lockdown_dword14[3]; |
255 | | static int hf_nvme_sanitize_dword10[8]; |
256 | | static int hf_nvme_sanitize_ovrpat; |
257 | | static int hf_nvme_security_dword10[5]; |
258 | | static int hf_nvme_security_send_dword11_tl; |
259 | | static int hf_nvme_security_recv_dword11_al; |
260 | | static int hf_nvme_security_data; |
261 | | static int hf_nvme_security_info; |
262 | | static int hf_nvme_security_info_rsvd; |
263 | | static int hf_nvme_security_info_list_len; |
264 | | static int hf_nvme_security_info_protocol; |
265 | | static int hf_nvme_security_info_cert_len; |
266 | | static int hf_nvme_security_info_cert_data; |
267 | | static int hf_nvme_cmd_set_features_dword11_arb[6]; |
268 | | static int hf_nvme_cmd_set_features_dword11_pm[4]; |
269 | | static int hf_nvme_cmd_set_features_dword11_lbart[3]; |
270 | | static int hf_nvme_cmd_set_features_dword11_tt[6]; |
271 | | static int hf_nvme_cmd_set_features_dword11_erec[4]; |
272 | | static int hf_nvme_cmd_set_features_dword11_vwce[3]; |
273 | | static int hf_nvme_cmd_set_features_dword11_nq[3]; |
274 | | static int hf_nvme_cmd_set_features_dword11_irqc[3]; |
275 | | static int hf_nvme_cmd_set_features_dword11_irqv[4]; |
276 | | static int hf_nvme_cmd_set_features_dword11_wan[3]; |
277 | | static int hf_nvme_cmd_set_features_dword11_aec[11]; |
278 | | static int hf_nvme_cmd_set_features_dword11_apst[3]; |
279 | | static int hf_nvme_cmd_set_features_dword11_kat[2]; |
280 | | static int hf_nvme_cmd_set_features_dword11_hctm[3]; |
281 | | static int hf_nvme_cmd_set_features_dword11_nops[3]; |
282 | | static int hf_nvme_cmd_set_features_dword11_rrl[3]; |
283 | | static int hf_nvme_cmd_set_features_dword12_rrl[3]; |
284 | | static int hf_nvme_cmd_set_features_dword11_plmc[3]; |
285 | | static int hf_nvme_cmd_set_features_dword12_plmc[3]; |
286 | | static int hf_nvme_cmd_set_features_dword11_plmw[3]; |
287 | | static int hf_nvme_cmd_set_features_dword12_plmw[3]; |
288 | | static int hf_nvme_cmd_set_features_dword11_lbasi[3]; |
289 | | static int hf_nvme_cmd_set_features_dword11_san[3]; |
290 | | static int hf_nvme_cmd_set_features_dword11_eg[4]; |
291 | | static int hf_nvme_cmd_set_features_dword11_swp[3]; |
292 | | static int hf_nvme_cmd_set_features_dword11_hid[3]; |
293 | | static int hf_nvme_cmd_set_features_dword11_rsrvn[6]; |
294 | | static int hf_nvme_cmd_set_features_dword11_rsrvp[3]; |
295 | | static int hf_nvme_cmd_set_features_dword11_nswp[3]; |
296 | | static int hf_nvme_cmd_set_features_dword11_hmd[3]; |
297 | | static int hf_nvme_cmd_set_features_dword11_hmb[6]; |
298 | | static int hf_nvme_cmd_set_features_dword11_iocsp[3]; |
299 | | static int hf_nvme_cmd_set_features_dword11_spinup[3]; |
300 | | static int hf_nvme_cmd_set_features_dword11_plsc[3]; |
301 | | static int hf_nvme_cmd_set_features_dword11_fdp[3]; |
302 | | static int hf_nvme_cmd_set_features_dword11_fdpe[4]; |
303 | | static int hf_nvme_cmd_set_features_dword11_bpwpc[4]; |
304 | | static int hf_nvme_set_features_tr_lbart; |
305 | | static int hf_nvme_set_features_tr_lbart_type; |
306 | | static int hf_nvme_set_features_tr_lbart_attr[4]; |
307 | | static int hf_nvme_set_features_tr_lbart_rsvd0; |
308 | | static int hf_nvme_set_features_tr_lbart_slba; |
309 | | static int hf_nvme_set_features_tr_lbart_nlb; |
310 | | static int hf_nvme_set_features_tr_lbart_guid; |
311 | | static int hf_nvme_set_features_tr_lbart_rsvd1; |
312 | | static int hf_nvme_set_features_tr_apst[5]; |
313 | | static int hf_nvme_set_features_tr_tst[3]; |
314 | | static int hf_nvme_set_features_tr_plmc; |
315 | | static int hf_nvme_set_features_tr_plmc_ee[7]; |
316 | | static int hf_nvme_set_features_tr_plmc_rsvd0; |
317 | | static int hf_nvme_set_features_tr_plmc_dtwinrt; |
318 | | static int hf_nvme_set_features_tr_plmc_dtwinwt; |
319 | | static int hf_nvme_set_features_tr_plmc_dtwintt; |
320 | | static int hf_nvme_set_features_tr_plmc_rsvd1; |
321 | | static int hf_nvme_set_features_tr_hbs; |
322 | | static int hf_nvme_set_features_tr_hbs_acre; |
323 | | static int hf_nvme_set_features_tr_hbs_etdas; |
324 | | static int hf_nvme_set_features_tr_hbs_lbafee; |
325 | | static int hf_nvme_set_features_tr_hbs_hdisns; |
326 | | static int hf_nvme_set_features_tr_hbs_cdfe[6]; |
327 | | static int hf_nvme_set_features_tr_hbs_rsvd; |
328 | | static int hf_nvme_set_features_tr_hmd; |
329 | | static int hf_nvme_set_features_tr_hmd_nmed; |
330 | | static int hf_nvme_set_features_tr_hmd_rsvd; |
331 | | static int hf_nvme_set_features_tr_hmd_med; |
332 | | static int hf_nvme_set_features_tr_hmd_med_et; |
333 | | static int hf_nvme_set_features_tr_hmd_med_er; |
334 | | static int hf_nvme_set_features_tr_hmd_med_elen; |
335 | | static int hf_nvme_set_features_tr_hmd_med_eval; |
336 | | static int hf_nvme_get_features_dword10[4]; |
337 | | static int hf_nvme_get_features_dword14[3]; |
338 | | static int hf_nvme_cmd_get_features_dword11_rrl[3]; |
339 | | static int hf_nvme_cmd_get_features_dword11_plmc[3]; |
340 | | static int hf_nvme_cmd_get_features_dword11_plmw[3]; |
341 | | static int hf_nvme_identify_ns_nsze; |
342 | | static int hf_nvme_identify_ns_ncap; |
343 | | static int hf_nvme_identify_ns_nuse; |
344 | | static int hf_nvme_identify_ns_nsfeat; |
345 | | static int hf_nvme_identify_ns_nlbaf; |
346 | | static int hf_nvme_identify_ns_flbas; |
347 | | static int hf_nvme_identify_ns_mc; |
348 | | static int hf_nvme_identify_ns_dpc; |
349 | | static int hf_nvme_identify_ns_dps; |
350 | | static int hf_nvme_identify_ns_nmic; |
351 | | static int hf_nvme_identify_ns_rescap; |
352 | | static int hf_nvme_identify_ns_fpi; |
353 | | static int hf_nvme_identify_ns_dlfeat[5]; |
354 | | static int hf_nvme_identify_ns_nawun; |
355 | | static int hf_nvme_identify_ns_nawupf; |
356 | | static int hf_nvme_identify_ns_nacwu; |
357 | | static int hf_nvme_identify_ns_nabsn; |
358 | | static int hf_nvme_identify_ns_nabo; |
359 | | static int hf_nvme_identify_ns_nabspf; |
360 | | static int hf_nvme_identify_ns_noiob; |
361 | | static int hf_nvme_identify_ns_nvmcap; |
362 | | static int hf_nvme_identify_ns_npwg; |
363 | | static int hf_nvme_identify_ns_npwa; |
364 | | static int hf_nvme_identify_ns_npdg; |
365 | | static int hf_nvme_identify_ns_npda; |
366 | | static int hf_nvme_identify_ns_nows; |
367 | | static int hf_nvme_identify_ns_mssrl; |
368 | | static int hf_nvme_identify_ns_mcl; |
369 | | static int hf_nvme_identify_ns_msrc; |
370 | | static int hf_nvme_identify_ns_kpios[4]; |
371 | | static int hf_nvme_identify_ns_nulbaf; |
372 | | static int hf_nvme_identify_ns_rsvd0; |
373 | | static int hf_nvme_identify_ns_kpiodaag; |
374 | | static int hf_nvme_identify_ns_rsvd1; |
375 | | static int hf_nvme_identify_ns_anagrpid; |
376 | | static int hf_nvme_identify_ns_rsvd2; |
377 | | static int hf_nvme_identify_ns_nsattr; |
378 | | static int hf_nvme_identify_ns_nvmsetid; |
379 | | static int hf_nvme_identify_ns_endgid; |
380 | | static int hf_nvme_identify_ns_nguid; |
381 | | static int hf_nvme_identify_ns_eui64; |
382 | | static int hf_nvme_identify_ns_lbafs; |
383 | | static int hf_nvme_identify_ns_lbaf; |
384 | | static int hf_nvme_identify_ns_vs; |
385 | | /* CNS 08h: I/O Command Set Independent Identify Namespace (Base 2.3 Fig 335) */ |
386 | | static int hf_nvme_identify_cs_ind_ns_nsfeat[6]; |
387 | | static int hf_nvme_identify_cs_ind_ns_nmic[4]; |
388 | | static int hf_nvme_identify_cs_ind_ns_rescap[9]; |
389 | | static int hf_nvme_identify_cs_ind_ns_fpi[3]; |
390 | | static int hf_nvme_identify_cs_ind_ns_anagrpid; |
391 | | static int hf_nvme_identify_cs_ind_ns_nsattr[3]; |
392 | | static int hf_nvme_identify_cs_ind_ns_rsvd0; |
393 | | static int hf_nvme_identify_cs_ind_ns_nvmsetid; |
394 | | static int hf_nvme_identify_cs_ind_ns_endgid; |
395 | | static int hf_nvme_identify_cs_ind_ns_nstat[4]; |
396 | | static int hf_nvme_identify_cs_ind_ns_kpios[4]; |
397 | | static int hf_nvme_identify_cs_ind_ns_maxkt; |
398 | | static int hf_nvme_identify_cs_ind_ns_rsvd1; |
399 | | static int hf_nvme_identify_cs_ind_ns_rgrpid; |
400 | | static int hf_nvme_identify_ctrl_vid; |
401 | | static int hf_nvme_identify_ctrl_ssvid; |
402 | | static int hf_nvme_identify_ctrl_sn; |
403 | | static int hf_nvme_identify_ctrl_mn; |
404 | | static int hf_nvme_identify_ctrl_fr; |
405 | | static int hf_nvme_identify_ctrl_rab; |
406 | | static int hf_nvme_identify_ctrl_ieee; |
407 | | static int hf_nvme_identify_ctrl_cmic[6]; |
408 | | static int hf_nvme_identify_ctrl_mdts; |
409 | | static int hf_nvme_identify_ctrl_cntlid; |
410 | | static int hf_nvme_identify_ctrl_ver; |
411 | | static int hf_nvme_identify_ctrl_ver_min; |
412 | | static int hf_nvme_identify_ctrl_ver_mjr; |
413 | | static int hf_nvme_identify_ctrl_ver_ter; |
414 | | static int hf_nvme_identify_ctrl_rtd3r; |
415 | | static int hf_nvme_identify_ctrl_rtd3e; |
416 | | static int hf_nvme_identify_ctrl_oaes[10]; |
417 | | static int hf_nvme_identify_ctrl_ctratt[12]; |
418 | | static int hf_nvme_identify_ctrl_rrls[17]; |
419 | | static int hf_nvme_identify_ctrl_bpcap[4]; |
420 | | static int hf_nvme_identify_ctrl_rsvd0; /* byte 103 */ |
421 | | static int hf_nvme_identify_ctrl_nssl; |
422 | | static int hf_nvme_identify_ctrl_rsvd6; /* bytes 109:108 */ |
423 | | static int hf_nvme_identify_ctrl_plsi[4]; |
424 | | static int hf_nvme_identify_ctrl_cntrltype; |
425 | | static int hf_nvme_identify_ctrl_fguid; |
426 | | static int hf_nvme_identify_ctrl_fguid_vse; |
427 | | static int hf_nvme_identify_ctrl_fguid_oui; |
428 | | static int hf_nvme_identify_ctrl_fguid_ei; |
429 | | static int hf_nvme_identify_ctrl_crdt1; |
430 | | static int hf_nvme_identify_ctrl_crdt2; |
431 | | static int hf_nvme_identify_ctrl_crdt3; |
432 | | static int hf_nvme_identify_ctrl_crcap[4]; |
433 | | static int hf_nvme_identify_ctrl_ciu; |
434 | | static int hf_nvme_identify_ctrl_cirn; |
435 | | static int hf_nvme_identify_ctrl_rsvd1; /* bytes 239:144 */ |
436 | | static int hf_nvme_identify_ctrl_mi; |
437 | | static int hf_nvme_identify_ctrl_mi_rsvd; |
438 | | static int hf_nvme_identify_ctrl_mi_nvmsr[4]; |
439 | | static int hf_nvme_identify_ctrl_mi_vwci[3]; |
440 | | static int hf_nvme_identify_ctrl_mi_mec[4]; |
441 | | static int hf_nvme_identify_ctrl_oacs[12]; |
442 | | static int hf_nvme_identify_ctrl_acl; |
443 | | static int hf_nvme_identify_ctrl_aerl; |
444 | | static int hf_nvme_identify_ctrl_frmw[5]; |
445 | | static int hf_nvme_identify_ctrl_lpa[7]; |
446 | | static int hf_nvme_identify_ctrl_elpe; |
447 | | static int hf_nvme_identify_ctrl_npss; |
448 | | static int hf_nvme_identify_ctrl_avscc[3]; |
449 | | static int hf_nvme_identify_ctrl_apsta[3]; |
450 | | static int hf_nvme_identify_ctrl_wctemp; |
451 | | static int hf_nvme_identify_ctrl_cctemp; |
452 | | static int hf_nvme_identify_ctrl_mtfa; |
453 | | static int hf_nvme_identify_ctrl_hmpre; |
454 | | static int hf_nvme_identify_ctrl_hmmin; |
455 | | static int hf_nvme_identify_ctrl_tnvmcap; |
456 | | static int hf_nvme_identify_ctrl_unvmcap; |
457 | | static int hf_nvme_identify_ctrl_rpmbs[6]; |
458 | | static int hf_nvme_identify_ctrl_edstt; |
459 | | static int hf_nvme_identify_ctrl_dsto[3]; |
460 | | static int hf_nvme_identify_ctrl_fwug; |
461 | | static int hf_nvme_identify_ctrl_kas; |
462 | | static int hf_nvme_identify_ctrl_hctma[3]; |
463 | | static int hf_nvme_identify_ctrl_mntmt; |
464 | | static int hf_nvme_identify_ctrl_mxtmt; |
465 | | static int hf_nvme_identify_ctrl_sanicap[7]; |
466 | | static int hf_nvme_identify_ctrl_hmmminds; |
467 | | static int hf_nvme_identify_ctrl_hmmaxd; |
468 | | static int hf_nvme_identify_ctrl_nsetidmax; |
469 | | static int hf_nvme_identify_ctrl_endgidmax; |
470 | | static int hf_nvme_identify_ctrl_anatt; |
471 | | static int hf_nvme_identify_ctrl_anacap[9]; |
472 | | static int hf_nvme_identify_ctrl_anagrpmax; |
473 | | static int hf_nvme_identify_ctrl_nanagrpid; |
474 | | static int hf_nvme_identify_ctrl_pels; |
475 | | static int hf_nvme_identify_ctrl_did; |
476 | | static int hf_nvme_identify_ctrl_kpioc[4]; |
477 | | static int hf_nvme_identify_ctrl_rsvd2; /* byte 359 */ |
478 | | static int hf_nvme_identify_ctrl_mptfawr; |
479 | | static int hf_nvme_identify_ctrl_rsvd7; /* bytes 367:362 */ |
480 | | static int hf_nvme_identify_ctrl_megcap; |
481 | | static int hf_nvme_identify_ctrl_tmpthha[3]; |
482 | | static int hf_nvme_identify_ctrl_mupa[3]; |
483 | | static int hf_nvme_identify_ctrl_cqt; |
484 | | static int hf_nvme_identify_ctrl_cdpa[3]; |
485 | | static int hf_nvme_identify_ctrl_mup; |
486 | | static int hf_nvme_identify_ctrl_ipmsr[3]; |
487 | | static int hf_nvme_identify_ctrl_msmt; |
488 | | static int hf_nvme_identify_ctrl_rsvd8; /* bytes 511:396 */ |
489 | | static int hf_nvme_identify_ctrl_sqes[3]; |
490 | | static int hf_nvme_identify_ctrl_cqes[3]; |
491 | | static int hf_nvme_identify_ctrl_maxcmd; |
492 | | static int hf_nvme_identify_ctrl_nn; |
493 | | static int hf_nvme_identify_ctrl_oncs[10]; |
494 | | static int hf_nvme_identify_ctrl_fuses[3]; |
495 | | static int hf_nvme_identify_ctrl_fna[5]; |
496 | | static int hf_nvme_identify_ctrl_vwc[4]; |
497 | | static int hf_nvme_identify_ctrl_awun; |
498 | | static int hf_nvme_identify_ctrl_awupf; |
499 | | static int hf_nvme_identify_ctrl_nvscc[3]; |
500 | | static int hf_nvme_identify_ctrl_nwpc[5]; |
501 | | static int hf_nvme_identify_ctrl_acwu; |
502 | | static int hf_nvme_identify_ctrl_rsvd3; |
503 | | static int hf_nvme_identify_ctrl_sgls[11]; |
504 | | static int hf_nvme_identify_ctrl_mnan; |
505 | | static int hf_nvme_identify_ctrl_maxdna; |
506 | | static int hf_nvme_identify_ctrl_maxcna; |
507 | | static int hf_nvme_identify_ctrl_oaqd; |
508 | | static int hf_nvme_identify_ctrl_rhiri; |
509 | | static int hf_nvme_identify_ctrl_hirt; |
510 | | static int hf_nvme_identify_ctrl_cmmrtd; |
511 | | static int hf_nvme_identify_ctrl_nmmrtd; |
512 | | static int hf_nvme_identify_ctrl_minmrtg; |
513 | | static int hf_nvme_identify_ctrl_maxmrtg; |
514 | | static int hf_nvme_identify_ctrl_trattr[5]; |
515 | | static int hf_nvme_identify_ctrl_rsvd4; /* byte 577 */ |
516 | | static int hf_nvme_identify_ctrl_mcudmq; |
517 | | static int hf_nvme_identify_ctrl_mnsudmq; |
518 | | static int hf_nvme_identify_ctrl_mcmr; |
519 | | static int hf_nvme_identify_ctrl_nmcmr; |
520 | | static int hf_nvme_identify_ctrl_mcdqpc; |
521 | | static int hf_nvme_identify_ctrl_rsvd9; /* bytes 767:588 */ |
522 | | static int hf_nvme_identify_ctrl_subnqn; |
523 | | static int hf_nvme_identify_ctrl_rsvd5; |
524 | | static int hf_nvme_identify_ctrl_nvmeof; |
525 | | static int hf_nvme_identify_ctrl_nvmeof_ioccsz; |
526 | | static int hf_nvme_identify_ctrl_nvmeof_iorcsz; |
527 | | static int hf_nvme_identify_ctrl_nvmeof_icdoff; |
528 | | static int hf_nvme_identify_ctrl_nvmeof_fcatt[3]; |
529 | | static int hf_nvme_identify_ctrl_nvmeof_msdbd; |
530 | | static int hf_nvme_identify_ctrl_nvmeof_ofcs[3]; |
531 | | static int hf_nvme_identify_ctrl_nvmeof_dctype; |
532 | | static int hf_nvme_identify_ctrl_nvmeof_ccrl; |
533 | | static int hf_nvme_identify_ctrl_nvmeof_rsvd; /* bytes 2047:1808 */ |
534 | | static int hf_nvme_identify_ctrl_psds; |
535 | | static int hf_nvme_identify_ctrl_psd; |
536 | | static int hf_nvme_identify_ctrl_psd_mp; |
537 | | static int hf_nvme_identify_ctrl_psd_rsvd0; |
538 | | static int hf_nvme_identify_ctrl_psd_mxps; |
539 | | static int hf_nvme_identify_ctrl_psd_nops; |
540 | | static int hf_nvme_identify_ctrl_psd_rsvd1; |
541 | | static int hf_nvme_identify_ctrl_psd_enlat; |
542 | | static int hf_nvme_identify_ctrl_psd_exlat; |
543 | | static int hf_nvme_identify_ctrl_psd_rrt; |
544 | | static int hf_nvme_identify_ctrl_psd_rsvd2; |
545 | | static int hf_nvme_identify_ctrl_psd_rrl; |
546 | | static int hf_nvme_identify_ctrl_psd_rsvd3; |
547 | | static int hf_nvme_identify_ctrl_psd_rwt; |
548 | | static int hf_nvme_identify_ctrl_psd_rsvd4; |
549 | | static int hf_nvme_identify_ctrl_psd_rwl; |
550 | | static int hf_nvme_identify_ctrl_psd_rsvd5; |
551 | | static int hf_nvme_identify_ctrl_psd_idlp; |
552 | | static int hf_nvme_identify_ctrl_psd_rsvd6; |
553 | | static int hf_nvme_identify_ctrl_psd_ips; |
554 | | static int hf_nvme_identify_ctrl_psd_rsvd7; |
555 | | static int hf_nvme_identify_ctrl_psd_actp; |
556 | | static int hf_nvme_identify_ctrl_psd_apw; |
557 | | static int hf_nvme_identify_ctrl_psd_rsvd8; |
558 | | static int hf_nvme_identify_ctrl_psd_aps; |
559 | | static int hf_nvme_identify_ctrl_psd_epfrt; |
560 | | static int hf_nvme_identify_ctrl_psd_fqvt; |
561 | | static int hf_nvme_identify_ctrl_psd_epfvt; |
562 | | static int hf_nvme_identify_ctrl_psd_epfrts; |
563 | | static int hf_nvme_identify_ctrl_psd_fqvts; |
564 | | static int hf_nvme_identify_ctrl_psd_epfvts; |
565 | | static int hf_nvme_identify_ctrl_psd_rsvd9; |
566 | | static int hf_nvme_identify_ctrl_psd_mbw; |
567 | | static int hf_nvme_identify_ctrl_psd_mbws; |
568 | | static int hf_nvme_identify_ctrl_psd_rsvd10; |
569 | | static int hf_nvme_identify_ctrl_psd_rsvd11; |
570 | | static int hf_nvme_identify_ctrl_vs; |
571 | | |
572 | | static int hf_nvme_identify_nslist_nsid; |
573 | | |
574 | | /* Identify Namespace Identification Descriptor list (CNS 03h) response */ |
575 | | static int hf_nvme_identify_nsdesc_nidt; |
576 | | static int hf_nvme_identify_nsdesc_nidl; |
577 | | static int hf_nvme_identify_nsdesc_nid; |
578 | | |
579 | | /* Identify Controller List (CNS 12h/13h) response */ |
580 | | static int hf_nvme_identify_ctrl_list_num; |
581 | | static int hf_nvme_identify_ctrl_list_id; |
582 | | |
583 | | /* Identify NVM Set List (CNS 04h) response */ |
584 | | static int hf_nvme_identify_nvmset_num; |
585 | | static int hf_nvme_identify_nvmset_id; |
586 | | static int hf_nvme_identify_nvmset_endgid; |
587 | | static int hf_nvme_identify_nvmset_r4krt; |
588 | | static int hf_nvme_identify_nvmset_ows; |
589 | | static int hf_nvme_identify_nvmset_tnvmsc; |
590 | | static int hf_nvme_identify_nvmset_unvmsc; |
591 | | |
592 | | /* Identify Primary Controller Capabilities (CNS 14h) response */ |
593 | | static int hf_nvme_identify_pcc_cntlid; |
594 | | static int hf_nvme_identify_pcc_portid; |
595 | | static int hf_nvme_identify_pcc_crt[4]; |
596 | | static int hf_nvme_identify_pcc_vqfrt; |
597 | | static int hf_nvme_identify_pcc_vqrfa; |
598 | | static int hf_nvme_identify_pcc_vqrfap; |
599 | | static int hf_nvme_identify_pcc_vqprt; |
600 | | static int hf_nvme_identify_pcc_vqfrsm; |
601 | | static int hf_nvme_identify_pcc_vqgran; |
602 | | static int hf_nvme_identify_pcc_vifrt; |
603 | | static int hf_nvme_identify_pcc_virfa; |
604 | | static int hf_nvme_identify_pcc_virfap; |
605 | | static int hf_nvme_identify_pcc_viprt; |
606 | | static int hf_nvme_identify_pcc_vifrsm; |
607 | | static int hf_nvme_identify_pcc_vigran; |
608 | | |
609 | | /* Identify Secondary Controller List (CNS 15h) response */ |
610 | | static int hf_nvme_identify_scl_num; |
611 | | static int hf_nvme_identify_scl_scid; |
612 | | static int hf_nvme_identify_scl_pcid; |
613 | | static int hf_nvme_identify_scl_scs[3]; |
614 | | static int hf_nvme_identify_scl_vfn; |
615 | | static int hf_nvme_identify_scl_nvq; |
616 | | static int hf_nvme_identify_scl_nvi; |
617 | | |
618 | | /* Identify Namespace Granularity List (CNS 16h) response */ |
619 | | static int hf_nvme_identify_ngl_nga[3]; |
620 | | static int hf_nvme_identify_ngl_nd; |
621 | | static int hf_nvme_identify_ngl_nsg; |
622 | | static int hf_nvme_identify_ngl_ncg; |
623 | | |
624 | | /* Identify UUID List (CNS 17h) response */ |
625 | | static int hf_nvme_identify_uuid_idassoc; |
626 | | static int hf_nvme_identify_uuid_uuid; |
627 | | |
628 | | /* get logpage response */ |
629 | | static int hf_nvme_get_logpage_ify_genctr; |
630 | | static int hf_nvme_get_logpage_ify_numrec; |
631 | | static int hf_nvme_get_logpage_ify_recfmt; |
632 | | static int hf_nvme_get_logpage_ify_rsvd; |
633 | | static int hf_nvme_get_logpage_ify_rcrd; |
634 | | static int hf_nvme_get_logpage_ify_rcrd_trtype; |
635 | | static int hf_nvme_get_logpage_ify_rcrd_adrfam; |
636 | | static int hf_nvme_get_logpage_ify_rcrd_subtype; |
637 | | static int hf_nvme_get_logpage_ify_rcrd_treq[6]; |
638 | | static int hf_nvme_get_logpage_ify_rcrd_portid; |
639 | | static int hf_nvme_get_logpage_ify_rcrd_cntlid; |
640 | | static int hf_nvme_get_logpage_ify_rcrd_asqsz; |
641 | | static int hf_nvme_get_logpage_ify_rcrd_rsvd0; |
642 | | static int hf_nvme_get_logpage_ify_rcrd_trsvcid; |
643 | | static int hf_nvme_get_logpage_ify_rcrd_rsvd1; |
644 | | static int hf_nvme_get_logpage_ify_rcrd_subnqn; |
645 | | static int hf_nvme_get_logpage_ify_rcrd_traddr; |
646 | | static int hf_nvme_get_logpage_ify_rcrd_tsas; |
647 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype; |
648 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype; |
649 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms; |
650 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0; |
651 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey; |
652 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1; |
653 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype; |
654 | | static int hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd; |
655 | | static int hf_nvme_get_logpage_errinf_errcnt; |
656 | | static int hf_nvme_get_logpage_errinf_sqid; |
657 | | static int hf_nvme_get_logpage_errinf_cid; |
658 | | static int hf_nvme_get_logpage_errinf_sf[3]; |
659 | | static int hf_nvme_get_logpage_errinf_pel[4]; |
660 | | static int hf_nvme_get_logpage_errinf_lba; |
661 | | static int hf_nvme_get_logpage_errinf_ns; |
662 | | static int hf_nvme_get_logpage_errinf_vsi; |
663 | | static int hf_nvme_get_logpage_errinf_trtype; |
664 | | static int hf_nvme_get_logpage_errinf_cmdset; |
665 | | static int hf_nvme_get_logpage_errinf_opc; |
666 | | static int hf_nvme_get_logpage_errinf_csi; |
667 | | static int hf_nvme_get_logpage_errinf_tsi; |
668 | | static int hf_nvme_get_logpage_errinf_rsvd1; |
669 | | static int hf_nvme_get_logpage_errinf_lpver; |
670 | | static int hf_nvme_get_logpage_smart_cw[9]; |
671 | | static int hf_nvme_get_logpage_smart_ct; |
672 | | static int hf_nvme_get_logpage_smart_asc; |
673 | | static int hf_nvme_get_logpage_smart_ast; |
674 | | static int hf_nvme_get_logpage_smart_lpu; |
675 | | static int hf_nvme_get_logpage_smart_egcws[6]; |
676 | | static int hf_nvme_get_logpage_smart_rsvd0; |
677 | | static int hf_nvme_get_logpage_smart_dur; |
678 | | static int hf_nvme_get_logpage_smart_duw; |
679 | | static int hf_nvme_get_logpage_smart_hrc; |
680 | | static int hf_nvme_get_logpage_smart_hwc; |
681 | | static int hf_nvme_get_logpage_smart_cbt; |
682 | | static int hf_nvme_get_logpage_smart_pc; |
683 | | static int hf_nvme_get_logpage_smart_poh; |
684 | | static int hf_nvme_get_logpage_smart_us; |
685 | | static int hf_nvme_get_logpage_smart_mie; |
686 | | static int hf_nvme_get_logpage_smart_ele; |
687 | | static int hf_nvme_get_logpage_smart_wctt; |
688 | | static int hf_nvme_get_logpage_smart_cctt; |
689 | | static int hf_nvme_get_logpage_smart_ts[9]; |
690 | | static int hf_nvme_get_logpage_smart_tmt1c; |
691 | | static int hf_nvme_get_logpage_smart_tmt2c; |
692 | | static int hf_nvme_get_logpage_smart_tmt1t; |
693 | | static int hf_nvme_get_logpage_smart_tmt2t; |
694 | | static int hf_nvme_get_logpage_smart_rsvd1; |
695 | | static int hf_nvme_get_logpage_fw_slot_afi[5]; |
696 | | static int hf_nvme_get_logpage_fw_slot_rsvd0; |
697 | | static int hf_nvme_get_logpage_fw_slot_frs; |
698 | | static int hf_nvme_get_logpage_fw_slot_frs_ascii[7]; |
699 | | static int hf_nvme_get_logpage_fw_slot_rsvd1; |
700 | | static int hf_nvme_get_logpage_changed_nslist; |
701 | | static int hf_nvme_get_logpage_cmd_and_eff_cs; |
702 | | static int hf_nvme_get_logpage_cmd_and_eff_cseds[10]; |
703 | | static int hf_nvme_get_logpage_supported_lids; |
704 | | static int hf_nvme_get_logpage_supported_lidseds[5]; |
705 | | static int hf_nvme_get_logpage_selftest_csto[3]; |
706 | | static int hf_nvme_get_logpage_selftest_cstc[3]; |
707 | | static int hf_nvme_get_logpage_selftest_rsvd; |
708 | | static int hf_nvme_get_logpage_selftest_res; |
709 | | static int hf_nvme_get_logpage_selftest_res_status[3]; |
710 | | static int hf_nvme_get_logpage_selftest_res_sn; |
711 | | static int hf_nvme_get_logpage_selftest_res_vdi[6]; |
712 | | static int hf_nvme_get_logpage_selftest_res_rsvd; |
713 | | static int hf_nvme_get_logpage_selftest_res_poh; |
714 | | static int hf_nvme_get_logpage_selftest_res_nsid; |
715 | | static int hf_nvme_get_logpage_selftest_res_flba; |
716 | | static int hf_nvme_get_logpage_selftest_res_sct[3]; |
717 | | static int hf_nvme_get_logpage_selftest_res_sc; |
718 | | static int hf_nvme_get_logpage_selftest_res_vs; |
719 | | static int hf_nvme_get_logpage_telemetry_li; |
720 | | static int hf_nvme_get_logpage_telemetry_rsvd0; |
721 | | static int hf_nvme_get_logpage_telemetry_ieee; |
722 | | static int hf_nvme_get_logpage_telemetry_da1lb; |
723 | | static int hf_nvme_get_logpage_telemetry_da2lb; |
724 | | static int hf_nvme_get_logpage_telemetry_da3lb; |
725 | | static int hf_nvme_get_logpage_telemetry_rsvd1; |
726 | | static int hf_nvme_get_logpage_telemetry_da4lb; |
727 | | static int hf_nvme_get_logpage_telemetry_rsvd2; |
728 | | static int hf_nvme_get_logpage_telemetry_scope; |
729 | | static int hf_nvme_get_logpage_telemetry_hdgn; |
730 | | static int hf_nvme_get_logpage_telemetry_da; |
731 | | static int hf_nvme_get_logpage_telemetry_dgn; |
732 | | static int hf_nvme_get_logpage_telemetry_ri; |
733 | | static int hf_nvme_get_logpage_telemetry_db; |
734 | | static int hf_nvme_get_logpage_egroup_cw[6]; |
735 | | static int hf_nvme_get_logpage_egroup_egfeat[3]; |
736 | | static int hf_nvme_get_logpage_egroup_rsvd0; |
737 | | static int hf_nvme_get_logpage_egroup_as; |
738 | | static int hf_nvme_get_logpage_egroup_ast; |
739 | | static int hf_nvme_get_logpage_egroup_pu; |
740 | | static int hf_nvme_get_logpage_egroup_did; |
741 | | static int hf_nvme_get_logpage_egroup_rsvd1; |
742 | | static int hf_nvme_get_logpage_egroup_ee; |
743 | | static int hf_nvme_get_logpage_egroup_dur; |
744 | | static int hf_nvme_get_logpage_egroup_duw; |
745 | | static int hf_nvme_get_logpage_egroup_muw; |
746 | | static int hf_nvme_get_logpage_egroup_hrc; |
747 | | static int hf_nvme_get_logpage_egroup_hwc; |
748 | | static int hf_nvme_get_logpage_egroup_mdie; |
749 | | static int hf_nvme_get_logpage_egroup_ele; |
750 | | static int hf_nvme_get_logpage_egroup_tegcap; |
751 | | static int hf_nvme_get_logpage_egroup_uegcap; |
752 | | static int hf_nvme_get_logpage_egroup_rsvd2; |
753 | | static int hf_nvme_get_logpage_pred_lat_status[3]; |
754 | | static int hf_nvme_get_logpage_pred_lat_rsvd0; |
755 | | static int hf_nvme_get_logpage_pred_lat_etype[7]; |
756 | | static int hf_nvme_get_logpage_pred_lat_rsvd1; |
757 | | static int hf_nvme_get_logpage_pred_lat_dtwin_rt; |
758 | | static int hf_nvme_get_logpage_pred_lat_dtwin_wt; |
759 | | static int hf_nvme_get_logpage_pred_lat_dtwin_tm; |
760 | | static int hf_nvme_get_logpage_pred_lat_ndwin_tmh; |
761 | | static int hf_nvme_get_logpage_pred_lat_ndwin_tml; |
762 | | static int hf_nvme_get_logpage_pred_lat_rsvd2; |
763 | | static int hf_nvme_get_logpage_pred_lat_dtwin_re; |
764 | | static int hf_nvme_get_logpage_pred_lat_dtwin_we; |
765 | | static int hf_nvme_get_logpage_pred_lat_dtwin_te; |
766 | | static int hf_nvme_get_logpage_pred_lat_rsvd3; |
767 | | static int hf_nvme_get_logpage_pred_lat_aggreg_ne; |
768 | | static int hf_nvme_get_logpage_pred_lat_aggreg_nset; |
769 | | static int hf_nvme_get_logpage_ana_chcnt; |
770 | | static int hf_nvme_get_logpage_ana_ngd; |
771 | | static int hf_nvme_get_logpage_ana_rsvd; |
772 | | static int hf_nvme_get_logpage_ana_grp; |
773 | | static int hf_nvme_get_logpage_ana_grp_id; |
774 | | static int hf_nvme_get_logpage_ana_grp_nns; |
775 | | static int hf_nvme_get_logpage_ana_grp_chcnt; |
776 | | static int hf_nvme_get_logpage_ana_grp_anas[3]; |
777 | | static int hf_nvme_get_logpage_ana_grp_rsvd; |
778 | | static int hf_nvme_get_logpage_ana_grp_nsid; |
779 | | static int hf_nvme_get_logpage_lba_status_lslplen; |
780 | | static int hf_nvme_get_logpage_lba_status_nlslne; |
781 | | static int hf_nvme_get_logpage_lba_status_estulb; |
782 | | static int hf_nvme_get_logpage_lba_status_rsvd; |
783 | | static int hf_nvme_get_logpage_lba_status_lsgc; |
784 | | static int hf_nvme_get_logpage_lba_status_nel; |
785 | | static int hf_nvme_get_logpage_lba_status_nel_ne; |
786 | | static int hf_nvme_get_logpage_lba_status_nel_ne_neid; |
787 | | static int hf_nvme_get_logpage_lba_status_nel_ne_nlrd; |
788 | | static int hf_nvme_get_logpage_lba_status_nel_ne_ratype; |
789 | | static int hf_nvme_get_logpage_lba_status_nel_ne_rsvd; |
790 | | static int hf_nvme_get_logpage_lba_status_nel_ne_rd; |
791 | | static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba; |
792 | | static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb; |
793 | | static int hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd; |
794 | | static int hf_nvme_get_logpage_egroup_aggreg_ne; |
795 | | static int hf_nvme_get_logpage_egroup_aggreg_eg; |
796 | | static int hf_nvme_get_logpage_reserv_notif_lpc; |
797 | | static int hf_nvme_get_logpage_reserv_notif_lpt; |
798 | | static int hf_nvme_get_logpage_reserv_notif_nalp; |
799 | | static int hf_nvme_get_logpage_reserv_notif_rsvd0; |
800 | | static int hf_nvme_get_logpage_reserv_notif_nsid; |
801 | | static int hf_nvme_get_logpage_reserv_notif_rsvd1; |
802 | | static int hf_nvme_get_logpage_sanitize_sprog; |
803 | | static int hf_nvme_get_logpage_sanitize_sstat[7]; |
804 | | static int hf_nvme_get_logpage_sanitize_scdw10; |
805 | | static int hf_nvme_get_logpage_sanitize_eto; |
806 | | static int hf_nvme_get_logpage_sanitize_etbe; |
807 | | static int hf_nvme_get_logpage_sanitize_etce; |
808 | | static int hf_nvme_get_logpage_sanitize_etond; |
809 | | static int hf_nvme_get_logpage_sanitize_etbend; |
810 | | static int hf_nvme_get_logpage_sanitize_etcend; |
811 | | static int hf_nvme_get_logpage_sanitize_etpvds; |
812 | | static int hf_nvme_get_logpage_sanitize_ssi[3]; |
813 | | static int hf_nvme_get_logpage_sanitize_rsvd0; |
814 | | static int hf_nvme_get_logpage_sanitize_mnsoip; |
815 | | static int hf_nvme_get_logpage_sanitize_stnsid; |
816 | | static int hf_nvme_get_logpage_sanitize_rsvd; |
817 | | static int hf_nvme_get_logpage_disc_rcrd_eflags[5]; |
818 | | /* Feature Identifiers Supported and Effects Response */ |
819 | | static int hf_nvme_get_logpage_feat_sup_and_eff_fidx; |
820 | | static int hf_nvme_get_logpage_feat_sup_and_eff_fids[9]; |
821 | | /* NVMe-MI Commands Supported and Effects Response */ |
822 | | static int hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs; |
823 | | static int hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[8]; |
824 | | /* Command and Feature Lockdown Response */ |
825 | | static int hf_nvme_get_logpage_cmd_feat_lockdown_cfila[4]; |
826 | | static int hf_nvme_get_logpage_cmd_feat_lockdown_rsvd; |
827 | | static int hf_nvme_get_logpage_cmd_feat_lockdown_lngth; |
828 | | static int hf_nvme_get_logpage_cmd_feat_lockdown_cfil; |
829 | | static int hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1; |
830 | | /* Physical Interface Receiver Eye Opening Measurement Response (LID 19h) */ |
831 | | static int hf_nvme_get_logpage_eom_lid; |
832 | | static int hf_nvme_get_logpage_eom_eomip; |
833 | | static int hf_nvme_get_logpage_eom_hsize; |
834 | | static int hf_nvme_get_logpage_eom_rsz; |
835 | | static int hf_nvme_get_logpage_eom_edgn; |
836 | | static int hf_nvme_get_logpage_eom_lrev; |
837 | | static int hf_nvme_get_logpage_eom_odp[4]; |
838 | | static int hf_nvme_get_logpage_eom_lns; |
839 | | static int hf_nvme_get_logpage_eom_epl; |
840 | | static int hf_nvme_get_logpage_eom_lspfc[3]; |
841 | | static int hf_nvme_get_logpage_eom_linfo[3]; |
842 | | static int hf_nvme_get_logpage_eom_rsvd0; |
843 | | static int hf_nvme_get_logpage_eom_lsic; |
844 | | static int hf_nvme_get_logpage_eom_ds; |
845 | | static int hf_nvme_get_logpage_eom_nd; |
846 | | static int hf_nvme_get_logpage_eom_maxtb; |
847 | | static int hf_nvme_get_logpage_eom_maxlr; |
848 | | static int hf_nvme_get_logpage_eom_etgood; |
849 | | static int hf_nvme_get_logpage_eom_etbetter; |
850 | | static int hf_nvme_get_logpage_eom_etbest; |
851 | | static int hf_nvme_get_logpage_eom_rsvd1; |
852 | | static int hf_nvme_get_logpage_eom_desc; |
853 | | static int hf_nvme_get_logpage_eom_desc_rsvd0; |
854 | | static int hf_nvme_get_logpage_eom_desc_mstat[3]; |
855 | | static int hf_nvme_get_logpage_eom_desc_ln; |
856 | | static int hf_nvme_get_logpage_eom_desc_eye; |
857 | | static int hf_nvme_get_logpage_eom_desc_top; |
858 | | static int hf_nvme_get_logpage_eom_desc_btm; |
859 | | static int hf_nvme_get_logpage_eom_desc_lft; |
860 | | static int hf_nvme_get_logpage_eom_desc_rgt; |
861 | | static int hf_nvme_get_logpage_eom_desc_nrows; |
862 | | static int hf_nvme_get_logpage_eom_desc_ncols; |
863 | | static int hf_nvme_get_logpage_eom_desc_edlen; |
864 | | static int hf_nvme_get_logpage_eom_desc_rsvd1; |
865 | | static int hf_nvme_get_logpage_eom_desc_pe; |
866 | | static int hf_nvme_get_logpage_eom_desc_ed; |
867 | | |
868 | | /* NVMe CQE fields */ |
869 | | static int hf_nvme_cqe_dword0; |
870 | | static int hf_nvme_cqe_aev_dword0[6]; |
871 | | static int hf_nvme_cqe_dword0_sf_nq[3]; |
872 | | static int hf_nvme_cqe_dword0_sf_err; |
873 | | |
874 | | static int hf_nvme_cqe_get_features_dword0_arb[6]; |
875 | | static int hf_nvme_cqe_get_features_dword0_pm[4]; |
876 | | static int hf_nvme_cqe_get_features_dword0_lbart[3]; |
877 | | static int hf_nvme_cqe_get_features_dword0_tt[6]; |
878 | | static int hf_nvme_cqe_get_features_dword0_erec[4]; |
879 | | static int hf_nvme_cqe_get_features_dword0_vwce[3]; |
880 | | static int hf_nvme_cqe_get_features_dword0_nq[3]; |
881 | | static int hf_nvme_cqe_get_features_dword0_irqc[3]; |
882 | | static int hf_nvme_cqe_get_features_dword0_irqv[4]; |
883 | | static int hf_nvme_cqe_get_features_dword0_wan[3]; |
884 | | static int hf_nvme_cqe_get_features_dword0_aec[11]; |
885 | | static int hf_nvme_cqe_get_features_dword0_apst[3]; |
886 | | static int hf_nvme_cqe_get_features_dword0_kat[2]; |
887 | | static int hf_nvme_cqe_get_features_dword0_hctm[3]; |
888 | | static int hf_nvme_cqe_get_features_dword0_nops[3]; |
889 | | static int hf_nvme_cqe_get_features_dword0_rrl[3]; |
890 | | static int hf_nvme_cqe_get_features_dword0_plmc[3]; |
891 | | static int hf_nvme_cqe_get_features_dword0_plmw[3]; |
892 | | static int hf_nvme_cqe_get_features_dword0_lbasi[3]; |
893 | | static int hf_nvme_cqe_get_features_dword0_san[3]; |
894 | | static int hf_nvme_cqe_get_features_dword0_eg[4]; |
895 | | static int hf_nvme_cqe_get_features_dword0_swp[3]; |
896 | | static int hf_nvme_cqe_get_features_dword0_hid[3]; |
897 | | static int hf_nvme_cqe_get_features_dword0_rsrvn[6]; |
898 | | static int hf_nvme_cqe_get_features_dword0_rsrvp[3]; |
899 | | static int hf_nvme_cqe_get_features_dword0_nswp[3]; |
900 | | |
901 | | static int hf_nvme_cqe_dword1; |
902 | | static int hf_nvme_cqe_sqhd; |
903 | | static int hf_nvme_cqe_sqid; |
904 | | static int hf_nvme_cqe_cid; |
905 | | static int hf_nvme_cqe_status[7]; |
906 | | static int hf_nvme_cqe_status_rsvd; |
907 | | |
908 | | /* tracking Cmd and its respective CQE */ |
909 | | static int hf_nvme_cmd_pkt; |
910 | | static int hf_nvme_data_req; |
911 | | static int hf_nvme_data_tr[NVME_CMD_MAX_TRS]; |
912 | | static int hf_nvme_cqe_pkt; |
913 | | static int hf_nvme_cmd_latency; |
914 | | |
915 | | /* Data response fields */ |
916 | | static int hf_nvme_gen_data; |
917 | | /* Initialize the subtree pointers */ |
918 | | static int ett_data; |
919 | | |
920 | | static expert_field ei_nvme_cqe_status_error; |
921 | | static expert_field ei_nvme_lbaf_count_invalid; |
922 | | static expert_field ei_nvme_data_len_exceeds_frame; |
923 | | static expert_field ei_nvme_logpage_window_misaligned; |
924 | | static expert_field ei_nvme_eom_desc_truncated; |
925 | | |
926 | | /* NVME_AQ_OPC_* admin opcodes are defined in packet-nvme.h (shared with the |
927 | | * NVMe-MI Admin dissector). */ |
928 | | |
929 | 7 | #define NVME_IOQ_OPC_FLUSH 0x0 |
930 | 7 | #define NVME_IOQ_OPC_WRITE 0x1 |
931 | 7 | #define NVME_IOQ_OPC_READ 0x2 |
932 | 7 | #define NVME_IOQ_OPC_WRITE_UNCORRECTABLE 0x4 |
933 | 7 | #define NVME_IOQ_OPC_COMPARE 0x5 |
934 | 7 | #define NVME_IOQ_OPC_WRITE_ZEROS 0x8 |
935 | 7 | #define NVME_IOQ_OPC_DATASET_MGMT 0x9 |
936 | | #define NVME_IOQ_OPC_VERIFY 0xc |
937 | 7 | #define NVME_IOQ_OPC_RESV_REG 0xd |
938 | 7 | #define NVME_IOQ_OPC_RESV_REPORT 0xe |
939 | 7 | #define NVME_IOQ_OPC_RESV_ACQUIRE 0x11 |
940 | | #define NVME_IOQ_OPC_IO_MGMT_RECV 0x12 |
941 | 7 | #define NVME_IOQ_OPC_RESV_RELEASE 0x15 |
942 | | #define NVME_IOQ_OPC_CANCEL 0x18 |
943 | | #define NVME_IOQ_OPC_COPY 0x19 |
944 | | #define NVME_IOQ_OPC_IO_MGMT_SEND 0x1d |
945 | | |
946 | | /* NVME_IDENTIFY_CNS_* values are defined in packet-nvme.h. */ |
947 | | |
948 | | typedef enum { |
949 | | NVME_CQE_SCT_GENERIC = 0x0, |
950 | | NVME_CQE_SCT_COMMAND = 0x1, |
951 | | NVME_CQE_SCT_MEDIA = 0x2, |
952 | | NVME_CQE_SCT_PATH = 0x3, |
953 | | NVME_CQE_SCT_VENDOR = 0x7, |
954 | | } nvme_cqe_sct_t; |
955 | | |
956 | | typedef enum { |
957 | | NVME_CQE_SC_GEN_CMD_OK = 0x00, |
958 | | NVME_CQE_SC_CMD_INVALID_OPCODE = 0x01, |
959 | | NVME_CQE_SC_GEN_CMD_INVALID_FIELD = 0x02, |
960 | | NVME_CQE_SC_GEN_CMD_CID_CONFLICT = 0x03, |
961 | | NVME_CQE_SC_GEN_DATA_TRANSFER_ERR = 0x04, |
962 | | NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS = 0x05, |
963 | | NVME_CQE_SC_GEN_INTERNAL_ERROR = 0x06, |
964 | | NVME_CQE_SC_GEN_ABORT_REQUESTED = 0x07, |
965 | | NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE = 0x08, |
966 | | NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE = 0x09, |
967 | | NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE = 0x0A, |
968 | | NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT = 0x0B, |
969 | | NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR = 0x0C, |
970 | | NVME_CQE_SC_GEN_INVALID_SGL_SD = 0x0D, |
971 | | NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM = 0x0E, |
972 | | NVME_CQE_SC_GEN_INVALID_SGL_LEN = 0x0F, |
973 | | NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN = 0x10, |
974 | | NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE = 0x11, |
975 | | NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF = 0x12, |
976 | | NVME_CQE_SC_GEN_INVALID_PRP_OFFSET = 0x13, |
977 | | NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED = 0x14, |
978 | | NVME_CQE_SC_GEN_OPERATION_DENIED = 0x15, |
979 | | NVME_CQE_SC_GEN_INVALID_SGL_OFFSET = 0x16, |
980 | | NVME_CQE_SC_GEN_RESERVED_17H = 0x17, |
981 | | NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT = 0x18, |
982 | | NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED = 0x19, |
983 | | NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID = 0x1A, |
984 | | NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT = 0x1B, |
985 | | NVME_CQE_SC_GEN_SANITIZE_FAILED = 0x1C, |
986 | | NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS = 0x1D, |
987 | | NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID = 0x1E, |
988 | | NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB = 0x1F, |
989 | | NVME_CQE_SC_GEN_NAMESPACE_IS_WP = 0x20, |
990 | | NVME_CQE_SC_GEN_COMMAND_INTERRUPTED = 0x21, |
991 | | NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR = 0x22, |
992 | | NVME_CQE_SC_GEN_CMD_PROHIBITED_LOCKDOWN = 0x23, |
993 | | NVME_CQE_SC_GEN_ADMIN_CMD_MEDIA_NOT_READY = 0x24, |
994 | | NVME_CQE_SC_GEN_INVALID_KEY_TAG = 0x25, |
995 | | NVME_CQE_SC_GEN_HOST_DISP_NS_SUPP_NOT_ENABLED = 0x26, |
996 | | NVME_CQE_SC_GEN_HOST_ID_NOT_INITIALIZED = 0x27, |
997 | | NVME_CQE_SC_GEN_INCORRECT_KEY = 0x28, |
998 | | NVME_CQE_SC_GEN_FDP_DISABLED = 0x29, |
999 | | NVME_CQE_SC_GEN_INVALID_PLACEMENT_HANDLE_LIST = 0x2A, |
1000 | | NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_FAILED = 0x2B, |
1001 | | NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_IN_PROGRESS = 0x2C, |
1002 | | NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE = 0x80, |
1003 | | NVME_CQE_SC_GEN_CAPACITY_EXCEED = 0x81, |
1004 | | NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY = 0x82, |
1005 | | NVME_CQE_SC_GEN_RESERVATION_CONFLICT = 0x83, |
1006 | | NVME_CQE_SC_GEN_FMT_IN_PROGRESS = 0x84, |
1007 | | NVME_CQE_SC_GEN_INVALID_VALUE_SIZE = 0x85, |
1008 | | NVME_CQE_SC_GEN_INVALID_KEY_SIZE = 0x86, |
1009 | | NVME_CQE_SC_GEN_KV_KEY_DOES_NOT_EXIST = 0x87, |
1010 | | NVME_CQE_SC_GEN_UNRECOVERED_ERROR = 0x88, |
1011 | | NVME_CQE_SC_GEN_KEY_EXISTS = 0x89, |
1012 | | } nvme_cqe_sc_gen_t; |
1013 | | |
1014 | | typedef enum { |
1015 | | NVME_CQE_SC_CMD_INVALID_CQ = 0x00, |
1016 | | NVME_CQE_SC_CMD_INVALID_QID = 0x01, |
1017 | | NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE = 0x02, |
1018 | | NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED = 0x03, |
1019 | | NVME_CQE_SC_CMD_RESERVED_4H = 0x04, |
1020 | | NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED = 0x05, |
1021 | | NVME_CQE_SC_CMD_INVALID_FW_SLOT = 0x06, |
1022 | | NVME_CQE_SC_CMD_INVALID_FW_IMAGE = 0x07, |
1023 | | NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR = 0x08, |
1024 | | NVME_CQE_SC_CMD_INVALID_LOG_PAGE = 0x09, |
1025 | | NVME_CQE_SC_CMD_INVALID_FMT = 0x0A, |
1026 | | NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET = 0x0B, |
1027 | | NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE = 0x0C, |
1028 | | NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE = 0x0D, |
1029 | | NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE = 0x0E, |
1030 | | NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE = 0x0F, |
1031 | | NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET = 0x10, |
1032 | | NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET = 0x11, |
1033 | | NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME = 0x12, |
1034 | | NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED = 0x13, |
1035 | | NVME_CQE_SC_CMD_OVERLAPPING_RANGE = 0x14, |
1036 | | NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY = 0x15, |
1037 | | NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE = 0x16, |
1038 | | NVME_CQE_SC_CMD_RESERVED_17H = 0x17, |
1039 | | NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED = 0x18, |
1040 | | NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE = 0x19, |
1041 | | NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED = 0x1A, |
1042 | | NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP = 0x1B, |
1043 | | NVME_CQE_SC_CMD_INVALID_CNTRL_LIST = 0x1C, |
1044 | | NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS = 0x1D, |
1045 | | NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT = 0x1E, |
1046 | | NVME_CQE_SC_CMD_INVALID_CNTRL_ID = 0x1F, |
1047 | | NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE = 0x20, |
1048 | | NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM = 0x21, |
1049 | | NVME_CQE_SC_CMD_INVALID_RESOURSE_ID = 0x22, |
1050 | | NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR = 0x23, |
1051 | | NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID = 0x24, |
1052 | | NVME_CQE_SC_CMD_ANA_ATTACH_FAILED = 0x25, |
1053 | | NVME_CQE_SC_CMD_INSUFFICIENT_CAPACITY = 0x26, |
1054 | | NVME_CQE_SC_CMD_NS_ATTACHMENT_LIMIT_EXCEEDED = 0x27, |
1055 | | NVME_CQE_SC_CMD_PROHIBITION_NOT_SUPPORTED = 0x28, |
1056 | | NVME_CQE_SC_CMD_IO_CMD_SET_NOT_SUPPORTED = 0x29, |
1057 | | NVME_CQE_SC_CMD_IO_CMD_SET_NOT_ENABLED = 0x2A, |
1058 | | NVME_CQE_SC_CMD_IO_CMD_SET_COMBINATION_REJECTED = 0x2B, |
1059 | | NVME_CQE_SC_CMD_INVALID_IO_CMD_SET = 0x2C, |
1060 | | NVME_CQE_SC_CMD_IDENTIFIER_UNAVAILABLE = 0x2D, |
1061 | | NVME_CQE_SC_CMD_NAMESPACE_IS_DISPERSED = 0x2E, |
1062 | | NVME_CQE_SC_CMD_INVALID_DISCOVERY_INFO = 0x2F, |
1063 | | NVME_CQE_SC_CMD_ZONING_DS_LOCKED = 0x30, |
1064 | | NVME_CQE_SC_CMD_ZONING_DS_NOT_FOUND = 0x31, |
1065 | | NVME_CQE_SC_CMD_INSUFFICIENT_DISCOVERY_RES = 0x32, |
1066 | | NVME_CQE_SC_CMD_REQUESTED_FUNCTION_DISABLED = 0x33, |
1067 | | NVME_CQE_SC_CMD_ZONEGROUP_ORIGINATOR_INVALID = 0x34, |
1068 | | NVME_CQE_SC_CMD_INVALID_HOST = 0x35, |
1069 | | NVME_CQE_SC_CMD_INVALID_NVM_SUBSYSTEM = 0x36, |
1070 | | NVME_CQE_SC_CMD_INVALID_CTRL_DATA_QUEUE = 0x37, |
1071 | | NVME_CQE_SC_CMD_NOT_ENOUGH_RESOURCES = 0x38, |
1072 | | NVME_CQE_SC_CMD_CONTROLLER_SUSPENDED = 0x39, |
1073 | | NVME_CQE_SC_CMD_CONTROLLER_NOT_SUSPENDED = 0x3A, |
1074 | | NVME_CQE_SC_CMD_CTRL_DATA_QUEUE_FULL = 0x3B, |
1075 | | NVME_CQE_SC_CMD_EXCEEDS_MAX_NS_SANITIZE_OPS = 0x3C, |
1076 | | NVME_CQE_SC_CMD_MFG_DEFAULT_PERSONALITY_REQUIRED = 0x3D, |
1077 | | NVME_CQE_SC_CMD_INVALID_POWER_LIMIT = 0x3E, |
1078 | | NVME_CQE_SC_CMD_CROSS_CTRL_RESET_IN_PROGRESS = 0x3F, |
1079 | | NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LOG_PAGE_FULL = 0x40, |
1080 | | NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LIMIT_EXCEEDED = 0x41, |
1081 | | NVME_CQE_SC_CMD_CONFLICTING_ATTRS = 0x80, |
1082 | | NVME_CQE_SC_CMD_INVALID_PROTECTION_INF = 0x81, |
1083 | | NVME_CQE_SC_CMD_WRITE_TO_RO_REGION = 0x82, |
1084 | | NVME_CQE_SC_CMD_SIZE_LIMIT_EXCEEDED = 0x83, |
1085 | | NVME_CQE_SC_CMD_INVALID_COMMAND_ID = 0x84, |
1086 | | NVME_CQE_SC_CMD_INCOMPAT_NAMESPACE_OR_FMT = 0x85, |
1087 | | NVME_CQE_SC_CMD_FAST_COPY_NOT_POSSIBLE = 0x86, |
1088 | | NVME_CQE_SC_CMD_OVERLAPPING_IO_RANGE = 0x87, |
1089 | | NVME_CQE_SC_CMD_NAMESPACE_NOT_REACHABLE = 0x88, |
1090 | | NVME_CQE_SC_CMD_INSUFFICIENT_RESOURCES = 0x89, |
1091 | | NVME_CQE_SC_CMD_INSUFFICIENT_PROGRAM_RESOURCES = 0x8A, |
1092 | | NVME_CQE_SC_CMD_INVALID_MEMORY_NAMESPACE = 0x8B, |
1093 | | NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET = 0x8C, |
1094 | | NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET_ID = 0x8D, |
1095 | | NVME_CQE_SC_CMD_INVALID_PROGRAM_DATA = 0x8E, |
1096 | | NVME_CQE_SC_CMD_INVALID_PROGRAM_INDEX = 0x8F, |
1097 | | NVME_CQE_SC_CMD_INVALID_PROGRAM_TYPE = 0x90, |
1098 | | NVME_CQE_SC_CMD_MAX_MEMORY_RANGES_EXCEEDED = 0x91, |
1099 | | NVME_CQE_SC_CMD_MAX_MEMORY_RANGE_SETS_EXCEEDED = 0x92, |
1100 | | NVME_CQE_SC_CMD_MAX_PROGRAMS_ACTIVATED = 0x93, |
1101 | | NVME_CQE_SC_CMD_MAX_PROGRAM_BYTES_EXCEEDED = 0x94, |
1102 | | NVME_CQE_SC_CMD_MEMORY_RANGE_SET_IN_USE = 0x95, |
1103 | | NVME_CQE_SC_CMD_NO_PROGRAM = 0x96, |
1104 | | NVME_CQE_SC_CMD_OVERLAPPING_MEMORY_RANGES = 0x97, |
1105 | | NVME_CQE_SC_CMD_PROGRAM_NOT_ACTIVATED = 0x98, |
1106 | | NVME_CQE_SC_CMD_PROGRAM_IN_USE = 0x99, |
1107 | | NVME_CQE_SC_CMD_PROGRAM_INDEX_NOT_DOWNLOADABLE = 0x9A, |
1108 | | NVME_CQE_SC_CMD_PROGRAM_TOO_BIG = 0x9B, |
1109 | | NVME_CQE_SC_CMD_SUCCESSFUL_MEDIA_VERIFICATION_READ = 0x9C, |
1110 | | NVME_CQE_SC_CMD_ZONE_BOUNDARY_ERROR = 0xB8, |
1111 | | NVME_CQE_SC_CMD_ZONE_IS_FULL = 0xB9, |
1112 | | NVME_CQE_SC_CMD_ZONE_IS_READ_ONLY = 0xBA, |
1113 | | NVME_CQE_SC_CMD_ZONE_IS_OFFLINE = 0xBB, |
1114 | | NVME_CQE_SC_CMD_ZONE_INVALID_WRITE = 0xBC, |
1115 | | NVME_CQE_SC_CMD_TOO_MANY_ACTIVE_ZONES = 0xBD, |
1116 | | NVME_CQE_SC_CMD_TOO_MANY_OPEN_ZONES = 0xBE, |
1117 | | NVME_CQE_SC_CMD_INVALID_ZONE_STATE_TRANSITION = 0xBF, |
1118 | | } nvme_cqe_sc_cmd_t; |
1119 | | |
1120 | | typedef enum { |
1121 | | NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT = 0x80, |
1122 | | NVMEOF_CQE_SC_CMD_CONT_BUSY = 0x81, |
1123 | | NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS = 0x82, |
1124 | | NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC = 0x83, |
1125 | | NVMEOF_CQE_SC_CMD_CNCT_INV_HOST = 0x84, |
1126 | | NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE = 0x85, |
1127 | | NVMEOF_CQE_SC_CMD_DISC_RESTART = 0x90, |
1128 | | NVMEOF_CQE_SC_CMD_AUTH_REQ = 0x91, |
1129 | | } nvmeof_cqe_sc_cmd_t; |
1130 | | |
1131 | | typedef enum { |
1132 | | NVME_CQE_SC_MEDIA_WRITE_FAULT = 0x80, |
1133 | | NVME_CQE_SC_MEDIA_READ_FAULT = 0x81, |
1134 | | NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR = 0x82, |
1135 | | NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR = 0x83, |
1136 | | NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR = 0x84, |
1137 | | NVME_CQE_SC_MEDIA_COMPARE_FAILURE = 0x85, |
1138 | | NVME_CQE_SC_MEDIA_ACCESS_DENIED = 0x86, |
1139 | | NVME_CQE_SC_MEDIA_DEALLOCATED_LBA = 0x87, |
1140 | | NVME_CQE_SC_MEDIA_ETE_STORAGE_TAG_CHECK_ERR = 0x88, |
1141 | | } nvme_cqe_sc_media_t; |
1142 | | |
1143 | | typedef enum { |
1144 | | NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR = 0x00, |
1145 | | NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS = 0x01, |
1146 | | NVME_CQE_SC_PATH_ANA_INACCESSIBLE = 0x02, |
1147 | | NVME_CQE_SC_PATH_ANA_TRANSIENT = 0x03, |
1148 | | NVME_CQE_SC_PATH_CNTRL_PATH_ERROR = 0x60, |
1149 | | NVME_CQE_SC_PATH_HOST_PATH_ERROR = 0x70, |
1150 | | NVME_CQE_SC_PATH_CMD_ABORT = 0x71, |
1151 | | } nvme_cqe_sc_path_t; |
1152 | | |
1153 | | static const value_string nvme_cqe_sct_tbl[] = { |
1154 | | { NVME_CQE_SCT_GENERIC, "Generic Command Status" }, |
1155 | | { NVME_CQE_SCT_COMMAND, "Command Specific Status" }, |
1156 | | { NVME_CQE_SCT_MEDIA, "Media and Data Integrity Errors" }, |
1157 | | { NVME_CQE_SCT_PATH, "Path Related Status" }, |
1158 | | { NVME_CQE_SCT_VENDOR, "Vendor Specific" }, |
1159 | | { 0, NULL }, |
1160 | | }; |
1161 | | |
1162 | | static const value_string nvme_cqe_sc_gen_tbl[] = { |
1163 | | { NVME_CQE_SC_GEN_CMD_OK, "Successful Completion" }, |
1164 | | { NVME_CQE_SC_CMD_INVALID_OPCODE, "Invalid opcode field" }, |
1165 | | { NVME_CQE_SC_GEN_CMD_INVALID_FIELD, "Invalid Field in Command" }, |
1166 | | { NVME_CQE_SC_GEN_CMD_CID_CONFLICT, "Command ID Conflict" }, |
1167 | | { NVME_CQE_SC_GEN_DATA_TRANSFER_ERR, "Data Transfer Error" }, |
1168 | | { NVME_CQE_SC_GEN_ABORT_DUE_TO_POWER_LOSS, "Commands Aborted due to Power Loss Notification" }, |
1169 | | { NVME_CQE_SC_GEN_INTERNAL_ERROR, "Internal Error" }, |
1170 | | { NVME_CQE_SC_GEN_ABORT_REQUESTED, "Command Abort Requested" }, |
1171 | | { NVME_CQE_SC_GEN_ABORT_DUE_TO_SQ_DELETE, "Command Aborted due to SQ Deletion" }, |
1172 | | { NVME_CQE_SC_GEN_ABORT_DUE_TO_FAILED_FUSE, "Command Aborted due to Failed Fused Command" }, |
1173 | | { NVME_CQE_SC_GEN_ABORT_DUE_TO_MISSED_FUSE, "Command Aborted due to Missing Fused Command" }, |
1174 | | { NVME_CQE_SC_GEN_INVALID_NAMESPACE_OR_FMT, "Invalid Namespace or Format" }, |
1175 | | { NVME_CQE_SC_GEN_COMMAND_SEQUENCE_ERR, "Command Sequence Error" }, |
1176 | | { NVME_CQE_SC_GEN_INVALID_SGL_SD, "Invalid SGL Segment Descriptor" }, |
1177 | | { NVME_CQE_SC_GEN_INVALID_SGL_SD_NUM, "Invalid Number of SGL Descriptors" }, |
1178 | | { NVME_CQE_SC_GEN_INVALID_SGL_LEN, "Data SGL Length Invalid" }, |
1179 | | { NVME_CQE_SC_GEN_INVALID_MDATA_SGL_LEN, "Metadata SGL Length Invalid" }, |
1180 | | { NVME_CQE_SC_GEN_INVALID_SGL_SD_TYPE, "SGL Descriptor Type Invalid" }, |
1181 | | { NVME_CQE_SC_GEN_INVALID_USE_OF_MC_BUF, "Invalid Use of Controller Memory Buffer" }, |
1182 | | { NVME_CQE_SC_GEN_INVALID_PRP_OFFSET, "PRP Offset Invalid" }, |
1183 | | { NVME_CQE_SC_GEN_ATOMIC_WRITE_UNIT_EXCEED, "Atomic Write Unit Exceeded" }, |
1184 | | { NVME_CQE_SC_GEN_OPERATION_DENIED, "Operation Denied" }, |
1185 | | { NVME_CQE_SC_GEN_INVALID_SGL_OFFSET, "SGL Offset Invalid" }, |
1186 | | { NVME_CQE_SC_GEN_RESERVED_17H, "Reserved" }, |
1187 | | { NVME_CQE_SC_GEN_HOST_ID_INVALID_FMT, "Host Identifier Inconsistent Format" }, |
1188 | | { NVME_CQE_SC_GEN_KEEP_ALLIVE_EXPIRED, "Keep Alive Timer Expired" }, |
1189 | | { NVME_CQE_SC_GEN_KEEP_ALIVE_INVALID, "Keep Alive Timeout Invalid" }, |
1190 | | { NVME_CQE_SC_GEN_ABORT_DUE_TO_PREEMPT_ABRT, "Command Aborted due to Preempt and Abort" }, |
1191 | | { NVME_CQE_SC_GEN_SANITIZE_FAILED, "Sanitize Failed" }, |
1192 | | { NVME_CQE_SC_GEN_SANITZE_IN_PROGRESS,"Sanitize In Progress" }, |
1193 | | { NVME_CQE_SC_GEN_SGL_BLOCK_GRAN_INVALID, "SGL Data Block Granularity Invalid" }, |
1194 | | { NVME_CQE_SC_GEN_CMD_NOT_SUPP_IN_CMB, "Command Not Supported for Queue in CMB" }, |
1195 | | { NVME_CQE_SC_GEN_NAMESPACE_IS_WP, "Namespace is Write Protected" }, |
1196 | | { NVME_CQE_SC_GEN_COMMAND_INTERRUPTED,"Command Interrupted" }, |
1197 | | { NVME_CQE_SC_GEN_TRANSIENT_TRASPORT_ERROR, "Transient Transport Error"}, |
1198 | | { NVME_CQE_SC_GEN_CMD_PROHIBITED_LOCKDOWN, "Command Prohibited by Command and Feature Lockdown" }, |
1199 | | { NVME_CQE_SC_GEN_ADMIN_CMD_MEDIA_NOT_READY, "Admin Command Media Not Ready" }, |
1200 | | { NVME_CQE_SC_GEN_INVALID_KEY_TAG, "Invalid Key Tag" }, |
1201 | | { NVME_CQE_SC_GEN_HOST_DISP_NS_SUPP_NOT_ENABLED, "Host Dispersed Namespace Support Not Enabled" }, |
1202 | | { NVME_CQE_SC_GEN_HOST_ID_NOT_INITIALIZED, "Host Identifier Not Initialized" }, |
1203 | | { NVME_CQE_SC_GEN_INCORRECT_KEY, "Incorrect Key" }, |
1204 | | { NVME_CQE_SC_GEN_FDP_DISABLED, "FDP Disabled" }, |
1205 | | { NVME_CQE_SC_GEN_INVALID_PLACEMENT_HANDLE_LIST, "Invalid Placement Handle List" }, |
1206 | | { NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_FAILED, "Sanitize Namespace Failed" }, |
1207 | | { NVME_CQE_SC_GEN_SANITIZE_NAMESPACE_IN_PROGRESS, "Sanitize Namespace In Progress" }, |
1208 | | { NVME_CQE_SC_GEN_LBA_OUT_OF_RANGE, "LBA Out of Range" }, |
1209 | | { NVME_CQE_SC_GEN_CAPACITY_EXCEED, "Capacity Exceeded" }, |
1210 | | { NVME_CQE_SC_GEN_NAMESPACE_NOT_ERADY, "Namespace Not Ready" }, |
1211 | | { NVME_CQE_SC_GEN_RESERVATION_CONFLICT, "Reservation Conflict" }, |
1212 | | { NVME_CQE_SC_GEN_FMT_IN_PROGRESS, "Format In Progress"}, |
1213 | | { NVME_CQE_SC_GEN_INVALID_VALUE_SIZE, "Invalid Value Size" }, |
1214 | | { NVME_CQE_SC_GEN_INVALID_KEY_SIZE, "Invalid Key Size" }, |
1215 | | { NVME_CQE_SC_GEN_KV_KEY_DOES_NOT_EXIST, "KV Key Does Not Exist" }, |
1216 | | { NVME_CQE_SC_GEN_UNRECOVERED_ERROR, "Unrecovered Error" }, |
1217 | | { NVME_CQE_SC_GEN_KEY_EXISTS, "Key Exists" }, |
1218 | | { 0, NULL }, |
1219 | | }; |
1220 | | |
1221 | | static const value_string nvme_cqe_sc_cmd_tbl[] = { |
1222 | | { NVME_CQE_SC_CMD_INVALID_CQ, "Completion Queue Invalid" }, |
1223 | | { NVME_CQE_SC_CMD_INVALID_QID, "Invalid Queue Identifier" }, |
1224 | | { NVME_CQE_SC_CMD_INVALID_QUEUE_SIZE, "Invalid Queue Size" }, |
1225 | | { NVME_CQE_SC_CMD_ABORT_LIMIT_EXCEED, "Abort Command Limit Exceeded" }, |
1226 | | { NVME_CQE_SC_CMD_RESERVED_4H, "Reserved" }, |
1227 | | { NVME_CQE_SC_CMD_ASYNC_REQ_LIMIT_EXCEED, "Asynchronous Event Request Limit Exceeded" }, |
1228 | | { NVME_CQE_SC_CMD_INVALID_FW_SLOT, "Invalid Firmware Slot" }, |
1229 | | { NVME_CQE_SC_CMD_INVALID_FW_IMAGE, "Invalid Firmware Image" }, |
1230 | | { NVME_CQE_SC_CMD_INVALID_IRQ_VECTOR, "Invalid Interrupt Vector" }, |
1231 | | { NVME_CQE_SC_CMD_INVALID_LOG_PAGE, "Invalid Log Page" }, |
1232 | | { NVME_CQE_SC_CMD_INVALID_FMT, "Invalid Format" }, |
1233 | | { NVME_CQE_SC_CMD_FW_ACTIVATION_NEEDS_RESET, "Firmware Activation Requires Conventional Reset" }, |
1234 | | { NVME_CQE_SC_CMD_INVALID_QUEUE_DELETE, "Invalid Queue Deletion" }, |
1235 | | { NVME_CQE_SC_CMD_FEATURE_ID_NOT_SAVEABLE, "Feature Identifier Not Saveable" }, |
1236 | | { NVME_CQE_SC_CMD_FEATURE_NOT_CHANGEABLE, "Feature Not Changeable" }, |
1237 | | { NVME_CQE_SC_CMD_FEATURE_NOT_NAMESPACE, "Feature Not Namespace Specific" }, |
1238 | | { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_NVM_RESET, "Firmware Activation Requires NVM Subsystem Reset" }, |
1239 | | { NVME_CQE_SC_CMD_FEATURE_ACTIVATION_NEEDS_CNTRL_RESET, "Firmware Activation Requires Controller Level Reset" }, |
1240 | | { NVME_CQE_SC_CMD_FW_ACTIVATION_NEED_MAX_TIME, "Firmware Activation Requires Maximum Time Violation" }, |
1241 | | { NVME_CQE_SC_CMD_FW_ACTIVATION_PROHIBITED, "Firmware Activation Prohibited" }, |
1242 | | { NVME_CQE_SC_CMD_OVERLAPPING_RANGE, "Overlapping Range" }, |
1243 | | { NVME_CQE_SC_CMD_NAMESPACE_INSUF_CAPACITY, "Namespace Insufficient Capacity" }, |
1244 | | { NVME_CQE_SC_CMD_NAMESPACE_ID_NOT_AVAILABLE, "Namespace Identifier Unavailable" }, |
1245 | | { NVME_CQE_SC_CMD_RESERVED_17H, "Reserved" }, |
1246 | | { NVME_CQE_SC_CMD_NAMESPACE_ALREADY_ATATCHED, "Namespace Already Attached" }, |
1247 | | { NVME_CQE_SC_CMD_NAMESPACE_IS_PRIVATE, "Namespace Is Private" }, |
1248 | | { NVME_CQE_SC_CMD_NAMESPACE_NOT_ATTACHED, "Namespace Not Attached" }, |
1249 | | { NVME_CQE_SC_CMD_THIN_PROVISION_NOT_SUPP, "Thin Provisioning Not Supported" }, |
1250 | | { NVME_CQE_SC_CMD_INVALID_CNTRL_LIST, "Controller List Invalid" }, |
1251 | | { NVME_CQE_SC_CMD_SELF_TEST_IN_PROGRESS, "Device Self-test In Progress" }, |
1252 | | { NVME_CQE_SC_CMD_BOOT_PART_WRITE_PROHIBIT, "Boot Partition Write Prohibited" }, |
1253 | | { NVME_CQE_SC_CMD_INVALID_CNTRL_ID, "Invalid Controller Identifier" }, |
1254 | | { NVME_CQE_SC_CMD_INVALID_SECOND_CNTRL_STATE, "Invalid Secondary Controller State" }, |
1255 | | { NVME_CQE_SC_CMD_IBVALID_CNRL_RES_NUM, "Invalid Number of Controller Resources" }, |
1256 | | { NVME_CQE_SC_CMD_INVALID_RESOURSE_ID, "Invalid Resource Identifier" }, |
1257 | | { NVME_CQE_SC_CMD_SANITIZE_PROHIBIT_WITH_PMR, "Sanitize Prohibited While Persistent Memory Region is Enabled" }, |
1258 | | { NVME_CQE_SC_CMD_INVALID_ANA_GROUP_ID, "ANA Group Identifier Invalid" }, |
1259 | | { NVME_CQE_SC_CMD_ANA_ATTACH_FAILED, "ANA Attach Failed" }, |
1260 | | { NVME_CQE_SC_CMD_INSUFFICIENT_CAPACITY, "Insufficient Capacity" }, |
1261 | | { NVME_CQE_SC_CMD_NS_ATTACHMENT_LIMIT_EXCEEDED, "Namespace Attachment Limit Exceeded" }, |
1262 | | { NVME_CQE_SC_CMD_PROHIBITION_NOT_SUPPORTED, "Prohibition of Command Execution Not Supported" }, |
1263 | | { NVME_CQE_SC_CMD_IO_CMD_SET_NOT_SUPPORTED, "I/O Command Set Not Supported" }, |
1264 | | { NVME_CQE_SC_CMD_IO_CMD_SET_NOT_ENABLED, "I/O Command Set Not Enabled" }, |
1265 | | { NVME_CQE_SC_CMD_IO_CMD_SET_COMBINATION_REJECTED, "I/O Command Set Combination Rejected" }, |
1266 | | { NVME_CQE_SC_CMD_INVALID_IO_CMD_SET, "Invalid I/O Command Set" }, |
1267 | | { NVME_CQE_SC_CMD_IDENTIFIER_UNAVAILABLE, "Identifier Unavailable" }, |
1268 | | { NVME_CQE_SC_CMD_NAMESPACE_IS_DISPERSED, "Namespace Is Dispersed" }, |
1269 | | { NVME_CQE_SC_CMD_INVALID_DISCOVERY_INFO, "Invalid Discovery Information" }, |
1270 | | { NVME_CQE_SC_CMD_ZONING_DS_LOCKED, "Zoning Data Structure Locked" }, |
1271 | | { NVME_CQE_SC_CMD_ZONING_DS_NOT_FOUND, "Zoning Data Structure Not Found" }, |
1272 | | { NVME_CQE_SC_CMD_INSUFFICIENT_DISCOVERY_RES, "Insufficient Discovery Resources" }, |
1273 | | { NVME_CQE_SC_CMD_REQUESTED_FUNCTION_DISABLED, "Requested Function Disabled" }, |
1274 | | { NVME_CQE_SC_CMD_ZONEGROUP_ORIGINATOR_INVALID, "ZoneGroup Originator Invalid" }, |
1275 | | { NVME_CQE_SC_CMD_INVALID_HOST, "Invalid Host" }, |
1276 | | { NVME_CQE_SC_CMD_INVALID_NVM_SUBSYSTEM, "Invalid NVM Subsystem" }, |
1277 | | { NVME_CQE_SC_CMD_INVALID_CTRL_DATA_QUEUE, "Invalid Controller Data Queue" }, |
1278 | | { NVME_CQE_SC_CMD_NOT_ENOUGH_RESOURCES, "Not Enough Resources" }, |
1279 | | { NVME_CQE_SC_CMD_CONTROLLER_SUSPENDED, "Controller Suspended" }, |
1280 | | { NVME_CQE_SC_CMD_CONTROLLER_NOT_SUSPENDED, "Controller Not Suspended" }, |
1281 | | { NVME_CQE_SC_CMD_CTRL_DATA_QUEUE_FULL, "Controller Data Queue Full" }, |
1282 | | { NVME_CQE_SC_CMD_EXCEEDS_MAX_NS_SANITIZE_OPS, "Request Exceeds Maximum Namespace Sanitize Operations In Progress" }, |
1283 | | { NVME_CQE_SC_CMD_MFG_DEFAULT_PERSONALITY_REQUIRED, "Manufacturing Default Personality Required" }, |
1284 | | { NVME_CQE_SC_CMD_INVALID_POWER_LIMIT, "Invalid Power Limit" }, |
1285 | | { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_IN_PROGRESS, "Cross-Controller Reset in Progress" }, |
1286 | | { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LOG_PAGE_FULL, "Cross-Controller Reset Log Page Full" }, |
1287 | | { NVME_CQE_SC_CMD_CROSS_CTRL_RESET_LIMIT_EXCEEDED, "Cross-Controller Reset Limit Exceeded" }, |
1288 | | { NVME_CQE_SC_CMD_CONFLICTING_ATTRS, "Conflicting Attributes" }, |
1289 | | { NVME_CQE_SC_CMD_INVALID_PROTECTION_INF, "Invalid Protection Information" }, |
1290 | | { NVME_CQE_SC_CMD_WRITE_TO_RO_REGION, "Attempted Write to Read Only Range" }, |
1291 | | { NVME_CQE_SC_CMD_SIZE_LIMIT_EXCEEDED, "Command Size Limit Exceeded" }, |
1292 | | { NVME_CQE_SC_CMD_INVALID_COMMAND_ID, "Invalid Command ID" }, |
1293 | | { NVME_CQE_SC_CMD_INCOMPAT_NAMESPACE_OR_FMT, "Incompatible Namespace or Format" }, |
1294 | | { NVME_CQE_SC_CMD_FAST_COPY_NOT_POSSIBLE, "Fast Copy Not Possible" }, |
1295 | | { NVME_CQE_SC_CMD_OVERLAPPING_IO_RANGE, "Overlapping I/O Range" }, |
1296 | | { NVME_CQE_SC_CMD_NAMESPACE_NOT_REACHABLE, "Namespace Not Reachable" }, |
1297 | | { NVME_CQE_SC_CMD_INSUFFICIENT_RESOURCES, "Insufficient Resources" }, |
1298 | | { NVME_CQE_SC_CMD_INSUFFICIENT_PROGRAM_RESOURCES, "Insufficient Program Resources" }, |
1299 | | { NVME_CQE_SC_CMD_INVALID_MEMORY_NAMESPACE, "Invalid Memory Namespace" }, |
1300 | | { NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET, "Invalid Memory Range Set" }, |
1301 | | { NVME_CQE_SC_CMD_INVALID_MEMORY_RANGE_SET_ID, "Invalid Memory Range Set Identifier" }, |
1302 | | { NVME_CQE_SC_CMD_INVALID_PROGRAM_DATA, "Invalid Program Data" }, |
1303 | | { NVME_CQE_SC_CMD_INVALID_PROGRAM_INDEX, "Invalid Program Index" }, |
1304 | | { NVME_CQE_SC_CMD_INVALID_PROGRAM_TYPE, "Invalid Program Type" }, |
1305 | | { NVME_CQE_SC_CMD_MAX_MEMORY_RANGES_EXCEEDED, "Maximum Memory Ranges Exceeded" }, |
1306 | | { NVME_CQE_SC_CMD_MAX_MEMORY_RANGE_SETS_EXCEEDED, "Maximum Memory Range Sets Exceeded" }, |
1307 | | { NVME_CQE_SC_CMD_MAX_PROGRAMS_ACTIVATED, "Maximum Programs Activated" }, |
1308 | | { NVME_CQE_SC_CMD_MAX_PROGRAM_BYTES_EXCEEDED, "Maximum Program Bytes Exceeded" }, |
1309 | | { NVME_CQE_SC_CMD_MEMORY_RANGE_SET_IN_USE, "Memory Range Set In Use" }, |
1310 | | { NVME_CQE_SC_CMD_NO_PROGRAM, "No Program" }, |
1311 | | { NVME_CQE_SC_CMD_OVERLAPPING_MEMORY_RANGES, "Overlapping Memory Ranges" }, |
1312 | | { NVME_CQE_SC_CMD_PROGRAM_NOT_ACTIVATED, "Program Not Activated" }, |
1313 | | { NVME_CQE_SC_CMD_PROGRAM_IN_USE, "Program In Use" }, |
1314 | | { NVME_CQE_SC_CMD_PROGRAM_INDEX_NOT_DOWNLOADABLE, "Program Index Not Downloadable" }, |
1315 | | { NVME_CQE_SC_CMD_PROGRAM_TOO_BIG, "Program Too Big" }, |
1316 | | { NVME_CQE_SC_CMD_SUCCESSFUL_MEDIA_VERIFICATION_READ, "Successful Media Verification Read" }, |
1317 | | { NVME_CQE_SC_CMD_ZONE_BOUNDARY_ERROR, "Zoned Boundary Error" }, |
1318 | | { NVME_CQE_SC_CMD_ZONE_IS_FULL, "Zone Is Full" }, |
1319 | | { NVME_CQE_SC_CMD_ZONE_IS_READ_ONLY, "Zone Is Read Only" }, |
1320 | | { NVME_CQE_SC_CMD_ZONE_IS_OFFLINE, "Zone Is Offline" }, |
1321 | | { NVME_CQE_SC_CMD_ZONE_INVALID_WRITE, "Zone Invalid Write" }, |
1322 | | { NVME_CQE_SC_CMD_TOO_MANY_ACTIVE_ZONES, "Too Many Active Zones" }, |
1323 | | { NVME_CQE_SC_CMD_TOO_MANY_OPEN_ZONES, "Too Many Open Zones" }, |
1324 | | { NVME_CQE_SC_CMD_INVALID_ZONE_STATE_TRANSITION, "Invalid Zone State Transition" }, |
1325 | | { 0, NULL }, |
1326 | | }; |
1327 | | |
1328 | | static const value_string nvmeof_cqe_sc_cmd_tbl[] = { |
1329 | | { NVMEOF_CQE_SC_CMD_INCOMPAT_FORMAT, "Incompatible Format" }, |
1330 | | { NVMEOF_CQE_SC_CMD_CONT_BUSY, "Controller Busy" }, |
1331 | | { NVMEOF_CQE_SC_CMD_CNCT_INV_PARAMS, "Connect Invalid Parameters" }, |
1332 | | { NVMEOF_CQE_SC_CMD_CNCT_RESTART_DISC, "Connect Restart Discovery" }, |
1333 | | { NVMEOF_CQE_SC_CMD_CNCT_INV_HOST, "Connect Invalid Host" }, |
1334 | | { NVMEOF_CQE_SC_CMD_INV_QUEUE_TYPE, "Invalid Queue Type" }, |
1335 | | { NVMEOF_CQE_SC_CMD_DISC_RESTART, "Discover Restart" }, |
1336 | | { NVMEOF_CQE_SC_CMD_AUTH_REQ, "Authentication Required" }, |
1337 | | { 0, NULL }, |
1338 | | }; |
1339 | | |
1340 | | static const value_string nvme_cqe_sc_media_tbl[] = { |
1341 | | { NVME_CQE_SC_MEDIA_WRITE_FAULT, "Write Fault" }, |
1342 | | { NVME_CQE_SC_MEDIA_READ_FAULT, "Unrecovered Read Error" }, |
1343 | | { NVME_CQE_SC_MEDIA_ETE_GUARD_CHECK_ERR, "End-to-end Guard Check Error" }, |
1344 | | { NVME_CQE_SC_MEDIA_ETE_APPTAG_CHECK_ERR, "End-to-end Application Tag Check Error" }, |
1345 | | { NVME_CQE_SC_MEDIA_ETE_REFTAG_CHECK_ERR, "End-to-end Reference Tag Check Error" }, |
1346 | | { NVME_CQE_SC_MEDIA_COMPARE_FAILURE, "Compare Failure" }, |
1347 | | { NVME_CQE_SC_MEDIA_ACCESS_DENIED, "Access Denied" }, |
1348 | | { NVME_CQE_SC_MEDIA_DEALLOCATED_LBA, "Deallocated or Unwritten Logical Block" }, |
1349 | | { NVME_CQE_SC_MEDIA_ETE_STORAGE_TAG_CHECK_ERR, "End-to-End Storage Tag Check Error" }, |
1350 | | { 0, NULL }, |
1351 | | }; |
1352 | | |
1353 | | static const value_string nvme_cqe_sc_path_tbl[] = { |
1354 | | { NVME_CQE_SC_PATH_INTERNAL_PATH_ERROR, "Internal Path Error" }, |
1355 | | { NVME_CQE_SC_PATH_ANA_PERSISTENT_LOSS, "Asymmetric Access Persistent Loss" }, |
1356 | | { NVME_CQE_SC_PATH_ANA_INACCESSIBLE, "Asymmetric Access Inaccessible" }, |
1357 | | { NVME_CQE_SC_PATH_ANA_TRANSIENT, "Asymmetric Access Transition" }, |
1358 | | { NVME_CQE_SC_PATH_CNTRL_PATH_ERROR, "Controller Pathing Error" }, |
1359 | | { NVME_CQE_SC_PATH_HOST_PATH_ERROR, "Host Pathing Error" }, |
1360 | | { NVME_CQE_SC_PATH_CMD_ABORT, "Command Aborted By Host" }, |
1361 | | { 0, NULL }, |
1362 | | }; |
1363 | | |
1364 | | static const value_string aq_opc_tbl[] = { |
1365 | | { NVME_AQ_OPC_DELETE_SQ, "Delete SQ"}, |
1366 | | { NVME_AQ_OPC_CREATE_SQ, "Create SQ"}, |
1367 | | { NVME_AQ_OPC_GET_LOG_PAGE, "Get Log Page"}, |
1368 | | { NVME_AQ_OPC_DELETE_CQ, "Delete CQ"}, |
1369 | | { NVME_AQ_OPC_CREATE_CQ, "Create CQ"}, |
1370 | | { NVME_AQ_OPC_IDENTIFY, "Identify"}, |
1371 | | { NVME_AQ_OPC_ABORT, "Abort"}, |
1372 | | { NVME_AQ_OPC_SET_FEATURES, "Set Features"}, |
1373 | | { NVME_AQ_OPC_GET_FEATURES, "Get Features"}, |
1374 | | { NVME_AQ_OPC_ASYNC_EVE_REQ, "Async Event Request"}, |
1375 | | { NVME_AQ_OPC_NS_MGMT, "Namespace Management"}, |
1376 | | { NVME_AQ_OPC_FW_COMMIT, "Firmware Commit"}, |
1377 | | { NVME_AQ_OPC_FW_IMG_DOWNLOAD, "Firmware Image Download"}, |
1378 | | { NVME_AQ_OPC_SELF_TEST, "Device Self-test"}, |
1379 | | { NVME_AQ_OPC_NS_ATTACH, "Namespace attach"}, |
1380 | | { NVME_AQ_OPC_KEEP_ALIVE, "Keep Alive"}, |
1381 | | { NVME_AQ_OPC_DIRECTIVE_SEND, "Directive Send"}, |
1382 | | { NVME_AQ_OPC_DIRECTIVE_RECV, "Directive Receive"}, |
1383 | | { NVME_AQ_OPC_VIRT_MGMT, "Virtualization Management"}, |
1384 | | { NVME_AQ_OPC_MI_SEND, "NVMe-MI Send"}, |
1385 | | { NVME_AQ_OPC_MI_RECV, "NVMe-MI Receive"}, |
1386 | | { NVME_AQ_OPC_CAP_MGMT, "Capacity Management"}, |
1387 | | { NVME_AQ_OPC_DISC_INFO_MGMT, "Discovery Information Management"}, |
1388 | | { NVME_AQ_OPC_FABRIC_ZONING_RECV, "Fabric Zoning Receive"}, |
1389 | | { NVME_AQ_OPC_LOCKDOWN, "Lockdown"}, |
1390 | | { NVME_AQ_OPC_FABRIC_ZONING_LOOKUP, "Fabric Zoning Lookup"}, |
1391 | | { NVME_AQ_OPC_CLEAR_EXP_NVM_CFG, "Clear Exported NVM Resource Configuration"}, |
1392 | | { NVME_AQ_OPC_FABRIC_ZONING_SEND, "Fabric Zoning Send"}, |
1393 | | { NVME_AQ_OPC_CREATE_EXP_NVM_SUBSYS, "Create Exported NVM Subsystem"}, |
1394 | | { NVME_AQ_OPC_MANAGE_EXP_NVM_SUBSYS, "Manage Exported NVM Subsystem"}, |
1395 | | { NVME_AQ_OPC_MANAGE_EXP_NS, "Manage Exported Namespace"}, |
1396 | | { NVME_AQ_OPC_MANAGE_EXP_PORT, "Manage Exported Port"}, |
1397 | | { NVME_AQ_OPC_CROSS_CTRL_RESET, "Cross-Controller Reset"}, |
1398 | | { NVME_AQ_OPC_SEND_DISC_LOG_PAGE, "Send Discovery Log Page"}, |
1399 | | { NVME_AQ_OPC_TRACK_SEND, "Track Send"}, |
1400 | | { NVME_AQ_OPC_TRACK_RECV, "Track Receive"}, |
1401 | | { NVME_AQ_OPC_MIGRATION_SEND, "Migration Send"}, |
1402 | | { NVME_AQ_OPC_MIGRATION_RECV, "Migration Receive"}, |
1403 | | { NVME_AQ_OPC_CTRL_DATA_QUEUE, "Controller Data Queue"}, |
1404 | | { NVME_AQ_OPC_DBBUF_CONFIG, "Doorbell Buffer Config"}, |
1405 | | { NVME_AQ_OPC_FORMAT_NVM, "Format NVM"}, |
1406 | | { NVME_AQ_OPC_SECURITY_SEND, "Security Send"}, |
1407 | | { NVME_AQ_OPC_SECURITY_RECV, "Security Receive"}, |
1408 | | { NVME_AQ_OPC_SANITIZE, "Sanitize"}, |
1409 | | { NVME_AQ_OPC_LOAD_PROGRAM, "Load Program"}, |
1410 | | { NVME_AQ_OPC_GET_LBA_STATUS, "Get LBA Status"}, |
1411 | | { NVME_AQ_OPC_PROG_ACTIVATION_MGMT, "Program Activation Management"}, |
1412 | | { NVME_AQ_OPC_MEM_RANGE_SET_MGMT, "Memory Range Set Management"}, |
1413 | | { NVME_AQ_OPC_SANITIZE_NS, "Sanitize Namespace"}, |
1414 | | { NVME_FABRIC_OPC, "Fabrics Commands"}, |
1415 | | { 0, NULL} |
1416 | | }; |
1417 | | |
1418 | | static const value_string ioq_opc_tbl[] = { |
1419 | | { NVME_IOQ_OPC_FLUSH, "Flush"}, |
1420 | | { NVME_IOQ_OPC_WRITE, "Write"}, |
1421 | | { NVME_IOQ_OPC_READ, "Read"}, |
1422 | | { NVME_IOQ_OPC_WRITE_UNCORRECTABLE, "Write Uncorrectable"}, |
1423 | | { NVME_IOQ_OPC_COMPARE, "Compare"}, |
1424 | | { NVME_IOQ_OPC_WRITE_ZEROS, "Write Zeroes"}, |
1425 | | { NVME_IOQ_OPC_DATASET_MGMT, "Dataset Management"}, |
1426 | | { NVME_IOQ_OPC_VERIFY, "Verify"}, |
1427 | | { NVME_IOQ_OPC_RESV_REG, "Reservation Register"}, |
1428 | | { NVME_IOQ_OPC_RESV_REPORT, "Reservation Report"}, |
1429 | | { NVME_IOQ_OPC_RESV_ACQUIRE, "Reservation Acquire"}, |
1430 | | { NVME_IOQ_OPC_IO_MGMT_RECV, "I/O Management Receive"}, |
1431 | | { NVME_IOQ_OPC_RESV_RELEASE, "Reservation Release"}, |
1432 | | { NVME_IOQ_OPC_CANCEL, "Cancel"}, |
1433 | | { NVME_IOQ_OPC_COPY, "Copy"}, |
1434 | | { NVME_IOQ_OPC_IO_MGMT_SEND, "I/O Management Send"}, |
1435 | | { 0, NULL} |
1436 | | }; |
1437 | | |
1438 | | /* aq_opc_tbl/ioq_opc_tbl only cover the assigned opcode space; C0h-FFh |
1439 | | * (Admin, NVM CS 1.2 Fig 21) and 80h-FFh (I/O, NVM CS 1.2 Fig 21) are |
1440 | | * Vendor Specific, not Reserved -- special-case them the same way |
1441 | | * get_logpage_name() does for the logpage table. */ |
1442 | | static const char *get_aq_opcode_name(uint8_t opcode) |
1443 | 25 | { |
1444 | 25 | if (opcode >= 0xC0) |
1445 | 0 | return "Vendor Specific"; |
1446 | 25 | return val_to_str_const(opcode, aq_opc_tbl, "Reserved"); |
1447 | 25 | } |
1448 | | |
1449 | | static const char *get_ioq_opcode_name(uint8_t opcode) |
1450 | 0 | { |
1451 | 0 | if (opcode >= 0x80) |
1452 | 0 | return "Vendor Specific"; |
1453 | 0 | return val_to_str_const(opcode, ioq_opc_tbl, "Reserved"); |
1454 | 0 | } |
1455 | | |
1456 | 1 | #define NVME_CMD_SGL_DATA_DESC 0x0 |
1457 | 1 | #define NVME_CMD_SGL_BIT_BUCKET_DESC 0x1 |
1458 | 3 | #define NVME_CMD_SGL_SEGMENT_DESC 0x2 |
1459 | 2 | #define NVME_CMD_SGL_LAST_SEGMENT_DESC 0x3 |
1460 | 1 | #define NVME_CMD_SGL_KEYED_DATA_DESC 0x4 |
1461 | | #define NVME_CMD_SGL_TRANSPORT_DESC 0x5 |
1462 | 0 | #define NVME_CMD_SGL_VENDOR_DESC 0xf |
1463 | | |
1464 | | static const value_string sgl_type_tbl[] = { |
1465 | | { NVME_CMD_SGL_DATA_DESC, "Data Block"}, |
1466 | | { NVME_CMD_SGL_BIT_BUCKET_DESC, "Bit Bucket"}, |
1467 | | { NVME_CMD_SGL_SEGMENT_DESC, "Segment"}, |
1468 | | { NVME_CMD_SGL_LAST_SEGMENT_DESC, "Last Segment"}, |
1469 | | { NVME_CMD_SGL_KEYED_DATA_DESC, "Keyed Data Block"}, |
1470 | | { NVME_CMD_SGL_TRANSPORT_DESC, "Transport SGL Data Block descriptor"}, |
1471 | | { NVME_CMD_SGL_VENDOR_DESC, "Vendor Specific"}, |
1472 | | { 0, NULL} |
1473 | | }; |
1474 | | |
1475 | | #define NVME_CMD_SGL_SUB_DESC_ADDR 0x0 |
1476 | | #define NVME_CMD_SGL_SUB_DESC_OFFSET 0x1 |
1477 | | #define NVME_CMD_SGL_SUB_DESC_TRANSPORT 0xf |
1478 | | |
1479 | | static const value_string sgl_sub_type_tbl[] = { |
1480 | | { NVME_CMD_SGL_SUB_DESC_ADDR, "Address"}, |
1481 | | { NVME_CMD_SGL_SUB_DESC_OFFSET, "Offset"}, |
1482 | | { 0xa, "NVMe Transport Specific"}, |
1483 | | { 0xb, "NVMe Transport Specific"}, |
1484 | | { 0xc, "NVMe Transport Specific"}, |
1485 | | { 0xd, "NVMe Transport Specific"}, |
1486 | | { 0xe, "NVMe Transport Specific"}, |
1487 | | { NVME_CMD_SGL_SUB_DESC_TRANSPORT, "Transport specific"}, |
1488 | | { 0, NULL} |
1489 | | }; |
1490 | | |
1491 | | |
1492 | | static const value_string cns_table[] = { |
1493 | | { 0, "Namespace"}, |
1494 | | { 1, "Controller"}, |
1495 | | { 2, "Active Namespace List"}, |
1496 | | { 3, "Namespace Identification Descriptor"}, |
1497 | | {4, "NVM Set List"}, |
1498 | | {0x5, "I/O Command Set Specific Namespace"}, |
1499 | | {0x6, "I/O Command Set Specific Controller"}, |
1500 | | {0x7, "I/O Command Set Specific Active Namespace List"}, |
1501 | | {0x8, "I/O Command Set Independent Namespace"}, |
1502 | | {0x9, "NVM Command Set Namespace (Format Index)"}, |
1503 | | {0xa, "I/O Command Set Specific Namespace (Format Index)"}, |
1504 | | {0x10, "Allocated Namespace ID List"}, |
1505 | | {0x11, "Namespace Data Structure"}, |
1506 | | {0x12, "Controller List Attached to NSID"}, |
1507 | | {0x13, "Existing Controllers List"}, |
1508 | | {0x14, "Primary Controller Capabilities"}, |
1509 | | {0x15, "Secondary Controller List"}, |
1510 | | {0x16, "Namespace Granularity List"}, |
1511 | | {0x17, "UUID List"}, |
1512 | | {0x18, "Domain List"}, |
1513 | | {0x19, "Endurance Group List"}, |
1514 | | {0x1a, "I/O Command Set Specific Allocated Namespace ID List"}, |
1515 | | {0x1b, "I/O Command Set Specific Namespace (Allocated NSID)"}, |
1516 | | {0x1c, "I/O Command Set Data Structure"}, |
1517 | | {0x1d, "Get Underlying Namespace List"}, |
1518 | | {0x1e, "Get Ports List"}, |
1519 | | {0x1f, "I/O Command Set Independent Namespace (Allocated NSID)"}, |
1520 | | {0x20, "Supported Controller State Formats"}, |
1521 | | {0, NULL} |
1522 | | }; |
1523 | | |
1524 | | /* Namespace Identifier Type (NIDT), NVMe Base 2.3 "Identify – Namespace |
1525 | | * Identification Descriptor". */ |
1526 | | static const value_string nidt_tbl[] = { |
1527 | | { 0x1, "IEEE Extended Unique Identifier (EUI64)" }, |
1528 | | { 0x2, "Namespace Globally Unique Identifier (NGUID)" }, |
1529 | | { 0x3, "Namespace UUID" }, |
1530 | | { 0x4, "Command Set Identifier (CSI)" }, |
1531 | | { 0, NULL } |
1532 | | }; |
1533 | | |
1534 | | /* UUID List Entry Identifier Association (IDASSOC), NVMe Base 2.3 "UUID |
1535 | | * List Entry". */ |
1536 | | static const value_string uuid_idassoc_tbl[] = { |
1537 | | { 0x0, "No association reported" }, |
1538 | | { 0x1, "Associated with PCI Vendor ID" }, |
1539 | | { 0x2, "Associated with PCI Subsystem Vendor ID" }, |
1540 | | { 0x3, "Reserved" }, |
1541 | | { 0, NULL } |
1542 | | }; |
1543 | | |
1544 | | static const value_string dsm_acc_freq_tbl[] = { |
1545 | | { 0, "No frequency"}, |
1546 | | { 1, "Typical"}, |
1547 | | { 2, "Infrequent Read/Write"}, |
1548 | | { 3, "Infrequent Writes, Frequent Reads"}, |
1549 | | { 4, "Frequent Writes, Infrequent Reads"}, |
1550 | | { 5, "Frequent Read/Write"}, |
1551 | | { 6, "One time read"}, |
1552 | | { 7, "Speculative read"}, |
1553 | | { 8, "Likely tobe overwritten"}, |
1554 | | { 0, NULL} |
1555 | | }; |
1556 | | |
1557 | | static const value_string dsm_acc_lat_tbl[] = { |
1558 | | { 0, "None"}, |
1559 | | { 1, "Idle (Longer)"}, |
1560 | | { 2, "Normal (Typical)"}, |
1561 | | { 3, "Low (Smallest)"}, |
1562 | | { 0, NULL} |
1563 | | }; |
1564 | | |
1565 | | |
1566 | | void |
1567 | | nvme_publish_qid(proto_tree *tree, int field_index, uint16_t qid) |
1568 | 0 | { |
1569 | 0 | proto_item *cmd_ref_item; |
1570 | |
|
1571 | 0 | cmd_ref_item = proto_tree_add_uint_format_value(tree, field_index, NULL, |
1572 | 0 | 0, 0, qid, |
1573 | 0 | qid ? "%d (IOQ)" : "%d (AQ)", |
1574 | 0 | qid); |
1575 | |
|
1576 | 0 | proto_item_set_generated(cmd_ref_item); |
1577 | 0 | } |
1578 | | |
1579 | | static void nvme_build_pending_cmd_key(wmem_tree_key_t *cmd_key, uint32_t *key) |
1580 | 7 | { |
1581 | 7 | cmd_key[0].length = 1; |
1582 | 7 | cmd_key[0].key = key; |
1583 | 7 | cmd_key[1].length = 0; |
1584 | 7 | cmd_key[1].key = NULL; |
1585 | 7 | } |
1586 | | |
1587 | | static void |
1588 | | nvme_build_done_frame_key(wmem_tree_key_t *cmd_key, uint32_t *key, uint32_t *frame) |
1589 | 0 | { |
1590 | 0 | unsigned idx = 0; |
1591 | 0 | if (key) { |
1592 | 0 | cmd_key[0].length = 1; |
1593 | 0 | cmd_key[0].key = key; |
1594 | 0 | idx = 1; |
1595 | 0 | } |
1596 | 0 | cmd_key[idx].length = 1; |
1597 | 0 | cmd_key[idx].key = frame; |
1598 | 0 | idx++; |
1599 | |
|
1600 | 0 | cmd_key[idx].length = 0; |
1601 | 0 | cmd_key[idx].key = NULL; |
1602 | 0 | } |
1603 | | |
1604 | | void |
1605 | | nvme_add_cmd_to_pending_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx, |
1606 | | struct nvme_cmd_ctx *cmd_ctx, |
1607 | | void *ctx, uint16_t cmd_id) |
1608 | 7 | { |
1609 | 7 | wmem_tree_key_t cmd_key[3]; |
1610 | 7 | uint32_t key = cmd_id; |
1611 | | |
1612 | 7 | cmd_ctx->cmd_pkt_num = pinfo->num; |
1613 | 7 | cmd_ctx->cqe_pkt_num = 0; |
1614 | 7 | cmd_ctx->cmd_start_time = pinfo->abs_ts; |
1615 | 7 | nstime_set_zero(&cmd_ctx->cmd_end_time); |
1616 | | |
1617 | | /* this is a new cmd, create a new command context and map it to the |
1618 | | unmatched table |
1619 | | */ |
1620 | 7 | nvme_build_pending_cmd_key(cmd_key, &key); |
1621 | 7 | wmem_tree_insert32_array(q_ctx->pending_cmds, cmd_key, (void *)ctx); |
1622 | 7 | } |
1623 | | |
1624 | | void* nvme_lookup_cmd_in_pending_list(struct nvme_q_ctx *q_ctx, uint16_t cmd_id) |
1625 | 0 | { |
1626 | 0 | wmem_tree_key_t cmd_key[3]; |
1627 | 0 | uint32_t key = cmd_id; |
1628 | |
|
1629 | 0 | nvme_build_pending_cmd_key(cmd_key, &key); |
1630 | 0 | return wmem_tree_lookup32_array(q_ctx->pending_cmds, cmd_key); |
1631 | 0 | } |
1632 | | |
1633 | | |
1634 | | static void nvme_build_pending_transfer_key(wmem_tree_key_t *key, struct keyed_data_req *req) |
1635 | 0 | { |
1636 | 0 | key[0].length = 2; |
1637 | 0 | key[0].key = (uint32_t *)&req->addr; |
1638 | 0 | key[1].length = 1; |
1639 | 0 | key[1].key = &req->key; |
1640 | 0 | key[2].length = 1; |
1641 | 0 | key[2].key = &req->size; |
1642 | 0 | key[3].length = 0; |
1643 | 0 | key[3].key = NULL; |
1644 | 0 | } |
1645 | | |
1646 | | void nvme_add_data_request(struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, |
1647 | | struct keyed_data_req *req) |
1648 | 0 | { |
1649 | 0 | wmem_tree_key_t tr_key[4]; |
1650 | |
|
1651 | 0 | memset(cmd_ctx->data_tr_pkt_num, 0, sizeof(cmd_ctx->data_tr_pkt_num)); |
1652 | 0 | nvme_build_pending_transfer_key(tr_key, req); |
1653 | 0 | wmem_tree_insert32_array(q_ctx->data_requests, tr_key, (void *)cmd_ctx); |
1654 | 0 | } |
1655 | | |
1656 | | struct nvme_cmd_ctx* nvme_lookup_data_request(struct nvme_q_ctx *q_ctx, |
1657 | | struct keyed_data_req *req) |
1658 | 0 | { |
1659 | 0 | wmem_tree_key_t tr_key[4]; |
1660 | |
|
1661 | 0 | nvme_build_pending_transfer_key(tr_key, req); |
1662 | 0 | return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_requests, tr_key); |
1663 | 0 | } |
1664 | | |
1665 | | void |
1666 | | nvme_add_data_tr_pkt(struct nvme_q_ctx *q_ctx, |
1667 | | struct nvme_cmd_ctx *cmd_ctx, uint32_t rkey, uint32_t frame_num) |
1668 | 0 | { |
1669 | 0 | wmem_tree_key_t cmd_key[3]; |
1670 | |
|
1671 | 0 | nvme_build_done_frame_key(cmd_key, &rkey, &frame_num); |
1672 | 0 | wmem_tree_insert32_array(q_ctx->data_responses, cmd_key, (void*)cmd_ctx); |
1673 | 0 | } |
1674 | | |
1675 | | struct nvme_cmd_ctx* |
1676 | | nvme_lookup_data_tr_pkt(struct nvme_q_ctx *q_ctx, |
1677 | | uint32_t rkey, uint32_t frame_num) |
1678 | 0 | { |
1679 | 0 | wmem_tree_key_t cmd_key[3]; |
1680 | |
|
1681 | 0 | nvme_build_done_frame_key(cmd_key, &rkey, &frame_num); |
1682 | 0 | return (struct nvme_cmd_ctx*)wmem_tree_lookup32_array(q_ctx->data_responses, cmd_key); |
1683 | 0 | } |
1684 | | |
1685 | | void |
1686 | | nvme_add_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t off, uint32_t frame_num) |
1687 | 0 | { |
1688 | 0 | wmem_tree_key_t cmd_key[2]; |
1689 | |
|
1690 | 0 | nvme_build_done_frame_key(cmd_key, NULL, &frame_num); |
1691 | 0 | wmem_tree_insert32_array(q_ctx->data_offsets, cmd_key, GUINT_TO_POINTER(off)); |
1692 | 0 | } |
1693 | | |
1694 | | uint32_t |
1695 | | nvme_lookup_data_tr_off(struct nvme_q_ctx *q_ctx, uint32_t frame_num) |
1696 | 0 | { |
1697 | 0 | wmem_tree_key_t cmd_key[2]; |
1698 | |
|
1699 | 0 | nvme_build_done_frame_key(cmd_key, NULL, &frame_num); |
1700 | 0 | return GPOINTER_TO_UINT(wmem_tree_lookup32_array(q_ctx->data_offsets, cmd_key)); |
1701 | 0 | } |
1702 | | |
1703 | | void |
1704 | | nvme_add_cmd_cqe_to_done_list(struct nvme_q_ctx *q_ctx, |
1705 | | struct nvme_cmd_ctx *cmd_ctx, uint16_t cmd_id) |
1706 | 0 | { |
1707 | 0 | wmem_tree_key_t cmd_key[3]; |
1708 | 0 | uint32_t key = cmd_id; |
1709 | 0 | uint32_t frame_num; |
1710 | |
|
1711 | 0 | nvme_build_done_frame_key(cmd_key, &key, &frame_num); |
1712 | | |
1713 | | /* found matching entry. Add entries to the matched table for both cmd and cqe. |
1714 | | */ |
1715 | 0 | frame_num = cmd_ctx->cqe_pkt_num; |
1716 | 0 | wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx); |
1717 | |
|
1718 | 0 | frame_num = cmd_ctx->cmd_pkt_num; |
1719 | 0 | wmem_tree_insert32_array(q_ctx->done_cmds, cmd_key, (void*)cmd_ctx); |
1720 | 0 | } |
1721 | | |
1722 | | void* |
1723 | | nvme_lookup_cmd_in_done_list(packet_info *pinfo, struct nvme_q_ctx *q_ctx, |
1724 | | uint16_t cmd_id) |
1725 | 0 | { |
1726 | 0 | wmem_tree_key_t cmd_key[3]; |
1727 | 0 | uint32_t key = cmd_id; |
1728 | 0 | uint32_t frame_num = pinfo->num; |
1729 | |
|
1730 | 0 | nvme_build_done_frame_key(cmd_key, &key, &frame_num); |
1731 | |
|
1732 | 0 | return wmem_tree_lookup32_array(q_ctx->done_cmds, cmd_key); |
1733 | 0 | } |
1734 | | |
1735 | | void |
1736 | | nvme_publish_cmd_latency(proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, |
1737 | | int field_index) |
1738 | 0 | { |
1739 | 0 | proto_item *cmd_ref_item; |
1740 | 0 | nstime_t ns; |
1741 | 0 | double cmd_latency; |
1742 | |
|
1743 | 0 | nstime_delta(&ns, &cmd_ctx->cmd_end_time, &cmd_ctx->cmd_start_time); |
1744 | 0 | cmd_latency = nstime_to_msec(&ns); |
1745 | 0 | cmd_ref_item = proto_tree_add_double_format_value(tree, field_index, |
1746 | 0 | NULL, 0, 0, cmd_latency, |
1747 | 0 | "%.3f ms", cmd_latency); |
1748 | 0 | proto_item_set_generated(cmd_ref_item); |
1749 | 0 | } |
1750 | | |
1751 | | void nvme_update_cmd_end_info(packet_info *pinfo, struct nvme_cmd_ctx *cmd_ctx) |
1752 | 0 | { |
1753 | 0 | cmd_ctx->cmd_end_time = pinfo->abs_ts; |
1754 | 0 | cmd_ctx->cqe_pkt_num = pinfo->num; |
1755 | 0 | } |
1756 | | |
1757 | | void |
1758 | | nvme_publish_link(proto_tree *tree, tvbuff_t *tvb, int hf_index, |
1759 | | uint32_t pkt_no, bool zero_ok) |
1760 | 126 | { |
1761 | 126 | proto_item *ref_item; |
1762 | | |
1763 | 126 | if (pkt_no || zero_ok) { |
1764 | 0 | ref_item = proto_tree_add_uint(tree, hf_index, |
1765 | 0 | tvb, 0, 0, pkt_no); |
1766 | 0 | proto_item_set_generated(ref_item); |
1767 | 0 | } |
1768 | 126 | } |
1769 | | |
1770 | | void |
1771 | | nvme_publish_to_cmd_link(proto_tree *tree, tvbuff_t *tvb, |
1772 | | int hf_index, struct nvme_cmd_ctx *cmd_ctx) |
1773 | 0 | { |
1774 | 0 | nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cmd_pkt_num, true); |
1775 | 0 | } |
1776 | | |
1777 | | void |
1778 | | nvme_publish_to_cqe_link(proto_tree *tree, tvbuff_t *tvb, |
1779 | | int hf_index, struct nvme_cmd_ctx *cmd_ctx) |
1780 | 7 | { |
1781 | 7 | nvme_publish_link(tree, tvb, hf_index, cmd_ctx->cqe_pkt_num, false); |
1782 | 7 | } |
1783 | | |
1784 | | void |
1785 | | nvme_publish_to_data_req_link(proto_tree *tree, tvbuff_t *tvb, |
1786 | | int hf_index, struct nvme_cmd_ctx *cmd_ctx) |
1787 | 7 | { |
1788 | 7 | nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_req_pkt_num, false); |
1789 | 7 | } |
1790 | | |
1791 | | static void |
1792 | | nvme_publish_to_data_tr_links(proto_tree *tree, tvbuff_t *tvb, |
1793 | | int *index_arr, struct nvme_cmd_ctx *cmd_ctx) |
1794 | 7 | { |
1795 | 7 | unsigned i; |
1796 | 119 | for (i = 0; i < NVME_CMD_MAX_TRS; i++) |
1797 | 112 | nvme_publish_link(tree, tvb, index_arr[i], cmd_ctx->data_tr_pkt_num[i], false); |
1798 | 7 | } |
1799 | | |
1800 | | void nvme_publish_to_data_resp_link(proto_tree *tree, tvbuff_t *tvb, |
1801 | | int hf_index, struct nvme_cmd_ctx *cmd_ctx) |
1802 | 0 | { |
1803 | 0 | nvme_publish_link(tree, tvb, hf_index, cmd_ctx->data_tr_pkt_num[0], false); |
1804 | 0 | } |
1805 | | |
1806 | | void dissect_nvme_cmd_sgl(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
1807 | | int field_index, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned cmd_off, bool visited) |
1808 | 7 | { |
1809 | 7 | proto_item *ti, *sgl_tree, *type_item, *sub_type_item; |
1810 | 7 | uint8_t sgl_identifier, desc_type, desc_sub_type; |
1811 | 7 | int offset = 24 + cmd_off; |
1812 | | |
1813 | 7 | ti = proto_tree_add_item(cmd_tree, field_index, cmd_tvb, offset, |
1814 | 7 | 16, ENC_NA); |
1815 | 7 | sgl_tree = proto_item_add_subtree(ti, ett_data); |
1816 | | |
1817 | 7 | sgl_identifier = tvb_get_uint8(cmd_tvb, offset + 15); |
1818 | 7 | desc_type = (sgl_identifier & 0xff) >> 4; |
1819 | 7 | desc_sub_type = sgl_identifier & 0x0f; |
1820 | | |
1821 | 7 | type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_type, |
1822 | 7 | cmd_tvb, offset + 15, 1, ENC_LITTLE_ENDIAN); |
1823 | 7 | proto_item_append_text(type_item, " %s", |
1824 | 7 | val_to_str_const(desc_type, sgl_type_tbl, "Reserved")); |
1825 | | |
1826 | 7 | sub_type_item = proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_sub_type, |
1827 | 7 | cmd_tvb, |
1828 | 7 | offset + 15, 1, ENC_LITTLE_ENDIAN); |
1829 | 7 | proto_item_append_text(sub_type_item, " %s", |
1830 | 7 | val_to_str_const(desc_sub_type, sgl_sub_type_tbl, "Reserved")); |
1831 | | |
1832 | 7 | switch (desc_type) { |
1833 | 1 | case NVME_CMD_SGL_DATA_DESC: |
1834 | 2 | case NVME_CMD_SGL_LAST_SEGMENT_DESC: |
1835 | 3 | case NVME_CMD_SGL_SEGMENT_DESC: |
1836 | 3 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb, |
1837 | 3 | offset, 8, ENC_LITTLE_ENDIAN); |
1838 | 3 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb, |
1839 | 3 | offset + 8, 4, ENC_LITTLE_ENDIAN); |
1840 | 3 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb, |
1841 | 3 | offset + 12, 3, ENC_NA); |
1842 | 3 | break; |
1843 | 1 | case NVME_CMD_SGL_BIT_BUCKET_DESC: |
1844 | 1 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_addr_rsvd, cmd_tvb, |
1845 | 1 | offset, 8, ENC_LITTLE_ENDIAN); |
1846 | 1 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb, |
1847 | 1 | offset + 8, 4, ENC_LITTLE_ENDIAN); |
1848 | 1 | proto_tree_add_item(sgl_tree, hf_nvme_cmd_sgl_desc_rsvd, cmd_tvb, |
1849 | 1 | offset + 12, 3, ENC_NA); |
1850 | 1 | break; |
1851 | 1 | case NVME_CMD_SGL_KEYED_DATA_DESC: |
1852 | 1 | { |
1853 | 1 | struct keyed_data_req req; |
1854 | 1 | proto_tree_add_item_ret_uint64(sgl_tree, hf_nvme_cmd_sgl_desc_addr, cmd_tvb, |
1855 | 1 | offset, 8, ENC_LITTLE_ENDIAN, &req.addr); |
1856 | 1 | proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_len, cmd_tvb, |
1857 | 1 | offset + 8, 3, ENC_LITTLE_ENDIAN, &req.size); |
1858 | 1 | proto_tree_add_item_ret_uint(sgl_tree, hf_nvme_cmd_sgl_desc_key, cmd_tvb, |
1859 | 1 | offset + 11, 4, ENC_LITTLE_ENDIAN, &req.key); |
1860 | 1 | if (!visited && cmd_ctx && q_ctx && q_ctx->data_requests) |
1861 | 0 | nvme_add_data_request(q_ctx, cmd_ctx, &req); |
1862 | 1 | break; |
1863 | 2 | } |
1864 | 0 | case NVME_CMD_SGL_VENDOR_DESC: |
1865 | 1 | default: |
1866 | 1 | break; |
1867 | 7 | } |
1868 | 7 | } |
1869 | | |
1870 | | static void |
1871 | | dissect_nvme_rwc_common_word_10_11_12_14_15(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
1872 | 0 | { |
1873 | 0 | proto_item *ti, *prinfo_tree; |
1874 | 0 | uint16_t num_lba; |
1875 | | |
1876 | | /* word 10, 11 */ |
1877 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_slba, cmd_tvb, |
1878 | 0 | 40, 8, ENC_LITTLE_ENDIAN); |
1879 | | /* add 1 for readability, as its zero based value */ |
1880 | 0 | num_lba = tvb_get_uint16(cmd_tvb, 48, ENC_LITTLE_ENDIAN) + 1; |
1881 | | |
1882 | | /* word 12 */ |
1883 | 0 | proto_tree_add_uint(cmd_tree, hf_nvme_cmd_nlb, |
1884 | 0 | cmd_tvb, 48, 2, num_lba); |
1885 | |
|
1886 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd2, cmd_tvb, |
1887 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1888 | |
|
1889 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_prinfo, cmd_tvb, 50, |
1890 | 0 | 2, ENC_LITTLE_ENDIAN); |
1891 | 0 | prinfo_tree = proto_item_add_subtree(ti, ett_data); |
1892 | |
|
1893 | 0 | proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_lbrtag, cmd_tvb, |
1894 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1895 | 0 | proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_apptag, cmd_tvb, |
1896 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1897 | 0 | proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_prchk_guard, cmd_tvb, |
1898 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1899 | 0 | proto_tree_add_item(prinfo_tree, hf_nvme_cmd_prinfo_pract, cmd_tvb, |
1900 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1901 | |
|
1902 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_fua, cmd_tvb, |
1903 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1904 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_lr, cmd_tvb, |
1905 | 0 | 50, 2, ENC_LITTLE_ENDIAN); |
1906 | | |
1907 | | /* word 14, 15 */ |
1908 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_eilbrt, cmd_tvb, |
1909 | 0 | 56, 4, ENC_LITTLE_ENDIAN); |
1910 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbat, cmd_tvb, |
1911 | 0 | 60, 2, ENC_LITTLE_ENDIAN); |
1912 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_elbatm, cmd_tvb, |
1913 | 0 | 62, 2, ENC_LITTLE_ENDIAN); |
1914 | 0 | } |
1915 | | |
1916 | | /* Stop dissecting an offset-windowed response structure once the field at |
1917 | | * __field_off__ (length __field_len__) no longer fits in the transfer: the |
1918 | | * caller's 'off' is the structure offset the data begins at and 'len' the |
1919 | | * bytes available, so a chunked or NVMe-MI DLEN-truncated response stops |
1920 | | * cleanly rather than overrunning the payload. */ |
1921 | 0 | #define CHECK_STOP_PARSE(__field_off__, __field_len__) \ |
1922 | 0 | do { \ |
1923 | 0 | if ((__field_off__ - off + __field_len__) > len) \ |
1924 | 0 | return; \ |
1925 | 0 | } while(0) |
1926 | | |
1927 | | static void dissect_nvme_identify_ns_lbafs(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree) |
1928 | 0 | { |
1929 | 0 | proto_item *ti, *lbafs_tree, *item; |
1930 | 0 | int lbaf_off, i, nlbaf; |
1931 | 0 | uint8_t lbads; |
1932 | 0 | uint16_t ms; |
1933 | 0 | uint32_t lbaf_raw; |
1934 | 0 | bool over_declared; |
1935 | | |
1936 | | /* Supported formats are the NLBAF (byte 25, 0's based) shared-attribute |
1937 | | * ones followed directly by the NULBAF (byte 82) unique-attribute ones; |
1938 | | * a Format Index at or above their sum is invalid and not supported |
1939 | | * (NVM Command Set 1.2 section 5.5). Section 5.5 also caps the total at |
1940 | | * 64, the number of entries the 383:128 region holds, so clamp there too |
1941 | | * and a bogus NLBAF/NULBAF cannot drive reads past the region. */ |
1942 | 0 | nlbaf = tvb_get_uint8(cmd_tvb, 25) + 1 + tvb_get_uint8(cmd_tvb, 82); |
1943 | 0 | over_declared = (nlbaf > 64); |
1944 | 0 | if (over_declared) |
1945 | 0 | nlbaf = 64; |
1946 | |
|
1947 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_lbafs, cmd_tvb, |
1948 | 0 | 128, 256, ENC_NA); |
1949 | | /* The count is intrinsically impossible rather than merely unseen: the |
1950 | | * 383:128 region holds exactly 64 entries, so no transfer window can make |
1951 | | * NLBAF+1+NULBAF > 64 legitimate. */ |
1952 | 0 | if (over_declared) |
1953 | 0 | expert_add_info(pinfo, ti, &ei_nvme_lbaf_count_invalid); |
1954 | 0 | lbafs_tree = proto_item_add_subtree(ti, ett_data); |
1955 | |
|
1956 | 0 | for (i = 0; i < nlbaf; i++) { |
1957 | 0 | lbaf_off = 128 + i * 4; |
1958 | |
|
1959 | 0 | lbaf_raw = tvb_get_uint32(cmd_tvb, lbaf_off, ENC_LITTLE_ENDIAN); |
1960 | 0 | ms = lbaf_raw & 0xFF; |
1961 | 0 | lbads = (lbaf_raw >> 16) & 0xF; |
1962 | 0 | item = proto_tree_add_item(lbafs_tree, hf_nvme_identify_ns_lbaf, |
1963 | 0 | cmd_tvb, lbaf_off, 4, ENC_LITTLE_ENDIAN); |
1964 | 0 | proto_item_set_text(item, "LBAF%d: lbads %d ms %d", i, lbads, ms); |
1965 | 0 | } |
1966 | 0 | } |
1967 | | |
1968 | | /* Deallocation Read Behavior (DRB), the low 3 bits of DLFEAT. */ |
1969 | | static const value_string ns_dlfeat_drb_tbl[] = { |
1970 | | { 0, "read behavior is not reported" }, |
1971 | | { 1, "deallocated logical block returns all bytes cleared to 0h" }, |
1972 | | { 2, "deallocated logical block returns all bytes set to FFh" }, |
1973 | | { 0, NULL} |
1974 | | }; |
1975 | | |
1976 | 0 | #define ASPEC(_x_) _x_, array_length(_x_) |
1977 | | |
1978 | | /* Both defined further down; used here for the bit-defined bytes (DLFEAT, |
1979 | | * KPIOS) and the 16-byte NVM Capacity of the Identify Namespace structure. */ |
1980 | | static void add_group_mask_entry(tvbuff_t *tvb, proto_tree *tree, unsigned offset, unsigned bytes, int *array, unsigned array_len); |
1981 | | static void post_add_bytes_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off, uint8_t shiftl); |
1982 | | |
1983 | | static void dissect_nvme_identify_ns_resp(tvbuff_t *cmd_tvb, packet_info *pinfo, |
1984 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
1985 | 0 | { |
1986 | 0 | proto_item *ti; |
1987 | 0 | unsigned start; |
1988 | 0 | if (!off) { |
1989 | | /* Fixed-layout fields at the start of the structure. Each read is |
1990 | | * length-guarded (off is 0 here) so a response truncated by a small |
1991 | | * DLEN -- e.g. a chunked Identify over a low-MTU transport -- stops |
1992 | | * cleanly instead of overrunning the payload. */ |
1993 | 0 | CHECK_STOP_PARSE(0, 8); |
1994 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsze, cmd_tvb, |
1995 | 0 | 0, 8, ENC_LITTLE_ENDIAN); |
1996 | 0 | CHECK_STOP_PARSE(8, 8); |
1997 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_ncap, cmd_tvb, |
1998 | 0 | 8, 8, ENC_LITTLE_ENDIAN); |
1999 | 0 | CHECK_STOP_PARSE(16, 8); |
2000 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nuse, cmd_tvb, |
2001 | 0 | 16, 8, ENC_LITTLE_ENDIAN); |
2002 | 0 | CHECK_STOP_PARSE(24, 1); |
2003 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsfeat, cmd_tvb, |
2004 | 0 | 24, 1, ENC_LITTLE_ENDIAN); |
2005 | 0 | CHECK_STOP_PARSE(25, 1); |
2006 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nlbaf, cmd_tvb, |
2007 | 0 | 25, 1, ENC_LITTLE_ENDIAN); |
2008 | 0 | CHECK_STOP_PARSE(26, 1); |
2009 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_flbas, cmd_tvb, |
2010 | 0 | 26, 1, ENC_LITTLE_ENDIAN); |
2011 | 0 | CHECK_STOP_PARSE(27, 1); |
2012 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mc, cmd_tvb, |
2013 | 0 | 27, 1, ENC_LITTLE_ENDIAN); |
2014 | 0 | CHECK_STOP_PARSE(28, 1); |
2015 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dpc, cmd_tvb, |
2016 | 0 | 28, 1, ENC_LITTLE_ENDIAN); |
2017 | 0 | CHECK_STOP_PARSE(29, 1); |
2018 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_dps, cmd_tvb, |
2019 | 0 | 29, 1, ENC_LITTLE_ENDIAN); |
2020 | 0 | CHECK_STOP_PARSE(30, 1); |
2021 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nmic, cmd_tvb, |
2022 | 0 | 30, 1, ENC_LITTLE_ENDIAN); |
2023 | 0 | CHECK_STOP_PARSE(31, 1); |
2024 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rescap, cmd_tvb, |
2025 | 0 | 31, 1, ENC_LITTLE_ENDIAN); |
2026 | 0 | CHECK_STOP_PARSE(32, 1); |
2027 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_fpi, cmd_tvb, |
2028 | 0 | 32, 1, ENC_LITTLE_ENDIAN); |
2029 | 0 | CHECK_STOP_PARSE(33, 1); |
2030 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 33, 1, ASPEC(hf_nvme_identify_ns_dlfeat)); |
2031 | 0 | CHECK_STOP_PARSE(34, 2); |
2032 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nawun, cmd_tvb, |
2033 | 0 | 34, 2, ENC_LITTLE_ENDIAN); |
2034 | 0 | CHECK_STOP_PARSE(36, 2); |
2035 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nawupf, cmd_tvb, |
2036 | 0 | 36, 2, ENC_LITTLE_ENDIAN); |
2037 | 0 | CHECK_STOP_PARSE(38, 2); |
2038 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nacwu, cmd_tvb, |
2039 | 0 | 38, 2, ENC_LITTLE_ENDIAN); |
2040 | 0 | CHECK_STOP_PARSE(40, 2); |
2041 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabsn, cmd_tvb, |
2042 | 0 | 40, 2, ENC_LITTLE_ENDIAN); |
2043 | 0 | CHECK_STOP_PARSE(42, 2); |
2044 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabo, cmd_tvb, |
2045 | 0 | 42, 2, ENC_LITTLE_ENDIAN); |
2046 | 0 | CHECK_STOP_PARSE(44, 2); |
2047 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nabspf, cmd_tvb, |
2048 | 0 | 44, 2, ENC_LITTLE_ENDIAN); |
2049 | 0 | CHECK_STOP_PARSE(46, 2); |
2050 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_noiob, cmd_tvb, |
2051 | 0 | 46, 2, ENC_LITTLE_ENDIAN); |
2052 | 0 | CHECK_STOP_PARSE(48, 16); |
2053 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nvmcap, cmd_tvb, |
2054 | 0 | 48, 16, ENC_NA); |
2055 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, 48, 0); |
2056 | 0 | CHECK_STOP_PARSE(64, 2); |
2057 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npwg, cmd_tvb, |
2058 | 0 | 64, 2, ENC_LITTLE_ENDIAN); |
2059 | 0 | CHECK_STOP_PARSE(66, 2); |
2060 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npwa, cmd_tvb, |
2061 | 0 | 66, 2, ENC_LITTLE_ENDIAN); |
2062 | 0 | CHECK_STOP_PARSE(68, 2); |
2063 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npdg, cmd_tvb, |
2064 | 0 | 68, 2, ENC_LITTLE_ENDIAN); |
2065 | 0 | CHECK_STOP_PARSE(70, 2); |
2066 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_npda, cmd_tvb, |
2067 | 0 | 70, 2, ENC_LITTLE_ENDIAN); |
2068 | 0 | CHECK_STOP_PARSE(72, 2); |
2069 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nows, cmd_tvb, |
2070 | 0 | 72, 2, ENC_LITTLE_ENDIAN); |
2071 | 0 | CHECK_STOP_PARSE(74, 2); |
2072 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mssrl, cmd_tvb, |
2073 | 0 | 74, 2, ENC_LITTLE_ENDIAN); |
2074 | 0 | CHECK_STOP_PARSE(76, 4); |
2075 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_mcl, cmd_tvb, |
2076 | 0 | 76, 4, ENC_LITTLE_ENDIAN); |
2077 | 0 | CHECK_STOP_PARSE(80, 1); |
2078 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_msrc, cmd_tvb, |
2079 | 0 | 80, 1, ENC_LITTLE_ENDIAN); |
2080 | 0 | CHECK_STOP_PARSE(81, 1); |
2081 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 81, 1, ASPEC(hf_nvme_identify_ns_kpios)); |
2082 | 0 | CHECK_STOP_PARSE(82, 1); |
2083 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nulbaf, cmd_tvb, |
2084 | 0 | 82, 1, ENC_LITTLE_ENDIAN); |
2085 | 0 | CHECK_STOP_PARSE(83, 1); |
2086 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd0, cmd_tvb, |
2087 | 0 | 83, 1, ENC_NA); |
2088 | 0 | CHECK_STOP_PARSE(84, 4); |
2089 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_kpiodaag, cmd_tvb, |
2090 | 0 | 84, 4, ENC_LITTLE_ENDIAN); |
2091 | 0 | CHECK_STOP_PARSE(88, 4); |
2092 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd1, cmd_tvb, |
2093 | 0 | 88, 4, ENC_NA); |
2094 | 0 | CHECK_STOP_PARSE(92, 4); |
2095 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_anagrpid, cmd_tvb, |
2096 | 0 | 92, 4, ENC_LITTLE_ENDIAN); |
2097 | 0 | CHECK_STOP_PARSE(96, 3); |
2098 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_rsvd2, cmd_tvb, |
2099 | 0 | 96, 3, ENC_NA); |
2100 | 0 | CHECK_STOP_PARSE(99, 1); |
2101 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nsattr, cmd_tvb, |
2102 | 0 | 99, 1, ENC_LITTLE_ENDIAN); |
2103 | 0 | CHECK_STOP_PARSE(100, 2); |
2104 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nvmsetid, cmd_tvb, |
2105 | 0 | 100, 2, ENC_LITTLE_ENDIAN); |
2106 | 0 | CHECK_STOP_PARSE(102, 2); |
2107 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_endgid, cmd_tvb, |
2108 | 0 | 102, 2, ENC_LITTLE_ENDIAN); |
2109 | 0 | CHECK_STOP_PARSE(104, 16); |
2110 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_nguid, cmd_tvb, |
2111 | 0 | 104, 16, ENC_NA); |
2112 | 0 | CHECK_STOP_PARSE(120, 8); |
2113 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_eui64, cmd_tvb, |
2114 | 0 | 120, 8, ENC_NA); |
2115 | | |
2116 | | /* LBA Formats occupy 383:128 (LBAF0..LBAF63) and Vendor Specific |
2117 | | * starts immediately at 384 -- nothing in 4095:0 is Reserved. */ |
2118 | 0 | CHECK_STOP_PARSE(128, 256); |
2119 | 0 | dissect_nvme_identify_ns_lbafs(cmd_tvb, pinfo, cmd_tree); |
2120 | 0 | } |
2121 | 0 | if (off >= 384) |
2122 | 0 | start = 0; |
2123 | 0 | else |
2124 | 0 | start = 384 - off; |
2125 | | /* Vendor-specific area (structure offset 384+). Only render it once the |
2126 | | * transfer window actually reaches it; a shorter chunk carries no VS bytes |
2127 | | * (and 'len - start' would otherwise underflow). */ |
2128 | 0 | if (start < len) { |
2129 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ns_vs, cmd_tvb, |
2130 | 0 | start, len - start, ENC_NA); |
2131 | 0 | proto_item_append_text(ti, " (offset %u)", (off <= 384) ? 0 : off-384); |
2132 | 0 | } |
2133 | 0 | } |
2134 | | |
2135 | | /* NSTAT.IOI (I/O Impacted) sub-field, NVMe Base 2.3 Figure 335. */ |
2136 | | static const value_string cs_ind_ns_ioi_tbl[] = { |
2137 | | { 0, "I/O performance degradation is not reported" }, |
2138 | | { 1, "Reserved" }, |
2139 | | { 2, "I/O performance is not currently degraded" }, |
2140 | | { 3, "I/O performance is currently degraded" }, |
2141 | | { 0, NULL } |
2142 | | }; |
2143 | | |
2144 | | /* Identify - I/O Command Set Independent Identify Namespace (CNS 08h), NVMe |
2145 | | * Base 2.3 Figure 335. The defined fields occupy bytes 23:00; 4095:24 is |
2146 | | * reserved. Windowed the same way as the sibling Identify decoders: each |
2147 | | * field renders only when the transfer window starts at or before it, and |
2148 | | * CHECK_STOP_PARSE stops cleanly on a DLEN-truncated chunk. */ |
2149 | | static void dissect_nvme_identify_cs_ind_ns_resp(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned off, unsigned len) |
2150 | 0 | { |
2151 | 0 | if (!off) { |
2152 | 0 | CHECK_STOP_PARSE(0, 1); |
2153 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 0, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nsfeat)); |
2154 | 0 | } |
2155 | 0 | if (off <= 1) { |
2156 | 0 | CHECK_STOP_PARSE(1, 1); |
2157 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 1-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nmic)); |
2158 | 0 | } |
2159 | 0 | if (off <= 2) { |
2160 | 0 | CHECK_STOP_PARSE(2, 1); |
2161 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 2-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_rescap)); |
2162 | 0 | } |
2163 | 0 | if (off <= 3) { |
2164 | 0 | CHECK_STOP_PARSE(3, 1); |
2165 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 3-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_fpi)); |
2166 | 0 | } |
2167 | 0 | if (off <= 4) { |
2168 | 0 | CHECK_STOP_PARSE(4, 4); |
2169 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_anagrpid, cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN); |
2170 | 0 | } |
2171 | 0 | if (off <= 8) { |
2172 | 0 | CHECK_STOP_PARSE(8, 1); |
2173 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 8-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nsattr)); |
2174 | 0 | } |
2175 | 0 | if (off <= 9) { |
2176 | 0 | CHECK_STOP_PARSE(9, 1); |
2177 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rsvd0, cmd_tvb, 9-off, 1, ENC_NA); |
2178 | 0 | } |
2179 | 0 | if (off <= 10) { |
2180 | 0 | CHECK_STOP_PARSE(10, 2); |
2181 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_nvmsetid, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN); |
2182 | 0 | } |
2183 | 0 | if (off <= 12) { |
2184 | 0 | CHECK_STOP_PARSE(12, 2); |
2185 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_endgid, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN); |
2186 | 0 | } |
2187 | 0 | if (off <= 14) { |
2188 | 0 | CHECK_STOP_PARSE(14, 1); |
2189 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 14-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_nstat)); |
2190 | 0 | } |
2191 | 0 | if (off <= 15) { |
2192 | 0 | CHECK_STOP_PARSE(15, 1); |
2193 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 15-off, 1, ASPEC(hf_nvme_identify_cs_ind_ns_kpios)); |
2194 | 0 | } |
2195 | 0 | if (off <= 16) { |
2196 | 0 | CHECK_STOP_PARSE(16, 2); |
2197 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_maxkt, cmd_tvb, 16-off, 2, ENC_LITTLE_ENDIAN); |
2198 | 0 | } |
2199 | 0 | if (off <= 18) { |
2200 | 0 | CHECK_STOP_PARSE(18, 2); |
2201 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rsvd1, cmd_tvb, 18-off, 2, ENC_NA); |
2202 | 0 | } |
2203 | 0 | if (off <= 20) { |
2204 | 0 | CHECK_STOP_PARSE(20, 4); |
2205 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_cs_ind_ns_rgrpid, cmd_tvb, 20-off, 4, ENC_LITTLE_ENDIAN); |
2206 | 0 | } |
2207 | 0 | } |
2208 | | |
2209 | | static void dissect_nvme_identify_nslist_resp(tvbuff_t *cmd_tvb, |
2210 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2211 | 0 | { |
2212 | 0 | uint32_t nsid; |
2213 | 0 | proto_item *item; |
2214 | 0 | unsigned done = 0; |
2215 | |
|
2216 | 0 | for (; off < 4096 && (done + 4) <= len; off += 4) { |
2217 | 0 | nsid = tvb_get_uint32(cmd_tvb, done, ENC_LITTLE_ENDIAN); |
2218 | 0 | if (nsid == 0) |
2219 | 0 | break; |
2220 | | |
2221 | 0 | item = proto_tree_add_item(cmd_tree, hf_nvme_identify_nslist_nsid, |
2222 | 0 | cmd_tvb, done, 4, ENC_LITTLE_ENDIAN); |
2223 | 0 | proto_item_set_text(item, "nsid[%u]: %u", off / 4, nsid); |
2224 | 0 | done += 4; |
2225 | 0 | } |
2226 | 0 | } |
2227 | | |
2228 | | /* Namespace Identification Descriptor list (CNS 03h), NVMe Base 2.3 Figure |
2229 | | * 331: a packed list of variable-length descriptors, each NIDT(1)+NIDL(1)+ |
2230 | | * reserved(2)+NID(NIDL), terminated by a descriptor with NIDL == 0. The list |
2231 | | * is self-delimiting and cannot be resynchronised from a mid-structure window, |
2232 | | * so only a transfer starting at structure offset 0 is decoded. */ |
2233 | | static void dissect_nvme_identify_nsid_desc_list_resp(tvbuff_t *cmd_tvb, |
2234 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2235 | 0 | { |
2236 | 0 | unsigned done = 0; |
2237 | 0 | unsigned idx = 0; |
2238 | |
|
2239 | 0 | if (off) |
2240 | 0 | return; |
2241 | | |
2242 | 0 | while (done + 4 <= len) { |
2243 | 0 | uint8_t nidl = tvb_get_uint8(cmd_tvb, done + 1); |
2244 | 0 | unsigned dlen; |
2245 | 0 | proto_tree *grp; |
2246 | |
|
2247 | 0 | if (nidl == 0) |
2248 | 0 | break; /* NIDL 0h marks the end of the list */ |
2249 | 0 | dlen = 4u + nidl; |
2250 | 0 | if (done + dlen > len) |
2251 | 0 | break; /* descriptor would overrun the payload */ |
2252 | | |
2253 | 0 | grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, done, dlen, |
2254 | 0 | ett_data, NULL, |
2255 | 0 | "Namespace Identification Descriptor %u", idx); |
2256 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nidt, cmd_tvb, done, 1, ENC_NA); |
2257 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nidl, cmd_tvb, done + 1, 1, ENC_NA); |
2258 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nsdesc_nid, cmd_tvb, done + 4, nidl, ENC_NA); |
2259 | |
|
2260 | 0 | done += dlen; |
2261 | 0 | idx++; |
2262 | 0 | } |
2263 | 0 | } |
2264 | | |
2265 | | /* Controller List (CNS 12h attached-to-NSID / CNS 13h NVM-subsystem), NVMe |
2266 | | * Base 2.3 "Controller List Format": a 2-byte NUMCIDS count followed by that |
2267 | | * many 2-byte controller identifiers (up to 2,047). Only decoded from |
2268 | | * structure offset 0 since NUMCIDS sits in the header. */ |
2269 | | static void dissect_nvme_identify_ctrl_list_resp(tvbuff_t *cmd_tvb, |
2270 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2271 | 0 | { |
2272 | 0 | uint32_t numcids; |
2273 | 0 | unsigned i, done; |
2274 | |
|
2275 | 0 | if (off || len < 2) |
2276 | 0 | return; |
2277 | | |
2278 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_ctrl_list_num, |
2279 | 0 | cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN, &numcids); |
2280 | |
|
2281 | 0 | done = 2; |
2282 | 0 | for (i = 0; i < numcids && i < 2047 && done + 2 <= len; i++) { |
2283 | 0 | uint32_t cid; |
2284 | 0 | proto_item *item = proto_tree_add_item_ret_uint(cmd_tree, |
2285 | 0 | hf_nvme_identify_ctrl_list_id, cmd_tvb, done, 2, |
2286 | 0 | ENC_LITTLE_ENDIAN, &cid); |
2287 | 0 | proto_item_set_text(item, "Controller Identifier[%u]: 0x%04x", i, cid); |
2288 | 0 | done += 2; |
2289 | 0 | } |
2290 | 0 | } |
2291 | | |
2292 | | static void add_group_mask_entry(tvbuff_t *tvb, proto_tree *tree, unsigned offset, unsigned bytes, int *array, unsigned array_len) |
2293 | 0 | { |
2294 | 0 | proto_item *ti; |
2295 | 0 | proto_tree *grp; |
2296 | 0 | unsigned i; |
2297 | |
|
2298 | 0 | ti = proto_tree_add_item(tree, array[0], tvb, offset, bytes, ENC_LITTLE_ENDIAN); |
2299 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2300 | |
|
2301 | 0 | for (i = 1; i < array_len; i++) |
2302 | 0 | proto_tree_add_item(grp, array[i], tvb, offset, bytes, ENC_LITTLE_ENDIAN); |
2303 | 0 | } |
2304 | | |
2305 | | /* NVM Set List (CNS 04h): a 1-byte NUMENT header (up to 31 entries) with the |
2306 | | * entry list starting at structure offset 128, each entry 128 bytes. Only |
2307 | | * decoded from structure offset 0 since NUMENT sits in the header. */ |
2308 | | static void dissect_nvme_identify_nvmset_resp(tvbuff_t *cmd_tvb, |
2309 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2310 | 0 | { |
2311 | 0 | uint32_t nument; |
2312 | 0 | unsigned i; |
2313 | |
|
2314 | 0 | if (off || len < 1) |
2315 | 0 | return; |
2316 | | |
2317 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_nvmset_num, |
2318 | 0 | cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN, &nument); |
2319 | |
|
2320 | 0 | for (i = 0; i < nument && i < 31; i++) { |
2321 | 0 | unsigned entry = 128 + i * 128; |
2322 | 0 | proto_tree *grp; |
2323 | |
|
2324 | 0 | if (entry + 48 > len) |
2325 | 0 | break; /* entry (through UNVMSC) would overrun the payload */ |
2326 | | |
2327 | 0 | grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 128, |
2328 | 0 | ett_data, NULL, |
2329 | 0 | "NVM Set Attributes Entry %u", i); |
2330 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_id, cmd_tvb, entry, 2, ENC_LITTLE_ENDIAN); |
2331 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_endgid, cmd_tvb, entry + 2, 2, ENC_LITTLE_ENDIAN); |
2332 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_r4krt, cmd_tvb, entry + 8, 4, ENC_LITTLE_ENDIAN); |
2333 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_ows, cmd_tvb, entry + 12, 4, ENC_LITTLE_ENDIAN); |
2334 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_tnvmsc, cmd_tvb, entry + 16, 16, ENC_NA); |
2335 | 0 | proto_tree_add_item(grp, hf_nvme_identify_nvmset_unvmsc, cmd_tvb, entry + 32, 16, ENC_NA); |
2336 | 0 | } |
2337 | 0 | } |
2338 | | |
2339 | | /* Primary Controller Capabilities (CNS 14h): fixed 80-byte layout at the |
2340 | | * start of the 4 KiB structure; only decoded from structure offset 0. */ |
2341 | | static void dissect_nvme_identify_pri_ctrl_cap_resp(tvbuff_t *cmd_tvb, |
2342 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2343 | 0 | { |
2344 | 0 | if (off || len < 80) |
2345 | 0 | return; |
2346 | | |
2347 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_cntlid, cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN); |
2348 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_portid, cmd_tvb, 2, 2, ENC_LITTLE_ENDIAN); |
2349 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 4, 4, ASPEC(hf_nvme_identify_pcc_crt)); |
2350 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqfrt, cmd_tvb, 32, 4, ENC_LITTLE_ENDIAN); |
2351 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqrfa, cmd_tvb, 36, 4, ENC_LITTLE_ENDIAN); |
2352 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqrfap, cmd_tvb, 40, 2, ENC_LITTLE_ENDIAN); |
2353 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqprt, cmd_tvb, 42, 2, ENC_LITTLE_ENDIAN); |
2354 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqfrsm, cmd_tvb, 44, 2, ENC_LITTLE_ENDIAN); |
2355 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vqgran, cmd_tvb, 46, 2, ENC_LITTLE_ENDIAN); |
2356 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vifrt, cmd_tvb, 64, 4, ENC_LITTLE_ENDIAN); |
2357 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_virfa, cmd_tvb, 68, 4, ENC_LITTLE_ENDIAN); |
2358 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_virfap, cmd_tvb, 72, 2, ENC_LITTLE_ENDIAN); |
2359 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_viprt, cmd_tvb, 74, 2, ENC_LITTLE_ENDIAN); |
2360 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vifrsm, cmd_tvb, 76, 2, ENC_LITTLE_ENDIAN); |
2361 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_pcc_vigran, cmd_tvb, 78, 2, ENC_LITTLE_ENDIAN); |
2362 | 0 | } |
2363 | | |
2364 | | /* Secondary Controller List (CNS 15h): a 1-byte NUMENT header (up to 127 |
2365 | | * entries) with the entry list starting at structure offset 32, each entry |
2366 | | * 32 bytes. Only decoded from structure offset 0. */ |
2367 | | static void dissect_nvme_identify_sec_ctrl_list_resp(tvbuff_t *cmd_tvb, |
2368 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2369 | 0 | { |
2370 | 0 | uint32_t nument; |
2371 | 0 | unsigned i; |
2372 | |
|
2373 | 0 | if (off || len < 1) |
2374 | 0 | return; |
2375 | | |
2376 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_scl_num, |
2377 | 0 | cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN, &nument); |
2378 | |
|
2379 | 0 | for (i = 0; i < nument && i < 127; i++) { |
2380 | 0 | unsigned entry = 32 + i * 32; |
2381 | 0 | proto_tree *grp; |
2382 | |
|
2383 | 0 | if (entry + 14 > len) |
2384 | 0 | break; /* entry (through NVI) would overrun the payload */ |
2385 | | |
2386 | 0 | grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 32, |
2387 | 0 | ett_data, NULL, |
2388 | 0 | "Secondary Controller Entry %u", i); |
2389 | 0 | proto_tree_add_item(grp, hf_nvme_identify_scl_scid, cmd_tvb, entry, 2, ENC_LITTLE_ENDIAN); |
2390 | 0 | proto_tree_add_item(grp, hf_nvme_identify_scl_pcid, cmd_tvb, entry + 2, 2, ENC_LITTLE_ENDIAN); |
2391 | 0 | add_group_mask_entry(cmd_tvb, grp, entry + 4, 1, ASPEC(hf_nvme_identify_scl_scs)); |
2392 | 0 | proto_tree_add_item(grp, hf_nvme_identify_scl_vfn, cmd_tvb, entry + 8, 2, ENC_LITTLE_ENDIAN); |
2393 | 0 | proto_tree_add_item(grp, hf_nvme_identify_scl_nvq, cmd_tvb, entry + 10, 2, ENC_LITTLE_ENDIAN); |
2394 | 0 | proto_tree_add_item(grp, hf_nvme_identify_scl_nvi, cmd_tvb, entry + 12, 2, ENC_LITTLE_ENDIAN); |
2395 | 0 | } |
2396 | 0 | } |
2397 | | |
2398 | | /* Namespace Granularity List (CNS 16h): a 4-byte NGA header, a 1-byte ND |
2399 | | * count (0's based, up to 64 descriptors), with the descriptor list starting |
2400 | | * at structure offset 32, each descriptor 16 bytes (NSG + NCG). Only |
2401 | | * decoded from structure offset 0. */ |
2402 | | static void dissect_nvme_identify_ns_gran_list_resp(tvbuff_t *cmd_tvb, |
2403 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2404 | 0 | { |
2405 | 0 | uint32_t nd; |
2406 | 0 | unsigned i; |
2407 | |
|
2408 | 0 | if (off || len < 5) |
2409 | 0 | return; |
2410 | | |
2411 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 0, 4, ASPEC(hf_nvme_identify_ngl_nga)); |
2412 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_identify_ngl_nd, |
2413 | 0 | cmd_tvb, 4, 1, ENC_LITTLE_ENDIAN, &nd); |
2414 | | |
2415 | | /* ND is a 0's based count of valid descriptors. */ |
2416 | 0 | for (i = 0; i <= nd && i < 64; i++) { |
2417 | 0 | unsigned entry = 32 + i * 16; |
2418 | 0 | proto_tree *grp; |
2419 | |
|
2420 | 0 | if (entry + 16 > len) |
2421 | 0 | break; /* descriptor would overrun the payload */ |
2422 | | |
2423 | 0 | grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 16, |
2424 | 0 | ett_data, NULL, |
2425 | 0 | "Namespace Granularity Descriptor %u", i); |
2426 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ngl_nsg, cmd_tvb, entry, 8, ENC_LITTLE_ENDIAN); |
2427 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ngl_ncg, cmd_tvb, entry + 8, 8, ENC_LITTLE_ENDIAN); |
2428 | 0 | } |
2429 | 0 | } |
2430 | | |
2431 | | /* UUID List (CNS 17h): a 32-byte reserved header followed by up to 127 UUID |
2432 | | * List Entries, each 32 bytes (a 1-byte header carrying the Identifier |
2433 | | * Association, then a 128-bit UUID at byte 16). A UUID cleared to 0h marks |
2434 | | * the end of the list. Only decoded from structure offset 0 since entries |
2435 | | * are indexed from the fixed header. */ |
2436 | | static void dissect_nvme_identify_uuid_list_resp(tvbuff_t *cmd_tvb, |
2437 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2438 | 0 | { |
2439 | 0 | unsigned i; |
2440 | |
|
2441 | 0 | if (off) |
2442 | 0 | return; |
2443 | | |
2444 | 0 | for (i = 1; i < 128; i++) { |
2445 | 0 | unsigned entry = i * 32; |
2446 | 0 | proto_tree *grp; |
2447 | |
|
2448 | 0 | if (entry + 32 > len) |
2449 | 0 | break; /* entry would overrun the payload */ |
2450 | 0 | if (tvb_get_uint64(cmd_tvb, entry + 16, ENC_LITTLE_ENDIAN) == 0 && |
2451 | 0 | tvb_get_uint64(cmd_tvb, entry + 24, ENC_LITTLE_ENDIAN) == 0) |
2452 | 0 | break; /* a UUID cleared to 0h ends the list */ |
2453 | | |
2454 | 0 | grp = proto_tree_add_subtree_format(cmd_tree, cmd_tvb, entry, 32, |
2455 | 0 | ett_data, NULL, |
2456 | 0 | "UUID List Entry %u", i); |
2457 | 0 | proto_tree_add_item(grp, hf_nvme_identify_uuid_idassoc, cmd_tvb, entry, 1, ENC_LITTLE_ENDIAN); |
2458 | 0 | proto_tree_add_item(grp, hf_nvme_identify_uuid_uuid, cmd_tvb, entry + 16, 16, ENC_NA); |
2459 | 0 | } |
2460 | 0 | } |
2461 | | |
2462 | | static void add_ctrl_x16_bytes( char *result, uint32_t val) |
2463 | 0 | { |
2464 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%x (%u bytes)", val, val * 16); |
2465 | 0 | } |
2466 | | |
2467 | | static void dissect_nvme_identify_ctrl_resp_nvmeof(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off) |
2468 | 0 | { |
2469 | 0 | proto_item *ti; |
2470 | 0 | proto_tree *grp; |
2471 | |
|
2472 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nvmeof, cmd_tvb, 1792-off, 256, ENC_NA); |
2473 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2474 | |
|
2475 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_ioccsz, cmd_tvb, 1792-off, 4, ENC_LITTLE_ENDIAN); |
2476 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_iorcsz, cmd_tvb, 1796-off, 4, ENC_LITTLE_ENDIAN); |
2477 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_icdoff, cmd_tvb, 1800-off, 2, ENC_LITTLE_ENDIAN); |
2478 | |
|
2479 | 0 | add_group_mask_entry(cmd_tvb, grp, 1802-off, 1, ASPEC(hf_nvme_identify_ctrl_nvmeof_fcatt)); |
2480 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_msdbd, cmd_tvb, 1803-off, 1, ENC_LITTLE_ENDIAN); |
2481 | 0 | add_group_mask_entry(cmd_tvb, grp, 1804-off, 2, ASPEC(hf_nvme_identify_ctrl_nvmeof_ofcs)); |
2482 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_dctype, cmd_tvb, 1806-off, 1, ENC_LITTLE_ENDIAN); |
2483 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_ccrl, cmd_tvb, 1807-off, 1, ENC_LITTLE_ENDIAN); |
2484 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_nvmeof_rsvd, cmd_tvb, 1808-off, 240, ENC_NA); |
2485 | 0 | } |
2486 | | |
2487 | | |
2488 | | static const true_false_string units_watts = { |
2489 | | "1 (0.0001 Watt units)", |
2490 | | "0 (0.01 Watt units)" |
2491 | | }; |
2492 | | |
2493 | | |
2494 | | static const value_string power_scale_tbl[] = { |
2495 | | { 0, "not reported for this power state" }, |
2496 | | { 1, "0.0001 Watt units" }, |
2497 | | { 2, "0.01 Watt units" }, |
2498 | | { 3, "reserved value" }, |
2499 | | { 0, NULL} |
2500 | | }; |
2501 | | |
2502 | | /* Time Scale Values, NVMe Base 2.3 Figure 330 (EPFRTS / FQVTS / EPFVTS) */ |
2503 | | static const value_string time_scale_tbl[] = { |
2504 | | { 0x0, "1 microsecond" }, |
2505 | | { 0x1, "10 microseconds" }, |
2506 | | { 0x2, "100 microseconds" }, |
2507 | | { 0x3, "1 millisecond" }, |
2508 | | { 0x4, "10 milliseconds" }, |
2509 | | { 0x5, "100 milliseconds" }, |
2510 | | { 0x6, "1 second" }, |
2511 | | { 0x7, "10 seconds" }, |
2512 | | { 0x8, "100 seconds" }, |
2513 | | { 0x9, "1,000 seconds" }, |
2514 | | { 0xA, "10,000 seconds" }, |
2515 | | { 0xB, "100,000 seconds" }, |
2516 | | { 0xC, "1,000,000 seconds" }, |
2517 | | { 0xD, "reserved value" }, |
2518 | | { 0xE, "reserved value" }, |
2519 | | { 0xF, "reserved value" }, |
2520 | | { 0, NULL} |
2521 | | }; |
2522 | | |
2523 | | /* Max Bandwidth Scale, NVMe Base 2.3 Figure 329 (bits 234:232) */ |
2524 | | static const value_string max_bw_scale_tbl[] = { |
2525 | | { 0, "1 MiB/second" }, |
2526 | | { 1, "10 MiB/second" }, |
2527 | | { 2, "100 MiB/second" }, |
2528 | | { 3, "1 GiB/second" }, |
2529 | | { 4, "10 GiB/second" }, |
2530 | | { 5, "100 GiB/second" }, |
2531 | | { 6, "reserved value" }, |
2532 | | { 7, "reserved value" }, |
2533 | | { 0, NULL} |
2534 | | }; |
2535 | | |
2536 | | static void dissect_nvme_identify_ctrl_resp_power_state_descriptor(tvbuff_t *cmd_tvb, proto_tree *tree, uint8_t idx, uint32_t off) |
2537 | 0 | { |
2538 | 0 | proto_item *ti; |
2539 | 0 | proto_tree *grp; |
2540 | |
|
2541 | 0 | off = 2048 - off + idx *32; |
2542 | 0 | ti = proto_tree_add_bytes_format(tree, hf_nvme_identify_ctrl_psd, cmd_tvb, off, 32, NULL, |
2543 | 0 | "Power State %u Descriptor (PSD%u)", idx, idx); |
2544 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2545 | |
|
2546 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mp, cmd_tvb, off, 2, ENC_LITTLE_ENDIAN); |
2547 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd0, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN); |
2548 | |
|
2549 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mxps, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN); |
2550 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_nops, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN); |
2551 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd1, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN); |
2552 | |
|
2553 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_enlat, cmd_tvb, off+4, 4, ENC_LITTLE_ENDIAN); |
2554 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_exlat, cmd_tvb, off+8, 4, ENC_LITTLE_ENDIAN); |
2555 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrt, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN); |
2556 | |
|
2557 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd2, cmd_tvb, off+12, 1, ENC_LITTLE_ENDIAN); |
2558 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rrl, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN); |
2559 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd3, cmd_tvb, off+13, 1, ENC_LITTLE_ENDIAN); |
2560 | |
|
2561 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwt, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN); |
2562 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd4, cmd_tvb, off+14, 1, ENC_LITTLE_ENDIAN); |
2563 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rwl, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN); |
2564 | |
|
2565 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd5, cmd_tvb, off+15, 1, ENC_LITTLE_ENDIAN); |
2566 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_idlp, cmd_tvb, off+16, 2, ENC_LITTLE_ENDIAN); |
2567 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd6, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN); |
2568 | |
|
2569 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_ips, cmd_tvb, off+18, 1, ENC_LITTLE_ENDIAN); |
2570 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd7, cmd_tvb, off+19, 1, ENC_LITTLE_ENDIAN); |
2571 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_actp, cmd_tvb, off+20, 2, ENC_LITTLE_ENDIAN); |
2572 | |
|
2573 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_apw, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN); |
2574 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd8, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN); |
2575 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_aps, cmd_tvb, off+22, 1, ENC_LITTLE_ENDIAN); |
2576 | | /* Bytes 31:23, NVMe Base 2.3 Figure 329: only 31:30 and the two odd |
2577 | | * nibbles are actually Reserved. */ |
2578 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfrt, cmd_tvb, off+23, 1, ENC_LITTLE_ENDIAN); |
2579 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_fqvt, cmd_tvb, off+24, 1, ENC_LITTLE_ENDIAN); |
2580 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfvt, cmd_tvb, off+25, 1, ENC_LITTLE_ENDIAN); |
2581 | |
|
2582 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfrts, cmd_tvb, off+26, 1, ENC_LITTLE_ENDIAN); |
2583 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_fqvts, cmd_tvb, off+26, 1, ENC_LITTLE_ENDIAN); |
2584 | |
|
2585 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_epfvts, cmd_tvb, off+27, 1, ENC_LITTLE_ENDIAN); |
2586 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd9, cmd_tvb, off+27, 1, ENC_LITTLE_ENDIAN); |
2587 | |
|
2588 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mbw, cmd_tvb, off+28, 1, ENC_LITTLE_ENDIAN); |
2589 | |
|
2590 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_mbws, cmd_tvb, off+29, 1, ENC_LITTLE_ENDIAN); |
2591 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd10, cmd_tvb, off+29, 1, ENC_LITTLE_ENDIAN); |
2592 | |
|
2593 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_psd_rsvd11, cmd_tvb, off+30, 2, ENC_NA); |
2594 | 0 | } |
2595 | | |
2596 | | static void dissect_nvme_identify_ctrl_resp_power_state_descriptors(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off) |
2597 | 0 | { |
2598 | 0 | proto_item *ti; |
2599 | 0 | proto_tree *grp; |
2600 | 0 | unsigned i; |
2601 | |
|
2602 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_psds, cmd_tvb, 2048-off, 1024, ENC_NA); |
2603 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2604 | 0 | for (i = 0; i < 32; i++) |
2605 | 0 | dissect_nvme_identify_ctrl_resp_power_state_descriptor(cmd_tvb, grp, i, off); |
2606 | 0 | } |
2607 | | |
2608 | | |
2609 | | static void add_ctrl_rab(char *result, uint32_t val) |
2610 | 0 | { |
2611 | 0 | if (val >= 64) |
2612 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (overflow)", val); |
2613 | 0 | else |
2614 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" command%s)", val, ((uint64_t)1) << val, val ? "s" : ""); |
2615 | 0 | } |
2616 | | |
2617 | | static void add_ctrl_mdts(char *result, uint32_t val) |
2618 | 0 | { |
2619 | 0 | if (val >= 64) |
2620 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (overflow)", val); |
2621 | 0 | else if (val) |
2622 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" pages)", val, ((uint64_t)1) << val); |
2623 | 0 | else |
2624 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (unlimited)", val); |
2625 | 0 | } |
2626 | | |
2627 | | static void add_ctrl_rtd3(char *result, uint32_t val) |
2628 | 0 | { |
2629 | 0 | if (!val) |
2630 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0 (not reported)"); |
2631 | 0 | else |
2632 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%u (%u microsecond%s)", val, val, (val > 1) ? "s" : ""); |
2633 | 0 | } |
2634 | | |
2635 | | static const value_string ctrl_type_tbl[] = { |
2636 | | { 0, "Reserved (not reported)" }, |
2637 | | { 1, "I/O Controller" }, |
2638 | | { 2, "Discovery Controller" }, |
2639 | | { 3, "Administrative Controller" }, |
2640 | | { 0, NULL} |
2641 | | }; |
2642 | | |
2643 | | static const value_string ctrl_rpmbbpwps_tbl[] = { |
2644 | | { 0, "Not specified" }, |
2645 | | { 1, "Not supported" }, |
2646 | | { 2, "Supported" }, |
2647 | | { 3, "Reserved" }, |
2648 | | { 0, NULL} |
2649 | | }; |
2650 | | |
2651 | | static const value_string ctrl_mups_tbl[] = { |
2652 | | { 0, "Reserved" }, |
2653 | | { 1, "0.0001 W" }, |
2654 | | { 2, "0.01 W" }, |
2655 | | { 3, "Reserved" }, |
2656 | | { 0, NULL} |
2657 | | }; |
2658 | | |
2659 | | static const value_string ctrl_srs_tbl[] = { |
2660 | | { 0, "Not reported" }, |
2661 | | { 1, "1 microsecond" }, |
2662 | | { 2, "10 microseconds" }, |
2663 | | { 3, "100 microseconds" }, |
2664 | | { 4, "1 millisecond" }, |
2665 | | { 5, "10 milliseconds" }, |
2666 | | { 0, NULL} |
2667 | | }; |
2668 | | |
2669 | | static const value_string ctrl_dctype_tbl[] = { |
2670 | | { 0, "Not reported" }, |
2671 | | { 1, "Direct Discovery Controller (DDC)" }, |
2672 | | { 2, "Centralized Discovery Controller (CDC)" }, |
2673 | | { 0, NULL} |
2674 | | }; |
2675 | | |
2676 | | static void add_ctrl_ms(char *result, uint32_t val) |
2677 | 0 | { |
2678 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%u (%u ms)", val, val * 100); |
2679 | 0 | } |
2680 | | |
2681 | | static void dissect_nvme_identify_ctrl_resp_ver(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off) |
2682 | 0 | { |
2683 | 0 | proto_item *ti; |
2684 | 0 | proto_tree *grp; |
2685 | |
|
2686 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ver, cmd_tvb, 80-off, 4, ENC_LITTLE_ENDIAN); |
2687 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2688 | |
|
2689 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_mjr, cmd_tvb, 82-off, 2, ENC_LITTLE_ENDIAN); |
2690 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_min, cmd_tvb, 81-off, 1, ENC_LITTLE_ENDIAN); |
2691 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_ver_ter, cmd_tvb, 80-off, 1, ENC_LITTLE_ENDIAN); |
2692 | 0 | } |
2693 | | |
2694 | | static void dissect_nvme_identify_ctrl_resp_fguid(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off) |
2695 | 0 | { |
2696 | 0 | proto_item *ti; |
2697 | 0 | proto_tree *grp; |
2698 | | |
2699 | | /* FGUID uses the EUI-64 based 16-byte designator format and, per the |
2700 | | * NVMe Base spec, "This field is big endian" -- unlike virtually all |
2701 | | * other multi-byte NVMe fields, which default to little endian. */ |
2702 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fguid, cmd_tvb, 112-off, 16, ENC_NA); |
2703 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2704 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_vse, cmd_tvb, 112-off, 8, ENC_BIG_ENDIAN); |
2705 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_oui, cmd_tvb, 120-off, 3, ENC_BIG_ENDIAN); |
2706 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_fguid_ei, cmd_tvb, 123-off, 5, ENC_BIG_ENDIAN); |
2707 | 0 | } |
2708 | | |
2709 | | static void dissect_nvme_identify_ctrl_resp_mi(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, uint32_t off) |
2710 | 0 | { |
2711 | 0 | proto_item *ti; |
2712 | 0 | proto_tree *grp; |
2713 | |
|
2714 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mi, cmd_tvb, 240-off, 16, ENC_NA); |
2715 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
2716 | 0 | proto_tree_add_item(grp, hf_nvme_identify_ctrl_mi_rsvd, cmd_tvb, 240-off, 13, ENC_NA); |
2717 | 0 | add_group_mask_entry(cmd_tvb, grp, 253-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_nvmsr)); |
2718 | 0 | add_group_mask_entry(cmd_tvb, grp, 254-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_vwci)); |
2719 | 0 | add_group_mask_entry(cmd_tvb, grp, 255-off, 1, ASPEC(hf_nvme_identify_ctrl_mi_mec)); |
2720 | 0 | } |
2721 | | |
2722 | | static void add_ctrl_commands(char *result, uint32_t val) |
2723 | 0 | { |
2724 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u command%s)", val, val+1, val ? "s" : ""); |
2725 | 0 | } |
2726 | | |
2727 | | static void add_ctrl_events(char *result, uint32_t val) |
2728 | 0 | { |
2729 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u event%s)", val, val+1, val ? "s" : ""); |
2730 | 0 | } |
2731 | | |
2732 | | static void add_ctrl_entries(char *result, uint32_t val) |
2733 | 0 | { |
2734 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u entr%s)", val, val+1, val ? "ies" : "y"); |
2735 | 0 | } |
2736 | | |
2737 | | static void add_ctrl_states(char *result, uint32_t val) |
2738 | 0 | { |
2739 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x: (%u state%s)", val, val+1, val ? "s" : ""); |
2740 | 0 | } |
2741 | | |
2742 | | static void add_ctrl_hmpre(char *result, uint32_t val) |
2743 | 0 | { |
2744 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%"PRIu64" bytes)", val, ((uint64_t)(val)) * 4096); |
2745 | 0 | } |
2746 | | |
2747 | | static void post_add_bytes_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off, uint8_t shiftl) |
2748 | 0 | { |
2749 | | /* The 128-bit value is little-endian on the wire: byte `off` holds the |
2750 | | * low-order 64 bits and byte `off+8` holds the high-order 64 bits. */ |
2751 | 0 | uint64_t lo = tvb_get_uint64(tvb, off, ENC_LITTLE_ENDIAN); |
2752 | 0 | uint64_t hi = tvb_get_uint64(tvb, off+8, ENC_LITTLE_ENDIAN); |
2753 | |
|
2754 | 0 | if (shiftl) { |
2755 | 0 | hi = hi << shiftl; |
2756 | 0 | hi |= (lo >> (64-shiftl)); |
2757 | 0 | lo = lo << shiftl; |
2758 | 0 | } |
2759 | 0 | if (hi) { |
2760 | 0 | if (!(hi >> 10)) |
2761 | 0 | proto_item_append_text(ti, " (%" PRIu64 " KiB)", (hi << 54) | (lo >> 10)); |
2762 | 0 | else if (!(hi >> 20)) |
2763 | 0 | proto_item_append_text(ti, " (%" PRIu64 " MiB)", (hi << 44) | (lo >> 20)); |
2764 | 0 | else if (!(hi >> 30)) |
2765 | 0 | proto_item_append_text(ti, " (%" PRIu64 " GiB)", (hi << 34) | (lo >> 30)); |
2766 | 0 | else if (!(hi >> 40)) |
2767 | 0 | proto_item_append_text(ti, " (%" PRIu64 " TiB)", (hi << 24) | (lo >> 40)); |
2768 | 0 | else if (!(hi >> 50)) |
2769 | 0 | proto_item_append_text(ti, " (%" PRIu64 " PiB)", (hi << 14) | (lo >> 50)); |
2770 | 0 | else if (!(hi >> 60)) |
2771 | 0 | proto_item_append_text(ti, " (%" PRIu64 " EiB)", (hi << 4) | (lo >> 60)); |
2772 | 0 | else |
2773 | 0 | proto_item_append_text(ti, " (%" PRIu64 " ZiB)", hi >> 6); |
2774 | 0 | } else { |
2775 | 0 | proto_item_append_text(ti, " (%" PRIu64 " bytes)", lo); |
2776 | 0 | } |
2777 | 0 | } |
2778 | | |
2779 | | static void add_ctrl_tmt(char *result, uint32_t val) |
2780 | 0 | { |
2781 | 0 | if (!val) |
2782 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0 (not supported)"); |
2783 | 0 | else |
2784 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%u degrees K", val); |
2785 | 0 | } |
2786 | | |
2787 | | static const value_string mmas_type_tbl[] = { |
2788 | | { 0, "modification not defined" }, |
2789 | | { 1, "no modification after sanitize completion" }, |
2790 | | { 2, "additional modification after sanitize completion" }, |
2791 | | { 0, NULL} |
2792 | | }; |
2793 | | |
2794 | | static void add_ctrl_pow2_bytes(char *result, uint32_t val) |
2795 | 0 | { |
2796 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << val); |
2797 | 0 | } |
2798 | | |
2799 | | static void add_ctrl_pow2_page_size(char *result, uint32_t val) |
2800 | 0 | { |
2801 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (12+val)); |
2802 | 0 | } |
2803 | | |
2804 | | static void add_ctrl_pow2_dstrd_size(char *result, uint32_t val) |
2805 | 0 | { |
2806 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "0x%x (%" PRIu64" bytes)", val, ((uint64_t)1) << (2+val)); |
2807 | 0 | } |
2808 | | |
2809 | | |
2810 | | static const value_string fcb_type_tbl[] = { |
2811 | | { 0, "support for the NSID field set to FFFFFFFFh is not indicated" }, |
2812 | | { 1, "reserved value" }, |
2813 | | { 2, "Flush command does not support the NSID field set to FFFFFFFFh" }, |
2814 | | { 3, "Flush command supports the NSID field set to FFFFFFFFh" }, |
2815 | | { 0, NULL} |
2816 | | }; |
2817 | | |
2818 | | |
2819 | | static void add_ctrl_lblocks(char *result, uint32_t val) |
2820 | 0 | { |
2821 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%u logical block%s", val + 1, val ? "s" : ""); |
2822 | 0 | } |
2823 | | |
2824 | | static const value_string sgls_ify_type_tbl[] = { |
2825 | | { 0, "SGLs are not supported." }, |
2826 | | { 1, "SGLs are supported without alignment or granularity limitations" }, |
2827 | | { 2, "SGLs are supported with DWORD alignment and granularity limitation" }, |
2828 | | { 3, "reserved value" }, |
2829 | | { 0, NULL} |
2830 | | }; |
2831 | | |
2832 | | /* Defined further down with the Get Log Page helpers; used here for the two |
2833 | | * 16-byte count fields (MAXDNA) in the Identify Controller structure. */ |
2834 | | static void post_add_intval_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off); |
2835 | | |
2836 | | static void dissect_nvme_identify_ctrl_resp(tvbuff_t *cmd_tvb, |
2837 | | proto_tree *cmd_tree, unsigned off, unsigned len) |
2838 | 0 | { |
2839 | 0 | proto_item *ti; |
2840 | |
|
2841 | 0 | if (!off) { |
2842 | 0 | CHECK_STOP_PARSE(0, 2); |
2843 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vid, cmd_tvb, 0, 2, ENC_LITTLE_ENDIAN); |
2844 | 0 | } |
2845 | 0 | if (off <= 2) { |
2846 | 0 | CHECK_STOP_PARSE(2, 2); |
2847 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ssvid, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN); |
2848 | 0 | } |
2849 | 0 | if (off <= 4) { |
2850 | 0 | CHECK_STOP_PARSE(4, 20); |
2851 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_sn, cmd_tvb, 4-off, 20, ENC_ASCII); |
2852 | 0 | } |
2853 | 0 | if (off <= 24) { |
2854 | 0 | CHECK_STOP_PARSE(24, 40); |
2855 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mn, cmd_tvb, 24-off, 40, ENC_ASCII); |
2856 | 0 | } |
2857 | 0 | if (off <= 64) { |
2858 | 0 | CHECK_STOP_PARSE(64, 8); |
2859 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fr, cmd_tvb, 64-off, 8, ENC_ASCII); |
2860 | 0 | } |
2861 | 0 | if (off <= 72) { |
2862 | 0 | CHECK_STOP_PARSE(72, 1); |
2863 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rab, cmd_tvb, 72-off, 1, ENC_LITTLE_ENDIAN); |
2864 | 0 | } |
2865 | 0 | if (off <= 73) { |
2866 | 0 | CHECK_STOP_PARSE(73, 3); |
2867 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ieee, cmd_tvb, 73-off, 3, ENC_LITTLE_ENDIAN); |
2868 | 0 | } |
2869 | 0 | if (off <= 76) { |
2870 | 0 | CHECK_STOP_PARSE(76, 1); |
2871 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 76-off, 1, ASPEC(hf_nvme_identify_ctrl_cmic)); |
2872 | 0 | } |
2873 | 0 | if (off <= 77) { |
2874 | 0 | CHECK_STOP_PARSE(77, 1); |
2875 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mdts, cmd_tvb, 77-off, 1, ENC_LITTLE_ENDIAN); |
2876 | 0 | } |
2877 | | |
2878 | 0 | if (off <= 78) { |
2879 | 0 | CHECK_STOP_PARSE(78, 2); |
2880 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntlid, cmd_tvb, 78-off, 2, ENC_LITTLE_ENDIAN); |
2881 | 0 | } |
2882 | 0 | if (off <= 80) { |
2883 | 0 | CHECK_STOP_PARSE(80, 4); |
2884 | 0 | dissect_nvme_identify_ctrl_resp_ver(cmd_tvb, cmd_tree, off); |
2885 | 0 | } |
2886 | 0 | if (off <= 84) { |
2887 | 0 | CHECK_STOP_PARSE(84, 4); |
2888 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3r, cmd_tvb, 84-off, 4, ENC_LITTLE_ENDIAN); |
2889 | 0 | } |
2890 | | |
2891 | 0 | if (off <= 88) { |
2892 | 0 | CHECK_STOP_PARSE(88, 4); |
2893 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rtd3e, cmd_tvb, 88-off, 4, ENC_LITTLE_ENDIAN); |
2894 | 0 | } |
2895 | 0 | if (off <= 92) { |
2896 | 0 | CHECK_STOP_PARSE(92, 4); |
2897 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 92-off, 4, ASPEC(hf_nvme_identify_ctrl_oaes)); |
2898 | 0 | } |
2899 | 0 | if (off <= 96) { |
2900 | 0 | CHECK_STOP_PARSE(96, 4); |
2901 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 96-off, 4, ASPEC(hf_nvme_identify_ctrl_ctratt)); |
2902 | 0 | } |
2903 | | |
2904 | 0 | if (off <= 100) { |
2905 | 0 | CHECK_STOP_PARSE(100, 2); |
2906 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 100-off, 2, ASPEC(hf_nvme_identify_ctrl_rrls)); |
2907 | 0 | } |
2908 | 0 | if (off <= 102) { |
2909 | 0 | CHECK_STOP_PARSE(102, 1); |
2910 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 102-off, 1, ASPEC(hf_nvme_identify_ctrl_bpcap)); |
2911 | 0 | } |
2912 | 0 | if (off <= 103) { |
2913 | 0 | CHECK_STOP_PARSE(103, 1); |
2914 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd0, cmd_tvb, 103-off, 1, ENC_NA); |
2915 | 0 | } |
2916 | 0 | if (off <= 104) { |
2917 | 0 | CHECK_STOP_PARSE(104, 4); |
2918 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nssl, cmd_tvb, 104-off, 4, ENC_LITTLE_ENDIAN); |
2919 | 0 | } |
2920 | 0 | if (off <= 108) { |
2921 | 0 | CHECK_STOP_PARSE(108, 2); |
2922 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd6, cmd_tvb, 108-off, 2, ENC_NA); |
2923 | 0 | } |
2924 | 0 | if (off <= 110) { |
2925 | 0 | CHECK_STOP_PARSE(110, 1); |
2926 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 110-off, 1, ASPEC(hf_nvme_identify_ctrl_plsi)); |
2927 | 0 | } |
2928 | 0 | if (off <= 111) { |
2929 | 0 | CHECK_STOP_PARSE(111, 1); |
2930 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cntrltype, cmd_tvb, 111-off, 1, ENC_LITTLE_ENDIAN); |
2931 | 0 | } |
2932 | 0 | if (off <= 112) { |
2933 | 0 | CHECK_STOP_PARSE(112, 16); |
2934 | 0 | dissect_nvme_identify_ctrl_resp_fguid(cmd_tvb, cmd_tree, off); |
2935 | 0 | } |
2936 | | |
2937 | 0 | if (off <= 128) { |
2938 | 0 | CHECK_STOP_PARSE(128, 2); |
2939 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt1, cmd_tvb, 128-off, 2, ENC_LITTLE_ENDIAN); |
2940 | 0 | } |
2941 | 0 | if (off <= 130) { |
2942 | 0 | CHECK_STOP_PARSE(130, 2); |
2943 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt2, cmd_tvb, 130-off, 2, ENC_LITTLE_ENDIAN); |
2944 | 0 | } |
2945 | 0 | if (off <= 132) { |
2946 | 0 | CHECK_STOP_PARSE(132, 2); |
2947 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_crdt3, cmd_tvb, 132-off, 2, ENC_LITTLE_ENDIAN); |
2948 | 0 | } |
2949 | | |
2950 | 0 | if (off <= 134) { |
2951 | 0 | CHECK_STOP_PARSE(134, 1); |
2952 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 134-off, 1, ASPEC(hf_nvme_identify_ctrl_crcap)); |
2953 | 0 | } |
2954 | 0 | if (off <= 135) { |
2955 | 0 | CHECK_STOP_PARSE(135, 1); |
2956 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_ciu, cmd_tvb, 135-off, 1, ENC_LITTLE_ENDIAN); |
2957 | 0 | } |
2958 | 0 | if (off <= 136) { |
2959 | 0 | CHECK_STOP_PARSE(136, 8); |
2960 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cirn, cmd_tvb, 136-off, 8, ENC_LITTLE_ENDIAN); |
2961 | 0 | } |
2962 | 0 | if (off <= 144) { |
2963 | 0 | CHECK_STOP_PARSE(144, 96); |
2964 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd1, cmd_tvb, 144-off, 96, ENC_NA); |
2965 | 0 | } |
2966 | 0 | if (off <= 240) { |
2967 | 0 | CHECK_STOP_PARSE(240, 16); |
2968 | 0 | dissect_nvme_identify_ctrl_resp_mi(cmd_tvb, cmd_tree, off); |
2969 | 0 | } |
2970 | 0 | if (off <= 256) { |
2971 | 0 | CHECK_STOP_PARSE(256, 2); |
2972 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 256-off, 2, ASPEC(hf_nvme_identify_ctrl_oacs)); |
2973 | 0 | } |
2974 | | |
2975 | 0 | if (off <= 258) { |
2976 | 0 | CHECK_STOP_PARSE(258, 1); |
2977 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acl, cmd_tvb, 258-off, 1, ENC_LITTLE_ENDIAN); |
2978 | 0 | } |
2979 | 0 | if (off <= 259) { |
2980 | 0 | CHECK_STOP_PARSE(259, 1); |
2981 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_aerl, cmd_tvb, 259-off, 1, ENC_LITTLE_ENDIAN); |
2982 | 0 | } |
2983 | 0 | if (off <= 260) { |
2984 | 0 | CHECK_STOP_PARSE(260, 1); |
2985 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 260-off, 1, ASPEC(hf_nvme_identify_ctrl_frmw)); |
2986 | 0 | } |
2987 | | |
2988 | 0 | if (off <= 261) { |
2989 | 0 | CHECK_STOP_PARSE(261, 1); |
2990 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 261-off, 1, ASPEC(hf_nvme_identify_ctrl_lpa)); |
2991 | 0 | } |
2992 | 0 | if (off <= 262) { |
2993 | 0 | CHECK_STOP_PARSE(262, 1); |
2994 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_elpe, cmd_tvb, 262-off, 1, ENC_LITTLE_ENDIAN); |
2995 | 0 | } |
2996 | 0 | if (off <= 263) { |
2997 | 0 | CHECK_STOP_PARSE(263, 1); |
2998 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_npss, cmd_tvb, 263-off, 1, ENC_LITTLE_ENDIAN); |
2999 | 0 | } |
3000 | | |
3001 | 0 | if (off <= 264) { |
3002 | 0 | CHECK_STOP_PARSE(264, 1); |
3003 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 264-off, 1, ASPEC(hf_nvme_identify_ctrl_avscc)); |
3004 | 0 | } |
3005 | 0 | if (off <= 265) { |
3006 | 0 | CHECK_STOP_PARSE(265, 1); |
3007 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 265-off, 1, ASPEC(hf_nvme_identify_ctrl_apsta)); |
3008 | 0 | } |
3009 | 0 | if (off <= 266) { |
3010 | 0 | CHECK_STOP_PARSE(266, 2); |
3011 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_wctemp, cmd_tvb, 266-off, 2, ENC_LITTLE_ENDIAN); |
3012 | |
|
3013 | 0 | } |
3014 | 0 | if (off <= 268) { |
3015 | 0 | CHECK_STOP_PARSE(268, 2); |
3016 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cctemp, cmd_tvb, 268-off, 2, ENC_LITTLE_ENDIAN); |
3017 | 0 | } |
3018 | 0 | if (off <= 270) { |
3019 | 0 | CHECK_STOP_PARSE(270, 2); |
3020 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mtfa, cmd_tvb, 270-off, 2, ENC_LITTLE_ENDIAN); |
3021 | 0 | } |
3022 | 0 | if (off <= 272) { |
3023 | 0 | CHECK_STOP_PARSE(272, 4); |
3024 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmpre, cmd_tvb, 272-off, 4, ENC_LITTLE_ENDIAN); |
3025 | 0 | } |
3026 | 0 | if (off <= 276) { |
3027 | 0 | CHECK_STOP_PARSE(276, 4); |
3028 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmin, cmd_tvb, 276-off, 4, ENC_LITTLE_ENDIAN); |
3029 | 0 | } |
3030 | | |
3031 | 0 | if (off <= 280) { |
3032 | 0 | CHECK_STOP_PARSE(280, 16); |
3033 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_tnvmcap, cmd_tvb, 280-off, 16, ENC_NA); |
3034 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, 280-off, 0); |
3035 | 0 | } |
3036 | 0 | if (off <= 296) { |
3037 | 0 | CHECK_STOP_PARSE(296, 16); |
3038 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_unvmcap, cmd_tvb, 296-off, 16, ENC_NA); |
3039 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, 296-off, 0); |
3040 | 0 | } |
3041 | | |
3042 | 0 | if (off <= 312) { |
3043 | 0 | CHECK_STOP_PARSE(312, 4); |
3044 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 312-off, 4, ASPEC(hf_nvme_identify_ctrl_rpmbs)); |
3045 | 0 | } |
3046 | 0 | if (off <= 316) { |
3047 | 0 | CHECK_STOP_PARSE(316, 2); |
3048 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_edstt, cmd_tvb, 316-off, 2, ENC_LITTLE_ENDIAN); |
3049 | 0 | } |
3050 | 0 | if (off <= 318) { |
3051 | 0 | CHECK_STOP_PARSE(318, 1); |
3052 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 318-off, 1, ASPEC(hf_nvme_identify_ctrl_dsto)); |
3053 | 0 | } |
3054 | | |
3055 | 0 | if (off <= 319) { |
3056 | 0 | CHECK_STOP_PARSE(319, 1); |
3057 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_fwug, cmd_tvb, 319-off, 1, ENC_LITTLE_ENDIAN); |
3058 | 0 | } |
3059 | 0 | if (off <= 320) { |
3060 | 0 | CHECK_STOP_PARSE(320, 2); |
3061 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_kas, cmd_tvb, 320-off, 2, ENC_LITTLE_ENDIAN); |
3062 | 0 | } |
3063 | 0 | if (off <= 322) { |
3064 | 0 | CHECK_STOP_PARSE(322, 2); |
3065 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 322-off, 2, ASPEC(hf_nvme_identify_ctrl_hctma)); |
3066 | 0 | } |
3067 | | |
3068 | 0 | if (off <= 324) { |
3069 | 0 | CHECK_STOP_PARSE(324, 2); |
3070 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mntmt, cmd_tvb, 324-off, 2, ENC_LITTLE_ENDIAN); |
3071 | 0 | } |
3072 | 0 | if (off <= 326) { |
3073 | 0 | CHECK_STOP_PARSE(326, 2); |
3074 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mxtmt, cmd_tvb, 326-off, 2, ENC_LITTLE_ENDIAN); |
3075 | 0 | } |
3076 | 0 | if (off <= 328) { |
3077 | 0 | CHECK_STOP_PARSE(328, 4); |
3078 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 328-off, 4, ASPEC(hf_nvme_identify_ctrl_sanicap)); |
3079 | 0 | } |
3080 | | |
3081 | 0 | if (off <= 332) { |
3082 | 0 | CHECK_STOP_PARSE(332, 4); |
3083 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmminds, cmd_tvb, 332-off, 4, ENC_LITTLE_ENDIAN); |
3084 | 0 | } |
3085 | 0 | if (off <= 336) { |
3086 | 0 | CHECK_STOP_PARSE(336, 2); |
3087 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hmmaxd, cmd_tvb, 336-off, 2, ENC_LITTLE_ENDIAN); |
3088 | 0 | } |
3089 | 0 | if (off <= 338) { |
3090 | 0 | CHECK_STOP_PARSE(338, 2); |
3091 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nsetidmax, cmd_tvb, 338-off, 2, ENC_LITTLE_ENDIAN); |
3092 | 0 | } |
3093 | | |
3094 | 0 | if (off <= 340) { |
3095 | 0 | CHECK_STOP_PARSE(340, 2); |
3096 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_endgidmax, cmd_tvb, 340-off, 2, ENC_LITTLE_ENDIAN); |
3097 | 0 | } |
3098 | 0 | if (off <= 342) { |
3099 | 0 | CHECK_STOP_PARSE(342, 1); |
3100 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anatt, cmd_tvb, 342-off, 1, ENC_LITTLE_ENDIAN); |
3101 | 0 | } |
3102 | 0 | if (off <= 343) { |
3103 | 0 | CHECK_STOP_PARSE(343, 1); |
3104 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 343-off, 1, ASPEC(hf_nvme_identify_ctrl_anacap)); |
3105 | 0 | } |
3106 | | |
3107 | 0 | if (off <= 344) { |
3108 | 0 | CHECK_STOP_PARSE(344, 4); |
3109 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_anagrpmax, cmd_tvb, 344-off, 4, ENC_LITTLE_ENDIAN); |
3110 | 0 | } |
3111 | 0 | if (off <= 348) { |
3112 | 0 | CHECK_STOP_PARSE(348, 4); |
3113 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nanagrpid, cmd_tvb, 348-off, 4, ENC_LITTLE_ENDIAN); |
3114 | 0 | } |
3115 | 0 | if (off <= 352) { |
3116 | 0 | CHECK_STOP_PARSE(352, 4); |
3117 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_pels, cmd_tvb, 352-off, 4, ENC_LITTLE_ENDIAN); |
3118 | 0 | } |
3119 | | |
3120 | 0 | if (off <= 356) { |
3121 | 0 | CHECK_STOP_PARSE(356, 2); |
3122 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_did, cmd_tvb, 356-off, 2, ENC_LITTLE_ENDIAN); |
3123 | 0 | } |
3124 | 0 | if (off <= 358) { |
3125 | 0 | CHECK_STOP_PARSE(358, 1); |
3126 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 358-off, 1, ASPEC(hf_nvme_identify_ctrl_kpioc)); |
3127 | 0 | } |
3128 | 0 | if (off <= 359) { |
3129 | 0 | CHECK_STOP_PARSE(359, 1); |
3130 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd2, cmd_tvb, 359-off, 1, ENC_NA); |
3131 | 0 | } |
3132 | 0 | if (off <= 360) { |
3133 | 0 | CHECK_STOP_PARSE(360, 2); |
3134 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mptfawr, cmd_tvb, 360-off, 2, ENC_LITTLE_ENDIAN); |
3135 | 0 | } |
3136 | 0 | if (off <= 362) { |
3137 | 0 | CHECK_STOP_PARSE(362, 6); |
3138 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd7, cmd_tvb, 362-off, 6, ENC_NA); |
3139 | 0 | } |
3140 | 0 | if (off <= 368) { |
3141 | 0 | CHECK_STOP_PARSE(368, 16); |
3142 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_megcap, cmd_tvb, 368-off, 16, ENC_NA); |
3143 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, 368-off, 0); |
3144 | 0 | } |
3145 | 0 | if (off <= 384) { |
3146 | 0 | CHECK_STOP_PARSE(384, 1); |
3147 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 384-off, 1, ASPEC(hf_nvme_identify_ctrl_tmpthha)); |
3148 | 0 | } |
3149 | 0 | if (off <= 385) { |
3150 | 0 | CHECK_STOP_PARSE(385, 1); |
3151 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 385-off, 1, ASPEC(hf_nvme_identify_ctrl_mupa)); |
3152 | 0 | } |
3153 | 0 | if (off <= 386) { |
3154 | 0 | CHECK_STOP_PARSE(386, 2); |
3155 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cqt, cmd_tvb, 386-off, 2, ENC_LITTLE_ENDIAN); |
3156 | 0 | } |
3157 | 0 | if (off <= 388) { |
3158 | 0 | CHECK_STOP_PARSE(388, 2); |
3159 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 388-off, 2, ASPEC(hf_nvme_identify_ctrl_cdpa)); |
3160 | 0 | } |
3161 | 0 | if (off <= 390) { |
3162 | 0 | CHECK_STOP_PARSE(390, 2); |
3163 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mup, cmd_tvb, 390-off, 2, ENC_LITTLE_ENDIAN); |
3164 | 0 | } |
3165 | 0 | if (off <= 392) { |
3166 | 0 | CHECK_STOP_PARSE(392, 2); |
3167 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 392-off, 2, ASPEC(hf_nvme_identify_ctrl_ipmsr)); |
3168 | 0 | } |
3169 | 0 | if (off <= 394) { |
3170 | 0 | CHECK_STOP_PARSE(394, 2); |
3171 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_msmt, cmd_tvb, 394-off, 2, ENC_LITTLE_ENDIAN); |
3172 | 0 | } |
3173 | 0 | if (off <= 396) { |
3174 | 0 | CHECK_STOP_PARSE(396, 116); |
3175 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd8, cmd_tvb, 396-off, 116, ENC_NA); |
3176 | 0 | } |
3177 | 0 | if (off <= 512) { |
3178 | 0 | CHECK_STOP_PARSE(512, 1); |
3179 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 512-off, 1, ASPEC(hf_nvme_identify_ctrl_sqes)); |
3180 | 0 | } |
3181 | 0 | if (off <= 513) { |
3182 | 0 | CHECK_STOP_PARSE(513, 1); |
3183 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 513-off, 1, ASPEC(hf_nvme_identify_ctrl_cqes)); |
3184 | 0 | } |
3185 | | |
3186 | 0 | if (off <= 514) { |
3187 | 0 | CHECK_STOP_PARSE(514, 2); |
3188 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxcmd, cmd_tvb, 514-off, 2, ENC_LITTLE_ENDIAN); |
3189 | 0 | } |
3190 | 0 | if (off <= 516) { |
3191 | 0 | CHECK_STOP_PARSE(516, 4); |
3192 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nn, cmd_tvb, 516-off, 4, ENC_LITTLE_ENDIAN); |
3193 | 0 | } |
3194 | 0 | if (off <= 520) { |
3195 | 0 | CHECK_STOP_PARSE(520, 2); |
3196 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 520-off, 2, ASPEC(hf_nvme_identify_ctrl_oncs)); |
3197 | 0 | } |
3198 | | |
3199 | 0 | if (off <= 522) { |
3200 | 0 | CHECK_STOP_PARSE(522, 2); |
3201 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 522-off, 2, ASPEC(hf_nvme_identify_ctrl_fuses)); |
3202 | 0 | } |
3203 | 0 | if (off <= 524) { |
3204 | 0 | CHECK_STOP_PARSE(524, 1); |
3205 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 524-off, 1, ASPEC(hf_nvme_identify_ctrl_fna)); |
3206 | 0 | } |
3207 | 0 | if (off <= 525) { |
3208 | 0 | CHECK_STOP_PARSE(525, 1); |
3209 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 525-off, 1, ASPEC(hf_nvme_identify_ctrl_vwc)); |
3210 | 0 | } |
3211 | | |
3212 | 0 | if (off <= 526) { |
3213 | 0 | CHECK_STOP_PARSE(526, 2); |
3214 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awun, cmd_tvb, 526-off, 2, ENC_LITTLE_ENDIAN); |
3215 | 0 | } |
3216 | 0 | if (off <= 528) { |
3217 | 0 | CHECK_STOP_PARSE(528, 2); |
3218 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_awupf, cmd_tvb, 528-off, 2, ENC_LITTLE_ENDIAN); |
3219 | 0 | } |
3220 | 0 | if (off <= 530) { |
3221 | 0 | CHECK_STOP_PARSE(530, 1); |
3222 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 530-off, 1, ASPEC(hf_nvme_identify_ctrl_nvscc)); |
3223 | 0 | } |
3224 | | |
3225 | 0 | if (off <= 531) { |
3226 | 0 | CHECK_STOP_PARSE(531, 1); |
3227 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 531-off, 1, ASPEC(hf_nvme_identify_ctrl_nwpc)); |
3228 | 0 | } |
3229 | 0 | if (off <= 532) { |
3230 | 0 | CHECK_STOP_PARSE(532, 2); |
3231 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_acwu, cmd_tvb, 532-off, 2, ENC_LITTLE_ENDIAN); |
3232 | 0 | } |
3233 | 0 | if (off <= 534) { |
3234 | 0 | CHECK_STOP_PARSE(534, 2); |
3235 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd3, cmd_tvb, 534-off, 2, ENC_NA); |
3236 | 0 | } |
3237 | | |
3238 | 0 | if (off <= 536) { |
3239 | 0 | CHECK_STOP_PARSE(536, 4); |
3240 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 536-off, 4, ASPEC(hf_nvme_identify_ctrl_sgls)); |
3241 | 0 | } |
3242 | 0 | if (off <= 540) { |
3243 | 0 | CHECK_STOP_PARSE(540, 4); |
3244 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mnan, cmd_tvb, 540-off, 4, ENC_LITTLE_ENDIAN); |
3245 | 0 | } |
3246 | 0 | if (off <= 544) { |
3247 | 0 | CHECK_STOP_PARSE(544, 16); |
3248 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxdna, cmd_tvb, 544-off, 16, ENC_NA); |
3249 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, 544-off); |
3250 | 0 | } |
3251 | 0 | if (off <= 560) { |
3252 | 0 | CHECK_STOP_PARSE(560, 4); |
3253 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxcna, cmd_tvb, 560-off, 4, ENC_LITTLE_ENDIAN); |
3254 | 0 | } |
3255 | 0 | if (off <= 564) { |
3256 | 0 | CHECK_STOP_PARSE(564, 4); |
3257 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_oaqd, cmd_tvb, 564-off, 4, ENC_LITTLE_ENDIAN); |
3258 | 0 | } |
3259 | 0 | if (off <= 568) { |
3260 | 0 | CHECK_STOP_PARSE(568, 1); |
3261 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rhiri, cmd_tvb, 568-off, 1, ENC_LITTLE_ENDIAN); |
3262 | 0 | } |
3263 | 0 | if (off <= 569) { |
3264 | 0 | CHECK_STOP_PARSE(569, 1); |
3265 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_hirt, cmd_tvb, 569-off, 1, ENC_LITTLE_ENDIAN); |
3266 | 0 | } |
3267 | 0 | if (off <= 570) { |
3268 | 0 | CHECK_STOP_PARSE(570, 2); |
3269 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_cmmrtd, cmd_tvb, 570-off, 2, ENC_LITTLE_ENDIAN); |
3270 | 0 | } |
3271 | 0 | if (off <= 572) { |
3272 | 0 | CHECK_STOP_PARSE(572, 2); |
3273 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nmmrtd, cmd_tvb, 572-off, 2, ENC_LITTLE_ENDIAN); |
3274 | 0 | } |
3275 | 0 | if (off <= 574) { |
3276 | 0 | CHECK_STOP_PARSE(574, 1); |
3277 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_minmrtg, cmd_tvb, 574-off, 1, ENC_LITTLE_ENDIAN); |
3278 | 0 | } |
3279 | 0 | if (off <= 575) { |
3280 | 0 | CHECK_STOP_PARSE(575, 1); |
3281 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_maxmrtg, cmd_tvb, 575-off, 1, ENC_LITTLE_ENDIAN); |
3282 | 0 | } |
3283 | 0 | if (off <= 576) { |
3284 | 0 | CHECK_STOP_PARSE(576, 1); |
3285 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 576-off, 1, ASPEC(hf_nvme_identify_ctrl_trattr)); |
3286 | 0 | } |
3287 | 0 | if (off <= 577) { |
3288 | 0 | CHECK_STOP_PARSE(577, 1); |
3289 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd4, cmd_tvb, 577-off, 1, ENC_NA); |
3290 | 0 | } |
3291 | 0 | if (off <= 578) { |
3292 | 0 | CHECK_STOP_PARSE(578, 2); |
3293 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcudmq, cmd_tvb, 578-off, 2, ENC_LITTLE_ENDIAN); |
3294 | 0 | } |
3295 | 0 | if (off <= 580) { |
3296 | 0 | CHECK_STOP_PARSE(580, 2); |
3297 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mnsudmq, cmd_tvb, 580-off, 2, ENC_LITTLE_ENDIAN); |
3298 | 0 | } |
3299 | 0 | if (off <= 582) { |
3300 | 0 | CHECK_STOP_PARSE(582, 2); |
3301 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcmr, cmd_tvb, 582-off, 2, ENC_LITTLE_ENDIAN); |
3302 | 0 | } |
3303 | 0 | if (off <= 584) { |
3304 | 0 | CHECK_STOP_PARSE(584, 2); |
3305 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_nmcmr, cmd_tvb, 584-off, 2, ENC_LITTLE_ENDIAN); |
3306 | 0 | } |
3307 | 0 | if (off <= 586) { |
3308 | 0 | CHECK_STOP_PARSE(586, 2); |
3309 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_mcdqpc, cmd_tvb, 586-off, 2, ENC_LITTLE_ENDIAN); |
3310 | 0 | } |
3311 | 0 | if (off <= 588) { |
3312 | 0 | CHECK_STOP_PARSE(588, 180); |
3313 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd9, cmd_tvb, 588-off, 180, ENC_NA); |
3314 | 0 | } |
3315 | | |
3316 | 0 | if (off <= 768) { |
3317 | 0 | CHECK_STOP_PARSE(768, 256); |
3318 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_subnqn, cmd_tvb, 768-off, 256, ENC_ASCII); |
3319 | 0 | } |
3320 | 0 | if (off <= 1024) { |
3321 | 0 | CHECK_STOP_PARSE(1024, 768); |
3322 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_rsvd5, cmd_tvb, 1024-off, 768, ENC_NA); |
3323 | 0 | } |
3324 | 0 | if (off <= 1792) { |
3325 | 0 | CHECK_STOP_PARSE(1792, 256); |
3326 | 0 | dissect_nvme_identify_ctrl_resp_nvmeof(cmd_tvb, cmd_tree, off); |
3327 | 0 | } |
3328 | | |
3329 | 0 | if (off <= 2048) { |
3330 | 0 | CHECK_STOP_PARSE(2048, 1024); |
3331 | 0 | dissect_nvme_identify_ctrl_resp_power_state_descriptors(cmd_tvb, cmd_tree, off); |
3332 | 0 | } |
3333 | | |
3334 | 0 | if (off <= 3072) { |
3335 | 0 | CHECK_STOP_PARSE(3072, 1024); |
3336 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_identify_ctrl_vs, cmd_tvb, 3072-off, 1024, ENC_NA); |
3337 | 0 | } |
3338 | 0 | } |
3339 | | |
3340 | | static void dissect_nvme_identify_resp(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree, |
3341 | | struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
3342 | 0 | { |
3343 | 0 | switch(cmd_ctx->cmd_ctx.cmd_identify.cns) { |
3344 | 0 | case NVME_IDENTIFY_CNS_IDENTIFY_NS: |
3345 | 0 | case NVME_IDENTIFY_CNS_NS_ALLOC: /* same Identify Namespace structure */ |
3346 | 0 | dissect_nvme_identify_ns_resp(cmd_tvb, pinfo, cmd_tree, off, len); |
3347 | 0 | break; |
3348 | 0 | case NVME_IDENTIFY_CNS_IDENTIFY_CTRL: |
3349 | 0 | dissect_nvme_identify_ctrl_resp(cmd_tvb, cmd_tree, off, len); |
3350 | 0 | break; |
3351 | 0 | case NVME_IDENTIFY_CNS_IDENTIFY_NSLIST: |
3352 | 0 | case NVME_IDENTIFY_CNS_NS_ALLOC_LIST: /* same Namespace ID list structure */ |
3353 | 0 | dissect_nvme_identify_nslist_resp(cmd_tvb, cmd_tree, off, len); |
3354 | 0 | break; |
3355 | 0 | case NVME_IDENTIFY_CNS_NSID_DESC_LIST: |
3356 | 0 | dissect_nvme_identify_nsid_desc_list_resp(cmd_tvb, cmd_tree, off, len); |
3357 | 0 | break; |
3358 | 0 | case NVME_IDENTIFY_CNS_NVM_SET_LIST: |
3359 | 0 | dissect_nvme_identify_nvmset_resp(cmd_tvb, cmd_tree, off, len); |
3360 | 0 | break; |
3361 | 0 | case NVME_IDENTIFY_CNS_CS_IND_NS: |
3362 | 0 | dissect_nvme_identify_cs_ind_ns_resp(cmd_tvb, cmd_tree, off, len); |
3363 | 0 | break; |
3364 | 0 | case NVME_IDENTIFY_CNS_CTRL_LIST_NS: |
3365 | 0 | case NVME_IDENTIFY_CNS_CTRL_LIST: /* same Controller List structure */ |
3366 | 0 | dissect_nvme_identify_ctrl_list_resp(cmd_tvb, cmd_tree, off, len); |
3367 | 0 | break; |
3368 | 0 | case NVME_IDENTIFY_CNS_PRI_CTRL_CAP: |
3369 | 0 | dissect_nvme_identify_pri_ctrl_cap_resp(cmd_tvb, cmd_tree, off, len); |
3370 | 0 | break; |
3371 | 0 | case NVME_IDENTIFY_CNS_SEC_CTRL_LIST: |
3372 | 0 | dissect_nvme_identify_sec_ctrl_list_resp(cmd_tvb, cmd_tree, off, len); |
3373 | 0 | break; |
3374 | 0 | case NVME_IDENTIFY_CNS_NS_GRAN_LIST: |
3375 | 0 | dissect_nvme_identify_ns_gran_list_resp(cmd_tvb, cmd_tree, off, len); |
3376 | 0 | break; |
3377 | 0 | case NVME_IDENTIFY_CNS_UUID_LIST: |
3378 | 0 | dissect_nvme_identify_uuid_list_resp(cmd_tvb, cmd_tree, off, len); |
3379 | 0 | break; |
3380 | 0 | default: |
3381 | 0 | break; |
3382 | 0 | } |
3383 | 0 | } |
3384 | | |
3385 | | static void dissect_nvme_identify_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
3386 | 0 | { |
3387 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_identify_dword10)); |
3388 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_identify_dword11)); |
3389 | |
|
3390 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
3391 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
3392 | |
|
3393 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_identify_dword14)); |
3394 | |
|
3395 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
3396 | 0 | } |
3397 | | |
3398 | | /* Log Page Identifiers (NVMe Base 2.3 "Get Log Page – Log Page |
3399 | | * Identifiers"). LID 0Eh is defined by the |
3400 | | * NVM Command Set Specification (LBA Status Information). */ |
3401 | | typedef enum { |
3402 | | NVME_LID_SUPPORTED_LOG_PAGES = 0x00, |
3403 | | NVME_LID_ERROR_INFO = 0x01, |
3404 | | NVME_LID_SMART = 0x02, |
3405 | | NVME_LID_FW_SLOT = 0x03, |
3406 | | NVME_LID_CHANGED_NSLIST = 0x04, |
3407 | | NVME_LID_CMD_SUP_AND_EFF = 0x05, |
3408 | | NVME_LID_DEVICE_SELF_TEST = 0x06, |
3409 | | NVME_LID_TELEMETRY_HOST = 0x07, |
3410 | | NVME_LID_TELEMETRY_CTRL = 0x08, |
3411 | | NVME_LID_ENDURANCE_GROUP = 0x09, |
3412 | | NVME_LID_PRED_LAT_NVM_SET = 0x0A, |
3413 | | NVME_LID_PRED_LAT_EVENT_AGG = 0x0B, |
3414 | | NVME_LID_ANA = 0x0C, |
3415 | | NVME_LID_PERSISTENT_EVENT = 0x0D, |
3416 | | NVME_LID_LBA_STATUS = 0x0E, |
3417 | | NVME_LID_ENDURANCE_GROUP_EVENT_AGG = 0x0F, |
3418 | | NVME_LID_MEDIA_UNIT_STATUS = 0x10, |
3419 | | NVME_LID_SUP_CAP_CONFIG_LIST = 0x11, |
3420 | | NVME_LID_FEATURE_ID_SUP_AND_EFF = 0x12, |
3421 | | NVME_LID_NVME_MI_CMD_SUP_AND_EFF = 0x13, |
3422 | | NVME_LID_CMD_FEAT_LOCKDOWN = 0x14, |
3423 | | NVME_LID_BOOT_PARTITION = 0x15, |
3424 | | NVME_LID_ROTATIONAL_MEDIA = 0x16, |
3425 | | NVME_LID_DISPERSED_NS = 0x17, |
3426 | | NVME_LID_MGMT_ADDR_LIST = 0x18, |
3427 | | NVME_LID_PHY_RX_EOM = 0x19, |
3428 | | NVME_LID_REACHABILITY_GROUPS = 0x1A, |
3429 | | NVME_LID_REACHABILITY_ASSOC = 0x1B, |
3430 | | NVME_LID_CHANGED_ALLOC_NSLIST = 0x1C, |
3431 | | NVME_LID_DEVICE_PERSONALITIES = 0x1D, |
3432 | | NVME_LID_CROSS_CTRL_RESET = 0x1E, |
3433 | | NVME_LID_LOST_HOST_COMM = 0x1F, |
3434 | | NVME_LID_FDP_CONFIGS = 0x20, |
3435 | | NVME_LID_RECLAIM_UNIT_HANDLE_USAGE = 0x21, |
3436 | | NVME_LID_FDP_STATS = 0x22, |
3437 | | NVME_LID_FDP_EVENTS = 0x23, |
3438 | | NVME_LID_POWER_MEASUREMENT = 0x25, |
3439 | | NVME_LID_DISCOVERY = 0x70, |
3440 | | NVME_LID_HOST_DISCOVERY = 0x71, |
3441 | | NVME_LID_AVE_DISCOVERY = 0x72, |
3442 | | NVME_LID_PULL_MODEL_DDC_REQ = 0x73, |
3443 | | NVME_LID_SANITIZE_NS_STATUS_LIST = 0x7F, |
3444 | | NVME_LID_RESERVATION_NOTIFICATION = 0x80, |
3445 | | NVME_LID_SANITIZE_STATUS = 0x81, |
3446 | | } nvme_logpage_lid_t; |
3447 | | |
3448 | | static const value_string logpage_tbl[] = { |
3449 | | { NVME_LID_SUPPORTED_LOG_PAGES, "Supported Log Pages" }, |
3450 | | { NVME_LID_ERROR_INFO, "Error Information" }, |
3451 | | { NVME_LID_SMART, "SMART/Health Information" }, |
3452 | | { NVME_LID_FW_SLOT, "Firmware Slot Information" }, |
3453 | | { NVME_LID_CHANGED_NSLIST, "Changed Attached Namespace List" }, |
3454 | | { NVME_LID_CMD_SUP_AND_EFF, "Commands Supported and Effects" }, |
3455 | | { NVME_LID_DEVICE_SELF_TEST, "Device Self-test" }, |
3456 | | { NVME_LID_TELEMETRY_HOST, "Telemetry Host-Initiated" }, |
3457 | | { NVME_LID_TELEMETRY_CTRL, "Telemetry Controller-Initiated" }, |
3458 | | { NVME_LID_ENDURANCE_GROUP, "Endurance Group Information" }, |
3459 | | { NVME_LID_PRED_LAT_NVM_SET, "Predictable Latency Per NVM Set" }, |
3460 | | { NVME_LID_PRED_LAT_EVENT_AGG, "Predictable Latency Event Aggregate" }, |
3461 | | { NVME_LID_ANA, "Asymmetric Namespace Access" }, |
3462 | | { NVME_LID_PERSISTENT_EVENT, "Persistent Event Log" }, |
3463 | | { NVME_LID_LBA_STATUS, "LBA Status Information" }, |
3464 | | { NVME_LID_ENDURANCE_GROUP_EVENT_AGG, "Endurance Group Event Aggregate" }, |
3465 | | { NVME_LID_MEDIA_UNIT_STATUS, "Media Unit Status" }, |
3466 | | { NVME_LID_SUP_CAP_CONFIG_LIST, "Supported Capacity Configuration List" }, |
3467 | | { NVME_LID_FEATURE_ID_SUP_AND_EFF, "Feature Identifiers Supported and Effects" }, |
3468 | | { NVME_LID_NVME_MI_CMD_SUP_AND_EFF, "NVMe-MI Commands Supported and Effects" }, |
3469 | | { NVME_LID_CMD_FEAT_LOCKDOWN, "Command and Feature Lockdown" }, |
3470 | | { NVME_LID_BOOT_PARTITION, "Boot Partition" }, |
3471 | | { NVME_LID_ROTATIONAL_MEDIA, "Rotational Media Information" }, |
3472 | | { NVME_LID_DISPERSED_NS, "Dispersed Namespace Participating NVM Subsystems" }, |
3473 | | { NVME_LID_MGMT_ADDR_LIST, "Management Address List" }, |
3474 | | { NVME_LID_PHY_RX_EOM, "Physical Interface Receiver Eye Opening Measurement" }, |
3475 | | { NVME_LID_REACHABILITY_GROUPS, "Reachability Groups" }, |
3476 | | { NVME_LID_REACHABILITY_ASSOC, "Reachability Associations" }, |
3477 | | { NVME_LID_CHANGED_ALLOC_NSLIST, "Changed Allocated Namespace List" }, |
3478 | | { NVME_LID_DEVICE_PERSONALITIES, "Device Personalities" }, |
3479 | | { NVME_LID_CROSS_CTRL_RESET, "Cross-Controller Reset" }, |
3480 | | { NVME_LID_LOST_HOST_COMM, "Lost Host Communication" }, |
3481 | | { NVME_LID_FDP_CONFIGS, "FDP Configurations" }, |
3482 | | { NVME_LID_RECLAIM_UNIT_HANDLE_USAGE, "Reclaim Unit Handle Usage" }, |
3483 | | { NVME_LID_FDP_STATS, "FDP Statistics" }, |
3484 | | { NVME_LID_FDP_EVENTS, "FDP Events" }, |
3485 | | { NVME_LID_POWER_MEASUREMENT, "Power Measurement" }, |
3486 | | { NVME_LID_DISCOVERY, "Discovery" }, |
3487 | | { NVME_LID_HOST_DISCOVERY, "Host Discovery" }, |
3488 | | { NVME_LID_AVE_DISCOVERY, "AVE Discovery" }, |
3489 | | { NVME_LID_PULL_MODEL_DDC_REQ, "Pull Model DDC Request" }, |
3490 | | { NVME_LID_SANITIZE_NS_STATUS_LIST, "Sanitize Namespace Status List" }, |
3491 | | { NVME_LID_RESERVATION_NOTIFICATION, "Reservation Notification" }, |
3492 | | { NVME_LID_SANITIZE_STATUS, "Sanitize Status" }, |
3493 | | { 0, NULL } |
3494 | | }; |
3495 | | |
3496 | | static const char *get_logpage_name(unsigned lid) |
3497 | 0 | { |
3498 | 0 | if (lid >= 0x82 && lid <= 0xBE) |
3499 | 0 | return "I/O Command Set Specific"; |
3500 | 0 | else if (lid == 0xBF) |
3501 | 0 | return "Zoned Namespace Command Set"; |
3502 | 0 | else if (lid >= 0xC0) |
3503 | 0 | return "Vendor Specific"; |
3504 | 0 | else |
3505 | 0 | return val_to_str_const(lid, logpage_tbl, "Reserved"); |
3506 | 0 | } |
3507 | | |
3508 | | static void add_logpage_lid(char *result, uint32_t val) |
3509 | 0 | { |
3510 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%s (0x%x)", get_logpage_name(val), val); |
3511 | 0 | } |
3512 | | |
3513 | | static const value_string sec_type_tbl[] = { |
3514 | | { 0, "No security" }, |
3515 | | { 1, "Transport Layer Security (TLS) version >= 1.2" }, |
3516 | | { 0, NULL } |
3517 | | }; |
3518 | | |
3519 | | static void dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off) |
3520 | 0 | { |
3521 | 0 | proto_tree *grp = proto_item_add_subtree(ti, ett_data); |
3522 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN); |
3523 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd, cmd_tvb, off+1, 255, ENC_NA); |
3524 | 0 | } |
3525 | | |
3526 | | static const value_string qp_type_tbl[] = { |
3527 | | { 1, "Reliable Connected" }, |
3528 | | { 2, "Reliable Datagram" }, |
3529 | | { 0, NULL } |
3530 | | }; |
3531 | | |
3532 | | static const value_string pr_type_tbl[] = { |
3533 | | { 1, "No provider specified" }, |
3534 | | { 2, "InfiniBand" }, |
3535 | | { 3, "RoCE (v1)" }, |
3536 | | { 4, "RoCE (v2)" }, |
3537 | | { 5, "iWARP" }, |
3538 | | { 0, NULL } |
3539 | | }; |
3540 | | |
3541 | | static const value_string cms_type_tbl[] = { |
3542 | | { 1, "RDMA_IP_CM" }, |
3543 | | { 0, NULL } |
3544 | | }; |
3545 | | |
3546 | | static void dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(tvbuff_t *cmd_tvb, proto_item *ti, unsigned off) |
3547 | 0 | { |
3548 | 0 | proto_tree *grp; |
3549 | |
|
3550 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3551 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN); |
3552 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN); |
3553 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms, cmd_tvb, off+2, 1, ENC_LITTLE_ENDIAN); |
3554 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0, cmd_tvb, off+3, 5, ENC_NA); |
3555 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey, cmd_tvb, off+8, 2, ENC_LITTLE_ENDIAN); |
3556 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1, cmd_tvb, off+10, 246, ENC_NA); |
3557 | 0 | } |
3558 | | |
3559 | | static const value_string trt_type_tbl[] = { |
3560 | | { 0, "Reserved" }, |
3561 | | { 1, "RDMA Transport" }, |
3562 | | { 2, "Fibre Channel Transport" }, |
3563 | | { 3, "TCP Transport" }, |
3564 | | { 254, "Intra-host Transport" }, |
3565 | | { 0, NULL } |
3566 | | }; |
3567 | | |
3568 | | static const value_string adrfam_type_tbl[] = { |
3569 | | { 0, "Reserved" }, |
3570 | | { 1, "AF_INET" }, |
3571 | | { 2, "AF_INET6" }, |
3572 | | { 3, "AF_IB" }, |
3573 | | { 4, "Fibre Channel" }, |
3574 | | { 254, "Intra-Host" }, |
3575 | | { 0, NULL } |
3576 | | }; |
3577 | | |
3578 | | /* Command Set Identifiers, NVMe Base 2.3 Figure 327 */ |
3579 | | static const value_string csi_tbl[] = { |
3580 | | { 0x00, "NVM Command Set" }, |
3581 | | { 0x01, "Key Value Command Set" }, |
3582 | | { 0x02, "Zoned Namespace Command Set" }, |
3583 | | { 0x03, "Subsystem Local Memory Command Set" }, |
3584 | | { 0x04, "Computational Programs Command Set" }, |
3585 | | { 0, NULL } |
3586 | | }; |
3587 | | |
3588 | | static const value_string sub_type_tbl[] = { |
3589 | | { 0, "Reserved" }, |
3590 | | { 1, "Referral to another Discovery Subsystem" }, |
3591 | | { 2, "NVM subsystem with IO controllers" }, |
3592 | | { 3, "Current Discovery Subsystem" }, |
3593 | | { 0, NULL } |
3594 | | }; |
3595 | | |
3596 | | /* TREQ bits 1:0, NVMe Base 2.3 Figure 310 */ |
3597 | | static const value_string treq_tsc_tbl[] = { |
3598 | | { 0, "Not specified" }, |
3599 | | { 1, "Required" }, |
3600 | | { 2, "Not required" }, |
3601 | | { 3, "Reserved" }, |
3602 | | { 0, NULL } |
3603 | | }; |
3604 | | |
3605 | | /* TREQ bits 5:4, NVMe Base 2.3 Figure 310 */ |
3606 | | static const value_string treq_tasc_tbl[] = { |
3607 | | { 0, "Not specified" }, |
3608 | | { 1, "Authentication required" }, |
3609 | | { 2, "Authentication concatenated to secure channel establishment required" }, |
3610 | | { 3, "Reserved" }, |
3611 | | { 0, NULL } |
3612 | | }; |
3613 | | |
3614 | | static void dissect_nvme_get_logpage_ify_rcrd_resp(tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, proto_tree *tree, uint64_t rcrd, unsigned roff, int off, unsigned len) |
3615 | 0 | { |
3616 | 0 | proto_item *ti; |
3617 | 0 | proto_tree *grp; |
3618 | 0 | unsigned tr_type; |
3619 | |
|
3620 | 0 | ti = proto_tree_add_bytes_format(tree, hf_nvme_get_logpage_ify_rcrd, cmd_tvb, off, |
3621 | 0 | (len < 1024) ? len : 1024, NULL, "Discovery Log Entry %"PRIu64" (DLE%"PRIu64")", rcrd, rcrd); |
3622 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3623 | |
|
3624 | 0 | if (!roff) { |
3625 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ify_rcrd_trtype, cmd_tvb, off, 1, ENC_LITTLE_ENDIAN, &tr_type); |
3626 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_type = tr_type; |
3627 | 0 | } else { |
3628 | 0 | tr_type = cmd_ctx->cmd_ctx.get_logpage.tr_type; |
3629 | 0 | } |
3630 | |
|
3631 | 0 | if (roff <= 1 && (2-roff) <= len) |
3632 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_adrfam, cmd_tvb, off-roff+1, 1, ENC_LITTLE_ENDIAN); |
3633 | |
|
3634 | 0 | if (roff <= 2 && (3-roff) <= len) |
3635 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subtype, cmd_tvb, off-roff+2, 1, ENC_LITTLE_ENDIAN); |
3636 | |
|
3637 | 0 | if (roff <= 3 && (4-roff) <= len) |
3638 | 0 | add_group_mask_entry(cmd_tvb, grp, off-roff+3, 1, ASPEC(hf_nvme_get_logpage_ify_rcrd_treq)); |
3639 | |
|
3640 | 0 | if (roff <= 4 && (6-roff) <= len) |
3641 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_portid, cmd_tvb, off-roff+4, 2, ENC_LITTLE_ENDIAN); |
3642 | |
|
3643 | 0 | if (roff <= 6 && (8-roff) <= len) |
3644 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_cntlid, cmd_tvb, off-roff+6, 2, ENC_LITTLE_ENDIAN); |
3645 | |
|
3646 | 0 | if (roff <= 8 && (10-roff) <= len) |
3647 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_asqsz, cmd_tvb, off-roff+8, 2, ENC_LITTLE_ENDIAN); |
3648 | |
|
3649 | 0 | if (roff <= 10 && (12-roff) <= len) |
3650 | 0 | add_group_mask_entry(cmd_tvb, grp, off-roff+10, 2, ASPEC(hf_nvme_get_logpage_disc_rcrd_eflags)); |
3651 | |
|
3652 | 0 | if (roff <= 12 && (32-roff) <= len) |
3653 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd0, cmd_tvb, off-roff+12, 20, ENC_NA); |
3654 | |
|
3655 | 0 | if (roff <= 32 && (64-roff) <= len) |
3656 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_trsvcid, cmd_tvb, off-roff+32, 32, ENC_ASCII); |
3657 | |
|
3658 | 0 | if (roff <= 64 && (256-roff) <= len) |
3659 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_rsvd1, cmd_tvb, off-roff+64, 192, ENC_NA); |
3660 | |
|
3661 | 0 | if (roff <= 256 && (512-roff) <= len) |
3662 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_subnqn, cmd_tvb, off-roff+256, 256, ENC_ASCII); |
3663 | |
|
3664 | 0 | if (roff <= 512 && (768-roff) <= len) |
3665 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_traddr, cmd_tvb, off-roff+512, 256, ENC_ASCII); |
3666 | |
|
3667 | 0 | if (roff <= 768 && (1024-roff) <= len) { |
3668 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rcrd_tsas, cmd_tvb, off-roff+768, 256, ENC_NA); |
3669 | 0 | if (tr_type == 1) |
3670 | 0 | dissect_nvme_get_logpage_ify_rcrd_tsas_rdma(cmd_tvb, ti, off-roff+768); |
3671 | 0 | else if (tr_type == 3) |
3672 | 0 | dissect_nvme_get_logpage_ify_rcrd_tsas_tcp(cmd_tvb, ti, off-roff+768); |
3673 | 0 | } |
3674 | 0 | } |
3675 | | |
3676 | | static void dissect_nvme_get_logpage_ify_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
3677 | 0 | { |
3678 | 0 | uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off + tr_off; |
3679 | 0 | proto_tree *grp; |
3680 | 0 | unsigned poff; |
3681 | 0 | unsigned roff; |
3682 | 0 | unsigned max_bytes; |
3683 | 0 | uint64_t rcrd, rcrd_ctr = 0; |
3684 | 0 | uint64_t recnum = 0; |
3685 | |
|
3686 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3687 | |
|
3688 | 0 | if (!off && len >= 8) |
3689 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_genctr, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN); |
3690 | | |
3691 | | /* unsigned casts are to silence clang-11 compile errors */ |
3692 | 0 | if (off <= 8 && (16 - (unsigned)off) <= len) |
3693 | 0 | proto_tree_add_item_ret_uint64(grp, hf_nvme_get_logpage_ify_numrec, cmd_tvb, (unsigned)(8-off), 8, ENC_LITTLE_ENDIAN, &recnum); |
3694 | |
|
3695 | 0 | if (off <= 16 && (18 - (unsigned)off) <= len) { |
3696 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_recfmt, cmd_tvb, (unsigned)(16-off), 2, ENC_LITTLE_ENDIAN); |
3697 | 0 | cmd_ctx->cmd_ctx.get_logpage.records = (recnum & 0xffffffff); |
3698 | 0 | } else if (tr_off) { |
3699 | 0 | recnum = cmd_ctx->cmd_ctx.get_logpage.records; |
3700 | 0 | } |
3701 | |
|
3702 | 0 | if (off <= 18 && (1024 - (unsigned)off) <= len) |
3703 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ify_rsvd, cmd_tvb, (unsigned)(18-off), 1006, ENC_NA); |
3704 | |
|
3705 | 0 | if (off <= 1024) { |
3706 | 0 | poff = (1024 - (unsigned)off); /* clang-11 is so strange, hence the cast */ |
3707 | 0 | if (poff >= len) |
3708 | 0 | return; |
3709 | 0 | max_bytes = 1024; |
3710 | 0 | rcrd = 0; |
3711 | 0 | roff = 0; |
3712 | 0 | len -= poff; |
3713 | 0 | } else { |
3714 | 0 | poff = 0; |
3715 | 0 | roff = (off & 1023); |
3716 | 0 | max_bytes = 1024 - (roff); |
3717 | 0 | rcrd = (off - roff) / 1024 - 1; |
3718 | 0 | } |
3719 | | |
3720 | 0 | max_bytes = (max_bytes <= len) ? max_bytes : len; |
3721 | 0 | dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, roff, poff, len); |
3722 | 0 | poff += max_bytes; |
3723 | 0 | len -= max_bytes; |
3724 | 0 | rcrd++; |
3725 | 0 | rcrd_ctr++; |
3726 | | |
3727 | | /* `recnum` is the total number of Discovery Log Entries, and one has just |
3728 | | * been rendered unconditionally above, so `rcrd_ctr` is already 1 here. |
3729 | | * When NUMREC (NVMe Base 2.3 Figure 312, bytes 15:08) was not visible in |
3730 | | * this window, fall back to "one entry per remaining 1024-byte record", |
3731 | | * plus the one already rendered, so the counter keeps the same meaning on |
3732 | | * both paths and `len` stays the real terminator. */ |
3733 | 0 | if (!recnum) |
3734 | 0 | recnum = 1 + (len + 1023) / 1024; |
3735 | |
|
3736 | 0 | while (len && rcrd_ctr < recnum) { |
3737 | 0 | max_bytes = (len >= 1024) ? 1024 : len; |
3738 | 0 | dissect_nvme_get_logpage_ify_rcrd_resp(cmd_tvb, cmd_ctx, grp, rcrd, 0, poff, len); |
3739 | 0 | poff += max_bytes; |
3740 | 0 | len -= max_bytes; |
3741 | 0 | rcrd++; |
3742 | 0 | rcrd_ctr++; |
3743 | 0 | } |
3744 | 0 | } |
3745 | | |
3746 | | /* True if the field at absolute structure offset `struct_off` (width |
3747 | | * `field_len`) is present in the currently-visible window [off, off+len) |
3748 | | * handed to a windowed Get Log Page / Set Features decoder, and sets |
3749 | | * *rel_off to its position relative to cmd_tvb (whose byte 0 is `off` into |
3750 | | * the logical structure). Centralizes the "off <= struct_off && |
3751 | | * (struct_off + field_len - off) <= len" bounds check that was previously |
3752 | | * hand-duplicated across every decoder in this file -- and, for the |
3753 | | * trailing/variable-length field in several of them, was computed via an |
3754 | | * unguarded "len -= poff" that underflows (wrapping to a huge unsigned |
3755 | | * value) whenever the window is shorter than `struct_off` implies. */ |
3756 | | static bool |
3757 | | nvme_field_in_window(unsigned off, unsigned len, unsigned struct_off, unsigned field_len, |
3758 | | unsigned *rel_off) |
3759 | 0 | { |
3760 | 0 | if (off > struct_off || (struct_off + field_len - off) > len) |
3761 | 0 | return false; |
3762 | 0 | *rel_off = struct_off - off; |
3763 | 0 | return true; |
3764 | 0 | } |
3765 | | |
3766 | | /* True if `off` (the combined LPO+transport window offset) is a multiple of |
3767 | | * `rec_len`, the fixed record size of a repeating Log Page array (e.g. the |
3768 | | * 4-byte-per-entry Supported Log Pages / *-Supported-and-Effects tables). |
3769 | | * A compliant target should never split such a transfer mid-record, but |
3770 | | * this dissector has no way to enforce that on the wire -- a non-compliant |
3771 | | * device or a crafted/fuzzed capture can still hand a decoder a window that |
3772 | | * starts mid-record, which would otherwise be silently spliced into a |
3773 | | * bogus entry instead of being rejected. */ |
3774 | | static bool |
3775 | | nvme_offset_record_aligned(unsigned off, unsigned rec_len) |
3776 | 0 | { |
3777 | 0 | return (off % rec_len) == 0; |
3778 | 0 | } |
3779 | | |
3780 | | static void dissect_nvme_get_logpage_err_inf_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
3781 | 0 | { |
3782 | 0 | proto_tree *grp; |
3783 | 0 | unsigned rel; |
3784 | |
|
3785 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3786 | |
|
3787 | 0 | if (off > 63) |
3788 | 0 | return; /* max allowed offset is 63 */ |
3789 | | |
3790 | 0 | if (nvme_field_in_window(off, len, 0, 8, &rel)) |
3791 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_errcnt, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
3792 | 0 | if (nvme_field_in_window(off, len, 8, 2, &rel)) |
3793 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_sqid, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
3794 | 0 | if (nvme_field_in_window(off, len, 10, 2, &rel)) |
3795 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_cid, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
3796 | 0 | if (nvme_field_in_window(off, len, 12, 2, &rel)) |
3797 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_errinf_sf)); |
3798 | 0 | if (nvme_field_in_window(off, len, 14, 2, &rel)) |
3799 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_errinf_pel)); |
3800 | 0 | if (nvme_field_in_window(off, len, 16, 8, &rel)) |
3801 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_lba, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
3802 | 0 | if (nvme_field_in_window(off, len, 24, 4, &rel)) |
3803 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_ns, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
3804 | 0 | if (nvme_field_in_window(off, len, 28, 1, &rel)) |
3805 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_vsi, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3806 | 0 | if (nvme_field_in_window(off, len, 29, 1, &rel)) |
3807 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_trtype, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3808 | | /* The spec's "CSI" here is Command Set Indicator (byte 30), but the |
3809 | | * ".csi" filter name was already taken upstream in 2021 by Command |
3810 | | * Specific Information (byte 32, below) and has shipped since 3.6.0, so |
3811 | | * this field uses ".cmdset" rather than silently repurposing it. */ |
3812 | 0 | if (nvme_field_in_window(off, len, 30, 1, &rel)) |
3813 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_cmdset, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3814 | 0 | if (nvme_field_in_window(off, len, 31, 1, &rel)) |
3815 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_opc, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3816 | 0 | if (nvme_field_in_window(off, len, 32, 8, &rel)) |
3817 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_csi, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
3818 | 0 | if (nvme_field_in_window(off, len, 40, 2, &rel)) |
3819 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_tsi, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
3820 | 0 | if (nvme_field_in_window(off, len, 42, 21, &rel)) |
3821 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_rsvd1, cmd_tvb, rel, 21, ENC_NA); |
3822 | 0 | if (nvme_field_in_window(off, len, 63, 1, &rel)) |
3823 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_errinf_lpver, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3824 | 0 | } |
3825 | | |
3826 | | static void post_add_intval_from_16bytes(proto_item *ti, tvbuff_t *tvb, unsigned off) |
3827 | 0 | { |
3828 | | /* The 128-bit value is little-endian on the wire: byte `off` holds the |
3829 | | * low-order 64 bits and byte `off+8` holds the high-order 64 bits. */ |
3830 | 0 | uint64_t lo = tvb_get_uint64(tvb, off, ENC_LITTLE_ENDIAN); |
3831 | 0 | uint64_t hi = tvb_get_uint64(tvb, off+8, ENC_LITTLE_ENDIAN); |
3832 | 0 | double res; |
3833 | |
|
3834 | 0 | res = (double)hi; |
3835 | 0 | res *= (((uint64_t)1) << 63); |
3836 | 0 | res *= 2; |
3837 | 0 | res += lo; |
3838 | 0 | if (res > 99999999) |
3839 | 0 | proto_item_append_text(ti, " (%.8le)", res); |
3840 | 0 | else |
3841 | 0 | proto_item_append_text(ti, " (%.0lf)", res); |
3842 | 0 | } |
3843 | | |
3844 | | static void decode_smart_resp_temps(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
3845 | 0 | { |
3846 | 0 | proto_item *ti; |
3847 | 0 | unsigned bytes; |
3848 | 0 | unsigned poff; |
3849 | 0 | unsigned max_bytes; |
3850 | 0 | unsigned i; |
3851 | | |
3852 | |
|
3853 | 0 | poff = (off < 200) ? 200-off : 0; |
3854 | |
|
3855 | 0 | if (off > 214 || (poff + 2) > len) |
3856 | 0 | return; |
3857 | | |
3858 | 0 | bytes = len - poff; |
3859 | 0 | max_bytes = (off <= 200) ? 16 : (216 - off); |
3860 | |
|
3861 | 0 | if (bytes > max_bytes) |
3862 | 0 | bytes = max_bytes; |
3863 | |
|
3864 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[0], cmd_tvb, poff, bytes, ENC_NA); |
3865 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3866 | 0 | for (i = 0; i < 8; i++) { |
3867 | 0 | unsigned pos = 200 + i * 2; |
3868 | 0 | unsigned rel; |
3869 | 0 | if (nvme_field_in_window(off, len, pos, 2, &rel)) |
3870 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ts[i+1], cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
3871 | 0 | } |
3872 | 0 | } |
3873 | | |
3874 | | static void dissect_nvme_get_logpage_smart_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
3875 | 0 | { |
3876 | 0 | proto_tree *grp; |
3877 | 0 | unsigned rel; |
3878 | |
|
3879 | 0 | if (off >= 512) |
3880 | 0 | return; /* max allowed offset is < 512 */ |
3881 | | |
3882 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3883 | 0 | if (nvme_field_in_window(off, len, 0, 1, &rel)) |
3884 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_smart_cw)); |
3885 | 0 | if (nvme_field_in_window(off, len, 1, 2, &rel)) |
3886 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ct, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
3887 | 0 | if (nvme_field_in_window(off, len, 3, 1, &rel)) |
3888 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_asc, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3889 | 0 | if (nvme_field_in_window(off, len, 4, 1, &rel)) |
3890 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ast, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3891 | 0 | if (nvme_field_in_window(off, len, 5, 1, &rel)) |
3892 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_lpu, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
3893 | 0 | if (nvme_field_in_window(off, len, 6, 1, &rel)) |
3894 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_smart_egcws)); |
3895 | 0 | if (nvme_field_in_window(off, len, 7, 25, &rel)) |
3896 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd0, cmd_tvb, rel, 25, ENC_NA); |
3897 | 0 | if (nvme_field_in_window(off, len, 32, 16, &rel)) { |
3898 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_dur, cmd_tvb, rel, 16, ENC_NA); |
3899 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 16); |
3900 | 0 | } |
3901 | 0 | if (nvme_field_in_window(off, len, 48, 16, &rel)) { |
3902 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_duw, cmd_tvb, rel, 16, ENC_NA); |
3903 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 16); |
3904 | 0 | } |
3905 | 0 | if (nvme_field_in_window(off, len, 64, 16, &rel)) { |
3906 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hrc, cmd_tvb, rel, 16, ENC_NA); |
3907 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3908 | 0 | } |
3909 | 0 | if (nvme_field_in_window(off, len, 80, 16, &rel)) { |
3910 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_hwc, cmd_tvb, rel, 16, ENC_NA); |
3911 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3912 | 0 | } |
3913 | 0 | if (nvme_field_in_window(off, len, 96, 16, &rel)) { |
3914 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cbt, cmd_tvb, rel, 16, ENC_NA); |
3915 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3916 | 0 | } |
3917 | 0 | if (nvme_field_in_window(off, len, 112, 16, &rel)) { |
3918 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_pc, cmd_tvb, rel, 16, ENC_NA); |
3919 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3920 | 0 | } |
3921 | 0 | if (nvme_field_in_window(off, len, 128, 16, &rel)) { |
3922 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_poh, cmd_tvb, rel, 16, ENC_NA); |
3923 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3924 | 0 | } |
3925 | 0 | if (nvme_field_in_window(off, len, 144, 16, &rel)) { |
3926 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_us, cmd_tvb, rel, 16, ENC_NA); |
3927 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3928 | 0 | } |
3929 | 0 | if (nvme_field_in_window(off, len, 160, 16, &rel)) { |
3930 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_mie, cmd_tvb, rel, 16, ENC_NA); |
3931 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3932 | 0 | } |
3933 | 0 | if (nvme_field_in_window(off, len, 176, 16, &rel)) { |
3934 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_smart_ele, cmd_tvb, rel, 16, ENC_NA); |
3935 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
3936 | 0 | } |
3937 | 0 | if (nvme_field_in_window(off, len, 192, 4, &rel)) |
3938 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_wctt, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
3939 | 0 | if (nvme_field_in_window(off, len, 196, 4, &rel)) |
3940 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_cctt, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
3941 | |
|
3942 | 0 | decode_smart_resp_temps(grp, cmd_tvb, off, len); |
3943 | |
|
3944 | 0 | if (off <= 216 && (220 -off) <= len) |
3945 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1c, cmd_tvb, 216-off, 4, ENC_LITTLE_ENDIAN); |
3946 | 0 | if (off <= 220 && (224 -off) <= len) |
3947 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2c, cmd_tvb, 220-off, 4, ENC_LITTLE_ENDIAN); |
3948 | 0 | if (off <= 224 && (228 -off) <= len) |
3949 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt1t, cmd_tvb, 224-off, 4, ENC_LITTLE_ENDIAN); |
3950 | 0 | if (off <= 228 && (232 -off) <= len) |
3951 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_tmt2t, cmd_tvb, 228-off, 4, ENC_LITTLE_ENDIAN); |
3952 | 0 | if (off < 512) { |
3953 | 0 | unsigned poff = (off < 232) ? (232 - off) : 0; |
3954 | 0 | unsigned max_len = (off <= 232) ? 280 : 512 - off; |
3955 | 0 | if (len > poff) { |
3956 | 0 | len -= poff; |
3957 | 0 | if (len > max_len) |
3958 | 0 | len = max_len; |
3959 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_smart_rsvd1, cmd_tvb, poff, len, ENC_NA); |
3960 | 0 | } |
3961 | 0 | } |
3962 | 0 | } |
3963 | | |
3964 | | static void decode_fw_slot_frs(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned len) |
3965 | 0 | { |
3966 | 0 | proto_item *ti; |
3967 | 0 | unsigned bytes; |
3968 | 0 | unsigned poff; |
3969 | 0 | unsigned max_bytes; |
3970 | 0 | unsigned i; |
3971 | | |
3972 | | |
3973 | | /* poff is cmd_tvb-relative (cmd_tvb byte 0 == struct byte `off`): for |
3974 | | * off < 8, struct offset 8 (where the frs array starts) is still ahead |
3975 | | * of the window, at tvb position (8-off); for off >= 8, the window |
3976 | | * already begins inside-or-past the frs array, so the array's group |
3977 | | * item starts at tvb position 0. This previously read ": off" instead |
3978 | | * of ": 0" -- dimensionally wrong (mixing a struct-absolute offset into |
3979 | | * a tvb-relative position) and never reachable/tested before the |
3980 | | * DOFST/LPO windowing fix, since off was always 0 here beforehand. */ |
3981 | 0 | poff = (off < 8) ? 8-off : 0; |
3982 | |
|
3983 | 0 | if (off > 56 || (poff + 8) > len) |
3984 | 0 | return; |
3985 | | |
3986 | 0 | bytes = len - poff; |
3987 | 0 | max_bytes = (off <= 8) ? 56 : (64 - off); |
3988 | |
|
3989 | 0 | if (bytes > max_bytes) |
3990 | 0 | bytes = max_bytes; |
3991 | |
|
3992 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs, cmd_tvb, poff, bytes, ENC_NA); |
3993 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
3994 | 0 | for (i = 0; i < 7; i++) { |
3995 | 0 | unsigned pos = 8 + i * 8; |
3996 | 0 | unsigned rel; |
3997 | 0 | if (nvme_field_in_window(off, len, pos, 8, &rel)) |
3998 | | /* Base 2.3 Fig 212: "The firmware revision is indicated as an |
3999 | | * ASCII string." The raw bytes remain visible in the hex dump |
4000 | | * of the reassembled message if needed. */ |
4001 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_frs_ascii[i], cmd_tvb, rel, 8, ENC_ASCII); |
4002 | 0 | } |
4003 | 0 | } |
4004 | | |
4005 | | static void dissect_nvme_get_logpage_fw_slot_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
4006 | 0 | { |
4007 | 0 | proto_tree *grp; |
4008 | 0 | unsigned rel; |
4009 | |
|
4010 | 0 | if (off >= 512) |
4011 | 0 | return; /* max allowed offset is < 512 */ |
4012 | | |
4013 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4014 | |
|
4015 | 0 | if (!off && len >= 1) |
4016 | 0 | add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_fw_slot_afi)); |
4017 | 0 | if (nvme_field_in_window(off, len, 1, 7, &rel)) |
4018 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd0, cmd_tvb, rel, 7, ENC_LITTLE_ENDIAN); |
4019 | |
|
4020 | 0 | decode_fw_slot_frs(grp, cmd_tvb, off, len); |
4021 | |
|
4022 | 0 | if (off < 512) { |
4023 | 0 | unsigned poff = (off < 64) ? (64 - off) : 0; |
4024 | 0 | unsigned max_len = (off <= 64) ? 448 : 512 - off; |
4025 | | /* Guard before subtracting: len < poff would otherwise underflow |
4026 | | * `len` (unsigned) to a huge value on a short/truncated transfer. */ |
4027 | 0 | if (len > poff) { |
4028 | 0 | len -= poff; |
4029 | 0 | if (len > max_len) |
4030 | 0 | len = max_len; |
4031 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_fw_slot_rsvd1, cmd_tvb, poff, len, ENC_NA); |
4032 | 0 | } |
4033 | 0 | } |
4034 | 0 | } |
4035 | | |
4036 | | static void dissect_nvme_get_logpage_changed_nslist_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len) |
4037 | 0 | { |
4038 | 0 | proto_tree *grp; |
4039 | 0 | unsigned poff = 0; |
4040 | | /* Page is 1024 four-byte entries = 4096 bytes; a nonzero window offset |
4041 | | * moves where the spec-mandated 4096-byte ceiling falls relative to |
4042 | | * this window, and (if 4-byte aligned) where cmd_tvb position 0 lands |
4043 | | * relative to an entry boundary -- see the alignment guard below. */ |
4044 | 0 | unsigned max_len = (off < 4096) ? (4096 - off) : 0; |
4045 | |
|
4046 | 0 | if (len > max_len) |
4047 | 0 | len = max_len; |
4048 | |
|
4049 | 0 | if (!nvme_offset_record_aligned(off, 4)) { |
4050 | 0 | expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned); |
4051 | 0 | return; |
4052 | 0 | } |
4053 | | |
4054 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4055 | 0 | while (len >= 4) { |
4056 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_changed_nslist, cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN); |
4057 | 0 | len -= 4; |
4058 | 0 | poff += 4; |
4059 | 0 | } |
4060 | 0 | } |
4061 | | |
4062 | | static const value_string lockdown_scope_tbl[] = { |
4063 | | { 0, "Admin Command Set opcodes" }, |
4064 | | { 2, "Feature Identifiers" }, |
4065 | | { 3, "Management Interface Command Set opcodes" }, |
4066 | | { 4, "PCIe Command Set opcodes" }, |
4067 | | { 0, NULL } |
4068 | | }; |
4069 | | |
4070 | | static const value_string lockdown_contents_tbl[] = { |
4071 | | { 0, "Can-be-prohibited list" }, |
4072 | | { 1, "Currently prohibited (Admin Submission Queue)" }, |
4073 | | { 2, "Currently prohibited (out-of-band Management Endpoint)" }, |
4074 | | { 0, NULL } |
4075 | | }; |
4076 | | |
4077 | | static const value_string cmd_eff_cse_tbl[] = { |
4078 | | { 0, "No command submission or execution restriction" }, |
4079 | | { 1, "One concurrent command per namespace" }, |
4080 | | { 2, "One concurrent command per system" }, |
4081 | | { 0, NULL} |
4082 | | }; |
4083 | | |
4084 | | static void dissect_nvme_get_logpage_cmd_sup_and_eff_grp(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned poff, unsigned nrec, unsigned fidx, bool acs) |
4085 | 0 | { |
4086 | 0 | unsigned i; |
4087 | 0 | proto_item *ti; |
4088 | 0 | proto_tree *ent; |
4089 | 0 | for (i = 0; i < nrec; i++) { |
4090 | 0 | if (acs) |
4091 | 0 | ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_cmd_and_eff_cs, cmd_tvb, poff, 4, NULL, "Admin Command Supported %u (ACS%u)", fidx+i, fidx+i); |
4092 | 0 | else |
4093 | 0 | ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_cmd_and_eff_cs, cmd_tvb, poff, 4, NULL, "I/O Command Supported %u (IOCS%u)", fidx+i, fidx+i); |
4094 | 0 | ent = proto_item_add_subtree(ti, ett_data); |
4095 | 0 | add_group_mask_entry(cmd_tvb, ent, poff, 4, ASPEC(hf_nvme_get_logpage_cmd_and_eff_cseds)); |
4096 | 0 | poff += 4; |
4097 | 0 | } |
4098 | 0 | } |
4099 | | |
4100 | | |
4101 | | static void dissect_nvme_get_logpage_cmd_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4102 | 0 | { |
4103 | 0 | uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */ |
4104 | 0 | proto_tree *grp; |
4105 | 0 | unsigned nrec = 0; |
4106 | 0 | unsigned fidx; |
4107 | |
|
4108 | 0 | off += tr_off; |
4109 | 0 | if (cmd_ctx->cmd_ctx.get_logpage.off >= 4096) |
4110 | 0 | return; /* max allowed offset is < 4096, so we do not loose bits by casting to unsigned type */ |
4111 | | |
4112 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4113 | 0 | if (off <= 1024 && len >= 4) { |
4114 | 0 | fidx = off / 4; |
4115 | 0 | nrec = (1024-off) / 4; |
4116 | 0 | if (nrec > (len / 4)) |
4117 | 0 | nrec = len / 4; |
4118 | 0 | dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, 0, nrec, fidx, true); |
4119 | 0 | } |
4120 | |
|
4121 | 0 | nrec = len / 4 - nrec; |
4122 | 0 | if (!nrec) |
4123 | 0 | return; |
4124 | 0 | if (nrec > 256) |
4125 | 0 | nrec = 256; |
4126 | |
|
4127 | 0 | fidx = (off > 1024) ? (off - 1024) / 4 : 0; |
4128 | 0 | off = (off < 1024) ? (1024 - off) : 0; |
4129 | |
|
4130 | 0 | dissect_nvme_get_logpage_cmd_sup_and_eff_grp(grp, cmd_tvb, off, nrec, fidx, false); |
4131 | 0 | } |
4132 | | |
4133 | | static const value_string stest_type_active_tbl[] = { |
4134 | | { 0, "No device self-test operation in progress" }, |
4135 | | { 1, "Short device self-test operation in progress" }, |
4136 | | { 2, "Extended device self-test operation in progress" }, |
4137 | | { 3, "Host-Initiated Refresh operation" }, |
4138 | | { 0xE, "Vendor Specific" }, |
4139 | | { 0, NULL} |
4140 | | }; |
4141 | | |
4142 | | static const value_string stest_result_tbl[] = { |
4143 | | { 0, "Operation completed without error" }, |
4144 | | { 1, "Operation was aborted by a Device Self-test command" }, |
4145 | | { 2, "Operation was aborted by a Controller Level Reset" }, |
4146 | | { 3, "Operation was aborted due to a removal of a namespace from the namespace inventory" }, |
4147 | | { 4, "Operation was aborted due to the processing of a Format NVM command" }, |
4148 | | { 5, "A fatal error or unknown test error occurred while the controller was executing the device self-test operation and the operation did not complete" }, |
4149 | | { 6, "Operation completed with a segment that failed and the segment that failed is not known" }, |
4150 | | { 7, "Operation completed with one or more failed segments and the first segment that failed is indicated in the Segment Number field" }, |
4151 | | { 8, "Operation was aborted for unknown reason" }, |
4152 | | { 9, "Operation was aborted due to a sanitize operation" }, |
4153 | | { 0xF, "Entry not used (does not contain a test result)" }, |
4154 | | { 0, NULL} |
4155 | | }; |
4156 | | |
4157 | | /* DSTC of a *completed* result (Base 2.3 Figure 216), not the in-progress |
4158 | | * operation status of Figure 215 that stest_type_active_tbl names. */ |
4159 | | static const value_string stest_type_done_tbl[] = { |
4160 | | { 0, "Entry is empty" }, |
4161 | | { 1, "Short device self-test operation" }, |
4162 | | { 2, "Extended device self-test operation" }, |
4163 | | { 3, "Host-Initiated Refresh operation" }, |
4164 | | { 0xE, "Vendor Specific" }, |
4165 | | { 0, NULL} |
4166 | | }; |
4167 | | |
4168 | | static void dissect_nvme_get_logpage_selftest_result(proto_tree *grp, tvbuff_t *cmd_tvb, uint32_t off, unsigned tst_idx) |
4169 | 0 | { |
4170 | 0 | proto_item *ti; |
4171 | | |
4172 | | /* Base 2.3 Figure 216: the Self-test Result data structure is 28 bytes |
4173 | | * (23:00 plus STCT/STC/VS at 27:24), which is also the stride the caller |
4174 | | * walks. */ |
4175 | 0 | ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_selftest_res, cmd_tvb, off, 28, NULL, |
4176 | 0 | "Latest Self-test Result Data Structure (latest %u)", tst_idx); |
4177 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4178 | 0 | add_group_mask_entry(cmd_tvb, grp, off, 1, ASPEC(hf_nvme_get_logpage_selftest_res_status)); |
4179 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sn, cmd_tvb, off+1, 1, ENC_LITTLE_ENDIAN); |
4180 | 0 | add_group_mask_entry(cmd_tvb, grp, off+2, 1, ASPEC(hf_nvme_get_logpage_selftest_res_vdi)); |
4181 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_rsvd, cmd_tvb, off+3, 1, ENC_LITTLE_ENDIAN); |
4182 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_poh, cmd_tvb, off+4, 8, ENC_LITTLE_ENDIAN); |
4183 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_nsid, cmd_tvb, off+12, 4, ENC_LITTLE_ENDIAN); |
4184 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_flba, cmd_tvb, off+16, 8, ENC_LITTLE_ENDIAN); |
4185 | 0 | add_group_mask_entry(cmd_tvb, grp, off+24, 1, ASPEC(hf_nvme_get_logpage_selftest_res_sct)); |
4186 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_sc, cmd_tvb, off+25, 1, ENC_LITTLE_ENDIAN); |
4187 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_res_vs, cmd_tvb, off+26, 2, ENC_LITTLE_ENDIAN); |
4188 | 0 | } |
4189 | | |
4190 | | static void dissect_nvme_get_logpage_selftest_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4191 | 0 | { |
4192 | 0 | uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */ |
4193 | 0 | proto_tree *grp; |
4194 | 0 | unsigned tst_idx; |
4195 | |
|
4196 | 0 | off += tr_off; |
4197 | 0 | if (cmd_ctx->cmd_ctx.get_logpage.off > 536) |
4198 | 0 | return; /* max offset is <= 536, so we do not loose bits by casting to unsigned type */ |
4199 | | |
4200 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4201 | |
|
4202 | 0 | if (!off && len >= 1) |
4203 | 0 | add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_selftest_csto)); |
4204 | 0 | if (off <= 1 && (2 - off) <= len) |
4205 | 0 | add_group_mask_entry(cmd_tvb, grp, 1-off, 1, ASPEC(hf_nvme_get_logpage_selftest_cstc)); |
4206 | 0 | if (off <= 2 && (4 - off) <= len) |
4207 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_selftest_rsvd, cmd_tvb, 2-off, 2, ENC_LITTLE_ENDIAN); |
4208 | |
|
4209 | 0 | if (off <= 4) { |
4210 | 0 | unsigned skip = 4 - off; /* cmd_tvb pos of result 0 */ |
4211 | 0 | if (len < skip) |
4212 | 0 | return; |
4213 | 0 | len -= skip; |
4214 | 0 | tst_idx = 0; |
4215 | 0 | off = skip; |
4216 | 0 | } else { |
4217 | 0 | unsigned skip; |
4218 | 0 | tst_idx = (off - 4 + 27) / 28; /* first fully-contained result */ |
4219 | 0 | skip = tst_idx * 28 - (off - 4); /* cmd_tvb pos of result[tst_idx] */ |
4220 | 0 | if (len < skip) |
4221 | 0 | return; |
4222 | 0 | len -= skip; |
4223 | 0 | off = skip; |
4224 | 0 | } |
4225 | 0 | while (len >= 28) { |
4226 | 0 | dissect_nvme_get_logpage_selftest_result(grp, cmd_tvb, off, tst_idx); |
4227 | 0 | off += 28; |
4228 | 0 | len -= 28; |
4229 | 0 | tst_idx++; |
4230 | 0 | } |
4231 | 0 | } |
4232 | | |
4233 | | /* NVMe Base 2.3 "Telemetry Host-Initiated Log Page" / "Telemetry |
4234 | | * Controller-Initiated Log Page" (Telemetry Scope) */ |
4235 | | static const value_string telemetry_scope_tbl[] = { |
4236 | | { 0, "Not reported" }, |
4237 | | { 1, "Controller" }, |
4238 | | { 2, "NVM subsystem" }, |
4239 | | { 0, NULL }, |
4240 | | }; |
4241 | | |
4242 | | static void dissect_nvme_get_logpage_telemetry_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4243 | 0 | { |
4244 | 0 | uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */ |
4245 | 0 | proto_tree *grp; |
4246 | 0 | uint64_t next_block; |
4247 | 0 | uint32_t poff; |
4248 | 0 | bool host_init = (cmd_ctx->cmd_ctx.get_logpage.lid == 0x7); |
4249 | 0 | const char *pfx = host_init ? "Host-Initiated" : "Controller-Initiated"; |
4250 | |
|
4251 | 0 | off += tr_off; |
4252 | | /* off==0 means the window starts at the very beginning of the log page |
4253 | | * (the 512-byte header), so poff must skip past it to reach data block 1. |
4254 | | * Any other exact multiple of 512 means the window already starts at a |
4255 | | * data block boundary, so poff must be 0, not another full 512 skip. */ |
4256 | 0 | poff = (off == 0) ? 512 : (512 - (off & 0x1ff)) % 512; |
4257 | 0 | next_block = (off + poff) / 512; |
4258 | |
|
4259 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4260 | | |
4261 | |
|
4262 | 0 | if (poff >= len && cmd_ctx->cmd_ctx.get_logpage.off >= 384) |
4263 | 0 | return; |
4264 | | |
4265 | 0 | if (!off && len >= 1) |
4266 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_li, cmd_tvb, 0, 1, ENC_LITTLE_ENDIAN); |
4267 | 0 | if (off <= 1 && (5 - off) <= len) |
4268 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd0, cmd_tvb, 1-off, 4, ENC_LITTLE_ENDIAN); |
4269 | 0 | if (off <= 5 && (8 - off) <= len) |
4270 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ieee, cmd_tvb, 5-off, 3, ENC_LITTLE_ENDIAN); |
4271 | 0 | if (off <= 8 && (10 - off) <= len) |
4272 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da1lb, cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN); |
4273 | 0 | if (off <= 10 && (12 - off) <= len) |
4274 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da2lb, cmd_tvb, 10-off, 2, ENC_LITTLE_ENDIAN); |
4275 | 0 | if (off <= 12 && (14 - off) <= len) |
4276 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da3lb, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN); |
4277 | 0 | if (off <= 14 && (16 - off) <= len) |
4278 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd1, cmd_tvb, 14-off, 2, ENC_NA); |
4279 | 0 | if (off <= 16 && (20 - off) <= len) |
4280 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da4lb, cmd_tvb, 16-off, 4, ENC_LITTLE_ENDIAN); |
4281 | 0 | if (host_init) { |
4282 | | /* Telemetry Host-Initiated Log Page: bytes 379:20 reserved, 380 THS, |
4283 | | * 381 THDGN */ |
4284 | 0 | if (off <= 20 && (380 - off) <= len) |
4285 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd2, cmd_tvb, 20-off, 360, ENC_NA); |
4286 | 0 | if (off <= 380 && (381 - off) <= len) |
4287 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_scope, cmd_tvb, 380-off, 1, ENC_LITTLE_ENDIAN); |
4288 | 0 | if (off <= 381 && (382 - off) <= len) |
4289 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_hdgn, cmd_tvb, 381-off, 1, ENC_LITTLE_ENDIAN); |
4290 | 0 | } else { |
4291 | | /* Telemetry Controller-Initiated Log Page: bytes 380:20 reserved, |
4292 | | * 381 TCS */ |
4293 | 0 | if (off <= 20 && (381 - off) <= len) |
4294 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_rsvd2, cmd_tvb, 20-off, 361, ENC_NA); |
4295 | 0 | if (off <= 381 && (382 - off) <= len) |
4296 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_scope, cmd_tvb, 381-off, 1, ENC_LITTLE_ENDIAN); |
4297 | 0 | } |
4298 | 0 | if (off <= 382 && (383 - off) <= len) |
4299 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_da, cmd_tvb, 382-off, 1, ENC_LITTLE_ENDIAN); |
4300 | 0 | if (off <= 383 && (384 - off) <= len) |
4301 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_dgn, cmd_tvb, 383-off, 1, ENC_LITTLE_ENDIAN); |
4302 | 0 | if (off <= 384 && (512 - off) <= len) |
4303 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_telemetry_ri, cmd_tvb, 384-off, 128, ENC_NA); |
4304 | |
|
4305 | 0 | if (len < poff) |
4306 | 0 | return; |
4307 | 0 | len -= poff; |
4308 | 0 | while (len >= 512) { |
4309 | 0 | proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_telemetry_db, cmd_tvb, poff, 512, NULL, |
4310 | 0 | "Telemetry %s data block %"PRIu64, pfx, next_block); |
4311 | 0 | len -= 512; |
4312 | 0 | next_block++; |
4313 | 0 | poff += 512; |
4314 | 0 | } |
4315 | 0 | } |
4316 | | |
4317 | | static void dissect_nvme_get_logpage_egroup_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
4318 | 0 | { |
4319 | 0 | proto_tree *grp; |
4320 | 0 | unsigned rel; |
4321 | | |
4322 | | /* Figure 222 carries no Endurance Group Identifier: the subject of the log |
4323 | | * page is named only by the Log Specific Identifier of the request |
4324 | | * (NVMe Base 2.3 section 5.2.12.1.9 and Figure 221), so without this the |
4325 | | * responses for two Endurance Groups are indistinguishable in the tree. |
4326 | | * No "was the request seen" guard is needed: the caller selects this |
4327 | | * decoder on the stored LID, which is 0h when the request was not seen, |
4328 | | * so reaching here means the request supplied both LID and LSI. */ |
4329 | 0 | proto_item_append_text(ti, ", Endurance Group %u", cmd_ctx->cmd_ctx.get_logpage.lsi); |
4330 | |
|
4331 | 0 | if (off >= 512) |
4332 | 0 | return; /* max allowed offset is < 512 */ |
4333 | | |
4334 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4335 | 0 | if (nvme_field_in_window(off, len, 0, 1, &rel)) |
4336 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_egroup_cw)); |
4337 | 0 | if (nvme_field_in_window(off, len, 1, 1, &rel)) |
4338 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_egroup_egfeat)); |
4339 | 0 | if (nvme_field_in_window(off, len, 2, 1, &rel)) |
4340 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd0, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4341 | 0 | if (nvme_field_in_window(off, len, 3, 1, &rel)) |
4342 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_as, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4343 | 0 | if (nvme_field_in_window(off, len, 4, 1, &rel)) |
4344 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ast, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4345 | 0 | if (nvme_field_in_window(off, len, 5, 1, &rel)) |
4346 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_pu, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4347 | 0 | if (nvme_field_in_window(off, len, 6, 2, &rel)) |
4348 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_did, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
4349 | 0 | if (nvme_field_in_window(off, len, 8, 24, &rel)) |
4350 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd1, cmd_tvb, rel, 24, ENC_NA); |
4351 | 0 | if (nvme_field_in_window(off, len, 32, 16, &rel)) { |
4352 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ee, cmd_tvb, rel, 16, ENC_NA); |
4353 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4354 | 0 | } |
4355 | 0 | if (nvme_field_in_window(off, len, 48, 16, &rel)) { |
4356 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_dur, cmd_tvb, rel, 16, ENC_NA); |
4357 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4358 | 0 | } |
4359 | 0 | if (nvme_field_in_window(off, len, 64, 16, &rel)) { |
4360 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_duw, cmd_tvb, rel, 16, ENC_NA); |
4361 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4362 | 0 | } |
4363 | 0 | if (nvme_field_in_window(off, len, 80, 16, &rel)) { |
4364 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_muw, cmd_tvb, rel, 16, ENC_NA); |
4365 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4366 | 0 | } |
4367 | 0 | if (nvme_field_in_window(off, len, 96, 16, &rel)) { |
4368 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hrc, cmd_tvb, rel, 16, ENC_NA); |
4369 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4370 | 0 | } |
4371 | 0 | if (nvme_field_in_window(off, len, 112, 16, &rel)) { |
4372 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_hwc, cmd_tvb, rel, 16, ENC_NA); |
4373 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4374 | 0 | } |
4375 | 0 | if (nvme_field_in_window(off, len, 128, 16, &rel)) { |
4376 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_mdie, cmd_tvb, rel, 16, ENC_NA); |
4377 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4378 | 0 | } |
4379 | 0 | if (nvme_field_in_window(off, len, 144, 16, &rel)) { |
4380 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_ele, cmd_tvb, rel, 16, ENC_NA); |
4381 | 0 | post_add_intval_from_16bytes(ti, cmd_tvb, rel); |
4382 | 0 | } |
4383 | 0 | if (nvme_field_in_window(off, len, 160, 16, &rel)) { |
4384 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_tegcap, cmd_tvb, rel, 16, ENC_NA); |
4385 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 0); |
4386 | 0 | } |
4387 | 0 | if (nvme_field_in_window(off, len, 176, 16, &rel)) { |
4388 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_uegcap, cmd_tvb, rel, 16, ENC_NA); |
4389 | 0 | post_add_bytes_from_16bytes(ti, cmd_tvb, rel, 0); |
4390 | 0 | } |
4391 | 0 | if (off <= 508 && (512 - off) <= len) { |
4392 | 0 | unsigned poff = (off <= 192) ? (192 - off) : 0; |
4393 | | /* poff isn't derived from (512-off), so the guard above doesn't by |
4394 | | * itself guarantee poff <= len -- check explicitly before subtracting. */ |
4395 | 0 | if (poff <= len) { |
4396 | | /* Remaining room at tvb position poff is (512-off)-poff, not the |
4397 | | * raw len -- an oversized/malformed len must not render bytes |
4398 | | * past the structure's real 512-byte end as "Reserved2". */ |
4399 | 0 | unsigned max_len = (512 - off) - poff; |
4400 | 0 | unsigned rlen = len - poff; |
4401 | 0 | if (rlen > max_len) |
4402 | 0 | rlen = max_len; |
4403 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_rsvd2, cmd_tvb, poff, rlen, ENC_NA); |
4404 | 0 | } |
4405 | 0 | } |
4406 | 0 | } |
4407 | | static const value_string plat_status_tbl[] = { |
4408 | | { 0, "Predictable Latency Mode not Enabled" }, |
4409 | | { 1, "Deterministic Window (DTWIN)" }, |
4410 | | { 2, "Non-Deterministic Window (NDWIN)" }, |
4411 | | { 0, NULL} |
4412 | | }; |
4413 | | |
4414 | | static void dissect_nvme_get_logpage_pred_lat_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
4415 | 0 | { |
4416 | 0 | proto_tree *grp; |
4417 | 0 | unsigned poff; |
4418 | 0 | unsigned rel; |
4419 | | |
4420 | | /* As for the Endurance Group log page above: Figure 224 does not echo the |
4421 | | * NVM Set Identifier, which is carried only in the Log Specific Identifier |
4422 | | * of the request (NVMe Base 2.3 section 5.2.12.1.11 and Figure 223). |
4423 | | * There is one such log page per NVM Set, so the label is what tells them |
4424 | | * apart. */ |
4425 | 0 | proto_item_append_text(ti, ", NVM Set %u", cmd_ctx->cmd_ctx.get_logpage.lsi); |
4426 | |
|
4427 | 0 | if (off > 508) |
4428 | 0 | return; /* max allowed offset is < 508 */ |
4429 | | |
4430 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4431 | 0 | if (nvme_field_in_window(off, len, 0, 1, &rel)) |
4432 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_pred_lat_status)); |
4433 | 0 | if (nvme_field_in_window(off, len, 1, 1, &rel)) |
4434 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd0, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4435 | 0 | if (nvme_field_in_window(off, len, 2, 2, &rel)) |
4436 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_pred_lat_etype)); |
4437 | 0 | if (nvme_field_in_window(off, len, 4, 28, &rel)) |
4438 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd1, cmd_tvb, rel, 28, ENC_NA); |
4439 | 0 | if (nvme_field_in_window(off, len, 32, 8, &rel)) |
4440 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_rt, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4441 | 0 | if (nvme_field_in_window(off, len, 40, 8, &rel)) |
4442 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_wt, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4443 | 0 | if (nvme_field_in_window(off, len, 48, 8, &rel)) |
4444 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_tm, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4445 | 0 | if (nvme_field_in_window(off, len, 56, 8, &rel)) |
4446 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tmh, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4447 | 0 | if (nvme_field_in_window(off, len, 64, 8, &rel)) |
4448 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_ndwin_tml, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4449 | 0 | if (nvme_field_in_window(off, len, 72, 56, &rel)) |
4450 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd2, cmd_tvb, rel, 56, ENC_NA); |
4451 | 0 | if (nvme_field_in_window(off, len, 128, 8, &rel)) |
4452 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_re, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4453 | 0 | if (nvme_field_in_window(off, len, 136, 8, &rel)) |
4454 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_we, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4455 | 0 | if (nvme_field_in_window(off, len, 144, 8, &rel)) |
4456 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_dtwin_te, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4457 | 0 | poff = (off <= 152) ? (152 - off) : 0; |
4458 | 0 | if (poff > len) |
4459 | 0 | return; |
4460 | 0 | { |
4461 | | /* Remaining room at tvb position poff is (512-off)-poff, not the |
4462 | | * raw len -- an oversized/malformed len must not render bytes past |
4463 | | * the structure's real 512-byte end as "Reserved3". */ |
4464 | 0 | unsigned max_len = (512 - off) - poff; |
4465 | 0 | unsigned rlen = len - poff; |
4466 | 0 | if (rlen > max_len) |
4467 | 0 | rlen = max_len; |
4468 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_rsvd3, cmd_tvb, poff, rlen, ENC_NA); |
4469 | 0 | } |
4470 | 0 | } |
4471 | | |
4472 | | static void dissect_nvme_get_logpage_pred_lat_aggreg_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4473 | 0 | { |
4474 | 0 | uint64_t off = cmd_ctx->cmd_ctx.get_logpage.off; |
4475 | 0 | proto_tree *grp; |
4476 | 0 | unsigned poff; |
4477 | |
|
4478 | 0 | off += tr_off; |
4479 | 0 | if (off < 8) { |
4480 | 0 | poff = (unsigned)(off & 0x7); |
4481 | 0 | poff = 8 - poff; |
4482 | 0 | } else { |
4483 | 0 | poff = 0; |
4484 | 0 | } |
4485 | 0 | if (len < (poff + 2) && off) |
4486 | 0 | return; /* nothing to display */ |
4487 | | |
4488 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4489 | 0 | if (!off && len >= 8) |
4490 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_ne, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN); |
4491 | 0 | if (len < poff) |
4492 | 0 | return; |
4493 | 0 | len -= poff; |
4494 | 0 | while (len >= 2) { |
4495 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_pred_lat_aggreg_nset, cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN); |
4496 | 0 | poff += 2; |
4497 | 0 | len -= 2; |
4498 | 0 | } |
4499 | 0 | } |
4500 | | |
4501 | | static const value_string ana_state_tbl[] = { |
4502 | | { 0x1, "ANA Optimized State" }, |
4503 | | { 0x2, "ANA Non-Optimized State" }, |
4504 | | { 0x3, "ANA Inaccessible State" }, |
4505 | | { 0x4, "ANA Persistent Loss State" }, |
4506 | | { 0xF, "ANA Change State" }, |
4507 | | { 0, NULL} |
4508 | | }; |
4509 | | |
4510 | | static unsigned dissect_nvme_get_logpage_ana_resp_grp(proto_tree *grp, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned len, uint32_t poff) |
4511 | 0 | { |
4512 | 0 | unsigned done = 0; |
4513 | 0 | unsigned bytes; |
4514 | 0 | proto_item *ti; |
4515 | 0 | unsigned group_id; |
4516 | 0 | unsigned nns; |
4517 | 0 | unsigned prev_off = cmd_ctx->cmd_ctx.get_logpage.tr_off; |
4518 | |
|
4519 | 0 | if (len < 4) { |
4520 | 0 | if (prev_off) |
4521 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += len; |
4522 | 0 | return 0; |
4523 | 0 | } |
4524 | | |
4525 | 0 | if (prev_off <= 4) { |
4526 | 0 | if ((len + prev_off) < 8) { |
4527 | | /* The entry guard above only proves the 4-byte ANA Group ID is |
4528 | | * present. Number of NSID Values (NVMe Base 2.3 Figure 228, |
4529 | | * bytes 07:04) needs 4 more, so a window holding 4..7 bytes of a |
4530 | | * fresh descriptor cannot be read for it -- reading anyway threw |
4531 | | * a bounds exception and rendered the whole frame malformed |
4532 | | * instead of decoding the Group ID that did arrive. */ |
4533 | 0 | nns = 0; |
4534 | 0 | bytes = len; |
4535 | 0 | } else { |
4536 | 0 | nns = tvb_get_uint32(cmd_tvb, poff+4-prev_off, ENC_LITTLE_ENDIAN); |
4537 | 0 | bytes = 32 + 4 * nns; |
4538 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns; |
4539 | 0 | } |
4540 | 0 | } else if (prev_off ) { |
4541 | 0 | nns = cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries; |
4542 | 0 | bytes = (prev_off > 32) ? 4 * nns : ((32-prev_off) + 4 * nns); |
4543 | 0 | } else { |
4544 | 0 | bytes = len; |
4545 | 0 | } |
4546 | |
|
4547 | 0 | if (bytes > len) |
4548 | 0 | bytes = len; |
4549 | |
|
4550 | 0 | ti = proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_ana_grp, cmd_tvb, poff, bytes, NULL, |
4551 | 0 | "ANA Group Descriptor"); |
4552 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4553 | |
|
4554 | 0 | if (prev_off) { |
4555 | 0 | group_id = cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id; |
4556 | 0 | proto_item_append_text(ti, " %u (continued)", group_id); |
4557 | 0 | } else { |
4558 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_grp_id, cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN, &group_id); |
4559 | 0 | done += 4; |
4560 | 0 | proto_item_append_text(ti, " %u", group_id); |
4561 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = group_id; |
4562 | 0 | } |
4563 | |
|
4564 | 0 | if (prev_off <= 4) { |
4565 | 0 | if ((len - done) < 4) { |
4566 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += done; |
4567 | 0 | return done; |
4568 | 0 | } |
4569 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nns, cmd_tvb, poff+4-prev_off, 4, ENC_LITTLE_ENDIAN); |
4570 | 0 | done += 4; |
4571 | 0 | } |
4572 | 0 | if (prev_off <= 8) { |
4573 | 0 | if ((len - done) < 8) { |
4574 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += done; |
4575 | 0 | return done; |
4576 | 0 | } |
4577 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_chcnt, cmd_tvb, poff+8-prev_off, 8, ENC_LITTLE_ENDIAN); |
4578 | 0 | done += 8; |
4579 | 0 | } |
4580 | | |
4581 | 0 | if (prev_off <= 16) { |
4582 | 0 | if ((len - done) < 1) { |
4583 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += done; |
4584 | 0 | return done; |
4585 | 0 | } |
4586 | 0 | add_group_mask_entry(cmd_tvb, grp, poff+16-prev_off, 1, ASPEC(hf_nvme_get_logpage_ana_grp_anas)); |
4587 | 0 | done += 1; |
4588 | 0 | } |
4589 | | |
4590 | 0 | if (prev_off <= 17) { |
4591 | 0 | if ((len - done) < 15) { |
4592 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += done; |
4593 | 0 | return done; |
4594 | 0 | } |
4595 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_rsvd, cmd_tvb, poff+17-prev_off, 15, ENC_NA); |
4596 | 0 | done += 15; |
4597 | 0 | } |
4598 | | |
4599 | 0 | poff += done; |
4600 | 0 | while ((len - done) >= 4 && nns) { |
4601 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_grp_nsid, cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN); |
4602 | 0 | poff += 4; |
4603 | 0 | done += 4; |
4604 | 0 | nns--; |
4605 | 0 | } |
4606 | 0 | if (nns) { |
4607 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off += done; |
4608 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = nns; |
4609 | 0 | } else { |
4610 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_off = 0; |
4611 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_sub_entries = 0; |
4612 | 0 | cmd_ctx->cmd_ctx.get_logpage.tr_rcrd_id = 0; |
4613 | 0 | cmd_ctx->cmd_ctx.get_logpage.records--; |
4614 | 0 | } |
4615 | 0 | return done; |
4616 | 0 | } |
4617 | | |
4618 | | static unsigned dissect_nvme_get_logpage_ana_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off) |
4619 | 0 | { |
4620 | 0 | unsigned groups=1; |
4621 | 0 | if (!off && len >= 8) |
4622 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_chcnt, cmd_tvb, off, 8, ENC_LITTLE_ENDIAN); |
4623 | 0 | if (off <= 8 && (10 - off) <= len) |
4624 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_ana_ngd, cmd_tvb, 8-off, 2, ENC_LITTLE_ENDIAN, &groups); |
4625 | 0 | if (off <= 10 && (16 - off) <= len) |
4626 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_ana_rsvd, cmd_tvb, 10-off, 6, ENC_LITTLE_ENDIAN); |
4627 | 0 | return groups; |
4628 | 0 | } |
4629 | | |
4630 | | static void dissect_nvme_get_logpage_ana_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4631 | 0 | { |
4632 | 0 | uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */ |
4633 | 0 | proto_tree *grp; |
4634 | 0 | unsigned poff = 0; |
4635 | 0 | unsigned groups = 1; |
4636 | |
|
4637 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4638 | 0 | if (cmd_ctx->cmd_ctx.get_logpage.off < 16 && !tr_off) { |
4639 | 0 | groups = dissect_nvme_get_logpage_ana_resp_header(grp, cmd_tvb, len, off); |
4640 | 0 | cmd_ctx->cmd_ctx.get_logpage.records = groups; |
4641 | 0 | poff = 16 - off; |
4642 | 0 | } else if (tr_off) { |
4643 | 0 | uint32_t combined = off + tr_off; |
4644 | 0 | groups = cmd_ctx->cmd_ctx.get_logpage.records; |
4645 | | /* A continuation chunk can still start inside the 16-byte header |
4646 | | * (e.g. off < 16 too, just split across more than one message) -- |
4647 | | * skip only the remaining header bytes, not the whole thing. */ |
4648 | 0 | poff = (combined < 16) ? (16 - combined) : 0; |
4649 | | /* NAGD (NVMe Base 2.3 Figure 227, bytes 09:08) lives in the 16-byte |
4650 | | * header, so a window that starts past it never supplies `records`. |
4651 | | * Over NVMe-MI that is every window, including the first: each |
4652 | | * transaction gets a freshly wmem_alloc0'd cmd_ctx, so `records` is 0 |
4653 | | * and the walk below never ran at all. NVMe-MI 2.1 Figure 136 caps |
4654 | | * DLEN at 4,096, so any ANA log page larger than that must be fetched |
4655 | | * with successive nonzero DOFST -- the normal path, not an edge case. |
4656 | | * Fall back to walking until the window is exhausted, the way |
4657 | | * dissect_nvme_get_logpage_ify_resp() does for NUMREC. An ANA Group |
4658 | | * Descriptor is at least 32 bytes (Figure 228: 31:00 header, then the |
4659 | | * NSID list), so (len + 31) / 32 can never stop the walk early. */ |
4660 | 0 | if (!groups) |
4661 | 0 | groups = (len + 31) / 32; |
4662 | 0 | } else { |
4663 | | /* off >= 16 with tr_off == 0: the Get Log Page command's own Log Page |
4664 | | * Offset already starts this window past the 16-byte header, so NAGD |
4665 | | * is not in this message either and neither branch above ran -- |
4666 | | * `groups` kept its initializer of 1 and exactly one descriptor |
4667 | | * rendered no matter how many the window held. Same bound and same |
4668 | | * justification as the tr_off path. */ |
4669 | 0 | groups = cmd_ctx->cmd_ctx.get_logpage.records; |
4670 | 0 | if (!groups) |
4671 | 0 | groups = (len + 31) / 32; |
4672 | 0 | } |
4673 | 0 | if (len < poff) |
4674 | 0 | return; |
4675 | 0 | len -= poff; |
4676 | 0 | while (len >= 4 && groups) { |
4677 | 0 | unsigned done = dissect_nvme_get_logpage_ana_resp_grp(grp, cmd_tvb, cmd_ctx, len, poff); |
4678 | | /* A descriptor continuation that cannot make progress (the window |
4679 | | * holds fewer bytes than its next field needs) returns 0. Without |
4680 | | * this the loop would keep re-rendering empty descriptor items until |
4681 | | * `groups` ran out -- harmless while `groups` was always the wire's |
4682 | | * NAGD, but not with the bound above. */ |
4683 | 0 | if (!done) |
4684 | 0 | break; |
4685 | 0 | poff += done; |
4686 | 0 | len -= done; |
4687 | 0 | groups--; |
4688 | 0 | } |
4689 | 0 | } |
4690 | | |
4691 | | static void dissect_nvme_get_logpage_lba_status_resp_header(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t off) |
4692 | 0 | { |
4693 | 0 | if (!off && len >= 4) |
4694 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lslplen, cmd_tvb, off, 4, ENC_LITTLE_ENDIAN); |
4695 | 0 | if (off <= 4 && (8 - off) <= len) |
4696 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nlslne, cmd_tvb, 4-off, 4, ENC_LITTLE_ENDIAN); |
4697 | 0 | if (off <= 8 && (12 - off) <= len) |
4698 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_estulb, cmd_tvb, 8-off, 4, ENC_LITTLE_ENDIAN); |
4699 | 0 | if (off <= 12 && (14 - off) <= len) |
4700 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_rsvd, cmd_tvb, 12-off, 2, ENC_LITTLE_ENDIAN); |
4701 | 0 | if (off <= 14 && (16 - off) <= len) |
4702 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_lsgc, cmd_tvb, 14-off, 2, ENC_LITTLE_ENDIAN); |
4703 | | /* The Namespace Element List item is added by the caller, over the same |
4704 | | * byte range; adding it here as well made the field match twice per |
4705 | | * frame. */ |
4706 | 0 | } |
4707 | | |
4708 | | static unsigned dissect_nvme_get_logpage_lba_status_lba_range(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned len, uint32_t poff) |
4709 | 0 | { |
4710 | 0 | uint32_t nlrd = 0; |
4711 | 0 | uint64_t slen64; |
4712 | 0 | unsigned slen, rem; |
4713 | 0 | proto_item *ti; |
4714 | 0 | proto_tree *rd; |
4715 | |
|
4716 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne, cmd_tvb, poff, (len < 16) ? len : 16, ENC_NA); |
4717 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4718 | |
|
4719 | 0 | if (len >= 4) |
4720 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_neid, cmd_tvb, poff, 4, ENC_LITTLE_ENDIAN); |
4721 | 0 | if (len >= 8) |
4722 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_lba_status_nel_ne_nlrd, cmd_tvb, poff+4, 4, ENC_LITTLE_ENDIAN, &nlrd); |
4723 | 0 | if (len >= 9) |
4724 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_ratype, cmd_tvb, poff+8, 1, ENC_LITTLE_ENDIAN); |
4725 | 0 | if (len >= 16) |
4726 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rsvd, cmd_tvb, poff+9, 7, ENC_NA); |
4727 | |
|
4728 | 0 | if (len < 16) |
4729 | 0 | return len; |
4730 | | |
4731 | | /* NVM CS 1.2 Figure 110: a Namespace Element is a 16-byte header followed |
4732 | | * by NLRD 16-byte LBA Range Descriptors (Figure 111), so the element is |
4733 | | * 16 * (NLRD + 1) bytes. NLRD is a 32-bit field at 07:04 of *this* |
4734 | | * element, and FFFFFFFFh means no descriptor list is present. Computed in |
4735 | | * 64-bit: NLRD is a raw wire value and 16 * (NLRD + 1) overflows 32 bits. |
4736 | | * The element length is what bounds the descriptor walk -- bounding it on |
4737 | | * the bytes remaining in the whole list instead swallowed every following |
4738 | | * Namespace Element into the first one. */ |
4739 | 0 | if (!nlrd || nlrd == 0xffffffff) |
4740 | 0 | slen64 = 16; |
4741 | 0 | else |
4742 | 0 | slen64 = 16ULL * ((uint64_t)nlrd + 1); |
4743 | 0 | slen = (slen64 > len) ? len : (unsigned)slen64; |
4744 | 0 | proto_item_set_len(ti, slen); |
4745 | |
|
4746 | 0 | rem = slen - 16; |
4747 | 0 | poff += 16; |
4748 | 0 | while (rem >= 8) { |
4749 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel_ne_rd, cmd_tvb, poff, rem >= 16 ? 16 : rem, ENC_NA); |
4750 | 0 | rd = proto_item_add_subtree(ti, ett_data); |
4751 | 0 | proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba, cmd_tvb, poff, 8, ENC_LITTLE_ENDIAN); |
4752 | 0 | if (rem >= 12) |
4753 | 0 | proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb, cmd_tvb, poff+8, 4, ENC_LITTLE_ENDIAN); |
4754 | 0 | if (rem >= 16) { |
4755 | 0 | proto_tree_add_item(rd, hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd, cmd_tvb, poff+12, 4, ENC_LITTLE_ENDIAN); |
4756 | 0 | poff += 16; |
4757 | 0 | rem -= 16; |
4758 | 0 | } else { |
4759 | 0 | rem = 0; |
4760 | 0 | } |
4761 | 0 | } |
4762 | 0 | return slen; |
4763 | 0 | } |
4764 | | |
4765 | | static void dissect_nvme_get_logpage_lba_status_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4766 | 0 | { |
4767 | 0 | uint32_t off = cmd_ctx->cmd_ctx.get_logpage.off & 0xffffffff; /* need unsigned type to silence clang-11 errors */ |
4768 | 0 | proto_tree *grp = NULL; |
4769 | 0 | unsigned poff = 0; |
4770 | |
|
4771 | 0 | off += tr_off; |
4772 | 0 | if (off < 16) { |
4773 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4774 | 0 | dissect_nvme_get_logpage_lba_status_resp_header(grp, cmd_tvb, len, off); |
4775 | 0 | poff = 16 - off; |
4776 | 0 | } else if (off & 15) { |
4777 | 0 | poff = 16 - (off & 15); |
4778 | 0 | } |
4779 | |
|
4780 | 0 | if (len < (poff + 8)) |
4781 | 0 | return; |
4782 | | |
4783 | 0 | if (off >= 16) |
4784 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4785 | |
|
4786 | 0 | len -= poff; |
4787 | 0 | ti = proto_tree_add_item(grp, hf_nvme_get_logpage_lba_status_nel, cmd_tvb, poff, len, ENC_NA); |
4788 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4789 | |
|
4790 | 0 | while (len >= 8) { |
4791 | 0 | unsigned done = dissect_nvme_get_logpage_lba_status_lba_range(grp, cmd_tvb, len, poff); |
4792 | 0 | poff += done; |
4793 | 0 | len -= done; |
4794 | 0 | } |
4795 | 0 | } |
4796 | | |
4797 | | static void dissect_nvme_get_logpage_egroup_aggreg_resp(proto_item *ti, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd_ctx, unsigned tr_off, unsigned len) |
4798 | 0 | { |
4799 | 0 | proto_tree *grp; |
4800 | 0 | unsigned poff = 0; |
4801 | |
|
4802 | 0 | if (!tr_off) { |
4803 | 0 | if (cmd_ctx->cmd_ctx.get_logpage.off < 8) { |
4804 | 0 | poff = 8 - (unsigned)cmd_ctx->cmd_ctx.get_logpage.off; |
4805 | 0 | if (poff > len || (cmd_ctx->cmd_ctx.get_logpage.off && poff == len)) |
4806 | 0 | return; |
4807 | 0 | } else if (len < 2) { |
4808 | 0 | return; |
4809 | 0 | } |
4810 | 0 | } |
4811 | | |
4812 | 0 | len -= poff; |
4813 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4814 | 0 | if (!(cmd_ctx->cmd_ctx.get_logpage.off + tr_off)) |
4815 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_ne, cmd_tvb, 0, 8, ENC_LITTLE_ENDIAN); |
4816 | 0 | while (len >= 2) { |
4817 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_egroup_aggreg_eg, cmd_tvb, poff, 2, ENC_LITTLE_ENDIAN); |
4818 | 0 | len -= 2; |
4819 | 0 | poff += 2; |
4820 | 0 | } |
4821 | 0 | } |
4822 | | |
4823 | | static const value_string rnlpt_tbl[] = { |
4824 | | { 0, "Empty Log Page" }, |
4825 | | { 1, "Registration Preempted" }, |
4826 | | { 2, "Reservation Released" }, |
4827 | | { 3, "Reservation Preempted" }, |
4828 | | { 0, NULL} |
4829 | | }; |
4830 | | |
4831 | | static void dissect_nvme_get_logpage_reserv_notif_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
4832 | 0 | { |
4833 | 0 | proto_tree *grp; |
4834 | 0 | unsigned poff = 0; |
4835 | 0 | unsigned rel; |
4836 | |
|
4837 | 0 | if (off > 60) |
4838 | 0 | return; /* max allowed offset is < 60 */ |
4839 | | |
4840 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4841 | 0 | if (nvme_field_in_window(off, len, 0, 8, &rel)) |
4842 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpc, cmd_tvb, rel, 8, ENC_LITTLE_ENDIAN); |
4843 | 0 | if (nvme_field_in_window(off, len, 8, 1, &rel)) |
4844 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_lpt, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4845 | 0 | if (nvme_field_in_window(off, len, 9, 1, &rel)) |
4846 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nalp, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
4847 | 0 | if (nvme_field_in_window(off, len, 10, 2, &rel)) |
4848 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd0, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
4849 | 0 | if (nvme_field_in_window(off, len, 12, 4, &rel)) |
4850 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_nsid, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4851 | 0 | if (off < 16) { |
4852 | 0 | poff = 16 - off; |
4853 | 0 | if (len <= poff) |
4854 | 0 | return; |
4855 | 0 | len -= poff; |
4856 | 0 | if (len > 48) |
4857 | 0 | len = 48; /* max padding size is 48 */ |
4858 | 0 | } else { |
4859 | 0 | if (len > (64 - off)) |
4860 | 0 | len = 64 - off; /* max padding size is 48 */ |
4861 | 0 | } |
4862 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_reserv_notif_rsvd1, cmd_tvb, poff, len, ENC_NA); |
4863 | 0 | } |
4864 | | |
4865 | | |
4866 | | /* Sanitize State (SANS) in the Sanitize State Information field; the Failure |
4867 | | * State (FAILS) field takes its values from the same set (NVMe Base 2.3 |
4868 | | * "Sanitize Status Log Page"). */ |
4869 | | static const value_string san_sans_tbl[] = { |
4870 | | { 0, "Idle" }, |
4871 | | { 1, "Restricted Processing" }, |
4872 | | { 2, "Restricted Failure" }, |
4873 | | { 3, "Unrestricted Processing" }, |
4874 | | { 4, "Unrestricted Failure" }, |
4875 | | { 5, "Media Verification" }, |
4876 | | { 6, "Post-Verification Deallocation" }, |
4877 | | { 0, NULL} |
4878 | | }; |
4879 | | |
4880 | | static const value_string san_mrst_tbl[] = { |
4881 | | { 0, "The NVM subsystem has never been sanitized" }, |
4882 | | { 1, "The most recent sanitize operation completed successfully" }, |
4883 | | { 2, "A sanitize operation is currently in progress" }, |
4884 | | { 3, "The most recent sanitize operation failed" }, |
4885 | | { 4, "The most recent sanitize operation with No-Deallocate has completed successfully with deallocation of all logical blocks"}, |
4886 | | { 0, NULL} |
4887 | | }; |
4888 | | |
4889 | | static void dissect_nvme_get_logpage_sanitize_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
4890 | 0 | { |
4891 | 0 | proto_tree *grp; |
4892 | 0 | unsigned poff = 0; |
4893 | 0 | unsigned rel; |
4894 | |
|
4895 | 0 | if (off > 508) |
4896 | 0 | return; /* max allowed offset is < 508 */ |
4897 | | |
4898 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4899 | 0 | if (nvme_field_in_window(off, len, 0, 2, &rel)) |
4900 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_sprog, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
4901 | 0 | if (nvme_field_in_window(off, len, 2, 2, &rel)) |
4902 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 2, ASPEC(hf_nvme_get_logpage_sanitize_sstat)); |
4903 | 0 | if (nvme_field_in_window(off, len, 4, 4, &rel)) |
4904 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_scdw10, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4905 | 0 | if (nvme_field_in_window(off, len, 8, 4, &rel)) |
4906 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_eto, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4907 | 0 | if (nvme_field_in_window(off, len, 12, 4, &rel)) |
4908 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbe, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4909 | 0 | if (nvme_field_in_window(off, len, 16, 4, &rel)) |
4910 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etce, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4911 | 0 | if (nvme_field_in_window(off, len, 20, 4, &rel)) |
4912 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etond, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4913 | 0 | if (nvme_field_in_window(off, len, 24, 4, &rel)) |
4914 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etbend, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4915 | 0 | if (nvme_field_in_window(off, len, 28, 4, &rel)) |
4916 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etcend, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4917 | 0 | if (nvme_field_in_window(off, len, 32, 4, &rel)) |
4918 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_etpvds, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4919 | 0 | if (nvme_field_in_window(off, len, 36, 1, &rel)) |
4920 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_sanitize_ssi)); |
4921 | 0 | if (nvme_field_in_window(off, len, 37, 3, &rel)) |
4922 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_rsvd0, cmd_tvb, rel, 3, ENC_NA); |
4923 | 0 | if (nvme_field_in_window(off, len, 40, 4, &rel)) |
4924 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_mnsoip, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4925 | 0 | if (nvme_field_in_window(off, len, 44, 4, &rel)) |
4926 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_stnsid, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
4927 | 0 | if (off < 48) { |
4928 | 0 | poff = 48 - off; |
4929 | | /* Inverted before this fix: bailed out exactly when there WAS |
4930 | | * enough data (poff <= len) and fell through to an underflowing |
4931 | | * "len -= poff" exactly when there wasn't -- corrected to match the |
4932 | | * safe pattern used elsewhere in this file (bail when unsafe). */ |
4933 | 0 | if (len <= poff) |
4934 | 0 | return; |
4935 | 0 | len -= poff; |
4936 | | /* Remaining room at tvb position poff (struct offset 48) is (512 - |
4937 | | * off) - poff, not 512 - poff: poff is tvb-relative (48-off), so |
4938 | | * "512 - poff" silently adds back `off` bytes past the structure's |
4939 | | * real 512-byte end. */ |
4940 | 0 | if (len > (512 - off - poff)) |
4941 | 0 | len = 512 - off - poff; |
4942 | 0 | } else { |
4943 | 0 | if (len > (512 - off)) |
4944 | 0 | len = 512 - off; |
4945 | 0 | } |
4946 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_sanitize_rsvd, cmd_tvb, poff, len, ENC_NA); |
4947 | 0 | } |
4948 | | |
4949 | | static void dissect_nvme_get_logpage_feat_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len) |
4950 | 0 | { |
4951 | 0 | proto_tree *grp; |
4952 | 0 | unsigned nrec, fidx, i; |
4953 | | |
4954 | | /* off >= 1024 is a window past the end of the page -- normal. A window |
4955 | | * that starts mid-record is not, so the two halves are reported apart. */ |
4956 | 0 | if (off >= 1024) |
4957 | 0 | return; |
4958 | 0 | if (!nvme_offset_record_aligned(off, 4)) { |
4959 | 0 | expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned); |
4960 | 0 | return; |
4961 | 0 | } |
4962 | | |
4963 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4964 | 0 | fidx = off / 4; |
4965 | 0 | nrec = (1024 - off) / 4; |
4966 | 0 | if (nrec > (len / 4)) |
4967 | 0 | nrec = len / 4; |
4968 | |
|
4969 | 0 | for (i = 0; i < nrec; i++) { |
4970 | 0 | proto_item *entry; |
4971 | 0 | proto_tree *egrp; |
4972 | 0 | unsigned fid = fidx + i; |
4973 | 0 | entry = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_feat_sup_and_eff_fidx, |
4974 | 0 | cmd_tvb, i * 4, 4, NULL, "FID %02Xh Supported and Effects", fid); |
4975 | 0 | egrp = proto_item_add_subtree(entry, ett_data); |
4976 | 0 | add_group_mask_entry(cmd_tvb, egrp, i * 4, 4, ASPEC(hf_nvme_get_logpage_feat_sup_and_eff_fids)); |
4977 | 0 | } |
4978 | 0 | } |
4979 | | |
4980 | | static void dissect_nvme_get_logpage_mi_cmd_sup_and_eff_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len) |
4981 | 0 | { |
4982 | 0 | proto_tree *grp; |
4983 | 0 | unsigned nrec, fidx, i; |
4984 | |
|
4985 | 0 | if (off >= 1024) |
4986 | 0 | return; |
4987 | 0 | if (!nvme_offset_record_aligned(off, 4)) { |
4988 | 0 | expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned); |
4989 | 0 | return; |
4990 | 0 | } |
4991 | | |
4992 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
4993 | 0 | fidx = off / 4; |
4994 | 0 | nrec = (1024 - off) / 4; |
4995 | 0 | if (nrec > (len / 4)) |
4996 | 0 | nrec = len / 4; |
4997 | |
|
4998 | 0 | for (i = 0; i < nrec; i++) { |
4999 | 0 | proto_item *entry; |
5000 | 0 | proto_tree *egrp; |
5001 | 0 | entry = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs, |
5002 | 0 | cmd_tvb, i * 4, 4, NULL, "MI Command Opcode %02Xh Supported and Effects", fidx + i); |
5003 | 0 | egrp = proto_item_add_subtree(entry, ett_data); |
5004 | 0 | add_group_mask_entry(cmd_tvb, egrp, i * 4, 4, ASPEC(hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds)); |
5005 | 0 | } |
5006 | 0 | } |
5007 | | |
5008 | | /* Defined further down, next to the fid_table it wraps. */ |
5009 | | static const char *get_feature_id_name(uint8_t fid); |
5010 | | |
5011 | | static void dissect_nvme_get_logpage_cmd_feat_lockdown_resp(proto_item *ti, tvbuff_t *cmd_tvb, unsigned off, unsigned len) |
5012 | 0 | { |
5013 | 0 | proto_tree *grp; |
5014 | 0 | proto_item *cfil_ti; |
5015 | 0 | uint8_t lngth, ss, code; |
5016 | 0 | unsigned i, list_end; |
5017 | |
|
5018 | 0 | if (off) |
5019 | 0 | return; /* variable-length CFIL list can only be decoded starting at offset 0 */ |
5020 | 0 | if (len < 4) |
5021 | 0 | return; |
5022 | | |
5023 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5024 | 0 | add_group_mask_entry(cmd_tvb, grp, 0, 1, ASPEC(hf_nvme_get_logpage_cmd_feat_lockdown_cfila)); |
5025 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_cmd_feat_lockdown_rsvd, cmd_tvb, 1, 2, ENC_NA); |
5026 | 0 | proto_tree_add_item_ret_uint8(grp, hf_nvme_get_logpage_cmd_feat_lockdown_lngth, cmd_tvb, 3, 1, ENC_LITTLE_ENDIAN, &lngth); |
5027 | | |
5028 | | /* NVMe Base 2.3 Figure 271: the Command and Feature Identifier List holds |
5029 | | * "a list of coded values identified by the Scope Selected field and the |
5030 | | * Content Selected field", so the same byte names an Admin opcode under |
5031 | | * Scope 0h and a Set Features Feature Identifier under Scope 2h -- 02h is |
5032 | | * Get Log Page in the first and Power Management in the second. Scope is |
5033 | | * echoed back in CFILA (byte 0, bits 3:0), so the response names its own |
5034 | | * list and nothing has to be carried over from the request. |
5035 | | * |
5036 | | * Scopes 3h and 4h are Management Interface and PCIe Command Set opcodes; |
5037 | | * neither table lives in this dissector, so those bytes stay raw rather |
5038 | | * than being labelled from the wrong one. */ |
5039 | 0 | ss = tvb_get_uint8(cmd_tvb, 0) & 0x0f; |
5040 | 0 | for (i = 0; i < lngth && (4 + i) < len; i++) { |
5041 | 0 | cfil_ti = proto_tree_add_item_ret_uint8(grp, hf_nvme_get_logpage_cmd_feat_lockdown_cfil, |
5042 | 0 | cmd_tvb, 4 + i, 1, ENC_LITTLE_ENDIAN, &code); |
5043 | 0 | if (ss == 0) |
5044 | 0 | proto_item_append_text(cfil_ti, " (%s)", get_aq_opcode_name(code)); |
5045 | 0 | else if (ss == 2) |
5046 | 0 | proto_item_append_text(cfil_ti, " (%s)", get_feature_id_name(code)); |
5047 | 0 | } |
5048 | 0 | list_end = 4 + lngth; |
5049 | 0 | if (len > list_end) |
5050 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1, cmd_tvb, list_end, len - list_end, ENC_NA); |
5051 | 0 | } |
5052 | | |
5053 | | /* Supported Log Pages (LID 00h): an array of 256 four-byte LID Supported and |
5054 | | * Effects data structures, one per Log Page |
5055 | | * Identifier 00h..FFh. cmd_tvb begins at the returned data window; entry 0 |
5056 | | * here is the LID at logical offset `off` (LPO + the MI transfer/DOFF), so the |
5057 | | * first decoded entry describes LID (off / 4). */ |
5058 | | static void dissect_nvme_get_logpage_supported_grp(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned nrec, unsigned lid0) |
5059 | 0 | { |
5060 | 0 | unsigned i; |
5061 | 0 | proto_item *ti; |
5062 | 0 | proto_tree *sub; |
5063 | |
|
5064 | 0 | for (i = 0; i < nrec; i++) { |
5065 | 0 | ti = proto_tree_add_bytes_format(grp, hf_nvme_get_logpage_supported_lids, cmd_tvb, i * 4, 4, NULL, |
5066 | 0 | "Log Page Identifier 0x%02x Supported (LIDS%u)", lid0 + i, lid0 + i); |
5067 | 0 | sub = proto_item_add_subtree(ti, ett_data); |
5068 | 0 | add_group_mask_entry(cmd_tvb, sub, i * 4, 4, ASPEC(hf_nvme_get_logpage_supported_lidseds)); |
5069 | 0 | } |
5070 | 0 | } |
5071 | | |
5072 | | static void dissect_nvme_get_logpage_supported_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, unsigned off, unsigned len) |
5073 | 0 | { |
5074 | 0 | proto_tree *grp; |
5075 | 0 | unsigned nrec; |
5076 | |
|
5077 | 0 | if (off >= 1024) |
5078 | 0 | return; /* page is 256 four-byte entries = 1024 bytes */ |
5079 | 0 | if (!nvme_offset_record_aligned(off, 4)) { |
5080 | 0 | expert_add_info(pinfo, ti, &ei_nvme_logpage_window_misaligned); |
5081 | 0 | return; |
5082 | 0 | } |
5083 | | |
5084 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5085 | |
|
5086 | 0 | nrec = (1024 - off) / 4; |
5087 | 0 | if (nrec > (len / 4)) |
5088 | 0 | nrec = len / 4; |
5089 | 0 | dissect_nvme_get_logpage_supported_grp(grp, cmd_tvb, nrec, off / 4); |
5090 | 0 | } |
5091 | | |
5092 | | static const value_string eom_eomip_tbl[] = { |
5093 | | { 0, "No Measurement Started" }, |
5094 | | { 1, "Measurement In Progress" }, |
5095 | | { 2, "Measurement Completed" }, |
5096 | | { 0, NULL }, |
5097 | | }; |
5098 | | |
5099 | | /* One EOM Lane Descriptor (NVMe over PCIe Transport 1.3 Figure 73): a fixed |
5100 | | * 32-byte header (Reserved, MSTAT, LN, EYE, TOP, BTM, LFT, RGT, NROWS, NCOLS, |
5101 | | * EDLEN, Reserved) followed by an optional Printable Eye field (NROWS*NCOLS |
5102 | | * bytes) and an optional Eye Data field (EDLEN bytes); both are wire-controlled |
5103 | | * so their end offsets are computed in 64-bit and checked against both the |
5104 | | * descriptor's own size (ds) and the available response length (len) before |
5105 | | * being handed to proto_tree_add_item(), whose length parameter is a signed |
5106 | | * int. */ |
5107 | | static void dissect_nvme_get_logpage_eom_desc(proto_tree *grp, tvbuff_t *cmd_tvb, unsigned desc_off, unsigned ds, unsigned len, unsigned idx) |
5108 | 0 | { |
5109 | 0 | proto_item *desc_ti; |
5110 | 0 | proto_tree *desc_tree; |
5111 | 0 | uint32_t nrows = 0, ncols = 0, edlen = 0; |
5112 | 0 | uint64_t eye_off, eye_end; |
5113 | 0 | bool pe_ok = true; |
5114 | |
|
5115 | 0 | desc_ti = proto_tree_add_bytes_format_value(grp, hf_nvme_get_logpage_eom_desc, cmd_tvb, |
5116 | 0 | desc_off, ds, NULL, "EOM Lane Descriptor %u", idx); |
5117 | 0 | desc_tree = proto_item_add_subtree(desc_ti, ett_data); |
5118 | |
|
5119 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rsvd0, cmd_tvb, desc_off, 1, ENC_NA); |
5120 | 0 | add_group_mask_entry(cmd_tvb, desc_tree, desc_off + 1, 1, ASPEC(hf_nvme_get_logpage_eom_desc_mstat)); |
5121 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_ln, cmd_tvb, desc_off + 2, 1, ENC_LITTLE_ENDIAN); |
5122 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_eye, cmd_tvb, desc_off + 3, 1, ENC_LITTLE_ENDIAN); |
5123 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_top, cmd_tvb, desc_off + 4, 2, ENC_LITTLE_ENDIAN); |
5124 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_btm, cmd_tvb, desc_off + 6, 2, ENC_LITTLE_ENDIAN); |
5125 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_lft, cmd_tvb, desc_off + 8, 2, ENC_LITTLE_ENDIAN); |
5126 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rgt, cmd_tvb, desc_off + 10, 2, ENC_LITTLE_ENDIAN); |
5127 | 0 | proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_nrows, cmd_tvb, desc_off + 12, 2, ENC_LITTLE_ENDIAN, &nrows); |
5128 | 0 | proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_ncols, cmd_tvb, desc_off + 14, 2, ENC_LITTLE_ENDIAN, &ncols); |
5129 | 0 | proto_tree_add_item_ret_uint(desc_tree, hf_nvme_get_logpage_eom_desc_edlen, cmd_tvb, desc_off + 16, 4, ENC_LITTLE_ENDIAN, &edlen); |
5130 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_rsvd1, cmd_tvb, desc_off + 20, 12, ENC_NA); |
5131 | | |
5132 | | /* Figure 73 places Eye Data at (NROWS*NCOLS+32), i.e. directly after the |
5133 | | * Printable Eye. So if PE is declared but does not fit in the descriptor, |
5134 | | * ED's own start offset is past the end of the descriptor too and the |
5135 | | * descriptor is internally inconsistent -- rendering ED at the PE offset |
5136 | | * instead would present eye-diagram bytes under the Eye Data label. */ |
5137 | 0 | eye_off = (uint64_t)desc_off + 32; |
5138 | 0 | if (nrows && ncols) { |
5139 | 0 | eye_end = eye_off + (uint64_t)nrows * ncols; |
5140 | 0 | pe_ok = (eye_end <= (uint64_t)desc_off + ds && eye_end <= len); |
5141 | 0 | if (pe_ok) { |
5142 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_pe, cmd_tvb, |
5143 | 0 | (unsigned)eye_off, (int)(nrows * ncols), ENC_ASCII); |
5144 | 0 | eye_off = eye_end; |
5145 | 0 | } |
5146 | 0 | } |
5147 | 0 | if (edlen && pe_ok) { |
5148 | 0 | eye_end = eye_off + edlen; |
5149 | 0 | if (eye_end <= (uint64_t)desc_off + ds && eye_end <= len) |
5150 | 0 | proto_tree_add_item(desc_tree, hf_nvme_get_logpage_eom_desc_ed, cmd_tvb, |
5151 | 0 | (unsigned)eye_off, (int)edlen, ENC_NA); |
5152 | 0 | } |
5153 | 0 | } |
5154 | | |
5155 | | /* Physical Interface Receiver Eye Opening Measurement (LID 19h): defined by |
5156 | | * the NVMe over PCIe Transport Specification, not NVMe Base -- Base's Get Log |
5157 | | * Page LID table just says "refer to the applicable NVM Express Transport |
5158 | | * specification" for 19h (get_logpage_name() already renders it as "Transport |
5159 | | * Specific" for that reason). Layout is a fixed 64-byte EOM Header (Figure 72) |
5160 | | * followed by ND EOM Lane Descriptors (Figure 73) of DS bytes each; ND and DS |
5161 | | * both live in the header, so -- like the CFIL list in |
5162 | | * dissect_nvme_get_logpage_cmd_feat_lockdown_resp() -- the descriptor list can |
5163 | | * only be walked when this call's window starts at offset 0 and covers the |
5164 | | * whole header. */ |
5165 | | static void dissect_nvme_get_logpage_eom_resp(proto_item *ti, tvbuff_t *cmd_tvb, packet_info *pinfo, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
5166 | 0 | { |
5167 | 0 | proto_tree *grp; |
5168 | 0 | unsigned rel, i; |
5169 | 0 | uint32_t ds = 0, nd = 0; |
5170 | |
|
5171 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5172 | |
|
5173 | 0 | if (nvme_field_in_window(off, len, 0, 1, &rel)) |
5174 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lid, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5175 | 0 | if (nvme_field_in_window(off, len, 1, 1, &rel)) |
5176 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_eomip, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5177 | 0 | if (nvme_field_in_window(off, len, 2, 2, &rel)) |
5178 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_hsize, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5179 | 0 | if (nvme_field_in_window(off, len, 4, 4, &rel)) |
5180 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsz, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN); |
5181 | 0 | if (nvme_field_in_window(off, len, 8, 1, &rel)) |
5182 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_edgn, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5183 | 0 | if (nvme_field_in_window(off, len, 9, 1, &rel)) |
5184 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lrev, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5185 | 0 | if (nvme_field_in_window(off, len, 10, 1, &rel)) |
5186 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_odp)); |
5187 | 0 | if (nvme_field_in_window(off, len, 11, 1, &rel)) |
5188 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lns, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5189 | 0 | if (nvme_field_in_window(off, len, 12, 1, &rel)) |
5190 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_epl, cmd_tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5191 | 0 | if (nvme_field_in_window(off, len, 13, 1, &rel)) |
5192 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_lspfc)); |
5193 | 0 | if (nvme_field_in_window(off, len, 14, 1, &rel)) |
5194 | 0 | add_group_mask_entry(cmd_tvb, grp, rel, 1, ASPEC(hf_nvme_get_logpage_eom_linfo)); |
5195 | 0 | if (nvme_field_in_window(off, len, 15, 3, &rel)) |
5196 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsvd0, cmd_tvb, rel, 3, ENC_NA); |
5197 | 0 | if (nvme_field_in_window(off, len, 18, 2, &rel)) |
5198 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_lsic, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5199 | 0 | if (nvme_field_in_window(off, len, 20, 4, &rel)) |
5200 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_eom_ds, cmd_tvb, rel, 4, ENC_LITTLE_ENDIAN, &ds); |
5201 | 0 | if (nvme_field_in_window(off, len, 24, 2, &rel)) |
5202 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_get_logpage_eom_nd, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN, &nd); |
5203 | 0 | if (nvme_field_in_window(off, len, 26, 2, &rel)) |
5204 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_maxtb, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5205 | 0 | if (nvme_field_in_window(off, len, 28, 2, &rel)) |
5206 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_maxlr, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5207 | 0 | if (nvme_field_in_window(off, len, 30, 2, &rel)) |
5208 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etgood, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5209 | 0 | if (nvme_field_in_window(off, len, 32, 2, &rel)) |
5210 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etbetter, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5211 | 0 | if (nvme_field_in_window(off, len, 34, 2, &rel)) |
5212 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_etbest, cmd_tvb, rel, 2, ENC_LITTLE_ENDIAN); |
5213 | 0 | if (nvme_field_in_window(off, len, 36, 28, &rel)) |
5214 | 0 | proto_tree_add_item(grp, hf_nvme_get_logpage_eom_rsvd1, cmd_tvb, rel, 28, ENC_NA); |
5215 | |
|
5216 | 0 | if (off != 0 || len < 64 || ds < 32 || nd == 0) |
5217 | 0 | return; /* need DS/ND from the header to walk the descriptor list */ |
5218 | | |
5219 | 0 | for (i = 0; i < nd; i++) { |
5220 | 0 | uint64_t desc_off64 = 64ULL + (uint64_t)i * ds; |
5221 | | |
5222 | | /* ND and DS are both wire-declared and unvalidated, so a header can |
5223 | | * claim more descriptors than the response holds. `len` is already |
5224 | | * bounded by the buffer by the callers (see |
5225 | | * dissect_nvme_get_logpage_resp()), so this is the structural bound: |
5226 | | * stop at the last descriptor that fits in the declared response. */ |
5227 | 0 | if (desc_off64 + ds > len) { |
5228 | | /* Running out of descriptors is only a contradiction when this |
5229 | | * window already holds everything the host asked for; over |
5230 | | * NVMe-MI the remainder is normally just in a later window. NUMD |
5231 | | * is 0's based and counts dwords (NVMe Base 2.3 Figure 202/203). |
5232 | | * The request must have been seen to reach this decoder at all -- |
5233 | | * the caller selects it on the stored LID, which is 0h otherwise |
5234 | | * -- so NUMD is valid here. */ |
5235 | 0 | uint64_t declared = ((uint64_t)cmd_ctx->cmd_ctx.get_logpage.numd + 1) * 4; |
5236 | |
|
5237 | 0 | if (len >= declared) |
5238 | 0 | expert_add_info(pinfo, ti, &ei_nvme_eom_desc_truncated); |
5239 | 0 | break; |
5240 | 0 | } |
5241 | 0 | dissect_nvme_get_logpage_eom_desc(grp, cmd_tvb, (unsigned)desc_off64, ds, len, i); |
5242 | 0 | } |
5243 | 0 | } |
5244 | | |
5245 | | static void dissect_nvme_get_logpage_resp(tvbuff_t *cmd_tvb, packet_info *pinfo, proto_tree *cmd_tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
5246 | 0 | { |
5247 | | /* `len` is already bounded by the buffer: every caller reaches this either |
5248 | | * through dissect_nvme_data_response(), which clamps a lying transport |
5249 | | * length to tvb_reported_length(), or from packet-nvme-mi-admin.c, which |
5250 | | * sizes it from tvb_reported_length() itself. So this container item does |
5251 | | * not clamp again -- on a snaplen-sliced capture it is meant to throw, the |
5252 | | * same as every decoder below it. */ |
5253 | 0 | proto_item *ti = proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data, cmd_tvb, 0, |
5254 | 0 | len, NULL, |
5255 | 0 | "NVMe Get Log Page (%s)", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid)); |
5256 | | /* Per NVMe-MI 2.1 SS "Request and Response Data" (the "NVMe Admin |
5257 | | * Command Response Data Example" / "NVMe Get Log Page Command Response |
5258 | | * Data Example" figures): the |
5259 | | * Log Page Offset (LPO, captured from the request's CDW12/13 into |
5260 | | * cmd_ctx->cmd_ctx.get_logpage.off by dissect_nvme_get_logpage_cmd()) |
5261 | | * is applied first to select the logical response data, then the |
5262 | | * transport-level window (`off` here -- NVMe-MI DOFST, or the |
5263 | | * TCP/RDMA transfer offset) is applied on top of that. Several |
5264 | | * decoders below take a single combined offset directly; others |
5265 | | * (unchanged here) already do this same LPO+transport combination |
5266 | | * internally using their own `tr_off`-named parameter. |
5267 | | * |
5268 | | * LPO is a wire-controlled uint64_t with no upper-bound validation at |
5269 | | * parse time, so the sum is computed in 64-bit and saturated (not |
5270 | | * truncated) to unsigned: every decoder below rejects an out-of-range |
5271 | | * offset via an "off > <max>" style guard, so clamping an overflowing |
5272 | | * sum to UINT32_MAX guarantees those guards reject it, instead of a |
5273 | | * huge LPO silently wrapping into a small, in-range-looking offset. */ |
5274 | 0 | uint64_t lpo = cmd_ctx->cmd_ctx.get_logpage.off; |
5275 | 0 | uint64_t combined_off64 = (lpo > UINT64_MAX - off) ? UINT64_MAX : lpo + off; |
5276 | 0 | unsigned combined_off = (combined_off64 > UINT32_MAX) ? UINT32_MAX : (unsigned)combined_off64; |
5277 | |
|
5278 | 0 | switch(cmd_ctx->cmd_ctx.get_logpage.lid) { |
5279 | 0 | case NVME_LID_SUPPORTED_LOG_PAGES: |
5280 | 0 | dissect_nvme_get_logpage_supported_resp(ti, cmd_tvb, pinfo, combined_off, len); break; |
5281 | 0 | case NVME_LID_DISCOVERY: |
5282 | 0 | dissect_nvme_get_logpage_ify_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5283 | 0 | case NVME_LID_ERROR_INFO: |
5284 | 0 | dissect_nvme_get_logpage_err_inf_resp(ti, cmd_tvb, combined_off, len); break; |
5285 | 0 | case NVME_LID_SMART: |
5286 | 0 | dissect_nvme_get_logpage_smart_resp(ti, cmd_tvb, combined_off, len); break; |
5287 | 0 | case NVME_LID_FW_SLOT: |
5288 | 0 | dissect_nvme_get_logpage_fw_slot_resp(ti, cmd_tvb, combined_off, len); break; |
5289 | 0 | case NVME_LID_CHANGED_NSLIST: |
5290 | 0 | case NVME_LID_CHANGED_ALLOC_NSLIST: |
5291 | 0 | dissect_nvme_get_logpage_changed_nslist_resp(ti, cmd_tvb, pinfo, combined_off, len); break; |
5292 | 0 | case NVME_LID_CMD_SUP_AND_EFF: |
5293 | 0 | dissect_nvme_get_logpage_cmd_sup_and_eff_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5294 | 0 | case NVME_LID_DEVICE_SELF_TEST: |
5295 | 0 | dissect_nvme_get_logpage_selftest_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5296 | 0 | case NVME_LID_TELEMETRY_HOST: |
5297 | 0 | case NVME_LID_TELEMETRY_CTRL: |
5298 | 0 | dissect_nvme_get_logpage_telemetry_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5299 | 0 | case NVME_LID_ENDURANCE_GROUP: |
5300 | 0 | dissect_nvme_get_logpage_egroup_resp(ti, cmd_tvb, cmd_ctx, combined_off, len); break; |
5301 | 0 | case NVME_LID_PRED_LAT_NVM_SET: |
5302 | 0 | dissect_nvme_get_logpage_pred_lat_resp(ti, cmd_tvb, cmd_ctx, combined_off, len); break; |
5303 | 0 | case NVME_LID_PRED_LAT_EVENT_AGG: |
5304 | 0 | dissect_nvme_get_logpage_pred_lat_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5305 | 0 | case NVME_LID_ANA: |
5306 | 0 | dissect_nvme_get_logpage_ana_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5307 | 0 | case NVME_LID_LBA_STATUS: |
5308 | 0 | dissect_nvme_get_logpage_lba_status_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5309 | 0 | case NVME_LID_ENDURANCE_GROUP_EVENT_AGG: |
5310 | 0 | dissect_nvme_get_logpage_egroup_aggreg_resp(ti, cmd_tvb, cmd_ctx, off, len); break; |
5311 | 0 | case NVME_LID_RESERVATION_NOTIFICATION: |
5312 | 0 | dissect_nvme_get_logpage_reserv_notif_resp(ti, cmd_tvb, combined_off, len); break; |
5313 | 0 | case NVME_LID_SANITIZE_STATUS: |
5314 | 0 | dissect_nvme_get_logpage_sanitize_resp(ti, cmd_tvb, combined_off, len); break; |
5315 | 0 | case NVME_LID_FEATURE_ID_SUP_AND_EFF: |
5316 | 0 | dissect_nvme_get_logpage_feat_sup_and_eff_resp(ti, cmd_tvb, pinfo, combined_off, len); break; |
5317 | 0 | case NVME_LID_NVME_MI_CMD_SUP_AND_EFF: |
5318 | 0 | dissect_nvme_get_logpage_mi_cmd_sup_and_eff_resp(ti, cmd_tvb, pinfo, combined_off, len); break; |
5319 | 0 | case NVME_LID_CMD_FEAT_LOCKDOWN: |
5320 | 0 | dissect_nvme_get_logpage_cmd_feat_lockdown_resp(ti, cmd_tvb, combined_off, len); break; |
5321 | 0 | case NVME_LID_PHY_RX_EOM: |
5322 | 0 | dissect_nvme_get_logpage_eom_resp(ti, cmd_tvb, pinfo, cmd_ctx, combined_off, len); break; |
5323 | 0 | default: |
5324 | 0 | return; |
5325 | 0 | } |
5326 | 0 | } |
5327 | | |
5328 | | static void dissect_nvme_get_logpage_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
5329 | | struct nvme_cmd_ctx *cmd_ctx) |
5330 | 0 | { |
5331 | 0 | proto_item *ti; |
5332 | 0 | unsigned val; |
5333 | |
|
5334 | 0 | cmd_ctx->cmd_ctx.get_logpage.lid = tvb_get_uint8(cmd_tvb, 40); |
5335 | 0 | cmd_ctx->cmd_ctx.get_logpage.lsi = tvb_get_uint16(cmd_tvb, 46, ENC_LITTLE_ENDIAN); |
5336 | |
|
5337 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_logpage_dword10)); |
5338 | 0 | ti = proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_get_logpage_numd, cmd_tvb, 42, 4, ENC_LITTLE_ENDIAN, &val); |
5339 | 0 | proto_item_append_text(ti, " (%"PRIu64" bytes)", ((uint64_t)val + 1) * 4); |
5340 | 0 | cmd_ctx->cmd_ctx.get_logpage.numd = val; |
5341 | |
|
5342 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_get_logpage_dword11)); |
5343 | |
|
5344 | 0 | proto_tree_add_item_ret_uint64(cmd_tree, hf_nvme_get_logpage_lpo, cmd_tvb, 48, 8, ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.get_logpage.off); |
5345 | 0 | cmd_ctx->cmd_ctx.get_logpage.off &= (~((uint64_t)3)); /* clear two low bits, the target shall either deny the command or clear the bits */ |
5346 | |
|
5347 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
5348 | |
|
5349 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_logpage_dword14)); |
5350 | |
|
5351 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
5352 | 0 | } |
5353 | | |
5354 | | typedef enum { |
5355 | | F_ARBITRATION = 0x01, |
5356 | | F_POWER_MGMT = 0x02, |
5357 | | F_LBA_RANGE_TYPE = 0x03, |
5358 | | F_TEMP_THRESHOLD = 0x04, |
5359 | | F_ERROR_RECOVERY = 0x05, |
5360 | | F_VOLATILE_WC = 0x06, |
5361 | | F_NUM_OF_QUEUES = 0x07, |
5362 | | F_IRQ_COALESCING = 0x08, |
5363 | | F_IRQ_VECTOR_CONF = 0x09, |
5364 | | F_WRITE_ATOM_NORM = 0x0A, |
5365 | | F_ASYNC_EVENT_CONF = 0x0B, |
5366 | | F_AUTO_PS_TRANSITION = 0x0C, |
5367 | | F_HOST_MEM_BUF = 0x0D, |
5368 | | F_TIMESTAMP = 0x0E, |
5369 | | F_KA_TIMER = 0x0F, |
5370 | | F_HOST_CNTL_THERM_MGMT = 0x10, |
5371 | | F_NO_POWER_STATE_CONF = 0x11, |
5372 | | F_READ_REC_LEVEL_CONF = 0x12, |
5373 | | F_PRED_LAT_MODE_CONF = 0x13, |
5374 | | F_PRED_LAT_MODE_WIND = 0x14, |
5375 | | F_LBA_ST_INF_REP_INT = 0x15, |
5376 | | F_HOST_BEHV_SUPPORT = 0x16, |
5377 | | F_SANITIZE_CON = 0x17, |
5378 | | F_END_GROUP_EV_CONF = 0x18, |
5379 | | F_IO_CMD_SET_PROFILE = 0x19, |
5380 | | F_SPINUP_CONTROL = 0x1A, |
5381 | | F_POWER_LOSS_SIG_CONF = 0x1B, |
5382 | | F_PERF_CHARACTERISTICS = 0x1C, |
5383 | | F_FDP = 0x1D, |
5384 | | F_FDP_EVENTS = 0x1E, |
5385 | | F_NS_ADMIN_LABEL = 0x1F, |
5386 | | F_KV_CONFIG = 0x20, |
5387 | | F_CTRL_DATA_QUEUE = 0x21, |
5388 | | F_CONF_DEV_PERSONALITY = 0x22, |
5389 | | F_POWER_LIMIT = 0x23, |
5390 | | F_POWER_THRESHOLD = 0x24, |
5391 | | F_POWER_MEASUREMENT = 0x25, |
5392 | | F_EMB_MGMT_CTRL_ADDR = 0x78, |
5393 | | F_HOST_MGMT_AGENT_ADDR = 0x79, |
5394 | | F_ENH_CTRL_METADATA = 0x7D, |
5395 | | F_CTRL_METADATA = 0x7E, |
5396 | | F_NS_METADATA = 0x7F, |
5397 | | F_SW_PR_MARKER = 0x80, |
5398 | | F_HOST_ID = 0x81, |
5399 | | F_RSRV_NOT_MASK = 0x82, |
5400 | | F_RSRV_PRST = 0x83, |
5401 | | F_NS_WRITE_CONF = 0x84, |
5402 | | F_BP_WRITE_PROT_CONF = 0x85, |
5403 | | } nvme_setf_t; |
5404 | | |
5405 | | |
5406 | | static const range_string fid_table[] = { |
5407 | | { F_ARBITRATION, F_ARBITRATION, "Arbitration" }, |
5408 | | { F_POWER_MGMT, F_POWER_MGMT, "Power Management" }, |
5409 | | { F_LBA_RANGE_TYPE, F_LBA_RANGE_TYPE, "LBA Range Type" }, |
5410 | | { F_TEMP_THRESHOLD, F_TEMP_THRESHOLD, "Temperature Threshold" }, |
5411 | | { F_ERROR_RECOVERY, F_ERROR_RECOVERY, "Error Recovery" }, |
5412 | | { F_VOLATILE_WC, F_VOLATILE_WC, "Volatile Write Cache" }, |
5413 | | { F_NUM_OF_QUEUES, F_NUM_OF_QUEUES, "Number of Queues" }, |
5414 | | { F_IRQ_COALESCING, F_IRQ_COALESCING, "Interrupt Coalescing" }, |
5415 | | { F_IRQ_VECTOR_CONF, F_IRQ_VECTOR_CONF, "Interrupt Vector Configuration" }, |
5416 | | { F_WRITE_ATOM_NORM, F_WRITE_ATOM_NORM, "Write Atomicity Normal" }, |
5417 | | { F_ASYNC_EVENT_CONF, F_ASYNC_EVENT_CONF, "Asynchronous Event Configuration" }, |
5418 | | { F_AUTO_PS_TRANSITION, F_AUTO_PS_TRANSITION, "Autonomous Power State Transition" }, |
5419 | | { F_HOST_MEM_BUF, F_HOST_MEM_BUF, "Host Memory Buffer" }, |
5420 | | { F_TIMESTAMP, F_TIMESTAMP, "Timestamp" }, |
5421 | | { F_KA_TIMER, F_KA_TIMER, "Keep Alive Timer" }, |
5422 | | { F_HOST_CNTL_THERM_MGMT, F_HOST_CNTL_THERM_MGMT, "Host Controlled Thermal Management" }, |
5423 | | { F_NO_POWER_STATE_CONF, F_NO_POWER_STATE_CONF, "Non-Operational Power State Config" }, |
5424 | | { F_READ_REC_LEVEL_CONF, F_READ_REC_LEVEL_CONF, "Read Recovery Level Config" }, |
5425 | | { F_PRED_LAT_MODE_CONF, F_PRED_LAT_MODE_CONF, "Predictable Latency Mode Config" }, |
5426 | | { F_PRED_LAT_MODE_WIND, F_PRED_LAT_MODE_WIND, "Predictable Latency Mode Window" }, |
5427 | | { F_LBA_ST_INF_REP_INT, F_LBA_ST_INF_REP_INT, "LBA Status Information Report Interval" }, |
5428 | | { F_HOST_BEHV_SUPPORT, F_HOST_BEHV_SUPPORT, "Host Behavior Support" }, |
5429 | | { F_SANITIZE_CON, F_SANITIZE_CON, "Sanitize Config" }, |
5430 | | { F_END_GROUP_EV_CONF, F_END_GROUP_EV_CONF, "Endurance Group Event Configuration" }, |
5431 | | { F_IO_CMD_SET_PROFILE, F_IO_CMD_SET_PROFILE, "I/O Command Set Profile" }, |
5432 | | { F_SPINUP_CONTROL, F_SPINUP_CONTROL, "Spinup Control" }, |
5433 | | { F_POWER_LOSS_SIG_CONF, F_POWER_LOSS_SIG_CONF, "Power Loss Signaling Config" }, |
5434 | | { F_PERF_CHARACTERISTICS, F_PERF_CHARACTERISTICS, "Performance Characteristics" }, |
5435 | | { F_FDP, F_FDP, "Flexible Data Placement" }, |
5436 | | { F_FDP_EVENTS, F_FDP_EVENTS, "Flexible Data Placement Events" }, |
5437 | | { F_NS_ADMIN_LABEL, F_NS_ADMIN_LABEL, "Namespace Admin Label" }, |
5438 | | { F_KV_CONFIG, F_KV_CONFIG, "Key Value Configuration" }, |
5439 | | { F_CTRL_DATA_QUEUE, F_CTRL_DATA_QUEUE, "Controller Data Queue" }, |
5440 | | { F_CONF_DEV_PERSONALITY, F_CONF_DEV_PERSONALITY, "Configurable Device Personality" }, |
5441 | | { F_POWER_LIMIT, F_POWER_LIMIT, "Power Limit" }, |
5442 | | { F_POWER_THRESHOLD, F_POWER_THRESHOLD, "Power Threshold" }, |
5443 | | { F_POWER_MEASUREMENT, F_POWER_MEASUREMENT, "Power Measurement" }, |
5444 | | { F_EMB_MGMT_CTRL_ADDR, F_EMB_MGMT_CTRL_ADDR, "Embedded Management Controller Address" }, |
5445 | | { F_HOST_MGMT_AGENT_ADDR, F_HOST_MGMT_AGENT_ADDR, "Host Management Agent Address" }, |
5446 | | { F_ENH_CTRL_METADATA, F_ENH_CTRL_METADATA, "Enhanced Controller Metadata" }, |
5447 | | { F_CTRL_METADATA, F_CTRL_METADATA, "Controller Metadata" }, |
5448 | | { F_NS_METADATA, F_NS_METADATA, "Namespace Metadata" }, |
5449 | | { F_SW_PR_MARKER, F_SW_PR_MARKER, "Software Progress Marker" }, |
5450 | | { F_HOST_ID, F_HOST_ID, "Host Identifier" }, |
5451 | | { F_RSRV_NOT_MASK, F_RSRV_NOT_MASK, "Reservation Notification Mask" }, |
5452 | | { F_RSRV_PRST, F_RSRV_PRST, "Reservation Persistence" }, |
5453 | | { F_NS_WRITE_CONF, F_NS_WRITE_CONF, "Namespace Write Protection Config" }, |
5454 | | { F_BP_WRITE_PROT_CONF, F_BP_WRITE_PROT_CONF, "Boot Partition Write Protection Config" }, |
5455 | | { 0xC0, 0xFF, "Vendor Specific" }, |
5456 | | { 0, 0, NULL }, |
5457 | | }; |
5458 | | |
5459 | | /* Forward-declared above for dissect_nvme_get_logpage_cmd_feat_lockdown_resp(), |
5460 | | * which names Command and Feature Identifier List entries when the log page's |
5461 | | * Scope Selected field says they are Feature Identifiers. */ |
5462 | | static const char *get_feature_id_name(uint8_t fid) |
5463 | 0 | { |
5464 | 0 | return rval_to_str_const(fid, fid_table, "Reserved"); |
5465 | 0 | } |
5466 | | |
5467 | | static const value_string sel_table[] = { |
5468 | | { 0, "Current" }, |
5469 | | { 1, "Default" }, |
5470 | | { 2, "Saved" }, |
5471 | | { 3, "Supported Capabilities" }, |
5472 | | { 0, NULL }, |
5473 | | }; |
5474 | | |
5475 | | static const value_string sf_tmpsel_table[] = { |
5476 | | { 0x0, "Composite Temperature" }, |
5477 | | { 0x1, "Temperature Sensor 1" }, |
5478 | | { 0x2, "Temperature Sensor 2" }, |
5479 | | { 0x3, "Temperature Sensor 3" }, |
5480 | | { 0x4, "Temperature Sensor 4" }, |
5481 | | { 0x5, "Temperature Sensor 5" }, |
5482 | | { 0x6, "Temperature Sensor 6" }, |
5483 | | { 0x7, "Temperature Sensor 7" }, |
5484 | | { 0x8, "Temperature Sensor 8" }, |
5485 | | { 0xF, "All Temperature Sensors" }, |
5486 | | { 0, NULL }, |
5487 | | }; |
5488 | | |
5489 | | static const value_string sf_thpsel_table[] = { |
5490 | | { 0x0, "Over Temperature Threshold" }, |
5491 | | { 0x1, "Under Temperature Threshold" }, |
5492 | | { 0x2, "Reserved" }, |
5493 | | { 0x3, "Reserved" }, |
5494 | | { 0, NULL }, |
5495 | | }; |
5496 | | |
5497 | | static const value_string sf_ws_table[] = { |
5498 | | { 0x0, "Reserved" }, |
5499 | | { 0x1, "Deterministic Window" }, |
5500 | | { 0x2, "Non-Deterministic Window" }, |
5501 | | { 0x3, "Reserved" }, |
5502 | | { 0x4, "Reserved" }, |
5503 | | { 0x5, "Reserved" }, |
5504 | | { 0x6, "Reserved" }, |
5505 | | { 0x7, "Reserved" }, |
5506 | | { 0, NULL }, |
5507 | | }; |
5508 | | |
5509 | | static const value_string sf_wps[] = { |
5510 | | { 0x0, "No Write Protect" }, |
5511 | | { 0x1, "Write Protect" }, |
5512 | | { 0x2, "Write Protect Until Power Cycle" }, |
5513 | | { 0x3, "Permanent Write Protect" }, |
5514 | | { 0x4, "Reserved" }, |
5515 | | { 0x5, "Reserved" }, |
5516 | | { 0x6, "Reserved" }, |
5517 | | { 0x7, "Reserved" }, |
5518 | | { 0, NULL }, |
5519 | | }; |
5520 | | |
5521 | | /* Power Loss Signaling Mode (PLSM), Power Loss Signaling Config Set Features |
5522 | | * Command Dword 11 bits 1:0. */ |
5523 | | static const value_string sf_plsm[] = { |
5524 | | { 0x0, "Power Loss Signaling not enabled" }, |
5525 | | { 0x1, "Power Loss Signaling with Emergency Power Fail enabled" }, |
5526 | | { 0x2, "Power Loss Signaling with Forced Quiescence enabled" }, |
5527 | | { 0x3, "Reserved" }, |
5528 | | { 0, NULL }, |
5529 | | }; |
5530 | | |
5531 | | /* Boot Partition Write Protection State (BP0WPS/BP1WPS), Boot Partition Write |
5532 | | * Protection Config Set Features Command Dword 11. */ |
5533 | | static const value_string sf_bpwps[] = { |
5534 | | { 0x0, "Change in state not requested" }, |
5535 | | { 0x1, "Write Unlocked" }, |
5536 | | { 0x2, "Write Locked" }, |
5537 | | { 0x3, "Write Locked Until Power Cycle" }, |
5538 | | { 0x4, "Write Protection controlled by RPMB" }, |
5539 | | { 0x5, "Reserved" }, |
5540 | | { 0x6, "Reserved" }, |
5541 | | { 0x7, "Reserved" }, |
5542 | | { 0, NULL }, |
5543 | | }; |
5544 | | |
5545 | | static void add_nvme_queues(char *result, uint32_t val) |
5546 | 0 | { |
5547 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%x (%u)", val, val+1); |
5548 | 0 | } |
5549 | | |
5550 | | /* Host Metadata features (FID 7Dh/7Eh/7Fh) Element Action, Set Features |
5551 | | * Command Dword 11 bits 14:13. */ |
5552 | | static const value_string sf_host_metadata_ea[] = { |
5553 | | { 0x0, "Add or Replace Entry" }, |
5554 | | { 0x1, "Delete Entry Multiple" }, |
5555 | | { 0x2, "Add Entry Multiple" }, |
5556 | | { 0x3, "Reserved" }, |
5557 | | { 0, NULL }, |
5558 | | }; |
5559 | | |
5560 | | /* Metadata Element Descriptor Element Type for the (Enhanced) Controller |
5561 | | * Metadata features 7Dh/7Eh (NVMe Base 2.3 "Controller Metadata Element |
5562 | | * Types"). */ |
5563 | | static const range_string host_metadata_ctrl_et[] = { |
5564 | | { 0x00, 0x00, "Reserved" }, |
5565 | | { 0x01, 0x01, "Operating System Controller Name" }, |
5566 | | { 0x02, 0x02, "Operating System Driver Name" }, |
5567 | | { 0x03, 0x03, "Operating System Driver Version" }, |
5568 | | { 0x04, 0x04, "Pre-boot Controller Name" }, |
5569 | | { 0x05, 0x05, "Pre-boot Driver Name" }, |
5570 | | { 0x06, 0x06, "Pre-boot Driver Version" }, |
5571 | | { 0x07, 0x07, "System Processor Model" }, |
5572 | | { 0x08, 0x08, "Chipset Driver Name" }, |
5573 | | { 0x09, 0x09, "Chipset Driver Version" }, |
5574 | | { 0x0A, 0x0A, "Operating System Name and Build" }, |
5575 | | { 0x0B, 0x0B, "System Product Name" }, |
5576 | | { 0x0C, 0x0C, "Firmware Version" }, |
5577 | | { 0x0D, 0x0D, "Operating System Driver Filename" }, |
5578 | | { 0x0E, 0x0E, "Display Driver Name" }, |
5579 | | { 0x0F, 0x0F, "Display Driver Version" }, |
5580 | | { 0x10, 0x10, "Host-Determined Failure Record" }, |
5581 | | { 0x11, 0x17, "Reserved" }, |
5582 | | { 0x18, 0x1F, "Vendor Specific" }, |
5583 | | { 0, 0, NULL }, |
5584 | | }; |
5585 | | |
5586 | | /* Metadata Element Descriptor Element Type for the Namespace Metadata feature |
5587 | | * 7Fh (NVMe Base 2.3 "Namespace Metadata Element Types"). */ |
5588 | | static const range_string host_metadata_ns_et[] = { |
5589 | | { 0x00, 0x00, "Reserved" }, |
5590 | | { 0x01, 0x01, "Operating System Namespace Name" }, |
5591 | | { 0x02, 0x02, "Pre-boot Namespace Name" }, |
5592 | | { 0x03, 0x03, "Operating System Namespace Name Qualifier 1" }, |
5593 | | { 0x04, 0x04, "Operating System Namespace Name Qualifier 2" }, |
5594 | | { 0x05, 0x17, "Reserved" }, |
5595 | | { 0x18, 0x1F, "Vendor Specific" }, |
5596 | | { 0, 0, NULL }, |
5597 | | }; |
5598 | | |
5599 | | static void dissect_nvme_set_features_dword11(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid) |
5600 | 0 | { |
5601 | 0 | switch (fid) { |
5602 | 0 | case F_ARBITRATION: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_arb)); break; |
5603 | 0 | case F_POWER_MGMT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_pm)); break; |
5604 | 0 | case F_LBA_RANGE_TYPE: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_lbart)); break; |
5605 | 0 | case F_TEMP_THRESHOLD: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_tt)); break; |
5606 | 0 | case F_ERROR_RECOVERY: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_erec)); break; |
5607 | 0 | case F_VOLATILE_WC: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_vwce)); break; |
5608 | 0 | case F_NUM_OF_QUEUES: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nq)); break; |
5609 | 0 | case F_IRQ_COALESCING: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_irqc)); break; |
5610 | 0 | case F_IRQ_VECTOR_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_irqv)); break; |
5611 | 0 | case F_WRITE_ATOM_NORM: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_wan)); break; |
5612 | 0 | case F_ASYNC_EVENT_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_aec)); break; |
5613 | 0 | case F_AUTO_PS_TRANSITION: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_apst)); break; |
5614 | 0 | case F_KA_TIMER: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_kat)); break; |
5615 | 0 | case F_HOST_CNTL_THERM_MGMT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hctm)); break; |
5616 | 0 | case F_NO_POWER_STATE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nops)); break; |
5617 | 0 | case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rrl)); break; |
5618 | 0 | case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plmc)); break; |
5619 | 0 | case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plmw)); break; |
5620 | 0 | case F_LBA_ST_INF_REP_INT: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_lbasi)); break; |
5621 | 0 | case F_SANITIZE_CON: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_san)); break; |
5622 | 0 | case F_END_GROUP_EV_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_eg)); break; |
5623 | 0 | case F_SW_PR_MARKER: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_swp)); break; |
5624 | 0 | case F_HOST_ID: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hid)); break; |
5625 | 0 | case F_RSRV_NOT_MASK: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rsrvn)); break; |
5626 | 0 | case F_RSRV_PRST: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_rsrvp)); break; |
5627 | 0 | case F_NS_WRITE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_nswp)); break; |
5628 | 0 | case F_ENH_CTRL_METADATA: |
5629 | 0 | case F_CTRL_METADATA: |
5630 | 0 | case F_NS_METADATA: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hmd)); break; |
5631 | 0 | case F_HOST_MEM_BUF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_hmb)); break; |
5632 | 0 | case F_IO_CMD_SET_PROFILE: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_iocsp)); break; |
5633 | 0 | case F_SPINUP_CONTROL: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_spinup)); break; |
5634 | 0 | case F_POWER_LOSS_SIG_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_plsc)); break; |
5635 | 0 | case F_FDP: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_fdp)); break; |
5636 | 0 | case F_FDP_EVENTS: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_fdpe)); break; |
5637 | 0 | case F_BP_WRITE_PROT_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_set_features_dword11_bpwpc)); break; |
5638 | 0 | default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
5639 | 0 | } |
5640 | 0 | } |
5641 | | |
5642 | | static void dissect_nvme_set_features_dword12(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, unsigned fid) |
5643 | 0 | { |
5644 | 0 | switch (fid) { |
5645 | 0 | case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_rrl)); break; |
5646 | 0 | case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_plmc)); break; |
5647 | 0 | case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 48, 4, ASPEC(hf_nvme_cmd_set_features_dword12_plmw)); break; |
5648 | 0 | default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
5649 | 0 | } |
5650 | 0 | } |
5651 | | |
5652 | | static void dissect_nvme_set_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
5653 | | struct nvme_cmd_ctx *cmd_ctx) |
5654 | 0 | { |
5655 | 0 | cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40); |
5656 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_set_features_dword10)); |
5657 | 0 | dissect_nvme_set_features_dword11(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid); |
5658 | 0 | dissect_nvme_set_features_dword12(cmd_tvb, cmd_tree, cmd_ctx->cmd_ctx.set_features.fid); |
5659 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
5660 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_set_features_dword14)); |
5661 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
5662 | 0 | } |
5663 | | |
5664 | | static void dissect_nvme_get_features_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
5665 | | struct nvme_cmd_ctx *cmd_ctx) |
5666 | 0 | { |
5667 | 0 | cmd_ctx->cmd_ctx.set_features.fid = tvb_get_uint8(cmd_tvb, 40); |
5668 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_get_features_dword10)); |
5669 | 0 | switch(cmd_ctx->cmd_ctx.set_features.fid) { |
5670 | 0 | case F_READ_REC_LEVEL_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_rrl)); break; |
5671 | 0 | case F_PRED_LAT_MODE_CONF: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_plmc)); break; |
5672 | 0 | case F_PRED_LAT_MODE_WIND: add_group_mask_entry(cmd_tvb, cmd_tree, 44, 4, ASPEC(hf_nvme_cmd_get_features_dword11_plmw)); break; |
5673 | 0 | default: proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); break; |
5674 | 0 | } |
5675 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
5676 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
5677 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_get_features_dword14)); |
5678 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
5679 | 0 | } |
5680 | | |
5681 | | static void dissect_nvme_rw_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
5682 | 0 | { |
5683 | 0 | proto_item *ti, *dsm_tree, *item; |
5684 | 0 | uint8_t val; |
5685 | |
|
5686 | 0 | dissect_nvme_rwc_common_word_10_11_12_14_15(cmd_tvb, cmd_tree); |
5687 | |
|
5688 | 0 | ti = proto_tree_add_item(cmd_tree, hf_nvme_cmd_dsm, cmd_tvb, 52, |
5689 | 0 | 1, ENC_NA); |
5690 | 0 | dsm_tree = proto_item_add_subtree(ti, ett_data); |
5691 | |
|
5692 | 0 | val = tvb_get_uint8(cmd_tvb, 52) & 0x0f; |
5693 | 0 | item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_freq, cmd_tvb, |
5694 | 0 | 52, 1, ENC_LITTLE_ENDIAN); |
5695 | 0 | proto_item_append_text(item, " %s", |
5696 | 0 | val_to_str_const(val, dsm_acc_freq_tbl, "Reserved")); |
5697 | |
|
5698 | 0 | val = (tvb_get_uint8(cmd_tvb, 52) & 0x30) >> 4; |
5699 | 0 | item = proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_access_lat, cmd_tvb, |
5700 | 0 | 52, 1, ENC_LITTLE_ENDIAN); |
5701 | 0 | proto_item_append_text(item, " %s", |
5702 | 0 | val_to_str_const(val, dsm_acc_lat_tbl, "Reserved")); |
5703 | |
|
5704 | 0 | proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_seq_req, cmd_tvb, |
5705 | 0 | 52, 1, ENC_LITTLE_ENDIAN); |
5706 | 0 | proto_tree_add_item(dsm_tree, hf_nvme_cmd_dsm_incompressible, cmd_tvb, |
5707 | 0 | 52, 1, ENC_LITTLE_ENDIAN); |
5708 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd3, cmd_tvb, |
5709 | 0 | 53, 3, ENC_NA); |
5710 | 0 | } |
5711 | | |
5712 | | static const range_string sf_lbart_type_table[] = { |
5713 | | { 0x0, 0x0, "General Purpose" }, |
5714 | | { 0x1, 0x1, "Filesystem" }, |
5715 | | { 0x2, 0x2, "RAID" }, |
5716 | | { 0x3, 0x3, "Cache" }, |
5717 | | { 0x4, 0x4, "Swap" }, |
5718 | | { 0x80, 0xFF, "Vendor Specific" }, |
5719 | | { 0, 0, NULL }, |
5720 | | }; |
5721 | | |
5722 | | static void dissect_nvme_set_features_transfer_lbart(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len) |
5723 | 0 | { |
5724 | 0 | proto_tree *grp; |
5725 | 0 | proto_item *ti; |
5726 | 0 | unsigned done = 0; |
5727 | 0 | while (len >= 64) { |
5728 | 0 | ti = proto_tree_add_bytes_format_value(tree, hf_nvme_set_features_tr_lbart, tvb, done, 64, NULL, "LBA Range Structure %u", (done + off) / 64); |
5729 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5730 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_type, tvb, done, 1, ENC_LITTLE_ENDIAN); |
5731 | 0 | add_group_mask_entry(tvb, grp, done+1, 1, ASPEC(hf_nvme_set_features_tr_lbart_attr)); |
5732 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd0, tvb, done+2, 14, ENC_NA); |
5733 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_slba, tvb, done+16, 8, ENC_LITTLE_ENDIAN); |
5734 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_nlb, tvb, done+24, 8, ENC_LITTLE_ENDIAN); |
5735 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_guid, tvb, done+32, 16, ENC_NA); |
5736 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_lbart_rsvd1, tvb, done+48, 16, ENC_NA); |
5737 | 0 | len -= 64; |
5738 | 0 | done += 64; |
5739 | 0 | } |
5740 | 0 | } |
5741 | | |
5742 | | static void dissect_nvme_set_features_transfer_apst(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len) |
5743 | 0 | { |
5744 | 0 | unsigned poff = 0; |
5745 | | /* Non-Operational Power State Transition table: 32 entries * 8 bytes = |
5746 | | * 256 bytes max. Each entry's value is self-contained, but a nonzero |
5747 | | * window offset moves where that 256-byte ceiling falls. */ |
5748 | 0 | unsigned max_len = (off < 256) ? (256 - off) : 0; |
5749 | |
|
5750 | 0 | if (len > max_len) |
5751 | 0 | len = max_len; |
5752 | 0 | while (len >= 8) { |
5753 | 0 | add_group_mask_entry(tvb, tree, poff, 8, ASPEC(hf_nvme_set_features_tr_apst)); |
5754 | 0 | len -= 8; |
5755 | 0 | poff += 8; |
5756 | 0 | } |
5757 | 0 | } |
5758 | | |
5759 | | static void dissect_nvme_set_features_transfer_tst(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len) |
5760 | 0 | { |
5761 | 0 | unsigned rel; |
5762 | |
|
5763 | 0 | if (nvme_field_in_window(off, len, 0, 8, &rel)) |
5764 | 0 | add_group_mask_entry(tvb, tree, rel, 8, ASPEC(hf_nvme_set_features_tr_tst)); |
5765 | 0 | } |
5766 | | |
5767 | | |
5768 | | static void dissect_nvme_set_features_transfer_plmc(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len) |
5769 | 0 | { |
5770 | 0 | proto_tree *grp; |
5771 | 0 | proto_item *ti; |
5772 | 0 | unsigned rel; |
5773 | |
|
5774 | 0 | ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_plmc, tvb, 0, len, ENC_NA); |
5775 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5776 | 0 | if (nvme_field_in_window(off, len, 0, 2, &rel)) |
5777 | 0 | add_group_mask_entry(tvb, grp, rel, 2, ASPEC(hf_nvme_set_features_tr_plmc_ee)); |
5778 | 0 | if (nvme_field_in_window(off, len, 2, 30, &rel)) |
5779 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd0, tvb, rel, 30, ENC_NA); |
5780 | 0 | if (nvme_field_in_window(off, len, 32, 8, &rel)) |
5781 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinrt, tvb, rel, 8, ENC_LITTLE_ENDIAN); |
5782 | 0 | if (nvme_field_in_window(off, len, 40, 8, &rel)) |
5783 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwinwt, tvb, rel, 8, ENC_LITTLE_ENDIAN); |
5784 | 0 | if (nvme_field_in_window(off, len, 48, 8, &rel)) |
5785 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_dtwintt, tvb, rel, 8, ENC_LITTLE_ENDIAN); |
5786 | | /* Trailing/remaining-length field: guard before subtracting so a short |
5787 | | * or windowed transfer can't underflow `len` (this is exactly the |
5788 | | * unsigned-subtraction bug the DOFST-windowing audit found here). |
5789 | | * off > 56 means the whole window already lies inside this trailing |
5790 | | * field, so it renders entirely from tvb position 0 (poff=0) rather |
5791 | | * than being silently dropped. */ |
5792 | 0 | { |
5793 | 0 | unsigned poff = (off <= 56) ? (56 - off) : 0; |
5794 | 0 | if (poff <= len && off <= 512) { |
5795 | | /* Remaining room at tvb position poff is (512-off)-poff, not the |
5796 | | * raw len -- an oversized/malformed len must not render bytes |
5797 | | * past the structure's real 512-byte end (NVMe Base 2.3 Figure |
5798 | | * 423) as "Reserved1". */ |
5799 | 0 | unsigned max_len = (512 - off) - poff; |
5800 | 0 | unsigned rlen = len - poff; |
5801 | 0 | if (rlen > max_len) |
5802 | 0 | rlen = max_len; |
5803 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_plmc_rsvd1, tvb, poff, rlen, ENC_NA); |
5804 | 0 | } |
5805 | 0 | } |
5806 | 0 | } |
5807 | | |
5808 | | static void dissect_nvme_set_features_transfer_hbs(tvbuff_t *tvb, proto_tree *tree, unsigned off, unsigned len) |
5809 | 0 | { |
5810 | 0 | proto_tree *grp; |
5811 | 0 | proto_item *ti; |
5812 | 0 | unsigned rel; |
5813 | |
|
5814 | 0 | ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_hbs, tvb, 0, len, ENC_NA); |
5815 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5816 | 0 | if (nvme_field_in_window(off, len, 0, 1, &rel)) |
5817 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_acre, tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5818 | 0 | if (nvme_field_in_window(off, len, 1, 1, &rel)) |
5819 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_etdas, tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5820 | 0 | if (nvme_field_in_window(off, len, 2, 1, &rel)) |
5821 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_lbafee, tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5822 | 0 | if (nvme_field_in_window(off, len, 3, 1, &rel)) |
5823 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_hdisns, tvb, rel, 1, ENC_LITTLE_ENDIAN); |
5824 | 0 | if (nvme_field_in_window(off, len, 4, 2, &rel)) |
5825 | 0 | add_group_mask_entry(tvb, grp, rel, 2, ASPEC(hf_nvme_set_features_tr_hbs_cdfe)); |
5826 | | /* off > 6 means the whole window already lies inside this trailing |
5827 | | * field, so it renders entirely from tvb position 0 (poff=0) rather |
5828 | | * than being silently dropped. */ |
5829 | 0 | { |
5830 | 0 | unsigned poff = (off <= 6) ? (6 - off) : 0; |
5831 | 0 | if (poff <= len && off <= 512) { |
5832 | | /* Remaining room at tvb position poff is (512-off)-poff, not the |
5833 | | * raw len -- an oversized/malformed len must not render bytes |
5834 | | * past the structure's real 512-byte end (NVMe Base 2.3 Figure |
5835 | | * 426) as "Reserved". */ |
5836 | 0 | unsigned max_len = (512 - off) - poff; |
5837 | 0 | unsigned rlen = len - poff; |
5838 | 0 | if (rlen > max_len) |
5839 | 0 | rlen = max_len; |
5840 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hbs_rsvd, tvb, poff, rlen, ENC_NA); |
5841 | 0 | } |
5842 | 0 | } |
5843 | 0 | } |
5844 | | |
5845 | | /* Host Metadata data structure, shared by the (Enhanced) Controller Metadata |
5846 | | * and Namespace Metadata features (7Dh/7Eh/7Fh). |
5847 | | * A 4 KiB structure: a 1-byte NMED count, a reserved byte, then a list of |
5848 | | * variable-length Metadata Element Descriptors (a 4-byte header carrying |
5849 | | * ET/ER/ELEN, followed by ELEN bytes of UTF-8 Element Value). */ |
5850 | | static void dissect_nvme_host_metadata(tvbuff_t *tvb, proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
5851 | 0 | { |
5852 | 0 | const range_string *et_rs = (cmd_ctx->cmd_ctx.set_features.fid == F_NS_METADATA) |
5853 | 0 | ? host_metadata_ns_et : host_metadata_ctrl_et; |
5854 | 0 | proto_tree *grp; |
5855 | 0 | proto_item *ti; |
5856 | 0 | unsigned pos; |
5857 | 0 | uint32_t nmed, i; |
5858 | |
|
5859 | 0 | ti = proto_tree_add_item(tree, hf_nvme_set_features_tr_hmd, tvb, 0, len, ENC_NA); |
5860 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
5861 | | |
5862 | | /* The NMED header is only present at the start of the structure. Over a |
5863 | | * windowed transfer (off > 0) the chunk begins mid-list and cannot be |
5864 | | * realigned, so show it raw rather than misparse. */ |
5865 | 0 | if (off != 0 || len < 2) { |
5866 | 0 | proto_tree_add_item(grp, hf_nvme_gen_data, tvb, 0, len, ENC_NA); |
5867 | 0 | return; |
5868 | 0 | } |
5869 | | |
5870 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_set_features_tr_hmd_nmed, tvb, 0, 1, ENC_LITTLE_ENDIAN, &nmed); |
5871 | 0 | proto_tree_add_item(grp, hf_nvme_set_features_tr_hmd_rsvd, tvb, 1, 1, ENC_NA); |
5872 | 0 | pos = 2; |
5873 | |
|
5874 | 0 | for (i = 0; i < nmed; i++) { |
5875 | 0 | proto_tree *med; |
5876 | 0 | proto_item *med_ti, *et_ti; |
5877 | 0 | uint32_t et, elen; |
5878 | | |
5879 | | /* Stop cleanly if the descriptor header or value runs past the |
5880 | | * available data (a DLEN-truncated or windowed chunk). */ |
5881 | 0 | if (pos + 4 > len) |
5882 | 0 | break; |
5883 | 0 | elen = tvb_get_uint16(tvb, pos + 2, ENC_LITTLE_ENDIAN); |
5884 | 0 | if (pos + 4 + elen > len) |
5885 | 0 | break; |
5886 | | |
5887 | 0 | med_ti = proto_tree_add_item(grp, hf_nvme_set_features_tr_hmd_med, tvb, pos, 4 + elen, ENC_NA); |
5888 | 0 | proto_item_set_text(med_ti, "Metadata Element Descriptor %u", i); |
5889 | 0 | med = proto_item_add_subtree(med_ti, ett_data); |
5890 | |
|
5891 | 0 | et_ti = proto_tree_add_item_ret_uint(med, hf_nvme_set_features_tr_hmd_med_et, tvb, pos, 4, ENC_LITTLE_ENDIAN, &et); |
5892 | 0 | proto_item_append_text(et_ti, " (%s)", rval_to_str_const(et, et_rs, "Unknown")); |
5893 | 0 | proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_er, tvb, pos, 4, ENC_LITTLE_ENDIAN); |
5894 | 0 | proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_elen, tvb, pos, 4, ENC_LITTLE_ENDIAN); |
5895 | 0 | if (elen) |
5896 | 0 | proto_tree_add_item(med, hf_nvme_set_features_tr_hmd_med_eval, tvb, pos + 4, elen, ENC_UTF_8); |
5897 | 0 | pos += 4 + elen; |
5898 | 0 | } |
5899 | 0 | } |
5900 | | |
5901 | | static void dissect_nvme_set_features_transfer(tvbuff_t *tvb, proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx, unsigned off, unsigned len) |
5902 | 0 | { |
5903 | 0 | switch(cmd_ctx->cmd_ctx.set_features.fid) { |
5904 | 0 | case F_LBA_RANGE_TYPE: |
5905 | 0 | dissect_nvme_set_features_transfer_lbart(tvb, tree, off, len); |
5906 | 0 | break; |
5907 | 0 | case F_AUTO_PS_TRANSITION: |
5908 | 0 | dissect_nvme_set_features_transfer_apst(tvb, tree, off, len); |
5909 | 0 | break; |
5910 | 0 | case F_TIMESTAMP: |
5911 | 0 | dissect_nvme_set_features_transfer_tst(tvb, tree, off, len); |
5912 | 0 | break; |
5913 | 0 | case F_PRED_LAT_MODE_CONF: |
5914 | 0 | dissect_nvme_set_features_transfer_plmc(tvb, tree, off, len); |
5915 | 0 | break; |
5916 | 0 | case F_HOST_BEHV_SUPPORT: |
5917 | 0 | dissect_nvme_set_features_transfer_hbs(tvb, tree, off, len); |
5918 | 0 | break; |
5919 | 0 | case F_ENH_CTRL_METADATA: |
5920 | 0 | case F_CTRL_METADATA: |
5921 | 0 | case F_NS_METADATA: |
5922 | 0 | dissect_nvme_host_metadata(tvb, tree, cmd_ctx, off, len); |
5923 | 0 | break; |
5924 | 0 | default: |
5925 | 0 | proto_tree_add_bytes_format_value(tree, hf_nvme_gen_data, tvb, 0, len, NULL, |
5926 | 0 | (cmd_ctx->opcode == NVME_AQ_OPC_SET_FEATURES) ? "Unhandled Set Features Transfer" : "Unhandled Get Features Transfer"); |
5927 | 0 | break; |
5928 | 0 | } |
5929 | 0 | } |
5930 | | |
5931 | | |
5932 | | void nvme_update_transfer_request(packet_info *pinfo, struct nvme_cmd_ctx *cmd, struct nvme_q_ctx *q_ctx) |
5933 | 0 | { |
5934 | 0 | if (cmd->fabric) { |
5935 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", |
5936 | 0 | rval_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command")); |
5937 | 0 | return; |
5938 | 0 | } |
5939 | 0 | if (!q_ctx->qid) { |
5940 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", get_aq_opcode_name(cmd->opcode)); |
5941 | 0 | if (cmd->opcode == NVME_AQ_OPC_IDENTIFY) |
5942 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd->cmd_ctx.cmd_identify.cns, cns_table, "Unknown")); |
5943 | 0 | else if (cmd->opcode == NVME_AQ_OPC_GET_LOG_PAGE) |
5944 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd->cmd_ctx.get_logpage.lid)); |
5945 | 0 | } else { |
5946 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data Request for %s", get_ioq_opcode_name(cmd->opcode)); |
5947 | 0 | } |
5948 | 0 | } |
5949 | | |
5950 | | static void dissect_nvme_security_data(tvbuff_t *tvb, packet_info *pinfo, |
5951 | | proto_tree *tree, |
5952 | | struct nvme_cmd_ctx *cmd_ctx, |
5953 | | unsigned off, unsigned len); |
5954 | | |
5955 | | bool |
5956 | | nvme_dissect_admin_data_resp(tvbuff_t *nvme_tvb, packet_info *pinfo, |
5957 | | proto_tree *cmd_tree, struct nvme_cmd_ctx *cmd_ctx, |
5958 | | unsigned off, unsigned len) |
5959 | 4 | { |
5960 | 4 | switch (cmd_ctx->opcode) { |
5961 | 0 | case NVME_AQ_OPC_IDENTIFY: |
5962 | 0 | dissect_nvme_identify_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len); |
5963 | 0 | return true; |
5964 | 0 | case NVME_AQ_OPC_GET_LOG_PAGE: |
5965 | 0 | dissect_nvme_get_logpage_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len); |
5966 | 0 | return true; |
5967 | 0 | case NVME_AQ_OPC_SET_FEATURES: |
5968 | 0 | case NVME_AQ_OPC_GET_FEATURES: |
5969 | 0 | dissect_nvme_set_features_transfer(nvme_tvb, cmd_tree, cmd_ctx, off, len); |
5970 | 0 | return true; |
5971 | 0 | case NVME_AQ_OPC_SECURITY_SEND: |
5972 | 0 | case NVME_AQ_OPC_SECURITY_RECV: |
5973 | 0 | dissect_nvme_security_data(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len); |
5974 | 0 | return true; |
5975 | 4 | default: |
5976 | 4 | return false; |
5977 | 4 | } |
5978 | 4 | } |
5979 | | |
5980 | | void |
5981 | | dissect_nvme_data_response(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, |
5982 | | struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx, unsigned len, bool is_inline) |
5983 | 4 | { |
5984 | 4 | proto_tree *cmd_tree; |
5985 | 4 | proto_item *ti; |
5986 | 4 | const char *str_opcode; |
5987 | 4 | uint32_t off; |
5988 | 4 | unsigned avail; |
5989 | 4 | bool over_declared; |
5990 | | |
5991 | | /* `len` is the transport's wire-declared response length: over NVMe/TCP it |
5992 | | * is the C2HData PDU's DATAL field, taken straight off the wire by |
5993 | | * dissect_nvme_tcp_data_pdu() (packet-nvme-tcp.c) with no check against the |
5994 | | * bytes the PDU actually carries, while nvme_tvb is only a |
5995 | | * tvb_new_subset_remaining(). Every decoder below bounds its fields on |
5996 | | * `len`, so a DATAL larger than the PDU walks off the end of the tvb and |
5997 | | * the resulting exception replaces the whole frame's dissection with |
5998 | | * [Malformed Packet]. Clamp once, here, rather than in each per-structure |
5999 | | * decoder. |
6000 | | * |
6001 | | * The clamp is to the *reported* length, not the captured length, so the |
6002 | | * two cases stay distinguishable: |
6003 | | * |
6004 | | * - a DATAL larger than the PDU is a lie about data that was never sent; |
6005 | | * clamping to the reported length keeps every decoder in bounds and no |
6006 | | * exception is raised. |
6007 | | * - a snaplen-sliced capture still has an honest DATAL, so `len` stays |
6008 | | * larger than what was captured, the decoders read into the missing |
6009 | | * bytes and throw BoundsError, and Wireshark reports |
6010 | | * [Packet size limited during capture] as it does for every other |
6011 | | * protocol. Clamping to tvb_captured_length() would silently hide |
6012 | | * that. |
6013 | | * |
6014 | | * NVMe-MI is unaffected either way (packet-nvme-mi-admin.c calls |
6015 | | * nvme_dissect_admin_data_resp() directly, sized from |
6016 | | * tvb_reported_length()) and NVMe/RDMA already passes |
6017 | | * tvb_reported_length(). */ |
6018 | 4 | avail = tvb_reported_length(nvme_tvb); |
6019 | 4 | over_declared = (len > avail); |
6020 | 4 | if (over_declared) |
6021 | 1 | len = avail; |
6022 | | |
6023 | 4 | off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd_ctx->tr_bytes; |
6024 | | |
6025 | 4 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe"); |
6026 | 4 | ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0, |
6027 | 4 | len, ENC_NA); |
6028 | 4 | cmd_tree = proto_item_add_subtree(ti, ett_data); |
6029 | | /* The transport asked for more bytes than the frame reports. This is not |
6030 | | * capture truncation -- tvb_reported_length() is the on-the-wire length, |
6031 | | * unaffected by the snaplen -- so the transport header and the frame |
6032 | | * genuinely disagree. */ |
6033 | 4 | if (over_declared) |
6034 | 1 | expert_add_info(pinfo, ti, &ei_nvme_data_len_exceeds_frame); |
6035 | 4 | if (q_ctx->qid) { //IOQ |
6036 | 0 | str_opcode = get_ioq_opcode_name(cmd_ctx->opcode); |
6037 | 4 | } else { //AQ |
6038 | 4 | str_opcode = get_aq_opcode_name(cmd_ctx->opcode); |
6039 | 4 | if (!nvme_dissect_admin_data_resp(nvme_tvb, pinfo, cmd_tree, cmd_ctx, off, len)) { |
6040 | 4 | proto_tree_add_bytes_format_value(cmd_tree, hf_nvme_gen_data, |
6041 | 4 | nvme_tvb, 0, len, NULL, |
6042 | 4 | "%s, offset %u", str_opcode, off); |
6043 | 4 | } |
6044 | 4 | } |
6045 | 4 | if (is_inline) |
6046 | 0 | return; |
6047 | 4 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF Data for %s", str_opcode); |
6048 | 4 | if (!q_ctx->qid) { |
6049 | 0 | if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY) |
6050 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s, offset %u", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown"), off); |
6051 | 0 | else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE) |
6052 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s, offset %u", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid), off); |
6053 | 4 | } else { |
6054 | 4 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, ", ", "offset %u", off); |
6055 | 4 | } |
6056 | 4 | } |
6057 | | |
6058 | | static void add_nvme_qid(char *result, uint32_t val) |
6059 | 0 | { |
6060 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%x (%s)", val, val ? "IOQ" : "AQ"); |
6061 | 0 | } |
6062 | | |
6063 | | static void add_zero_base(char *result, uint32_t val) |
6064 | 0 | { |
6065 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%u", val+1); |
6066 | 0 | } |
6067 | | |
6068 | | static |
6069 | | void dissect_nvmeof_fabric_connect_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb, |
6070 | | struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off) |
6071 | 0 | { |
6072 | 0 | uint32_t qid; |
6073 | |
|
6074 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd1, cmd_tvb, |
6075 | 0 | 5+off, 19, ENC_NA); |
6076 | 0 | dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_connect_sgl1, |
6077 | 0 | q_ctx, cmd, off, PINFO_FD_VISITED(pinfo)); |
6078 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_recfmt, cmd_tvb, |
6079 | 0 | 40+off, 2, ENC_LITTLE_ENDIAN); |
6080 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvmeof_cmd_connect_qid, cmd_tvb, |
6081 | 0 | 42+off, 2, ENC_LITTLE_ENDIAN, &qid); |
6082 | 0 | cmd->cmd_ctx.fabric_cmd.cnct.qid = qid; |
6083 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_sqsize, cmd_tvb, |
6084 | 0 | 44+off, 2, ENC_LITTLE_ENDIAN); |
6085 | |
|
6086 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 46+off, 1, ASPEC(hf_nvmeof_cmd_connect_cattr)); |
6087 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd2, cmd_tvb, |
6088 | 0 | 47+off, 1, ENC_NA); |
6089 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_kato, cmd_tvb, |
6090 | 0 | 48+off, 4, ENC_LITTLE_ENDIAN); |
6091 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_connect_rsvd3, cmd_tvb, |
6092 | 0 | 52+off, 12, ENC_NA); |
6093 | 0 | } |
6094 | | |
6095 | | static |
6096 | | void dissect_nvmeof_fabric_auth_cmd(proto_tree *cmd_tree, packet_info *pinfo, tvbuff_t *cmd_tvb, |
6097 | | struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off) |
6098 | 0 | { |
6099 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv1, cmd_tvb, |
6100 | 0 | 5+off, 19, ENC_NA); |
6101 | 0 | dissect_nvme_cmd_sgl(cmd_tvb, cmd_tree, hf_nvmeof_cmd_auth_sgl1, |
6102 | 0 | q_ctx, cmd, off, PINFO_FD_VISITED(pinfo)); |
6103 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv2, cmd_tvb, |
6104 | 0 | 40+off, 1, ENC_LITTLE_ENDIAN); |
6105 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp0, cmd_tvb, |
6106 | 0 | 41+off, 1, ENC_LITTLE_ENDIAN); |
6107 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_spsp1, cmd_tvb, |
6108 | 0 | 42+off, 1, ENC_LITTLE_ENDIAN); |
6109 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_secp, cmd_tvb, |
6110 | 0 | 43+off, 1, ENC_LITTLE_ENDIAN); |
6111 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_al, cmd_tvb, |
6112 | 0 | 44+off, 4, ENC_LITTLE_ENDIAN); |
6113 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_auth_rsdv3, cmd_tvb, |
6114 | 0 | 48+off, 16, ENC_NA); |
6115 | 0 | } |
6116 | | |
6117 | | static void dissect_nvme_fabric_disconnect_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off) |
6118 | 0 | { |
6119 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd0, cmd_tvb, |
6120 | 0 | 5+off, 35, ENC_NA); |
6121 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_recfmt, cmd_tvb, |
6122 | 0 | 40+off, 2, ENC_LITTLE_ENDIAN); |
6123 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_disconnect_rsvd1, cmd_tvb, |
6124 | 0 | 42+off, 22, ENC_NA); |
6125 | 0 | } |
6126 | | |
6127 | | static void dissect_nvme_fabric_prop_cmd_common(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off) |
6128 | 0 | { |
6129 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd0, cmd_tvb, |
6130 | 0 | 5+off, 35, ENC_NA); |
6131 | |
|
6132 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40+off, 1, ASPEC(hf_nvmeof_cmd_prop_get_set_attrib)); |
6133 | |
|
6134 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_rsvd1, cmd_tvb, |
6135 | 0 | 41+off, 3, ENC_NA); |
6136 | |
|
6137 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_set_offset, cmd_tvb, |
6138 | 0 | 44+off, 4, ENC_LITTLE_ENDIAN); |
6139 | 0 | } |
6140 | | |
6141 | | static void dissect_nvmeof_fabric_prop_get_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off) |
6142 | 0 | { |
6143 | 0 | cmd->cmd_ctx.fabric_cmd.prop_get.offset = tvb_get_uint8(cmd_tvb, 44+off); |
6144 | 0 | dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off); |
6145 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_get_rsvd2, cmd_tvb, |
6146 | 0 | 48+off, 16, ENC_NA); |
6147 | 0 | } |
6148 | | |
6149 | | static void add_500ms_units(char *result, uint32_t val) |
6150 | 0 | { |
6151 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%x (%u ms)", val, val * 500); |
6152 | 0 | } |
6153 | | |
6154 | | static void add_ccap_css(char *result, uint32_t val) |
6155 | 0 | { |
6156 | | /* Base 2.3 Figure 36, CAP.CSS (bits 44:37) is a bitmask, not an enum: |
6157 | | * bit 7 NOIOCSS, bit 6 IOCSS, bits 5:1 Reserved, bit 0 NCSS. */ |
6158 | 0 | char buf[64] = ""; |
6159 | 0 | bool have_bit = false; |
6160 | |
|
6161 | 0 | if (val & 0x80) { |
6162 | 0 | (void)g_strlcat(buf, "NOIOCSS", sizeof(buf)); |
6163 | 0 | have_bit = true; |
6164 | 0 | } |
6165 | 0 | if (val & 0x40) { |
6166 | 0 | if (have_bit) |
6167 | 0 | (void)g_strlcat(buf, ", ", sizeof(buf)); |
6168 | 0 | (void)g_strlcat(buf, "IOCSS", sizeof(buf)); |
6169 | 0 | have_bit = true; |
6170 | 0 | } |
6171 | 0 | if (val & 0x1) { |
6172 | 0 | if (have_bit) |
6173 | 0 | (void)g_strlcat(buf, ", ", sizeof(buf)); |
6174 | 0 | (void)g_strlcat(buf, "NCSS", sizeof(buf)); |
6175 | 0 | have_bit = true; |
6176 | 0 | } |
6177 | 0 | if (!have_bit) |
6178 | 0 | (void)g_strlcat(buf, "None", sizeof(buf)); |
6179 | |
|
6180 | 0 | snprintf(result, ITEM_LABEL_LENGTH, "%x (%s)", val, buf); |
6181 | 0 | } |
6182 | | |
6183 | | static void dissect_nvmeof_fabric_prop_data(proto_tree *tree, tvbuff_t *tvb, unsigned off, unsigned prop_off, uint8_t attr) |
6184 | 0 | { |
6185 | 0 | proto_item *ti, *grp; |
6186 | 0 | ti = proto_tree_add_item(tree, hf_nvmeof_prop_get_set_data, tvb, off, 8, ENC_NA); |
6187 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
6188 | 0 | switch(prop_off) { |
6189 | 0 | case 0x0: add_group_mask_entry(tvb, grp, off, 8, ASPEC(hf_nvmeof_prop_get_ccap)); attr=1; break; |
6190 | 0 | case 0x8: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_vs)); attr=0; break; |
6191 | 0 | case 0x14: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_cc)); attr=0; break; |
6192 | 0 | case 0x1c: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_csts)); attr=0; break; |
6193 | 0 | case 0x20: add_group_mask_entry(tvb, grp, off, 4, ASPEC(hf_nvmeof_prop_get_set_nssr)); attr=0; break; |
6194 | 0 | default: |
6195 | 0 | { |
6196 | 0 | if (attr == 0) |
6197 | 0 | proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B, tvb, |
6198 | 0 | off, 4, ENC_LITTLE_ENDIAN); |
6199 | 0 | else |
6200 | 0 | proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_8B, tvb, |
6201 | 0 | off, 8, ENC_LITTLE_ENDIAN); |
6202 | 0 | break; |
6203 | 0 | } |
6204 | 0 | } |
6205 | 0 | if (attr == 0) |
6206 | 0 | proto_tree_add_item(grp, hf_nvmeof_prop_get_set_data_4B_rsvd, tvb, |
6207 | 0 | off+4, 4, ENC_LITTLE_ENDIAN); |
6208 | 0 | } |
6209 | | static void dissect_nvmeof_fabric_prop_set_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, struct nvme_cmd_ctx *cmd, unsigned off) |
6210 | 0 | { |
6211 | 0 | uint8_t attr; |
6212 | 0 | uint32_t prop_off; |
6213 | |
|
6214 | 0 | dissect_nvme_fabric_prop_cmd_common(cmd_tree, cmd_tvb, off); |
6215 | 0 | attr = tvb_get_uint8(cmd_tvb, 40+off) & 0x7; |
6216 | 0 | prop_off = tvb_get_uint32(cmd_tvb, 44+off, ENC_LITTLE_ENDIAN); |
6217 | 0 | cmd->cmd_ctx.fabric_cmd.prop_get.offset = prop_off; |
6218 | 0 | dissect_nvmeof_fabric_prop_data(cmd_tree, cmd_tvb, 48+off, prop_off, attr); |
6219 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_prop_set_rsvd, cmd_tvb, |
6220 | 0 | 56+off, 8, ENC_NA); |
6221 | 0 | } |
6222 | | |
6223 | | static void dissect_nvmeof_fabric_generic_cmd(proto_tree *cmd_tree, tvbuff_t *cmd_tvb, unsigned off) |
6224 | 0 | { |
6225 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_rsvd1, cmd_tvb, |
6226 | 0 | 5+off, 35, ENC_NA); |
6227 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_generic_field, cmd_tvb, |
6228 | 0 | 40+off, 24, ENC_NA); |
6229 | 0 | } |
6230 | | |
6231 | | void dissect_nvmeof_fabric_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *nvme_tree, |
6232 | | struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned off, bool link_data_req) |
6233 | 0 | { |
6234 | 0 | proto_tree *cmd_tree; |
6235 | 0 | proto_item *ti; |
6236 | 0 | uint8_t fctype; |
6237 | 0 | uint32_t prop_off; |
6238 | |
|
6239 | 0 | fctype = tvb_get_uint8(nvme_tvb, 4+off); |
6240 | 0 | cmd->cmd_ctx.fabric_cmd.fctype = fctype; |
6241 | |
|
6242 | 0 | ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cmd, nvme_tvb, off, |
6243 | 0 | NVME_CMD_SIZE, ENC_NA); |
6244 | 0 | cmd_tree = proto_item_add_subtree(ti, ett_data); |
6245 | |
|
6246 | 0 | proto_tree_add_bytes_format(cmd_tree, hf_nvmeof_cmd_opc, nvme_tvb, off, 1, NULL, "Opcode: 0x%x (Fabric Command)", |
6247 | 0 | NVME_FABRIC_OPC); |
6248 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF %s", rval_to_str_const(fctype, fctype_tbl, "Unknown Command")); |
6249 | 0 | prop_off = tvb_get_uint32(nvme_tvb, 44+off, ENC_LITTLE_ENDIAN); |
6250 | |
|
6251 | 0 | cmd->opcode = NVME_FABRIC_OPC; |
6252 | 0 | if (link_data_req) |
6253 | 0 | nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvmeof_data_req, cmd); |
6254 | 0 | nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvmeof_data_tr, cmd); |
6255 | 0 | nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvmeof_cqe_pkt, cmd); |
6256 | |
|
6257 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_rsvd, nvme_tvb, |
6258 | 0 | 1+off, 1, ENC_NA); |
6259 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_cid, nvme_tvb, |
6260 | 0 | 2+off, 2, ENC_LITTLE_ENDIAN); |
6261 | |
|
6262 | 0 | proto_tree_add_item(cmd_tree, hf_nvmeof_cmd_fctype, nvme_tvb, |
6263 | 0 | 4+off, 1, ENC_LITTLE_ENDIAN); |
6264 | 0 | switch(fctype) { |
6265 | 0 | case NVME_FCTYPE_CONNECT: |
6266 | 0 | dissect_nvmeof_fabric_connect_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off); |
6267 | 0 | break; |
6268 | 0 | case NVME_FCTYPE_PROP_GET: |
6269 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property")); |
6270 | 0 | dissect_nvmeof_fabric_prop_get_cmd(cmd_tree, nvme_tvb, cmd, off); |
6271 | 0 | break; |
6272 | 0 | case NVME_FCTYPE_PROP_SET: |
6273 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(prop_off, prop_offset_tbl, "Unknown Property")); |
6274 | 0 | dissect_nvmeof_fabric_prop_set_cmd(cmd_tree, nvme_tvb, cmd, off); |
6275 | 0 | break; |
6276 | 0 | case NVME_FCTYPE_DISCONNECT: |
6277 | 0 | dissect_nvme_fabric_disconnect_cmd(cmd_tree, nvme_tvb, off); |
6278 | 0 | break; |
6279 | 0 | case NVME_FCTYPE_AUTH_RECV: |
6280 | 0 | case NVME_FCTYPE_AUTH_SEND: |
6281 | 0 | dissect_nvmeof_fabric_auth_cmd(cmd_tree, pinfo, nvme_tvb, q_ctx, cmd, off); |
6282 | 0 | break; |
6283 | 0 | default: |
6284 | 0 | dissect_nvmeof_fabric_generic_cmd(cmd_tree, nvme_tvb, off); |
6285 | 0 | break; |
6286 | 0 | } |
6287 | 0 | } |
6288 | | |
6289 | | static void |
6290 | | dissect_nvmeof_fabric_connect_cmd_data(tvbuff_t *data_tvb, proto_tree *data_tree, |
6291 | | unsigned pkt_off, unsigned off, unsigned len) |
6292 | 0 | { |
6293 | 0 | if (!off) { |
6294 | 0 | CHECK_STOP_PARSE(0, 16); |
6295 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostid, data_tvb, |
6296 | 0 | pkt_off, 16, ENC_NA); |
6297 | 0 | } |
6298 | 0 | if (off <= 16) { |
6299 | 0 | CHECK_STOP_PARSE(16, 2); |
6300 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_cntlid, data_tvb, |
6301 | 0 | pkt_off + 16 - off, 2, ENC_LITTLE_ENDIAN); |
6302 | 0 | } |
6303 | 0 | if (off <= 18) { |
6304 | 0 | CHECK_STOP_PARSE(18, 238); |
6305 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd0, data_tvb, |
6306 | 0 | pkt_off + 18 - off, 238, ENC_NA); |
6307 | 0 | } |
6308 | 0 | if (off <= 256) { |
6309 | 0 | CHECK_STOP_PARSE(256, 256); |
6310 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_subnqn, data_tvb, |
6311 | 0 | pkt_off + 256 - off, 256, ENC_ASCII); |
6312 | 0 | } |
6313 | 0 | if (off <= 512) { |
6314 | 0 | CHECK_STOP_PARSE(512, 256); |
6315 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_hostnqn, data_tvb, |
6316 | 0 | pkt_off + 512 - off, 256, ENC_ASCII); |
6317 | 0 | } |
6318 | 0 | if (off <= 768) { |
6319 | 0 | CHECK_STOP_PARSE(768, 256); |
6320 | 0 | proto_tree_add_item(data_tree, hf_nvmeof_cmd_connect_data_rsvd1, data_tvb, |
6321 | 0 | pkt_off + 768 - off, 256, ENC_NA); |
6322 | 0 | } |
6323 | 0 | } |
6324 | | |
6325 | | void |
6326 | | dissect_nvmeof_cmd_data(tvbuff_t *data_tvb, packet_info *pinfo, proto_tree *data_tree, |
6327 | | unsigned pkt_off, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd, unsigned len) |
6328 | 0 | { |
6329 | 0 | uint32_t tr_off = (PINFO_FD_VISITED(pinfo)) ? nvme_lookup_data_tr_off(q_ctx, pinfo->num) : cmd->tr_bytes; |
6330 | |
|
6331 | 0 | if (!pkt_off) { |
6332 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeoF Data for %s, offset %u", |
6333 | 0 | rval_to_str_const(cmd->cmd_ctx.fabric_cmd.fctype, fctype_tbl, "Unknown Command"), tr_off); |
6334 | 0 | } |
6335 | 0 | if (cmd->cmd_ctx.fabric_cmd.fctype == NVME_FCTYPE_CONNECT && len >= 768) |
6336 | 0 | dissect_nvmeof_fabric_connect_cmd_data(data_tvb, data_tree, pkt_off, tr_off, len); |
6337 | 0 | } |
6338 | | |
6339 | | static void |
6340 | | dissect_nvmeof_status_prop_get(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, struct nvme_cmd_ctx *cmd, unsigned off) |
6341 | 0 | { |
6342 | 0 | dissect_nvmeof_fabric_prop_data(cqe_tree, cqe_tvb, off, cmd->cmd_ctx.fabric_cmd.prop_get.offset, 1); |
6343 | 0 | } |
6344 | | |
6345 | | static void |
6346 | | dissect_nvmeof_cqe_status_8B(proto_tree *cqe_tree, tvbuff_t *cqe_tvb, |
6347 | | struct nvme_cmd_ctx *cmd, unsigned off) |
6348 | 0 | { |
6349 | 0 | switch (cmd->cmd_ctx.fabric_cmd.fctype) { |
6350 | 0 | case NVME_FCTYPE_CONNECT: |
6351 | 0 | proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_cntlid, cqe_tvb, |
6352 | 0 | 0+off, 2, ENC_LITTLE_ENDIAN); |
6353 | 0 | proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_authreq, cqe_tvb, |
6354 | 0 | 2+off, 2, ENC_LITTLE_ENDIAN); |
6355 | 0 | proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_connect_rsvd, cqe_tvb, |
6356 | 0 | 4+off, 4, ENC_NA); |
6357 | 0 | break; |
6358 | 0 | case NVME_FCTYPE_PROP_GET: |
6359 | 0 | dissect_nvmeof_status_prop_get(cqe_tree, cqe_tvb, cmd, off); |
6360 | 0 | break; |
6361 | 0 | case NVME_FCTYPE_PROP_SET: |
6362 | 0 | proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_prop_set_rsvd, cqe_tvb, |
6363 | 0 | 0+off, 8, ENC_NA); |
6364 | 0 | break; |
6365 | 0 | default: |
6366 | 0 | proto_tree_add_item(cqe_tree, hf_nvmeof_cqe_sts, cqe_tvb, |
6367 | 0 | 0+off, 8, ENC_LITTLE_ENDIAN); |
6368 | 0 | break; |
6369 | 0 | }; |
6370 | 0 | } |
6371 | | |
6372 | | |
6373 | | const char *get_nvmeof_cmd_string(uint8_t fctype) |
6374 | 0 | { |
6375 | 0 | return rval_to_str_const(fctype, fctype_tbl, "Unknown Fabric Command"); |
6376 | 0 | } |
6377 | | |
6378 | | static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned off, bool nvmeof); |
6379 | | |
6380 | | void |
6381 | | dissect_nvmeof_fabric_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, |
6382 | | proto_tree *nvme_tree, |
6383 | | struct nvme_cmd_ctx *cmd, unsigned off) |
6384 | 0 | { |
6385 | 0 | proto_tree *cqe_tree; |
6386 | 0 | proto_item *ti; |
6387 | 0 | uint8_t fctype = cmd->cmd_ctx.fabric_cmd.fctype; |
6388 | |
|
6389 | 0 | ti = proto_tree_add_item(nvme_tree, hf_nvmeof_cqe, nvme_tvb, |
6390 | 0 | 0+off, NVME_CQE_SIZE, ENC_NA); |
6391 | |
|
6392 | 0 | if (fctype != NVME_FCTYPE_PROP_GET && fctype != NVME_FCTYPE_PROP_SET) |
6393 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for %s", rval_to_str_const(fctype, fctype_tbl, "Unknown Command")); |
6394 | 0 | else |
6395 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMeOF CQE for Property %s %s", |
6396 | 0 | (fctype == NVME_FCTYPE_PROP_GET) ? "Get" : "Set", |
6397 | 0 | val_to_str_const(cmd->cmd_ctx.fabric_cmd.prop_get.offset, prop_offset_tbl, "Unknown Property")); |
6398 | |
|
6399 | 0 | proto_item_append_text(ti, " (For Cmd: %s)", rval_to_str_const(fctype, fctype_tbl, "Unknown Cmd")); |
6400 | |
|
6401 | 0 | cqe_tree = proto_item_add_subtree(ti, ett_data); |
6402 | |
|
6403 | 0 | nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvmeof_cmd_pkt, |
6404 | 0 | cmd); |
6405 | 0 | nvme_publish_cmd_latency(cqe_tree, cmd, hf_nvmeof_cmd_latency); |
6406 | |
|
6407 | 0 | dissect_nvmeof_cqe_status_8B(cqe_tree, nvme_tvb, cmd, off); |
6408 | |
|
6409 | 0 | dissect_nvme_cqe_common(nvme_tvb, pinfo, cqe_tree, off, true); |
6410 | 0 | } |
6411 | | |
6412 | | static void dissect_nvme_unhandled_cmd(tvbuff_t *nvme_tvb, proto_tree *cmd_tree) |
6413 | 6 | { |
6414 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword10, nvme_tvb, 40, 4, ENC_LITTLE_ENDIAN); |
6415 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, nvme_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6416 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, nvme_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6417 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, nvme_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6418 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, nvme_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6419 | 6 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, nvme_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6420 | 6 | } |
6421 | | |
6422 | | /* Format NVM – Secure Erase Settings (SES). */ |
6423 | | static const value_string fmt_nvm_ses_tbl[] = { |
6424 | | { 0x0, "No secure erase operation requested" }, |
6425 | | { 0x1, "User Data Erase" }, |
6426 | | { 0x2, "Cryptographic Erase" }, |
6427 | | { 0, NULL } |
6428 | | }; |
6429 | | |
6430 | | static void dissect_nvme_format_nvm_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6431 | 0 | { |
6432 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_format_nvm_dword10)); |
6433 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6434 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6435 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6436 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6437 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6438 | 0 | } |
6439 | | |
6440 | | /* Firmware Commit – Commit Action (CA). */ |
6441 | | static const value_string fw_commit_ca_tbl[] = { |
6442 | | { 0x0, "Replace image in slot, do not activate" }, |
6443 | | { 0x1, "Replace image in slot, activate at next reset" }, |
6444 | | { 0x2, "Activate existing image in slot at next reset" }, |
6445 | | { 0x3, "Replace image in slot and activate immediately" }, |
6446 | | { 0x6, "Replace Boot Partition specified by BPID" }, |
6447 | | { 0x7, "Mark Boot Partition in BPID active, update BPINFO.ABPID" }, |
6448 | | { 0, NULL } |
6449 | | }; |
6450 | | |
6451 | | static void dissect_nvme_fw_commit_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6452 | 0 | { |
6453 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_fw_commit_dword10)); |
6454 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6455 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6456 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6457 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6458 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6459 | 0 | } |
6460 | | |
6461 | | static void dissect_nvme_fw_download_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6462 | 0 | { |
6463 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_fw_download_numd, cmd_tvb, 40, 4, ENC_LITTLE_ENDIAN); |
6464 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_fw_download_ofst, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6465 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6466 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6467 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6468 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6469 | 0 | } |
6470 | | |
6471 | | /* Device Self-test – Self-test Code (STC). */ |
6472 | | static const value_string self_test_stc_tbl[] = { |
6473 | | { 0x1, "Short device self-test" }, |
6474 | | { 0x2, "Extended device self-test" }, |
6475 | | { 0x3, "Host-Initiated Refresh" }, |
6476 | | { 0xe, "Vendor specific" }, |
6477 | | { 0xf, "Abort device self-test" }, |
6478 | | { 0, NULL } |
6479 | | }; |
6480 | | |
6481 | | static void dissect_nvme_self_test_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6482 | 0 | { |
6483 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_self_test_dword10)); |
6484 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6485 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6486 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6487 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6488 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6489 | 0 | } |
6490 | | |
6491 | | /* Lockdown – Scope (SCP) / Interface (IFC). */ |
6492 | | static const value_string lockdown_scp_tbl[] = { |
6493 | | { 0x0, "Admin command opcode" }, |
6494 | | { 0x2, "Set Features Feature Identifier" }, |
6495 | | { 0x3, "Management Interface Command Set opcode" }, |
6496 | | { 0x4, "PCIe Command Set opcode" }, |
6497 | | { 0, NULL } |
6498 | | }; |
6499 | | |
6500 | | static const value_string lockdown_ifc_tbl[] = { |
6501 | | { 0x0, "Admin Submission Queue" }, |
6502 | | { 0x1, "Admin Submission Queue and out-of-band Management Endpoint" }, |
6503 | | { 0x2, "Out-of-band Management Endpoint" }, |
6504 | | { 0, NULL } |
6505 | | }; |
6506 | | |
6507 | | static void dissect_nvme_lockdown_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6508 | 0 | { |
6509 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_lockdown_dword10)); |
6510 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword11, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6511 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6512 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6513 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 56, 4, ASPEC(hf_nvme_lockdown_dword14)); |
6514 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6515 | 0 | } |
6516 | | |
6517 | | /* Sanitize – Sanitize Action (SANACT). */ |
6518 | | static const value_string sanitize_act_tbl[] = { |
6519 | | { 0x1, "Exit Failure Mode" }, |
6520 | | { 0x2, "Block Erase" }, |
6521 | | { 0x3, "Overwrite" }, |
6522 | | { 0x4, "Crypto Erase" }, |
6523 | | { 0x5, "Exit Media Verification State" }, |
6524 | | { 0, NULL } |
6525 | | }; |
6526 | | |
6527 | | static void dissect_nvme_sanitize_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree) |
6528 | 0 | { |
6529 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, 40, 4, ASPEC(hf_nvme_sanitize_dword10)); |
6530 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_sanitize_ovrpat, cmd_tvb, 44, 4, ENC_LITTLE_ENDIAN); |
6531 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6532 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6533 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6534 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6535 | 0 | } |
6536 | | |
6537 | | /* Security Protocol (SECP), Security Send/Receive Command Dword 10. Values |
6538 | | * are assigned by SPC-5; the commonly used identifiers are named here. */ |
6539 | | static const range_string security_secp_tbl[] = { |
6540 | | { 0x00, 0x00, "Security Protocol Information" }, |
6541 | | { 0x01, 0x01, "TCG Storage - SP 1" }, |
6542 | | { 0x02, 0x02, "TCG Storage - SP 2" }, |
6543 | | { 0x03, 0x03, "TCG Storage - SP 3" }, |
6544 | | { 0x04, 0x04, "TCG Storage - SP 4" }, |
6545 | | { 0x05, 0x05, "TCG Storage - SP 5" }, |
6546 | | { 0x06, 0x06, "TCG Storage - SP 6" }, |
6547 | | { 0xE9, 0xE9, "NVMe over Fabrics Authentication" }, |
6548 | | { 0xEA, 0xEA, "NVMe (RPMB / CDP Authentication)" }, |
6549 | | { 0xEE, 0xEE, "IEEE 1667" }, |
6550 | | { 0xF0, 0xFF, "Vendor Specific" }, |
6551 | | { 0, 0, NULL } |
6552 | | }; |
6553 | | |
6554 | | /* Security Send Command Dword 10 and Security Receive Command Dword 10 |
6555 | | * share an identical layout: SECP/SPSP1/SPSP0/NSSF. |
6556 | | * The SECP and SPSP selectors are saved in cmd_ctx so the data payload |
6557 | | * (request data for Send, response data for Receive) can be dispatched to |
6558 | | * the matching security-protocol dissector. */ |
6559 | | static void dissect_nvme_security_dword10(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
6560 | | struct nvme_cmd_ctx *cmd_ctx) |
6561 | 0 | { |
6562 | 0 | const unsigned dw10_off = 40; |
6563 | 0 | uint32_t dw10 = tvb_get_uint32(cmd_tvb, dw10_off, ENC_LITTLE_ENDIAN); |
6564 | |
|
6565 | 0 | add_group_mask_entry(cmd_tvb, cmd_tree, dw10_off, 4, ASPEC(hf_nvme_security_dword10)); |
6566 | 0 | cmd_ctx->cmd_ctx.security.secp = (uint8_t)(dw10 >> 24); |
6567 | | /* SPSP1 (bits 23:16) is the high byte of the SP Specific value, SPSP0 |
6568 | | * (bits 15:08) the low byte, so bits 23:8 read as one field. */ |
6569 | 0 | cmd_ctx->cmd_ctx.security.spsp = (uint16_t)((dw10 >> 8) & 0xffff); |
6570 | 0 | } |
6571 | | |
6572 | | static void dissect_nvme_security_send_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
6573 | | struct nvme_cmd_ctx *cmd_ctx) |
6574 | 0 | { |
6575 | 0 | dissect_nvme_security_dword10(cmd_tvb, cmd_tree, cmd_ctx); |
6576 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_security_send_dword11_tl, cmd_tvb, 44, 4, |
6577 | 0 | ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.security.xfer_len); |
6578 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6579 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6580 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6581 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6582 | 0 | } |
6583 | | |
6584 | | static void dissect_nvme_security_recv_cmd(tvbuff_t *cmd_tvb, proto_tree *cmd_tree, |
6585 | | struct nvme_cmd_ctx *cmd_ctx) |
6586 | 0 | { |
6587 | 0 | dissect_nvme_security_dword10(cmd_tvb, cmd_tree, cmd_ctx); |
6588 | 0 | proto_tree_add_item_ret_uint(cmd_tree, hf_nvme_security_recv_dword11_al, cmd_tvb, 44, 4, |
6589 | 0 | ENC_LITTLE_ENDIAN, &cmd_ctx->cmd_ctx.security.xfer_len); |
6590 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword12, cmd_tvb, 48, 4, ENC_LITTLE_ENDIAN); |
6591 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword13, cmd_tvb, 52, 4, ENC_LITTLE_ENDIAN); |
6592 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword14, cmd_tvb, 56, 4, ENC_LITTLE_ENDIAN); |
6593 | 0 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_dword15, cmd_tvb, 60, 4, ENC_LITTLE_ENDIAN); |
6594 | 0 | } |
6595 | | |
6596 | | /* Security Protocol Information (SECP 00h), SPC-5 7.7.1: discovery data |
6597 | | * returned by Security Receive only, all fields big-endian. SPSP 0000h |
6598 | | * returns the Supported Security Protocols List (6 reserved bytes, a 2-byte |
6599 | | * list length, then 1-byte protocol identifiers); SPSP 0001h returns |
6600 | | * Certificate Data (2 reserved bytes, a 2-byte length, then the certificate |
6601 | | * bytes, not parsed further). Lengths are clamped to the payload. Returns |
6602 | | * false for other SPSP values or truncated headers so the caller can fall |
6603 | | * back to the raw blob. */ |
6604 | | static bool dissect_nvme_security_info_resp(tvbuff_t *tvb, proto_tree *tree, |
6605 | | uint16_t spsp, unsigned len) |
6606 | 0 | { |
6607 | 0 | proto_item *ti; |
6608 | 0 | proto_tree *grp; |
6609 | 0 | uint32_t plen; |
6610 | 0 | unsigned i; |
6611 | |
|
6612 | 0 | if (spsp == 0x0000) { |
6613 | 0 | if (len < 8) |
6614 | 0 | return false; |
6615 | 0 | ti = proto_tree_add_item(tree, hf_nvme_security_info, tvb, 0, len, ENC_NA); |
6616 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
6617 | 0 | proto_tree_add_item(grp, hf_nvme_security_info_rsvd, tvb, 0, 6, ENC_NA); |
6618 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_security_info_list_len, |
6619 | 0 | tvb, 6, 2, ENC_BIG_ENDIAN, &plen); |
6620 | 0 | if (plen > len - 8) |
6621 | 0 | plen = len - 8; |
6622 | 0 | for (i = 0; i < plen; i++) |
6623 | 0 | proto_tree_add_item(grp, hf_nvme_security_info_protocol, tvb, 8 + i, 1, ENC_BIG_ENDIAN); |
6624 | 0 | return true; |
6625 | 0 | } |
6626 | 0 | if (spsp == 0x0001) { |
6627 | 0 | if (len < 4) |
6628 | 0 | return false; |
6629 | 0 | ti = proto_tree_add_item(tree, hf_nvme_security_info, tvb, 0, len, ENC_NA); |
6630 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
6631 | 0 | proto_tree_add_item(grp, hf_nvme_security_info_rsvd, tvb, 0, 2, ENC_NA); |
6632 | 0 | proto_tree_add_item_ret_uint(grp, hf_nvme_security_info_cert_len, |
6633 | 0 | tvb, 2, 2, ENC_BIG_ENDIAN, &plen); |
6634 | 0 | if (plen > len - 4) |
6635 | 0 | plen = len - 4; |
6636 | 0 | if (plen) |
6637 | 0 | proto_tree_add_item(grp, hf_nvme_security_info_cert_data, tvb, 4, plen, ENC_NA); |
6638 | 0 | return true; |
6639 | 0 | } |
6640 | 0 | return false; |
6641 | 0 | } |
6642 | | |
6643 | | /* The Security Send request data and Security Receive response data are |
6644 | | * Security Protocol specific (SPC-5), opaque at the NVMe layer. SECP 00h |
6645 | | * (Security Protocol Information) response data is decoded here; other |
6646 | | * protocols dispatch to a registered security-protocol dissector (e.g. TCG |
6647 | | * Storage for SECP 01h/02h) via the "nvme.security.secp" table. Payloads |
6648 | | * for protocols without a registered dissector, empty payloads, and windows |
6649 | | * that do not hold the complete protocol structure fall back to a labeled |
6650 | | * byte blob. A window is only handed on when it starts at offset 0 (a later |
6651 | | * window cannot be re-aligned to the start of the structure) and is not known |
6652 | | * to be short: Security Send Dword 11 (Transfer Length) is the exact payload |
6653 | | * size, so a first window smaller than it is a partial transfer and would |
6654 | | * make the protocol dissector flag the frame as malformed. Security Receive |
6655 | | * Dword 11 (Allocation Length) is only an upper bound - the controller may |
6656 | | * return less - so a short window there is indistinguishable from a complete |
6657 | | * short response and is still dispatched, as is any payload whose request |
6658 | | * (and hence Dword 11) was not captured. */ |
6659 | | static void dissect_nvme_security_data(tvbuff_t *tvb, packet_info *pinfo, |
6660 | | proto_tree *tree, |
6661 | | struct nvme_cmd_ctx *cmd_ctx, |
6662 | | unsigned off, unsigned len) |
6663 | 0 | { |
6664 | 0 | bool is_send = (cmd_ctx->opcode == NVME_AQ_OPC_SECURITY_SEND); |
6665 | 0 | uint32_t xfer_len = cmd_ctx->cmd_ctx.security.xfer_len; |
6666 | 0 | bool partial = is_send && xfer_len != 0 && len < xfer_len; |
6667 | |
|
6668 | 0 | if (off == 0 && len > 0 && !partial) { |
6669 | 0 | struct nvme_security_info sec = { |
6670 | 0 | .send = is_send, |
6671 | 0 | .secp = cmd_ctx->cmd_ctx.security.secp, |
6672 | 0 | .spsp = cmd_ctx->cmd_ctx.security.spsp, |
6673 | 0 | }; |
6674 | 0 | tvbuff_t *sec_tvb = tvb_new_subset_length(tvb, 0, len); |
6675 | |
|
6676 | 0 | if (sec.secp == 0x00 && !sec.send && |
6677 | 0 | dissect_nvme_security_info_resp(sec_tvb, tree, sec.spsp, len)) |
6678 | 0 | return; |
6679 | | |
6680 | 0 | if (dissector_try_uint_with_data(nvme_security_secp_table, sec.secp, |
6681 | 0 | sec_tvb, pinfo, tree, false, &sec)) |
6682 | 0 | return; |
6683 | 0 | } |
6684 | 0 | proto_tree_add_bytes_format_value(tree, hf_nvme_security_data, tvb, 0, len, NULL, |
6685 | 0 | "NVMe Security Protocol Data (offset %u, %u bytes)", off, len); |
6686 | 0 | } |
6687 | | |
6688 | | void |
6689 | | nvme_dissect_admin_sqe_cdws(tvbuff_t *sqe_tvb, packet_info *pinfo, |
6690 | | proto_tree *tree, struct nvme_cmd_ctx *cmd_ctx) |
6691 | 6 | { |
6692 | 6 | switch (cmd_ctx->opcode) { |
6693 | 0 | case NVME_AQ_OPC_IDENTIFY: |
6694 | | /* CNS is one byte (CDW10 07:00); byte 41 is reserved */ |
6695 | 0 | cmd_ctx->cmd_ctx.cmd_identify.cns = tvb_get_uint8(sqe_tvb, 40); |
6696 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown")); |
6697 | 0 | dissect_nvme_identify_cmd(sqe_tvb, tree); |
6698 | 0 | break; |
6699 | 0 | case NVME_AQ_OPC_GET_LOG_PAGE: |
6700 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(tvb_get_uint8(sqe_tvb, 40))); |
6701 | 0 | dissect_nvme_get_logpage_cmd(sqe_tvb, tree, cmd_ctx); |
6702 | 0 | break; |
6703 | 0 | case NVME_AQ_OPC_SET_FEATURES: |
6704 | 0 | dissect_nvme_set_features_cmd(sqe_tvb, tree, cmd_ctx); |
6705 | 0 | break; |
6706 | 0 | case NVME_AQ_OPC_GET_FEATURES: |
6707 | 0 | dissect_nvme_get_features_cmd(sqe_tvb, tree, cmd_ctx); |
6708 | 0 | break; |
6709 | 0 | case NVME_AQ_OPC_FW_COMMIT: |
6710 | 0 | dissect_nvme_fw_commit_cmd(sqe_tvb, tree); |
6711 | 0 | break; |
6712 | 0 | case NVME_AQ_OPC_FW_IMG_DOWNLOAD: |
6713 | 0 | dissect_nvme_fw_download_cmd(sqe_tvb, tree); |
6714 | 0 | break; |
6715 | 0 | case NVME_AQ_OPC_SELF_TEST: |
6716 | 0 | dissect_nvme_self_test_cmd(sqe_tvb, tree); |
6717 | 0 | break; |
6718 | 0 | case NVME_AQ_OPC_LOCKDOWN: |
6719 | 0 | dissect_nvme_lockdown_cmd(sqe_tvb, tree); |
6720 | 0 | break; |
6721 | 0 | case NVME_AQ_OPC_FORMAT_NVM: |
6722 | 0 | dissect_nvme_format_nvm_cmd(sqe_tvb, tree); |
6723 | 0 | break; |
6724 | 0 | case NVME_AQ_OPC_SANITIZE: |
6725 | 0 | dissect_nvme_sanitize_cmd(sqe_tvb, tree); |
6726 | 0 | break; |
6727 | 0 | case NVME_AQ_OPC_SECURITY_SEND: |
6728 | 0 | dissect_nvme_security_send_cmd(sqe_tvb, tree, cmd_ctx); |
6729 | 0 | break; |
6730 | 0 | case NVME_AQ_OPC_SECURITY_RECV: |
6731 | 0 | dissect_nvme_security_recv_cmd(sqe_tvb, tree, cmd_ctx); |
6732 | 0 | break; |
6733 | 6 | default: |
6734 | 6 | dissect_nvme_unhandled_cmd(sqe_tvb, tree); |
6735 | 6 | break; |
6736 | 6 | } |
6737 | 6 | } |
6738 | | |
6739 | | void |
6740 | | dissect_nvme_cmd(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, |
6741 | | struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx) |
6742 | 7 | { |
6743 | 7 | proto_tree *cmd_tree; |
6744 | 7 | proto_item *ti, *opc_item; |
6745 | | |
6746 | 7 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe"); |
6747 | 7 | ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0, |
6748 | 7 | NVME_CMD_SIZE, ENC_NA); |
6749 | 7 | proto_item_append_text(ti, " (Cmd)"); |
6750 | 7 | cmd_tree = proto_item_add_subtree(ti, ett_data); |
6751 | | |
6752 | 7 | cmd_ctx->opcode = tvb_get_uint8(nvme_tvb, 0); |
6753 | 7 | opc_item = proto_tree_add_item(cmd_tree, hf_nvme_cmd_opc, nvme_tvb, |
6754 | 7 | 0, 1, ENC_LITTLE_ENDIAN); |
6755 | 7 | if (q_ctx->qid) { |
6756 | 0 | proto_item_append_text(opc_item, " %s", get_ioq_opcode_name(cmd_ctx->opcode)); |
6757 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", get_ioq_opcode_name(cmd_ctx->opcode)); |
6758 | 7 | } else { |
6759 | 7 | proto_item_append_text(opc_item, " %s", get_aq_opcode_name(cmd_ctx->opcode)); |
6760 | 7 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe %s", get_aq_opcode_name(cmd_ctx->opcode)); |
6761 | 7 | } |
6762 | | |
6763 | 7 | nvme_publish_to_data_req_link(cmd_tree, nvme_tvb, hf_nvme_data_req, cmd_ctx); |
6764 | 7 | nvme_publish_to_data_tr_links(cmd_tree, nvme_tvb, hf_nvme_data_tr, cmd_ctx); |
6765 | 7 | nvme_publish_to_cqe_link(cmd_tree, nvme_tvb, hf_nvme_cqe_pkt, cmd_ctx); |
6766 | | |
6767 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_fuse_op, nvme_tvb, |
6768 | 7 | 1, 1, ENC_NA); |
6769 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd, nvme_tvb, |
6770 | 7 | 1, 1, ENC_NA); |
6771 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_psdt, nvme_tvb, |
6772 | 7 | 1, 1, ENC_NA); |
6773 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_cid, nvme_tvb, |
6774 | 7 | 2, 2, ENC_LITTLE_ENDIAN); |
6775 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_nsid, nvme_tvb, |
6776 | 7 | 4, 4, ENC_LITTLE_ENDIAN); |
6777 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_rsvd1, nvme_tvb, |
6778 | 7 | 8, 8, ENC_NA); |
6779 | 7 | proto_tree_add_item(cmd_tree, hf_nvme_cmd_mptr, nvme_tvb, |
6780 | 7 | 16, 8, ENC_LITTLE_ENDIAN); |
6781 | | |
6782 | 7 | dissect_nvme_cmd_sgl(nvme_tvb, cmd_tree, hf_nvme_cmd_sgl, q_ctx, cmd_ctx, 0, PINFO_FD_VISITED(pinfo)); |
6783 | | |
6784 | 7 | if (q_ctx->qid) { //IOQ |
6785 | 0 | switch (cmd_ctx->opcode) { |
6786 | 0 | case NVME_IOQ_OPC_READ: |
6787 | 0 | case NVME_IOQ_OPC_WRITE: |
6788 | 0 | dissect_nvme_rw_cmd(nvme_tvb, cmd_tree); |
6789 | 0 | break; |
6790 | 0 | default: |
6791 | 0 | dissect_nvme_unhandled_cmd(nvme_tvb, cmd_tree); |
6792 | 0 | break; |
6793 | 0 | } |
6794 | 7 | } else { //AQ |
6795 | 7 | nvme_dissect_admin_sqe_cdws(nvme_tvb, pinfo, cmd_tree, cmd_ctx); |
6796 | 7 | } |
6797 | 7 | } |
6798 | | |
6799 | | const char *nvme_get_opcode_string(uint8_t opcode, uint16_t qid) |
6800 | 7 | { |
6801 | 7 | if (qid) |
6802 | 0 | return get_ioq_opcode_name(opcode); |
6803 | 7 | else |
6804 | 7 | return get_aq_opcode_name(opcode); |
6805 | 7 | } |
6806 | | |
6807 | | int |
6808 | | nvme_is_io_queue_opcode(uint8_t opcode) |
6809 | 7 | { |
6810 | 7 | return ((opcode == NVME_IOQ_OPC_FLUSH) || |
6811 | 7 | (opcode == NVME_IOQ_OPC_WRITE) || |
6812 | 7 | (opcode == NVME_IOQ_OPC_READ) || |
6813 | 7 | (opcode == NVME_IOQ_OPC_WRITE_UNCORRECTABLE) || |
6814 | 7 | (opcode == NVME_IOQ_OPC_COMPARE) || |
6815 | 7 | (opcode == NVME_IOQ_OPC_WRITE_ZEROS) || |
6816 | 7 | (opcode == NVME_IOQ_OPC_DATASET_MGMT) || |
6817 | 7 | (opcode == NVME_IOQ_OPC_RESV_REG) || |
6818 | 7 | (opcode == NVME_IOQ_OPC_RESV_REPORT) || |
6819 | 7 | (opcode == NVME_IOQ_OPC_RESV_ACQUIRE) || |
6820 | 7 | (opcode == NVME_IOQ_OPC_RESV_RELEASE)); |
6821 | 7 | } |
6822 | | |
6823 | | static const char *get_cqe_sc_string(unsigned sct, unsigned sc, bool nvmeof) |
6824 | 0 | { |
6825 | 0 | switch (sct) { |
6826 | 0 | case NVME_CQE_SCT_GENERIC: return val_to_str_const(sc, nvme_cqe_sc_gen_tbl, "Unknown Status Code"); |
6827 | 0 | case NVME_CQE_SCT_COMMAND: return (nvmeof) ? val_to_str_const(sc, nvmeof_cqe_sc_cmd_tbl, "Unknown Fabrics Status Code") : |
6828 | 0 | val_to_str_const(sc, nvme_cqe_sc_cmd_tbl, "Unknown Status Code"); |
6829 | 0 | case NVME_CQE_SCT_MEDIA: return val_to_str_const(sc, nvme_cqe_sc_media_tbl, "Unknown Status Code"); |
6830 | 0 | case NVME_CQE_SCT_PATH: return val_to_str_const(sc, nvme_cqe_sc_path_tbl, "Unknown Status Code"); |
6831 | 0 | case NVME_CQE_SCT_VENDOR: return "Vendor Error"; |
6832 | 0 | default: return "Unknown Status Code"; |
6833 | 0 | } |
6834 | 0 | } |
6835 | | |
6836 | | static const value_string nvme_cqe_sc_sf_err_dword0_tbl[] = { |
6837 | | { 0xD, "Feature Identifier Not Saveable" }, |
6838 | | { 0xE, "Feature Not Changeable" }, |
6839 | | { 0xF, "Feature Not Namespace Specific" }, |
6840 | | { 0x14, "Overlapping Range" }, |
6841 | | { 0x15, "I/O Command Set Combination Rejected" }, |
6842 | | { 0x37, "Invalid Controller Data Queue" }, |
6843 | | { 0x3E, "Invalid Power Limit" }, |
6844 | | { 0, NULL }, |
6845 | | }; |
6846 | | |
6847 | | static const value_string nvme_cqe_aev_aet_dword0_tbl[] = { |
6848 | | { 0x0, "Error status" }, |
6849 | | { 0x1, "SMART / Health status" }, |
6850 | | { 0x2, "Notice" }, |
6851 | | { 0x3, "Immediate" }, |
6852 | | { 0x4, "One-Shot" }, |
6853 | | { 0x6, "IO Command Set specific status" }, |
6854 | | { 0x7, "Vendor specific" }, |
6855 | | { 0, NULL }, |
6856 | | }; |
6857 | | |
6858 | | static const value_string nvme_cqe_aev_status_error_tbl[] = { |
6859 | | { 0x0, "Write to Invalid Doorbell Register" }, |
6860 | | { 0x1, "Invalid Doorbell Write Value" }, |
6861 | | { 0x2, "Diagnostic Failure" }, |
6862 | | { 0x3, "Persistent Internal Error"}, |
6863 | | { 0x4, "Transient Internal Error"}, |
6864 | | { 0x5, "Firmware Image Load Error"}, |
6865 | | { 0, NULL }, |
6866 | | }; |
6867 | | |
6868 | | static const value_string nvme_cqe_aev_status_smart_tbl[] = { |
6869 | | { 0x0, "NVM subsystem Reliability" }, |
6870 | | { 0x1, "Temperature Threshold" }, |
6871 | | { 0x2, "Spare Below Threshold" }, |
6872 | | { 0, NULL }, |
6873 | | }; |
6874 | | |
6875 | | static const value_string nvme_cqe_aev_status_notice_tbl[] = { |
6876 | | { 0x0, "Attached Namespace Attribute Changed" }, |
6877 | | { 0x1, "Firmware Activation Starting" }, |
6878 | | { 0x2, "Telemetry Log Changed" }, |
6879 | | { 0x3, "Asymmetric Namespace Access Change" }, |
6880 | | { 0x4, "Predictable Latency Event Aggregate Log Change" }, |
6881 | | { 0x5, "LBA Status Information Alert" }, |
6882 | | { 0x6, "Endurance Group Event Aggregate Log Page Change" }, |
6883 | | { 0x7, "Reachability Group Change" }, |
6884 | | { 0x8, "Reachability Association Change" }, |
6885 | | { 0x9, "Allocated Namespace Attribute Changed" }, |
6886 | | { 0xEF, "Zone Descriptor Changed" }, |
6887 | | { 0xF0, "Discovery Log Page Change" }, |
6888 | | { 0xF1, "Host Discovery Log Page Change" }, |
6889 | | { 0xF2, "AVE Discovery Log Page Change" }, |
6890 | | { 0xF3, "Pull Model DDC Request" }, |
6891 | | { 0xF4, "Cross-Controller Reset Completed" }, |
6892 | | { 0xF5, "Lost Host Communication" }, |
6893 | | { 0, NULL }, |
6894 | | }; |
6895 | | |
6896 | | static const value_string nvme_cqe_aev_status_nvm_tbl[] = { |
6897 | | { 0x0, "Reservation Log Page Available" }, |
6898 | | { 0x1, "Sanitize Operation Completed" }, |
6899 | | { 0x2, "Sanitize Operation Completed With Unexpected Deallocation" }, |
6900 | | { 0x3, "Sanitize Operation Entered Media Verification State" }, |
6901 | | { 0, NULL }, |
6902 | | }; |
6903 | | |
6904 | | void nvme_dissect_admin_cqe_dw0(tvbuff_t *nvme_tvb, int dw0_off, proto_tree *cqe_tree, |
6905 | | uint16_t status, struct nvme_cmd_ctx *cmd_ctx) |
6906 | 0 | { |
6907 | 0 | switch (cmd_ctx->opcode) { |
6908 | 0 | case NVME_AQ_OPC_SET_FEATURES: |
6909 | 0 | { |
6910 | 0 | uint16_t sc = ((status & 0x1fe) >> 1); |
6911 | 0 | if (sc) { |
6912 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0_sf_err, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6913 | 0 | } else { |
6914 | 0 | if (cmd_ctx->cmd_ctx.set_features.fid == F_NUM_OF_QUEUES) |
6915 | 0 | add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_dword0_sf_nq)); |
6916 | 0 | else |
6917 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6918 | 0 | } |
6919 | 0 | break; |
6920 | 0 | } |
6921 | 0 | case NVME_AQ_OPC_GET_FEATURES: |
6922 | 0 | switch (cmd_ctx->cmd_ctx.set_features.fid) { |
6923 | 0 | case F_ARBITRATION: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_arb)); break; |
6924 | 0 | case F_POWER_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_pm)); break; |
6925 | 0 | case F_LBA_RANGE_TYPE: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbart)); break; |
6926 | 0 | case F_TEMP_THRESHOLD: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_tt)); break; |
6927 | 0 | case F_ERROR_RECOVERY: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_erec)); break; |
6928 | 0 | case F_VOLATILE_WC: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_vwce)); break; |
6929 | 0 | case F_NUM_OF_QUEUES: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nq)); break; |
6930 | 0 | case F_IRQ_COALESCING: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqc)); break; |
6931 | 0 | case F_IRQ_VECTOR_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_irqv)); break; |
6932 | 0 | case F_WRITE_ATOM_NORM: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_wan)); break; |
6933 | 0 | case F_ASYNC_EVENT_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_aec)); break; |
6934 | 0 | case F_AUTO_PS_TRANSITION: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_apst)); break; |
6935 | 0 | case F_KA_TIMER: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_kat)); break; |
6936 | 0 | case F_HOST_CNTL_THERM_MGMT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hctm)); break; |
6937 | 0 | case F_NO_POWER_STATE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nops)); break; |
6938 | 0 | case F_READ_REC_LEVEL_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rrl)); break; |
6939 | 0 | case F_PRED_LAT_MODE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmc)); break; |
6940 | 0 | case F_PRED_LAT_MODE_WIND: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_plmw)); break; |
6941 | 0 | case F_LBA_ST_INF_REP_INT: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_lbasi)); break; |
6942 | 0 | case F_SANITIZE_CON: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_san)); break; |
6943 | 0 | case F_END_GROUP_EV_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_eg)); break; |
6944 | 0 | case F_SW_PR_MARKER: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_swp)); break; |
6945 | 0 | case F_HOST_ID: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_hid)); break; |
6946 | 0 | case F_RSRV_NOT_MASK: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvn)); break; |
6947 | 0 | case F_RSRV_PRST: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_rsrvp)); break; |
6948 | 0 | case F_NS_WRITE_CONF: add_group_mask_entry(nvme_tvb, cqe_tree, dw0_off, 4, ASPEC(hf_nvme_cqe_get_features_dword0_nswp)); break; |
6949 | 0 | default: proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); break; |
6950 | 0 | } |
6951 | 0 | break; |
6952 | 0 | case NVME_AQ_OPC_ASYNC_EVE_REQ: |
6953 | 0 | { |
6954 | 0 | proto_item *ti; |
6955 | 0 | proto_tree *grp; |
6956 | 0 | unsigned i; |
6957 | 0 | uint8_t aet; |
6958 | 0 | uint8_t aei; |
6959 | 0 | ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_aev_dword0[0], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6960 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
6961 | 0 | for (i = 1; i < 4; i++) |
6962 | 0 | ti = proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[i], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6963 | | /* Asynchronous Event Information is CQE DW0 bits 15:08 (byte 1); |
6964 | | * byte 2 is the Log Page Identifier. */ |
6965 | 0 | aet = tvb_get_uint8(nvme_tvb, dw0_off) & 0x7; |
6966 | 0 | aei = tvb_get_uint8(nvme_tvb, dw0_off + 1); |
6967 | 0 | switch (aet) { |
6968 | 0 | case 0: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_error_tbl, "Unknown")); break; |
6969 | 0 | case 1: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_smart_tbl, "Unknown")); break; |
6970 | 0 | case 2: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_notice_tbl, "Unknown")); break; |
6971 | 0 | case 6: proto_item_append_text(ti, " (%s)", val_to_str_const(aei, nvme_cqe_aev_status_nvm_tbl, "Unknown")); break; |
6972 | 0 | } |
6973 | 0 | proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[4], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6974 | 0 | proto_tree_add_item(grp, hf_nvme_cqe_aev_dword0[5], nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6975 | 0 | break; |
6976 | 0 | } |
6977 | 0 | default: |
6978 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword0, nvme_tvb, dw0_off, 4, ENC_LITTLE_ENDIAN); |
6979 | 0 | break; |
6980 | 0 | } |
6981 | 0 | } |
6982 | | |
6983 | | /* Status Field word (Phase/SCT/SC/CRD/M/DNR) at status_off. Factored out of |
6984 | | * dissect_nvme_cqe_common() so transports that carry the NVMe status word |
6985 | | * without the surrounding CQE layout (NVMe-MI omits SQHD/SQID/CID) can decode |
6986 | | * it at an explicit offset. nvmeof selects the Reserved vs Phase Tag rendering |
6987 | | * of bit 0 and the fabrics status-code string table. */ |
6988 | | static void nvme_cqe_status_word(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned status_off, bool nvmeof) |
6989 | 0 | { |
6990 | 0 | proto_item *ti; |
6991 | 0 | proto_tree *grp; |
6992 | 0 | uint16_t val; |
6993 | 0 | unsigned i; |
6994 | |
|
6995 | 0 | val = tvb_get_uint16(nvme_tvb, status_off, ENC_LITTLE_ENDIAN); |
6996 | 0 | ti = proto_tree_add_item(cqe_tree, hf_nvme_cqe_status[0], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN); |
6997 | | /* SC (08:01) or SCT (11:09) nonzero means the command did not complete |
6998 | | * successfully. Phase Tag, CRD, M and DNR are deliberately excluded -- |
6999 | | * none of them indicates failure. */ |
7000 | 0 | if (val & 0xFFE) |
7001 | 0 | expert_add_info(pinfo, ti, &ei_nvme_cqe_status_error); |
7002 | 0 | grp = proto_item_add_subtree(ti, ett_data); |
7003 | 0 | if (nvmeof) |
7004 | 0 | proto_tree_add_item(grp, hf_nvme_cqe_status_rsvd, nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN); |
7005 | 0 | else |
7006 | 0 | proto_tree_add_item(grp, hf_nvme_cqe_status[1], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN); |
7007 | |
|
7008 | 0 | ti = proto_tree_add_item(grp, hf_nvme_cqe_status[2], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN); |
7009 | 0 | proto_item_append_text(ti, " (%s)", get_cqe_sc_string((val & 0xE00) >> 9, (val & 0x1FE) >> 1, nvmeof)); |
7010 | |
|
7011 | 0 | for (i = 3; i < array_length(hf_nvme_cqe_status); i++) |
7012 | 0 | proto_tree_add_item(grp, hf_nvme_cqe_status[i], nvme_tvb, status_off, 2, ENC_LITTLE_ENDIAN); |
7013 | 0 | } |
7014 | | |
7015 | | void nvme_dissect_cqe_status(tvbuff_t *nvme_tvb, packet_info *pinfo, int status_off, proto_tree *cqe_tree) |
7016 | 0 | { |
7017 | 0 | nvme_cqe_status_word(nvme_tvb, pinfo, cqe_tree, (unsigned)status_off, false); |
7018 | 0 | } |
7019 | | |
7020 | | static void dissect_nvme_cqe_common(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *cqe_tree, unsigned off, bool nvmeof) |
7021 | 0 | { |
7022 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqhd, nvme_tvb, off+8, 2, ENC_LITTLE_ENDIAN); |
7023 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_sqid, nvme_tvb, off+10, 2, ENC_LITTLE_ENDIAN); |
7024 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_cid, nvme_tvb, off+12, 2, ENC_LITTLE_ENDIAN); |
7025 | 0 | nvme_cqe_status_word(nvme_tvb, pinfo, cqe_tree, off+14, nvmeof); |
7026 | 0 | } |
7027 | | |
7028 | | void dissect_nvme_cqe(tvbuff_t *nvme_tvb, packet_info *pinfo, proto_tree *root_tree, struct nvme_q_ctx *q_ctx, struct nvme_cmd_ctx *cmd_ctx) |
7029 | 0 | { |
7030 | 0 | proto_tree *cqe_tree; |
7031 | 0 | proto_item *ti; |
7032 | |
|
7033 | 0 | if (q_ctx->qid) |
7034 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", get_ioq_opcode_name(cmd_ctx->opcode)); |
7035 | 0 | else |
7036 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, "| ", "NVMe CQE for %s", get_aq_opcode_name(cmd_ctx->opcode)); |
7037 | |
|
7038 | 0 | if (!q_ctx->qid) { |
7039 | 0 | if (cmd_ctx->opcode == NVME_AQ_OPC_IDENTIFY) |
7040 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", val_to_str_const(cmd_ctx->cmd_ctx.cmd_identify.cns, cns_table, "Unknown")); |
7041 | 0 | else if (cmd_ctx->opcode == NVME_AQ_OPC_GET_LOG_PAGE) |
7042 | 0 | col_append_sep_fstr(pinfo->cinfo, COL_INFO, " ", "%s", get_logpage_name(cmd_ctx->cmd_ctx.get_logpage.lid)); |
7043 | 0 | } |
7044 | 0 | col_set_str(pinfo->cinfo, COL_PROTOCOL, "NVMe"); |
7045 | 0 | ti = proto_tree_add_item(root_tree, proto_nvme, nvme_tvb, 0, |
7046 | 0 | NVME_CQE_SIZE, ENC_NA); |
7047 | 0 | proto_item_append_text(ti, " (Cqe)"); |
7048 | 0 | cqe_tree = proto_item_add_subtree(ti, ett_data); |
7049 | |
|
7050 | 0 | nvme_publish_to_cmd_link(cqe_tree, nvme_tvb, hf_nvme_cmd_pkt, cmd_ctx); |
7051 | 0 | nvme_publish_cmd_latency(cqe_tree, cmd_ctx, hf_nvme_cmd_latency); |
7052 | |
|
7053 | 0 | nvme_dissect_admin_cqe_dw0(nvme_tvb, 0, cqe_tree, |
7054 | 0 | tvb_get_uint16(nvme_tvb, 14, ENC_LITTLE_ENDIAN), cmd_ctx); |
7055 | 0 | proto_tree_add_item(cqe_tree, hf_nvme_cqe_dword1, nvme_tvb, 4, 4, ENC_LITTLE_ENDIAN); |
7056 | 0 | dissect_nvme_cqe_common(nvme_tvb, pinfo, cqe_tree, 0, false); |
7057 | 0 | } |
7058 | | |
7059 | | void |
7060 | | proto_register_nvme(void) |
7061 | 16 | { |
7062 | 16 | static hf_register_info hf[] = { |
7063 | | /* NVMeOF Fabric Command Fields */ |
7064 | 16 | { &hf_nvmeof_cmd, |
7065 | 16 | { "Cmd", "nvme.fabrics.cmd", |
7066 | 16 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7067 | 16 | }, |
7068 | 16 | { &hf_nvmeof_cmd_opc, |
7069 | 16 | { "Opcode", "nvme.fabrics.cmd.opc", |
7070 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7071 | 16 | }, |
7072 | 16 | { &hf_nvmeof_cmd_rsvd, |
7073 | 16 | { "Reserved", "nvme.fabrics.cmd.rsvd", |
7074 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7075 | 16 | }, |
7076 | 16 | { &hf_nvmeof_cmd_cid, |
7077 | 16 | { "Command Identifier", "nvme.fabrics.cmd.cid", |
7078 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7079 | 16 | }, |
7080 | 16 | { &hf_nvmeof_cmd_fctype, |
7081 | 16 | { "Fabric Command Type", "nvme.fabrics.cmd.fctype", |
7082 | 16 | FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(fctype_tbl), 0x0, NULL, HFILL} |
7083 | 16 | }, |
7084 | 16 | { &hf_nvmeof_cmd_connect_rsvd1, |
7085 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.rsvd1", |
7086 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7087 | 16 | }, |
7088 | 16 | { &hf_nvmeof_cmd_connect_sgl1, |
7089 | 16 | { "SGL1", "nvme.fabrics.cmd.connect.sgl1", |
7090 | 16 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7091 | 16 | }, |
7092 | 16 | { &hf_nvmeof_cmd_connect_recfmt, |
7093 | 16 | { "Record Format", "nvme.fabrics.cmd.connect.recfmt", |
7094 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
7095 | 16 | }, |
7096 | 16 | { &hf_nvmeof_cmd_connect_qid, |
7097 | 16 | { "Queue ID", "nvme.fabrics.cmd.connect.qid", |
7098 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_nvme_qid), 0x0, NULL, HFILL} |
7099 | 16 | }, |
7100 | 16 | { &hf_nvmeof_cmd_connect_sqsize, |
7101 | 16 | { "Submission Queue Size", "nvme.fabrics.cmd.connect.sqsize", |
7102 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_zero_base), 0x0, NULL, HFILL} |
7103 | 16 | }, |
7104 | 16 | { &hf_nvmeof_cmd_connect_cattr[0], |
7105 | 16 | { "Connect Attributes", "nvme.fabrics.cmd.connect.cattr", |
7106 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7107 | 16 | }, |
7108 | 16 | { &hf_nvmeof_cmd_connect_cattr[1], |
7109 | 16 | { "Priority Class", "nvme.fabrics.cmd.connect.cattr.pc", |
7110 | 16 | FT_UINT8, BASE_HEX, VALS(pclass_tbl), 0x3, NULL, HFILL} |
7111 | 16 | }, |
7112 | 16 | { &hf_nvmeof_cmd_connect_cattr[2], |
7113 | 16 | { "Disable SQ Flow Control", "nvme.fabrics.cmd.connect.cattr.dfc", |
7114 | 16 | FT_UINT8, BASE_HEX, NULL, 0x4, NULL, HFILL} |
7115 | 16 | }, |
7116 | 16 | { &hf_nvmeof_cmd_connect_cattr[3], |
7117 | 16 | { "Support Deletion of IO Queues", "nvme.fabrics.cmd.connect.cattr.dioq", |
7118 | 16 | FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL} |
7119 | 16 | }, |
7120 | 16 | { &hf_nvmeof_cmd_connect_cattr[4], |
7121 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.cattr.rsvd", |
7122 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
7123 | 16 | }, |
7124 | 16 | { &hf_nvmeof_cmd_connect_rsvd2, |
7125 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.rsvd2", |
7126 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7127 | 16 | }, |
7128 | 16 | { &hf_nvmeof_cmd_connect_kato, |
7129 | 16 | { "Keep Alive Timeout", "nvme.fabrics.cmd.connect.kato", |
7130 | 16 | FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL} |
7131 | 16 | }, |
7132 | 16 | { &hf_nvmeof_cmd_connect_rsvd3, |
7133 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.rsvd3", |
7134 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7135 | 16 | }, |
7136 | 16 | { &hf_nvmeof_cmd_connect_data_hostid, |
7137 | 16 | { "Host Identifier", "nvme.fabrics.cmd.connect.data.hostid", |
7138 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7139 | 16 | }, |
7140 | 16 | { &hf_nvmeof_cmd_connect_data_cntlid, |
7141 | 16 | { "Controller ID", "nvme.fabrics.cmd.connect.data.cntrlid", |
7142 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7143 | 16 | }, |
7144 | 16 | { &hf_nvmeof_cmd_connect_data_rsvd0, |
7145 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd0", |
7146 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7147 | 16 | }, |
7148 | 16 | { &hf_nvmeof_cmd_connect_data_subnqn, |
7149 | 16 | { "Subsystem NQN", "nvme.fabrics.cmd.connect.data.subnqn", |
7150 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7151 | 16 | }, |
7152 | 16 | { &hf_nvmeof_cmd_connect_data_hostnqn, |
7153 | 16 | { "Host NQN", "nvme.fabrics.cmd.connect.data.hostnqn", |
7154 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7155 | 16 | }, |
7156 | 16 | { &hf_nvmeof_cmd_connect_data_rsvd1, |
7157 | 16 | { "Reserved", "nvme.fabrics.cmd.connect.data.rsvd1", |
7158 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7159 | 16 | }, |
7160 | 16 | { &hf_nvmeof_cmd_auth_rsdv1, |
7161 | 16 | { "Reserved", "nvme.fabrics.cmd.auth.rsvd1", |
7162 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7163 | 16 | }, |
7164 | 16 | { &hf_nvmeof_cmd_auth_sgl1, |
7165 | 16 | { "SGL1", "nvme.fabrics.cmd.auth.sgl1", |
7166 | 16 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7167 | 16 | }, |
7168 | 16 | { &hf_nvmeof_cmd_auth_rsdv2, |
7169 | 16 | { "Reserved", "nvme.fabrics.cmd.auth.rsvd2", |
7170 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7171 | 16 | }, |
7172 | 16 | { &hf_nvmeof_cmd_auth_spsp0, |
7173 | 16 | { "SP Specific 0", "nvme.fabrics.cmd.auth.spsp0", |
7174 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7175 | 16 | }, |
7176 | 16 | { &hf_nvmeof_cmd_auth_spsp1, |
7177 | 16 | { "SP Specific 1", "nvme.fabrics.cmd.auth.spsp1", |
7178 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7179 | 16 | }, |
7180 | 16 | { &hf_nvmeof_cmd_auth_secp, |
7181 | 16 | { "Security Protocol", "nvme.fabrics.cmd.auth.secp", |
7182 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7183 | 16 | }, |
7184 | 16 | { &hf_nvmeof_cmd_auth_al, |
7185 | 16 | { "Allocation Length", "nvme.fabrics.cmd.auth.al", |
7186 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
7187 | 16 | }, |
7188 | 16 | { &hf_nvmeof_cmd_auth_rsdv3, |
7189 | 16 | { "Reserved", "nvme.fabrics.cmd.auth.rsvd3", |
7190 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7191 | 16 | }, |
7192 | 16 | { &hf_nvmeof_cmd_disconnect_rsvd0, |
7193 | 16 | { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd0", |
7194 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7195 | 16 | }, |
7196 | 16 | { &hf_nvmeof_cmd_disconnect_recfmt, |
7197 | 16 | { "Record Format", "nvme.fabrics.cmd.disconnect.recfmt", |
7198 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
7199 | 16 | }, |
7200 | 16 | { &hf_nvmeof_cmd_disconnect_rsvd1, |
7201 | 16 | { "Reserved", "nvme.fabrics.cmd.disconnect.rsvd1", |
7202 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7203 | 16 | }, |
7204 | 16 | { &hf_nvmeof_cmd_prop_get_set_rsvd0, |
7205 | 16 | { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd0", |
7206 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7207 | 16 | }, |
7208 | 16 | { &hf_nvmeof_cmd_prop_get_set_attrib[0], |
7209 | 16 | { "Attributes", "nvme.fabrics.cmd.prop_get_set.attrib", |
7210 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7211 | 16 | }, |
7212 | 16 | { &hf_nvmeof_cmd_prop_get_set_attrib[1], |
7213 | 16 | { "Property Size", "nvme.fabrics.cmd.prop_get_set.attrib.size", |
7214 | 16 | FT_UINT8, BASE_HEX, VALS(attr_size_tbl), 0x7, NULL, HFILL} |
7215 | 16 | }, |
7216 | 16 | { &hf_nvmeof_cmd_prop_get_set_attrib[2], |
7217 | 16 | { "Reserved", "nvme.fabrics.cmd.prop_get_set.attrib.rsvd", |
7218 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
7219 | 16 | }, |
7220 | 16 | { &hf_nvmeof_cmd_prop_get_set_rsvd1, |
7221 | 16 | { "Reserved", "nvme.fabrics.cmd.prop_get_set.rsvd1", |
7222 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7223 | 16 | }, |
7224 | 16 | { &hf_nvmeof_cmd_prop_get_set_offset, |
7225 | 16 | { "Offset", "nvme.fabrics.cmd.prop_get_set.offset", |
7226 | 16 | FT_UINT32, BASE_HEX, VALS(prop_offset_tbl), 0x0, NULL, HFILL} |
7227 | 16 | }, |
7228 | 16 | { &hf_nvmeof_cmd_prop_get_rsvd2, |
7229 | 16 | { "Reserved", "nvme.fabrics.cmd.prop_get.rsvd2", |
7230 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7231 | 16 | }, |
7232 | 16 | { &hf_nvmeof_prop_get_set_data, |
7233 | 16 | { "Property Data", "nvme.fabrics.prop_get_set.data", |
7234 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7235 | 16 | }, |
7236 | 16 | { &hf_nvmeof_prop_get_set_data_4B, |
7237 | 16 | { "Value", "nvme.fabrics.prop_get_set.data.4B", |
7238 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7239 | 16 | }, |
7240 | 16 | { &hf_nvmeof_prop_get_set_data_4B_rsvd, |
7241 | 16 | { "Reserved", "nvme.fabrics.prop_get_set.data.rsvd", |
7242 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7243 | 16 | }, |
7244 | 16 | { &hf_nvmeof_prop_get_set_data_8B, |
7245 | 16 | { "Value", "nvme.fabrics.prop_get_set.data.8B", |
7246 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7247 | 16 | }, |
7248 | 16 | { &hf_nvmeof_prop_get_set_cc[0], |
7249 | 16 | { "Controller Configuration", "nvme.fabrics.prop_get_set.cc", |
7250 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7251 | 16 | }, |
7252 | 16 | { &hf_nvmeof_prop_get_set_cc[1], |
7253 | 16 | { "Enable", "nvme.fabrics.prop_get_set.cc.en", |
7254 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
7255 | 16 | }, |
7256 | 16 | { &hf_nvmeof_prop_get_set_cc[2], |
7257 | 16 | { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd0", |
7258 | 16 | FT_UINT32, BASE_HEX, NULL, 0xE, NULL, HFILL} |
7259 | 16 | }, |
7260 | 16 | { &hf_nvmeof_prop_get_set_cc[3], |
7261 | 16 | { "IO Command Set Selected", "nvme.fabrics.prop_get_set.cc.css", |
7262 | 16 | FT_UINT32, BASE_HEX, VALS(css_table), 0x70, NULL, HFILL} |
7263 | 16 | }, |
7264 | 16 | { &hf_nvmeof_prop_get_set_cc[4], |
7265 | 16 | { "Memory Page Size", "nvme.fabrics.prop_get_set.cc.mps", |
7266 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0x780, NULL, HFILL} |
7267 | 16 | }, |
7268 | 16 | { &hf_nvmeof_prop_get_set_cc[5], |
7269 | 16 | { "Arbitration Mechanism Selected", "nvme.fabrics.prop_get_set.cc.ams", |
7270 | 16 | FT_UINT32, BASE_HEX, VALS(ams_table), 0x3800, NULL, HFILL} |
7271 | 16 | }, |
7272 | 16 | { &hf_nvmeof_prop_get_set_cc[6], |
7273 | 16 | { "Shutdown Notification", "nvme.fabrics.prop_get_set.cc.shn", |
7274 | 16 | FT_UINT32, BASE_HEX, VALS(sn_table), 0xc000, NULL, HFILL} |
7275 | 16 | }, |
7276 | 16 | { &hf_nvmeof_prop_get_set_cc[7], |
7277 | 16 | { "IO Submission Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iosqes", |
7278 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF0000, NULL, HFILL} |
7279 | 16 | }, |
7280 | 16 | { &hf_nvmeof_prop_get_set_cc[8], |
7281 | 16 | { "IO Completion Queue Entry Size", "nvme.fabrics.prop_get_set.cc.iocqes", |
7282 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xF00000, NULL, HFILL} |
7283 | 16 | }, |
7284 | 16 | { &hf_nvmeof_prop_get_set_cc[9], |
7285 | 16 | { "Reserved", "nvme.fabrics.prop_get_set.cc.rsvd1", |
7286 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
7287 | 16 | }, |
7288 | 16 | { &hf_nvmeof_prop_get_set_csts[0], |
7289 | 16 | { "Controller Status", "nvme.fabrics.prop_get_set.csts", |
7290 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7291 | 16 | }, |
7292 | 16 | { &hf_nvmeof_prop_get_set_csts[1], |
7293 | 16 | { "Ready", "nvme.fabrics.prop_get_set.csts.rdy", |
7294 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
7295 | 16 | }, |
7296 | 16 | { &hf_nvmeof_prop_get_set_csts[2], |
7297 | 16 | { "Controller Fatal Status", "nvme.fabrics.prop_get_set.csts.cfs", |
7298 | 16 | FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL} |
7299 | 16 | }, |
7300 | 16 | { &hf_nvmeof_prop_get_set_csts[3], |
7301 | 16 | { "Shutdown Status", "nvme.fabrics.prop_get_set.csts.shst", |
7302 | 16 | FT_UINT32, BASE_HEX, VALS(shst_table), 0xC, NULL, HFILL} |
7303 | 16 | }, |
7304 | 16 | { &hf_nvmeof_prop_get_set_csts[4], |
7305 | 16 | { "NVM Subsystem Reset Occurred", "nvme.fabrics.prop_get_set.csts.nssro", |
7306 | 16 | FT_UINT32, BASE_HEX, NULL, 0x10, NULL, HFILL} |
7307 | 16 | }, |
7308 | 16 | { &hf_nvmeof_prop_get_set_csts[5], |
7309 | 16 | { "Processing Paused", "nvme.fabrics.prop_get_set.csts.pp", |
7310 | 16 | FT_UINT32, BASE_HEX, NULL, 0x20, NULL, HFILL} |
7311 | 16 | }, |
7312 | 16 | { &hf_nvmeof_prop_get_set_csts[6], |
7313 | 16 | { "Reserved", "nvme.fabrics.prop_get_set.csts.rsvd", |
7314 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffffC0, NULL, HFILL} |
7315 | 16 | }, |
7316 | 16 | { &hf_nvmeof_prop_get_set_nssr[0], |
7317 | 16 | { "NVM Subsystem Reset", "nvme.fabrics.cmd.prop_attr.set.nssr", |
7318 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7319 | 16 | }, |
7320 | 16 | { &hf_nvmeof_prop_get_set_nssr[1], |
7321 | 16 | { "NVM Subsystem Reset Control", "nvme.fabrics.cmd.prop_attr.set.nssr.nssrc", |
7322 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffffff, NULL, HFILL} |
7323 | 16 | }, |
7324 | 16 | { &hf_nvmeof_cmd_prop_set_rsvd, |
7325 | 16 | { "Reserved", "nvme.fabrics.cmd.prop_set.rsvd", |
7326 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7327 | 16 | }, |
7328 | 16 | { &hf_nvmeof_cmd_generic_rsvd1, |
7329 | 16 | { "Reserved", "nvme.fabrics.cmd.generic.rsvd1", |
7330 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7331 | 16 | }, |
7332 | 16 | { &hf_nvmeof_cmd_generic_field, |
7333 | 16 | { "Fabric Cmd specific field", "nvme.fabrics.cmd.generic.field", |
7334 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7335 | 16 | }, |
7336 | | /* NVMeOF Fabric Commands CQE fields */ |
7337 | 16 | { &hf_nvmeof_cqe, |
7338 | 16 | { "Cqe", "nvme.fabrics.cqe", |
7339 | 16 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7340 | 16 | }, |
7341 | 16 | { &hf_nvmeof_cqe_sts, |
7342 | 16 | { "Cmd specific Status", "nvme.fabrics.cqe.sts", |
7343 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7344 | 16 | }, |
7345 | 16 | { &hf_nvmeof_prop_get_ccap[0], |
7346 | 16 | { "Controller Capabilities", "nvme.fabrics.prop_get.ccap", |
7347 | 16 | FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} |
7348 | 16 | }, |
7349 | 16 | { &hf_nvmeof_prop_get_ccap[1], |
7350 | 16 | { "Maximum Queue Entries Supported", "nvme.fabrics.prop_get.ccap.mqes", |
7351 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_zero_base), 0xffff, NULL, HFILL} |
7352 | 16 | }, |
7353 | 16 | { &hf_nvmeof_prop_get_ccap[2], |
7354 | 16 | { "Contiguous Queues Required", "nvme.fabrics.prop_get.ccap.cqr", |
7355 | 16 | FT_BOOLEAN, 64, NULL, 0x10000, NULL, HFILL} |
7356 | 16 | }, |
7357 | 16 | { &hf_nvmeof_prop_get_ccap[3], |
7358 | 16 | { "Supports Arbitration Mechanism with Weighted Round Robin and Urgent Priority Class", "nvme.fabrics.prop_get.ccap.ams.wrr", |
7359 | 16 | FT_BOOLEAN, 64, NULL, 0x20000, NULL, HFILL} |
7360 | 16 | }, |
7361 | 16 | { &hf_nvmeof_prop_get_ccap[4], |
7362 | 16 | { "Supports Arbitration Mechanism Vendor Specific", "nvme.fabrics.prop_get.ccap.ams.vs", |
7363 | 16 | FT_BOOLEAN, 64, NULL, 0x40000, NULL, HFILL} |
7364 | 16 | }, |
7365 | 16 | { &hf_nvmeof_prop_get_ccap[5], |
7366 | 16 | { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd0", |
7367 | 16 | FT_UINT64, BASE_HEX, NULL, 0xF80000, NULL, HFILL} |
7368 | 16 | }, |
7369 | 16 | { &hf_nvmeof_prop_get_ccap[6], |
7370 | 16 | { "Timeout (to ready status)", "nvme.fabrics.prop_get.ccap.to", |
7371 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_500ms_units), 0xFF000000, NULL, HFILL} |
7372 | 16 | }, |
7373 | 16 | { &hf_nvmeof_prop_get_ccap[7], |
7374 | 16 | { "Doorbell Stride", "nvme.fabrics.prop_get.ccap.dstrd", |
7375 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_dstrd_size), 0xF00000000, NULL, HFILL} |
7376 | 16 | }, |
7377 | 16 | { &hf_nvmeof_prop_get_ccap[8], |
7378 | 16 | { "NVM Subsystem Reset Supported", "nvme.fabrics.prop_get.ccap.nssrs", |
7379 | 16 | FT_BOOLEAN, 64, NULL, 0x1000000000, NULL, HFILL} |
7380 | 16 | }, |
7381 | 16 | { &hf_nvmeof_prop_get_ccap[9], |
7382 | 16 | { "Command Sets Supported", "nvme.fabrics.prop_get.ccap.css", |
7383 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ccap_css), 0x1FE000000000, NULL, HFILL} |
7384 | 16 | }, |
7385 | 16 | { &hf_nvmeof_prop_get_ccap[10], |
7386 | 16 | { "Boot Partition Support", "nvme.fabrics.prop_get.ccap.bps", |
7387 | 16 | FT_BOOLEAN, 64, NULL, 0x200000000000, NULL, HFILL} |
7388 | 16 | }, |
7389 | 16 | { &hf_nvmeof_prop_get_ccap[11], |
7390 | 16 | { "Reserved", "nvme.fabrics.prop_get.ccap.rsdv1", |
7391 | 16 | FT_UINT64, BASE_HEX, NULL, 0xC00000000000, NULL, HFILL} |
7392 | 16 | }, |
7393 | 16 | { &hf_nvmeof_prop_get_ccap[12], |
7394 | 16 | { "Memory Page Size Minimum", "nvme.fabrics.prop_get.ccap.mpsmin", |
7395 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF000000000000, NULL, HFILL} |
7396 | 16 | }, |
7397 | 16 | { &hf_nvmeof_prop_get_ccap[13], |
7398 | 16 | { "Memory Page Size Maximum", "nvme.fabrics.prop_get.ccap.mpsmax", |
7399 | 16 | FT_UINT64, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_page_size), 0xF0000000000000, NULL, HFILL} |
7400 | 16 | }, |
7401 | 16 | { &hf_nvmeof_prop_get_ccap[14], |
7402 | 16 | { "Persistent Memory Region Supported", "nvme.fabrics.prop_get.ccap.pmrs", |
7403 | 16 | FT_BOOLEAN, 64, NULL, 0x100000000000000, NULL, HFILL} |
7404 | 16 | }, |
7405 | 16 | { &hf_nvmeof_prop_get_ccap[15], |
7406 | 16 | { "Controller Memory Buffer Supported", "nvme.fabrics.prop_get.ccap.cmbs", |
7407 | 16 | FT_BOOLEAN, 64, NULL, 0x200000000000000, NULL, HFILL} |
7408 | 16 | }, |
7409 | 16 | { &hf_nvmeof_prop_get_ccap[16], |
7410 | 16 | { "Reserved", "nvme.fabrics.prop_get.ccap.rsvd2", |
7411 | 16 | FT_UINT64, BASE_HEX, NULL, 0xFC00000000000000, NULL, HFILL} |
7412 | 16 | }, |
7413 | 16 | { &hf_nvmeof_prop_get_vs[0], |
7414 | 16 | { "Version", "nvme.fabrics.prop_get.vs", |
7415 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7416 | 16 | }, |
7417 | 16 | { &hf_nvmeof_prop_get_vs[1], |
7418 | 16 | { "Tertiary Version", "nvme.fabrics.prop_get.vs.ter", |
7419 | 16 | FT_UINT32, BASE_DEC, NULL, 0xff, NULL, HFILL} |
7420 | 16 | }, |
7421 | 16 | { &hf_nvmeof_prop_get_vs[2], |
7422 | 16 | { "Minor Version", "nvme.fabrics.prop_get.vs.mnr", |
7423 | 16 | FT_UINT32, BASE_DEC, NULL, 0xff00, NULL, HFILL} |
7424 | 16 | }, |
7425 | 16 | { &hf_nvmeof_prop_get_vs[3], |
7426 | 16 | { "Major Version", "nvme.fabrics.prop_get.vs.mjr", |
7427 | 16 | FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL} |
7428 | 16 | }, |
7429 | 16 | { &hf_nvmeof_cqe_connect_cntlid, |
7430 | 16 | { "Controller ID", "nvme.fabrics.cqe.connect.cntrlid", |
7431 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7432 | 16 | }, |
7433 | 16 | { &hf_nvmeof_cqe_connect_authreq, |
7434 | 16 | { "Authentication Required", "nvme.fabrics.cqe.connect.authreq", |
7435 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7436 | 16 | }, |
7437 | 16 | { &hf_nvmeof_cqe_connect_rsvd, |
7438 | 16 | { "Reserved", "nvme.fabrics.cqe.connect.rsvd", |
7439 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7440 | 16 | }, |
7441 | 16 | { &hf_nvmeof_cqe_prop_set_rsvd, |
7442 | 16 | { "Reserved", "nvme.fabrics.cqe.prop_set.rsvd", |
7443 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7444 | 16 | }, |
7445 | | /* Tracking commands, completions and transfers */ |
7446 | 16 | { &hf_nvmeof_cmd_pkt, |
7447 | 16 | { "Fabric Cmd in", "nvme.fabrics.cmd_pkt", |
7448 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7449 | 16 | "The Cmd for this transaction is in this frame", HFILL } |
7450 | 16 | }, |
7451 | 16 | { &hf_nvmeof_cqe_pkt, |
7452 | 16 | { "Fabric Cqe in", "nvme.fabrics.cqe_pkt", |
7453 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7454 | 16 | "The Cqe for this transaction is in this frame", HFILL } |
7455 | 16 | }, |
7456 | 16 | { &hf_nvmeof_data_req, |
7457 | 16 | { "DATA Transfer Request", "nvme.fabrics.data_req", |
7458 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7459 | 16 | "DATA transfer request for this transaction is in this frame", HFILL } |
7460 | 16 | }, |
7461 | 16 | { &hf_nvmeof_data_tr[0], |
7462 | 16 | { "DATA Transfer 0", "nvme.fabrics.data.tr0", |
7463 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7464 | 16 | "DATA transfer 0 for this transaction is in this frame", HFILL } |
7465 | 16 | }, |
7466 | 16 | { &hf_nvmeof_data_tr[1], |
7467 | 16 | { "DATA Transfer 1", "nvme.fabrics.data_tr1", |
7468 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7469 | 16 | "DATA transfer 1 for this transaction is in this frame", HFILL } |
7470 | 16 | }, |
7471 | 16 | { &hf_nvmeof_data_tr[2], |
7472 | 16 | { "DATA Transfer 2", "nvme.fabrics.data_tr2", |
7473 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7474 | 16 | "DATA transfer 2 for this transaction is in this frame", HFILL } |
7475 | 16 | }, |
7476 | 16 | { &hf_nvmeof_data_tr[3], |
7477 | 16 | { "DATA Transfer 3", "nvme.fabrics.data_tr3", |
7478 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7479 | 16 | "DATA transfer 3 for this transaction is in this frame", HFILL } |
7480 | 16 | }, |
7481 | 16 | { &hf_nvmeof_data_tr[4], |
7482 | 16 | { "DATA Transfer 4", "nvme.fabrics.data_tr4", |
7483 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7484 | 16 | "DATA transfer 4 for this transaction is in this frame", HFILL } |
7485 | 16 | }, |
7486 | 16 | { &hf_nvmeof_data_tr[5], |
7487 | 16 | { "DATA Transfer 5", "nvme.fabrics.data_tr5", |
7488 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7489 | 16 | "DATA transfer 5 for this transaction is in this frame", HFILL } |
7490 | 16 | }, |
7491 | 16 | { &hf_nvmeof_data_tr[6], |
7492 | 16 | { "DATA Transfer 6", "nvme.fabrics.data_tr6", |
7493 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7494 | 16 | "DATA transfer 6 for this transaction is in this frame", HFILL } |
7495 | 16 | }, |
7496 | 16 | { &hf_nvmeof_data_tr[7], |
7497 | 16 | { "DATA Transfer 7", "nvme.fabrics.data_tr7", |
7498 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7499 | 16 | "DATA transfer 7 for this transaction is in this frame", HFILL } |
7500 | 16 | }, |
7501 | 16 | { &hf_nvmeof_data_tr[8], |
7502 | 16 | { "DATA Transfer 8", "nvme.fabrics.data_tr8", |
7503 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7504 | 16 | "DATA transfer 8 for this transaction is in this frame", HFILL } |
7505 | 16 | }, |
7506 | 16 | { &hf_nvmeof_data_tr[9], |
7507 | 16 | { "DATA Transfer 9", "nvme.fabrics.data_tr9", |
7508 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7509 | 16 | "DATA transfer 9 for this transaction is in this frame", HFILL } |
7510 | 16 | }, |
7511 | 16 | { &hf_nvmeof_data_tr[10], |
7512 | 16 | { "DATA Transfer 10", "nvme.fabrics.data_tr10", |
7513 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7514 | 16 | "DATA transfer 10 for this transaction is in this frame", HFILL } |
7515 | 16 | }, |
7516 | 16 | { &hf_nvmeof_data_tr[11], |
7517 | 16 | { "DATA Transfer 11", "nvme.fabrics.data_tr11", |
7518 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7519 | 16 | "DATA transfer 11 for this transaction is in this frame", HFILL } |
7520 | 16 | }, |
7521 | 16 | { &hf_nvmeof_data_tr[12], |
7522 | 16 | { "DATA Transfer 12", "nvme.fabrics.data_tr12", |
7523 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7524 | 16 | "DATA transfer 12 for this transaction is in this frame", HFILL } |
7525 | 16 | }, |
7526 | 16 | { &hf_nvmeof_data_tr[13], |
7527 | 16 | { "DATA Transfer 13", "nvme.fabrics.data_tr13", |
7528 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7529 | 16 | "DATA transfer 13 for this transaction is in this frame", HFILL } |
7530 | 16 | }, |
7531 | 16 | { &hf_nvmeof_data_tr[14], |
7532 | 16 | { "DATA Transfer 14", "nvme.fabrics.data_tr14", |
7533 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7534 | 16 | "DATA transfer 14 for this transaction is in this frame", HFILL } |
7535 | 16 | }, |
7536 | 16 | { &hf_nvmeof_data_tr[15], |
7537 | 16 | { "DATA Transfer 15", "nvme.fabrics.data_tr15", |
7538 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
7539 | 16 | "DATA transfer 15 for this transaction is in this frame", HFILL } |
7540 | 16 | }, |
7541 | 16 | { &hf_nvmeof_cmd_latency, |
7542 | 16 | { "Cmd Latency", "nvme.fabrics.cmd_latency", |
7543 | 16 | FT_DOUBLE, BASE_NONE, NULL, 0x0, |
7544 | 16 | "The time between the command and completion, in usec", HFILL } |
7545 | 16 | }, |
7546 | | /* NVMe Command fields */ |
7547 | 16 | { &hf_nvme_cmd_opc, |
7548 | 16 | { "Opcode", "nvme.cmd.opc", |
7549 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7550 | 16 | }, |
7551 | 16 | { &hf_nvme_cmd_fuse_op, |
7552 | 16 | { "Fuse Operation", "nvme.cmd.fuse_op", |
7553 | 16 | FT_UINT8, BASE_HEX, NULL, 0x3, NULL, HFILL} |
7554 | 16 | }, |
7555 | 16 | { &hf_nvme_cmd_rsvd, |
7556 | 16 | { "Reserved", "nvme.cmd.rsvd", |
7557 | 16 | FT_UINT8, BASE_HEX, NULL, 0x3c, NULL, HFILL} |
7558 | 16 | }, |
7559 | 16 | { &hf_nvme_cmd_psdt, |
7560 | 16 | { "PRP Or SGL", "nvme.cmd.psdt", |
7561 | 16 | FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL} |
7562 | 16 | }, |
7563 | 16 | { &hf_nvme_cmd_cid, |
7564 | 16 | { "Command ID", "nvme.cmd.cid", |
7565 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7566 | 16 | }, |
7567 | 16 | { &hf_nvme_cmd_nsid, |
7568 | 16 | { "Namespace Id", "nvme.cmd.nsid", |
7569 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7570 | 16 | }, |
7571 | 16 | { &hf_nvme_cmd_rsvd1, |
7572 | 16 | { "Reserved", "nvme.cmd.rsvd1", |
7573 | 16 | FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL} |
7574 | 16 | }, |
7575 | 16 | { &hf_nvme_cmd_mptr, |
7576 | 16 | { "Metadata Pointer", "nvme.cmd.mptr", |
7577 | 16 | FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} |
7578 | 16 | }, |
7579 | 16 | { &hf_nvme_cmd_sgl, |
7580 | 16 | { "SGL1", "nvme.cmd.sgl1", |
7581 | 16 | FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL} |
7582 | 16 | }, |
7583 | 16 | { &hf_nvme_cmd_sgl_desc_sub_type, |
7584 | 16 | { "Descriptor Sub Type", "nvme.cmd.sgl.subtype", |
7585 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL} |
7586 | 16 | }, |
7587 | 16 | { &hf_nvme_cmd_sgl_desc_type, |
7588 | 16 | { "Descriptor Type", "nvme.cmd.sgl.type", |
7589 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
7590 | 16 | }, |
7591 | 16 | { &hf_nvme_cmd_sgl_desc_addr, |
7592 | 16 | { "Address", "nvme.cmd.sgl1.addr", |
7593 | 16 | FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} |
7594 | 16 | }, |
7595 | 16 | { &hf_nvme_cmd_sgl_desc_addr_rsvd, |
7596 | 16 | { "Reserved", "nvme.cmd.sgl1.addr_rsvd", |
7597 | 16 | FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} |
7598 | 16 | }, |
7599 | 16 | { &hf_nvme_cmd_sgl_desc_len, |
7600 | 16 | { "Length", "nvme.cmd.sgl1.len", |
7601 | 16 | FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL} |
7602 | 16 | }, |
7603 | 16 | { &hf_nvme_cmd_sgl_desc_key, |
7604 | 16 | { "Key", "nvme.cmd.sgl1.key", |
7605 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7606 | 16 | }, |
7607 | 16 | { &hf_nvme_cmd_sgl_desc_rsvd, |
7608 | 16 | { "Reserved", "nvme.cmd.sgl1.rsvd", |
7609 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7610 | 16 | }, |
7611 | 16 | { &hf_nvme_cmd_dword10, |
7612 | 16 | { "DWORD10", "nvme.cmd.dword10", |
7613 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7614 | 16 | }, |
7615 | 16 | { &hf_nvme_cmd_dword11, |
7616 | 16 | { "DWORD11", "nvme.cmd.dword11", |
7617 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7618 | 16 | }, |
7619 | 16 | { &hf_nvme_cmd_dword12, |
7620 | 16 | { "DWORD12", "nvme.cmd.dword12", |
7621 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7622 | 16 | }, |
7623 | 16 | { &hf_nvme_cmd_dword13, |
7624 | 16 | { "DWORD13", "nvme.cmd.dword13", |
7625 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7626 | 16 | }, |
7627 | 16 | { &hf_nvme_cmd_dword14, |
7628 | 16 | { "DWORD14", "nvme.cmd.dword14", |
7629 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7630 | 16 | }, |
7631 | 16 | { &hf_nvme_cmd_dword15, |
7632 | 16 | { "DWORD15", "nvme.cmd.dword15", |
7633 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
7634 | 16 | }, |
7635 | 16 | { &hf_nvme_cmd_slba, |
7636 | 16 | { "Start LBA", "nvme.cmd.slba", |
7637 | 16 | FT_UINT64, BASE_HEX, NULL, 0, NULL, HFILL} |
7638 | 16 | }, |
7639 | 16 | { &hf_nvme_cmd_nlb, |
7640 | 16 | { "Absolute Number of Logical Blocks", "nvme.cmd.nlb", |
7641 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0, NULL, HFILL} |
7642 | 16 | }, |
7643 | 16 | { &hf_nvme_cmd_rsvd2, |
7644 | 16 | { "Reserved", "nvme.cmd.rsvd2", |
7645 | 16 | FT_UINT16, BASE_HEX, NULL, 0x03ff, NULL, HFILL} |
7646 | 16 | }, |
7647 | 16 | { &hf_nvme_cmd_prinfo, |
7648 | 16 | { "Protection info fields", |
7649 | 16 | "nvme.cmd.prinfo", |
7650 | 16 | FT_UINT16, BASE_HEX, NULL, 0x3c00, NULL, HFILL} |
7651 | 16 | }, |
7652 | 16 | { &hf_nvme_cmd_prinfo_prchk_lbrtag, |
7653 | 16 | { "check Logical block reference tag", |
7654 | 16 | "nvme.cmd.prinfo.lbrtag", |
7655 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0400, NULL, HFILL} |
7656 | 16 | }, |
7657 | 16 | { &hf_nvme_cmd_prinfo_prchk_apptag, |
7658 | 16 | { "check application tag field", |
7659 | 16 | "nvme.cmd.prinfo.apptag", |
7660 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0800, NULL, HFILL} |
7661 | 16 | }, |
7662 | 16 | { &hf_nvme_cmd_prinfo_prchk_guard, |
7663 | 16 | { "check guard field", |
7664 | 16 | "nvme.cmd.prinfo.guard", |
7665 | 16 | FT_UINT16, BASE_HEX, NULL, 0x1000, NULL, HFILL} |
7666 | 16 | }, |
7667 | 16 | { &hf_nvme_cmd_prinfo_pract, |
7668 | 16 | { "action", |
7669 | 16 | "nvme.cmd.prinfo.action", |
7670 | 16 | FT_UINT16, BASE_HEX, NULL, 0x2000, NULL, HFILL} |
7671 | 16 | }, |
7672 | 16 | { &hf_nvme_cmd_fua, |
7673 | 16 | { "Force Unit Access", "nvme.cmd.fua", |
7674 | 16 | FT_UINT16, BASE_HEX, NULL, 0x4000, NULL, HFILL} |
7675 | 16 | }, |
7676 | 16 | { &hf_nvme_cmd_lr, |
7677 | 16 | { "Limited Retry", "nvme.cmd.lr", |
7678 | 16 | FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL} |
7679 | 16 | }, |
7680 | 16 | { &hf_nvme_cmd_eilbrt, |
7681 | 16 | { "Expected Initial Logical Block Reference Tag", "nvme.cmd.eilbrt", |
7682 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7683 | 16 | }, |
7684 | 16 | { &hf_nvme_cmd_elbat, |
7685 | 16 | { "Expected Logical Block Application Tag Mask", "nvme.cmd.elbat", |
7686 | 16 | FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL} |
7687 | 16 | }, |
7688 | 16 | { &hf_nvme_cmd_elbatm, |
7689 | 16 | { "Expected Logical Block Application Tag", "nvme.cmd.elbatm", |
7690 | 16 | FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL} |
7691 | 16 | }, |
7692 | 16 | { &hf_nvme_cmd_dsm, |
7693 | 16 | { "DSM Flags", "nvme.cmd.dsm", |
7694 | 16 | FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL} |
7695 | 16 | }, |
7696 | 16 | { &hf_nvme_cmd_dsm_access_freq, |
7697 | 16 | { "Access frequency", "nvme.cmd.dsm.access_freq", |
7698 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL} |
7699 | 16 | }, |
7700 | 16 | { &hf_nvme_cmd_dsm_access_lat, |
7701 | 16 | { "Access latency", "nvme.cmd.dsm.access_lat", |
7702 | 16 | FT_UINT8, BASE_HEX, NULL, 0x30, NULL, HFILL} |
7703 | 16 | }, |
7704 | 16 | { &hf_nvme_cmd_dsm_seq_req, |
7705 | 16 | { "Sequential Request", "nvme.cmd.dsm.seq_req", |
7706 | 16 | FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL} |
7707 | 16 | }, |
7708 | 16 | { &hf_nvme_cmd_dsm_incompressible, |
7709 | 16 | { "Incompressible", "nvme.cmd.dsm.incompressible", |
7710 | 16 | FT_UINT8, BASE_HEX, NULL, 0x40, NULL, HFILL} |
7711 | 16 | }, |
7712 | 16 | { &hf_nvme_cmd_rsvd3 , |
7713 | 16 | { "Reserved", "nvme.cmd.rsvd3", |
7714 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
7715 | 16 | }, |
7716 | 16 | { &hf_nvme_identify_dword10[0], |
7717 | 16 | { "DWORD10", "nvme.cmd.identify.dword10", |
7718 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7719 | 16 | }, |
7720 | 16 | { &hf_nvme_identify_dword10[1], |
7721 | 16 | { "Controller or Namespace Structure (CNS)", "nvme.cmd.identify.dword10.cns", |
7722 | 16 | FT_UINT32, BASE_HEX, VALS(cns_table), 0xff, NULL, HFILL} |
7723 | 16 | }, |
7724 | 16 | { &hf_nvme_identify_dword10[2], |
7725 | 16 | { "Reserved", "nvme.cmd.identify.dword10.rsvd", |
7726 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL} |
7727 | 16 | }, |
7728 | 16 | { &hf_nvme_identify_dword10[3], |
7729 | 16 | { "Controller Identifier (CNTID)", "nvme.cmd.identify.dword10.cntid", |
7730 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
7731 | 16 | }, |
7732 | 16 | { &hf_nvme_identify_dword11[0], |
7733 | 16 | { "DWORD11", "nvme.cmd.identify.dword11", |
7734 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7735 | 16 | }, |
7736 | 16 | { &hf_nvme_identify_dword11[1], |
7737 | 16 | { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.dwrod11.nvmesetid", |
7738 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
7739 | 16 | }, |
7740 | | /* NVMe Base 2.3 Figure 324: Reserved is 23:16, CSI is 31:24. */ |
7741 | 16 | { &hf_nvme_identify_dword11[2], |
7742 | 16 | { "Reserved", "nvme.cmd.identify.dword11.rsvd", |
7743 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00ff0000, NULL, HFILL} |
7744 | 16 | }, |
7745 | 16 | { &hf_nvme_identify_dword11[3], |
7746 | 16 | { "Command Set Identifier (CSI)", "nvme.cmd.identify.dword11.csi", |
7747 | 16 | FT_UINT32, BASE_HEX, VALS(csi_tbl), 0xff000000, NULL, HFILL} |
7748 | 16 | }, |
7749 | 16 | { &hf_nvme_identify_dword14[0], |
7750 | 16 | { "DWORD14", "nvme.cmd.identify.dword14", |
7751 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7752 | 16 | }, |
7753 | 16 | { &hf_nvme_identify_dword14[1], |
7754 | 16 | { "UUID Index", "nvme.cmd.identify.dword14.uuid_index", |
7755 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
7756 | 16 | }, |
7757 | 16 | { &hf_nvme_identify_dword14[2], |
7758 | 16 | { "Reserved", "nvme.cmd.identify.dword14.rsvd", |
7759 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL} |
7760 | 16 | }, |
7761 | | /* get log page */ |
7762 | 16 | { &hf_nvme_get_logpage_dword10[0], |
7763 | 16 | { "DWORD 10", "nvme.cmd.get_logpage.dword10", |
7764 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7765 | 16 | }, |
7766 | 16 | { &hf_nvme_get_logpage_dword10[1], |
7767 | 16 | { "Log Page Identifier (LID)", "nvme.cmd.get_logpage.dword10.id", |
7768 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff, NULL, HFILL} |
7769 | 16 | }, |
7770 | 16 | { &hf_nvme_get_logpage_dword10[2], |
7771 | 16 | { "Log Specific Field (LSP)", "nvme.cmd.get_logpage.dword10.lsp", |
7772 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7f00, NULL, HFILL} |
7773 | 16 | }, |
7774 | 16 | { &hf_nvme_get_logpage_dword10[3], |
7775 | 16 | { "Retain Asynchronous Event (RAE)", "nvme.cmd.get_logpage.dword10.rae", |
7776 | 16 | FT_BOOLEAN, 32, NULL, 0x8000, NULL, HFILL} |
7777 | 16 | }, |
7778 | 16 | { &hf_nvme_get_logpage_dword10[4], |
7779 | 16 | { "Number of Dwords Lower (NUMDL)", "nvme.cmd.get_logpage.dword10.numdl", |
7780 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
7781 | 16 | }, |
7782 | 16 | { &hf_nvme_get_logpage_numd, |
7783 | 16 | { "Number of Dwords", "nvme.cmd.get_logpage.numd", |
7784 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
7785 | 16 | }, |
7786 | 16 | { &hf_nvme_get_logpage_dword11[0], |
7787 | 16 | { "DWORD 11", "nvme.cmd.get_logpage.dword11", |
7788 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7789 | 16 | }, |
7790 | 16 | { &hf_nvme_get_logpage_dword11[1], |
7791 | 16 | { "Number of Dwords Upper (NUMDU)", "nvme.cmd.get_logpage.dword11.numdu", |
7792 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
7793 | 16 | }, |
7794 | 16 | { &hf_nvme_get_logpage_dword11[2], |
7795 | 16 | { "Log Specific Identifier", "nvme.cmd.get_logpage.dword11.lsi", |
7796 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
7797 | 16 | }, |
7798 | 16 | { &hf_nvme_get_logpage_lpo, |
7799 | 16 | { "Log Page Offset (DWORD 12 and DWORD 13)", "nvme.cmd.get_logpage.lpo", |
7800 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
7801 | 16 | }, |
7802 | 16 | { &hf_nvme_get_logpage_dword14[0], |
7803 | 16 | { "DWORD 14", "nvme.cmd.get_logpage.dword14", |
7804 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7805 | 16 | }, |
7806 | | /* NVMe Base 2.3 Figure 205: UIDX is 06:00, Reserved 22:07, Offset Type |
7807 | | * bit 23, CSI 31:24. */ |
7808 | 16 | { &hf_nvme_get_logpage_dword14[1], |
7809 | 16 | { "UUID Index", "nvme.cmd.identify.get_logpage.dword14.uuid_index", |
7810 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
7811 | 16 | }, |
7812 | 16 | { &hf_nvme_get_logpage_dword14[2], |
7813 | 16 | { "Reserved", "nvme.cmd.identify.get_logpage.dword14.rsvd", |
7814 | 16 | FT_UINT32, BASE_HEX, NULL, 0x007fff80, NULL, HFILL} |
7815 | 16 | }, |
7816 | 16 | { &hf_nvme_get_logpage_dword14[3], |
7817 | 16 | { "Offset Type (OT)", "nvme.cmd.get_logpage.dword14.ot", |
7818 | 16 | FT_BOOLEAN, 32, NULL, 0x00800000, NULL, HFILL} |
7819 | 16 | }, |
7820 | 16 | { &hf_nvme_get_logpage_dword14[4], |
7821 | 16 | { "Command Set Identifier (CSI)", "nvme.cmd.get_logpage.dword14.csi", |
7822 | 16 | FT_UINT32, BASE_HEX, VALS(csi_tbl), 0xff000000, NULL, HFILL} |
7823 | 16 | }, |
7824 | | /* Set Features */ |
7825 | 16 | { &hf_nvme_set_features_dword10[0], |
7826 | 16 | { "DWORD 10", "nvme.cmd.set_features.dword10", |
7827 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7828 | 16 | }, |
7829 | 16 | { &hf_nvme_set_features_dword10[1], |
7830 | 16 | { "Feature Identifier", "nvme.cmd.set_features.dword10.fid", |
7831 | 16 | FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(fid_table), 0xff, NULL, HFILL} |
7832 | 16 | }, |
7833 | 16 | { &hf_nvme_set_features_dword10[2], |
7834 | 16 | { "Reserved", "nvme.cmd.set_features.dword10.rsvd", |
7835 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7fffff00, NULL, HFILL} |
7836 | 16 | }, |
7837 | 16 | { &hf_nvme_set_features_dword10[3], |
7838 | 16 | { "Save", "nvme.cmd.set_features.dword10.sv", |
7839 | 16 | FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL} |
7840 | 16 | }, |
7841 | 16 | { &hf_nvme_set_features_dword14[0], |
7842 | 16 | { "DWORD 14", "nvme.cmd.set_features.dword14", |
7843 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7844 | 16 | }, |
7845 | 16 | { &hf_nvme_set_features_dword14[1], |
7846 | 16 | { "UUID Index", "nvme.cmd.set_features.dword14.uuid", |
7847 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
7848 | 16 | }, |
7849 | 16 | { &hf_nvme_set_features_dword14[2], |
7850 | 16 | { "Reserved", "nvme.cmd.set_features.dword14.rsvd", |
7851 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL} |
7852 | 16 | }, |
7853 | | /* Format NVM – Command Dword 10 */ |
7854 | 16 | { &hf_nvme_format_nvm_dword10[0], |
7855 | 16 | { "DWORD10", "nvme.cmd.format_nvm.dword10", |
7856 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7857 | 16 | }, |
7858 | 16 | { &hf_nvme_format_nvm_dword10[1], |
7859 | 16 | { "LBA Format Lower (LBAFL)", "nvme.cmd.format_nvm.dword10.lbafl", |
7860 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000000f, NULL, HFILL} |
7861 | 16 | }, |
7862 | 16 | { &hf_nvme_format_nvm_dword10[2], |
7863 | 16 | { "Metadata Settings (MSET)", "nvme.cmd.format_nvm.dword10.mset", |
7864 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000010, NULL, HFILL} |
7865 | 16 | }, |
7866 | 16 | { &hf_nvme_format_nvm_dword10[3], |
7867 | 16 | { "Protection Information (PI)", "nvme.cmd.format_nvm.dword10.pi", |
7868 | 16 | FT_UINT32, BASE_HEX, NULL, 0x000000e0, NULL, HFILL} |
7869 | 16 | }, |
7870 | 16 | { &hf_nvme_format_nvm_dword10[4], |
7871 | 16 | { "Protection Information Location (PIL)", "nvme.cmd.format_nvm.dword10.pil", |
7872 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL} |
7873 | 16 | }, |
7874 | 16 | { &hf_nvme_format_nvm_dword10[5], |
7875 | 16 | { "Secure Erase Settings (SES)", "nvme.cmd.format_nvm.dword10.ses", |
7876 | 16 | FT_UINT32, BASE_HEX, VALS(fmt_nvm_ses_tbl), 0x00000e00, NULL, HFILL} |
7877 | 16 | }, |
7878 | 16 | { &hf_nvme_format_nvm_dword10[6], |
7879 | 16 | { "LBA Format Upper (LBAFU)", "nvme.cmd.format_nvm.dword10.lbafu", |
7880 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00003000, NULL, HFILL} |
7881 | 16 | }, |
7882 | 16 | { &hf_nvme_format_nvm_dword10[7], |
7883 | 16 | { "Reserved", "nvme.cmd.format_nvm.dword10.rsvd", |
7884 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffc000, NULL, HFILL} |
7885 | 16 | }, |
7886 | | /* Firmware Commit – Command Dword 10 */ |
7887 | 16 | { &hf_nvme_fw_commit_dword10[0], |
7888 | 16 | { "DWORD10", "nvme.cmd.fw_commit.dword10", |
7889 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7890 | 16 | }, |
7891 | 16 | { &hf_nvme_fw_commit_dword10[1], |
7892 | 16 | { "Firmware Slot (FS)", "nvme.cmd.fw_commit.dword10.fs", |
7893 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000007, NULL, HFILL} |
7894 | 16 | }, |
7895 | 16 | { &hf_nvme_fw_commit_dword10[2], |
7896 | 16 | { "Commit Action (CA)", "nvme.cmd.fw_commit.dword10.ca", |
7897 | 16 | FT_UINT32, BASE_HEX, VALS(fw_commit_ca_tbl), 0x00000038, NULL, HFILL} |
7898 | 16 | }, |
7899 | 16 | { &hf_nvme_fw_commit_dword10[3], |
7900 | 16 | { "Reserved", "nvme.cmd.fw_commit.dword10.rsvd", |
7901 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7fffffc0, NULL, HFILL} |
7902 | 16 | }, |
7903 | 16 | { &hf_nvme_fw_commit_dword10[4], |
7904 | 16 | { "Boot Partition ID (BPID)", "nvme.cmd.fw_commit.dword10.bpid", |
7905 | 16 | FT_UINT32, BASE_HEX, NULL, 0x80000000, NULL, HFILL} |
7906 | 16 | }, |
7907 | | /* Firmware Image Download – Command Dwords 10/11 */ |
7908 | 16 | { &hf_nvme_fw_download_numd, |
7909 | 16 | { "Number of Dwords (NUMD)", "nvme.cmd.fw_download.numd", |
7910 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
7911 | 16 | "Number of dwords to transfer, a 0's based value", HFILL} |
7912 | 16 | }, |
7913 | 16 | { &hf_nvme_fw_download_ofst, |
7914 | 16 | { "Offset (OFST)", "nvme.cmd.fw_download.ofst", |
7915 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, |
7916 | 16 | "Dword offset from the start of the firmware image", HFILL} |
7917 | 16 | }, |
7918 | | /* Device Self-test – Command Dword 10 */ |
7919 | 16 | { &hf_nvme_self_test_dword10[0], |
7920 | 16 | { "DWORD10", "nvme.cmd.self_test.dword10", |
7921 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7922 | 16 | }, |
7923 | 16 | { &hf_nvme_self_test_dword10[1], |
7924 | 16 | { "Self-test Code (STC)", "nvme.cmd.self_test.dword10.stc", |
7925 | 16 | FT_UINT32, BASE_HEX, VALS(self_test_stc_tbl), 0x0000000f, NULL, HFILL} |
7926 | 16 | }, |
7927 | 16 | { &hf_nvme_self_test_dword10[2], |
7928 | 16 | { "Reserved", "nvme.cmd.self_test.dword10.rsvd", |
7929 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL} |
7930 | 16 | }, |
7931 | | /* Lockdown – Command Dword 10 */ |
7932 | 16 | { &hf_nvme_lockdown_dword10[0], |
7933 | 16 | { "DWORD10", "nvme.cmd.lockdown.dword10", |
7934 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7935 | 16 | }, |
7936 | 16 | { &hf_nvme_lockdown_dword10[1], |
7937 | 16 | { "Scope (SCP)", "nvme.cmd.lockdown.dword10.scp", |
7938 | 16 | FT_UINT32, BASE_HEX, VALS(lockdown_scp_tbl), 0x0000000f, NULL, HFILL} |
7939 | 16 | }, |
7940 | 16 | { &hf_nvme_lockdown_dword10[2], |
7941 | 16 | { "Prohibit (PRHBT)", "nvme.cmd.lockdown.dword10.prhbt", |
7942 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000010, NULL, HFILL} |
7943 | 16 | }, |
7944 | 16 | { &hf_nvme_lockdown_dword10[3], |
7945 | 16 | { "Interface (IFC)", "nvme.cmd.lockdown.dword10.ifc", |
7946 | 16 | FT_UINT32, BASE_HEX, VALS(lockdown_ifc_tbl), 0x00000060, NULL, HFILL} |
7947 | 16 | }, |
7948 | 16 | { &hf_nvme_lockdown_dword10[4], |
7949 | 16 | { "Reserved", "nvme.cmd.lockdown.dword10.rsvd0", |
7950 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000080, NULL, HFILL} |
7951 | 16 | }, |
7952 | 16 | { &hf_nvme_lockdown_dword10[5], |
7953 | 16 | { "Opcode or Feature Identifier (OFI)", "nvme.cmd.lockdown.dword10.ofi", |
7954 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ff00, NULL, HFILL} |
7955 | 16 | }, |
7956 | 16 | { &hf_nvme_lockdown_dword10[6], |
7957 | 16 | { "Reserved", "nvme.cmd.lockdown.dword10.rsvd1", |
7958 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
7959 | 16 | }, |
7960 | | /* Lockdown – Command Dword 14 */ |
7961 | 16 | { &hf_nvme_lockdown_dword14[0], |
7962 | 16 | { "DWORD14", "nvme.cmd.lockdown.dword14", |
7963 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7964 | 16 | }, |
7965 | 16 | { &hf_nvme_lockdown_dword14[1], |
7966 | 16 | { "UUID Index (UIDX)", "nvme.cmd.lockdown.dword14.uidx", |
7967 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000007f, NULL, HFILL} |
7968 | 16 | }, |
7969 | 16 | { &hf_nvme_lockdown_dword14[2], |
7970 | 16 | { "Reserved", "nvme.cmd.lockdown.dword14.rsvd", |
7971 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL} |
7972 | 16 | }, |
7973 | | /* Sanitize – Command Dwords 10/11 */ |
7974 | 16 | { &hf_nvme_sanitize_dword10[0], |
7975 | 16 | { "DWORD10", "nvme.cmd.sanitize.dword10", |
7976 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
7977 | 16 | }, |
7978 | 16 | { &hf_nvme_sanitize_dword10[1], |
7979 | 16 | { "Sanitize Action (SANACT)", "nvme.cmd.sanitize.dword10.sanact", |
7980 | 16 | FT_UINT32, BASE_HEX, VALS(sanitize_act_tbl), 0x00000007, NULL, HFILL} |
7981 | 16 | }, |
7982 | 16 | { &hf_nvme_sanitize_dword10[2], |
7983 | 16 | { "Allow Unrestricted Sanitize Exit (AUSE)", "nvme.cmd.sanitize.dword10.ause", |
7984 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000008, NULL, HFILL} |
7985 | 16 | }, |
7986 | 16 | { &hf_nvme_sanitize_dword10[3], |
7987 | 16 | { "Overwrite Pass Count (OWPASS)", "nvme.cmd.sanitize.dword10.owpass", |
7988 | 16 | FT_UINT32, BASE_HEX, NULL, 0x000000f0, NULL, HFILL} |
7989 | 16 | }, |
7990 | 16 | { &hf_nvme_sanitize_dword10[4], |
7991 | 16 | { "Overwrite Invert Pattern Between Passes (OIPBP)", "nvme.cmd.sanitize.dword10.oipbp", |
7992 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000100, NULL, HFILL} |
7993 | 16 | }, |
7994 | 16 | { &hf_nvme_sanitize_dword10[5], |
7995 | 16 | { "No-Deallocate After Sanitize (NDAS)", "nvme.cmd.sanitize.dword10.ndas", |
7996 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000200, NULL, HFILL} |
7997 | 16 | }, |
7998 | 16 | { &hf_nvme_sanitize_dword10[6], |
7999 | 16 | { "Enter Media Verification State (EMVS)", "nvme.cmd.sanitize.dword10.emvs", |
8000 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000400, NULL, HFILL} |
8001 | 16 | }, |
8002 | 16 | { &hf_nvme_sanitize_dword10[7], |
8003 | 16 | { "Reserved", "nvme.cmd.sanitize.dword10.rsvd", |
8004 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffff800, NULL, HFILL} |
8005 | 16 | }, |
8006 | 16 | { &hf_nvme_sanitize_ovrpat, |
8007 | 16 | { "Overwrite Pattern (OVRPAT)", "nvme.cmd.sanitize.ovrpat", |
8008 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8009 | 16 | }, |
8010 | | /* Security Send (81h) / Security Receive (82h) */ |
8011 | 16 | { &hf_nvme_security_dword10[0], |
8012 | 16 | { "DWORD10", "nvme.cmd.security.dword10", |
8013 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8014 | 16 | }, |
8015 | 16 | { &hf_nvme_security_dword10[1], |
8016 | 16 | { "Security Protocol (SECP)", "nvme.cmd.security.dword10.secp", |
8017 | 16 | FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(security_secp_tbl), 0xff000000, NULL, HFILL} |
8018 | 16 | }, |
8019 | 16 | { &hf_nvme_security_dword10[2], |
8020 | 16 | { "SP Specific 1 (SPSP1)", "nvme.cmd.security.dword10.spsp1", |
8021 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00ff0000, NULL, HFILL} |
8022 | 16 | }, |
8023 | 16 | { &hf_nvme_security_dword10[3], |
8024 | 16 | { "SP Specific 0 (SPSP0)", "nvme.cmd.security.dword10.spsp0", |
8025 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ff00, NULL, HFILL} |
8026 | 16 | }, |
8027 | 16 | { &hf_nvme_security_dword10[4], |
8028 | 16 | { "NVMe Security Specific Field (NSSF)", "nvme.cmd.security.dword10.nssf", |
8029 | 16 | FT_UINT32, BASE_HEX, NULL, 0x000000ff, NULL, HFILL} |
8030 | 16 | }, |
8031 | 16 | { &hf_nvme_security_send_dword11_tl, |
8032 | 16 | { "Transfer Length (TL)", "nvme.cmd.security_send.dword11.tl", |
8033 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
8034 | 16 | }, |
8035 | 16 | { &hf_nvme_security_recv_dword11_al, |
8036 | 16 | { "Allocation Length (AL)", "nvme.cmd.security_recv.dword11.al", |
8037 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
8038 | 16 | }, |
8039 | 16 | { &hf_nvme_security_data, |
8040 | 16 | { "Security Protocol Data", "nvme.cmd.security.data", |
8041 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8042 | 16 | }, |
8043 | 16 | { &hf_nvme_security_info, |
8044 | 16 | { "Security Protocol Information", "nvme.security.info", |
8045 | 16 | FT_NONE, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8046 | 16 | }, |
8047 | 16 | { &hf_nvme_security_info_rsvd, |
8048 | 16 | { "Reserved", "nvme.security.info.rsvd", |
8049 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8050 | 16 | }, |
8051 | 16 | { &hf_nvme_security_info_list_len, |
8052 | 16 | { "Supported Security Protocol List Length", "nvme.security.info.list_len", |
8053 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
8054 | 16 | }, |
8055 | 16 | { &hf_nvme_security_info_protocol, |
8056 | 16 | { "Supported Security Protocol", "nvme.security.info.protocol", |
8057 | 16 | FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(security_secp_tbl), 0x0, NULL, HFILL} |
8058 | 16 | }, |
8059 | 16 | { &hf_nvme_security_info_cert_len, |
8060 | 16 | { "Certificate Data Length", "nvme.security.info.cert_len", |
8061 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
8062 | 16 | }, |
8063 | 16 | { &hf_nvme_security_info_cert_data, |
8064 | 16 | { "Certificate Data", "nvme.security.info.cert_data", |
8065 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8066 | 16 | }, |
8067 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[0], |
8068 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.arb", |
8069 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8070 | 16 | }, |
8071 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[1], |
8072 | 16 | { "Arbitration Burst", "nvme.cmd.set_features.dword11.arb.ab", |
8073 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL} |
8074 | 16 | }, |
8075 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[2], |
8076 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.arb.rsvd", |
8077 | 16 | FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
8078 | 16 | }, |
8079 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[3], |
8080 | 16 | { "Low Priority Weight", "nvme.cmd.set_features.dword11.arb.lpw", |
8081 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL} |
8082 | 16 | }, |
8083 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[4], |
8084 | 16 | { "Medium Priority Weight", "nvme.cmd.set_features.dword11.arb.mpw", |
8085 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
8086 | 16 | }, |
8087 | 16 | { &hf_nvme_cmd_set_features_dword11_arb[5], |
8088 | 16 | { "High Priority Weight", "nvme.cmd.set_features.dword11.arb.hpw", |
8089 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
8090 | 16 | }, |
8091 | 16 | { &hf_nvme_cmd_set_features_dword11_pm[0], |
8092 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.pm", |
8093 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8094 | 16 | }, |
8095 | 16 | { &hf_nvme_cmd_set_features_dword11_pm[1], |
8096 | 16 | { "Power State", "nvme.cmd.set_features.dword11.pm.ps", |
8097 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL} |
8098 | 16 | }, |
8099 | 16 | { &hf_nvme_cmd_set_features_dword11_pm[2], |
8100 | 16 | { "Work Hint", "nvme.cmd.set_features.dword11.pm.wh", |
8101 | 16 | FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
8102 | 16 | }, |
8103 | 16 | { &hf_nvme_cmd_set_features_dword11_pm[3], |
8104 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.pm.rsvd", |
8105 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL} |
8106 | 16 | }, |
8107 | 16 | { &hf_nvme_cmd_set_features_dword11_lbart[0], |
8108 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.lbart", |
8109 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8110 | 16 | }, |
8111 | 16 | { &hf_nvme_cmd_set_features_dword11_lbart[1], |
8112 | 16 | { "Number of LBA Ranges (NUM)", "nvme.cmd.set_features.dword11.lbart.lbarn", |
8113 | 16 | FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL} |
8114 | 16 | }, |
8115 | 16 | { &hf_nvme_cmd_set_features_dword11_lbart[2], |
8116 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.lbart.rsvd", |
8117 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL} |
8118 | 16 | }, |
8119 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[0], |
8120 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.tt", |
8121 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8122 | 16 | }, |
8123 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[1], |
8124 | 16 | { "Temperature Threshold", "nvme.cmd.set_features.dword11.tt.tmpth", |
8125 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8126 | 16 | }, |
8127 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[2], |
8128 | 16 | { "Threshold Temperature Select", "nvme.cmd.set_features.dword11.tt.tmpsel", |
8129 | 16 | FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL} |
8130 | 16 | }, |
8131 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[3], |
8132 | 16 | { "Threshold Type Select", "nvme.cmd.set_features.dword11.tt.thpsel", |
8133 | 16 | FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL} |
8134 | 16 | }, |
8135 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[4], |
8136 | 16 | { "Temperature Threshold Hysteresis", "nvme.cmd.set_features.dword11.tt.tmpthh", |
8137 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1c00000, NULL, HFILL} |
8138 | 16 | }, |
8139 | 16 | { &hf_nvme_cmd_set_features_dword11_tt[5], |
8140 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.tt.rsvd", |
8141 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfe000000, NULL, HFILL} |
8142 | 16 | }, |
8143 | 16 | { &hf_nvme_cmd_set_features_dword11_erec[0], |
8144 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.erec", |
8145 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8146 | 16 | }, |
8147 | 16 | { &hf_nvme_cmd_set_features_dword11_erec[1], |
8148 | 16 | { "Time Limited Error Recovery (100 ms units)", "nvme.cmd.set_features.dword11.erec.tler", |
8149 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8150 | 16 | }, |
8151 | 16 | { &hf_nvme_cmd_set_features_dword11_erec[2], |
8152 | 16 | { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cmd.set_features.dword11.erec.dulbe", |
8153 | 16 | FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL} |
8154 | 16 | }, |
8155 | 16 | { &hf_nvme_cmd_set_features_dword11_erec[3], |
8156 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.erec.rsvd", |
8157 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL} |
8158 | 16 | }, |
8159 | 16 | { &hf_nvme_cmd_set_features_dword11_vwce[0], |
8160 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.vwce", |
8161 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8162 | 16 | }, |
8163 | 16 | { &hf_nvme_cmd_set_features_dword11_vwce[1], |
8164 | 16 | { "Volatile Write Cache Enable", "nvme.cmd.set_features.dword11.vwce.wce", |
8165 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8166 | 16 | }, |
8167 | 16 | { &hf_nvme_cmd_set_features_dword11_vwce[2], |
8168 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.vwce.rsvd", |
8169 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8170 | 16 | }, |
8171 | 16 | { &hf_nvme_cmd_set_features_dword11_nq[0], |
8172 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.nq", |
8173 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8174 | 16 | }, |
8175 | 16 | { &hf_nvme_cmd_set_features_dword11_nq[1], |
8176 | 16 | { "Number of IO Submission Queues Requested", "nvme.cmd.set_features.dword11.nq.nsqr", |
8177 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL} |
8178 | 16 | }, |
8179 | 16 | { &hf_nvme_cmd_set_features_dword11_nq[2], |
8180 | 16 | { "Number of IO Completion Queues Requested", "nvme.cmd.set_features.dword11.nq.ncqr", |
8181 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL} |
8182 | 16 | }, |
8183 | 16 | { &hf_nvme_cmd_set_features_dword11_irqc[0], |
8184 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.irqc", |
8185 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8186 | 16 | }, |
8187 | 16 | { &hf_nvme_cmd_set_features_dword11_irqc[1], |
8188 | 16 | { "Aggregation Threshold", "nvme.cmd.set_features.dword11.irqc.thr", |
8189 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8190 | 16 | }, |
8191 | 16 | { &hf_nvme_cmd_set_features_dword11_irqc[2], |
8192 | 16 | { "Aggregation Time (100 us units)", "nvme.cmd.set_features.dword11.irqc.time", |
8193 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8194 | 16 | }, |
8195 | 16 | { &hf_nvme_cmd_set_features_dword11_irqv[0], |
8196 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.irqv", |
8197 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8198 | 16 | }, |
8199 | 16 | { &hf_nvme_cmd_set_features_dword11_irqv[1], |
8200 | 16 | { "IRQ Vector", "nvme.cmd.set_features.dword11.irqv.iv", |
8201 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL} |
8202 | 16 | }, |
8203 | 16 | { &hf_nvme_cmd_set_features_dword11_irqv[2], |
8204 | 16 | { "Coalescing Disable", "nvme.cmd.set_features.dword11.irqv.cd", |
8205 | 16 | FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL} |
8206 | 16 | }, |
8207 | 16 | { &hf_nvme_cmd_set_features_dword11_irqv[3], |
8208 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.irqv.rsvd", |
8209 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL} |
8210 | 16 | }, |
8211 | 16 | { &hf_nvme_cmd_set_features_dword11_wan[0], |
8212 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.wan", |
8213 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8214 | 16 | }, |
8215 | 16 | { &hf_nvme_cmd_set_features_dword11_wan[1], |
8216 | 16 | { "Disable Normal", "nvme.cmd.set_features.dword11.wan.dn", |
8217 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8218 | 16 | }, |
8219 | 16 | { &hf_nvme_cmd_set_features_dword11_wan[2], |
8220 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.wan.rsvd", |
8221 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8222 | 16 | }, |
8223 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[0], |
8224 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.aec", |
8225 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8226 | 16 | }, |
8227 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[1], |
8228 | 16 | { "SMART and Health Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.aec.smart", |
8229 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL} |
8230 | 16 | }, |
8231 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[2], |
8232 | 16 | { "Namespace Attribute Notices", "nvme.cmd.set_features.dword11.aec.ns", |
8233 | 16 | FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL} |
8234 | 16 | }, |
8235 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[3], |
8236 | 16 | { "Firmware Activation Notices", "nvme.cmd.set_features.dword11.aec.fwa", |
8237 | 16 | FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL} |
8238 | 16 | }, |
8239 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[4], |
8240 | 16 | { "Telemetry Log Notices", "nvme.cmd.set_features.dword11.aec.tel", |
8241 | 16 | FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL} |
8242 | 16 | }, |
8243 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[5], |
8244 | 16 | { "ANA Change Notices", "nvme.cmd.set_features.dword11.aec.ana", |
8245 | 16 | FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL} |
8246 | 16 | }, |
8247 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[6], |
8248 | 16 | { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.plat", |
8249 | 16 | FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL} |
8250 | 16 | }, |
8251 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[7], |
8252 | 16 | { "LBA Status Information Notices", "nvme.cmd.set_features.dword11.aec.lba", |
8253 | 16 | FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL} |
8254 | 16 | }, |
8255 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[8], |
8256 | 16 | { "Endurance Group Event Aggregate Log Change Notices", "nvme.cmd.set_features.dword11.aec.eg", |
8257 | 16 | FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL} |
8258 | 16 | }, |
8259 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[9], |
8260 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.aec.rsvd", |
8261 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL} |
8262 | 16 | }, |
8263 | 16 | { &hf_nvme_cmd_set_features_dword11_aec[10], |
8264 | 16 | { "Discovery Log Page Change Notification", "nvme.cmd.set_features.dword11.aec.disc", |
8265 | 16 | FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL} |
8266 | 16 | }, |
8267 | 16 | { &hf_nvme_cmd_set_features_dword11_apst[0], |
8268 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.apst", |
8269 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8270 | 16 | }, |
8271 | 16 | { &hf_nvme_cmd_set_features_dword11_apst[1], |
8272 | 16 | { "Autonomous Power State Transition Enable", "nvme.cmd.set_features.dword11.apst.apste", |
8273 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8274 | 16 | }, |
8275 | 16 | { &hf_nvme_cmd_set_features_dword11_apst[2], |
8276 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.apst.rsvd", |
8277 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8278 | 16 | }, |
8279 | 16 | { &hf_nvme_cmd_set_features_dword11_kat[0], |
8280 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.kat", |
8281 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8282 | 16 | }, |
8283 | 16 | { &hf_nvme_cmd_set_features_dword11_kat[1], |
8284 | 16 | { "Keep Alive Timeout", "nvme.cmd.set_features.dword11.kat.kato", |
8285 | 16 | FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL} |
8286 | 16 | }, |
8287 | 16 | { &hf_nvme_cmd_set_features_dword11_hctm[0], |
8288 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.hctm", |
8289 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8290 | 16 | }, |
8291 | 16 | { &hf_nvme_cmd_set_features_dword11_hctm[1], |
8292 | 16 | { "Thermal Management Temperature 2 (K)", "nvme.cmd.set_features.dword11.hctm.tmt2", |
8293 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL} |
8294 | 16 | }, |
8295 | 16 | { &hf_nvme_cmd_set_features_dword11_hctm[2], |
8296 | 16 | { "Thermal Management Temperature 1 (K)", "nvme.cmd.set_features.dword11.hctm.tmt1", |
8297 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8298 | 16 | }, |
8299 | 16 | { &hf_nvme_cmd_set_features_dword11_nops[0], |
8300 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.nops", |
8301 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8302 | 16 | }, |
8303 | 16 | { &hf_nvme_cmd_set_features_dword11_nops[1], |
8304 | 16 | { "Non-Operational Power State Permissive Mode Enable", "nvme.cmd.set_features.dword11.nops.noppme", |
8305 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
8306 | 16 | }, |
8307 | 16 | { &hf_nvme_cmd_set_features_dword11_nops[2], |
8308 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.nops.rsvd", |
8309 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8310 | 16 | }, |
8311 | 16 | { &hf_nvme_cmd_set_features_dword11_rrl[0], |
8312 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.rrl", |
8313 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8314 | 16 | }, |
8315 | 16 | { &hf_nvme_cmd_set_features_dword11_rrl[1], |
8316 | 16 | { "NVM Set Identifier", "nvme.cmd.set_features.dword11.rrl.nvmsetid", |
8317 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8318 | 16 | }, |
8319 | 16 | { &hf_nvme_cmd_set_features_dword11_rrl[2], |
8320 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.rrl.rsvd", |
8321 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8322 | 16 | }, |
8323 | 16 | { &hf_nvme_cmd_set_features_dword12_rrl[0], |
8324 | 16 | { "DWORD12", "nvme.cmd.set_features.dword12.rrl", |
8325 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8326 | 16 | }, |
8327 | 16 | { &hf_nvme_cmd_set_features_dword12_rrl[1], |
8328 | 16 | { "Read Recovery Level", "nvme.cmd.set_features.dword12.rrl.rrl", |
8329 | 16 | FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL} |
8330 | 16 | }, |
8331 | 16 | { &hf_nvme_cmd_set_features_dword12_rrl[2], |
8332 | 16 | { "Reserved", "nvme.cmd.set_features.dword12.rrl.rsvd", |
8333 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL} |
8334 | 16 | }, |
8335 | 16 | { &hf_nvme_cmd_set_features_dword11_plmc[0], |
8336 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.plmc", |
8337 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8338 | 16 | }, |
8339 | 16 | { &hf_nvme_cmd_set_features_dword11_plmc[1], |
8340 | 16 | { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmc.nvmsetid", |
8341 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8342 | 16 | }, |
8343 | 16 | { &hf_nvme_cmd_set_features_dword11_plmc[2], |
8344 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.plmc.rsvd", |
8345 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8346 | 16 | }, |
8347 | 16 | { &hf_nvme_cmd_set_features_dword12_plmc[0], |
8348 | 16 | { "DWORD12", "nvme.cmd.set_features.dword12.plmc", |
8349 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8350 | 16 | }, |
8351 | 16 | { &hf_nvme_cmd_set_features_dword12_plmc[1], |
8352 | 16 | { "Predictable Latency Enable", "nvme.cmd.set_features.dword12.plmc.ple", |
8353 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8354 | 16 | }, |
8355 | 16 | { &hf_nvme_cmd_set_features_dword12_plmc[2], |
8356 | 16 | { "Reserved", "nvme.cmd.set_features.dword12.plmc.rsvd", |
8357 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8358 | 16 | }, |
8359 | 16 | { &hf_nvme_cmd_set_features_dword11_plmw[0], |
8360 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.plmw", |
8361 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8362 | 16 | }, |
8363 | 16 | { &hf_nvme_cmd_set_features_dword11_plmw[1], |
8364 | 16 | { "NVM Set Identifier", "nvme.cmd.set_features.dword11.plmw.nvmsetid", |
8365 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8366 | 16 | }, |
8367 | 16 | { &hf_nvme_cmd_set_features_dword11_plmw[2], |
8368 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.plmw.rsvd", |
8369 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8370 | 16 | }, |
8371 | 16 | { &hf_nvme_cmd_set_features_dword12_plmw[0], |
8372 | 16 | { "DWORD12", "nvme.cmd.set_features.dword12.plmw", |
8373 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8374 | 16 | }, |
8375 | 16 | { &hf_nvme_cmd_set_features_dword12_plmw[1], |
8376 | 16 | { "Window Select (WSEL)", "nvme.cmd.set_features.dword12.plmw.ws", |
8377 | 16 | FT_UINT32, BASE_HEX, VALS(sf_ws_table), 0x7, NULL, HFILL} |
8378 | 16 | }, |
8379 | 16 | { &hf_nvme_cmd_set_features_dword12_plmw[2], |
8380 | 16 | { "Reserved", "nvme.cmd.set_features.dword12.plmw.rsvd", |
8381 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL} |
8382 | 16 | }, |
8383 | 16 | { &hf_nvme_cmd_set_features_dword11_lbasi[0], |
8384 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.lbasi", |
8385 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8386 | 16 | }, |
8387 | 16 | { &hf_nvme_cmd_set_features_dword11_lbasi[1], |
8388 | 16 | { "LBA Status Information Report Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsiri", |
8389 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8390 | 16 | }, |
8391 | 16 | { &hf_nvme_cmd_set_features_dword11_lbasi[2], |
8392 | 16 | { "LBA Status Information Poll Interval (100 ms)", "nvme.cmd.set_features.dword11.lbasi.lsipi", |
8393 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8394 | 16 | }, |
8395 | 16 | { &hf_nvme_cmd_set_features_dword11_san[0], |
8396 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.san", |
8397 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8398 | 16 | }, |
8399 | 16 | { &hf_nvme_cmd_set_features_dword11_san[1], |
8400 | 16 | { "No-Deallocate Response Mode", "nvme.cmd.set_features.dword11.san.nodrm", |
8401 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8402 | 16 | }, |
8403 | 16 | { &hf_nvme_cmd_set_features_dword11_san[2], |
8404 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.san.rsvd", |
8405 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8406 | 16 | }, |
8407 | 16 | { &hf_nvme_cmd_set_features_dword11_eg[0], |
8408 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.eg", |
8409 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8410 | 16 | }, |
8411 | 16 | { &hf_nvme_cmd_set_features_dword11_eg[1], |
8412 | 16 | { "Endurance Group Identifier", "nvme.cmd.set_features.dword11.eg.endgid", |
8413 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8414 | 16 | }, |
8415 | 16 | { &hf_nvme_cmd_set_features_dword11_eg[2], |
8416 | 16 | { "Endurance Group Critical Warnings Bitmask", "nvme.cmd.set_features.dword11.eg.egcw", |
8417 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
8418 | 16 | }, |
8419 | 16 | { &hf_nvme_cmd_set_features_dword11_eg[3], |
8420 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.eg.rsvd", |
8421 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
8422 | 16 | }, |
8423 | 16 | { &hf_nvme_cmd_set_features_dword11_swp[0], |
8424 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.swp", |
8425 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8426 | 16 | }, |
8427 | 16 | { &hf_nvme_cmd_set_features_dword11_swp[1], |
8428 | 16 | { "Pre-boot Software Load Count", "nvme.cmd.set_features.dword11.swp.pbslc", |
8429 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL} |
8430 | 16 | }, |
8431 | 16 | { &hf_nvme_cmd_set_features_dword11_swp[2], |
8432 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.swp.rsvd", |
8433 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL} |
8434 | 16 | }, |
8435 | 16 | { &hf_nvme_cmd_set_features_dword11_hid[0], |
8436 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.hid", |
8437 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8438 | 16 | }, |
8439 | 16 | { &hf_nvme_cmd_set_features_dword11_hid[1], |
8440 | 16 | { "Enable Extended Host Identifier", "nvme.cmd.set_features.dword11.hid.exhid", |
8441 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8442 | 16 | }, |
8443 | 16 | { &hf_nvme_cmd_set_features_dword11_hid[2], |
8444 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.hid.rsvd", |
8445 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8446 | 16 | }, |
8447 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[0], |
8448 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.rsrvn", |
8449 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8450 | 16 | }, |
8451 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[1], |
8452 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd0", |
8453 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
8454 | 16 | }, |
8455 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[2], |
8456 | 16 | { "Mask Registration Preempted Notification" , "nvme.cmd.set_features.dword11.rsrvn.regpre", |
8457 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
8458 | 16 | }, |
8459 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[3], |
8460 | 16 | { "Mask Reservation Released Notification", "nvme.cmd.set_features.dword11.rsrvn.resrel", |
8461 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
8462 | 16 | }, |
8463 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[4], |
8464 | 16 | { "Mask Reservation Preempted Notification", "nvme.cmd.set_features.dword11.rsrvn.resrpe", |
8465 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
8466 | 16 | }, |
8467 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvn[5], |
8468 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.rsrvn.rsvd1", |
8469 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL} |
8470 | 16 | }, |
8471 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvp[0], |
8472 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.rsrvp", |
8473 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8474 | 16 | }, |
8475 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvp[1], |
8476 | 16 | { "Persist Through Power Loss", "nvme.cmd.set_features.dword11.rsrvp.ptpl", |
8477 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
8478 | 16 | }, |
8479 | 16 | { &hf_nvme_cmd_set_features_dword11_rsrvp[2], |
8480 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.rsrvp.rsvd", |
8481 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8482 | 16 | }, |
8483 | 16 | { &hf_nvme_cmd_set_features_dword11_nswp[0], |
8484 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.nswp", |
8485 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8486 | 16 | }, |
8487 | 16 | { &hf_nvme_cmd_set_features_dword11_nswp[1], |
8488 | 16 | { "Write Protection State (WPS)", "nvme.cmd.set_features.dword11.nswp.wps", |
8489 | 16 | FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL} |
8490 | 16 | }, |
8491 | 16 | { &hf_nvme_cmd_set_features_dword11_nswp[2], |
8492 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.nswp.rsvd", |
8493 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL} |
8494 | 16 | }, |
8495 | 16 | { &hf_nvme_cmd_set_features_dword11_hmd[0], |
8496 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.hmd", |
8497 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8498 | 16 | }, |
8499 | 16 | { &hf_nvme_cmd_set_features_dword11_hmd[1], |
8500 | 16 | { "Element Action", "nvme.cmd.set_features.dword11.hmd.ea", |
8501 | 16 | FT_UINT32, BASE_HEX, VALS(sf_host_metadata_ea), 0x6000, NULL, HFILL} |
8502 | 16 | }, |
8503 | 16 | { &hf_nvme_cmd_set_features_dword11_hmd[2], |
8504 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.hmd.rsvd", |
8505 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff9fff, NULL, HFILL} |
8506 | 16 | }, |
8507 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[0], |
8508 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.hmb", |
8509 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8510 | 16 | }, |
8511 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[1], |
8512 | 16 | { "Enable Host Memory (EHM)", "nvme.cmd.set_features.dword11.hmb.ehm", |
8513 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
8514 | 16 | }, |
8515 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[2], |
8516 | 16 | { "Memory Return (MR)", "nvme.cmd.set_features.dword11.hmb.mr", |
8517 | 16 | FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL} |
8518 | 16 | }, |
8519 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[3], |
8520 | 16 | { "Host Memory Non-operational Access Restriction Enable (HMNARE)", "nvme.cmd.set_features.dword11.hmb.hmnare", |
8521 | 16 | FT_UINT32, BASE_HEX, NULL, 0x4, NULL, HFILL} |
8522 | 16 | }, |
8523 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[4], |
8524 | 16 | { "Cleared to Zero (CTZ)", "nvme.cmd.set_features.dword11.hmb.ctz", |
8525 | 16 | FT_UINT32, BASE_HEX, NULL, 0x8, NULL, HFILL} |
8526 | 16 | }, |
8527 | 16 | { &hf_nvme_cmd_set_features_dword11_hmb[5], |
8528 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.hmb.rsvd", |
8529 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL} |
8530 | 16 | }, |
8531 | 16 | { &hf_nvme_cmd_set_features_dword11_iocsp[0], |
8532 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.iocsp", |
8533 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8534 | 16 | }, |
8535 | 16 | { &hf_nvme_cmd_set_features_dword11_iocsp[1], |
8536 | 16 | { "I/O Command Set Combination Index (IOCSCI)", "nvme.cmd.set_features.dword11.iocsp.iocsci", |
8537 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1ff, NULL, HFILL} |
8538 | 16 | }, |
8539 | 16 | { &hf_nvme_cmd_set_features_dword11_iocsp[2], |
8540 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.iocsp.rsvd", |
8541 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffe00, NULL, HFILL} |
8542 | 16 | }, |
8543 | 16 | { &hf_nvme_cmd_set_features_dword11_spinup[0], |
8544 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.spinup", |
8545 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8546 | 16 | }, |
8547 | 16 | { &hf_nvme_cmd_set_features_dword11_spinup[1], |
8548 | 16 | { "Spinup Control Enable (SCE)", "nvme.cmd.set_features.dword11.spinup.sce", |
8549 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
8550 | 16 | }, |
8551 | 16 | { &hf_nvme_cmd_set_features_dword11_spinup[2], |
8552 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.spinup.rsvd", |
8553 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
8554 | 16 | }, |
8555 | 16 | { &hf_nvme_cmd_set_features_dword11_plsc[0], |
8556 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.plsc", |
8557 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8558 | 16 | }, |
8559 | 16 | { &hf_nvme_cmd_set_features_dword11_plsc[1], |
8560 | 16 | { "Power Loss Signaling Mode (PLSM)", "nvme.cmd.set_features.dword11.plsc.plsm", |
8561 | 16 | FT_UINT32, BASE_HEX, VALS(sf_plsm), 0x3, NULL, HFILL} |
8562 | 16 | }, |
8563 | 16 | { &hf_nvme_cmd_set_features_dword11_plsc[2], |
8564 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.plsc.rsvd", |
8565 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffc, NULL, HFILL} |
8566 | 16 | }, |
8567 | 16 | { &hf_nvme_cmd_set_features_dword11_fdp[0], |
8568 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.fdp", |
8569 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8570 | 16 | }, |
8571 | 16 | { &hf_nvme_cmd_set_features_dword11_fdp[1], |
8572 | 16 | { "Endurance Group Identifier (ENDGID)", "nvme.cmd.set_features.dword11.fdp.endgid", |
8573 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8574 | 16 | }, |
8575 | 16 | { &hf_nvme_cmd_set_features_dword11_fdp[2], |
8576 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.fdp.rsvd", |
8577 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8578 | 16 | }, |
8579 | 16 | { &hf_nvme_cmd_set_features_dword11_fdpe[0], |
8580 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.fdpe", |
8581 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8582 | 16 | }, |
8583 | 16 | { &hf_nvme_cmd_set_features_dword11_fdpe[1], |
8584 | 16 | { "Placement Handle (PHNDL)", "nvme.cmd.set_features.dword11.fdpe.phndl", |
8585 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8586 | 16 | }, |
8587 | 16 | { &hf_nvme_cmd_set_features_dword11_fdpe[2], |
8588 | 16 | { "Number of FDP Event Types (NOET)", "nvme.cmd.set_features.dword11.fdpe.noet", |
8589 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
8590 | 16 | }, |
8591 | 16 | { &hf_nvme_cmd_set_features_dword11_fdpe[3], |
8592 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.fdpe.rsvd", |
8593 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
8594 | 16 | }, |
8595 | 16 | { &hf_nvme_cmd_set_features_dword11_bpwpc[0], |
8596 | 16 | { "DWORD11", "nvme.cmd.set_features.dword11.bpwpc", |
8597 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8598 | 16 | }, |
8599 | 16 | { &hf_nvme_cmd_set_features_dword11_bpwpc[1], |
8600 | 16 | { "Boot Partition 0 Write Protection State (BP0WPS)", "nvme.cmd.set_features.dword11.bpwpc.bp0wps", |
8601 | 16 | FT_UINT32, BASE_HEX, VALS(sf_bpwps), 0x7, NULL, HFILL} |
8602 | 16 | }, |
8603 | 16 | { &hf_nvme_cmd_set_features_dword11_bpwpc[2], |
8604 | 16 | { "Boot Partition 1 Write Protection State (BP1WPS)", "nvme.cmd.set_features.dword11.bpwpc.bp1wps", |
8605 | 16 | FT_UINT32, BASE_HEX, VALS(sf_bpwps), 0x38, NULL, HFILL} |
8606 | 16 | }, |
8607 | 16 | { &hf_nvme_cmd_set_features_dword11_bpwpc[3], |
8608 | 16 | { "Reserved", "nvme.cmd.set_features.dword11.bpwpc.rsvd", |
8609 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL} |
8610 | 16 | }, |
8611 | | /* Set Features Transfers */ |
8612 | 16 | { &hf_nvme_set_features_tr_lbart, |
8613 | 16 | { "LBA Range Structure", "nvme.set_features.lbart", |
8614 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8615 | 16 | }, |
8616 | 16 | { &hf_nvme_set_features_tr_lbart_type, |
8617 | 16 | { "Type", "nvme.set_features.lbart.type", |
8618 | 16 | FT_UINT8, BASE_HEX | BASE_RANGE_STRING, RVALS(sf_lbart_type_table), 0x0, NULL, HFILL} |
8619 | 16 | }, |
8620 | 16 | { &hf_nvme_set_features_tr_lbart_attr[0], |
8621 | 16 | { "Attributes", "nvme.set_features.lbart.attr", |
8622 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8623 | 16 | }, |
8624 | 16 | { &hf_nvme_set_features_tr_lbart_attr[1], |
8625 | 16 | { "LBA Range may be overwritten", "nvme.set_features.lbart.attr.ovw", |
8626 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
8627 | 16 | }, |
8628 | 16 | { &hf_nvme_set_features_tr_lbart_attr[2], |
8629 | 16 | { "LBA Range shall be hidden from OS/EFI/BIOS", "nvme.set_features.lbart.attr.hid", |
8630 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
8631 | 16 | }, |
8632 | 16 | { &hf_nvme_set_features_tr_lbart_attr[3], |
8633 | 16 | { "Reserved", "nvme.set_features.lbart.attr.rsvd", |
8634 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
8635 | 16 | }, |
8636 | 16 | { &hf_nvme_set_features_tr_lbart_rsvd0, |
8637 | 16 | { "Reserved", "nvme.set_features.lbart.rsvd0", |
8638 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8639 | 16 | }, |
8640 | 16 | { &hf_nvme_set_features_tr_lbart_slba, |
8641 | 16 | { "Starting LBA", "nvme.set_features.lbart.slba", |
8642 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8643 | 16 | }, |
8644 | 16 | { &hf_nvme_set_features_tr_lbart_nlb, |
8645 | 16 | { "Number of Logical Blocks", "nvme.set_features.lbart.nlb", |
8646 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8647 | 16 | }, |
8648 | 16 | { &hf_nvme_set_features_tr_lbart_guid, |
8649 | 16 | { "Unique Identifier", "nvme.set_features.lbart.guid", |
8650 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8651 | 16 | }, |
8652 | 16 | { &hf_nvme_set_features_tr_lbart_rsvd1, |
8653 | 16 | { "Reserved", "nvme.set_features.lbart.rsvd1", |
8654 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8655 | 16 | }, |
8656 | 16 | { &hf_nvme_set_features_tr_apst[0], |
8657 | 16 | { "Autonomous Power State Transition Structure", "nvme.set_features.lbart.apst", |
8658 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8659 | 16 | }, |
8660 | 16 | { &hf_nvme_set_features_tr_apst[1], |
8661 | 16 | { "Reserved", "nvme.set_features.lbart.apst.rsvd0", |
8662 | 16 | FT_UINT64, BASE_HEX, NULL, 0x7, NULL, HFILL} |
8663 | 16 | }, |
8664 | 16 | { &hf_nvme_set_features_tr_apst[2], |
8665 | 16 | { "Idle Transition Power State", "nvme.set_features.lbart.apst.itps", |
8666 | 16 | FT_UINT64, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
8667 | 16 | }, |
8668 | 16 | { &hf_nvme_set_features_tr_apst[3], |
8669 | 16 | { "Idle Time Prior to Transition (ms)", "nvme.set_features.lbart.apst.itpt", |
8670 | 16 | FT_UINT64, BASE_HEX, NULL, 0xffffff00, NULL, HFILL} |
8671 | 16 | }, |
8672 | 16 | { &hf_nvme_set_features_tr_apst[4], |
8673 | 16 | { "Reserved", "nvme.set_features.lbart.apst.rsvd1", |
8674 | 16 | FT_UINT64, BASE_HEX, NULL, 0xffffffff00000000, NULL, HFILL} |
8675 | 16 | }, |
8676 | 16 | { &hf_nvme_set_features_tr_tst[0], |
8677 | 16 | { "Timestamp Structure", "nvme.set_features.tst", |
8678 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8679 | 16 | }, |
8680 | 16 | { &hf_nvme_set_features_tr_tst[1], |
8681 | 16 | { "Timestamp (milliseconds since 01-Jan-1970)", "nvme.set_features.tst.ms", |
8682 | 16 | FT_UINT64, BASE_HEX, NULL, 0xffffffffffff, NULL, HFILL} |
8683 | 16 | }, |
8684 | 16 | { &hf_nvme_set_features_tr_tst[2], |
8685 | 16 | { "Reserved", "nvme.set_features.tst.rsvd", |
8686 | 16 | FT_UINT64, BASE_HEX, NULL, 0xffff000000000000, NULL, HFILL} |
8687 | 16 | }, |
8688 | 16 | { &hf_nvme_set_features_tr_plmc, |
8689 | 16 | { "Deterministic Threshold Configuration Structure", "nvme.set_features.plmc", |
8690 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8691 | 16 | }, |
8692 | 16 | { &hf_nvme_set_features_tr_plmc_ee[0], |
8693 | 16 | { "Enable Event", "nvme.set_features.plmc.ee", |
8694 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8695 | 16 | }, |
8696 | 16 | { &hf_nvme_set_features_tr_plmc_ee[1], |
8697 | 16 | { "DTWIN Reads Warning", "nvme.set_features.plmc.ee.dtwinr", |
8698 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
8699 | 16 | }, |
8700 | 16 | { &hf_nvme_set_features_tr_plmc_ee[2], |
8701 | 16 | { "DTWIN Writes Warning", "nvme.set_features.plmc.ee.dtwinw", |
8702 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
8703 | 16 | }, |
8704 | 16 | { &hf_nvme_set_features_tr_plmc_ee[3], |
8705 | 16 | { "DTWIN Time Warning", "nvme.set_features.plmc.ee.dtwint", |
8706 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
8707 | 16 | }, |
8708 | 16 | { &hf_nvme_set_features_tr_plmc_ee[4], |
8709 | 16 | { "Reserved", "nvme.set_features.plmc.ee.rsvd", |
8710 | 16 | FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL} |
8711 | 16 | }, |
8712 | 16 | { &hf_nvme_set_features_tr_plmc_ee[5], |
8713 | 16 | { "DTWIN to NDWIN transition due to typical or maximum value exceeded", "nvme.set_features.plmc.ee.ndtwindv", |
8714 | 16 | FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL} |
8715 | 16 | }, |
8716 | 16 | { &hf_nvme_set_features_tr_plmc_ee[6], |
8717 | 16 | { "DTWIN to NDWIN transition due to Deterministic Excursion", "nvme.set_features.plmc.ee.ndtwindde", |
8718 | 16 | FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL} |
8719 | 16 | }, |
8720 | 16 | { &hf_nvme_set_features_tr_plmc_rsvd0, |
8721 | 16 | { "Reserved", "nvme.set_features.plmc.rsvd0", |
8722 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8723 | 16 | }, |
8724 | 16 | { &hf_nvme_set_features_tr_plmc_dtwinrt, |
8725 | 16 | { "DTWIN Reads Threshold", "nvme.set_features.plmc.dtwinrt", |
8726 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8727 | 16 | }, |
8728 | 16 | { &hf_nvme_set_features_tr_plmc_dtwinwt, |
8729 | 16 | { "DTWIN Writes Threshold", "nvme.set_features.plmc.dtwinwt", |
8730 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8731 | 16 | }, |
8732 | 16 | { &hf_nvme_set_features_tr_plmc_dtwintt, |
8733 | 16 | { "DTWIN Time Threshold", "nvme.set_features.plmc.dtwintt", |
8734 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8735 | 16 | }, |
8736 | 16 | { &hf_nvme_set_features_tr_plmc_rsvd1, |
8737 | 16 | { "Reserved", "nvme.set_features.plmc.rsvd1", |
8738 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8739 | 16 | }, |
8740 | 16 | { &hf_nvme_set_features_tr_hbs, |
8741 | 16 | { "Host Behavior Support Structure", "nvme.set_features.hbs", |
8742 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8743 | 16 | }, |
8744 | 16 | { &hf_nvme_set_features_tr_hbs_acre, |
8745 | 16 | { "Advanced Command Retry Enable", "nvme.set_features.hbs.acre", |
8746 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8747 | 16 | }, |
8748 | 16 | { &hf_nvme_set_features_tr_hbs_etdas, |
8749 | 16 | { "Extended Telemetry Data Area 4 Supported", "nvme.set_features.hbs.etdas", |
8750 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8751 | 16 | }, |
8752 | 16 | { &hf_nvme_set_features_tr_hbs_lbafee, |
8753 | 16 | { "LBA Format Extension Enable", "nvme.set_features.hbs.lbafee", |
8754 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8755 | 16 | }, |
8756 | 16 | { &hf_nvme_set_features_tr_hbs_hdisns, |
8757 | 16 | { "Host Dispersed Namespace Support", "nvme.set_features.hbs.hdisns", |
8758 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8759 | 16 | }, |
8760 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[0], |
8761 | 16 | { "Copy Descriptor Formats Enable (CDFE)", "nvme.set_features.hbs.cdfe", |
8762 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8763 | 16 | }, |
8764 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[1], |
8765 | 16 | { "Not Used (NUSED)", "nvme.set_features.hbs.cdfe.nused", |
8766 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0003, NULL, HFILL} |
8767 | 16 | }, |
8768 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[2], |
8769 | 16 | { "Copy Descriptor Format 2h Enable", "nvme.set_features.hbs.cdfe.cdf2e", |
8770 | 16 | FT_BOOLEAN, 16, NULL, 0x0004, NULL, HFILL} |
8771 | 16 | }, |
8772 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[3], |
8773 | 16 | { "Copy Descriptor Format 3h Enable", "nvme.set_features.hbs.cdfe.cdf3e", |
8774 | 16 | FT_BOOLEAN, 16, NULL, 0x0008, NULL, HFILL} |
8775 | 16 | }, |
8776 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[4], |
8777 | 16 | { "Copy Descriptor Format 4h Enable", "nvme.set_features.hbs.cdfe.cdf4e", |
8778 | 16 | FT_BOOLEAN, 16, NULL, 0x0010, NULL, HFILL} |
8779 | 16 | }, |
8780 | 16 | { &hf_nvme_set_features_tr_hbs_cdfe[5], |
8781 | 16 | { "Reserved", "nvme.set_features.hbs.cdfe.rsvd", |
8782 | 16 | FT_UINT16, BASE_HEX, NULL, 0xffe0, NULL, HFILL} |
8783 | 16 | }, |
8784 | 16 | { &hf_nvme_set_features_tr_hbs_rsvd, |
8785 | 16 | { "Reserved", "nvme.set_features.hbs.rsvd", |
8786 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8787 | 16 | }, |
8788 | 16 | { &hf_nvme_set_features_tr_hmd, |
8789 | 16 | { "Host Metadata Data Structure", "nvme.set_features.hmd", |
8790 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8791 | 16 | }, |
8792 | 16 | { &hf_nvme_set_features_tr_hmd_nmed, |
8793 | 16 | { "Number of Metadata Element Descriptors", "nvme.set_features.hmd.nmed", |
8794 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
8795 | 16 | }, |
8796 | 16 | { &hf_nvme_set_features_tr_hmd_rsvd, |
8797 | 16 | { "Reserved", "nvme.set_features.hmd.rsvd", |
8798 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8799 | 16 | }, |
8800 | 16 | { &hf_nvme_set_features_tr_hmd_med, |
8801 | 16 | { "Metadata Element Descriptor", "nvme.set_features.hmd.med", |
8802 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8803 | 16 | }, |
8804 | 16 | { &hf_nvme_set_features_tr_hmd_med_et, |
8805 | 16 | { "Element Type", "nvme.set_features.hmd.med.et", |
8806 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000001f, NULL, HFILL} |
8807 | 16 | }, |
8808 | 16 | { &hf_nvme_set_features_tr_hmd_med_er, |
8809 | 16 | { "Element Revision", "nvme.set_features.hmd.med.er", |
8810 | 16 | FT_UINT32, BASE_HEX, NULL, 0x00000f00, NULL, HFILL} |
8811 | 16 | }, |
8812 | 16 | { &hf_nvme_set_features_tr_hmd_med_elen, |
8813 | 16 | { "Element Length", "nvme.set_features.hmd.med.elen", |
8814 | 16 | FT_UINT32, BASE_DEC, NULL, 0xffff0000, NULL, HFILL} |
8815 | 16 | }, |
8816 | 16 | { &hf_nvme_set_features_tr_hmd_med_eval, |
8817 | 16 | { "Element Value", "nvme.set_features.hmd.med.eval", |
8818 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8819 | 16 | }, |
8820 | | /* Get Features */ |
8821 | 16 | { &hf_nvme_get_features_dword10[0], |
8822 | 16 | { "DWORD 10", "nvme.cmd.get_features.dword10", |
8823 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8824 | 16 | }, |
8825 | 16 | { &hf_nvme_get_features_dword10[1], |
8826 | 16 | { "Feature Identifier", "nvme.cmd.get_features.dword10.fid", |
8827 | 16 | FT_UINT32, BASE_HEX | BASE_RANGE_STRING, RVALS(fid_table), 0xff, NULL, HFILL} |
8828 | 16 | }, |
8829 | 16 | { &hf_nvme_get_features_dword10[2], |
8830 | 16 | { "Select", "nvme.cmd.set_features.dword10.sel", |
8831 | 16 | FT_UINT32, BASE_HEX, VALS(sel_table), 0x700, NULL, HFILL} |
8832 | 16 | }, |
8833 | 16 | { &hf_nvme_get_features_dword10[3], |
8834 | 16 | { "Reserved", "nvme.cmd.get_features.dword10.rsvd", |
8835 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffff800, NULL, HFILL} |
8836 | 16 | }, |
8837 | 16 | { &hf_nvme_get_features_dword14[0], |
8838 | 16 | { "DWORD 14", "nvme.cmd.get_features.dword14", |
8839 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8840 | 16 | }, |
8841 | 16 | { &hf_nvme_get_features_dword14[1], |
8842 | 16 | { "UUID Index", "nvme.cmd.get_features.dword14.uuid", |
8843 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
8844 | 16 | }, |
8845 | 16 | { &hf_nvme_get_features_dword14[2], |
8846 | 16 | { "Reserved", "nvme.cmd.get_features.dword14.rsvd", |
8847 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff80, NULL, HFILL} |
8848 | 16 | }, |
8849 | 16 | { &hf_nvme_cmd_get_features_dword11_rrl[0], |
8850 | 16 | { "DWORD11", "nvme.cmd.get_features.dword11.rrl", |
8851 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8852 | 16 | }, |
8853 | 16 | { &hf_nvme_cmd_get_features_dword11_rrl[1], |
8854 | 16 | { "NVM Set Identifier", "nvme.cmd_get_features.dword11.rrl.nvmsetid", |
8855 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8856 | 16 | }, |
8857 | 16 | { &hf_nvme_cmd_get_features_dword11_rrl[2], |
8858 | 16 | { "Reserved", "nvme.cmd.get_features.dword11.rrl.rsvd", |
8859 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8860 | 16 | }, |
8861 | 16 | { &hf_nvme_cmd_get_features_dword11_plmc[0], |
8862 | 16 | { "DWORD11", "nvme.cmd.get_features.dword11.plmc", |
8863 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8864 | 16 | }, |
8865 | 16 | { &hf_nvme_cmd_get_features_dword11_plmc[1], |
8866 | 16 | { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmc.nvmsetid", |
8867 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8868 | 16 | }, |
8869 | 16 | { &hf_nvme_cmd_get_features_dword11_plmc[2], |
8870 | 16 | { "Reserved", "nvme.cmd.get_features.dword11.plmc.rsvd", |
8871 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8872 | 16 | }, |
8873 | 16 | { &hf_nvme_cmd_get_features_dword11_plmw[0], |
8874 | 16 | { "DWORD11", "nvme.cmd.get_features.dword11.plmw", |
8875 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
8876 | 16 | }, |
8877 | 16 | { &hf_nvme_cmd_get_features_dword11_plmw[1], |
8878 | 16 | { "NVM Set Identifier", "nvme.cmd.get_features.dword11.plmw.nvmsetid", |
8879 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
8880 | 16 | }, |
8881 | 16 | { &hf_nvme_cmd_get_features_dword11_plmw[2], |
8882 | 16 | { "Reserved", "nvme.cmd.get_features.dword11.plmw.rsvd", |
8883 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
8884 | 16 | }, |
8885 | | /* Identify NS response */ |
8886 | 16 | { &hf_nvme_identify_ns_nsze, |
8887 | 16 | { "Namespace Size (NSZE)", "nvme.cmd.identify.ns.nsze", |
8888 | 16 | FT_UINT64, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8889 | 16 | }, |
8890 | 16 | { &hf_nvme_identify_ns_ncap, |
8891 | 16 | { "Namespace Capacity (NCAP)", "nvme.cmd.identify.ns.ncap", |
8892 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8893 | 16 | }, |
8894 | 16 | { &hf_nvme_identify_ns_nuse, |
8895 | 16 | { "Namespace Utilization (NUSE)", "nvme.cmd.identify.ns.nuse", |
8896 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8897 | 16 | }, |
8898 | 16 | { &hf_nvme_identify_ns_nsfeat, |
8899 | 16 | { "Namespace Features (NSFEAT)", "nvme.cmd.identify.ns.nsfeat", |
8900 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8901 | 16 | }, |
8902 | 16 | { &hf_nvme_identify_ns_nlbaf, |
8903 | 16 | { "Number of LBA Formats (NLBAF)", "nvme.cmd.identify.ns.nlbaf", |
8904 | 16 | FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8905 | 16 | }, |
8906 | 16 | { &hf_nvme_identify_ns_flbas, |
8907 | 16 | { "Formatted LBA Size (FLBAS)", "nvme.cmd.identify.ns.flbas", |
8908 | 16 | FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8909 | 16 | }, |
8910 | 16 | { &hf_nvme_identify_ns_mc, |
8911 | 16 | { "Metadata Capabilities (MC)", "nvme.cmd.identify.ns.mc", |
8912 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8913 | 16 | }, |
8914 | 16 | { &hf_nvme_identify_ns_dpc, |
8915 | 16 | { "End-to-end Data Protection Capabilities (DPC)", "nvme.cmd.identify.ns.dpc", |
8916 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8917 | 16 | }, |
8918 | 16 | { &hf_nvme_identify_ns_dps, |
8919 | 16 | { "End-to-end Data Protection Type Settings (DPS)", "nvme.cmd.identify.ns.dps", |
8920 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8921 | 16 | }, |
8922 | 16 | { &hf_nvme_identify_ns_nmic, |
8923 | 16 | { "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)", |
8924 | 16 | "nvme.cmd.identify.ns.nmic", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8925 | 16 | }, |
8926 | 16 | { &hf_nvme_identify_ns_rescap, |
8927 | 16 | { "Reservation Capabilities (RESCAP)", "nvme.cmd.identify.ns.rescap", |
8928 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8929 | 16 | }, |
8930 | 16 | { &hf_nvme_identify_ns_fpi, |
8931 | 16 | { "Format Progress Indicator (FPI)", "nvme.cmd.identify.ns.fpi", |
8932 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8933 | 16 | }, |
8934 | 16 | { &hf_nvme_identify_ns_dlfeat[0], |
8935 | 16 | { "Deallocate Logical Block Features (DLFEAT)", "nvme.cmd.identify.ns.dlfeat", |
8936 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
8937 | 16 | }, |
8938 | 16 | { &hf_nvme_identify_ns_dlfeat[1], |
8939 | 16 | { "Deallocation Read Behavior (DRB)", "nvme.cmd.identify.ns.dlfeat.drb", |
8940 | 16 | FT_UINT8, BASE_HEX, VALS(ns_dlfeat_drb_tbl), 0x7, NULL, HFILL} |
8941 | 16 | }, |
8942 | 16 | { &hf_nvme_identify_ns_dlfeat[2], |
8943 | 16 | { "Write Zeroes Deallocation Support (WZDS)", "nvme.cmd.identify.ns.dlfeat.wzds", |
8944 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
8945 | 16 | }, |
8946 | 16 | { &hf_nvme_identify_ns_dlfeat[3], |
8947 | 16 | { "Guard Deallocation Status (GDS)", "nvme.cmd.identify.ns.dlfeat.gds", |
8948 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
8949 | 16 | }, |
8950 | 16 | { &hf_nvme_identify_ns_dlfeat[4], |
8951 | 16 | { "Reserved", "nvme.cmd.identify.ns.dlfeat.rsvd", |
8952 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
8953 | 16 | }, |
8954 | 16 | { &hf_nvme_identify_ns_nawun, |
8955 | 16 | { "Namespace Atomic Write Unit Normal (NAWUN)", "nvme.cmd.identify.ns.nawun", |
8956 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8957 | 16 | }, |
8958 | 16 | { &hf_nvme_identify_ns_nawupf, |
8959 | 16 | { "Namespace Atomic Write Unit Power Fail (NAWUPF)", "nvme.cmd.identify.ns.nawupf", |
8960 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8961 | 16 | }, |
8962 | 16 | { &hf_nvme_identify_ns_nacwu, |
8963 | 16 | { "Namespace Atomic Compare & Write Unit (NACWU)", "nvme.cmd.identify.ns.nacwu", |
8964 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8965 | 16 | }, |
8966 | 16 | { &hf_nvme_identify_ns_nabsn, |
8967 | 16 | { "Namespace Atomic Boundary Size Normal (NABSN)", "nvme.cmd.identify.ns.nabsn", |
8968 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8969 | 16 | }, |
8970 | 16 | { &hf_nvme_identify_ns_nabo, |
8971 | 16 | { "Namespace Atomic Boundary Offset (NABO)", "nvme.cmd.identify.ns.nabo", |
8972 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8973 | 16 | }, |
8974 | 16 | { &hf_nvme_identify_ns_nabspf, |
8975 | 16 | { "Namespace Atomic Boundary Size Power Fail (NABSPF)", "nvme.cmd.identify.ns.nabspf", |
8976 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8977 | 16 | }, |
8978 | 16 | { &hf_nvme_identify_ns_noiob, |
8979 | 16 | { "Namespace Optimal I/O Boundary (NOIOB)", "nvme.cmd.identify.ns.noiob", |
8980 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8981 | 16 | }, |
8982 | 16 | { &hf_nvme_identify_ns_nvmcap, |
8983 | 16 | { "NVM Capacity (NVMCAP)", "nvme.cmd.identify.ns.nvmcap", |
8984 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
8985 | 16 | }, |
8986 | 16 | { &hf_nvme_identify_ns_npwg, |
8987 | 16 | { "Namespace Preferred Write Granularity (NPWG)", "nvme.cmd.identify.ns.npwg", |
8988 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8989 | 16 | }, |
8990 | 16 | { &hf_nvme_identify_ns_npwa, |
8991 | 16 | { "Namespace Preferred Write Alignment (NPWA)", "nvme.cmd.identify.ns.npwa", |
8992 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8993 | 16 | }, |
8994 | 16 | { &hf_nvme_identify_ns_npdg, |
8995 | 16 | { "Namespace Preferred Deallocate Granularity (NPDG)", "nvme.cmd.identify.ns.npdg", |
8996 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
8997 | 16 | }, |
8998 | 16 | { &hf_nvme_identify_ns_npda, |
8999 | 16 | { "Namespace Preferred Deallocate Alignment (NPDA)", "nvme.cmd.identify.ns.npda", |
9000 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9001 | 16 | }, |
9002 | 16 | { &hf_nvme_identify_ns_nows, |
9003 | 16 | { "Namespace Optimal Write Size (NOWS)", "nvme.cmd.identify.ns.nows", |
9004 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9005 | 16 | }, |
9006 | 16 | { &hf_nvme_identify_ns_mssrl, |
9007 | 16 | { "Maximum Single Source Range Length (MSSRL)", "nvme.cmd.identify.ns.mssrl", |
9008 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9009 | 16 | }, |
9010 | 16 | { &hf_nvme_identify_ns_mcl, |
9011 | 16 | { "Maximum Copy Length (MCL)", "nvme.cmd.identify.ns.mcl", |
9012 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9013 | 16 | }, |
9014 | 16 | { &hf_nvme_identify_ns_msrc, |
9015 | 16 | { "Maximum Source Range Count (MSRC)", "nvme.cmd.identify.ns.msrc", |
9016 | 16 | FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9017 | 16 | }, |
9018 | 16 | { &hf_nvme_identify_ns_kpios[0], |
9019 | 16 | { "Key Per I/O Status (KPIOS)", "nvme.cmd.identify.ns.kpios", |
9020 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9021 | 16 | }, |
9022 | 16 | { &hf_nvme_identify_ns_kpios[1], |
9023 | 16 | { "Key Per I/O Enabled in Namespace (KPIOENS)", "nvme.cmd.identify.ns.kpios.kpioens", |
9024 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9025 | 16 | }, |
9026 | 16 | { &hf_nvme_identify_ns_kpios[2], |
9027 | 16 | { "Key Per I/O Supported in Namespace (KPIOSNS)", "nvme.cmd.identify.ns.kpios.kpiosns", |
9028 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9029 | 16 | }, |
9030 | 16 | { &hf_nvme_identify_ns_kpios[3], |
9031 | 16 | { "Reserved", "nvme.cmd.identify.ns.kpios.rsvd", |
9032 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9033 | 16 | }, |
9034 | 16 | { &hf_nvme_identify_ns_nulbaf, |
9035 | 16 | { "Number of Unique Attribute LBA Formats (NULBAF)", "nvme.cmd.identify.ns.nulbaf", |
9036 | 16 | FT_UINT8, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9037 | 16 | }, |
9038 | 16 | { &hf_nvme_identify_ns_rsvd0, |
9039 | 16 | { "Reserved", "nvme.cmd.identify.ns.rsvd0", |
9040 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9041 | 16 | }, |
9042 | 16 | { &hf_nvme_identify_ns_kpiodaag, |
9043 | 16 | { "Key Per I/O Data Access Alignment and Granularity (KPIODAAG)", |
9044 | 16 | "nvme.cmd.identify.ns.kpiodaag", |
9045 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9046 | 16 | }, |
9047 | 16 | { &hf_nvme_identify_ns_rsvd1, |
9048 | 16 | { "Reserved", "nvme.cmd.identify.ns.rsvd1", |
9049 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9050 | 16 | }, |
9051 | 16 | { &hf_nvme_identify_ns_anagrpid, |
9052 | 16 | { "ANA Group Identifier (ANAGRPID)", "nvme.cmd.identify.ns.anagrpid", |
9053 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9054 | 16 | }, |
9055 | 16 | { &hf_nvme_identify_ns_rsvd2, |
9056 | 16 | { "Reserved", "nvme.cmd.identify.ns.rsvd2", |
9057 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9058 | 16 | }, |
9059 | 16 | { &hf_nvme_identify_ns_nsattr, |
9060 | 16 | { "Namespace Attributes (NSATTR)", "nvme.cmd.identify.ns.nsattr", |
9061 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9062 | 16 | }, |
9063 | 16 | { &hf_nvme_identify_ns_nvmsetid, |
9064 | 16 | { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.ns.nvmsetid", |
9065 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9066 | 16 | }, |
9067 | 16 | { &hf_nvme_identify_ns_endgid, |
9068 | 16 | { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.ns.endgid", |
9069 | 16 | FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
9070 | 16 | }, |
9071 | 16 | { &hf_nvme_identify_ns_nguid, |
9072 | 16 | { "Namespace Globally Unique Identifier (NGUID)", "nvme.cmd.identify.ns.nguid", |
9073 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9074 | 16 | }, |
9075 | 16 | { &hf_nvme_identify_ns_eui64, |
9076 | 16 | { "IEEE Extended Unique Identifier (EUI64)", "nvme.cmd.identify.ns.eui64", |
9077 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9078 | 16 | }, |
9079 | 16 | { &hf_nvme_identify_ns_lbafs, |
9080 | 16 | { "LBA Formats", "nvme.cmd.identify.ns.lbafs", |
9081 | 16 | FT_NONE, BASE_NONE, NULL, 0, NULL, HFILL} |
9082 | 16 | }, |
9083 | 16 | { &hf_nvme_identify_ns_lbaf, |
9084 | 16 | { "LBA Format", "nvme.cmd.identify.ns.lbaf", |
9085 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9086 | 16 | }, |
9087 | 16 | { &hf_nvme_identify_ns_vs, |
9088 | 16 | { "Vendor Specific", "nvme.cmd.identify.ns.vs", |
9089 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9090 | 16 | }, |
9091 | | /* Identify - I/O Command Set Independent Namespace (CNS 08h), Fig 335 */ |
9092 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[0], |
9093 | 16 | { "Common Namespace Features (NSFEAT)", "nvme.cmd.identify.cs_ind_ns.nsfeat", |
9094 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9095 | 16 | }, |
9096 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[1], |
9097 | 16 | { "Volatile Write Cache Not Present (VWCNP)", "nvme.cmd.identify.cs_ind_ns.nsfeat.vwcnp", |
9098 | 16 | FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL} |
9099 | 16 | }, |
9100 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[2], |
9101 | 16 | { "Rotational Media (RMEDIA)", "nvme.cmd.identify.cs_ind_ns.nsfeat.rmedia", |
9102 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
9103 | 16 | }, |
9104 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[3], |
9105 | 16 | { "UID Reuse (UIDREUSE)", "nvme.cmd.identify.cs_ind_ns.nsfeat.uidreuse", |
9106 | 16 | FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL} |
9107 | 16 | }, |
9108 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[4], |
9109 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsfeat.rsvd0", |
9110 | 16 | FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL} |
9111 | 16 | }, |
9112 | 16 | { &hf_nvme_identify_cs_ind_ns_nsfeat[5], |
9113 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsfeat.rsvd1", |
9114 | 16 | FT_UINT8, BASE_HEX, NULL, 0x07, NULL, HFILL} |
9115 | 16 | }, |
9116 | 16 | { &hf_nvme_identify_cs_ind_ns_nmic[0], |
9117 | 16 | { "Namespace Multi-path I/O and Namespace Sharing Capabilities (NMIC)", "nvme.cmd.identify.cs_ind_ns.nmic", |
9118 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9119 | 16 | }, |
9120 | 16 | { &hf_nvme_identify_cs_ind_ns_nmic[1], |
9121 | 16 | { "Dispersed Namespace (DISNS)", "nvme.cmd.identify.cs_ind_ns.nmic.disns", |
9122 | 16 | FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL} |
9123 | 16 | }, |
9124 | 16 | { &hf_nvme_identify_cs_ind_ns_nmic[2], |
9125 | 16 | { "Shared Namespace (SHRNS)", "nvme.cmd.identify.cs_ind_ns.nmic.shrns", |
9126 | 16 | FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL} |
9127 | 16 | }, |
9128 | 16 | { &hf_nvme_identify_cs_ind_ns_nmic[3], |
9129 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.nmic.rsvd", |
9130 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9131 | 16 | }, |
9132 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[0], |
9133 | 16 | { "Reservation Capabilities (RESCAP)", "nvme.cmd.identify.cs_ind_ns.rescap", |
9134 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9135 | 16 | }, |
9136 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[1], |
9137 | 16 | { "Ignore Existing Key Support (IEKS)", "nvme.cmd.identify.cs_ind_ns.rescap.ieks", |
9138 | 16 | FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} |
9139 | 16 | }, |
9140 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[2], |
9141 | 16 | { "Exclusive Access - All Registrants Support (EAARS)", "nvme.cmd.identify.cs_ind_ns.rescap.eaars", |
9142 | 16 | FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL} |
9143 | 16 | }, |
9144 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[3], |
9145 | 16 | { "Write Exclusive - All Registrants Support (WEARS)", "nvme.cmd.identify.cs_ind_ns.rescap.wears", |
9146 | 16 | FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL} |
9147 | 16 | }, |
9148 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[4], |
9149 | 16 | { "Exclusive Access - Registrants Only Support (EAROS)", "nvme.cmd.identify.cs_ind_ns.rescap.earos", |
9150 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
9151 | 16 | }, |
9152 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[5], |
9153 | 16 | { "Write Exclusive - Registrants Only Support (WEROS)", "nvme.cmd.identify.cs_ind_ns.rescap.weros", |
9154 | 16 | FT_BOOLEAN, 8, NULL, 0x08, NULL, HFILL} |
9155 | 16 | }, |
9156 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[6], |
9157 | 16 | { "Exclusive Access Support (EAS)", "nvme.cmd.identify.cs_ind_ns.rescap.eas", |
9158 | 16 | FT_BOOLEAN, 8, NULL, 0x04, NULL, HFILL} |
9159 | 16 | }, |
9160 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[7], |
9161 | 16 | { "Write Exclusive Support (WES)", "nvme.cmd.identify.cs_ind_ns.rescap.wes", |
9162 | 16 | FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL} |
9163 | 16 | }, |
9164 | 16 | { &hf_nvme_identify_cs_ind_ns_rescap[8], |
9165 | 16 | { "Persist Through Power Loss Support (PTPLS)", "nvme.cmd.identify.cs_ind_ns.rescap.ptpls", |
9166 | 16 | FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL} |
9167 | 16 | }, |
9168 | 16 | { &hf_nvme_identify_cs_ind_ns_fpi[0], |
9169 | 16 | { "Format Progress Indicator (FPI)", "nvme.cmd.identify.cs_ind_ns.fpi", |
9170 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9171 | 16 | }, |
9172 | 16 | { &hf_nvme_identify_cs_ind_ns_fpi[1], |
9173 | 16 | { "Format Progress Indicator Support (FPIS)", "nvme.cmd.identify.cs_ind_ns.fpi.fpis", |
9174 | 16 | FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} |
9175 | 16 | }, |
9176 | 16 | { &hf_nvme_identify_cs_ind_ns_fpi[2], |
9177 | 16 | { "Remaining Format NVM (RFNVM)", "nvme.cmd.identify.cs_ind_ns.fpi.rfnvm", |
9178 | 16 | FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL} |
9179 | 16 | }, |
9180 | 16 | { &hf_nvme_identify_cs_ind_ns_anagrpid, |
9181 | 16 | { "ANA Group Identifier (ANAGRPID)", "nvme.cmd.identify.cs_ind_ns.anagrpid", |
9182 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9183 | 16 | }, |
9184 | 16 | { &hf_nvme_identify_cs_ind_ns_nsattr[0], |
9185 | 16 | { "Namespace Attributes (NSATTR)", "nvme.cmd.identify.cs_ind_ns.nsattr", |
9186 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9187 | 16 | }, |
9188 | 16 | { &hf_nvme_identify_cs_ind_ns_nsattr[1], |
9189 | 16 | { "Currently Write Protected (CWP)", "nvme.cmd.identify.cs_ind_ns.nsattr.cwp", |
9190 | 16 | FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL} |
9191 | 16 | }, |
9192 | 16 | { &hf_nvme_identify_cs_ind_ns_nsattr[2], |
9193 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.nsattr.rsvd", |
9194 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
9195 | 16 | }, |
9196 | 16 | { &hf_nvme_identify_cs_ind_ns_rsvd0, |
9197 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.rsvd0", |
9198 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9199 | 16 | }, |
9200 | 16 | { &hf_nvme_identify_cs_ind_ns_nvmsetid, |
9201 | 16 | { "NVM Set Identifier (NVMSETID)", "nvme.cmd.identify.cs_ind_ns.nvmsetid", |
9202 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9203 | 16 | }, |
9204 | 16 | { &hf_nvme_identify_cs_ind_ns_endgid, |
9205 | 16 | { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.cs_ind_ns.endgid", |
9206 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9207 | 16 | }, |
9208 | 16 | { &hf_nvme_identify_cs_ind_ns_nstat[0], |
9209 | 16 | { "Namespace Status (NSTAT)", "nvme.cmd.identify.cs_ind_ns.nstat", |
9210 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9211 | 16 | }, |
9212 | 16 | { &hf_nvme_identify_cs_ind_ns_nstat[1], |
9213 | 16 | { "I/O Impacted (IOI)", "nvme.cmd.identify.cs_ind_ns.nstat.ioi", |
9214 | 16 | FT_UINT8, BASE_HEX, VALS(cs_ind_ns_ioi_tbl), 0x06, NULL, HFILL} |
9215 | 16 | }, |
9216 | 16 | { &hf_nvme_identify_cs_ind_ns_nstat[2], |
9217 | 16 | { "Namespace Ready (NRDY)", "nvme.cmd.identify.cs_ind_ns.nstat.nrdy", |
9218 | 16 | FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL} |
9219 | 16 | }, |
9220 | 16 | { &hf_nvme_identify_cs_ind_ns_nstat[3], |
9221 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.nstat.rsvd", |
9222 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
9223 | 16 | }, |
9224 | 16 | { &hf_nvme_identify_cs_ind_ns_kpios[0], |
9225 | 16 | { "Key Per I/O Status (KPIOS)", "nvme.cmd.identify.cs_ind_ns.kpios", |
9226 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9227 | 16 | }, |
9228 | 16 | { &hf_nvme_identify_cs_ind_ns_kpios[1], |
9229 | 16 | { "Key Per I/O Supported in Namespace (KPIOSNS)", "nvme.cmd.identify.cs_ind_ns.kpios.kpiosns", |
9230 | 16 | FT_BOOLEAN, 8, NULL, 0x02, NULL, HFILL} |
9231 | 16 | }, |
9232 | 16 | { &hf_nvme_identify_cs_ind_ns_kpios[2], |
9233 | 16 | { "Key Per I/O Enabled in Namespace (KPIOENS)", "nvme.cmd.identify.cs_ind_ns.kpios.kpioens", |
9234 | 16 | FT_BOOLEAN, 8, NULL, 0x01, NULL, HFILL} |
9235 | 16 | }, |
9236 | 16 | { &hf_nvme_identify_cs_ind_ns_kpios[3], |
9237 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.kpios.rsvd", |
9238 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9239 | 16 | }, |
9240 | 16 | { &hf_nvme_identify_cs_ind_ns_maxkt, |
9241 | 16 | { "Maximum Key Tag (MAXKT)", "nvme.cmd.identify.cs_ind_ns.maxkt", |
9242 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9243 | 16 | }, |
9244 | 16 | { &hf_nvme_identify_cs_ind_ns_rsvd1, |
9245 | 16 | { "Reserved", "nvme.cmd.identify.cs_ind_ns.rsvd1", |
9246 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9247 | 16 | }, |
9248 | 16 | { &hf_nvme_identify_cs_ind_ns_rgrpid, |
9249 | 16 | { "Reachability Group Identifier (RGRPID)", "nvme.cmd.identify.cs_ind_ns.rgrpid", |
9250 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9251 | 16 | }, |
9252 | | /* Identify Ctrl response */ |
9253 | 16 | { &hf_nvme_identify_ctrl_vid, |
9254 | 16 | { "PCI Vendor ID (VID)", "nvme.cmd.identify.ctrl.vid", |
9255 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9256 | 16 | }, |
9257 | 16 | { &hf_nvme_identify_ctrl_ssvid, |
9258 | 16 | { "PCI Subsystem Vendor ID (SSVID)", "nvme.cmd.identify.ctrl.ssvid", |
9259 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9260 | 16 | }, |
9261 | 16 | { &hf_nvme_identify_ctrl_sn, |
9262 | 16 | { "Serial Number (SN)", "nvme.cmd.identify.ctrl.sn", |
9263 | 16 | FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9264 | 16 | }, |
9265 | 16 | { &hf_nvme_identify_ctrl_mn, |
9266 | 16 | { "Model Number (MN)", "nvme.cmd.identify.ctrl.mn", |
9267 | 16 | FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9268 | 16 | }, |
9269 | 16 | { &hf_nvme_identify_ctrl_fr, |
9270 | 16 | { "Firmware Revision (FR)", "nvme.cmd.identify.ctrl.fr", |
9271 | 16 | FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9272 | 16 | }, |
9273 | 16 | { &hf_nvme_identify_ctrl_rab, |
9274 | 16 | { "Recommended Arbitration Burst (RAB)", "nvme.cmd.identify.ctrl.rab", |
9275 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_rab), 0x0, NULL, HFILL} |
9276 | 16 | }, |
9277 | 16 | { &hf_nvme_identify_ctrl_ieee, |
9278 | 16 | { "IEEE OUI Identifier (IEEE)", "nvme.cmd.identify.ctrl.ieee", |
9279 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9280 | 16 | }, |
9281 | 16 | { &hf_nvme_identify_ctrl_cmic[0], |
9282 | 16 | { "Controller Multi-Path I/O and Namespace Sharing Capabilities (CMIC)", "nvme.cmd.identify.ctrl.cmic", |
9283 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9284 | 16 | }, |
9285 | 16 | { &hf_nvme_identify_ctrl_cmic[1], |
9286 | 16 | { "Multiple Ports Support", "nvme.cmd.identify.ctrl.cmic.mp", |
9287 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9288 | 16 | }, |
9289 | 16 | { &hf_nvme_identify_ctrl_cmic[2], |
9290 | 16 | { "Multiple Controllers Support", "nvme.cmd.identify.ctrl.cmic.mc", |
9291 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9292 | 16 | }, |
9293 | 16 | { &hf_nvme_identify_ctrl_cmic[3], |
9294 | 16 | { "SRIOV Association", "nvme.cmd.identify.ctrl.cmic.sriov", |
9295 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
9296 | 16 | }, |
9297 | 16 | { &hf_nvme_identify_ctrl_cmic[4], |
9298 | 16 | { "ANA Reporting Support", "nvme.cmd.identify.ctrl.cmic.ana", |
9299 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
9300 | 16 | }, |
9301 | 16 | { &hf_nvme_identify_ctrl_cmic[5], |
9302 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.cmic.rsvd", |
9303 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
9304 | 16 | }, |
9305 | 16 | { &hf_nvme_identify_ctrl_mdts, |
9306 | 16 | { "Maximum Data Transfer Size (MDTS)", "nvme.cmd.identify.ctrl.mdts", |
9307 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_mdts), 0x0, NULL, HFILL} |
9308 | 16 | }, |
9309 | 16 | { &hf_nvme_identify_ctrl_cntlid, |
9310 | 16 | { "Controller ID (CNTLID)", "nvme.cmd.identify.ctrl.cntlid", |
9311 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9312 | 16 | }, |
9313 | 16 | { &hf_nvme_identify_ctrl_ver, |
9314 | 16 | { "Version (VER)", "nvme.cmd.identify.ctrl.ver", |
9315 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9316 | 16 | }, |
9317 | 16 | { &hf_nvme_identify_ctrl_ver_ter, |
9318 | 16 | { "Tertiary Version Number (TER)", "nvme.cmd.identify.ctrl.ver.ter", |
9319 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9320 | 16 | }, |
9321 | 16 | { &hf_nvme_identify_ctrl_ver_min, |
9322 | 16 | { "Minor Version Number (MNR)", "nvme.cmd.identify.ctrl.ver.min", |
9323 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9324 | 16 | }, |
9325 | 16 | { &hf_nvme_identify_ctrl_ver_mjr, |
9326 | 16 | { "Major Version Number (MJR)", "nvme.cmd.identify.ctrl.ver.mjr", |
9327 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9328 | 16 | }, |
9329 | 16 | { &hf_nvme_identify_ctrl_rtd3r, |
9330 | 16 | { "RTD3 Resume Latency (RTD3R)", "nvme.cmd.identify.ctrl.rtd3r", |
9331 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL} |
9332 | 16 | }, |
9333 | 16 | { &hf_nvme_identify_ctrl_rtd3e, |
9334 | 16 | { "RTD3 Entry Latency (RTD3E)", "nvme.cmd.identify.ctrl.rtd3e", |
9335 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_rtd3), 0x0, NULL, HFILL} |
9336 | 16 | }, |
9337 | 16 | { &hf_nvme_identify_ctrl_oaes[0], |
9338 | 16 | { "Optional Asynchronous Events Supported (OAES)", "nvme.cmd.identify.ctrl.oaes", |
9339 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9340 | 16 | }, |
9341 | 16 | { &hf_nvme_identify_ctrl_oaes[1], |
9342 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd0", |
9343 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL} |
9344 | 16 | }, |
9345 | 16 | { &hf_nvme_identify_ctrl_oaes[2], |
9346 | 16 | { "Namespace Attribute Notices Supported", "nvme.cmd.identify.ctrl.oaes.nan", |
9347 | 16 | FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL} |
9348 | 16 | }, |
9349 | 16 | { &hf_nvme_identify_ctrl_oaes[3], |
9350 | 16 | { "Firmware Activation Supported", "nvme.cmd.identify.ctrl.oaes.fan", |
9351 | 16 | FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL} |
9352 | 16 | }, |
9353 | 16 | { &hf_nvme_identify_ctrl_oaes[4], |
9354 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd1", |
9355 | 16 | FT_UINT32, BASE_HEX, NULL, 0x400, NULL, HFILL} |
9356 | 16 | }, |
9357 | 16 | { &hf_nvme_identify_ctrl_oaes[5], |
9358 | 16 | { "Asymmetric Namespace Access Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ana", |
9359 | 16 | FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL} |
9360 | 16 | }, |
9361 | 16 | { &hf_nvme_identify_ctrl_oaes[6], |
9362 | 16 | { "Predictable Latency Event Aggregate Log Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ple", |
9363 | 16 | FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL} |
9364 | 16 | }, |
9365 | 16 | { &hf_nvme_identify_ctrl_oaes[7], |
9366 | 16 | { "LBA Status Information Notices Supported", "nvme.cmd.identify.ctrl.oaes.lba", |
9367 | 16 | FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL} |
9368 | 16 | }, |
9369 | 16 | { &hf_nvme_identify_ctrl_oaes[8], |
9370 | 16 | { "Endurance Group Event Aggregate Log Page Change Notices Supported", "nvme.cmd.identify.ctrl.oaes.ege", |
9371 | 16 | FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL} |
9372 | 16 | }, |
9373 | 16 | { &hf_nvme_identify_ctrl_oaes[9], |
9374 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.oaes.rsvd2", |
9375 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff8000, NULL, HFILL} |
9376 | 16 | }, |
9377 | 16 | { &hf_nvme_identify_ctrl_ctratt[0], |
9378 | 16 | { "Controller Attributes (CTRATT)", "nvme.cmd.identify.ctrl.ctratt", |
9379 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9380 | 16 | }, |
9381 | 16 | { &hf_nvme_identify_ctrl_ctratt[1], |
9382 | 16 | { "128-bit Host Identifier Support", "nvme.cmd.identify.ctrl.ctratt.hi_128", |
9383 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
9384 | 16 | }, |
9385 | 16 | { &hf_nvme_identify_ctrl_ctratt[2], |
9386 | 16 | { "Non-Operational Power State Permissive Mode Supported", "nvme.cmd.identify.ctrl.ctratt.nopspm", |
9387 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
9388 | 16 | }, |
9389 | 16 | { &hf_nvme_identify_ctrl_ctratt[3], |
9390 | 16 | { "NVM Sets Supported", "nvme.cmd.identify.ctrl.ctratt.nvmset", |
9391 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
9392 | 16 | }, |
9393 | 16 | { &hf_nvme_identify_ctrl_ctratt[4], |
9394 | 16 | { "Read Recovery Levels Supported", "nvme.cmd.identify.ctrl.ctratt.rrl", |
9395 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
9396 | 16 | }, |
9397 | 16 | { &hf_nvme_identify_ctrl_ctratt[5], |
9398 | 16 | { "Endurance Groups Supported", "nvme.cmd.identify.ctrl.ctratt.eg", |
9399 | 16 | FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL} |
9400 | 16 | }, |
9401 | 16 | { &hf_nvme_identify_ctrl_ctratt[6], |
9402 | 16 | { "Predictable Latency Mode Supported", "nvme.cmd.identify.ctrl.ctratt.plm", |
9403 | 16 | FT_BOOLEAN, 32, NULL, 0x20, NULL, HFILL} |
9404 | 16 | }, |
9405 | 16 | { &hf_nvme_identify_ctrl_ctratt[7], |
9406 | 16 | { "Traffic Based Keep Alive Support (TBKAS)", "nvme.cmd.identify.ctrl.ctratt.tbkas", |
9407 | 16 | FT_BOOLEAN, 32, NULL, 0x40, NULL, HFILL} |
9408 | 16 | }, |
9409 | 16 | { &hf_nvme_identify_ctrl_ctratt[8], |
9410 | 16 | { "Namespace Granularity", "nvme.cmd.identify.ctrl.ctratt.ng", |
9411 | 16 | FT_BOOLEAN, 32, NULL, 0x80, NULL, HFILL} |
9412 | 16 | }, |
9413 | 16 | { &hf_nvme_identify_ctrl_ctratt[9], |
9414 | 16 | { "SQ Associations Support", "nvme.cmd.identify.ctrl.ctratt.sqa", |
9415 | 16 | FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL} |
9416 | 16 | }, |
9417 | 16 | { &hf_nvme_identify_ctrl_ctratt[10], |
9418 | 16 | { "UUID List Support", "nvme.cmd.identify.ctrl.ctratt.uuidl", |
9419 | 16 | FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL} |
9420 | 16 | }, |
9421 | 16 | { &hf_nvme_identify_ctrl_ctratt[11], |
9422 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.ctratt.rsvd", |
9423 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffc00, NULL, HFILL} |
9424 | 16 | }, |
9425 | 16 | { &hf_nvme_identify_ctrl_rrls[0], |
9426 | 16 | { "Read Recovery Levels Support (RRLS)", "nvme.cmd.identify.ctrl.rrls", |
9427 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9428 | 16 | }, |
9429 | 16 | { &hf_nvme_identify_ctrl_rrls[1], |
9430 | 16 | { "Read Recovery Level 0 Support", "nvme.cmd.identify.ctrl.rrls.rrls0", |
9431 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
9432 | 16 | }, |
9433 | 16 | { &hf_nvme_identify_ctrl_rrls[2], |
9434 | 16 | { "Read Recovery Level 1 Support", "nvme.cmd.identify.ctrl.rrls.rrls1", |
9435 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
9436 | 16 | }, |
9437 | 16 | { &hf_nvme_identify_ctrl_rrls[3], |
9438 | 16 | { "Read Recovery Level 2 Support", "nvme.cmd.identify.ctrl.rrls.rrls2", |
9439 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
9440 | 16 | }, |
9441 | 16 | { &hf_nvme_identify_ctrl_rrls[4], |
9442 | 16 | { "Read Recovery Level 3 Support", "nvme.cmd.identify.ctrl.rrls.rrls3", |
9443 | 16 | FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL} |
9444 | 16 | }, |
9445 | 16 | { &hf_nvme_identify_ctrl_rrls[5], |
9446 | 16 | { "Read Recovery Level 4 (Default) Support", "nvme.cmd.identify.ctrl.rrls.rrls4", |
9447 | 16 | FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL} |
9448 | 16 | }, |
9449 | 16 | { &hf_nvme_identify_ctrl_rrls[6], |
9450 | 16 | { "Read Recovery Level 5 Support", "nvme.cmd.identify.ctrl.rrls.rrls5", |
9451 | 16 | FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL} |
9452 | 16 | }, |
9453 | 16 | { &hf_nvme_identify_ctrl_rrls[7], |
9454 | 16 | { "Read Recovery Level 6 Support", "nvme.cmd.identify.ctrl.rrls.rrls6", |
9455 | 16 | FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL} |
9456 | 16 | }, |
9457 | 16 | { &hf_nvme_identify_ctrl_rrls[8], |
9458 | 16 | { "Read Recovery Level 7 Support", "nvme.cmd.identify.ctrl.rrls.rrls7", |
9459 | 16 | FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL} |
9460 | 16 | }, |
9461 | 16 | { &hf_nvme_identify_ctrl_rrls[9], |
9462 | 16 | { "Read Recovery Level 8 Support", "nvme.cmd.identify.ctrl.rrls.rrls8", |
9463 | 16 | FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL} |
9464 | 16 | }, |
9465 | 16 | { &hf_nvme_identify_ctrl_rrls[10], |
9466 | 16 | { "Read Recovery Level 9 Support", "nvme.cmd.identify.ctrl.rrls.rrls9", |
9467 | 16 | FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL} |
9468 | 16 | }, |
9469 | 16 | { &hf_nvme_identify_ctrl_rrls[11], |
9470 | 16 | { "Read Recovery Level 10 Support", "nvme.cmd.identify.ctrl.rrls.rrls10", |
9471 | 16 | FT_BOOLEAN, 16, NULL, 0x400, NULL, HFILL} |
9472 | 16 | }, |
9473 | 16 | { &hf_nvme_identify_ctrl_rrls[12], |
9474 | 16 | { "Read Recovery Level 11 Support", "nvme.cmd.identify.ctrl.rrls.rrls11", |
9475 | 16 | FT_BOOLEAN, 16, NULL, 0x800, NULL, HFILL} |
9476 | 16 | }, |
9477 | 16 | { &hf_nvme_identify_ctrl_rrls[13], |
9478 | 16 | { "Read Recovery Level 12 Support", "nvme.cmd.identify.ctrl.rrls.rrls12", |
9479 | 16 | FT_BOOLEAN, 16, NULL, 0x1000, NULL, HFILL} |
9480 | 16 | }, |
9481 | 16 | { &hf_nvme_identify_ctrl_rrls[14], |
9482 | 16 | { "Read Recovery Level 13 Support", "nvme.cmd.identify.ctrl.rrls.rrls13", |
9483 | 16 | FT_BOOLEAN, 16, NULL, 0x2000, NULL, HFILL} |
9484 | 16 | }, |
9485 | 16 | { &hf_nvme_identify_ctrl_rrls[15], |
9486 | 16 | { "Read Recovery Level 14 Support", "nvme.cmd.identify.ctrl.rrls.rrls14", |
9487 | 16 | FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL} |
9488 | 16 | }, |
9489 | 16 | { &hf_nvme_identify_ctrl_rrls[16], |
9490 | 16 | { "Read Recovery Level 15 (Fast Fail) Support", "nvme.cmd.identify.ctrl.rrls.rrls15", |
9491 | 16 | FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL} |
9492 | 16 | }, |
9493 | 16 | { &hf_nvme_identify_ctrl_bpcap[0], |
9494 | 16 | { "Boot Partition Capabilities (BPCAP)", "nvme.cmd.identify.ctrl.bpcap", |
9495 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9496 | 16 | }, |
9497 | 16 | { &hf_nvme_identify_ctrl_bpcap[1], |
9498 | 16 | { "RPMB Boot Partition Write Protection Support (RPMBBPWPS)", "nvme.cmd.identify.ctrl.bpcap.rpmbbpwps", |
9499 | 16 | FT_UINT8, BASE_HEX, VALS(ctrl_rpmbbpwps_tbl), 0x3, NULL, HFILL} |
9500 | 16 | }, |
9501 | 16 | { &hf_nvme_identify_ctrl_bpcap[2], |
9502 | 16 | { "Set Features Boot Partition Write Protection Support (SFBPWPS)", "nvme.cmd.identify.ctrl.bpcap.sfbpwps", |
9503 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
9504 | 16 | }, |
9505 | 16 | { &hf_nvme_identify_ctrl_bpcap[3], |
9506 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.bpcap.rsvd", |
9507 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
9508 | 16 | }, |
9509 | 16 | { &hf_nvme_identify_ctrl_rsvd0, |
9510 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd0", |
9511 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9512 | 16 | }, |
9513 | 16 | { &hf_nvme_identify_ctrl_nssl, |
9514 | 16 | { "NVM Subsystem Shutdown Latency (NSSL)", "nvme.cmd.identify.ctrl.nssl", |
9515 | 16 | FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_microseconds), 0x0, NULL, HFILL} |
9516 | 16 | }, |
9517 | 16 | { &hf_nvme_identify_ctrl_rsvd6, |
9518 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd6", |
9519 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9520 | 16 | }, |
9521 | 16 | { &hf_nvme_identify_ctrl_plsi[0], |
9522 | 16 | { "Power Loss Signaling Information (PLSI)", "nvme.cmd.identify.ctrl.plsi", |
9523 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9524 | 16 | }, |
9525 | 16 | { &hf_nvme_identify_ctrl_plsi[1], |
9526 | 16 | { "PLS Emergency Power Fail (PLSEPF)", "nvme.cmd.identify.ctrl.plsi.plsepf", |
9527 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9528 | 16 | }, |
9529 | 16 | { &hf_nvme_identify_ctrl_plsi[2], |
9530 | 16 | { "PLS Forced Quiescence (PLSFQ)", "nvme.cmd.identify.ctrl.plsi.plsfq", |
9531 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9532 | 16 | }, |
9533 | 16 | { &hf_nvme_identify_ctrl_plsi[3], |
9534 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.plsi.rsvd", |
9535 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9536 | 16 | }, |
9537 | 16 | { &hf_nvme_identify_ctrl_cntrltype, |
9538 | 16 | { "Controller Type (CNTRLTYPE)", "nvme.cmd.identify.ctrl.cntrltype", |
9539 | 16 | FT_UINT8, BASE_HEX, VALS(ctrl_type_tbl), 0x0, NULL, HFILL} |
9540 | 16 | }, |
9541 | 16 | { &hf_nvme_identify_ctrl_fguid, |
9542 | 16 | { "FRU Globally Unique Identifier (FGUID)", "nvme.cmd.identify.ctrl.fguid", |
9543 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9544 | 16 | }, |
9545 | 16 | { &hf_nvme_identify_ctrl_fguid_vse, |
9546 | 16 | { "Vendor Specific Extension Identifier", "nvme.cmd.identify.ctrl.fguid.vse", |
9547 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9548 | 16 | }, |
9549 | 16 | { &hf_nvme_identify_ctrl_fguid_oui, |
9550 | 16 | { "Organizationally Unique Identifier", "nvme.cmd.identify.ctrl.fguid.oui", |
9551 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9552 | 16 | }, |
9553 | 16 | { &hf_nvme_identify_ctrl_fguid_ei, |
9554 | 16 | { "Extension Identifier", "nvme.cmd.identify.ctrl.fguid.ei", |
9555 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9556 | 16 | }, |
9557 | 16 | { &hf_nvme_identify_ctrl_crdt1, |
9558 | 16 | { "Command Retry Delay Time 1", "nvme.cmd.identify.ctrl.crdt1", |
9559 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
9560 | 16 | }, |
9561 | 16 | { &hf_nvme_identify_ctrl_crdt2, |
9562 | 16 | { "Command Retry Delay Time 2", "nvme.cmd.identify.ctrl.crdt2", |
9563 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
9564 | 16 | }, |
9565 | 16 | { &hf_nvme_identify_ctrl_crdt3, |
9566 | 16 | { "Command Retry Delay Time 3", "nvme.cmd.identify.ctrl.crdt3", |
9567 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
9568 | 16 | }, |
9569 | 16 | { &hf_nvme_identify_ctrl_crcap[0], |
9570 | 16 | { "Controller Reachability Capabilities (CRCAP)", "nvme.cmd.identify.ctrl.crcap", |
9571 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9572 | 16 | }, |
9573 | 16 | { &hf_nvme_identify_ctrl_crcap[1], |
9574 | 16 | { "Reachability Reporting Supported (RRSUP)", "nvme.cmd.identify.ctrl.crcap.rrsup", |
9575 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9576 | 16 | }, |
9577 | 16 | { &hf_nvme_identify_ctrl_crcap[2], |
9578 | 16 | { "Reachability Group ID Changeable (RGIDC)", "nvme.cmd.identify.ctrl.crcap.rgidc", |
9579 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9580 | 16 | }, |
9581 | 16 | { &hf_nvme_identify_ctrl_crcap[3], |
9582 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.crcap.rsvd", |
9583 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9584 | 16 | }, |
9585 | 16 | { &hf_nvme_identify_ctrl_ciu, |
9586 | 16 | { "Controller Instance Uniquifier (CIU)", "nvme.cmd.identify.ctrl.ciu", |
9587 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9588 | 16 | }, |
9589 | 16 | { &hf_nvme_identify_ctrl_cirn, |
9590 | 16 | { "Controller Instance Random Number (CIRN)", "nvme.cmd.identify.ctrl.cirn", |
9591 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9592 | 16 | }, |
9593 | 16 | { &hf_nvme_identify_ctrl_rsvd1, |
9594 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd1", |
9595 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9596 | 16 | }, |
9597 | 16 | { &hf_nvme_identify_ctrl_mi, |
9598 | 16 | { "NVMe Management Interface", "nvme.cmd.identify.ctrl.mi", |
9599 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9600 | 16 | }, |
9601 | 16 | { &hf_nvme_identify_ctrl_mi_rsvd, |
9602 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.mi.rsvd", |
9603 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
9604 | 16 | }, |
9605 | 16 | { &hf_nvme_identify_ctrl_mi_nvmsr[0], |
9606 | 16 | { "NVM Subsystem Report (NVMSR)", "nvme.cmd.identify.ctrl.mi.nvmsr", |
9607 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9608 | 16 | }, |
9609 | 16 | { &hf_nvme_identify_ctrl_mi_nvmsr[1], |
9610 | 16 | { "NVMe Storage Device (NVMESD)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmesd", |
9611 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9612 | 16 | }, |
9613 | 16 | { &hf_nvme_identify_ctrl_mi_nvmsr[2], |
9614 | 16 | { "NVMe Enclosure (NVMEE)", "nvme.cmd.identify.ctrl.mi.nvmsr.nvmee", |
9615 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9616 | 16 | }, |
9617 | 16 | { &hf_nvme_identify_ctrl_mi_nvmsr[3], |
9618 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.mi.nvmsr.rsvd", |
9619 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9620 | 16 | }, |
9621 | 16 | { &hf_nvme_identify_ctrl_mi_vwci[0], |
9622 | 16 | { "VPD Write Cycle Information (VWCI)", "nvme.cmd.identify.ctrl.mi.vwci", |
9623 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9624 | 16 | }, |
9625 | 16 | { &hf_nvme_identify_ctrl_mi_vwci[1], |
9626 | 16 | { "VPD Write Cycles Remaining (VWCR)", "nvme.cmd.identify.ctrl.mi.vwci.vwcr", |
9627 | 16 | FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
9628 | 16 | }, |
9629 | 16 | { &hf_nvme_identify_ctrl_mi_vwci[2], |
9630 | 16 | { "VPD Write Cycle Remaining Valid (VWCRV)", "nvme.cmd.identify.ctrl.mi.vwci.vwcrv", |
9631 | 16 | FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} |
9632 | 16 | }, |
9633 | 16 | { &hf_nvme_identify_ctrl_mi_mec[0], |
9634 | 16 | { "Management Endpoint Capabilities (MEC)", "nvme.cmd.identify.ctrl.mi.mec", |
9635 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9636 | 16 | }, |
9637 | 16 | { &hf_nvme_identify_ctrl_mi_mec[1], |
9638 | 16 | { "SMBus/I2C Port Management Endpoint (SMBUSME)", "nvme.cmd.identify.ctrl.mi.mec.smbusme", |
9639 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9640 | 16 | }, |
9641 | 16 | { &hf_nvme_identify_ctrl_mi_mec[2], |
9642 | 16 | { "PCIe Port Management Endpoint (PCIEME)", "nvme.cmd.identify.ctrl.mi.mec.pcieme", |
9643 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9644 | 16 | }, |
9645 | 16 | { &hf_nvme_identify_ctrl_mi_mec[3], |
9646 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.mi.mec.rsvd", |
9647 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9648 | 16 | }, |
9649 | 16 | { &hf_nvme_identify_ctrl_oacs[0], |
9650 | 16 | { "Optional Admin Command Support (OACS)", "nvme.cmd.identify.ctrl.oacs", |
9651 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9652 | 16 | }, |
9653 | 16 | { &hf_nvme_identify_ctrl_oacs[1], |
9654 | 16 | { "Security Send and Security Receive Support", "nvme.cmd.identify.ctrl.oacs.sec", |
9655 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
9656 | 16 | }, |
9657 | 16 | { &hf_nvme_identify_ctrl_oacs[2], |
9658 | 16 | { "Format NVM Support", "nvme.cmd.identify.ctrl.oacs.fmt", |
9659 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
9660 | 16 | }, |
9661 | 16 | { &hf_nvme_identify_ctrl_oacs[3], |
9662 | 16 | { "Firmware Download and Commit Support", "nvme.cmd.identify.ctrl.oacs.fw", |
9663 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
9664 | 16 | }, |
9665 | 16 | { &hf_nvme_identify_ctrl_oacs[4], |
9666 | 16 | { "Namespace Management Support", "nvme.cmd.identify.ctrl.oacs.nsmgmt", |
9667 | 16 | FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL} |
9668 | 16 | }, |
9669 | 16 | { &hf_nvme_identify_ctrl_oacs[5], |
9670 | 16 | { "Device Self-Test Support", "nvme.cmd.identify.ctrl.oacs.stst", |
9671 | 16 | FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL} |
9672 | 16 | }, |
9673 | 16 | { &hf_nvme_identify_ctrl_oacs[6], |
9674 | 16 | { "Directive Send and Directive Receive Support", "nvme.cmd.identify.ctrl.oacs.dtv", |
9675 | 16 | FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL} |
9676 | 16 | }, |
9677 | 16 | { &hf_nvme_identify_ctrl_oacs[7], |
9678 | 16 | { "NVMe-MI Send and NVMe-MI Receive Support", "nvme.cmd.identify.ctrl.oacs.mi", |
9679 | 16 | FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL} |
9680 | 16 | }, |
9681 | 16 | { &hf_nvme_identify_ctrl_oacs[8], |
9682 | 16 | { "Virtualization Management Support", "nvme.cmd.identify.ctrl.oacs.vm", |
9683 | 16 | FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL} |
9684 | 16 | }, |
9685 | 16 | { &hf_nvme_identify_ctrl_oacs[9], |
9686 | 16 | { "Doorbell Buffer Config Support", "nvme.cmd.identify.ctrl.oacs.db", |
9687 | 16 | FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL} |
9688 | 16 | }, |
9689 | 16 | { &hf_nvme_identify_ctrl_oacs[10], |
9690 | 16 | { "Get LBA Status Support", "nvme.cmd.identify.ctrl.oacs.sec.lba", |
9691 | 16 | FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL} |
9692 | 16 | }, |
9693 | 16 | { &hf_nvme_identify_ctrl_oacs[11], |
9694 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.oacs.sec.rsvd", |
9695 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfc00, NULL, HFILL} |
9696 | 16 | }, |
9697 | 16 | { &hf_nvme_identify_ctrl_acl, |
9698 | 16 | { "Abort Command Limit (ACL)", "nvme.cmd.identify.ctrl.acl", |
9699 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_commands), 0x0, NULL, HFILL} |
9700 | 16 | }, |
9701 | 16 | { &hf_nvme_identify_ctrl_aerl, |
9702 | 16 | { "Asynchronous Event Request Limit (AERL)", "nvme.cmd.identify.ctrl.aerl", |
9703 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_events), 0x0, NULL, HFILL} |
9704 | 16 | }, |
9705 | 16 | { &hf_nvme_identify_ctrl_frmw[0], |
9706 | 16 | { "Firmware Updates (FRMW)", "nvme.cmd.identify.ctrl.frmw", |
9707 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9708 | 16 | }, |
9709 | 16 | { &hf_nvme_identify_ctrl_frmw[1], |
9710 | 16 | { "First Firmware Slot Read-Only", "nvme.cmd.identify.ctrl.frmw.fro", |
9711 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9712 | 16 | }, |
9713 | 16 | { &hf_nvme_identify_ctrl_frmw[2], |
9714 | 16 | { "Number of Firmware Slots", "nvme.cmd.identify.ctrl.frmw.fsn", |
9715 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe, NULL, HFILL} |
9716 | 16 | }, |
9717 | 16 | { &hf_nvme_identify_ctrl_frmw[3], |
9718 | 16 | { "Supports Activation Without Reset", "nvme.cmd.identify.ctrl.frmw.anr", |
9719 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
9720 | 16 | }, |
9721 | 16 | { &hf_nvme_identify_ctrl_frmw[4], |
9722 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.frmw.rsvd", |
9723 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
9724 | 16 | }, |
9725 | 16 | { &hf_nvme_identify_ctrl_lpa[0], |
9726 | 16 | { "Log Page Attributes (LPA)", "nvme.cmd.identify.ctrl.lpa", |
9727 | 16 | FT_BOOLEAN, 8, NULL, 0x0, NULL, HFILL} |
9728 | 16 | }, |
9729 | 16 | { &hf_nvme_identify_ctrl_lpa[1], |
9730 | 16 | { "Smart Log Page per Namespace Support", "nvme.cmd.identify.ctrl.lpa.smrt", |
9731 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9732 | 16 | }, |
9733 | 16 | { &hf_nvme_identify_ctrl_lpa[2], |
9734 | 16 | { "Commands Supported and Effects Log Page Support", "nvme.cmd.identify.ctrl.lpa.cmds", |
9735 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9736 | 16 | }, |
9737 | 16 | { &hf_nvme_identify_ctrl_lpa[3], |
9738 | 16 | { "Extended Data Get Log Page Support", "nvme.cmd.identify.ctrl.lpa.elp", |
9739 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
9740 | 16 | }, |
9741 | 16 | { &hf_nvme_identify_ctrl_lpa[4], |
9742 | 16 | { "Telemetry Log Page and Notices Support", "nvme.cmd.identify.ctrl.lpa.tel", |
9743 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
9744 | 16 | }, |
9745 | 16 | { &hf_nvme_identify_ctrl_lpa[5], |
9746 | 16 | { "Persistent Event Log Support", "nvme.cmd.identify.ctrl.lpa.ple", |
9747 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
9748 | 16 | }, |
9749 | 16 | { &hf_nvme_identify_ctrl_lpa[6], |
9750 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.lpa.rsvd", |
9751 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
9752 | 16 | }, |
9753 | 16 | { &hf_nvme_identify_ctrl_elpe, |
9754 | 16 | { "Error Log Page Entries (ELPE)", "nvme.cmd.identify.ctrl.elpe", |
9755 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_entries), 0x0, NULL, HFILL} |
9756 | 16 | }, |
9757 | 16 | { &hf_nvme_identify_ctrl_npss, |
9758 | 16 | { "Number of Power States Supported (NPSS)", "nvme.cmd.identify.ctrl.npss", |
9759 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_states), 0x0, NULL, HFILL} |
9760 | 16 | }, |
9761 | 16 | { &hf_nvme_identify_ctrl_avscc[0], |
9762 | 16 | { "Admin Vendor Specific Command Configuration (AVSCC)", "nvme.cmd.identify.ctrl.avscc", |
9763 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9764 | 16 | }, |
9765 | 16 | { &hf_nvme_identify_ctrl_avscc[1], |
9766 | 16 | { "Standard Command Format", "nvme.cmd.identify.ctrl.avscc.std", |
9767 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9768 | 16 | }, |
9769 | 16 | { &hf_nvme_identify_ctrl_avscc[2], |
9770 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.avscc.rsvd", |
9771 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
9772 | 16 | }, |
9773 | 16 | { &hf_nvme_identify_ctrl_apsta[0], |
9774 | 16 | { "Autonomous Power State Transition Attributes (APSTA)", "nvme.cmd.identify.ctrl.apsta", |
9775 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9776 | 16 | }, |
9777 | 16 | { &hf_nvme_identify_ctrl_apsta[1], |
9778 | 16 | { "Autonomous Power State Transitions Supported", "nvme.cmd.identify.ctrl.apsta.aut", |
9779 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9780 | 16 | }, |
9781 | 16 | { &hf_nvme_identify_ctrl_apsta[2], |
9782 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.apsta.rsvd", |
9783 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
9784 | 16 | }, |
9785 | 16 | { &hf_nvme_identify_ctrl_wctemp, |
9786 | 16 | { "Warning Composite Temperature Threshold (WCTEMP)", "nvme.cmd.identify.ctrl.wctemp", |
9787 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9788 | 16 | }, |
9789 | 16 | { &hf_nvme_identify_ctrl_cctemp, |
9790 | 16 | { "Critical Composite Temperature Threshold (CCTEMP)", "nvme.cmd.identify.ctrl.cctemp", |
9791 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9792 | 16 | }, |
9793 | 16 | { &hf_nvme_identify_ctrl_mtfa, |
9794 | 16 | { "Maximum Time for Firmware Activation (MTFA)", "nvme.cmd.identify.ctrl.mtfa", |
9795 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
9796 | 16 | }, |
9797 | 16 | { &hf_nvme_identify_ctrl_hmpre, |
9798 | 16 | { "Host Memory Buffer Preferred Size (HMPRE)", "nvme.cmd.identify.ctrl.hmpre", |
9799 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL} |
9800 | 16 | }, |
9801 | 16 | { &hf_nvme_identify_ctrl_hmmin, |
9802 | 16 | { "Host Memory Buffer Minimum Size (HMMIN)", "nvme.cmd.identify.ctrl.hmmin", |
9803 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL} |
9804 | 16 | }, |
9805 | 16 | { &hf_nvme_identify_ctrl_tnvmcap, |
9806 | 16 | { "Total NVM Capacity (TNVMCAP)", "nvme.cmd.identify.ctrl.tnvmcap", |
9807 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
9808 | 16 | }, |
9809 | 16 | { &hf_nvme_identify_ctrl_unvmcap, |
9810 | 16 | { "Unallocated NVM Capacity (UNVMCAP)", "nvme.cmd.identify.ctrl.unvmcap", |
9811 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
9812 | 16 | }, |
9813 | 16 | { &hf_nvme_identify_ctrl_rpmbs[0], |
9814 | 16 | { "Replay Protected Memory Block Support (RPMBS)", "nvme.cmd.identify.ctrl.rpmbs", |
9815 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9816 | 16 | }, |
9817 | 16 | { &hf_nvme_identify_ctrl_rpmbs[1], |
9818 | 16 | { "Number of RPMB Units", "nvme.cmd.identify.ctrl.rpmbs.nu", |
9819 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL} |
9820 | 16 | }, |
9821 | 16 | { &hf_nvme_identify_ctrl_rpmbs[2], |
9822 | 16 | { "Authentication Method", "nvme.cmd.identify.ctrl.rpmbs.au", |
9823 | 16 | FT_UINT32, BASE_HEX, NULL, 0x38, NULL, HFILL} |
9824 | 16 | }, |
9825 | 16 | { &hf_nvme_identify_ctrl_rpmbs[3], |
9826 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rpmbs.rsvd", |
9827 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffc0, NULL, HFILL} |
9828 | 16 | }, |
9829 | 16 | { &hf_nvme_identify_ctrl_rpmbs[4], |
9830 | 16 | { "Total RPMB Unit Size (128 KiB blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.ts", |
9831 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
9832 | 16 | }, |
9833 | 16 | { &hf_nvme_identify_ctrl_rpmbs[5], |
9834 | 16 | { "Access Size (512-byte blocks, zero based)", "nvme.cmd.identify.ctrl.rpmbs.as", |
9835 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
9836 | 16 | }, |
9837 | 16 | { &hf_nvme_identify_ctrl_edstt, |
9838 | 16 | { "Extended Device Self-test Time (EDSTT) (in minutes)", "nvme.cmd.identify.ctrl.edstt", |
9839 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9840 | 16 | }, |
9841 | 16 | { &hf_nvme_identify_ctrl_dsto[0], |
9842 | 16 | { "Device Self-test Options (DSTO)", "nvme.cmd.identify.ctrl.dsto", |
9843 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9844 | 16 | }, |
9845 | 16 | { &hf_nvme_identify_ctrl_dsto[1], |
9846 | 16 | { "Single Device Self-test Operation (SDSO)", "nvme.cmd.identify.ctrl.dsto.mds", |
9847 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9848 | 16 | }, |
9849 | 16 | { &hf_nvme_identify_ctrl_dsto[2], |
9850 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.dsto.rsvd", |
9851 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
9852 | 16 | }, |
9853 | 16 | { &hf_nvme_identify_ctrl_fwug, |
9854 | 16 | { "Firmware Update Granularity in 4 KiB Units (FWUG)", "nvme.cmd.identify.ctrl.fwug", |
9855 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9856 | 16 | }, |
9857 | 16 | { &hf_nvme_identify_ctrl_kas, |
9858 | 16 | { "Keep Alive Support - Timer Value (KAS)", "nvme.cmd.identify.ctrl.kas", |
9859 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
9860 | 16 | }, |
9861 | 16 | { &hf_nvme_identify_ctrl_hctma[0], |
9862 | 16 | { "Host Controlled Thermal Management Attributes (HCTMA)", "nvme.cmd.identify.ctrl.hctma", |
9863 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9864 | 16 | }, |
9865 | 16 | { &hf_nvme_identify_ctrl_hctma[1], |
9866 | 16 | { "Controller Supports Thermal Management", "nvme.cmd.identify.ctrl.hctma.sup", |
9867 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
9868 | 16 | }, |
9869 | 16 | { &hf_nvme_identify_ctrl_hctma[2], |
9870 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.hctma.rsvd", |
9871 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL} |
9872 | 16 | }, |
9873 | 16 | { &hf_nvme_identify_ctrl_mntmt, |
9874 | 16 | { "Minimum Thermal Management Temperature (MNTMT)", "nvme.cmd.identify.ctrl.mntmt", |
9875 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL} |
9876 | 16 | }, |
9877 | 16 | { &hf_nvme_identify_ctrl_mxtmt, |
9878 | 16 | { "Maximum Thermal Management Temperature (MXTMT)", "nvme.cmd.identify.ctrl.mxtmt", |
9879 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_tmt), 0x0, NULL, HFILL} |
9880 | 16 | }, |
9881 | 16 | { &hf_nvme_identify_ctrl_sanicap[0], |
9882 | 16 | { "Sanitize Capabilities (SANICAP)", "nvme.cmd.identify.ctrl.sanicap", |
9883 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9884 | 16 | }, |
9885 | 16 | { &hf_nvme_identify_ctrl_sanicap[1], |
9886 | 16 | { "Crypto Erase Support (CES)", "nvme.cmd.identify.ctrl.sanicap.ces", |
9887 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
9888 | 16 | }, |
9889 | 16 | { &hf_nvme_identify_ctrl_sanicap[2], |
9890 | 16 | { "Block Erase Support (BES)", "nvme.cmd.identify.ctrl.sanicap.bes", |
9891 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
9892 | 16 | }, |
9893 | 16 | { &hf_nvme_identify_ctrl_sanicap[3], |
9894 | 16 | { "Overwrite Support (OWS)", "nvme.cmd.identify.ctrl.sanicap.ows", |
9895 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
9896 | 16 | }, |
9897 | 16 | { &hf_nvme_identify_ctrl_sanicap[4], |
9898 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.sanicap.rsvd", |
9899 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1ffffff8, NULL, HFILL} |
9900 | 16 | }, |
9901 | 16 | { &hf_nvme_identify_ctrl_sanicap[5], |
9902 | 16 | { "No-Deallocate Inhibited (NDI)", "nvme.cmd.identify.ctrl.sanicap.ndi", |
9903 | 16 | FT_BOOLEAN, 32, NULL, 0x20000000, NULL, HFILL} |
9904 | 16 | }, |
9905 | 16 | { &hf_nvme_identify_ctrl_sanicap[6], |
9906 | 16 | { "No-Deallocate Modifies Media After Sanitize (NODMMAS)", "nvme.cmd.identify.ctrl.sanicap.nodmmas", |
9907 | 16 | FT_UINT32, BASE_HEX, VALS(mmas_type_tbl), 0xc0000000, NULL, HFILL} |
9908 | 16 | }, |
9909 | 16 | { &hf_nvme_identify_ctrl_hmmminds, |
9910 | 16 | { "Host Memory Buffer Minimum Descriptor Entry Size in 4 KiB Units (HMMINDS)", "nvme.cmd.identify.ctrl.hmmminds", |
9911 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9912 | 16 | }, |
9913 | 16 | { &hf_nvme_identify_ctrl_hmmaxd, |
9914 | 16 | { "Host Memory Maximum Descriptors Entries (HMMAXD)", "nvme.cmd.identify.ctrl.hmmaxd", |
9915 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9916 | 16 | }, |
9917 | 16 | { &hf_nvme_identify_ctrl_nsetidmax, |
9918 | 16 | { "NVM Set Identifier Maximum (NSETIDMAX)", "nvme.cmd.identify.ctrl.nsetidmax", |
9919 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9920 | 16 | }, |
9921 | 16 | { &hf_nvme_identify_ctrl_endgidmax, |
9922 | 16 | { "Endurance Group Identifier Maximum (ENDGIDMAX)", "nvme.cmd.identify.ctrl.endgidmax", |
9923 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9924 | 16 | }, |
9925 | 16 | { &hf_nvme_identify_ctrl_anatt, |
9926 | 16 | { "ANA Transition Time in Seconds (ANATT)", "nvme.cmd.identify.ctrl.anatt", |
9927 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9928 | 16 | }, |
9929 | 16 | { &hf_nvme_identify_ctrl_anacap[0], |
9930 | 16 | { "Asymmetric Namespace Access Capabilities (ANACAP)", "nvme.cmd.identify.ctrl.anacap", |
9931 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9932 | 16 | }, |
9933 | 16 | { &hf_nvme_identify_ctrl_anacap[1], |
9934 | 16 | { "Reports ANA Optimized State", "nvme.cmd.identify.ctrl.anacap.osr", |
9935 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9936 | 16 | }, |
9937 | 16 | { &hf_nvme_identify_ctrl_anacap[2], |
9938 | 16 | { "Reports ANA Non-Optimized State", "nvme.cmd.identify.ctrl.anacap.nosr", |
9939 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9940 | 16 | }, |
9941 | 16 | { &hf_nvme_identify_ctrl_anacap[3], |
9942 | 16 | { "Reports Inaccessible State", "nvme.cmd.identify.ctrl.anacap.isr", |
9943 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
9944 | 16 | }, |
9945 | 16 | { &hf_nvme_identify_ctrl_anacap[4], |
9946 | 16 | { "Reports ANA Persistent Loss State", "nvme.cmd.identify.ctrl.anacap.plsr", |
9947 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
9948 | 16 | }, |
9949 | 16 | { &hf_nvme_identify_ctrl_anacap[5], |
9950 | 16 | { "Reports ANA Change State", "nvme.cmd.identify.ctrl.anacap.csr", |
9951 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
9952 | 16 | }, |
9953 | 16 | { &hf_nvme_identify_ctrl_anacap[6], |
9954 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.anacap.rsvd", |
9955 | 16 | FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL} |
9956 | 16 | }, |
9957 | 16 | { &hf_nvme_identify_ctrl_anacap[7], |
9958 | 16 | { "ANAGRPID field in the Identify Namespace does not change", "nvme.cmd.identify.ctrl.anacap.panagrpid", |
9959 | 16 | FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL} |
9960 | 16 | }, |
9961 | 16 | { &hf_nvme_identify_ctrl_anacap[8], |
9962 | 16 | { "Supports non-zero value in the ANAGRPID field", "nvme.cmd.identify.ctrl.anacap.nzpanagrpid", |
9963 | 16 | FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} |
9964 | 16 | }, |
9965 | 16 | { &hf_nvme_identify_ctrl_anagrpmax, |
9966 | 16 | { "ANA Group Identifier Maximum (ANAGRPMAX)", "nvme.cmd.identify.ctrl.anagrpmax", |
9967 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9968 | 16 | }, |
9969 | 16 | { &hf_nvme_identify_ctrl_nanagrpid, |
9970 | 16 | { "Number of ANA Group Identifiers (NANAGRPID)", "nvme.cmd.identify.ctrl.nanagrpid", |
9971 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9972 | 16 | }, |
9973 | 16 | { &hf_nvme_identify_ctrl_pels, |
9974 | 16 | { "Persistent Event Log Size in 64 KiB Units (PELS)", "nvme.cmd.identify.ctrl.pels", |
9975 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
9976 | 16 | }, |
9977 | 16 | { &hf_nvme_identify_ctrl_did, |
9978 | 16 | { "Domain Identifier (DID)", "nvme.cmd.identify.ctrl.did", |
9979 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9980 | 16 | }, |
9981 | 16 | { &hf_nvme_identify_ctrl_kpioc[0], |
9982 | 16 | { "Key Per I/O Capabilities (KPIOC)", "nvme.cmd.identify.ctrl.kpioc", |
9983 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
9984 | 16 | }, |
9985 | 16 | { &hf_nvme_identify_ctrl_kpioc[1], |
9986 | 16 | { "Key Per I/O Supported (KPIOS)", "nvme.cmd.identify.ctrl.kpioc.kpios", |
9987 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
9988 | 16 | }, |
9989 | 16 | { &hf_nvme_identify_ctrl_kpioc[2], |
9990 | 16 | { "Key Per I/O Scope (KPIOSC)", "nvme.cmd.identify.ctrl.kpioc.kpiosc", |
9991 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
9992 | 16 | }, |
9993 | 16 | { &hf_nvme_identify_ctrl_kpioc[3], |
9994 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.kpioc.rsvd", |
9995 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
9996 | 16 | }, |
9997 | 16 | { &hf_nvme_identify_ctrl_rsvd2, |
9998 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd2", |
9999 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10000 | 16 | }, |
10001 | 16 | { &hf_nvme_identify_ctrl_mptfawr, |
10002 | 16 | { "Maximum Processing Time for Firmware Activation Without Reset (MPTFAWR)", "nvme.cmd.identify.ctrl.mptfawr", |
10003 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_ms), 0x0, NULL, HFILL} |
10004 | 16 | }, |
10005 | 16 | { &hf_nvme_identify_ctrl_rsvd7, |
10006 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd7", |
10007 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10008 | 16 | }, |
10009 | 16 | { &hf_nvme_identify_ctrl_megcap, |
10010 | 16 | { "Max Endurance Group Capacity (MEGCAP)", "nvme.cmd.identify.ctrl.megcap", |
10011 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10012 | 16 | }, |
10013 | 16 | { &hf_nvme_identify_ctrl_tmpthha[0], |
10014 | 16 | { "Temperature Threshold Hysteresis Attributes (TMPTHHA)", "nvme.cmd.identify.ctrl.tmpthha", |
10015 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10016 | 16 | }, |
10017 | 16 | { &hf_nvme_identify_ctrl_tmpthha[1], |
10018 | 16 | { "Temperature Threshold Maximum Hysteresis (TMPTHMH)", "nvme.cmd.identify.ctrl.tmpthha.tmpthmh", |
10019 | 16 | FT_UINT8, BASE_DEC, NULL, 0x7, NULL, HFILL} |
10020 | 16 | }, |
10021 | 16 | { &hf_nvme_identify_ctrl_tmpthha[2], |
10022 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.tmpthha.rsvd", |
10023 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10024 | 16 | }, |
10025 | 16 | { &hf_nvme_identify_ctrl_mupa[0], |
10026 | 16 | { "Maximum Unlimited Power Attributes (MUPA)", "nvme.cmd.identify.ctrl.mupa", |
10027 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10028 | 16 | }, |
10029 | 16 | { &hf_nvme_identify_ctrl_mupa[1], |
10030 | 16 | { "Maximum Unlimited Power Scale (MUPS)", "nvme.cmd.identify.ctrl.mupa.mups", |
10031 | 16 | FT_UINT8, BASE_HEX, VALS(ctrl_mups_tbl), 0x3, NULL, HFILL} |
10032 | 16 | }, |
10033 | 16 | { &hf_nvme_identify_ctrl_mupa[2], |
10034 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.mupa.rsvd", |
10035 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
10036 | 16 | }, |
10037 | 16 | { &hf_nvme_identify_ctrl_cqt, |
10038 | 16 | { "Command Quiesce Time (CQT)", "nvme.cmd.identify.ctrl.cqt", |
10039 | 16 | FT_UINT16, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0x0, NULL, HFILL} |
10040 | 16 | }, |
10041 | 16 | { &hf_nvme_identify_ctrl_cdpa[0], |
10042 | 16 | { "Configurable Device Personality Attributes (CDPA)", "nvme.cmd.identify.ctrl.cdpa", |
10043 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10044 | 16 | }, |
10045 | 16 | { &hf_nvme_identify_ctrl_cdpa[1], |
10046 | 16 | { "HMAC-SHA-384 (HS3)", "nvme.cmd.identify.ctrl.cdpa.hs3", |
10047 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
10048 | 16 | }, |
10049 | 16 | { &hf_nvme_identify_ctrl_cdpa[2], |
10050 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.cdpa.rsvd", |
10051 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL} |
10052 | 16 | }, |
10053 | 16 | { &hf_nvme_identify_ctrl_mup, |
10054 | 16 | { "Maximum Unlimited Power (MUP)", "nvme.cmd.identify.ctrl.mup", |
10055 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10056 | 16 | }, |
10057 | 16 | { &hf_nvme_identify_ctrl_ipmsr[0], |
10058 | 16 | { "Interval Power Measurement Sample Rate (IPMSR)", "nvme.cmd.identify.ctrl.ipmsr", |
10059 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10060 | 16 | }, |
10061 | 16 | { &hf_nvme_identify_ctrl_ipmsr[1], |
10062 | 16 | { "Sample Rate Value (SRV)", "nvme.cmd.identify.ctrl.ipmsr.srv", |
10063 | 16 | FT_UINT16, BASE_DEC, NULL, 0x00ff, NULL, HFILL} |
10064 | 16 | }, |
10065 | 16 | { &hf_nvme_identify_ctrl_ipmsr[2], |
10066 | 16 | { "Sample Rate Scale (SRS)", "nvme.cmd.identify.ctrl.ipmsr.srs", |
10067 | 16 | FT_UINT16, BASE_HEX, VALS(ctrl_srs_tbl), 0xff00, NULL, HFILL} |
10068 | 16 | }, |
10069 | 16 | { &hf_nvme_identify_ctrl_msmt, |
10070 | 16 | { "Maximum Stop Measurement Time (MSMT)", "nvme.cmd.identify.ctrl.msmt", |
10071 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10072 | 16 | }, |
10073 | 16 | { &hf_nvme_identify_ctrl_rsvd8, |
10074 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd8", |
10075 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10076 | 16 | }, |
10077 | 16 | { &hf_nvme_identify_ctrl_sqes[0], |
10078 | 16 | { "Submission Queue Entry Size (SQES)", "nvme.cmd.identify.ctrl.sqes", |
10079 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10080 | 16 | }, |
10081 | 16 | { &hf_nvme_identify_ctrl_sqes[1], |
10082 | 16 | { "Minimum (required) Size", "nvme.cmd.identify.ctrl.sqes.mins", |
10083 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL} |
10084 | 16 | }, |
10085 | 16 | { &hf_nvme_identify_ctrl_sqes[2], |
10086 | 16 | { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.sqes.maxs", |
10087 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL} |
10088 | 16 | }, |
10089 | 16 | { &hf_nvme_identify_ctrl_cqes[0], |
10090 | 16 | { "Completion Queue Entry Size (CQES)", "nvme.cmd.identify.ctrl.cqes", |
10091 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10092 | 16 | }, |
10093 | 16 | { &hf_nvme_identify_ctrl_cqes[1], |
10094 | 16 | { "Minimum (required) Size", "nvme.cmd.identify.ctrl.cqes.mins", |
10095 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf, NULL, HFILL} |
10096 | 16 | }, |
10097 | 16 | { &hf_nvme_identify_ctrl_cqes[2], |
10098 | 16 | { "Maximum (allowed) Size", "nvme.cmd.identify.ctrl.cqes.maxs", |
10099 | 16 | FT_UINT8, BASE_CUSTOM, CF_FUNC(add_ctrl_pow2_bytes), 0xf0, NULL, HFILL} |
10100 | 16 | }, |
10101 | 16 | { &hf_nvme_identify_ctrl_maxcmd, |
10102 | 16 | { "Maximum Outstanding Commands (MAXCMD)", "nvme.cmd.identify.ctrl.maxcmd", |
10103 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10104 | 16 | }, |
10105 | 16 | { &hf_nvme_identify_ctrl_nn, |
10106 | 16 | { "Number of Namespaces (NN)", "nvme.cmd.identify.ctrl.nn", |
10107 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10108 | 16 | }, |
10109 | 16 | { &hf_nvme_identify_ctrl_oncs[0], |
10110 | 16 | { "Optional NVM Command Support (ONCS)", "nvme.cmd.identify.ctrl.oncs", |
10111 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10112 | 16 | }, |
10113 | 16 | { &hf_nvme_identify_ctrl_oncs[1], |
10114 | 16 | { "Supports Compare Command", "nvme.cmd.identify.ctrl.oncs.ccs", |
10115 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
10116 | 16 | }, |
10117 | 16 | { &hf_nvme_identify_ctrl_oncs[2], |
10118 | 16 | { "Supports Write Uncorrectable Command", "nvme.cmd.identify.ctrl.oncs.wus", |
10119 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
10120 | 16 | }, |
10121 | 16 | { &hf_nvme_identify_ctrl_oncs[3], |
10122 | 16 | { "Supports Dataset Management Command", "nvme.cmd.identify.ctrl.oncs.dsms", |
10123 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
10124 | 16 | }, |
10125 | 16 | { &hf_nvme_identify_ctrl_oncs[4], |
10126 | 16 | { "Support Write Zeroes Command", "nvme.cmd.identify.ctrl.oncs.wzs", |
10127 | 16 | FT_BOOLEAN, 16, NULL, 0x8, NULL, HFILL} |
10128 | 16 | }, |
10129 | 16 | { &hf_nvme_identify_ctrl_oncs[5], |
10130 | 16 | { "Supports non-zero Save Field in Set/Get Features", "nvme.cmd.identify.ctrl.oncs.nzfs", |
10131 | 16 | FT_BOOLEAN, 16, NULL, 0x10, NULL, HFILL} |
10132 | 16 | }, |
10133 | 16 | { &hf_nvme_identify_ctrl_oncs[6], |
10134 | 16 | { "Supports Reservations", "nvme.cmd.identify.ctrl.oncs.ress", |
10135 | 16 | FT_BOOLEAN, 16, NULL, 0x20, NULL, HFILL} |
10136 | 16 | }, |
10137 | 16 | { &hf_nvme_identify_ctrl_oncs[7], |
10138 | 16 | { "Supports Timestamps", "nvme.cmd.identify.ctrl.oncs.tstmps", |
10139 | 16 | FT_BOOLEAN, 16, NULL, 0x40, NULL, HFILL} |
10140 | 16 | }, |
10141 | 16 | { &hf_nvme_identify_ctrl_oncs[8], |
10142 | 16 | { "Supports Verify Command", "nvme.cmd.identify.ctrl.oncs.vers", |
10143 | 16 | FT_BOOLEAN, 16, NULL, 0x80, NULL, HFILL} |
10144 | 16 | }, |
10145 | 16 | { &hf_nvme_identify_ctrl_oncs[9], |
10146 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.oncs.rsvd", |
10147 | 16 | FT_UINT16, BASE_HEX, NULL, 0xff00, NULL, HFILL} |
10148 | 16 | }, |
10149 | 16 | { &hf_nvme_identify_ctrl_fuses[0], |
10150 | 16 | { "Fused Operation Support (FUSES)", "nvme.cmd.identify.ctrl.fuses", |
10151 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10152 | 16 | }, |
10153 | 16 | { &hf_nvme_identify_ctrl_fuses[1], |
10154 | 16 | { "Compare and Write Fused Operation Support", "nvme.cmd.identify.ctrl.fuses.cws", |
10155 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
10156 | 16 | }, |
10157 | 16 | { &hf_nvme_identify_ctrl_fuses[2], |
10158 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.fuses.rsvd", |
10159 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL} |
10160 | 16 | }, |
10161 | 16 | { &hf_nvme_identify_ctrl_fna[0], |
10162 | 16 | { "Format NVM Attributes (FNA)", "nvme.cmd.identify.ctrl.fna", |
10163 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10164 | 16 | }, |
10165 | 16 | { &hf_nvme_identify_ctrl_fna[1], |
10166 | 16 | { "Format Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.fall", |
10167 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10168 | 16 | }, |
10169 | 16 | { &hf_nvme_identify_ctrl_fna[2], |
10170 | 16 | { "Secure Erase Operation Applies to all Namespaces", "nvme.cmd.identify.ctrl.fna.seall", |
10171 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
10172 | 16 | }, |
10173 | 16 | { &hf_nvme_identify_ctrl_fna[3], |
10174 | 16 | { "Cryptographic Erase Supported", "nvme.cmd.identify.ctrl.fna.ces", |
10175 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
10176 | 16 | }, |
10177 | 16 | { &hf_nvme_identify_ctrl_fna[4], |
10178 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.fna.rsvd", |
10179 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10180 | 16 | }, |
10181 | 16 | { &hf_nvme_identify_ctrl_vwc[0], |
10182 | 16 | { "Volatile Write Cache (VWC)", "nvme.cmd.identify.ctrl.vwc", |
10183 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10184 | 16 | }, |
10185 | 16 | { &hf_nvme_identify_ctrl_vwc[1], |
10186 | 16 | { "Volatile Write Cache Present", "nvme.cmd.identify.ctrl.vwc.cp", |
10187 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10188 | 16 | }, |
10189 | 16 | { &hf_nvme_identify_ctrl_vwc[2], |
10190 | 16 | { "Flush Command Behavior", "nvme.cmd.identify.ctrl.vwc.cfb", |
10191 | 16 | FT_UINT8, BASE_HEX, VALS(fcb_type_tbl), 0x6, NULL, HFILL} |
10192 | 16 | }, |
10193 | 16 | { &hf_nvme_identify_ctrl_vwc[3], |
10194 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.vwc.rsvd", |
10195 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10196 | 16 | }, |
10197 | 16 | { &hf_nvme_identify_ctrl_awun, |
10198 | 16 | { "Atomic Write Unit Normal (AWUN)", "nvme.cmd.identify.ctrl.awun", |
10199 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL} |
10200 | 16 | }, |
10201 | 16 | { &hf_nvme_identify_ctrl_awupf, |
10202 | 16 | { "Atomic Write Unit Power Fail (AWUPF)", "nvme.cmd.identify.ctrl.awupf", |
10203 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_lblocks), 0x0, NULL, HFILL} |
10204 | 16 | }, |
10205 | 16 | { &hf_nvme_identify_ctrl_nvscc[0], |
10206 | 16 | { "NVM Vendor Specific Command Configuration (NVSCC)", "nvme.cmd.identify.ctrl.nvscc", |
10207 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10208 | 16 | }, |
10209 | 16 | { &hf_nvme_identify_ctrl_nvscc[1], |
10210 | 16 | { "Standard Format Used for Vendor Specific Commands", "nvme.cmd.identify.ctrl.nvscc.std", |
10211 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10212 | 16 | }, |
10213 | 16 | { &hf_nvme_identify_ctrl_nvscc[2], |
10214 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.nvscc.rsvd", |
10215 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
10216 | 16 | }, |
10217 | 16 | { &hf_nvme_identify_ctrl_nwpc[0], |
10218 | 16 | { "Namespace Write Protection Capabilities (NWPC)", "nvme.cmd.identify.ctrl.nwpc", |
10219 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10220 | 16 | }, |
10221 | 16 | { &hf_nvme_identify_ctrl_nwpc[1], |
10222 | 16 | { "No Write Protect and Write Protect namespace write protection states Support", "nvme.cmd.identify.ctrl.nwpc.wpss", |
10223 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10224 | 16 | }, |
10225 | 16 | { &hf_nvme_identify_ctrl_nwpc[2], |
10226 | 16 | { "Write Protect Until Power Cycle state Support", "nvme.cmd.identify.ctrl.nwpc.wppcs", |
10227 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
10228 | 16 | }, |
10229 | 16 | { &hf_nvme_identify_ctrl_nwpc[3], |
10230 | 16 | { "Permanent Write Protect state Support", "nvme.cmd.identify.ctrl.nwpc.pwpss", |
10231 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
10232 | 16 | }, |
10233 | 16 | { &hf_nvme_identify_ctrl_nwpc[4], |
10234 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.nwpc.rsvd", |
10235 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10236 | 16 | }, |
10237 | 16 | { &hf_nvme_identify_ctrl_acwu, |
10238 | 16 | { "Atomic Compare & Write Unit (ACWU)", "nvme.cmd.identify.ctrl.acwu", |
10239 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_hmpre), 0x0, NULL, HFILL} |
10240 | 16 | }, |
10241 | 16 | { &hf_nvme_identify_ctrl_rsvd3, |
10242 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd3", |
10243 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10244 | 16 | }, |
10245 | 16 | { &hf_nvme_identify_ctrl_sgls[0], |
10246 | 16 | { "SGL Support (SGLS)", "nvme.cmd.identify.ctrl.sgls", |
10247 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10248 | 16 | }, |
10249 | 16 | { &hf_nvme_identify_ctrl_sgls[1], |
10250 | 16 | { "SGL Supported", "nvme.cmd.identify.ctrl.sgls.sgls", |
10251 | 16 | FT_UINT32, BASE_HEX, VALS(sgls_ify_type_tbl), 0x3, NULL, HFILL} |
10252 | 16 | }, |
10253 | 16 | { &hf_nvme_identify_ctrl_sgls[2], |
10254 | 16 | { "Supports Keyed SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.kdbs", |
10255 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
10256 | 16 | }, |
10257 | 16 | { &hf_nvme_identify_ctrl_sgls[3], |
10258 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd0", |
10259 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfff8, NULL, HFILL} |
10260 | 16 | }, |
10261 | 16 | { &hf_nvme_identify_ctrl_sgls[4], |
10262 | 16 | { "Supports SGL Bit Bucket Descriptor", "nvme.cmd.identify.ctrl.sgls.bbd", |
10263 | 16 | FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL} |
10264 | 16 | }, |
10265 | 16 | { &hf_nvme_identify_ctrl_sgls[5], |
10266 | 16 | { "Supports byte aligned contiguous buffer in MPTR Field", "nvme.cmd.identify.ctrl.sgls.bufmptr", |
10267 | 16 | FT_BOOLEAN, 32, NULL, 0x20000, NULL, HFILL} |
10268 | 16 | }, |
10269 | 16 | { &hf_nvme_identify_ctrl_sgls[6], |
10270 | 16 | { "Supports Larger SGL List than Command Requires", "nvme.cmd.identify.ctrl.sgls.lsgl", |
10271 | 16 | FT_BOOLEAN, 32, NULL, 0x40000, NULL, HFILL} |
10272 | 16 | }, |
10273 | 16 | { &hf_nvme_identify_ctrl_sgls[7], |
10274 | 16 | { "Supports SGL Segment in MPTR Field", "nvme.cmd.identify.ctrl.sgls.kmptr", |
10275 | 16 | FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL} |
10276 | 16 | }, |
10277 | 16 | { &hf_nvme_identify_ctrl_sgls[8], |
10278 | 16 | { "Supports Address Field as offset in Data Block, Segment and Last Segment SGLs", "nvme.cmd.identify.ctrl.sgls.offs", |
10279 | 16 | FT_BOOLEAN, 32, NULL, 0x100000, NULL, HFILL} |
10280 | 16 | }, |
10281 | 16 | { &hf_nvme_identify_ctrl_sgls[9], |
10282 | 16 | { "Supports Transport SGL Data Block Descriptor", "nvme.cmd.identify.ctrl.sgls.tdbd", |
10283 | 16 | FT_BOOLEAN, 32, NULL, 0x200000, NULL, HFILL} |
10284 | 16 | }, |
10285 | 16 | { &hf_nvme_identify_ctrl_sgls[10], |
10286 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.sgls.rsvd1", |
10287 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffc00000, NULL, HFILL} |
10288 | 16 | }, |
10289 | 16 | { &hf_nvme_identify_ctrl_mnan, |
10290 | 16 | { "Maximum Number of Allowed Namespaces (MNAN)", "nvme.cmd.identify.ctrl.mnan", |
10291 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10292 | 16 | }, |
10293 | 16 | { &hf_nvme_identify_ctrl_maxdna, |
10294 | 16 | { "Maximum Domain Namespace Attachments (MAXDNA)", "nvme.cmd.identify.ctrl.maxdna", |
10295 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10296 | 16 | }, |
10297 | 16 | { &hf_nvme_identify_ctrl_maxcna, |
10298 | 16 | { "Maximum I/O Controller Namespace Attachments (MAXCNA)", "nvme.cmd.identify.ctrl.maxcna", |
10299 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10300 | 16 | }, |
10301 | 16 | { &hf_nvme_identify_ctrl_oaqd, |
10302 | 16 | { "Optimal Aggregated Queue Depth (OAQD)", "nvme.cmd.identify.ctrl.oaqd", |
10303 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10304 | 16 | }, |
10305 | 16 | { &hf_nvme_identify_ctrl_rhiri, |
10306 | 16 | { "Recommended Host-Initiated Refresh Interval (RHIRI)", "nvme.cmd.identify.ctrl.rhiri", |
10307 | 16 | FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_day_days), 0x0, NULL, HFILL} |
10308 | 16 | }, |
10309 | 16 | { &hf_nvme_identify_ctrl_hirt, |
10310 | 16 | { "Host-Initiated Refresh Time (HIRT)", "nvme.cmd.identify.ctrl.hirt", |
10311 | 16 | FT_UINT8, BASE_DEC|BASE_UNIT_STRING, UNS(&units_minutes), 0x0, NULL, HFILL} |
10312 | 16 | }, |
10313 | 16 | { &hf_nvme_identify_ctrl_cmmrtd, |
10314 | 16 | { "Controller Maximum Memory Range Tracking Descriptors (CMMRTD)", "nvme.cmd.identify.ctrl.cmmrtd", |
10315 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10316 | 16 | }, |
10317 | 16 | { &hf_nvme_identify_ctrl_nmmrtd, |
10318 | 16 | { "NVM Subsystem Maximum Memory Range Tracking Descriptors (NMMRTD)", "nvme.cmd.identify.ctrl.nmmrtd", |
10319 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10320 | 16 | }, |
10321 | 16 | { &hf_nvme_identify_ctrl_minmrtg, |
10322 | 16 | { "Minimum Memory Range Tracking Granularity (MINMRTG)", "nvme.cmd.identify.ctrl.minmrtg", |
10323 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10324 | 16 | }, |
10325 | 16 | { &hf_nvme_identify_ctrl_maxmrtg, |
10326 | 16 | { "Maximum Memory Range Tracking Granularity (MAXMRTG)", "nvme.cmd.identify.ctrl.maxmrtg", |
10327 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10328 | 16 | }, |
10329 | 16 | { &hf_nvme_identify_ctrl_trattr[0], |
10330 | 16 | { "Tracking Attributes (TRATTR)", "nvme.cmd.identify.ctrl.trattr", |
10331 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10332 | 16 | }, |
10333 | 16 | { &hf_nvme_identify_ctrl_trattr[1], |
10334 | 16 | { "Track Host Memory Changes Support (THMCS)", "nvme.cmd.identify.ctrl.trattr.thmcs", |
10335 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10336 | 16 | }, |
10337 | 16 | { &hf_nvme_identify_ctrl_trattr[2], |
10338 | 16 | { "Track User Data Changes Support (TUDCS)", "nvme.cmd.identify.ctrl.trattr.tudcs", |
10339 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
10340 | 16 | }, |
10341 | 16 | { &hf_nvme_identify_ctrl_trattr[3], |
10342 | 16 | { "Memory Range Tracking Length Limit (MRTLL)", "nvme.cmd.identify.ctrl.trattr.mrtll", |
10343 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
10344 | 16 | }, |
10345 | 16 | { &hf_nvme_identify_ctrl_trattr[4], |
10346 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.trattr.rsvd", |
10347 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10348 | 16 | }, |
10349 | 16 | { &hf_nvme_identify_ctrl_rsvd4, |
10350 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd4", |
10351 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10352 | 16 | }, |
10353 | 16 | { &hf_nvme_identify_ctrl_mcudmq, |
10354 | 16 | { "Maximum Controller User Data Migration Queues (MCUDMQ)", "nvme.cmd.identify.ctrl.mcudmq", |
10355 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10356 | 16 | }, |
10357 | 16 | { &hf_nvme_identify_ctrl_mnsudmq, |
10358 | 16 | { "Maximum NVM Subsystem User Data Migration Queues (MNSUDMQ)", "nvme.cmd.identify.ctrl.mnsudmq", |
10359 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10360 | 16 | }, |
10361 | 16 | { &hf_nvme_identify_ctrl_mcmr, |
10362 | 16 | { "Maximum CDQ Memory Ranges (MCMR)", "nvme.cmd.identify.ctrl.mcmr", |
10363 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10364 | 16 | }, |
10365 | 16 | { &hf_nvme_identify_ctrl_nmcmr, |
10366 | 16 | { "NVM Subsystem Maximum CDQ Memory Ranges (NMCMR)", "nvme.cmd.identify.ctrl.nmcmr", |
10367 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10368 | 16 | }, |
10369 | 16 | { &hf_nvme_identify_ctrl_mcdqpc, |
10370 | 16 | { "Maximum Controller Data Queue PRP Count (MCDQPC)", "nvme.cmd.identify.ctrl.mcdqpc", |
10371 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10372 | 16 | }, |
10373 | 16 | { &hf_nvme_identify_ctrl_rsvd9, |
10374 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd9", |
10375 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10376 | 16 | }, |
10377 | 16 | { &hf_nvme_identify_ctrl_subnqn, |
10378 | 16 | { "NVM Subsystem NVMe Qualified Name (SUBNQN)", "nvme.cmd.identify.ctrl.subnqn", |
10379 | 16 | FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10380 | 16 | }, |
10381 | 16 | { &hf_nvme_identify_ctrl_rsvd5, |
10382 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.rsvd5", |
10383 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10384 | 16 | }, |
10385 | 16 | { &hf_nvme_identify_ctrl_nvmeof, |
10386 | 16 | { "NVMeOF Attributes", "nvme.cmd.identify.ctrl.nvmeof", |
10387 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10388 | 16 | }, |
10389 | 16 | { &hf_nvme_identify_ctrl_nvmeof_ioccsz, |
10390 | 16 | { "I/O Queue Command Capsule Supported Size (IOCCSZ)", "nvme.cmd.identify.ctrl.nvmeof.ioccsz", |
10391 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL} |
10392 | 16 | }, |
10393 | 16 | { &hf_nvme_identify_ctrl_nvmeof_iorcsz, |
10394 | 16 | { "I/O Queue Response Capsule Supported Size (IORCSZ)", "nvme.cmd.identify.ctrl.nvmeof.iorcsz", |
10395 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL} |
10396 | 16 | }, |
10397 | 16 | { &hf_nvme_identify_ctrl_nvmeof_icdoff, |
10398 | 16 | { "In Capsule Data Offset (ICDOFF)", "nvme.cmd.identify.ctrl.nvmeof.icdoff", |
10399 | 16 | FT_UINT16, BASE_CUSTOM, CF_FUNC(add_ctrl_x16_bytes), 0x0, NULL, HFILL} |
10400 | 16 | }, |
10401 | 16 | { &hf_nvme_identify_ctrl_nvmeof_fcatt[0], |
10402 | 16 | { "Fabrics Controller Attributes (FCATT)", "nvme.cmd.identify.ctrl.nvmeof.fcatt", |
10403 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10404 | 16 | }, |
10405 | 16 | { &hf_nvme_identify_ctrl_nvmeof_fcatt[1], |
10406 | 16 | { "Dynamic Controller Model", "nvme.cmd.identify.ctrl.nvmeof.fcatt.dcm", |
10407 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
10408 | 16 | }, |
10409 | 16 | { &hf_nvme_identify_ctrl_nvmeof_fcatt[2], |
10410 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.fcatt.rsvd", |
10411 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
10412 | 16 | }, |
10413 | 16 | { &hf_nvme_identify_ctrl_nvmeof_msdbd, |
10414 | 16 | { "Maximum SGL Data Block Descriptors (MSDBD)", "nvme.cmd.identify.ctrl.nvmeof.msdbd", |
10415 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10416 | 16 | }, |
10417 | 16 | { &hf_nvme_identify_ctrl_nvmeof_ofcs[0], |
10418 | 16 | { "Optional Fabric Commands Support (OFCS)", "nvme.cmd.identify.ctrl.nvmeof.ofcs", |
10419 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10420 | 16 | }, |
10421 | 16 | { &hf_nvme_identify_ctrl_nvmeof_ofcs[1], |
10422 | 16 | { "Supports Disconnect Command", "nvme.cmd.identify.ctrl.nvmeof.ofcs.dcs", |
10423 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
10424 | 16 | }, |
10425 | 16 | { &hf_nvme_identify_ctrl_nvmeof_ofcs[2], |
10426 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.ofcs.rsvd", |
10427 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfffe, NULL, HFILL} |
10428 | 16 | }, |
10429 | 16 | { &hf_nvme_identify_ctrl_nvmeof_dctype, |
10430 | 16 | { "Discovery Controller Type (DCTYPE)", "nvme.cmd.identify.ctrl.nvmeof.dctype", |
10431 | 16 | FT_UINT8, BASE_HEX, VALS(ctrl_dctype_tbl), 0x0, NULL, HFILL} |
10432 | 16 | }, |
10433 | 16 | { &hf_nvme_identify_ctrl_nvmeof_ccrl, |
10434 | 16 | { "Cross-Controller Reset Limit (CCRL)", "nvme.cmd.identify.ctrl.nvmeof.ccrl", |
10435 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10436 | 16 | }, |
10437 | 16 | { &hf_nvme_identify_ctrl_nvmeof_rsvd, |
10438 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.nvmeof.rsvd", |
10439 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10440 | 16 | }, |
10441 | 16 | { &hf_nvme_identify_ctrl_psds, |
10442 | 16 | { "Power State Attributes", "nvme.cmd.identify.ctrl.psds", |
10443 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10444 | 16 | }, |
10445 | 16 | { &hf_nvme_identify_ctrl_psd, |
10446 | 16 | { "Power State 0 Descriptor (PSD0)", "nvme.cmd.identify.ctrl.psds.psd", |
10447 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10448 | 16 | }, |
10449 | 16 | { &hf_nvme_identify_ctrl_psd_mp, |
10450 | 16 | { "Maximum Power (MP)", "nvme.cmd.identify.ctrl.psds.psd.mp", |
10451 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10452 | 16 | }, |
10453 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd0, |
10454 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd0", |
10455 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10456 | 16 | }, |
10457 | 16 | { &hf_nvme_identify_ctrl_psd_mxps, |
10458 | 16 | { "Max Power Scale (MXPS)", "nvme.cmd.identify.ctrl.psds.psd.mxps", |
10459 | 16 | FT_BOOLEAN, 8, TFS(&units_watts), 0x1, NULL, HFILL} |
10460 | 16 | }, |
10461 | 16 | { &hf_nvme_identify_ctrl_psd_nops, |
10462 | 16 | { "Non-Operational State (NOPS)", "nvme.cmd.identify.ctrl.psds.psd.nops", |
10463 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
10464 | 16 | }, |
10465 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd1, |
10466 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd1", |
10467 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
10468 | 16 | }, |
10469 | 16 | { &hf_nvme_identify_ctrl_psd_enlat, |
10470 | 16 | { "Entry Latency (ENLAT)", "nvme.cmd.identify.ctrl.psds.psd.enlat", |
10471 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10472 | 16 | }, |
10473 | 16 | { &hf_nvme_identify_ctrl_psd_exlat, |
10474 | 16 | { "Exit Latency (EXLAT)", "nvme.cmd.identify.ctrl.psds.psd.exlat", |
10475 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10476 | 16 | }, |
10477 | 16 | { &hf_nvme_identify_ctrl_psd_rrt, |
10478 | 16 | { "Relative Read Throughput (RRT)", "nvme.cmd.identify.ctrl.psds.psd.rrt", |
10479 | 16 | FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL} |
10480 | 16 | }, |
10481 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd2, |
10482 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd2", |
10483 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
10484 | 16 | }, |
10485 | 16 | { &hf_nvme_identify_ctrl_psd_rrl, |
10486 | 16 | { "Relative Read Latency (RRL)", "nvme.cmd.identify.ctrl.psds.psd.rrl", |
10487 | 16 | FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL} |
10488 | 16 | }, |
10489 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd3, |
10490 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd3", |
10491 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
10492 | 16 | }, |
10493 | 16 | { &hf_nvme_identify_ctrl_psd_rwt, |
10494 | 16 | { "Relative Write Throughput (RWT)", "nvme.cmd.identify.ctrl.psds.psd.rwt", |
10495 | 16 | FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL} |
10496 | 16 | }, |
10497 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd4, |
10498 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd4", |
10499 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
10500 | 16 | }, |
10501 | 16 | { &hf_nvme_identify_ctrl_psd_rwl, |
10502 | 16 | { "Relative Write Latency (RWL)", "nvme.cmd.identify.ctrl.psds.psd.rwl", |
10503 | 16 | FT_UINT8, BASE_DEC, NULL, 0x1f, NULL, HFILL} |
10504 | 16 | }, |
10505 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd5, |
10506 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd5", |
10507 | 16 | FT_UINT8, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
10508 | 16 | }, |
10509 | 16 | { &hf_nvme_identify_ctrl_psd_idlp, |
10510 | 16 | { "Idle Power (IDLP)", "nvme.cmd.identify.ctrl.psds.psd.idlp", |
10511 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10512 | 16 | }, |
10513 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd6, |
10514 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd6", |
10515 | 16 | FT_UINT8, BASE_HEX, NULL, 0x3f, NULL, HFILL} |
10516 | 16 | }, |
10517 | 16 | { &hf_nvme_identify_ctrl_psd_ips, |
10518 | 16 | { "Idle Power Scale (IPS)", "nvme.cmd.identify.ctrl.psds.psd.ips", |
10519 | 16 | FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL} |
10520 | 16 | }, |
10521 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd7, |
10522 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd7", |
10523 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10524 | 16 | }, |
10525 | 16 | { &hf_nvme_identify_ctrl_psd_actp, |
10526 | 16 | { "Active Power (ACTP)", "nvme.cmd.identify.ctrl.psds.psd.actp", |
10527 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10528 | 16 | }, |
10529 | 16 | { &hf_nvme_identify_ctrl_psd_apw, |
10530 | 16 | { "Active Power Workload (APW)", "nvme.cmd.identify.ctrl.psds.psd.apw", |
10531 | 16 | FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL} |
10532 | 16 | }, |
10533 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd8, |
10534 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd8", |
10535 | 16 | FT_UINT8, BASE_HEX, NULL, 0x38, NULL, HFILL} |
10536 | 16 | }, |
10537 | 16 | { &hf_nvme_identify_ctrl_psd_aps, |
10538 | 16 | { "Active Power Scale (APS)", "nvme.cmd.identify.ctrl.psds.psd.aps", |
10539 | 16 | FT_UINT8, BASE_HEX, VALS(power_scale_tbl), 0xc0, NULL, HFILL} |
10540 | 16 | }, |
10541 | 16 | { &hf_nvme_identify_ctrl_psd_epfrt, |
10542 | 16 | { "Emergency Power Fail Recovery Time (EPFRT)", "nvme.cmd.identify.ctrl.psds.psd.epfrt", |
10543 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10544 | 16 | }, |
10545 | 16 | { &hf_nvme_identify_ctrl_psd_fqvt, |
10546 | 16 | { "Forced Quiescence Vault Time (FQVT)", "nvme.cmd.identify.ctrl.psds.psd.fqvt", |
10547 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10548 | 16 | }, |
10549 | 16 | { &hf_nvme_identify_ctrl_psd_epfvt, |
10550 | 16 | { "Emergency Power Fail Vault Time (EPFVT)", "nvme.cmd.identify.ctrl.psds.psd.epfvt", |
10551 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10552 | 16 | }, |
10553 | 16 | { &hf_nvme_identify_ctrl_psd_epfrts, |
10554 | 16 | { "Emergency Power Fail Recovery Time Scale (EPFRTS)", "nvme.cmd.identify.ctrl.psds.psd.epfrts", |
10555 | 16 | FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0x0f, NULL, HFILL} |
10556 | 16 | }, |
10557 | 16 | { &hf_nvme_identify_ctrl_psd_fqvts, |
10558 | 16 | { "Forced Quiescence Vault Time Scale (FQVTS)", "nvme.cmd.identify.ctrl.psds.psd.fqvts", |
10559 | 16 | FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0xf0, NULL, HFILL} |
10560 | 16 | }, |
10561 | 16 | { &hf_nvme_identify_ctrl_psd_epfvts, |
10562 | 16 | { "Emergency Power Fail Vault Time Scale (EPFVTS)", "nvme.cmd.identify.ctrl.psds.psd.epfvts", |
10563 | 16 | FT_UINT8, BASE_HEX, VALS(time_scale_tbl), 0x0f, NULL, HFILL} |
10564 | 16 | }, |
10565 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd9, |
10566 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd9", |
10567 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
10568 | 16 | }, |
10569 | 16 | { &hf_nvme_identify_ctrl_psd_mbw, |
10570 | 16 | { "Max Bandwidth (MBW)", "nvme.cmd.identify.ctrl.psds.psd.mbw", |
10571 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10572 | 16 | }, |
10573 | 16 | { &hf_nvme_identify_ctrl_psd_mbws, |
10574 | 16 | { "Max Bandwidth Scale (MBWS)", "nvme.cmd.identify.ctrl.psds.psd.mbws", |
10575 | 16 | FT_UINT8, BASE_HEX, VALS(max_bw_scale_tbl), 0x07, NULL, HFILL} |
10576 | 16 | }, |
10577 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd10, |
10578 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd10", |
10579 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
10580 | 16 | }, |
10581 | 16 | { &hf_nvme_identify_ctrl_psd_rsvd11, |
10582 | 16 | { "Reserved", "nvme.cmd.identify.ctrl.psds.psd.rsvd11", |
10583 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10584 | 16 | }, |
10585 | 16 | { &hf_nvme_identify_ctrl_vs, |
10586 | 16 | { "Vendor Specific", "nvme.cmd.identify.ctrl.vs", |
10587 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10588 | 16 | }, |
10589 | | |
10590 | | /* Identify nslist response */ |
10591 | 16 | { &hf_nvme_identify_nslist_nsid, |
10592 | 16 | { "Namespace list element", "nvme.cmd.identify.nslist.nsid", |
10593 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10594 | 16 | }, |
10595 | | /* Identify Namespace Identification Descriptor list (CNS 03h) response */ |
10596 | 16 | { &hf_nvme_identify_nsdesc_nidt, |
10597 | 16 | { "Namespace Identifier Type (NIDT)", "nvme.cmd.identify.nsdesc.nidt", |
10598 | 16 | FT_UINT8, BASE_HEX, VALS(nidt_tbl), 0x0, NULL, HFILL} |
10599 | 16 | }, |
10600 | 16 | { &hf_nvme_identify_nsdesc_nidl, |
10601 | 16 | { "Namespace Identifier Length (NIDL)", "nvme.cmd.identify.nsdesc.nidl", |
10602 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10603 | 16 | }, |
10604 | 16 | { &hf_nvme_identify_nsdesc_nid, |
10605 | 16 | { "Namespace Identifier (NID)", "nvme.cmd.identify.nsdesc.nid", |
10606 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10607 | 16 | }, |
10608 | | /* Identify Controller List (CNS 12h/13h) response */ |
10609 | 16 | { &hf_nvme_identify_ctrl_list_num, |
10610 | 16 | { "Number of Controller Identifiers (NUMCIDS)", "nvme.cmd.identify.ctrl_list.num", |
10611 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10612 | 16 | }, |
10613 | 16 | { &hf_nvme_identify_ctrl_list_id, |
10614 | 16 | { "Controller Identifier", "nvme.cmd.identify.ctrl_list.id", |
10615 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10616 | 16 | }, |
10617 | | /* Identify NVM Set List (CNS 04h) response */ |
10618 | 16 | { &hf_nvme_identify_nvmset_num, |
10619 | 16 | { "Number of Entries (NUMENT)", "nvme.cmd.identify.nvmset.num", |
10620 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10621 | 16 | }, |
10622 | 16 | { &hf_nvme_identify_nvmset_id, |
10623 | 16 | { "NVM Set Identifier (NSETID)", "nvme.cmd.identify.nvmset.id", |
10624 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10625 | 16 | }, |
10626 | 16 | { &hf_nvme_identify_nvmset_endgid, |
10627 | 16 | { "Endurance Group Identifier (ENDGID)", "nvme.cmd.identify.nvmset.endgid", |
10628 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10629 | 16 | }, |
10630 | 16 | { &hf_nvme_identify_nvmset_r4krt, |
10631 | 16 | { "Random 4 KiB Read Typical (R4KRT)", "nvme.cmd.identify.nvmset.r4krt", |
10632 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, "In 100 ns units", HFILL} |
10633 | 16 | }, |
10634 | 16 | { &hf_nvme_identify_nvmset_ows, |
10635 | 16 | { "Optimal Write Size (OWS)", "nvme.cmd.identify.nvmset.ows", |
10636 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, "In bytes", HFILL} |
10637 | 16 | }, |
10638 | 16 | { &hf_nvme_identify_nvmset_tnvmsc, |
10639 | 16 | { "Total NVM Set Capacity (TNVMSC)", "nvme.cmd.identify.nvmset.tnvmsc", |
10640 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, "In bytes (128-bit)", HFILL} |
10641 | 16 | }, |
10642 | 16 | { &hf_nvme_identify_nvmset_unvmsc, |
10643 | 16 | { "Unallocated NVM Set Capacity (UNVMSC)", "nvme.cmd.identify.nvmset.unvmsc", |
10644 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, "In bytes (128-bit)", HFILL} |
10645 | 16 | }, |
10646 | | /* Identify Primary Controller Capabilities (CNS 14h) response */ |
10647 | 16 | { &hf_nvme_identify_pcc_cntlid, |
10648 | 16 | { "Controller Identifier (CNTLID)", "nvme.cmd.identify.pcc.cntlid", |
10649 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10650 | 16 | }, |
10651 | 16 | { &hf_nvme_identify_pcc_portid, |
10652 | 16 | { "Port Identifier (PORTID)", "nvme.cmd.identify.pcc.portid", |
10653 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10654 | 16 | }, |
10655 | 16 | { &hf_nvme_identify_pcc_crt[0], |
10656 | 16 | { "Controller Resource Types (CRT)", "nvme.cmd.identify.pcc.crt", |
10657 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10658 | 16 | }, |
10659 | 16 | { &hf_nvme_identify_pcc_crt[1], |
10660 | 16 | { "VQ Resources Support (VQRS)", "nvme.cmd.identify.pcc.crt.vqrs", |
10661 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
10662 | 16 | }, |
10663 | 16 | { &hf_nvme_identify_pcc_crt[2], |
10664 | 16 | { "VI Resources Support (VIRS)", "nvme.cmd.identify.pcc.crt.virs", |
10665 | 16 | FT_UINT32, BASE_HEX, NULL, 0x2, NULL, HFILL} |
10666 | 16 | }, |
10667 | 16 | { &hf_nvme_identify_pcc_crt[3], |
10668 | 16 | { "Reserved", "nvme.cmd.identify.pcc.crt.rsvd", |
10669 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffc, NULL, HFILL} |
10670 | 16 | }, |
10671 | 16 | { &hf_nvme_identify_pcc_vqfrt, |
10672 | 16 | { "VQ Resources Flexible Total (VQFRT)", "nvme.cmd.identify.pcc.vqfrt", |
10673 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10674 | 16 | }, |
10675 | 16 | { &hf_nvme_identify_pcc_vqrfa, |
10676 | 16 | { "VQ Resources Flexible Assigned (VQRFA)", "nvme.cmd.identify.pcc.vqrfa", |
10677 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10678 | 16 | }, |
10679 | 16 | { &hf_nvme_identify_pcc_vqrfap, |
10680 | 16 | { "VQ Resources Flexible Allocated to Primary (VQRFAP)", "nvme.cmd.identify.pcc.vqrfap", |
10681 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10682 | 16 | }, |
10683 | 16 | { &hf_nvme_identify_pcc_vqprt, |
10684 | 16 | { "VQ Resources Private Total (VQPRT)", "nvme.cmd.identify.pcc.vqprt", |
10685 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10686 | 16 | }, |
10687 | 16 | { &hf_nvme_identify_pcc_vqfrsm, |
10688 | 16 | { "VQ Resources Flexible Secondary Maximum (VQFRSM)", "nvme.cmd.identify.pcc.vqfrsm", |
10689 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10690 | 16 | }, |
10691 | 16 | { &hf_nvme_identify_pcc_vqgran, |
10692 | 16 | { "VQ Flexible Resource Preferred Granularity (VQGRAN)", "nvme.cmd.identify.pcc.vqgran", |
10693 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10694 | 16 | }, |
10695 | 16 | { &hf_nvme_identify_pcc_vifrt, |
10696 | 16 | { "VI Resources Flexible Total (VIFRT)", "nvme.cmd.identify.pcc.vifrt", |
10697 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10698 | 16 | }, |
10699 | 16 | { &hf_nvme_identify_pcc_virfa, |
10700 | 16 | { "VI Resources Flexible Assigned (VIRFA)", "nvme.cmd.identify.pcc.virfa", |
10701 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10702 | 16 | }, |
10703 | 16 | { &hf_nvme_identify_pcc_virfap, |
10704 | 16 | { "VI Resources Flexible Allocated to Primary (VIRFAP)", "nvme.cmd.identify.pcc.virfap", |
10705 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10706 | 16 | }, |
10707 | 16 | { &hf_nvme_identify_pcc_viprt, |
10708 | 16 | { "VI Resources Private Total (VIPRT)", "nvme.cmd.identify.pcc.viprt", |
10709 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10710 | 16 | }, |
10711 | 16 | { &hf_nvme_identify_pcc_vifrsm, |
10712 | 16 | { "VI Resources Flexible Secondary Maximum (VIFRSM)", "nvme.cmd.identify.pcc.vifrsm", |
10713 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10714 | 16 | }, |
10715 | 16 | { &hf_nvme_identify_pcc_vigran, |
10716 | 16 | { "VI Flexible Resource Preferred Granularity (VIGRAN)", "nvme.cmd.identify.pcc.vigran", |
10717 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10718 | 16 | }, |
10719 | | /* Identify Secondary Controller List (CNS 15h) response */ |
10720 | 16 | { &hf_nvme_identify_scl_num, |
10721 | 16 | { "Number of Entries (NUMENT)", "nvme.cmd.identify.scl.num", |
10722 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10723 | 16 | }, |
10724 | 16 | { &hf_nvme_identify_scl_scid, |
10725 | 16 | { "Secondary Controller Identifier (SCID)", "nvme.cmd.identify.scl.scid", |
10726 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10727 | 16 | }, |
10728 | 16 | { &hf_nvme_identify_scl_pcid, |
10729 | 16 | { "Primary Controller Identifier (PCID)", "nvme.cmd.identify.scl.pcid", |
10730 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10731 | 16 | }, |
10732 | 16 | { &hf_nvme_identify_scl_scs[0], |
10733 | 16 | { "Secondary Controller State (SCS)", "nvme.cmd.identify.scl.scs", |
10734 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10735 | 16 | }, |
10736 | 16 | { &hf_nvme_identify_scl_scs[1], |
10737 | 16 | { "Online State (OLS)", "nvme.cmd.identify.scl.scs.ols", |
10738 | 16 | FT_UINT8, BASE_HEX, NULL, 0x1, NULL, HFILL} |
10739 | 16 | }, |
10740 | 16 | { &hf_nvme_identify_scl_scs[2], |
10741 | 16 | { "Reserved", "nvme.cmd.identify.scl.scs.rsvd", |
10742 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
10743 | 16 | }, |
10744 | 16 | { &hf_nvme_identify_scl_vfn, |
10745 | 16 | { "Virtual Function Number (VFN)", "nvme.cmd.identify.scl.vfn", |
10746 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10747 | 16 | }, |
10748 | 16 | { &hf_nvme_identify_scl_nvq, |
10749 | 16 | { "Number of VQ Flexible Resources Assigned (NVQ)", "nvme.cmd.identify.scl.nvq", |
10750 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10751 | 16 | }, |
10752 | 16 | { &hf_nvme_identify_scl_nvi, |
10753 | 16 | { "Number of VI Flexible Resources Assigned (NVI)", "nvme.cmd.identify.scl.nvi", |
10754 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10755 | 16 | }, |
10756 | | /* Identify Namespace Granularity List (CNS 16h) response */ |
10757 | 16 | { &hf_nvme_identify_ngl_nga[0], |
10758 | 16 | { "Namespace Granularity Attributes (NGA)", "nvme.cmd.identify.ngl.nga", |
10759 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10760 | 16 | }, |
10761 | 16 | { &hf_nvme_identify_ngl_nga[1], |
10762 | 16 | { "Granularity Descriptor Mapping (GDM)", "nvme.cmd.identify.ngl.nga.gdm", |
10763 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
10764 | 16 | }, |
10765 | 16 | { &hf_nvme_identify_ngl_nga[2], |
10766 | 16 | { "Reserved", "nvme.cmd.identify.ngl.nga.rsvd", |
10767 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
10768 | 16 | }, |
10769 | 16 | { &hf_nvme_identify_ngl_nd, |
10770 | 16 | { "Number of Descriptors (ND)", "nvme.cmd.identify.ngl.nd", |
10771 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, "0's based count", HFILL} |
10772 | 16 | }, |
10773 | 16 | { &hf_nvme_identify_ngl_nsg, |
10774 | 16 | { "Namespace Size Granularity (NSG)", "nvme.cmd.identify.ngl.nsg", |
10775 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, "In bytes", HFILL} |
10776 | 16 | }, |
10777 | 16 | { &hf_nvme_identify_ngl_ncg, |
10778 | 16 | { "Namespace Capacity Granularity (NCG)", "nvme.cmd.identify.ngl.ncg", |
10779 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, "In bytes", HFILL} |
10780 | 16 | }, |
10781 | | /* Identify UUID List (CNS 17h) response */ |
10782 | 16 | { &hf_nvme_identify_uuid_idassoc, |
10783 | 16 | { "Identifier Association (IDASSOC)", "nvme.cmd.identify.uuid.idassoc", |
10784 | 16 | FT_UINT8, BASE_HEX, VALS(uuid_idassoc_tbl), 0x3, NULL, HFILL} |
10785 | 16 | }, |
10786 | 16 | { &hf_nvme_identify_uuid_uuid, |
10787 | 16 | { "UUID", "nvme.cmd.identify.uuid.uuid", |
10788 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10789 | 16 | }, |
10790 | | /* get logpage response */ |
10791 | | /* Identify Response */ |
10792 | 16 | { &hf_nvme_get_logpage_ify_genctr, |
10793 | 16 | { "Generation Counter (GENCTR)", "nvme.cmd.get_logpage.identify.genctr", |
10794 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10795 | 16 | }, |
10796 | 16 | { &hf_nvme_get_logpage_ify_numrec, |
10797 | 16 | { "Number of Records (NUMREC)", "nvme.cmd.get_logpage.identify.numrec", |
10798 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10799 | 16 | }, |
10800 | 16 | { &hf_nvme_get_logpage_ify_recfmt, |
10801 | 16 | { "Record Format (RECFMT)", "nvme.cmd.get_logpage.identify.recfmt", |
10802 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10803 | 16 | }, |
10804 | 16 | { &hf_nvme_get_logpage_ify_rsvd, |
10805 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rsvd", |
10806 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10807 | 16 | }, |
10808 | 16 | { &hf_nvme_get_logpage_ify_rcrd, |
10809 | 16 | { "Discovery Log Entry", "nvme.cmd.get_logpage.identify.rcrd", |
10810 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10811 | 16 | }, |
10812 | 16 | { &hf_nvme_get_logpage_ify_rcrd_trtype, |
10813 | 16 | { "Transport Type (TRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.trtype", |
10814 | 16 | FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL} |
10815 | 16 | }, |
10816 | 16 | { &hf_nvme_get_logpage_ify_rcrd_adrfam, |
10817 | 16 | { "Address Family (ADRFAM)", "nvme.cmd.get_logpage.identify.rcrd.adrfam", |
10818 | 16 | FT_UINT8, BASE_HEX, VALS(adrfam_type_tbl), 0x0, NULL, HFILL} |
10819 | 16 | }, |
10820 | 16 | { &hf_nvme_get_logpage_ify_rcrd_subtype, |
10821 | 16 | { "Subsystem Type (SUBTYPE)", "nvme.cmd.get_logpage.identify.rcrd.subtype", |
10822 | 16 | FT_UINT8, BASE_HEX, VALS(sub_type_tbl), 0x0, NULL, HFILL} |
10823 | 16 | }, |
10824 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[0], |
10825 | 16 | { "Transport Requirements (TREQ)", "nvme.cmd.get_logpage.identify.rcrd.treq", |
10826 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10827 | 16 | }, |
10828 | | /* NVMe Base 2.3 Figure 310, byte 03: TSC 1:0, SQFCD 2, ZHIDS 3, |
10829 | | * TASC 5:4, Reserved 7:6. The pre-2.0 layout this was written against |
10830 | | * had a 1-bit secure-channel flag and SQ flow control on bit 1. */ |
10831 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[1], |
10832 | 16 | { "Transport Secure Channel (TSC)", "nvme.cmd.get_logpage.identify.rcrd.treq.secch", |
10833 | 16 | FT_UINT8, BASE_HEX, VALS(treq_tsc_tbl), 0x3, NULL, HFILL} |
10834 | 16 | }, |
10835 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[2], |
10836 | 16 | { "SQ Flow Control Disable (SQFCD)", "nvme.cmd.get_logpage.identify.rcrd.treq.sqfc", |
10837 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
10838 | 16 | }, |
10839 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[3], |
10840 | 16 | { "Zero Host ID Support (ZHIDS)", "nvme.cmd.get_logpage.identify.rcrd.treq.zhids", |
10841 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
10842 | 16 | }, |
10843 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[4], |
10844 | 16 | { "Transport Authentication and Secure Channel (TASC)", |
10845 | 16 | "nvme.cmd.get_logpage.identify.rcrd.treq.tasc", |
10846 | 16 | FT_UINT8, BASE_HEX, VALS(treq_tasc_tbl), 0x30, NULL, HFILL} |
10847 | 16 | }, |
10848 | 16 | { &hf_nvme_get_logpage_ify_rcrd_treq[5], |
10849 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.treq.rsvd", |
10850 | 16 | FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL} |
10851 | 16 | }, |
10852 | 16 | { &hf_nvme_get_logpage_ify_rcrd_portid, |
10853 | 16 | { "Port ID (PORTID)", "nvme.cmd.get_logpage.identify.rcrd.portid", |
10854 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10855 | 16 | }, |
10856 | 16 | { &hf_nvme_get_logpage_ify_rcrd_cntlid, |
10857 | 16 | { "Controller ID (CNTLID)", "nvme.cmd.get_logpage.identify.rcrd.cntlid", |
10858 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10859 | 16 | }, |
10860 | 16 | { &hf_nvme_get_logpage_ify_rcrd_asqsz, |
10861 | 16 | { "Admin Max SQ Size (ASQSZ)", "nvme.cmd.get_logpage.identify.rcrd.asqsz", |
10862 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10863 | 16 | }, |
10864 | 16 | { &hf_nvme_get_logpage_disc_rcrd_eflags[0], |
10865 | 16 | { "Entry flags (EFLAGS)", "nvme.cmd.get_logpage.discovery.rcrd.eflags", |
10866 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10867 | 16 | }, |
10868 | 16 | { &hf_nvme_get_logpage_disc_rcrd_eflags[1], |
10869 | 16 | { "Duplicate Returned Information (DUPRETINFO)", "nvme.cmd.get_logpage.discovery.rcrd.eflags.dupretinfo", |
10870 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
10871 | 16 | }, |
10872 | 16 | { &hf_nvme_get_logpage_disc_rcrd_eflags[2], |
10873 | 16 | { "Explicit Persistent Connection Support for Discovery (EPCSD)", |
10874 | 16 | "nvme.cmd.get_logpage.discovery.rcrd.eflags.epcsd", |
10875 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
10876 | 16 | }, |
10877 | | /* NVMe Base 2.3 Figure 310, bytes 11:10: NCC is bit 2. */ |
10878 | 16 | { &hf_nvme_get_logpage_disc_rcrd_eflags[3], |
10879 | 16 | { "No CDC Connectivity (NCC)", "nvme.cmd.get_logpage.discovery.rcrd.eflags.ncc", |
10880 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
10881 | 16 | }, |
10882 | 16 | { &hf_nvme_get_logpage_disc_rcrd_eflags[4], |
10883 | 16 | { "Reserved", "nvme.cmd.get_logpage.discovery.rcrd.eflags.rsvd0", |
10884 | 16 | FT_UINT16, BASE_HEX, NULL, 0xfff8, NULL, HFILL} |
10885 | 16 | }, |
10886 | 16 | { &hf_nvme_get_logpage_ify_rcrd_rsvd0, |
10887 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd0", |
10888 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10889 | 16 | }, |
10890 | 16 | { &hf_nvme_get_logpage_ify_rcrd_trsvcid, |
10891 | 16 | { "Transport Service Identifier (TRSVCID)", "nvme.cmd.get_logpage.identify.rcrd.trsvcid", |
10892 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10893 | 16 | }, |
10894 | 16 | { &hf_nvme_get_logpage_ify_rcrd_rsvd1, |
10895 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.rsvd1", |
10896 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10897 | 16 | }, |
10898 | 16 | { &hf_nvme_get_logpage_ify_rcrd_subnqn, |
10899 | 16 | { "NVM Subsystem Qualified Name (SUBNQN)", "nvme.cmd.get_logpage.identify.rcrd.subnqn", |
10900 | 16 | FT_STRINGZ, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10901 | 16 | }, |
10902 | 16 | { &hf_nvme_get_logpage_ify_rcrd_traddr, |
10903 | 16 | { "Transport Address (TRADDR)", "nvme.cmd.get_logpage.identify.rcrd.traddr", |
10904 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10905 | 16 | }, |
10906 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas, |
10907 | 16 | { "Transport Specific Address Subtype (TSAS)", "nvme.cmd.get_logpage.identify.rcrd.tsas", |
10908 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10909 | 16 | }, |
10910 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_qptype, |
10911 | 16 | { "RDMA QP Service Type (RDMA_QPTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_qptype", |
10912 | 16 | FT_UINT8, BASE_HEX, VALS(qp_type_tbl), 0x0, NULL, HFILL} |
10913 | 16 | }, |
10914 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_prtype, |
10915 | 16 | { "RDMA Provider Type (RDMA_PRTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_prtype", |
10916 | 16 | FT_UINT8, BASE_HEX, VALS(pr_type_tbl), 0x0, NULL, HFILL} |
10917 | 16 | }, |
10918 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_cms, |
10919 | 16 | { "RDMA Connection Management Service (RDMA_CMS)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_cms", |
10920 | 16 | FT_UINT8, BASE_HEX, VALS(cms_type_tbl), 0x0, NULL, HFILL} |
10921 | 16 | }, |
10922 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd0, |
10923 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd0", |
10924 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10925 | 16 | }, |
10926 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_pkey, |
10927 | 16 | { "RDMA Partition Key (RDMA_PKEY)", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_pkey", |
10928 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10929 | 16 | }, |
10930 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_rdma_rsvd1, |
10931 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.rdma_rsvd1", |
10932 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10933 | 16 | }, |
10934 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_sectype, |
10935 | 16 | { "Security Type (SECTYPE)", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_sectype", |
10936 | 16 | FT_UINT8, BASE_HEX, VALS(sec_type_tbl), 0x0, NULL, HFILL} |
10937 | 16 | }, |
10938 | 16 | { &hf_nvme_get_logpage_ify_rcrd_tsas_tcp_rsvd, |
10939 | 16 | { "Reserved", "nvme.cmd.get_logpage.identify.rcrd.tsas.tcp_rsvd", |
10940 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
10941 | 16 | }, |
10942 | | /* Error Information Response */ |
10943 | 16 | { &hf_nvme_get_logpage_errinf_errcnt, |
10944 | 16 | { "Error Count", "nvme.cmd.get_logpage.errinf.errcnt", |
10945 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10946 | 16 | }, |
10947 | 16 | { &hf_nvme_get_logpage_errinf_sqid, |
10948 | 16 | { "Submission Queue ID", "nvme.cmd.get_logpage.errinf.sqid", |
10949 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
10950 | 16 | }, |
10951 | 16 | { &hf_nvme_get_logpage_errinf_cid, |
10952 | 16 | { "Command ID", "nvme.cmd.get_logpage.errinf.cid", |
10953 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10954 | 16 | }, |
10955 | 16 | { &hf_nvme_get_logpage_errinf_sf[0], |
10956 | 16 | { "Status Field", "nvme.cmd.get_logpage.errinf.sf", |
10957 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10958 | 16 | }, |
10959 | 16 | { &hf_nvme_get_logpage_errinf_sf[1], |
10960 | 16 | { "Status Field Value", "nvme.cmd.get_logpage.errinf.sf.val", |
10961 | 16 | FT_UINT16, BASE_HEX, NULL, 0x7fff, NULL, HFILL} |
10962 | 16 | }, |
10963 | 16 | { &hf_nvme_get_logpage_errinf_sf[2], |
10964 | 16 | { "Status Field Phase Tag", "nvme.cmd.get_logpage.errinf.sf.ptag", |
10965 | 16 | FT_UINT16, BASE_HEX, NULL, 0x8000, NULL, HFILL} |
10966 | 16 | }, |
10967 | 16 | { &hf_nvme_get_logpage_errinf_pel[0], |
10968 | 16 | { "Parameter Error Location", "nvme.cmd.get_logpage.errinf.pel", |
10969 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10970 | 16 | }, |
10971 | 16 | { &hf_nvme_get_logpage_errinf_pel[1], |
10972 | 16 | { "Byte in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bytee", |
10973 | 16 | FT_UINT16, BASE_DEC, NULL, 0xff, NULL, HFILL} |
10974 | 16 | }, |
10975 | 16 | { &hf_nvme_get_logpage_errinf_pel[2], |
10976 | 16 | { "Bit in command that contained the error", "nvme.cmd.get_logpage.errinf.pel.bite", |
10977 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0700, NULL, HFILL} |
10978 | 16 | }, |
10979 | 16 | { &hf_nvme_get_logpage_errinf_pel[3], |
10980 | 16 | { "Reserved", "nvme.cmd.get_logpage.errinf.pel.rsvd", |
10981 | 16 | FT_UINT16, BASE_DEC, NULL, 0xf800, NULL, HFILL} |
10982 | 16 | }, |
10983 | 16 | { &hf_nvme_get_logpage_errinf_lba, |
10984 | 16 | { "LBA", "nvme.cmd.get_logpage.errinf.lba", |
10985 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10986 | 16 | }, |
10987 | 16 | { &hf_nvme_get_logpage_errinf_ns, |
10988 | 16 | { "Namespace ID", "nvme.cmd.get_logpage.errinf.nsid", |
10989 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10990 | 16 | }, |
10991 | 16 | { &hf_nvme_get_logpage_errinf_vsi, |
10992 | 16 | { "Vendor Specific Information Available", "nvme.cmd.get_logpage.errinf.vsi", |
10993 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
10994 | 16 | }, |
10995 | 16 | { &hf_nvme_get_logpage_errinf_trtype, |
10996 | 16 | { "Transport Type", "nvme.cmd.get_logpage.errinf.trype", |
10997 | 16 | FT_UINT8, BASE_HEX, VALS(trt_type_tbl), 0x0, NULL, HFILL} |
10998 | 16 | }, |
10999 | 16 | { &hf_nvme_get_logpage_errinf_cmdset, |
11000 | 16 | { "Command Set Indicator (CSI)", "nvme.cmd.get_logpage.errinf.cmdset", |
11001 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11002 | 16 | }, |
11003 | 16 | { &hf_nvme_get_logpage_errinf_opc, |
11004 | 16 | { "Opcode", "nvme.cmd.get_logpage.errinf.opc", |
11005 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11006 | 16 | }, |
11007 | 16 | { &hf_nvme_get_logpage_errinf_csi, |
11008 | 16 | { "Command Specific Information", "nvme.cmd.get_logpage.errinf.csi", |
11009 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11010 | 16 | }, |
11011 | 16 | { &hf_nvme_get_logpage_errinf_tsi, |
11012 | 16 | { "Transport Type Specific Information", "nvme.cmd.get_logpage.errinf.tsi", |
11013 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11014 | 16 | }, |
11015 | 16 | { &hf_nvme_get_logpage_errinf_rsvd1, |
11016 | 16 | { "Reserved", "nvme.cmd.get_logpage.errinf.rsvd1", |
11017 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11018 | 16 | }, |
11019 | 16 | { &hf_nvme_get_logpage_errinf_lpver, |
11020 | 16 | { "Log Page Version", "nvme.cmd.get_logpage.errinf.lpver", |
11021 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11022 | 16 | }, |
11023 | | /* Get LogPage SMART response */ |
11024 | 16 | { &hf_nvme_get_logpage_smart_cw[0], |
11025 | 16 | { "Critical Warning", "nvme.cmd.get_logpage.smart.cw", |
11026 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11027 | 16 | }, |
11028 | 16 | { &hf_nvme_get_logpage_smart_cw[1], |
11029 | 16 | { "Spare Capacity Below Threshold", "nvme.cmd.get_logpage.smart.cw.sc", |
11030 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
11031 | 16 | }, |
11032 | 16 | { &hf_nvme_get_logpage_smart_cw[2], |
11033 | 16 | { "Temperature Crossed Threshold", "nvme.cmd.get_logpage.smart.cw.temp", |
11034 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
11035 | 16 | }, |
11036 | 16 | { &hf_nvme_get_logpage_smart_cw[3], |
11037 | 16 | { "Reliability Degraded due to Significant Media Errors", "nvme.cmd.get_logpage.smart.cw.sme", |
11038 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
11039 | 16 | }, |
11040 | 16 | { &hf_nvme_get_logpage_smart_cw[4], |
11041 | 16 | { "Media Placed in RO State", "nvme.cmd.get_logpage.smart.cw.ro", |
11042 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
11043 | 16 | }, |
11044 | 16 | { &hf_nvme_get_logpage_smart_cw[5], |
11045 | 16 | { "Volatile Memory Backup Device Has Failed", "nvme.cmd.get_logpage.smart.cw.bdf", |
11046 | 16 | FT_BOOLEAN, 8, NULL, 0x10, NULL, HFILL} |
11047 | 16 | }, |
11048 | 16 | { &hf_nvme_get_logpage_smart_cw[6], |
11049 | 16 | { "Persistent Memory Region Placed in RO State", "nvme.cmd.get_logpage.smart.cw.mrro", |
11050 | 16 | FT_BOOLEAN, 8, NULL, 0x20, NULL, HFILL} |
11051 | 16 | }, |
11052 | 16 | { &hf_nvme_get_logpage_smart_cw[7], |
11053 | 16 | { "Indeterminate Personality State", "nvme.cmd.get_logpage.smart.cw.ips", |
11054 | 16 | FT_BOOLEAN, 8, NULL, 0x40, NULL, HFILL} |
11055 | 16 | }, |
11056 | 16 | { &hf_nvme_get_logpage_smart_cw[8], |
11057 | 16 | { "Reserved", "nvme.cmd.get_logpage.smart.cw.rsvd", |
11058 | 16 | FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL} |
11059 | 16 | }, |
11060 | 16 | { &hf_nvme_get_logpage_smart_ct, |
11061 | 16 | { "Composite Temperature (degrees K)", "nvme.cmd.get_logpage.smart.ct", |
11062 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11063 | 16 | }, |
11064 | 16 | { &hf_nvme_get_logpage_smart_asc, |
11065 | 16 | { "Available Spare Capacity (%)", "nvme.cmd.get_logpage.smart.asc", |
11066 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11067 | 16 | }, |
11068 | 16 | { &hf_nvme_get_logpage_smart_ast, |
11069 | 16 | { "Available Spare Capacity Threshold (%)", "nvme.cmd.get_logpage.smart.ast", |
11070 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11071 | 16 | }, |
11072 | 16 | { &hf_nvme_get_logpage_smart_lpu, |
11073 | 16 | { "Life Age Estimate (%)", "nvme.cmd.get_logpage.smart.lae", |
11074 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11075 | 16 | }, |
11076 | 16 | { &hf_nvme_get_logpage_smart_egcws[0], |
11077 | 16 | { "Endurance Group Critical Warning Summary", "nvme.cmd.get_logpage.smart.egcws", |
11078 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11079 | 16 | }, |
11080 | 16 | { &hf_nvme_get_logpage_smart_egcws[1], |
11081 | 16 | { "Spare Capacity of Endurance Group Below Threshold", "nvme.cmd.get_logpage.smart.egcws.sc", |
11082 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
11083 | 16 | }, |
11084 | 16 | { &hf_nvme_get_logpage_smart_egcws[2], |
11085 | 16 | { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd0", |
11086 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
11087 | 16 | }, |
11088 | 16 | { &hf_nvme_get_logpage_smart_egcws[3], |
11089 | 16 | { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.smart.egcws.me", |
11090 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
11091 | 16 | }, |
11092 | 16 | { &hf_nvme_get_logpage_smart_egcws[4], |
11093 | 16 | { "A Namespace in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.smart.egcws.ro", |
11094 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
11095 | 16 | }, |
11096 | 16 | { &hf_nvme_get_logpage_smart_egcws[5], |
11097 | 16 | { "Reserved", "nvme.cmd.get_logpage.smart.egcws.rsvd1", |
11098 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
11099 | 16 | }, |
11100 | 16 | { &hf_nvme_get_logpage_smart_rsvd0, |
11101 | 16 | { "Reserved", "nvme.cmd.get_logpage.smart.rsvd0", |
11102 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11103 | 16 | }, |
11104 | 16 | { &hf_nvme_get_logpage_smart_dur, |
11105 | 16 | { "Data Units Read", "nvme.cmd.get_logpage.smart.dur", |
11106 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11107 | 16 | }, |
11108 | 16 | { &hf_nvme_get_logpage_smart_duw, |
11109 | 16 | { "Data Units Written", "nvme.cmd.get_logpage.smart.duw", |
11110 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11111 | 16 | }, |
11112 | 16 | { &hf_nvme_get_logpage_smart_hrc, |
11113 | 16 | { "Host Read Commands", "nvme.cmd.get_logpage.smart.hrc", |
11114 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11115 | 16 | }, |
11116 | 16 | { &hf_nvme_get_logpage_smart_hwc, |
11117 | 16 | { "Host Write Commands", "nvme.cmd.get_logpage.smart.hwc", |
11118 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11119 | 16 | }, |
11120 | 16 | { &hf_nvme_get_logpage_smart_cbt, |
11121 | 16 | { "Controller Busy Time (minutes)", "nvme.cmd.get_logpage.smart.cbt", |
11122 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11123 | 16 | }, |
11124 | 16 | { &hf_nvme_get_logpage_smart_pc, |
11125 | 16 | { "Power Cycles", "nvme.cmd.get_logpage.smart.pc", |
11126 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11127 | 16 | }, |
11128 | 16 | { &hf_nvme_get_logpage_smart_poh, |
11129 | 16 | { "Power On Hours", "nvme.cmd.get_logpage.smart.poh", |
11130 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11131 | 16 | }, |
11132 | 16 | { &hf_nvme_get_logpage_smart_mie, |
11133 | 16 | { "Media Integrity Errors", "nvme.cmd.get_logpage.smart.mie", |
11134 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11135 | 16 | }, |
11136 | 16 | { &hf_nvme_get_logpage_smart_us, |
11137 | 16 | { "Unsafe Shutdowns", "nvme.cmd.get_logpage.smart.us", |
11138 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11139 | 16 | }, |
11140 | 16 | { &hf_nvme_get_logpage_smart_ele, |
11141 | 16 | { "Number of Error Information Log Entries", "nvme.cmd.get_logpage.smart.ele", |
11142 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11143 | 16 | }, |
11144 | 16 | { &hf_nvme_get_logpage_smart_wctt, |
11145 | 16 | { "Warning Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.wctt", |
11146 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11147 | 16 | }, |
11148 | 16 | { &hf_nvme_get_logpage_smart_cctt, |
11149 | 16 | { "Critical Composite Temperature Time (minutes)", "nvme.cmd.get_logpage.smart.cctt", |
11150 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11151 | 16 | }, |
11152 | 16 | { &hf_nvme_get_logpage_smart_ts[0], |
11153 | 16 | { "Temperature Sensors", "nvme.cmd.get_logpage.smart.ts", |
11154 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11155 | 16 | }, |
11156 | 16 | { &hf_nvme_get_logpage_smart_ts[1], |
11157 | 16 | { "Temperature Sensor 1 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s1", |
11158 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11159 | 16 | }, |
11160 | 16 | { &hf_nvme_get_logpage_smart_ts[2], |
11161 | 16 | { "Temperature Sensor 2 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s2", |
11162 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11163 | 16 | }, |
11164 | 16 | { &hf_nvme_get_logpage_smart_ts[3], |
11165 | 16 | { "Temperature Sensor 3 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s3", |
11166 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11167 | 16 | }, |
11168 | 16 | { &hf_nvme_get_logpage_smart_ts[4], |
11169 | 16 | { "Temperature Sensor 4 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s4", |
11170 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11171 | 16 | }, |
11172 | 16 | { &hf_nvme_get_logpage_smart_ts[5], |
11173 | 16 | { "Temperature Sensor 5 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s5", |
11174 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11175 | 16 | }, |
11176 | 16 | { &hf_nvme_get_logpage_smart_ts[6], |
11177 | 16 | { "Temperature Sensor 6 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s6", |
11178 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11179 | 16 | }, |
11180 | 16 | { &hf_nvme_get_logpage_smart_ts[7], |
11181 | 16 | { "Temperature Sensor 7 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s7", |
11182 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11183 | 16 | }, |
11184 | 16 | { &hf_nvme_get_logpage_smart_ts[8], |
11185 | 16 | { "Temperature Sensor 8 (degrees K)", "nvme.cmd.get_logpage.smart.ts.s8", |
11186 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11187 | 16 | }, |
11188 | 16 | { &hf_nvme_get_logpage_smart_tmt1c, |
11189 | 16 | { "Thermal Management Temperature 1 Transition Count", "nvme.cmd.get_logpage.smart.tmt1c", |
11190 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11191 | 16 | }, |
11192 | 16 | { &hf_nvme_get_logpage_smart_tmt2c, |
11193 | 16 | { "Thermal Management Temperature 2 Transition Count", "nvme.cmd.get_logpage.smart.tmt2c", |
11194 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11195 | 16 | }, |
11196 | 16 | { &hf_nvme_get_logpage_smart_tmt1t, |
11197 | 16 | { "Total Time For Thermal Management Temperature 1 (seconds)", "nvme.cmd.get_logpage.smart.tmt1t", |
11198 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11199 | 16 | }, |
11200 | 16 | { &hf_nvme_get_logpage_smart_tmt2t, |
11201 | 16 | { "Total Time For Thermal Management Temperature 2 (seconds)", "nvme.cmd.get_logpage.smart.tmt2t", |
11202 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11203 | 16 | }, |
11204 | 16 | { &hf_nvme_get_logpage_smart_rsvd1, |
11205 | 16 | { "Reserved", "nvme.cmd.get_logpage.smart.rsvd1", |
11206 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11207 | 16 | }, |
11208 | | /* FW Slot Information Response */ |
11209 | 16 | { &hf_nvme_get_logpage_fw_slot_afi[0], |
11210 | 16 | { "Active Firmware Info (AFI)", "nvme.cmd.get_logpage.fw_slot.afi", |
11211 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11212 | 16 | }, |
11213 | 16 | { &hf_nvme_get_logpage_fw_slot_afi[1], |
11214 | 16 | { "Active Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.afs", |
11215 | 16 | FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL} |
11216 | 16 | }, |
11217 | 16 | { &hf_nvme_get_logpage_fw_slot_afi[2], |
11218 | 16 | { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd0", |
11219 | 16 | FT_UINT8, BASE_HEX, NULL, 0x8, NULL, HFILL} |
11220 | 16 | }, |
11221 | 16 | { &hf_nvme_get_logpage_fw_slot_afi[3], |
11222 | 16 | { "Next Reset Firmware Slot", "nvme.cmd.get_logpage.fw_slot.afi.nfs", |
11223 | 16 | FT_UINT8, BASE_HEX, NULL, 0x70, NULL, HFILL} |
11224 | 16 | }, |
11225 | 16 | { &hf_nvme_get_logpage_fw_slot_afi[4], |
11226 | 16 | { "Reserved", "nvme.cmd.get_logpage.fw_slot.afi.rsvd1", |
11227 | 16 | FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL} |
11228 | 16 | }, |
11229 | 16 | { &hf_nvme_get_logpage_fw_slot_rsvd0, |
11230 | 16 | { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd0", |
11231 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11232 | 16 | }, |
11233 | 16 | { &hf_nvme_get_logpage_fw_slot_frs, |
11234 | 16 | { "Firmware Slot Revisions", "nvme.cmd.get_logpage.fw_slot.frs", |
11235 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11236 | 16 | }, |
11237 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[0], |
11238 | 16 | { "Firmware Revision for Slot 1 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s1.ascii", |
11239 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11240 | 16 | }, |
11241 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[1], |
11242 | 16 | { "Firmware Revision for Slot 2 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s2.ascii", |
11243 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11244 | 16 | }, |
11245 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[2], |
11246 | 16 | { "Firmware Revision for Slot 3 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s3.ascii", |
11247 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11248 | 16 | }, |
11249 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[3], |
11250 | 16 | { "Firmware Revision for Slot 4 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s4.ascii", |
11251 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11252 | 16 | }, |
11253 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[4], |
11254 | 16 | { "Firmware Revision for Slot 5 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s5.ascii", |
11255 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11256 | 16 | }, |
11257 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[5], |
11258 | 16 | { "Firmware Revision for Slot 6 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s6.ascii", |
11259 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11260 | 16 | }, |
11261 | 16 | { &hf_nvme_get_logpage_fw_slot_frs_ascii[6], |
11262 | 16 | { "Firmware Revision for Slot 7 (ASCII)", "nvme.cmd.get_logpage.fw_slot.frs.s7.ascii", |
11263 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11264 | 16 | }, |
11265 | 16 | { &hf_nvme_get_logpage_fw_slot_rsvd1, |
11266 | 16 | { "Reserved", "nvme.cmd.get_logpage.fw_slot.rsvd1", |
11267 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11268 | 16 | }, |
11269 | | /* Changed NameSpace List Response */ |
11270 | 16 | { &hf_nvme_get_logpage_changed_nslist, |
11271 | 16 | { "Changed Namespace", "nvme.cmd.get_logpage.changed_nslist", |
11272 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11273 | 16 | }, |
11274 | | /* Commands Supported and Effects Response */ |
11275 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cs, |
11276 | 16 | { "Command Supported Entry", "nvme.cmd.get_logpage.cmd_and_eff.cs", |
11277 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11278 | 16 | }, |
11279 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[0], |
11280 | 16 | { "Commands Supported and Effects Data Structure", "nvme.cmd.get_logpage.cmd_and_eff.cseds", |
11281 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11282 | 16 | }, |
11283 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[1], |
11284 | 16 | { "Command Supported (CSUPP)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.csupp", |
11285 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
11286 | 16 | }, |
11287 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[2], |
11288 | 16 | { "Logical Block Content Change (LBCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.lbcc", |
11289 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
11290 | 16 | }, |
11291 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[3], |
11292 | 16 | { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ncc", |
11293 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
11294 | 16 | }, |
11295 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[4], |
11296 | 16 | { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.nic", |
11297 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
11298 | 16 | }, |
11299 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[5], |
11300 | 16 | { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.ccc", |
11301 | 16 | FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL} |
11302 | 16 | }, |
11303 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[6], |
11304 | 16 | { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd0", |
11305 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffe0, NULL, HFILL} |
11306 | 16 | }, |
11307 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[7], |
11308 | 16 | { "Command Submission and Execution (CSE)", "nvme.cmd.get_logpage.cmd_and_eff.cseds.cse", |
11309 | 16 | FT_UINT32, BASE_HEX, VALS(cmd_eff_cse_tbl), 0x70000, NULL, HFILL} |
11310 | 16 | }, |
11311 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[8], |
11312 | 16 | { "UUID Selection Supported", "nvme.cmd.get_logpage.cmd_and_eff.cseds.uss", |
11313 | 16 | FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL} |
11314 | 16 | }, |
11315 | 16 | { &hf_nvme_get_logpage_cmd_and_eff_cseds[9], |
11316 | 16 | { "Reserved", "nvme.cmd.get_logpage.cmd_and_eff.cseds.rsvd1", |
11317 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL} |
11318 | 16 | }, |
11319 | | /* Supported Log Pages Response (LID 00h) */ |
11320 | 16 | { &hf_nvme_get_logpage_supported_lids, |
11321 | 16 | { "Log Page Identifier Supported", "nvme.cmd.get_logpage.supported.lids", |
11322 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11323 | 16 | }, |
11324 | 16 | { &hf_nvme_get_logpage_supported_lidseds[0], |
11325 | 16 | { "LID Supported and Effects Data Structure", "nvme.cmd.get_logpage.supported.lidseds", |
11326 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11327 | 16 | }, |
11328 | 16 | { &hf_nvme_get_logpage_supported_lidseds[1], |
11329 | 16 | { "LID Supported (LSUPP)", "nvme.cmd.get_logpage.supported.lidseds.lsupp", |
11330 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
11331 | 16 | }, |
11332 | 16 | { &hf_nvme_get_logpage_supported_lidseds[2], |
11333 | 16 | { "Index Offset Supported (IOS)", "nvme.cmd.get_logpage.supported.lidseds.ios", |
11334 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
11335 | 16 | }, |
11336 | 16 | { &hf_nvme_get_logpage_supported_lidseds[3], |
11337 | 16 | { "Reserved", "nvme.cmd.get_logpage.supported.lidseds.rsvd", |
11338 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffc, NULL, HFILL} |
11339 | 16 | }, |
11340 | 16 | { &hf_nvme_get_logpage_supported_lidseds[4], |
11341 | 16 | { "LID Specific Parameter (LIDSP)", "nvme.cmd.get_logpage.supported.lidseds.lidsp", |
11342 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
11343 | 16 | }, |
11344 | | /* Device Self-Test Response */ |
11345 | 16 | { &hf_nvme_get_logpage_selftest_csto[0], |
11346 | 16 | { "Current Device Self-Test Operation", "nvme.cmd.get_logpage.selftest.csto", |
11347 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11348 | 16 | }, |
11349 | 16 | { &hf_nvme_get_logpage_selftest_csto[1], |
11350 | 16 | { "Current Self-Test Operation Status", "nvme.cmd.get_logpage.selftest.csto.st", |
11351 | 16 | FT_UINT8, BASE_HEX, VALS(stest_type_active_tbl), 0xf, NULL, HFILL} |
11352 | 16 | }, |
11353 | 16 | { &hf_nvme_get_logpage_selftest_csto[2], |
11354 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.csto.rsvd", |
11355 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
11356 | 16 | }, |
11357 | 16 | { &hf_nvme_get_logpage_selftest_cstc[0], |
11358 | 16 | { "Current Device Self-Test Completion", "nvme.cmd.get_logpage.selftest.cstc", |
11359 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11360 | 16 | }, |
11361 | 16 | { &hf_nvme_get_logpage_selftest_cstc[1], |
11362 | 16 | { "Self-Test Completion Percent", "nvme.cmd.get_logpage.selftest.cstc.pcnt", |
11363 | 16 | FT_UINT8, BASE_DEC, NULL, 0x7f, NULL, HFILL} |
11364 | 16 | }, |
11365 | 16 | { &hf_nvme_get_logpage_selftest_cstc[2], |
11366 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.cstc.rsvd", |
11367 | 16 | FT_UINT8, BASE_HEX, NULL, 0x80, NULL, HFILL} |
11368 | 16 | }, |
11369 | 16 | { &hf_nvme_get_logpage_selftest_rsvd, |
11370 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.rsvd", |
11371 | 16 | FT_UINT16, BASE_HEX, NULL, 0x80, NULL, HFILL} |
11372 | 16 | }, |
11373 | 16 | { &hf_nvme_get_logpage_selftest_res, |
11374 | 16 | { "Latest Self-test Result Data Structure", "nvme.cmd.get_logpage.selftest.res", |
11375 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11376 | 16 | }, |
11377 | 16 | { &hf_nvme_get_logpage_selftest_res_status[0], |
11378 | 16 | { "Device Self-test Status", "nvme.cmd.get_logpage.selftest.res.status", |
11379 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11380 | 16 | }, |
11381 | 16 | { &hf_nvme_get_logpage_selftest_res_status[1], |
11382 | 16 | { "Device Self-test Result", "nvme.cmd.get_logpage.selftest.res.status.result", |
11383 | 16 | FT_UINT8, BASE_HEX, VALS(stest_result_tbl), 0xf, NULL, HFILL} |
11384 | 16 | }, |
11385 | 16 | { &hf_nvme_get_logpage_selftest_res_status[2], |
11386 | 16 | { "Device Self-test Type", "nvme.cmd.get_logpage.selftest.res.status.type", |
11387 | 16 | FT_UINT8, BASE_HEX, VALS(stest_type_done_tbl), 0xf0, NULL, HFILL} |
11388 | 16 | }, |
11389 | 16 | { &hf_nvme_get_logpage_selftest_res_sn, |
11390 | 16 | { "Segment Number", "nvme.cmd.get_logpage.selftest.res.sn", |
11391 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11392 | 16 | }, |
11393 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[0], |
11394 | 16 | { "Valid Diagnostic Information", "nvme.cmd.get_logpage.selftest.res.vdi", |
11395 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11396 | 16 | }, |
11397 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[1], |
11398 | 16 | { "Namespace Identifier (NSID) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.nsid", |
11399 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
11400 | 16 | }, |
11401 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[2], |
11402 | 16 | { "Failing LBA (FLBA) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.flba", |
11403 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
11404 | 16 | }, |
11405 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[3], |
11406 | 16 | { "Status Code Type (SCT) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sct", |
11407 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
11408 | 16 | }, |
11409 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[4], |
11410 | 16 | { "Status Code (SC) Field Valid", "nvme.cmd.get_logpage.selftest.res.vdi.sc", |
11411 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
11412 | 16 | }, |
11413 | 16 | { &hf_nvme_get_logpage_selftest_res_vdi[5], |
11414 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.res.vdi.rsvd", |
11415 | 16 | FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL} |
11416 | 16 | }, |
11417 | 16 | { &hf_nvme_get_logpage_selftest_res_rsvd, |
11418 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.res.rsvd", |
11419 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11420 | 16 | }, |
11421 | 16 | { &hf_nvme_get_logpage_selftest_res_poh, |
11422 | 16 | { "Power On Hours (POH)", "nvme.cmd.get_logpage.selftest.res.poh", |
11423 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11424 | 16 | }, |
11425 | 16 | { &hf_nvme_get_logpage_selftest_res_nsid, |
11426 | 16 | { "Namespace Identifier (NSID)", "nvme.cmd.get_logpage.selftest.res.nsid", |
11427 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11428 | 16 | }, |
11429 | 16 | { &hf_nvme_get_logpage_selftest_res_flba, |
11430 | 16 | { "Failing LBA", "nvme.cmd.get_logpage.selftest.res.flba", |
11431 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11432 | 16 | }, |
11433 | 16 | { &hf_nvme_get_logpage_selftest_res_sct[0], |
11434 | 16 | { "Status Code Type", "nvme.cmd.get_logpage.selftest.res.sct", |
11435 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11436 | 16 | }, |
11437 | 16 | { &hf_nvme_get_logpage_selftest_res_sct[1], |
11438 | 16 | { "Additional Information", "nvme.cmd.get_logpage.selftest.res.sct.ai", |
11439 | 16 | FT_UINT8, BASE_HEX, NULL, 0x7, NULL, HFILL} |
11440 | 16 | }, |
11441 | 16 | { &hf_nvme_get_logpage_selftest_res_sct[2], |
11442 | 16 | { "Reserved", "nvme.cmd.get_logpage.selftest.res.sct.rsvd", |
11443 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
11444 | 16 | }, |
11445 | 16 | { &hf_nvme_get_logpage_selftest_res_sc, |
11446 | 16 | { "Status Code", "nvme.cmd.get_logpage.selftest.res.sc", |
11447 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11448 | 16 | }, |
11449 | 16 | { &hf_nvme_get_logpage_selftest_res_vs, |
11450 | 16 | { "Vendor Specific", "nvme.cmd.get_logpage.selftest.res.vs", |
11451 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11452 | 16 | }, |
11453 | | /* Telemetry Log Response */ |
11454 | 16 | { &hf_nvme_get_logpage_telemetry_li, |
11455 | 16 | { "Log Identifier", "nvme.cmd.get_logpage.telemetry.li", |
11456 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11457 | 16 | }, |
11458 | 16 | { &hf_nvme_get_logpage_telemetry_rsvd0, |
11459 | 16 | { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd0", |
11460 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11461 | 16 | }, |
11462 | 16 | { &hf_nvme_get_logpage_telemetry_ieee, |
11463 | 16 | { "IEEE OUI Identifier (IEEE)", "nvme.cmd.get_logpage.telemetry.ieee", |
11464 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11465 | 16 | }, |
11466 | 16 | { &hf_nvme_get_logpage_telemetry_da1lb, |
11467 | 16 | { "Telemetry Data Area 1 Last Block", "nvme.cmd.get_logpage.telemetry.da1b", |
11468 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11469 | 16 | }, |
11470 | 16 | { &hf_nvme_get_logpage_telemetry_da2lb, |
11471 | 16 | { "Telemetry Data Area 2 Last Block", "nvme.cmd.get_logpage.telemetry.da2b", |
11472 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11473 | 16 | }, |
11474 | 16 | { &hf_nvme_get_logpage_telemetry_da3lb, |
11475 | 16 | { "Telemetry Data Area 3 Last Block", "nvme.cmd.get_logpage.telemetry.da3b", |
11476 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11477 | 16 | }, |
11478 | 16 | { &hf_nvme_get_logpage_telemetry_rsvd1, |
11479 | 16 | { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd1", |
11480 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11481 | 16 | }, |
11482 | 16 | { &hf_nvme_get_logpage_telemetry_da4lb, |
11483 | 16 | { "Telemetry Data Area 4 Last Block", "nvme.cmd.get_logpage.telemetry.da4b", |
11484 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11485 | 16 | }, |
11486 | 16 | { &hf_nvme_get_logpage_telemetry_rsvd2, |
11487 | 16 | { "Reserved", "nvme.cmd.get_logpage.telemetry.rsvd2", |
11488 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11489 | 16 | }, |
11490 | 16 | { &hf_nvme_get_logpage_telemetry_scope, |
11491 | 16 | { "Telemetry Scope", "nvme.cmd.get_logpage.telemetry.scope", |
11492 | 16 | FT_UINT8, BASE_HEX, VALS(telemetry_scope_tbl), 0x0, NULL, HFILL} |
11493 | 16 | }, |
11494 | 16 | { &hf_nvme_get_logpage_telemetry_hdgn, |
11495 | 16 | { "Telemetry Host-Initiated Data Generation Number", "nvme.cmd.get_logpage.telemetry.hdgn", |
11496 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11497 | 16 | }, |
11498 | 16 | { &hf_nvme_get_logpage_telemetry_da, |
11499 | 16 | { "Telemetry Controller-Initiated Data Available", "nvme.cmd.get_logpage.telemetry.da", |
11500 | 16 | FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11501 | 16 | }, |
11502 | 16 | { &hf_nvme_get_logpage_telemetry_dgn, |
11503 | 16 | { "Telemetry Controller-Initiated Data Generation Number", "nvme.cmd.get_logpage.telemetry.dgn", |
11504 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11505 | 16 | }, |
11506 | 16 | { &hf_nvme_get_logpage_telemetry_ri, |
11507 | 16 | { "Reason Identifier", "nvme.cmd.get_logpage.telemetry.ri", |
11508 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11509 | 16 | }, |
11510 | 16 | { &hf_nvme_get_logpage_telemetry_db, |
11511 | 16 | { "Telemetry Data Block", "nvme.cmd.get_logpage.telemetry.db", |
11512 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11513 | 16 | }, |
11514 | | /* Endurance Group Response */ |
11515 | 16 | { &hf_nvme_get_logpage_egroup_cw[0], |
11516 | 16 | { "Critical Warning", "nvme.cmd.get_logpage.egroup.cw", |
11517 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11518 | 16 | }, |
11519 | 16 | { &hf_nvme_get_logpage_egroup_cw[1], |
11520 | 16 | { "Available Spare Capacity Below Threshold", "nvme.cmd.get_logpage.egroup.cw.asc", |
11521 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
11522 | 16 | }, |
11523 | 16 | { &hf_nvme_get_logpage_egroup_cw[2], |
11524 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd0", |
11525 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
11526 | 16 | }, |
11527 | 16 | { &hf_nvme_get_logpage_egroup_cw[3], |
11528 | 16 | { "Reliability of Endurance Group Degraded due to Media Errors", "nvme.cmd.get_logpage.egroup.cw.rd", |
11529 | 16 | FT_BOOLEAN, 8, NULL, 0x4, NULL, HFILL} |
11530 | 16 | }, |
11531 | 16 | { &hf_nvme_get_logpage_egroup_cw[4], |
11532 | 16 | { "All Namespaces in Endurance Group Placed in RO State", "nvme.cmd.get_logpage.egroup.cw.ro", |
11533 | 16 | FT_BOOLEAN, 8, NULL, 0x8, NULL, HFILL} |
11534 | 16 | }, |
11535 | 16 | { &hf_nvme_get_logpage_egroup_cw[5], |
11536 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.cw.rsvd1", |
11537 | 16 | FT_BOOLEAN, 8, NULL, 0xf0, NULL, HFILL} |
11538 | 16 | }, |
11539 | 16 | { &hf_nvme_get_logpage_egroup_egfeat[0], |
11540 | 16 | { "Endurance Group Features", "nvme.cmd.get_logpage.egroup.egfeat", |
11541 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11542 | 16 | }, |
11543 | 16 | { &hf_nvme_get_logpage_egroup_egfeat[1], |
11544 | 16 | { "Endurance Group Media (Rotational)", "nvme.cmd.get_logpage.egroup.egfeat.egrmedia", |
11545 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
11546 | 16 | }, |
11547 | 16 | { &hf_nvme_get_logpage_egroup_egfeat[2], |
11548 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.egfeat.rsvd0", |
11549 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
11550 | 16 | }, |
11551 | 16 | { &hf_nvme_get_logpage_egroup_rsvd0, |
11552 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd0", |
11553 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11554 | 16 | }, |
11555 | 16 | { &hf_nvme_get_logpage_egroup_as, |
11556 | 16 | { "Available Spare Capacity %", "nvme.cmd.get_logpage.egroup.as", |
11557 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11558 | 16 | }, |
11559 | 16 | { &hf_nvme_get_logpage_egroup_ast, |
11560 | 16 | { "Available Spare Threshold %", "nvme.cmd.get_logpage.egroup.ast", |
11561 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11562 | 16 | }, |
11563 | 16 | { &hf_nvme_get_logpage_egroup_pu, |
11564 | 16 | { "Life Age (Percentage Used) %", "nvme.cmd.get_logpage.egroup.pu", |
11565 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11566 | 16 | }, |
11567 | 16 | { &hf_nvme_get_logpage_egroup_did, |
11568 | 16 | { "Domain Identifier", "nvme.cmd.get_logpage.egroup.did", |
11569 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11570 | 16 | }, |
11571 | 16 | { &hf_nvme_get_logpage_egroup_rsvd1, |
11572 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd1", |
11573 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11574 | 16 | }, |
11575 | 16 | { &hf_nvme_get_logpage_egroup_ee, |
11576 | 16 | { "Endurance Estimate (GB that may be written)", "nvme.cmd.get_logpage.egroup.ee", |
11577 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11578 | 16 | }, |
11579 | 16 | { &hf_nvme_get_logpage_egroup_dur, |
11580 | 16 | { "Data Units Read (GB)", "nvme.cmd.get_logpage.egroup.dur", |
11581 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11582 | 16 | }, |
11583 | 16 | { &hf_nvme_get_logpage_egroup_duw, |
11584 | 16 | { "Data Units Written (GB)", "nvme.cmd.get_logpage.egroup.duw", |
11585 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11586 | 16 | }, |
11587 | 16 | { &hf_nvme_get_logpage_egroup_muw, |
11588 | 16 | { "Media Units Written (GB)", "nvme.cmd.get_logpage.egroup.muw", |
11589 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11590 | 16 | }, |
11591 | 16 | { &hf_nvme_get_logpage_egroup_hrc, |
11592 | 16 | { "Host Read Commands", "nvme.cmd.get_logpage.egroup.hrc", |
11593 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11594 | 16 | }, |
11595 | 16 | { &hf_nvme_get_logpage_egroup_hwc, |
11596 | 16 | { "Host Write Commands", "nvme.cmd.get_logpage.egroup.hwc", |
11597 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11598 | 16 | }, |
11599 | 16 | { &hf_nvme_get_logpage_egroup_mdie, |
11600 | 16 | { "Media and Data Integrity Errors", "nvme.cmd.get_logpage.egroup.mdie", |
11601 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11602 | 16 | }, |
11603 | 16 | { &hf_nvme_get_logpage_egroup_ele, |
11604 | 16 | { "Number of Error Information Log Entries", "nvme.cmd.get_logpage.egroup.ele", |
11605 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11606 | 16 | }, |
11607 | 16 | { &hf_nvme_get_logpage_egroup_tegcap, |
11608 | 16 | { "Total Endurance Group Capacity (TEGCAP)", "nvme.cmd.get_logpage.egroup.tegcap", |
11609 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11610 | 16 | }, |
11611 | 16 | { &hf_nvme_get_logpage_egroup_uegcap, |
11612 | 16 | { "Unallocated Endurance Group Capacity (UEGCAP)", "nvme.cmd.get_logpage.egroup.uegcap", |
11613 | 16 | FT_BYTES, BASE_NO_DISPLAY_VALUE, NULL, 0x0, NULL, HFILL} |
11614 | 16 | }, |
11615 | 16 | { &hf_nvme_get_logpage_egroup_rsvd2, |
11616 | 16 | { "Reserved", "nvme.cmd.get_logpage.egroup.rsvd2", |
11617 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11618 | 16 | }, |
11619 | | /* Predictable Latency NVMSet Response */ |
11620 | 16 | { &hf_nvme_get_logpage_pred_lat_status[0], |
11621 | 16 | { "Predictable Latency NVM Set Status", "nvme.cmd.get_logpage.pred_lat.status", |
11622 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11623 | 16 | }, |
11624 | 16 | { &hf_nvme_get_logpage_pred_lat_status[1], |
11625 | 16 | { "Enabled Window Setting", "nvme.cmd.get_logpage.pred_lat.status.ws", |
11626 | 16 | FT_UINT8, BASE_HEX, VALS(plat_status_tbl), 0x7, NULL, HFILL} |
11627 | 16 | }, |
11628 | 16 | { &hf_nvme_get_logpage_pred_lat_status[2], |
11629 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.status.rsvd", |
11630 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
11631 | 16 | }, |
11632 | 16 | { &hf_nvme_get_logpage_pred_lat_rsvd0, |
11633 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd0", |
11634 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11635 | 16 | }, |
11636 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[0], |
11637 | 16 | { "Event Type", "nvme.cmd.get_logpage.pred_lat.etype", |
11638 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11639 | 16 | }, |
11640 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[1], |
11641 | 16 | { "DTWIN Reads Warning", "nvme.cmd.get_logpage.pred_lat.etype.rw", |
11642 | 16 | FT_BOOLEAN, 16, NULL, 0x1, NULL, HFILL} |
11643 | 16 | }, |
11644 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[2], |
11645 | 16 | { "DTWIN Writes Warning", "nvme.cmd.get_logpage.pred_lat.etype.ww", |
11646 | 16 | FT_BOOLEAN, 16, NULL, 0x2, NULL, HFILL} |
11647 | 16 | }, |
11648 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[3], |
11649 | 16 | { "DTWIN Time Warning", "nvme.cmd.get_logpage.pred_lat.etype.tw", |
11650 | 16 | FT_BOOLEAN, 16, NULL, 0x4, NULL, HFILL} |
11651 | 16 | }, |
11652 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[4], |
11653 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.etype.rsvd", |
11654 | 16 | FT_UINT16, BASE_HEX, NULL, 0x3ff8, NULL, HFILL} |
11655 | 16 | }, |
11656 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[5], |
11657 | 16 | { "Autonomous transition from DTWIN to NDWIN due to typical or maximum value exceeded", "nvme.cmd.get_logpage.pred_lat.etype.atve", |
11658 | 16 | FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL} |
11659 | 16 | }, |
11660 | 16 | { &hf_nvme_get_logpage_pred_lat_etype[6], |
11661 | 16 | { "Autonomous transition from DTWIN to NDWIN due to Deterministic Excursion", "nvme.cmd.get_logpage.pred_lat.etype.atde", |
11662 | 16 | FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL} |
11663 | 16 | }, |
11664 | 16 | { &hf_nvme_get_logpage_pred_lat_rsvd1, |
11665 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd1", |
11666 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11667 | 16 | }, |
11668 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_rt, |
11669 | 16 | { "DTWIN Reads Typical (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_rt", |
11670 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11671 | 16 | }, |
11672 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_wt, |
11673 | 16 | { "DTWIN Writes Typical (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_wt", |
11674 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11675 | 16 | }, |
11676 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_tm, |
11677 | 16 | { "DTWIN Time Maximum (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_tm", |
11678 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11679 | 16 | }, |
11680 | 16 | { &hf_nvme_get_logpage_pred_lat_ndwin_tmh, |
11681 | 16 | { "NDWIN Time Minimum High (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tmh", |
11682 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11683 | 16 | }, |
11684 | 16 | { &hf_nvme_get_logpage_pred_lat_ndwin_tml, |
11685 | 16 | { "NDWIN Time Minimum Low (ms)", "nvme.cmd.get_logpage.pred_lat.ndwin_tml", |
11686 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11687 | 16 | }, |
11688 | 16 | { &hf_nvme_get_logpage_pred_lat_rsvd2, |
11689 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd2", |
11690 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11691 | 16 | }, |
11692 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_re, |
11693 | 16 | { "DTWIN Reads Estimate (4 KiB blocks)", "nvme.cmd.get_logpage.pred_lat.dtwin_re", |
11694 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11695 | 16 | }, |
11696 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_we, |
11697 | 16 | { "DTWIN Writes Estimate (optimal block size)", "nvme.cmd.get_logpage.pred_lat.dtwin_we", |
11698 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11699 | 16 | }, |
11700 | 16 | { &hf_nvme_get_logpage_pred_lat_dtwin_te, |
11701 | 16 | { "DTWIN Time Estimate (ms)", "nvme.cmd.get_logpage.pred_lat.dtwin_te", |
11702 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11703 | 16 | }, |
11704 | 16 | { &hf_nvme_get_logpage_pred_lat_rsvd3, |
11705 | 16 | { "Reserved", "nvme.cmd.get_logpage.pred_lat.rsvd3", |
11706 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11707 | 16 | }, |
11708 | | /* Predictable Latency NVMSet Aggregate Response */ |
11709 | 16 | { &hf_nvme_get_logpage_pred_lat_aggreg_ne, |
11710 | 16 | { "Number of Entries", "nvme.cmd.get_logpage.pred_lat_aggreg.ne", |
11711 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11712 | 16 | }, |
11713 | 16 | { &hf_nvme_get_logpage_pred_lat_aggreg_nset, |
11714 | 16 | { "NVM Set with Pending Predictable Latency Event", "nvme.cmd.get_logpage.pred_lat_aggreg.nset", |
11715 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11716 | 16 | }, |
11717 | | /* ANA Response */ |
11718 | 16 | { &hf_nvme_get_logpage_ana_chcnt, |
11719 | 16 | { "Change Count", "nvme.cmd.get_logpage.ana.chcnt", |
11720 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11721 | 16 | }, |
11722 | 16 | { &hf_nvme_get_logpage_ana_ngd, |
11723 | 16 | { "Number of ANA Group Descriptors", "nvme.cmd.get_logpage.ana.ngd", |
11724 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11725 | 16 | }, |
11726 | 16 | { &hf_nvme_get_logpage_ana_rsvd, |
11727 | 16 | { "Reserved", "nvme.cmd.get_logpage.ana.rsvd", |
11728 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11729 | 16 | }, |
11730 | 16 | { &hf_nvme_get_logpage_ana_grp, |
11731 | 16 | { "ANA Group Descriptor", "nvme.cmd.get_logpage.ana.grp", |
11732 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11733 | 16 | }, |
11734 | 16 | { &hf_nvme_get_logpage_ana_grp_id, |
11735 | 16 | { "ANA Group ID", "nvme.cmd.get_logpage.ana.grp.id", |
11736 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11737 | 16 | }, |
11738 | 16 | { &hf_nvme_get_logpage_ana_grp_nns, |
11739 | 16 | { "Number of NSID Values", "nvme.cmd.get_logpage.ana.grp.nns", |
11740 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11741 | 16 | }, |
11742 | 16 | { &hf_nvme_get_logpage_ana_grp_chcnt, |
11743 | 16 | { "Change Count", "nvme.cmd.get_logpage.ana.grp.chcnt", |
11744 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11745 | 16 | }, |
11746 | 16 | { &hf_nvme_get_logpage_ana_grp_anas[0], |
11747 | 16 | { "ANA State", "nvme.cmd.get_logpage.ana.grp.anas", |
11748 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11749 | 16 | }, |
11750 | 16 | { &hf_nvme_get_logpage_ana_grp_anas[1], |
11751 | 16 | { "Asymmetric Namespace Access State", "nvme.cmd.get_logpage.ana.grp.anas.state", |
11752 | 16 | FT_UINT8, BASE_HEX, VALS(ana_state_tbl), 0xf, NULL, HFILL} |
11753 | 16 | }, |
11754 | 16 | { &hf_nvme_get_logpage_ana_grp_anas[2], |
11755 | 16 | { "Reserved", "nvme.cmd.get_logpage.ana.grp.anas.rsvd", |
11756 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
11757 | 16 | }, |
11758 | 16 | { &hf_nvme_get_logpage_ana_grp_rsvd, |
11759 | 16 | { "Reserved", "nvme.cmd.get_logpage.ana.grp.rsvd", |
11760 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11761 | 16 | }, |
11762 | 16 | { &hf_nvme_get_logpage_ana_grp_nsid, |
11763 | 16 | { "Namespace Identifier", "nvme.cmd.get_logpage.ana.grp.nsid", |
11764 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11765 | 16 | }, |
11766 | | /* LBA Status Information Response */ |
11767 | 16 | { &hf_nvme_get_logpage_lba_status_lslplen, |
11768 | 16 | { "LBA Status Log Page Length (LSLPLEN)", "nvme.cmd.get_logpage.lba_status.lslplen", |
11769 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11770 | 16 | }, |
11771 | 16 | { &hf_nvme_get_logpage_lba_status_nlslne, |
11772 | 16 | { "Number of LBA Status Log Namespace Elements (NLSLNE)", "nvme.cmd.get_logpage.lba_status.nlslne", |
11773 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11774 | 16 | }, |
11775 | 16 | { &hf_nvme_get_logpage_lba_status_estulb, |
11776 | 16 | { "Estimate of Unrecoverable Logical Blocks (ESTULB)", "nvme.cmd.get_logpage.lba_status.estulb", |
11777 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11778 | 16 | }, |
11779 | 16 | { &hf_nvme_get_logpage_lba_status_rsvd, |
11780 | 16 | { "Reserved", "nvme.cmd.get_logpage.lba_status.rsvd", |
11781 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11782 | 16 | }, |
11783 | 16 | { &hf_nvme_get_logpage_lba_status_lsgc, |
11784 | 16 | { "LBA Status Generation Counter (LSGC)", "nvme.cmd.get_logpage.lba_status.lsgc", |
11785 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11786 | 16 | }, |
11787 | 16 | { &hf_nvme_get_logpage_lba_status_nel, |
11788 | 16 | { "LBA Status Log Namespace Element List", "nvme.cmd.get_logpage.lba_status.nel", |
11789 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11790 | 16 | }, |
11791 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne, |
11792 | 16 | { "LBA Status Log Namespace Element", "nvme.cmd.get_logpage.lba_status.nel.ne", |
11793 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11794 | 16 | }, |
11795 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_neid, |
11796 | 16 | { "Namespace Element Identifier (NEID)", "nvme.cmd.get_logpage.lba_status.nel.ne.neid", |
11797 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11798 | 16 | }, |
11799 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_nlrd, |
11800 | 16 | { "Number of LBA Range Descriptors (NLRD)", "nvme.cmd.get_logpage.lba_status.nel.ne.nlrd", |
11801 | 16 | FT_UINT32, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL} |
11802 | 16 | }, |
11803 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_ratype, |
11804 | 16 | { "Recommended Action Type (RATYPE)", "nvme.cmd.get_logpage.lba_status.nel.ne.ratype", |
11805 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11806 | 16 | }, |
11807 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_rsvd, |
11808 | 16 | { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rsvd", |
11809 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11810 | 16 | }, |
11811 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_rd, |
11812 | 16 | { "LBA Range Descriptor", "nvme.cmd.get_logpage.lba_status.nel.ne.rd", |
11813 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11814 | 16 | }, |
11815 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rslba, |
11816 | 16 | { "Range Starting LBA (RSLBA)", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rslba", |
11817 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11818 | 16 | }, |
11819 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rnlb, |
11820 | 16 | { "Range Number of Logical Blocks (RNLB)", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rnlb", |
11821 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11822 | 16 | }, |
11823 | 16 | { &hf_nvme_get_logpage_lba_status_nel_ne_rd_rsvd, |
11824 | 16 | { "Reserved", "nvme.cmd.get_logpage.lba_status.nel.ne.rd.rsvd", |
11825 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11826 | 16 | }, |
11827 | | /* Get LogPage Endurance Group Aggregate Response */ |
11828 | 16 | { &hf_nvme_get_logpage_egroup_aggreg_ne, |
11829 | 16 | { "Number of Entries", "nvme.cmd.get_logpage.egroup_agreg.ne", |
11830 | 16 | FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11831 | 16 | }, |
11832 | 16 | { &hf_nvme_get_logpage_egroup_aggreg_eg, |
11833 | 16 | { "Endurance Group", "nvme.cmd.get_logpage.egroup_agreg.eg", |
11834 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11835 | 16 | }, |
11836 | | /* Get LogPage Reservation Notification Response */ |
11837 | 16 | { &hf_nvme_get_logpage_reserv_notif_lpc, |
11838 | 16 | { "Log Page Count", "nvme.cmd.get_logpage.reserv_notif.lpc", |
11839 | 16 | FT_UINT64, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11840 | 16 | }, |
11841 | 16 | { &hf_nvme_get_logpage_reserv_notif_lpt, |
11842 | 16 | { "Reservation Notification Log Page Type", "nvme.cmd.get_logpage.reserv_notif.lpt", |
11843 | 16 | FT_UINT8, BASE_HEX, VALS(rnlpt_tbl), 0x0, NULL, HFILL} |
11844 | 16 | }, |
11845 | 16 | { &hf_nvme_get_logpage_reserv_notif_nalp, |
11846 | 16 | { "Number of Available Log Pages", "nvme.cmd.get_logpage.reserv_notif.nalp", |
11847 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11848 | 16 | }, |
11849 | 16 | { &hf_nvme_get_logpage_reserv_notif_rsvd0, |
11850 | 16 | { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd0", |
11851 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11852 | 16 | }, |
11853 | 16 | { &hf_nvme_get_logpage_reserv_notif_nsid, |
11854 | 16 | { "Namespace ID", "nvme.cmd.get_logpage.reserv_notif.nsid", |
11855 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11856 | 16 | }, |
11857 | 16 | { &hf_nvme_get_logpage_reserv_notif_rsvd1, |
11858 | 16 | { "Reserved", "nvme.cmd.get_logpage.reserv_notif.rsvd1", |
11859 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11860 | 16 | }, |
11861 | | /* Get LogPage Sanitize Response */ |
11862 | 16 | { &hf_nvme_get_logpage_sanitize_sprog, |
11863 | 16 | { "Sanitize Progress (SPROG)", "nvme.cmd.get_logpage.sanitize.sprog", |
11864 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11865 | 16 | }, |
11866 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[0], |
11867 | 16 | { "Sanitize Status (SSTAT)", "nvme.cmd.get_logpage.sanitize.sstat", |
11868 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11869 | 16 | }, |
11870 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[1], |
11871 | 16 | { "Status of the most recent Sanitize Operation", "nvme.cmd.get_logpage.sanitize.sstat.mrst", |
11872 | 16 | FT_UINT16, BASE_HEX, VALS(san_mrst_tbl), 0x7, NULL, HFILL} |
11873 | 16 | }, |
11874 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[2], |
11875 | 16 | { "Number of Completed Overwrite Passes", "nvme.cmd.get_logpage.sanitize.sstat.cop", |
11876 | 16 | FT_UINT16, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
11877 | 16 | }, |
11878 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[3], |
11879 | 16 | { "Global Data Erased", "nvme.cmd.get_logpage.sanitize.sstat.gde", |
11880 | 16 | FT_BOOLEAN, 16, NULL, 0x100, NULL, HFILL} |
11881 | 16 | }, |
11882 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[4], |
11883 | 16 | { "Media Verification Canceled", "nvme.cmd.get_logpage.sanitize.sstat.mvcncld", |
11884 | 16 | FT_BOOLEAN, 16, NULL, 0x200, NULL, HFILL} |
11885 | 16 | }, |
11886 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[5], |
11887 | 16 | { "Namespace Data Erased", "nvme.cmd.get_logpage.sanitize.sstat.nde", |
11888 | 16 | FT_BOOLEAN, 16, NULL, 0x400, NULL, HFILL} |
11889 | 16 | }, |
11890 | 16 | { &hf_nvme_get_logpage_sanitize_sstat[6], |
11891 | 16 | { "Reserved", "nvme.cmd.get_logpage.sanitize.sstat.rsvd", |
11892 | 16 | FT_UINT16, BASE_HEX, NULL, 0xf800, NULL, HFILL} |
11893 | 16 | }, |
11894 | 16 | { &hf_nvme_get_logpage_sanitize_scdw10, |
11895 | 16 | { "Sanitize Command Dword 10 Information (SCDW10)", "nvme.cmd.get_logpage.sanitize.scdw10", |
11896 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11897 | 16 | }, |
11898 | 16 | { &hf_nvme_get_logpage_sanitize_eto, |
11899 | 16 | { "Estimated Time For Overwrite (seconds)", "nvme.cmd.get_logpage.sanitize.eto", |
11900 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11901 | 16 | }, |
11902 | 16 | { &hf_nvme_get_logpage_sanitize_etbe, |
11903 | 16 | { "Estimated Time For Block Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etbe", |
11904 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11905 | 16 | }, |
11906 | 16 | { &hf_nvme_get_logpage_sanitize_etce, |
11907 | 16 | { "Estimated Time For Crypto Erase (seconds)", "nvme.cmd.get_logpage.sanitize.etce", |
11908 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11909 | 16 | }, |
11910 | 16 | { &hf_nvme_get_logpage_sanitize_etond, |
11911 | 16 | { "Estimated Time For Overwrite (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etond", |
11912 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11913 | 16 | }, |
11914 | 16 | { &hf_nvme_get_logpage_sanitize_etbend, |
11915 | 16 | { "Estimated Time For Block Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etbend", |
11916 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11917 | 16 | }, |
11918 | 16 | { &hf_nvme_get_logpage_sanitize_etcend, |
11919 | 16 | { "Estimated Time For Crypto Erase (seconds) with No-Deallocate", "nvme.cmd.get_logpage.sanitize.etcend", |
11920 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11921 | 16 | }, |
11922 | 16 | { &hf_nvme_get_logpage_sanitize_etpvds, |
11923 | 16 | { "Estimated Time For Post-Verification Deallocation State (seconds)", "nvme.cmd.get_logpage.sanitize.etpvds", |
11924 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11925 | 16 | }, |
11926 | 16 | { &hf_nvme_get_logpage_sanitize_ssi[0], |
11927 | 16 | { "Sanitize State Information (SSI)", "nvme.cmd.get_logpage.sanitize.ssi", |
11928 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11929 | 16 | }, |
11930 | 16 | { &hf_nvme_get_logpage_sanitize_ssi[1], |
11931 | 16 | { "Sanitize State (SANS)", "nvme.cmd.get_logpage.sanitize.ssi.sans", |
11932 | 16 | FT_UINT8, BASE_HEX, VALS(san_sans_tbl), 0x0f, NULL, HFILL} |
11933 | 16 | }, |
11934 | 16 | { &hf_nvme_get_logpage_sanitize_ssi[2], |
11935 | 16 | { "Failure State (FAILS)", "nvme.cmd.get_logpage.sanitize.ssi.fails", |
11936 | 16 | FT_UINT8, BASE_HEX, VALS(san_sans_tbl), 0xf0, |
11937 | 16 | "Sanitize state in which the failure occurred", HFILL} |
11938 | 16 | }, |
11939 | 16 | { &hf_nvme_get_logpage_sanitize_rsvd0, |
11940 | 16 | { "Reserved", "nvme.cmd.get_logpage.sanitize.rsvd0", |
11941 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11942 | 16 | }, |
11943 | 16 | { &hf_nvme_get_logpage_sanitize_mnsoip, |
11944 | 16 | { "Maximum Namespace Sanitize Operations In Progress (MNSOIP)", "nvme.cmd.get_logpage.sanitize.mnsoip", |
11945 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
11946 | 16 | }, |
11947 | 16 | { &hf_nvme_get_logpage_sanitize_stnsid, |
11948 | 16 | { "Sanitization Target NSID (STNSID)", "nvme.cmd.get_logpage.sanitize.stnsid", |
11949 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11950 | 16 | }, |
11951 | 16 | { &hf_nvme_get_logpage_sanitize_rsvd, |
11952 | 16 | { "Reserved", "nvme.cmd.get_logpage.sanitize.rsvd", |
11953 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11954 | 16 | }, |
11955 | | /* Feature Identifiers Supported and Effects Response */ |
11956 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fidx, |
11957 | 16 | { "FID Supported Entry", "nvme.cmd.get_logpage.feat_sup_and_eff.fidx", |
11958 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
11959 | 16 | }, |
11960 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[0], |
11961 | 16 | { "FID Supported and Effects Data Structure", "nvme.cmd.get_logpage.feat_sup_and_eff.fids", |
11962 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
11963 | 16 | }, |
11964 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[1], |
11965 | 16 | { "FID Supported (FSUPP)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.fsupp", |
11966 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
11967 | 16 | }, |
11968 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[2], |
11969 | 16 | { "User Data Content Change (UDCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.udcc", |
11970 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
11971 | 16 | }, |
11972 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[3], |
11973 | 16 | { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.ncc", |
11974 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
11975 | 16 | }, |
11976 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[4], |
11977 | 16 | { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.nic", |
11978 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
11979 | 16 | }, |
11980 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[5], |
11981 | 16 | { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.ccc", |
11982 | 16 | FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL} |
11983 | 16 | }, |
11984 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[6], |
11985 | 16 | { "Reserved", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.rsvd0", |
11986 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7ffe0, NULL, HFILL} |
11987 | 16 | }, |
11988 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[7], |
11989 | 16 | { "UUID Selection Supported (USS)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.uss", |
11990 | 16 | FT_BOOLEAN, 32, NULL, 0x80000, NULL, HFILL} |
11991 | 16 | }, |
11992 | 16 | { &hf_nvme_get_logpage_feat_sup_and_eff_fids[8], |
11993 | 16 | { "FID Scope (FSP)", "nvme.cmd.get_logpage.feat_sup_and_eff.fids.fsp", |
11994 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL} |
11995 | 16 | }, |
11996 | | /* NVMe-MI Commands Supported and Effects Response */ |
11997 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cs, |
11998 | 16 | { "MI Command Supported Entry", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cs", |
11999 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12000 | 16 | }, |
12001 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[0], |
12002 | 16 | { "NVMe-MI Commands Supported and Effects Data Structure", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds", |
12003 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12004 | 16 | }, |
12005 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[1], |
12006 | 16 | { "Command Supported (CSUPP)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.csupp", |
12007 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12008 | 16 | }, |
12009 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[2], |
12010 | 16 | { "User Data Content Change (UDCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.udcc", |
12011 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
12012 | 16 | }, |
12013 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[3], |
12014 | 16 | { "Namespace Capability Change (NCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.ncc", |
12015 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
12016 | 16 | }, |
12017 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[4], |
12018 | 16 | { "Namespace Inventory Change (NIC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.nic", |
12019 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
12020 | 16 | }, |
12021 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[5], |
12022 | 16 | { "Controller Capability Change (CCC)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.ccc", |
12023 | 16 | FT_BOOLEAN, 32, NULL, 0x10, NULL, HFILL} |
12024 | 16 | }, |
12025 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[6], |
12026 | 16 | { "Reserved", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.rsvd", |
12027 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffe0, NULL, HFILL} |
12028 | 16 | }, |
12029 | 16 | { &hf_nvme_get_logpage_mi_cmd_sup_and_eff_cseds[7], |
12030 | 16 | { "Command Scope (CSP)", "nvme.cmd.get_logpage.mi_cmd_sup_and_eff.cseds.csp", |
12031 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfff00000, NULL, HFILL} |
12032 | 16 | }, |
12033 | | /* Command and Feature Lockdown Response */ |
12034 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[0], |
12035 | 16 | { "Command and Feature Identifier List Attributes (CFILA)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila", |
12036 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12037 | 16 | }, |
12038 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[1], |
12039 | 16 | { "Scope Selected (SS)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.ss", |
12040 | 16 | FT_UINT8, BASE_HEX, VALS(lockdown_scope_tbl), 0x0f, NULL, HFILL} |
12041 | 16 | }, |
12042 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[2], |
12043 | 16 | { "Contents Selected (CS)", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.cs", |
12044 | 16 | FT_UINT8, BASE_HEX, VALS(lockdown_contents_tbl), 0x30, NULL, HFILL} |
12045 | 16 | }, |
12046 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_cfila[3], |
12047 | 16 | { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfila.rsvd", |
12048 | 16 | FT_UINT8, BASE_HEX, NULL, 0xc0, NULL, HFILL} |
12049 | 16 | }, |
12050 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_rsvd, |
12051 | 16 | { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.rsvd", |
12052 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12053 | 16 | }, |
12054 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_lngth, |
12055 | 16 | { "Length (LNGTH)", "nvme.cmd.get_logpage.cmd_feat_lockdown.lngth", |
12056 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12057 | 16 | }, |
12058 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_cfil, |
12059 | 16 | { "Command/Feature Identifier", "nvme.cmd.get_logpage.cmd_feat_lockdown.cfil", |
12060 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12061 | 16 | }, |
12062 | 16 | { &hf_nvme_get_logpage_cmd_feat_lockdown_rsvd1, |
12063 | 16 | { "Reserved", "nvme.cmd.get_logpage.cmd_feat_lockdown.rsvd1", |
12064 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12065 | 16 | }, |
12066 | | /* Get LogPage Physical Interface Receiver Eye Opening Measurement (LID 19h) response */ |
12067 | 16 | { &hf_nvme_get_logpage_eom_lid, |
12068 | 16 | { "Log Identifier", "nvme.cmd.get_logpage.eom.lid", |
12069 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12070 | 16 | }, |
12071 | 16 | { &hf_nvme_get_logpage_eom_eomip, |
12072 | 16 | { "EOM In Progress", "nvme.cmd.get_logpage.eom.eomip", |
12073 | 16 | FT_UINT8, BASE_HEX, VALS(eom_eomip_tbl), 0x0, NULL, HFILL} |
12074 | 16 | }, |
12075 | 16 | { &hf_nvme_get_logpage_eom_hsize, |
12076 | 16 | { "Header Size (bytes)", "nvme.cmd.get_logpage.eom.hsize", |
12077 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12078 | 16 | }, |
12079 | 16 | { &hf_nvme_get_logpage_eom_rsz, |
12080 | 16 | { "Result Size (bytes)", "nvme.cmd.get_logpage.eom.rsz", |
12081 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12082 | 16 | }, |
12083 | 16 | { &hf_nvme_get_logpage_eom_edgn, |
12084 | 16 | { "EOM Data Generation Number", "nvme.cmd.get_logpage.eom.edgn", |
12085 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12086 | 16 | }, |
12087 | 16 | { &hf_nvme_get_logpage_eom_lrev, |
12088 | 16 | { "Log Revision", "nvme.cmd.get_logpage.eom.lrev", |
12089 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12090 | 16 | }, |
12091 | 16 | { &hf_nvme_get_logpage_eom_odp[0], |
12092 | 16 | { "Optional Data Present", "nvme.cmd.get_logpage.eom.odp", |
12093 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12094 | 16 | }, |
12095 | 16 | { &hf_nvme_get_logpage_eom_odp[1], |
12096 | 16 | { "Printable Eye Field Present", "nvme.cmd.get_logpage.eom.odp.pefp", |
12097 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
12098 | 16 | }, |
12099 | 16 | { &hf_nvme_get_logpage_eom_odp[2], |
12100 | 16 | { "Eye Data Field Present", "nvme.cmd.get_logpage.eom.odp.edfp", |
12101 | 16 | FT_BOOLEAN, 8, NULL, 0x2, NULL, HFILL} |
12102 | 16 | }, |
12103 | 16 | { &hf_nvme_get_logpage_eom_odp[3], |
12104 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.odp.rsvd", |
12105 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfc, NULL, HFILL} |
12106 | 16 | }, |
12107 | 16 | { &hf_nvme_get_logpage_eom_lns, |
12108 | 16 | { "Lanes Configured", "nvme.cmd.get_logpage.eom.lns", |
12109 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12110 | 16 | }, |
12111 | 16 | { &hf_nvme_get_logpage_eom_epl, |
12112 | 16 | { "Eyes Per Lane", "nvme.cmd.get_logpage.eom.epl", |
12113 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12114 | 16 | }, |
12115 | 16 | { &hf_nvme_get_logpage_eom_lspfc[0], |
12116 | 16 | { "Log Specific Parameter Field Copy", "nvme.cmd.get_logpage.eom.lspfc", |
12117 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12118 | 16 | }, |
12119 | 16 | { &hf_nvme_get_logpage_eom_lspfc[1], |
12120 | 16 | { "Log Specific Parameter Field Value", "nvme.cmd.get_logpage.eom.lspfc.lspfv", |
12121 | 16 | FT_UINT8, BASE_HEX, NULL, 0x7f, NULL, HFILL} |
12122 | 16 | }, |
12123 | 16 | { &hf_nvme_get_logpage_eom_lspfc[2], |
12124 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.lspfc.rsvd", |
12125 | 16 | FT_BOOLEAN, 8, NULL, 0x80, NULL, HFILL} |
12126 | 16 | }, |
12127 | 16 | { &hf_nvme_get_logpage_eom_linfo[0], |
12128 | 16 | { "Link Information", "nvme.cmd.get_logpage.eom.linfo", |
12129 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12130 | 16 | }, |
12131 | 16 | { &hf_nvme_get_logpage_eom_linfo[1], |
12132 | 16 | { "Measurement Link Speed", "nvme.cmd.get_logpage.eom.linfo.mls", |
12133 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0f, NULL, HFILL} |
12134 | 16 | }, |
12135 | 16 | { &hf_nvme_get_logpage_eom_linfo[2], |
12136 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.linfo.rsvd", |
12137 | 16 | FT_UINT8, BASE_HEX, NULL, 0xf0, NULL, HFILL} |
12138 | 16 | }, |
12139 | 16 | { &hf_nvme_get_logpage_eom_rsvd0, |
12140 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.rsvd0", |
12141 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12142 | 16 | }, |
12143 | 16 | { &hf_nvme_get_logpage_eom_lsic, |
12144 | 16 | { "Log Specific Identifier Copy", "nvme.cmd.get_logpage.eom.lsic", |
12145 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12146 | 16 | }, |
12147 | 16 | { &hf_nvme_get_logpage_eom_ds, |
12148 | 16 | { "Descriptor Size (bytes)", "nvme.cmd.get_logpage.eom.ds", |
12149 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12150 | 16 | }, |
12151 | 16 | { &hf_nvme_get_logpage_eom_nd, |
12152 | 16 | { "Number of Descriptors", "nvme.cmd.get_logpage.eom.nd", |
12153 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12154 | 16 | }, |
12155 | 16 | { &hf_nvme_get_logpage_eom_maxtb, |
12156 | 16 | { "Maximum Top Bottom", "nvme.cmd.get_logpage.eom.maxtb", |
12157 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12158 | 16 | }, |
12159 | 16 | { &hf_nvme_get_logpage_eom_maxlr, |
12160 | 16 | { "Maximum Left Right", "nvme.cmd.get_logpage.eom.maxlr", |
12161 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12162 | 16 | }, |
12163 | 16 | { &hf_nvme_get_logpage_eom_etgood, |
12164 | 16 | { "Estimated Time for Good Quality (seconds)", "nvme.cmd.get_logpage.eom.etgood", |
12165 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12166 | 16 | }, |
12167 | 16 | { &hf_nvme_get_logpage_eom_etbetter, |
12168 | 16 | { "Estimated Time for Better Quality (seconds)", "nvme.cmd.get_logpage.eom.etbetter", |
12169 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12170 | 16 | }, |
12171 | 16 | { &hf_nvme_get_logpage_eom_etbest, |
12172 | 16 | { "Estimated Time for Best Quality (seconds)", "nvme.cmd.get_logpage.eom.etbest", |
12173 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12174 | 16 | }, |
12175 | 16 | { &hf_nvme_get_logpage_eom_rsvd1, |
12176 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.rsvd1", |
12177 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12178 | 16 | }, |
12179 | 16 | { &hf_nvme_get_logpage_eom_desc, |
12180 | 16 | { "EOM Lane Descriptor", "nvme.cmd.get_logpage.eom.desc", |
12181 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12182 | 16 | }, |
12183 | 16 | { &hf_nvme_get_logpage_eom_desc_rsvd0, |
12184 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.desc.rsvd0", |
12185 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12186 | 16 | }, |
12187 | 16 | { &hf_nvme_get_logpage_eom_desc_mstat[0], |
12188 | 16 | { "Measurement Status", "nvme.cmd.get_logpage.eom.desc.mstat", |
12189 | 16 | FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12190 | 16 | }, |
12191 | 16 | { &hf_nvme_get_logpage_eom_desc_mstat[1], |
12192 | 16 | { "Measurement Successful", "nvme.cmd.get_logpage.eom.desc.mstat.mscs", |
12193 | 16 | FT_BOOLEAN, 8, NULL, 0x1, NULL, HFILL} |
12194 | 16 | }, |
12195 | 16 | { &hf_nvme_get_logpage_eom_desc_mstat[2], |
12196 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.desc.mstat.rsvd", |
12197 | 16 | FT_UINT8, BASE_HEX, NULL, 0xfe, NULL, HFILL} |
12198 | 16 | }, |
12199 | 16 | { &hf_nvme_get_logpage_eom_desc_ln, |
12200 | 16 | { "Lane", "nvme.cmd.get_logpage.eom.desc.ln", |
12201 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12202 | 16 | }, |
12203 | 16 | { &hf_nvme_get_logpage_eom_desc_eye, |
12204 | 16 | { "Eye", "nvme.cmd.get_logpage.eom.desc.eye", |
12205 | 16 | FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12206 | 16 | }, |
12207 | 16 | { &hf_nvme_get_logpage_eom_desc_top, |
12208 | 16 | { "Top", "nvme.cmd.get_logpage.eom.desc.top", |
12209 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12210 | 16 | }, |
12211 | 16 | { &hf_nvme_get_logpage_eom_desc_btm, |
12212 | 16 | { "Bottom", "nvme.cmd.get_logpage.eom.desc.btm", |
12213 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12214 | 16 | }, |
12215 | 16 | { &hf_nvme_get_logpage_eom_desc_lft, |
12216 | 16 | { "Left", "nvme.cmd.get_logpage.eom.desc.lft", |
12217 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12218 | 16 | }, |
12219 | 16 | { &hf_nvme_get_logpage_eom_desc_rgt, |
12220 | 16 | { "Right", "nvme.cmd.get_logpage.eom.desc.rgt", |
12221 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12222 | 16 | }, |
12223 | 16 | { &hf_nvme_get_logpage_eom_desc_nrows, |
12224 | 16 | { "Number of Rows", "nvme.cmd.get_logpage.eom.desc.nrows", |
12225 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12226 | 16 | }, |
12227 | 16 | { &hf_nvme_get_logpage_eom_desc_ncols, |
12228 | 16 | { "Number of Columns", "nvme.cmd.get_logpage.eom.desc.ncols", |
12229 | 16 | FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12230 | 16 | }, |
12231 | 16 | { &hf_nvme_get_logpage_eom_desc_edlen, |
12232 | 16 | { "Eye Data Length (bytes)", "nvme.cmd.get_logpage.eom.desc.edlen", |
12233 | 16 | FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL} |
12234 | 16 | }, |
12235 | 16 | { &hf_nvme_get_logpage_eom_desc_rsvd1, |
12236 | 16 | { "Reserved", "nvme.cmd.get_logpage.eom.desc.rsvd1", |
12237 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12238 | 16 | }, |
12239 | 16 | { &hf_nvme_get_logpage_eom_desc_pe, |
12240 | 16 | { "Printable Eye", "nvme.cmd.get_logpage.eom.desc.pe", |
12241 | 16 | FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12242 | 16 | }, |
12243 | 16 | { &hf_nvme_get_logpage_eom_desc_ed, |
12244 | 16 | { "Eye Data", "nvme.cmd.get_logpage.eom.desc.ed", |
12245 | 16 | FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL} |
12246 | 16 | }, |
12247 | | /* NVMe Response fields */ |
12248 | 16 | { &hf_nvme_cqe_dword0, |
12249 | 16 | { "DWORD0", "nvme.cqe.dword0", |
12250 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12251 | 16 | }, |
12252 | 16 | { &hf_nvme_cqe_dword0_sf_err, |
12253 | 16 | { "Set Features Error Specific Code", "nvme.cqe.dword0.set_features.err", |
12254 | 16 | FT_UINT32, BASE_HEX, VALS(nvme_cqe_sc_sf_err_dword0_tbl), 0x0, NULL, HFILL} |
12255 | 16 | }, |
12256 | 16 | { &hf_nvme_cqe_aev_dword0[0], |
12257 | 16 | { "DWORD0", "nvme.cqe.dword0.aev", |
12258 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12259 | 16 | }, |
12260 | 16 | { &hf_nvme_cqe_aev_dword0[1], |
12261 | 16 | { "Asynchronous Event Type", "nvme.cqe.dword0.aev.aet", |
12262 | 16 | FT_UINT32, BASE_HEX, VALS(nvme_cqe_aev_aet_dword0_tbl), 0x7, NULL, HFILL} |
12263 | 16 | }, |
12264 | 16 | { &hf_nvme_cqe_aev_dword0[2], |
12265 | 16 | { "Reserved", "nvme.cqe.dword0.aev.rsvd0", |
12266 | 16 | FT_UINT32, BASE_HEX, NULL, 0xf8, NULL, HFILL} |
12267 | 16 | }, |
12268 | 16 | { &hf_nvme_cqe_aev_dword0[3], |
12269 | 16 | { "Asynchronous Event Information", "nvme.cqe.dword0.aev.aei", |
12270 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL} |
12271 | 16 | }, |
12272 | 16 | { &hf_nvme_cqe_aev_dword0[4], |
12273 | 16 | { "Log Page Identifier", "nvme.cqe.dword0.aev.lpi", |
12274 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_logpage_lid), 0xff0000, NULL, HFILL} |
12275 | 16 | }, |
12276 | 16 | { &hf_nvme_cqe_aev_dword0[5], |
12277 | 16 | { "Reserved", "nvme.cqe.dword0.aev.rsvd1", |
12278 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
12279 | 16 | }, |
12280 | | /* Set Feature Responses */ |
12281 | 16 | { &hf_nvme_cqe_dword0_sf_nq[0], |
12282 | 16 | { "DWORD0: Set Feature Number of Queues Result", "nvme.cqe.dword0.set_features.nq", |
12283 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12284 | 16 | }, |
12285 | 16 | { &hf_nvme_cqe_dword0_sf_nq[1], |
12286 | 16 | { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.set_features.nq.nsqa", |
12287 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL} |
12288 | 16 | }, |
12289 | 16 | { &hf_nvme_cqe_dword0_sf_nq[2], |
12290 | 16 | { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.set_features.ncqa", |
12291 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL} |
12292 | 16 | }, |
12293 | | /* Get Feature Responses */ |
12294 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[0], |
12295 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.arb", |
12296 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12297 | 16 | }, |
12298 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[1], |
12299 | 16 | { "Arbitration Burst", "nvme.cqe.dword0.get_features.arb.ab", |
12300 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7, NULL, HFILL} |
12301 | 16 | }, |
12302 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[2], |
12303 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.arb.rsvd", |
12304 | 16 | FT_UINT32, BASE_HEX, NULL, 0x000000f8, NULL, HFILL} |
12305 | 16 | }, |
12306 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[3], |
12307 | 16 | { "Low Priority Weight", "nvme.cqe.dword0.get_features.arb.lpw", |
12308 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff00, NULL, HFILL} |
12309 | 16 | }, |
12310 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[4], |
12311 | 16 | { "Medium Priority Weight", "nvme.cqe.dword0.get_features.arb.mpw", |
12312 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
12313 | 16 | }, |
12314 | 16 | { &hf_nvme_cqe_get_features_dword0_arb[5], |
12315 | 16 | { "High Priority Weight", "nvme.cqe.dword0.get_features.arb.hpw", |
12316 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
12317 | 16 | }, |
12318 | 16 | { &hf_nvme_cqe_get_features_dword0_pm[0], |
12319 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.pm", |
12320 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12321 | 16 | }, |
12322 | 16 | { &hf_nvme_cqe_get_features_dword0_pm[1], |
12323 | 16 | { "Power State", "nvme.cqe.dword0.get_features.pm.ps", |
12324 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1f, NULL, HFILL} |
12325 | 16 | }, |
12326 | 16 | { &hf_nvme_cqe_get_features_dword0_pm[2], |
12327 | 16 | { "Work Hint", "nvme.cqe.dword0.get_features.pm.wh", |
12328 | 16 | FT_UINT32, BASE_HEX, NULL, 0xe0, NULL, HFILL} |
12329 | 16 | }, |
12330 | 16 | { &hf_nvme_cqe_get_features_dword0_pm[3], |
12331 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.pm.rsvd", |
12332 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL} |
12333 | 16 | }, |
12334 | 16 | { &hf_nvme_cqe_get_features_dword0_lbart[0], |
12335 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.lbart", |
12336 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12337 | 16 | }, |
12338 | 16 | { &hf_nvme_cqe_get_features_dword0_lbart[1], |
12339 | 16 | { "Number of LBA Ranges (NUM)", "nvme.cqe.dword0.get_features.lbart.lbarn", |
12340 | 16 | FT_UINT32, BASE_HEX, NULL, 0x3f, NULL, HFILL} |
12341 | 16 | }, |
12342 | 16 | { &hf_nvme_cqe_get_features_dword0_lbart[2], |
12343 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.lbart.rsvd", |
12344 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffffc0, NULL, HFILL} |
12345 | 16 | }, |
12346 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[0], |
12347 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.tt", |
12348 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12349 | 16 | }, |
12350 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[1], |
12351 | 16 | { "Temperature Threshold", "nvme.cqe.dword0.get_features.tt.tmpth", |
12352 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12353 | 16 | }, |
12354 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[2], |
12355 | 16 | { "Threshold Temperature Select", "nvme.cqe.dword0.get_features.tt.tmpsel", |
12356 | 16 | FT_UINT32, BASE_HEX, VALS(sf_tmpsel_table), 0xf0000, NULL, HFILL} |
12357 | 16 | }, |
12358 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[3], |
12359 | 16 | { "Threshold Type Select", "nvme.cqe.dword0.get_features.tt.thpsel", |
12360 | 16 | FT_UINT32, BASE_HEX, VALS(sf_thpsel_table), 0x300000, NULL, HFILL} |
12361 | 16 | }, |
12362 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[4], |
12363 | 16 | { "Temperature Threshold Hysteresis", "nvme.cqe.dword0.get_features.tt.tmpthh", |
12364 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1c00000, NULL, HFILL} |
12365 | 16 | }, |
12366 | 16 | { &hf_nvme_cqe_get_features_dword0_tt[5], |
12367 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.tt.rsvd", |
12368 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfe000000, NULL, HFILL} |
12369 | 16 | }, |
12370 | 16 | { &hf_nvme_cqe_get_features_dword0_erec[0], |
12371 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.erec", |
12372 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12373 | 16 | }, |
12374 | 16 | { &hf_nvme_cqe_get_features_dword0_erec[1], |
12375 | 16 | { "Time Limited Error Recovery (100 ms units)", "nvme.cqe.dword0.get_features.erec.tler", |
12376 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12377 | 16 | }, |
12378 | 16 | { &hf_nvme_cqe_get_features_dword0_erec[2], |
12379 | 16 | { "Deallocated or Unwritten Logical Block Error Enable", "nvme.cqe.dword0.get_features.erec.dulbe", |
12380 | 16 | FT_BOOLEAN, 32, NULL, 0x10000, NULL, HFILL} |
12381 | 16 | }, |
12382 | 16 | { &hf_nvme_cqe_get_features_dword0_erec[3], |
12383 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.erec.rsvd", |
12384 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfe0000, NULL, HFILL} |
12385 | 16 | }, |
12386 | 16 | { &hf_nvme_cqe_get_features_dword0_vwce[0], |
12387 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.vwce", |
12388 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12389 | 16 | }, |
12390 | 16 | { &hf_nvme_cqe_get_features_dword0_vwce[1], |
12391 | 16 | { "Volatile Write Cache Enable", "nvme.cqe.dword0.get_features.vwce.wce", |
12392 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12393 | 16 | }, |
12394 | 16 | { &hf_nvme_cqe_get_features_dword0_vwce[2], |
12395 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.vwce.rsvd", |
12396 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12397 | 16 | }, |
12398 | 16 | { &hf_nvme_cqe_get_features_dword0_nq[0], |
12399 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.nq", |
12400 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12401 | 16 | }, |
12402 | 16 | { &hf_nvme_cqe_get_features_dword0_nq[1], |
12403 | 16 | { "Number of IO Submission Queues Allocated", "nvme.cqe.dword0.get_features.nq.nsqa", |
12404 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff, NULL, HFILL} |
12405 | 16 | }, |
12406 | 16 | { &hf_nvme_cqe_get_features_dword0_nq[2], |
12407 | 16 | { "Number of IO Completion Queues Allocated", "nvme.cqe.dword0.get_features.nq.ncqa", |
12408 | 16 | FT_UINT32, BASE_CUSTOM, CF_FUNC(add_nvme_queues), 0xffff0000, NULL, HFILL} |
12409 | 16 | }, |
12410 | 16 | { &hf_nvme_cqe_get_features_dword0_irqc[0], |
12411 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.irqc", |
12412 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12413 | 16 | }, |
12414 | 16 | { &hf_nvme_cqe_get_features_dword0_irqc[1], |
12415 | 16 | { "Aggregation Threshold", "nvme.cqe.dword0.get_features.irqc.thr", |
12416 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12417 | 16 | }, |
12418 | 16 | { &hf_nvme_cqe_get_features_dword0_irqc[2], |
12419 | 16 | { "Aggregation Time (100 us units)", "nvme.cqe.dword0.get_features.irqc.time", |
12420 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
12421 | 16 | }, |
12422 | 16 | { &hf_nvme_cqe_get_features_dword0_irqv[0], |
12423 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.irqv", |
12424 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12425 | 16 | }, |
12426 | 16 | { &hf_nvme_cqe_get_features_dword0_irqv[1], |
12427 | 16 | { "IRQ Vector", "nvme.cqe.dword0.get_features.irqv.iv", |
12428 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL} |
12429 | 16 | }, |
12430 | 16 | { &hf_nvme_cqe_get_features_dword0_irqv[2], |
12431 | 16 | { "Coalescing Disable", "nvme.cqe.dword0.get_features.irqv.cd", |
12432 | 16 | FT_BOOLEAN, 32, NULL, 0x00010000, NULL, HFILL} |
12433 | 16 | }, |
12434 | 16 | { &hf_nvme_cqe_get_features_dword0_irqv[3], |
12435 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.irqv.rsvd", |
12436 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffe0000, NULL, HFILL} |
12437 | 16 | }, |
12438 | 16 | { &hf_nvme_cqe_get_features_dword0_wan[0], |
12439 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.wan", |
12440 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12441 | 16 | }, |
12442 | 16 | { &hf_nvme_cqe_get_features_dword0_wan[1], |
12443 | 16 | { "Disable Normal", "nvme.cqe.dword0.get_features.wan.dn", |
12444 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12445 | 16 | }, |
12446 | 16 | { &hf_nvme_cqe_get_features_dword0_wan[2], |
12447 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.wan.rsvd", |
12448 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12449 | 16 | }, |
12450 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[0], |
12451 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.aec", |
12452 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12453 | 16 | }, |
12454 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[1], |
12455 | 16 | { "SMART and Health Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.aec.smart", |
12456 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL} |
12457 | 16 | }, |
12458 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[2], |
12459 | 16 | { "Namespace Attribute Notices", "nvme.cqe.dword0.get_features.aec.ns", |
12460 | 16 | FT_BOOLEAN, 32, NULL, 0x100, NULL, HFILL} |
12461 | 16 | }, |
12462 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[3], |
12463 | 16 | { "Firmware Activation Notices", "nvme.cqe.dword0.get_features.aec.fwa", |
12464 | 16 | FT_BOOLEAN, 32, NULL, 0x200, NULL, HFILL} |
12465 | 16 | }, |
12466 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[4], |
12467 | 16 | { "Telemetry Log Notices", "nvme.cqe.dword0.get_features.aec.tel", |
12468 | 16 | FT_BOOLEAN, 32, NULL, 0x400, NULL, HFILL} |
12469 | 16 | }, |
12470 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[5], |
12471 | 16 | { "ANA Change Notices", "nvme.cqe.dword0.get_features.aec.ana", |
12472 | 16 | FT_BOOLEAN, 32, NULL, 0x800, NULL, HFILL} |
12473 | 16 | }, |
12474 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[6], |
12475 | 16 | { "Predictable Latency Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.plat", |
12476 | 16 | FT_BOOLEAN, 32, NULL, 0x1000, NULL, HFILL} |
12477 | 16 | }, |
12478 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[7], |
12479 | 16 | { "LBA Status Information Notices", "nvme.cqe.dword0.get_features.aec.lba", |
12480 | 16 | FT_BOOLEAN, 32, NULL, 0x2000, NULL, HFILL} |
12481 | 16 | }, |
12482 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[8], |
12483 | 16 | { "Endurance Group Event Aggregate Log Change Notices", "nvme.cqe.dword0.get_features.aec.eg", |
12484 | 16 | FT_BOOLEAN, 32, NULL, 0x4000, NULL, HFILL} |
12485 | 16 | }, |
12486 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[9], |
12487 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.aec.rsvd", |
12488 | 16 | FT_UINT32, BASE_HEX, NULL, 0x7fff8000, NULL, HFILL} |
12489 | 16 | }, |
12490 | 16 | { &hf_nvme_cqe_get_features_dword0_aec[10], |
12491 | 16 | { "Discovery Log Page Change Notification", "nvme.cqe.dword0.get_features.aec.disc", |
12492 | 16 | FT_BOOLEAN, 32, NULL, 0x80000000, NULL, HFILL} |
12493 | 16 | }, |
12494 | 16 | { &hf_nvme_cqe_get_features_dword0_apst[0], |
12495 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.apst", |
12496 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12497 | 16 | }, |
12498 | 16 | { &hf_nvme_cqe_get_features_dword0_apst[1], |
12499 | 16 | { "Autonomous Power State Transition Enable", "nvme.cqe.dword0.get_features.apst.apste", |
12500 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12501 | 16 | }, |
12502 | 16 | { &hf_nvme_cqe_get_features_dword0_apst[2], |
12503 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.apst.rsvd", |
12504 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12505 | 16 | }, |
12506 | 16 | { &hf_nvme_cqe_get_features_dword0_kat[0], |
12507 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.kat", |
12508 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12509 | 16 | }, |
12510 | 16 | { &hf_nvme_cqe_get_features_dword0_kat[1], |
12511 | 16 | { "Keep Alive Timeout", "nvme.cqe.dword0.get_features.kat.kato", |
12512 | 16 | FT_UINT32, BASE_DEC|BASE_UNIT_STRING, UNS(&units_milliseconds), 0, NULL, HFILL} |
12513 | 16 | }, |
12514 | 16 | { &hf_nvme_cqe_get_features_dword0_hctm[0], |
12515 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.hctm", |
12516 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12517 | 16 | }, |
12518 | 16 | { &hf_nvme_cqe_get_features_dword0_hctm[1], |
12519 | 16 | { "Thermal Management Temperature 2 (K)", "nvme.cqe.dword0.get_features.hctm.tmt2", |
12520 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0000ffff, NULL, HFILL} |
12521 | 16 | }, |
12522 | 16 | { &hf_nvme_cqe_get_features_dword0_hctm[2], |
12523 | 16 | { "Thermal Management Temperature 1 (K)", "nvme.cqe.dword0.get_features.hctm.tmt1", |
12524 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
12525 | 16 | }, |
12526 | 16 | { &hf_nvme_cqe_get_features_dword0_nops[0], |
12527 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.nops", |
12528 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12529 | 16 | }, |
12530 | 16 | { &hf_nvme_cqe_get_features_dword0_nops[1], |
12531 | 16 | { "Non-Operational Power State Permissive Mode Enable", "nvme.cqe.dword0.get_features.nops.noppme", |
12532 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
12533 | 16 | }, |
12534 | 16 | { &hf_nvme_cqe_get_features_dword0_nops[2], |
12535 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.nops.rsvd", |
12536 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12537 | 16 | }, |
12538 | 16 | { &hf_nvme_cqe_get_features_dword0_rrl[0], |
12539 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.rrl", |
12540 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12541 | 16 | }, |
12542 | 16 | { &hf_nvme_cqe_get_features_dword0_rrl[1], |
12543 | 16 | { "Read Recovery Level", "nvme.cqe.dword0.get_features.rrl.rrl", |
12544 | 16 | FT_UINT32, BASE_HEX, NULL, 0xf, NULL, HFILL} |
12545 | 16 | }, |
12546 | 16 | { &hf_nvme_cqe_get_features_dword0_rrl[2], |
12547 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.rrl.rsvd", |
12548 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff0, NULL, HFILL} |
12549 | 16 | }, |
12550 | 16 | { &hf_nvme_cqe_get_features_dword0_plmc[0], |
12551 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.plmc", |
12552 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12553 | 16 | }, |
12554 | 16 | { &hf_nvme_cqe_get_features_dword0_plmc[1], |
12555 | 16 | { "Predictable Latency Enable", "nvme.cqe.dword0.get_features.plmc.ple", |
12556 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
12557 | 16 | }, |
12558 | 16 | { &hf_nvme_cqe_get_features_dword0_plmc[2], |
12559 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.plmc.rsvd", |
12560 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12561 | 16 | }, |
12562 | 16 | { &hf_nvme_cqe_get_features_dword0_plmw[0], |
12563 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.plmw", |
12564 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12565 | 16 | }, |
12566 | 16 | { &hf_nvme_cqe_get_features_dword0_plmw[1], |
12567 | 16 | { "NVM Set Identifier", "nvme.cqe.dword0.get_features.plmw.nvmsetid", |
12568 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12569 | 16 | }, |
12570 | 16 | { &hf_nvme_cqe_get_features_dword0_plmw[2], |
12571 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.plmw.rsvd", |
12572 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
12573 | 16 | }, |
12574 | 16 | { &hf_nvme_cqe_get_features_dword0_lbasi[0], |
12575 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.lbasi", |
12576 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12577 | 16 | }, |
12578 | 16 | { &hf_nvme_cqe_get_features_dword0_lbasi[1], |
12579 | 16 | { "LBA Status Information Report Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsiri", |
12580 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12581 | 16 | }, |
12582 | 16 | { &hf_nvme_cqe_get_features_dword0_lbasi[2], |
12583 | 16 | { "LBA Status Information Poll Interval (100 ms)", "nvme.cqe.dword0.get_features.lbasi.lsipi", |
12584 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff0000, NULL, HFILL} |
12585 | 16 | }, |
12586 | 16 | { &hf_nvme_cqe_get_features_dword0_san[0], |
12587 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.san", |
12588 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12589 | 16 | }, |
12590 | 16 | { &hf_nvme_cqe_get_features_dword0_san[1], |
12591 | 16 | { "No-Deallocate Response Mode", "nvme.cqe.dword0.get_features.san.nodrm", |
12592 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12593 | 16 | }, |
12594 | 16 | { &hf_nvme_cqe_get_features_dword0_san[2], |
12595 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.san.rsvd", |
12596 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12597 | 16 | }, |
12598 | 16 | { &hf_nvme_cqe_get_features_dword0_eg[0], |
12599 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.eg", |
12600 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12601 | 16 | }, |
12602 | 16 | { &hf_nvme_cqe_get_features_dword0_eg[1], |
12603 | 16 | { "Endurance Group Identifier", "nvme.cqe.dword0.get_features.eg.endgid", |
12604 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffff, NULL, HFILL} |
12605 | 16 | }, |
12606 | 16 | { &hf_nvme_cqe_get_features_dword0_eg[2], |
12607 | 16 | { "Endurance Group Critical Warnings Bitmask", "nvme.cqe.dword0.get_features.eg.egcw", |
12608 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff0000, NULL, HFILL} |
12609 | 16 | }, |
12610 | 16 | { &hf_nvme_cqe_get_features_dword0_eg[3], |
12611 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.eg.rsvd", |
12612 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff000000, NULL, HFILL} |
12613 | 16 | }, |
12614 | 16 | { &hf_nvme_cqe_get_features_dword0_swp[0], |
12615 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.swp", |
12616 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12617 | 16 | }, |
12618 | 16 | { &hf_nvme_cqe_get_features_dword0_swp[1], |
12619 | 16 | { "Pre-boot Software Load Count", "nvme.cqe.dword0.get_features.swp.pbslc", |
12620 | 16 | FT_UINT32, BASE_HEX, NULL, 0xff, NULL, HFILL} |
12621 | 16 | }, |
12622 | 16 | { &hf_nvme_cqe_get_features_dword0_swp[2], |
12623 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.swp.rsvd", |
12624 | 16 | FT_UINT32, BASE_HEX, NULL, 0xffffff00, NULL, HFILL} |
12625 | 16 | }, |
12626 | 16 | { &hf_nvme_cqe_get_features_dword0_hid[0], |
12627 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.hid", |
12628 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12629 | 16 | }, |
12630 | 16 | { &hf_nvme_cqe_get_features_dword0_hid[1], |
12631 | 16 | { "Enable Extended Host Identifier", "nvme.cqe.dword0.get_features.hid.exhid", |
12632 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12633 | 16 | }, |
12634 | 16 | { &hf_nvme_cqe_get_features_dword0_hid[2], |
12635 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.hid.rsvd", |
12636 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12637 | 16 | }, |
12638 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[0], |
12639 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.rsrvn", |
12640 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12641 | 16 | }, |
12642 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[1], |
12643 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd0", |
12644 | 16 | FT_UINT32, BASE_HEX, NULL, 0x1, NULL, HFILL} |
12645 | 16 | }, |
12646 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[2], |
12647 | 16 | { "Mask Registration Preempted Notification" , "nvme.cqe.dword0.get_features.rsrvn.regpre", |
12648 | 16 | FT_BOOLEAN, 32, NULL, 0x2, NULL, HFILL} |
12649 | 16 | }, |
12650 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[3], |
12651 | 16 | { "Mask Reservation Released Notification", "nvme.cqe.dword0.get_features.rsrvn.resrel", |
12652 | 16 | FT_BOOLEAN, 32, NULL, 0x4, NULL, HFILL} |
12653 | 16 | }, |
12654 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[4], |
12655 | 16 | { "Mask Reservation Preempted Notification", "nvme.cqe.dword0.get_features.rsrvn.resrpe", |
12656 | 16 | FT_BOOLEAN, 32, NULL, 0x8, NULL, HFILL} |
12657 | 16 | }, |
12658 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvn[5], |
12659 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.rsrvn.rsvd1", |
12660 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffff0, NULL, HFILL} |
12661 | 16 | }, |
12662 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvp[0], |
12663 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.rsrvp", |
12664 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12665 | 16 | }, |
12666 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvp[1], |
12667 | 16 | { "Persist Through Power Loss", "nvme.cqe.dword0.get_features.rsrvp.ptpl", |
12668 | 16 | FT_BOOLEAN, 32, NULL, 0x1, NULL, HFILL} |
12669 | 16 | }, |
12670 | 16 | { &hf_nvme_cqe_get_features_dword0_rsrvp[2], |
12671 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.rsrvp.rsvd", |
12672 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffffe, NULL, HFILL} |
12673 | 16 | }, |
12674 | 16 | { &hf_nvme_cqe_get_features_dword0_nswp[0], |
12675 | 16 | { "DWORD0", "nvme.cqe.dword0.get_features.nswp", |
12676 | 16 | FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL} |
12677 | 16 | }, |
12678 | 16 | { &hf_nvme_cqe_get_features_dword0_nswp[1], |
12679 | 16 | { "Write Protection State (WPS)", "nvme.cqe.dword0.get_features.nswp.wps", |
12680 | 16 | FT_UINT32, BASE_HEX, VALS(sf_wps), 0x7, NULL, HFILL} |
12681 | 16 | }, |
12682 | 16 | { &hf_nvme_cqe_get_features_dword0_nswp[2], |
12683 | 16 | { "Reserved", "nvme.cqe.dword0.get_features.nswp.rsvd", |
12684 | 16 | FT_UINT32, BASE_HEX, NULL, 0xfffffff8, NULL, HFILL} |
12685 | 16 | }, |
12686 | | /* Generic Response Fields */ |
12687 | 16 | { &hf_nvme_cqe_dword1, |
12688 | 16 | { "DWORD1", "nvme.cqe.dword1", |
12689 | 16 | FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12690 | 16 | }, |
12691 | 16 | { &hf_nvme_cqe_sqhd, |
12692 | 16 | { "SQ Head Pointer", "nvme.cqe.sqhd", |
12693 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12694 | 16 | }, |
12695 | 16 | { &hf_nvme_cqe_sqid, |
12696 | 16 | { "SQ Identifier", "nvme.cqe.sqid", |
12697 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12698 | 16 | }, |
12699 | 16 | { &hf_nvme_cqe_cid, |
12700 | 16 | { "Command Identifier", "nvme.cqe.cid", |
12701 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12702 | 16 | }, |
12703 | 16 | { &hf_nvme_cqe_status[0], |
12704 | 16 | { "Status Field", "nvme.cqe.status", |
12705 | 16 | FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL} |
12706 | 16 | }, |
12707 | 16 | { &hf_nvme_cqe_status[1], |
12708 | 16 | { "Phase Tag", "nvme.cqe.status.p", |
12709 | 16 | FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL} |
12710 | 16 | }, |
12711 | 16 | { &hf_nvme_cqe_status_rsvd, |
12712 | 16 | { "Reserved", "nvme.cqe.status.rsvd", |
12713 | 16 | FT_UINT16, BASE_HEX, NULL, 0x1, NULL, HFILL} |
12714 | 16 | }, |
12715 | 16 | { &hf_nvme_cqe_status[2], |
12716 | 16 | { "Status Code", "nvme.cqe.status.sc", |
12717 | 16 | FT_UINT16, BASE_HEX, NULL, 0x1fe, NULL, HFILL} |
12718 | 16 | }, |
12719 | 16 | { &hf_nvme_cqe_status[3], |
12720 | 16 | { "Status Code Type", "nvme.cqe.status.sct", |
12721 | 16 | FT_UINT16, BASE_HEX, VALS(nvme_cqe_sct_tbl), 0xE00, NULL, HFILL} |
12722 | 16 | }, |
12723 | 16 | { &hf_nvme_cqe_status[4], |
12724 | 16 | { "Command Retry Delay", "nvme.cqe.status.crd", |
12725 | 16 | FT_UINT16, BASE_HEX, NULL, 0x3000, NULL, HFILL} |
12726 | 16 | }, |
12727 | 16 | { &hf_nvme_cqe_status[5], |
12728 | 16 | { "More Information in Log Page", "nvme.cqe.status.m", |
12729 | 16 | FT_BOOLEAN, 16, NULL, 0x4000, NULL, HFILL} |
12730 | 16 | }, |
12731 | 16 | { &hf_nvme_cqe_status[6], |
12732 | 16 | { "Do not Retry", "nvme.cqe.status.dnr", |
12733 | 16 | FT_BOOLEAN, 16, NULL, 0x8000, NULL, HFILL} |
12734 | 16 | }, |
12735 | 16 | { &hf_nvme_cmd_pkt, |
12736 | 16 | { "Cmd in", "nvme.cmd_pkt", |
12737 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12738 | 16 | "The Cmd for this transaction is in this frame", HFILL } |
12739 | 16 | }, |
12740 | 16 | { &hf_nvme_data_req, |
12741 | 16 | { "DATA Transfer Request", "nvme.data_req", |
12742 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12743 | 16 | "DATA transfer request for this transaction is in this frame", HFILL } |
12744 | 16 | }, |
12745 | 16 | { &hf_nvme_data_tr[0], |
12746 | 16 | { "DATA Transfer 0", "nvme.data.tr0", |
12747 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12748 | 16 | "DATA transfer 0 for this transaction is in this frame", HFILL } |
12749 | 16 | }, |
12750 | 16 | { &hf_nvme_data_tr[1], |
12751 | 16 | { "DATA Transfer 1", "nvme.data_tr1", |
12752 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12753 | 16 | "DATA transfer 1 for this transaction is in this frame", HFILL } |
12754 | 16 | }, |
12755 | 16 | { &hf_nvme_data_tr[2], |
12756 | 16 | { "DATA Transfer 2", "nvme.data_tr2", |
12757 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12758 | 16 | "DATA transfer 2 for this transaction is in this frame", HFILL } |
12759 | 16 | }, |
12760 | 16 | { &hf_nvme_data_tr[3], |
12761 | 16 | { "DATA Transfer 3", "nvme.data_tr3", |
12762 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12763 | 16 | "DATA transfer 3 for this transaction is in this frame", HFILL } |
12764 | 16 | }, |
12765 | 16 | { &hf_nvme_data_tr[4], |
12766 | 16 | { "DATA Transfer 4", "nvme.data_tr4", |
12767 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12768 | 16 | "DATA transfer 4 for this transaction is in this frame", HFILL } |
12769 | 16 | }, |
12770 | 16 | { &hf_nvme_data_tr[5], |
12771 | 16 | { "DATA Transfer 5", "nvme.data_tr5", |
12772 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12773 | 16 | "DATA transfer 5 for this transaction is in this frame", HFILL } |
12774 | 16 | }, |
12775 | 16 | { &hf_nvme_data_tr[6], |
12776 | 16 | { "DATA Transfer 6", "nvme.data_tr6", |
12777 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12778 | 16 | "DATA transfer 6 for this transaction is in this frame", HFILL } |
12779 | 16 | }, |
12780 | 16 | { &hf_nvme_data_tr[7], |
12781 | 16 | { "DATA Transfer 7", "nvme.data_tr7", |
12782 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12783 | 16 | "DATA transfer 7 for this transaction is in this frame", HFILL } |
12784 | 16 | }, |
12785 | 16 | { &hf_nvme_data_tr[8], |
12786 | 16 | { "DATA Transfer 8", "nvme.data_tr8", |
12787 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12788 | 16 | "DATA transfer 8 for this transaction is in this frame", HFILL } |
12789 | 16 | }, |
12790 | 16 | { &hf_nvme_data_tr[9], |
12791 | 16 | { "DATA Transfer 9", "nvme.data_tr9", |
12792 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12793 | 16 | "DATA transfer 9 for this transaction is in this frame", HFILL } |
12794 | 16 | }, |
12795 | 16 | { &hf_nvme_data_tr[10], |
12796 | 16 | { "DATA Transfer 10", "nvme.data_tr10", |
12797 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12798 | 16 | "DATA transfer 10 for this transaction is in this frame", HFILL } |
12799 | 16 | }, |
12800 | 16 | { &hf_nvme_data_tr[11], |
12801 | 16 | { "DATA Transfer 11", "nvme.data_tr11", |
12802 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12803 | 16 | "DATA transfer 11 for this transaction is in this frame", HFILL } |
12804 | 16 | }, |
12805 | 16 | { &hf_nvme_data_tr[12], |
12806 | 16 | { "DATA Transfer 12", "nvme.data_tr12", |
12807 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12808 | 16 | "DATA transfer 12 for this transaction is in this frame", HFILL } |
12809 | 16 | }, |
12810 | 16 | { &hf_nvme_data_tr[13], |
12811 | 16 | { "DATA Transfer 13", "nvme.data_tr13", |
12812 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12813 | 16 | "DATA transfer 13 for this transaction is in this frame", HFILL } |
12814 | 16 | }, |
12815 | 16 | { &hf_nvme_data_tr[14], |
12816 | 16 | { "DATA Transfer 14", "nvme.data_tr14", |
12817 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12818 | 16 | "DATA transfer 14 for this transaction is in this frame", HFILL } |
12819 | 16 | }, |
12820 | 16 | { &hf_nvme_data_tr[15], |
12821 | 16 | { "DATA Transfer 15", "nvme.data_tr15", |
12822 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12823 | 16 | "DATA transfer 15 for this transaction is in this frame", HFILL } |
12824 | 16 | }, |
12825 | 16 | { &hf_nvme_cqe_pkt, |
12826 | 16 | { "Cqe in", "nvme.cqe_pkt", |
12827 | 16 | FT_FRAMENUM, BASE_NONE, NULL, 0, |
12828 | 16 | "The Cqe for this transaction is in this frame", HFILL } |
12829 | 16 | }, |
12830 | 16 | { &hf_nvme_cmd_latency, |
12831 | 16 | { "Cmd Latency", "nvme.cmd_latency", |
12832 | 16 | FT_DOUBLE, BASE_NONE, NULL, 0x0, |
12833 | 16 | "The time between the command and completion, in usec", HFILL } |
12834 | 16 | }, |
12835 | 16 | { &hf_nvme_gen_data, |
12836 | 16 | { "Nvme Data", "nvme.data", |
12837 | 16 | FT_BYTES, BASE_NONE, NULL, 0, NULL, HFILL} |
12838 | 16 | }, |
12839 | 16 | }; |
12840 | 16 | static int *ett[] = { |
12841 | 16 | &ett_data, |
12842 | 16 | }; |
12843 | | |
12844 | 16 | static ei_register_info ei[] = { |
12845 | 16 | { &ei_nvme_cqe_status_error, |
12846 | 16 | { "nvme.cqe.status.error", PI_RESPONSE_CODE, PI_NOTE, |
12847 | 16 | "Command completed with an error status", EXPFILL } |
12848 | 16 | }, |
12849 | 16 | { &ei_nvme_lbaf_count_invalid, |
12850 | 16 | { "nvme.identify.ns.lbaf.count_invalid", PI_MALFORMED, PI_WARN, |
12851 | 16 | "NLBAF and NULBAF describe more LBA Formats than the LBA Format list holds", EXPFILL } |
12852 | 16 | }, |
12853 | 16 | { &ei_nvme_data_len_exceeds_frame, |
12854 | 16 | { "nvme.data.len_exceeds_frame", PI_MALFORMED, PI_WARN, |
12855 | 16 | "Transport declared more data than the frame carries", EXPFILL } |
12856 | 16 | }, |
12857 | 16 | { &ei_nvme_logpage_window_misaligned, |
12858 | 16 | { "nvme.cmd.get_logpage.window_misaligned", PI_MALFORMED, PI_WARN, |
12859 | 16 | "Log page window does not start on a record boundary", EXPFILL } |
12860 | 16 | }, |
12861 | 16 | { &ei_nvme_eom_desc_truncated, |
12862 | 16 | { "nvme.cmd.get_logpage.eom.desc_truncated", PI_MALFORMED, PI_WARN, |
12863 | 16 | "Number of Descriptors exceeds the descriptors the response holds", EXPFILL } |
12864 | 16 | }, |
12865 | 16 | }; |
12866 | | |
12867 | 16 | expert_module_t *expert_nvme; |
12868 | | |
12869 | 16 | proto_nvme = proto_register_protocol("NVM Express", "nvme", "nvme"); |
12870 | | |
12871 | 16 | proto_register_field_array(proto_nvme, hf, array_length(hf)); |
12872 | 16 | proto_register_subtree_array(ett, array_length(ett)); |
12873 | | |
12874 | 16 | expert_nvme = expert_register_protocol(proto_nvme); |
12875 | 16 | expert_register_field_array(expert_nvme, ei, array_length(ei)); |
12876 | | |
12877 | | /* Security Send/Receive payload dissectors register here, keyed on the |
12878 | | * Security Protocol (SECP) value; struct nvme_security_info is passed |
12879 | | * as the data pointer. */ |
12880 | 16 | nvme_security_secp_table = register_dissector_table("nvme.security.secp", |
12881 | 16 | "NVMe Security Protocol (SECP)", proto_nvme, FT_UINT8, BASE_HEX); |
12882 | 16 | } |
12883 | | |
12884 | | /* |
12885 | | * Editor modelines - https://www.wireshark.org/tools/modelines.html |
12886 | | * |
12887 | | * Local variables: |
12888 | | * c-basic-offset: 4 |
12889 | | * tab-width: 8 |
12890 | | * indent-tabs-mode: nil |
12891 | | * End: |
12892 | | * |
12893 | | * vi: set shiftwidth=4 tabstop=8 expandtab: |
12894 | | * :indentSize=4:tabSize=8:noTabs=true: |
12895 | | */ |